diff options
-rw-r--r-- | drivers/scsi/ipr.c | 21 | ||||
-rw-r--r-- | drivers/scsi/ipr.h | 2 |
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 { | |||
1306 | struct ipr_chip_cfg_t { | 1306 | struct 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 | ||