Fixes ipr to handle dynamic pci ids by searching for the adapter chipset in the probe routine if driver_data is NULL.
Signed-off-by: Brian King <[EMAIL PROTECTED]> --- linux-2.6.11-rc4-bk9-bjking1/drivers/scsi/ipr.c | 37 +++++++++++++++++++++++- linux-2.6.11-rc4-bk9-bjking1/drivers/scsi/ipr.h | 6 +++ 2 files changed, 42 insertions(+), 1 deletion(-) diff -puN drivers/scsi/ipr.c~ipr_pci_table_fixup3 drivers/scsi/ipr.c --- linux-2.6.11-rc4-bk9/drivers/scsi/ipr.c~ipr_pci_table_fixup3 2005-02-21 13:12:08.000000000 -0600 +++ linux-2.6.11-rc4-bk9-bjking1/drivers/scsi/ipr.c 2005-02-21 13:12:08.000000000 -0600 @@ -125,6 +125,13 @@ static const struct ipr_chip_cfg_t ipr_c }, }; +static const struct ipr_chip_t ipr_chip[] = { + { PCI_VENDOR_ID_MYLEX, PCI_DEVICE_ID_IBM_GEMSTONE, &ipr_chip_cfg[0] }, + { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CITRINE, &ipr_chip_cfg[0] }, + { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_SNIPE, &ipr_chip_cfg[1] }, + { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_SCAMP, &ipr_chip_cfg[1] } +}; + static int ipr_max_bus_speeds [] = { IPR_80MBs_SCSI_RATE, IPR_U160_SCSI_RATE, IPR_U320_SCSI_RATE }; @@ -5668,6 +5675,28 @@ static void __devinit ipr_init_ioa_cfg(s } /** + * ipr_get_chip_cfg - Find adapter chip configuration + * @dev_id: PCI device id struct + * + * Return value: + * ptr to chip config on success / NULL on failure + **/ +static const struct ipr_chip_cfg_t * __devinit +ipr_get_chip_cfg(const struct pci_device_id *dev_id) +{ + int i; + + if (dev_id->driver_data) + return (const struct ipr_chip_cfg_t *)dev_id->driver_data; + + for (i = 0; i < ARRAY_SIZE(ipr_chip); i++) + if (ipr_chip[i].vendor == dev_id->vendor && + ipr_chip[i].device == dev_id->device) + return ipr_chip[i].cfg; + return NULL; +} + +/** * ipr_probe_ioa - Allocates memory and does first stage of initialization * @pdev: PCI device struct * @dev_id: PCI device id struct @@ -5704,7 +5733,13 @@ static int __devinit ipr_probe_ioa(struc ioa_cfg = (struct ipr_ioa_cfg *)host->hostdata; memset(ioa_cfg, 0, sizeof(struct ipr_ioa_cfg)); - ioa_cfg->chip_cfg = (const struct ipr_chip_cfg_t *)dev_id->driver_data; + ioa_cfg->chip_cfg = ipr_get_chip_cfg(dev_id); + + if (!ioa_cfg->chip_cfg) { + dev_err(&pdev->dev, "Unknown adapter chipset 0x%04X 0x%04X\n", + dev_id->vendor, dev_id->device); + goto out_scsi_host_put; + } ipr_regs_pci = pci_resource_start(pdev, 0); diff -puN drivers/scsi/ipr.h~ipr_pci_table_fixup3 drivers/scsi/ipr.h --- linux-2.6.11-rc4-bk9/drivers/scsi/ipr.h~ipr_pci_table_fixup3 2005-02-21 13:12:08.000000000 -0600 +++ linux-2.6.11-rc4-bk9-bjking1/drivers/scsi/ipr.h 2005-02-21 13:12:08.000000000 -0600 @@ -782,6 +782,12 @@ struct ipr_chip_cfg_t { struct ipr_interrupt_offsets regs; }; +struct ipr_chip_t { + u16 vendor; + u16 device; + const struct ipr_chip_cfg_t *cfg; +}; + enum ipr_shutdown_type { IPR_SHUTDOWN_NORMAL = 0x00, IPR_SHUTDOWN_PREPARE_FOR_NORMAL = 0x40, _ - To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html