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