From: "Matthew R. Ochs" <mro...@linux.vnet.ibm.com>

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 <mro...@linux.vnet.ibm.com>
Signed-off-by: Uma Krishnan <ukri...@linux.vnet.ibm.com>
---
 drivers/scsi/cxlflash/main.c | 27 +++++++++++++++++++++------
 1 file changed, 21 insertions(+), 6 deletions(-)

diff --git a/drivers/scsi/cxlflash/main.c b/drivers/scsi/cxlflash/main.c
index 3061d80..30c09593c 100644
--- a/drivers/scsi/cxlflash/main.c
+++ b/drivers/scsi/cxlflash/main.c
@@ -1155,19 +1155,18 @@ static irqreturn_t cxlflash_sync_err_irq(int irq, void 
*data)
 }
 
 /**
- * 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;
 }
 
-- 
2.1.0

Reply via email to