aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorBrian King <brking@linux.vnet.ibm.com>2012-03-14 22:20:08 -0400
committerJames Bottomley <JBottomley@Parallels.com>2012-03-28 10:01:06 -0400
commit7dd21308b17e2b657d167adc7e20b41b7c6bbe5c (patch)
tree3789453ea1f3fa6c572e46aec7784a18a82aebad /drivers
parent0ee1d714c285aabaadf7495bf5820114ad0959b1 (diff)
[SCSI] ipr: Remove unnecessary interrupt clearing on new adapters
The latest ipr hardware no longer requires the driver to issue any MMIOs to clear the interrupt so remove this to optimize performance. Signed-off-by: Brian King <brking@linux.vnet.ibm.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers')
-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