lpfc 8.3.38: Fixed degraded performance after cable pulls
Subsystems (2)
PATCH 2/11 lpfc 8.3.38: Fixed degraded performance after cable pulls
Fixed degraded performance after cable pulls
The service parameters for the VPI/RPIs were incorrect, resulting in lower utilization
Signed-off-by James Smart <[email protected]>
---
lpfc_crtn.h | 1 + lpfc_els.c | 15 +++++++++++++++ lpfc_hbadisc.c | 5 +++++ lpfc_hw4.h | 3 +++ lpfc_mbox.c | 24 ++++++++++++++++-------- 5 files changed, 40 insertions(+), 8 deletions(-)
drivers/scsi/lpfc/lpfc_crtn.h +1 -0
@@ -106,6 +106,7 @@ void lpfc_cleanup_discovery_resources(stvoid lpfc_cleanup (struct lpfc_vport *);void lpfc_disc_timeout (unsigned long ); +int lpfc_unregister_fcf_prep (struct lpfc_hba *);struct lpfc_nodelist *__lpfc_findnode_rpi (struct lpfc_vport *,uint16_t );struct lpfc_nodelist *lpfc_findnode_rpi (struct lpfc_vport *,uint16_t );void lpfc_worker_wake_up (struct lpfc_hba *);
drivers/scsi/lpfc/lpfc_els.c +15 -0
@@ -484,6 +484,7 @@ lpfc_issue_reg_vfi(struct lpfc_vport *vp vport->port_state =LPFC_FABRIC_CFG_LINK ;memcpy (dmabuf->virt, &phba->fc_fabparam,sizeof (vport->fc_sparam));lpfc_reg_vfi (mboxq, vport, dmabuf->phys); + mboxq->mbox_cmpl = lpfc_mbx_cmpl_reg_vfi; mboxq->vport = vport; mboxq->context1 = dmabuf;
@@ -700,6 +701,20 @@ lpfc_cmpl_els_flogi_fabric(struct lpfc_v } } +/* +* For FC we need to do some special processing because of the SLI +* Port's default settings of the Common Service Parameters. +*/ +if (phba->sli4_hba.lnk_info.lnk_tp ==LPFC_LNK_TYPE_FC ) { +/* If physical FC port changed, unreg VFI and ALL VPIs / RPIs */ +if ((phba->sli_rev ==LPFC_SLI_REV4 ) && fabric_param_changed) +lpfc_unregister_fcf_prep (phba); + +/* This should just update the VFI CSPs*/ +if (vport->fc_flag &FC_VFI_REGISTERED ) +lpfc_issue_reg_vfi (vport); + } +if (fabric_param_changed && !(vport->fc_flag &FC_VPORT_NEEDS_REG_VPI )) {
drivers/scsi/lpfc/lpfc_hbadisc.c +5 -0
@@ -2889,6 +2889,11 @@ lpfc_mbx_cmpl_reg_vfi(struct lpfc_hba *plpfc_vport_set_state (vport,FC_VPORT_FAILED ); goto out_free_mem; } + +/* If the VFI is already registered, there is nothing else to do */ +if (vport->fc_flag &FC_VFI_REGISTERED ) + goto out_free_mem; +/* The VPI is implicitly registered when the VFI is registered */ spin_lock_irq (shost->host_lock); vport->vpi_state |=LPFC_VPI_REGISTERED ;
drivers/scsi/lpfc/lpfc_hw4.h +3 -0
@@ -1958,6 +1958,9 @@ struct lpfc_mbx_init_vfi {struct lpfc_mbx_reg_vfi {uint32_t word1; +#define lpfc_reg_vfi_upd_SHIFT 29 +#define lpfc_reg_vfi_upd_MASK 0x00000001 +#define lpfc_reg_vfi_upd_WORD word1#define lpfc_reg_vfi_vp_SHIFT 28#define lpfc_reg_vfi_vp_MASK 0x00000001#define lpfc_reg_vfi_vp_WORD word1
drivers/scsi/lpfc/lpfc_mbox.c +16 -8
@@ -2126,32 +2126,40 @@ void lpfc_reg_vfi(struct lpfcMboxq *mbox, struct lpfc_vport *vport, dma_addr_t phys) { struct lpfc_mbx_reg_vfi *reg_vfi; +struct lpfc_hba *phba = vport->phba;memset (mbox,0 ,sizeof (*mbox)); reg_vfi = &mbox->u.mqe.un.reg_vfi;bf_set (lpfc_mqe_command, &mbox->u.mqe,MBX_REG_VFI );bf_set (lpfc_reg_vfi_vp, reg_vfi,1 );bf_set (lpfc_reg_vfi_vfi, reg_vfi, - vport->phba->sli4_hba.vfi_ids[vport->vfi]); -bf_set (lpfc_reg_vfi_fcfi, reg_vfi, vport->phba->fcf.fcfi); -bf_set (lpfc_reg_vfi_vpi, reg_vfi, vport->phba->vpi_ids[vport->vpi]); + phba->sli4_hba.vfi_ids[vport->vfi]); +bf_set (lpfc_reg_vfi_fcfi, reg_vfi, phba->fcf.fcfi); +bf_set (lpfc_reg_vfi_vpi, reg_vfi, phba->vpi_ids[vport->vpi]);memcpy (reg_vfi->wwn, &vport->fc_portname,sizeof (struct lpfc_name )); reg_vfi->wwn[0 ] =cpu_to_le32 (reg_vfi->wwn[0 ]); reg_vfi->wwn[1 ] =cpu_to_le32 (reg_vfi->wwn[1 ]); - reg_vfi->e_d_tov = vport->phba->fc_edtov; - reg_vfi->r_a_tov = vport->phba->fc_ratov; + reg_vfi->e_d_tov = phba->fc_edtov; + reg_vfi->r_a_tov = phba->fc_ratov; reg_vfi->bde.addrHigh =putPaddrHigh (phys); reg_vfi->bde.addrLow =putPaddrLow (phys); reg_vfi->bde.tus.f.bdeSize =sizeof (vport->fc_sparam); reg_vfi->bde.tus.f.bdeFlags =BUFF_TYPE_BDE_64 ;bf_set (lpfc_reg_vfi_nport_id, reg_vfi, vport->fc_myDID); + +/* Only FC supports upd bit */ +if ((phba->sli4_hba.lnk_info.lnk_tp ==LPFC_LNK_TYPE_FC ) && + (vport->fc_flag &FC_VFI_REGISTERED )) { +bf_set (lpfc_reg_vfi_vp, reg_vfi,0 ); +bf_set (lpfc_reg_vfi_upd, reg_vfi,1 ); + }lpfc_printf_vlog (vport,KERN_INFO ,LOG_MBOX ,"3134 Register VFI, mydid:x%x, fcfi:%d, " " vfi:%d, vpi:%d, fc_pname:%x%x\n" , vport->fc_myDID, - vport->phba->fcf.fcfi, - vport->phba->sli4_hba.vfi_ids[vport->vfi], - vport->phba->vpi_ids[vport->vpi], + phba->fcf.fcfi, + phba->sli4_hba.vfi_ids[vport->vfi], + phba->vpi_ids[vport->vpi], reg_vfi->wwn[0 ], reg_vfi->wwn[1 ]); }