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 <s...@chromium.org>
---

(no changes since v1)

 drivers/scsi/scsi.c | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
index f7add08db86..4a2d8d009a6 100644
--- a/drivers/scsi/scsi.c
+++ b/drivers/scsi/scsi.c
@@ -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)
-- 
2.39.0.246.g2a6d74b583-goog

Reply via email to