lpfc 8.3.2 : Addition of SLI4 Interface - Base Support - Part 3 of 6
Subsystems (2)
PATCH 6/17 lpfc 8.3.2 : Addition of SLI4 Interface - Base Support - Part 3 of 6
Addition of SLI4 Interface - Base Support - Part 3 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_scsi.h | 2 lpfc_sli.c | 1263 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- lpfc_sli.h | 27 + lpfc_sli4.h | 467 +++++++++++++++++++++ lpfc_vport.c | 23 + 5 files changed, 1748 insertions(+), 34 deletions(-)
drivers/scsi/lpfc/lpfc_scsi.h +2 -0
@@ -140,6 +140,8 @@ struct lpfc_scsi_buf {struct fcp_rsp *fcp_rsp;struct ulp_bde64 *fcp_bpl; +dma_addr_t dma_phys_bpl; +/* cur_iocbq has phys of the dma-able buffer. * Iotag is in here */
drivers/scsi/lpfc/lpfc_sli4.h +467 -0
467 lines not on this page · raw message
drivers/scsi/lpfc/lpfc_sli.c +1234 -29
1,390 lines not on this page · raw message
drivers/scsi/lpfc/lpfc_sli.h +22 -5
@@ -29,13 +29,23 @@ typedef enum _lpfc_ctx_cmd {LPFC_CTX_HOST } lpfc_ctx_cmd; +/* This structure is used to carry the needed response IOCB states */ +struct lpfc_sli4_rspiocb_info { +uint8_t hw_status; +uint8_t bfield; +#define LPFC_XB 0x1 +#define LPFC_PV 0x2 +uint8_t priority; +uint8_t reserved; +}; +/* This structure is used to handle IOCB requests / responses */ struct lpfc_iocbq {/* lpfc_iocbqs are used in double linked lists */ struct list_head list;struct list_head clist;uint16_t iotag;/* pre-assigned IO tag */ -uint16_t rsvd1; +uint16_t sli4_xritag;/* pre-assigned XRI, (OXID) tag. */ IOCB_t iocb;/* IOCB cmd */ uint8_t retry;/* retry counter for IOCB cmd - if needed */
@@ -65,7 +75,7 @@ struct lpfc_iocbq { struct lpfc_iocbq *);void (*iocb_cmpl) (struct lpfc_hba *,struct lpfc_iocbq *,struct lpfc_iocbq *); - +struct lpfc_sli4_rspiocb_info sli4_info; };#define SLI_IOCB_RET_IOCB 1/* Return IOCB if cmd ring full */
@@ -81,14 +91,18 @@ struct lpfc_iocbq {typedef struct lpfcMboxq {/* MBOXQs are used in single linked lists */ struct list_head list;/* ptr to next mailbox command */ -MAILBOX_t mb;/* Mailbox cmd */ -struct lpfc_vport *vport;/* virutal port pointer */ +union { +MAILBOX_t mb;/* Mailbox cmd */ +struct lpfc_mqe mqe; + } u; +struct lpfc_vport *vport;/* virtual port pointer */ void *context1;/* caller context information */ void *context2;/* caller context information */ void (*mbox_cmpl) (struct lpfc_hba *,struct lpfcMboxq *);uint8_t mbox_flag; - +struct lpfc_mcqe mcqe; +struct lpfc_mbx_nembed_sge_virt *sge_array; }LPFC_MBOXQ_t ;#define MBX_POLL 1/* poll mailbox till command done, then
@@ -234,6 +248,7 @@ struct lpfc_sli {#define LPFC_PROCESS_LA 0x400/* Able to process link attention */ #define LPFC_BLOCK_MGMT_IO 0x800/* Don't allow mgmt mbx or iocb cmds */ #define LPFC_MENLO_MAINT 0x1000/* need for menl fw download */ +#define LPFC_SLI_ASYNC_MBX_BLK 0x2000/* Async mailbox is blocked */ struct lpfc_sli_ring ring[LPFC_MAX_RING ];int fcp_ring;/* ring used for FCP initiator commands */
@@ -261,6 +276,8 @@ struct lpfc_sli {#define LPFC_MBOX_TMO 30/* Sec tmo for outstanding mbox command */ +#define LPFC_MBOX_SLI4_CONFIG_TMO 60/* Sec tmo for outstanding mbox +command */ #define LPFC_MBOX_TMO_FLASH_CMD 300/* Sec tmo for outstanding FLASH write * or erase cmds. This is especially * long because of the potential of
drivers/scsi/lpfc/lpfc_vport.c +23 -0
@@ -32,8 +32,10 @@#include <scsi/scsi_device.h> #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"
@@ -89,6 +91,8 @@ lpfc_alloc_vpi(struct lpfc_hba *phba) vpi =0 ; else set_bit(vpi, phba->vpi_bmask); +if (phba->sli_rev ==LPFC_SLI_REV4 ) + phba->sli4_hba.max_cfg_param.vpi_used++;spin_unlock_irq (&phba->hbalock);return vpi; }
@@ -96,8 +100,12 @@ lpfc_alloc_vpi(struct lpfc_hba *phba)static void lpfc_free_vpi (struct lpfc_hba *phba,int vpi) { +if (vpi ==0 ) +return ;spin_lock_irq (&phba->hbalock);clear_bit (vpi, phba->vpi_bmask); +if (phba->sli_rev ==LPFC_SLI_REV4 ) + phba->sli4_hba.max_cfg_param.vpi_used--;spin_unlock_irq (&phba->hbalock); }
@@ -308,6 +316,21 @@ lpfc_vport_create(struct fc_vport *fc_vp goto error_out; } +/* +* In SLI4, the vpi must be activated before it can be used +* by the port. +*/ +if (phba->sli_rev ==LPFC_SLI_REV4 ) { + rc =lpfc_sli4_init_vpi (phba, vpi); +if (rc) { +lpfc_printf_log (phba,KERN_ERR ,LOG_VPORT , +"1838 Failed to INIT_VPI on vpi %d " +"status %d\n" , vpi, rc); + rc =VPORT_NORESOURCES ; +lpfc_free_vpi (phba, vpi); + goto error_out; + } + }/* Assign an unused board number */ if ((instance =lpfc_get_instance ()) <0 ) {