Commit 48b4be36 authored by Matthew R. Ochs's avatar Matthew R. Ochs Committed by Martin K. Petersen

scsi: cxlflash: Migrate IOARRIN specific routines to function pointers

As staging for supporting hardware with a different queuing mechanism,
move the send_cmd() and context_reset() routines to function pointers
that are configured when the AFU is initialized. In addition, rename
the existing routines to better reflect the queue model they support.
Signed-off-by: default avatarMatthew R. Ochs <mrochs@linux.vnet.ibm.com>
Acked-by: default avatarUma Krishnan <ukrishn@linux.vnet.ibm.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 9d89326c
...@@ -161,6 +161,9 @@ struct afu { ...@@ -161,6 +161,9 @@ struct afu {
* fields after this point * fields after this point
*/ */
int (*send_cmd)(struct afu *, struct afu_cmd *);
void (*context_reset)(struct afu_cmd *);
/* AFU HW */ /* AFU HW */
struct cxl_ioctl_start_work work; struct cxl_ioctl_start_work work;
struct cxlflash_afu_map __iomem *afu_map; /* entire MMIO map */ struct cxlflash_afu_map __iomem *afu_map; /* entire MMIO map */
......
...@@ -188,12 +188,10 @@ static void cmd_complete(struct afu_cmd *cmd) ...@@ -188,12 +188,10 @@ static void cmd_complete(struct afu_cmd *cmd)
} }
/** /**
* context_reset() - timeout handler for AFU commands * context_reset_ioarrin() - reset command owner context via IOARRIN register
* @cmd: AFU command that timed out. * @cmd: AFU command that timed out.
*
* Sends a reset to the AFU.
*/ */
static void context_reset(struct afu_cmd *cmd) static void context_reset_ioarrin(struct afu_cmd *cmd)
{ {
int nretry = 0; int nretry = 0;
u64 rrin = 0x1; u64 rrin = 0x1;
...@@ -217,14 +215,14 @@ static void context_reset(struct afu_cmd *cmd) ...@@ -217,14 +215,14 @@ static void context_reset(struct afu_cmd *cmd)
} }
/** /**
* send_cmd() - sends an AFU command * send_cmd_ioarrin() - sends an AFU command via IOARRIN register
* @afu: AFU associated with the host. * @afu: AFU associated with the host.
* @cmd: AFU command to send. * @cmd: AFU command to send.
* *
* Return: * Return:
* 0 on success, SCSI_MLQUEUE_HOST_BUSY on failure * 0 on success, SCSI_MLQUEUE_HOST_BUSY on failure
*/ */
static int send_cmd(struct afu *afu, struct afu_cmd *cmd) static int send_cmd_ioarrin(struct afu *afu, struct afu_cmd *cmd)
{ {
struct cxlflash_cfg *cfg = afu->parent; struct cxlflash_cfg *cfg = afu->parent;
struct device *dev = &cfg->dev->dev; struct device *dev = &cfg->dev->dev;
...@@ -273,7 +271,7 @@ static int wait_resp(struct afu *afu, struct afu_cmd *cmd) ...@@ -273,7 +271,7 @@ static int wait_resp(struct afu *afu, struct afu_cmd *cmd)
timeout = wait_for_completion_timeout(&cmd->cevent, timeout); timeout = wait_for_completion_timeout(&cmd->cevent, timeout);
if (!timeout) { if (!timeout) {
context_reset(cmd); afu->context_reset(cmd);
rc = -1; rc = -1;
} }
...@@ -330,7 +328,7 @@ static int send_tmf(struct afu *afu, struct scsi_cmnd *scp, u64 tmfcmd) ...@@ -330,7 +328,7 @@ static int send_tmf(struct afu *afu, struct scsi_cmnd *scp, u64 tmfcmd)
SISL_REQ_FLAGS_TMF_CMD); SISL_REQ_FLAGS_TMF_CMD);
memcpy(cmd->rcb.cdb, &tmfcmd, sizeof(tmfcmd)); memcpy(cmd->rcb.cdb, &tmfcmd, sizeof(tmfcmd));
rc = send_cmd(afu, cmd); rc = afu->send_cmd(afu, cmd);
if (unlikely(rc)) { if (unlikely(rc)) {
spin_lock_irqsave(&cfg->tmf_slock, lock_flags); spin_lock_irqsave(&cfg->tmf_slock, lock_flags);
cfg->tmf_active = false; cfg->tmf_active = false;
...@@ -461,7 +459,7 @@ static int cxlflash_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *scp) ...@@ -461,7 +459,7 @@ static int cxlflash_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *scp)
cmd->rcb.req_flags = req_flags; cmd->rcb.req_flags = req_flags;
memcpy(cmd->rcb.cdb, scp->cmnd, sizeof(cmd->rcb.cdb)); memcpy(cmd->rcb.cdb, scp->cmnd, sizeof(cmd->rcb.cdb));
rc = send_cmd(afu, cmd); rc = afu->send_cmd(afu, cmd);
if (unlikely(rc)) if (unlikely(rc))
scsi_dma_unmap(scp); scsi_dma_unmap(scp);
out: out:
...@@ -1631,6 +1629,9 @@ static int init_afu(struct cxlflash_cfg *cfg) ...@@ -1631,6 +1629,9 @@ static int init_afu(struct cxlflash_cfg *cfg)
goto err2; goto err2;
} }
afu->send_cmd = send_cmd_ioarrin;
afu->context_reset = context_reset_ioarrin;
pr_debug("%s: afu version %s, interface version 0x%llX\n", __func__, pr_debug("%s: afu version %s, interface version 0x%llX\n", __func__,
afu->version, afu->interface_version); afu->version, afu->interface_version);
...@@ -1723,7 +1724,7 @@ int cxlflash_afu_sync(struct afu *afu, ctx_hndl_t ctx_hndl_u, ...@@ -1723,7 +1724,7 @@ int cxlflash_afu_sync(struct afu *afu, ctx_hndl_t ctx_hndl_u,
*((__be16 *)&cmd->rcb.cdb[2]) = cpu_to_be16(ctx_hndl_u); *((__be16 *)&cmd->rcb.cdb[2]) = cpu_to_be16(ctx_hndl_u);
*((__be32 *)&cmd->rcb.cdb[4]) = cpu_to_be32(res_hndl_u); *((__be32 *)&cmd->rcb.cdb[4]) = cpu_to_be32(res_hndl_u);
rc = send_cmd(afu, cmd); rc = afu->send_cmd(afu, cmd);
if (unlikely(rc)) if (unlikely(rc))
goto out; goto out;
......
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