lpfc 8.2.3 : FC Discovery Fixes
Subsystems (2)
PATCH 5/9 lpfc 8.2.3 : FC Discovery Fixes
FC Discovery Fixes:
- Fix up lpfc_drop_node() vs lpfc_nlp_not_used() usage
- Clear ADISC flag when unregistering RPI and REMOVE ndlps if in recovery.
- Fix usage of UNUSED list and ndlps
- Fix PLOGI race conditions
- Reset link if NameServer PLOGI errors occur
- Synchronize GID_FT queries with PLOGI receptions
Signed-off-by James Smart <[email protected]>
drivers/scsi/lpfc/lpfc_crtn.h +4 -0
@@ -45,6 +45,7 @@ void lpfc_init_link(struct lpfc_hba *, Lstruct lpfc_vport *lpfc_find_vport_by_did (struct lpfc_hba *,uint32_t );void lpfc_cleanup_rpis (struct lpfc_vport *vport,int remove);int lpfc_linkdown (struct lpfc_hba *); +void lpfc_port_link_failure (struct lpfc_vport *);void lpfc_mbx_cmpl_read_la (struct lpfc_hba *,LPFC_MBOXQ_t *);void lpfc_mbx_cmpl_clear_la (struct lpfc_hba *,LPFC_MBOXQ_t *);
@@ -74,6 +75,7 @@ void lpfc_disc_list_loopmap(struct lpfc_void lpfc_disc_start (struct lpfc_vport *);void lpfc_disc_flush_list (struct lpfc_vport *);void lpfc_cleanup_discovery_resources (struct lpfc_vport *); +void lpfc_cleanup (struct lpfc_vport *);void lpfc_disc_timeout (unsigned long );struct lpfc_nodelist *__lpfc_findnode_rpi (struct lpfc_vport *,uint16_t );
@@ -91,6 +93,8 @@ void lpfc_do_scr_ns_plogi(struct lpfc_hbint lpfc_check_sparm (struct lpfc_vport *,struct lpfc_nodelist *,struct serv_parm *,uint32_t );int lpfc_els_abort (struct lpfc_hba *,struct lpfc_nodelist *); +void lpfc_more_plogi (struct lpfc_vport *); +void lpfc_end_rscn (struct lpfc_vport *);int lpfc_els_chk_latt (struct lpfc_vport *);int lpfc_els_abort_flogi (struct lpfc_hba *);int lpfc_initial_flogi (struct lpfc_vport *);
drivers/scsi/lpfc/lpfc_disc.h +0 -1
@@ -103,7 +103,6 @@ struct lpfc_nodelist {#define NLP_RM_DFLT_RPI 0x4000000/* need to remove leftover dflt RPI */ #define NLP_NODEV_REMOVE 0x8000000/* Defer removal till discovery ends */ #define NLP_TARGET_REMOVE 0x10000000/* Target remove in process */ -#define NLP_DELAYED_RM 0x20000000/* Defer UNUSED List removal */ /* There are 4 different double linked lists nodelist entries can reside on. * The Port Login (PLOGI) list and Address Discovery (ADISC) list are used
drivers/scsi/lpfc/lpfc_els.c +123 -108
415 lines not on this page · raw message
drivers/scsi/lpfc/lpfc_hbadisc.c +45 -51
206 lines not on this page · raw message
drivers/scsi/lpfc/lpfc_init.c +55 -11
106 lines not on this page · raw message
drivers/scsi/lpfc/lpfc_nportdisc.c +63 -19
169 lines not on this page · raw message
drivers/scsi/lpfc/lpfc_vport.c +10 -14
@@ -445,7 +445,6 @@ int lpfc_vport_delete(struct fc_vport *fc_vport) {struct lpfc_nodelist *ndlp =NULL ; -struct lpfc_nodelist *next_ndlp;struct Scsi_Host *shost = (struct Scsi_Host *) fc_vport->shost;struct lpfc_vport *vport = *(struct lpfc_vport **)fc_vport->dd_data;struct lpfc_hba *phba = vport->phba;
@@ -531,23 +530,20 @@ lpfc_vport_delete(struct fc_vport *fc_vp } skip_logo: +lpfc_cleanup (vport);lpfc_sli_host_down (vport); -list_for_each_entry_safe (ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) { -lpfc_disc_state_machine (vport, ndlp,NULL , -NLP_EVT_DEVICE_RECOVERY ); -lpfc_disc_state_machine (vport, ndlp,NULL , -NLP_EVT_DEVICE_RM ); - } -lpfc_stop_vport_timers (vport);lpfc_unreg_all_rpis (vport); -lpfc_unreg_default_rpis (vport); -/* -* Completion of unreg_vpi (lpfc_mbx_cmpl_unreg_vpi) does the -* scsi_host_put() to release the vport. -*/ -lpfc_mbx_unreg_vpi (vport); + +if (!(phba->pport->load_flag &FC_UNLOADING )) { +lpfc_unreg_default_rpis (vport); +/* +* Completion of unreg_vpi (lpfc_mbx_cmpl_unreg_vpi) +* does the scsi_host_put() to release the vport. +*/ +lpfc_mbx_unreg_vpi (vport); + }lpfc_free_vpi (phba, vport->vpi); vport->work_port_events =0 ;