|
@@ -2001,11 +2001,21 @@ lpfc_issue_els_plogi(struct lpfc_vport *vport, uint32_t did, uint8_t retry)
|
|
|
sp->cmn.fcphHigh = FC_PH3;
|
|
|
|
|
|
sp->cmn.valid_vendor_ver_level = 0;
|
|
|
+ memset(sp->un.vendorVersion, 0, sizeof(sp->un.vendorVersion));
|
|
|
|
|
|
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
|
|
|
"Issue PLOGI: did:x%x",
|
|
|
did, 0, 0);
|
|
|
|
|
|
+ /* If our firmware supports this feature, convey that
|
|
|
+ * information to the target using the vendor specific field.
|
|
|
+ */
|
|
|
+ if (phba->sli.sli_flag & LPFC_SLI_SUPPRESS_RSP) {
|
|
|
+ sp->cmn.valid_vendor_ver_level = 1;
|
|
|
+ sp->un.vv.vid = cpu_to_be32(LPFC_VV_EMLX_ID);
|
|
|
+ sp->un.vv.flags = cpu_to_be32(LPFC_VV_SUPPRESS_RSP);
|
|
|
+ }
|
|
|
+
|
|
|
phba->fc_stat.elsXmitPLOGI++;
|
|
|
elsiocb->iocb_cmpl = lpfc_cmpl_els_plogi;
|
|
|
ret = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
|
|
@@ -2207,7 +2217,13 @@ lpfc_issue_els_prli(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
|
|
!phba->nvmet_support)
|
|
|
bf_set(prli_fba, npr_nvme, 1);
|
|
|
|
|
|
- bf_set(prli_init, npr_nvme, 1);
|
|
|
+ if (phba->nvmet_support) {
|
|
|
+ bf_set(prli_tgt, npr_nvme, 1);
|
|
|
+ bf_set(prli_disc, npr_nvme, 1);
|
|
|
+
|
|
|
+ } else {
|
|
|
+ bf_set(prli_init, npr_nvme, 1);
|
|
|
+ }
|
|
|
npr_nvme->word1 = cpu_to_be32(npr_nvme->word1);
|
|
|
npr_nvme->word4 = cpu_to_be32(npr_nvme->word4);
|
|
|
elsiocb->iocb_flag |= LPFC_PRLI_NVME_REQ;
|
|
@@ -2619,8 +2635,11 @@ out:
|
|
|
phba->pport->fc_myDID = 0;
|
|
|
|
|
|
if ((phba->cfg_enable_fc4_type == LPFC_ENABLE_BOTH) ||
|
|
|
- (phba->cfg_enable_fc4_type == LPFC_ENABLE_NVME))
|
|
|
- lpfc_nvme_update_localport(phba->pport);
|
|
|
+ (phba->cfg_enable_fc4_type == LPFC_ENABLE_NVME)) {
|
|
|
+ if (!phba->nvmet_support)
|
|
|
+ lpfc_nvme_update_localport(phba->pport);
|
|
|
+ /* todo: tgt: update targetport attributes */
|
|
|
+ }
|
|
|
|
|
|
mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
|
|
|
if (mbox) {
|
|
@@ -4074,10 +4093,25 @@ lpfc_els_rsp_acc(struct lpfc_vport *vport, uint32_t flag,
|
|
|
sizeof(struct lpfc_name));
|
|
|
memcpy(&sp->nodeName, &vport->fc_sparam.nodeName,
|
|
|
sizeof(struct lpfc_name));
|
|
|
- } else
|
|
|
+ } else {
|
|
|
memcpy(pcmd, &vport->fc_sparam,
|
|
|
sizeof(struct serv_parm));
|
|
|
|
|
|
+ sp->cmn.valid_vendor_ver_level = 0;
|
|
|
+ memset(sp->un.vendorVersion, 0,
|
|
|
+ sizeof(sp->un.vendorVersion));
|
|
|
+
|
|
|
+ /* If our firmware supports this feature, convey that
|
|
|
+ * info to the target using the vendor specific field.
|
|
|
+ */
|
|
|
+ if (phba->sli.sli_flag & LPFC_SLI_SUPPRESS_RSP) {
|
|
|
+ sp->cmn.valid_vendor_ver_level = 1;
|
|
|
+ sp->un.vv.vid = cpu_to_be32(LPFC_VV_EMLX_ID);
|
|
|
+ sp->un.vv.flags =
|
|
|
+ cpu_to_be32(LPFC_VV_SUPPRESS_RSP);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
|
|
|
"Issue ACC FLOGI/PLOGI: did:x%x flg:x%x",
|
|
|
ndlp->nlp_DID, ndlp->nlp_flag, 0);
|
|
@@ -4397,7 +4431,22 @@ lpfc_els_rsp_prli_acc(struct lpfc_vport *vport, struct lpfc_iocbq *oldiocb,
|
|
|
bf_set(prli_type_code, npr_nvme, PRLI_NVME_TYPE);
|
|
|
bf_set(prli_estabImagePair, npr_nvme, 0); /* Should be 0 */
|
|
|
bf_set(prli_acc_rsp_code, npr_nvme, PRLI_REQ_EXECUTED);
|
|
|
- bf_set(prli_init, npr_nvme, 1);
|
|
|
+ if (phba->nvmet_support) {
|
|
|
+ bf_set(prli_tgt, npr_nvme, 1);
|
|
|
+ bf_set(prli_disc, npr_nvme, 1);
|
|
|
+ if (phba->cfg_nvme_enable_fb) {
|
|
|
+ bf_set(prli_fba, npr_nvme, 1);
|
|
|
+
|
|
|
+ /* TBD. Target mode needs to post buffers
|
|
|
+ * that support the configured first burst
|
|
|
+ * byte size.
|
|
|
+ */
|
|
|
+ bf_set(prli_fb_sz, npr_nvme,
|
|
|
+ phba->cfg_nvmet_fb_size);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ bf_set(prli_init, npr_nvme, 1);
|
|
|
+ }
|
|
|
|
|
|
lpfc_printf_vlog(vport, KERN_INFO, LOG_NVME_DISC,
|
|
|
"6015 NVME issue PRLI ACC word1 x%08x "
|
|
@@ -5815,6 +5864,8 @@ lpfc_rscn_recovery_check(struct lpfc_vport *vport)
|
|
|
(ndlp->nlp_state == NLP_STE_UNUSED_NODE) ||
|
|
|
!lpfc_rscn_payload_check(vport, ndlp->nlp_DID))
|
|
|
continue;
|
|
|
+ if (vport->phba->nvmet_support)
|
|
|
+ continue;
|
|
|
lpfc_disc_state_machine(vport, ndlp, NULL,
|
|
|
NLP_EVT_DEVICE_RECOVERY);
|
|
|
lpfc_cancel_retry_delay_tmo(vport, ndlp);
|