|
|
|
@ -4049,52 +4049,6 @@ lpfc_sli4_perform_all_vport_cvl(struct lpfc_hba *phba) |
|
|
|
|
lpfc_destroy_vport_work_array(phba, vports); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* lpfc_sli4_perform_inuse_fcf_recovery - Perform inuse fcf recovery |
|
|
|
|
* @vport: pointer to lpfc hba data structure. |
|
|
|
|
* |
|
|
|
|
* This routine is to perform FCF recovery when the in-use FCF either dead or |
|
|
|
|
* got modified. |
|
|
|
|
**/ |
|
|
|
|
static void |
|
|
|
|
lpfc_sli4_perform_inuse_fcf_recovery(struct lpfc_hba *phba, |
|
|
|
|
struct lpfc_acqe_fip *acqe_fip) |
|
|
|
|
{ |
|
|
|
|
int rc; |
|
|
|
|
|
|
|
|
|
spin_lock_irq(&phba->hbalock); |
|
|
|
|
/* Mark the fast failover process in progress */ |
|
|
|
|
phba->fcf.fcf_flag |= FCF_DEAD_DISC; |
|
|
|
|
spin_unlock_irq(&phba->hbalock); |
|
|
|
|
|
|
|
|
|
lpfc_printf_log(phba, KERN_INFO, LOG_FIP | LOG_DISCOVERY, |
|
|
|
|
"2771 Start FCF fast failover process due to in-use " |
|
|
|
|
"FCF DEAD/MODIFIED event: evt_tag:x%x, index:x%x\n", |
|
|
|
|
acqe_fip->event_tag, acqe_fip->index); |
|
|
|
|
rc = lpfc_sli4_redisc_fcf_table(phba); |
|
|
|
|
if (rc) { |
|
|
|
|
lpfc_printf_log(phba, KERN_ERR, LOG_FIP | LOG_DISCOVERY, |
|
|
|
|
"2772 Issue FCF rediscover mabilbox command " |
|
|
|
|
"failed, fail through to FCF dead event\n"); |
|
|
|
|
spin_lock_irq(&phba->hbalock); |
|
|
|
|
phba->fcf.fcf_flag &= ~FCF_DEAD_DISC; |
|
|
|
|
spin_unlock_irq(&phba->hbalock); |
|
|
|
|
/*
|
|
|
|
|
* Last resort will fail over by treating this as a link |
|
|
|
|
* down to FCF registration. |
|
|
|
|
*/ |
|
|
|
|
lpfc_sli4_fcf_dead_failthrough(phba); |
|
|
|
|
} else { |
|
|
|
|
/* Reset FCF roundrobin bmask for new discovery */ |
|
|
|
|
lpfc_sli4_clear_fcf_rr_bmask(phba); |
|
|
|
|
/*
|
|
|
|
|
* Handling fast FCF failover to a DEAD FCF event is |
|
|
|
|
* considered equalivant to receiving CVL to all vports. |
|
|
|
|
*/ |
|
|
|
|
lpfc_sli4_perform_all_vport_cvl(phba); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* lpfc_sli4_async_fip_evt - Process the asynchronous FCoE FIP event |
|
|
|
|
* @phba: pointer to lpfc hba data structure. |
|
|
|
@ -4160,22 +4114,9 @@ lpfc_sli4_async_fip_evt(struct lpfc_hba *phba, |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* If FCF has been in discovered state, perform rediscovery
|
|
|
|
|
* only if the FCF with the same index of the in-use FCF got |
|
|
|
|
* modified during normal operation. Otherwise, do nothing. |
|
|
|
|
*/ |
|
|
|
|
if (phba->pport->port_state > LPFC_FLOGI) { |
|
|
|
|
/* If the FCF has been in discovered state, do nothing. */ |
|
|
|
|
if (phba->fcf.fcf_flag & FCF_SCAN_DONE) { |
|
|
|
|
spin_unlock_irq(&phba->hbalock); |
|
|
|
|
if (phba->fcf.current_rec.fcf_indx == |
|
|
|
|
acqe_fip->index) { |
|
|
|
|
lpfc_printf_log(phba, KERN_ERR, LOG_FIP, |
|
|
|
|
"3300 In-use FCF (%d) " |
|
|
|
|
"modified, perform FCF " |
|
|
|
|
"rediscovery\n", |
|
|
|
|
acqe_fip->index); |
|
|
|
|
lpfc_sli4_perform_inuse_fcf_recovery(phba, |
|
|
|
|
acqe_fip); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
spin_unlock_irq(&phba->hbalock); |
|
|
|
@ -4228,7 +4169,39 @@ lpfc_sli4_async_fip_evt(struct lpfc_hba *phba, |
|
|
|
|
* is no longer valid as we are not in the middle of FCF |
|
|
|
|
* failover process already. |
|
|
|
|
*/ |
|
|
|
|
lpfc_sli4_perform_inuse_fcf_recovery(phba, acqe_fip); |
|
|
|
|
spin_lock_irq(&phba->hbalock); |
|
|
|
|
/* Mark the fast failover process in progress */ |
|
|
|
|
phba->fcf.fcf_flag |= FCF_DEAD_DISC; |
|
|
|
|
spin_unlock_irq(&phba->hbalock); |
|
|
|
|
|
|
|
|
|
lpfc_printf_log(phba, KERN_INFO, LOG_FIP | LOG_DISCOVERY, |
|
|
|
|
"2771 Start FCF fast failover process due to " |
|
|
|
|
"FCF DEAD event: evt_tag:x%x, fcf_index:x%x " |
|
|
|
|
"\n", acqe_fip->event_tag, acqe_fip->index); |
|
|
|
|
rc = lpfc_sli4_redisc_fcf_table(phba); |
|
|
|
|
if (rc) { |
|
|
|
|
lpfc_printf_log(phba, KERN_ERR, LOG_FIP | |
|
|
|
|
LOG_DISCOVERY, |
|
|
|
|
"2772 Issue FCF rediscover mabilbox " |
|
|
|
|
"command failed, fail through to FCF " |
|
|
|
|
"dead event\n"); |
|
|
|
|
spin_lock_irq(&phba->hbalock); |
|
|
|
|
phba->fcf.fcf_flag &= ~FCF_DEAD_DISC; |
|
|
|
|
spin_unlock_irq(&phba->hbalock); |
|
|
|
|
/*
|
|
|
|
|
* Last resort will fail over by treating this |
|
|
|
|
* as a link down to FCF registration. |
|
|
|
|
*/ |
|
|
|
|
lpfc_sli4_fcf_dead_failthrough(phba); |
|
|
|
|
} else { |
|
|
|
|
/* Reset FCF roundrobin bmask for new discovery */ |
|
|
|
|
lpfc_sli4_clear_fcf_rr_bmask(phba); |
|
|
|
|
/*
|
|
|
|
|
* Handling fast FCF failover to a DEAD FCF event is |
|
|
|
|
* considered equalivant to receiving CVL to all vports. |
|
|
|
|
*/ |
|
|
|
|
lpfc_sli4_perform_all_vport_cvl(phba); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case LPFC_FIP_EVENT_TYPE_CVL: |
|
|
|
|
phba->fcoe_cvl_eventtag = acqe_fip->event_tag; |
|
|
|
|