OSDN Git Service

scsi: qla2xxx: Move marker request behind QPair
authorQuinn Tran <qtran@marvell.com>
Fri, 15 Feb 2019 22:37:19 +0000 (14:37 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 19 Feb 2019 23:58:37 +0000 (18:58 -0500)
Current code hard codes marker request to use request and response queue
0. This patch make use of the qpair as the path to access the
request/response queues.  It allows marker to be place on any hardware
queue.

Signed-off-by: Quinn Tran <qtran@marvell.com>
Signed-off-by: Himanshu Madhani <hmadhani@marvell.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/qla2xxx/qla_gbl.h
drivers/scsi/qla2xxx/qla_init.c
drivers/scsi/qla2xxx/qla_iocb.c
drivers/scsi/qla2xxx/qla_mbx.c

index 3c59006..4eefe69 100644 (file)
@@ -270,8 +270,8 @@ extern void qla24xx_build_scsi_iocbs(srb_t *, struct cmd_type_7 *,
        uint16_t, struct req_que *);
 extern int qla2x00_start_scsi(srb_t *sp);
 extern int qla24xx_start_scsi(srb_t *sp);
-int qla2x00_marker(struct scsi_qla_host *, struct req_que *, struct rsp_que *,
-                                               uint16_t, uint64_t, uint8_t);
+int qla2x00_marker(struct scsi_qla_host *, struct qla_qpair *,
+    uint16_t, uint64_t, uint8_t);
 extern int qla2x00_start_sp(srb_t *);
 extern int qla24xx_dif_start_scsi(srb_t *);
 extern int qla2x00_start_bidir(srb_t *, struct scsi_qla_host *, uint32_t);
index c319abf..a2c2ca4 100644 (file)
@@ -1705,8 +1705,8 @@ qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t flags, uint32_t lun,
                lun = (uint16_t)tm_iocb->u.tmf.lun;
 
                /* Issue Marker IOCB */
-               qla2x00_marker(vha, vha->hw->req_q_map[0],
-                   vha->hw->rsp_q_map[0], sp->fcport->loop_id, lun,
+               qla2x00_marker(vha, vha->hw->base_qpair,
+                   sp->fcport->loop_id, lun,
                    flags == TCF_LUN_RESET ? MK_SYNC_ID_LUN : MK_SYNC_ID);
        }
 
@@ -6041,11 +6041,6 @@ qla2x00_loop_resync(scsi_qla_host_t *vha)
 {
        int rval = QLA_SUCCESS;
        uint32_t wait_time;
-       struct req_que *req;
-       struct rsp_que *rsp;
-
-       req = vha->req;
-       rsp = req->rsp;
 
        clear_bit(ISP_ABORT_RETRY, &vha->dpc_flags);
        if (vha->flags.online) {
@@ -6058,8 +6053,8 @@ qla2x00_loop_resync(scsi_qla_host_t *vha)
                                         * Issue a marker after FW becomes
                                         * ready.
                                         */
-                                       qla2x00_marker(vha, req, rsp, 0, 0,
-                                               MK_SYNC_ALL);
+                                       qla2x00_marker(vha, vha->hw->base_qpair,
+                                           0, 0, MK_SYNC_ALL);
                                        vha->marker_needed = 0;
                                }
 
@@ -6797,8 +6792,6 @@ qla2x00_restart_isp(scsi_qla_host_t *vha)
 {
        int status = 0;
        struct qla_hw_data *ha = vha->hw;
-       struct req_que *req = ha->req_q_map[0];
-       struct rsp_que *rsp = ha->rsp_q_map[0];
 
        /* If firmware needs to be loaded */
        if (qla2x00_isp_firmware(vha)) {
@@ -6818,7 +6811,7 @@ qla2x00_restart_isp(scsi_qla_host_t *vha)
                status = qla2x00_fw_ready(vha);
                if (!status) {
                        /* Issue a marker after FW becomes ready. */
-                       qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL);
+                       qla2x00_marker(vha, ha->base_qpair, 0, 0, MK_SYNC_ALL);
                        set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
                }
 
@@ -7873,22 +7866,15 @@ qla24xx_configure_vhba(scsi_qla_host_t *vha)
        uint16_t mb[MAILBOX_REGISTER_COUNT];
        struct qla_hw_data *ha = vha->hw;
        struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
-       struct req_que *req;
-       struct rsp_que *rsp;
 
        if (!vha->vp_idx)
                return -EINVAL;
 
        rval = qla2x00_fw_ready(base_vha);
-       if (vha->qpair)
-               req = vha->qpair->req;
-       else
-               req = ha->req_q_map[0];
-       rsp = req->rsp;
 
        if (rval == QLA_SUCCESS) {
                clear_bit(RESET_MARKER_NEEDED, &vha->dpc_flags);
-               qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL);
+               qla2x00_marker(vha, ha->base_qpair, 0, 0, MK_SYNC_ALL);
        }
 
        vha->flags.management_server_logged_in = 0;
@@ -8280,8 +8266,6 @@ qla82xx_restart_isp(scsi_qla_host_t *vha)
 {
        int status, rval;
        struct qla_hw_data *ha = vha->hw;
-       struct req_que *req = ha->req_q_map[0];
-       struct rsp_que *rsp = ha->rsp_q_map[0];
        struct scsi_qla_host *vp;
        unsigned long flags;
 
@@ -8293,7 +8277,7 @@ qla82xx_restart_isp(scsi_qla_host_t *vha)
                status = qla2x00_fw_ready(vha);
                if (!status) {
                        /* Issue a marker after FW becomes ready. */
-                       qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL);
+                       qla2x00_marker(vha, ha->base_qpair, 0, 0, MK_SYNC_ALL);
                        vha->flags.online = 1;
                        set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
                }
index cdac282..63f8e3c 100644 (file)
@@ -336,7 +336,7 @@ qla2x00_start_scsi(srb_t *sp)
 
        /* Send marker if required */
        if (vha->marker_needed != 0) {
-               if (qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL) !=
+               if (qla2x00_marker(vha, ha->base_qpair, 0, 0, MK_SYNC_ALL) !=
                    QLA_SUCCESS) {
                        return (QLA_FUNCTION_FAILED);
                }
@@ -490,8 +490,7 @@ qla2x00_start_iocbs(struct scsi_qla_host *vha, struct req_que *req)
 /**
  * qla2x00_marker() - Send a marker IOCB to the firmware.
  * @vha: HA context
- * @req: request queue
- * @rsp: response queue
+ * @qpair: queue pair pointer
  * @loop_id: loop ID
  * @lun: LUN
  * @type: marker modifier
@@ -501,18 +500,16 @@ qla2x00_start_iocbs(struct scsi_qla_host *vha, struct req_que *req)
  * Returns non-zero if a failure occurred, else zero.
  */
 static int
-__qla2x00_marker(struct scsi_qla_host *vha, struct req_que *req,
-                       struct rsp_que *rsp, uint16_t loop_id,
-                       uint64_t lun, uint8_t type)
+__qla2x00_marker(struct scsi_qla_host *vha, struct qla_qpair *qpair,
+    uint16_t loop_id, uint64_t lun, uint8_t type)
 {
        mrk_entry_t *mrk;
        struct mrk_entry_24xx *mrk24 = NULL;
-
+       struct req_que *req = qpair->req;
        struct qla_hw_data *ha = vha->hw;
        scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev);
 
-       req = ha->req_q_map[0];
-       mrk = (mrk_entry_t *)qla2x00_alloc_iocbs(vha, NULL);
+       mrk = (mrk_entry_t *)__qla2x00_alloc_iocbs(qpair, NULL);
        if (mrk == NULL) {
                ql_log(ql_log_warn, base_vha, 0x3026,
                    "Failed to allocate Marker IOCB.\n");
@@ -543,16 +540,15 @@ __qla2x00_marker(struct scsi_qla_host *vha, struct req_que *req,
 }
 
 int
-qla2x00_marker(struct scsi_qla_host *vha, struct req_que *req,
-               struct rsp_que *rsp, uint16_t loop_id, uint64_t lun,
-               uint8_t type)
+qla2x00_marker(struct scsi_qla_host *vha, struct qla_qpair *qpair,
+    uint16_t loop_id, uint64_t lun, uint8_t type)
 {
        int ret;
        unsigned long flags = 0;
 
-       spin_lock_irqsave(&vha->hw->hardware_lock, flags);
-       ret = __qla2x00_marker(vha, req, rsp, loop_id, lun, type);
-       spin_unlock_irqrestore(&vha->hw->hardware_lock, flags);
+       spin_lock_irqsave(qpair->qp_lock_ptr, flags);
+       ret = __qla2x00_marker(vha, qpair, loop_id, lun, type);
+       spin_unlock_irqrestore(qpair->qp_lock_ptr, flags);
 
        return (ret);
 }
@@ -567,11 +563,11 @@ qla2x00_marker(struct scsi_qla_host *vha, struct req_que *req,
 int qla2x00_issue_marker(scsi_qla_host_t *vha, int ha_locked)
 {
        if (ha_locked) {
-               if (__qla2x00_marker(vha, vha->req, vha->req->rsp, 0, 0,
+               if (__qla2x00_marker(vha, vha->hw->base_qpair, 0, 0,
                                        MK_SYNC_ALL) != QLA_SUCCESS)
                        return QLA_FUNCTION_FAILED;
        } else {
-               if (qla2x00_marker(vha, vha->req, vha->req->rsp, 0, 0,
+               if (qla2x00_marker(vha, vha->hw->base_qpair, 0, 0,
                                        MK_SYNC_ALL) != QLA_SUCCESS)
                        return QLA_FUNCTION_FAILED;
        }
@@ -1627,21 +1623,19 @@ qla24xx_start_scsi(srb_t *sp)
        uint16_t        req_cnt;
        uint16_t        tot_dsds;
        struct req_que *req = NULL;
-       struct rsp_que *rsp = NULL;
        struct scsi_cmnd *cmd = GET_CMD_SP(sp);
        struct scsi_qla_host *vha = sp->vha;
        struct qla_hw_data *ha = vha->hw;
 
        /* Setup device pointers. */
        req = vha->req;
-       rsp = req->rsp;
 
        /* So we know we haven't pci_map'ed anything yet */
        tot_dsds = 0;
 
        /* Send marker if required */
        if (vha->marker_needed != 0) {
-               if (qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL) !=
+               if (qla2x00_marker(vha, ha->base_qpair, 0, 0, MK_SYNC_ALL) !=
                    QLA_SUCCESS)
                        return QLA_FUNCTION_FAILED;
                vha->marker_needed = 0;
@@ -1794,7 +1788,7 @@ qla24xx_dif_start_scsi(srb_t *sp)
 
        /* Send marker if required */
        if (vha->marker_needed != 0) {
-               if (qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL) !=
+               if (qla2x00_marker(vha, ha->base_qpair, 0, 0, MK_SYNC_ALL) !=
                    QLA_SUCCESS)
                        return QLA_FUNCTION_FAILED;
                vha->marker_needed = 0;
@@ -1965,7 +1959,6 @@ qla2xxx_start_scsi_mq(srb_t *sp)
        uint16_t        req_cnt;
        uint16_t        tot_dsds;
        struct req_que *req = NULL;
-       struct rsp_que *rsp = NULL;
        struct scsi_cmnd *cmd = GET_CMD_SP(sp);
        struct scsi_qla_host *vha = sp->fcport->vha;
        struct qla_hw_data *ha = vha->hw;
@@ -1975,7 +1968,6 @@ qla2xxx_start_scsi_mq(srb_t *sp)
        spin_lock_irqsave(&qpair->qp_lock, flags);
 
        /* Setup qpair pointers */
-       rsp = qpair->rsp;
        req = qpair->req;
 
        /* So we know we haven't pci_map'ed anything yet */
@@ -1983,7 +1975,7 @@ qla2xxx_start_scsi_mq(srb_t *sp)
 
        /* Send marker if required */
        if (vha->marker_needed != 0) {
-               if (__qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL) !=
+               if (__qla2x00_marker(vha, qpair, 0, 0, MK_SYNC_ALL) !=
                    QLA_SUCCESS) {
                        spin_unlock_irqrestore(&qpair->qp_lock, flags);
                        return QLA_FUNCTION_FAILED;
@@ -2151,7 +2143,7 @@ qla2xxx_dif_start_scsi_mq(srb_t *sp)
 
        /* Send marker if required */
        if (vha->marker_needed != 0) {
-               if (__qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL) !=
+               if (__qla2x00_marker(vha, qpair, 0, 0, MK_SYNC_ALL) !=
                    QLA_SUCCESS) {
                        spin_unlock_irqrestore(&qpair->qp_lock, flags);
                        return QLA_FUNCTION_FAILED;
@@ -3205,8 +3197,8 @@ qla82xx_start_scsi(srb_t *sp)
 
        /* Send marker if required */
        if (vha->marker_needed != 0) {
-               if (qla2x00_marker(vha, req,
-                       rsp, 0, 0, MK_SYNC_ALL) != QLA_SUCCESS) {
+               if (qla2x00_marker(vha, ha->base_qpair,
+                       0, 0, MK_SYNC_ALL) != QLA_SUCCESS) {
                        ql_log(ql_log_warn, vha, 0x300c,
                            "qla2x00_marker failed for cmd=%p.\n", cmd);
                        return QLA_FUNCTION_FAILED;
@@ -3859,8 +3851,8 @@ qla2x00_start_bidir(srb_t *sp, struct scsi_qla_host *vha, uint32_t tot_dsds)
 
        /* Send marker if required */
        if (vha->marker_needed != 0) {
-               if (qla2x00_marker(vha, req,
-                       rsp, 0, 0, MK_SYNC_ALL) != QLA_SUCCESS)
+               if (qla2x00_marker(vha, ha->base_qpair,
+                       0, 0, MK_SYNC_ALL) != QLA_SUCCESS)
                        return EXT_STATUS_MAILBOX;
                vha->marker_needed = 0;
        }
index 7ca3b76..5400696 100644 (file)
@@ -1513,16 +1513,12 @@ qla2x00_abort_target(struct fc_port *fcport, uint64_t l, int tag)
        mbx_cmd_t  mc;
        mbx_cmd_t  *mcp = &mc;
        scsi_qla_host_t *vha;
-       struct req_que *req;
-       struct rsp_que *rsp;
 
        vha = fcport->vha;
 
        ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x103e,
            "Entered %s.\n", __func__);
 
-       req = vha->hw->req_q_map[0];
-       rsp = req->rsp;
        mcp->mb[0] = MBC_ABORT_TARGET;
        mcp->out_mb = MBX_9|MBX_2|MBX_1|MBX_0;
        if (HAS_EXTENDED_IDS(vha->hw)) {
@@ -1545,7 +1541,7 @@ qla2x00_abort_target(struct fc_port *fcport, uint64_t l, int tag)
        }
 
        /* Issue marker IOCB. */
-       rval2 = qla2x00_marker(vha, req, rsp, fcport->loop_id, 0,
+       rval2 = qla2x00_marker(vha, vha->hw->base_qpair, fcport->loop_id, 0,
                                                        MK_SYNC_ID);
        if (rval2 != QLA_SUCCESS) {
                ql_dbg(ql_dbg_mbx, vha, 0x1040,
@@ -1565,16 +1561,12 @@ qla2x00_lun_reset(struct fc_port *fcport, uint64_t l, int tag)
        mbx_cmd_t  mc;
        mbx_cmd_t  *mcp = &mc;
        scsi_qla_host_t *vha;
-       struct req_que *req;
-       struct rsp_que *rsp;
 
        vha = fcport->vha;
 
        ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1042,
            "Entered %s.\n", __func__);
 
-       req = vha->hw->req_q_map[0];
-       rsp = req->rsp;
        mcp->mb[0] = MBC_LUN_RESET;
        mcp->out_mb = MBX_9|MBX_3|MBX_2|MBX_1|MBX_0;
        if (HAS_EXTENDED_IDS(vha->hw))
@@ -1594,7 +1586,7 @@ qla2x00_lun_reset(struct fc_port *fcport, uint64_t l, int tag)
        }
 
        /* Issue marker IOCB. */
-       rval2 = qla2x00_marker(vha, req, rsp, fcport->loop_id, l,
+       rval2 = qla2x00_marker(vha, vha->hw->base_qpair, fcport->loop_id, l,
                                                                MK_SYNC_ID_LUN);
        if (rval2 != QLA_SUCCESS) {
                ql_dbg(ql_dbg_mbx, vha, 0x1044,
@@ -3186,7 +3178,6 @@ __qla24xx_issue_tmf(char *name, uint32_t type, struct fc_port *fcport,
        scsi_qla_host_t *vha;
        struct qla_hw_data *ha;
        struct req_que *req;
-       struct rsp_que *rsp;
        struct qla_qpair *qpair;
 
        vha = fcport->vha;
@@ -3199,10 +3190,7 @@ __qla24xx_issue_tmf(char *name, uint32_t type, struct fc_port *fcport,
        if (vha->vp_idx && vha->qpair) {
                /* NPIV port */
                qpair = vha->qpair;
-               rsp = qpair->rsp;
                req = qpair->req;
-       } else {
-               rsp = req->rsp;
        }
 
        tsk = dma_pool_zalloc(ha->s_dma_pool, GFP_KERNEL, &tsk_dma);
@@ -3259,7 +3247,7 @@ __qla24xx_issue_tmf(char *name, uint32_t type, struct fc_port *fcport,
        }
 
        /* Issue marker IOCB. */
-       rval2 = qla2x00_marker(vha, req, rsp, fcport->loop_id, l,
+       rval2 = qla2x00_marker(vha, ha->base_qpair, fcport->loop_id, l,
            type == TCF_LUN_RESET ? MK_SYNC_ID_LUN: MK_SYNC_ID);
        if (rval2 != QLA_SUCCESS) {
                ql_dbg(ql_dbg_mbx, vha, 0x1099,