aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/ipr.c21
-rw-r--r--drivers/scsi/ipr.h2
2 files changed, 17 insertions, 6 deletions
diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c
index dcad2389be3d..0fedca6e273b 100644
--- a/drivers/scsi/ipr.c
+++ b/drivers/scsi/ipr.c
@@ -105,6 +105,7 @@ static const struct ipr_chip_cfg_t ipr_chip_cfg[] = {
105 { /* Gemstone, Citrine, Obsidian, and Obsidian-E */ 105 { /* Gemstone, Citrine, Obsidian, and Obsidian-E */
106 .mailbox = 0x0042C, 106 .mailbox = 0x0042C,
107 .cache_line_size = 0x20, 107 .cache_line_size = 0x20,
108 .clear_isr = 1,
108 { 109 {
109 .set_interrupt_mask_reg = 0x0022C, 110 .set_interrupt_mask_reg = 0x0022C,
110 .clr_interrupt_mask_reg = 0x00230, 111 .clr_interrupt_mask_reg = 0x00230,
@@ -127,6 +128,7 @@ static const struct ipr_chip_cfg_t ipr_chip_cfg[] = {
127 { /* Snipe and Scamp */ 128 { /* Snipe and Scamp */
128 .mailbox = 0x0052C, 129 .mailbox = 0x0052C,
129 .cache_line_size = 0x20, 130 .cache_line_size = 0x20,
131 .clear_isr = 1,
130 { 132 {
131 .set_interrupt_mask_reg = 0x00288, 133 .set_interrupt_mask_reg = 0x00288,
132 .clr_interrupt_mask_reg = 0x0028C, 134 .clr_interrupt_mask_reg = 0x0028C,
@@ -149,6 +151,7 @@ static const struct ipr_chip_cfg_t ipr_chip_cfg[] = {
149 { /* CRoC */ 151 { /* CRoC */
150 .mailbox = 0x00044, 152 .mailbox = 0x00044,
151 .cache_line_size = 0x20, 153 .cache_line_size = 0x20,
154 .clear_isr = 0,
152 { 155 {
153 .set_interrupt_mask_reg = 0x00010, 156 .set_interrupt_mask_reg = 0x00010,
154 .clr_interrupt_mask_reg = 0x00018, 157 .clr_interrupt_mask_reg = 0x00018,
@@ -5049,12 +5052,14 @@ static irqreturn_t ipr_handle_other_interrupt(struct ipr_ioa_cfg *ioa_cfg,
5049 del_timer(&ioa_cfg->reset_cmd->timer); 5052 del_timer(&ioa_cfg->reset_cmd->timer);
5050 ipr_reset_ioa_job(ioa_cfg->reset_cmd); 5053 ipr_reset_ioa_job(ioa_cfg->reset_cmd);
5051 } else if ((int_reg & IPR_PCII_HRRQ_UPDATED) == int_reg) { 5054 } else if ((int_reg & IPR_PCII_HRRQ_UPDATED) == int_reg) {
5052 if (ipr_debug && printk_ratelimit()) 5055 if (ioa_cfg->clear_isr) {
5053 dev_err(&ioa_cfg->pdev->dev, 5056 if (ipr_debug && printk_ratelimit())
5054 "Spurious interrupt detected. 0x%08X\n", int_reg); 5057 dev_err(&ioa_cfg->pdev->dev,
5055 writel(IPR_PCII_HRRQ_UPDATED, ioa_cfg->regs.clr_interrupt_reg32); 5058 "Spurious interrupt detected. 0x%08X\n", int_reg);
5056 int_reg = readl(ioa_cfg->regs.sense_interrupt_reg32); 5059 writel(IPR_PCII_HRRQ_UPDATED, ioa_cfg->regs.clr_interrupt_reg32);
5057 return IRQ_NONE; 5060 int_reg = readl(ioa_cfg->regs.sense_interrupt_reg32);
5061 return IRQ_NONE;
5062 }
5058 } else { 5063 } else {
5059 if (int_reg & IPR_PCII_IOA_UNIT_CHECKED) 5064 if (int_reg & IPR_PCII_IOA_UNIT_CHECKED)
5060 ioa_cfg->ioa_unit_checked = 1; 5065 ioa_cfg->ioa_unit_checked = 1;
@@ -5154,6 +5159,9 @@ static irqreturn_t ipr_isr(int irq, void *devp)
5154 } 5159 }
5155 } 5160 }
5156 5161
5162 if (ipr_cmd && !ioa_cfg->clear_isr)
5163 break;
5164
5157 if (ipr_cmd != NULL) { 5165 if (ipr_cmd != NULL) {
5158 /* Clear the PCI interrupt */ 5166 /* Clear the PCI interrupt */
5159 num_hrrq = 0; 5167 num_hrrq = 0;
@@ -8769,6 +8777,7 @@ static int __devinit ipr_probe_ioa(struct pci_dev *pdev,
8769 /* set SIS 32 or SIS 64 */ 8777 /* set SIS 32 or SIS 64 */
8770 ioa_cfg->sis64 = ioa_cfg->ipr_chip->sis_type == IPR_SIS64 ? 1 : 0; 8778 ioa_cfg->sis64 = ioa_cfg->ipr_chip->sis_type == IPR_SIS64 ? 1 : 0;
8771 ioa_cfg->chip_cfg = ioa_cfg->ipr_chip->cfg; 8779 ioa_cfg->chip_cfg = ioa_cfg->ipr_chip->cfg;
8780 ioa_cfg->clear_isr = ioa_cfg->chip_cfg->clear_isr;
8772 8781
8773 if (ipr_transop_timeout) 8782 if (ipr_transop_timeout)
8774 ioa_cfg->transop_timeout = ipr_transop_timeout; 8783 ioa_cfg->transop_timeout = ipr_transop_timeout;
diff --git a/drivers/scsi/ipr.h b/drivers/scsi/ipr.h
index f94eaee2ff16..40cbee72b83c 100644
--- a/drivers/scsi/ipr.h
+++ b/drivers/scsi/ipr.h
@@ -1306,6 +1306,7 @@ struct ipr_interrupts {
1306struct ipr_chip_cfg_t { 1306struct ipr_chip_cfg_t {
1307 u32 mailbox; 1307 u32 mailbox;
1308 u8 cache_line_size; 1308 u8 cache_line_size;
1309 u8 clear_isr;
1309 struct ipr_interrupt_offsets regs; 1310 struct ipr_interrupt_offsets regs;
1310}; 1311};
1311 1312
@@ -1388,6 +1389,7 @@ struct ipr_ioa_cfg {
1388 u8 sis64:1; 1389 u8 sis64:1;
1389 u8 dump_timeout:1; 1390 u8 dump_timeout:1;
1390 u8 cfg_locked:1; 1391 u8 cfg_locked:1;
1392 u8 clear_isr:1;
1391 1393
1392 u8 revid; 1394 u8 revid;
1393 1395