aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorWayne Boyer <wayneb@linux.vnet.ibm.com>2009-06-17 12:55:35 -0400
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2009-06-21 11:52:47 -0400
commit1be7bd82bf4c5d9d3efd1de0e2ebe2c5b1db8340 (patch)
tree119d8afd7e8168626faee5332788c2b75fce261f /drivers
parent95fecd90397ec1f85eb31ede955d846a86d2077b (diff)
ipr: differentiate pci-x and pci-e based adapters
MSI has only been tested on and known to work with PCI-E based adapters. This patch adds a field to struct ipr_chip_t to indicate which type of interrupt to use based on what is known about the chip. Signed-off-by: Wayne Boyer <wayneb@linux.vnet.ibm.com> Acked-by: Brian King <brking@linux.vnet.ibm.com> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/scsi/ipr.c32
-rw-r--r--drivers/scsi/ipr.h4
2 files changed, 21 insertions, 15 deletions
diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c
index 15ce8e51d5de..5f045505a1f4 100644
--- a/drivers/scsi/ipr.c
+++ b/drivers/scsi/ipr.c
@@ -131,13 +131,13 @@ static const struct ipr_chip_cfg_t ipr_chip_cfg[] = {
131}; 131};
132 132
133static const struct ipr_chip_t ipr_chip[] = { 133static const struct ipr_chip_t ipr_chip[] = {
134 { PCI_VENDOR_ID_MYLEX, PCI_DEVICE_ID_IBM_GEMSTONE, &ipr_chip_cfg[0] }, 134 { PCI_VENDOR_ID_MYLEX, PCI_DEVICE_ID_IBM_GEMSTONE, IPR_USE_LSI, &ipr_chip_cfg[0] },
135 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CITRINE, &ipr_chip_cfg[0] }, 135 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CITRINE, IPR_USE_LSI, &ipr_chip_cfg[0] },
136 { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_OBSIDIAN, &ipr_chip_cfg[0] }, 136 { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_OBSIDIAN, IPR_USE_LSI, &ipr_chip_cfg[0] },
137 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN, &ipr_chip_cfg[0] }, 137 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN, IPR_USE_LSI, &ipr_chip_cfg[0] },
138 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN_E, &ipr_chip_cfg[0] }, 138 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN_E, IPR_USE_MSI, &ipr_chip_cfg[0] },
139 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_SNIPE, &ipr_chip_cfg[1] }, 139 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_SNIPE, IPR_USE_LSI, &ipr_chip_cfg[1] },
140 { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_SCAMP, &ipr_chip_cfg[1] } 140 { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_SCAMP, IPR_USE_LSI, &ipr_chip_cfg[1] }
141}; 141};
142 142
143static int ipr_max_bus_speeds [] = { 143static int ipr_max_bus_speeds [] = {
@@ -7399,21 +7399,21 @@ static void __devinit ipr_init_ioa_cfg(struct ipr_ioa_cfg *ioa_cfg,
7399} 7399}
7400 7400
7401/** 7401/**
7402 * ipr_get_chip_cfg - Find adapter chip configuration 7402 * ipr_get_chip_info - Find adapter chip information
7403 * @dev_id: PCI device id struct 7403 * @dev_id: PCI device id struct
7404 * 7404 *
7405 * Return value: 7405 * Return value:
7406 * ptr to chip config on success / NULL on failure 7406 * ptr to chip information on success / NULL on failure
7407 **/ 7407 **/
7408static const struct ipr_chip_cfg_t * __devinit 7408static const struct ipr_chip_t * __devinit
7409ipr_get_chip_cfg(const struct pci_device_id *dev_id) 7409ipr_get_chip_info(const struct pci_device_id *dev_id)
7410{ 7410{
7411 int i; 7411 int i;
7412 7412
7413 for (i = 0; i < ARRAY_SIZE(ipr_chip); i++) 7413 for (i = 0; i < ARRAY_SIZE(ipr_chip); i++)
7414 if (ipr_chip[i].vendor == dev_id->vendor && 7414 if (ipr_chip[i].vendor == dev_id->vendor &&
7415 ipr_chip[i].device == dev_id->device) 7415 ipr_chip[i].device == dev_id->device)
7416 return ipr_chip[i].cfg; 7416 return &ipr_chip[i];
7417 return NULL; 7417 return NULL;
7418} 7418}
7419 7419
@@ -7540,14 +7540,16 @@ static int __devinit ipr_probe_ioa(struct pci_dev *pdev,
7540 ata_host_init(&ioa_cfg->ata_host, &pdev->dev, 7540 ata_host_init(&ioa_cfg->ata_host, &pdev->dev,
7541 sata_port_info.flags, &ipr_sata_ops); 7541 sata_port_info.flags, &ipr_sata_ops);
7542 7542
7543 ioa_cfg->chip_cfg = ipr_get_chip_cfg(dev_id); 7543 ioa_cfg->ipr_chip = ipr_get_chip_info(dev_id);
7544 7544
7545 if (!ioa_cfg->chip_cfg) { 7545 if (!ioa_cfg->ipr_chip) {
7546 dev_err(&pdev->dev, "Unknown adapter chipset 0x%04X 0x%04X\n", 7546 dev_err(&pdev->dev, "Unknown adapter chipset 0x%04X 0x%04X\n",
7547 dev_id->vendor, dev_id->device); 7547 dev_id->vendor, dev_id->device);
7548 goto out_scsi_host_put; 7548 goto out_scsi_host_put;
7549 } 7549 }
7550 7550
7551 ioa_cfg->chip_cfg = ioa_cfg->ipr_chip->cfg;
7552
7551 if (ipr_transop_timeout) 7553 if (ipr_transop_timeout)
7552 ioa_cfg->transop_timeout = ipr_transop_timeout; 7554 ioa_cfg->transop_timeout = ipr_transop_timeout;
7553 else if (dev_id->driver_data & IPR_USE_LONG_TRANSOP_TIMEOUT) 7555 else if (dev_id->driver_data & IPR_USE_LONG_TRANSOP_TIMEOUT)
@@ -7599,7 +7601,7 @@ static int __devinit ipr_probe_ioa(struct pci_dev *pdev,
7599 } 7601 }
7600 7602
7601 /* Enable MSI style interrupts if they are supported. */ 7603 /* Enable MSI style interrupts if they are supported. */
7602 if (!(rc = pci_enable_msi(pdev))) { 7604 if (ioa_cfg->ipr_chip->intr_type == IPR_USE_MSI && !pci_enable_msi(pdev)) {
7603 rc = ipr_test_msi(ioa_cfg, pdev); 7605 rc = ipr_test_msi(ioa_cfg, pdev);
7604 if (rc == -EOPNOTSUPP) 7606 if (rc == -EOPNOTSUPP)
7605 pci_disable_msi(pdev); 7607 pci_disable_msi(pdev);
diff --git a/drivers/scsi/ipr.h b/drivers/scsi/ipr.h
index 2d9269b26f88..4b63dd6b1c81 100644
--- a/drivers/scsi/ipr.h
+++ b/drivers/scsi/ipr.h
@@ -1025,6 +1025,9 @@ struct ipr_chip_cfg_t {
1025struct ipr_chip_t { 1025struct ipr_chip_t {
1026 u16 vendor; 1026 u16 vendor;
1027 u16 device; 1027 u16 device;
1028 u16 intr_type;
1029#define IPR_USE_LSI 0x00
1030#define IPR_USE_MSI 0x01
1028 const struct ipr_chip_cfg_t *cfg; 1031 const struct ipr_chip_cfg_t *cfg;
1029}; 1032};
1030 1033
@@ -1160,6 +1163,7 @@ struct ipr_ioa_cfg {
1160 1163
1161 unsigned int transop_timeout; 1164 unsigned int transop_timeout;
1162 const struct ipr_chip_cfg_t *chip_cfg; 1165 const struct ipr_chip_cfg_t *chip_cfg;
1166 const struct ipr_chip_t *ipr_chip;
1163 1167
1164 void __iomem *hdw_dma_regs; /* iomapped PCI memory space */ 1168 void __iomem *hdw_dma_regs; /* iomapped PCI memory space */
1165 unsigned long hdw_dma_regs_pci; /* raw PCI memory space */ 1169 unsigned long hdw_dma_regs_pci; /* raw PCI memory space */