[EXT] Re: [PATCH 1/3] ata: sata_sil: Continue probing other sata port when failed current port.

Peng Ma peng.ma at nxp.com
Mon Dec 30 08:27:02 CET 2019


Hi Simon,

I am very sorry to reply late, Please see comments inline.

Best Regards,
Peng
>-----Original Message-----
>From: Simon Glass <sjg at chromium.org>
>Sent: 2019年12月28日 10:27
>To: Peng Ma <peng.ma at nxp.com>
>Cc: Priyanka Jain <priyanka.jain at nxp.com>; Marcel Ziswiler
><marcel.ziswiler at toradex.com>; Andy Tang <andy.tang at nxp.com>;
>u-boot at lists.denx.de
>Subject: [EXT] Re: [PATCH 1/3] ata: sata_sil: Continue probing other sata port
>when failed current port.
>
>Caution: EXT Email
>
>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.
[Peng Ma] Before sil_init_sata function failed the function blk_create_devicef have already be called,
In the blk_create_devicef function it would be bound the silicon sata to block device, So we should unbind
this device here once the function sil_init_sata return failed.
>
>> +       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