]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/scsi/lpfc/lpfc_hw4.h
Merge branch 'perf/urgent' into perf/core, to pick up fixes
[karo-tx-linux.git] / drivers / scsi / lpfc / lpfc_hw4.h
index 5646699b0516b216c87c55684202bbfed2ec8c84..15277705cb6b8c650880572837954d91b6bc01eb 100644 (file)
@@ -1,9 +1,11 @@
 /*******************************************************************
  * This file is part of the Emulex Linux Device Driver for         *
  * Fibre Channel Host Bus Adapters.                                *
- * Copyright (C) 2009-2016 Emulex.  All rights reserved.                *
+ * Copyright (C) 2017 Broadcom. All Rights Reserved. The term      *
+ * “Broadcom” refers to Broadcom Limited and/or its subsidiaries.  *
+ * Copyright (C) 2009-2016 Emulex.  All rights reserved.           *
  * EMULEX and SLI are trademarks of Emulex.                        *
- * www.emulex.com                                                  *
+ * www.broadcom.com                                                *
  *                                                                 *
  * This program is free software; you can redistribute it and/or   *
  * modify it under the terms of version 2 of the GNU General       *
@@ -108,6 +110,7 @@ struct lpfc_sli_intf {
 #define LPFC_MAX_MQ_PAGE               8
 #define LPFC_MAX_WQ_PAGE_V0            4
 #define LPFC_MAX_WQ_PAGE               8
+#define LPFC_MAX_RQ_PAGE               8
 #define LPFC_MAX_CQ_PAGE               4
 #define LPFC_MAX_EQ_PAGE               8
 
@@ -198,7 +201,7 @@ struct lpfc_sli_intf {
 /* Configuration of Interrupts / sec for entire HBA port */
 #define LPFC_MIN_IMAX          5000
 #define LPFC_MAX_IMAX          5000000
-#define LPFC_DEF_IMAX          50000
+#define LPFC_DEF_IMAX          150000
 
 #define LPFC_MIN_CPU_MAP       0
 #define LPFC_MAX_CPU_MAP       2
@@ -348,6 +351,7 @@ struct lpfc_cqe {
 #define CQE_CODE_RECEIVE               0x4
 #define CQE_CODE_XRI_ABORTED           0x5
 #define CQE_CODE_RECEIVE_V1            0x9
+#define CQE_CODE_NVME_ERSP             0xd
 
 /*
  * Define mask value for xri_aborted and wcqe completed CQE extended status.
@@ -367,6 +371,9 @@ struct lpfc_wcqe_complete {
 #define lpfc_wcqe_c_hw_status_SHIFT    0
 #define lpfc_wcqe_c_hw_status_MASK     0x000000FF
 #define lpfc_wcqe_c_hw_status_WORD     word0
+#define lpfc_wcqe_c_ersp0_SHIFT                0
+#define lpfc_wcqe_c_ersp0_MASK         0x0000FFFF
+#define lpfc_wcqe_c_ersp0_WORD         word0
        uint32_t total_data_placed;
        uint32_t parameter;
 #define lpfc_wcqe_c_bg_edir_SHIFT      5
@@ -400,6 +407,9 @@ struct lpfc_wcqe_complete {
 #define lpfc_wcqe_c_code_SHIFT         lpfc_cqe_code_SHIFT
 #define lpfc_wcqe_c_code_MASK          lpfc_cqe_code_MASK
 #define lpfc_wcqe_c_code_WORD          lpfc_cqe_code_WORD
+#define lpfc_wcqe_c_sqhead_SHIFT       0
+#define lpfc_wcqe_c_sqhead_MASK                0x0000FFFF
+#define lpfc_wcqe_c_sqhead_WORD                word3
 };
 
 /* completion queue entry for wqe release */
@@ -954,6 +964,7 @@ struct mbox_header {
 #define LPFC_MBOX_OPCODE_FCOE_DELETE_FCF               0x0A
 #define LPFC_MBOX_OPCODE_FCOE_POST_HDR_TEMPLATE                0x0B
 #define LPFC_MBOX_OPCODE_FCOE_REDISCOVER_FCF           0x10
+#define LPFC_MBOX_OPCODE_FCOE_CQ_CREATE_SET            0x1D
 #define LPFC_MBOX_OPCODE_FCOE_SET_FCLINK_SETTINGS      0x21
 #define LPFC_MBOX_OPCODE_FCOE_LINK_DIAG_STATE          0x22
 #define LPFC_MBOX_OPCODE_FCOE_LINK_DIAG_LOOPBACK       0x23
@@ -990,7 +1001,7 @@ struct eq_delay_info {
        uint32_t phase;
        uint32_t delay_multi;
 };
-#define        LPFC_MAX_EQ_DELAY       8
+#define        LPFC_MAX_EQ_DELAY_EQID_CNT      8
 
 struct sgl_page_pairs {
        uint32_t sgl_pg0_addr_lo;
@@ -1059,7 +1070,7 @@ struct lpfc_mbx_modify_eq_delay {
        union {
                struct {
                        uint32_t num_eq;
-                       struct eq_delay_info eq[LPFC_MAX_EQ_DELAY];
+                       struct eq_delay_info eq[LPFC_MAX_EQ_DELAY_EQID_CNT];
                } request;
                struct {
                        uint32_t word0;
@@ -1135,6 +1146,116 @@ struct lpfc_mbx_cq_create {
        } u;
 };
 
+struct lpfc_mbx_cq_create_set {
+       union  lpfc_sli4_cfg_shdr cfg_shdr;
+       union {
+               struct {
+                       uint32_t word0;
+#define lpfc_mbx_cq_create_set_page_size_SHIFT 16      /* Version 2 Only */
+#define lpfc_mbx_cq_create_set_page_size_MASK  0x000000FF
+#define lpfc_mbx_cq_create_set_page_size_WORD  word0
+#define lpfc_mbx_cq_create_set_num_pages_SHIFT 0
+#define lpfc_mbx_cq_create_set_num_pages_MASK  0x0000FFFF
+#define lpfc_mbx_cq_create_set_num_pages_WORD  word0
+                       uint32_t word1;
+#define lpfc_mbx_cq_create_set_evt_SHIFT       31
+#define lpfc_mbx_cq_create_set_evt_MASK                0x00000001
+#define lpfc_mbx_cq_create_set_evt_WORD                word1
+#define lpfc_mbx_cq_create_set_valid_SHIFT     29
+#define lpfc_mbx_cq_create_set_valid_MASK      0x00000001
+#define lpfc_mbx_cq_create_set_valid_WORD      word1
+#define lpfc_mbx_cq_create_set_cqe_cnt_SHIFT   27
+#define lpfc_mbx_cq_create_set_cqe_cnt_MASK    0x00000003
+#define lpfc_mbx_cq_create_set_cqe_cnt_WORD    word1
+#define lpfc_mbx_cq_create_set_cqe_size_SHIFT  25
+#define lpfc_mbx_cq_create_set_cqe_size_MASK   0x00000003
+#define lpfc_mbx_cq_create_set_cqe_size_WORD   word1
+#define lpfc_mbx_cq_create_set_auto_SHIFT      15
+#define lpfc_mbx_cq_create_set_auto_MASK       0x0000001
+#define lpfc_mbx_cq_create_set_auto_WORD       word1
+#define lpfc_mbx_cq_create_set_nodelay_SHIFT   14
+#define lpfc_mbx_cq_create_set_nodelay_MASK    0x00000001
+#define lpfc_mbx_cq_create_set_nodelay_WORD    word1
+#define lpfc_mbx_cq_create_set_clswm_SHIFT     12
+#define lpfc_mbx_cq_create_set_clswm_MASK      0x00000003
+#define lpfc_mbx_cq_create_set_clswm_WORD      word1
+                       uint32_t word2;
+#define lpfc_mbx_cq_create_set_arm_SHIFT       31
+#define lpfc_mbx_cq_create_set_arm_MASK                0x00000001
+#define lpfc_mbx_cq_create_set_arm_WORD                word2
+#define lpfc_mbx_cq_create_set_num_cq_SHIFT    0
+#define lpfc_mbx_cq_create_set_num_cq_MASK     0x0000FFFF
+#define lpfc_mbx_cq_create_set_num_cq_WORD     word2
+                       uint32_t word3;
+#define lpfc_mbx_cq_create_set_eq_id1_SHIFT    16
+#define lpfc_mbx_cq_create_set_eq_id1_MASK     0x0000FFFF
+#define lpfc_mbx_cq_create_set_eq_id1_WORD     word3
+#define lpfc_mbx_cq_create_set_eq_id0_SHIFT    0
+#define lpfc_mbx_cq_create_set_eq_id0_MASK     0x0000FFFF
+#define lpfc_mbx_cq_create_set_eq_id0_WORD     word3
+                       uint32_t word4;
+#define lpfc_mbx_cq_create_set_eq_id3_SHIFT    16
+#define lpfc_mbx_cq_create_set_eq_id3_MASK     0x0000FFFF
+#define lpfc_mbx_cq_create_set_eq_id3_WORD     word4
+#define lpfc_mbx_cq_create_set_eq_id2_SHIFT    0
+#define lpfc_mbx_cq_create_set_eq_id2_MASK     0x0000FFFF
+#define lpfc_mbx_cq_create_set_eq_id2_WORD     word4
+                       uint32_t word5;
+#define lpfc_mbx_cq_create_set_eq_id5_SHIFT    16
+#define lpfc_mbx_cq_create_set_eq_id5_MASK     0x0000FFFF
+#define lpfc_mbx_cq_create_set_eq_id5_WORD     word5
+#define lpfc_mbx_cq_create_set_eq_id4_SHIFT    0
+#define lpfc_mbx_cq_create_set_eq_id4_MASK     0x0000FFFF
+#define lpfc_mbx_cq_create_set_eq_id4_WORD     word5
+                       uint32_t word6;
+#define lpfc_mbx_cq_create_set_eq_id7_SHIFT    16
+#define lpfc_mbx_cq_create_set_eq_id7_MASK     0x0000FFFF
+#define lpfc_mbx_cq_create_set_eq_id7_WORD     word6
+#define lpfc_mbx_cq_create_set_eq_id6_SHIFT    0
+#define lpfc_mbx_cq_create_set_eq_id6_MASK     0x0000FFFF
+#define lpfc_mbx_cq_create_set_eq_id6_WORD     word6
+                       uint32_t word7;
+#define lpfc_mbx_cq_create_set_eq_id9_SHIFT    16
+#define lpfc_mbx_cq_create_set_eq_id9_MASK     0x0000FFFF
+#define lpfc_mbx_cq_create_set_eq_id9_WORD     word7
+#define lpfc_mbx_cq_create_set_eq_id8_SHIFT    0
+#define lpfc_mbx_cq_create_set_eq_id8_MASK     0x0000FFFF
+#define lpfc_mbx_cq_create_set_eq_id8_WORD     word7
+                       uint32_t word8;
+#define lpfc_mbx_cq_create_set_eq_id11_SHIFT   16
+#define lpfc_mbx_cq_create_set_eq_id11_MASK    0x0000FFFF
+#define lpfc_mbx_cq_create_set_eq_id11_WORD    word8
+#define lpfc_mbx_cq_create_set_eq_id10_SHIFT   0
+#define lpfc_mbx_cq_create_set_eq_id10_MASK    0x0000FFFF
+#define lpfc_mbx_cq_create_set_eq_id10_WORD    word8
+                       uint32_t word9;
+#define lpfc_mbx_cq_create_set_eq_id13_SHIFT   16
+#define lpfc_mbx_cq_create_set_eq_id13_MASK    0x0000FFFF
+#define lpfc_mbx_cq_create_set_eq_id13_WORD    word9
+#define lpfc_mbx_cq_create_set_eq_id12_SHIFT   0
+#define lpfc_mbx_cq_create_set_eq_id12_MASK    0x0000FFFF
+#define lpfc_mbx_cq_create_set_eq_id12_WORD    word9
+                       uint32_t word10;
+#define lpfc_mbx_cq_create_set_eq_id15_SHIFT   16
+#define lpfc_mbx_cq_create_set_eq_id15_MASK    0x0000FFFF
+#define lpfc_mbx_cq_create_set_eq_id15_WORD    word10
+#define lpfc_mbx_cq_create_set_eq_id14_SHIFT   0
+#define lpfc_mbx_cq_create_set_eq_id14_MASK    0x0000FFFF
+#define lpfc_mbx_cq_create_set_eq_id14_WORD    word10
+                       struct dma_address page[1];
+               } request;
+               struct {
+                       uint32_t word0;
+#define lpfc_mbx_cq_create_set_num_alloc_SHIFT 16
+#define lpfc_mbx_cq_create_set_num_alloc_MASK  0x0000FFFF
+#define lpfc_mbx_cq_create_set_num_alloc_WORD  word0
+#define lpfc_mbx_cq_create_set_base_id_SHIFT   0
+#define lpfc_mbx_cq_create_set_base_id_MASK    0x0000FFFF
+#define lpfc_mbx_cq_create_set_base_id_WORD    word0
+               } response;
+       } u;
+};
+
 struct lpfc_mbx_cq_destroy {
        struct mbox_header header;
        union {
@@ -1186,6 +1307,7 @@ struct lpfc_mbx_wq_create {
 #define lpfc_mbx_wq_create_page_size_SHIFT     0
 #define lpfc_mbx_wq_create_page_size_MASK      0x000000FF
 #define lpfc_mbx_wq_create_page_size_WORD      word1
+#define LPFC_WQ_PAGE_SIZE_4096 0x1
 #define lpfc_mbx_wq_create_wqe_size_SHIFT      8
 #define lpfc_mbx_wq_create_wqe_size_MASK       0x0000000F
 #define lpfc_mbx_wq_create_wqe_size_WORD       word1
@@ -1243,10 +1365,10 @@ struct rq_context {
 #define LPFC_RQ_RING_SIZE_1024         10      /* 1024 entries */
 #define LPFC_RQ_RING_SIZE_2048         11      /* 2048 entries */
 #define LPFC_RQ_RING_SIZE_4096         12      /* 4096 entries */
-#define lpfc_rq_context_rqe_count_1_SHIFT      16      /* Version 1 Only */
+#define lpfc_rq_context_rqe_count_1_SHIFT      16      /* Version 1-2 Only */
 #define lpfc_rq_context_rqe_count_1_MASK       0x0000FFFF
 #define lpfc_rq_context_rqe_count_1_WORD       word0
-#define lpfc_rq_context_rqe_size_SHIFT 8               /* Version 1 Only */
+#define lpfc_rq_context_rqe_size_SHIFT 8               /* Version 1-2 Only */
 #define lpfc_rq_context_rqe_size_MASK  0x0000000F
 #define lpfc_rq_context_rqe_size_WORD  word0
 #define LPFC_RQE_SIZE_8                2
@@ -1257,7 +1379,14 @@ struct rq_context {
 #define lpfc_rq_context_page_size_SHIFT        0               /* Version 1 Only */
 #define lpfc_rq_context_page_size_MASK 0x000000FF
 #define lpfc_rq_context_page_size_WORD word0
-       uint32_t reserved1;
+#define        LPFC_RQ_PAGE_SIZE_4096  0x1
+       uint32_t word1;
+#define lpfc_rq_context_data_size_SHIFT        16              /* Version 2 Only */
+#define lpfc_rq_context_data_size_MASK 0x0000FFFF
+#define lpfc_rq_context_data_size_WORD word1
+#define lpfc_rq_context_hdr_size_SHIFT 0               /* Version 2 Only */
+#define lpfc_rq_context_hdr_size_MASK  0x0000FFFF
+#define lpfc_rq_context_hdr_size_WORD  word1
        uint32_t word2;
 #define lpfc_rq_context_cq_id_SHIFT    16
 #define lpfc_rq_context_cq_id_MASK     0x000003FF
@@ -1265,6 +1394,9 @@ struct rq_context {
 #define lpfc_rq_context_buf_size_SHIFT 0
 #define lpfc_rq_context_buf_size_MASK  0x0000FFFF
 #define lpfc_rq_context_buf_size_WORD  word2
+#define lpfc_rq_context_base_cq_SHIFT  0               /* Version 2 Only */
+#define lpfc_rq_context_base_cq_MASK   0x0000FFFF
+#define lpfc_rq_context_base_cq_WORD   word2
        uint32_t buffer_size;                           /* Version 1 Only */
 };
 
@@ -1286,10 +1418,65 @@ struct lpfc_mbx_rq_create {
 #define lpfc_mbx_rq_create_ulp_num_MASK                0x000000FF
 #define lpfc_mbx_rq_create_ulp_num_WORD                word0
                        struct rq_context context;
-                       struct dma_address page[LPFC_MAX_WQ_PAGE];
+                       struct dma_address page[LPFC_MAX_RQ_PAGE];
                } request;
                struct {
                        uint32_t word0;
+#define lpfc_mbx_rq_create_q_cnt_v2_SHIFT      16
+#define lpfc_mbx_rq_create_q_cnt_v2_MASK       0x0000FFFF
+#define lpfc_mbx_rq_create_q_cnt_v2_WORD       word0
+#define lpfc_mbx_rq_create_q_id_SHIFT          0
+#define lpfc_mbx_rq_create_q_id_MASK           0x0000FFFF
+#define lpfc_mbx_rq_create_q_id_WORD           word0
+                       uint32_t doorbell_offset;
+                       uint32_t word2;
+#define lpfc_mbx_rq_create_bar_set_SHIFT       0
+#define lpfc_mbx_rq_create_bar_set_MASK                0x0000FFFF
+#define lpfc_mbx_rq_create_bar_set_WORD                word2
+#define lpfc_mbx_rq_create_db_format_SHIFT     16
+#define lpfc_mbx_rq_create_db_format_MASK      0x0000FFFF
+#define lpfc_mbx_rq_create_db_format_WORD      word2
+               } response;
+       } u;
+};
+
+struct lpfc_mbx_rq_create_v2 {
+       union  lpfc_sli4_cfg_shdr cfg_shdr;
+       union {
+               struct {
+                       uint32_t word0;
+#define lpfc_mbx_rq_create_num_pages_SHIFT     0
+#define lpfc_mbx_rq_create_num_pages_MASK      0x0000FFFF
+#define lpfc_mbx_rq_create_num_pages_WORD      word0
+#define lpfc_mbx_rq_create_rq_cnt_SHIFT                16
+#define lpfc_mbx_rq_create_rq_cnt_MASK         0x000000FF
+#define lpfc_mbx_rq_create_rq_cnt_WORD         word0
+#define lpfc_mbx_rq_create_dua_SHIFT           16
+#define lpfc_mbx_rq_create_dua_MASK            0x00000001
+#define lpfc_mbx_rq_create_dua_WORD            word0
+#define lpfc_mbx_rq_create_bqu_SHIFT           17
+#define lpfc_mbx_rq_create_bqu_MASK            0x00000001
+#define lpfc_mbx_rq_create_bqu_WORD            word0
+#define lpfc_mbx_rq_create_ulp_num_SHIFT       24
+#define lpfc_mbx_rq_create_ulp_num_MASK                0x000000FF
+#define lpfc_mbx_rq_create_ulp_num_WORD                word0
+#define lpfc_mbx_rq_create_dim_SHIFT           29
+#define lpfc_mbx_rq_create_dim_MASK            0x00000001
+#define lpfc_mbx_rq_create_dim_WORD            word0
+#define lpfc_mbx_rq_create_dfd_SHIFT           30
+#define lpfc_mbx_rq_create_dfd_MASK            0x00000001
+#define lpfc_mbx_rq_create_dfd_WORD            word0
+#define lpfc_mbx_rq_create_dnb_SHIFT           31
+#define lpfc_mbx_rq_create_dnb_MASK            0x00000001
+#define lpfc_mbx_rq_create_dnb_WORD            word0
+                       struct rq_context context;
+                       struct dma_address page[1];
+               } request;
+               struct {
+                       uint32_t word0;
+#define lpfc_mbx_rq_create_q_cnt_v2_SHIFT      16
+#define lpfc_mbx_rq_create_q_cnt_v2_MASK       0x0000FFFF
+#define lpfc_mbx_rq_create_q_cnt_v2_WORD       word0
 #define lpfc_mbx_rq_create_q_id_SHIFT          0
 #define lpfc_mbx_rq_create_q_id_MASK           0x0000FFFF
 #define lpfc_mbx_rq_create_q_id_WORD           word0
@@ -2203,6 +2390,160 @@ struct lpfc_mbx_reg_fcfi {
 #define lpfc_reg_fcfi_vlan_tag_WORD    word8
 };
 
+struct lpfc_mbx_reg_fcfi_mrq {
+       uint32_t word1;
+#define lpfc_reg_fcfi_mrq_info_index_SHIFT     0
+#define lpfc_reg_fcfi_mrq_info_index_MASK      0x0000FFFF
+#define lpfc_reg_fcfi_mrq_info_index_WORD      word1
+#define lpfc_reg_fcfi_mrq_fcfi_SHIFT           16
+#define lpfc_reg_fcfi_mrq_fcfi_MASK            0x0000FFFF
+#define lpfc_reg_fcfi_mrq_fcfi_WORD            word1
+       uint32_t word2;
+#define lpfc_reg_fcfi_mrq_rq_id1_SHIFT         0
+#define lpfc_reg_fcfi_mrq_rq_id1_MASK          0x0000FFFF
+#define lpfc_reg_fcfi_mrq_rq_id1_WORD          word2
+#define lpfc_reg_fcfi_mrq_rq_id0_SHIFT         16
+#define lpfc_reg_fcfi_mrq_rq_id0_MASK          0x0000FFFF
+#define lpfc_reg_fcfi_mrq_rq_id0_WORD          word2
+       uint32_t word3;
+#define lpfc_reg_fcfi_mrq_rq_id3_SHIFT         0
+#define lpfc_reg_fcfi_mrq_rq_id3_MASK          0x0000FFFF
+#define lpfc_reg_fcfi_mrq_rq_id3_WORD          word3
+#define lpfc_reg_fcfi_mrq_rq_id2_SHIFT         16
+#define lpfc_reg_fcfi_mrq_rq_id2_MASK          0x0000FFFF
+#define lpfc_reg_fcfi_mrq_rq_id2_WORD          word3
+       uint32_t word4;
+#define lpfc_reg_fcfi_mrq_type_match0_SHIFT    24
+#define lpfc_reg_fcfi_mrq_type_match0_MASK     0x000000FF
+#define lpfc_reg_fcfi_mrq_type_match0_WORD     word4
+#define lpfc_reg_fcfi_mrq_type_mask0_SHIFT     16
+#define lpfc_reg_fcfi_mrq_type_mask0_MASK      0x000000FF
+#define lpfc_reg_fcfi_mrq_type_mask0_WORD      word4
+#define lpfc_reg_fcfi_mrq_rctl_match0_SHIFT    8
+#define lpfc_reg_fcfi_mrq_rctl_match0_MASK     0x000000FF
+#define lpfc_reg_fcfi_mrq_rctl_match0_WORD     word4
+#define lpfc_reg_fcfi_mrq_rctl_mask0_SHIFT     0
+#define lpfc_reg_fcfi_mrq_rctl_mask0_MASK      0x000000FF
+#define lpfc_reg_fcfi_mrq_rctl_mask0_WORD      word4
+       uint32_t word5;
+#define lpfc_reg_fcfi_mrq_type_match1_SHIFT    24
+#define lpfc_reg_fcfi_mrq_type_match1_MASK     0x000000FF
+#define lpfc_reg_fcfi_mrq_type_match1_WORD     word5
+#define lpfc_reg_fcfi_mrq_type_mask1_SHIFT     16
+#define lpfc_reg_fcfi_mrq_type_mask1_MASK      0x000000FF
+#define lpfc_reg_fcfi_mrq_type_mask1_WORD      word5
+#define lpfc_reg_fcfi_mrq_rctl_match1_SHIFT    8
+#define lpfc_reg_fcfi_mrq_rctl_match1_MASK     0x000000FF
+#define lpfc_reg_fcfi_mrq_rctl_match1_WORD     word5
+#define lpfc_reg_fcfi_mrq_rctl_mask1_SHIFT     0
+#define lpfc_reg_fcfi_mrq_rctl_mask1_MASK      0x000000FF
+#define lpfc_reg_fcfi_mrq_rctl_mask1_WORD      word5
+       uint32_t word6;
+#define lpfc_reg_fcfi_mrq_type_match2_SHIFT    24
+#define lpfc_reg_fcfi_mrq_type_match2_MASK     0x000000FF
+#define lpfc_reg_fcfi_mrq_type_match2_WORD     word6
+#define lpfc_reg_fcfi_mrq_type_mask2_SHIFT     16
+#define lpfc_reg_fcfi_mrq_type_mask2_MASK      0x000000FF
+#define lpfc_reg_fcfi_mrq_type_mask2_WORD      word6
+#define lpfc_reg_fcfi_mrq_rctl_match2_SHIFT    8
+#define lpfc_reg_fcfi_mrq_rctl_match2_MASK     0x000000FF
+#define lpfc_reg_fcfi_mrq_rctl_match2_WORD     word6
+#define lpfc_reg_fcfi_mrq_rctl_mask2_SHIFT     0
+#define lpfc_reg_fcfi_mrq_rctl_mask2_MASK      0x000000FF
+#define lpfc_reg_fcfi_mrq_rctl_mask2_WORD      word6
+       uint32_t word7;
+#define lpfc_reg_fcfi_mrq_type_match3_SHIFT    24
+#define lpfc_reg_fcfi_mrq_type_match3_MASK     0x000000FF
+#define lpfc_reg_fcfi_mrq_type_match3_WORD     word7
+#define lpfc_reg_fcfi_mrq_type_mask3_SHIFT     16
+#define lpfc_reg_fcfi_mrq_type_mask3_MASK      0x000000FF
+#define lpfc_reg_fcfi_mrq_type_mask3_WORD      word7
+#define lpfc_reg_fcfi_mrq_rctl_match3_SHIFT    8
+#define lpfc_reg_fcfi_mrq_rctl_match3_MASK     0x000000FF
+#define lpfc_reg_fcfi_mrq_rctl_match3_WORD     word7
+#define lpfc_reg_fcfi_mrq_rctl_mask3_SHIFT     0
+#define lpfc_reg_fcfi_mrq_rctl_mask3_MASK      0x000000FF
+#define lpfc_reg_fcfi_mrq_rctl_mask3_WORD      word7
+       uint32_t word8;
+#define lpfc_reg_fcfi_mrq_ptc7_SHIFT           31
+#define lpfc_reg_fcfi_mrq_ptc7_MASK            0x00000001
+#define lpfc_reg_fcfi_mrq_ptc7_WORD            word8
+#define lpfc_reg_fcfi_mrq_ptc6_SHIFT           30
+#define lpfc_reg_fcfi_mrq_ptc6_MASK            0x00000001
+#define lpfc_reg_fcfi_mrq_ptc6_WORD            word8
+#define lpfc_reg_fcfi_mrq_ptc5_SHIFT           29
+#define lpfc_reg_fcfi_mrq_ptc5_MASK            0x00000001
+#define lpfc_reg_fcfi_mrq_ptc5_WORD            word8
+#define lpfc_reg_fcfi_mrq_ptc4_SHIFT           28
+#define lpfc_reg_fcfi_mrq_ptc4_MASK            0x00000001
+#define lpfc_reg_fcfi_mrq_ptc4_WORD            word8
+#define lpfc_reg_fcfi_mrq_ptc3_SHIFT           27
+#define lpfc_reg_fcfi_mrq_ptc3_MASK            0x00000001
+#define lpfc_reg_fcfi_mrq_ptc3_WORD            word8
+#define lpfc_reg_fcfi_mrq_ptc2_SHIFT           26
+#define lpfc_reg_fcfi_mrq_ptc2_MASK            0x00000001
+#define lpfc_reg_fcfi_mrq_ptc2_WORD            word8
+#define lpfc_reg_fcfi_mrq_ptc1_SHIFT           25
+#define lpfc_reg_fcfi_mrq_ptc1_MASK            0x00000001
+#define lpfc_reg_fcfi_mrq_ptc1_WORD            word8
+#define lpfc_reg_fcfi_mrq_ptc0_SHIFT           24
+#define lpfc_reg_fcfi_mrq_ptc0_MASK            0x00000001
+#define lpfc_reg_fcfi_mrq_ptc0_WORD            word8
+#define lpfc_reg_fcfi_mrq_pt7_SHIFT            23
+#define lpfc_reg_fcfi_mrq_pt7_MASK             0x00000001
+#define lpfc_reg_fcfi_mrq_pt7_WORD             word8
+#define lpfc_reg_fcfi_mrq_pt6_SHIFT            22
+#define lpfc_reg_fcfi_mrq_pt6_MASK             0x00000001
+#define lpfc_reg_fcfi_mrq_pt6_WORD             word8
+#define lpfc_reg_fcfi_mrq_pt5_SHIFT            21
+#define lpfc_reg_fcfi_mrq_pt5_MASK             0x00000001
+#define lpfc_reg_fcfi_mrq_pt5_WORD             word8
+#define lpfc_reg_fcfi_mrq_pt4_SHIFT            20
+#define lpfc_reg_fcfi_mrq_pt4_MASK             0x00000001
+#define lpfc_reg_fcfi_mrq_pt4_WORD             word8
+#define lpfc_reg_fcfi_mrq_pt3_SHIFT            19
+#define lpfc_reg_fcfi_mrq_pt3_MASK             0x00000001
+#define lpfc_reg_fcfi_mrq_pt3_WORD             word8
+#define lpfc_reg_fcfi_mrq_pt2_SHIFT            18
+#define lpfc_reg_fcfi_mrq_pt2_MASK             0x00000001
+#define lpfc_reg_fcfi_mrq_pt2_WORD             word8
+#define lpfc_reg_fcfi_mrq_pt1_SHIFT            17
+#define lpfc_reg_fcfi_mrq_pt1_MASK             0x00000001
+#define lpfc_reg_fcfi_mrq_pt1_WORD             word8
+#define lpfc_reg_fcfi_mrq_pt0_SHIFT            16
+#define lpfc_reg_fcfi_mrq_pt0_MASK             0x00000001
+#define lpfc_reg_fcfi_mrq_pt0_WORD             word8
+#define lpfc_reg_fcfi_mrq_xmv_SHIFT            15
+#define lpfc_reg_fcfi_mrq_xmv_MASK             0x00000001
+#define lpfc_reg_fcfi_mrq_xmv_WORD             word8
+#define lpfc_reg_fcfi_mrq_mode_SHIFT           13
+#define lpfc_reg_fcfi_mrq_mode_MASK            0x00000001
+#define lpfc_reg_fcfi_mrq_mode_WORD            word8
+#define lpfc_reg_fcfi_mrq_vv_SHIFT             12
+#define lpfc_reg_fcfi_mrq_vv_MASK              0x00000001
+#define lpfc_reg_fcfi_mrq_vv_WORD              word8
+#define lpfc_reg_fcfi_mrq_vlan_tag_SHIFT       0
+#define lpfc_reg_fcfi_mrq_vlan_tag_MASK                0x00000FFF
+#define lpfc_reg_fcfi_mrq_vlan_tag_WORD                word8
+       uint32_t word9;
+#define lpfc_reg_fcfi_mrq_policy_SHIFT         12
+#define lpfc_reg_fcfi_mrq_policy_MASK          0x0000000F
+#define lpfc_reg_fcfi_mrq_policy_WORD          word9
+#define lpfc_reg_fcfi_mrq_filter_SHIFT         8
+#define lpfc_reg_fcfi_mrq_filter_MASK          0x0000000F
+#define lpfc_reg_fcfi_mrq_filter_WORD          word9
+#define lpfc_reg_fcfi_mrq_npairs_SHIFT         0
+#define lpfc_reg_fcfi_mrq_npairs_MASK          0x000000FF
+#define lpfc_reg_fcfi_mrq_npairs_WORD          word9
+       uint32_t word10;
+       uint32_t word11;
+       uint32_t word12;
+       uint32_t word13;
+       uint32_t word14;
+       uint32_t word15;
+       uint32_t word16;
+};
+
 struct lpfc_mbx_unreg_fcfi {
        uint32_t word1_rsv;
        uint32_t word2;
@@ -2382,6 +2723,9 @@ struct lpfc_mbx_request_features {
 #define lpfc_mbx_rq_ftr_rq_perfh_SHIFT         11
 #define lpfc_mbx_rq_ftr_rq_perfh_MASK          0x00000001
 #define lpfc_mbx_rq_ftr_rq_perfh_WORD          word2
+#define lpfc_mbx_rq_ftr_rq_mrqp_SHIFT          16
+#define lpfc_mbx_rq_ftr_rq_mrqp_MASK           0x00000001
+#define lpfc_mbx_rq_ftr_rq_mrqp_WORD           word2
        uint32_t word3;
 #define lpfc_mbx_rq_ftr_rsp_iaab_SHIFT         0
 #define lpfc_mbx_rq_ftr_rsp_iaab_MASK          0x00000001
@@ -2410,6 +2754,9 @@ struct lpfc_mbx_request_features {
 #define lpfc_mbx_rq_ftr_rsp_perfh_SHIFT                11
 #define lpfc_mbx_rq_ftr_rsp_perfh_MASK         0x00000001
 #define lpfc_mbx_rq_ftr_rsp_perfh_WORD         word3
+#define lpfc_mbx_rq_ftr_rsp_mrqp_SHIFT         16
+#define lpfc_mbx_rq_ftr_rsp_mrqp_MASK          0x00000001
+#define lpfc_mbx_rq_ftr_rsp_mrqp_WORD          word3
 };
 
 struct lpfc_mbx_supp_pages {
@@ -2839,12 +3186,18 @@ struct lpfc_sli4_parameters {
 #define cfg_mqv_WORD                           word6
        uint32_t word7;
        uint32_t word8;
+#define cfg_wqpcnt_SHIFT                       0
+#define cfg_wqpcnt_MASK                                0x0000000f
+#define cfg_wqpcnt_WORD                                word8
 #define cfg_wqsize_SHIFT                       8
 #define cfg_wqsize_MASK                                0x0000000f
 #define cfg_wqsize_WORD                                word8
 #define cfg_wqv_SHIFT                          14
 #define cfg_wqv_MASK                           0x00000003
 #define cfg_wqv_WORD                           word8
+#define cfg_wqpsize_SHIFT                      16
+#define cfg_wqpsize_MASK                       0x000000ff
+#define cfg_wqpsize_WORD                       word8
        uint32_t word9;
        uint32_t word10;
 #define cfg_rqv_SHIFT                          14
@@ -2895,6 +3248,12 @@ struct lpfc_sli4_parameters {
 #define cfg_mds_diags_SHIFT                    1
 #define cfg_mds_diags_MASK                     0x00000001
 #define cfg_mds_diags_WORD                     word19
+#define cfg_nvme_SHIFT                         3
+#define cfg_nvme_MASK                          0x00000001
+#define cfg_nvme_WORD                          word19
+#define cfg_xib_SHIFT                          4
+#define cfg_xib_MASK                           0x00000001
+#define cfg_xib_WORD                           word19
 };
 
 #define LPFC_SET_UE_RECOVERY           0x10
@@ -3290,14 +3649,17 @@ struct lpfc_mqe {
                struct lpfc_mbx_del_fcf_tbl_entry del_fcf_entry;
                struct lpfc_mbx_redisc_fcf_tbl redisc_fcf_tbl;
                struct lpfc_mbx_reg_fcfi reg_fcfi;
+               struct lpfc_mbx_reg_fcfi_mrq reg_fcfi_mrq;
                struct lpfc_mbx_unreg_fcfi unreg_fcfi;
                struct lpfc_mbx_mq_create mq_create;
                struct lpfc_mbx_mq_create_ext mq_create_ext;
                struct lpfc_mbx_eq_create eq_create;
                struct lpfc_mbx_modify_eq_delay eq_delay;
                struct lpfc_mbx_cq_create cq_create;
+               struct lpfc_mbx_cq_create_set cq_create_set;
                struct lpfc_mbx_wq_create wq_create;
                struct lpfc_mbx_rq_create rq_create;
+               struct lpfc_mbx_rq_create_v2 rq_create_v2;
                struct lpfc_mbx_mq_destroy mq_destroy;
                struct lpfc_mbx_eq_destroy eq_destroy;
                struct lpfc_mbx_cq_destroy cq_destroy;
@@ -3657,6 +4019,9 @@ struct wqe_common {
 #define wqe_ebde_cnt_SHIFT    0
 #define wqe_ebde_cnt_MASK     0x0000000f
 #define wqe_ebde_cnt_WORD     word10
+#define wqe_nvme_SHIFT        4
+#define wqe_nvme_MASK         0x00000001
+#define wqe_nvme_WORD         word10
 #define wqe_oas_SHIFT         6
 #define wqe_oas_MASK          0x00000001
 #define wqe_oas_WORD          word10
@@ -3717,9 +4082,18 @@ struct wqe_common {
 #define LPFC_ELS_ID_FDISC      2
 #define LPFC_ELS_ID_LOGO       1
 #define LPFC_ELS_ID_DEFAULT    0
+#define wqe_irsp_SHIFT        4
+#define wqe_irsp_MASK         0x00000001
+#define wqe_irsp_WORD         word11
+#define wqe_sup_SHIFT         6
+#define wqe_sup_MASK          0x00000001
+#define wqe_sup_WORD          word11
 #define wqe_wqec_SHIFT        7
 #define wqe_wqec_MASK         0x00000001
 #define wqe_wqec_WORD         word11
+#define wqe_irsplen_SHIFT     8
+#define wqe_irsplen_MASK      0x0000000f
+#define wqe_irsplen_WORD      word11
 #define wqe_cqid_SHIFT        16
 #define wqe_cqid_MASK         0x0000ffff
 #define wqe_cqid_WORD         word11
@@ -3897,6 +4271,50 @@ struct gen_req64_wqe {
        uint32_t max_response_payload_len;
 };
 
+/* Define NVME PRLI request to fabric. NVME is a
+ * fabric-only protocol.
+ * Updated to red-lined v1.08 on Sept 16, 2016
+ */
+struct lpfc_nvme_prli {
+       uint32_t word1;
+       /* The Response Code is defined in the FCP PRLI lpfc_hw.h */
+#define prli_acc_rsp_code_SHIFT         8
+#define prli_acc_rsp_code_MASK          0x0000000f
+#define prli_acc_rsp_code_WORD          word1
+#define prli_estabImagePair_SHIFT       13
+#define prli_estabImagePair_MASK        0x00000001
+#define prli_estabImagePair_WORD        word1
+#define prli_type_code_ext_SHIFT        16
+#define prli_type_code_ext_MASK         0x000000ff
+#define prli_type_code_ext_WORD         word1
+#define prli_type_code_SHIFT            24
+#define prli_type_code_MASK             0x000000ff
+#define prli_type_code_WORD             word1
+       uint32_t word_rsvd2;
+       uint32_t word_rsvd3;
+       uint32_t word4;
+#define prli_fba_SHIFT                  0
+#define prli_fba_MASK                   0x00000001
+#define prli_fba_WORD                   word4
+#define prli_disc_SHIFT                 3
+#define prli_disc_MASK                  0x00000001
+#define prli_disc_WORD                  word4
+#define prli_tgt_SHIFT                  4
+#define prli_tgt_MASK                   0x00000001
+#define prli_tgt_WORD                   word4
+#define prli_init_SHIFT                 5
+#define prli_init_MASK                  0x00000001
+#define prli_init_WORD                  word4
+#define prli_recov_SHIFT                8
+#define prli_recov_MASK                 0x00000001
+#define prli_recov_WORD                 word4
+       uint32_t word5;
+#define prli_fb_sz_SHIFT                0
+#define prli_fb_sz_MASK                 0x0000ffff
+#define prli_fb_sz_WORD                 word5
+#define LPFC_NVMET_FB_SZ_MAX  65536   /* Driver target mode only. */
+};
+
 struct create_xri_wqe {
        uint32_t rsrvd[5];           /* words 0-4 */
        struct wqe_did  wqe_dest;  /* word 5 */
@@ -3969,6 +4387,35 @@ struct fcp_icmnd64_wqe {
        uint32_t rsvd_12_15[4];        /* word 12-15 */
 };
 
+struct fcp_trsp64_wqe {
+       struct ulp_bde64 bde;
+       uint32_t response_len;
+       uint32_t rsvd_4_5[2];
+       struct wqe_common wqe_com;      /* words 6-11 */
+       uint32_t rsvd_12_15[4];         /* word 12-15 */
+};
+
+struct fcp_tsend64_wqe {
+       struct ulp_bde64 bde;
+       uint32_t payload_offset_len;
+       uint32_t relative_offset;
+       uint32_t reserved;
+       struct wqe_common wqe_com;     /* words 6-11 */
+       uint32_t fcp_data_len;         /* word 12 */
+       uint32_t rsvd_13_15[3];        /* word 13-15 */
+};
+
+struct fcp_treceive64_wqe {
+       struct ulp_bde64 bde;
+       uint32_t payload_offset_len;
+       uint32_t relative_offset;
+       uint32_t reserved;
+       struct wqe_common wqe_com;     /* words 6-11 */
+       uint32_t fcp_data_len;         /* word 12 */
+       uint32_t rsvd_13_15[3];        /* word 13-15 */
+};
+#define TXRDY_PAYLOAD_LEN      12
+
 
 union lpfc_wqe {
        uint32_t words[16];
@@ -3984,6 +4431,10 @@ union lpfc_wqe {
        struct xmit_els_rsp64_wqe xmit_els_rsp;
        struct els_request64_wqe els_req;
        struct gen_req64_wqe gen_req;
+       struct fcp_trsp64_wqe fcp_trsp;
+       struct fcp_tsend64_wqe fcp_tsend;
+       struct fcp_treceive64_wqe fcp_treceive;
+
 };
 
 union lpfc_wqe128 {
@@ -3992,6 +4443,9 @@ union lpfc_wqe128 {
        struct fcp_icmnd64_wqe fcp_icmd;
        struct fcp_iread64_wqe fcp_iread;
        struct fcp_iwrite64_wqe fcp_iwrite;
+       struct fcp_trsp64_wqe fcp_trsp;
+       struct fcp_tsend64_wqe fcp_tsend;
+       struct fcp_treceive64_wqe fcp_treceive;
        struct xmit_seq64_wqe xmit_sequence;
        struct gen_req64_wqe gen_req;
 };
@@ -4015,11 +4469,39 @@ struct lpfc_grp_hdr {
        uint8_t revision[32];
 };
 
-#define FCP_COMMAND 0x0
-#define FCP_COMMAND_DATA_OUT 0x1
-#define ELS_COMMAND_NON_FIP 0xC
-#define ELS_COMMAND_FIP 0xD
-#define OTHER_COMMAND 0x8
+/* Defines for WQE command type */
+#define FCP_COMMAND            0x0
+#define NVME_READ_CMD          0x0
+#define FCP_COMMAND_DATA_OUT   0x1
+#define NVME_WRITE_CMD         0x1
+#define FCP_COMMAND_TRECEIVE   0x2
+#define FCP_COMMAND_TRSP       0x3
+#define FCP_COMMAND_TSEND      0x7
+#define OTHER_COMMAND          0x8
+#define ELS_COMMAND_NON_FIP    0xC
+#define ELS_COMMAND_FIP                0xD
+
+#define LPFC_NVME_EMBED_CMD    0x0
+#define LPFC_NVME_EMBED_WRITE  0x1
+#define LPFC_NVME_EMBED_READ   0x2
+
+/* WQE Commands */
+#define CMD_ABORT_XRI_WQE       0x0F
+#define CMD_XMIT_SEQUENCE64_WQE 0x82
+#define CMD_XMIT_BCAST64_WQE    0x84
+#define CMD_ELS_REQUEST64_WQE   0x8A
+#define CMD_XMIT_ELS_RSP64_WQE  0x95
+#define CMD_XMIT_BLS_RSP64_WQE  0x97
+#define CMD_FCP_IWRITE64_WQE    0x98
+#define CMD_FCP_IREAD64_WQE     0x9A
+#define CMD_FCP_ICMND64_WQE     0x9C
+#define CMD_FCP_TSEND64_WQE     0x9F
+#define CMD_FCP_TRECEIVE64_WQE  0xA1
+#define CMD_FCP_TRSP64_WQE      0xA3
+#define CMD_GEN_REQUEST64_WQE   0xC2
+
+#define CMD_WQE_MASK            0xff
+
 
 #define LPFC_FW_DUMP   1
 #define LPFC_FW_RESET  2