scsi: lpfc: Change lpfc_vport fc_flag member into a bitmask
In attempt to reduce the amount of unnecessary shost_lock acquisitions in the lpfc driver, change fc_flag into an unsigned long bitmask and use clear_bit/test_bit bitwise atomic APIs instead of reliance on shost_lock for synchronization. Signed-off-by: Justin Tee <justin.tee@broadcom.com> Link: https://lore.kernel.org/r/20240131185112.149731-15-justintee8345@gmail.com Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
9bb36777d0
commit
a645b8c1f5
@ -535,6 +535,36 @@ struct lpfc_cgn_acqe_stat {
|
||||
atomic64_t warn;
|
||||
};
|
||||
|
||||
enum lpfc_fc_flag {
|
||||
/* Several of these flags are HBA centric and should be moved to
|
||||
* phba->link_flag (e.g. FC_PTP, FC_PUBLIC_LOOP)
|
||||
*/
|
||||
FC_PT2PT, /* pt2pt with no fabric */
|
||||
FC_PT2PT_PLOGI, /* pt2pt initiate PLOGI */
|
||||
FC_DISC_TMO, /* Discovery timer running */
|
||||
FC_PUBLIC_LOOP, /* Public loop */
|
||||
FC_LBIT, /* LOGIN bit in loopinit set */
|
||||
FC_RSCN_MODE, /* RSCN cmd rcv'ed */
|
||||
FC_NLP_MORE, /* More node to process in node tbl */
|
||||
FC_OFFLINE_MODE, /* Interface is offline for diag */
|
||||
FC_FABRIC, /* We are fabric attached */
|
||||
FC_VPORT_LOGO_RCVD, /* LOGO received on vport */
|
||||
FC_RSCN_DISCOVERY, /* Auth all devices after RSCN */
|
||||
FC_LOGO_RCVD_DID_CHNG, /* FDISC on phys port detect DID chng */
|
||||
FC_PT2PT_NO_NVME, /* Don't send NVME PRLI */
|
||||
FC_SCSI_SCAN_TMO, /* scsi scan timer running */
|
||||
FC_ABORT_DISCOVERY, /* we want to abort discovery */
|
||||
FC_NDISC_ACTIVE, /* NPort discovery active */
|
||||
FC_BYPASSED_MODE, /* NPort is in bypassed mode */
|
||||
FC_VPORT_NEEDS_REG_VPI, /* Needs to have its vpi registered */
|
||||
FC_RSCN_DEFERRED, /* A deferred RSCN being processed */
|
||||
FC_VPORT_NEEDS_INIT_VPI, /* Need to INIT_VPI before FDISC */
|
||||
FC_VPORT_CVL_RCVD, /* VLink failed due to CVL */
|
||||
FC_VFI_REGISTERED, /* VFI is registered */
|
||||
FC_FDISC_COMPLETED, /* FDISC completed */
|
||||
FC_DISC_DELAYED, /* Delay NPort discovery */
|
||||
};
|
||||
|
||||
struct lpfc_vport {
|
||||
struct lpfc_hba *phba;
|
||||
struct list_head listentry;
|
||||
@ -549,34 +579,7 @@ struct lpfc_vport {
|
||||
uint8_t vpi_state;
|
||||
#define LPFC_VPI_REGISTERED 0x1
|
||||
|
||||
uint32_t fc_flag; /* FC flags */
|
||||
/* Several of these flags are HBA centric and should be moved to
|
||||
* phba->link_flag (e.g. FC_PTP, FC_PUBLIC_LOOP)
|
||||
*/
|
||||
#define FC_PT2PT 0x1 /* pt2pt with no fabric */
|
||||
#define FC_PT2PT_PLOGI 0x2 /* pt2pt initiate PLOGI */
|
||||
#define FC_DISC_TMO 0x4 /* Discovery timer running */
|
||||
#define FC_PUBLIC_LOOP 0x8 /* Public loop */
|
||||
#define FC_LBIT 0x10 /* LOGIN bit in loopinit set */
|
||||
#define FC_RSCN_MODE 0x20 /* RSCN cmd rcv'ed */
|
||||
#define FC_NLP_MORE 0x40 /* More node to process in node tbl */
|
||||
#define FC_OFFLINE_MODE 0x80 /* Interface is offline for diag */
|
||||
#define FC_FABRIC 0x100 /* We are fabric attached */
|
||||
#define FC_VPORT_LOGO_RCVD 0x200 /* LOGO received on vport */
|
||||
#define FC_RSCN_DISCOVERY 0x400 /* Auth all devices after RSCN */
|
||||
#define FC_LOGO_RCVD_DID_CHNG 0x800 /* FDISC on phys port detect DID chng*/
|
||||
#define FC_PT2PT_NO_NVME 0x1000 /* Don't send NVME PRLI */
|
||||
#define FC_SCSI_SCAN_TMO 0x4000 /* scsi scan timer running */
|
||||
#define FC_ABORT_DISCOVERY 0x8000 /* we want to abort discovery */
|
||||
#define FC_NDISC_ACTIVE 0x10000 /* NPort discovery active */
|
||||
#define FC_BYPASSED_MODE 0x20000 /* NPort is in bypassed mode */
|
||||
#define FC_VPORT_NEEDS_REG_VPI 0x80000 /* Needs to have its vpi registered */
|
||||
#define FC_RSCN_DEFERRED 0x100000 /* A deferred RSCN being processed */
|
||||
#define FC_VPORT_NEEDS_INIT_VPI 0x200000 /* Need to INIT_VPI before FDISC */
|
||||
#define FC_VPORT_CVL_RCVD 0x400000 /* VLink failed due to CVL */
|
||||
#define FC_VFI_REGISTERED 0x800000 /* VFI is registered */
|
||||
#define FC_FDISC_COMPLETED 0x1000000/* FDISC completed */
|
||||
#define FC_DISC_DELAYED 0x2000000/* Delay NPort discovery */
|
||||
unsigned long fc_flag; /* FC flags */
|
||||
|
||||
uint32_t ct_flags;
|
||||
#define FC_CT_RFF_ID 0x1 /* RFF_ID accepted by switch */
|
||||
|
@ -1092,14 +1092,14 @@ lpfc_link_state_show(struct device *dev, struct device_attribute *attr,
|
||||
break;
|
||||
}
|
||||
if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) {
|
||||
if (vport->fc_flag & FC_PUBLIC_LOOP)
|
||||
if (test_bit(FC_PUBLIC_LOOP, &vport->fc_flag))
|
||||
len += scnprintf(buf + len, PAGE_SIZE-len,
|
||||
" Public Loop\n");
|
||||
else
|
||||
len += scnprintf(buf + len, PAGE_SIZE-len,
|
||||
" Private Loop\n");
|
||||
} else {
|
||||
if (vport->fc_flag & FC_FABRIC) {
|
||||
if (test_bit(FC_FABRIC, &vport->fc_flag)) {
|
||||
if (phba->sli_rev == LPFC_SLI_REV4 &&
|
||||
vport->port_type == LPFC_PHYSICAL_PORT &&
|
||||
phba->sli4_hba.fawwpn_flag &
|
||||
@ -1291,7 +1291,7 @@ lpfc_issue_lip(struct Scsi_Host *shost)
|
||||
* If the link is offline, disabled or BLOCK_MGMT_IO
|
||||
* it doesn't make any sense to allow issue_lip
|
||||
*/
|
||||
if ((vport->fc_flag & FC_OFFLINE_MODE) ||
|
||||
if (test_bit(FC_OFFLINE_MODE, &vport->fc_flag) ||
|
||||
(phba->hba_flag & LINK_DISABLED) ||
|
||||
(phba->sli.sli_flag & LPFC_BLOCK_MGMT_IO))
|
||||
return -EPERM;
|
||||
@ -1305,8 +1305,8 @@ lpfc_issue_lip(struct Scsi_Host *shost)
|
||||
pmboxq->u.mb.mbxCommand = MBX_DOWN_LINK;
|
||||
pmboxq->u.mb.mbxOwner = OWN_HOST;
|
||||
|
||||
if ((vport->fc_flag & FC_PT2PT) && (vport->fc_flag & FC_PT2PT_NO_NVME))
|
||||
vport->fc_flag &= ~FC_PT2PT_NO_NVME;
|
||||
if (test_bit(FC_PT2PT, &vport->fc_flag))
|
||||
clear_bit(FC_PT2PT_NO_NVME, &vport->fc_flag);
|
||||
|
||||
mbxstatus = lpfc_sli_issue_mbox_wait(phba, pmboxq, LPFC_MBOX_TMO * 2);
|
||||
|
||||
@ -1496,7 +1496,8 @@ lpfc_reset_pci_bus(struct lpfc_hba *phba)
|
||||
if (shost) {
|
||||
phba_other =
|
||||
((struct lpfc_vport *)shost->hostdata)->phba;
|
||||
if (!(phba_other->pport->fc_flag & FC_OFFLINE_MODE)) {
|
||||
if (!test_bit(FC_OFFLINE_MODE,
|
||||
&phba_other->pport->fc_flag)) {
|
||||
lpfc_printf_log(phba_other, KERN_INFO, LOG_INIT,
|
||||
"8349 WWPN = 0x%02x%02x%02x%02x"
|
||||
"%02x%02x%02x%02x is not "
|
||||
@ -1551,7 +1552,7 @@ lpfc_selective_reset(struct lpfc_hba *phba)
|
||||
if (!phba->cfg_enable_hba_reset)
|
||||
return -EACCES;
|
||||
|
||||
if (!(phba->pport->fc_flag & FC_OFFLINE_MODE)) {
|
||||
if (!test_bit(FC_OFFLINE_MODE, &phba->pport->fc_flag)) {
|
||||
status = lpfc_do_offline(phba, LPFC_EVT_OFFLINE);
|
||||
|
||||
if (status != 0)
|
||||
@ -1690,7 +1691,7 @@ lpfc_sli4_pdev_reg_request(struct lpfc_hba *phba, uint32_t opcode)
|
||||
{
|
||||
struct completion online_compl;
|
||||
struct pci_dev *pdev = phba->pcidev;
|
||||
uint32_t before_fc_flag;
|
||||
unsigned long before_fc_flag;
|
||||
uint32_t sriov_nr_virtfn;
|
||||
uint32_t reg_val;
|
||||
int status = 0, rc = 0;
|
||||
@ -1761,7 +1762,7 @@ lpfc_sli4_pdev_reg_request(struct lpfc_hba *phba, uint32_t opcode)
|
||||
}
|
||||
|
||||
/* keep the original port state */
|
||||
if (before_fc_flag & FC_OFFLINE_MODE) {
|
||||
if (test_bit(FC_OFFLINE_MODE, &before_fc_flag)) {
|
||||
if (phba->fw_dump_cmpl)
|
||||
phba->fw_dump_cmpl = NULL;
|
||||
goto out;
|
||||
@ -2099,7 +2100,7 @@ board_mode_out:
|
||||
*board_mode_str = '\0';
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
|
||||
"3097 Failed \"%s\", status(%d), "
|
||||
"fc_flag(x%x)\n",
|
||||
"fc_flag(x%lx)\n",
|
||||
buf, status, phba->pport->fc_flag);
|
||||
return status;
|
||||
}
|
||||
@ -2158,7 +2159,7 @@ lpfc_get_hba_info(struct lpfc_hba *phba,
|
||||
pmb->mbxOwner = OWN_HOST;
|
||||
pmboxq->ctx_buf = NULL;
|
||||
|
||||
if (phba->pport->fc_flag & FC_OFFLINE_MODE)
|
||||
if (test_bit(FC_OFFLINE_MODE, &phba->pport->fc_flag))
|
||||
rc = MBX_NOT_FINISHED;
|
||||
else
|
||||
rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2);
|
||||
@ -6200,7 +6201,7 @@ sysfs_ctlreg_write(struct file *filp, struct kobject *kobj,
|
||||
if (memcmp(buf, LPFC_REG_WRITE_KEY, LPFC_REG_WRITE_KEY_SIZE))
|
||||
return -EINVAL;
|
||||
|
||||
if (!(vport->fc_flag & FC_OFFLINE_MODE))
|
||||
if (!test_bit(FC_OFFLINE_MODE, &vport->fc_flag))
|
||||
return -EPERM;
|
||||
|
||||
spin_lock_irq(&phba->hbalock);
|
||||
@ -6433,12 +6434,12 @@ lpfc_get_host_port_type(struct Scsi_Host *shost)
|
||||
fc_host_port_type(shost) = FC_PORTTYPE_NPIV;
|
||||
} else if (lpfc_is_link_up(phba)) {
|
||||
if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) {
|
||||
if (vport->fc_flag & FC_PUBLIC_LOOP)
|
||||
if (test_bit(FC_PUBLIC_LOOP, &vport->fc_flag))
|
||||
fc_host_port_type(shost) = FC_PORTTYPE_NLPORT;
|
||||
else
|
||||
fc_host_port_type(shost) = FC_PORTTYPE_LPORT;
|
||||
} else {
|
||||
if (vport->fc_flag & FC_FABRIC)
|
||||
if (test_bit(FC_FABRIC, &vport->fc_flag))
|
||||
fc_host_port_type(shost) = FC_PORTTYPE_NPORT;
|
||||
else
|
||||
fc_host_port_type(shost) = FC_PORTTYPE_PTP;
|
||||
@ -6457,7 +6458,7 @@ lpfc_get_host_port_state(struct Scsi_Host *shost)
|
||||
struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
|
||||
struct lpfc_hba *phba = vport->phba;
|
||||
|
||||
if (vport->fc_flag & FC_OFFLINE_MODE)
|
||||
if (test_bit(FC_OFFLINE_MODE, &vport->fc_flag))
|
||||
fc_host_port_state(shost) = FC_PORTSTATE_OFFLINE;
|
||||
else {
|
||||
switch (phba->link_state) {
|
||||
@ -6571,10 +6572,10 @@ lpfc_get_host_fabric_name (struct Scsi_Host *shost)
|
||||
struct lpfc_hba *phba = vport->phba;
|
||||
u64 node_name;
|
||||
|
||||
if ((vport->port_state > LPFC_FLOGI) &&
|
||||
((vport->fc_flag & FC_FABRIC) ||
|
||||
((phba->fc_topology == LPFC_TOPOLOGY_LOOP) &&
|
||||
(vport->fc_flag & FC_PUBLIC_LOOP))))
|
||||
if (vport->port_state > LPFC_FLOGI &&
|
||||
(test_bit(FC_FABRIC, &vport->fc_flag) ||
|
||||
(phba->fc_topology == LPFC_TOPOLOGY_LOOP &&
|
||||
test_bit(FC_PUBLIC_LOOP, &vport->fc_flag))))
|
||||
node_name = wwn_to_u64(phba->fc_fabparam.nodeName.u.wwn);
|
||||
else
|
||||
/* fabric is local port if there is no F/FL_Port */
|
||||
@ -6630,7 +6631,7 @@ lpfc_get_stats(struct Scsi_Host *shost)
|
||||
pmboxq->ctx_buf = NULL;
|
||||
pmboxq->vport = vport;
|
||||
|
||||
if (vport->fc_flag & FC_OFFLINE_MODE) {
|
||||
if (test_bit(FC_OFFLINE_MODE, &vport->fc_flag)) {
|
||||
rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL);
|
||||
if (rc != MBX_SUCCESS) {
|
||||
mempool_free(pmboxq, phba->mbox_mem_pool);
|
||||
@ -6683,7 +6684,7 @@ lpfc_get_stats(struct Scsi_Host *shost)
|
||||
pmboxq->ctx_buf = NULL;
|
||||
pmboxq->vport = vport;
|
||||
|
||||
if (vport->fc_flag & FC_OFFLINE_MODE) {
|
||||
if (test_bit(FC_OFFLINE_MODE, &vport->fc_flag)) {
|
||||
rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL);
|
||||
if (rc != MBX_SUCCESS) {
|
||||
mempool_free(pmboxq, phba->mbox_mem_pool);
|
||||
@ -6770,8 +6771,8 @@ lpfc_reset_stats(struct Scsi_Host *shost)
|
||||
pmboxq->ctx_buf = NULL;
|
||||
pmboxq->vport = vport;
|
||||
|
||||
if ((vport->fc_flag & FC_OFFLINE_MODE) ||
|
||||
(!(psli->sli_flag & LPFC_SLI_ACTIVE))) {
|
||||
if (test_bit(FC_OFFLINE_MODE, &vport->fc_flag) ||
|
||||
!(psli->sli_flag & LPFC_SLI_ACTIVE)) {
|
||||
rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL);
|
||||
if (rc != MBX_SUCCESS) {
|
||||
mempool_free(pmboxq, phba->mbox_mem_pool);
|
||||
@ -6792,8 +6793,8 @@ lpfc_reset_stats(struct Scsi_Host *shost)
|
||||
pmboxq->ctx_buf = NULL;
|
||||
pmboxq->vport = vport;
|
||||
|
||||
if ((vport->fc_flag & FC_OFFLINE_MODE) ||
|
||||
(!(psli->sli_flag & LPFC_SLI_ACTIVE))) {
|
||||
if (test_bit(FC_OFFLINE_MODE, &vport->fc_flag) ||
|
||||
!(psli->sli_flag & LPFC_SLI_ACTIVE)) {
|
||||
rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL);
|
||||
if (rc != MBX_SUCCESS) {
|
||||
mempool_free(pmboxq, phba->mbox_mem_pool);
|
||||
|
@ -1977,7 +1977,7 @@ lpfc_sli4_bsg_set_loopback_mode(struct lpfc_hba *phba, int mode,
|
||||
static int
|
||||
lpfc_sli4_diag_fcport_reg_setup(struct lpfc_hba *phba)
|
||||
{
|
||||
if (phba->pport->fc_flag & FC_VFI_REGISTERED) {
|
||||
if (test_bit(FC_VFI_REGISTERED, &phba->pport->fc_flag)) {
|
||||
lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
|
||||
"3136 Port still had vfi registered: "
|
||||
"mydid:x%x, fcfi:%d, vfi:%d, vpi:%d\n",
|
||||
@ -3448,7 +3448,7 @@ static int lpfc_bsg_check_cmd_access(struct lpfc_hba *phba,
|
||||
case MBX_RUN_DIAGS:
|
||||
case MBX_RESTART:
|
||||
case MBX_SET_MASK:
|
||||
if (!(vport->fc_flag & FC_OFFLINE_MODE)) {
|
||||
if (!test_bit(FC_OFFLINE_MODE, &vport->fc_flag)) {
|
||||
lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
|
||||
"2743 Command 0x%x is illegal in on-line "
|
||||
"state\n",
|
||||
@ -4886,7 +4886,7 @@ lpfc_bsg_issue_mbox(struct lpfc_hba *phba, struct bsg_job *job,
|
||||
dd_data->context_un.mbox.outExtWLen = mbox_req->outExtWLen;
|
||||
job->dd_data = dd_data;
|
||||
|
||||
if ((vport->fc_flag & FC_OFFLINE_MODE) ||
|
||||
if (test_bit(FC_OFFLINE_MODE, &vport->fc_flag) ||
|
||||
(!(phba->sli.sli_flag & LPFC_SLI_ACTIVE))) {
|
||||
rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL);
|
||||
if (rc != MBX_SUCCESS) {
|
||||
|
@ -265,7 +265,7 @@ ct_free_mp:
|
||||
kfree(mp);
|
||||
ct_exit:
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
"6440 Unsol CT: Rsp err %d Data: x%x\n",
|
||||
"6440 Unsol CT: Rsp err %d Data: x%lx\n",
|
||||
rc, vport->fc_flag);
|
||||
}
|
||||
|
||||
@ -298,7 +298,7 @@ lpfc_ct_handle_mibreq(struct lpfc_hba *phba, struct lpfc_iocbq *ctiocbq)
|
||||
}
|
||||
|
||||
/* Ignore traffic received during vport shutdown */
|
||||
if (vport->fc_flag & FC_UNLOADING)
|
||||
if (test_bit(FC_UNLOADING, &vport->fc_flag))
|
||||
return;
|
||||
|
||||
ndlp = lpfc_findnode_did(vport, did);
|
||||
@ -723,7 +723,7 @@ lpfc_prep_node_fc4type(struct lpfc_vport *vport, uint32_t Did, uint8_t fc4_type)
|
||||
|
||||
if (ndlp) {
|
||||
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
|
||||
"Parse GID_FTrsp: did:x%x flg:x%x x%x",
|
||||
"Parse GID_FTrsp: did:x%x flg:x%lx x%x",
|
||||
Did, ndlp->nlp_flag, vport->fc_flag);
|
||||
|
||||
/* By default, the driver expects to support FCP FC4 */
|
||||
@ -735,7 +735,7 @@ lpfc_prep_node_fc4type(struct lpfc_vport *vport, uint32_t Did, uint8_t fc4_type)
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"0238 Process x%06x NameServer Rsp "
|
||||
"Data: x%x x%x x%x x%x x%x\n", Did,
|
||||
"Data: x%x x%x x%x x%lx x%x\n", Did,
|
||||
ndlp->nlp_flag, ndlp->nlp_fc4_type,
|
||||
ndlp->nlp_state, vport->fc_flag,
|
||||
vport->fc_rscn_id_cnt);
|
||||
@ -751,20 +751,20 @@ lpfc_prep_node_fc4type(struct lpfc_vport *vport, uint32_t Did, uint8_t fc4_type)
|
||||
}
|
||||
} else {
|
||||
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
|
||||
"Skip1 GID_FTrsp: did:x%x flg:x%x cnt:%d",
|
||||
"Skip1 GID_FTrsp: did:x%x flg:x%lx cnt:%d",
|
||||
Did, vport->fc_flag, vport->fc_rscn_id_cnt);
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"0239 Skip x%06x NameServer Rsp "
|
||||
"Data: x%x x%x x%px\n",
|
||||
"Data: x%lx x%x x%px\n",
|
||||
Did, vport->fc_flag,
|
||||
vport->fc_rscn_id_cnt, ndlp);
|
||||
}
|
||||
} else {
|
||||
if (!(vport->fc_flag & FC_RSCN_MODE) ||
|
||||
if (!test_bit(FC_RSCN_MODE, &vport->fc_flag) ||
|
||||
lpfc_rscn_payload_check(vport, Did)) {
|
||||
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
|
||||
"Query GID_FTrsp: did:x%x flg:x%x cnt:%d",
|
||||
"Query GID_FTrsp: did:x%x flg:x%lx cnt:%d",
|
||||
Did, vport->fc_flag, vport->fc_rscn_id_cnt);
|
||||
|
||||
/*
|
||||
@ -787,12 +787,12 @@ lpfc_prep_node_fc4type(struct lpfc_vport *vport, uint32_t Did, uint8_t fc4_type)
|
||||
lpfc_setup_disc_node(vport, Did);
|
||||
} else {
|
||||
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
|
||||
"Skip2 GID_FTrsp: did:x%x flg:x%x cnt:%d",
|
||||
"Skip2 GID_FTrsp: did:x%x flg:x%lx cnt:%d",
|
||||
Did, vport->fc_flag, vport->fc_rscn_id_cnt);
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"0245 Skip x%06x NameServer Rsp "
|
||||
"Data: x%x x%x\n", Did,
|
||||
"Data: x%lx x%x\n", Did,
|
||||
vport->fc_flag,
|
||||
vport->fc_rscn_id_cnt);
|
||||
}
|
||||
@ -914,7 +914,6 @@ lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
struct lpfc_iocbq *rspiocb)
|
||||
{
|
||||
struct lpfc_vport *vport = cmdiocb->vport;
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
struct lpfc_dmabuf *outp;
|
||||
struct lpfc_dmabuf *inp;
|
||||
struct lpfc_sli_ct_request *CTrsp;
|
||||
@ -945,7 +944,7 @@ lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
|
||||
/* Skip processing response on pport if unloading */
|
||||
if (vport == phba->pport && vport->load_flag & FC_UNLOADING) {
|
||||
if (vport->fc_flag & FC_RSCN_MODE)
|
||||
if (test_bit(FC_RSCN_MODE, &vport->fc_flag))
|
||||
lpfc_els_flush_rscn(vport);
|
||||
goto out;
|
||||
}
|
||||
@ -953,7 +952,7 @@ lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
if (lpfc_els_chk_latt(vport)) {
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"0216 Link event during NS query\n");
|
||||
if (vport->fc_flag & FC_RSCN_MODE)
|
||||
if (test_bit(FC_RSCN_MODE, &vport->fc_flag))
|
||||
lpfc_els_flush_rscn(vport);
|
||||
lpfc_vport_set_state(vport, FC_VPORT_FAILED);
|
||||
goto out;
|
||||
@ -961,22 +960,18 @@ lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
if (lpfc_error_lost_link(vport, ulp_status, ulp_word4)) {
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"0226 NS query failed due to link event: "
|
||||
"ulp_status x%x ulp_word4 x%x fc_flag x%x "
|
||||
"ulp_status x%x ulp_word4 x%x fc_flag x%lx "
|
||||
"port_state x%x gidft_inp x%x\n",
|
||||
ulp_status, ulp_word4, vport->fc_flag,
|
||||
vport->port_state, vport->gidft_inp);
|
||||
if (vport->fc_flag & FC_RSCN_MODE)
|
||||
if (test_bit(FC_RSCN_MODE, &vport->fc_flag))
|
||||
lpfc_els_flush_rscn(vport);
|
||||
if (vport->gidft_inp)
|
||||
vport->gidft_inp--;
|
||||
goto out;
|
||||
}
|
||||
|
||||
spin_lock_irq(shost->host_lock);
|
||||
if (vport->fc_flag & FC_RSCN_DEFERRED) {
|
||||
vport->fc_flag &= ~FC_RSCN_DEFERRED;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
|
||||
if (test_and_clear_bit(FC_RSCN_DEFERRED, &vport->fc_flag)) {
|
||||
/* This is a GID_FT completing so the gidft_inp counter was
|
||||
* incremented before the GID_FT was issued to the wire.
|
||||
*/
|
||||
@ -988,13 +983,12 @@ lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
* Re-issue the NS cmd
|
||||
*/
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
|
||||
"0151 Process Deferred RSCN Data: x%x x%x\n",
|
||||
"0151 Process Deferred RSCN Data: x%lx x%x\n",
|
||||
vport->fc_flag, vport->fc_rscn_id_cnt);
|
||||
lpfc_els_handle_rscn(vport);
|
||||
|
||||
goto out;
|
||||
}
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
|
||||
if (ulp_status) {
|
||||
/* Check for retry */
|
||||
@ -1018,7 +1012,7 @@ lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
vport->gidft_inp--;
|
||||
}
|
||||
}
|
||||
if (vport->fc_flag & FC_RSCN_MODE)
|
||||
if (test_bit(FC_RSCN_MODE, &vport->fc_flag))
|
||||
lpfc_els_flush_rscn(vport);
|
||||
lpfc_vport_set_state(vport, FC_VPORT_FAILED);
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
@ -1031,7 +1025,7 @@ lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
if (CTrsp->CommandResponse.bits.CmdRsp ==
|
||||
cpu_to_be16(SLI_CT_RESPONSE_FS_ACC)) {
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"0208 NameServer Rsp Data: x%x x%x "
|
||||
"0208 NameServer Rsp Data: x%lx x%x "
|
||||
"x%x x%x sz x%x\n",
|
||||
vport->fc_flag,
|
||||
CTreq->un.gid.Fc4Type,
|
||||
@ -1051,7 +1045,7 @@ lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
lpfc_printf_vlog(vport, KERN_INFO,
|
||||
LOG_DISCOVERY,
|
||||
"0269 No NameServer Entries "
|
||||
"Data: x%x x%x x%x x%x\n",
|
||||
"Data: x%x x%x x%x x%lx\n",
|
||||
be16_to_cpu(CTrsp->CommandResponse.bits.CmdRsp),
|
||||
(uint32_t) CTrsp->ReasonCode,
|
||||
(uint32_t) CTrsp->Explanation,
|
||||
@ -1066,7 +1060,7 @@ lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
lpfc_printf_vlog(vport, KERN_INFO,
|
||||
LOG_DISCOVERY,
|
||||
"0240 NameServer Rsp Error "
|
||||
"Data: x%x x%x x%x x%x\n",
|
||||
"Data: x%x x%x x%x x%lx\n",
|
||||
be16_to_cpu(CTrsp->CommandResponse.bits.CmdRsp),
|
||||
(uint32_t) CTrsp->ReasonCode,
|
||||
(uint32_t) CTrsp->Explanation,
|
||||
@ -1084,7 +1078,7 @@ lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
/* NameServer Rsp Error */
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0241 NameServer Rsp Error "
|
||||
"Data: x%x x%x x%x x%x\n",
|
||||
"Data: x%x x%x x%x x%lx\n",
|
||||
be16_to_cpu(CTrsp->CommandResponse.bits.CmdRsp),
|
||||
(uint32_t) CTrsp->ReasonCode,
|
||||
(uint32_t) CTrsp->Explanation,
|
||||
@ -1113,14 +1107,13 @@ lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
* current driver state.
|
||||
*/
|
||||
if (vport->port_state >= LPFC_DISC_AUTH) {
|
||||
if (vport->fc_flag & FC_RSCN_MODE) {
|
||||
if (test_bit(FC_RSCN_MODE, &vport->fc_flag)) {
|
||||
lpfc_els_flush_rscn(vport);
|
||||
/* RSCN still */
|
||||
set_bit(FC_RSCN_MODE, &vport->fc_flag);
|
||||
} else {
|
||||
lpfc_els_flush_rscn(vport);
|
||||
spin_lock_irq(shost->host_lock);
|
||||
vport->fc_flag |= FC_RSCN_MODE; /* RSCN still */
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
}
|
||||
else
|
||||
lpfc_els_flush_rscn(vport);
|
||||
}
|
||||
|
||||
lpfc_disc_start(vport);
|
||||
@ -1136,7 +1129,6 @@ lpfc_cmpl_ct_cmd_gid_pt(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
struct lpfc_iocbq *rspiocb)
|
||||
{
|
||||
struct lpfc_vport *vport = cmdiocb->vport;
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
struct lpfc_dmabuf *outp;
|
||||
struct lpfc_dmabuf *inp;
|
||||
struct lpfc_sli_ct_request *CTrsp;
|
||||
@ -1168,7 +1160,7 @@ lpfc_cmpl_ct_cmd_gid_pt(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
|
||||
/* Skip processing response on pport if unloading */
|
||||
if (vport == phba->pport && vport->load_flag & FC_UNLOADING) {
|
||||
if (vport->fc_flag & FC_RSCN_MODE)
|
||||
if (test_bit(FC_RSCN_MODE, &vport->fc_flag))
|
||||
lpfc_els_flush_rscn(vport);
|
||||
goto out;
|
||||
}
|
||||
@ -1176,7 +1168,7 @@ lpfc_cmpl_ct_cmd_gid_pt(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
if (lpfc_els_chk_latt(vport)) {
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"4108 Link event during NS query\n");
|
||||
if (vport->fc_flag & FC_RSCN_MODE)
|
||||
if (test_bit(FC_RSCN_MODE, &vport->fc_flag))
|
||||
lpfc_els_flush_rscn(vport);
|
||||
lpfc_vport_set_state(vport, FC_VPORT_FAILED);
|
||||
goto out;
|
||||
@ -1184,22 +1176,18 @@ lpfc_cmpl_ct_cmd_gid_pt(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
if (lpfc_error_lost_link(vport, ulp_status, ulp_word4)) {
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"4166 NS query failed due to link event: "
|
||||
"ulp_status x%x ulp_word4 x%x fc_flag x%x "
|
||||
"ulp_status x%x ulp_word4 x%x fc_flag x%lx "
|
||||
"port_state x%x gidft_inp x%x\n",
|
||||
ulp_status, ulp_word4, vport->fc_flag,
|
||||
vport->port_state, vport->gidft_inp);
|
||||
if (vport->fc_flag & FC_RSCN_MODE)
|
||||
if (test_bit(FC_RSCN_MODE, &vport->fc_flag))
|
||||
lpfc_els_flush_rscn(vport);
|
||||
if (vport->gidft_inp)
|
||||
vport->gidft_inp--;
|
||||
goto out;
|
||||
}
|
||||
|
||||
spin_lock_irq(shost->host_lock);
|
||||
if (vport->fc_flag & FC_RSCN_DEFERRED) {
|
||||
vport->fc_flag &= ~FC_RSCN_DEFERRED;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
|
||||
if (test_and_clear_bit(FC_RSCN_DEFERRED, &vport->fc_flag)) {
|
||||
/* This is a GID_PT completing so the gidft_inp counter was
|
||||
* incremented before the GID_PT was issued to the wire.
|
||||
*/
|
||||
@ -1211,13 +1199,12 @@ lpfc_cmpl_ct_cmd_gid_pt(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
* Re-issue the NS cmd
|
||||
*/
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
|
||||
"4167 Process Deferred RSCN Data: x%x x%x\n",
|
||||
"4167 Process Deferred RSCN Data: x%lx x%x\n",
|
||||
vport->fc_flag, vport->fc_rscn_id_cnt);
|
||||
lpfc_els_handle_rscn(vport);
|
||||
|
||||
goto out;
|
||||
}
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
|
||||
if (ulp_status) {
|
||||
/* Check for retry */
|
||||
@ -1237,7 +1224,7 @@ lpfc_cmpl_ct_cmd_gid_pt(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
vport->gidft_inp--;
|
||||
}
|
||||
}
|
||||
if (vport->fc_flag & FC_RSCN_MODE)
|
||||
if (test_bit(FC_RSCN_MODE, &vport->fc_flag))
|
||||
lpfc_els_flush_rscn(vport);
|
||||
lpfc_vport_set_state(vport, FC_VPORT_FAILED);
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
@ -1250,7 +1237,7 @@ lpfc_cmpl_ct_cmd_gid_pt(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
if (be16_to_cpu(CTrsp->CommandResponse.bits.CmdRsp) ==
|
||||
SLI_CT_RESPONSE_FS_ACC) {
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"4105 NameServer Rsp Data: x%x x%x "
|
||||
"4105 NameServer Rsp Data: x%lx x%x "
|
||||
"x%x x%x sz x%x\n",
|
||||
vport->fc_flag,
|
||||
CTreq->un.gid.Fc4Type,
|
||||
@ -1270,7 +1257,7 @@ lpfc_cmpl_ct_cmd_gid_pt(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
lpfc_printf_vlog(
|
||||
vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"4106 No NameServer Entries "
|
||||
"Data: x%x x%x x%x x%x\n",
|
||||
"Data: x%x x%x x%x x%lx\n",
|
||||
be16_to_cpu(CTrsp->CommandResponse.bits.CmdRsp),
|
||||
(uint32_t)CTrsp->ReasonCode,
|
||||
(uint32_t)CTrsp->Explanation,
|
||||
@ -1286,7 +1273,7 @@ lpfc_cmpl_ct_cmd_gid_pt(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
lpfc_printf_vlog(
|
||||
vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"4107 NameServer Rsp Error "
|
||||
"Data: x%x x%x x%x x%x\n",
|
||||
"Data: x%x x%x x%x x%lx\n",
|
||||
be16_to_cpu(CTrsp->CommandResponse.bits.CmdRsp),
|
||||
(uint32_t)CTrsp->ReasonCode,
|
||||
(uint32_t)CTrsp->Explanation,
|
||||
@ -1303,7 +1290,7 @@ lpfc_cmpl_ct_cmd_gid_pt(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
/* NameServer Rsp Error */
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"4109 NameServer Rsp Error "
|
||||
"Data: x%x x%x x%x x%x\n",
|
||||
"Data: x%x x%x x%x x%lx\n",
|
||||
be16_to_cpu(CTrsp->CommandResponse.bits.CmdRsp),
|
||||
(uint32_t)CTrsp->ReasonCode,
|
||||
(uint32_t)CTrsp->Explanation,
|
||||
@ -1333,11 +1320,10 @@ lpfc_cmpl_ct_cmd_gid_pt(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
* current driver state.
|
||||
*/
|
||||
if (vport->port_state >= LPFC_DISC_AUTH) {
|
||||
if (vport->fc_flag & FC_RSCN_MODE) {
|
||||
if (test_bit(FC_RSCN_MODE, &vport->fc_flag)) {
|
||||
lpfc_els_flush_rscn(vport);
|
||||
spin_lock_irq(shost->host_lock);
|
||||
vport->fc_flag |= FC_RSCN_MODE; /* RSCN still */
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
/* RSCN still */
|
||||
set_bit(FC_RSCN_MODE, &vport->fc_flag);
|
||||
} else {
|
||||
lpfc_els_flush_rscn(vport);
|
||||
}
|
||||
@ -1355,7 +1341,6 @@ lpfc_cmpl_ct_cmd_gff_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
struct lpfc_iocbq *rspiocb)
|
||||
{
|
||||
struct lpfc_vport *vport = cmdiocb->vport;
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
struct lpfc_dmabuf *inp = cmdiocb->cmd_dmabuf;
|
||||
struct lpfc_dmabuf *outp = cmdiocb->rsp_dmabuf;
|
||||
struct lpfc_sli_ct_request *CTrsp;
|
||||
@ -1445,7 +1430,7 @@ lpfc_cmpl_ct_cmd_gff_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
}
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0267 NameServer GFF Rsp "
|
||||
"x%x Error (%d %d) Data: x%x x%x\n",
|
||||
"x%x Error (%d %d) Data: x%lx x%x\n",
|
||||
did, ulp_status, ulp_word4,
|
||||
vport->fc_flag, vport->fc_rscn_id_cnt);
|
||||
}
|
||||
@ -1455,13 +1440,13 @@ lpfc_cmpl_ct_cmd_gff_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
if (ndlp) {
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"0242 Process x%x GFF "
|
||||
"NameServer Rsp Data: x%x x%x x%x\n",
|
||||
"NameServer Rsp Data: x%x x%lx x%x\n",
|
||||
did, ndlp->nlp_flag, vport->fc_flag,
|
||||
vport->fc_rscn_id_cnt);
|
||||
} else {
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"0243 Skip x%x GFF "
|
||||
"NameServer Rsp Data: x%x x%x\n", did,
|
||||
"NameServer Rsp Data: x%lx x%x\n", did,
|
||||
vport->fc_flag, vport->fc_rscn_id_cnt);
|
||||
}
|
||||
out:
|
||||
@ -1480,14 +1465,13 @@ out:
|
||||
* current driver state.
|
||||
*/
|
||||
if (vport->port_state >= LPFC_DISC_AUTH) {
|
||||
if (vport->fc_flag & FC_RSCN_MODE) {
|
||||
if (test_bit(FC_RSCN_MODE, &vport->fc_flag)) {
|
||||
lpfc_els_flush_rscn(vport);
|
||||
/* RSCN still */
|
||||
set_bit(FC_RSCN_MODE, &vport->fc_flag);
|
||||
} else {
|
||||
lpfc_els_flush_rscn(vport);
|
||||
spin_lock_irq(shost->host_lock);
|
||||
vport->fc_flag |= FC_RSCN_MODE; /* RSCN still */
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
}
|
||||
else
|
||||
lpfc_els_flush_rscn(vport);
|
||||
}
|
||||
lpfc_disc_start(vport);
|
||||
}
|
||||
@ -1949,7 +1933,7 @@ lpfc_ns_cmd(struct lpfc_vport *vport, int cmdcode,
|
||||
|
||||
/* NameServer Req */
|
||||
lpfc_printf_vlog(vport, KERN_INFO ,LOG_DISCOVERY,
|
||||
"0236 NameServer Req Data: x%x x%x x%x x%x\n",
|
||||
"0236 NameServer Req Data: x%x x%lx x%x x%x\n",
|
||||
cmdcode, vport->fc_flag, vport->fc_rscn_id_cnt,
|
||||
context);
|
||||
|
||||
@ -2166,7 +2150,8 @@ ns_cmd_free_mp:
|
||||
kfree(mp);
|
||||
ns_cmd_exit:
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0266 Issue NameServer Req x%x err %d Data: x%x x%x\n",
|
||||
"0266 Issue NameServer Req x%x err %d Data: x%lx "
|
||||
"x%x\n",
|
||||
cmdcode, rc, vport->fc_flag, vport->fc_rscn_id_cnt);
|
||||
return 1;
|
||||
}
|
||||
@ -2452,7 +2437,7 @@ lpfc_fdmi_change_check(struct lpfc_vport *vport)
|
||||
return;
|
||||
|
||||
/* Must be connected to a Fabric */
|
||||
if (!(vport->fc_flag & FC_FABRIC))
|
||||
if (!test_bit(FC_FABRIC, &vport->fc_flag))
|
||||
return;
|
||||
|
||||
ndlp = lpfc_findnode_did(vport, FDMI_DID);
|
||||
@ -3232,7 +3217,7 @@ lpfc_fdmi_cmd(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
|
||||
/* FDMI request */
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"0218 FDMI Request x%x mask x%x Data: x%x x%x x%x\n",
|
||||
"0218 FDMI Request x%x mask x%x Data: x%x x%lx x%x\n",
|
||||
cmdcode, new_mask, vport->fdmi_port_mask,
|
||||
vport->fc_flag, vport->port_state);
|
||||
|
||||
@ -3469,15 +3454,8 @@ lpfc_delayed_disc_tmo(struct timer_list *t)
|
||||
void
|
||||
lpfc_delayed_disc_timeout_handler(struct lpfc_vport *vport)
|
||||
{
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
|
||||
spin_lock_irq(shost->host_lock);
|
||||
if (!(vport->fc_flag & FC_DISC_DELAYED)) {
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
if (!test_and_clear_bit(FC_DISC_DELAYED, &vport->fc_flag))
|
||||
return;
|
||||
}
|
||||
vport->fc_flag &= ~FC_DISC_DELAYED;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
|
||||
lpfc_do_scr_ns_plogi(vport->phba, vport);
|
||||
}
|
||||
@ -3728,7 +3706,7 @@ lpfc_vmid_cmd(struct lpfc_vport *vport,
|
||||
INIT_LIST_HEAD(&bmp->list);
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"3275 VMID Request Data: x%x x%x x%x\n",
|
||||
"3275 VMID Request Data: x%lx x%x x%x\n",
|
||||
vport->fc_flag, vport->port_state, cmdcode);
|
||||
ctreq = (struct lpfc_sli_ct_request *)mp->virt;
|
||||
data = mp->virt;
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1149,7 +1149,6 @@ lpfc_workq_post_event(struct lpfc_hba *phba, void *arg1, void *arg2,
|
||||
void
|
||||
lpfc_cleanup_rpis(struct lpfc_vport *vport, int remove)
|
||||
{
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
struct lpfc_hba *phba = vport->phba;
|
||||
struct lpfc_nodelist *ndlp, *next_ndlp;
|
||||
|
||||
@ -1180,9 +1179,7 @@ lpfc_cleanup_rpis(struct lpfc_vport *vport, int remove)
|
||||
if (phba->sli_rev == LPFC_SLI_REV4)
|
||||
lpfc_sli4_unreg_all_rpis(vport);
|
||||
lpfc_mbx_unreg_vpi(vport);
|
||||
spin_lock_irq(shost->host_lock);
|
||||
vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
set_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1210,7 +1207,7 @@ void
|
||||
lpfc_linkdown_port(struct lpfc_vport *vport)
|
||||
{
|
||||
struct lpfc_hba *phba = vport->phba;
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
|
||||
if (vport->cfg_enable_fc4_type != LPFC_ENABLE_NVME)
|
||||
fc_host_post_event(shost, fc_get_event_number(),
|
||||
@ -1223,9 +1220,7 @@ lpfc_linkdown_port(struct lpfc_vport *vport)
|
||||
lpfc_port_link_failure(vport);
|
||||
|
||||
/* Stop delayed Nport discovery */
|
||||
spin_lock_irq(shost->host_lock);
|
||||
vport->fc_flag &= ~FC_DISC_DELAYED;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
clear_bit(FC_DISC_DELAYED, &vport->fc_flag);
|
||||
del_timer_sync(&vport->delayed_disc_tmo);
|
||||
|
||||
if (phba->sli_rev == LPFC_SLI_REV4 &&
|
||||
@ -1240,7 +1235,7 @@ int
|
||||
lpfc_linkdown(struct lpfc_hba *phba)
|
||||
{
|
||||
struct lpfc_vport *vport = phba->pport;
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
struct lpfc_vport **vports;
|
||||
LPFC_MBOXQ_t *mb;
|
||||
int i;
|
||||
@ -1273,9 +1268,7 @@ lpfc_linkdown(struct lpfc_hba *phba)
|
||||
phba->sli4_hba.link_state.logical_speed =
|
||||
LPFC_LINK_SPEED_UNKNOWN;
|
||||
}
|
||||
spin_lock_irq(shost->host_lock);
|
||||
phba->pport->fc_flag &= ~FC_LBIT;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
clear_bit(FC_LBIT, &phba->pport->fc_flag);
|
||||
}
|
||||
vports = lpfc_create_vport_work_array(phba);
|
||||
if (vports != NULL) {
|
||||
@ -1313,7 +1306,7 @@ lpfc_linkdown(struct lpfc_hba *phba)
|
||||
|
||||
skip_unreg_did:
|
||||
/* Setup myDID for link up if we are in pt2pt mode */
|
||||
if (phba->pport->fc_flag & FC_PT2PT) {
|
||||
if (test_bit(FC_PT2PT, &phba->pport->fc_flag)) {
|
||||
mb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
|
||||
if (mb) {
|
||||
lpfc_config_link(phba, mb);
|
||||
@ -1324,8 +1317,9 @@ lpfc_linkdown(struct lpfc_hba *phba)
|
||||
mempool_free(mb, phba->mbox_mem_pool);
|
||||
}
|
||||
}
|
||||
clear_bit(FC_PT2PT, &phba->pport->fc_flag);
|
||||
clear_bit(FC_PT2PT_PLOGI, &phba->pport->fc_flag);
|
||||
spin_lock_irq(shost->host_lock);
|
||||
phba->pport->fc_flag &= ~(FC_PT2PT | FC_PT2PT_PLOGI);
|
||||
phba->pport->rcv_flogi_cnt = 0;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
}
|
||||
@ -1376,19 +1370,22 @@ lpfc_linkup_port(struct lpfc_vport *vport)
|
||||
(vport != phba->pport))
|
||||
return;
|
||||
|
||||
if (vport->cfg_enable_fc4_type != LPFC_ENABLE_NVME)
|
||||
fc_host_post_event(shost, fc_get_event_number(),
|
||||
FCH_EVT_LINKUP, 0);
|
||||
if (phba->defer_flogi_acc_flag) {
|
||||
clear_bit(FC_ABORT_DISCOVERY, &vport->fc_flag);
|
||||
clear_bit(FC_RSCN_MODE, &vport->fc_flag);
|
||||
clear_bit(FC_NLP_MORE, &vport->fc_flag);
|
||||
clear_bit(FC_RSCN_DISCOVERY, &vport->fc_flag);
|
||||
} else {
|
||||
clear_bit(FC_PT2PT, &vport->fc_flag);
|
||||
clear_bit(FC_PT2PT_PLOGI, &vport->fc_flag);
|
||||
clear_bit(FC_ABORT_DISCOVERY, &vport->fc_flag);
|
||||
clear_bit(FC_RSCN_MODE, &vport->fc_flag);
|
||||
clear_bit(FC_NLP_MORE, &vport->fc_flag);
|
||||
clear_bit(FC_RSCN_DISCOVERY, &vport->fc_flag);
|
||||
}
|
||||
set_bit(FC_NDISC_ACTIVE, &vport->fc_flag);
|
||||
|
||||
spin_lock_irq(shost->host_lock);
|
||||
if (phba->defer_flogi_acc_flag)
|
||||
vport->fc_flag &= ~(FC_ABORT_DISCOVERY | FC_RSCN_MODE |
|
||||
FC_NLP_MORE | FC_RSCN_DISCOVERY);
|
||||
else
|
||||
vport->fc_flag &= ~(FC_PT2PT | FC_PT2PT_PLOGI |
|
||||
FC_ABORT_DISCOVERY | FC_RSCN_MODE |
|
||||
FC_NLP_MORE | FC_RSCN_DISCOVERY);
|
||||
vport->fc_flag |= FC_NDISC_ACTIVE;
|
||||
vport->fc_ns_retry = 0;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
lpfc_setup_fdmi_mask(vport);
|
||||
@ -1439,7 +1436,6 @@ static void
|
||||
lpfc_mbx_cmpl_clear_la(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
{
|
||||
struct lpfc_vport *vport = pmb->vport;
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
struct lpfc_sli *psli = &phba->sli;
|
||||
MAILBOX_t *mb = &pmb->u.mb;
|
||||
uint32_t control;
|
||||
@ -1478,9 +1474,7 @@ out:
|
||||
"0225 Device Discovery completes\n");
|
||||
mempool_free(pmb, phba->mbox_mem_pool);
|
||||
|
||||
spin_lock_irq(shost->host_lock);
|
||||
vport->fc_flag &= ~FC_ABORT_DISCOVERY;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
clear_bit(FC_ABORT_DISCOVERY, &vport->fc_flag);
|
||||
|
||||
lpfc_can_disctmo(vport);
|
||||
|
||||
@ -1517,8 +1511,8 @@ lpfc_mbx_cmpl_local_config_link(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
return;
|
||||
|
||||
if (phba->fc_topology == LPFC_TOPOLOGY_LOOP &&
|
||||
vport->fc_flag & FC_PUBLIC_LOOP &&
|
||||
!(vport->fc_flag & FC_LBIT)) {
|
||||
test_bit(FC_PUBLIC_LOOP, &vport->fc_flag) &&
|
||||
!test_bit(FC_LBIT, &vport->fc_flag)) {
|
||||
/* Need to wait for FAN - use discovery timer
|
||||
* for timeout. port_state is identically
|
||||
* LPFC_LOCAL_CFG_LINK while waiting for FAN
|
||||
@ -1560,7 +1554,7 @@ lpfc_mbx_cmpl_local_config_link(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
lpfc_initial_flogi(vport);
|
||||
}
|
||||
} else {
|
||||
if (vport->fc_flag & FC_PT2PT)
|
||||
if (test_bit(FC_PT2PT, &vport->fc_flag))
|
||||
lpfc_disc_start(vport);
|
||||
}
|
||||
return;
|
||||
@ -1884,7 +1878,7 @@ lpfc_register_fcf(struct lpfc_hba *phba)
|
||||
phba->fcf.fcf_flag |= (FCF_SCAN_DONE | FCF_IN_USE);
|
||||
phba->hba_flag &= ~FCF_TS_INPROG;
|
||||
if (phba->pport->port_state != LPFC_FLOGI &&
|
||||
phba->pport->fc_flag & FC_FABRIC) {
|
||||
test_bit(FC_FABRIC, &phba->pport->fc_flag)) {
|
||||
phba->hba_flag |= FCF_RR_INPROG;
|
||||
spin_unlock_irq(&phba->hbalock);
|
||||
lpfc_initial_flogi(phba->pport);
|
||||
@ -2742,7 +2736,7 @@ lpfc_mbx_cmpl_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
|
||||
lpfc_printf_log(phba, KERN_INFO, LOG_FIP,
|
||||
"2836 New FCF matches in-use "
|
||||
"FCF (x%x), port_state:x%x, "
|
||||
"fc_flag:x%x\n",
|
||||
"fc_flag:x%lx\n",
|
||||
phba->fcf.current_rec.fcf_indx,
|
||||
phba->pport->port_state,
|
||||
phba->pport->fc_flag);
|
||||
@ -3218,7 +3212,6 @@ lpfc_init_vpi_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
|
||||
{
|
||||
struct lpfc_vport *vport = mboxq->vport;
|
||||
struct lpfc_nodelist *ndlp;
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
|
||||
if (mboxq->u.mb.mbxStatus) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
@ -3228,9 +3221,7 @@ lpfc_init_vpi_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
|
||||
lpfc_vport_set_state(vport, FC_VPORT_FAILED);
|
||||
return;
|
||||
}
|
||||
spin_lock_irq(shost->host_lock);
|
||||
vport->fc_flag &= ~FC_VPORT_NEEDS_INIT_VPI;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
clear_bit(FC_VPORT_NEEDS_INIT_VPI, &vport->fc_flag);
|
||||
|
||||
/* If this port is physical port or FDISC is done, do reg_vpi */
|
||||
if ((phba->pport == vport) || (vport->port_state == LPFC_FDISC)) {
|
||||
@ -3328,7 +3319,8 @@ lpfc_start_fdiscs(struct lpfc_hba *phba)
|
||||
FC_VPORT_LINKDOWN);
|
||||
continue;
|
||||
}
|
||||
if (vports[i]->fc_flag & FC_VPORT_NEEDS_INIT_VPI) {
|
||||
if (test_bit(FC_VPORT_NEEDS_INIT_VPI,
|
||||
&vports[i]->fc_flag)) {
|
||||
lpfc_issue_init_vpi(vports[i]);
|
||||
continue;
|
||||
}
|
||||
@ -3380,17 +3372,17 @@ lpfc_mbx_cmpl_reg_vfi(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
|
||||
* Unless this was a VFI update and we are in PT2PT mode, then
|
||||
* we should drop through to set the port state to ready.
|
||||
*/
|
||||
if (vport->fc_flag & FC_VFI_REGISTERED)
|
||||
if (test_bit(FC_VFI_REGISTERED, &vport->fc_flag))
|
||||
if (!(phba->sli_rev == LPFC_SLI_REV4 &&
|
||||
vport->fc_flag & FC_PT2PT))
|
||||
test_bit(FC_PT2PT, &vport->fc_flag)))
|
||||
goto out_free_mem;
|
||||
|
||||
/* The VPI is implicitly registered when the VFI is registered */
|
||||
set_bit(FC_VFI_REGISTERED, &vport->fc_flag);
|
||||
clear_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag);
|
||||
clear_bit(FC_VPORT_NEEDS_INIT_VPI, &vport->fc_flag);
|
||||
spin_lock_irq(shost->host_lock);
|
||||
vport->vpi_state |= LPFC_VPI_REGISTERED;
|
||||
vport->fc_flag |= FC_VFI_REGISTERED;
|
||||
vport->fc_flag &= ~FC_VPORT_NEEDS_REG_VPI;
|
||||
vport->fc_flag &= ~FC_VPORT_NEEDS_INIT_VPI;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
|
||||
/* In case SLI4 FC loopback test, we are ready */
|
||||
@ -3401,8 +3393,8 @@ lpfc_mbx_cmpl_reg_vfi(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
|
||||
}
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_SLI,
|
||||
"3313 cmpl reg vfi port_state:%x fc_flag:%x myDid:%x "
|
||||
"alpacnt:%d LinkState:%x topology:%x\n",
|
||||
"3313 cmpl reg vfi port_state:%x fc_flag:%lx "
|
||||
"myDid:%x alpacnt:%d LinkState:%x topology:%x\n",
|
||||
vport->port_state, vport->fc_flag, vport->fc_myDID,
|
||||
vport->phba->alpa_map[0],
|
||||
phba->link_state, phba->fc_topology);
|
||||
@ -3412,14 +3404,14 @@ lpfc_mbx_cmpl_reg_vfi(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
|
||||
* For private loop or for NPort pt2pt,
|
||||
* just start discovery and we are done.
|
||||
*/
|
||||
if ((vport->fc_flag & FC_PT2PT) ||
|
||||
((phba->fc_topology == LPFC_TOPOLOGY_LOOP) &&
|
||||
!(vport->fc_flag & FC_PUBLIC_LOOP))) {
|
||||
if (test_bit(FC_PT2PT, &vport->fc_flag) ||
|
||||
(phba->fc_topology == LPFC_TOPOLOGY_LOOP &&
|
||||
!test_bit(FC_PUBLIC_LOOP, &vport->fc_flag))) {
|
||||
|
||||
/* Use loop map to make discovery list */
|
||||
lpfc_disc_list_loopmap(vport);
|
||||
/* Start discovery */
|
||||
if (vport->fc_flag & FC_PT2PT)
|
||||
if (test_bit(FC_PT2PT, &vport->fc_flag))
|
||||
vport->port_state = LPFC_VPORT_READY;
|
||||
else
|
||||
lpfc_disc_start(vport);
|
||||
@ -3496,11 +3488,9 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, struct lpfc_mbx_read_top *la)
|
||||
{
|
||||
struct lpfc_vport *vport = phba->pport;
|
||||
LPFC_MBOXQ_t *sparam_mbox, *cfglink_mbox = NULL;
|
||||
struct Scsi_Host *shost;
|
||||
int i;
|
||||
int rc;
|
||||
struct fcf_record *fcf_record;
|
||||
uint32_t fc_flags = 0;
|
||||
unsigned long iflags;
|
||||
|
||||
spin_lock_irqsave(&phba->hbalock, iflags);
|
||||
@ -3537,7 +3527,6 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, struct lpfc_mbx_read_top *la)
|
||||
phba->fc_topology = bf_get(lpfc_mbx_read_top_topology, la);
|
||||
phba->link_flag &= ~(LS_NPIV_FAB_SUPPORTED | LS_CT_VEN_RPA);
|
||||
|
||||
shost = lpfc_shost_from_vport(vport);
|
||||
if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) {
|
||||
phba->sli3_options &= ~LPFC_SLI3_NPIV_ENABLED;
|
||||
|
||||
@ -3550,7 +3539,7 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, struct lpfc_mbx_read_top *la)
|
||||
"topology\n");
|
||||
/* Get Loop Map information */
|
||||
if (bf_get(lpfc_mbx_read_top_il, la))
|
||||
fc_flags |= FC_LBIT;
|
||||
set_bit(FC_LBIT, &vport->fc_flag);
|
||||
|
||||
vport->fc_myDID = bf_get(lpfc_mbx_read_top_alpa_granted, la);
|
||||
i = la->lilpBde64.tus.f.bdeSize;
|
||||
@ -3599,16 +3588,10 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, struct lpfc_mbx_read_top *la)
|
||||
phba->sli3_options |= LPFC_SLI3_NPIV_ENABLED;
|
||||
}
|
||||
vport->fc_myDID = phba->fc_pref_DID;
|
||||
fc_flags |= FC_LBIT;
|
||||
set_bit(FC_LBIT, &vport->fc_flag);
|
||||
}
|
||||
spin_unlock_irqrestore(&phba->hbalock, iflags);
|
||||
|
||||
if (fc_flags) {
|
||||
spin_lock_irqsave(shost->host_lock, iflags);
|
||||
vport->fc_flag |= fc_flags;
|
||||
spin_unlock_irqrestore(shost->host_lock, iflags);
|
||||
}
|
||||
|
||||
lpfc_linkup(phba);
|
||||
sparam_mbox = NULL;
|
||||
|
||||
@ -3751,13 +3734,11 @@ void
|
||||
lpfc_mbx_cmpl_read_topology(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
{
|
||||
struct lpfc_vport *vport = pmb->vport;
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
struct lpfc_mbx_read_top *la;
|
||||
struct lpfc_sli_ring *pring;
|
||||
MAILBOX_t *mb = &pmb->u.mb;
|
||||
struct lpfc_dmabuf *mp = (struct lpfc_dmabuf *)(pmb->ctx_buf);
|
||||
uint8_t attn_type;
|
||||
unsigned long iflags;
|
||||
|
||||
/* Unblock ELS traffic */
|
||||
pring = lpfc_phba_elsring(phba);
|
||||
@ -3779,12 +3760,10 @@ lpfc_mbx_cmpl_read_topology(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
|
||||
memcpy(&phba->alpa_map[0], mp->virt, 128);
|
||||
|
||||
spin_lock_irqsave(shost->host_lock, iflags);
|
||||
if (bf_get(lpfc_mbx_read_top_pb, la))
|
||||
vport->fc_flag |= FC_BYPASSED_MODE;
|
||||
set_bit(FC_BYPASSED_MODE, &vport->fc_flag);
|
||||
else
|
||||
vport->fc_flag &= ~FC_BYPASSED_MODE;
|
||||
spin_unlock_irqrestore(shost->host_lock, iflags);
|
||||
clear_bit(FC_BYPASSED_MODE, &vport->fc_flag);
|
||||
|
||||
if (phba->fc_eventTag <= la->eventTag) {
|
||||
phba->fc_stat.LinkMultiEvent++;
|
||||
@ -3832,20 +3811,20 @@ lpfc_mbx_cmpl_read_topology(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_LINK_EVENT,
|
||||
"1308 Link Down Event in loop back mode "
|
||||
"x%x received "
|
||||
"Data: x%x x%x x%x\n",
|
||||
"Data: x%x x%x x%lx\n",
|
||||
la->eventTag, phba->fc_eventTag,
|
||||
phba->pport->port_state, vport->fc_flag);
|
||||
else if (attn_type == LPFC_ATT_UNEXP_WWPN)
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_LINK_EVENT,
|
||||
"1313 Link Down Unexpected FA WWPN Event x%x "
|
||||
"received Data: x%x x%x x%x x%x\n",
|
||||
"received Data: x%x x%x x%lx x%x\n",
|
||||
la->eventTag, phba->fc_eventTag,
|
||||
phba->pport->port_state, vport->fc_flag,
|
||||
bf_get(lpfc_mbx_read_top_fa, la));
|
||||
else
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_LINK_EVENT,
|
||||
"1305 Link Down Event x%x received "
|
||||
"Data: x%x x%x x%x x%x\n",
|
||||
"Data: x%x x%x x%lx x%x\n",
|
||||
la->eventTag, phba->fc_eventTag,
|
||||
phba->pport->port_state, vport->fc_flag,
|
||||
bf_get(lpfc_mbx_read_top_fa, la));
|
||||
@ -3949,9 +3928,10 @@ lpfc_mbx_cmpl_unreg_vpi(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
lpfc_workq_post_event(phba, NULL, NULL,
|
||||
LPFC_EVT_RESET_HBA);
|
||||
}
|
||||
|
||||
set_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag);
|
||||
spin_lock_irq(shost->host_lock);
|
||||
vport->vpi_state &= ~LPFC_VPI_REGISTERED;
|
||||
vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
mempool_free(pmb, phba->mbox_mem_pool);
|
||||
lpfc_cleanup_vports_rrqs(vport, NULL);
|
||||
@ -4002,9 +3982,8 @@ lpfc_mbx_cmpl_reg_vpi(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
"0912 cmpl_reg_vpi, mb status = 0x%x\n",
|
||||
mb->mbxStatus);
|
||||
lpfc_vport_set_state(vport, FC_VPORT_FAILED);
|
||||
spin_lock_irq(shost->host_lock);
|
||||
vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP);
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
clear_bit(FC_FABRIC, &vport->fc_flag);
|
||||
clear_bit(FC_PUBLIC_LOOP, &vport->fc_flag);
|
||||
vport->fc_myDID = 0;
|
||||
|
||||
if ((vport->cfg_enable_fc4_type == LPFC_ENABLE_BOTH) ||
|
||||
@ -4017,9 +3996,9 @@ lpfc_mbx_cmpl_reg_vpi(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
goto out;
|
||||
}
|
||||
|
||||
clear_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag);
|
||||
spin_lock_irq(shost->host_lock);
|
||||
vport->vpi_state |= LPFC_VPI_REGISTERED;
|
||||
vport->fc_flag &= ~FC_VPORT_NEEDS_REG_VPI;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
vport->num_disc_nodes = 0;
|
||||
/* go thru NPR list and issue ELS PLOGIs */
|
||||
@ -4027,9 +4006,7 @@ lpfc_mbx_cmpl_reg_vpi(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
lpfc_els_disc_plogi(vport);
|
||||
|
||||
if (!vport->num_disc_nodes) {
|
||||
spin_lock_irq(shost->host_lock);
|
||||
vport->fc_flag &= ~FC_NDISC_ACTIVE;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
clear_bit(FC_NDISC_ACTIVE, &vport->fc_flag);
|
||||
lpfc_can_disctmo(vport);
|
||||
}
|
||||
vport->port_state = LPFC_VPORT_READY;
|
||||
@ -4193,7 +4170,6 @@ lpfc_mbx_cmpl_fabric_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
struct lpfc_vport *vport = pmb->vport;
|
||||
MAILBOX_t *mb = &pmb->u.mb;
|
||||
struct lpfc_nodelist *ndlp = (struct lpfc_nodelist *)pmb->ctx_ndlp;
|
||||
struct Scsi_Host *shost;
|
||||
|
||||
pmb->ctx_ndlp = NULL;
|
||||
|
||||
@ -4232,14 +4208,8 @@ lpfc_mbx_cmpl_fabric_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
if (vport->port_state == LPFC_FABRIC_CFG_LINK) {
|
||||
/* when physical port receive logo donot start
|
||||
* vport discovery */
|
||||
if (!(vport->fc_flag & FC_LOGO_RCVD_DID_CHNG))
|
||||
if (!test_and_clear_bit(FC_LOGO_RCVD_DID_CHNG, &vport->fc_flag))
|
||||
lpfc_start_fdiscs(phba);
|
||||
else {
|
||||
shost = lpfc_shost_from_vport(vport);
|
||||
spin_lock_irq(shost->host_lock);
|
||||
vport->fc_flag &= ~FC_LOGO_RCVD_DID_CHNG ;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
}
|
||||
lpfc_do_scr_ns_plogi(phba, vport);
|
||||
}
|
||||
|
||||
@ -4998,7 +4968,6 @@ lpfc_drop_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
void
|
||||
lpfc_set_disctmo(struct lpfc_vport *vport)
|
||||
{
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
struct lpfc_hba *phba = vport->phba;
|
||||
uint32_t tmo;
|
||||
|
||||
@ -5020,9 +4989,7 @@ lpfc_set_disctmo(struct lpfc_vport *vport)
|
||||
}
|
||||
|
||||
mod_timer(&vport->fc_disctmo, jiffies + msecs_to_jiffies(1000 * tmo));
|
||||
spin_lock_irq(shost->host_lock);
|
||||
vport->fc_flag |= FC_DISC_TMO;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
set_bit(FC_DISC_TMO, &vport->fc_flag);
|
||||
|
||||
/* Start Discovery Timer state <hba_state> */
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
@ -5042,7 +5009,6 @@ lpfc_set_disctmo(struct lpfc_vport *vport)
|
||||
int
|
||||
lpfc_can_disctmo(struct lpfc_vport *vport)
|
||||
{
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
unsigned long iflags;
|
||||
|
||||
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
|
||||
@ -5050,11 +5016,9 @@ lpfc_can_disctmo(struct lpfc_vport *vport)
|
||||
vport->port_state, vport->fc_ns_retry, vport->fc_flag);
|
||||
|
||||
/* Turn off discovery timer if its running */
|
||||
if (vport->fc_flag & FC_DISC_TMO ||
|
||||
if (test_bit(FC_DISC_TMO, &vport->fc_flag) ||
|
||||
timer_pending(&vport->fc_disctmo)) {
|
||||
spin_lock_irqsave(shost->host_lock, iflags);
|
||||
vport->fc_flag &= ~FC_DISC_TMO;
|
||||
spin_unlock_irqrestore(shost->host_lock, iflags);
|
||||
clear_bit(FC_DISC_TMO, &vport->fc_flag);
|
||||
del_timer_sync(&vport->fc_disctmo);
|
||||
spin_lock_irqsave(&vport->work_port_lock, iflags);
|
||||
vport->work_port_events &= ~WORKER_DISC_TMO;
|
||||
@ -5064,7 +5028,7 @@ lpfc_can_disctmo(struct lpfc_vport *vport)
|
||||
/* Cancel Discovery Timer state <hba_state> */
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"0248 Cancel Discovery Timer state x%x "
|
||||
"Data: x%x x%x x%x\n",
|
||||
"Data: x%lx x%x x%x\n",
|
||||
vport->port_state, vport->fc_flag,
|
||||
atomic_read(&vport->fc_plogi_cnt),
|
||||
atomic_read(&vport->fc_adisc_cnt));
|
||||
@ -5353,7 +5317,7 @@ lpfc_unreg_rpi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
acc_plogi = 0;
|
||||
if (((ndlp->nlp_DID & Fabric_DID_MASK) !=
|
||||
Fabric_DID_MASK) &&
|
||||
(!(vport->fc_flag & FC_OFFLINE_MODE)))
|
||||
(!test_bit(FC_OFFLINE_MODE, &vport->fc_flag)))
|
||||
ndlp->nlp_flag |= NLP_UNREG_INP;
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_INFO,
|
||||
@ -5725,7 +5689,7 @@ lpfc_setup_disc_node(struct lpfc_vport *vport, uint32_t did)
|
||||
if (!ndlp) {
|
||||
if (vport->phba->nvmet_support)
|
||||
return NULL;
|
||||
if ((vport->fc_flag & FC_RSCN_MODE) != 0 &&
|
||||
if (test_bit(FC_RSCN_MODE, &vport->fc_flag) &&
|
||||
lpfc_rscn_payload_check(vport, did) == 0)
|
||||
return NULL;
|
||||
ndlp = lpfc_nlp_init(vport, did);
|
||||
@ -5735,7 +5699,7 @@ lpfc_setup_disc_node(struct lpfc_vport *vport, uint32_t did)
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"6453 Setup New Node 2B_DISC x%x "
|
||||
"Data:x%x x%x x%x\n",
|
||||
"Data:x%x x%x x%lx\n",
|
||||
ndlp->nlp_DID, ndlp->nlp_flag,
|
||||
ndlp->nlp_state, vport->fc_flag);
|
||||
|
||||
@ -5749,8 +5713,8 @@ lpfc_setup_disc_node(struct lpfc_vport *vport, uint32_t did)
|
||||
* The goal is to allow the target to reset its state and clear
|
||||
* pending IO in preparation for the initiator to recover.
|
||||
*/
|
||||
if ((vport->fc_flag & FC_RSCN_MODE) &&
|
||||
!(vport->fc_flag & FC_NDISC_ACTIVE)) {
|
||||
if (test_bit(FC_RSCN_MODE, &vport->fc_flag) &&
|
||||
!test_bit(FC_NDISC_ACTIVE, &vport->fc_flag)) {
|
||||
if (lpfc_rscn_payload_check(vport, did)) {
|
||||
|
||||
/* Since this node is marked for discovery,
|
||||
@ -5760,7 +5724,7 @@ lpfc_setup_disc_node(struct lpfc_vport *vport, uint32_t did)
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"6455 Setup RSCN Node 2B_DISC x%x "
|
||||
"Data:x%x x%x x%x\n",
|
||||
"Data:x%x x%x x%lx\n",
|
||||
ndlp->nlp_DID, ndlp->nlp_flag,
|
||||
ndlp->nlp_state, vport->fc_flag);
|
||||
|
||||
@ -5784,7 +5748,7 @@ lpfc_setup_disc_node(struct lpfc_vport *vport, uint32_t did)
|
||||
} else {
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"6456 Skip Setup RSCN Node x%x "
|
||||
"Data:x%x x%x x%x\n",
|
||||
"Data:x%x x%x x%lx\n",
|
||||
ndlp->nlp_DID, ndlp->nlp_flag,
|
||||
ndlp->nlp_state, vport->fc_flag);
|
||||
ndlp = NULL;
|
||||
@ -5792,7 +5756,7 @@ lpfc_setup_disc_node(struct lpfc_vport *vport, uint32_t did)
|
||||
} else {
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"6457 Setup Active Node 2B_DISC x%x "
|
||||
"Data:x%x x%x x%x\n",
|
||||
"Data:x%x x%x x%lx\n",
|
||||
ndlp->nlp_DID, ndlp->nlp_flag,
|
||||
ndlp->nlp_state, vport->fc_flag);
|
||||
|
||||
@ -5920,7 +5884,6 @@ lpfc_issue_reg_vpi(struct lpfc_hba *phba, struct lpfc_vport *vport)
|
||||
void
|
||||
lpfc_disc_start(struct lpfc_vport *vport)
|
||||
{
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
struct lpfc_hba *phba = vport->phba;
|
||||
uint32_t num_sent;
|
||||
uint32_t clear_la_pending;
|
||||
@ -5948,7 +5911,7 @@ lpfc_disc_start(struct lpfc_vport *vport)
|
||||
/* Start Discovery state <hba_state> */
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"0202 Start Discovery port state x%x "
|
||||
"flg x%x Data: x%x x%x x%x\n",
|
||||
"flg x%lx Data: x%x x%x x%x\n",
|
||||
vport->port_state, vport->fc_flag,
|
||||
atomic_read(&vport->fc_plogi_cnt),
|
||||
atomic_read(&vport->fc_adisc_cnt),
|
||||
@ -5962,8 +5925,8 @@ lpfc_disc_start(struct lpfc_vport *vport)
|
||||
|
||||
/* Register the VPI for SLI3, NPIV only. */
|
||||
if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) &&
|
||||
!(vport->fc_flag & FC_PT2PT) &&
|
||||
!(vport->fc_flag & FC_RSCN_MODE) &&
|
||||
!test_bit(FC_PT2PT, &vport->fc_flag) &&
|
||||
!test_bit(FC_RSCN_MODE, &vport->fc_flag) &&
|
||||
(phba->sli_rev < LPFC_SLI_REV4)) {
|
||||
lpfc_issue_clear_la(phba, vport);
|
||||
lpfc_issue_reg_vpi(phba, vport);
|
||||
@ -5978,16 +5941,14 @@ lpfc_disc_start(struct lpfc_vport *vport)
|
||||
/* If we get here, there is nothing to ADISC */
|
||||
lpfc_issue_clear_la(phba, vport);
|
||||
|
||||
if (!(vport->fc_flag & FC_ABORT_DISCOVERY)) {
|
||||
if (!test_bit(FC_ABORT_DISCOVERY, &vport->fc_flag)) {
|
||||
vport->num_disc_nodes = 0;
|
||||
/* go thru NPR nodes and issue ELS PLOGIs */
|
||||
if (atomic_read(&vport->fc_npr_cnt))
|
||||
lpfc_els_disc_plogi(vport);
|
||||
|
||||
if (!vport->num_disc_nodes) {
|
||||
spin_lock_irq(shost->host_lock);
|
||||
vport->fc_flag &= ~FC_NDISC_ACTIVE;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
clear_bit(FC_NDISC_ACTIVE, &vport->fc_flag);
|
||||
lpfc_can_disctmo(vport);
|
||||
}
|
||||
}
|
||||
@ -5999,18 +5960,17 @@ lpfc_disc_start(struct lpfc_vport *vport)
|
||||
if (num_sent)
|
||||
return;
|
||||
|
||||
if (vport->fc_flag & FC_RSCN_MODE) {
|
||||
if (test_bit(FC_RSCN_MODE, &vport->fc_flag)) {
|
||||
/* Check to see if more RSCNs came in while we
|
||||
* were processing this one.
|
||||
*/
|
||||
if ((vport->fc_rscn_id_cnt == 0) &&
|
||||
(!(vport->fc_flag & FC_RSCN_DISCOVERY))) {
|
||||
spin_lock_irq(shost->host_lock);
|
||||
vport->fc_flag &= ~FC_RSCN_MODE;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
if (vport->fc_rscn_id_cnt == 0 &&
|
||||
!test_bit(FC_RSCN_DISCOVERY, &vport->fc_flag)) {
|
||||
clear_bit(FC_RSCN_MODE, &vport->fc_flag);
|
||||
lpfc_can_disctmo(vport);
|
||||
} else
|
||||
} else {
|
||||
lpfc_els_handle_rscn(vport);
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
@ -6159,20 +6119,15 @@ lpfc_disc_timeout(struct timer_list *t)
|
||||
static void
|
||||
lpfc_disc_timeout_handler(struct lpfc_vport *vport)
|
||||
{
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
struct lpfc_hba *phba = vport->phba;
|
||||
struct lpfc_sli *psli = &phba->sli;
|
||||
struct lpfc_nodelist *ndlp, *next_ndlp;
|
||||
LPFC_MBOXQ_t *initlinkmbox;
|
||||
int rc, clrlaerr = 0;
|
||||
|
||||
if (!(vport->fc_flag & FC_DISC_TMO))
|
||||
if (!test_and_clear_bit(FC_DISC_TMO, &vport->fc_flag))
|
||||
return;
|
||||
|
||||
spin_lock_irq(shost->host_lock);
|
||||
vport->fc_flag &= ~FC_DISC_TMO;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
|
||||
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
|
||||
"disc timeout: state:x%x rtry:x%x flg:x%x",
|
||||
vport->port_state, vport->fc_ns_retry, vport->fc_flag);
|
||||
@ -6326,7 +6281,7 @@ restart_disc:
|
||||
break;
|
||||
|
||||
case LPFC_VPORT_READY:
|
||||
if (vport->fc_flag & FC_RSCN_MODE) {
|
||||
if (test_bit(FC_RSCN_MODE, &vport->fc_flag)) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR,
|
||||
LOG_TRACE_EVENT,
|
||||
"0231 RSCN timeout Data: x%x "
|
||||
@ -6758,7 +6713,7 @@ lpfc_fcf_inuse(struct lpfc_hba *phba)
|
||||
* If dev_loss fires while we are waiting we do not want to
|
||||
* unreg the fcf.
|
||||
*/
|
||||
if (!(vports[i]->fc_flag & FC_VPORT_CVL_RCVD)) {
|
||||
if (!test_bit(FC_VPORT_CVL_RCVD, &vports[i]->fc_flag)) {
|
||||
ret = 1;
|
||||
goto out;
|
||||
}
|
||||
@ -6798,7 +6753,6 @@ void
|
||||
lpfc_unregister_vfi_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
|
||||
{
|
||||
struct lpfc_vport *vport = mboxq->vport;
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
|
||||
if (mboxq->u.mb.mbxStatus) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
@ -6806,9 +6760,7 @@ lpfc_unregister_vfi_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
|
||||
"HBA state x%x\n",
|
||||
mboxq->u.mb.mbxStatus, vport->port_state);
|
||||
}
|
||||
spin_lock_irq(shost->host_lock);
|
||||
phba->pport->fc_flag &= ~FC_VFI_REGISTERED;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
clear_bit(FC_VFI_REGISTERED, &phba->pport->fc_flag);
|
||||
mempool_free(mboxq, phba->mbox_mem_pool);
|
||||
return;
|
||||
}
|
||||
@ -6872,9 +6824,9 @@ lpfc_unregister_fcf_prep(struct lpfc_hba *phba)
|
||||
lpfc_mbx_unreg_vpi(vports[i]);
|
||||
shost = lpfc_shost_from_vport(vports[i]);
|
||||
spin_lock_irq(shost->host_lock);
|
||||
vports[i]->fc_flag |= FC_VPORT_NEEDS_INIT_VPI;
|
||||
vports[i]->vpi_state &= ~LPFC_VPI_REGISTERED;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
set_bit(FC_VPORT_NEEDS_INIT_VPI, &vports[i]->fc_flag);
|
||||
}
|
||||
lpfc_destroy_vport_work_array(phba, vports);
|
||||
if (i == 0 && (!(phba->sli3_options & LPFC_SLI3_NPIV_ENABLED))) {
|
||||
@ -6887,9 +6839,9 @@ lpfc_unregister_fcf_prep(struct lpfc_hba *phba)
|
||||
lpfc_mbx_unreg_vpi(phba->pport);
|
||||
shost = lpfc_shost_from_vport(phba->pport);
|
||||
spin_lock_irq(shost->host_lock);
|
||||
phba->pport->fc_flag |= FC_VPORT_NEEDS_INIT_VPI;
|
||||
phba->pport->vpi_state &= ~LPFC_VPI_REGISTERED;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
set_bit(FC_VPORT_NEEDS_INIT_VPI, &phba->pport->fc_flag);
|
||||
}
|
||||
|
||||
/* Cleanup any outstanding ELS commands */
|
||||
|
@ -1269,9 +1269,9 @@ lpfc_hb_mbox_cmpl(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmboxq)
|
||||
|
||||
/* Check and reset heart-beat timer if necessary */
|
||||
mempool_free(pmboxq, phba->mbox_mem_pool);
|
||||
if (!(phba->pport->fc_flag & FC_OFFLINE_MODE) &&
|
||||
!(phba->link_state == LPFC_HBA_ERROR) &&
|
||||
!(phba->pport->load_flag & FC_UNLOADING))
|
||||
if (!test_bit(FC_OFFLINE_MODE, &phba->pport->fc_flag) &&
|
||||
!(phba->link_state == LPFC_HBA_ERROR) &&
|
||||
!(phba->pport->load_flag & FC_UNLOADING))
|
||||
mod_timer(&phba->hb_tmofunc,
|
||||
jiffies +
|
||||
msecs_to_jiffies(1000 * LPFC_HB_MBOX_INTERVAL));
|
||||
@ -1302,7 +1302,7 @@ lpfc_idle_stat_delay_work(struct work_struct *work)
|
||||
return;
|
||||
|
||||
if (phba->link_state == LPFC_HBA_ERROR ||
|
||||
phba->pport->fc_flag & FC_OFFLINE_MODE ||
|
||||
test_bit(FC_OFFLINE_MODE, &phba->pport->fc_flag) ||
|
||||
phba->cmf_active_mode != LPFC_CFG_OFF)
|
||||
goto requeue;
|
||||
|
||||
@ -1363,7 +1363,7 @@ lpfc_hb_eq_delay_work(struct work_struct *work)
|
||||
return;
|
||||
|
||||
if (phba->link_state == LPFC_HBA_ERROR ||
|
||||
phba->pport->fc_flag & FC_OFFLINE_MODE)
|
||||
test_bit(FC_OFFLINE_MODE, &phba->pport->fc_flag))
|
||||
goto requeue;
|
||||
|
||||
ena_delay = kcalloc(phba->sli4_hba.num_possible_cpu, sizeof(*ena_delay),
|
||||
@ -1536,7 +1536,7 @@ lpfc_hb_timeout_handler(struct lpfc_hba *phba)
|
||||
|
||||
if ((phba->link_state == LPFC_HBA_ERROR) ||
|
||||
(phba->pport->load_flag & FC_UNLOADING) ||
|
||||
(phba->pport->fc_flag & FC_OFFLINE_MODE))
|
||||
test_bit(FC_OFFLINE_MODE, &phba->pport->fc_flag))
|
||||
return;
|
||||
|
||||
if (phba->elsbuf_cnt &&
|
||||
@ -3698,7 +3698,7 @@ lpfc_online(struct lpfc_hba *phba)
|
||||
return 0;
|
||||
vport = phba->pport;
|
||||
|
||||
if (!(vport->fc_flag & FC_OFFLINE_MODE))
|
||||
if (!test_bit(FC_OFFLINE_MODE, &vport->fc_flag))
|
||||
return 0;
|
||||
|
||||
lpfc_printf_log(phba, KERN_WARNING, LOG_INIT,
|
||||
@ -3738,20 +3738,18 @@ lpfc_online(struct lpfc_hba *phba)
|
||||
vports = lpfc_create_vport_work_array(phba);
|
||||
if (vports != NULL) {
|
||||
for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) {
|
||||
struct Scsi_Host *shost;
|
||||
shost = lpfc_shost_from_vport(vports[i]);
|
||||
spin_lock_irq(shost->host_lock);
|
||||
vports[i]->fc_flag &= ~FC_OFFLINE_MODE;
|
||||
clear_bit(FC_OFFLINE_MODE, &vports[i]->fc_flag);
|
||||
if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED)
|
||||
vports[i]->fc_flag |= FC_VPORT_NEEDS_REG_VPI;
|
||||
set_bit(FC_VPORT_NEEDS_REG_VPI,
|
||||
&vports[i]->fc_flag);
|
||||
if (phba->sli_rev == LPFC_SLI_REV4) {
|
||||
vports[i]->fc_flag |= FC_VPORT_NEEDS_INIT_VPI;
|
||||
set_bit(FC_VPORT_NEEDS_INIT_VPI,
|
||||
&vports[i]->fc_flag);
|
||||
if ((vpis_cleared) &&
|
||||
(vports[i]->port_type !=
|
||||
LPFC_PHYSICAL_PORT))
|
||||
vports[i]->vpi = 0;
|
||||
}
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
}
|
||||
}
|
||||
lpfc_destroy_vport_work_array(phba, vports);
|
||||
@ -3806,7 +3804,7 @@ lpfc_offline_prep(struct lpfc_hba *phba, int mbx_action)
|
||||
int offline;
|
||||
bool hba_pci_err;
|
||||
|
||||
if (vport->fc_flag & FC_OFFLINE_MODE)
|
||||
if (test_bit(FC_OFFLINE_MODE, &vport->fc_flag))
|
||||
return;
|
||||
|
||||
lpfc_block_mgmt_io(phba, mbx_action);
|
||||
@ -3825,9 +3823,9 @@ lpfc_offline_prep(struct lpfc_hba *phba, int mbx_action)
|
||||
shost = lpfc_shost_from_vport(vports[i]);
|
||||
spin_lock_irq(shost->host_lock);
|
||||
vports[i]->vpi_state &= ~LPFC_VPI_REGISTERED;
|
||||
vports[i]->fc_flag |= FC_VPORT_NEEDS_REG_VPI;
|
||||
vports[i]->fc_flag &= ~FC_VFI_REGISTERED;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
set_bit(FC_VPORT_NEEDS_REG_VPI, &vports[i]->fc_flag);
|
||||
clear_bit(FC_VFI_REGISTERED, &vports[i]->fc_flag);
|
||||
|
||||
list_for_each_entry_safe(ndlp, next_ndlp,
|
||||
&vports[i]->fc_nodes,
|
||||
@ -3910,7 +3908,7 @@ lpfc_offline(struct lpfc_hba *phba)
|
||||
struct lpfc_vport **vports;
|
||||
int i;
|
||||
|
||||
if (phba->pport->fc_flag & FC_OFFLINE_MODE)
|
||||
if (test_bit(FC_OFFLINE_MODE, &phba->pport->fc_flag))
|
||||
return;
|
||||
|
||||
/* stop port and all timers associated with this hba */
|
||||
@ -3941,14 +3939,14 @@ lpfc_offline(struct lpfc_hba *phba)
|
||||
shost = lpfc_shost_from_vport(vports[i]);
|
||||
spin_lock_irq(shost->host_lock);
|
||||
vports[i]->work_port_events = 0;
|
||||
vports[i]->fc_flag |= FC_OFFLINE_MODE;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
set_bit(FC_OFFLINE_MODE, &vports[i]->fc_flag);
|
||||
}
|
||||
lpfc_destroy_vport_work_array(phba, vports);
|
||||
/* If OFFLINE flag is clear (i.e. unloading), cpuhp removal is handled
|
||||
* in hba_unset
|
||||
*/
|
||||
if (phba->pport->fc_flag & FC_OFFLINE_MODE)
|
||||
if (test_bit(FC_OFFLINE_MODE, &phba->pport->fc_flag))
|
||||
__lpfc_cpuhp_remove(phba);
|
||||
|
||||
if (phba->cfg_xri_rebalancing)
|
||||
@ -4767,7 +4765,7 @@ lpfc_create_port(struct lpfc_hba *phba, int instance, struct device *dev)
|
||||
vport = (struct lpfc_vport *) shost->hostdata;
|
||||
vport->phba = phba;
|
||||
vport->load_flag |= FC_LOADING;
|
||||
vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI;
|
||||
set_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag);
|
||||
vport->fc_rscn_flush = 0;
|
||||
atomic_set(&vport->fc_plogi_cnt, 0);
|
||||
atomic_set(&vport->fc_adisc_cnt, 0);
|
||||
@ -6704,9 +6702,7 @@ lpfc_sli4_perform_vport_cvl(struct lpfc_vport *vport)
|
||||
return NULL;
|
||||
lpfc_linkdown_port(vport);
|
||||
lpfc_cleanup_pending_mbox(vport);
|
||||
spin_lock_irq(shost->host_lock);
|
||||
vport->fc_flag |= FC_VPORT_CVL_RCVD;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
set_bit(FC_VPORT_CVL_RCVD, &vport->fc_flag);
|
||||
|
||||
return ndlp;
|
||||
}
|
||||
@ -6903,9 +6899,9 @@ lpfc_sli4_async_fip_evt(struct lpfc_hba *phba,
|
||||
if (vports) {
|
||||
for (i = 0; i <= phba->max_vports && vports[i] != NULL;
|
||||
i++) {
|
||||
if ((!(vports[i]->fc_flag &
|
||||
FC_VPORT_CVL_RCVD)) &&
|
||||
(vports[i]->port_state > LPFC_FDISC)) {
|
||||
if (!test_bit(FC_VPORT_CVL_RCVD,
|
||||
&vports[i]->fc_flag) &&
|
||||
vports[i]->port_state > LPFC_FDISC) {
|
||||
active_vlink_present = 1;
|
||||
break;
|
||||
}
|
||||
@ -12783,7 +12779,8 @@ static void __lpfc_cpuhp_remove(struct lpfc_hba *phba)
|
||||
|
||||
static void lpfc_cpuhp_remove(struct lpfc_hba *phba)
|
||||
{
|
||||
if (phba->pport && (phba->pport->fc_flag & FC_OFFLINE_MODE))
|
||||
if (phba->pport &&
|
||||
test_bit(FC_OFFLINE_MODE, &phba->pport->fc_flag))
|
||||
return;
|
||||
|
||||
__lpfc_cpuhp_remove(phba);
|
||||
|
@ -949,7 +949,7 @@ lpfc_reg_vpi(struct lpfc_vport *vport, LPFC_MBOXQ_t *pmb)
|
||||
* Set the re-reg VPI bit for f/w to update the MAC address.
|
||||
*/
|
||||
if ((phba->sli_rev == LPFC_SLI_REV4) &&
|
||||
!(vport->fc_flag & FC_VPORT_NEEDS_REG_VPI))
|
||||
!test_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag))
|
||||
mb->un.varRegVpi.upd = 1;
|
||||
|
||||
mb->un.varRegVpi.vpi = phba->vpi_ids[vport->vpi];
|
||||
@ -2244,7 +2244,7 @@ lpfc_reg_vfi(struct lpfcMboxq *mbox, struct lpfc_vport *vport, dma_addr_t phys)
|
||||
|
||||
/* Only FC supports upd bit */
|
||||
if ((phba->sli4_hba.lnk_info.lnk_tp == LPFC_LNK_TYPE_FC) &&
|
||||
(vport->fc_flag & FC_VFI_REGISTERED) &&
|
||||
test_bit(FC_VFI_REGISTERED, &vport->fc_flag) &&
|
||||
(!phba->fc_topology_changed))
|
||||
bf_set(lpfc_reg_vfi_upd, reg_vfi, 1);
|
||||
|
||||
@ -2271,8 +2271,8 @@ lpfc_reg_vfi(struct lpfcMboxq *mbox, struct lpfc_vport *vport, dma_addr_t phys)
|
||||
}
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_MBOX,
|
||||
"3134 Register VFI, mydid:x%x, fcfi:%d, "
|
||||
" vfi:%d, vpi:%d, fc_pname:%x%x fc_flag:x%x"
|
||||
" port_state:x%x topology chg:%d bbscn_fabric :%d\n",
|
||||
"vfi:%d, vpi:%d, fc_pname:%x%x fc_flag:x%lx "
|
||||
"port_state:x%x topology chg:%d bbscn_fabric :%d\n",
|
||||
vport->fc_myDID,
|
||||
phba->fcf.fcfi,
|
||||
phba->sli4_hba.vfi_ids[vport->vfi],
|
||||
|
@ -382,7 +382,7 @@ lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
/* PLOGI chkparm OK */
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
|
||||
"0114 PLOGI chkparm OK Data: x%x x%x x%x "
|
||||
"x%x x%x x%x\n",
|
||||
"x%x x%x x%lx\n",
|
||||
ndlp->nlp_DID, ndlp->nlp_state, ndlp->nlp_flag,
|
||||
ndlp->nlp_rpi, vport->port_state,
|
||||
vport->fc_flag);
|
||||
@ -464,8 +464,8 @@ lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
save_iocb = NULL;
|
||||
|
||||
/* Check for Nport to NPort pt2pt protocol */
|
||||
if ((vport->fc_flag & FC_PT2PT) &&
|
||||
!(vport->fc_flag & FC_PT2PT_PLOGI)) {
|
||||
if (test_bit(FC_PT2PT, &vport->fc_flag) &&
|
||||
!test_bit(FC_PT2PT_PLOGI, &vport->fc_flag)) {
|
||||
/* rcv'ed PLOGI decides what our NPortId will be */
|
||||
if (phba->sli_rev == LPFC_SLI_REV4) {
|
||||
vport->fc_myDID = bf_get(els_rsp64_sid,
|
||||
@ -580,7 +580,7 @@ lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
* This only applies to a fabric environment.
|
||||
*/
|
||||
if ((ndlp->nlp_state == NLP_STE_PLOGI_ISSUE) &&
|
||||
(vport->fc_flag & FC_FABRIC)) {
|
||||
test_bit(FC_FABRIC, &vport->fc_flag)) {
|
||||
/* software abort outstanding PLOGI */
|
||||
lpfc_els_abort(phba, ndlp);
|
||||
}
|
||||
@ -804,7 +804,6 @@ static int
|
||||
lpfc_rcv_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
struct lpfc_iocbq *cmdiocb, uint32_t els_cmd)
|
||||
{
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
struct lpfc_hba *phba = vport->phba;
|
||||
struct lpfc_vport **vports;
|
||||
int i, active_vlink_present = 0 ;
|
||||
@ -837,19 +836,17 @@ lpfc_rcv_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
|
||||
if (ndlp->nlp_DID == Fabric_DID) {
|
||||
if (vport->port_state <= LPFC_FDISC ||
|
||||
vport->fc_flag & FC_PT2PT)
|
||||
test_bit(FC_PT2PT, &vport->fc_flag))
|
||||
goto out;
|
||||
lpfc_linkdown_port(vport);
|
||||
spin_lock_irq(shost->host_lock);
|
||||
vport->fc_flag |= FC_VPORT_LOGO_RCVD;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
set_bit(FC_VPORT_LOGO_RCVD, &vport->fc_flag);
|
||||
vports = lpfc_create_vport_work_array(phba);
|
||||
if (vports) {
|
||||
for (i = 0; i <= phba->max_vports && vports[i] != NULL;
|
||||
i++) {
|
||||
if ((!(vports[i]->fc_flag &
|
||||
FC_VPORT_LOGO_RCVD)) &&
|
||||
(vports[i]->port_state > LPFC_FDISC)) {
|
||||
if (!test_bit(FC_VPORT_LOGO_RCVD,
|
||||
&vports[i]->fc_flag) &&
|
||||
vports[i]->port_state > LPFC_FDISC) {
|
||||
active_vlink_present = 1;
|
||||
break;
|
||||
}
|
||||
@ -876,23 +873,21 @@ lpfc_rcv_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
ndlp->nlp_last_elscmd = ELS_CMD_FDISC;
|
||||
vport->port_state = LPFC_FDISC;
|
||||
} else {
|
||||
spin_lock_irq(shost->host_lock);
|
||||
phba->pport->fc_flag &= ~FC_LOGO_RCVD_DID_CHNG;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
clear_bit(FC_LOGO_RCVD_DID_CHNG, &phba->pport->fc_flag);
|
||||
lpfc_retry_pport_discovery(phba);
|
||||
}
|
||||
} else {
|
||||
lpfc_printf_vlog(vport, KERN_INFO,
|
||||
LOG_NODE | LOG_ELS | LOG_DISCOVERY,
|
||||
"3203 LOGO recover nport x%06x state x%x "
|
||||
"ntype x%x fc_flag x%x\n",
|
||||
"ntype x%x fc_flag x%lx\n",
|
||||
ndlp->nlp_DID, ndlp->nlp_state,
|
||||
ndlp->nlp_type, vport->fc_flag);
|
||||
|
||||
/* Special cases for rports that recover post LOGO. */
|
||||
if ((!(ndlp->nlp_type == NLP_FABRIC) &&
|
||||
(ndlp->nlp_type & (NLP_FCP_TARGET | NLP_NVME_TARGET) ||
|
||||
vport->fc_flag & FC_PT2PT)) ||
|
||||
test_bit(FC_PT2PT, &vport->fc_flag))) ||
|
||||
(ndlp->nlp_state >= NLP_STE_ADISC_ISSUE ||
|
||||
ndlp->nlp_state <= NLP_STE_PRLI_ISSUE)) {
|
||||
mod_timer(&ndlp->nlp_delayfunc,
|
||||
@ -1057,9 +1052,10 @@ lpfc_disc_set_adisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!(vport->fc_flag & FC_PT2PT)) {
|
||||
if (!test_bit(FC_PT2PT, &vport->fc_flag)) {
|
||||
/* Check config parameter use-adisc or FCP-2 */
|
||||
if (vport->cfg_use_adisc && ((vport->fc_flag & FC_RSCN_MODE) ||
|
||||
if (vport->cfg_use_adisc &&
|
||||
(test_bit(FC_RSCN_MODE, &vport->fc_flag) ||
|
||||
((ndlp->nlp_fcp_info & NLP_FCP_2_DEVICE) &&
|
||||
(ndlp->nlp_type & NLP_FCP_TARGET)))) {
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
@ -1123,7 +1119,7 @@ lpfc_release_rpi(struct lpfc_hba *phba, struct lpfc_vport *vport,
|
||||
}
|
||||
|
||||
if (((ndlp->nlp_DID & Fabric_DID_MASK) != Fabric_DID_MASK) &&
|
||||
(!(vport->fc_flag & FC_OFFLINE_MODE)))
|
||||
(!test_bit(FC_OFFLINE_MODE, &vport->fc_flag)))
|
||||
ndlp->nlp_flag |= NLP_UNREG_INP;
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
@ -1246,7 +1242,6 @@ static uint32_t
|
||||
lpfc_rcv_plogi_plogi_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
void *arg, uint32_t evt)
|
||||
{
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
struct lpfc_hba *phba = vport->phba;
|
||||
struct lpfc_iocbq *cmdiocb = arg;
|
||||
struct lpfc_dmabuf *pcmd = cmdiocb->cmd_dmabuf;
|
||||
@ -1281,9 +1276,7 @@ lpfc_rcv_plogi_plogi_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
/* Check if there are more PLOGIs to be sent */
|
||||
lpfc_more_plogi(vport);
|
||||
if (vport->num_disc_nodes == 0) {
|
||||
spin_lock_irq(shost->host_lock);
|
||||
vport->fc_flag &= ~FC_NDISC_ACTIVE;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
clear_bit(FC_NDISC_ACTIVE, &vport->fc_flag);
|
||||
lpfc_can_disctmo(vport);
|
||||
lpfc_end_rscn(vport);
|
||||
}
|
||||
@ -1423,8 +1416,8 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport,
|
||||
ndlp->nlp_maxframe =
|
||||
((sp->cmn.bbRcvSizeMsb & 0x0F) << 8) | sp->cmn.bbRcvSizeLsb;
|
||||
|
||||
if ((vport->fc_flag & FC_PT2PT) &&
|
||||
(vport->fc_flag & FC_PT2PT_PLOGI)) {
|
||||
if (test_bit(FC_PT2PT, &vport->fc_flag) &&
|
||||
test_bit(FC_PT2PT_PLOGI, &vport->fc_flag)) {
|
||||
ed_tov = be32_to_cpu(sp->cmn.e_d_tov);
|
||||
if (sp->cmn.edtovResolution) {
|
||||
/* E_D_TOV ticks are in nanoseconds */
|
||||
@ -1615,7 +1608,7 @@ lpfc_device_recov_plogi_issue(struct lpfc_vport *vport,
|
||||
/* Don't do anything that will mess up processing of the
|
||||
* previous RSCN.
|
||||
*/
|
||||
if (vport->fc_flag & FC_RSCN_DEFERRED)
|
||||
if (test_bit(FC_RSCN_DEFERRED, &vport->fc_flag))
|
||||
return ndlp->nlp_state;
|
||||
|
||||
/* software abort outstanding PLOGI */
|
||||
@ -1801,7 +1794,7 @@ lpfc_device_recov_adisc_issue(struct lpfc_vport *vport,
|
||||
/* Don't do anything that will mess up processing of the
|
||||
* previous RSCN.
|
||||
*/
|
||||
if (vport->fc_flag & FC_RSCN_DEFERRED)
|
||||
if (test_bit(FC_RSCN_DEFERRED, &vport->fc_flag))
|
||||
return ndlp->nlp_state;
|
||||
|
||||
/* software abort outstanding ADISC */
|
||||
@ -1991,13 +1984,13 @@ lpfc_cmpl_reglogin_reglogin_issue(struct lpfc_vport *vport,
|
||||
* know what PRLI to send yet. Figure that out now and
|
||||
* call PRLI depending on the outcome.
|
||||
*/
|
||||
if (vport->fc_flag & FC_PT2PT) {
|
||||
if (test_bit(FC_PT2PT, &vport->fc_flag)) {
|
||||
/* If we are pt2pt, there is no Fabric to determine
|
||||
* the FC4 type of the remote nport. So if NVME
|
||||
* is configured try it.
|
||||
*/
|
||||
ndlp->nlp_fc4_type |= NLP_FC4_FCP;
|
||||
if ((!(vport->fc_flag & FC_PT2PT_NO_NVME)) &&
|
||||
if ((!test_bit(FC_PT2PT_NO_NVME, &vport->fc_flag)) &&
|
||||
(vport->cfg_enable_fc4_type == LPFC_ENABLE_BOTH ||
|
||||
vport->cfg_enable_fc4_type == LPFC_ENABLE_NVME)) {
|
||||
ndlp->nlp_fc4_type |= NLP_FC4_NVME;
|
||||
@ -2029,7 +2022,7 @@ lpfc_cmpl_reglogin_reglogin_issue(struct lpfc_vport *vport,
|
||||
lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
|
||||
}
|
||||
} else {
|
||||
if ((vport->fc_flag & FC_PT2PT) && phba->nvmet_support)
|
||||
if (test_bit(FC_PT2PT, &vport->fc_flag) && phba->nvmet_support)
|
||||
phba->targetport->port_id = vport->fc_myDID;
|
||||
|
||||
/* Only Fabric ports should transition. NVME target
|
||||
@ -2070,7 +2063,7 @@ lpfc_device_recov_reglogin_issue(struct lpfc_vport *vport,
|
||||
/* Don't do anything that will mess up processing of the
|
||||
* previous RSCN.
|
||||
*/
|
||||
if (vport->fc_flag & FC_RSCN_DEFERRED)
|
||||
if (test_bit(FC_RSCN_DEFERRED, &vport->fc_flag))
|
||||
return ndlp->nlp_state;
|
||||
|
||||
ndlp->nlp_prev_state = NLP_STE_REG_LOGIN_ISSUE;
|
||||
@ -2386,7 +2379,7 @@ lpfc_device_recov_prli_issue(struct lpfc_vport *vport,
|
||||
/* Don't do anything that will mess up processing of the
|
||||
* previous RSCN.
|
||||
*/
|
||||
if (vport->fc_flag & FC_RSCN_DEFERRED)
|
||||
if (test_bit(FC_RSCN_DEFERRED, &vport->fc_flag))
|
||||
return ndlp->nlp_state;
|
||||
|
||||
/* software abort outstanding PRLI */
|
||||
@ -2830,13 +2823,10 @@ static uint32_t
|
||||
lpfc_cmpl_logo_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
void *arg, uint32_t evt)
|
||||
{
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
|
||||
/* For the fabric port just clear the fc flags. */
|
||||
if (ndlp->nlp_DID == Fabric_DID) {
|
||||
spin_lock_irq(shost->host_lock);
|
||||
vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP);
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
clear_bit(FC_FABRIC, &vport->fc_flag);
|
||||
clear_bit(FC_PUBLIC_LOOP, &vport->fc_flag);
|
||||
}
|
||||
lpfc_unreg_rpi(vport, ndlp);
|
||||
return ndlp->nlp_state;
|
||||
@ -2908,7 +2898,7 @@ lpfc_device_recov_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
/* Don't do anything that will mess up processing of the
|
||||
* previous RSCN.
|
||||
*/
|
||||
if (vport->fc_flag & FC_RSCN_DEFERRED)
|
||||
if (test_bit(FC_RSCN_DEFERRED, &vport->fc_flag))
|
||||
return ndlp->nlp_state;
|
||||
|
||||
lpfc_cancel_retry_delay_tmo(vport, ndlp);
|
||||
|
@ -2909,8 +2909,8 @@ lpfc_sli_def_mbox_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
shost = lpfc_shost_from_vport(vport);
|
||||
spin_lock_irq(shost->host_lock);
|
||||
vport->vpi_state |= LPFC_VPI_REGISTERED;
|
||||
vport->fc_flag &= ~FC_VPORT_NEEDS_REG_VPI;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
clear_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag);
|
||||
}
|
||||
|
||||
if (pmb->u.mb.mbxCommand == MBX_REG_LOGIN64) {
|
||||
@ -10888,7 +10888,7 @@ __lpfc_sli_prep_els_req_rsp_s4(struct lpfc_iocbq *cmdiocbq,
|
||||
* all ELS pt2pt protocol traffic as well.
|
||||
*/
|
||||
if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) ||
|
||||
(vport->fc_flag & FC_PT2PT)) {
|
||||
test_bit(FC_PT2PT, &vport->fc_flag)) {
|
||||
if (expect_rsp) {
|
||||
bf_set(els_req64_sid, &wqe->els_req, vport->fc_myDID);
|
||||
|
||||
@ -18552,8 +18552,8 @@ lpfc_fc_frame_to_vport(struct lpfc_hba *phba, struct fc_frame_header *fc_hdr,
|
||||
|
||||
if (did == Fabric_DID)
|
||||
return phba->pport;
|
||||
if ((phba->pport->fc_flag & FC_PT2PT) &&
|
||||
!(phba->link_state == LPFC_HBA_READY))
|
||||
if (test_bit(FC_PT2PT, &phba->pport->fc_flag) &&
|
||||
phba->link_state != LPFC_HBA_READY)
|
||||
return phba->pport;
|
||||
|
||||
vports = lpfc_create_vport_work_array(phba);
|
||||
@ -19507,8 +19507,8 @@ lpfc_sli4_handle_received_buffer(struct lpfc_hba *phba,
|
||||
* The pt2pt protocol allows for discovery frames
|
||||
* to be received without a registered VPI.
|
||||
*/
|
||||
if (!(vport->fc_flag & FC_PT2PT) ||
|
||||
(phba->link_state == LPFC_HBA_READY)) {
|
||||
if (!test_bit(FC_PT2PT, &vport->fc_flag) ||
|
||||
phba->link_state == LPFC_HBA_READY) {
|
||||
lpfc_in_buf_free(phba, &dmabuf->dbuf);
|
||||
return;
|
||||
}
|
||||
@ -22666,7 +22666,7 @@ lpfc_sli_prep_wqe(struct lpfc_hba *phba, struct lpfc_iocbq *job)
|
||||
if_type = bf_get(lpfc_sli_intf_if_type,
|
||||
&phba->sli4_hba.sli_intf);
|
||||
if (if_type >= LPFC_SLI_INTF_IF_TYPE_2) {
|
||||
if (job->vport->fc_flag & FC_PT2PT) {
|
||||
if (test_bit(FC_PT2PT, &job->vport->fc_flag)) {
|
||||
bf_set(els_rsp64_sp, &wqe->xmit_els_rsp, 1);
|
||||
bf_set(els_rsp64_sid, &wqe->xmit_els_rsp,
|
||||
job->vport->fc_myDID);
|
||||
|
@ -238,13 +238,9 @@ lpfc_unique_wwpn(struct lpfc_hba *phba, struct lpfc_vport *new_vport)
|
||||
static void lpfc_discovery_wait(struct lpfc_vport *vport)
|
||||
{
|
||||
struct lpfc_hba *phba = vport->phba;
|
||||
uint32_t wait_flags = 0;
|
||||
unsigned long wait_time_max;
|
||||
unsigned long start_time;
|
||||
|
||||
wait_flags = FC_RSCN_MODE | FC_RSCN_DISCOVERY | FC_NLP_MORE |
|
||||
FC_RSCN_DEFERRED | FC_NDISC_ACTIVE | FC_DISC_TMO;
|
||||
|
||||
/*
|
||||
* The time constraint on this loop is a balance between the
|
||||
* fabric RA_TOV value and dev_loss tmo. The driver's
|
||||
@ -255,14 +251,19 @@ static void lpfc_discovery_wait(struct lpfc_vport *vport)
|
||||
start_time = jiffies;
|
||||
while (time_before(jiffies, wait_time_max)) {
|
||||
if ((vport->num_disc_nodes > 0) ||
|
||||
(vport->fc_flag & wait_flags) ||
|
||||
test_bit(FC_RSCN_MODE, &vport->fc_flag) ||
|
||||
test_bit(FC_RSCN_DISCOVERY, &vport->fc_flag) ||
|
||||
test_bit(FC_NLP_MORE, &vport->fc_flag) ||
|
||||
test_bit(FC_RSCN_DEFERRED, &vport->fc_flag) ||
|
||||
test_bit(FC_NDISC_ACTIVE, &vport->fc_flag) ||
|
||||
test_bit(FC_DISC_TMO, &vport->fc_flag) ||
|
||||
((vport->port_state > LPFC_VPORT_FAILED) &&
|
||||
(vport->port_state < LPFC_VPORT_READY))) {
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_VPORT,
|
||||
"1833 Vport discovery quiesce Wait:"
|
||||
" state x%x fc_flags x%x"
|
||||
" num_nodes x%x, waiting 1000 msecs"
|
||||
" total wait msecs x%x\n",
|
||||
"1833 Vport discovery quiesce Wait: "
|
||||
"state x%x fc_flags x%lx "
|
||||
"num_nodes x%x, waiting 1000 msecs "
|
||||
"total wait msecs x%x\n",
|
||||
vport->port_state, vport->fc_flag,
|
||||
vport->num_disc_nodes,
|
||||
jiffies_to_msecs(jiffies - start_time));
|
||||
@ -270,9 +271,9 @@ static void lpfc_discovery_wait(struct lpfc_vport *vport)
|
||||
} else {
|
||||
/* Base case. Wait variants satisfied. Break out */
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_VPORT,
|
||||
"1834 Vport discovery quiesced:"
|
||||
" state x%x fc_flags x%x"
|
||||
" wait msecs x%x\n",
|
||||
"1834 Vport discovery quiesced: "
|
||||
"state x%x fc_flags x%lx "
|
||||
"wait msecs x%x\n",
|
||||
vport->port_state, vport->fc_flag,
|
||||
jiffies_to_msecs(jiffies
|
||||
- start_time));
|
||||
@ -283,7 +284,7 @@ static void lpfc_discovery_wait(struct lpfc_vport *vport)
|
||||
if (time_after(jiffies, wait_time_max))
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"1835 Vport discovery quiesce failed:"
|
||||
" state x%x fc_flags x%x wait msecs x%x\n",
|
||||
" state x%x fc_flags x%lx wait msecs x%x\n",
|
||||
vport->port_state, vport->fc_flag,
|
||||
jiffies_to_msecs(jiffies - start_time));
|
||||
}
|
||||
@ -420,7 +421,7 @@ lpfc_vport_create(struct fc_vport *fc_vport, bool disable)
|
||||
* by the port.
|
||||
*/
|
||||
if ((phba->sli_rev == LPFC_SLI_REV4) &&
|
||||
(pport->fc_flag & FC_VFI_REGISTERED)) {
|
||||
test_bit(FC_VFI_REGISTERED, &pport->fc_flag)) {
|
||||
rc = lpfc_sli4_init_vpi(vport);
|
||||
if (rc) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
@ -435,7 +436,7 @@ lpfc_vport_create(struct fc_vport *fc_vport, bool disable)
|
||||
* Driver cannot INIT_VPI now. Set the flags to
|
||||
* init_vpi when reg_vfi complete.
|
||||
*/
|
||||
vport->fc_flag |= FC_VPORT_NEEDS_INIT_VPI;
|
||||
set_bit(FC_VPORT_NEEDS_INIT_VPI, &vport->fc_flag);
|
||||
lpfc_vport_set_state(vport, FC_VPORT_LINKDOWN);
|
||||
rc = VPORT_OK;
|
||||
goto out;
|
||||
@ -535,7 +536,6 @@ disable_vport(struct fc_vport *fc_vport)
|
||||
struct lpfc_vport *vport = *(struct lpfc_vport **)fc_vport->dd_data;
|
||||
struct lpfc_hba *phba = vport->phba;
|
||||
struct lpfc_nodelist *ndlp = NULL;
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
|
||||
/* Can't disable during an outstanding delete. */
|
||||
if (vport->load_flag & FC_UNLOADING)
|
||||
@ -556,11 +556,8 @@ disable_vport(struct fc_vport *fc_vport)
|
||||
* scsi_host_put() to release the vport.
|
||||
*/
|
||||
lpfc_mbx_unreg_vpi(vport);
|
||||
if (phba->sli_rev == LPFC_SLI_REV4) {
|
||||
spin_lock_irq(shost->host_lock);
|
||||
vport->fc_flag |= FC_VPORT_NEEDS_INIT_VPI;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
}
|
||||
if (phba->sli_rev == LPFC_SLI_REV4)
|
||||
set_bit(FC_VPORT_NEEDS_INIT_VPI, &vport->fc_flag);
|
||||
|
||||
lpfc_vport_set_state(vport, FC_VPORT_DISABLED);
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_VPORT,
|
||||
@ -584,14 +581,13 @@ enable_vport(struct fc_vport *fc_vport)
|
||||
|
||||
spin_lock_irq(shost->host_lock);
|
||||
vport->load_flag |= FC_LOADING;
|
||||
if (vport->fc_flag & FC_VPORT_NEEDS_INIT_VPI) {
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
if (test_bit(FC_VPORT_NEEDS_INIT_VPI, &vport->fc_flag)) {
|
||||
lpfc_issue_init_vpi(vport);
|
||||
goto out;
|
||||
}
|
||||
|
||||
vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
set_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag);
|
||||
|
||||
/* Use the Physical nodes Fabric NDLP to determine if the link is
|
||||
* up and ready to FDISC.
|
||||
|
Loading…
Reference in New Issue
Block a user