diff options
author | Dan Williams <dan.j.williams@intel.com> | 2011-04-19 21:32:51 +0200 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2011-07-03 13:00:37 +0200 |
commit | 31e824ed0d8c84c5232405167b2338ffc071ae8a (patch) | |
tree | d63462e4a808ef9992632e9261a65be4a51ba471 /drivers/scsi/isci/host.c | |
parent | isci: replace this_* and the_* variables with more meaningful names (diff) | |
download | linux-31e824ed0d8c84c5232405167b2338ffc071ae8a.tar.xz linux-31e824ed0d8c84c5232405167b2338ffc071ae8a.zip |
isci: rely on irq core for intx multiplexing, and silence screaming intx
Remove the extra logic to poll each controller for interrupts, that's
the core's job for shared interrupts.
While testing noticed that a number of interrupts fire while waiting for
the completion tasklet to run, so added an irq-ack.
Reported-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'drivers/scsi/isci/host.c')
-rw-r--r-- | drivers/scsi/isci/host.c | 26 |
1 files changed, 11 insertions, 15 deletions
diff --git a/drivers/scsi/isci/host.c b/drivers/scsi/isci/host.c index 927f08892ad6..0d706b2ce25e 100644 --- a/drivers/scsi/isci/host.c +++ b/drivers/scsi/isci/host.c @@ -77,23 +77,19 @@ irqreturn_t isci_msix_isr(int vec, void *data) irqreturn_t isci_intx_isr(int vec, void *data) { - struct pci_dev *pdev = data; - struct isci_host *ihost; irqreturn_t ret = IRQ_NONE; - int i; + struct isci_host *ihost = data; + struct scic_sds_controller *scic = ihost->core_controller; - for_each_isci_host(i, ihost, pdev) { - struct scic_sds_controller *scic = ihost->core_controller; - - if (scic_sds_controller_isr(scic)) { - tasklet_schedule(&ihost->completion_tasklet); - ret = IRQ_HANDLED; - } else if (scic_sds_controller_error_isr(scic)) { - spin_lock(&ihost->scic_lock); - scic_sds_controller_error_handler(scic); - spin_unlock(&ihost->scic_lock); - ret = IRQ_HANDLED; - } + if (scic_sds_controller_isr(scic)) { + writel(SMU_ISR_COMPLETION, &scic->smu_registers->interrupt_status); + tasklet_schedule(&ihost->completion_tasklet); + ret = IRQ_HANDLED; + } else if (scic_sds_controller_error_isr(scic)) { + spin_lock(&ihost->scic_lock); + scic_sds_controller_error_handler(scic); + spin_unlock(&ihost->scic_lock); + ret = IRQ_HANDLED; } return ret; |