summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdheer Chandravanshi <adheer.chandravanshi@qlogic.com>2015-12-28 03:56:57 -0500
committerMike Christie <mchristi@redhat.com>2015-12-28 14:06:22 -0600
commit5fef43143c1a481ed38c5cf89ac951ed9d4b2b56 (patch)
treebd26c89363fcf9033057ad901d994e16a5fd08e9
parenta6ef73a80d40c9c7d34eb2a69e711a6d5ed3b9e4 (diff)
downloadopen-iscsi-5fef43143c1a481ed38c5cf89ac951ed9d4b2b56.tar.gz
iscsiuio: Get the library to use based on uio sysfs name
This makes iscsiuio more compatible with newer adapters by eliminating the need to always update iscsiuio with the PCI IDs of the new adapter. Signed-off-by: Adheer Chandravanshi <adheer.chandravanshi@qlogic.com>
-rw-r--r--iscsiuio/src/unix/nic.c22
-rw-r--r--iscsiuio/src/unix/nic.h6
-rw-r--r--iscsiuio/src/unix/nic_id.c2
-rw-r--r--iscsiuio/src/unix/nic_utils.c65
4 files changed, 66 insertions, 29 deletions
diff --git a/iscsiuio/src/unix/nic.c b/iscsiuio/src/unix/nic.c
index cd0c80a..0108191 100644
--- a/iscsiuio/src/unix/nic.c
+++ b/iscsiuio/src/unix/nic.c
@@ -152,7 +152,6 @@ static int load_nic_library(nic_lib_handle_t *handle)
/* Validate the NIC library ops table to ensure that all the proper
* fields are filled */
if ((handle->ops->lib_ops.get_library_name == NULL) ||
- (handle->ops->lib_ops.get_pci_table == NULL) ||
(handle->ops->lib_ops.get_library_version == NULL) ||
(handle->ops->lib_ops.get_build_date == NULL) ||
(handle->ops->lib_ops.get_transport_name == NULL)) {
@@ -247,7 +246,8 @@ int unload_all_nic_libraries()
return 0;
}
-NIC_LIBRARY_EXIST_T does_nic_uio_name_exist(char *name)
+NIC_LIBRARY_EXIST_T does_nic_uio_name_exist(char *name,
+ nic_lib_handle_t **handle)
{
NIC_LIBRARY_EXIST_T rc;
nic_lib_handle_t *current;
@@ -263,6 +263,9 @@ NIC_LIBRARY_EXIST_T does_nic_uio_name_exist(char *name)
&uio_name_size);
if (strncmp(name, uio_name, uio_name_size) == 0) {
+ if (handle)
+ *handle = current;
+
rc = NIC_LIBRARY_EXSITS;
goto done;
}
@@ -277,7 +280,8 @@ done:
return rc;
}
-NIC_LIBRARY_EXIST_T does_nic_library_exist(char *name)
+NIC_LIBRARY_EXIST_T does_nic_library_exist(char *name,
+ nic_lib_handle_t **handle)
{
NIC_LIBRARY_EXIST_T rc;
nic_lib_handle_t *current;
@@ -293,6 +297,9 @@ NIC_LIBRARY_EXIST_T does_nic_library_exist(char *name)
&library_name_size);
if (strncmp(name, library_name, library_name_size) == 0) {
+ if (handle)
+ *handle = current;
+
rc = NIC_LIBRARY_EXSITS;
goto done;
}
@@ -333,8 +340,13 @@ int find_nic_lib_using_pci_id(uint32_t vendor, uint32_t device,
uint32_t entries;
int i;
- current->ops->lib_ops.get_pci_table(&pci_table, &entries);
-
+ if (current->ops->lib_ops.get_pci_table != NULL) {
+ current->ops->lib_ops.get_pci_table(&pci_table,
+ &entries);
+ } else {
+ current = current->next;
+ continue;
+ }
/* Sanity check the the pci table coming from the
* hardware library */
if (entries > MAX_PCI_DEVICE_ENTRIES) {
diff --git a/iscsiuio/src/unix/nic.h b/iscsiuio/src/unix/nic.h
index 40ca546..ec15781 100644
--- a/iscsiuio/src/unix/nic.h
+++ b/iscsiuio/src/unix/nic.h
@@ -355,8 +355,10 @@ typedef enum {
NIC_LIBRARY_DOESNT_EXIST = 2,
} NIC_LIBRARY_EXIST_T;
-NIC_LIBRARY_EXIST_T does_nic_uio_name_exist(char *name);
-NIC_LIBRARY_EXIST_T does_nic_library_exist(char *name);
+NIC_LIBRARY_EXIST_T does_nic_uio_name_exist(char *name,
+ nic_lib_handle_t **handle);
+NIC_LIBRARY_EXIST_T does_nic_library_exist(char *name,
+ nic_lib_handle_t **handle);
/*******************************************************************************
* Packet management utility functions
diff --git a/iscsiuio/src/unix/nic_id.c b/iscsiuio/src/unix/nic_id.c
index 6b2467c..6da0a38 100644
--- a/iscsiuio/src/unix/nic_id.c
+++ b/iscsiuio/src/unix/nic_id.c
@@ -308,6 +308,7 @@ int find_set_nic_lib(nic_t *nic)
nic_lib_handle_t *handle;
struct pci_device_id *pci_entry;
+ size_t name_size;
rc = get_vendor(nic, &vendor);
if (rc != 0) {
@@ -357,6 +358,7 @@ int find_set_nic_lib(nic_t *nic)
/* Prepare the NIC library op table */
nic->ops = handle->ops;
+ (*nic->ops->lib_ops.get_library_name) (&nic->library_name, &name_size);
return 0;
}
diff --git a/iscsiuio/src/unix/nic_utils.c b/iscsiuio/src/unix/nic_utils.c
index d57cc4f..0daffd2 100644
--- a/iscsiuio/src/unix/nic_utils.c
+++ b/iscsiuio/src/unix/nic_utils.c
@@ -700,6 +700,9 @@ int nic_verify_uio_sysfs_name(nic_t *nic)
uint32_t raw_size = 0;
char temp_path[sizeof(nic_uio_sysfs_name_tempate) + 8];
int rc = 0;
+ nic_lib_handle_t *handle = NULL;
+ size_t name_size;
+
/* Build the path to determine uio name */
snprintf(temp_path, sizeof(temp_path),
@@ -716,37 +719,43 @@ int nic_verify_uio_sysfs_name(nic_t *nic)
*raw_tmp = '\0';
/* If the nic library is not set then check if there is a library
- * which matches the library name */
+ * which matches the uio sysfs name */
if (nic->nic_library == NULL) {
NIC_LIBRARY_EXIST_T exist;
- exist = does_nic_uio_name_exist(raw);
+ exist = does_nic_uio_name_exist(raw, &handle);
if (exist == NIC_LIBRARY_DOESNT_EXIST) {
- LOG_ERR(PFX "%s: could not find library: %s ",
+ LOG_ERR(PFX "%s: could not find library for uio name: %s",
nic->log_name, raw);
- rc = -EIO;
+ rc = -EINVAL;
+ goto error;
}
- } else {
- char *library_name;
- size_t library_name_size;
- /* Get the string name from the NIC library */
- (*nic->ops->lib_ops.get_library_name) (&library_name,
- &library_name_size);
+ /* fill the lib info */
+ nic->nic_library = handle;
+ nic->ops = handle->ops;
+ (*nic->ops->lib_ops.get_library_name) (&nic->library_name,
+ &name_size);
+ } else {
+ /* Get the uio sysfs name from the NIC library */
+ (*nic->ops->lib_ops.get_uio_name) (&raw_tmp, &name_size);
- if (strcmp(raw, library_name) != 0) {
+ if (strncmp(raw, raw_tmp, name_size) != 0) {
LOG_ERR(PFX "%s: uio names not equal: "
"expecting %s got %s from %s",
- nic->log_name, library_name, raw, temp_path);
- rc = -EIO;
+ nic->log_name, raw, raw_tmp, temp_path);
+ rc = -EINVAL;
+ goto error;
}
}
- free(raw);
-
- LOG_INFO(PFX "%s: Verified is a cnic_uio device", nic->log_name);
+ LOG_INFO(PFX "%s: Verified uio name %s with library %s",
+ nic->log_name, raw, nic->library_name);
error:
+ if (raw)
+ free(raw);
+
return rc;
}
@@ -844,28 +853,40 @@ void prepare_library(nic_t *nic)
{
int rc;
NIC_LIBRARY_EXIST_T exist;
+ nic_lib_handle_t *handle = NULL;
nic_fill_name(nic);
/* No assoicated library, we can skip it */
if (nic->library_name != NULL) {
/* Check that we have the proper NIC library loaded */
- exist = does_nic_library_exist(nic->library_name);
+ exist = does_nic_library_exist(nic->library_name, &handle);
if (exist == NIC_LIBRARY_DOESNT_EXIST) {
LOG_ERR(PFX "NIC library doesn't exists: %s",
nic->library_name);
goto error;
+ } else if (handle && (nic->nic_library == handle) &&
+ (nic->ops == handle->ops)) {
+ LOG_INFO("%s: Have NIC library '%s'",
+ nic->log_name, nic->library_name);
}
}
- /* Determine the NIC library to use based on the PCI Id */
- rc = find_set_nic_lib(nic);
+ /* Verify the NIC library to use */
+ rc = nic_verify_uio_sysfs_name(nic);
if (rc != 0) {
- LOG_ERR(PFX "%s: Couldn't find NIC library", nic->log_name);
- goto error;
+ /* Determine the NIC library to use based on the PCI Id */
+ rc = find_set_nic_lib(nic);
+ if (rc != 0) {
+ LOG_ERR(PFX "%s: Couldn't find NIC library",
+ nic->log_name);
+ goto error;
+ }
+
}
- LOG_INFO("%s: found NIC '%s'", nic->log_name, nic->pci_id->device_name);
+ LOG_INFO("%s: found NIC with library '%s'",
+ nic->log_name, nic->library_name);
error:
return;
}