[PATCH 1/3] ata: sata_sil: Continue probing other sata port when failed current port.
Simon Glass
sjg at chromium.org
Sat Dec 28 03:26:35 CET 2019
Hi Peng,
On Wed, 4 Dec 2019 at 03:36, Peng Ma <peng.ma at 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 at 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
More information about the U-Boot
mailing list