scsi: lpfc: NVME Initiator: Merge into FC discovery
NVME Initiator: Merge into FC discovery Adds NVME PRLI support and Nameserver registrations and Queries for NVME Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com> Signed-off-by: James Smart <james.smart@broadcom.com> Reviewed-by: Hannes Reinecke <hare@suse.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:

committed by
Martin K. Petersen

parent
895427bd01
commit
a0f2d3ef37
@@ -29,7 +29,6 @@
|
||||
#include <scsi/scsi_host.h>
|
||||
#include <scsi/scsi_transport_fc.h>
|
||||
|
||||
|
||||
#include "lpfc_hw4.h"
|
||||
#include "lpfc_hw.h"
|
||||
#include "lpfc_sli.h"
|
||||
@@ -1513,7 +1512,7 @@ static struct lpfc_nodelist *
|
||||
lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp,
|
||||
struct lpfc_nodelist *ndlp)
|
||||
{
|
||||
struct lpfc_vport *vport = ndlp->vport;
|
||||
struct lpfc_vport *vport = ndlp->vport;
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
struct lpfc_nodelist *new_ndlp;
|
||||
struct lpfc_rport_data *rdata;
|
||||
@@ -1868,10 +1867,12 @@ lpfc_cmpl_els_plogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
|
||||
/* PLOGI completes to NPort <nlp_DID> */
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
|
||||
"0102 PLOGI completes to NPort x%x "
|
||||
"0102 PLOGI completes to NPort x%06x "
|
||||
"Data: x%x x%x x%x x%x x%x\n",
|
||||
ndlp->nlp_DID, irsp->ulpStatus, irsp->un.ulpWord[4],
|
||||
irsp->ulpTimeout, disc, vport->num_disc_nodes);
|
||||
ndlp->nlp_DID, ndlp->nlp_fc4_type,
|
||||
irsp->ulpStatus, irsp->un.ulpWord[4],
|
||||
disc, vport->num_disc_nodes);
|
||||
|
||||
/* Check to see if link went down during discovery */
|
||||
if (lpfc_els_chk_latt(vport)) {
|
||||
spin_lock_irq(shost->host_lock);
|
||||
@@ -2000,7 +2001,6 @@ 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->vendorVersion, 0, sizeof(sp->vendorVersion));
|
||||
|
||||
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
|
||||
"Issue PLOGI: did:x%x",
|
||||
@@ -2052,14 +2052,17 @@ lpfc_cmpl_els_prli(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
"PRLI cmpl: status:x%x/x%x did:x%x",
|
||||
irsp->ulpStatus, irsp->un.ulpWord[4],
|
||||
ndlp->nlp_DID);
|
||||
|
||||
/* Ddriver supports multiple FC4 types. Counters matter. */
|
||||
vport->fc_prli_sent--;
|
||||
|
||||
/* PRLI completes to NPort <nlp_DID> */
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
|
||||
"0103 PRLI completes to NPort x%x "
|
||||
"0103 PRLI completes to NPort x%06x "
|
||||
"Data: x%x x%x x%x x%x\n",
|
||||
ndlp->nlp_DID, irsp->ulpStatus, irsp->un.ulpWord[4],
|
||||
irsp->ulpTimeout, vport->num_disc_nodes);
|
||||
vport->num_disc_nodes, ndlp->fc4_prli_sent);
|
||||
|
||||
vport->fc_prli_sent--;
|
||||
/* Check to see if link went down during discovery */
|
||||
if (lpfc_els_chk_latt(vport))
|
||||
goto out;
|
||||
@@ -2068,6 +2071,7 @@ lpfc_cmpl_els_prli(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
/* Check for retry */
|
||||
if (lpfc_els_retry(phba, cmdiocb, rspiocb)) {
|
||||
/* ELS command is being retried */
|
||||
ndlp->fc4_prli_sent--;
|
||||
goto out;
|
||||
}
|
||||
/* PRLI failed */
|
||||
@@ -2082,9 +2086,14 @@ lpfc_cmpl_els_prli(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
lpfc_disc_state_machine(vport, ndlp, cmdiocb,
|
||||
NLP_EVT_CMPL_PRLI);
|
||||
} else
|
||||
/* Good status, call state machine */
|
||||
/* Good status, call state machine. However, if another
|
||||
* PRLI is outstanding, don't call the state machine
|
||||
* because final disposition to Mapped or Unmapped is
|
||||
* completed there.
|
||||
*/
|
||||
lpfc_disc_state_machine(vport, ndlp, cmdiocb,
|
||||
NLP_EVT_CMPL_PRLI);
|
||||
|
||||
out:
|
||||
lpfc_els_free_iocb(phba, cmdiocb);
|
||||
return;
|
||||
@@ -2118,42 +2127,94 @@ lpfc_issue_els_prli(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
struct lpfc_hba *phba = vport->phba;
|
||||
PRLI *npr;
|
||||
struct lpfc_nvme_prli *npr_nvme;
|
||||
struct lpfc_iocbq *elsiocb;
|
||||
uint8_t *pcmd;
|
||||
uint16_t cmdsize;
|
||||
u32 local_nlp_type, elscmd;
|
||||
|
||||
cmdsize = (sizeof(uint32_t) + sizeof(PRLI));
|
||||
local_nlp_type = ndlp->nlp_fc4_type;
|
||||
|
||||
send_next_prli:
|
||||
if (local_nlp_type & NLP_FC4_FCP) {
|
||||
/* Payload is 4 + 16 = 20 x14 bytes. */
|
||||
cmdsize = (sizeof(uint32_t) + sizeof(PRLI));
|
||||
elscmd = ELS_CMD_PRLI;
|
||||
} else if (local_nlp_type & NLP_FC4_NVME) {
|
||||
/* Payload is 4 + 20 = 24 x18 bytes. */
|
||||
cmdsize = (sizeof(uint32_t) + sizeof(struct lpfc_nvme_prli));
|
||||
elscmd = ELS_CMD_NVMEPRLI;
|
||||
} else {
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"3083 Unknown FC_TYPE x%x ndlp x%06x\n",
|
||||
ndlp->nlp_fc4_type, ndlp->nlp_DID);
|
||||
return 1;
|
||||
}
|
||||
elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp,
|
||||
ndlp->nlp_DID, ELS_CMD_PRLI);
|
||||
ndlp->nlp_DID, elscmd);
|
||||
if (!elsiocb)
|
||||
return 1;
|
||||
|
||||
pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
|
||||
|
||||
/* For PRLI request, remainder of payload is service parameters */
|
||||
memset(pcmd, 0, (sizeof(PRLI) + sizeof(uint32_t)));
|
||||
*((uint32_t *) (pcmd)) = ELS_CMD_PRLI;
|
||||
pcmd += sizeof(uint32_t);
|
||||
memset(pcmd, 0, cmdsize);
|
||||
|
||||
/* For PRLI, remainder of payload is PRLI parameter page */
|
||||
npr = (PRLI *) pcmd;
|
||||
/*
|
||||
* If our firmware version is 3.20 or later,
|
||||
* set the following bits for FC-TAPE support.
|
||||
*/
|
||||
if (phba->vpd.rev.feaLevelHigh >= 0x02) {
|
||||
npr->ConfmComplAllowed = 1;
|
||||
npr->Retry = 1;
|
||||
npr->TaskRetryIdReq = 1;
|
||||
if (local_nlp_type & NLP_FC4_FCP) {
|
||||
/* Remainder of payload is FCP PRLI parameter page.
|
||||
* Note: this data structure is defined as
|
||||
* BE/LE in the structure definition so no
|
||||
* byte swap call is made.
|
||||
*/
|
||||
*((uint32_t *)(pcmd)) = ELS_CMD_PRLI;
|
||||
pcmd += sizeof(uint32_t);
|
||||
npr = (PRLI *)pcmd;
|
||||
|
||||
/*
|
||||
* If our firmware version is 3.20 or later,
|
||||
* set the following bits for FC-TAPE support.
|
||||
*/
|
||||
if (phba->vpd.rev.feaLevelHigh >= 0x02) {
|
||||
npr->ConfmComplAllowed = 1;
|
||||
npr->Retry = 1;
|
||||
npr->TaskRetryIdReq = 1;
|
||||
}
|
||||
npr->estabImagePair = 1;
|
||||
npr->readXferRdyDis = 1;
|
||||
if (vport->cfg_first_burst_size)
|
||||
npr->writeXferRdyDis = 1;
|
||||
|
||||
/* For FCP support */
|
||||
npr->prliType = PRLI_FCP_TYPE;
|
||||
npr->initiatorFunc = 1;
|
||||
elsiocb->iocb_flag |= LPFC_PRLI_FCP_REQ;
|
||||
|
||||
/* Remove FCP type - processed. */
|
||||
local_nlp_type &= ~NLP_FC4_FCP;
|
||||
} else if (local_nlp_type & NLP_FC4_NVME) {
|
||||
/* Remainder of payload is NVME PRLI parameter page.
|
||||
* This data structure is the newer definition that
|
||||
* uses bf macros so a byte swap is required.
|
||||
*/
|
||||
*((uint32_t *)(pcmd)) = ELS_CMD_NVMEPRLI;
|
||||
pcmd += sizeof(uint32_t);
|
||||
npr_nvme = (struct lpfc_nvme_prli *)pcmd;
|
||||
bf_set(prli_type_code, npr_nvme, PRLI_NVME_TYPE);
|
||||
bf_set(prli_estabImagePair, npr_nvme, 0); /* Should be 0 */
|
||||
|
||||
/* Only initiators request first burst. */
|
||||
if ((phba->cfg_nvme_enable_fb) &&
|
||||
!phba->nvmet_support)
|
||||
bf_set(prli_fba, npr_nvme, 1);
|
||||
|
||||
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;
|
||||
|
||||
/* Remove NVME type - processed. */
|
||||
local_nlp_type &= ~NLP_FC4_NVME;
|
||||
}
|
||||
npr->estabImagePair = 1;
|
||||
npr->readXferRdyDis = 1;
|
||||
if (vport->cfg_first_burst_size)
|
||||
npr->writeXferRdyDis = 1;
|
||||
|
||||
/* For FCP support */
|
||||
npr->prliType = PRLI_FCP_TYPE;
|
||||
npr->initiatorFunc = 1;
|
||||
|
||||
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
|
||||
"Issue PRLI: did:x%x",
|
||||
@@ -2172,7 +2233,20 @@ lpfc_issue_els_prli(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
lpfc_els_free_iocb(phba, elsiocb);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* The vport counters are used for lpfc_scan_finished, but
|
||||
* the ndlp is used to track outstanding PRLIs for different
|
||||
* FC4 types.
|
||||
*/
|
||||
vport->fc_prli_sent++;
|
||||
ndlp->fc4_prli_sent++;
|
||||
|
||||
/* The driver supports 2 FC4 types. Make sure
|
||||
* a PRLI is issued for all types before exiting.
|
||||
*/
|
||||
if (local_nlp_type & (NLP_FC4_FCP | NLP_FC4_NVME))
|
||||
goto send_next_prli;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2543,6 +2617,9 @@ out:
|
||||
if ((vport->fc_flag & FC_PT2PT) &&
|
||||
!(vport->fc_flag & FC_PT2PT_PLOGI)) {
|
||||
phba->pport->fc_myDID = 0;
|
||||
|
||||
/* todo: init: revise localport nvme attributes */
|
||||
|
||||
mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
|
||||
if (mbox) {
|
||||
lpfc_config_link(phba, mbox);
|
||||
@@ -3055,6 +3132,7 @@ lpfc_els_retry_delay_handler(struct lpfc_nodelist *ndlp)
|
||||
}
|
||||
break;
|
||||
case ELS_CMD_PRLI:
|
||||
case ELS_CMD_NVMEPRLI:
|
||||
if (!lpfc_issue_els_prli(vport, ndlp, retry)) {
|
||||
ndlp->nlp_prev_state = ndlp->nlp_state;
|
||||
lpfc_nlp_set_state(vport, ndlp, NLP_STE_PRLI_ISSUE);
|
||||
@@ -3245,7 +3323,8 @@ lpfc_els_retry(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
break;
|
||||
}
|
||||
if ((cmd == ELS_CMD_PLOGI) ||
|
||||
(cmd == ELS_CMD_PRLI)) {
|
||||
(cmd == ELS_CMD_PRLI) ||
|
||||
(cmd == ELS_CMD_NVMEPRLI)) {
|
||||
delay = 1000;
|
||||
maxretry = lpfc_max_els_tries + 1;
|
||||
retry = 1;
|
||||
@@ -3265,7 +3344,8 @@ lpfc_els_retry(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
|
||||
case LSRJT_LOGICAL_BSY:
|
||||
if ((cmd == ELS_CMD_PLOGI) ||
|
||||
(cmd == ELS_CMD_PRLI)) {
|
||||
(cmd == ELS_CMD_PRLI) ||
|
||||
(cmd == ELS_CMD_NVMEPRLI)) {
|
||||
delay = 1000;
|
||||
maxretry = 48;
|
||||
} else if (cmd == ELS_CMD_FDISC) {
|
||||
@@ -3399,7 +3479,8 @@ out_retry:
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
|
||||
ndlp->nlp_prev_state = ndlp->nlp_state;
|
||||
if (cmd == ELS_CMD_PRLI)
|
||||
if ((cmd == ELS_CMD_PRLI) ||
|
||||
(cmd == ELS_CMD_NVMEPRLI))
|
||||
lpfc_nlp_set_state(vport, ndlp,
|
||||
NLP_STE_PRLI_ISSUE);
|
||||
else
|
||||
@@ -3430,6 +3511,7 @@ out_retry:
|
||||
lpfc_issue_els_adisc(vport, ndlp, cmdiocb->retry);
|
||||
return 1;
|
||||
case ELS_CMD_PRLI:
|
||||
case ELS_CMD_NVMEPRLI:
|
||||
ndlp->nlp_prev_state = ndlp->nlp_state;
|
||||
lpfc_nlp_set_state(vport, ndlp, NLP_STE_PRLI_ISSUE);
|
||||
lpfc_issue_els_prli(vport, ndlp, cmdiocb->retry);
|
||||
@@ -3990,14 +4072,10 @@ 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->vendorVersion, 0, sizeof(sp->vendorVersion));
|
||||
}
|
||||
|
||||
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);
|
||||
@@ -4231,17 +4309,43 @@ lpfc_els_rsp_prli_acc(struct lpfc_vport *vport, struct lpfc_iocbq *oldiocb,
|
||||
{
|
||||
struct lpfc_hba *phba = vport->phba;
|
||||
PRLI *npr;
|
||||
struct lpfc_nvme_prli *npr_nvme;
|
||||
lpfc_vpd_t *vpd;
|
||||
IOCB_t *icmd;
|
||||
IOCB_t *oldcmd;
|
||||
struct lpfc_iocbq *elsiocb;
|
||||
uint8_t *pcmd;
|
||||
uint16_t cmdsize;
|
||||
uint32_t prli_fc4_req, *req_payload;
|
||||
struct lpfc_dmabuf *req_buf;
|
||||
int rc;
|
||||
u32 elsrspcmd;
|
||||
|
||||
/* Need the incoming PRLI payload to determine if the ACC is for an
|
||||
* FC4 or NVME PRLI type. The PRLI type is at word 1.
|
||||
*/
|
||||
req_buf = (struct lpfc_dmabuf *)oldiocb->context2;
|
||||
req_payload = (((uint32_t *)req_buf->virt) + 1);
|
||||
|
||||
/* PRLI type payload is at byte 3 for FCP or NVME. */
|
||||
prli_fc4_req = be32_to_cpu(*req_payload);
|
||||
prli_fc4_req = (prli_fc4_req >> 24) & 0xff;
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
|
||||
"6127 PRLI_ACC: Req Type x%x, Word1 x%08x\n",
|
||||
prli_fc4_req, *((uint32_t *)req_payload));
|
||||
|
||||
if (prli_fc4_req == PRLI_FCP_TYPE) {
|
||||
cmdsize = sizeof(uint32_t) + sizeof(PRLI);
|
||||
elsrspcmd = (ELS_CMD_ACC | (ELS_CMD_PRLI & ~ELS_RSP_MASK));
|
||||
} else if (prli_fc4_req & PRLI_NVME_TYPE) {
|
||||
cmdsize = sizeof(uint32_t) + sizeof(struct lpfc_nvme_prli);
|
||||
elsrspcmd = (ELS_CMD_ACC | (ELS_CMD_NVMEPRLI & ~ELS_RSP_MASK));
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
|
||||
cmdsize = sizeof(uint32_t) + sizeof(PRLI);
|
||||
elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp,
|
||||
ndlp->nlp_DID, (ELS_CMD_ACC | (ELS_CMD_PRLI & ~ELS_RSP_MASK)));
|
||||
ndlp->nlp_DID, elsrspcmd);
|
||||
if (!elsiocb)
|
||||
return 1;
|
||||
|
||||
@@ -4258,33 +4362,56 @@ lpfc_els_rsp_prli_acc(struct lpfc_vport *vport, struct lpfc_iocbq *oldiocb,
|
||||
ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
|
||||
ndlp->nlp_rpi);
|
||||
pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
|
||||
memset(pcmd, 0, cmdsize);
|
||||
|
||||
*((uint32_t *) (pcmd)) = (ELS_CMD_ACC | (ELS_CMD_PRLI & ~ELS_RSP_MASK));
|
||||
pcmd += sizeof(uint32_t);
|
||||
|
||||
/* For PRLI, remainder of payload is PRLI parameter page */
|
||||
memset(pcmd, 0, sizeof(PRLI));
|
||||
|
||||
npr = (PRLI *) pcmd;
|
||||
vpd = &phba->vpd;
|
||||
/*
|
||||
* If the remote port is a target and our firmware version is 3.20 or
|
||||
* later, set the following bits for FC-TAPE support.
|
||||
*/
|
||||
if ((ndlp->nlp_type & NLP_FCP_TARGET) &&
|
||||
(vpd->rev.feaLevelHigh >= 0x02)) {
|
||||
|
||||
if (prli_fc4_req == PRLI_FCP_TYPE) {
|
||||
/*
|
||||
* If the remote port is a target and our firmware version
|
||||
* is 3.20 or later, set the following bits for FC-TAPE
|
||||
* support.
|
||||
*/
|
||||
npr = (PRLI *) pcmd;
|
||||
if ((ndlp->nlp_type & NLP_FCP_TARGET) &&
|
||||
(vpd->rev.feaLevelHigh >= 0x02)) {
|
||||
npr->ConfmComplAllowed = 1;
|
||||
npr->Retry = 1;
|
||||
npr->TaskRetryIdReq = 1;
|
||||
}
|
||||
npr->acceptRspCode = PRLI_REQ_EXECUTED;
|
||||
npr->estabImagePair = 1;
|
||||
npr->readXferRdyDis = 1;
|
||||
npr->ConfmComplAllowed = 1;
|
||||
npr->Retry = 1;
|
||||
npr->TaskRetryIdReq = 1;
|
||||
}
|
||||
npr->prliType = PRLI_FCP_TYPE;
|
||||
npr->initiatorFunc = 1;
|
||||
} else if (prli_fc4_req & PRLI_NVME_TYPE) {
|
||||
/* Respond with an NVME PRLI Type */
|
||||
npr_nvme = (struct lpfc_nvme_prli *) pcmd;
|
||||
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);
|
||||
|
||||
npr->acceptRspCode = PRLI_REQ_EXECUTED;
|
||||
npr->estabImagePair = 1;
|
||||
npr->readXferRdyDis = 1;
|
||||
npr->ConfmComplAllowed = 1;
|
||||
|
||||
npr->prliType = PRLI_FCP_TYPE;
|
||||
npr->initiatorFunc = 1;
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_NVME_DISC,
|
||||
"6015 NVME issue PRLI ACC word1 x%08x "
|
||||
"word4 x%08x word5 x%08x flag x%x, "
|
||||
"fcp_info x%x nlp_type x%x\n",
|
||||
npr_nvme->word1, npr_nvme->word4,
|
||||
npr_nvme->word5, ndlp->nlp_flag,
|
||||
ndlp->nlp_fcp_info, ndlp->nlp_type);
|
||||
npr_nvme->word1 = cpu_to_be32(npr_nvme->word1);
|
||||
npr_nvme->word4 = cpu_to_be32(npr_nvme->word4);
|
||||
npr_nvme->word5 = cpu_to_be32(npr_nvme->word5);
|
||||
} else
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"6128 Unknown FC_TYPE x%x x%x ndlp x%06x\n",
|
||||
prli_fc4_req, ndlp->nlp_fc4_type,
|
||||
ndlp->nlp_DID);
|
||||
|
||||
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
|
||||
"Issue ACC PRLI: did:x%x flg:x%x",
|
||||
@@ -4411,7 +4538,7 @@ lpfc_els_rsp_rnid_acc(struct lpfc_vport *vport, uint8_t format,
|
||||
**/
|
||||
static void
|
||||
lpfc_els_clear_rrq(struct lpfc_vport *vport,
|
||||
struct lpfc_iocbq *iocb, struct lpfc_nodelist *ndlp)
|
||||
struct lpfc_iocbq *iocb, struct lpfc_nodelist *ndlp)
|
||||
{
|
||||
struct lpfc_hba *phba = vport->phba;
|
||||
uint8_t *pcmd;
|
||||
@@ -4909,7 +5036,7 @@ lpfc_rdp_res_opd_desc(struct fc_rdp_opd_sfp_desc *desc,
|
||||
memcpy(desc->opd_info.vendor_name, &page_a0[SSF_VENDOR_NAME], 16);
|
||||
memcpy(desc->opd_info.model_number, &page_a0[SSF_VENDOR_PN], 16);
|
||||
memcpy(desc->opd_info.serial_number, &page_a0[SSF_VENDOR_SN], 16);
|
||||
memcpy(desc->opd_info.revision, &page_a0[SSF_VENDOR_REV], 2);
|
||||
memcpy(desc->opd_info.revision, &page_a0[SSF_VENDOR_REV], 4);
|
||||
memcpy(desc->opd_info.date, &page_a0[SSF_DATE_CODE], 8);
|
||||
desc->length = cpu_to_be32(sizeof(desc->opd_info));
|
||||
return sizeof(struct fc_rdp_opd_sfp_desc);
|
||||
@@ -5004,7 +5131,7 @@ lpfc_rdp_res_diag_port_names(struct fc_rdp_port_name_desc *desc,
|
||||
memcpy(desc->port_names.wwnn, phba->wwnn,
|
||||
sizeof(desc->port_names.wwnn));
|
||||
|
||||
memcpy(desc->port_names.wwpn, &phba->wwpn,
|
||||
memcpy(desc->port_names.wwpn, phba->wwpn,
|
||||
sizeof(desc->port_names.wwpn));
|
||||
|
||||
desc->length = cpu_to_be32(sizeof(desc->port_names));
|
||||
@@ -5233,9 +5360,8 @@ lpfc_els_rcv_rdp(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
|
||||
struct ls_rjt stat;
|
||||
|
||||
if (phba->sli_rev < LPFC_SLI_REV4 ||
|
||||
(bf_get(lpfc_sli_intf_if_type,
|
||||
&phba->sli4_hba.sli_intf) !=
|
||||
LPFC_SLI_INTF_IF_TYPE_2)) {
|
||||
bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) !=
|
||||
LPFC_SLI_INTF_IF_TYPE_2) {
|
||||
rjt_err = LSRJT_UNABLE_TPC;
|
||||
rjt_expl = LSEXP_REQ_UNSUPPORTED;
|
||||
goto error;
|
||||
@@ -5976,9 +6102,11 @@ lpfc_els_handle_rscn(struct lpfc_vport *vport)
|
||||
if (ndlp && NLP_CHK_NODE_ACT(ndlp)
|
||||
&& ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) {
|
||||
/* Good ndlp, issue CT Request to NameServer */
|
||||
if (lpfc_ns_cmd(vport, SLI_CTNS_GID_FT, 0, 0) == 0)
|
||||
vport->gidft_inp = 0;
|
||||
if (lpfc_issue_gidft(vport) == 0)
|
||||
/* Wait for NameServer query cmpl before we can
|
||||
continue */
|
||||
* continue
|
||||
*/
|
||||
return 1;
|
||||
} else {
|
||||
/* If login to NameServer does not exist, issue one */
|
||||
@@ -6082,7 +6210,6 @@ lpfc_els_rcv_flogi(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
|
||||
|
||||
(void) lpfc_check_sparm(vport, ndlp, sp, CLASS3, 1);
|
||||
|
||||
|
||||
/*
|
||||
* If our portname is greater than the remote portname,
|
||||
* then we initiate Nport login.
|
||||
@@ -7779,6 +7906,7 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
|
||||
lpfc_els_rcv_fan(vport, elsiocb, ndlp);
|
||||
break;
|
||||
case ELS_CMD_PRLI:
|
||||
case ELS_CMD_NVMEPRLI:
|
||||
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
|
||||
"RCV PRLI: did:x%x/ste:x%x flg:x%x",
|
||||
did, vport->port_state, ndlp->nlp_flag);
|
||||
@@ -8883,8 +9011,7 @@ lpfc_cmpl_fabric_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
break;
|
||||
}
|
||||
|
||||
if (atomic_read(&phba->fabric_iocb_count) == 0)
|
||||
BUG();
|
||||
BUG_ON(atomic_read(&phba->fabric_iocb_count) == 0);
|
||||
|
||||
cmdiocb->iocb_cmpl = cmdiocb->fabric_iocb_cmpl;
|
||||
cmdiocb->fabric_iocb_cmpl = NULL;
|
||||
@@ -8929,8 +9056,7 @@ lpfc_issue_fabric_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *iocb)
|
||||
int ready;
|
||||
int ret;
|
||||
|
||||
if (atomic_read(&phba->fabric_iocb_count) > 1)
|
||||
BUG();
|
||||
BUG_ON(atomic_read(&phba->fabric_iocb_count) > 1);
|
||||
|
||||
spin_lock_irqsave(&phba->hbalock, iflags);
|
||||
ready = atomic_read(&phba->fabric_iocb_count) == 0 &&
|
||||
|
Reference in New Issue
Block a user