lpfc 8.3.2 : Addition of SLI4 Interface - Base Support - Part 2 of 6
Subsystems (2)
PATCH 5/17 lpfc 8.3.2 : Addition of SLI4 Interface - Base Support - Part 2 of 6
Addition of SLI4 Interface - Base Support - Part 2 of 6
Adds new hardware and interface definitions.
Adds new interface routines - utilizing the reorganized layout of the driver. Adds SLI-4 specific functions for attachment, initialization, teardown, etc.
Signed-off-by James Smart <[email protected]>
---
lpfc.h | 49 ++++- lpfc_attr.c | 83 +++++++-- lpfc_crtn.h | 59 +++++- lpfc_ct.c | 2 lpfc_debugfs.c | 2 lpfc_els.c | 4 lpfc_hbadisc.c | 34 +++ lpfc_hw.h | 140 ++++++++++----- lpfc_mbox.c | 2 lpfc_mem.c | 204 +++++++++++++++++----- lpfc_nportdisc.c | 2 lpfc_scsi.c | 492 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 12 files changed, 951 insertions(+), 122 deletions(-)
drivers/scsi/lpfc/lpfc_attr.c +67 -16
@@ -30,8 +30,10 @@#include <scsi/scsi_tcq.h> #include <scsi/scsi_transport_fc.h> +#include "lpfc_hw4.h" #include "lpfc_hw.h" #include "lpfc_sli.h" +#include "lpfc_sli4.h" #include "lpfc_nl.h" #include "lpfc_disc.h" #include "lpfc_scsi.h"
@@ -828,18 +830,37 @@ lpfc_get_hba_info(struct lpfc_hba *phba,return 0 ; } -if (mrpi) - *mrpi = pmb->un.varRdConfig.max_rpi; -if (arpi) - *arpi = pmb->un.varRdConfig.avail_rpi; -if (mxri) - *mxri = pmb->un.varRdConfig.max_xri; -if (axri) - *axri = pmb->un.varRdConfig.avail_xri; -if (mvpi) - *mvpi = pmb->un.varRdConfig.max_vpi; -if (avpi) - *avpi = pmb->un.varRdConfig.avail_vpi; +if (phba->sli_rev ==LPFC_SLI_REV4 ) { + rd_config = &pmboxq->u.mqe.un.rd_config; +if (mrpi) + *mrpi =bf_get (lpfc_mbx_rd_conf_rpi_count, rd_config); +if (arpi) + *arpi =bf_get (lpfc_mbx_rd_conf_rpi_count, rd_config) - + phba->sli4_hba.max_cfg_param.rpi_used; +if (mxri) + *mxri =bf_get (lpfc_mbx_rd_conf_xri_count, rd_config); +if (axri) + *axri =bf_get (lpfc_mbx_rd_conf_xri_count, rd_config) - + phba->sli4_hba.max_cfg_param.xri_used; +if (mvpi) + *mvpi =bf_get (lpfc_mbx_rd_conf_vpi_count, rd_config); +if (avpi) + *avpi =bf_get (lpfc_mbx_rd_conf_vpi_count, rd_config) - + phba->sli4_hba.max_cfg_param.vpi_used; + }else { +if (mrpi) + *mrpi = pmb->un.varRdConfig.max_rpi; +if (arpi) + *arpi = pmb->un.varRdConfig.avail_rpi; +if (mxri) + *mxri = pmb->un.varRdConfig.max_xri; +if (axri) + *axri = pmb->un.varRdConfig.avail_xri; +if (mvpi) + *mvpi = pmb->un.varRdConfig.max_vpi; +if (avpi) + *avpi = pmb->un.varRdConfig.avail_vpi; + }mempool_free (pmboxq, phba->mbox_mem_pool);return 1 ;
@@ -2844,15 +2865,39 @@ LPFC_ATTR_RW(poll_tmo, 10, 1, 255,/* # lpfc_use_msi: Use MSI (Message Signaled Interrupts) in systems that # support this feature -# 0 = MSI disabled +# 0 = MSI disabled (default) # 1 = MSI enabled -# 2 = MSI-X enabled (default) -# Value range is [0,2]. Default value is 2. +# 2 = MSI-X enabled +# Value range is [0,2]. Default value is 0. */ -LPFC_ATTR_R (use_msi,2 ,0 ,2 ,"Use Message Signaled Interrupts (1) or " +LPFC_ATTR_R (use_msi,0 ,0 ,2 ,"Use Message Signaled Interrupts (1) or " "MSI-X (2), if possible" );/* +# lpfc_fcp_imax: Set the maximum number of fast-path FCP interrupts per second +# +# Value range is [636,651042]. Default value is 10000. +*/ +LPFC_ATTR_R (fcp_imax,LPFC_FP_DEF_IMAX ,LPFC_MIM_IMAX ,LPFC_DMULT_CONST , +"Set the maximum number of fast-path FCP interrupts per second" ); + +/* +# lpfc_fcp_wq_count: Set the number of fast-path FCP work queues +# +# Value range is [1,31]. Default value is 4. +*/ +LPFC_ATTR_R (fcp_wq_count,LPFC_FP_WQN_DEF ,LPFC_FP_WQN_MIN ,LPFC_FP_WQN_MAX , +"Set the number of fast-path FCP work queues, if possible" ); + +/* +# lpfc_fcp_eq_count: Set the number of fast-path FCP event queues +# +# Value range is [1,7]. Default value is 1. +*/ +LPFC_ATTR_R (fcp_eq_count,LPFC_FP_EQN_DEF ,LPFC_FP_EQN_MIN ,LPFC_FP_EQN_MAX , +"Set the number of fast-path FCP event queues, if possible" ); + +/* # lpfc_enable_hba_reset: Allow or prevent HBA resets to the hardware. # 0 = HBA resets disabled # 1 = HBA resets enabled (default)
@@ -2969,6 +3014,9 @@ struct device_attribute *lpfc_hba_attrs[ &dev_attr_lpfc_poll, &dev_attr_lpfc_poll_tmo, &dev_attr_lpfc_use_msi, + &dev_attr_lpfc_fcp_imax, + &dev_attr_lpfc_fcp_wq_count, + &dev_attr_lpfc_fcp_eq_count, &dev_attr_lpfc_enable_bg, &dev_attr_lpfc_soft_wwnn, &dev_attr_lpfc_soft_wwpn,
@@ -4105,6 +4153,9 @@ lpfc_get_cfgparam(struct lpfc_hba *phba)lpfc_poll_tmo_init (phba, lpfc_poll_tmo);lpfc_enable_npiv_init (phba, lpfc_enable_npiv);lpfc_use_msi_init (phba, lpfc_use_msi); +lpfc_fcp_imax_init (phba, lpfc_fcp_imax); +lpfc_fcp_wq_count_init (phba, lpfc_fcp_wq_count); +lpfc_fcp_eq_count_init (phba, lpfc_fcp_eq_count);lpfc_enable_hba_reset_init (phba, lpfc_enable_hba_reset);lpfc_enable_hba_heartbeat_init (phba, lpfc_enable_hba_heartbeat);lpfc_enable_bg_init (phba, lpfc_enable_bg);
drivers/scsi/lpfc/lpfc_crtn.h +48 -11
135 lines not on this page · raw message
drivers/scsi/lpfc/lpfc_ct.c +2 -0
@@ -32,8 +32,10 @@#include <scsi/scsi_host.h> #include <scsi/scsi_transport_fc.h> +#include "lpfc_hw4.h" #include "lpfc_hw.h" #include "lpfc_sli.h" +#include "lpfc_sli4.h" #include "lpfc_nl.h" #include "lpfc_disc.h" #include "lpfc_scsi.h"
drivers/scsi/lpfc/lpfc_debugfs.c +2 -0
@@ -33,8 +33,10 @@#include <scsi/scsi_host.h> #include <scsi/scsi_transport_fc.h> +#include "lpfc_hw4.h" #include "lpfc_hw.h" #include "lpfc_sli.h" +#include "lpfc_sli4.h" #include "lpfc_nl.h" #include "lpfc_disc.h" #include "lpfc_scsi.h"
drivers/scsi/lpfc/lpfc_els.c +3 -1
@@ -28,8 +28,10 @@#include <scsi/scsi_host.h> #include <scsi/scsi_transport_fc.h> +#include "lpfc_hw4.h" #include "lpfc_hw.h" #include "lpfc_sli.h" +#include "lpfc_sli4.h" #include "lpfc_nl.h" #include "lpfc_disc.h" #include "lpfc_scsi.h"
@@ -220,7 +222,7 @@ lpfc_prep_els_iocb(struct lpfc_vport *vp icmd->un.elsreq64.myID = vport->fc_myDID;/* For ELS_REQUEST64_CR, use the VPI by default */ - icmd->ulpContext = vport->vpi; + icmd->ulpContext = vport->vpi + phba->vpi_base; icmd->ulpCt_h =0 ;/* The CT field must be 0=INVALID_RPI for the ECHO cmd */ if (elscmd ==ELS_CMD_ECHO )
drivers/scsi/lpfc/lpfc.h +44 -5
124 lines not on this page · raw message
drivers/scsi/lpfc/lpfc_hbadisc.c +30 -4
@@ -29,10 +29,12 @@#include <scsi/scsi_host.h> #include <scsi/scsi_transport_fc.h> +#include "lpfc_hw4.h" #include "lpfc_hw.h" #include "lpfc_nl.h" #include "lpfc_disc.h" #include "lpfc_sli.h" +#include "lpfc_sli4.h" #include "lpfc_scsi.h" #include "lpfc.h" #include "lpfc_logmsg.h"
@@ -491,6 +493,10 @@ lpfc_work_done(struct lpfc_hba *phba) phba->work_ha =0 ;spin_unlock_irq (&phba->hbalock); +/* First, try to post the next mailbox command to SLI4 device */ +if (phba->pci_dev_grp ==LPFC_PCI_DEV_OC ) +lpfc_sli4_post_async_mbox (phba); +if (ha_copy &HA_ERATT )/* Handle the error attention event */ lpfc_handle_eratt (phba);
@@ -501,9 +507,27 @@ lpfc_work_done(struct lpfc_hba *phba)if (ha_copy &HA_LATT )lpfc_handle_latt (phba); +/* Process SLI4 events */ +if (phba->pci_dev_grp ==LPFC_PCI_DEV_OC ) { +if (phba->hba_flag &FCP_XRI_ABORT_EVENT ) +lpfc_sli4_fcp_xri_abort_event_proc (phba); +if (phba->hba_flag &ELS_XRI_ABORT_EVENT ) +lpfc_sli4_els_xri_abort_event_proc (phba); +if (phba->hba_flag &ASYNC_EVENT ) +lpfc_sli4_async_event_proc (phba); +if (phba->hba_flag &HBA_POST_RECEIVE_BUFFER ) { +spin_lock_irq (&phba->hbalock); + phba->hba_flag &= ~HBA_POST_RECEIVE_BUFFER ; +spin_unlock_irq (&phba->hbalock); +lpfc_sli_hbqbuf_add_hbqs (phba,LPFC_ELS_HBQ ); + } +if (phba->hba_flag &HBA_RECEIVE_BUFFER ) +lpfc_sli4_handle_received_buffer (phba); + } + vports =lpfc_create_vport_work_array (phba);if (vports !=NULL ) -for (i =0 ; i <= phba->max_vpi; i++) { +for (i =0 ; i <= phba->max_vports; i++) {/* * We could have no vports in array if unloading, so if * this happens then just use the pport
@@ -2556,7 +2580,8 @@ lpfc_issue_clear_la(struct lpfc_hba *phb* clear_la then don't send it. */ if ((phba->link_state >=LPFC_CLEAR_LA ) || - (vport->port_type !=LPFC_PHYSICAL_PORT )) + (vport->port_type !=LPFC_PHYSICAL_PORT ) || + (phba->sli_rev ==LPFC_SLI_REV4 ))return ;/* Link up discovery */
@@ -2585,7 +2610,7 @@ lpfc_issue_reg_vpi(struct lpfc_hba *phba regvpimbox =mempool_alloc (phba->mbox_mem_pool,GFP_KERNEL );if (regvpimbox) { -lpfc_reg_vpi (phba, vport->vpi, vport->fc_myDID, regvpimbox); +lpfc_reg_vpi (vport, regvpimbox); regvpimbox->mbox_cmpl = lpfc_mbx_cmpl_reg_vpi; regvpimbox->vport = vport; if (lpfc_sli_issue_mbox(phba, regvpimbox, MBX_NOWAIT)
@@ -2645,7 +2670,8 @@ lpfc_disc_start(struct lpfc_vport *vport*/ if ((phba->sli3_options &LPFC_SLI3_NPIV_ENABLED ) && !(vport->fc_flag &FC_PT2PT ) && - !(vport->fc_flag &FC_RSCN_MODE )) { + !(vport->fc_flag &FC_RSCN_MODE ) && + (phba->sli_rev <LPFC_SLI_REV4 )) {lpfc_issue_reg_vpi (phba, vport);return ; }
drivers/scsi/lpfc/lpfc_hw.h +98 -42
246 lines not on this page · raw message
drivers/scsi/lpfc/lpfc_mbox.c +2 -0
@@ -28,8 +28,10 @@#include <scsi/scsi.h> +#include "lpfc_hw4.h" #include "lpfc_hw.h" #include "lpfc_sli.h" +#include "lpfc_sli4.h" #include "lpfc_nl.h" #include "lpfc_disc.h" #include "lpfc_scsi.h"
drivers/scsi/lpfc/lpfc_mem.c +161 -43
319 lines not on this page · raw message
drivers/scsi/lpfc/lpfc_nportdisc.c +2 -0
@@ -28,8 +28,10 @@#include <scsi/scsi_host.h> #include <scsi/scsi_transport_fc.h> +#include "lpfc_hw4.h" #include "lpfc_hw.h" #include "lpfc_sli.h" +#include "lpfc_sli4.h" #include "lpfc_nl.h" #include "lpfc_disc.h" #include "lpfc_scsi.h"
drivers/scsi/lpfc/lpfc_scsi.c +492 -0
554 lines not on this page · raw message