From: Quinn Tran <quinn.t...@cavium.com>

On Abort of initiator scsi command, the abort needs to
follow the same qpair as the the scsi command to prevent
out of order processing.

Signed-off-by: Quinn Tran <quinn.t...@cavium.com>
Signed-off-by: Himanshu Madhani <himanshu.madh...@cavium.com>
---
 drivers/scsi/qla2xxx/qla_init.c | 15 +++++----------
 drivers/scsi/qla2xxx/qla_iocb.c | 12 +++++++-----
 2 files changed, 12 insertions(+), 15 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 4686fb5f26aa..53c4eb3b9c27 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -1747,18 +1747,18 @@ int
 qla24xx_async_abort_cmd(srb_t *cmd_sp, bool wait)
 {
        scsi_qla_host_t *vha = cmd_sp->vha;
-       fc_port_t *fcport = cmd_sp->fcport;
        struct srb_iocb *abt_iocb;
        srb_t *sp;
        int rval = QLA_FUNCTION_FAILED;
 
-       sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL);
+       sp = qla2xxx_get_qpair_sp(cmd_sp->qpair, cmd_sp->fcport, GFP_KERNEL);
        if (!sp)
                goto done;
 
        abt_iocb = &sp->u.iocb_cmd;
        sp->type = SRB_ABT_CMD;
        sp->name = "abort";
+       sp->qpair = cmd_sp->qpair;
        if (wait)
                sp->flags = SRB_WAKEUP_ON_COMP;
 
@@ -1767,12 +1767,7 @@ qla24xx_async_abort_cmd(srb_t *cmd_sp, bool wait)
        qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha));
 
        abt_iocb->u.abt.cmd_hndl = cmd_sp->handle;
-
-       if (vha->flags.qpairs_available && cmd_sp->qpair)
-               abt_iocb->u.abt.req_que_no =
-                   cpu_to_le16(cmd_sp->qpair->req->id);
-       else
-               abt_iocb->u.abt.req_que_no = cpu_to_le16(vha->req->id);
+       abt_iocb->u.abt.req_que_no = cmd_sp->qpair->req->id;
 
        sp->done = qla24xx_abort_sp_done;
 
@@ -1781,8 +1776,8 @@ qla24xx_async_abort_cmd(srb_t *cmd_sp, bool wait)
                goto done_free_sp;
 
        ql_dbg(ql_dbg_async, vha, 0x507c,
-           "Abort command issued - hdl=%x, target_id=%x\n",
-           cmd_sp->handle, fcport->tgt_id);
+           "Abort command issued - hdl=%x, type=%x\n",
+           cmd_sp->handle, cmd_sp->type);
 
        if (wait) {
                wait_for_completion(&abt_iocb->u.abt.comp);
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c
index 119927220299..c699bbb8485b 100644
--- a/drivers/scsi/qla2xxx/qla_iocb.c
+++ b/drivers/scsi/qla2xxx/qla_iocb.c
@@ -3297,19 +3297,21 @@ qla24xx_abort_iocb(srb_t *sp, struct abort_entry_24xx 
*abt_iocb)
 {
        struct srb_iocb *aio = &sp->u.iocb_cmd;
        scsi_qla_host_t *vha = sp->vha;
-       struct req_que *req = vha->req;
+       struct req_que *req = sp->qpair->req;
 
        memset(abt_iocb, 0, sizeof(struct abort_entry_24xx));
        abt_iocb->entry_type = ABORT_IOCB_TYPE;
        abt_iocb->entry_count = 1;
        abt_iocb->handle = cpu_to_le32(MAKE_HANDLE(req->id, sp->handle));
-       abt_iocb->nport_handle = cpu_to_le16(sp->fcport->loop_id);
+       if (sp->fcport) {
+               abt_iocb->nport_handle = cpu_to_le16(sp->fcport->loop_id);
+               abt_iocb->port_id[0] = sp->fcport->d_id.b.al_pa;
+               abt_iocb->port_id[1] = sp->fcport->d_id.b.area;
+               abt_iocb->port_id[2] = sp->fcport->d_id.b.domain;
+       }
        abt_iocb->handle_to_abort =
            cpu_to_le32(MAKE_HANDLE(aio->u.abt.req_que_no,
                                    aio->u.abt.cmd_hndl));
-       abt_iocb->port_id[0] = sp->fcport->d_id.b.al_pa;
-       abt_iocb->port_id[1] = sp->fcport->d_id.b.area;
-       abt_iocb->port_id[2] = sp->fcport->d_id.b.domain;
        abt_iocb->vp_index = vha->vp_idx;
        abt_iocb->req_que_no = cpu_to_le16(aio->u.abt.req_que_no);
        /* Send the command to the firmware */
-- 
2.12.0

Reply via email to