diff options
author | James Smart <james.smart@emulex.com> | 2013-03-01 16:35:38 -0500 |
---|---|---|
committer | James Bottomley <JBottomley@Parallels.com> | 2013-04-09 18:07:39 -0400 |
commit | ae05ebe3bec9b2cecb1c09461ba2fd0dbfa81abb (patch) | |
tree | a7ba32da1d9388df31485a1562f6b3057d614bfc /drivers/scsi/lpfc | |
parent | 0e9bb8d79c52ca115f3fc4a692ca0dd6931e2eeb (diff) |
[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>
Diffstat (limited to 'drivers/scsi/lpfc')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_crtn.h | 1 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_els.c | 15 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_hbadisc.c | 5 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_hw4.h | 3 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_mbox.c | 24 |
5 files changed, 40 insertions, 8 deletions
diff --git a/drivers/scsi/lpfc/lpfc_crtn.h b/drivers/scsi/lpfc/lpfc_crtn.h index 76ca65dae781..7631893ae005 100644 --- a/drivers/scsi/lpfc/lpfc_crtn.h +++ b/drivers/scsi/lpfc/lpfc_crtn.h | |||
@@ -106,6 +106,7 @@ void lpfc_cleanup_discovery_resources(struct lpfc_vport *); | |||
106 | void lpfc_cleanup(struct lpfc_vport *); | 106 | void lpfc_cleanup(struct lpfc_vport *); |
107 | void lpfc_disc_timeout(unsigned long); | 107 | void lpfc_disc_timeout(unsigned long); |
108 | 108 | ||
109 | int lpfc_unregister_fcf_prep(struct lpfc_hba *); | ||
109 | struct lpfc_nodelist *__lpfc_findnode_rpi(struct lpfc_vport *, uint16_t); | 110 | struct lpfc_nodelist *__lpfc_findnode_rpi(struct lpfc_vport *, uint16_t); |
110 | struct lpfc_nodelist *lpfc_findnode_rpi(struct lpfc_vport *, uint16_t); | 111 | struct lpfc_nodelist *lpfc_findnode_rpi(struct lpfc_vport *, uint16_t); |
111 | void lpfc_worker_wake_up(struct lpfc_hba *); | 112 | void lpfc_worker_wake_up(struct lpfc_hba *); |
diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c index b7a61ff43ca8..bbed8471bf0b 100644 --- a/drivers/scsi/lpfc/lpfc_els.c +++ b/drivers/scsi/lpfc/lpfc_els.c | |||
@@ -484,6 +484,7 @@ lpfc_issue_reg_vfi(struct lpfc_vport *vport) | |||
484 | vport->port_state = LPFC_FABRIC_CFG_LINK; | 484 | vport->port_state = LPFC_FABRIC_CFG_LINK; |
485 | memcpy(dmabuf->virt, &phba->fc_fabparam, sizeof(vport->fc_sparam)); | 485 | memcpy(dmabuf->virt, &phba->fc_fabparam, sizeof(vport->fc_sparam)); |
486 | lpfc_reg_vfi(mboxq, vport, dmabuf->phys); | 486 | lpfc_reg_vfi(mboxq, vport, dmabuf->phys); |
487 | |||
487 | mboxq->mbox_cmpl = lpfc_mbx_cmpl_reg_vfi; | 488 | mboxq->mbox_cmpl = lpfc_mbx_cmpl_reg_vfi; |
488 | mboxq->vport = vport; | 489 | mboxq->vport = vport; |
489 | mboxq->context1 = dmabuf; | 490 | mboxq->context1 = dmabuf; |
@@ -700,6 +701,20 @@ lpfc_cmpl_els_flogi_fabric(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, | |||
700 | } | 701 | } |
701 | } | 702 | } |
702 | 703 | ||
704 | /* | ||
705 | * For FC we need to do some special processing because of the SLI | ||
706 | * Port's default settings of the Common Service Parameters. | ||
707 | */ | ||
708 | if (phba->sli4_hba.lnk_info.lnk_tp == LPFC_LNK_TYPE_FC) { | ||
709 | /* If physical FC port changed, unreg VFI and ALL VPIs / RPIs */ | ||
710 | if ((phba->sli_rev == LPFC_SLI_REV4) && fabric_param_changed) | ||
711 | lpfc_unregister_fcf_prep(phba); | ||
712 | |||
713 | /* This should just update the VFI CSPs*/ | ||
714 | if (vport->fc_flag & FC_VFI_REGISTERED) | ||
715 | lpfc_issue_reg_vfi(vport); | ||
716 | } | ||
717 | |||
703 | if (fabric_param_changed && | 718 | if (fabric_param_changed && |
704 | !(vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)) { | 719 | !(vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)) { |
705 | 720 | ||
diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index 915e1aa6c681..6e74a75fa8fd 100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c | |||
@@ -2889,6 +2889,11 @@ lpfc_mbx_cmpl_reg_vfi(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) | |||
2889 | lpfc_vport_set_state(vport, FC_VPORT_FAILED); | 2889 | lpfc_vport_set_state(vport, FC_VPORT_FAILED); |
2890 | goto out_free_mem; | 2890 | goto out_free_mem; |
2891 | } | 2891 | } |
2892 | |||
2893 | /* If the VFI is already registered, there is nothing else to do */ | ||
2894 | if (vport->fc_flag & FC_VFI_REGISTERED) | ||
2895 | goto out_free_mem; | ||
2896 | |||
2892 | /* The VPI is implicitly registered when the VFI is registered */ | 2897 | /* The VPI is implicitly registered when the VFI is registered */ |
2893 | spin_lock_irq(shost->host_lock); | 2898 | spin_lock_irq(shost->host_lock); |
2894 | vport->vpi_state |= LPFC_VPI_REGISTERED; | 2899 | vport->vpi_state |= LPFC_VPI_REGISTERED; |
diff --git a/drivers/scsi/lpfc/lpfc_hw4.h b/drivers/scsi/lpfc/lpfc_hw4.h index 6e93b886cd4d..1dd2f6f0a127 100644 --- a/drivers/scsi/lpfc/lpfc_hw4.h +++ b/drivers/scsi/lpfc/lpfc_hw4.h | |||
@@ -1958,6 +1958,9 @@ struct lpfc_mbx_init_vfi { | |||
1958 | 1958 | ||
1959 | struct lpfc_mbx_reg_vfi { | 1959 | struct lpfc_mbx_reg_vfi { |
1960 | uint32_t word1; | 1960 | uint32_t word1; |
1961 | #define lpfc_reg_vfi_upd_SHIFT 29 | ||
1962 | #define lpfc_reg_vfi_upd_MASK 0x00000001 | ||
1963 | #define lpfc_reg_vfi_upd_WORD word1 | ||
1961 | #define lpfc_reg_vfi_vp_SHIFT 28 | 1964 | #define lpfc_reg_vfi_vp_SHIFT 28 |
1962 | #define lpfc_reg_vfi_vp_MASK 0x00000001 | 1965 | #define lpfc_reg_vfi_vp_MASK 0x00000001 |
1963 | #define lpfc_reg_vfi_vp_WORD word1 | 1966 | #define lpfc_reg_vfi_vp_WORD word1 |
diff --git a/drivers/scsi/lpfc/lpfc_mbox.c b/drivers/scsi/lpfc/lpfc_mbox.c index efc9cd9def8b..a7a9fa468308 100644 --- a/drivers/scsi/lpfc/lpfc_mbox.c +++ b/drivers/scsi/lpfc/lpfc_mbox.c | |||
@@ -2126,32 +2126,40 @@ void | |||
2126 | lpfc_reg_vfi(struct lpfcMboxq *mbox, struct lpfc_vport *vport, dma_addr_t phys) | 2126 | lpfc_reg_vfi(struct lpfcMboxq *mbox, struct lpfc_vport *vport, dma_addr_t phys) |
2127 | { | 2127 | { |
2128 | struct lpfc_mbx_reg_vfi *reg_vfi; | 2128 | struct lpfc_mbx_reg_vfi *reg_vfi; |
2129 | struct lpfc_hba *phba = vport->phba; | ||
2129 | 2130 | ||
2130 | memset(mbox, 0, sizeof(*mbox)); | 2131 | memset(mbox, 0, sizeof(*mbox)); |
2131 | reg_vfi = &mbox->u.mqe.un.reg_vfi; | 2132 | reg_vfi = &mbox->u.mqe.un.reg_vfi; |
2132 | bf_set(lpfc_mqe_command, &mbox->u.mqe, MBX_REG_VFI); | 2133 | bf_set(lpfc_mqe_command, &mbox->u.mqe, MBX_REG_VFI); |
2133 | bf_set(lpfc_reg_vfi_vp, reg_vfi, 1); | 2134 | bf_set(lpfc_reg_vfi_vp, reg_vfi, 1); |
2134 | bf_set(lpfc_reg_vfi_vfi, reg_vfi, | 2135 | bf_set(lpfc_reg_vfi_vfi, reg_vfi, |
2135 | vport->phba->sli4_hba.vfi_ids[vport->vfi]); | 2136 | phba->sli4_hba.vfi_ids[vport->vfi]); |
2136 | bf_set(lpfc_reg_vfi_fcfi, reg_vfi, vport->phba->fcf.fcfi); | 2137 | bf_set(lpfc_reg_vfi_fcfi, reg_vfi, phba->fcf.fcfi); |
2137 | bf_set(lpfc_reg_vfi_vpi, reg_vfi, vport->phba->vpi_ids[vport->vpi]); | 2138 | bf_set(lpfc_reg_vfi_vpi, reg_vfi, phba->vpi_ids[vport->vpi]); |
2138 | memcpy(reg_vfi->wwn, &vport->fc_portname, sizeof(struct lpfc_name)); | 2139 | memcpy(reg_vfi->wwn, &vport->fc_portname, sizeof(struct lpfc_name)); |
2139 | reg_vfi->wwn[0] = cpu_to_le32(reg_vfi->wwn[0]); | 2140 | reg_vfi->wwn[0] = cpu_to_le32(reg_vfi->wwn[0]); |
2140 | reg_vfi->wwn[1] = cpu_to_le32(reg_vfi->wwn[1]); | 2141 | reg_vfi->wwn[1] = cpu_to_le32(reg_vfi->wwn[1]); |
2141 | reg_vfi->e_d_tov = vport->phba->fc_edtov; | 2142 | reg_vfi->e_d_tov = phba->fc_edtov; |
2142 | reg_vfi->r_a_tov = vport->phba->fc_ratov; | 2143 | reg_vfi->r_a_tov = phba->fc_ratov; |
2143 | reg_vfi->bde.addrHigh = putPaddrHigh(phys); | 2144 | reg_vfi->bde.addrHigh = putPaddrHigh(phys); |
2144 | reg_vfi->bde.addrLow = putPaddrLow(phys); | 2145 | reg_vfi->bde.addrLow = putPaddrLow(phys); |
2145 | reg_vfi->bde.tus.f.bdeSize = sizeof(vport->fc_sparam); | 2146 | reg_vfi->bde.tus.f.bdeSize = sizeof(vport->fc_sparam); |
2146 | reg_vfi->bde.tus.f.bdeFlags = BUFF_TYPE_BDE_64; | 2147 | reg_vfi->bde.tus.f.bdeFlags = BUFF_TYPE_BDE_64; |
2147 | bf_set(lpfc_reg_vfi_nport_id, reg_vfi, vport->fc_myDID); | 2148 | bf_set(lpfc_reg_vfi_nport_id, reg_vfi, vport->fc_myDID); |
2149 | |||
2150 | /* Only FC supports upd bit */ | ||
2151 | if ((phba->sli4_hba.lnk_info.lnk_tp == LPFC_LNK_TYPE_FC) && | ||
2152 | (vport->fc_flag & FC_VFI_REGISTERED)) { | ||
2153 | bf_set(lpfc_reg_vfi_vp, reg_vfi, 0); | ||
2154 | bf_set(lpfc_reg_vfi_upd, reg_vfi, 1); | ||
2155 | } | ||
2148 | lpfc_printf_vlog(vport, KERN_INFO, LOG_MBOX, | 2156 | lpfc_printf_vlog(vport, KERN_INFO, LOG_MBOX, |
2149 | "3134 Register VFI, mydid:x%x, fcfi:%d, " | 2157 | "3134 Register VFI, mydid:x%x, fcfi:%d, " |
2150 | " vfi:%d, vpi:%d, fc_pname:%x%x\n", | 2158 | " vfi:%d, vpi:%d, fc_pname:%x%x\n", |
2151 | vport->fc_myDID, | 2159 | vport->fc_myDID, |
2152 | vport->phba->fcf.fcfi, | 2160 | phba->fcf.fcfi, |
2153 | vport->phba->sli4_hba.vfi_ids[vport->vfi], | 2161 | phba->sli4_hba.vfi_ids[vport->vfi], |
2154 | vport->phba->vpi_ids[vport->vpi], | 2162 | phba->vpi_ids[vport->vpi], |
2155 | reg_vfi->wwn[0], reg_vfi->wwn[1]); | 2163 | reg_vfi->wwn[0], reg_vfi->wwn[1]); |
2156 | } | 2164 | } |
2157 | 2165 | ||