scsi: qla2xxx: Fix queue ID for async abort with Multiqueue
authorDarren Trapp <darren.trapp@cavium.com>
Tue, 16 Jan 2018 04:46:51 +0000 (20:46 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 23 Jan 2018 01:03:26 +0000 (20:03 -0500)
[mkp: sparse warning]

Signed-off-by: Darren Trapp <darren.trapp@cavium.com>
Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/qla2xxx/qla_def.h
drivers/scsi/qla2xxx/qla_init.c
drivers/scsi/qla2xxx/qla_iocb.c

index f7396a2..be7d682 100644 (file)
@@ -442,6 +442,7 @@ struct srb_iocb {
                struct {
                        uint32_t cmd_hndl;
                        __le16 comp_status;
+                       __le16 req_que_no;
                        struct completion comp;
                } abt;
                struct ct_arg ctarg;
index e030ee3..aececf6 100644 (file)
@@ -1565,6 +1565,13 @@ qla24xx_async_abort_cmd(srb_t *cmd_sp)
        sp->name = "abort";
        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);
+
        sp->done = qla24xx_abort_sp_done;
        abt_iocb->timeout = qla24xx_abort_iocb_timeout;
        init_completion(&abt_iocb->u.abt.comp);
@@ -1599,6 +1606,9 @@ qla24xx_async_abort_command(srb_t *sp)
        struct qla_hw_data *ha = vha->hw;
        struct req_que *req = vha->req;
 
+       if (vha->flags.qpairs_available && sp->qpair)
+               req = sp->qpair->req;
+
        spin_lock_irqsave(&ha->hardware_lock, flags);
        for (handle = 1; handle < req->num_outstanding_cmds; handle++) {
                if (req->outstanding_cmds[handle] == sp)
index 2c6a236..1b62e94 100644 (file)
@@ -3275,7 +3275,9 @@ qla24xx_abort_iocb(srb_t *sp, struct abort_entry_24xx *abt_iocb)
        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->handle =
+            cpu_to_le32(MAKE_HANDLE(aio->u.abt.req_que_no,
+                aio->u.abt.cmd_hndl));
        abt_iocb->nport_handle = cpu_to_le16(sp->fcport->loop_id);
        abt_iocb->handle_to_abort =
            cpu_to_le32(MAKE_HANDLE(req->id, aio->u.abt.cmd_hndl));
@@ -3283,7 +3285,7 @@ qla24xx_abort_iocb(srb_t *sp, struct abort_entry_24xx *abt_iocb)
        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(req->id);
+       abt_iocb->req_que_no = cpu_to_le16(aio->u.abt.req_que_no);
        /* Send the command to the firmware */
        wmb();
 }