Blame SOURCES/0148-iscsiuio-Get-the-library-to-use-based-on-uio-sysfs-n.patch

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