[SCSI] lpfc 8.3.38: Fixed degraded performance after cable pulls
The service parameters for the VPI/RPIs were incorrect, resulting in lower utilization Signed-off-by: James Smart <james.smart@emulex.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
Родитель
0e9bb8d79c
Коммит
ae05ebe3be
|
@ -106,6 +106,7 @@ void lpfc_cleanup_discovery_resources(struct lpfc_vport *);
|
||||||
void lpfc_cleanup(struct lpfc_vport *);
|
void lpfc_cleanup(struct lpfc_vport *);
|
||||||
void lpfc_disc_timeout(unsigned long);
|
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);
|
||||||
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 *);
|
void lpfc_worker_wake_up(struct lpfc_hba *);
|
||||||
|
|
|
@ -484,6 +484,7 @@ lpfc_issue_reg_vfi(struct lpfc_vport *vport)
|
||||||
vport->port_state = LPFC_FABRIC_CFG_LINK;
|
vport->port_state = LPFC_FABRIC_CFG_LINK;
|
||||||
memcpy(dmabuf->virt, &phba->fc_fabparam, sizeof(vport->fc_sparam));
|
memcpy(dmabuf->virt, &phba->fc_fabparam, sizeof(vport->fc_sparam));
|
||||||
lpfc_reg_vfi(mboxq, vport, dmabuf->phys);
|
lpfc_reg_vfi(mboxq, vport, dmabuf->phys);
|
||||||
|
|
||||||
mboxq->mbox_cmpl = lpfc_mbx_cmpl_reg_vfi;
|
mboxq->mbox_cmpl = lpfc_mbx_cmpl_reg_vfi;
|
||||||
mboxq->vport = vport;
|
mboxq->vport = vport;
|
||||||
mboxq->context1 = dmabuf;
|
mboxq->context1 = dmabuf;
|
||||||
|
@ -700,6 +701,20 @@ lpfc_cmpl_els_flogi_fabric(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 &&
|
if (fabric_param_changed &&
|
||||||
!(vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)) {
|
!(vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)) {
|
||||||
|
|
||||||
|
|
|
@ -2889,6 +2889,11 @@ lpfc_mbx_cmpl_reg_vfi(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
|
||||||
lpfc_vport_set_state(vport, FC_VPORT_FAILED);
|
lpfc_vport_set_state(vport, FC_VPORT_FAILED);
|
||||||
goto out_free_mem;
|
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 */
|
/* The VPI is implicitly registered when the VFI is registered */
|
||||||
spin_lock_irq(shost->host_lock);
|
spin_lock_irq(shost->host_lock);
|
||||||
vport->vpi_state |= LPFC_VPI_REGISTERED;
|
vport->vpi_state |= LPFC_VPI_REGISTERED;
|
||||||
|
|
|
@ -1958,6 +1958,9 @@ struct lpfc_mbx_init_vfi {
|
||||||
|
|
||||||
struct lpfc_mbx_reg_vfi {
|
struct lpfc_mbx_reg_vfi {
|
||||||
uint32_t word1;
|
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_SHIFT 28
|
||||||
#define lpfc_reg_vfi_vp_MASK 0x00000001
|
#define lpfc_reg_vfi_vp_MASK 0x00000001
|
||||||
#define lpfc_reg_vfi_vp_WORD word1
|
#define lpfc_reg_vfi_vp_WORD word1
|
||||||
|
|
|
@ -2126,32 +2126,40 @@ void
|
||||||
lpfc_reg_vfi(struct lpfcMboxq *mbox, struct lpfc_vport *vport, dma_addr_t phys)
|
lpfc_reg_vfi(struct lpfcMboxq *mbox, struct lpfc_vport *vport, dma_addr_t phys)
|
||||||
{
|
{
|
||||||
struct lpfc_mbx_reg_vfi *reg_vfi;
|
struct lpfc_mbx_reg_vfi *reg_vfi;
|
||||||
|
struct lpfc_hba *phba = vport->phba;
|
||||||
|
|
||||||
memset(mbox, 0, sizeof(*mbox));
|
memset(mbox, 0, sizeof(*mbox));
|
||||||
reg_vfi = &mbox->u.mqe.un.reg_vfi;
|
reg_vfi = &mbox->u.mqe.un.reg_vfi;
|
||||||
bf_set(lpfc_mqe_command, &mbox->u.mqe, MBX_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_vp, reg_vfi, 1);
|
||||||
bf_set(lpfc_reg_vfi_vfi, reg_vfi,
|
bf_set(lpfc_reg_vfi_vfi, reg_vfi,
|
||||||
vport->phba->sli4_hba.vfi_ids[vport->vfi]);
|
phba->sli4_hba.vfi_ids[vport->vfi]);
|
||||||
bf_set(lpfc_reg_vfi_fcfi, reg_vfi, vport->phba->fcf.fcfi);
|
bf_set(lpfc_reg_vfi_fcfi, reg_vfi, phba->fcf.fcfi);
|
||||||
bf_set(lpfc_reg_vfi_vpi, reg_vfi, vport->phba->vpi_ids[vport->vpi]);
|
bf_set(lpfc_reg_vfi_vpi, reg_vfi, phba->vpi_ids[vport->vpi]);
|
||||||
memcpy(reg_vfi->wwn, &vport->fc_portname, sizeof(struct lpfc_name));
|
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[0] = cpu_to_le32(reg_vfi->wwn[0]);
|
||||||
reg_vfi->wwn[1] = cpu_to_le32(reg_vfi->wwn[1]);
|
reg_vfi->wwn[1] = cpu_to_le32(reg_vfi->wwn[1]);
|
||||||
reg_vfi->e_d_tov = vport->phba->fc_edtov;
|
reg_vfi->e_d_tov = phba->fc_edtov;
|
||||||
reg_vfi->r_a_tov = vport->phba->fc_ratov;
|
reg_vfi->r_a_tov = phba->fc_ratov;
|
||||||
reg_vfi->bde.addrHigh = putPaddrHigh(phys);
|
reg_vfi->bde.addrHigh = putPaddrHigh(phys);
|
||||||
reg_vfi->bde.addrLow = putPaddrLow(phys);
|
reg_vfi->bde.addrLow = putPaddrLow(phys);
|
||||||
reg_vfi->bde.tus.f.bdeSize = sizeof(vport->fc_sparam);
|
reg_vfi->bde.tus.f.bdeSize = sizeof(vport->fc_sparam);
|
||||||
reg_vfi->bde.tus.f.bdeFlags = BUFF_TYPE_BDE_64;
|
reg_vfi->bde.tus.f.bdeFlags = BUFF_TYPE_BDE_64;
|
||||||
bf_set(lpfc_reg_vfi_nport_id, reg_vfi, vport->fc_myDID);
|
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,
|
lpfc_printf_vlog(vport, KERN_INFO, LOG_MBOX,
|
||||||
"3134 Register VFI, mydid:x%x, fcfi:%d, "
|
"3134 Register VFI, mydid:x%x, fcfi:%d, "
|
||||||
" vfi:%d, vpi:%d, fc_pname:%x%x\n",
|
" vfi:%d, vpi:%d, fc_pname:%x%x\n",
|
||||||
vport->fc_myDID,
|
vport->fc_myDID,
|
||||||
vport->phba->fcf.fcfi,
|
phba->fcf.fcfi,
|
||||||
vport->phba->sli4_hba.vfi_ids[vport->vfi],
|
phba->sli4_hba.vfi_ids[vport->vfi],
|
||||||
vport->phba->vpi_ids[vport->vpi],
|
phba->vpi_ids[vport->vpi],
|
||||||
reg_vfi->wwn[0], reg_vfi->wwn[1]);
|
reg_vfi->wwn[0], reg_vfi->wwn[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче