提交 40cdf26e 编写于 作者: P Peng Ma 提交者: Tom Rini

ata: sata_sil: Continue probing other sata port when failed current port.

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: NPeng Ma <peng.ma@nxp.com>
上级 74bb4570
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#if CONFIG_IS_ENABLED(BLK) #if CONFIG_IS_ENABLED(BLK)
#include <dm.h> #include <dm.h>
#include <blk.h> #include <blk.h>
#include <dm/device-internal.h>
#endif #endif
#include "sata_sil.h" #include "sata_sil.h"
...@@ -763,15 +764,33 @@ U_BOOT_DRIVER(sata_sil_driver) = { ...@@ -763,15 +764,33 @@ U_BOOT_DRIVER(sata_sil_driver) = {
.platdata_auto_alloc_size = sizeof(struct sil_sata_priv), .platdata_auto_alloc_size = sizeof(struct sil_sata_priv),
}; };
static int sil_unbind_device(struct udevice *dev)
{
int ret;
ret = device_remove(dev, DM_REMOVE_NORMAL);
if (ret)
return ret;
ret = device_unbind(dev);
if (ret)
return ret;
return 0;
}
static int sil_pci_probe(struct udevice *dev) static int sil_pci_probe(struct udevice *dev)
{ {
struct udevice *blk; struct udevice *blk;
int failed_number;
char sata_name[10]; char sata_name[10];
pci_dev_t devno; pci_dev_t devno;
u16 word; u16 word;
int ret; int ret;
int i; int i;
failed_number = 0;
/* Get PCI device number */ /* Get PCI device number */
devno = dm_pci_get_bdf(dev); devno = dm_pci_get_bdf(dev);
if (devno == -1) if (devno == -1)
...@@ -824,12 +843,44 @@ static int sil_pci_probe(struct udevice *dev) ...@@ -824,12 +843,44 @@ static int sil_pci_probe(struct udevice *dev)
} }
ret = sil_init_sata(blk, i); ret = sil_init_sata(blk, i);
if (ret) {
ret = sil_unbind_device(blk);
if (ret) if (ret)
return -ENODEV; return ret;
failed_number++;
continue;
}
ret = scan_sata(blk, i); ret = scan_sata(blk, i);
if (ret) {
ret = sil_unbind_device(blk);
if (ret) if (ret)
return ret;
failed_number++;
continue;
}
}
if (failed_number == sata_info.maxport)
return -ENODEV; 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; return 0;
...@@ -857,6 +908,7 @@ U_BOOT_DRIVER(sil_ahci_pci) = { ...@@ -857,6 +908,7 @@ U_BOOT_DRIVER(sil_ahci_pci) = {
.of_match = sil_pci_ids, .of_match = sil_pci_ids,
.ops = &sata_sil_ops, .ops = &sata_sil_ops,
.probe = sil_pci_probe, .probe = sil_pci_probe,
.remove = sil_pci_remove,
.priv_auto_alloc_size = sizeof(struct sil_sata_priv), .priv_auto_alloc_size = sizeof(struct sil_sata_priv),
}; };
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册