lpfc 8.3.8: BugFixes: Discovery relates changes
Subsystems (2)
PATCH 2/8 lpfc 8.3.8: BugFixes: Discovery relates changes
Discovery relates changes:
- Separated VPI_REGISTERED state of physical port into VFI_REGISTERED and VPI_REGISTERED state so that driver can unregister physical port VPI independent of VFI.
- Add code to unregister, re-init and re-register physical port VPI when physical port NportID change.
- Add code to unregister and re-register VPI of a vport when its Nport ID change.
- Add code in FDISC completion path to re-start FLOGI discovery when a FDISC complete with LOGIN_REQUIRED reason code.
- Fix a memory leak in lpfc_init_vpi_cmpl
- Add code to start a timer for vport to retry FDISC when CVL is received by a vport or physical port. If all Nports receive CVLs, then all timers are cancelled and a logical link level discovery will be started after one second.
- Flush ELS commands after killing all delayed ELS commands.
---
lpfc.h | 3 + lpfc_crtn.h | 5 ++ lpfc_els.c | 129 ++++++++++++++++++++++++++++++++++++++++++++++++++----- lpfc_hbadisc.c | 36 ++++++++++++++- lpfc_init.c | 44 +++++++++++++++++- lpfc_nportdisc.c | 2 lpfc_sli.c | 62 ++++++++++++++++++++++++++ lpfc_vport.c | 2 8 files changed, 265 insertions(+), 18 deletions(-)
drivers/scsi/lpfc/lpfc_crtn.h +5 -0
@@ -44,6 +44,8 @@ int lpfc_reg_rpi(struct lpfc_hba *, uintvoid lpfc_unreg_login (struct lpfc_hba *,uint16_t ,uint32_t ,LPFC_MBOXQ_t *);void lpfc_unreg_did (struct lpfc_hba *,uint16_t ,uint32_t ,LPFC_MBOXQ_t *);void lpfc_reg_vpi (struct lpfc_vport *,LPFC_MBOXQ_t *); +void lpfc_register_new_vport (struct lpfc_hba *,struct lpfc_vport *, +struct lpfc_nodelist *);void lpfc_unreg_vpi (struct lpfc_hba *,uint16_t ,LPFC_MBOXQ_t *);void lpfc_init_link (struct lpfc_hba *,LPFC_MBOXQ_t *,uint32_t ,uint32_t );void lpfc_request_features (struct lpfc_hba *,struct lpfcMboxq *);
@@ -52,10 +54,13 @@ struct lpfc_vport *lpfc_find_vport_by_divoid lpfc_cleanup_rcv_buffers (struct lpfc_vport *);void lpfc_rcv_seq_check_edtov (struct lpfc_vport *);void lpfc_cleanup_rpis (struct lpfc_vport *,int ); +void lpfc_cleanup_pending_mbox (struct lpfc_vport *);int lpfc_linkdown (struct lpfc_hba *);void lpfc_linkdown_port (struct lpfc_vport *);void lpfc_port_link_failure (struct lpfc_vport *);void lpfc_mbx_cmpl_read_la (struct lpfc_hba *,LPFC_MBOXQ_t *); +void lpfc_init_vpi_cmpl (struct lpfc_hba *,LPFC_MBOXQ_t *); +void lpfc_retry_pport_discovery (struct lpfc_hba *);void lpfc_mbx_cmpl_reg_login (struct lpfc_hba *,LPFC_MBOXQ_t *);void lpfc_mbx_cmpl_dflt_rpi (struct lpfc_hba *,LPFC_MBOXQ_t *);
drivers/scsi/lpfc/lpfc_els.c +118 -11
200 lines not on this page · raw message
drivers/scsi/lpfc/lpfc.h +3 -0
@@ -315,6 +315,9 @@ struct lpfc_vport {#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 */ uint32_t ct_flags;#define FC_CT_RFF_ID 0x1/* RFF_ID accepted by switch */
drivers/scsi/lpfc/lpfc_hbadisc.c +35 -1
@@ -706,6 +706,8 @@ lpfc_cleanup_rpis(struct lpfc_vport *vpovoid lpfc_port_link_failure (struct lpfc_vport *vport) { +lpfc_vport_set_state (vport,FC_VPORT_LINKDOWN ); +/* Cleanup any outstanding received buffers */ lpfc_cleanup_rcv_buffers (vport);
@@ -1695,10 +1697,11 @@ out:* * This function handles completion of init vpi mailbox command. */ -static void +void lpfc_init_vpi_cmpl (struct lpfc_hba *phba,LPFC_MBOXQ_t *mboxq) {struct lpfc_vport *vport = mboxq->vport; +struct lpfc_nodelist *ndlp;if (mboxq->u.mb.mbxStatus) { lpfc_printf_vlog(vport, KERN_ERR, LOG_MBOX,
@@ -1712,6 +1715,20 @@ lpfc_init_vpi_cmpl(struct lpfc_hba *phba vport->fc_flag &= ~FC_VPORT_NEEDS_INIT_VPI ;spin_unlock_irq (&phba->hbalock); +/* If this port is physical port or FDISC is done, do reg_vpi */ +if ((phba->pport == vport) || (vport->port_state ==LPFC_FDISC )) { + ndlp =lpfc_findnode_did (vport, Fabric_DID); +if (!ndlp) +lpfc_printf_vlog (vport,KERN_ERR , +LOG_DISCOVERY , +"2731 Cannot find fabric " +"controller node\n" ); +else +lpfc_register_new_vport (phba, vport, ndlp); +mempool_free (mboxq, phba->mbox_mem_pool); +return ; + } +if (phba->link_flag &LS_NPIV_FAB_SUPPORTED )lpfc_initial_fdisc (vport);else {
@@ -1719,6 +1736,7 @@ lpfc_init_vpi_cmpl(struct lpfc_hba *phbalpfc_printf_vlog (vport,KERN_ERR ,LOG_ELS ,"2606 No NPIV Fabric support\n" ); } +mempool_free (mboxq, phba->mbox_mem_pool);return ; }
@@ -1814,6 +1832,9 @@ lpfc_mbx_cmpl_reg_vfi(struct lpfc_hba *p }/* The VPI is implicitly registered when the VFI is registered */ vport->vpi_state |=LPFC_VPI_REGISTERED ; + vport->fc_flag |=FC_VFI_REGISTERED ; + + vport->fc_flag &= ~FC_VPORT_NEEDS_REG_VPI ;if (vport->port_state ==LPFC_FABRIC_CFG_LINK ) {lpfc_start_fdiscs (phba);
@@ -2333,6 +2354,7 @@ lpfc_mbx_cmpl_reg_vpi(struct lpfc_hba *p } vport->vpi_state |=LPFC_VPI_REGISTERED ; + vport->fc_flag &= ~FC_VPORT_NEEDS_REG_VPI ; vport->num_disc_nodes =0 ;/* go thru NPR list and issue ELS PLOGIs */ if (vport->fc_npr_cnt)
@@ -4462,6 +4484,7 @@ lpfc_unregister_unused_fcf(struct lpfc_hint rc;struct lpfc_vport **vports;int i; +struct lpfc_nodelist *ndlp;spin_lock_irq (&phba->hbalock);/*
@@ -4489,6 +4512,10 @@ lpfc_unregister_unused_fcf(struct lpfc_hif (vports && (phba->sli3_options &LPFC_SLI3_NPIV_ENABLED ))for (i =0 ; i <= phba->max_vports && vports[i] !=NULL ; i++) { +/* Stop FLOGI/FDISC retries */ + ndlp =lpfc_findnode_did (vports[i], Fabric_DID); +if (ndlp) +lpfc_cancel_retry_delay_tmo (vports[i], ndlp);lpfc_mbx_unreg_vpi (vports[i]);spin_lock_irq (&phba->hbalock); vports[i]->fc_flag |=FC_VPORT_NEEDS_INIT_VPI ;
@@ -4497,6 +4524,9 @@ lpfc_unregister_unused_fcf(struct lpfc_h }lpfc_destroy_vport_work_array (phba, vports); +/* Cleanup any outstanding ELS commands */ +lpfc_els_flush_all_cmd (phba); +/* Unregister VFI */ mbox =mempool_alloc (phba->mbox_mem_pool,GFP_KERNEL );if (!mbox) {
@@ -4521,6 +4551,10 @@ lpfc_unregister_unused_fcf(struct lpfc_hreturn ; } +spin_lock_irq (&phba->hbalock); + phba->pport->fc_flag &= ~FC_VFI_REGISTERED ; +spin_unlock_irq (&phba->hbalock); +/* Unregister FCF */ mbox =mempool_alloc (phba->mbox_mem_pool,GFP_KERNEL );if (!mbox) {
drivers/scsi/lpfc/lpfc_init.c +41 -3
67 lines not on this page · raw message
drivers/scsi/lpfc/lpfc_nportdisc.c +1 -1
@@ -254,7 +254,7 @@ lpfc_rcv_plogi(struct lpfc_vport *vport,int rc;memset (&stat,0 ,sizeof (struct ls_rjt )); -if (vport->port_state <=LPFC_FLOGI ) { +if (vport->port_state <=LPFC_FDISC ) {/* Before responding to PLOGI, check for pt2pt mode. * If we are pt2pt, with an outstanding FLOGI, abort * the FLOGI and resend it first.
drivers/scsi/lpfc/lpfc_sli.c +61 -1
84 lines not on this page · raw message
drivers/scsi/lpfc/lpfc_vport.c +1 -1
@@ -389,7 +389,7 @@ lpfc_vport_create(struct fc_vport *fc_vp* by the port. */ if ((phba->sli_rev ==LPFC_SLI_REV4 ) && - (pport->vpi_state &LPFC_VPI_REGISTERED )) { + (pport->fc_flag &FC_VFI_REGISTERED )) { rc =lpfc_sli4_init_vpi (phba, vpi);if (rc) { lpfc_printf_log(phba, KERN_ERR, LOG_VPORT,