diff options
author | Tom Rini <trini@konsulko.com> | 2024-10-07 09:06:49 -0600 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2024-10-07 09:06:49 -0600 |
commit | c530f6079c70219e01022142b404bf8a6b572366 (patch) | |
tree | 7696586afaf4c0ae8a94ef811abd7d4a2276eb64 /drivers/ata/sata.c | |
parent | f919c3a889f0ec7d63a48b5d0ed064386b0980bd (diff) | |
parent | 28dc47038edc4e93f32d75a357131bcf01a18d85 (diff) | |
download | u-boot-master.zip u-boot-master.tar.gz u-boot-master.tar.bz2 |
Diffstat (limited to 'drivers/ata/sata.c')
-rw-r--r-- | drivers/ata/sata.c | 48 |
1 files changed, 26 insertions, 22 deletions
diff --git a/drivers/ata/sata.c b/drivers/ata/sata.c index 84437d3..89cd516 100644 --- a/drivers/ata/sata.c +++ b/drivers/ata/sata.c @@ -9,9 +9,12 @@ * Dave Liu <daveliu@freescale.com> */ +#define LOG_CATEGORY UCLASS_AHCI + #include <ahci.h> #include <blk.h> #include <dm.h> +#include <log.h> #include <part.h> #include <sata.h> #include <dm/device-internal.h> @@ -49,38 +52,39 @@ int sata_scan(struct udevice *dev) int sata_rescan(bool verbose) { + struct uclass *uc; + struct udevice *dev; /* SATA controller */ int ret; - struct udevice *dev; if (verbose) - printf("Removing devices on SATA bus...\n"); - - blk_unbind_all(UCLASS_AHCI); - - ret = uclass_find_first_device(UCLASS_AHCI, &dev); - if (ret || !dev) { - printf("Cannot find SATA device (err=%d)\n", ret); - return -ENOENT; - } - - ret = device_remove(dev, DM_REMOVE_NORMAL); - if (ret) { - printf("Cannot remove SATA device '%s' (err=%d)\n", dev->name, ret); - return -ENOSYS; + printf("scanning bus for devices...\n"); + + ret = uclass_get(UCLASS_AHCI, &uc); + if (ret) + return ret; + + /* Remove all children of SATA devices (blk and bootdev) */ + 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 && verbose) { + log_err("Unbinding from %s failed (%dE)\n", + dev->name, ret); + } } if (verbose) printf("Rescanning SATA bus for devices...\n"); - ret = uclass_probe_all(UCLASS_AHCI); - - if (ret == -ENODEV) { - if (verbose) - printf("No SATA block device found\n"); - return 0; + uclass_foreach_dev_probe(UCLASS_AHCI, dev) { + ret = sata_scan(dev); + if (ret && verbose) + log_err("Scanning %s failed (%dE)\n", dev->name, ret); } - return ret; + return 0; } static unsigned long sata_bread(struct udevice *dev, lbaint_t start, |