
Hi Peng,
On Wed, 4 Dec 2019 at 03:36, Peng Ma peng.ma@nxp.com wrote:
In the initialization of sata driver, we want to initialize all port probes, Therefore, any detection failure between of them should continue initialization by skipping the current port instead of exit.
Signed-off-by: Peng Ma peng.ma@nxp.com
drivers/ata/sata_sil.c | 60 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 56 insertions(+), 4 deletions(-)
diff --git a/drivers/ata/sata_sil.c b/drivers/ata/sata_sil.c index d06d7a079d..bbba98f9a6 100644 --- a/drivers/ata/sata_sil.c +++ b/drivers/ata/sata_sil.c @@ -19,6 +19,7 @@ #if CONFIG_IS_ENABLED(BLK) #include <dm.h> #include <blk.h> +#include <dm/device-internal.h> #endif
#include "sata_sil.h" @@ -762,15 +763,33 @@ U_BOOT_DRIVER(sata_sil_driver) = { .platdata_auto_alloc_size = sizeof(struct sil_sata_priv), };
+static int (struct udevice *dev) +{
int ret;
ret = device_remove(dev, DM_REMOVE_NORMAL);
if (ret)
return ret;
ret = device_unbind(dev);
Why are you unbinding the devices? I don't think this is needed.
if (ret)
return ret;
return 0;
+}
static int sil_pci_probe(struct udevice *dev) { struct udevice *blk;
int failed_number; char sata_name[10]; pci_dev_t devno; u16 word; int ret; int i;
failed_number = 0;
/* Get PCI device number */ devno = dm_pci_get_bdf(dev); if (devno == -1)
@@ -823,12 +842,44 @@ static int sil_pci_probe(struct udevice *dev) }
ret = sil_init_sata(blk, i);
if (ret)
return -ENODEV;
if (ret) {
ret = sil_unbind_device(blk);
if (ret)
return ret;
failed_number++;
continue;
} ret = scan_sata(blk, i);
if (ret)
return -ENODEV;
if (ret) {
ret = sil_unbind_device(blk);
if (ret)
return ret;
failed_number++;
continue;
}
}
if (failed_number == sata_info.maxport)
return -ENODEV;
else
return 0;
+}
+static int sil_pci_remove(struct udevice *dev) +{
int i;
struct sil_sata *sata;
struct sil_sata_priv *priv;
priv = dev_get_priv(dev);
for (i = sata_info.portbase; i < sata_info.maxport; i++) {
sata = priv->sil_sata_desc[i];
if (sata)
free(sata); } return 0;
@@ -856,6 +907,7 @@ U_BOOT_DRIVER(sil_ahci_pci) = { .of_match = sil_pci_ids, .ops = &sata_sil_ops, .probe = sil_pci_probe,
.remove = sil_pci_remove, .priv_auto_alloc_size = sizeof(struct sil_sata_priv),
};
-- 2.17.1
Regards, Simon