aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
authorWayne Boyer <wayneb@linux.vnet.ibm.com>2010-06-17 14:51:40 -0400
committerJames Bottomley <James.Bottomley@suse.de>2010-07-27 13:03:49 -0400
commitcb237ef7a45f22373575b2d2ad2d06f7d38d6bce (patch)
treea6f541f660fbaf67e4c4876e86fe367c685dfee9 /drivers/scsi
parentcdd3cb156f190edb37d7066ddbf879354da2b634 (diff)
[SCSI] ipr: add MMIO write to perform BIST for 64 bit adapters
The 64 bit chip used in new adapters does not properly support the BIST register in PCI config space. This patch implements an alternative MMIO write reset method. Signed-off-by: Wayne Boyer <wayneb@linux.vnet.ibm.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/ipr.c37
-rw-r--r--drivers/scsi/ipr.h4
2 files changed, 25 insertions, 16 deletions
diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c
index 37158eab3c89..db205c9d42d1 100644
--- a/drivers/scsi/ipr.c
+++ b/drivers/scsi/ipr.c
@@ -174,15 +174,15 @@ static const struct ipr_chip_cfg_t ipr_chip_cfg[] = {
174}; 174};
175 175
176static const struct ipr_chip_t ipr_chip[] = { 176static const struct ipr_chip_t ipr_chip[] = {
177 { PCI_VENDOR_ID_MYLEX, PCI_DEVICE_ID_IBM_GEMSTONE, IPR_USE_LSI, IPR_SIS32, &ipr_chip_cfg[0] }, 177 { PCI_VENDOR_ID_MYLEX, PCI_DEVICE_ID_IBM_GEMSTONE, IPR_USE_LSI, IPR_SIS32, IPR_PCI_CFG, &ipr_chip_cfg[0] },
178 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CITRINE, IPR_USE_LSI, IPR_SIS32, &ipr_chip_cfg[0] }, 178 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CITRINE, IPR_USE_LSI, IPR_SIS32, IPR_PCI_CFG, &ipr_chip_cfg[0] },
179 { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_OBSIDIAN, IPR_USE_LSI, IPR_SIS32, &ipr_chip_cfg[0] }, 179 { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_OBSIDIAN, IPR_USE_LSI, IPR_SIS32, IPR_PCI_CFG, &ipr_chip_cfg[0] },
180 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN, IPR_USE_LSI, IPR_SIS32, &ipr_chip_cfg[0] }, 180 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN, IPR_USE_LSI, IPR_SIS32, IPR_PCI_CFG, &ipr_chip_cfg[0] },
181 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN_E, IPR_USE_MSI, IPR_SIS32, &ipr_chip_cfg[0] }, 181 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN_E, IPR_USE_MSI, IPR_SIS32, IPR_PCI_CFG, &ipr_chip_cfg[0] },
182 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_SNIPE, IPR_USE_LSI, IPR_SIS32, &ipr_chip_cfg[1] }, 182 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_SNIPE, IPR_USE_LSI, IPR_SIS32, IPR_PCI_CFG, &ipr_chip_cfg[1] },
183 { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_SCAMP, IPR_USE_LSI, IPR_SIS32, &ipr_chip_cfg[1] }, 183 { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_SCAMP, IPR_USE_LSI, IPR_SIS32, IPR_PCI_CFG, &ipr_chip_cfg[1] },
184 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROC_FPGA_E2, IPR_USE_MSI, IPR_SIS64, &ipr_chip_cfg[2] }, 184 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROC_FPGA_E2, IPR_USE_MSI, IPR_SIS64, IPR_MMIO, &ipr_chip_cfg[2] },
185 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROC_ASIC_E2, IPR_USE_MSI, IPR_SIS64, &ipr_chip_cfg[2] } 185 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROC_ASIC_E2, IPR_USE_MSI, IPR_SIS64, IPR_MMIO, &ipr_chip_cfg[2] }
186}; 186};
187 187
188static int ipr_max_bus_speeds [] = { 188static int ipr_max_bus_speeds [] = {
@@ -7451,20 +7451,25 @@ static int ipr_reset_bist_done(struct ipr_cmnd *ipr_cmd)
7451static int ipr_reset_start_bist(struct ipr_cmnd *ipr_cmd) 7451static int ipr_reset_start_bist(struct ipr_cmnd *ipr_cmd)
7452{ 7452{
7453 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; 7453 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7454 int rc; 7454 int rc = PCIBIOS_SUCCESSFUL;
7455 7455
7456 ENTER; 7456 ENTER;
7457 pci_block_user_cfg_access(ioa_cfg->pdev); 7457 pci_block_user_cfg_access(ioa_cfg->pdev);
7458 rc = pci_write_config_byte(ioa_cfg->pdev, PCI_BIST, PCI_BIST_START);
7459 7458
7460 if (rc != PCIBIOS_SUCCESSFUL) { 7459 if (ioa_cfg->ipr_chip->bist_method == IPR_MMIO)
7461 pci_unblock_user_cfg_access(ipr_cmd->ioa_cfg->pdev); 7460 writel(IPR_UPROCI_SIS64_START_BIST,
7462 ipr_cmd->s.ioasa.hdr.ioasc = cpu_to_be32(IPR_IOASC_PCI_ACCESS_ERROR); 7461 ioa_cfg->regs.set_uproc_interrupt_reg32);
7463 rc = IPR_RC_JOB_CONTINUE; 7462 else
7464 } else { 7463 rc = pci_write_config_byte(ioa_cfg->pdev, PCI_BIST, PCI_BIST_START);
7464
7465 if (rc == PCIBIOS_SUCCESSFUL) {
7465 ipr_cmd->job_step = ipr_reset_bist_done; 7466 ipr_cmd->job_step = ipr_reset_bist_done;
7466 ipr_reset_start_timer(ipr_cmd, IPR_WAIT_FOR_BIST_TIMEOUT); 7467 ipr_reset_start_timer(ipr_cmd, IPR_WAIT_FOR_BIST_TIMEOUT);
7467 rc = IPR_RC_JOB_RETURN; 7468 rc = IPR_RC_JOB_RETURN;
7469 } else {
7470 pci_unblock_user_cfg_access(ipr_cmd->ioa_cfg->pdev);
7471 ipr_cmd->s.ioasa.hdr.ioasc = cpu_to_be32(IPR_IOASC_PCI_ACCESS_ERROR);
7472 rc = IPR_RC_JOB_CONTINUE;
7468 } 7473 }
7469 7474
7470 LEAVE; 7475 LEAVE;
diff --git a/drivers/scsi/ipr.h b/drivers/scsi/ipr.h
index 0ef9a67112a8..ba63826dd905 100644
--- a/drivers/scsi/ipr.h
+++ b/drivers/scsi/ipr.h
@@ -272,6 +272,7 @@ IPR_PCII_NO_HOST_RRQ | IPR_PCII_IOARRIN_LOST | IPR_PCII_MMIO_ERROR)
272 272
273#define IPR_UPROCI_RESET_ALERT (0x80000000 >> 7) 273#define IPR_UPROCI_RESET_ALERT (0x80000000 >> 7)
274#define IPR_UPROCI_IO_DEBUG_ALERT (0x80000000 >> 9) 274#define IPR_UPROCI_IO_DEBUG_ALERT (0x80000000 >> 9)
275#define IPR_UPROCI_SIS64_START_BIST (0x80000000 >> 23)
275 276
276#define IPR_LDUMP_MAX_LONG_ACK_DELAY_IN_USEC 200000 /* 200 ms */ 277#define IPR_LDUMP_MAX_LONG_ACK_DELAY_IN_USEC 200000 /* 200 ms */
277#define IPR_LDUMP_MAX_SHORT_ACK_DELAY_IN_USEC 200000 /* 200 ms */ 278#define IPR_LDUMP_MAX_SHORT_ACK_DELAY_IN_USEC 200000 /* 200 ms */
@@ -1301,6 +1302,9 @@ struct ipr_chip_t {
1301 u16 sis_type; 1302 u16 sis_type;
1302#define IPR_SIS32 0x00 1303#define IPR_SIS32 0x00
1303#define IPR_SIS64 0x01 1304#define IPR_SIS64 0x01
1305 u16 bist_method;
1306#define IPR_PCI_CFG 0x00
1307#define IPR_MMIO 0x01
1304 const struct ipr_chip_cfg_t *cfg; 1308 const struct ipr_chip_cfg_t *cfg;
1305}; 1309};
1306 1310