Commit 76a6ebbe authored by Matthew R. Ochs's avatar Matthew R. Ochs Committed by Martin K. Petersen

scsi: cxlflash: Separate RRQ processing from the RRQ interrupt handler

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: default avatarMatthew R. Ochs <mrochs@linux.vnet.ibm.com>
Signed-off-by: default avatarUma Krishnan <ukrishn@linux.vnet.ibm.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 0d4bd8fe
...@@ -1155,19 +1155,18 @@ static irqreturn_t cxlflash_sync_err_irq(int irq, void *data) ...@@ -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) * process_hrrq() - process the read-response queue
* @irq: Interrupt number. * @afu: AFU associated with the host.
* @data: Private data provided at interrupt registration, the AFU.
* *
* 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 afu_cmd *cmd;
struct sisl_ioasa *ioasa; struct sisl_ioasa *ioasa;
struct sisl_ioarcb *ioarcb; struct sisl_ioarcb *ioarcb;
bool toggle = afu->toggle; bool toggle = afu->toggle;
int num_hrrq = 0;
u64 entry, u64 entry,
*hrrq_start = afu->hrrq_start, *hrrq_start = afu->hrrq_start,
*hrrq_end = afu->hrrq_end, *hrrq_end = afu->hrrq_end,
...@@ -1201,11 +1200,27 @@ static irqreturn_t cxlflash_rrq_irq(int irq, void *data) ...@@ -1201,11 +1200,27 @@ static irqreturn_t cxlflash_rrq_irq(int irq, void *data)
} }
atomic_inc(&afu->hsq_credits); atomic_inc(&afu->hsq_credits);
num_hrrq++;
} }
afu->hrrq_curr = hrrq_curr; afu->hrrq_curr = hrrq_curr;
afu->toggle = toggle; 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; return IRQ_HANDLED;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment