lpfc 8.3.15: FCoE Related Fixes
Subsystems (2)
PATCH 2/4 lpfc 8.3.15: FCoE Related Fixes
FCoE Related Fixes
- Correct find-next-FCF routine so that it searches at next FCF rather than current one.
- Enhanced round-robin FCF failover algorithm to re-start on "New FCF" async event
- Update the manner in which we look at FCFs while they may be in their discovery state.
- Use LPFC_FCOE_NULL_VID macro when checkinf for valid vlan_id for FCF
Signed-off-by Alex Iannicelli <[email protected]>
Signed-off-by James Smart <[email protected]>
---
lpfc_els.c | 24 ++++++++++++------------ lpfc_hbadisc.c | 28 ++++++++++++++++++++-------- lpfc_init.c | 22 ++++++++++------------ lpfc_mbox.c | 2 +- lpfc_sli.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++------- lpfc_sli4.h | 1 + 6 files changed, 92 insertions(+), 40 deletions(-)
drivers/scsi/lpfc/lpfc_els.c +12 -12
@@ -813,18 +813,21 @@ lpfc_cmpl_els_flogi(struct lpfc_hba *phb*/ lpfc_printf_log (phba,KERN_WARNING ,LOG_FIP |LOG_ELS , -"2760 FLOGI exhausted FCF " -"round robin failover list, " -"retry FLOGI on the current " -"registered FCF index:%d\n" , +"2760 Completed one round " +"of FLOGI FCF round robin " +"failover list, retry FLOGI " +"on currently registered " +"FCF index:%d\n" , phba->fcf.current_rec.fcf_indx); -spin_lock_irq (&phba->hbalock); - phba->fcf.fcf_flag &= ~FCF_DISCOVERY ; -spin_unlock_irq (&phba->hbalock); }else { +lpfc_printf_log (phba,KERN_INFO , +LOG_FIP |LOG_ELS , +"2794 FLOGI FCF round robin " +"failover to FCF index x%x\n" , + fcf_index); rc =lpfc_sli4_fcf_rr_read_fcf_rec (phba, fcf_index); -if (rc) { +if (rc)lpfc_printf_log (phba,KERN_WARNING ,LOG_FIP |LOG_ELS , "2761 FLOGI round "
@@ -833,10 +836,7 @@ lpfc_cmpl_els_flogi(struct lpfc_hba *phb"rc:x%x, fcf_index:" "%d\n" , rc, phba->fcf.current_rec.fcf_indx); -spin_lock_irq (&phba->hbalock); - phba->fcf.fcf_flag &= ~FCF_DISCOVERY ; -spin_unlock_irq (&phba->hbalock); - }else + else goto out; } }
drivers/scsi/lpfc/lpfc_hbadisc.c +20 -8
@@ -1572,7 +1572,7 @@ lpfc_sli4_new_fcf_random_select(struct l }/** -* lpfc_mbx_cmpl_read_fcf_record - Completion handler for read_fcf mbox. +* lpfc_sli4_fcf_rec_mbox_parse - Parse read_fcf mbox command. * @phba: pointer to lpfc hba data structure. * @mboxq: pointer to mailbox object. * @next_fcf_index: pointer to holder of next fcf index.
@@ -2026,9 +2026,14 @@ read_next_fcf:memcpy (&phba->fcf.current_rec, &phba->fcf.failover_rec,sizeof (struct lpfc_fcf_rec )); -/* mark the FCF fast failover completed */ +/* +* Mark the fast FCF failover rediscovery completed +* and the start of the first round of the roundrobin +* FCF failover. +*/ spin_lock_irq (&phba->hbalock); - phba->fcf.fcf_flag &= ~FCF_REDISC_FOV ; + phba->fcf.fcf_flag &= + ~(FCF_REDISC_FOV |FCF_REDISC_RRU );spin_unlock_irq (&phba->hbalock);/* * Set up the initial registered FCF index for FLOGI
@@ -2074,9 +2079,14 @@ read_next_fcf:* through the FCF scanning process. */ -/* mark the initial FCF discovery completed */ +/* +* Mark the initial FCF discovery completed and +* the start of the first round of the roundrobin +* FCF failover. +*/ spin_lock_irq (&phba->hbalock); - phba->fcf.fcf_flag &= ~FCF_INIT_DISC ; + phba->fcf.fcf_flag &= + ~(FCF_INIT_DISC |FCF_REDISC_RRU );spin_unlock_irq (&phba->hbalock);/* * Set up the initial registered FCF index for FLOGI
@@ -2206,7 +2216,7 @@ lpfc_mbx_cmpl_read_fcf_rec(struct lpfc_h goto out;/* If FCF discovery period is over, no need to proceed */ -if (phba->fcf.fcf_flag &FCF_DISCOVERY ) +if (!(phba->fcf.fcf_flag &FCF_DISCOVERY )) goto out;/* Parse the FCF record from the non-embedded mailbox command */
@@ -5331,13 +5341,15 @@ void lpfc_unregister_unused_fcf(struct lpfc_hba *phba) {/* -* If HBA is not running in FIP mode or if HBA does not support -* FCoE or if FCF is not registered, do nothing. +* If HBA is not running in FIP mode, if HBA does not support +* FCoE, if FCF discovery is ongoing, or if FCF has not been +* registered, do nothing. */ spin_lock_irq (&phba->hbalock);if (!(phba->hba_flag &HBA_FCOE_SUPPORT ) || !(phba->fcf.fcf_flag &FCF_REGISTERED ) || !(phba->hba_flag &HBA_FIP_SUPPORT ) || + (phba->fcf.fcf_flag &FCF_DISCOVERY ) || (phba->pport->port_state ==LPFC_FLOGI )) {spin_unlock_irq (&phba->hbalock);return ;
drivers/scsi/lpfc/lpfc_init.c +10 -12
@@ -3357,22 +3357,14 @@ lpfc_sli4_async_fcoe_evt(struct lpfc_hba"evt_tag:x%x, fcf_index:x%x\n" , acqe_fcoe->event_tag, acqe_fcoe->index); +/* If the FCF discovery is in progress, do nothing. */ spin_lock_irq (&phba->hbalock); -if ((phba->fcf.fcf_flag &FCF_SCAN_DONE ) || - (phba->hba_flag &FCF_DISC_INPROGRESS )) { -/* -* If the current FCF is in discovered state or -* FCF discovery is in progress, do nothing. -*/ +if (phba->hba_flag &FCF_DISC_INPROGRESS ) {spin_unlock_irq (&phba->hbalock);break ; } - +/* If fast FCF failover rescan event is pending, do nothing */ if (phba->fcf.fcf_flag &FCF_REDISC_EVT ) { -/* -* If fast FCF failover rescan event is pending, -* do nothing. -*/ spin_unlock_irq (&phba->hbalock);break ; }
@@ -3393,7 +3385,13 @@ lpfc_sli4_async_fcoe_evt(struct lpfc_hba acqe_fcoe->index); rc =lpfc_sli4_read_fcf_rec (phba, acqe_fcoe->index); } - +/* If the FCF has been in discovered state, do nothing. */ +spin_lock_irq (&phba->hbalock); +if (phba->fcf.fcf_flag &FCF_SCAN_DONE ) { +spin_unlock_irq (&phba->hbalock); +break ; + } +spin_unlock_irq (&phba->hbalock);/* Otherwise, scan the entire FCF table and re-discover SAN */ lpfc_printf_log (phba,KERN_INFO ,LOG_FIP |LOG_DISCOVERY , "2770 Start FCF table scan due to new FCF "
drivers/scsi/lpfc/lpfc_mbox.c +1 -1
@@ -2045,7 +2045,7 @@ lpfc_reg_fcfi(struct lpfc_hba *phba, str phba->fcf.current_rec.fcf_indx);/* reg_fcf addr mode is bit wise inverted value of fcf addr_mode */ bf_set (lpfc_reg_fcfi_mam, reg_fcfi, (~phba->fcf.addr_mode) &0x3 ); -if (phba->fcf.current_rec.vlan_id !=0xFFFF ) { +if (phba->fcf.current_rec.vlan_id !=LPFC_FCOE_NULL_VID ) {bf_set (lpfc_reg_fcfi_vv, reg_fcfi,1 );bf_set (lpfc_reg_fcfi_vlan_tag, reg_fcfi, phba->fcf.current_rec.vlan_id);
drivers/scsi/lpfc/lpfc_sli4.h +1 -0
@@ -163,6 +163,7 @@ struct lpfc_fcf {#define FCF_REDISC_PEND 0x80/* FCF rediscovery pending */ #define FCF_REDISC_EVT 0x100/* FCF rediscovery event to worker thread */ #define FCF_REDISC_FOV 0x200/* Post FCF rediscovery fast failover */ +#define FCF_REDISC_RRU 0x400/* Roundrobin bitmap updated */ uint32_t addr_mode;uint16_t fcf_rr_init_indx;uint32_t eligible_fcf_cnt;
drivers/scsi/lpfc/lpfc_sli.c +48 -7
91 lines not on this page · raw message