scsi: Remove all children of SCSI devices before rescanning
authorSimon Glass <sjg@chromium.org>
Tue, 17 Jan 2023 17:47:44 +0000 (10:47 -0700)
committerTom Rini <trini@konsulko.com>
Mon, 23 Jan 2023 23:11:40 +0000 (18:11 -0500)
At present this only unbinds block devices of a certain type. But SCSI
device can have different types of children, including bootdevs.

Unbind all children so tht everything is clean and ready for a new scan.

Signed-off-by: Simon Glass <sjg@chromium.org>
drivers/scsi/scsi.c

index f7add08..4a2d8d0 100644 (file)
@@ -644,12 +644,23 @@ int scsi_scan(bool verbose)
        if (verbose)
                printf("scanning bus for devices...\n");
 
-       blk_unbind_all(UCLASS_SCSI);
-
        ret = uclass_get(UCLASS_SCSI, &uc);
        if (ret)
                return ret;
 
+       /* remove all children of the SCSI devices */
+       uclass_foreach_dev(dev, uc) {
+               log_debug("unbind %s\n", dev->name);
+               ret = device_chld_remove(dev, NULL, DM_REMOVE_NORMAL);
+               if (!ret)
+                       ret = device_chld_unbind(dev, NULL);
+               if (ret) {
+                       if (verbose)
+                               printf("unable to unbind devices (%dE)\n", ret);
+                       return log_msg_ret("unb", ret);
+               }
+       }
+
        uclass_foreach_dev(dev, uc) {
                ret = scsi_scan_dev(dev, verbose);
                if (ret)