[SCSI] qla2xxx: Limit mailbox command contention for ADISC requests.
[firefly-linux-kernel-4.4.55.git] / drivers / scsi / qla2xxx / qla_iocb.c
index d792ae32ed6938c4c0b366d9bfce9e045e7dc5be..8112e41065f2a8d76cbe825b2f096dcf55fab97f 100644 (file)
@@ -1053,6 +1053,36 @@ qla2x00_logout_iocb(srb_t *sp, struct mbx_entry *mbx)
        /* Implicit: mbx->mbx10 = 0. */
 }
 
+static void
+qla24xx_adisc_iocb(srb_t *sp, struct logio_entry_24xx *logio)
+{
+       logio->entry_type = LOGINOUT_PORT_IOCB_TYPE;
+       logio->control_flags = cpu_to_le16(LCF_COMMAND_ADISC);
+       logio->nport_handle = cpu_to_le16(sp->fcport->loop_id);
+       logio->vp_index = sp->fcport->vp_idx;
+}
+
+static void
+qla2x00_adisc_iocb(srb_t *sp, struct mbx_entry *mbx)
+{
+       struct qla_hw_data *ha = sp->fcport->vha->hw;
+
+       mbx->entry_type = MBX_IOCB_TYPE;
+       SET_TARGET_ID(ha, mbx->loop_id, sp->fcport->loop_id);
+       mbx->mb0 = cpu_to_le16(MBC_GET_PORT_DATABASE);
+       if (HAS_EXTENDED_IDS(ha)) {
+               mbx->mb1 = cpu_to_le16(sp->fcport->loop_id);
+               mbx->mb10 = cpu_to_le16(BIT_0);
+       } else {
+               mbx->mb1 = cpu_to_le16((sp->fcport->loop_id << 8) | BIT_0);
+       }
+       mbx->mb2 = cpu_to_le16(MSW(ha->async_pd_dma));
+       mbx->mb3 = cpu_to_le16(LSW(ha->async_pd_dma));
+       mbx->mb6 = cpu_to_le16(MSW(MSD(ha->async_pd_dma)));
+       mbx->mb7 = cpu_to_le16(LSW(MSD(ha->async_pd_dma)));
+       mbx->mb9 = cpu_to_le16(sp->fcport->vp_idx);
+}
+
 static void
 qla24xx_els_iocb(srb_t *sp, struct els_entry_24xx *els_iocb)
 {
@@ -1185,12 +1215,12 @@ qla2x00_start_sp(srb_t *sp)
        switch (ctx->type) {
        case SRB_LOGIN_CMD:
                IS_FWI2_CAPABLE(ha) ?
-                   qla24xx_login_iocb(sp, pkt):
+                   qla24xx_login_iocb(sp, pkt) :
                    qla2x00_login_iocb(sp, pkt);
                break;
        case SRB_LOGOUT_CMD:
                IS_FWI2_CAPABLE(ha) ?
-                   qla24xx_logout_iocb(sp, pkt):
+                   qla24xx_logout_iocb(sp, pkt) :
                    qla2x00_logout_iocb(sp, pkt);
                break;
        case SRB_ELS_CMD_RPT:
@@ -1200,6 +1230,11 @@ qla2x00_start_sp(srb_t *sp)
        case SRB_CT_CMD:
                qla24xx_ct_iocb(sp, pkt);
                break;
+       case SRB_ADISC_CMD:
+               IS_FWI2_CAPABLE(ha) ?
+                   qla24xx_adisc_iocb(sp, pkt) :
+                   qla2x00_adisc_iocb(sp, pkt);
+               break;
        default:
                break;
        }