scsi: cxlflash: Separate RRQ processing from the RRQ interrupt handler
authorMatthew R. Ochs <mrochs@linux.vnet.ibm.com>
Wed, 12 Apr 2017 19:11:44 +0000 (14:11 -0500)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 14 Apr 2017 02:55:41 +0000 (22:55 -0400)
In order to support processing the HRRQ by other means (e.g. polling), the
processing portion of the current RRQ interrupt handler needs to be broken out
into a separate routine. This will allow RRQ processing from places other than
the RRQ hardware interrupt handler.

Signed-off-by: Matthew R. Ochs <mrochs@linux.vnet.ibm.com>
Signed-off-by: Uma Krishnan <ukrishn@linux.vnet.ibm.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/cxlflash/main.c

index 3061d8045382e437b445d025b2c2910fb15c7a96..30c09593c12223fbc588438b9742e334d6f6d04e 100644 (file)
@@ -1155,19 +1155,18 @@ cxlflash_sync_err_irq_exit:
 }
 
 /**
- * cxlflash_rrq_irq() - interrupt handler for read-response queue (normal path)
- * @irq:       Interrupt number.
- * @data:      Private data provided at interrupt registration, the AFU.
+ * process_hrrq() - process the read-response queue
+ * @afu:       AFU associated with the host.
  *
- * Return: Always return IRQ_HANDLED.
+ * Return: The number of entries processed.
  */
-static irqreturn_t cxlflash_rrq_irq(int irq, void *data)
+static int process_hrrq(struct afu *afu)
 {
-       struct afu *afu = (struct afu *)data;
        struct afu_cmd *cmd;
        struct sisl_ioasa *ioasa;
        struct sisl_ioarcb *ioarcb;
        bool toggle = afu->toggle;
+       int num_hrrq = 0;
        u64 entry,
            *hrrq_start = afu->hrrq_start,
            *hrrq_end = afu->hrrq_end,
@@ -1201,11 +1200,27 @@ static irqreturn_t cxlflash_rrq_irq(int irq, void *data)
                }
 
                atomic_inc(&afu->hsq_credits);
+               num_hrrq++;
        }
 
        afu->hrrq_curr = hrrq_curr;
        afu->toggle = toggle;
 
+       return num_hrrq;
+}
+
+/**
+ * cxlflash_rrq_irq() - interrupt handler for read-response queue (normal path)
+ * @irq:       Interrupt number.
+ * @data:      Private data provided at interrupt registration, the AFU.
+ *
+ * Return: Always return IRQ_HANDLED.
+ */
+static irqreturn_t cxlflash_rrq_irq(int irq, void *data)
+{
+       struct afu *afu = (struct afu *)data;
+
+       process_hrrq(afu);
        return IRQ_HANDLED;
 }