[Pdbg] [PATCH v2 5/7] libpdbg: Rescan fsi bus only once

Amitay Isaacs amitay at ozlabs.org
Wed Jun 10 15:24:24 AEST 2020


On rescan, kernel driver re-creates all the slave devices.  This
invalidates all the slave deviced opened before the scan.  So avoid
scanning fsi bus, if any of the devices are opened.

Signed-off-by: Amitay Isaacs <amitay at ozlabs.org>
---
 libpdbg/kernel.c | 24 ++++++++++++++++--------
 1 file changed, 16 insertions(+), 8 deletions(-)

diff --git a/libpdbg/kernel.c b/libpdbg/kernel.c
index 2cc81f2..c63ef93 100644
--- a/libpdbg/kernel.c
+++ b/libpdbg/kernel.c
@@ -149,6 +149,7 @@ int kernel_fsi_probe(struct pdbg_target *target)
 	const char *kernel_path = kernel_get_fsi_path();
 	const char *fsi_path;
 	char *path;
+	static bool first_probe = true;
 
 	if (!kernel_path)
 		return -1;
@@ -163,23 +164,30 @@ int kernel_fsi_probe(struct pdbg_target *target)
 	}
 
 	while (tries) {
-		/* Open first raw device */
 		fsi->fd = open(path, O_RDWR | O_SYNC);
 		if (fsi->fd >= 0) {
 			free(path);
+			first_probe = false;
 			return 0;
 		}
 		tries--;
 
-		/* Scan */
-		kernel_fsi_scan_devices();
-		sleep(1);
-	}
-	if (fsi->fd < 0) {
-		PR_ERROR("Unable to open %s\n", path);
-		free(path);
+		/*
+		 * On fsi bus rescan, kernel re-creates all the slave device
+		 * entries.  It means any currently open devices will be
+		 * invalid and need to be re-opened.  So avoid scanning if
+		 * some devices are already probed.
+		 */
+		if (first_probe) {
+			kernel_fsi_scan_devices();
+			sleep(1);
+		} else {
+			break;
+		}
 	}
 
+	PR_ERROR("Unable to open %s\n", path);
+	free(path);
 	return -1;
 }
 
-- 
2.26.2



More information about the Pdbg mailing list