[U-Boot] [PATCH v2 02/19] scsi: Provide support for a list of AHCI controllers.

From: Vadim Bendebury vbendeb@chromium.org
Many AHCI controllers are identical, the main (and often the only) difference being the PCI Vendor ID/Device ID combination reported by the device.
This change allows the config file to define a list of PCI vendor ID/device ID pairs. The driver would scan the list and initialize the first device it finds.
No actual multiple device list is introduced yet, this change just add the framework.
Signed-off-by: Vadim Bendebury vbendeb@chromium.org Signed-off-by: Taylor Hutt thutt@chromium.org Signed-off-by: Simon Glass sjg@chromium.org --- Changes in v2: - Use struct pci_device_id instead of defining new struct scsi_device - Squash in CONFIG_PCI patch
common/cmd_scsi.c | 40 +++++++++++++++++++++++++++++++++++----- 1 files changed, 35 insertions(+), 5 deletions(-)
diff --git a/common/cmd_scsi.c b/common/cmd_scsi.c index 22d0119..5cb3390 100644 --- a/common/cmd_scsi.c +++ b/common/cmd_scsi.c @@ -34,6 +34,9 @@ #include <image.h> #include <pci.h>
+#ifdef CONFIG_SCSI_DEV_LIST +#define SCSI_DEV_LIST CONFIG_SCSI_DEV_LIST +#else #ifdef CONFIG_SCSI_SYM53C8XX #define SCSI_VEND_ID 0x1000 #ifndef CONFIG_SCSI_DEV_ID @@ -49,8 +52,12 @@ #elif !defined(CONFIG_SCSI_AHCI_PLAT) #error no scsi device defined #endif +#define SCSI_DEV_LIST {SCSI_VEND_ID, SCSI_DEV_ID} +#endif
- +#ifdef CONFIG_PCI +DEFINE_PCI_DEVICE_TABLE(scsi_device_list) = { SCSI_DEV_LIST }; +#endif static ccb tempccb; /* temporary scsi command buffer */
static unsigned char tempbuff[512]; /* temporary data buffer */ @@ -178,15 +185,38 @@ removable: void scsi_init(void) { int busdevfunc; + int i; + /* + * Find a device from the list, this driver will support a single + * controller. + */ + for (i = 0; i < ARRAY_SIZE(scsi_device_list); i++) { + /* get PCI Device ID */ + busdevfunc = pci_find_device(scsi_device_list[i].scsi_vendor_id, + scsi_device_list[i].scsi_dev_id, + 0); + if (busdevfunc != -1) + break; + }
- busdevfunc=pci_find_device(SCSI_VEND_ID,SCSI_DEV_ID,0); /* get PCI Device ID */ - if(busdevfunc==-1) { - printf("Error SCSI Controller (%04X,%04X) not found\n",SCSI_VEND_ID,SCSI_DEV_ID); + if (busdevfunc == -1) { + printf("Error: SCSI Controller(s) "); + for (i = 0; i < ARRAY_SIZE(scsi_device_list); i++) { + printf("%04X:%04X ", + scsi_device_list[i].scsi_vendor_id, + scsi_device_list[i].scsi_dev_id); + } + printf("not found\n"); return; } #ifdef DEBUG else { - printf("SCSI Controller (%04X,%04X) found (%d:%d:%d)\n",SCSI_VEND_ID,SCSI_DEV_ID,(busdevfunc>>16)&0xFF,(busdevfunc>>11)&0x1F,(busdevfunc>>8)&0x7); + printf("SCSI Controller (%04X,%04X) found (%d:%d:%d)\n", + scsi_device_list[i].scsi_vendor_id, + scsi_device_list[i].scsi_dev_id, + (busdevfunc >> 16) & 0xFF, + (busdevfunc >> 11) & 0x1F, + (busdevfunc >> 8) & 0x7); } #endif scsi_low_level_init(busdevfunc);

Hi Tom,
On Thu, Oct 25, 2012 at 5:52 PM, Simon Glass sjg@chromium.org wrote:
From: Vadim Bendebury vbendeb@chromium.org
Many AHCI controllers are identical, the main (and often the only) difference being the PCI Vendor ID/Device ID combination reported by the device.
This change allows the config file to define a list of PCI vendor ID/device ID pairs. The driver would scan the list and initialize the first device it finds.
No actual multiple device list is introduced yet, this change just add the framework.
Signed-off-by: Vadim Bendebury vbendeb@chromium.org Signed-off-by: Taylor Hutt thutt@chromium.org Signed-off-by: Simon Glass sjg@chromium.org
Changes in v2:
- Use struct pci_device_id instead of defining new struct scsi_device
- Squash in CONFIG_PCI patch
Please note that I squashed in patch 13 of the series.
I marked http://patchwork.ozlabs.org/patch/192521/ superseded in patchwork.
Regards, Simon
participants (1)
-
Simon Glass