- correct issue with hpsa_simple_mode module parameter
  . driver was hanging due to incorrect interrupt setup

Reviewed-by: Justin Lindley <justin.lind...@microsemi.com>
Reviewed-by: Dave Carroll <david.carr...@microsemi.com>
Reviewed-by: Scott Teel <scott.t...@microsemi.com>
Signed-off-by: Don Brace <don.br...@microsemi.com>
---
 drivers/scsi/hpsa.c |   20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
index f044e7d10d63..410941afcb7e 100644
--- a/drivers/scsi/hpsa.c
+++ b/drivers/scsi/hpsa.c
@@ -5511,6 +5511,9 @@ static int hpsa_ioaccel_submit(struct ctlr_info *h,
        if (!dev)
                return SCSI_MLQUEUE_HOST_BUSY;
 
+       if (hpsa_simple_mode)
+               return IO_ACCEL_INELIGIBLE;
+
        cmd->host_scribble = (unsigned char *) c;
 
        if (dev->offload_enabled) {
@@ -7963,10 +7966,15 @@ static int hpsa_alloc_cmd_pool(struct ctlr_info *h)
 static void hpsa_free_irqs(struct ctlr_info *h)
 {
        int i;
+       int irq_vector = 0;
+
+       if (hpsa_simple_mode)
+               irq_vector = h->intr_mode;
 
        if (!h->msix_vectors || h->intr_mode != PERF_MODE_INT) {
                /* Single reply queue, only one irq to free */
-               free_irq(pci_irq_vector(h->pdev, 0), &h->q[h->intr_mode]);
+               free_irq(pci_irq_vector(h->pdev, irq_vector),
+                               &h->q[h->intr_mode]);
                h->q[h->intr_mode] = 0;
                return;
        }
@@ -7985,6 +7993,10 @@ static int hpsa_request_irqs(struct ctlr_info *h,
        irqreturn_t (*intxhandler)(int, void *))
 {
        int rc, i;
+       int irq_vector = 0;
+
+       if (hpsa_simple_mode)
+               irq_vector = h->intr_mode;
 
        /*
         * initialize h->q[x] = x so that interrupt handlers know which
@@ -8020,14 +8032,14 @@ static int hpsa_request_irqs(struct ctlr_info *h,
                if (h->msix_vectors > 0 || h->pdev->msi_enabled) {
                        sprintf(h->intrname[0], "%s-msi%s", h->devname,
                                h->msix_vectors ? "x" : "");
-                       rc = request_irq(pci_irq_vector(h->pdev, 0),
+                       rc = request_irq(pci_irq_vector(h->pdev, irq_vector),
                                msixhandler, 0,
                                h->intrname[0],
                                &h->q[h->intr_mode]);
                } else {
                        sprintf(h->intrname[h->intr_mode],
                                "%s-intx", h->devname);
-                       rc = request_irq(pci_irq_vector(h->pdev, 0),
+                       rc = request_irq(pci_irq_vector(h->pdev, irq_vector),
                                intxhandler, IRQF_SHARED,
                                h->intrname[0],
                                &h->q[h->intr_mode]);
@@ -8035,7 +8047,7 @@ static int hpsa_request_irqs(struct ctlr_info *h,
        }
        if (rc) {
                dev_err(&h->pdev->dev, "failed to get irq %d for %s\n",
-                      pci_irq_vector(h->pdev, 0), h->devname);
+                      pci_irq_vector(h->pdev, irq_vector), h->devname);
                hpsa_free_irqs(h);
                return -ENODEV;
        }

Reply via email to