aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/lpfc
diff options
context:
space:
mode:
authorJames Smart <james.smart@emulex.com>2013-03-01 16:35:38 -0500
committerJames Bottomley <JBottomley@Parallels.com>2013-04-09 18:07:39 -0400
commitae05ebe3bec9b2cecb1c09461ba2fd0dbfa81abb (patch)
treea7ba32da1d9388df31485a1562f6b3057d614bfc /drivers/scsi/lpfc
parent0e9bb8d79c52ca115f3fc4a692ca0dd6931e2eeb (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.h1
-rw-r--r--drivers/scsi/lpfc/lpfc_els.c15
-rw-r--r--drivers/scsi/lpfc/lpfc_hbadisc.c5
-rw-r--r--drivers/scsi/lpfc/lpfc_hw4.h3
-rw-r--r--drivers/scsi/lpfc/lpfc_mbox.c24
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 *);
106void lpfc_cleanup(struct lpfc_vport *); 106void lpfc_cleanup(struct lpfc_vport *);
107void lpfc_disc_timeout(unsigned long); 107void lpfc_disc_timeout(unsigned long);
108 108
109int lpfc_unregister_fcf_prep(struct lpfc_hba *);
109struct lpfc_nodelist *__lpfc_findnode_rpi(struct lpfc_vport *, uint16_t); 110struct lpfc_nodelist *__lpfc_findnode_rpi(struct lpfc_vport *, uint16_t);
110struct lpfc_nodelist *lpfc_findnode_rpi(struct lpfc_vport *, uint16_t); 111struct lpfc_nodelist *lpfc_findnode_rpi(struct lpfc_vport *, uint16_t);
111void lpfc_worker_wake_up(struct lpfc_hba *); 112void 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
1959struct lpfc_mbx_reg_vfi { 1959struct 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
2126lpfc_reg_vfi(struct lpfcMboxq *mbox, struct lpfc_vport *vport, dma_addr_t phys) 2126lpfc_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