[SCSI] lpfc 8.3.29: SLI related fixes
[linux-2.6.git] / drivers / scsi / lpfc / lpfc_hw.h
index fc958a9..5f280b5 100644 (file)
@@ -1,27 +1,23 @@
 /*******************************************************************
  * This file is part of the Emulex Linux Device Driver for         *
- * Enterprise Fibre Channel Host Bus Adapters.                     *
- * Refer to the README file included with this package for         *
- * driver version and adapter support.                             *
- * Copyright (C) 2004 Emulex Corporation.                          *
+ * Fibre Channel Host Bus Adapters.                                *
+ * Copyright (C) 2004-2011 Emulex.  All rights reserved.           *
+ * EMULEX and SLI are trademarks of Emulex.                        *
  * www.emulex.com                                                  *
  *                                                                 *
  * This program is free software; you can redistribute it and/or   *
- * modify it under the terms of the GNU General Public License     *
- * as published by the Free Software Foundation; either version 2  *
- * of the License, or (at your option) any later version.          *
- *                                                                 *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of  *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   *
- * GNU General Public License for more details, a copy of which    *
- * can be found in the file COPYING included with this package.    *
+ * modify it under the terms of version 2 of the GNU General       *
+ * Public License as published by the Free Software Foundation.    *
+ * This program is distributed in the hope that it will be useful. *
+ * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND          *
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,  *
+ * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE      *
+ * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD *
+ * TO BE LEGALLY INVALID.  See the GNU General Public License for  *
+ * more details, a copy of which can be found in the file COPYING  *
+ * included with this package.                                     *
  *******************************************************************/
 
-/*
- * $Id: lpfc_hw.h 1.37 2005/03/29 19:51:45EST sf_support Exp  $
- */
-
 #define FDMI_DID        0xfffffaU
 #define NameServer_DID  0xfffffcU
 #define SCR_DID         0xfffffdU
 #define FCELSSIZE             1024     /* maximum ELS transfer size */
 
 #define LPFC_FCP_RING            0     /* ring 0 for FCP initiator commands */
-#define LPFC_IP_RING             1     /* ring 1 for IP commands */
+#define LPFC_EXTRA_RING          1     /* ring 1 for other protocols */
 #define LPFC_ELS_RING            2     /* ring 2 for ELS commands */
 #define LPFC_FCP_NEXT_RING       3
 
 #define SLI2_IOCB_CMD_R0_ENTRIES    172        /* SLI-2 FCP command ring entries */
 #define SLI2_IOCB_RSP_R0_ENTRIES    134        /* SLI-2 FCP response ring entries */
-#define SLI2_IOCB_CMD_R1_ENTRIES      4        /* SLI-2 IP command ring entries */
-#define SLI2_IOCB_RSP_R1_ENTRIES      4        /* SLI-2 IP response ring entries */
+#define SLI2_IOCB_CMD_R1_ENTRIES      4        /* SLI-2 extra command ring entries */
+#define SLI2_IOCB_RSP_R1_ENTRIES      4        /* SLI-2 extra response ring entries */
 #define SLI2_IOCB_CMD_R1XTRA_ENTRIES 36        /* SLI-2 extra FCP cmd ring entries */
 #define SLI2_IOCB_RSP_R1XTRA_ENTRIES 52        /* SLI-2 extra FCP rsp ring entries */
 #define SLI2_IOCB_CMD_R2_ENTRIES     20        /* SLI-2 ELS command ring entries */
 #define SLI2_IOCB_CMD_R3XTRA_ENTRIES 24
 #define SLI2_IOCB_RSP_R3XTRA_ENTRIES 32
 
+#define SLI2_IOCB_CMD_SIZE     32
+#define SLI2_IOCB_RSP_SIZE     32
+#define SLI3_IOCB_CMD_SIZE     128
+#define SLI3_IOCB_RSP_SIZE     64
+
+#define LPFC_UNREG_ALL_RPIS_VPORT      0xffff
+#define LPFC_UNREG_ALL_DFLT_RPIS       0xffffffff
+
+/* vendor ID used in SCSI netlink calls */
+#define LPFC_NL_VENDOR_ID (SCSI_NL_VID_TYPE_PCI | PCI_VENDOR_ID_EMULEX)
+
+#define FW_REV_STR_SIZE        32
 /* Common Transport structures and definitions */
 
 union CtRevisionId {
@@ -83,6 +91,9 @@ union CtCommandResponse {
        uint32_t word;
 };
 
+#define FC4_FEATURE_INIT 0x2
+#define FC4_FEATURE_TARGET 0x1
+
 struct lpfc_sli_ct_request {
        /* Structure is in Big Endian format */
        union CtRevisionId RevisionId;
@@ -134,14 +145,47 @@ struct lpfc_sli_ct_request {
                        uint8_t len;
                        uint8_t symbname[255];
                } rsnn;
+               struct da_id { /* For DA_ID requests */
+                       uint32_t port_id;
+               } da_id;
+               struct rspn {   /* For RSPN_ID requests */
+                       uint32_t PortId;
+                       uint8_t len;
+                       uint8_t symbname[255];
+               } rspn;
+               struct gff {
+                       uint32_t PortId;
+               } gff;
+               struct gff_acc {
+                       uint8_t fbits[128];
+               } gff_acc;
+#define FCP_TYPE_FEATURE_OFFSET 7
+               struct rff {
+                       uint32_t PortId;
+                       uint8_t reserved[2];
+                       uint8_t fbits;
+                       uint8_t type_code;     /* type=8 for FCP */
+               } rff;
        } un;
 };
 
 #define  SLI_CT_REVISION        1
-#define  GID_REQUEST_SZ         (sizeof(struct lpfc_sli_ct_request) - 260)
-#define  RFT_REQUEST_SZ         (sizeof(struct lpfc_sli_ct_request) - 228)
-#define  RNN_REQUEST_SZ         (sizeof(struct lpfc_sli_ct_request) - 252)
-#define  RSNN_REQUEST_SZ        (sizeof(struct lpfc_sli_ct_request))
+#define  GID_REQUEST_SZ   (offsetof(struct lpfc_sli_ct_request, un) + \
+                          sizeof(struct gid))
+#define  GFF_REQUEST_SZ   (offsetof(struct lpfc_sli_ct_request, un) + \
+                          sizeof(struct gff))
+#define  RFT_REQUEST_SZ   (offsetof(struct lpfc_sli_ct_request, un) + \
+                          sizeof(struct rft))
+#define  RFF_REQUEST_SZ   (offsetof(struct lpfc_sli_ct_request, un) + \
+                          sizeof(struct rff))
+#define  RNN_REQUEST_SZ   (offsetof(struct lpfc_sli_ct_request, un) + \
+                          sizeof(struct rnn))
+#define  RSNN_REQUEST_SZ  (offsetof(struct lpfc_sli_ct_request, un) + \
+                          sizeof(struct rsnn))
+#define DA_ID_REQUEST_SZ (offsetof(struct lpfc_sli_ct_request, un) + \
+                         sizeof(struct da_id))
+#define  RSPN_REQUEST_SZ  (offsetof(struct lpfc_sli_ct_request, un) + \
+                          sizeof(struct rspn))
 
 /*
  * FsType Definitions
@@ -216,6 +260,7 @@ struct lpfc_sli_ct_request {
 #define  SLI_CTNS_GFT_ID      0x0117
 #define  SLI_CTNS_GSPN_ID     0x0118
 #define  SLI_CTNS_GPT_ID      0x011A
+#define  SLI_CTNS_GFF_ID      0x011F
 #define  SLI_CTNS_GID_PN      0x0121
 #define  SLI_CTNS_GID_NN      0x0131
 #define  SLI_CTNS_GIP_NN      0x0135
@@ -231,6 +276,7 @@ struct lpfc_sli_ct_request {
 #define  SLI_CTNS_RFT_ID      0x0217
 #define  SLI_CTNS_RSPN_ID     0x0218
 #define  SLI_CTNS_RPT_ID      0x021A
+#define  SLI_CTNS_RFF_ID      0x021F
 #define  SLI_CTNS_RIP_NN      0x0235
 #define  SLI_CTNS_RIPA_NN     0x0236
 #define  SLI_CTNS_RSNN_NN     0x0239
@@ -266,12 +312,16 @@ struct lpfc_sli_ct_request {
 #define FF_FRAME_SIZE     2048
 
 struct lpfc_name {
+       union {
+               struct {
 #ifdef __BIG_ENDIAN_BITFIELD
-       uint8_t nameType:4;     /* FC Word 0, bit 28:31 */
-       uint8_t IEEEextMsn:4;   /* FC Word 0, bit 24:27, bit 8:11 of IEEE ext */
+                       uint8_t nameType:4;     /* FC Word 0, bit 28:31 */
+                       uint8_t IEEEextMsn:4;   /* FC Word 0, bit 24:27, bit
+                                                  8:11 of IEEE ext */
 #else  /*  __LITTLE_ENDIAN_BITFIELD */
-       uint8_t IEEEextMsn:4;   /* FC Word 0, bit 24:27, bit 8:11 of IEEE ext */
-       uint8_t nameType:4;     /* FC Word 0, bit 28:31 */
+                       uint8_t IEEEextMsn:4;   /* FC Word 0, bit 24:27, bit
+                                                  8:11 of IEEE ext */
+                       uint8_t nameType:4;     /* FC Word 0, bit 28:31 */
 #endif
 
 #define NAME_IEEE           0x1        /* IEEE name - nameType */
@@ -280,8 +330,12 @@ struct lpfc_name {
 #define NAME_IP_TYPE        0x4        /* IP address */
 #define NAME_CCITT_TYPE     0xC
 #define NAME_CCITT_GR_TYPE  0xE
-       uint8_t IEEEextLsb;     /* FC Word 0, bit 16:23, IEEE extended Lsb */
-       uint8_t IEEE[6];        /* FC IEEE address */
+                       uint8_t IEEEextLsb;     /* FC Word 0, bit 16:23, IEEE
+                                                  extended Lsb */
+                       uint8_t IEEE[6];        /* FC IEEE address */
+               } s;
+               uint8_t wwn[8];
+       } u;
 };
 
 struct csp {
@@ -290,10 +344,22 @@ struct csp {
        uint8_t bbCreditMsb;
        uint8_t bbCreditlsb;    /* FC Word 0, byte 3 */
 
+/*
+ * Word 1 Bit 31 in common service parameter is overloaded.
+ * Word 1 Bit 31 in FLOGI request is multiple NPort request
+ * Word 1 Bit 31 in FLOGI response is clean address bit
+ */
+#define clean_address_bit request_multiple_Nport /* Word 1, bit 31 */
+/*
+ * Word 1 Bit 30 in common service parameter is overloaded.
+ * Word 1 Bit 30 in FLOGI request is Virtual Fabrics
+ * Word 1 Bit 30 in PLOGI request is random offset
+ */
+#define virtual_fabric_support randomOffset /* Word 1, bit 30 */
 #ifdef __BIG_ENDIAN_BITFIELD
-       uint16_t increasingOffset:1;    /* FC Word 1, bit 31 */
+       uint16_t request_multiple_Nport:1;      /* FC Word 1, bit 31 */
        uint16_t randomOffset:1;        /* FC Word 1, bit 30 */
-       uint16_t word1Reserved2:1;      /* FC Word 1, bit 29 */
+       uint16_t response_multiple_NPort:1;     /* FC Word 1, bit 29 */
        uint16_t fPort:1;       /* FC Word 1, bit 28 */
        uint16_t altBbCredit:1; /* FC Word 1, bit 27 */
        uint16_t edtovResolution:1;     /* FC Word 1, bit 26 */
@@ -312,9 +378,9 @@ struct csp {
        uint16_t edtovResolution:1;     /* FC Word 1, bit 26 */
        uint16_t altBbCredit:1; /* FC Word 1, bit 27 */
        uint16_t fPort:1;       /* FC Word 1, bit 28 */
-       uint16_t word1Reserved2:1;      /* FC Word 1, bit 29 */
+       uint16_t response_multiple_NPort:1;     /* FC Word 1, bit 29 */
        uint16_t randomOffset:1;        /* FC Word 1, bit 30 */
-       uint16_t increasingOffset:1;    /* FC Word 1, bit 31 */
+       uint16_t request_multiple_Nport:1;      /* FC Word 1, bit 31 */
 
        uint16_t payloadlength:1;       /* FC Word 1, bit 16 */
        uint16_t contIncSeqCnt:1;       /* FC Word 1, bit 17 */
@@ -420,6 +486,35 @@ struct serv_parm { /* Structure is in Big Endian format */
 };
 
 /*
+ * Virtual Fabric Tagging Header
+ */
+struct fc_vft_header {
+        uint32_t word0;
+#define fc_vft_hdr_r_ctl_SHIFT         24
+#define fc_vft_hdr_r_ctl_MASK          0xFF
+#define fc_vft_hdr_r_ctl_WORD          word0
+#define fc_vft_hdr_ver_SHIFT           22
+#define fc_vft_hdr_ver_MASK            0x3
+#define fc_vft_hdr_ver_WORD            word0
+#define fc_vft_hdr_type_SHIFT          18
+#define fc_vft_hdr_type_MASK           0xF
+#define fc_vft_hdr_type_WORD           word0
+#define fc_vft_hdr_e_SHIFT             16
+#define fc_vft_hdr_e_MASK              0x1
+#define fc_vft_hdr_e_WORD              word0
+#define fc_vft_hdr_priority_SHIFT      13
+#define fc_vft_hdr_priority_MASK       0x7
+#define fc_vft_hdr_priority_WORD       word0
+#define fc_vft_hdr_vf_id_SHIFT         1
+#define fc_vft_hdr_vf_id_MASK          0xFFF
+#define fc_vft_hdr_vf_id_WORD          word0
+       uint32_t word1;
+#define fc_vft_hdr_hopct_SHIFT         24
+#define fc_vft_hdr_hopct_MASK          0xFF
+#define fc_vft_hdr_hopct_WORD          word1
+};
+
+/*
  *  Extended Link Service LS_COMMAND codes (Payload Word 0)
  */
 #ifdef __BIG_ENDIAN_BITFIELD
@@ -445,15 +540,19 @@ struct serv_parm {        /* Structure is in Big Endian format */
 #define ELS_CMD_RRQ       0x12000000
 #define ELS_CMD_PRLI      0x20100014
 #define ELS_CMD_PRLO      0x21100014
+#define ELS_CMD_PRLO_ACC  0x02100014
 #define ELS_CMD_PDISC     0x50000000
 #define ELS_CMD_FDISC     0x51000000
 #define ELS_CMD_ADISC     0x52000000
 #define ELS_CMD_FARP      0x54000000
 #define ELS_CMD_FARPR     0x55000000
+#define ELS_CMD_RPS       0x56000000
+#define ELS_CMD_RPL       0x57000000
 #define ELS_CMD_FAN       0x60000000
 #define ELS_CMD_RSCN      0x61040000
 #define ELS_CMD_SCR       0x62000000
 #define ELS_CMD_RNID      0x78000000
+#define ELS_CMD_LIRR      0x7A000000
 #else  /*  __LITTLE_ENDIAN_BITFIELD */
 #define ELS_CMD_MASK      0xffff
 #define ELS_RSP_MASK      0xff
@@ -477,15 +576,19 @@ struct serv_parm {        /* Structure is in Big Endian format */
 #define ELS_CMD_RRQ       0x12
 #define ELS_CMD_PRLI      0x14001020
 #define ELS_CMD_PRLO      0x14001021
+#define ELS_CMD_PRLO_ACC  0x14001002
 #define ELS_CMD_PDISC     0x50
 #define ELS_CMD_FDISC     0x51
 #define ELS_CMD_ADISC     0x52
 #define ELS_CMD_FARP      0x54
 #define ELS_CMD_FARPR     0x55
+#define ELS_CMD_RPS       0x56
+#define ELS_CMD_RPL       0x57
 #define ELS_CMD_FAN       0x60
 #define ELS_CMD_RSCN      0x0461
 #define ELS_CMD_SCR       0x62
 #define ELS_CMD_RNID      0x78
+#define ELS_CMD_LIRR      0x7A
 #endif
 
 /*
@@ -525,6 +628,7 @@ struct ls_rjt {     /* Structure is in Big Endian format */
 #define LSEXP_INVALID_O_SID     0x15
 #define LSEXP_INVALID_OX_RX     0x17
 #define LSEXP_CMD_IN_PROGRESS   0x19
+#define LSEXP_PORT_LOGIN_REQ    0x1E
 #define LSEXP_INVALID_NPORT_ID  0x1F
 #define LSEXP_INVALID_SEQ_ID    0x21
 #define LSEXP_INVALID_XCHG      0x23
@@ -754,12 +858,101 @@ typedef struct _RNID {           /* Structure is in Big Endian format */
        } un;
 } RNID;
 
-typedef struct _RRQ {          /* Structure is in Big Endian format */
-       uint32_t SID;
-       uint16_t Oxid;
-       uint16_t Rxid;
-       uint8_t resv[32];       /* optional association hdr */
-} RRQ;
+typedef struct  _RPS {         /* Structure is in Big Endian format */
+       union {
+               uint32_t portNum;
+               struct lpfc_name portName;
+       } un;
+} RPS;
+
+typedef struct  _RPS_RSP {     /* Structure is in Big Endian format */
+       uint16_t rsvd1;
+       uint16_t portStatus;
+       uint32_t linkFailureCnt;
+       uint32_t lossSyncCnt;
+       uint32_t lossSignalCnt;
+       uint32_t primSeqErrCnt;
+       uint32_t invalidXmitWord;
+       uint32_t crcCnt;
+} RPS_RSP;
+
+struct RLS {                   /* Structure is in Big Endian format */
+       uint32_t rls;
+#define rls_rsvd_SHIFT         24
+#define rls_rsvd_MASK          0x000000ff
+#define rls_rsvd_WORD          rls
+#define rls_did_SHIFT          0
+#define rls_did_MASK           0x00ffffff
+#define rls_did_WORD           rls
+};
+
+struct  RLS_RSP {              /* Structure is in Big Endian format */
+       uint32_t linkFailureCnt;
+       uint32_t lossSyncCnt;
+       uint32_t lossSignalCnt;
+       uint32_t primSeqErrCnt;
+       uint32_t invalidXmitWord;
+       uint32_t crcCnt;
+};
+
+struct RRQ {                   /* Structure is in Big Endian format */
+       uint32_t rrq;
+#define rrq_rsvd_SHIFT         24
+#define rrq_rsvd_MASK          0x000000ff
+#define rrq_rsvd_WORD          rrq
+#define rrq_did_SHIFT          0
+#define rrq_did_MASK           0x00ffffff
+#define rrq_did_WORD           rrq
+       uint32_t rrq_exchg;
+#define rrq_oxid_SHIFT         16
+#define rrq_oxid_MASK          0xffff
+#define rrq_oxid_WORD          rrq_exchg
+#define rrq_rxid_SHIFT         0
+#define rrq_rxid_MASK          0xffff
+#define rrq_rxid_WORD          rrq_exchg
+};
+
+#define LPFC_MAX_VFN_PER_PFN   255 /* Maximum VFs allowed per ARI */
+#define LPFC_DEF_VFN_PER_PFN   0   /* Default VFs due to platform limitation*/
+
+struct RTV_RSP {               /* Structure is in Big Endian format */
+       uint32_t ratov;
+       uint32_t edtov;
+       uint32_t qtov;
+#define qtov_rsvd0_SHIFT       28
+#define qtov_rsvd0_MASK                0x0000000f
+#define qtov_rsvd0_WORD                qtov            /* reserved */
+#define qtov_edtovres_SHIFT    27
+#define qtov_edtovres_MASK     0x00000001
+#define qtov_edtovres_WORD     qtov            /* E_D_TOV Resolution */
+#define qtov__rsvd1_SHIFT      19
+#define qtov_rsvd1_MASK                0x0000003f
+#define qtov_rsvd1_WORD                qtov            /* reserved */
+#define qtov_rttov_SHIFT       18
+#define qtov_rttov_MASK                0x00000001
+#define qtov_rttov_WORD                qtov            /* R_T_TOV value */
+#define qtov_rsvd2_SHIFT       0
+#define qtov_rsvd2_MASK                0x0003ffff
+#define qtov_rsvd2_WORD                qtov            /* reserved */
+};
+
+
+typedef struct  _RPL {         /* Structure is in Big Endian format */
+       uint32_t maxsize;
+       uint32_t index;
+} RPL;
+
+typedef struct  _PORT_NUM_BLK {
+       uint32_t portNum;
+       uint32_t portID;
+       struct lpfc_name portName;
+} PORT_NUM_BLK;
+
+typedef struct  _RPL_RSP {     /* Structure is in Big Endian format */
+       uint32_t listLen;
+       uint32_t index;
+       PORT_NUM_BLK port_num_blk;
+} RPL_RSP;
 
 /* This is used for RSCN command */
 typedef struct _D_ID {         /* Structure is in Big Endian format */
@@ -781,6 +974,12 @@ typedef struct _D_ID {             /* Structure is in Big Endian format */
        } un;
 } D_ID;
 
+#define RSCN_ADDRESS_FORMAT_PORT       0x0
+#define RSCN_ADDRESS_FORMAT_AREA       0x1
+#define RSCN_ADDRESS_FORMAT_DOMAIN     0x2
+#define RSCN_ADDRESS_FORMAT_FABRIC     0x3
+#define RSCN_ADDRESS_FORMAT_MASK       0x3
+
 /*
  *  Structure to define all ELS Payload types
  */
@@ -800,7 +999,6 @@ typedef struct _ELS_PKT {   /* Structure is in Big Endian format */
                FARP farp;      /* Payload for FARP/ACC */
                FAN fan;        /* Payload for FAN */
                SCR scr;        /* Payload for SCR/ACC */
-               RRQ rrq;        /* Payload for RRQ */
                RNID rnid;      /* Payload for RNID */
                uint8_t pad[128 - 4];   /* Pad out to payload of 128 bytes */
        } un;
@@ -815,7 +1013,7 @@ typedef struct _ELS_PKT {  /* Structure is in Big Endian format */
 #define  SLI_MGMT_GRPL     0x102       /* Get registered Port list */
 #define  SLI_MGMT_GPAT     0x110       /* Get Port attributes */
 #define  SLI_MGMT_RHBA     0x200       /* Register HBA */
-#define  SLI_MGMT_RHAT     0x201       /* Register HBA atttributes */
+#define  SLI_MGMT_RHAT     0x201       /* Register HBA attributes */
 #define  SLI_MGMT_RPRT     0x210       /* Register Port */
 #define  SLI_MGMT_RPA      0x211       /* Register Port attributes */
 #define  SLI_MGMT_DHBA     0x300       /* De-register HBA */
@@ -1002,44 +1200,57 @@ typedef struct {
 /* Number of 4-byte words in an IOCB. */
 #define IOCB_WORD_SZ    8
 
-/* defines for type field in fc header */
-#define FC_ELS_DATA     0x1
-#define FC_LLC_SNAP     0x5
-#define FC_FCP_DATA     0x8
-#define FC_COMMON_TRANSPORT_ULP 0x20
-
-/* defines for rctl field in fc header */
-#define FC_DEV_DATA     0x0
-#define FC_UNSOL_CTL    0x2
-#define FC_SOL_CTL      0x3
-#define FC_UNSOL_DATA   0x4
-#define FC_FCP_CMND     0x6
-#define FC_ELS_REQ      0x22
-#define FC_ELS_RSP      0x23
-
 /* network headers for Dfctl field */
 #define FC_NET_HDR      0x20
 
 /* Start FireFly Register definitions */
 #define PCI_VENDOR_ID_EMULEX        0x10df
 #define PCI_DEVICE_ID_FIREFLY       0x1ae5
-#define PCI_DEVICE_ID_SUPERFLY      0xf700
-#define PCI_DEVICE_ID_DRAGONFLY     0xf800
+#define PCI_DEVICE_ID_PROTEUS_VF    0xe100
+#define PCI_DEVICE_ID_BALIUS        0xe131
+#define PCI_DEVICE_ID_PROTEUS_PF    0xe180
+#define PCI_DEVICE_ID_LANCER_FC     0xe200
+#define PCI_DEVICE_ID_LANCER_FC_VF  0xe208
+#define PCI_DEVICE_ID_LANCER_FCOE   0xe260
+#define PCI_DEVICE_ID_LANCER_FCOE_VF 0xe268
+#define PCI_DEVICE_ID_SAT_SMB       0xf011
+#define PCI_DEVICE_ID_SAT_MID       0xf015
 #define PCI_DEVICE_ID_RFLY          0xf095
 #define PCI_DEVICE_ID_PFLY          0xf098
+#define PCI_DEVICE_ID_LP101         0xf0a1
 #define PCI_DEVICE_ID_TFLY          0xf0a5
+#define PCI_DEVICE_ID_BSMB          0xf0d1
+#define PCI_DEVICE_ID_BMID          0xf0d5
+#define PCI_DEVICE_ID_ZSMB          0xf0e1
+#define PCI_DEVICE_ID_ZMID          0xf0e5
+#define PCI_DEVICE_ID_NEPTUNE       0xf0f5
+#define PCI_DEVICE_ID_NEPTUNE_SCSP  0xf0f6
+#define PCI_DEVICE_ID_NEPTUNE_DCSP  0xf0f7
+#define PCI_DEVICE_ID_SAT           0xf100
+#define PCI_DEVICE_ID_SAT_SCSP      0xf111
+#define PCI_DEVICE_ID_SAT_DCSP      0xf112
+#define PCI_DEVICE_ID_FALCON        0xf180
+#define PCI_DEVICE_ID_SUPERFLY      0xf700
+#define PCI_DEVICE_ID_DRAGONFLY     0xf800
 #define PCI_DEVICE_ID_CENTAUR       0xf900
 #define PCI_DEVICE_ID_PEGASUS       0xf980
 #define PCI_DEVICE_ID_THOR          0xfa00
 #define PCI_DEVICE_ID_VIPER         0xfb00
+#define PCI_DEVICE_ID_LP10000S      0xfc00
+#define PCI_DEVICE_ID_LP11000S      0xfc10
+#define PCI_DEVICE_ID_LPE11000S     0xfc20
+#define PCI_DEVICE_ID_SAT_S         0xfc40
+#define PCI_DEVICE_ID_PROTEUS_S     0xfc50
 #define PCI_DEVICE_ID_HELIOS        0xfd00
-#define PCI_DEVICE_ID_BMID          0xf0d5
-#define PCI_DEVICE_ID_BSMB          0xf0d1
+#define PCI_DEVICE_ID_HELIOS_SCSP   0xfd11
+#define PCI_DEVICE_ID_HELIOS_DCSP   0xfd12
 #define PCI_DEVICE_ID_ZEPHYR        0xfe00
-#define PCI_DEVICE_ID_ZMID          0xf0e5
-#define PCI_DEVICE_ID_ZSMB          0xf0e1
-#define PCI_DEVICE_ID_LP101        0xf0a1
-#define PCI_DEVICE_ID_LP10000S     0xfc00
+#define PCI_DEVICE_ID_HORNET        0xfe05
+#define PCI_DEVICE_ID_ZEPHYR_SCSP   0xfe11
+#define PCI_DEVICE_ID_ZEPHYR_DCSP   0xfe12
+#define PCI_VENDOR_ID_SERVERENGINE  0x19a2
+#define PCI_DEVICE_ID_TIGERSHARK    0x0704
+#define PCI_DEVICE_ID_TOMCAT        0x0714
 
 #define JEDEC_ID_ADDRESS            0x0080001c
 #define FIREFLY_JEDEC_ID            0x1ACC
@@ -1054,6 +1265,8 @@ typedef struct {
 #define HELIOS_JEDEC_ID             0x0364
 #define ZEPHYR_JEDEC_ID             0x0577
 #define VIPER_JEDEC_ID              0x4838
+#define SATURN_JEDEC_ID             0x1004
+#define HORNET_JDEC_ID              0x2057706D
 
 #define JEDEC_ID_MASK               0x0FFFF000
 #define JEDEC_ID_SHIFT              12
@@ -1098,6 +1311,18 @@ typedef struct {         /* FireFly BIU registers */
 #define HA_RXATT       0x00000008      /* Bit  3 */
 #define HA_RXMASK      0x0000000f
 
+#define HA_R0_CLR_MSK  (HA_R0RE_REQ | HA_R0CE_RSP | HA_R0ATT)
+#define HA_R1_CLR_MSK  (HA_R1RE_REQ | HA_R1CE_RSP | HA_R1ATT)
+#define HA_R2_CLR_MSK  (HA_R2RE_REQ | HA_R2CE_RSP | HA_R2ATT)
+#define HA_R3_CLR_MSK  (HA_R3RE_REQ | HA_R3CE_RSP | HA_R3ATT)
+
+#define HA_R0_POS      3
+#define HA_R1_POS      7
+#define HA_R2_POS      11
+#define HA_R3_POS      15
+#define HA_LE_POS      29
+#define HA_MB_POS      30
+#define HA_ER_POS      31
 /* Chip Attention Register */
 
 #define CA_REG_OFFSET  4       /* Byte offset from register base address */
@@ -1130,11 +1355,12 @@ typedef struct {                /* FireFly BIU registers */
 #define HS_FFER3       0x20000000      /* Bit 29 */
 #define HS_FFER2       0x40000000      /* Bit 30 */
 #define HS_FFER1       0x80000000      /* Bit 31 */
-#define HS_FFERM       0xFF000000      /* Mask for error bits 31:24 */
-
+#define HS_CRIT_TEMP   0x00000100      /* Bit 8  */
+#define HS_FFERM       0xFF000100      /* Mask for error bits 31:24 and 8 */
+#define UNPLUG_ERR     0x00000001      /* Indicate pci hot unplug */
 /* Host Control Register */
 
-#define HC_REG_OFFSET  12      /* Word offset from register base address */
+#define HC_REG_OFFSET  12      /* Byte offset from register base address */
 
 #define HC_MBINT_ENA   0x00000001      /* Bit  0 */
 #define HC_R0INT_ENA   0x00000002      /* Bit  1 */
@@ -1147,6 +1373,19 @@ typedef struct {         /* FireFly BIU registers */
 #define HC_LAINT_ENA   0x20000000      /* Bit 29 */
 #define HC_ERINT_ENA   0x80000000      /* Bit 31 */
 
+/* Message Signaled Interrupt eXtension (MSI-X) message identifiers */
+#define MSIX_DFLT_ID   0
+#define MSIX_RNG0_ID   0
+#define MSIX_RNG1_ID   1
+#define MSIX_RNG2_ID   2
+#define MSIX_RNG3_ID   3
+
+#define MSIX_LINK_ID   4
+#define MSIX_MBOX_ID   5
+
+#define MSIX_SPARE0_ID 6
+#define MSIX_SPARE1_ID 7
+
 /* Mailbox Commands */
 #define MBX_SHUTDOWN        0x00       /* terminate testing */
 #define MBX_LOAD_SM         0x01
@@ -1168,7 +1407,6 @@ typedef struct {          /* FireFly BIU registers */
 #define MBX_READ_LNK_STAT   0x12
 #define MBX_REG_LOGIN       0x13
 #define MBX_UNREG_LOGIN     0x14
-#define MBX_READ_LA         0x15
 #define MBX_CLEAR_LA        0x16
 #define MBX_DUMP_MEMORY     0x17
 #define MBX_DUMP_CONTEXT    0x18
@@ -1179,24 +1417,50 @@ typedef struct {                /* FireFly BIU registers */
 #define MBX_DEL_LD_ENTRY    0x1D
 #define MBX_RUN_PROGRAM     0x1E
 #define MBX_SET_MASK        0x20
-#define MBX_SET_SLIM        0x21
+#define MBX_SET_VARIABLE    0x21
 #define MBX_UNREG_D_ID      0x23
+#define MBX_KILL_BOARD      0x24
 #define MBX_CONFIG_FARP     0x25
-
+#define MBX_BEACON          0x2A
+#define MBX_CONFIG_MSI      0x30
+#define MBX_HEARTBEAT       0x31
+#define MBX_WRITE_VPARMS    0x32
+#define MBX_ASYNCEVT_ENABLE 0x33
+#define MBX_READ_EVENT_LOG_STATUS 0x37
+#define MBX_READ_EVENT_LOG  0x38
+#define MBX_WRITE_EVENT_LOG 0x39
+
+#define MBX_PORT_CAPABILITIES 0x3B
+#define MBX_PORT_IOV_CONTROL 0x3C
+
+#define MBX_CONFIG_HBQ     0x7C
 #define MBX_LOAD_AREA       0x81
 #define MBX_RUN_BIU_DIAG64  0x84
 #define MBX_CONFIG_PORT     0x88
 #define MBX_READ_SPARM64    0x8D
 #define MBX_READ_RPI64      0x8F
 #define MBX_REG_LOGIN64     0x93
-#define MBX_READ_LA64       0x95
+#define MBX_READ_TOPOLOGY   0x95
+#define MBX_REG_VPI        0x96
+#define MBX_UNREG_VPI      0x97
 
-#define MBX_FLASH_WR_ULA    0x98
+#define MBX_WRITE_WWN       0x98
 #define MBX_SET_DEBUG       0x99
 #define MBX_LOAD_EXP_ROM    0x9C
-
-#define MBX_MAX_CMDS        0x9D
+#define MBX_SLI4_CONFIG            0x9B
+#define MBX_SLI4_REQ_FTRS   0x9D
+#define MBX_MAX_CMDS        0x9E
+#define MBX_RESUME_RPI      0x9E
 #define MBX_SLI2_CMD_MASK   0x80
+#define MBX_REG_VFI         0x9F
+#define MBX_REG_FCFI        0xA0
+#define MBX_UNREG_VFI       0xA1
+#define MBX_UNREG_FCFI     0xA2
+#define MBX_INIT_VFI        0xA3
+#define MBX_INIT_VPI        0xA4
+
+#define MBX_AUTH_PORT       0xF8
+#define MBX_SECURITY_MGMT   0xF9
 
 /* IOCB Commands */
 
@@ -1228,12 +1492,17 @@ typedef struct {                /* FireFly BIU registers */
 #define CMD_FCP_IREAD_CX        0x1B
 #define CMD_FCP_ICMND_CR        0x1C
 #define CMD_FCP_ICMND_CX        0x1D
+#define CMD_FCP_TSEND_CX        0x1F
+#define CMD_FCP_TRECEIVE_CX     0x21
+#define CMD_FCP_TRSP_CX                0x23
+#define CMD_FCP_AUTO_TRSP_CX    0x29
 
 #define CMD_ADAPTER_MSG         0x20
 #define CMD_ADAPTER_DUMP        0x22
 
 /*  SLI_2 IOCB Command Set */
 
+#define CMD_ASYNC_STATUS        0x7C
 #define CMD_RCV_SEQUENCE64_CX   0x81
 #define CMD_XMIT_SEQUENCE64_CR  0x82
 #define CMD_XMIT_SEQUENCE64_CX  0x83
@@ -1248,17 +1517,47 @@ typedef struct {                /* FireFly BIU registers */
 #define CMD_ABORT_MXRI64_CN     0x8C
 #define CMD_RCV_ELS_REQ64_CX    0x8D
 #define CMD_XMIT_ELS_RSP64_CX   0x95
+#define CMD_XMIT_BLS_RSP64_CX   0x97
 #define CMD_FCP_IWRITE64_CR     0x98
 #define CMD_FCP_IWRITE64_CX     0x99
 #define CMD_FCP_IREAD64_CR      0x9A
 #define CMD_FCP_IREAD64_CX      0x9B
 #define CMD_FCP_ICMND64_CR      0x9C
 #define CMD_FCP_ICMND64_CX      0x9D
+#define CMD_FCP_TSEND64_CX      0x9F
+#define CMD_FCP_TRECEIVE64_CX   0xA1
+#define CMD_FCP_TRSP64_CX       0xA3
+
+#define CMD_QUE_XRI64_CX       0xB3
+#define CMD_IOCB_RCV_SEQ64_CX  0xB5
+#define CMD_IOCB_RCV_ELS64_CX  0xB7
+#define CMD_IOCB_RET_XRI64_CX  0xB9
+#define CMD_IOCB_RCV_CONT64_CX 0xBB
 
 #define CMD_GEN_REQUEST64_CR    0xC2
 #define CMD_GEN_REQUEST64_CX    0xC3
 
-#define CMD_MAX_IOCB_CMD        0xE6
+/* Unhandled SLI-3 Commands */
+#define CMD_IOCB_XMIT_MSEQ64_CR                0xB0
+#define CMD_IOCB_XMIT_MSEQ64_CX                0xB1
+#define CMD_IOCB_RCV_SEQ_LIST64_CX     0xC1
+#define CMD_IOCB_RCV_ELS_LIST64_CX     0xCD
+#define CMD_IOCB_CLOSE_EXTENDED_CN     0xB6
+#define CMD_IOCB_ABORT_EXTENDED_CN     0xBA
+#define CMD_IOCB_RET_HBQE64_CN         0xCA
+#define CMD_IOCB_FCP_IBIDIR64_CR       0xAC
+#define CMD_IOCB_FCP_IBIDIR64_CX       0xAD
+#define CMD_IOCB_FCP_ITASKMGT64_CX     0xAF
+#define CMD_IOCB_LOGENTRY_CN           0x94
+#define CMD_IOCB_LOGENTRY_ASYNC_CN     0x96
+
+/* Data Security SLI Commands */
+#define DSSCMD_IWRITE64_CR             0xF8
+#define DSSCMD_IWRITE64_CX             0xF9
+#define DSSCMD_IREAD64_CR              0xFA
+#define DSSCMD_IREAD64_CX              0xFB
+
+#define CMD_MAX_IOCB_CMD        0xFB
 #define CMD_IOCB_MASK           0xff
 
 #define MAX_MSG_DATA            28     /* max msg data in CMD_ADAPTER_MSG
@@ -1284,11 +1583,15 @@ typedef struct {                /* FireFly BIU registers */
 #define MBXERR_BAD_RCV_LENGTH       14
 #define MBXERR_DMA_ERROR            15
 #define MBXERR_ERROR                16
-#define MBX_NOT_FINISHED           255
+#define MBXERR_LINK_DOWN            0x33
+#define MBXERR_SEC_NO_PERMISSION    0xF02
+#define MBX_NOT_FINISHED            255
 
 #define MBX_BUSY                   0xffffff /* Attempted cmd to busy Mailbox */
 #define MBX_TIMEOUT                0xfffffe /* time-out expired waiting for */
 
+#define TEMPERATURE_OFFSET 0xB0        /* Slim offset for critical temperature event */
+
 /*
  *    Begin Structure Definitions for Mailbox Commands
  */
@@ -1320,38 +1623,6 @@ struct ulp_bde {
 #endif
 };
 
-struct ulp_bde64 {     /* SLI-2 */
-       union ULP_BDE_TUS {
-               uint32_t w;
-               struct {
-#ifdef __BIG_ENDIAN_BITFIELD
-                       uint32_t bdeFlags:8;    /* BDE Flags 0 IS A SUPPORTED
-                                                  VALUE !! */
-                       uint32_t bdeSize:24;    /* Size of buffer (in bytes) */
-#else  /*  __LITTLE_ENDIAN_BITFIELD */
-                       uint32_t bdeSize:24;    /* Size of buffer (in bytes) */
-                       uint32_t bdeFlags:8;    /* BDE Flags 0 IS A SUPPORTED
-                                                  VALUE !! */
-#endif
-
-#define BUFF_USE_RSVD       0x01       /* bdeFlags */
-#define BUFF_USE_INTRPT     0x02       /* Not Implemented with LP6000 */
-#define BUFF_USE_CMND       0x04       /* Optional, 1=cmd/rsp 0=data buffer */
-#define BUFF_USE_RCV        0x08       /*  "" "", 1=rcv buffer, 0=xmit
-                                           buffer */
-#define BUFF_TYPE_32BIT     0x10       /*  "" "", 1=32 bit addr 0=64 bit
-                                           addr */
-#define BUFF_TYPE_SPECIAL   0x20       /* Not Implemented with LP6000  */
-#define BUFF_TYPE_BDL       0x40       /* Optional,  may be set in BDL */
-#define BUFF_TYPE_INVALID   0x80       /*  ""  "" */
-               } f;
-       } tus;
-       uint32_t addrLow;
-       uint32_t addrHigh;
-};
-#define BDE64_SIZE_WORD 0
-#define BPL64_SIZE_WORD 0x40
-
 typedef struct ULP_BDL {       /* SLI-2 */
 #ifdef __BIG_ENDIAN_BITFIELD
        uint32_t bdeFlags:8;    /* BDL Flags */
@@ -1366,6 +1637,107 @@ typedef struct ULP_BDL {        /* SLI-2 */
        uint32_t ulpIoTag32;    /* Can be used for 32 bit I/O Tag */
 } ULP_BDL;
 
+/*
+ * BlockGuard Definitions
+ */
+
+enum lpfc_protgrp_type {
+       LPFC_PG_TYPE_INVALID = 0, /* used to indicate errors                  */
+       LPFC_PG_TYPE_NO_DIF,      /* no DIF data pointed to by prot grp       */
+       LPFC_PG_TYPE_EMBD_DIF,    /* DIF is embedded (inline) with data       */
+       LPFC_PG_TYPE_DIF_BUF      /* DIF has its own scatter/gather list      */
+};
+
+/* PDE Descriptors */
+#define LPFC_PDE5_DESCRIPTOR           0x85
+#define LPFC_PDE6_DESCRIPTOR           0x86
+#define LPFC_PDE7_DESCRIPTOR           0x87
+
+/* BlockGuard Opcodes */
+#define BG_OP_IN_NODIF_OUT_CRC         0x0
+#define        BG_OP_IN_CRC_OUT_NODIF          0x1
+#define        BG_OP_IN_NODIF_OUT_CSUM         0x2
+#define        BG_OP_IN_CSUM_OUT_NODIF         0x3
+#define        BG_OP_IN_CRC_OUT_CRC            0x4
+#define        BG_OP_IN_CSUM_OUT_CSUM          0x5
+#define        BG_OP_IN_CRC_OUT_CSUM           0x6
+#define        BG_OP_IN_CSUM_OUT_CRC           0x7
+
+struct lpfc_pde5 {
+       uint32_t word0;
+#define pde5_type_SHIFT                24
+#define pde5_type_MASK         0x000000ff
+#define pde5_type_WORD         word0
+#define pde5_rsvd0_SHIFT       0
+#define pde5_rsvd0_MASK                0x00ffffff
+#define pde5_rsvd0_WORD                word0
+       uint32_t reftag;        /* Reference Tag Value                  */
+       uint32_t reftagtr;      /* Reference Tag Translation Value      */
+};
+
+struct lpfc_pde6 {
+       uint32_t word0;
+#define pde6_type_SHIFT                24
+#define pde6_type_MASK         0x000000ff
+#define pde6_type_WORD         word0
+#define pde6_rsvd0_SHIFT       0
+#define pde6_rsvd0_MASK                0x00ffffff
+#define pde6_rsvd0_WORD                word0
+       uint32_t word1;
+#define pde6_rsvd1_SHIFT       26
+#define pde6_rsvd1_MASK                0x0000003f
+#define pde6_rsvd1_WORD                word1
+#define pde6_na_SHIFT          25
+#define pde6_na_MASK           0x00000001
+#define pde6_na_WORD           word1
+#define pde6_rsvd2_SHIFT       16
+#define pde6_rsvd2_MASK                0x000001FF
+#define pde6_rsvd2_WORD                word1
+#define pde6_apptagtr_SHIFT    0
+#define pde6_apptagtr_MASK     0x0000ffff
+#define pde6_apptagtr_WORD     word1
+       uint32_t word2;
+#define pde6_optx_SHIFT                28
+#define pde6_optx_MASK         0x0000000f
+#define pde6_optx_WORD         word2
+#define pde6_oprx_SHIFT                24
+#define pde6_oprx_MASK         0x0000000f
+#define pde6_oprx_WORD         word2
+#define pde6_nr_SHIFT          23
+#define pde6_nr_MASK           0x00000001
+#define pde6_nr_WORD           word2
+#define pde6_ce_SHIFT          22
+#define pde6_ce_MASK           0x00000001
+#define pde6_ce_WORD           word2
+#define pde6_re_SHIFT          21
+#define pde6_re_MASK           0x00000001
+#define pde6_re_WORD           word2
+#define pde6_ae_SHIFT          20
+#define pde6_ae_MASK           0x00000001
+#define pde6_ae_WORD           word2
+#define pde6_ai_SHIFT          19
+#define pde6_ai_MASK           0x00000001
+#define pde6_ai_WORD           word2
+#define pde6_bs_SHIFT          16
+#define pde6_bs_MASK           0x00000007
+#define pde6_bs_WORD           word2
+#define pde6_apptagval_SHIFT   0
+#define pde6_apptagval_MASK    0x0000ffff
+#define pde6_apptagval_WORD    word2
+};
+
+struct lpfc_pde7 {
+       uint32_t word0;
+#define pde7_type_SHIFT                24
+#define pde7_type_MASK         0x000000ff
+#define pde7_type_WORD         word0
+#define pde7_rsvd0_SHIFT       0
+#define pde7_rsvd0_MASK                0x00ffffff
+#define pde7_rsvd0_WORD                word0
+       uint32_t addrHigh;
+       uint32_t addrLow;
+};
+
 /* Structure for MB Command LOAD_SM and DOWN_LOAD */
 
 typedef struct {
@@ -1455,6 +1827,17 @@ typedef struct {
        } un;
 } BIU_DIAG_VAR;
 
+/* Structure for MB command READ_EVENT_LOG (0x38) */
+struct READ_EVENT_LOG_VAR {
+       uint32_t word1;
+#define lpfc_event_log_SHIFT   29
+#define lpfc_event_log_MASK    0x00000001
+#define lpfc_event_log_WORD    word1
+#define USE_MAILBOX_RESPONSE   1
+       uint32_t offset;
+       struct ulp_bde64 rcv_bde64;
+};
+
 /* Structure for MB Command INIT_LINK (05) */
 
 typedef struct {
@@ -1476,23 +1859,26 @@ typedef struct {
        uint8_t fabric_AL_PA;   /* If using a Fabric Assigned AL_PA */
 #endif
 
-#define FLAGS_LOCAL_LB               0x01 /* link_flags (=1) ENDEC loopback */
 #define FLAGS_TOPOLOGY_MODE_LOOP_PT  0x00 /* Attempt loop then pt-pt */
+#define FLAGS_LOCAL_LB               0x01 /* link_flags (=1) ENDEC loopback */
 #define FLAGS_TOPOLOGY_MODE_PT_PT    0x02 /* Attempt pt-pt only */
 #define FLAGS_TOPOLOGY_MODE_LOOP     0x04 /* Attempt loop only */
 #define FLAGS_TOPOLOGY_MODE_PT_LOOP  0x06 /* Attempt pt-pt then loop */
+#define        FLAGS_UNREG_LOGIN_ALL        0x08 /* UNREG_LOGIN all on link down */
 #define FLAGS_LIRP_LILP              0x80 /* LIRP / LILP is disabled */
 
 #define FLAGS_TOPOLOGY_FAILOVER      0x0400    /* Bit 10 */
 #define FLAGS_LINK_SPEED             0x0800    /* Bit 11 */
+#define FLAGS_IMED_ABORT             0x04000   /* Bit 14 */
 
        uint32_t link_speed;
-#define LINK_SPEED_AUTO 0       /* Auto selection */
-#define LINK_SPEED_1G   1       /* 1 Gigabaud */
-#define LINK_SPEED_2G   2       /* 2 Gigabaud */
-#define LINK_SPEED_4G   4       /* 4 Gigabaud */
-#define LINK_SPEED_8G   8       /* 4 Gigabaud */
-#define LINK_SPEED_10G   16      /* 10 Gigabaud */
+#define LINK_SPEED_AUTO 0x0     /* Auto selection */
+#define LINK_SPEED_1G   0x1     /* 1 Gigabaud */
+#define LINK_SPEED_2G   0x2     /* 2 Gigabaud */
+#define LINK_SPEED_4G   0x4     /* 4 Gigabaud */
+#define LINK_SPEED_8G   0x8     /* 8 Gigabaud */
+#define LINK_SPEED_10G  0x10    /* 10 Gigabaud */
+#define LINK_SPEED_16G  0x11    /* 16 Gigabaud */
 
 } INIT_LINK_VAR;
 
@@ -1657,14 +2043,13 @@ typedef struct {
        uint32_t rttov;
        uint32_t altov;
        uint32_t lmt;
-#define LMT_RESERVED    0x0    /* Not used */
-#define LMT_266_10bit   0x1    /* 265.625 Mbaud 10 bit iface  */
-#define LMT_532_10bit   0x2    /* 531.25  Mbaud 10 bit iface  */
-#define LMT_1063_20bit  0x3    /* 1062.5   Mbaud 20 bit iface */
-#define LMT_1063_10bit  0x4    /* 1062.5   Mbaud 10 bit iface */
-#define LMT_2125_10bit  0x8    /* 2125     Mbaud 10 bit iface */
-#define LMT_4250_10bit  0x40   /* 4250     Mbaud 10 bit iface */
-
+#define LMT_RESERVED  0x000    /* Not used */
+#define LMT_1Gb       0x004
+#define LMT_2Gb       0x008
+#define LMT_4Gb       0x040
+#define LMT_8Gb       0x080
+#define LMT_10Gb      0x100
+#define LMT_16Gb      0x200
        uint32_t rsvd2;
        uint32_t rsvd3;
        uint32_t max_xri;
@@ -1673,7 +2058,10 @@ typedef struct {
        uint32_t avail_xri;
        uint32_t avail_iocb;
        uint32_t avail_rpi;
-       uint32_t default_rpi;
+       uint32_t max_vpi;
+       uint32_t rsvd4;
+       uint32_t rsvd5;
+       uint32_t avail_vpi;
 } READ_CONFIG_VAR;
 
 /* Structure for MB Command READ_RCONFIG (12) */
@@ -1737,6 +2125,13 @@ typedef struct {
                                      structure */
                struct ulp_bde64 sp64;
        } un;
+#ifdef __BIG_ENDIAN_BITFIELD
+       uint16_t rsvd3;
+       uint16_t vpi;
+#else  /*  __LITTLE_ENDIAN_BITFIELD */
+       uint16_t vpi;
+       uint16_t rsvd3;
+#endif
 } READ_SPARM_VAR;
 
 /* Structure for MB Command READ_STATUS (14) */
@@ -1837,11 +2232,17 @@ typedef struct {
 #ifdef __BIG_ENDIAN_BITFIELD
        uint32_t cv:1;
        uint32_t rr:1;
-       uint32_t rsvd1:29;
+       uint32_t rsvd2:2;
+       uint32_t v3req:1;
+       uint32_t v3rsp:1;
+       uint32_t rsvd1:25;
        uint32_t rv:1;
 #else  /*  __LITTLE_ENDIAN_BITFIELD */
        uint32_t rv:1;
-       uint32_t rsvd1:29;
+       uint32_t rsvd1:25;
+       uint32_t v3rsp:1;
+       uint32_t v3req:1;
+       uint32_t rsvd2:2;
        uint32_t rr:1;
        uint32_t cv:1;
 #endif
@@ -1891,8 +2292,8 @@ typedef struct {
        uint8_t sli1FwName[16];
        uint32_t sli2FwRev;
        uint8_t sli2FwName[16];
-       uint32_t rsvd2;
-       uint32_t RandomData[7];
+       uint32_t sli3Feat;
+       uint32_t RandomData[6];
 } READ_REV_VAR;
 
 /* Structure for MB Command READ_LINK_STAT (18) */
@@ -1932,6 +2333,14 @@ typedef struct {
                struct ulp_bde64 sp64;
        } un;
 
+#ifdef __BIG_ENDIAN_BITFIELD
+       uint16_t rsvd6;
+       uint16_t vpi;
+#else /* __LITTLE_ENDIAN_BITFIELD */
+       uint16_t vpi;
+       uint16_t rsvd6;
+#endif
+
 } REG_LOGIN_VAR;
 
 /* Word 30 contents for REG_LOGIN */
@@ -1956,105 +2365,173 @@ typedef struct {
 #ifdef __BIG_ENDIAN_BITFIELD
        uint16_t rsvd1;
        uint16_t rpi;
+       uint32_t rsvd2;
+       uint32_t rsvd3;
+       uint32_t rsvd4;
+       uint32_t rsvd5;
+       uint16_t rsvd6;
+       uint16_t vpi;
 #else  /*  __LITTLE_ENDIAN_BITFIELD */
        uint16_t rpi;
        uint16_t rsvd1;
+       uint32_t rsvd2;
+       uint32_t rsvd3;
+       uint32_t rsvd4;
+       uint32_t rsvd5;
+       uint16_t vpi;
+       uint16_t rsvd6;
 #endif
 } UNREG_LOGIN_VAR;
 
-/* Structure for MB Command UNREG_D_ID (0x23) */
-
+/* Structure for MB Command REG_VPI (0x96) */
 typedef struct {
-       uint32_t did;
-} UNREG_D_ID_VAR;
-
-/* Structure for MB Command READ_LA (21) */
-/* Structure for MB Command READ_LA64 (0x95) */
+#ifdef __BIG_ENDIAN_BITFIELD
+       uint32_t rsvd1;
+       uint32_t rsvd2:7;
+       uint32_t upd:1;
+       uint32_t sid:24;
+       uint32_t wwn[2];
+       uint32_t rsvd5;
+       uint16_t vfi;
+       uint16_t vpi;
+#else  /*  __LITTLE_ENDIAN */
+       uint32_t rsvd1;
+       uint32_t sid:24;
+       uint32_t upd:1;
+       uint32_t rsvd2:7;
+       uint32_t wwn[2];
+       uint32_t rsvd5;
+       uint16_t vpi;
+       uint16_t vfi;
+#endif
+} REG_VPI_VAR;
 
+/* Structure for MB Command UNREG_VPI (0x97) */
 typedef struct {
-       uint32_t eventTag;      /* Event tag */
+       uint32_t rsvd1;
 #ifdef __BIG_ENDIAN_BITFIELD
-       uint32_t rsvd1:22;
-       uint32_t pb:1;
-       uint32_t il:1;
-       uint32_t attType:8;
-#else  /*  __LITTLE_ENDIAN_BITFIELD */
-       uint32_t attType:8;
-       uint32_t il:1;
-       uint32_t pb:1;
-       uint32_t rsvd1:22;
+       uint16_t rsvd2;
+       uint16_t sli4_vpi;
+#else  /*  __LITTLE_ENDIAN */
+       uint16_t sli4_vpi;
+       uint16_t rsvd2;
 #endif
-
-#define AT_RESERVED    0x00    /* Reserved - attType */
-#define AT_LINK_UP     0x01    /* Link is up */
-#define AT_LINK_DOWN   0x02    /* Link is down */
-
+       uint32_t rsvd3;
+       uint32_t rsvd4;
+       uint32_t rsvd5;
 #ifdef __BIG_ENDIAN_BITFIELD
-       uint8_t granted_AL_PA;
-       uint8_t lipAlPs;
-       uint8_t lipType;
-       uint8_t topology;
-#else  /*  __LITTLE_ENDIAN_BITFIELD */
-       uint8_t topology;
-       uint8_t lipType;
-       uint8_t lipAlPs;
-       uint8_t granted_AL_PA;
+       uint16_t rsvd6;
+       uint16_t vpi;
+#else  /*  __LITTLE_ENDIAN */
+       uint16_t vpi;
+       uint16_t rsvd6;
 #endif
+} UNREG_VPI_VAR;
 
-#define TOPOLOGY_PT_PT 0x01    /* Topology is pt-pt / pt-fabric */
-#define TOPOLOGY_LOOP  0x02    /* Topology is FC-AL */
-
-       union {
-               struct ulp_bde lilpBde; /* This BDE points to a 128 byte buffer
-                                          to */
-               /* store the LILP AL_PA position map into */
-               struct ulp_bde64 lilpBde64;
-       } un;
+/* Structure for MB Command UNREG_D_ID (0x23) */
 
+typedef struct {
+       uint32_t did;
+       uint32_t rsvd2;
+       uint32_t rsvd3;
+       uint32_t rsvd4;
+       uint32_t rsvd5;
 #ifdef __BIG_ENDIAN_BITFIELD
-       uint32_t Dlu:1;
-       uint32_t Dtf:1;
-       uint32_t Drsvd2:14;
-       uint32_t DlnkSpeed:8;
-       uint32_t DnlPort:4;
-       uint32_t Dtx:2;
-       uint32_t Drx:2;
-#else  /*  __LITTLE_ENDIAN_BITFIELD */
-       uint32_t Drx:2;
-       uint32_t Dtx:2;
-       uint32_t DnlPort:4;
-       uint32_t DlnkSpeed:8;
-       uint32_t Drsvd2:14;
-       uint32_t Dtf:1;
-       uint32_t Dlu:1;
-#endif
-
-#ifdef __BIG_ENDIAN_BITFIELD
-       uint32_t Ulu:1;
-       uint32_t Utf:1;
-       uint32_t Ursvd2:14;
-       uint32_t UlnkSpeed:8;
-       uint32_t UnlPort:4;
-       uint32_t Utx:2;
-       uint32_t Urx:2;
-#else  /*  __LITTLE_ENDIAN_BITFIELD */
-       uint32_t Urx:2;
-       uint32_t Utx:2;
-       uint32_t UnlPort:4;
-       uint32_t UlnkSpeed:8;
-       uint32_t Ursvd2:14;
-       uint32_t Utf:1;
-       uint32_t Ulu:1;
+       uint16_t rsvd6;
+       uint16_t vpi;
+#else
+       uint16_t vpi;
+       uint16_t rsvd6;
 #endif
+} UNREG_D_ID_VAR;
 
-#define LA_UNKNW_LINK  0x0    /* lnkSpeed */
-#define LA_1GHZ_LINK   0x04   /* lnkSpeed */
-#define LA_2GHZ_LINK   0x08   /* lnkSpeed */
-#define LA_4GHZ_LINK   0x10   /* lnkSpeed */
-#define LA_8GHZ_LINK   0x20   /* lnkSpeed */
-#define LA_10GHZ_LINK  0x40   /* lnkSpeed */
-
-} READ_LA_VAR;
+/* Structure for MB Command READ_TOPOLOGY (0x95) */
+struct lpfc_mbx_read_top {
+       uint32_t eventTag;      /* Event tag */
+       uint32_t word2;
+#define lpfc_mbx_read_top_fa_SHIFT             12
+#define lpfc_mbx_read_top_fa_MASK              0x00000001
+#define lpfc_mbx_read_top_fa_WORD              word2
+#define lpfc_mbx_read_top_mm_SHIFT             11
+#define lpfc_mbx_read_top_mm_MASK              0x00000001
+#define lpfc_mbx_read_top_mm_WORD              word2
+#define lpfc_mbx_read_top_pb_SHIFT             9
+#define lpfc_mbx_read_top_pb_MASK              0X00000001
+#define lpfc_mbx_read_top_pb_WORD              word2
+#define lpfc_mbx_read_top_il_SHIFT             8
+#define lpfc_mbx_read_top_il_MASK              0x00000001
+#define lpfc_mbx_read_top_il_WORD              word2
+#define lpfc_mbx_read_top_att_type_SHIFT       0
+#define lpfc_mbx_read_top_att_type_MASK                0x000000FF
+#define lpfc_mbx_read_top_att_type_WORD                word2
+#define LPFC_ATT_RESERVED    0x00      /* Reserved - attType */
+#define LPFC_ATT_LINK_UP     0x01      /* Link is up */
+#define LPFC_ATT_LINK_DOWN   0x02      /* Link is down */
+       uint32_t word3;
+#define lpfc_mbx_read_top_alpa_granted_SHIFT   24
+#define lpfc_mbx_read_top_alpa_granted_MASK    0x000000FF
+#define lpfc_mbx_read_top_alpa_granted_WORD    word3
+#define lpfc_mbx_read_top_lip_alps_SHIFT       16
+#define lpfc_mbx_read_top_lip_alps_MASK                0x000000FF
+#define lpfc_mbx_read_top_lip_alps_WORD                word3
+#define lpfc_mbx_read_top_lip_type_SHIFT       8
+#define lpfc_mbx_read_top_lip_type_MASK                0x000000FF
+#define lpfc_mbx_read_top_lip_type_WORD                word3
+#define lpfc_mbx_read_top_topology_SHIFT       0
+#define lpfc_mbx_read_top_topology_MASK                0x000000FF
+#define lpfc_mbx_read_top_topology_WORD                word3
+#define LPFC_TOPOLOGY_PT_PT 0x01       /* Topology is pt-pt / pt-fabric */
+#define LPFC_TOPOLOGY_LOOP  0x02       /* Topology is FC-AL */
+#define LPFC_TOPOLOGY_MM    0x05       /* maint mode zephtr to menlo */
+       /* store the LILP AL_PA position map into */
+       struct ulp_bde64 lilpBde64;
+#define LPFC_ALPA_MAP_SIZE     128
+       uint32_t word7;
+#define lpfc_mbx_read_top_ld_lu_SHIFT          31
+#define lpfc_mbx_read_top_ld_lu_MASK           0x00000001
+#define lpfc_mbx_read_top_ld_lu_WORD           word7
+#define lpfc_mbx_read_top_ld_tf_SHIFT          30
+#define lpfc_mbx_read_top_ld_tf_MASK           0x00000001
+#define lpfc_mbx_read_top_ld_tf_WORD           word7
+#define lpfc_mbx_read_top_ld_link_spd_SHIFT    8
+#define lpfc_mbx_read_top_ld_link_spd_MASK     0x000000FF
+#define lpfc_mbx_read_top_ld_link_spd_WORD     word7
+#define lpfc_mbx_read_top_ld_nl_port_SHIFT     4
+#define lpfc_mbx_read_top_ld_nl_port_MASK      0x0000000F
+#define lpfc_mbx_read_top_ld_nl_port_WORD      word7
+#define lpfc_mbx_read_top_ld_tx_SHIFT          2
+#define lpfc_mbx_read_top_ld_tx_MASK           0x00000003
+#define lpfc_mbx_read_top_ld_tx_WORD           word7
+#define lpfc_mbx_read_top_ld_rx_SHIFT          0
+#define lpfc_mbx_read_top_ld_rx_MASK           0x00000003
+#define lpfc_mbx_read_top_ld_rx_WORD           word7
+       uint32_t word8;
+#define lpfc_mbx_read_top_lu_SHIFT             31
+#define lpfc_mbx_read_top_lu_MASK              0x00000001
+#define lpfc_mbx_read_top_lu_WORD              word8
+#define lpfc_mbx_read_top_tf_SHIFT             30
+#define lpfc_mbx_read_top_tf_MASK              0x00000001
+#define lpfc_mbx_read_top_tf_WORD              word8
+#define lpfc_mbx_read_top_link_spd_SHIFT       8
+#define lpfc_mbx_read_top_link_spd_MASK                0x000000FF
+#define lpfc_mbx_read_top_link_spd_WORD                word8
+#define lpfc_mbx_read_top_nl_port_SHIFT                4
+#define lpfc_mbx_read_top_nl_port_MASK         0x0000000F
+#define lpfc_mbx_read_top_nl_port_WORD         word8
+#define lpfc_mbx_read_top_tx_SHIFT             2
+#define lpfc_mbx_read_top_tx_MASK              0x00000003
+#define lpfc_mbx_read_top_tx_WORD              word8
+#define lpfc_mbx_read_top_rx_SHIFT             0
+#define lpfc_mbx_read_top_rx_MASK              0x00000003
+#define lpfc_mbx_read_top_rx_WORD              word8
+#define LPFC_LINK_SPEED_UNKNOWN        0x0
+#define LPFC_LINK_SPEED_1GHZ   0x04
+#define LPFC_LINK_SPEED_2GHZ   0x08
+#define LPFC_LINK_SPEED_4GHZ   0x10
+#define LPFC_LINK_SPEED_8GHZ   0x20
+#define LPFC_LINK_SPEED_10GHZ  0x40
+#define LPFC_LINK_SPEED_16GHZ  0x80
+};
 
 /* Structure for MB Command CLEAR_LA (22) */
 
@@ -2084,28 +2561,395 @@ typedef struct {
        uint32_t entry_index:16;
 #endif
 
-       uint32_t rsvd1;
+       uint32_t sli4_length;
        uint32_t word_cnt;
        uint32_t resp_offset;
 } DUMP_VAR;
 
 #define  DMP_MEM_REG             0x1
 #define  DMP_NV_PARAMS           0x2
+#define  DMP_LMSD                0x3 /* Link Module Serial Data */
+#define  DMP_WELL_KNOWN          0x4
 
 #define  DMP_REGION_VPD          0xe
 #define  DMP_VPD_SIZE            0x400  /* maximum amount of VPD */
 #define  DMP_RSP_OFFSET          0x14   /* word 5 contains first word of rsp */
 #define  DMP_RSP_SIZE            0x6C   /* maximum of 27 words of rsp data */
 
-/* Structure for MB Command CONFIG_PORT (0x88) */
+#define  DMP_REGION_VPORT       0x16   /* VPort info region */
+#define  DMP_VPORT_REGION_SIZE  0x200
+#define  DMP_MBOX_OFFSET_WORD   0x5
+
+#define  DMP_REGION_23          0x17   /* fcoe param  and port state region */
+#define  DMP_RGN23_SIZE                 0x400
+
+#define  WAKE_UP_PARMS_REGION_ID    4
+#define  WAKE_UP_PARMS_WORD_SIZE   15
+
+struct vport_rec {
+       uint8_t wwpn[8];
+       uint8_t wwnn[8];
+};
+
+#define VPORT_INFO_SIG 0x32324752
+#define VPORT_INFO_REV_MASK 0xff
+#define VPORT_INFO_REV 0x1
+#define MAX_STATIC_VPORT_COUNT 16
+struct static_vport_info {
+       uint32_t                signature;
+       uint32_t                rev;
+       struct vport_rec        vport_list[MAX_STATIC_VPORT_COUNT];
+       uint32_t                resvd[66];
+};
+
+/* Option rom version structure */
+struct prog_id {
+#ifdef __BIG_ENDIAN_BITFIELD
+       uint8_t  type;
+       uint8_t  id;
+       uint32_t ver:4;  /* Major Version */
+       uint32_t rev:4;  /* Revision */
+       uint32_t lev:2;  /* Level */
+       uint32_t dist:2; /* Dist Type */
+       uint32_t num:4;  /* number after dist type */
+#else /*  __LITTLE_ENDIAN_BITFIELD */
+       uint32_t num:4;  /* number after dist type */
+       uint32_t dist:2; /* Dist Type */
+       uint32_t lev:2;  /* Level */
+       uint32_t rev:4;  /* Revision */
+       uint32_t ver:4;  /* Major Version */
+       uint8_t  id;
+       uint8_t  type;
+#endif
+};
+
+/* Structure for MB Command UPDATE_CFG (0x1B) */
+
+struct update_cfg_var {
+#ifdef __BIG_ENDIAN_BITFIELD
+       uint32_t rsvd2:16;
+       uint32_t type:8;
+       uint32_t rsvd:1;
+       uint32_t ra:1;
+       uint32_t co:1;
+       uint32_t cv:1;
+       uint32_t req:4;
+       uint32_t entry_length:16;
+       uint32_t region_id:16;
+#else  /*  __LITTLE_ENDIAN_BITFIELD */
+       uint32_t req:4;
+       uint32_t cv:1;
+       uint32_t co:1;
+       uint32_t ra:1;
+       uint32_t rsvd:1;
+       uint32_t type:8;
+       uint32_t rsvd2:16;
+       uint32_t region_id:16;
+       uint32_t entry_length:16;
+#endif
+
+       uint32_t resp_info;
+       uint32_t byte_cnt;
+       uint32_t data_offset;
+};
+
+struct hbq_mask {
+#ifdef __BIG_ENDIAN_BITFIELD
+       uint8_t tmatch;
+       uint8_t tmask;
+       uint8_t rctlmatch;
+       uint8_t rctlmask;
+#else  /*  __LITTLE_ENDIAN */
+       uint8_t rctlmask;
+       uint8_t rctlmatch;
+       uint8_t tmask;
+       uint8_t tmatch;
+#endif
+};
+
+
+/* Structure for MB Command CONFIG_HBQ (7c) */
+
+struct config_hbq_var {
+#ifdef __BIG_ENDIAN_BITFIELD
+       uint32_t rsvd1      :7;
+       uint32_t recvNotify :1;     /* Receive Notification */
+       uint32_t numMask    :8;     /* # Mask Entries       */
+       uint32_t profile    :8;     /* Selection Profile    */
+       uint32_t rsvd2      :8;
+#else  /*  __LITTLE_ENDIAN */
+       uint32_t rsvd2      :8;
+       uint32_t profile    :8;     /* Selection Profile    */
+       uint32_t numMask    :8;     /* # Mask Entries       */
+       uint32_t recvNotify :1;     /* Receive Notification */
+       uint32_t rsvd1      :7;
+#endif
+
+#ifdef __BIG_ENDIAN_BITFIELD
+       uint32_t hbqId      :16;
+       uint32_t rsvd3      :12;
+       uint32_t ringMask   :4;
+#else  /*  __LITTLE_ENDIAN */
+       uint32_t ringMask   :4;
+       uint32_t rsvd3      :12;
+       uint32_t hbqId      :16;
+#endif
+
+#ifdef __BIG_ENDIAN_BITFIELD
+       uint32_t entry_count :16;
+       uint32_t rsvd4        :8;
+       uint32_t headerLen    :8;
+#else  /*  __LITTLE_ENDIAN */
+       uint32_t headerLen    :8;
+       uint32_t rsvd4        :8;
+       uint32_t entry_count :16;
+#endif
+
+       uint32_t hbqaddrLow;
+       uint32_t hbqaddrHigh;
+
+#ifdef __BIG_ENDIAN_BITFIELD
+       uint32_t rsvd5      :31;
+       uint32_t logEntry   :1;
+#else  /*  __LITTLE_ENDIAN */
+       uint32_t logEntry   :1;
+       uint32_t rsvd5      :31;
+#endif
+
+       uint32_t rsvd6;    /* w7 */
+       uint32_t rsvd7;    /* w8 */
+       uint32_t rsvd8;    /* w9 */
+
+       struct hbq_mask hbqMasks[6];
+
+
+       union {
+               uint32_t allprofiles[12];
+
+               struct {
+                       #ifdef __BIG_ENDIAN_BITFIELD
+                               uint32_t        seqlenoff       :16;
+                               uint32_t        maxlen          :16;
+                       #else   /*  __LITTLE_ENDIAN */
+                               uint32_t        maxlen          :16;
+                               uint32_t        seqlenoff       :16;
+                       #endif
+                       #ifdef __BIG_ENDIAN_BITFIELD
+                               uint32_t        rsvd1           :28;
+                               uint32_t        seqlenbcnt      :4;
+                       #else   /*  __LITTLE_ENDIAN */
+                               uint32_t        seqlenbcnt      :4;
+                               uint32_t        rsvd1           :28;
+                       #endif
+                       uint32_t rsvd[10];
+               } profile2;
+
+               struct {
+                       #ifdef __BIG_ENDIAN_BITFIELD
+                               uint32_t        seqlenoff       :16;
+                               uint32_t        maxlen          :16;
+                       #else   /*  __LITTLE_ENDIAN */
+                               uint32_t        maxlen          :16;
+                               uint32_t        seqlenoff       :16;
+                       #endif
+                       #ifdef __BIG_ENDIAN_BITFIELD
+                               uint32_t        cmdcodeoff      :28;
+                               uint32_t        rsvd1           :12;
+                               uint32_t        seqlenbcnt      :4;
+                       #else   /*  __LITTLE_ENDIAN */
+                               uint32_t        seqlenbcnt      :4;
+                               uint32_t        rsvd1           :12;
+                               uint32_t        cmdcodeoff      :28;
+                       #endif
+                       uint32_t cmdmatch[8];
+
+                       uint32_t rsvd[2];
+               } profile3;
 
+               struct {
+                       #ifdef __BIG_ENDIAN_BITFIELD
+                               uint32_t        seqlenoff       :16;
+                               uint32_t        maxlen          :16;
+                       #else   /*  __LITTLE_ENDIAN */
+                               uint32_t        maxlen          :16;
+                               uint32_t        seqlenoff       :16;
+                       #endif
+                       #ifdef __BIG_ENDIAN_BITFIELD
+                               uint32_t        cmdcodeoff      :28;
+                               uint32_t        rsvd1           :12;
+                               uint32_t        seqlenbcnt      :4;
+                       #else   /*  __LITTLE_ENDIAN */
+                               uint32_t        seqlenbcnt      :4;
+                               uint32_t        rsvd1           :12;
+                               uint32_t        cmdcodeoff      :28;
+                       #endif
+                       uint32_t cmdmatch[8];
+
+                       uint32_t rsvd[2];
+               } profile5;
+
+       } profiles;
+
+};
+
+
+
+/* Structure for MB Command CONFIG_PORT (0x88) */
 typedef struct {
-       uint32_t pcbLen;
+#ifdef __BIG_ENDIAN_BITFIELD
+       uint32_t cBE       :  1;
+       uint32_t cET       :  1;
+       uint32_t cHpcb     :  1;
+       uint32_t cMA       :  1;
+       uint32_t sli_mode  :  4;
+       uint32_t pcbLen    : 24;       /* bit 23:0  of memory based port
+                                       * config block */
+#else  /*  __LITTLE_ENDIAN */
+       uint32_t pcbLen    : 24;       /* bit 23:0  of memory based port
+                                       * config block */
+       uint32_t sli_mode  :  4;
+       uint32_t cMA       :  1;
+       uint32_t cHpcb     :  1;
+       uint32_t cET       :  1;
+       uint32_t cBE       :  1;
+#endif
+
        uint32_t pcbLow;       /* bit 31:0  of memory based port config block */
        uint32_t pcbHigh;      /* bit 63:32 of memory based port config block */
        uint32_t hbainit[5];
+#ifdef __BIG_ENDIAN_BITFIELD
+       uint32_t hps       :  1; /* bit 31 word9 Host Pointer in slim */
+       uint32_t rsvd      : 31; /* least significant 31 bits of word 9 */
+#else   /*  __LITTLE_ENDIAN */
+       uint32_t rsvd      : 31; /* least significant 31 bits of word 9 */
+       uint32_t hps       :  1; /* bit 31 word9 Host Pointer in slim */
+#endif
+
+#ifdef __BIG_ENDIAN_BITFIELD
+       uint32_t rsvd1     : 19;  /* Reserved                             */
+       uint32_t cdss      :  1;  /* Configure Data Security SLI          */
+       uint32_t casabt    :  1;  /* Configure async abts status notice   */
+       uint32_t rsvd2     :  2;  /* Reserved                             */
+       uint32_t cbg       :  1;  /* Configure BlockGuard                 */
+       uint32_t cmv       :  1;  /* Configure Max VPIs                   */
+       uint32_t ccrp      :  1;  /* Config Command Ring Polling          */
+       uint32_t csah      :  1;  /* Configure Synchronous Abort Handling */
+       uint32_t chbs      :  1;  /* Cofigure Host Backing store          */
+       uint32_t cinb      :  1;  /* Enable Interrupt Notification Block  */
+       uint32_t cerbm     :  1;  /* Configure Enhanced Receive Buf Mgmt  */
+       uint32_t cmx       :  1;  /* Configure Max XRIs                   */
+       uint32_t cmr       :  1;  /* Configure Max RPIs                   */
+#else  /*  __LITTLE_ENDIAN */
+       uint32_t cmr       :  1;  /* Configure Max RPIs                   */
+       uint32_t cmx       :  1;  /* Configure Max XRIs                   */
+       uint32_t cerbm     :  1;  /* Configure Enhanced Receive Buf Mgmt  */
+       uint32_t cinb      :  1;  /* Enable Interrupt Notification Block  */
+       uint32_t chbs      :  1;  /* Cofigure Host Backing store          */
+       uint32_t csah      :  1;  /* Configure Synchronous Abort Handling */
+       uint32_t ccrp      :  1;  /* Config Command Ring Polling          */
+       uint32_t cmv       :  1;  /* Configure Max VPIs                   */
+       uint32_t cbg       :  1;  /* Configure BlockGuard                 */
+       uint32_t rsvd2     :  2;  /* Reserved                             */
+       uint32_t casabt    :  1;  /* Configure async abts status notice   */
+       uint32_t cdss      :  1;  /* Configure Data Security SLI          */
+       uint32_t rsvd1     : 19;  /* Reserved                             */
+#endif
+#ifdef __BIG_ENDIAN_BITFIELD
+       uint32_t rsvd3     : 19;  /* Reserved                             */
+       uint32_t gdss      :  1;  /* Configure Data Security SLI          */
+       uint32_t gasabt    :  1;  /* Grant async abts status notice       */
+       uint32_t rsvd4     :  2;  /* Reserved                             */
+       uint32_t gbg       :  1;  /* Grant BlockGuard                     */
+       uint32_t gmv       :  1;  /* Grant Max VPIs                       */
+       uint32_t gcrp      :  1;  /* Grant Command Ring Polling           */
+       uint32_t gsah      :  1;  /* Grant Synchronous Abort Handling     */
+       uint32_t ghbs      :  1;  /* Grant Host Backing Store             */
+       uint32_t ginb      :  1;  /* Grant Interrupt Notification Block   */
+       uint32_t gerbm     :  1;  /* Grant ERBM Request                   */
+       uint32_t gmx       :  1;  /* Grant Max XRIs                       */
+       uint32_t gmr       :  1;  /* Grant Max RPIs                       */
+#else  /*  __LITTLE_ENDIAN */
+       uint32_t gmr       :  1;  /* Grant Max RPIs                       */
+       uint32_t gmx       :  1;  /* Grant Max XRIs                       */
+       uint32_t gerbm     :  1;  /* Grant ERBM Request                   */
+       uint32_t ginb      :  1;  /* Grant Interrupt Notification Block   */
+       uint32_t ghbs      :  1;  /* Grant Host Backing Store             */
+       uint32_t gsah      :  1;  /* Grant Synchronous Abort Handling     */
+       uint32_t gcrp      :  1;  /* Grant Command Ring Polling           */
+       uint32_t gmv       :  1;  /* Grant Max VPIs                       */
+       uint32_t gbg       :  1;  /* Grant BlockGuard                     */
+       uint32_t rsvd4     :  2;  /* Reserved                             */
+       uint32_t gasabt    :  1;  /* Grant async abts status notice       */
+       uint32_t gdss      :  1;  /* Configure Data Security SLI          */
+       uint32_t rsvd3     : 19;  /* Reserved                             */
+#endif
+
+#ifdef __BIG_ENDIAN_BITFIELD
+       uint32_t max_rpi   : 16;  /* Max RPIs Port should configure       */
+       uint32_t max_xri   : 16;  /* Max XRIs Port should configure       */
+#else  /*  __LITTLE_ENDIAN */
+       uint32_t max_xri   : 16;  /* Max XRIs Port should configure       */
+       uint32_t max_rpi   : 16;  /* Max RPIs Port should configure       */
+#endif
+
+#ifdef __BIG_ENDIAN_BITFIELD
+       uint32_t max_hbq   : 16;  /* Max HBQs Host expect to configure    */
+       uint32_t rsvd5     : 16;  /* Max HBQs Host expect to configure    */
+#else  /*  __LITTLE_ENDIAN */
+       uint32_t rsvd5     : 16;  /* Max HBQs Host expect to configure    */
+       uint32_t max_hbq   : 16;  /* Max HBQs Host expect to configure    */
+#endif
+
+       uint32_t rsvd6;           /* Reserved                             */
+
+#ifdef __BIG_ENDIAN_BITFIELD
+       uint32_t fips_rev   : 3;   /* FIPS Spec Revision                   */
+       uint32_t fips_level : 4;   /* FIPS Level                           */
+       uint32_t sec_err    : 9;   /* security crypto error                */
+       uint32_t max_vpi    : 16;  /* Max number of virt N-Ports           */
+#else  /*  __LITTLE_ENDIAN */
+       uint32_t max_vpi    : 16;  /* Max number of virt N-Ports           */
+       uint32_t sec_err    : 9;   /* security crypto error                */
+       uint32_t fips_level : 4;   /* FIPS Level                           */
+       uint32_t fips_rev   : 3;   /* FIPS Spec Revision                   */
+#endif
+
 } CONFIG_PORT_VAR;
 
+/* Structure for MB Command CONFIG_MSI (0x30) */
+struct config_msi_var {
+#ifdef __BIG_ENDIAN_BITFIELD
+       uint32_t dfltMsgNum:8;  /* Default message number            */
+       uint32_t rsvd1:11;      /* Reserved                          */
+       uint32_t NID:5;         /* Number of secondary attention IDs */
+       uint32_t rsvd2:5;       /* Reserved                          */
+       uint32_t dfltPresent:1; /* Default message number present    */
+       uint32_t addFlag:1;     /* Add association flag              */
+       uint32_t reportFlag:1;  /* Report association flag           */
+#else  /*  __LITTLE_ENDIAN_BITFIELD */
+       uint32_t reportFlag:1;  /* Report association flag           */
+       uint32_t addFlag:1;     /* Add association flag              */
+       uint32_t dfltPresent:1; /* Default message number present    */
+       uint32_t rsvd2:5;       /* Reserved                          */
+       uint32_t NID:5;         /* Number of secondary attention IDs */
+       uint32_t rsvd1:11;      /* Reserved                          */
+       uint32_t dfltMsgNum:8;  /* Default message number            */
+#endif
+       uint32_t attentionConditions[2];
+       uint8_t  attentionId[16];
+       uint8_t  messageNumberByHA[64];
+       uint8_t  messageNumberByID[16];
+       uint32_t autoClearHA[2];
+#ifdef __BIG_ENDIAN_BITFIELD
+       uint32_t rsvd3:16;
+       uint32_t autoClearID:16;
+#else  /*  __LITTLE_ENDIAN_BITFIELD */
+       uint32_t autoClearID:16;
+       uint32_t rsvd3:16;
+#endif
+       uint32_t rsvd4;
+};
+
 /* SLI-2 Port Control Block */
 
 /* SLIM POINTER */
@@ -2124,18 +2968,18 @@ typedef struct _SLI2_RDSC {
 typedef struct _PCB {
 #ifdef __BIG_ENDIAN_BITFIELD
        uint32_t type:8;
-#define TYPE_NATIVE_SLI2       0x01;
+#define TYPE_NATIVE_SLI2       0x01
        uint32_t feature:8;
-#define FEATURE_INITIAL_SLI2   0x01;
+#define FEATURE_INITIAL_SLI2   0x01
        uint32_t rsvd:12;
        uint32_t maxRing:4;
 #else  /*  __LITTLE_ENDIAN_BITFIELD */
        uint32_t maxRing:4;
        uint32_t rsvd:12;
        uint32_t feature:8;
-#define FEATURE_INITIAL_SLI2   0x01;
+#define FEATURE_INITIAL_SLI2   0x01
        uint32_t type:8;
-#define TYPE_NATIVE_SLI2       0x01;
+#define TYPE_NATIVE_SLI2       0x01
 #endif
 
        uint32_t mailBoxSize;
@@ -2176,63 +3020,107 @@ typedef struct {
        uint32_t IPAddress;
 } CONFIG_FARP_VAR;
 
+/* Structure for MB Command MBX_ASYNCEVT_ENABLE (0x33) */
+
+typedef struct {
+#ifdef __BIG_ENDIAN_BITFIELD
+       uint32_t rsvd:30;
+       uint32_t ring:2;        /* Ring for ASYNC_EVENT iocb Bits 0-1*/
+#else /*  __LITTLE_ENDIAN */
+       uint32_t ring:2;        /* Ring for ASYNC_EVENT iocb Bits 0-1*/
+       uint32_t rsvd:30;
+#endif
+} ASYNCEVT_ENABLE_VAR;
+
 /* Union of all Mailbox Command types */
 #define MAILBOX_CMD_WSIZE      32
 #define MAILBOX_CMD_SIZE       (MAILBOX_CMD_WSIZE * sizeof(uint32_t))
+/* ext_wsize times 4 bytes should not be greater than max xmit size */
+#define MAILBOX_EXT_WSIZE      512
+#define MAILBOX_EXT_SIZE       (MAILBOX_EXT_WSIZE * sizeof(uint32_t))
+#define MAILBOX_HBA_EXT_OFFSET  0x100
+/* max mbox xmit size is a page size for sysfs IO operations */
+#define MAILBOX_SYSFS_MAX      4096
 
 typedef union {
-       uint32_t varWords[MAILBOX_CMD_WSIZE - 1];
-       LOAD_SM_VAR varLdSM;    /* cmd =  1 (LOAD_SM)        */
-       READ_NV_VAR varRDnvp;   /* cmd =  2 (READ_NVPARMS)   */
-       WRITE_NV_VAR varWTnvp;  /* cmd =  3 (WRITE_NVPARMS)  */
+       uint32_t varWords[MAILBOX_CMD_WSIZE - 1]; /* first word is type/
+                                                   * feature/max ring number
+                                                   */
+       LOAD_SM_VAR varLdSM;            /* cmd =  1 (LOAD_SM)        */
+       READ_NV_VAR varRDnvp;           /* cmd =  2 (READ_NVPARMS)   */
+       WRITE_NV_VAR varWTnvp;          /* cmd =  3 (WRITE_NVPARMS)  */
        BIU_DIAG_VAR varBIUdiag;        /* cmd =  4 (RUN_BIU_DIAG)   */
        INIT_LINK_VAR varInitLnk;       /* cmd =  5 (INIT_LINK)      */
        DOWN_LINK_VAR varDwnLnk;        /* cmd =  6 (DOWN_LINK)      */
-       CONFIG_LINK varCfgLnk;  /* cmd =  7 (CONFIG_LINK)    */
-       PART_SLIM_VAR varSlim;  /* cmd =  8 (PART_SLIM)      */
+       CONFIG_LINK varCfgLnk;          /* cmd =  7 (CONFIG_LINK)    */
+       PART_SLIM_VAR varSlim;          /* cmd =  8 (PART_SLIM)      */
        CONFIG_RING_VAR varCfgRing;     /* cmd =  9 (CONFIG_RING)    */
        RESET_RING_VAR varRstRing;      /* cmd = 10 (RESET_RING)     */
        READ_CONFIG_VAR varRdConfig;    /* cmd = 11 (READ_CONFIG)    */
        READ_RCONF_VAR varRdRConfig;    /* cmd = 12 (READ_RCONFIG)   */
        READ_SPARM_VAR varRdSparm;      /* cmd = 13 (READ_SPARM(64)) */
        READ_STATUS_VAR varRdStatus;    /* cmd = 14 (READ_STATUS)    */
-       READ_RPI_VAR varRdRPI;  /* cmd = 15 (READ_RPI(64))   */
-       READ_XRI_VAR varRdXRI;  /* cmd = 16 (READ_XRI)       */
-       READ_REV_VAR varRdRev;  /* cmd = 17 (READ_REV)       */
-       READ_LNK_VAR varRdLnk;  /* cmd = 18 (READ_LNK_STAT)  */
+       READ_RPI_VAR varRdRPI;          /* cmd = 15 (READ_RPI(64))   */
+       READ_XRI_VAR varRdXRI;          /* cmd = 16 (READ_XRI)       */
+       READ_REV_VAR varRdRev;          /* cmd = 17 (READ_REV)       */
+       READ_LNK_VAR varRdLnk;          /* cmd = 18 (READ_LNK_STAT)  */
        REG_LOGIN_VAR varRegLogin;      /* cmd = 19 (REG_LOGIN(64))  */
        UNREG_LOGIN_VAR varUnregLogin;  /* cmd = 20 (UNREG_LOGIN)    */
-       READ_LA_VAR varReadLA;  /* cmd = 21 (READ_LA(64))    */
        CLEAR_LA_VAR varClearLA;        /* cmd = 22 (CLEAR_LA)       */
-       DUMP_VAR varDmp;        /* Warm Start DUMP mbx cmd   */
-       UNREG_D_ID_VAR varUnregDID; /* cmd = 0x23 (UNREG_D_ID)   */
-       CONFIG_FARP_VAR varCfgFarp; /* cmd = 0x25 (CONFIG_FARP)  NEW_FEATURE */
-       CONFIG_PORT_VAR varCfgPort; /* cmd = 0x88 (CONFIG_PORT)  */
+       DUMP_VAR varDmp;                /* Warm Start DUMP mbx cmd   */
+       UNREG_D_ID_VAR varUnregDID;     /* cmd = 0x23 (UNREG_D_ID)   */
+       CONFIG_FARP_VAR varCfgFarp;     /* cmd = 0x25 (CONFIG_FARP)
+                                        * NEW_FEATURE
+                                        */
+       struct config_hbq_var varCfgHbq;/* cmd = 0x7c (CONFIG_HBQ)  */
+       struct update_cfg_var varUpdateCfg; /* cmd = 0x1B (UPDATE_CFG)*/
+       CONFIG_PORT_VAR varCfgPort;     /* cmd = 0x88 (CONFIG_PORT)  */
+       struct lpfc_mbx_read_top varReadTop; /* cmd = 0x95 (READ_TOPOLOGY) */
+       REG_VPI_VAR varRegVpi;          /* cmd = 0x96 (REG_VPI) */
+       UNREG_VPI_VAR varUnregVpi;      /* cmd = 0x97 (UNREG_VPI) */
+       ASYNCEVT_ENABLE_VAR varCfgAsyncEvent; /*cmd = x33 (CONFIG_ASYNC) */
+       struct READ_EVENT_LOG_VAR varRdEventLog;        /* cmd = 0x38
+                                                        * (READ_EVENT_LOG)
+                                                        */
+       struct config_msi_var varCfgMSI;/* cmd = x30 (CONFIG_MSI)     */
 } MAILVARIANTS;
 
 /*
  * SLI-2 specific structures
  */
 
-typedef struct {
-       uint32_t cmdPutInx;
-       uint32_t rspGetInx;
-} HGP;
+struct lpfc_hgp {
+       __le32 cmdPutInx;
+       __le32 rspGetInx;
+};
 
-typedef struct {
-       uint32_t cmdGetInx;
-       uint32_t rspPutInx;
-} PGP;
+struct lpfc_pgp {
+       __le32 cmdGetInx;
+       __le32 rspPutInx;
+};
 
-typedef struct _SLI2_DESC {
-       HGP host[MAX_RINGS];
+struct sli2_desc {
        uint32_t unused1[16];
-       PGP port[MAX_RINGS];
-} SLI2_DESC;
+       struct lpfc_hgp host[MAX_RINGS];
+       struct lpfc_pgp port[MAX_RINGS];
+};
 
-typedef union {
-       SLI2_DESC s2;
-} SLI_VAR;
+struct sli3_desc {
+       struct lpfc_hgp host[MAX_RINGS];
+       uint32_t reserved[8];
+       uint32_t hbq_put[16];
+};
+
+struct sli3_pgp {
+       struct lpfc_pgp port[MAX_RINGS];
+       uint32_t hbq_get[16];
+};
+
+union sli_var {
+       struct sli2_desc        s2;
+       struct sli3_desc        s3;
+       struct sli3_pgp         s3_pgp;
+};
 
 typedef struct {
 #ifdef __BIG_ENDIAN_BITFIELD
@@ -2250,7 +3138,7 @@ typedef struct {
 #endif
 
        MAILVARIANTS un;
-       SLI_VAR us;
+       union sli_var us;
 } MAILBOX_t;
 
 /*
@@ -2338,7 +3226,18 @@ typedef struct {
 #define IOERR_BUFFER_SHORTAGE         0x28
 #define IOERR_DEFAULT                 0x29
 #define IOERR_CNT                     0x2A
-
+#define IOERR_SLER_FAILURE            0x46
+#define IOERR_SLER_CMD_RCV_FAILURE    0x47
+#define IOERR_SLER_REC_RJT_ERR        0x48
+#define IOERR_SLER_REC_SRR_RETRY_ERR  0x49
+#define IOERR_SLER_SRR_RJT_ERR        0x4A
+#define IOERR_SLER_RRQ_RJT_ERR        0x4C
+#define IOERR_SLER_RRQ_RETRY_ERR      0x4D
+#define IOERR_SLER_ABTS_ERR           0x4E
+#define IOERR_ELXSEC_KEY_UNWRAP_ERROR          0xF0
+#define IOERR_ELXSEC_KEY_UNWRAP_COMPARE_ERROR  0xF1
+#define IOERR_ELXSEC_CRYPTO_ERROR              0xF2
+#define IOERR_ELXSEC_CRYPTO_COMPARE_ERROR      0xF3
 #define IOERR_DRVR_MASK               0x100
 #define IOERR_SLI_DOWN                0x101  /* ulpStatus  - Driver defined */
 #define IOERR_SLI_BRESET              0x102
@@ -2523,6 +3422,34 @@ typedef struct {
 #endif
 } RCV_ELS_REQ64;
 
+/* IOCB Command template for RCV_SEQ64 */
+struct rcv_seq64 {
+       struct ulp_bde64 elsReq;
+       uint32_t hbq_1;
+       uint32_t parmRo;
+#ifdef __BIG_ENDIAN_BITFIELD
+       uint32_t rctl:8;
+       uint32_t type:8;
+       uint32_t dfctl:8;
+       uint32_t ls:1;
+       uint32_t fs:1;
+       uint32_t rsvd2:3;
+       uint32_t si:1;
+       uint32_t bc:1;
+       uint32_t rsvd3:1;
+#else  /*  __LITTLE_ENDIAN_BITFIELD */
+       uint32_t rsvd3:1;
+       uint32_t bc:1;
+       uint32_t si:1;
+       uint32_t rsvd2:3;
+       uint32_t fs:1;
+       uint32_t ls:1;
+       uint32_t dfctl:8;
+       uint32_t type:8;
+       uint32_t rctl:8;
+#endif
+};
+
 /* IOCB Command template for all 64 bit FCP Initiator commands */
 typedef struct {
        ULP_BDL bdl;
@@ -2537,6 +3464,174 @@ typedef struct {
        uint32_t fcpt_Length;   /* transfer ready for IWRITE */
 } FCPT_FIELDS64;
 
+/* IOCB Command template for Async Status iocb commands */
+typedef struct {
+       uint32_t rsvd[4];
+       uint32_t param;
+#ifdef __BIG_ENDIAN_BITFIELD
+       uint16_t evt_code;              /* High order bits word 5 */
+       uint16_t sub_ctxt_tag;          /* Low  order bits word 5 */
+#else   /*  __LITTLE_ENDIAN_BITFIELD */
+       uint16_t sub_ctxt_tag;          /* High order bits word 5 */
+       uint16_t evt_code;              /* Low  order bits word 5 */
+#endif
+} ASYNCSTAT_FIELDS;
+#define ASYNC_TEMP_WARN                0x100
+#define ASYNC_TEMP_SAFE                0x101
+#define ASYNC_STATUS_CN                0x102
+
+/* IOCB Command template for CMD_IOCB_RCV_ELS64_CX (0xB7)
+   or CMD_IOCB_RCV_SEQ64_CX (0xB5) */
+
+struct rcv_sli3 {
+#ifdef __BIG_ENDIAN_BITFIELD
+       uint16_t ox_id;
+       uint16_t seq_cnt;
+
+       uint16_t vpi;
+       uint16_t word9Rsvd;
+#else  /*  __LITTLE_ENDIAN */
+       uint16_t seq_cnt;
+       uint16_t ox_id;
+
+       uint16_t word9Rsvd;
+       uint16_t vpi;
+#endif
+       uint32_t word10Rsvd;
+       uint32_t acc_len;      /* accumulated length */
+       struct ulp_bde64 bde2;
+};
+
+/* Structure used for a single HBQ entry */
+struct lpfc_hbq_entry {
+       struct ulp_bde64 bde;
+       uint32_t buffer_tag;
+};
+
+/* IOCB Command template for QUE_XRI64_CX (0xB3) command */
+typedef struct {
+       struct lpfc_hbq_entry   buff;
+       uint32_t                rsvd;
+       uint32_t                rsvd1;
+} QUE_XRI64_CX_FIELDS;
+
+struct que_xri64cx_ext_fields {
+       uint32_t        iotag64_low;
+       uint32_t        iotag64_high;
+       uint32_t        ebde_count;
+       uint32_t        rsvd;
+       struct lpfc_hbq_entry   buff[5];
+};
+
+struct sli3_bg_fields {
+       uint32_t filler[6];     /* word 8-13 in IOCB */
+       uint32_t bghm;          /* word 14 - BlockGuard High Water Mark */
+/* Bitfields for bgstat (BlockGuard Status - word 15 of IOCB) */
+#define BGS_BIDIR_BG_PROF_MASK         0xff000000
+#define BGS_BIDIR_BG_PROF_SHIFT                24
+#define BGS_BIDIR_ERR_COND_FLAGS_MASK  0x003f0000
+#define BGS_BIDIR_ERR_COND_SHIFT       16
+#define BGS_BG_PROFILE_MASK            0x0000ff00
+#define BGS_BG_PROFILE_SHIFT           8
+#define BGS_INVALID_PROF_MASK          0x00000020
+#define BGS_INVALID_PROF_SHIFT         5
+#define BGS_UNINIT_DIF_BLOCK_MASK      0x00000010
+#define BGS_UNINIT_DIF_BLOCK_SHIFT     4
+#define BGS_HI_WATER_MARK_PRESENT_MASK 0x00000008
+#define BGS_HI_WATER_MARK_PRESENT_SHIFT        3
+#define BGS_REFTAG_ERR_MASK            0x00000004
+#define BGS_REFTAG_ERR_SHIFT           2
+#define BGS_APPTAG_ERR_MASK            0x00000002
+#define BGS_APPTAG_ERR_SHIFT           1
+#define BGS_GUARD_ERR_MASK             0x00000001
+#define BGS_GUARD_ERR_SHIFT            0
+       uint32_t bgstat;        /* word 15 - BlockGuard Status */
+};
+
+static inline uint32_t
+lpfc_bgs_get_bidir_bg_prof(uint32_t bgstat)
+{
+       return (bgstat & BGS_BIDIR_BG_PROF_MASK) >>
+                               BGS_BIDIR_BG_PROF_SHIFT;
+}
+
+static inline uint32_t
+lpfc_bgs_get_bidir_err_cond(uint32_t bgstat)
+{
+       return (bgstat & BGS_BIDIR_ERR_COND_FLAGS_MASK) >>
+                               BGS_BIDIR_ERR_COND_SHIFT;
+}
+
+static inline uint32_t
+lpfc_bgs_get_bg_prof(uint32_t bgstat)
+{
+       return (bgstat & BGS_BG_PROFILE_MASK) >>
+                               BGS_BG_PROFILE_SHIFT;
+}
+
+static inline uint32_t
+lpfc_bgs_get_invalid_prof(uint32_t bgstat)
+{
+       return (bgstat & BGS_INVALID_PROF_MASK) >>
+                               BGS_INVALID_PROF_SHIFT;
+}
+
+static inline uint32_t
+lpfc_bgs_get_uninit_dif_block(uint32_t bgstat)
+{
+       return (bgstat & BGS_UNINIT_DIF_BLOCK_MASK) >>
+                               BGS_UNINIT_DIF_BLOCK_SHIFT;
+}
+
+static inline uint32_t
+lpfc_bgs_get_hi_water_mark_present(uint32_t bgstat)
+{
+       return (bgstat & BGS_HI_WATER_MARK_PRESENT_MASK) >>
+                               BGS_HI_WATER_MARK_PRESENT_SHIFT;
+}
+
+static inline uint32_t
+lpfc_bgs_get_reftag_err(uint32_t bgstat)
+{
+       return (bgstat & BGS_REFTAG_ERR_MASK) >>
+                               BGS_REFTAG_ERR_SHIFT;
+}
+
+static inline uint32_t
+lpfc_bgs_get_apptag_err(uint32_t bgstat)
+{
+       return (bgstat & BGS_APPTAG_ERR_MASK) >>
+                               BGS_APPTAG_ERR_SHIFT;
+}
+
+static inline uint32_t
+lpfc_bgs_get_guard_err(uint32_t bgstat)
+{
+       return (bgstat & BGS_GUARD_ERR_MASK) >>
+                               BGS_GUARD_ERR_SHIFT;
+}
+
+#define LPFC_EXT_DATA_BDE_COUNT 3
+struct fcp_irw_ext {
+       uint32_t        io_tag64_low;
+       uint32_t        io_tag64_high;
+#ifdef __BIG_ENDIAN_BITFIELD
+       uint8_t         reserved1;
+       uint8_t         reserved2;
+       uint8_t         reserved3;
+       uint8_t         ebde_count;
+#else  /* __LITTLE_ENDIAN */
+       uint8_t         ebde_count;
+       uint8_t         reserved3;
+       uint8_t         reserved2;
+       uint8_t         reserved1;
+#endif
+       uint32_t        reserved4;
+       struct ulp_bde64 rbde;          /* response bde */
+       struct ulp_bde64 dbde[LPFC_EXT_DATA_BDE_COUNT]; /* data BDE or BPL */
+       uint8_t icd[32];                /* immediate command data (32 bytes) */
+};
+
 typedef struct _IOCB { /* IOCB structure */
        union {
                GENERIC_RSP grsp;       /* Generic response */
@@ -2551,15 +3646,18 @@ typedef struct _IOCB {  /* IOCB structure */
 
                /* SLI-2 structures */
 
-               struct ulp_bde64 cont64[2];     /* up to 2 64 bit continuation
-                                          bde_64s */
+               struct ulp_bde64 cont64[2];  /* up to 2 64 bit continuation
+                                             * bde_64s */
                ELS_REQUEST64 elsreq64; /* ELS_REQUEST template */
                GEN_REQUEST64 genreq64; /* GEN_REQUEST template */
                RCV_ELS_REQ64 rcvels64; /* RCV_ELS_REQ template */
                XMT_SEQ_FIELDS64 xseq64;        /* XMIT / BCAST cmd */
                FCPI_FIELDS64 fcpi64;   /* FCP 64 bit Initiator template */
                FCPT_FIELDS64 fcpt64;   /* FCP 64 bit target template */
-
+               ASYNCSTAT_FIELDS asyncstat; /* async_status iocb */
+               QUE_XRI64_CX_FIELDS quexri64cx; /* que_xri64_cx fields */
+               struct rcv_seq64 rcvseq64;      /* RCV_SEQ64 and RCV_CONT64 */
+               struct sli4_bls_rsp bls_rsp; /* UNSOL ABTS BLS_RSP params */
                uint32_t ulpWord[IOCB_WORD_SZ - 2];     /* generic 6 'words' */
        } un;
        union {
@@ -2614,9 +3712,27 @@ typedef struct _IOCB {   /* IOCB structure */
        uint32_t ulpTimeout:8;
 #endif
 
+       union {
+               struct rcv_sli3 rcvsli3; /* words 8 - 15 */
+
+               /* words 8-31 used for que_xri_cx iocb */
+               struct que_xri64cx_ext_fields que_xri64cx_ext_words;
+               struct fcp_irw_ext fcp_ext;
+               uint32_t sli3Words[24]; /* 96 extra bytes for SLI-3 */
+
+               /* words 8-15 for BlockGuard */
+               struct sli3_bg_fields sli3_bg;
+       } unsli3;
+
+#define ulpCt_h ulpXS
+#define ulpCt_l ulpFCP2Rcvy
+
+#define IOCB_FCP          1    /* IOCB is used for FCP ELS cmds-ulpRsvByte */
+#define IOCB_IP                   2    /* IOCB is used for IP ELS cmds */
 #define PARM_UNUSED        0   /* PU field (Word 4) not used */
 #define PARM_REL_OFF       1   /* PU field (Word 4) = R. O. */
 #define PARM_READ_CHECK    2   /* PU field (Word 4) = Data Transfer Length */
+#define PARM_NPIV_DID     3
 #define CLASS1             0   /* Class 1 */
 #define CLASS2             1   /* Class 2 */
 #define CLASS3             2   /* Class 3 */
@@ -2637,7 +3753,7 @@ typedef struct _IOCB {    /* IOCB structure */
 #define IOSTAT_RSVD2           0xC
 #define IOSTAT_RSVD3           0xD
 #define IOSTAT_RSVD4           0xE
-#define IOSTAT_RSVD5           0xF
+#define IOSTAT_NEED_BUFFER     0xF
 #define IOSTAT_DRIVER_REJECT   0x10   /* ulpStatus  - Driver defined */
 #define IOSTAT_DEFAULT         0xF    /* Same as rsvd5 for now */
 #define IOSTAT_CNT             0x11
@@ -2650,26 +3766,34 @@ typedef struct _IOCB {  /* IOCB structure */
 /* Up to 498 IOCBs will fit into 16k
  * 256 (MAILBOX_t) + 140 (PCB_t) + ( 32 (IOCB_t) * 498 ) = < 16384
  */
-#define SLI2_SLIM_SIZE   (16 * 1024)
+#define SLI2_SLIM_SIZE   (64 * 1024)
 
 /* Maximum IOCBs that will fit in SLI2 slim */
 #define MAX_SLI2_IOCB    498
+#define MAX_SLIM_IOCB_SIZE (SLI2_SLIM_SIZE - \
+                           (sizeof(MAILBOX_t) + sizeof(PCB_t) + \
+                           sizeof(uint32_t) * MAILBOX_EXT_WSIZE))
+
+/* HBQ entries are 4 words each = 4k */
+#define LPFC_TOTAL_HBQ_SIZE (sizeof(struct lpfc_hbq_entry) *  \
+                            lpfc_sli_hbq_count())
 
 struct lpfc_sli2_slim {
        MAILBOX_t mbx;
+       uint32_t  mbx_ext_words[MAILBOX_EXT_WSIZE];
        PCB_t pcb;
-       IOCB_t IOCBs[MAX_SLI2_IOCB];
+       IOCB_t IOCBs[MAX_SLIM_IOCB_SIZE];
 };
 
-/*******************************************************************
-This macro check PCI device to allow special handling for LC HBAs.
-
-Parameters:
-device : struct pci_dev 's device field
-
-return 1 => TRUE
-       0 => FALSE
- *******************************************************************/
+/*
+ * This function checks PCI device to allow special handling for LC HBAs.
+ *
+ * Parameters:
+ * device : struct pci_dev 's device field
+ *
+ * return 1 => TRUE
+ *        0 => FALSE
+ */
 static inline int
 lpfc_is_LC_HBA(unsigned short device)
 {
@@ -2680,8 +3804,32 @@ lpfc_is_LC_HBA(unsigned short device)
            (device == PCI_DEVICE_ID_BSMB) ||
            (device == PCI_DEVICE_ID_ZMID) ||
            (device == PCI_DEVICE_ID_ZSMB) ||
+           (device == PCI_DEVICE_ID_SAT_MID) ||
+           (device == PCI_DEVICE_ID_SAT_SMB) ||
            (device == PCI_DEVICE_ID_RFLY))
                return 1;
        else
                return 0;
 }
+
+/*
+ * Determine if an IOCB failed because of a link event or firmware reset.
+ */
+
+static inline int
+lpfc_error_lost_link(IOCB_t *iocbp)
+{
+       return (iocbp->ulpStatus == IOSTAT_LOCAL_REJECT &&
+               (iocbp->un.ulpWord[4] == IOERR_SLI_ABORTED ||
+                iocbp->un.ulpWord[4] == IOERR_LINK_DOWN ||
+                iocbp->un.ulpWord[4] == IOERR_SLI_DOWN));
+}
+
+#define MENLO_TRANSPORT_TYPE 0xfe
+#define MENLO_CONTEXT 0
+#define MENLO_PU 3
+#define MENLO_TIMEOUT 30
+#define SETVAR_MLOMNT 0x103107
+#define SETVAR_MLORST 0x103007
+
+#define BPL_ALIGN_SZ 8 /* 8 byte alignment for bpl and mbufs */