lpfc 8.3.4: Fix a pair of FCoE issues
Subsystems (2)
PATCH 4/8 lpfc 8.3.4: Fix a pair of FCoE issues
Fix a pair of FCoE issues
- Fix Region 23 FCoE Parameters not being read correctly
- Fix race condition when there are FCoE events during FCF table read
Signed-off-by James Smart <[email protected]>
---
drivers/scsi/lpfc/lpfc.h | 3 + drivers/scsi/lpfc/lpfc_crtn.h | 1 drivers/scsi/lpfc/lpfc_hbadisc.c | 77 ++++++++++++++++++++++++++++++++++++++ drivers/scsi/lpfc/lpfc_init.c | 9 +++- drivers/scsi/lpfc/lpfc_sli.c | 7 +++ 5 files changed, 92 insertions(+), 5 deletions(-)
drivers/scsi/lpfc/lpfc.h +3 -0
@@ -526,6 +526,7 @@ struct lpfc_hba {#define ELS_XRI_ABORT_EVENT 0x40#define ASYNC_EVENT 0x80#define LINK_DISABLED 0x100/* Link disabled by user */ +#define FCF_DISC_INPROGRESS 0x200/* FCF discovery in progress */ struct lpfc_dmabuf slim2p;MAILBOX_t *mbox;
@@ -767,6 +768,8 @@ struct lpfc_hba {/* Maximum number of events that can be outstanding at any time*/ #define LPFC_MAX_EVT_COUNT 512atomic_t fast_event_count; +uint32_t fcoe_eventtag; +uint32_t fcoe_eventtag_at_fcf_scan;struct lpfc_fcf fcf;uint8_t fc_map[3 ];uint8_t valid_vlan;
drivers/scsi/lpfc/lpfc_crtn.h +1 -0
@@ -189,6 +189,7 @@ void lpfc_unreg_vfi(struct lpfcMboxq *, uint16_t);void lpfc_reg_fcfi (struct lpfc_hba *,struct lpfcMboxq *);void lpfc_unreg_fcfi (struct lpfcMboxq *,uint16_t );void lpfc_resume_rpi (struct lpfcMboxq *,struct lpfc_nodelist *); +int lpfc_check_pending_fcoe_event (struct lpfc_hba *,uint8_t );void lpfc_config_hbq (struct lpfc_hba *,uint32_t ,struct lpfc_hbq_init *,uint32_t ,LPFC_MBOXQ_t *);
drivers/scsi/lpfc/lpfc_hbadisc.c +76 -1
128 lines not on this page · raw message
drivers/scsi/lpfc/lpfc_init.c +6 -3
@@ -2829,6 +2829,7 @@ lpfc_sli4_async_link_evt(struct lpfc_hba *phba, att_type =lpfc_sli4_parse_latt_type (phba, acqe_link);if (att_type !=AT_LINK_DOWN && att_type !=AT_LINK_UP )return ; + phba->fcoe_eventtag = acqe_link->event_tag; pmb = (LPFC_MBOXQ_t *)mempool_alloc (phba->mbox_mem_pool,GFP_KERNEL );if (!pmb) { lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
@@ -2916,6 +2917,7 @@ lpfc_sli4_async_fcoe_evt(struct lpfc_hba *phba,uint8_t event_type =bf_get (lpfc_acqe_fcoe_event_type, acqe_fcoe);int rc; + phba->fcoe_eventtag = acqe_fcoe->event_tag;switch (event_type) {case LPFC_FCOE_EVENT_TYPE_NEW_FCF : lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY,
@@ -2923,11 +2925,12 @@ lpfc_sli4_async_fcoe_evt(struct lpfc_hba *phba, acqe_fcoe->fcf_index, acqe_fcoe->event_tag);/* -* If the current FCF is in discovered state, -* do nothing. +* If the current FCF is in discovered state, or +* FCF discovery is in progress do nothing. */ spin_lock_irq (&phba->hbalock); -if (phba->fcf.fcf_flag &FCF_DISCOVERED ) { +if ((phba->fcf.fcf_flag &FCF_DISCOVERED ) || + (phba->hba_flag &FCF_DISC_INPROGRESS )) {spin_unlock_irq (&phba->hbalock);break ; }
drivers/scsi/lpfc/lpfc_sli.c +6 -1
@@ -11536,6 +11536,7 @@ lpfc_sli4_read_fcf_record(struct lpfc_hba *phba, uint16_t fcf_index)uint32_t alloc_len, req_len;struct lpfc_mbx_read_fcf_tbl *read_fcf; + phba->fcoe_eventtag_at_fcf_scan = phba->fcoe_eventtag; mboxq =mempool_alloc (phba->mbox_mem_pool,GFP_KERNEL );if (!mboxq) { lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
@@ -11587,8 +11588,12 @@ lpfc_sli4_read_fcf_record(struct lpfc_hba *phba, uint16_t fcf_index)if (rc ==MBX_NOT_FINISHED ) {lpfc_sli4_mbox_cmd_free (phba, mboxq); error = -EIO ; - }else + }else { +spin_lock_irq (&phba->hbalock); + phba->hba_flag |=FCF_DISC_INPROGRESS ; +spin_unlock_irq (&phba->hbalock); error =0 ; + }return error; }