|
@@ -95,7 +95,7 @@ lpfc_sli4_wq_put(struct lpfc_queue *q, union lpfc_wqe *wqe)
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
/* set consumption flag every once in a while */
|
|
/* set consumption flag every once in a while */
|
|
if (!((q->host_index + 1) % LPFC_RELEASE_NOTIFICATION_INTERVAL))
|
|
if (!((q->host_index + 1) % LPFC_RELEASE_NOTIFICATION_INTERVAL))
|
|
- bf_set(lpfc_wqe_gen_wqec, &wqe->generic, 1);
|
|
|
|
|
|
+ bf_set(wqe_wqec, &wqe->generic.wqe_com, 1);
|
|
|
|
|
|
lpfc_sli_pcimem_bcopy(wqe, temp_wqe, q->entry_size);
|
|
lpfc_sli_pcimem_bcopy(wqe, temp_wqe, q->entry_size);
|
|
|
|
|
|
@@ -5965,7 +5965,7 @@ lpfc_sli4_iocb2wqe(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq,
|
|
uint16_t abrt_iotag;
|
|
uint16_t abrt_iotag;
|
|
struct lpfc_iocbq *abrtiocbq;
|
|
struct lpfc_iocbq *abrtiocbq;
|
|
struct ulp_bde64 *bpl = NULL;
|
|
struct ulp_bde64 *bpl = NULL;
|
|
- uint32_t els_id = ELS_ID_DEFAULT;
|
|
|
|
|
|
+ uint32_t els_id = LPFC_ELS_ID_DEFAULT;
|
|
int numBdes, i;
|
|
int numBdes, i;
|
|
struct ulp_bde64 bde;
|
|
struct ulp_bde64 bde;
|
|
|
|
|
|
@@ -5982,7 +5982,7 @@ lpfc_sli4_iocb2wqe(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq,
|
|
memcpy(wqe, &iocbq->iocb, sizeof(union lpfc_wqe));
|
|
memcpy(wqe, &iocbq->iocb, sizeof(union lpfc_wqe));
|
|
abort_tag = (uint32_t) iocbq->iotag;
|
|
abort_tag = (uint32_t) iocbq->iotag;
|
|
xritag = iocbq->sli4_xritag;
|
|
xritag = iocbq->sli4_xritag;
|
|
- wqe->words[7] = 0; /* The ct field has moved so reset */
|
|
|
|
|
|
+ wqe->generic.wqe_com.word7 = 0; /* The ct field has moved so reset */
|
|
/* words0-2 bpl convert bde */
|
|
/* words0-2 bpl convert bde */
|
|
if (iocbq->iocb.un.genreq64.bdl.bdeFlags == BUFF_TYPE_BLP_64) {
|
|
if (iocbq->iocb.un.genreq64.bdl.bdeFlags == BUFF_TYPE_BLP_64) {
|
|
numBdes = iocbq->iocb.un.genreq64.bdl.bdeSize /
|
|
numBdes = iocbq->iocb.un.genreq64.bdl.bdeSize /
|
|
@@ -6033,109 +6033,117 @@ lpfc_sli4_iocb2wqe(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq,
|
|
* contains the FCFI and remote N_Port_ID is
|
|
* contains the FCFI and remote N_Port_ID is
|
|
* in word 5.
|
|
* in word 5.
|
|
*/
|
|
*/
|
|
-
|
|
|
|
ct = ((iocbq->iocb.ulpCt_h << 1) | iocbq->iocb.ulpCt_l);
|
|
ct = ((iocbq->iocb.ulpCt_h << 1) | iocbq->iocb.ulpCt_l);
|
|
- bf_set(lpfc_wqe_gen_context, &wqe->generic,
|
|
|
|
- iocbq->iocb.ulpContext);
|
|
|
|
-
|
|
|
|
- bf_set(lpfc_wqe_gen_ct, &wqe->generic, ct);
|
|
|
|
- bf_set(lpfc_wqe_gen_pu, &wqe->generic, 0);
|
|
|
|
|
|
+ bf_set(wqe_ctxt_tag, &wqe->els_req.wqe_com,
|
|
|
|
+ iocbq->iocb.ulpContext);
|
|
|
|
+ bf_set(wqe_ct, &wqe->els_req.wqe_com, ct);
|
|
|
|
+ bf_set(wqe_pu, &wqe->els_req.wqe_com, 0);
|
|
/* CCP CCPE PV PRI in word10 were set in the memcpy */
|
|
/* CCP CCPE PV PRI in word10 were set in the memcpy */
|
|
-
|
|
|
|
if (command_type == ELS_COMMAND_FIP) {
|
|
if (command_type == ELS_COMMAND_FIP) {
|
|
els_id = ((iocbq->iocb_flag & LPFC_FIP_ELS_ID_MASK)
|
|
els_id = ((iocbq->iocb_flag & LPFC_FIP_ELS_ID_MASK)
|
|
>> LPFC_FIP_ELS_ID_SHIFT);
|
|
>> LPFC_FIP_ELS_ID_SHIFT);
|
|
}
|
|
}
|
|
- bf_set(lpfc_wqe_gen_els_id, &wqe->generic, els_id);
|
|
|
|
-
|
|
|
|
|
|
+ bf_set(wqe_els_id, &wqe->els_req.wqe_com, els_id);
|
|
|
|
+ bf_set(wqe_dbde, &wqe->els_req.wqe_com, 1);
|
|
|
|
+ bf_set(wqe_iod, &wqe->els_req.wqe_com, LPFC_WQE_IOD_READ);
|
|
|
|
+ bf_set(wqe_qosd, &wqe->els_req.wqe_com, 1);
|
|
|
|
+ bf_set(wqe_lenloc, &wqe->els_req.wqe_com, LPFC_WQE_LENLOC_NONE);
|
|
|
|
+ bf_set(wqe_ebde_cnt, &wqe->els_req.wqe_com, 0);
|
|
break;
|
|
break;
|
|
case CMD_XMIT_SEQUENCE64_CX:
|
|
case CMD_XMIT_SEQUENCE64_CX:
|
|
- bf_set(lpfc_wqe_gen_context, &wqe->generic,
|
|
|
|
- iocbq->iocb.un.ulpWord[3]);
|
|
|
|
- wqe->generic.word3 = 0;
|
|
|
|
- bf_set(wqe_rcvoxid, &wqe->generic, iocbq->iocb.ulpContext);
|
|
|
|
|
|
+ bf_set(wqe_ctxt_tag, &wqe->xmit_sequence.wqe_com,
|
|
|
|
+ iocbq->iocb.un.ulpWord[3]);
|
|
|
|
+ bf_set(wqe_rcvoxid, &wqe->xmit_sequence.wqe_com,
|
|
|
|
+ iocbq->iocb.ulpContext);
|
|
/* The entire sequence is transmitted for this IOCB */
|
|
/* The entire sequence is transmitted for this IOCB */
|
|
xmit_len = total_len;
|
|
xmit_len = total_len;
|
|
cmnd = CMD_XMIT_SEQUENCE64_CR;
|
|
cmnd = CMD_XMIT_SEQUENCE64_CR;
|
|
case CMD_XMIT_SEQUENCE64_CR:
|
|
case CMD_XMIT_SEQUENCE64_CR:
|
|
- /* word3 iocb=io_tag32 wqe=payload_offset */
|
|
|
|
- /* payload offset used for multilpe outstanding
|
|
|
|
- * sequences on the same exchange
|
|
|
|
- */
|
|
|
|
- wqe->words[3] = 0;
|
|
|
|
|
|
+ /* word3 iocb=io_tag32 wqe=reserved */
|
|
|
|
+ wqe->xmit_sequence.rsvd3 = 0;
|
|
/* word4 relative_offset memcpy */
|
|
/* word4 relative_offset memcpy */
|
|
/* word5 r_ctl/df_ctl memcpy */
|
|
/* word5 r_ctl/df_ctl memcpy */
|
|
- bf_set(lpfc_wqe_gen_pu, &wqe->generic, 0);
|
|
|
|
|
|
+ bf_set(wqe_pu, &wqe->xmit_sequence.wqe_com, 0);
|
|
|
|
+ bf_set(wqe_dbde, &wqe->xmit_sequence.wqe_com, 1);
|
|
|
|
+ bf_set(wqe_iod, &wqe->xmit_sequence.wqe_com,
|
|
|
|
+ LPFC_WQE_IOD_WRITE);
|
|
|
|
+ bf_set(wqe_lenloc, &wqe->xmit_sequence.wqe_com,
|
|
|
|
+ LPFC_WQE_LENLOC_WORD12);
|
|
|
|
+ bf_set(wqe_ebde_cnt, &wqe->xmit_sequence.wqe_com, 0);
|
|
wqe->xmit_sequence.xmit_len = xmit_len;
|
|
wqe->xmit_sequence.xmit_len = xmit_len;
|
|
command_type = OTHER_COMMAND;
|
|
command_type = OTHER_COMMAND;
|
|
break;
|
|
break;
|
|
case CMD_XMIT_BCAST64_CN:
|
|
case CMD_XMIT_BCAST64_CN:
|
|
- /* word3 iocb=iotag32 wqe=payload_len */
|
|
|
|
- wqe->words[3] = 0; /* no definition for this in wqe */
|
|
|
|
|
|
+ /* word3 iocb=iotag32 wqe=seq_payload_len */
|
|
|
|
+ wqe->xmit_bcast64.seq_payload_len = xmit_len;
|
|
/* word4 iocb=rsvd wqe=rsvd */
|
|
/* word4 iocb=rsvd wqe=rsvd */
|
|
/* word5 iocb=rctl/type/df_ctl wqe=rctl/type/df_ctl memcpy */
|
|
/* word5 iocb=rctl/type/df_ctl wqe=rctl/type/df_ctl memcpy */
|
|
/* word6 iocb=ctxt_tag/io_tag wqe=ctxt_tag/xri */
|
|
/* word6 iocb=ctxt_tag/io_tag wqe=ctxt_tag/xri */
|
|
- bf_set(lpfc_wqe_gen_ct, &wqe->generic,
|
|
|
|
|
|
+ bf_set(wqe_ct, &wqe->xmit_bcast64.wqe_com,
|
|
((iocbq->iocb.ulpCt_h << 1) | iocbq->iocb.ulpCt_l));
|
|
((iocbq->iocb.ulpCt_h << 1) | iocbq->iocb.ulpCt_l));
|
|
|
|
+ bf_set(wqe_dbde, &wqe->xmit_bcast64.wqe_com, 1);
|
|
|
|
+ bf_set(wqe_iod, &wqe->xmit_bcast64.wqe_com, LPFC_WQE_IOD_WRITE);
|
|
|
|
+ bf_set(wqe_lenloc, &wqe->xmit_bcast64.wqe_com,
|
|
|
|
+ LPFC_WQE_LENLOC_WORD3);
|
|
|
|
+ bf_set(wqe_ebde_cnt, &wqe->xmit_bcast64.wqe_com, 0);
|
|
break;
|
|
break;
|
|
case CMD_FCP_IWRITE64_CR:
|
|
case CMD_FCP_IWRITE64_CR:
|
|
command_type = FCP_COMMAND_DATA_OUT;
|
|
command_type = FCP_COMMAND_DATA_OUT;
|
|
- /* The struct for wqe fcp_iwrite has 3 fields that are somewhat
|
|
|
|
- * confusing.
|
|
|
|
- * word3 is payload_len: byte offset to the sgl entry for the
|
|
|
|
- * fcp_command.
|
|
|
|
- * word4 is total xfer len, same as the IOCB->ulpParameter.
|
|
|
|
- * word5 is initial xfer len 0 = wait for xfer-ready
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
- /* Always wait for xfer-ready before sending data */
|
|
|
|
- wqe->fcp_iwrite.initial_xfer_len = 0;
|
|
|
|
- /* word 4 (xfer length) should have been set on the memcpy */
|
|
|
|
-
|
|
|
|
- /* allow write to fall through to read */
|
|
|
|
|
|
+ /* word3 iocb=iotag wqe=payload_offset_len */
|
|
|
|
+ /* Add the FCP_CMD and FCP_RSP sizes to get the offset */
|
|
|
|
+ wqe->fcp_iwrite.payload_offset_len =
|
|
|
|
+ xmit_len + sizeof(struct fcp_rsp);
|
|
|
|
+ /* word4 iocb=parameter wqe=total_xfer_length memcpy */
|
|
|
|
+ /* word5 iocb=initial_xfer_len wqe=initial_xfer_len memcpy */
|
|
|
|
+ bf_set(wqe_erp, &wqe->fcp_iwrite.wqe_com,
|
|
|
|
+ iocbq->iocb.ulpFCP2Rcvy);
|
|
|
|
+ bf_set(wqe_lnk, &wqe->fcp_iwrite.wqe_com, iocbq->iocb.ulpXS);
|
|
|
|
+ /* Always open the exchange */
|
|
|
|
+ bf_set(wqe_xc, &wqe->fcp_iwrite.wqe_com, 0);
|
|
|
|
+ bf_set(wqe_dbde, &wqe->fcp_iwrite.wqe_com, 1);
|
|
|
|
+ bf_set(wqe_iod, &wqe->fcp_iwrite.wqe_com, LPFC_WQE_IOD_WRITE);
|
|
|
|
+ bf_set(wqe_lenloc, &wqe->fcp_iwrite.wqe_com,
|
|
|
|
+ LPFC_WQE_LENLOC_WORD4);
|
|
|
|
+ bf_set(wqe_ebde_cnt, &wqe->fcp_iwrite.wqe_com, 0);
|
|
|
|
+ bf_set(wqe_pu, &wqe->fcp_iwrite.wqe_com, iocbq->iocb.ulpPU);
|
|
|
|
+ break;
|
|
case CMD_FCP_IREAD64_CR:
|
|
case CMD_FCP_IREAD64_CR:
|
|
- /* FCP_CMD is always the 1st sgl entry */
|
|
|
|
- wqe->fcp_iread.payload_len =
|
|
|
|
|
|
+ /* word3 iocb=iotag wqe=payload_offset_len */
|
|
|
|
+ /* Add the FCP_CMD and FCP_RSP sizes to get the offset */
|
|
|
|
+ wqe->fcp_iread.payload_offset_len =
|
|
xmit_len + sizeof(struct fcp_rsp);
|
|
xmit_len + sizeof(struct fcp_rsp);
|
|
-
|
|
|
|
- /* word 4 (xfer length) should have been set on the memcpy */
|
|
|
|
-
|
|
|
|
- bf_set(lpfc_wqe_gen_erp, &wqe->generic,
|
|
|
|
- iocbq->iocb.ulpFCP2Rcvy);
|
|
|
|
- bf_set(lpfc_wqe_gen_lnk, &wqe->generic, iocbq->iocb.ulpXS);
|
|
|
|
- /* The XC bit and the XS bit are similar. The driver never
|
|
|
|
- * tracked whether or not the exchange was previouslly open.
|
|
|
|
- * XC = Exchange create, 0 is create. 1 is already open.
|
|
|
|
- * XS = link cmd: 1 do not close the exchange after command.
|
|
|
|
- * XS = 0 close exchange when command completes.
|
|
|
|
- * The only time we would not set the XC bit is when the XS bit
|
|
|
|
- * is set and we are sending our 2nd or greater command on
|
|
|
|
- * this exchange.
|
|
|
|
- */
|
|
|
|
|
|
+ /* word4 iocb=parameter wqe=total_xfer_length memcpy */
|
|
|
|
+ /* word5 iocb=initial_xfer_len wqe=initial_xfer_len memcpy */
|
|
|
|
+ bf_set(wqe_erp, &wqe->fcp_iread.wqe_com,
|
|
|
|
+ iocbq->iocb.ulpFCP2Rcvy);
|
|
|
|
+ bf_set(wqe_lnk, &wqe->fcp_iread.wqe_com, iocbq->iocb.ulpXS);
|
|
/* Always open the exchange */
|
|
/* Always open the exchange */
|
|
bf_set(wqe_xc, &wqe->fcp_iread.wqe_com, 0);
|
|
bf_set(wqe_xc, &wqe->fcp_iread.wqe_com, 0);
|
|
-
|
|
|
|
- wqe->words[10] &= 0xffff0000; /* zero out ebde count */
|
|
|
|
- bf_set(lpfc_wqe_gen_pu, &wqe->generic, iocbq->iocb.ulpPU);
|
|
|
|
- break;
|
|
|
|
|
|
+ bf_set(wqe_dbde, &wqe->fcp_iread.wqe_com, 1);
|
|
|
|
+ bf_set(wqe_iod, &wqe->fcp_iread.wqe_com, LPFC_WQE_IOD_READ);
|
|
|
|
+ bf_set(wqe_lenloc, &wqe->fcp_iread.wqe_com,
|
|
|
|
+ LPFC_WQE_LENLOC_WORD4);
|
|
|
|
+ bf_set(wqe_ebde_cnt, &wqe->fcp_iread.wqe_com, 0);
|
|
|
|
+ bf_set(wqe_pu, &wqe->fcp_iread.wqe_com, iocbq->iocb.ulpPU);
|
|
|
|
+ break;
|
|
case CMD_FCP_ICMND64_CR:
|
|
case CMD_FCP_ICMND64_CR:
|
|
|
|
+ /* word3 iocb=IO_TAG wqe=reserved */
|
|
|
|
+ wqe->fcp_icmd.rsrvd3 = 0;
|
|
|
|
+ bf_set(wqe_pu, &wqe->fcp_icmd.wqe_com, 0);
|
|
/* Always open the exchange */
|
|
/* Always open the exchange */
|
|
- bf_set(wqe_xc, &wqe->fcp_iread.wqe_com, 0);
|
|
|
|
-
|
|
|
|
- wqe->words[4] = 0;
|
|
|
|
- wqe->words[10] &= 0xffff0000; /* zero out ebde count */
|
|
|
|
- bf_set(lpfc_wqe_gen_pu, &wqe->generic, 0);
|
|
|
|
|
|
+ bf_set(wqe_xc, &wqe->fcp_icmd.wqe_com, 0);
|
|
|
|
+ bf_set(wqe_dbde, &wqe->fcp_icmd.wqe_com, 1);
|
|
|
|
+ bf_set(wqe_iod, &wqe->fcp_icmd.wqe_com, LPFC_WQE_IOD_WRITE);
|
|
|
|
+ bf_set(wqe_qosd, &wqe->fcp_icmd.wqe_com, 1);
|
|
|
|
+ bf_set(wqe_lenloc, &wqe->fcp_icmd.wqe_com,
|
|
|
|
+ LPFC_WQE_LENLOC_NONE);
|
|
|
|
+ bf_set(wqe_ebde_cnt, &wqe->fcp_icmd.wqe_com, 0);
|
|
break;
|
|
break;
|
|
case CMD_GEN_REQUEST64_CR:
|
|
case CMD_GEN_REQUEST64_CR:
|
|
- /* word3 command length is described as byte offset to the
|
|
|
|
- * rsp_data. Would always be 16, sizeof(struct sli4_sge)
|
|
|
|
- * sgl[0] = cmnd
|
|
|
|
- * sgl[1] = rsp.
|
|
|
|
- *
|
|
|
|
- */
|
|
|
|
- wqe->gen_req.command_len = xmit_len;
|
|
|
|
- /* Word4 parameter copied in the memcpy */
|
|
|
|
- /* Word5 [rctl, type, df_ctl, la] copied in memcpy */
|
|
|
|
|
|
+ /* word3 iocb=IO_TAG wqe=request_payload_len */
|
|
|
|
+ wqe->gen_req.request_payload_len = xmit_len;
|
|
|
|
+ /* word4 iocb=parameter wqe=relative_offset memcpy */
|
|
|
|
+ /* word5 [rctl, type, df_ctl, la] copied in memcpy */
|
|
/* word6 context tag copied in memcpy */
|
|
/* word6 context tag copied in memcpy */
|
|
if (iocbq->iocb.ulpCt_h || iocbq->iocb.ulpCt_l) {
|
|
if (iocbq->iocb.ulpCt_h || iocbq->iocb.ulpCt_l) {
|
|
ct = ((iocbq->iocb.ulpCt_h << 1) | iocbq->iocb.ulpCt_l);
|
|
ct = ((iocbq->iocb.ulpCt_h << 1) | iocbq->iocb.ulpCt_l);
|
|
@@ -6144,31 +6152,39 @@ lpfc_sli4_iocb2wqe(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq,
|
|
ct, iocbq->iocb.ulpCommand);
|
|
ct, iocbq->iocb.ulpCommand);
|
|
return IOCB_ERROR;
|
|
return IOCB_ERROR;
|
|
}
|
|
}
|
|
- bf_set(lpfc_wqe_gen_ct, &wqe->generic, 0);
|
|
|
|
- bf_set(wqe_tmo, &wqe->gen_req.wqe_com,
|
|
|
|
- iocbq->iocb.ulpTimeout);
|
|
|
|
-
|
|
|
|
- bf_set(lpfc_wqe_gen_pu, &wqe->generic, iocbq->iocb.ulpPU);
|
|
|
|
|
|
+ bf_set(wqe_ct, &wqe->gen_req.wqe_com, 0);
|
|
|
|
+ bf_set(wqe_tmo, &wqe->gen_req.wqe_com, iocbq->iocb.ulpTimeout);
|
|
|
|
+ bf_set(wqe_pu, &wqe->gen_req.wqe_com, iocbq->iocb.ulpPU);
|
|
|
|
+ bf_set(wqe_dbde, &wqe->gen_req.wqe_com, 1);
|
|
|
|
+ bf_set(wqe_iod, &wqe->gen_req.wqe_com, LPFC_WQE_IOD_READ);
|
|
|
|
+ bf_set(wqe_qosd, &wqe->gen_req.wqe_com, 1);
|
|
|
|
+ bf_set(wqe_lenloc, &wqe->gen_req.wqe_com, LPFC_WQE_LENLOC_NONE);
|
|
|
|
+ bf_set(wqe_ebde_cnt, &wqe->gen_req.wqe_com, 0);
|
|
command_type = OTHER_COMMAND;
|
|
command_type = OTHER_COMMAND;
|
|
break;
|
|
break;
|
|
case CMD_XMIT_ELS_RSP64_CX:
|
|
case CMD_XMIT_ELS_RSP64_CX:
|
|
/* words0-2 BDE memcpy */
|
|
/* words0-2 BDE memcpy */
|
|
- /* word3 iocb=iotag32 wqe=rsvd */
|
|
|
|
- wqe->words[3] = 0;
|
|
|
|
|
|
+ /* word3 iocb=iotag32 wqe=response_payload_len */
|
|
|
|
+ wqe->xmit_els_rsp.response_payload_len = xmit_len;
|
|
/* word4 iocb=did wge=rsvd. */
|
|
/* word4 iocb=did wge=rsvd. */
|
|
- wqe->words[4] = 0;
|
|
|
|
|
|
+ wqe->xmit_els_rsp.rsvd4 = 0;
|
|
/* word5 iocb=rsvd wge=did */
|
|
/* word5 iocb=rsvd wge=did */
|
|
bf_set(wqe_els_did, &wqe->xmit_els_rsp.wqe_dest,
|
|
bf_set(wqe_els_did, &wqe->xmit_els_rsp.wqe_dest,
|
|
iocbq->iocb.un.elsreq64.remoteID);
|
|
iocbq->iocb.un.elsreq64.remoteID);
|
|
-
|
|
|
|
- bf_set(lpfc_wqe_gen_ct, &wqe->generic,
|
|
|
|
- ((iocbq->iocb.ulpCt_h << 1) | iocbq->iocb.ulpCt_l));
|
|
|
|
-
|
|
|
|
- bf_set(lpfc_wqe_gen_pu, &wqe->generic, iocbq->iocb.ulpPU);
|
|
|
|
- bf_set(wqe_rcvoxid, &wqe->generic, iocbq->iocb.ulpContext);
|
|
|
|
|
|
+ bf_set(wqe_ct, &wqe->xmit_els_rsp.wqe_com,
|
|
|
|
+ ((iocbq->iocb.ulpCt_h << 1) | iocbq->iocb.ulpCt_l));
|
|
|
|
+ bf_set(wqe_pu, &wqe->xmit_els_rsp.wqe_com, iocbq->iocb.ulpPU);
|
|
|
|
+ bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com,
|
|
|
|
+ iocbq->iocb.ulpContext);
|
|
if (!iocbq->iocb.ulpCt_h && iocbq->iocb.ulpCt_l)
|
|
if (!iocbq->iocb.ulpCt_h && iocbq->iocb.ulpCt_l)
|
|
- bf_set(lpfc_wqe_gen_context, &wqe->generic,
|
|
|
|
|
|
+ bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com,
|
|
iocbq->vport->vpi + phba->vpi_base);
|
|
iocbq->vport->vpi + phba->vpi_base);
|
|
|
|
+ bf_set(wqe_dbde, &wqe->xmit_els_rsp.wqe_com, 1);
|
|
|
|
+ bf_set(wqe_iod, &wqe->xmit_els_rsp.wqe_com, LPFC_WQE_IOD_WRITE);
|
|
|
|
+ bf_set(wqe_qosd, &wqe->xmit_els_rsp.wqe_com, 1);
|
|
|
|
+ bf_set(wqe_lenloc, &wqe->xmit_els_rsp.wqe_com,
|
|
|
|
+ LPFC_WQE_LENLOC_WORD3);
|
|
|
|
+ bf_set(wqe_ebde_cnt, &wqe->xmit_els_rsp.wqe_com, 0);
|
|
command_type = OTHER_COMMAND;
|
|
command_type = OTHER_COMMAND;
|
|
break;
|
|
break;
|
|
case CMD_CLOSE_XRI_CN:
|
|
case CMD_CLOSE_XRI_CN:
|
|
@@ -6193,15 +6209,19 @@ lpfc_sli4_iocb2wqe(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq,
|
|
else
|
|
else
|
|
bf_set(abort_cmd_ia, &wqe->abort_cmd, 0);
|
|
bf_set(abort_cmd_ia, &wqe->abort_cmd, 0);
|
|
bf_set(abort_cmd_criteria, &wqe->abort_cmd, T_XRI_TAG);
|
|
bf_set(abort_cmd_criteria, &wqe->abort_cmd, T_XRI_TAG);
|
|
- wqe->words[5] = 0;
|
|
|
|
- bf_set(lpfc_wqe_gen_ct, &wqe->generic,
|
|
|
|
|
|
+ /* word5 iocb=CONTEXT_TAG|IO_TAG wqe=reserved */
|
|
|
|
+ wqe->abort_cmd.rsrvd5 = 0;
|
|
|
|
+ bf_set(wqe_ct, &wqe->abort_cmd.wqe_com,
|
|
((iocbq->iocb.ulpCt_h << 1) | iocbq->iocb.ulpCt_l));
|
|
((iocbq->iocb.ulpCt_h << 1) | iocbq->iocb.ulpCt_l));
|
|
abort_tag = iocbq->iocb.un.acxri.abortIoTag;
|
|
abort_tag = iocbq->iocb.un.acxri.abortIoTag;
|
|
/*
|
|
/*
|
|
* The abort handler will send us CMD_ABORT_XRI_CN or
|
|
* The abort handler will send us CMD_ABORT_XRI_CN or
|
|
* CMD_CLOSE_XRI_CN and the fw only accepts CMD_ABORT_XRI_CX
|
|
* CMD_CLOSE_XRI_CN and the fw only accepts CMD_ABORT_XRI_CX
|
|
*/
|
|
*/
|
|
- bf_set(lpfc_wqe_gen_command, &wqe->generic, CMD_ABORT_XRI_CX);
|
|
|
|
|
|
+ bf_set(wqe_cmnd, &wqe->abort_cmd.wqe_com, CMD_ABORT_XRI_CX);
|
|
|
|
+ bf_set(wqe_qosd, &wqe->abort_cmd.wqe_com, 1);
|
|
|
|
+ bf_set(wqe_lenloc, &wqe->abort_cmd.wqe_com,
|
|
|
|
+ LPFC_WQE_LENLOC_NONE);
|
|
cmnd = CMD_ABORT_XRI_CX;
|
|
cmnd = CMD_ABORT_XRI_CX;
|
|
command_type = OTHER_COMMAND;
|
|
command_type = OTHER_COMMAND;
|
|
xritag = 0;
|
|
xritag = 0;
|
|
@@ -6235,18 +6255,14 @@ lpfc_sli4_iocb2wqe(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq,
|
|
bf_set(wqe_xmit_bls_pt, &wqe->xmit_bls_rsp.wqe_dest, 0x1);
|
|
bf_set(wqe_xmit_bls_pt, &wqe->xmit_bls_rsp.wqe_dest, 0x1);
|
|
bf_set(wqe_ctxt_tag, &wqe->xmit_bls_rsp.wqe_com,
|
|
bf_set(wqe_ctxt_tag, &wqe->xmit_bls_rsp.wqe_com,
|
|
iocbq->iocb.ulpContext);
|
|
iocbq->iocb.ulpContext);
|
|
|
|
+ bf_set(wqe_qosd, &wqe->xmit_bls_rsp.wqe_com, 1);
|
|
|
|
+ bf_set(wqe_lenloc, &wqe->xmit_bls_rsp.wqe_com,
|
|
|
|
+ LPFC_WQE_LENLOC_NONE);
|
|
/* Overwrite the pre-set comnd type with OTHER_COMMAND */
|
|
/* Overwrite the pre-set comnd type with OTHER_COMMAND */
|
|
command_type = OTHER_COMMAND;
|
|
command_type = OTHER_COMMAND;
|
|
break;
|
|
break;
|
|
case CMD_XRI_ABORTED_CX:
|
|
case CMD_XRI_ABORTED_CX:
|
|
case CMD_CREATE_XRI_CR: /* Do we expect to use this? */
|
|
case CMD_CREATE_XRI_CR: /* Do we expect to use this? */
|
|
- /* words0-2 are all 0's no bde */
|
|
|
|
- /* word3 and word4 are rsvrd */
|
|
|
|
- wqe->words[3] = 0;
|
|
|
|
- wqe->words[4] = 0;
|
|
|
|
- /* word5 iocb=rsvd wge=did */
|
|
|
|
- /* There is no remote port id in the IOCB? */
|
|
|
|
- /* Let this fall through and fail */
|
|
|
|
case CMD_IOCB_FCP_IBIDIR64_CR: /* bidirectional xfer */
|
|
case CMD_IOCB_FCP_IBIDIR64_CR: /* bidirectional xfer */
|
|
case CMD_FCP_TSEND64_CX: /* Target mode send xfer-ready */
|
|
case CMD_FCP_TSEND64_CX: /* Target mode send xfer-ready */
|
|
case CMD_FCP_TRSP64_CX: /* Target mode rcv */
|
|
case CMD_FCP_TRSP64_CX: /* Target mode rcv */
|
|
@@ -6257,16 +6273,14 @@ lpfc_sli4_iocb2wqe(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq,
|
|
iocbq->iocb.ulpCommand);
|
|
iocbq->iocb.ulpCommand);
|
|
return IOCB_ERROR;
|
|
return IOCB_ERROR;
|
|
break;
|
|
break;
|
|
-
|
|
|
|
}
|
|
}
|
|
- bf_set(lpfc_wqe_gen_xri, &wqe->generic, xritag);
|
|
|
|
- bf_set(lpfc_wqe_gen_request_tag, &wqe->generic, iocbq->iotag);
|
|
|
|
- wqe->generic.abort_tag = abort_tag;
|
|
|
|
- bf_set(lpfc_wqe_gen_cmd_type, &wqe->generic, command_type);
|
|
|
|
- bf_set(lpfc_wqe_gen_command, &wqe->generic, cmnd);
|
|
|
|
- bf_set(lpfc_wqe_gen_class, &wqe->generic, iocbq->iocb.ulpClass);
|
|
|
|
- bf_set(lpfc_wqe_gen_cq_id, &wqe->generic, LPFC_WQE_CQ_ID_DEFAULT);
|
|
|
|
-
|
|
|
|
|
|
+ bf_set(wqe_xri_tag, &wqe->generic.wqe_com, xritag);
|
|
|
|
+ bf_set(wqe_reqtag, &wqe->generic.wqe_com, iocbq->iotag);
|
|
|
|
+ wqe->generic.wqe_com.abort_tag = abort_tag;
|
|
|
|
+ bf_set(wqe_cmd_type, &wqe->generic.wqe_com, command_type);
|
|
|
|
+ bf_set(wqe_cmnd, &wqe->generic.wqe_com, cmnd);
|
|
|
|
+ bf_set(wqe_class, &wqe->generic.wqe_com, iocbq->iocb.ulpClass);
|
|
|
|
+ bf_set(wqe_cqid, &wqe->generic.wqe_com, LPFC_WQE_CQ_ID_DEFAULT);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|