1*ef270ab1SKenneth D. Merry /*- 2*ef270ab1SKenneth D. Merry * Copyright (c) 2017 Broadcom. All rights reserved. 3*ef270ab1SKenneth D. Merry * The term "Broadcom" refers to Broadcom Limited and/or its subsidiaries. 4*ef270ab1SKenneth D. Merry * 5*ef270ab1SKenneth D. Merry * Redistribution and use in source and binary forms, with or without 6*ef270ab1SKenneth D. Merry * modification, are permitted provided that the following conditions are met: 7*ef270ab1SKenneth D. Merry * 8*ef270ab1SKenneth D. Merry * 1. Redistributions of source code must retain the above copyright notice, 9*ef270ab1SKenneth D. Merry * this list of conditions and the following disclaimer. 10*ef270ab1SKenneth D. Merry * 11*ef270ab1SKenneth D. Merry * 2. Redistributions in binary form must reproduce the above copyright notice, 12*ef270ab1SKenneth D. Merry * this list of conditions and the following disclaimer in the documentation 13*ef270ab1SKenneth D. Merry * and/or other materials provided with the distribution. 14*ef270ab1SKenneth D. Merry * 15*ef270ab1SKenneth D. Merry * 3. Neither the name of the copyright holder nor the names of its contributors 16*ef270ab1SKenneth D. Merry * may be used to endorse or promote products derived from this software 17*ef270ab1SKenneth D. Merry * without specific prior written permission. 18*ef270ab1SKenneth D. Merry * 19*ef270ab1SKenneth D. Merry * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20*ef270ab1SKenneth D. Merry * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21*ef270ab1SKenneth D. Merry * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22*ef270ab1SKenneth D. Merry * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 23*ef270ab1SKenneth D. Merry * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24*ef270ab1SKenneth D. Merry * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25*ef270ab1SKenneth D. Merry * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26*ef270ab1SKenneth D. Merry * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27*ef270ab1SKenneth D. Merry * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28*ef270ab1SKenneth D. Merry * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29*ef270ab1SKenneth D. Merry * POSSIBILITY OF SUCH DAMAGE. 30*ef270ab1SKenneth D. Merry * 31*ef270ab1SKenneth D. Merry * $FreeBSD$ 32*ef270ab1SKenneth D. Merry */ 33*ef270ab1SKenneth D. Merry 34*ef270ab1SKenneth D. Merry /** 35*ef270ab1SKenneth D. Merry * @file 36*ef270ab1SKenneth D. Merry * Define common SLI-4 structures and function prototypes. 37*ef270ab1SKenneth D. Merry */ 38*ef270ab1SKenneth D. Merry 39*ef270ab1SKenneth D. Merry #ifndef _SLI4_H 40*ef270ab1SKenneth D. Merry #define _SLI4_H 41*ef270ab1SKenneth D. Merry 42*ef270ab1SKenneth D. Merry #include "ocs_os.h" 43*ef270ab1SKenneth D. Merry 44*ef270ab1SKenneth D. Merry #define SLI_PAGE_SIZE (4096) 45*ef270ab1SKenneth D. Merry #define SLI_SUB_PAGE_MASK (SLI_PAGE_SIZE - 1) 46*ef270ab1SKenneth D. Merry #define SLI_PAGE_SHIFT 12 47*ef270ab1SKenneth D. Merry #define SLI_ROUND_PAGE(b) (((b) + SLI_SUB_PAGE_MASK) & ~SLI_SUB_PAGE_MASK) 48*ef270ab1SKenneth D. Merry 49*ef270ab1SKenneth D. Merry #define SLI4_BMBX_TIMEOUT_MSEC 30000 50*ef270ab1SKenneth D. Merry #define SLI4_FW_READY_TIMEOUT_MSEC 30000 51*ef270ab1SKenneth D. Merry 52*ef270ab1SKenneth D. Merry static inline uint32_t 53*ef270ab1SKenneth D. Merry sli_page_count(size_t bytes, uint32_t page_size) 54*ef270ab1SKenneth D. Merry { 55*ef270ab1SKenneth D. Merry uint32_t mask = page_size - 1; 56*ef270ab1SKenneth D. Merry uint32_t shift = 0; 57*ef270ab1SKenneth D. Merry 58*ef270ab1SKenneth D. Merry switch (page_size) { 59*ef270ab1SKenneth D. Merry case 4096: 60*ef270ab1SKenneth D. Merry shift = 12; 61*ef270ab1SKenneth D. Merry break; 62*ef270ab1SKenneth D. Merry case 8192: 63*ef270ab1SKenneth D. Merry shift = 13; 64*ef270ab1SKenneth D. Merry break; 65*ef270ab1SKenneth D. Merry case 16384: 66*ef270ab1SKenneth D. Merry shift = 14; 67*ef270ab1SKenneth D. Merry break; 68*ef270ab1SKenneth D. Merry case 32768: 69*ef270ab1SKenneth D. Merry shift = 15; 70*ef270ab1SKenneth D. Merry break; 71*ef270ab1SKenneth D. Merry case 65536: 72*ef270ab1SKenneth D. Merry shift = 16; 73*ef270ab1SKenneth D. Merry break; 74*ef270ab1SKenneth D. Merry default: 75*ef270ab1SKenneth D. Merry return 0; 76*ef270ab1SKenneth D. Merry } 77*ef270ab1SKenneth D. Merry 78*ef270ab1SKenneth D. Merry return (bytes + mask) >> shift; 79*ef270ab1SKenneth D. Merry } 80*ef270ab1SKenneth D. Merry 81*ef270ab1SKenneth D. Merry /************************************************************************* 82*ef270ab1SKenneth D. Merry * Common PCI configuration space register definitions 83*ef270ab1SKenneth D. Merry */ 84*ef270ab1SKenneth D. Merry 85*ef270ab1SKenneth D. Merry #define SLI4_PCI_CLASS_REVISION 0x0008 /** register offset */ 86*ef270ab1SKenneth D. Merry #define SLI4_PCI_REV_ID_SHIFT 0 87*ef270ab1SKenneth D. Merry #define SLI4_PCI_REV_ID_MASK 0xff 88*ef270ab1SKenneth D. Merry #define SLI4_PCI_CLASS_SHIFT 8 89*ef270ab1SKenneth D. Merry #define SLI4_PCI_CLASS_MASK 0xfff 90*ef270ab1SKenneth D. Merry 91*ef270ab1SKenneth D. Merry #define SLI4_PCI_SOFT_RESET_CSR 0x005c /** register offset */ 92*ef270ab1SKenneth D. Merry #define SLI4_PCI_SOFT_RESET_MASK 0x0080 93*ef270ab1SKenneth D. Merry 94*ef270ab1SKenneth D. Merry /************************************************************************* 95*ef270ab1SKenneth D. Merry * Common SLI-4 register offsets and field definitions 96*ef270ab1SKenneth D. Merry */ 97*ef270ab1SKenneth D. Merry 98*ef270ab1SKenneth D. Merry /** 99*ef270ab1SKenneth D. Merry * @brief SLI_INTF - SLI Interface Definition Register 100*ef270ab1SKenneth D. Merry */ 101*ef270ab1SKenneth D. Merry #define SLI4_INTF_REG 0x0058 /** register offset */ 102*ef270ab1SKenneth D. Merry #define SLI4_INTF_VALID_SHIFT 29 103*ef270ab1SKenneth D. Merry #define SLI4_INTF_VALID_MASK 0x7 104*ef270ab1SKenneth D. Merry #define SLI4_INTF_VALID 0x6 105*ef270ab1SKenneth D. Merry #define SLI4_INTF_IF_TYPE_SHIFT 12 106*ef270ab1SKenneth D. Merry #define SLI4_INTF_IF_TYPE_MASK 0xf 107*ef270ab1SKenneth D. Merry #define SLI4_INTF_SLI_FAMILY_SHIFT 8 108*ef270ab1SKenneth D. Merry #define SLI4_INTF_SLI_FAMILY_MASK 0xf 109*ef270ab1SKenneth D. Merry #define SLI4_INTF_SLI_REVISION_SHIFT 4 110*ef270ab1SKenneth D. Merry #define SLI4_INTF_SLI_REVISION_MASK 0xf 111*ef270ab1SKenneth D. Merry #define SLI4_FAMILY_CHECK_ASIC_TYPE 0xf 112*ef270ab1SKenneth D. Merry 113*ef270ab1SKenneth D. Merry #define SLI4_IF_TYPE_BE3_SKH_PF 0 114*ef270ab1SKenneth D. Merry #define SLI4_IF_TYPE_BE3_SKH_VF 1 115*ef270ab1SKenneth D. Merry #define SLI4_IF_TYPE_LANCER_FC_ETH 2 116*ef270ab1SKenneth D. Merry #define SLI4_IF_TYPE_LANCER_RDMA 3 117*ef270ab1SKenneth D. Merry #define SLI4_MAX_IF_TYPES 4 118*ef270ab1SKenneth D. Merry 119*ef270ab1SKenneth D. Merry /** 120*ef270ab1SKenneth D. Merry * @brief ASIC_ID - SLI ASIC Type and Revision Register 121*ef270ab1SKenneth D. Merry */ 122*ef270ab1SKenneth D. Merry #define SLI4_ASIC_ID_REG 0x009c /* register offset */ 123*ef270ab1SKenneth D. Merry #define SLI4_ASIC_REV_SHIFT 0 124*ef270ab1SKenneth D. Merry #define SLI4_ASIC_REV_MASK 0xf 125*ef270ab1SKenneth D. Merry #define SLI4_ASIC_VER_SHIFT 4 126*ef270ab1SKenneth D. Merry #define SLI4_ASIC_VER_MASK 0xf 127*ef270ab1SKenneth D. Merry #define SLI4_ASIC_GEN_SHIFT 8 128*ef270ab1SKenneth D. Merry #define SLI4_ASIC_GEN_MASK 0xff 129*ef270ab1SKenneth D. Merry #define SLI4_ASIC_GEN_BE2 0x00 130*ef270ab1SKenneth D. Merry #define SLI4_ASIC_GEN_BE3 0x03 131*ef270ab1SKenneth D. Merry #define SLI4_ASIC_GEN_SKYHAWK 0x04 132*ef270ab1SKenneth D. Merry #define SLI4_ASIC_GEN_CORSAIR 0x05 133*ef270ab1SKenneth D. Merry #define SLI4_ASIC_GEN_LANCER 0x0b 134*ef270ab1SKenneth D. Merry 135*ef270ab1SKenneth D. Merry 136*ef270ab1SKenneth D. Merry /** 137*ef270ab1SKenneth D. Merry * @brief BMBX - Bootstrap Mailbox Register 138*ef270ab1SKenneth D. Merry */ 139*ef270ab1SKenneth D. Merry #define SLI4_BMBX_REG 0x0160 /* register offset */ 140*ef270ab1SKenneth D. Merry #define SLI4_BMBX_MASK_HI 0x3 141*ef270ab1SKenneth D. Merry #define SLI4_BMBX_MASK_LO 0xf 142*ef270ab1SKenneth D. Merry #define SLI4_BMBX_RDY BIT(0) 143*ef270ab1SKenneth D. Merry #define SLI4_BMBX_HI BIT(1) 144*ef270ab1SKenneth D. Merry #define SLI4_BMBX_WRITE_HI(r) ((ocs_addr32_hi(r) & ~SLI4_BMBX_MASK_HI) | \ 145*ef270ab1SKenneth D. Merry SLI4_BMBX_HI) 146*ef270ab1SKenneth D. Merry #define SLI4_BMBX_WRITE_LO(r) (((ocs_addr32_hi(r) & SLI4_BMBX_MASK_HI) << 30) | \ 147*ef270ab1SKenneth D. Merry (((r) & ~SLI4_BMBX_MASK_LO) >> 2)) 148*ef270ab1SKenneth D. Merry 149*ef270ab1SKenneth D. Merry #define SLI4_BMBX_SIZE 256 150*ef270ab1SKenneth D. Merry 151*ef270ab1SKenneth D. Merry 152*ef270ab1SKenneth D. Merry /** 153*ef270ab1SKenneth D. Merry * @brief EQCQ_DOORBELL - EQ and CQ Doorbell Register 154*ef270ab1SKenneth D. Merry */ 155*ef270ab1SKenneth D. Merry #define SLI4_EQCQ_DOORBELL_REG 0x120 156*ef270ab1SKenneth D. Merry #define SLI4_EQCQ_DOORBELL_CI BIT(9) 157*ef270ab1SKenneth D. Merry #define SLI4_EQCQ_DOORBELL_QT BIT(10) 158*ef270ab1SKenneth D. Merry #define SLI4_EQCQ_DOORBELL_ARM BIT(29) 159*ef270ab1SKenneth D. Merry #define SLI4_EQCQ_DOORBELL_SE BIT(31) 160*ef270ab1SKenneth D. Merry #define SLI4_EQCQ_NUM_SHIFT 16 161*ef270ab1SKenneth D. Merry #define SLI4_EQCQ_NUM_MASK 0x01ff 162*ef270ab1SKenneth D. Merry #define SLI4_EQCQ_EQ_ID_MASK 0x3fff 163*ef270ab1SKenneth D. Merry #define SLI4_EQCQ_CQ_ID_MASK 0x7fff 164*ef270ab1SKenneth D. Merry #define SLI4_EQCQ_EQ_ID_MASK_LO 0x01ff 165*ef270ab1SKenneth D. Merry #define SLI4_EQCQ_CQ_ID_MASK_LO 0x03ff 166*ef270ab1SKenneth D. Merry #define SLI4_EQCQ_EQCQ_ID_MASK_HI 0xf800 167*ef270ab1SKenneth D. Merry 168*ef270ab1SKenneth D. Merry /** 169*ef270ab1SKenneth D. Merry * @brief SLIPORT_CONTROL - SLI Port Control Register 170*ef270ab1SKenneth D. Merry */ 171*ef270ab1SKenneth D. Merry #define SLI4_SLIPORT_CONTROL_REG 0x0408 172*ef270ab1SKenneth D. Merry #define SLI4_SLIPORT_CONTROL_END BIT(30) 173*ef270ab1SKenneth D. Merry #define SLI4_SLIPORT_CONTROL_LITTLE_ENDIAN (0) 174*ef270ab1SKenneth D. Merry #define SLI4_SLIPORT_CONTROL_BIG_ENDIAN BIT(30) 175*ef270ab1SKenneth D. Merry #define SLI4_SLIPORT_CONTROL_IP BIT(27) 176*ef270ab1SKenneth D. Merry #define SLI4_SLIPORT_CONTROL_IDIS BIT(22) 177*ef270ab1SKenneth D. Merry #define SLI4_SLIPORT_CONTROL_FDD BIT(31) 178*ef270ab1SKenneth D. Merry 179*ef270ab1SKenneth D. Merry /** 180*ef270ab1SKenneth D. Merry * @brief SLI4_SLIPORT_ERROR1 - SLI Port Error Register 181*ef270ab1SKenneth D. Merry */ 182*ef270ab1SKenneth D. Merry #define SLI4_SLIPORT_ERROR1 0x040c 183*ef270ab1SKenneth D. Merry 184*ef270ab1SKenneth D. Merry /** 185*ef270ab1SKenneth D. Merry * @brief SLI4_SLIPORT_ERROR2 - SLI Port Error Register 186*ef270ab1SKenneth D. Merry */ 187*ef270ab1SKenneth D. Merry #define SLI4_SLIPORT_ERROR2 0x0410 188*ef270ab1SKenneth D. Merry 189*ef270ab1SKenneth D. Merry /** 190*ef270ab1SKenneth D. Merry * @brief User error registers 191*ef270ab1SKenneth D. Merry */ 192*ef270ab1SKenneth D. Merry #define SLI4_UERR_STATUS_LOW_REG 0xA0 193*ef270ab1SKenneth D. Merry #define SLI4_UERR_STATUS_HIGH_REG 0xA4 194*ef270ab1SKenneth D. Merry #define SLI4_UERR_MASK_LOW_REG 0xA8 195*ef270ab1SKenneth D. Merry #define SLI4_UERR_MASK_HIGH_REG 0xAC 196*ef270ab1SKenneth D. Merry 197*ef270ab1SKenneth D. Merry /** 198*ef270ab1SKenneth D. Merry * @brief Registers for generating software UE (BE3) 199*ef270ab1SKenneth D. Merry */ 200*ef270ab1SKenneth D. Merry #define SLI4_SW_UE_CSR1 0x138 201*ef270ab1SKenneth D. Merry #define SLI4_SW_UE_CSR2 0x1FFFC 202*ef270ab1SKenneth D. Merry 203*ef270ab1SKenneth D. Merry /** 204*ef270ab1SKenneth D. Merry * @brief Registers for generating software UE (Skyhawk) 205*ef270ab1SKenneth D. Merry */ 206*ef270ab1SKenneth D. Merry #define SLI4_SW_UE_REG 0x5C /* register offset */ 207*ef270ab1SKenneth D. Merry 208*ef270ab1SKenneth D. Merry static inline uint32_t sli_eq_doorbell(uint16_t n_popped, uint16_t id, uint8_t arm) 209*ef270ab1SKenneth D. Merry { 210*ef270ab1SKenneth D. Merry uint32_t reg = 0; 211*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 212*ef270ab1SKenneth D. Merry struct { 213*ef270ab1SKenneth D. Merry uint32_t eq_id_lo:9, 214*ef270ab1SKenneth D. Merry ci:1, /* clear interrupt */ 215*ef270ab1SKenneth D. Merry qt:1, /* queue type */ 216*ef270ab1SKenneth D. Merry eq_id_hi:5, 217*ef270ab1SKenneth D. Merry number_popped:13, 218*ef270ab1SKenneth D. Merry arm:1, 219*ef270ab1SKenneth D. Merry :1, 220*ef270ab1SKenneth D. Merry se:1; 221*ef270ab1SKenneth D. Merry } * eq_doorbell = (void *)® 222*ef270ab1SKenneth D. Merry #else 223*ef270ab1SKenneth D. Merry #error big endian version not defined 224*ef270ab1SKenneth D. Merry #endif 225*ef270ab1SKenneth D. Merry 226*ef270ab1SKenneth D. Merry eq_doorbell->eq_id_lo = id & SLI4_EQCQ_EQ_ID_MASK_LO; 227*ef270ab1SKenneth D. Merry eq_doorbell->qt = 1; /* EQ is type 1 (section 2.2.3.3 SLI Arch) */ 228*ef270ab1SKenneth D. Merry eq_doorbell->eq_id_hi = (id >> 9) & 0x1f; 229*ef270ab1SKenneth D. Merry eq_doorbell->number_popped = n_popped; 230*ef270ab1SKenneth D. Merry eq_doorbell->arm = arm; 231*ef270ab1SKenneth D. Merry eq_doorbell->ci = TRUE; 232*ef270ab1SKenneth D. Merry 233*ef270ab1SKenneth D. Merry return reg; 234*ef270ab1SKenneth D. Merry } 235*ef270ab1SKenneth D. Merry 236*ef270ab1SKenneth D. Merry static inline uint32_t sli_cq_doorbell(uint16_t n_popped, uint16_t id, uint8_t arm) 237*ef270ab1SKenneth D. Merry { 238*ef270ab1SKenneth D. Merry uint32_t reg = 0; 239*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 240*ef270ab1SKenneth D. Merry struct { 241*ef270ab1SKenneth D. Merry uint32_t cq_id_lo:10, 242*ef270ab1SKenneth D. Merry qt:1, /* queue type */ 243*ef270ab1SKenneth D. Merry cq_id_hi:5, 244*ef270ab1SKenneth D. Merry number_popped:13, 245*ef270ab1SKenneth D. Merry arm:1, 246*ef270ab1SKenneth D. Merry :1, 247*ef270ab1SKenneth D. Merry se:1; 248*ef270ab1SKenneth D. Merry } * cq_doorbell = (void *)® 249*ef270ab1SKenneth D. Merry #else 250*ef270ab1SKenneth D. Merry #error big endian version not defined 251*ef270ab1SKenneth D. Merry #endif 252*ef270ab1SKenneth D. Merry 253*ef270ab1SKenneth D. Merry cq_doorbell->cq_id_lo = id & SLI4_EQCQ_CQ_ID_MASK_LO; 254*ef270ab1SKenneth D. Merry cq_doorbell->qt = 0; /* CQ is type 0 (section 2.2.3.3 SLI Arch) */ 255*ef270ab1SKenneth D. Merry cq_doorbell->cq_id_hi = (id >> 10) & 0x1f; 256*ef270ab1SKenneth D. Merry cq_doorbell->number_popped = n_popped; 257*ef270ab1SKenneth D. Merry cq_doorbell->arm = arm; 258*ef270ab1SKenneth D. Merry 259*ef270ab1SKenneth D. Merry return reg; 260*ef270ab1SKenneth D. Merry } 261*ef270ab1SKenneth D. Merry 262*ef270ab1SKenneth D. Merry /** 263*ef270ab1SKenneth D. Merry * @brief MQ_DOORBELL - MQ Doorbell Register 264*ef270ab1SKenneth D. Merry */ 265*ef270ab1SKenneth D. Merry #define SLI4_MQ_DOORBELL_REG 0x0140 /* register offset */ 266*ef270ab1SKenneth D. Merry #define SLI4_MQ_DOORBELL_NUM_SHIFT 16 267*ef270ab1SKenneth D. Merry #define SLI4_MQ_DOORBELL_NUM_MASK 0x3fff 268*ef270ab1SKenneth D. Merry #define SLI4_MQ_DOORBELL_ID_MASK 0xffff 269*ef270ab1SKenneth D. Merry #define SLI4_MQ_DOORBELL(n, i) ((((n) & SLI4_MQ_DOORBELL_NUM_MASK) << SLI4_MQ_DOORBELL_NUM_SHIFT) | \ 270*ef270ab1SKenneth D. Merry ((i) & SLI4_MQ_DOORBELL_ID_MASK)) 271*ef270ab1SKenneth D. Merry 272*ef270ab1SKenneth D. Merry /** 273*ef270ab1SKenneth D. Merry * @brief RQ_DOORBELL - RQ Doorbell Register 274*ef270ab1SKenneth D. Merry */ 275*ef270ab1SKenneth D. Merry #define SLI4_RQ_DOORBELL_REG 0x0a0 /* register offset */ 276*ef270ab1SKenneth D. Merry #define SLI4_RQ_DOORBELL_NUM_SHIFT 16 277*ef270ab1SKenneth D. Merry #define SLI4_RQ_DOORBELL_NUM_MASK 0x3fff 278*ef270ab1SKenneth D. Merry #define SLI4_RQ_DOORBELL_ID_MASK 0xffff 279*ef270ab1SKenneth D. Merry #define SLI4_RQ_DOORBELL(n, i) ((((n) & SLI4_RQ_DOORBELL_NUM_MASK) << SLI4_RQ_DOORBELL_NUM_SHIFT) | \ 280*ef270ab1SKenneth D. Merry ((i) & SLI4_RQ_DOORBELL_ID_MASK)) 281*ef270ab1SKenneth D. Merry 282*ef270ab1SKenneth D. Merry /** 283*ef270ab1SKenneth D. Merry * @brief WQ_DOORBELL - WQ Doorbell Register 284*ef270ab1SKenneth D. Merry */ 285*ef270ab1SKenneth D. Merry #define SLI4_IO_WQ_DOORBELL_REG 0x040 /* register offset */ 286*ef270ab1SKenneth D. Merry #define SLI4_WQ_DOORBELL_IDX_SHIFT 16 287*ef270ab1SKenneth D. Merry #define SLI4_WQ_DOORBELL_IDX_MASK 0x00ff 288*ef270ab1SKenneth D. Merry #define SLI4_WQ_DOORBELL_NUM_SHIFT 24 289*ef270ab1SKenneth D. Merry #define SLI4_WQ_DOORBELL_NUM_MASK 0x00ff 290*ef270ab1SKenneth D. Merry #define SLI4_WQ_DOORBELL_ID_MASK 0xffff 291*ef270ab1SKenneth D. Merry #define SLI4_WQ_DOORBELL(n, x, i) ((((n) & SLI4_WQ_DOORBELL_NUM_MASK) << SLI4_WQ_DOORBELL_NUM_SHIFT) | \ 292*ef270ab1SKenneth D. Merry (((x) & SLI4_WQ_DOORBELL_IDX_MASK) << SLI4_WQ_DOORBELL_IDX_SHIFT) | \ 293*ef270ab1SKenneth D. Merry ((i) & SLI4_WQ_DOORBELL_ID_MASK)) 294*ef270ab1SKenneth D. Merry 295*ef270ab1SKenneth D. Merry /** 296*ef270ab1SKenneth D. Merry * @brief SLIPORT_SEMAPHORE - SLI Port Host and Port Status Register 297*ef270ab1SKenneth D. Merry */ 298*ef270ab1SKenneth D. Merry #define SLI4_PORT_SEMAPHORE_REG_0 0x00ac /** register offset Interface Type 0 + 1 */ 299*ef270ab1SKenneth D. Merry #define SLI4_PORT_SEMAPHORE_REG_1 0x0180 /** register offset Interface Type 0 + 1 */ 300*ef270ab1SKenneth D. Merry #define SLI4_PORT_SEMAPHORE_REG_23 0x0400 /** register offset Interface Type 2 + 3 */ 301*ef270ab1SKenneth D. Merry #define SLI4_PORT_SEMAPHORE_PORT_MASK 0x0000ffff 302*ef270ab1SKenneth D. Merry #define SLI4_PORT_SEMAPHORE_PORT(r) ((r) & SLI4_PORT_SEMAPHORE_PORT_MASK) 303*ef270ab1SKenneth D. Merry #define SLI4_PORT_SEMAPHORE_HOST_MASK 0x00ff0000 304*ef270ab1SKenneth D. Merry #define SLI4_PORT_SEMAPHORE_HOST_SHIFT 16 305*ef270ab1SKenneth D. Merry #define SLI4_PORT_SEMAPHORE_HOST(r) (((r) & SLI4_PORT_SEMAPHORE_HOST_MASK) >> \ 306*ef270ab1SKenneth D. Merry SLI4_PORT_SEMAPHORE_HOST_SHIFT) 307*ef270ab1SKenneth D. Merry #define SLI4_PORT_SEMAPHORE_SCR2 BIT(26) /** scratch area 2 */ 308*ef270ab1SKenneth D. Merry #define SLI4_PORT_SEMAPHORE_SCR1 BIT(27) /** scratch area 1 */ 309*ef270ab1SKenneth D. Merry #define SLI4_PORT_SEMAPHORE_IPC BIT(28) /** IP conflict */ 310*ef270ab1SKenneth D. Merry #define SLI4_PORT_SEMAPHORE_NIP BIT(29) /** no IP address */ 311*ef270ab1SKenneth D. Merry #define SLI4_PORT_SEMAPHORE_SFI BIT(30) /** secondary firmware image used */ 312*ef270ab1SKenneth D. Merry #define SLI4_PORT_SEMAPHORE_PERR BIT(31) /** POST fatal error */ 313*ef270ab1SKenneth D. Merry 314*ef270ab1SKenneth D. Merry #define SLI4_PORT_SEMAPHORE_STATUS_POST_READY 0xc000 315*ef270ab1SKenneth D. Merry #define SLI4_PORT_SEMAPHORE_STATUS_UNRECOV_ERR 0xf000 316*ef270ab1SKenneth D. Merry #define SLI4_PORT_SEMAPHORE_STATUS_ERR_MASK 0xf000 317*ef270ab1SKenneth D. Merry #define SLI4_PORT_SEMAPHORE_IN_ERR(r) (SLI4_PORT_SEMAPHORE_STATUS_UNRECOV_ERR == ((r) & \ 318*ef270ab1SKenneth D. Merry SLI4_PORT_SEMAPHORE_STATUS_ERR_MASK)) 319*ef270ab1SKenneth D. Merry 320*ef270ab1SKenneth D. Merry /** 321*ef270ab1SKenneth D. Merry * @brief SLIPORT_STATUS - SLI Port Status Register 322*ef270ab1SKenneth D. Merry */ 323*ef270ab1SKenneth D. Merry 324*ef270ab1SKenneth D. Merry #define SLI4_PORT_STATUS_REG_23 0x0404 /** register offset Interface Type 2 + 3 */ 325*ef270ab1SKenneth D. Merry #define SLI4_PORT_STATUS_FDP BIT(21) /** function specific dump present */ 326*ef270ab1SKenneth D. Merry #define SLI4_PORT_STATUS_RDY BIT(23) /** ready */ 327*ef270ab1SKenneth D. Merry #define SLI4_PORT_STATUS_RN BIT(24) /** reset needed */ 328*ef270ab1SKenneth D. Merry #define SLI4_PORT_STATUS_DIP BIT(25) /** dump present */ 329*ef270ab1SKenneth D. Merry #define SLI4_PORT_STATUS_OTI BIT(29) /** over temp indicator */ 330*ef270ab1SKenneth D. Merry #define SLI4_PORT_STATUS_END BIT(30) /** endianness */ 331*ef270ab1SKenneth D. Merry #define SLI4_PORT_STATUS_ERR BIT(31) /** SLI port error */ 332*ef270ab1SKenneth D. Merry #define SLI4_PORT_STATUS_READY(r) ((r) & SLI4_PORT_STATUS_RDY) 333*ef270ab1SKenneth D. Merry #define SLI4_PORT_STATUS_ERROR(r) ((r) & SLI4_PORT_STATUS_ERR) 334*ef270ab1SKenneth D. Merry #define SLI4_PORT_STATUS_DUMP_PRESENT(r) ((r) & SLI4_PORT_STATUS_DIP) 335*ef270ab1SKenneth D. Merry #define SLI4_PORT_STATUS_FDP_PRESENT(r) ((r) & SLI4_PORT_STATUS_FDP) 336*ef270ab1SKenneth D. Merry 337*ef270ab1SKenneth D. Merry 338*ef270ab1SKenneth D. Merry #define SLI4_PHSDEV_CONTROL_REG_23 0x0414 /** register offset Interface Type 2 + 3 */ 339*ef270ab1SKenneth D. Merry #define SLI4_PHYDEV_CONTROL_DRST BIT(0) /** physical device reset */ 340*ef270ab1SKenneth D. Merry #define SLI4_PHYDEV_CONTROL_FRST BIT(1) /** firmware reset */ 341*ef270ab1SKenneth D. Merry #define SLI4_PHYDEV_CONTROL_DD BIT(2) /** diagnostic dump */ 342*ef270ab1SKenneth D. Merry #define SLI4_PHYDEV_CONTROL_FRL_MASK 0x000000f0 343*ef270ab1SKenneth D. Merry #define SLI4_PHYDEV_CONTROL_FRL_SHIFT 4 344*ef270ab1SKenneth D. Merry #define SLI4_PHYDEV_CONTROL_FRL(r) (((r) & SLI4_PHYDEV_CONTROL_FRL_MASK) >> \ 345*ef270ab1SKenneth D. Merry SLI4_PHYDEV_CONTROL_FRL_SHIFT_SHIFT) 346*ef270ab1SKenneth D. Merry 347*ef270ab1SKenneth D. Merry /************************************************************************* 348*ef270ab1SKenneth D. Merry * SLI-4 mailbox command formats and definitions 349*ef270ab1SKenneth D. Merry */ 350*ef270ab1SKenneth D. Merry 351*ef270ab1SKenneth D. Merry typedef struct sli4_mbox_command_header_s { 352*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 353*ef270ab1SKenneth D. Merry uint32_t :8, 354*ef270ab1SKenneth D. Merry command:8, 355*ef270ab1SKenneth D. Merry status:16; /** Port writes to indicate success / fail */ 356*ef270ab1SKenneth D. Merry #else 357*ef270ab1SKenneth D. Merry #error big endian version not defined 358*ef270ab1SKenneth D. Merry #endif 359*ef270ab1SKenneth D. Merry } sli4_mbox_command_header_t; 360*ef270ab1SKenneth D. Merry 361*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_CONFIG_LINK 0x07 362*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_DUMP 0x17 363*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_DOWN_LINK 0x06 364*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_INIT_LINK 0x05 365*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_INIT_VFI 0xa3 366*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_INIT_VPI 0xa4 367*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_POST_XRI 0xa7 368*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_RELEASE_XRI 0xac 369*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_READ_CONFIG 0x0b 370*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_READ_STATUS 0x0e 371*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_READ_NVPARMS 0x02 372*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_READ_REV 0x11 373*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_READ_LNK_STAT 0x12 374*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_READ_SPARM64 0x8d 375*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_READ_TOPOLOGY 0x95 376*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_REG_FCFI 0xa0 377*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_REG_FCFI_MRQ 0xaf 378*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_REG_RPI 0x93 379*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_REG_RX_RQ 0xa6 380*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_REG_VFI 0x9f 381*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_REG_VPI 0x96 382*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_REQUEST_FEATURES 0x9d 383*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_SLI_CONFIG 0x9b 384*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_UNREG_FCFI 0xa2 385*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_UNREG_RPI 0x14 386*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_UNREG_VFI 0xa1 387*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_UNREG_VPI 0x97 388*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_WRITE_NVPARMS 0x03 389*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_CONFIG_AUTO_XFER_RDY 0xAD 390*ef270ab1SKenneth D. Merry #define SLI4_MBOX_COMMAND_CONFIG_AUTO_XFER_RDY_HP 0xAE 391*ef270ab1SKenneth D. Merry 392*ef270ab1SKenneth D. Merry #define SLI4_MBOX_STATUS_SUCCESS 0x0000 393*ef270ab1SKenneth D. Merry #define SLI4_MBOX_STATUS_FAILURE 0x0001 394*ef270ab1SKenneth D. Merry #define SLI4_MBOX_STATUS_RPI_NOT_REG 0x1400 395*ef270ab1SKenneth D. Merry 396*ef270ab1SKenneth D. Merry /** 397*ef270ab1SKenneth D. Merry * @brief Buffer Descriptor Entry (BDE) 398*ef270ab1SKenneth D. Merry */ 399*ef270ab1SKenneth D. Merry typedef struct sli4_bde_s { 400*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 401*ef270ab1SKenneth D. Merry uint32_t buffer_length:24, 402*ef270ab1SKenneth D. Merry bde_type:8; 403*ef270ab1SKenneth D. Merry union { 404*ef270ab1SKenneth D. Merry struct { 405*ef270ab1SKenneth D. Merry uint32_t buffer_address_low; 406*ef270ab1SKenneth D. Merry uint32_t buffer_address_high; 407*ef270ab1SKenneth D. Merry } data; 408*ef270ab1SKenneth D. Merry struct { 409*ef270ab1SKenneth D. Merry uint32_t offset; 410*ef270ab1SKenneth D. Merry uint32_t rsvd2; 411*ef270ab1SKenneth D. Merry } imm; 412*ef270ab1SKenneth D. Merry struct { 413*ef270ab1SKenneth D. Merry uint32_t sgl_segment_address_low; 414*ef270ab1SKenneth D. Merry uint32_t sgl_segment_address_high; 415*ef270ab1SKenneth D. Merry } blp; 416*ef270ab1SKenneth D. Merry } u; 417*ef270ab1SKenneth D. Merry #else 418*ef270ab1SKenneth D. Merry #error big endian version not defined 419*ef270ab1SKenneth D. Merry #endif 420*ef270ab1SKenneth D. Merry } sli4_bde_t; 421*ef270ab1SKenneth D. Merry 422*ef270ab1SKenneth D. Merry #define SLI4_BDE_TYPE_BDE_64 0x00 /** Generic 64-bit data */ 423*ef270ab1SKenneth D. Merry #define SLI4_BDE_TYPE_BDE_IMM 0x01 /** Immediate data */ 424*ef270ab1SKenneth D. Merry #define SLI4_BDE_TYPE_BLP 0x40 /** Buffer List Pointer */ 425*ef270ab1SKenneth D. Merry 426*ef270ab1SKenneth D. Merry /** 427*ef270ab1SKenneth D. Merry * @brief Scatter-Gather Entry (SGE) 428*ef270ab1SKenneth D. Merry */ 429*ef270ab1SKenneth D. Merry typedef struct sli4_sge_s { 430*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 431*ef270ab1SKenneth D. Merry uint32_t buffer_address_high; 432*ef270ab1SKenneth D. Merry uint32_t buffer_address_low; 433*ef270ab1SKenneth D. Merry uint32_t data_offset:27, 434*ef270ab1SKenneth D. Merry sge_type:4, 435*ef270ab1SKenneth D. Merry last:1; 436*ef270ab1SKenneth D. Merry uint32_t buffer_length; 437*ef270ab1SKenneth D. Merry #else 438*ef270ab1SKenneth D. Merry #error big endian version not defined 439*ef270ab1SKenneth D. Merry #endif 440*ef270ab1SKenneth D. Merry } sli4_sge_t; 441*ef270ab1SKenneth D. Merry 442*ef270ab1SKenneth D. Merry /** 443*ef270ab1SKenneth D. Merry * @brief T10 DIF Scatter-Gather Entry (SGE) 444*ef270ab1SKenneth D. Merry */ 445*ef270ab1SKenneth D. Merry typedef struct sli4_dif_sge_s { 446*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 447*ef270ab1SKenneth D. Merry uint32_t buffer_address_high; 448*ef270ab1SKenneth D. Merry uint32_t buffer_address_low; 449*ef270ab1SKenneth D. Merry uint32_t :27, 450*ef270ab1SKenneth D. Merry sge_type:4, 451*ef270ab1SKenneth D. Merry last:1; 452*ef270ab1SKenneth D. Merry uint32_t :32; 453*ef270ab1SKenneth D. Merry #else 454*ef270ab1SKenneth D. Merry #error big endian version not defined 455*ef270ab1SKenneth D. Merry #endif 456*ef270ab1SKenneth D. Merry } sli4_dif_sge_t; 457*ef270ab1SKenneth D. Merry 458*ef270ab1SKenneth D. Merry /** 459*ef270ab1SKenneth D. Merry * @brief T10 DIF Seed Scatter-Gather Entry (SGE) 460*ef270ab1SKenneth D. Merry */ 461*ef270ab1SKenneth D. Merry typedef struct sli4_diseed_sge_s { 462*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 463*ef270ab1SKenneth D. Merry uint32_t ref_tag_cmp; 464*ef270ab1SKenneth D. Merry uint32_t ref_tag_repl; 465*ef270ab1SKenneth D. Merry uint32_t app_tag_repl:16, 466*ef270ab1SKenneth D. Merry :2, 467*ef270ab1SKenneth D. Merry hs:1, 468*ef270ab1SKenneth D. Merry ws:1, 469*ef270ab1SKenneth D. Merry ic:1, 470*ef270ab1SKenneth D. Merry ics:1, 471*ef270ab1SKenneth D. Merry atrt:1, 472*ef270ab1SKenneth D. Merry at:1, 473*ef270ab1SKenneth D. Merry fwd_app_tag:1, 474*ef270ab1SKenneth D. Merry repl_app_tag:1, 475*ef270ab1SKenneth D. Merry head_insert:1, 476*ef270ab1SKenneth D. Merry sge_type:4, 477*ef270ab1SKenneth D. Merry last:1; 478*ef270ab1SKenneth D. Merry uint32_t app_tag_cmp:16, 479*ef270ab1SKenneth D. Merry dif_blk_size:3, 480*ef270ab1SKenneth D. Merry auto_incr_ref_tag:1, 481*ef270ab1SKenneth D. Merry check_app_tag:1, 482*ef270ab1SKenneth D. Merry check_ref_tag:1, 483*ef270ab1SKenneth D. Merry check_crc:1, 484*ef270ab1SKenneth D. Merry new_ref_tag:1, 485*ef270ab1SKenneth D. Merry dif_op_rx:4, 486*ef270ab1SKenneth D. Merry dif_op_tx:4; 487*ef270ab1SKenneth D. Merry #else 488*ef270ab1SKenneth D. Merry #error big endian version not defined 489*ef270ab1SKenneth D. Merry #endif 490*ef270ab1SKenneth D. Merry } sli4_diseed_sge_t; 491*ef270ab1SKenneth D. Merry 492*ef270ab1SKenneth D. Merry /** 493*ef270ab1SKenneth D. Merry * @brief List Segment Pointer Scatter-Gather Entry (SGE) 494*ef270ab1SKenneth D. Merry */ 495*ef270ab1SKenneth D. Merry typedef struct sli4_lsp_sge_s { 496*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 497*ef270ab1SKenneth D. Merry uint32_t buffer_address_high; 498*ef270ab1SKenneth D. Merry uint32_t buffer_address_low; 499*ef270ab1SKenneth D. Merry uint32_t :27, 500*ef270ab1SKenneth D. Merry sge_type:4, 501*ef270ab1SKenneth D. Merry last:1; 502*ef270ab1SKenneth D. Merry uint32_t segment_length:24, 503*ef270ab1SKenneth D. Merry :8; 504*ef270ab1SKenneth D. Merry #else 505*ef270ab1SKenneth D. Merry #error big endian version not defined 506*ef270ab1SKenneth D. Merry #endif 507*ef270ab1SKenneth D. Merry } sli4_lsp_sge_t; 508*ef270ab1SKenneth D. Merry 509*ef270ab1SKenneth D. Merry #define SLI4_SGE_MAX_RESERVED 3 510*ef270ab1SKenneth D. Merry 511*ef270ab1SKenneth D. Merry #define SLI4_SGE_DIF_OP_IN_NODIF_OUT_CRC 0x00 512*ef270ab1SKenneth D. Merry #define SLI4_SGE_DIF_OP_IN_CRC_OUT_NODIF 0x01 513*ef270ab1SKenneth D. Merry #define SLI4_SGE_DIF_OP_IN_NODIF_OUT_CHKSUM 0x02 514*ef270ab1SKenneth D. Merry #define SLI4_SGE_DIF_OP_IN_CHKSUM_OUT_NODIF 0x03 515*ef270ab1SKenneth D. Merry #define SLI4_SGE_DIF_OP_IN_CRC_OUT_CRC 0x04 516*ef270ab1SKenneth D. Merry #define SLI4_SGE_DIF_OP_IN_CHKSUM_OUT_CHKSUM 0x05 517*ef270ab1SKenneth D. Merry #define SLI4_SGE_DIF_OP_IN_CRC_OUT_CHKSUM 0x06 518*ef270ab1SKenneth D. Merry #define SLI4_SGE_DIF_OP_IN_CHKSUM_OUT_CRC 0x07 519*ef270ab1SKenneth D. Merry #define SLI4_SGE_DIF_OP_IN_RAW_OUT_RAW 0x08 520*ef270ab1SKenneth D. Merry 521*ef270ab1SKenneth D. Merry #define SLI4_SGE_TYPE_DATA 0x00 522*ef270ab1SKenneth D. Merry #define SLI4_SGE_TYPE_CHAIN 0x03 /** Skyhawk only */ 523*ef270ab1SKenneth D. Merry #define SLI4_SGE_TYPE_DIF 0x04 /** Data Integrity Field */ 524*ef270ab1SKenneth D. Merry #define SLI4_SGE_TYPE_LSP 0x05 /** List Segment Pointer */ 525*ef270ab1SKenneth D. Merry #define SLI4_SGE_TYPE_PEDIF 0x06 /** Post Encryption Engine DIF */ 526*ef270ab1SKenneth D. Merry #define SLI4_SGE_TYPE_PESEED 0x07 /** Post Encryption Engine DIF Seed */ 527*ef270ab1SKenneth D. Merry #define SLI4_SGE_TYPE_DISEED 0x08 /** DIF Seed */ 528*ef270ab1SKenneth D. Merry #define SLI4_SGE_TYPE_ENC 0x09 /** Encryption */ 529*ef270ab1SKenneth D. Merry #define SLI4_SGE_TYPE_ATM 0x0a /** DIF Application Tag Mask */ 530*ef270ab1SKenneth D. Merry #define SLI4_SGE_TYPE_SKIP 0x0c /** SKIP */ 531*ef270ab1SKenneth D. Merry 532*ef270ab1SKenneth D. Merry #define OCS_MAX_SGE_SIZE 0x80000000 /* Maximum data allowed in a SGE */ 533*ef270ab1SKenneth D. Merry 534*ef270ab1SKenneth D. Merry /** 535*ef270ab1SKenneth D. Merry * @brief CONFIG_LINK 536*ef270ab1SKenneth D. Merry */ 537*ef270ab1SKenneth D. Merry typedef struct sli4_cmd_config_link_s { 538*ef270ab1SKenneth D. Merry sli4_mbox_command_header_t hdr; 539*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 540*ef270ab1SKenneth D. Merry uint32_t maxbbc:8, /** Max buffer-to-buffer credit */ 541*ef270ab1SKenneth D. Merry :24; 542*ef270ab1SKenneth D. Merry uint32_t alpa:8, 543*ef270ab1SKenneth D. Merry n_port_id:16, 544*ef270ab1SKenneth D. Merry :8; 545*ef270ab1SKenneth D. Merry uint32_t rsvd3; 546*ef270ab1SKenneth D. Merry uint32_t e_d_tov; 547*ef270ab1SKenneth D. Merry uint32_t lp_tov; 548*ef270ab1SKenneth D. Merry uint32_t r_a_tov; 549*ef270ab1SKenneth D. Merry uint32_t r_t_tov; 550*ef270ab1SKenneth D. Merry uint32_t al_tov; 551*ef270ab1SKenneth D. Merry uint32_t rsvd9; 552*ef270ab1SKenneth D. Merry uint32_t :8, 553*ef270ab1SKenneth D. Merry bbscn:4, /** buffer-to-buffer state change number */ 554*ef270ab1SKenneth D. Merry cscn:1, /** configure BBSCN */ 555*ef270ab1SKenneth D. Merry :19; 556*ef270ab1SKenneth D. Merry #else 557*ef270ab1SKenneth D. Merry #error big endian version not defined 558*ef270ab1SKenneth D. Merry #endif 559*ef270ab1SKenneth D. Merry } sli4_cmd_config_link_t; 560*ef270ab1SKenneth D. Merry 561*ef270ab1SKenneth D. Merry /** 562*ef270ab1SKenneth D. Merry * @brief DUMP Type 4 563*ef270ab1SKenneth D. Merry */ 564*ef270ab1SKenneth D. Merry #define SLI4_WKI_TAG_SAT_TEM 0x1040 565*ef270ab1SKenneth D. Merry typedef struct sli4_cmd_dump4_s { 566*ef270ab1SKenneth D. Merry sli4_mbox_command_header_t hdr; 567*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 568*ef270ab1SKenneth D. Merry uint32_t type:4, 569*ef270ab1SKenneth D. Merry :28; 570*ef270ab1SKenneth D. Merry uint32_t wki_selection:16, 571*ef270ab1SKenneth D. Merry :16; 572*ef270ab1SKenneth D. Merry uint32_t resv; 573*ef270ab1SKenneth D. Merry uint32_t returned_byte_cnt; 574*ef270ab1SKenneth D. Merry uint32_t resp_data[59]; 575*ef270ab1SKenneth D. Merry #else 576*ef270ab1SKenneth D. Merry #error big endian version not defined 577*ef270ab1SKenneth D. Merry #endif 578*ef270ab1SKenneth D. Merry } sli4_cmd_dump4_t; 579*ef270ab1SKenneth D. Merry 580*ef270ab1SKenneth D. Merry /** 581*ef270ab1SKenneth D. Merry * @brief FW_INITIALIZE - initialize a SLI port 582*ef270ab1SKenneth D. Merry * 583*ef270ab1SKenneth D. Merry * @note This command uses a different format than all others. 584*ef270ab1SKenneth D. Merry */ 585*ef270ab1SKenneth D. Merry 586*ef270ab1SKenneth D. Merry extern const uint8_t sli4_fw_initialize[8]; 587*ef270ab1SKenneth D. Merry 588*ef270ab1SKenneth D. Merry /** 589*ef270ab1SKenneth D. Merry * @brief FW_DEINITIALIZE - deinitialize a SLI port 590*ef270ab1SKenneth D. Merry * 591*ef270ab1SKenneth D. Merry * @note This command uses a different format than all others. 592*ef270ab1SKenneth D. Merry */ 593*ef270ab1SKenneth D. Merry 594*ef270ab1SKenneth D. Merry extern const uint8_t sli4_fw_deinitialize[8]; 595*ef270ab1SKenneth D. Merry 596*ef270ab1SKenneth D. Merry /** 597*ef270ab1SKenneth D. Merry * @brief INIT_LINK - initialize the link for a FC/FCoE port 598*ef270ab1SKenneth D. Merry */ 599*ef270ab1SKenneth D. Merry typedef struct sli4_cmd_init_link_flags_s { 600*ef270ab1SKenneth D. Merry uint32_t loopback:1, 601*ef270ab1SKenneth D. Merry topology:2, 602*ef270ab1SKenneth D. Merry #define FC_TOPOLOGY_FCAL 0 603*ef270ab1SKenneth D. Merry #define FC_TOPOLOGY_P2P 1 604*ef270ab1SKenneth D. Merry :3, 605*ef270ab1SKenneth D. Merry unfair:1, 606*ef270ab1SKenneth D. Merry skip_lirp_lilp:1, 607*ef270ab1SKenneth D. Merry gen_loop_validity_check:1, 608*ef270ab1SKenneth D. Merry skip_lisa:1, 609*ef270ab1SKenneth D. Merry enable_topology_failover:1, 610*ef270ab1SKenneth D. Merry fixed_speed:1, 611*ef270ab1SKenneth D. Merry :3, 612*ef270ab1SKenneth D. Merry select_hightest_al_pa:1, 613*ef270ab1SKenneth D. Merry :16; /* pad to 32 bits */ 614*ef270ab1SKenneth D. Merry } sli4_cmd_init_link_flags_t; 615*ef270ab1SKenneth D. Merry 616*ef270ab1SKenneth D. Merry #define SLI4_INIT_LINK_F_LOOP_BACK BIT(0) 617*ef270ab1SKenneth D. Merry #define SLI4_INIT_LINK_F_UNFAIR BIT(6) 618*ef270ab1SKenneth D. Merry #define SLI4_INIT_LINK_F_NO_LIRP BIT(7) 619*ef270ab1SKenneth D. Merry #define SLI4_INIT_LINK_F_LOOP_VALID_CHK BIT(8) 620*ef270ab1SKenneth D. Merry #define SLI4_INIT_LINK_F_NO_LISA BIT(9) 621*ef270ab1SKenneth D. Merry #define SLI4_INIT_LINK_F_FAIL_OVER BIT(10) 622*ef270ab1SKenneth D. Merry #define SLI4_INIT_LINK_F_NO_AUTOSPEED BIT(11) 623*ef270ab1SKenneth D. Merry #define SLI4_INIT_LINK_F_PICK_HI_ALPA BIT(15) 624*ef270ab1SKenneth D. Merry 625*ef270ab1SKenneth D. Merry #define SLI4_INIT_LINK_F_P2P_ONLY 1 626*ef270ab1SKenneth D. Merry #define SLI4_INIT_LINK_F_FCAL_ONLY 2 627*ef270ab1SKenneth D. Merry 628*ef270ab1SKenneth D. Merry #define SLI4_INIT_LINK_F_FCAL_FAIL_OVER 0 629*ef270ab1SKenneth D. Merry #define SLI4_INIT_LINK_F_P2P_FAIL_OVER 1 630*ef270ab1SKenneth D. Merry 631*ef270ab1SKenneth D. Merry typedef struct sli4_cmd_init_link_s { 632*ef270ab1SKenneth D. Merry sli4_mbox_command_header_t hdr; 633*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 634*ef270ab1SKenneth D. Merry uint32_t selective_reset_al_pa:8, 635*ef270ab1SKenneth D. Merry :24; 636*ef270ab1SKenneth D. Merry sli4_cmd_init_link_flags_t link_flags; 637*ef270ab1SKenneth D. Merry uint32_t link_speed_selection_code; 638*ef270ab1SKenneth D. Merry #define FC_LINK_SPEED_1G 1 639*ef270ab1SKenneth D. Merry #define FC_LINK_SPEED_2G 2 640*ef270ab1SKenneth D. Merry #define FC_LINK_SPEED_AUTO_1_2 3 641*ef270ab1SKenneth D. Merry #define FC_LINK_SPEED_4G 4 642*ef270ab1SKenneth D. Merry #define FC_LINK_SPEED_AUTO_4_1 5 643*ef270ab1SKenneth D. Merry #define FC_LINK_SPEED_AUTO_4_2 6 644*ef270ab1SKenneth D. Merry #define FC_LINK_SPEED_AUTO_4_2_1 7 645*ef270ab1SKenneth D. Merry #define FC_LINK_SPEED_8G 8 646*ef270ab1SKenneth D. Merry #define FC_LINK_SPEED_AUTO_8_1 9 647*ef270ab1SKenneth D. Merry #define FC_LINK_SPEED_AUTO_8_2 10 648*ef270ab1SKenneth D. Merry #define FC_LINK_SPEED_AUTO_8_2_1 11 649*ef270ab1SKenneth D. Merry #define FC_LINK_SPEED_AUTO_8_4 12 650*ef270ab1SKenneth D. Merry #define FC_LINK_SPEED_AUTO_8_4_1 13 651*ef270ab1SKenneth D. Merry #define FC_LINK_SPEED_AUTO_8_4_2 14 652*ef270ab1SKenneth D. Merry #define FC_LINK_SPEED_10G 16 653*ef270ab1SKenneth D. Merry #define FC_LINK_SPEED_16G 17 654*ef270ab1SKenneth D. Merry #define FC_LINK_SPEED_AUTO_16_8_4 18 655*ef270ab1SKenneth D. Merry #define FC_LINK_SPEED_AUTO_16_8 19 656*ef270ab1SKenneth D. Merry #define FC_LINK_SPEED_32G 20 657*ef270ab1SKenneth D. Merry #define FC_LINK_SPEED_AUTO_32_16_8 21 658*ef270ab1SKenneth D. Merry #define FC_LINK_SPEED_AUTO_32_16 22 659*ef270ab1SKenneth D. Merry #else 660*ef270ab1SKenneth D. Merry #error big endian version not defined 661*ef270ab1SKenneth D. Merry #endif 662*ef270ab1SKenneth D. Merry } sli4_cmd_init_link_t; 663*ef270ab1SKenneth D. Merry 664*ef270ab1SKenneth D. Merry /** 665*ef270ab1SKenneth D. Merry * @brief INIT_VFI - initialize the VFI resource 666*ef270ab1SKenneth D. Merry */ 667*ef270ab1SKenneth D. Merry typedef struct sli4_cmd_init_vfi_s { 668*ef270ab1SKenneth D. Merry sli4_mbox_command_header_t hdr; 669*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 670*ef270ab1SKenneth D. Merry uint32_t vfi:16, 671*ef270ab1SKenneth D. Merry :12, 672*ef270ab1SKenneth D. Merry vp:1, 673*ef270ab1SKenneth D. Merry vf:1, 674*ef270ab1SKenneth D. Merry vt:1, 675*ef270ab1SKenneth D. Merry vr:1; 676*ef270ab1SKenneth D. Merry uint32_t fcfi:16, 677*ef270ab1SKenneth D. Merry vpi:16; 678*ef270ab1SKenneth D. Merry uint32_t vf_id:13, 679*ef270ab1SKenneth D. Merry pri:3, 680*ef270ab1SKenneth D. Merry :16; 681*ef270ab1SKenneth D. Merry uint32_t :24, 682*ef270ab1SKenneth D. Merry hop_count:8; 683*ef270ab1SKenneth D. Merry #else 684*ef270ab1SKenneth D. Merry #error big endian version not defined 685*ef270ab1SKenneth D. Merry #endif 686*ef270ab1SKenneth D. Merry } sli4_cmd_init_vfi_t; 687*ef270ab1SKenneth D. Merry 688*ef270ab1SKenneth D. Merry /** 689*ef270ab1SKenneth D. Merry * @brief INIT_VPI - initialize the VPI resource 690*ef270ab1SKenneth D. Merry */ 691*ef270ab1SKenneth D. Merry typedef struct sli4_cmd_init_vpi_s { 692*ef270ab1SKenneth D. Merry sli4_mbox_command_header_t hdr; 693*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 694*ef270ab1SKenneth D. Merry uint32_t vpi:16, 695*ef270ab1SKenneth D. Merry vfi:16; 696*ef270ab1SKenneth D. Merry #else 697*ef270ab1SKenneth D. Merry #error big endian version not defined 698*ef270ab1SKenneth D. Merry #endif 699*ef270ab1SKenneth D. Merry } sli4_cmd_init_vpi_t; 700*ef270ab1SKenneth D. Merry 701*ef270ab1SKenneth D. Merry /** 702*ef270ab1SKenneth D. Merry * @brief POST_XRI - post XRI resources to the SLI Port 703*ef270ab1SKenneth D. Merry */ 704*ef270ab1SKenneth D. Merry typedef struct sli4_cmd_post_xri_s { 705*ef270ab1SKenneth D. Merry sli4_mbox_command_header_t hdr; 706*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 707*ef270ab1SKenneth D. Merry uint32_t xri_base:16, 708*ef270ab1SKenneth D. Merry xri_count:12, 709*ef270ab1SKenneth D. Merry enx:1, 710*ef270ab1SKenneth D. Merry dl:1, 711*ef270ab1SKenneth D. Merry di:1, 712*ef270ab1SKenneth D. Merry val:1; 713*ef270ab1SKenneth D. Merry #else 714*ef270ab1SKenneth D. Merry #error big endian version not defined 715*ef270ab1SKenneth D. Merry #endif 716*ef270ab1SKenneth D. Merry } sli4_cmd_post_xri_t; 717*ef270ab1SKenneth D. Merry 718*ef270ab1SKenneth D. Merry /** 719*ef270ab1SKenneth D. Merry * @brief RELEASE_XRI - Release XRI resources from the SLI Port 720*ef270ab1SKenneth D. Merry */ 721*ef270ab1SKenneth D. Merry typedef struct sli4_cmd_release_xri_s { 722*ef270ab1SKenneth D. Merry sli4_mbox_command_header_t hdr; 723*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 724*ef270ab1SKenneth D. Merry uint32_t released_xri_count:5, 725*ef270ab1SKenneth D. Merry :11, 726*ef270ab1SKenneth D. Merry xri_count:5, 727*ef270ab1SKenneth D. Merry :11; 728*ef270ab1SKenneth D. Merry struct { 729*ef270ab1SKenneth D. Merry uint32_t xri_tag0:16, 730*ef270ab1SKenneth D. Merry xri_tag1:16; 731*ef270ab1SKenneth D. Merry } xri_tbl[62]; 732*ef270ab1SKenneth D. Merry #else 733*ef270ab1SKenneth D. Merry #error big endian version not defined 734*ef270ab1SKenneth D. Merry #endif 735*ef270ab1SKenneth D. Merry } sli4_cmd_release_xri_t; 736*ef270ab1SKenneth D. Merry 737*ef270ab1SKenneth D. Merry /** 738*ef270ab1SKenneth D. Merry * @brief READ_CONFIG - read SLI port configuration parameters 739*ef270ab1SKenneth D. Merry */ 740*ef270ab1SKenneth D. Merry typedef struct sli4_cmd_read_config_s { 741*ef270ab1SKenneth D. Merry sli4_mbox_command_header_t hdr; 742*ef270ab1SKenneth D. Merry } sli4_cmd_read_config_t; 743*ef270ab1SKenneth D. Merry 744*ef270ab1SKenneth D. Merry typedef struct sli4_res_read_config_s { 745*ef270ab1SKenneth D. Merry sli4_mbox_command_header_t hdr; 746*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 747*ef270ab1SKenneth D. Merry uint32_t :31, 748*ef270ab1SKenneth D. Merry ext:1; /** Resource Extents */ 749*ef270ab1SKenneth D. Merry uint32_t :24, 750*ef270ab1SKenneth D. Merry topology:8; 751*ef270ab1SKenneth D. Merry uint32_t rsvd3; 752*ef270ab1SKenneth D. Merry uint32_t e_d_tov:16, 753*ef270ab1SKenneth D. Merry :16; 754*ef270ab1SKenneth D. Merry uint32_t rsvd5; 755*ef270ab1SKenneth D. Merry uint32_t r_a_tov:16, 756*ef270ab1SKenneth D. Merry :16; 757*ef270ab1SKenneth D. Merry uint32_t rsvd7; 758*ef270ab1SKenneth D. Merry uint32_t rsvd8; 759*ef270ab1SKenneth D. Merry uint32_t lmt:16, /** Link Module Type */ 760*ef270ab1SKenneth D. Merry :16; 761*ef270ab1SKenneth D. Merry uint32_t rsvd10; 762*ef270ab1SKenneth D. Merry uint32_t rsvd11; 763*ef270ab1SKenneth D. Merry uint32_t xri_base:16, 764*ef270ab1SKenneth D. Merry xri_count:16; 765*ef270ab1SKenneth D. Merry uint32_t rpi_base:16, 766*ef270ab1SKenneth D. Merry rpi_count:16; 767*ef270ab1SKenneth D. Merry uint32_t vpi_base:16, 768*ef270ab1SKenneth D. Merry vpi_count:16; 769*ef270ab1SKenneth D. Merry uint32_t vfi_base:16, 770*ef270ab1SKenneth D. Merry vfi_count:16; 771*ef270ab1SKenneth D. Merry uint32_t :16, 772*ef270ab1SKenneth D. Merry fcfi_count:16; 773*ef270ab1SKenneth D. Merry uint32_t rq_count:16, 774*ef270ab1SKenneth D. Merry eq_count:16; 775*ef270ab1SKenneth D. Merry uint32_t wq_count:16, 776*ef270ab1SKenneth D. Merry cq_count:16; 777*ef270ab1SKenneth D. Merry uint32_t pad[45]; 778*ef270ab1SKenneth D. Merry #else 779*ef270ab1SKenneth D. Merry #error big endian version not defined 780*ef270ab1SKenneth D. Merry #endif 781*ef270ab1SKenneth D. Merry } sli4_res_read_config_t; 782*ef270ab1SKenneth D. Merry 783*ef270ab1SKenneth D. Merry #define SLI4_READ_CFG_TOPO_FCOE 0x0 /** FCoE topology */ 784*ef270ab1SKenneth D. Merry #define SLI4_READ_CFG_TOPO_FC 0x1 /** FC topology unknown */ 785*ef270ab1SKenneth D. Merry #define SLI4_READ_CFG_TOPO_FC_DA 0x2 /** FC Direct Attach (non FC-AL) topology */ 786*ef270ab1SKenneth D. Merry #define SLI4_READ_CFG_TOPO_FC_AL 0x3 /** FC-AL topology */ 787*ef270ab1SKenneth D. Merry 788*ef270ab1SKenneth D. Merry /** 789*ef270ab1SKenneth D. Merry * @brief READ_NVPARMS - read SLI port configuration parameters 790*ef270ab1SKenneth D. Merry */ 791*ef270ab1SKenneth D. Merry typedef struct sli4_cmd_read_nvparms_s { 792*ef270ab1SKenneth D. Merry sli4_mbox_command_header_t hdr; 793*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 794*ef270ab1SKenneth D. Merry uint32_t rsvd1; 795*ef270ab1SKenneth D. Merry uint32_t rsvd2; 796*ef270ab1SKenneth D. Merry uint32_t rsvd3; 797*ef270ab1SKenneth D. Merry uint32_t rsvd4; 798*ef270ab1SKenneth D. Merry uint8_t wwpn[8]; 799*ef270ab1SKenneth D. Merry uint8_t wwnn[8]; 800*ef270ab1SKenneth D. Merry uint32_t hard_alpa:8, 801*ef270ab1SKenneth D. Merry preferred_d_id:24; 802*ef270ab1SKenneth D. Merry #else 803*ef270ab1SKenneth D. Merry #error big endian version not defined 804*ef270ab1SKenneth D. Merry #endif 805*ef270ab1SKenneth D. Merry } sli4_cmd_read_nvparms_t; 806*ef270ab1SKenneth D. Merry 807*ef270ab1SKenneth D. Merry /** 808*ef270ab1SKenneth D. Merry * @brief WRITE_NVPARMS - write SLI port configuration parameters 809*ef270ab1SKenneth D. Merry */ 810*ef270ab1SKenneth D. Merry typedef struct sli4_cmd_write_nvparms_s { 811*ef270ab1SKenneth D. Merry sli4_mbox_command_header_t hdr; 812*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 813*ef270ab1SKenneth D. Merry uint32_t rsvd1; 814*ef270ab1SKenneth D. Merry uint32_t rsvd2; 815*ef270ab1SKenneth D. Merry uint32_t rsvd3; 816*ef270ab1SKenneth D. Merry uint32_t rsvd4; 817*ef270ab1SKenneth D. Merry uint8_t wwpn[8]; 818*ef270ab1SKenneth D. Merry uint8_t wwnn[8]; 819*ef270ab1SKenneth D. Merry uint32_t hard_alpa:8, 820*ef270ab1SKenneth D. Merry preferred_d_id:24; 821*ef270ab1SKenneth D. Merry #else 822*ef270ab1SKenneth D. Merry #error big endian version not defined 823*ef270ab1SKenneth D. Merry #endif 824*ef270ab1SKenneth D. Merry } sli4_cmd_write_nvparms_t; 825*ef270ab1SKenneth D. Merry 826*ef270ab1SKenneth D. Merry /** 827*ef270ab1SKenneth D. Merry * @brief READ_REV - read the Port revision levels 828*ef270ab1SKenneth D. Merry */ 829*ef270ab1SKenneth D. Merry typedef struct sli4_cmd_read_rev_s { 830*ef270ab1SKenneth D. Merry sli4_mbox_command_header_t hdr; 831*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 832*ef270ab1SKenneth D. Merry uint32_t :16, 833*ef270ab1SKenneth D. Merry sli_level:4, 834*ef270ab1SKenneth D. Merry fcoem:1, 835*ef270ab1SKenneth D. Merry ceev:2, 836*ef270ab1SKenneth D. Merry :6, 837*ef270ab1SKenneth D. Merry vpd:1, 838*ef270ab1SKenneth D. Merry :2; 839*ef270ab1SKenneth D. Merry uint32_t first_hw_revision; 840*ef270ab1SKenneth D. Merry uint32_t second_hw_revision; 841*ef270ab1SKenneth D. Merry uint32_t rsvd4; 842*ef270ab1SKenneth D. Merry uint32_t third_hw_revision; 843*ef270ab1SKenneth D. Merry uint32_t fc_ph_low:8, 844*ef270ab1SKenneth D. Merry fc_ph_high:8, 845*ef270ab1SKenneth D. Merry feature_level_low:8, 846*ef270ab1SKenneth D. Merry feature_level_high:8; 847*ef270ab1SKenneth D. Merry uint32_t rsvd7; 848*ef270ab1SKenneth D. Merry uint32_t first_fw_id; 849*ef270ab1SKenneth D. Merry char first_fw_name[16]; 850*ef270ab1SKenneth D. Merry uint32_t second_fw_id; 851*ef270ab1SKenneth D. Merry char second_fw_name[16]; 852*ef270ab1SKenneth D. Merry uint32_t rsvd18[30]; 853*ef270ab1SKenneth D. Merry uint32_t available_length:24, 854*ef270ab1SKenneth D. Merry :8; 855*ef270ab1SKenneth D. Merry uint32_t physical_address_low; 856*ef270ab1SKenneth D. Merry uint32_t physical_address_high; 857*ef270ab1SKenneth D. Merry uint32_t returned_vpd_length; 858*ef270ab1SKenneth D. Merry uint32_t actual_vpd_length; 859*ef270ab1SKenneth D. Merry #else 860*ef270ab1SKenneth D. Merry #error big endian version not defined 861*ef270ab1SKenneth D. Merry #endif 862*ef270ab1SKenneth D. Merry } sli4_cmd_read_rev_t; 863*ef270ab1SKenneth D. Merry 864*ef270ab1SKenneth D. Merry /** 865*ef270ab1SKenneth D. Merry * @brief READ_SPARM64 - read the Port service parameters 866*ef270ab1SKenneth D. Merry */ 867*ef270ab1SKenneth D. Merry typedef struct sli4_cmd_read_sparm64_s { 868*ef270ab1SKenneth D. Merry sli4_mbox_command_header_t hdr; 869*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 870*ef270ab1SKenneth D. Merry uint32_t rsvd1; 871*ef270ab1SKenneth D. Merry uint32_t rsvd2; 872*ef270ab1SKenneth D. Merry sli4_bde_t bde_64; 873*ef270ab1SKenneth D. Merry uint32_t vpi:16, 874*ef270ab1SKenneth D. Merry :16; 875*ef270ab1SKenneth D. Merry uint32_t port_name_start:16, 876*ef270ab1SKenneth D. Merry port_name_length:16; 877*ef270ab1SKenneth D. Merry uint32_t node_name_start:16, 878*ef270ab1SKenneth D. Merry node_name_length:16; 879*ef270ab1SKenneth D. Merry #else 880*ef270ab1SKenneth D. Merry #error big endian version not defined 881*ef270ab1SKenneth D. Merry #endif 882*ef270ab1SKenneth D. Merry } sli4_cmd_read_sparm64_t; 883*ef270ab1SKenneth D. Merry 884*ef270ab1SKenneth D. Merry #define SLI4_READ_SPARM64_VPI_DEFAULT 0 885*ef270ab1SKenneth D. Merry #define SLI4_READ_SPARM64_VPI_SPECIAL UINT16_MAX 886*ef270ab1SKenneth D. Merry 887*ef270ab1SKenneth D. Merry #define SLI4_READ_SPARM64_WWPN_OFFSET (4 * sizeof(uint32_t)) 888*ef270ab1SKenneth D. Merry #define SLI4_READ_SPARM64_WWNN_OFFSET (SLI4_READ_SPARM64_WWPN_OFFSET + sizeof(uint64_t)) 889*ef270ab1SKenneth D. Merry 890*ef270ab1SKenneth D. Merry typedef struct sli4_port_state_s { 891*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 892*ef270ab1SKenneth D. Merry uint32_t nx_port_recv_state:2, 893*ef270ab1SKenneth D. Merry nx_port_trans_state:2, 894*ef270ab1SKenneth D. Merry nx_port_state_machine:4, 895*ef270ab1SKenneth D. Merry link_speed:8, 896*ef270ab1SKenneth D. Merry :14, 897*ef270ab1SKenneth D. Merry tf:1, 898*ef270ab1SKenneth D. Merry lu:1; 899*ef270ab1SKenneth D. Merry #else 900*ef270ab1SKenneth D. Merry #error big endian version not defined 901*ef270ab1SKenneth D. Merry #endif 902*ef270ab1SKenneth D. Merry } sli4_port_state_t; 903*ef270ab1SKenneth D. Merry 904*ef270ab1SKenneth D. Merry /** 905*ef270ab1SKenneth D. Merry * @brief READ_TOPOLOGY - read the link event information 906*ef270ab1SKenneth D. Merry */ 907*ef270ab1SKenneth D. Merry typedef struct sli4_cmd_read_topology_s { 908*ef270ab1SKenneth D. Merry sli4_mbox_command_header_t hdr; 909*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 910*ef270ab1SKenneth D. Merry uint32_t event_tag; 911*ef270ab1SKenneth D. Merry uint32_t attention_type:8, 912*ef270ab1SKenneth D. Merry il:1, 913*ef270ab1SKenneth D. Merry pb_recvd:1, 914*ef270ab1SKenneth D. Merry :22; 915*ef270ab1SKenneth D. Merry uint32_t topology:8, 916*ef270ab1SKenneth D. Merry lip_type:8, 917*ef270ab1SKenneth D. Merry lip_al_ps:8, 918*ef270ab1SKenneth D. Merry al_pa_granted:8; 919*ef270ab1SKenneth D. Merry sli4_bde_t bde_loop_map; 920*ef270ab1SKenneth D. Merry sli4_port_state_t link_down; 921*ef270ab1SKenneth D. Merry sli4_port_state_t link_current; 922*ef270ab1SKenneth D. Merry uint32_t max_bbc:8, 923*ef270ab1SKenneth D. Merry init_bbc:8, 924*ef270ab1SKenneth D. Merry bbscn:4, 925*ef270ab1SKenneth D. Merry cbbscn:4, 926*ef270ab1SKenneth D. Merry :8; 927*ef270ab1SKenneth D. Merry uint32_t r_t_tov:9, 928*ef270ab1SKenneth D. Merry :3, 929*ef270ab1SKenneth D. Merry al_tov:4, 930*ef270ab1SKenneth D. Merry lp_tov:16; 931*ef270ab1SKenneth D. Merry uint32_t acquired_al_pa:8, 932*ef270ab1SKenneth D. Merry :7, 933*ef270ab1SKenneth D. Merry pb:1, 934*ef270ab1SKenneth D. Merry specified_al_pa:16; 935*ef270ab1SKenneth D. Merry uint32_t initial_n_port_id:24, 936*ef270ab1SKenneth D. Merry :8; 937*ef270ab1SKenneth D. Merry #else 938*ef270ab1SKenneth D. Merry #error big endian version not defined 939*ef270ab1SKenneth D. Merry #endif 940*ef270ab1SKenneth D. Merry } sli4_cmd_read_topology_t; 941*ef270ab1SKenneth D. Merry 942*ef270ab1SKenneth D. Merry #define SLI4_MIN_LOOP_MAP_BYTES 128 943*ef270ab1SKenneth D. Merry 944*ef270ab1SKenneth D. Merry #define SLI4_READ_TOPOLOGY_LINK_UP 0x1 945*ef270ab1SKenneth D. Merry #define SLI4_READ_TOPOLOGY_LINK_DOWN 0x2 946*ef270ab1SKenneth D. Merry #define SLI4_READ_TOPOLOGY_LINK_NO_ALPA 0x3 947*ef270ab1SKenneth D. Merry 948*ef270ab1SKenneth D. Merry #define SLI4_READ_TOPOLOGY_UNKNOWN 0x0 949*ef270ab1SKenneth D. Merry #define SLI4_READ_TOPOLOGY_NPORT 0x1 950*ef270ab1SKenneth D. Merry #define SLI4_READ_TOPOLOGY_FC_AL 0x2 951*ef270ab1SKenneth D. Merry 952*ef270ab1SKenneth D. Merry #define SLI4_READ_TOPOLOGY_SPEED_NONE 0x00 953*ef270ab1SKenneth D. Merry #define SLI4_READ_TOPOLOGY_SPEED_1G 0x04 954*ef270ab1SKenneth D. Merry #define SLI4_READ_TOPOLOGY_SPEED_2G 0x08 955*ef270ab1SKenneth D. Merry #define SLI4_READ_TOPOLOGY_SPEED_4G 0x10 956*ef270ab1SKenneth D. Merry #define SLI4_READ_TOPOLOGY_SPEED_8G 0x20 957*ef270ab1SKenneth D. Merry #define SLI4_READ_TOPOLOGY_SPEED_10G 0x40 958*ef270ab1SKenneth D. Merry #define SLI4_READ_TOPOLOGY_SPEED_16G 0x80 959*ef270ab1SKenneth D. Merry #define SLI4_READ_TOPOLOGY_SPEED_32G 0x90 960*ef270ab1SKenneth D. Merry 961*ef270ab1SKenneth D. Merry /** 962*ef270ab1SKenneth D. Merry * @brief REG_FCFI - activate a FC Forwarder 963*ef270ab1SKenneth D. Merry */ 964*ef270ab1SKenneth D. Merry #define SLI4_CMD_REG_FCFI_NUM_RQ_CFG 4 965*ef270ab1SKenneth D. Merry typedef struct sli4_cmd_reg_fcfi_s { 966*ef270ab1SKenneth D. Merry sli4_mbox_command_header_t hdr; 967*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 968*ef270ab1SKenneth D. Merry uint32_t fcf_index:16, 969*ef270ab1SKenneth D. Merry fcfi:16; 970*ef270ab1SKenneth D. Merry uint32_t rq_id_1:16, 971*ef270ab1SKenneth D. Merry rq_id_0:16; 972*ef270ab1SKenneth D. Merry uint32_t rq_id_3:16, 973*ef270ab1SKenneth D. Merry rq_id_2:16; 974*ef270ab1SKenneth D. Merry struct { 975*ef270ab1SKenneth D. Merry uint32_t r_ctl_mask:8, 976*ef270ab1SKenneth D. Merry r_ctl_match:8, 977*ef270ab1SKenneth D. Merry type_mask:8, 978*ef270ab1SKenneth D. Merry type_match:8; 979*ef270ab1SKenneth D. Merry } rq_cfg[SLI4_CMD_REG_FCFI_NUM_RQ_CFG]; 980*ef270ab1SKenneth D. Merry uint32_t vlan_tag:12, 981*ef270ab1SKenneth D. Merry vv:1, 982*ef270ab1SKenneth D. Merry :19; 983*ef270ab1SKenneth D. Merry #else 984*ef270ab1SKenneth D. Merry #error big endian version not defined 985*ef270ab1SKenneth D. Merry #endif 986*ef270ab1SKenneth D. Merry } sli4_cmd_reg_fcfi_t; 987*ef270ab1SKenneth D. Merry 988*ef270ab1SKenneth D. Merry #define SLI4_CMD_REG_FCFI_MRQ_NUM_RQ_CFG 4 989*ef270ab1SKenneth D. Merry #define SLI4_CMD_REG_FCFI_MRQ_MAX_NUM_RQ 32 990*ef270ab1SKenneth D. Merry #define SLI4_CMD_REG_FCFI_SET_FCFI_MODE 0 991*ef270ab1SKenneth D. Merry #define SLI4_CMD_REG_FCFI_SET_MRQ_MODE 1 992*ef270ab1SKenneth D. Merry 993*ef270ab1SKenneth D. Merry typedef struct sli4_cmd_reg_fcfi_mrq_s { 994*ef270ab1SKenneth D. Merry sli4_mbox_command_header_t hdr; 995*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 996*ef270ab1SKenneth D. Merry uint32_t fcf_index:16, 997*ef270ab1SKenneth D. Merry fcfi:16; 998*ef270ab1SKenneth D. Merry 999*ef270ab1SKenneth D. Merry uint32_t rq_id_1:16, 1000*ef270ab1SKenneth D. Merry rq_id_0:16; 1001*ef270ab1SKenneth D. Merry 1002*ef270ab1SKenneth D. Merry uint32_t rq_id_3:16, 1003*ef270ab1SKenneth D. Merry rq_id_2:16; 1004*ef270ab1SKenneth D. Merry 1005*ef270ab1SKenneth D. Merry struct { 1006*ef270ab1SKenneth D. Merry uint32_t r_ctl_mask:8, 1007*ef270ab1SKenneth D. Merry r_ctl_match:8, 1008*ef270ab1SKenneth D. Merry type_mask:8, 1009*ef270ab1SKenneth D. Merry type_match:8; 1010*ef270ab1SKenneth D. Merry } rq_cfg[SLI4_CMD_REG_FCFI_MRQ_NUM_RQ_CFG]; 1011*ef270ab1SKenneth D. Merry 1012*ef270ab1SKenneth D. Merry uint32_t vlan_tag:12, 1013*ef270ab1SKenneth D. Merry vv:1, 1014*ef270ab1SKenneth D. Merry mode:1, 1015*ef270ab1SKenneth D. Merry :18; 1016*ef270ab1SKenneth D. Merry 1017*ef270ab1SKenneth D. Merry uint32_t num_mrq_pairs:8, 1018*ef270ab1SKenneth D. Merry mrq_filter_bitmask:4, 1019*ef270ab1SKenneth D. Merry rq_selection_policy:4, 1020*ef270ab1SKenneth D. Merry :16; 1021*ef270ab1SKenneth D. Merry #endif 1022*ef270ab1SKenneth D. Merry } sli4_cmd_reg_fcfi_mrq_t; 1023*ef270ab1SKenneth D. Merry 1024*ef270ab1SKenneth D. Merry /** 1025*ef270ab1SKenneth D. Merry * @brief REG_RPI - register a Remote Port Indicator 1026*ef270ab1SKenneth D. Merry */ 1027*ef270ab1SKenneth D. Merry typedef struct sli4_cmd_reg_rpi_s { 1028*ef270ab1SKenneth D. Merry sli4_mbox_command_header_t hdr; 1029*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1030*ef270ab1SKenneth D. Merry uint32_t rpi:16, 1031*ef270ab1SKenneth D. Merry :16; 1032*ef270ab1SKenneth D. Merry uint32_t remote_n_port_id:24, 1033*ef270ab1SKenneth D. Merry upd:1, 1034*ef270ab1SKenneth D. Merry :2, 1035*ef270ab1SKenneth D. Merry etow:1, 1036*ef270ab1SKenneth D. Merry :1, 1037*ef270ab1SKenneth D. Merry terp:1, 1038*ef270ab1SKenneth D. Merry :1, 1039*ef270ab1SKenneth D. Merry ci:1; 1040*ef270ab1SKenneth D. Merry sli4_bde_t bde_64; 1041*ef270ab1SKenneth D. Merry uint32_t vpi:16, 1042*ef270ab1SKenneth D. Merry :16; 1043*ef270ab1SKenneth D. Merry #else 1044*ef270ab1SKenneth D. Merry #error big endian version not defined 1045*ef270ab1SKenneth D. Merry #endif 1046*ef270ab1SKenneth D. Merry } sli4_cmd_reg_rpi_t; 1047*ef270ab1SKenneth D. Merry #define SLI4_REG_RPI_BUF_LEN 0x70 1048*ef270ab1SKenneth D. Merry 1049*ef270ab1SKenneth D. Merry 1050*ef270ab1SKenneth D. Merry /** 1051*ef270ab1SKenneth D. Merry * @brief REG_VFI - register a Virtual Fabric Indicator 1052*ef270ab1SKenneth D. Merry */ 1053*ef270ab1SKenneth D. Merry typedef struct sli4_cmd_reg_vfi_s { 1054*ef270ab1SKenneth D. Merry sli4_mbox_command_header_t hdr; 1055*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1056*ef270ab1SKenneth D. Merry uint32_t vfi:16, 1057*ef270ab1SKenneth D. Merry :12, 1058*ef270ab1SKenneth D. Merry vp:1, 1059*ef270ab1SKenneth D. Merry upd:1, 1060*ef270ab1SKenneth D. Merry :2; 1061*ef270ab1SKenneth D. Merry uint32_t fcfi:16, 1062*ef270ab1SKenneth D. Merry vpi:16; /* vp=TRUE */ 1063*ef270ab1SKenneth D. Merry uint8_t wwpn[8]; /* vp=TRUE */ 1064*ef270ab1SKenneth D. Merry sli4_bde_t sparm; /* either FLOGI or PLOGI */ 1065*ef270ab1SKenneth D. Merry uint32_t e_d_tov; 1066*ef270ab1SKenneth D. Merry uint32_t r_a_tov; 1067*ef270ab1SKenneth D. Merry uint32_t local_n_port_id:24, /* vp=TRUE */ 1068*ef270ab1SKenneth D. Merry :8; 1069*ef270ab1SKenneth D. Merry #else 1070*ef270ab1SKenneth D. Merry #error big endian version not defined 1071*ef270ab1SKenneth D. Merry #endif 1072*ef270ab1SKenneth D. Merry } sli4_cmd_reg_vfi_t; 1073*ef270ab1SKenneth D. Merry 1074*ef270ab1SKenneth D. Merry /** 1075*ef270ab1SKenneth D. Merry * @brief REG_VPI - register a Virtual Port Indicator 1076*ef270ab1SKenneth D. Merry */ 1077*ef270ab1SKenneth D. Merry typedef struct sli4_cmd_reg_vpi_s { 1078*ef270ab1SKenneth D. Merry sli4_mbox_command_header_t hdr; 1079*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1080*ef270ab1SKenneth D. Merry uint32_t rsvd1; 1081*ef270ab1SKenneth D. Merry uint32_t local_n_port_id:24, 1082*ef270ab1SKenneth D. Merry upd:1, 1083*ef270ab1SKenneth D. Merry :7; 1084*ef270ab1SKenneth D. Merry uint8_t wwpn[8]; 1085*ef270ab1SKenneth D. Merry uint32_t rsvd5; 1086*ef270ab1SKenneth D. Merry uint32_t vpi:16, 1087*ef270ab1SKenneth D. Merry vfi:16; 1088*ef270ab1SKenneth D. Merry #else 1089*ef270ab1SKenneth D. Merry #error big endian version not defined 1090*ef270ab1SKenneth D. Merry #endif 1091*ef270ab1SKenneth D. Merry } sli4_cmd_reg_vpi_t; 1092*ef270ab1SKenneth D. Merry 1093*ef270ab1SKenneth D. Merry /** 1094*ef270ab1SKenneth D. Merry * @brief REQUEST_FEATURES - request / query SLI features 1095*ef270ab1SKenneth D. Merry */ 1096*ef270ab1SKenneth D. Merry typedef union { 1097*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1098*ef270ab1SKenneth D. Merry struct { 1099*ef270ab1SKenneth D. Merry uint32_t iaab:1, /** inhibit auto-ABTS originator */ 1100*ef270ab1SKenneth D. Merry npiv:1, /** NPIV support */ 1101*ef270ab1SKenneth D. Merry dif:1, /** DIF/DIX support */ 1102*ef270ab1SKenneth D. Merry vf:1, /** virtual fabric support */ 1103*ef270ab1SKenneth D. Merry fcpi:1, /** FCP initiator support */ 1104*ef270ab1SKenneth D. Merry fcpt:1, /** FCP target support */ 1105*ef270ab1SKenneth D. Merry fcpc:1, /** combined FCP initiator/target */ 1106*ef270ab1SKenneth D. Merry :1, 1107*ef270ab1SKenneth D. Merry rqd:1, /** recovery qualified delay */ 1108*ef270ab1SKenneth D. Merry iaar:1, /** inhibit auto-ABTS responder */ 1109*ef270ab1SKenneth D. Merry hlm:1, /** High Login Mode */ 1110*ef270ab1SKenneth D. Merry perfh:1, /** performance hints */ 1111*ef270ab1SKenneth D. Merry rxseq:1, /** RX Sequence Coalescing */ 1112*ef270ab1SKenneth D. Merry rxri:1, /** Release XRI variant of Coalescing */ 1113*ef270ab1SKenneth D. Merry dcl2:1, /** Disable Class 2 */ 1114*ef270ab1SKenneth D. Merry rsco:1, /** Receive Sequence Coalescing Optimizations */ 1115*ef270ab1SKenneth D. Merry mrqp:1, /** Multi RQ Pair Mode Support */ 1116*ef270ab1SKenneth D. Merry :15; 1117*ef270ab1SKenneth D. Merry } flag; 1118*ef270ab1SKenneth D. Merry uint32_t dword; 1119*ef270ab1SKenneth D. Merry #else 1120*ef270ab1SKenneth D. Merry #error big endian version not defined 1121*ef270ab1SKenneth D. Merry #endif 1122*ef270ab1SKenneth D. Merry } sli4_features_t; 1123*ef270ab1SKenneth D. Merry 1124*ef270ab1SKenneth D. Merry typedef struct sli4_cmd_request_features_s { 1125*ef270ab1SKenneth D. Merry sli4_mbox_command_header_t hdr; 1126*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1127*ef270ab1SKenneth D. Merry uint32_t qry:1, 1128*ef270ab1SKenneth D. Merry :31; 1129*ef270ab1SKenneth D. Merry #else 1130*ef270ab1SKenneth D. Merry #error big endian version not defined 1131*ef270ab1SKenneth D. Merry #endif 1132*ef270ab1SKenneth D. Merry sli4_features_t command; 1133*ef270ab1SKenneth D. Merry sli4_features_t response; 1134*ef270ab1SKenneth D. Merry } sli4_cmd_request_features_t; 1135*ef270ab1SKenneth D. Merry 1136*ef270ab1SKenneth D. Merry /** 1137*ef270ab1SKenneth D. Merry * @brief SLI_CONFIG - submit a configuration command to Port 1138*ef270ab1SKenneth D. Merry * 1139*ef270ab1SKenneth D. Merry * Command is either embedded as part of the payload (embed) or located 1140*ef270ab1SKenneth D. Merry * in a separate memory buffer (mem) 1141*ef270ab1SKenneth D. Merry */ 1142*ef270ab1SKenneth D. Merry 1143*ef270ab1SKenneth D. Merry 1144*ef270ab1SKenneth D. Merry typedef struct sli4_sli_config_pmd_s { 1145*ef270ab1SKenneth D. Merry uint32_t address_low; 1146*ef270ab1SKenneth D. Merry uint32_t address_high; 1147*ef270ab1SKenneth D. Merry uint32_t length:24, 1148*ef270ab1SKenneth D. Merry :8; 1149*ef270ab1SKenneth D. Merry } sli4_sli_config_pmd_t; 1150*ef270ab1SKenneth D. Merry 1151*ef270ab1SKenneth D. Merry typedef struct sli4_cmd_sli_config_s { 1152*ef270ab1SKenneth D. Merry sli4_mbox_command_header_t hdr; 1153*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1154*ef270ab1SKenneth D. Merry uint32_t emb:1, 1155*ef270ab1SKenneth D. Merry :2, 1156*ef270ab1SKenneth D. Merry pmd_count:5, 1157*ef270ab1SKenneth D. Merry :24; 1158*ef270ab1SKenneth D. Merry uint32_t payload_length; 1159*ef270ab1SKenneth D. Merry uint32_t rsvd3; 1160*ef270ab1SKenneth D. Merry uint32_t rsvd4; 1161*ef270ab1SKenneth D. Merry uint32_t rsvd5; 1162*ef270ab1SKenneth D. Merry union { 1163*ef270ab1SKenneth D. Merry uint8_t embed[58 * sizeof(uint32_t)]; 1164*ef270ab1SKenneth D. Merry sli4_sli_config_pmd_t mem; 1165*ef270ab1SKenneth D. Merry } payload; 1166*ef270ab1SKenneth D. Merry #else 1167*ef270ab1SKenneth D. Merry #error big endian version not defined 1168*ef270ab1SKenneth D. Merry #endif 1169*ef270ab1SKenneth D. Merry } sli4_cmd_sli_config_t; 1170*ef270ab1SKenneth D. Merry 1171*ef270ab1SKenneth D. Merry /** 1172*ef270ab1SKenneth D. Merry * @brief READ_STATUS - read tx/rx status of a particular port 1173*ef270ab1SKenneth D. Merry * 1174*ef270ab1SKenneth D. Merry */ 1175*ef270ab1SKenneth D. Merry 1176*ef270ab1SKenneth D. Merry typedef struct sli4_cmd_read_status_s { 1177*ef270ab1SKenneth D. Merry sli4_mbox_command_header_t hdr; 1178*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1179*ef270ab1SKenneth D. Merry uint32_t cc:1, 1180*ef270ab1SKenneth D. Merry :31; 1181*ef270ab1SKenneth D. Merry uint32_t rsvd2; 1182*ef270ab1SKenneth D. Merry uint32_t transmit_kbyte_count; 1183*ef270ab1SKenneth D. Merry uint32_t receive_kbyte_count; 1184*ef270ab1SKenneth D. Merry uint32_t transmit_frame_count; 1185*ef270ab1SKenneth D. Merry uint32_t receive_frame_count; 1186*ef270ab1SKenneth D. Merry uint32_t transmit_sequence_count; 1187*ef270ab1SKenneth D. Merry uint32_t receive_sequence_count; 1188*ef270ab1SKenneth D. Merry uint32_t total_exchanges_originator; 1189*ef270ab1SKenneth D. Merry uint32_t total_exchanges_responder; 1190*ef270ab1SKenneth D. Merry uint32_t receive_p_bsy_count; 1191*ef270ab1SKenneth D. Merry uint32_t receive_f_bsy_count; 1192*ef270ab1SKenneth D. Merry uint32_t dropped_frames_due_to_no_rq_buffer_count; 1193*ef270ab1SKenneth D. Merry uint32_t empty_rq_timeout_count; 1194*ef270ab1SKenneth D. Merry uint32_t dropped_frames_due_to_no_xri_count; 1195*ef270ab1SKenneth D. Merry uint32_t empty_xri_pool_count; 1196*ef270ab1SKenneth D. Merry 1197*ef270ab1SKenneth D. Merry #else 1198*ef270ab1SKenneth D. Merry #error big endian version not defined 1199*ef270ab1SKenneth D. Merry #endif 1200*ef270ab1SKenneth D. Merry } sli4_cmd_read_status_t; 1201*ef270ab1SKenneth D. Merry 1202*ef270ab1SKenneth D. Merry /** 1203*ef270ab1SKenneth D. Merry * @brief READ_LNK_STAT - read link status of a particular port 1204*ef270ab1SKenneth D. Merry * 1205*ef270ab1SKenneth D. Merry */ 1206*ef270ab1SKenneth D. Merry 1207*ef270ab1SKenneth D. Merry typedef struct sli4_cmd_read_link_stats_s { 1208*ef270ab1SKenneth D. Merry sli4_mbox_command_header_t hdr; 1209*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1210*ef270ab1SKenneth D. Merry uint32_t rec:1, 1211*ef270ab1SKenneth D. Merry gec:1, 1212*ef270ab1SKenneth D. Merry w02of:1, 1213*ef270ab1SKenneth D. Merry w03of:1, 1214*ef270ab1SKenneth D. Merry w04of:1, 1215*ef270ab1SKenneth D. Merry w05of:1, 1216*ef270ab1SKenneth D. Merry w06of:1, 1217*ef270ab1SKenneth D. Merry w07of:1, 1218*ef270ab1SKenneth D. Merry w08of:1, 1219*ef270ab1SKenneth D. Merry w09of:1, 1220*ef270ab1SKenneth D. Merry w10of:1, 1221*ef270ab1SKenneth D. Merry w11of:1, 1222*ef270ab1SKenneth D. Merry w12of:1, 1223*ef270ab1SKenneth D. Merry w13of:1, 1224*ef270ab1SKenneth D. Merry w14of:1, 1225*ef270ab1SKenneth D. Merry w15of:1, 1226*ef270ab1SKenneth D. Merry w16of:1, 1227*ef270ab1SKenneth D. Merry w17of:1, 1228*ef270ab1SKenneth D. Merry w18of:1, 1229*ef270ab1SKenneth D. Merry w19of:1, 1230*ef270ab1SKenneth D. Merry w20of:1, 1231*ef270ab1SKenneth D. Merry w21of:1, 1232*ef270ab1SKenneth D. Merry resv0:8, 1233*ef270ab1SKenneth D. Merry clrc:1, 1234*ef270ab1SKenneth D. Merry clof:1; 1235*ef270ab1SKenneth D. Merry uint32_t link_failure_error_count; 1236*ef270ab1SKenneth D. Merry uint32_t loss_of_sync_error_count; 1237*ef270ab1SKenneth D. Merry uint32_t loss_of_signal_error_count; 1238*ef270ab1SKenneth D. Merry uint32_t primitive_sequence_error_count; 1239*ef270ab1SKenneth D. Merry uint32_t invalid_transmission_word_error_count; 1240*ef270ab1SKenneth D. Merry uint32_t crc_error_count; 1241*ef270ab1SKenneth D. Merry uint32_t primitive_sequence_event_timeout_count; 1242*ef270ab1SKenneth D. Merry uint32_t elastic_buffer_overrun_error_count; 1243*ef270ab1SKenneth D. Merry uint32_t arbitration_fc_al_timout_count; 1244*ef270ab1SKenneth D. Merry uint32_t advertised_receive_bufftor_to_buffer_credit; 1245*ef270ab1SKenneth D. Merry uint32_t current_receive_buffer_to_buffer_credit; 1246*ef270ab1SKenneth D. Merry uint32_t advertised_transmit_buffer_to_buffer_credit; 1247*ef270ab1SKenneth D. Merry uint32_t current_transmit_buffer_to_buffer_credit; 1248*ef270ab1SKenneth D. Merry uint32_t received_eofa_count; 1249*ef270ab1SKenneth D. Merry uint32_t received_eofdti_count; 1250*ef270ab1SKenneth D. Merry uint32_t received_eofni_count; 1251*ef270ab1SKenneth D. Merry uint32_t received_soff_count; 1252*ef270ab1SKenneth D. Merry uint32_t received_dropped_no_aer_count; 1253*ef270ab1SKenneth D. Merry uint32_t received_dropped_no_available_rpi_resources_count; 1254*ef270ab1SKenneth D. Merry uint32_t received_dropped_no_available_xri_resources_count; 1255*ef270ab1SKenneth D. Merry 1256*ef270ab1SKenneth D. Merry #else 1257*ef270ab1SKenneth D. Merry #error big endian version not defined 1258*ef270ab1SKenneth D. Merry #endif 1259*ef270ab1SKenneth D. Merry } sli4_cmd_read_link_stats_t; 1260*ef270ab1SKenneth D. Merry 1261*ef270ab1SKenneth D. Merry /** 1262*ef270ab1SKenneth D. Merry * @brief Format a WQE with WQ_ID Association performance hint 1263*ef270ab1SKenneth D. Merry * 1264*ef270ab1SKenneth D. Merry * @par Description 1265*ef270ab1SKenneth D. Merry * PHWQ works by over-writing part of Word 10 in the WQE with the WQ ID. 1266*ef270ab1SKenneth D. Merry * 1267*ef270ab1SKenneth D. Merry * @param entry Pointer to the WQE. 1268*ef270ab1SKenneth D. Merry * @param q_id Queue ID. 1269*ef270ab1SKenneth D. Merry * 1270*ef270ab1SKenneth D. Merry * @return None. 1271*ef270ab1SKenneth D. Merry */ 1272*ef270ab1SKenneth D. Merry static inline void 1273*ef270ab1SKenneth D. Merry sli_set_wq_id_association(void *entry, uint16_t q_id) 1274*ef270ab1SKenneth D. Merry { 1275*ef270ab1SKenneth D. Merry uint32_t *wqe = entry; 1276*ef270ab1SKenneth D. Merry 1277*ef270ab1SKenneth D. Merry /* 1278*ef270ab1SKenneth D. Merry * Set Word 10, bit 0 to zero 1279*ef270ab1SKenneth D. Merry * Set Word 10, bits 15:1 to the WQ ID 1280*ef270ab1SKenneth D. Merry */ 1281*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1282*ef270ab1SKenneth D. Merry wqe[10] &= ~0xffff; 1283*ef270ab1SKenneth D. Merry wqe[10] |= q_id << 1; 1284*ef270ab1SKenneth D. Merry #else 1285*ef270ab1SKenneth D. Merry #error big endian version not defined 1286*ef270ab1SKenneth D. Merry #endif 1287*ef270ab1SKenneth D. Merry } 1288*ef270ab1SKenneth D. Merry 1289*ef270ab1SKenneth D. Merry /** 1290*ef270ab1SKenneth D. Merry * @brief UNREG_FCFI - unregister a FCFI 1291*ef270ab1SKenneth D. Merry */ 1292*ef270ab1SKenneth D. Merry typedef struct sli4_cmd_unreg_fcfi_s { 1293*ef270ab1SKenneth D. Merry sli4_mbox_command_header_t hdr; 1294*ef270ab1SKenneth D. Merry uint32_t rsvd1; 1295*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1296*ef270ab1SKenneth D. Merry uint32_t fcfi:16, 1297*ef270ab1SKenneth D. Merry :16; 1298*ef270ab1SKenneth D. Merry #else 1299*ef270ab1SKenneth D. Merry #error big endian version not defined 1300*ef270ab1SKenneth D. Merry #endif 1301*ef270ab1SKenneth D. Merry } sli4_cmd_unreg_fcfi_t; 1302*ef270ab1SKenneth D. Merry 1303*ef270ab1SKenneth D. Merry /** 1304*ef270ab1SKenneth D. Merry * @brief UNREG_RPI - unregister one or more RPI 1305*ef270ab1SKenneth D. Merry */ 1306*ef270ab1SKenneth D. Merry typedef struct sli4_cmd_unreg_rpi_s { 1307*ef270ab1SKenneth D. Merry sli4_mbox_command_header_t hdr; 1308*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1309*ef270ab1SKenneth D. Merry uint32_t index:16, 1310*ef270ab1SKenneth D. Merry :13, 1311*ef270ab1SKenneth D. Merry dp:1, 1312*ef270ab1SKenneth D. Merry ii:2; 1313*ef270ab1SKenneth D. Merry uint32_t destination_n_port_id:24, 1314*ef270ab1SKenneth D. Merry :8; 1315*ef270ab1SKenneth D. Merry #else 1316*ef270ab1SKenneth D. Merry #error big endian version not defined 1317*ef270ab1SKenneth D. Merry #endif 1318*ef270ab1SKenneth D. Merry } sli4_cmd_unreg_rpi_t; 1319*ef270ab1SKenneth D. Merry 1320*ef270ab1SKenneth D. Merry #define SLI4_UNREG_RPI_II_RPI 0x0 1321*ef270ab1SKenneth D. Merry #define SLI4_UNREG_RPI_II_VPI 0x1 1322*ef270ab1SKenneth D. Merry #define SLI4_UNREG_RPI_II_VFI 0x2 1323*ef270ab1SKenneth D. Merry #define SLI4_UNREG_RPI_II_FCFI 0x3 1324*ef270ab1SKenneth D. Merry 1325*ef270ab1SKenneth D. Merry /** 1326*ef270ab1SKenneth D. Merry * @brief UNREG_VFI - unregister one or more VFI 1327*ef270ab1SKenneth D. Merry */ 1328*ef270ab1SKenneth D. Merry typedef struct sli4_cmd_unreg_vfi_s { 1329*ef270ab1SKenneth D. Merry sli4_mbox_command_header_t hdr; 1330*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1331*ef270ab1SKenneth D. Merry uint32_t rsvd1; 1332*ef270ab1SKenneth D. Merry uint32_t index:16, 1333*ef270ab1SKenneth D. Merry :14, 1334*ef270ab1SKenneth D. Merry ii:2; 1335*ef270ab1SKenneth D. Merry #else 1336*ef270ab1SKenneth D. Merry #error big endian version not defined 1337*ef270ab1SKenneth D. Merry #endif 1338*ef270ab1SKenneth D. Merry } sli4_cmd_unreg_vfi_t; 1339*ef270ab1SKenneth D. Merry 1340*ef270ab1SKenneth D. Merry #define SLI4_UNREG_VFI_II_VFI 0x0 1341*ef270ab1SKenneth D. Merry #define SLI4_UNREG_VFI_II_FCFI 0x3 1342*ef270ab1SKenneth D. Merry 1343*ef270ab1SKenneth D. Merry enum { 1344*ef270ab1SKenneth D. Merry SLI4_UNREG_TYPE_PORT, 1345*ef270ab1SKenneth D. Merry SLI4_UNREG_TYPE_DOMAIN, 1346*ef270ab1SKenneth D. Merry SLI4_UNREG_TYPE_FCF, 1347*ef270ab1SKenneth D. Merry SLI4_UNREG_TYPE_ALL 1348*ef270ab1SKenneth D. Merry }; 1349*ef270ab1SKenneth D. Merry 1350*ef270ab1SKenneth D. Merry /** 1351*ef270ab1SKenneth D. Merry * @brief UNREG_VPI - unregister one or more VPI 1352*ef270ab1SKenneth D. Merry */ 1353*ef270ab1SKenneth D. Merry typedef struct sli4_cmd_unreg_vpi_s { 1354*ef270ab1SKenneth D. Merry sli4_mbox_command_header_t hdr; 1355*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1356*ef270ab1SKenneth D. Merry uint32_t rsvd1; 1357*ef270ab1SKenneth D. Merry uint32_t index:16, 1358*ef270ab1SKenneth D. Merry :14, 1359*ef270ab1SKenneth D. Merry ii:2; 1360*ef270ab1SKenneth D. Merry #else 1361*ef270ab1SKenneth D. Merry #error big endian version not defined 1362*ef270ab1SKenneth D. Merry #endif 1363*ef270ab1SKenneth D. Merry } sli4_cmd_unreg_vpi_t; 1364*ef270ab1SKenneth D. Merry 1365*ef270ab1SKenneth D. Merry #define SLI4_UNREG_VPI_II_VPI 0x0 1366*ef270ab1SKenneth D. Merry #define SLI4_UNREG_VPI_II_VFI 0x2 1367*ef270ab1SKenneth D. Merry #define SLI4_UNREG_VPI_II_FCFI 0x3 1368*ef270ab1SKenneth D. Merry 1369*ef270ab1SKenneth D. Merry 1370*ef270ab1SKenneth D. Merry /** 1371*ef270ab1SKenneth D. Merry * @brief AUTO_XFER_RDY - Configure the auto-generate XFER-RDY feature. 1372*ef270ab1SKenneth D. Merry */ 1373*ef270ab1SKenneth D. Merry typedef struct sli4_cmd_config_auto_xfer_rdy_s { 1374*ef270ab1SKenneth D. Merry sli4_mbox_command_header_t hdr; 1375*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1376*ef270ab1SKenneth D. Merry uint32_t resv; 1377*ef270ab1SKenneth D. Merry uint32_t max_burst_len; 1378*ef270ab1SKenneth D. Merry #else 1379*ef270ab1SKenneth D. Merry #error big endian version not defined 1380*ef270ab1SKenneth D. Merry #endif 1381*ef270ab1SKenneth D. Merry } sli4_cmd_config_auto_xfer_rdy_t; 1382*ef270ab1SKenneth D. Merry 1383*ef270ab1SKenneth D. Merry typedef struct sli4_cmd_config_auto_xfer_rdy_hp_s { 1384*ef270ab1SKenneth D. Merry sli4_mbox_command_header_t hdr; 1385*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1386*ef270ab1SKenneth D. Merry uint32_t resv; 1387*ef270ab1SKenneth D. Merry uint32_t max_burst_len; 1388*ef270ab1SKenneth D. Merry uint32_t esoc:1, 1389*ef270ab1SKenneth D. Merry :31; 1390*ef270ab1SKenneth D. Merry uint32_t block_size:16, 1391*ef270ab1SKenneth D. Merry :16; 1392*ef270ab1SKenneth D. Merry #else 1393*ef270ab1SKenneth D. Merry #error big endian version not defined 1394*ef270ab1SKenneth D. Merry #endif 1395*ef270ab1SKenneth D. Merry } sli4_cmd_config_auto_xfer_rdy_hp_t; 1396*ef270ab1SKenneth D. Merry 1397*ef270ab1SKenneth D. Merry 1398*ef270ab1SKenneth D. Merry /************************************************************************* 1399*ef270ab1SKenneth D. Merry * SLI-4 common configuration command formats and definitions 1400*ef270ab1SKenneth D. Merry */ 1401*ef270ab1SKenneth D. Merry 1402*ef270ab1SKenneth D. Merry #define SLI4_CFG_STATUS_SUCCESS 0x00 1403*ef270ab1SKenneth D. Merry #define SLI4_CFG_STATUS_FAILED 0x01 1404*ef270ab1SKenneth D. Merry #define SLI4_CFG_STATUS_ILLEGAL_REQUEST 0x02 1405*ef270ab1SKenneth D. Merry #define SLI4_CFG_STATUS_ILLEGAL_FIELD 0x03 1406*ef270ab1SKenneth D. Merry 1407*ef270ab1SKenneth D. Merry #define SLI4_MGMT_STATUS_FLASHROM_READ_FAILED 0xcb 1408*ef270ab1SKenneth D. Merry 1409*ef270ab1SKenneth D. Merry #define SLI4_CFG_ADD_STATUS_NO_STATUS 0x00 1410*ef270ab1SKenneth D. Merry #define SLI4_CFG_ADD_STATUS_INVALID_OPCODE 0x1e 1411*ef270ab1SKenneth D. Merry 1412*ef270ab1SKenneth D. Merry /** 1413*ef270ab1SKenneth D. Merry * Subsystem values. 1414*ef270ab1SKenneth D. Merry */ 1415*ef270ab1SKenneth D. Merry #define SLI4_SUBSYSTEM_COMMON 0x01 1416*ef270ab1SKenneth D. Merry #define SLI4_SUBSYSTEM_LOWLEVEL 0x0B 1417*ef270ab1SKenneth D. Merry #define SLI4_SUBSYSTEM_FCFCOE 0x0c 1418*ef270ab1SKenneth D. Merry #define SLI4_SUBSYSTEM_DMTF 0x11 1419*ef270ab1SKenneth D. Merry 1420*ef270ab1SKenneth D. Merry #define SLI4_OPC_LOWLEVEL_SET_WATCHDOG 0X36 1421*ef270ab1SKenneth D. Merry 1422*ef270ab1SKenneth D. Merry /** 1423*ef270ab1SKenneth D. Merry * Common opcode (OPC) values. 1424*ef270ab1SKenneth D. Merry */ 1425*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_FUNCTION_RESET 0x3d 1426*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_CREATE_CQ 0x0c 1427*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_CREATE_CQ_SET 0x1d 1428*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_DESTROY_CQ 0x36 1429*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_MODIFY_EQ_DELAY 0x29 1430*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_CREATE_EQ 0x0d 1431*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_DESTROY_EQ 0x37 1432*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_CREATE_MQ_EXT 0x5a 1433*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_DESTROY_MQ 0x35 1434*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_GET_CNTL_ATTRIBUTES 0x20 1435*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_NOP 0x21 1436*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_GET_RESOURCE_EXTENT_INFO 0x9a 1437*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_GET_SLI4_PARAMETERS 0xb5 1438*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_QUERY_FW_CONFIG 0x3a 1439*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_GET_PORT_NAME 0x4d 1440*ef270ab1SKenneth D. Merry 1441*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_WRITE_FLASHROM 0x07 1442*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_MANAGE_FAT 0x44 1443*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_READ_TRANSCEIVER_DATA 0x49 1444*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_GET_CNTL_ADDL_ATTRIBUTES 0x79 1445*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_GET_EXT_FAT_CAPABILITIES 0x7d 1446*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_SET_EXT_FAT_CAPABILITIES 0x7e 1447*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_EXT_FAT_CONFIGURE_SNAPSHOT 0x7f 1448*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_EXT_FAT_RETRIEVE_SNAPSHOT 0x80 1449*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_EXT_FAT_READ_STRING_TABLE 0x82 1450*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_GET_FUNCTION_CONFIG 0xa0 1451*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_GET_PROFILE_CONFIG 0xa4 1452*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_SET_PROFILE_CONFIG 0xa5 1453*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_GET_PROFILE_LIST 0xa6 1454*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_GET_ACTIVE_PROFILE 0xa7 1455*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_SET_ACTIVE_PROFILE 0xa8 1456*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_READ_OBJECT 0xab 1457*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_WRITE_OBJECT 0xac 1458*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_DELETE_OBJECT 0xae 1459*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_READ_OBJECT_LIST 0xad 1460*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_SET_DUMP_LOCATION 0xb8 1461*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_SET_FEATURES 0xbf 1462*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_GET_RECONFIG_LINK_INFO 0xc9 1463*ef270ab1SKenneth D. Merry #define SLI4_OPC_COMMON_SET_RECONFIG_LINK_ID 0xca 1464*ef270ab1SKenneth D. Merry 1465*ef270ab1SKenneth D. Merry /** 1466*ef270ab1SKenneth D. Merry * DMTF opcode (OPC) values. 1467*ef270ab1SKenneth D. Merry */ 1468*ef270ab1SKenneth D. Merry #define SLI4_OPC_DMTF_EXEC_CLP_CMD 0x01 1469*ef270ab1SKenneth D. Merry 1470*ef270ab1SKenneth D. Merry /** 1471*ef270ab1SKenneth D. Merry * @brief Generic Command Request header 1472*ef270ab1SKenneth D. Merry */ 1473*ef270ab1SKenneth D. Merry typedef struct sli4_req_hdr_s { 1474*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1475*ef270ab1SKenneth D. Merry uint32_t opcode:8, 1476*ef270ab1SKenneth D. Merry subsystem:8, 1477*ef270ab1SKenneth D. Merry :16; 1478*ef270ab1SKenneth D. Merry uint32_t timeout; 1479*ef270ab1SKenneth D. Merry uint32_t request_length; 1480*ef270ab1SKenneth D. Merry uint32_t version:8, 1481*ef270ab1SKenneth D. Merry :24; 1482*ef270ab1SKenneth D. Merry #else 1483*ef270ab1SKenneth D. Merry #error big endian version not defined 1484*ef270ab1SKenneth D. Merry #endif 1485*ef270ab1SKenneth D. Merry } sli4_req_hdr_t; 1486*ef270ab1SKenneth D. Merry 1487*ef270ab1SKenneth D. Merry /** 1488*ef270ab1SKenneth D. Merry * @brief Generic Command Response header 1489*ef270ab1SKenneth D. Merry */ 1490*ef270ab1SKenneth D. Merry typedef struct sli4_res_hdr_s { 1491*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1492*ef270ab1SKenneth D. Merry uint32_t opcode:8, 1493*ef270ab1SKenneth D. Merry subsystem:8, 1494*ef270ab1SKenneth D. Merry :16; 1495*ef270ab1SKenneth D. Merry uint32_t status:8, 1496*ef270ab1SKenneth D. Merry additional_status:8, 1497*ef270ab1SKenneth D. Merry :16; 1498*ef270ab1SKenneth D. Merry uint32_t response_length; 1499*ef270ab1SKenneth D. Merry uint32_t actual_response_length; 1500*ef270ab1SKenneth D. Merry #else 1501*ef270ab1SKenneth D. Merry #error big endian version not defined 1502*ef270ab1SKenneth D. Merry #endif 1503*ef270ab1SKenneth D. Merry } sli4_res_hdr_t; 1504*ef270ab1SKenneth D. Merry 1505*ef270ab1SKenneth D. Merry /** 1506*ef270ab1SKenneth D. Merry * @brief COMMON_FUNCTION_RESET 1507*ef270ab1SKenneth D. Merry * 1508*ef270ab1SKenneth D. Merry * Resets the Port, returning it to a power-on state. This configuration 1509*ef270ab1SKenneth D. Merry * command does not have a payload and should set/expect the lengths to 1510*ef270ab1SKenneth D. Merry * be zero. 1511*ef270ab1SKenneth D. Merry */ 1512*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_function_reset_s { 1513*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 1514*ef270ab1SKenneth D. Merry } sli4_req_common_function_reset_t; 1515*ef270ab1SKenneth D. Merry 1516*ef270ab1SKenneth D. Merry 1517*ef270ab1SKenneth D. Merry typedef struct sli4_res_common_function_reset_s { 1518*ef270ab1SKenneth D. Merry sli4_res_hdr_t hdr; 1519*ef270ab1SKenneth D. Merry } sli4_res_common_function_reset_t; 1520*ef270ab1SKenneth D. Merry 1521*ef270ab1SKenneth D. Merry /** 1522*ef270ab1SKenneth D. Merry * @brief COMMON_CREATE_CQ_V0 1523*ef270ab1SKenneth D. Merry * 1524*ef270ab1SKenneth D. Merry * Create a Completion Queue. 1525*ef270ab1SKenneth D. Merry */ 1526*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_create_cq_v0_s { 1527*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 1528*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1529*ef270ab1SKenneth D. Merry uint32_t num_pages:16, 1530*ef270ab1SKenneth D. Merry :16; 1531*ef270ab1SKenneth D. Merry uint32_t :12, 1532*ef270ab1SKenneth D. Merry clswm:2, 1533*ef270ab1SKenneth D. Merry nodelay:1, 1534*ef270ab1SKenneth D. Merry :12, 1535*ef270ab1SKenneth D. Merry cqecnt:2, 1536*ef270ab1SKenneth D. Merry valid:1, 1537*ef270ab1SKenneth D. Merry :1, 1538*ef270ab1SKenneth D. Merry evt:1; 1539*ef270ab1SKenneth D. Merry uint32_t :22, 1540*ef270ab1SKenneth D. Merry eq_id:8, 1541*ef270ab1SKenneth D. Merry :1, 1542*ef270ab1SKenneth D. Merry arm:1; 1543*ef270ab1SKenneth D. Merry uint32_t rsvd[2]; 1544*ef270ab1SKenneth D. Merry struct { 1545*ef270ab1SKenneth D. Merry uint32_t low; 1546*ef270ab1SKenneth D. Merry uint32_t high; 1547*ef270ab1SKenneth D. Merry } page_physical_address[0]; 1548*ef270ab1SKenneth D. Merry #else 1549*ef270ab1SKenneth D. Merry #error big endian version not defined 1550*ef270ab1SKenneth D. Merry #endif 1551*ef270ab1SKenneth D. Merry } sli4_req_common_create_cq_v0_t; 1552*ef270ab1SKenneth D. Merry 1553*ef270ab1SKenneth D. Merry /** 1554*ef270ab1SKenneth D. Merry * @brief COMMON_CREATE_CQ_V2 1555*ef270ab1SKenneth D. Merry * 1556*ef270ab1SKenneth D. Merry * Create a Completion Queue. 1557*ef270ab1SKenneth D. Merry */ 1558*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_create_cq_v2_s { 1559*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 1560*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1561*ef270ab1SKenneth D. Merry uint32_t num_pages:16, 1562*ef270ab1SKenneth D. Merry page_size:8, 1563*ef270ab1SKenneth D. Merry :8, 1564*ef270ab1SKenneth D. Merry uint32_t :12, 1565*ef270ab1SKenneth D. Merry clswm:2, 1566*ef270ab1SKenneth D. Merry nodelay:1, 1567*ef270ab1SKenneth D. Merry autovalid:1, 1568*ef270ab1SKenneth D. Merry :11, 1569*ef270ab1SKenneth D. Merry cqecnt:2, 1570*ef270ab1SKenneth D. Merry valid:1, 1571*ef270ab1SKenneth D. Merry :1, 1572*ef270ab1SKenneth D. Merry evt:1; 1573*ef270ab1SKenneth D. Merry uint32_t eq_id:16, 1574*ef270ab1SKenneth D. Merry :15, 1575*ef270ab1SKenneth D. Merry arm:1; 1576*ef270ab1SKenneth D. Merry uint32_t cqe_count:16, 1577*ef270ab1SKenneth D. Merry :16; 1578*ef270ab1SKenneth D. Merry uint32_t rsvd[1]; 1579*ef270ab1SKenneth D. Merry struct { 1580*ef270ab1SKenneth D. Merry uint32_t low; 1581*ef270ab1SKenneth D. Merry uint32_t high; 1582*ef270ab1SKenneth D. Merry } page_physical_address[0]; 1583*ef270ab1SKenneth D. Merry #else 1584*ef270ab1SKenneth D. Merry #error big endian version not defined 1585*ef270ab1SKenneth D. Merry #endif 1586*ef270ab1SKenneth D. Merry } sli4_req_common_create_cq_v2_t; 1587*ef270ab1SKenneth D. Merry 1588*ef270ab1SKenneth D. Merry 1589*ef270ab1SKenneth D. Merry 1590*ef270ab1SKenneth D. Merry /** 1591*ef270ab1SKenneth D. Merry * @brief COMMON_CREATE_CQ_SET_V0 1592*ef270ab1SKenneth D. Merry * 1593*ef270ab1SKenneth D. Merry * Create a set of Completion Queues. 1594*ef270ab1SKenneth D. Merry */ 1595*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_create_cq_set_v0_s { 1596*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 1597*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1598*ef270ab1SKenneth D. Merry uint32_t num_pages:16, 1599*ef270ab1SKenneth D. Merry page_size:8, 1600*ef270ab1SKenneth D. Merry :8; 1601*ef270ab1SKenneth D. Merry uint32_t :12, 1602*ef270ab1SKenneth D. Merry clswm:2, 1603*ef270ab1SKenneth D. Merry nodelay:1, 1604*ef270ab1SKenneth D. Merry autovalid:1, 1605*ef270ab1SKenneth D. Merry rsvd:11, 1606*ef270ab1SKenneth D. Merry cqecnt:2, 1607*ef270ab1SKenneth D. Merry valid:1, 1608*ef270ab1SKenneth D. Merry :1, 1609*ef270ab1SKenneth D. Merry evt:1; 1610*ef270ab1SKenneth D. Merry uint32_t num_cq_req:16, 1611*ef270ab1SKenneth D. Merry cqe_count:15, 1612*ef270ab1SKenneth D. Merry arm:1; 1613*ef270ab1SKenneth D. Merry uint16_t eq_id[16]; 1614*ef270ab1SKenneth D. Merry struct { 1615*ef270ab1SKenneth D. Merry uint32_t low; 1616*ef270ab1SKenneth D. Merry uint32_t high; 1617*ef270ab1SKenneth D. Merry } page_physical_address[0]; 1618*ef270ab1SKenneth D. Merry #else 1619*ef270ab1SKenneth D. Merry #error big endian version not defined 1620*ef270ab1SKenneth D. Merry #endif 1621*ef270ab1SKenneth D. Merry } sli4_req_common_create_cq_set_v0_t; 1622*ef270ab1SKenneth D. Merry 1623*ef270ab1SKenneth D. Merry /** 1624*ef270ab1SKenneth D. Merry * CQE count. 1625*ef270ab1SKenneth D. Merry */ 1626*ef270ab1SKenneth D. Merry #define SLI4_CQ_CNT_256 0 1627*ef270ab1SKenneth D. Merry #define SLI4_CQ_CNT_512 1 1628*ef270ab1SKenneth D. Merry #define SLI4_CQ_CNT_1024 2 1629*ef270ab1SKenneth D. Merry #define SLI4_CQ_CNT_LARGE 3 1630*ef270ab1SKenneth D. Merry 1631*ef270ab1SKenneth D. Merry #define SLI4_CQE_BYTES (4 * sizeof(uint32_t)) 1632*ef270ab1SKenneth D. Merry 1633*ef270ab1SKenneth D. Merry #define SLI4_COMMON_CREATE_CQ_V2_MAX_PAGES 8 1634*ef270ab1SKenneth D. Merry 1635*ef270ab1SKenneth D. Merry /** 1636*ef270ab1SKenneth D. Merry * @brief Generic Common Create EQ/CQ/MQ/WQ/RQ Queue completion 1637*ef270ab1SKenneth D. Merry */ 1638*ef270ab1SKenneth D. Merry typedef struct sli4_res_common_create_queue_s { 1639*ef270ab1SKenneth D. Merry sli4_res_hdr_t hdr; 1640*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1641*ef270ab1SKenneth D. Merry uint32_t q_id:16, 1642*ef270ab1SKenneth D. Merry :8, 1643*ef270ab1SKenneth D. Merry ulp:8; 1644*ef270ab1SKenneth D. Merry uint32_t db_offset; 1645*ef270ab1SKenneth D. Merry uint32_t db_rs:16, 1646*ef270ab1SKenneth D. Merry db_fmt:16; 1647*ef270ab1SKenneth D. Merry #else 1648*ef270ab1SKenneth D. Merry #error big endian version not defined 1649*ef270ab1SKenneth D. Merry #endif 1650*ef270ab1SKenneth D. Merry } sli4_res_common_create_queue_t; 1651*ef270ab1SKenneth D. Merry 1652*ef270ab1SKenneth D. Merry 1653*ef270ab1SKenneth D. Merry typedef struct sli4_res_common_create_queue_set_s { 1654*ef270ab1SKenneth D. Merry sli4_res_hdr_t hdr; 1655*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1656*ef270ab1SKenneth D. Merry uint32_t q_id:16, 1657*ef270ab1SKenneth D. Merry num_q_allocated:16; 1658*ef270ab1SKenneth D. Merry #else 1659*ef270ab1SKenneth D. Merry #error big endian version not defined 1660*ef270ab1SKenneth D. Merry #endif 1661*ef270ab1SKenneth D. Merry } sli4_res_common_create_queue_set_t; 1662*ef270ab1SKenneth D. Merry 1663*ef270ab1SKenneth D. Merry 1664*ef270ab1SKenneth D. Merry /** 1665*ef270ab1SKenneth D. Merry * @brief Common Destroy CQ 1666*ef270ab1SKenneth D. Merry */ 1667*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_destroy_cq_s { 1668*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 1669*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1670*ef270ab1SKenneth D. Merry uint32_t cq_id:16, 1671*ef270ab1SKenneth D. Merry :16; 1672*ef270ab1SKenneth D. Merry #else 1673*ef270ab1SKenneth D. Merry #error big endian version not defined 1674*ef270ab1SKenneth D. Merry #endif 1675*ef270ab1SKenneth D. Merry } sli4_req_common_destroy_cq_t; 1676*ef270ab1SKenneth D. Merry 1677*ef270ab1SKenneth D. Merry /** 1678*ef270ab1SKenneth D. Merry * @brief COMMON_MODIFY_EQ_DELAY 1679*ef270ab1SKenneth D. Merry * 1680*ef270ab1SKenneth D. Merry * Modify the delay multiplier for EQs 1681*ef270ab1SKenneth D. Merry */ 1682*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_modify_eq_delay_s { 1683*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 1684*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1685*ef270ab1SKenneth D. Merry uint32_t num_eq; 1686*ef270ab1SKenneth D. Merry struct { 1687*ef270ab1SKenneth D. Merry uint32_t eq_id; 1688*ef270ab1SKenneth D. Merry uint32_t phase; 1689*ef270ab1SKenneth D. Merry uint32_t delay_multiplier; 1690*ef270ab1SKenneth D. Merry } eq_delay_record[8]; 1691*ef270ab1SKenneth D. Merry #else 1692*ef270ab1SKenneth D. Merry #error big endian version not defined 1693*ef270ab1SKenneth D. Merry #endif 1694*ef270ab1SKenneth D. Merry } sli4_req_common_modify_eq_delay_t; 1695*ef270ab1SKenneth D. Merry 1696*ef270ab1SKenneth D. Merry /** 1697*ef270ab1SKenneth D. Merry * @brief COMMON_CREATE_EQ 1698*ef270ab1SKenneth D. Merry * 1699*ef270ab1SKenneth D. Merry * Create an Event Queue. 1700*ef270ab1SKenneth D. Merry */ 1701*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_create_eq_s { 1702*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 1703*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1704*ef270ab1SKenneth D. Merry uint32_t num_pages:16, 1705*ef270ab1SKenneth D. Merry :16; 1706*ef270ab1SKenneth D. Merry uint32_t :29, 1707*ef270ab1SKenneth D. Merry valid:1, 1708*ef270ab1SKenneth D. Merry :1, 1709*ef270ab1SKenneth D. Merry eqesz:1; 1710*ef270ab1SKenneth D. Merry uint32_t :26, 1711*ef270ab1SKenneth D. Merry count:3, 1712*ef270ab1SKenneth D. Merry :2, 1713*ef270ab1SKenneth D. Merry arm:1; 1714*ef270ab1SKenneth D. Merry uint32_t :13, 1715*ef270ab1SKenneth D. Merry delay_multiplier:10, 1716*ef270ab1SKenneth D. Merry :9; 1717*ef270ab1SKenneth D. Merry uint32_t rsvd; 1718*ef270ab1SKenneth D. Merry struct { 1719*ef270ab1SKenneth D. Merry uint32_t low; 1720*ef270ab1SKenneth D. Merry uint32_t high; 1721*ef270ab1SKenneth D. Merry } page_address[8]; 1722*ef270ab1SKenneth D. Merry #else 1723*ef270ab1SKenneth D. Merry #error big endian version not defined 1724*ef270ab1SKenneth D. Merry #endif 1725*ef270ab1SKenneth D. Merry } sli4_req_common_create_eq_t; 1726*ef270ab1SKenneth D. Merry 1727*ef270ab1SKenneth D. Merry #define SLI4_EQ_CNT_256 0 1728*ef270ab1SKenneth D. Merry #define SLI4_EQ_CNT_512 1 1729*ef270ab1SKenneth D. Merry #define SLI4_EQ_CNT_1024 2 1730*ef270ab1SKenneth D. Merry #define SLI4_EQ_CNT_2048 3 1731*ef270ab1SKenneth D. Merry #define SLI4_EQ_CNT_4096 4 1732*ef270ab1SKenneth D. Merry 1733*ef270ab1SKenneth D. Merry #define SLI4_EQE_SIZE_4 0 1734*ef270ab1SKenneth D. Merry #define SLI4_EQE_SIZE_16 1 1735*ef270ab1SKenneth D. Merry 1736*ef270ab1SKenneth D. Merry /** 1737*ef270ab1SKenneth D. Merry * @brief Common Destroy EQ 1738*ef270ab1SKenneth D. Merry */ 1739*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_destroy_eq_s { 1740*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 1741*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1742*ef270ab1SKenneth D. Merry uint32_t eq_id:16, 1743*ef270ab1SKenneth D. Merry :16; 1744*ef270ab1SKenneth D. Merry #else 1745*ef270ab1SKenneth D. Merry #error big endian version not defined 1746*ef270ab1SKenneth D. Merry #endif 1747*ef270ab1SKenneth D. Merry } sli4_req_common_destroy_eq_t; 1748*ef270ab1SKenneth D. Merry 1749*ef270ab1SKenneth D. Merry /** 1750*ef270ab1SKenneth D. Merry * @brief COMMON_CREATE_MQ_EXT 1751*ef270ab1SKenneth D. Merry * 1752*ef270ab1SKenneth D. Merry * Create a Mailbox Queue; accommodate v0 and v1 forms. 1753*ef270ab1SKenneth D. Merry */ 1754*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_create_mq_ext_s { 1755*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 1756*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1757*ef270ab1SKenneth D. Merry uint32_t num_pages:16, 1758*ef270ab1SKenneth D. Merry cq_id_v1:16; 1759*ef270ab1SKenneth D. Merry uint32_t async_event_bitmap; 1760*ef270ab1SKenneth D. Merry uint32_t async_cq_id_v1:16, 1761*ef270ab1SKenneth D. Merry ring_size:4, 1762*ef270ab1SKenneth D. Merry :2, 1763*ef270ab1SKenneth D. Merry cq_id_v0:10; 1764*ef270ab1SKenneth D. Merry uint32_t :31, 1765*ef270ab1SKenneth D. Merry val:1; 1766*ef270ab1SKenneth D. Merry uint32_t acqv:1, 1767*ef270ab1SKenneth D. Merry async_cq_id_v0:10, 1768*ef270ab1SKenneth D. Merry :21; 1769*ef270ab1SKenneth D. Merry uint32_t rsvd9; 1770*ef270ab1SKenneth D. Merry struct { 1771*ef270ab1SKenneth D. Merry uint32_t low; 1772*ef270ab1SKenneth D. Merry uint32_t high; 1773*ef270ab1SKenneth D. Merry } page_physical_address[8]; 1774*ef270ab1SKenneth D. Merry #else 1775*ef270ab1SKenneth D. Merry #error big endian version not defined 1776*ef270ab1SKenneth D. Merry #endif 1777*ef270ab1SKenneth D. Merry } sli4_req_common_create_mq_ext_t; 1778*ef270ab1SKenneth D. Merry 1779*ef270ab1SKenneth D. Merry #define SLI4_MQE_SIZE_16 0x05 1780*ef270ab1SKenneth D. Merry #define SLI4_MQE_SIZE_32 0x06 1781*ef270ab1SKenneth D. Merry #define SLI4_MQE_SIZE_64 0x07 1782*ef270ab1SKenneth D. Merry #define SLI4_MQE_SIZE_128 0x08 1783*ef270ab1SKenneth D. Merry 1784*ef270ab1SKenneth D. Merry #define SLI4_ASYNC_EVT_LINK_STATE BIT(1) 1785*ef270ab1SKenneth D. Merry #define SLI4_ASYNC_EVT_FCOE_FIP BIT(2) 1786*ef270ab1SKenneth D. Merry #define SLI4_ASYNC_EVT_DCBX BIT(3) 1787*ef270ab1SKenneth D. Merry #define SLI4_ASYNC_EVT_ISCSI BIT(4) 1788*ef270ab1SKenneth D. Merry #define SLI4_ASYNC_EVT_GRP5 BIT(5) 1789*ef270ab1SKenneth D. Merry #define SLI4_ASYNC_EVT_FC BIT(16) 1790*ef270ab1SKenneth D. Merry #define SLI4_ASYNC_EVT_SLI_PORT BIT(17) 1791*ef270ab1SKenneth D. Merry #define SLI4_ASYNC_EVT_VF BIT(18) 1792*ef270ab1SKenneth D. Merry #define SLI4_ASYNC_EVT_MR BIT(19) 1793*ef270ab1SKenneth D. Merry 1794*ef270ab1SKenneth D. Merry #define SLI4_ASYNC_EVT_ALL \ 1795*ef270ab1SKenneth D. Merry SLI4_ASYNC_EVT_LINK_STATE | \ 1796*ef270ab1SKenneth D. Merry SLI4_ASYNC_EVT_FCOE_FIP | \ 1797*ef270ab1SKenneth D. Merry SLI4_ASYNC_EVT_DCBX | \ 1798*ef270ab1SKenneth D. Merry SLI4_ASYNC_EVT_ISCSI | \ 1799*ef270ab1SKenneth D. Merry SLI4_ASYNC_EVT_GRP5 | \ 1800*ef270ab1SKenneth D. Merry SLI4_ASYNC_EVT_FC | \ 1801*ef270ab1SKenneth D. Merry SLI4_ASYNC_EVT_SLI_PORT | \ 1802*ef270ab1SKenneth D. Merry SLI4_ASYNC_EVT_VF |\ 1803*ef270ab1SKenneth D. Merry SLI4_ASYNC_EVT_MR 1804*ef270ab1SKenneth D. Merry 1805*ef270ab1SKenneth D. Merry #define SLI4_ASYNC_EVT_FC_FCOE \ 1806*ef270ab1SKenneth D. Merry SLI4_ASYNC_EVT_LINK_STATE | \ 1807*ef270ab1SKenneth D. Merry SLI4_ASYNC_EVT_FCOE_FIP | \ 1808*ef270ab1SKenneth D. Merry SLI4_ASYNC_EVT_GRP5 | \ 1809*ef270ab1SKenneth D. Merry SLI4_ASYNC_EVT_FC | \ 1810*ef270ab1SKenneth D. Merry SLI4_ASYNC_EVT_SLI_PORT 1811*ef270ab1SKenneth D. Merry 1812*ef270ab1SKenneth D. Merry /** 1813*ef270ab1SKenneth D. Merry * @brief Common Destroy MQ 1814*ef270ab1SKenneth D. Merry */ 1815*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_destroy_mq_s { 1816*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 1817*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1818*ef270ab1SKenneth D. Merry uint32_t mq_id:16, 1819*ef270ab1SKenneth D. Merry :16; 1820*ef270ab1SKenneth D. Merry #else 1821*ef270ab1SKenneth D. Merry #error big endian version not defined 1822*ef270ab1SKenneth D. Merry #endif 1823*ef270ab1SKenneth D. Merry } sli4_req_common_destroy_mq_t; 1824*ef270ab1SKenneth D. Merry 1825*ef270ab1SKenneth D. Merry /** 1826*ef270ab1SKenneth D. Merry * @brief COMMON_GET_CNTL_ATTRIBUTES 1827*ef270ab1SKenneth D. Merry * 1828*ef270ab1SKenneth D. Merry * Query for information about the SLI Port 1829*ef270ab1SKenneth D. Merry */ 1830*ef270ab1SKenneth D. Merry typedef struct sli4_res_common_get_cntl_attributes_s { 1831*ef270ab1SKenneth D. Merry sli4_res_hdr_t hdr; 1832*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1833*ef270ab1SKenneth D. Merry uint8_t version_string[32]; 1834*ef270ab1SKenneth D. Merry uint8_t manufacturer_name[32]; 1835*ef270ab1SKenneth D. Merry uint32_t supported_modes; 1836*ef270ab1SKenneth D. Merry uint32_t eprom_version_lo:8, 1837*ef270ab1SKenneth D. Merry eprom_version_hi:8, 1838*ef270ab1SKenneth D. Merry :16; 1839*ef270ab1SKenneth D. Merry uint32_t mbx_data_structure_version; 1840*ef270ab1SKenneth D. Merry uint32_t ep_firmware_data_structure_version; 1841*ef270ab1SKenneth D. Merry uint8_t ncsi_version_string[12]; 1842*ef270ab1SKenneth D. Merry uint32_t default_extended_timeout; 1843*ef270ab1SKenneth D. Merry uint8_t model_number[32]; 1844*ef270ab1SKenneth D. Merry uint8_t description[64]; 1845*ef270ab1SKenneth D. Merry uint8_t serial_number[32]; 1846*ef270ab1SKenneth D. Merry uint8_t ip_version_string[32]; 1847*ef270ab1SKenneth D. Merry uint8_t fw_version_string[32]; 1848*ef270ab1SKenneth D. Merry uint8_t bios_version_string[32]; 1849*ef270ab1SKenneth D. Merry uint8_t redboot_version_string[32]; 1850*ef270ab1SKenneth D. Merry uint8_t driver_version_string[32]; 1851*ef270ab1SKenneth D. Merry uint8_t fw_on_flash_version_string[32]; 1852*ef270ab1SKenneth D. Merry uint32_t functionalities_supported; 1853*ef270ab1SKenneth D. Merry uint32_t max_cdb_length:16, 1854*ef270ab1SKenneth D. Merry asic_revision:8, 1855*ef270ab1SKenneth D. Merry generational_guid0:8; 1856*ef270ab1SKenneth D. Merry uint32_t generational_guid1_12[3]; 1857*ef270ab1SKenneth D. Merry uint32_t generational_guid13:24, 1858*ef270ab1SKenneth D. Merry hba_port_count:8; 1859*ef270ab1SKenneth D. Merry uint32_t default_link_down_timeout:16, 1860*ef270ab1SKenneth D. Merry iscsi_version_min_max:8, 1861*ef270ab1SKenneth D. Merry multifunctional_device:8; 1862*ef270ab1SKenneth D. Merry uint32_t cache_valid:8, 1863*ef270ab1SKenneth D. Merry hba_status:8, 1864*ef270ab1SKenneth D. Merry max_domains_supported:8, 1865*ef270ab1SKenneth D. Merry port_number:6, 1866*ef270ab1SKenneth D. Merry port_type:2; 1867*ef270ab1SKenneth D. Merry uint32_t firmware_post_status; 1868*ef270ab1SKenneth D. Merry uint32_t hba_mtu; 1869*ef270ab1SKenneth D. Merry uint32_t iscsi_features:8, 1870*ef270ab1SKenneth D. Merry rsvd121:24; 1871*ef270ab1SKenneth D. Merry uint32_t pci_vendor_id:16, 1872*ef270ab1SKenneth D. Merry pci_device_id:16; 1873*ef270ab1SKenneth D. Merry uint32_t pci_sub_vendor_id:16, 1874*ef270ab1SKenneth D. Merry pci_sub_system_id:16; 1875*ef270ab1SKenneth D. Merry uint32_t pci_bus_number:8, 1876*ef270ab1SKenneth D. Merry pci_device_number:8, 1877*ef270ab1SKenneth D. Merry pci_function_number:8, 1878*ef270ab1SKenneth D. Merry interface_type:8; 1879*ef270ab1SKenneth D. Merry uint64_t unique_identifier; 1880*ef270ab1SKenneth D. Merry uint32_t number_of_netfilters:8, 1881*ef270ab1SKenneth D. Merry rsvd130:24; 1882*ef270ab1SKenneth D. Merry #else 1883*ef270ab1SKenneth D. Merry #error big endian version not defined 1884*ef270ab1SKenneth D. Merry #endif 1885*ef270ab1SKenneth D. Merry } sli4_res_common_get_cntl_attributes_t; 1886*ef270ab1SKenneth D. Merry 1887*ef270ab1SKenneth D. Merry /** 1888*ef270ab1SKenneth D. Merry * @brief COMMON_GET_CNTL_ATTRIBUTES 1889*ef270ab1SKenneth D. Merry * 1890*ef270ab1SKenneth D. Merry * This command queries the controller information from the Flash ROM. 1891*ef270ab1SKenneth D. Merry */ 1892*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_get_cntl_addl_attributes_s { 1893*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 1894*ef270ab1SKenneth D. Merry } sli4_req_common_get_cntl_addl_attributes_t; 1895*ef270ab1SKenneth D. Merry 1896*ef270ab1SKenneth D. Merry 1897*ef270ab1SKenneth D. Merry typedef struct sli4_res_common_get_cntl_addl_attributes_s { 1898*ef270ab1SKenneth D. Merry sli4_res_hdr_t hdr; 1899*ef270ab1SKenneth D. Merry uint16_t ipl_file_number; 1900*ef270ab1SKenneth D. Merry uint8_t ipl_file_version; 1901*ef270ab1SKenneth D. Merry uint8_t rsvd0; 1902*ef270ab1SKenneth D. Merry uint8_t on_die_temperature; 1903*ef270ab1SKenneth D. Merry uint8_t rsvd1[3]; 1904*ef270ab1SKenneth D. Merry uint32_t driver_advanced_features_supported; 1905*ef270ab1SKenneth D. Merry uint32_t rsvd2[4]; 1906*ef270ab1SKenneth D. Merry char fcoe_universal_bios_version[32]; 1907*ef270ab1SKenneth D. Merry char fcoe_x86_bios_version[32]; 1908*ef270ab1SKenneth D. Merry char fcoe_efi_bios_version[32]; 1909*ef270ab1SKenneth D. Merry char fcoe_fcode_version[32]; 1910*ef270ab1SKenneth D. Merry char uefi_bios_version[32]; 1911*ef270ab1SKenneth D. Merry char uefi_nic_version[32]; 1912*ef270ab1SKenneth D. Merry char uefi_fcode_version[32]; 1913*ef270ab1SKenneth D. Merry char uefi_iscsi_version[32]; 1914*ef270ab1SKenneth D. Merry char iscsi_x86_bios_version[32]; 1915*ef270ab1SKenneth D. Merry char pxe_x86_bios_version[32]; 1916*ef270ab1SKenneth D. Merry uint8_t fcoe_default_wwpn[8]; 1917*ef270ab1SKenneth D. Merry uint8_t ext_phy_version[32]; 1918*ef270ab1SKenneth D. Merry uint8_t fc_universal_bios_version[32]; 1919*ef270ab1SKenneth D. Merry uint8_t fc_x86_bios_version[32]; 1920*ef270ab1SKenneth D. Merry uint8_t fc_efi_bios_version[32]; 1921*ef270ab1SKenneth D. Merry uint8_t fc_fcode_version[32]; 1922*ef270ab1SKenneth D. Merry uint8_t ext_phy_crc_label[8]; 1923*ef270ab1SKenneth D. Merry uint8_t ipl_file_name[16]; 1924*ef270ab1SKenneth D. Merry uint8_t rsvd3[72]; 1925*ef270ab1SKenneth D. Merry } sli4_res_common_get_cntl_addl_attributes_t; 1926*ef270ab1SKenneth D. Merry 1927*ef270ab1SKenneth D. Merry /** 1928*ef270ab1SKenneth D. Merry * @brief COMMON_NOP 1929*ef270ab1SKenneth D. Merry * 1930*ef270ab1SKenneth D. Merry * This command does not do anything; it only returns the payload in the completion. 1931*ef270ab1SKenneth D. Merry */ 1932*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_nop_s { 1933*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 1934*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1935*ef270ab1SKenneth D. Merry uint32_t context[2]; 1936*ef270ab1SKenneth D. Merry #else 1937*ef270ab1SKenneth D. Merry #error big endian version not defined 1938*ef270ab1SKenneth D. Merry #endif 1939*ef270ab1SKenneth D. Merry } sli4_req_common_nop_t; 1940*ef270ab1SKenneth D. Merry 1941*ef270ab1SKenneth D. Merry typedef struct sli4_res_common_nop_s { 1942*ef270ab1SKenneth D. Merry sli4_res_hdr_t hdr; 1943*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1944*ef270ab1SKenneth D. Merry uint32_t context[2]; 1945*ef270ab1SKenneth D. Merry #else 1946*ef270ab1SKenneth D. Merry #error big endian version not defined 1947*ef270ab1SKenneth D. Merry #endif 1948*ef270ab1SKenneth D. Merry } sli4_res_common_nop_t; 1949*ef270ab1SKenneth D. Merry 1950*ef270ab1SKenneth D. Merry /** 1951*ef270ab1SKenneth D. Merry * @brief COMMON_GET_RESOURCE_EXTENT_INFO 1952*ef270ab1SKenneth D. Merry */ 1953*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_get_resource_extent_info_s { 1954*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 1955*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1956*ef270ab1SKenneth D. Merry uint32_t resource_type:16, 1957*ef270ab1SKenneth D. Merry :16; 1958*ef270ab1SKenneth D. Merry #else 1959*ef270ab1SKenneth D. Merry #error big endian version not defined 1960*ef270ab1SKenneth D. Merry #endif 1961*ef270ab1SKenneth D. Merry } sli4_req_common_get_resource_extent_info_t; 1962*ef270ab1SKenneth D. Merry 1963*ef270ab1SKenneth D. Merry #define SLI4_RSC_TYPE_ISCSI_INI_XRI 0x0c 1964*ef270ab1SKenneth D. Merry #define SLI4_RSC_TYPE_FCOE_VFI 0x20 1965*ef270ab1SKenneth D. Merry #define SLI4_RSC_TYPE_FCOE_VPI 0x21 1966*ef270ab1SKenneth D. Merry #define SLI4_RSC_TYPE_FCOE_RPI 0x22 1967*ef270ab1SKenneth D. Merry #define SLI4_RSC_TYPE_FCOE_XRI 0x23 1968*ef270ab1SKenneth D. Merry 1969*ef270ab1SKenneth D. Merry typedef struct sli4_res_common_get_resource_extent_info_s { 1970*ef270ab1SKenneth D. Merry sli4_res_hdr_t hdr; 1971*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1972*ef270ab1SKenneth D. Merry uint32_t resource_extent_count:16, 1973*ef270ab1SKenneth D. Merry resource_extent_size:16; 1974*ef270ab1SKenneth D. Merry #else 1975*ef270ab1SKenneth D. Merry #error big endian version not defined 1976*ef270ab1SKenneth D. Merry #endif 1977*ef270ab1SKenneth D. Merry } sli4_res_common_get_resource_extent_info_t; 1978*ef270ab1SKenneth D. Merry 1979*ef270ab1SKenneth D. Merry 1980*ef270ab1SKenneth D. Merry #define SLI4_128BYTE_WQE_SUPPORT 0x02 1981*ef270ab1SKenneth D. Merry /** 1982*ef270ab1SKenneth D. Merry * @brief COMMON_GET_SLI4_PARAMETERS 1983*ef270ab1SKenneth D. Merry */ 1984*ef270ab1SKenneth D. Merry typedef struct sli4_res_common_get_sli4_parameters_s { 1985*ef270ab1SKenneth D. Merry sli4_res_hdr_t hdr; 1986*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 1987*ef270ab1SKenneth D. Merry uint32_t protocol_type:8, 1988*ef270ab1SKenneth D. Merry :24; 1989*ef270ab1SKenneth D. Merry uint32_t ft:1, 1990*ef270ab1SKenneth D. Merry :3, 1991*ef270ab1SKenneth D. Merry sli_revision:4, 1992*ef270ab1SKenneth D. Merry sli_family:4, 1993*ef270ab1SKenneth D. Merry if_type:4, 1994*ef270ab1SKenneth D. Merry sli_hint_1:8, 1995*ef270ab1SKenneth D. Merry sli_hint_2:5, 1996*ef270ab1SKenneth D. Merry :3; 1997*ef270ab1SKenneth D. Merry uint32_t eq_page_cnt:4, 1998*ef270ab1SKenneth D. Merry :4, 1999*ef270ab1SKenneth D. Merry eqe_sizes:4, 2000*ef270ab1SKenneth D. Merry :4, 2001*ef270ab1SKenneth D. Merry eq_page_sizes:8, 2002*ef270ab1SKenneth D. Merry eqe_count_method:4, 2003*ef270ab1SKenneth D. Merry :4; 2004*ef270ab1SKenneth D. Merry uint32_t eqe_count_mask:16, 2005*ef270ab1SKenneth D. Merry :16; 2006*ef270ab1SKenneth D. Merry uint32_t cq_page_cnt:4, 2007*ef270ab1SKenneth D. Merry :4, 2008*ef270ab1SKenneth D. Merry cqe_sizes:4, 2009*ef270ab1SKenneth D. Merry :2, 2010*ef270ab1SKenneth D. Merry cqv:2, 2011*ef270ab1SKenneth D. Merry cq_page_sizes:8, 2012*ef270ab1SKenneth D. Merry cqe_count_method:4, 2013*ef270ab1SKenneth D. Merry :4; 2014*ef270ab1SKenneth D. Merry uint32_t cqe_count_mask:16, 2015*ef270ab1SKenneth D. Merry :16; 2016*ef270ab1SKenneth D. Merry uint32_t mq_page_cnt:4, 2017*ef270ab1SKenneth D. Merry :10, 2018*ef270ab1SKenneth D. Merry mqv:2, 2019*ef270ab1SKenneth D. Merry mq_page_sizes:8, 2020*ef270ab1SKenneth D. Merry mqe_count_method:4, 2021*ef270ab1SKenneth D. Merry :4; 2022*ef270ab1SKenneth D. Merry uint32_t mqe_count_mask:16, 2023*ef270ab1SKenneth D. Merry :16; 2024*ef270ab1SKenneth D. Merry uint32_t wq_page_cnt:4, 2025*ef270ab1SKenneth D. Merry :4, 2026*ef270ab1SKenneth D. Merry wqe_sizes:4, 2027*ef270ab1SKenneth D. Merry :2, 2028*ef270ab1SKenneth D. Merry wqv:2, 2029*ef270ab1SKenneth D. Merry wq_page_sizes:8, 2030*ef270ab1SKenneth D. Merry wqe_count_method:4, 2031*ef270ab1SKenneth D. Merry :4; 2032*ef270ab1SKenneth D. Merry uint32_t wqe_count_mask:16, 2033*ef270ab1SKenneth D. Merry :16; 2034*ef270ab1SKenneth D. Merry uint32_t rq_page_cnt:4, 2035*ef270ab1SKenneth D. Merry :4, 2036*ef270ab1SKenneth D. Merry rqe_sizes:4, 2037*ef270ab1SKenneth D. Merry :2, 2038*ef270ab1SKenneth D. Merry rqv:2, 2039*ef270ab1SKenneth D. Merry rq_page_sizes:8, 2040*ef270ab1SKenneth D. Merry rqe_count_method:4, 2041*ef270ab1SKenneth D. Merry :4; 2042*ef270ab1SKenneth D. Merry uint32_t rqe_count_mask:16, 2043*ef270ab1SKenneth D. Merry :12, 2044*ef270ab1SKenneth D. Merry rq_db_window:4; 2045*ef270ab1SKenneth D. Merry uint32_t fcoe:1, 2046*ef270ab1SKenneth D. Merry ext:1, 2047*ef270ab1SKenneth D. Merry hdrr:1, 2048*ef270ab1SKenneth D. Merry sglr:1, 2049*ef270ab1SKenneth D. Merry fbrr:1, 2050*ef270ab1SKenneth D. Merry areg:1, 2051*ef270ab1SKenneth D. Merry tgt:1, 2052*ef270ab1SKenneth D. Merry terp:1, 2053*ef270ab1SKenneth D. Merry assi:1, 2054*ef270ab1SKenneth D. Merry wchn:1, 2055*ef270ab1SKenneth D. Merry tcca:1, 2056*ef270ab1SKenneth D. Merry trty:1, 2057*ef270ab1SKenneth D. Merry trir:1, 2058*ef270ab1SKenneth D. Merry phoff:1, 2059*ef270ab1SKenneth D. Merry phon:1, 2060*ef270ab1SKenneth D. Merry phwq:1, /** Performance Hint WQ_ID Association */ 2061*ef270ab1SKenneth D. Merry boundary_4ga:1, 2062*ef270ab1SKenneth D. Merry rxc:1, 2063*ef270ab1SKenneth D. Merry hlm:1, 2064*ef270ab1SKenneth D. Merry ipr:1, 2065*ef270ab1SKenneth D. Merry rxri:1, 2066*ef270ab1SKenneth D. Merry sglc:1, 2067*ef270ab1SKenneth D. Merry timm:1, 2068*ef270ab1SKenneth D. Merry tsmm:1, 2069*ef270ab1SKenneth D. Merry :1, 2070*ef270ab1SKenneth D. Merry oas:1, 2071*ef270ab1SKenneth D. Merry lc:1, 2072*ef270ab1SKenneth D. Merry agxf:1, 2073*ef270ab1SKenneth D. Merry loopback_scope:4; 2074*ef270ab1SKenneth D. Merry uint32_t sge_supported_length; 2075*ef270ab1SKenneth D. Merry uint32_t sgl_page_cnt:4, 2076*ef270ab1SKenneth D. Merry :4, 2077*ef270ab1SKenneth D. Merry sgl_page_sizes:8, 2078*ef270ab1SKenneth D. Merry sgl_pp_align:8, 2079*ef270ab1SKenneth D. Merry :8; 2080*ef270ab1SKenneth D. Merry uint32_t min_rq_buffer_size:16, 2081*ef270ab1SKenneth D. Merry :16; 2082*ef270ab1SKenneth D. Merry uint32_t max_rq_buffer_size; 2083*ef270ab1SKenneth D. Merry uint32_t physical_xri_max:16, 2084*ef270ab1SKenneth D. Merry physical_rpi_max:16; 2085*ef270ab1SKenneth D. Merry uint32_t physical_vpi_max:16, 2086*ef270ab1SKenneth D. Merry physical_vfi_max:16; 2087*ef270ab1SKenneth D. Merry uint32_t rsvd19; 2088*ef270ab1SKenneth D. Merry uint32_t frag_num_field_offset:16, /* dword 20 */ 2089*ef270ab1SKenneth D. Merry frag_num_field_size:16; 2090*ef270ab1SKenneth D. Merry uint32_t sgl_index_field_offset:16, /* dword 21 */ 2091*ef270ab1SKenneth D. Merry sgl_index_field_size:16; 2092*ef270ab1SKenneth D. Merry uint32_t chain_sge_initial_value_lo; /* dword 22 */ 2093*ef270ab1SKenneth D. Merry uint32_t chain_sge_initial_value_hi; /* dword 23 */ 2094*ef270ab1SKenneth D. Merry #else 2095*ef270ab1SKenneth D. Merry #error big endian version not defined 2096*ef270ab1SKenneth D. Merry #endif 2097*ef270ab1SKenneth D. Merry } sli4_res_common_get_sli4_parameters_t; 2098*ef270ab1SKenneth D. Merry 2099*ef270ab1SKenneth D. Merry 2100*ef270ab1SKenneth D. Merry /** 2101*ef270ab1SKenneth D. Merry * @brief COMMON_QUERY_FW_CONFIG 2102*ef270ab1SKenneth D. Merry * 2103*ef270ab1SKenneth D. Merry * This command retrieves firmware configuration parameters and adapter 2104*ef270ab1SKenneth D. Merry * resources available to the driver. 2105*ef270ab1SKenneth D. Merry */ 2106*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_query_fw_config_s { 2107*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 2108*ef270ab1SKenneth D. Merry } sli4_req_common_query_fw_config_t; 2109*ef270ab1SKenneth D. Merry 2110*ef270ab1SKenneth D. Merry 2111*ef270ab1SKenneth D. Merry #define SLI4_FUNCTION_MODE_FCOE_INI_MODE 0x40 2112*ef270ab1SKenneth D. Merry #define SLI4_FUNCTION_MODE_FCOE_TGT_MODE 0x80 2113*ef270ab1SKenneth D. Merry #define SLI4_FUNCTION_MODE_DUA_MODE 0x800 2114*ef270ab1SKenneth D. Merry 2115*ef270ab1SKenneth D. Merry #define SLI4_ULP_MODE_FCOE_INI 0x40 2116*ef270ab1SKenneth D. Merry #define SLI4_ULP_MODE_FCOE_TGT 0x80 2117*ef270ab1SKenneth D. Merry 2118*ef270ab1SKenneth D. Merry typedef struct sli4_res_common_query_fw_config_s { 2119*ef270ab1SKenneth D. Merry sli4_res_hdr_t hdr; 2120*ef270ab1SKenneth D. Merry uint32_t config_number; 2121*ef270ab1SKenneth D. Merry uint32_t asic_rev; 2122*ef270ab1SKenneth D. Merry uint32_t physical_port; 2123*ef270ab1SKenneth D. Merry uint32_t function_mode; 2124*ef270ab1SKenneth D. Merry uint32_t ulp0_mode; 2125*ef270ab1SKenneth D. Merry uint32_t ulp0_nic_wqid_base; 2126*ef270ab1SKenneth D. Merry uint32_t ulp0_nic_wq_total; /* Dword 10 */ 2127*ef270ab1SKenneth D. Merry uint32_t ulp0_toe_wqid_base; 2128*ef270ab1SKenneth D. Merry uint32_t ulp0_toe_wq_total; 2129*ef270ab1SKenneth D. Merry uint32_t ulp0_toe_rqid_base; 2130*ef270ab1SKenneth D. Merry uint32_t ulp0_toe_rq_total; 2131*ef270ab1SKenneth D. Merry uint32_t ulp0_toe_defrqid_base; 2132*ef270ab1SKenneth D. Merry uint32_t ulp0_toe_defrq_total; 2133*ef270ab1SKenneth D. Merry uint32_t ulp0_lro_rqid_base; 2134*ef270ab1SKenneth D. Merry uint32_t ulp0_lro_rq_total; 2135*ef270ab1SKenneth D. Merry uint32_t ulp0_iscsi_icd_base; 2136*ef270ab1SKenneth D. Merry uint32_t ulp0_iscsi_icd_total; /* Dword 20 */ 2137*ef270ab1SKenneth D. Merry uint32_t ulp1_mode; 2138*ef270ab1SKenneth D. Merry uint32_t ulp1_nic_wqid_base; 2139*ef270ab1SKenneth D. Merry uint32_t ulp1_nic_wq_total; 2140*ef270ab1SKenneth D. Merry uint32_t ulp1_toe_wqid_base; 2141*ef270ab1SKenneth D. Merry uint32_t ulp1_toe_wq_total; 2142*ef270ab1SKenneth D. Merry uint32_t ulp1_toe_rqid_base; 2143*ef270ab1SKenneth D. Merry uint32_t ulp1_toe_rq_total; 2144*ef270ab1SKenneth D. Merry uint32_t ulp1_toe_defrqid_base; 2145*ef270ab1SKenneth D. Merry uint32_t ulp1_toe_defrq_total; 2146*ef270ab1SKenneth D. Merry uint32_t ulp1_lro_rqid_base; /* Dword 30 */ 2147*ef270ab1SKenneth D. Merry uint32_t ulp1_lro_rq_total; 2148*ef270ab1SKenneth D. Merry uint32_t ulp1_iscsi_icd_base; 2149*ef270ab1SKenneth D. Merry uint32_t ulp1_iscsi_icd_total; 2150*ef270ab1SKenneth D. Merry uint32_t function_capabilities; 2151*ef270ab1SKenneth D. Merry uint32_t ulp0_cq_base; 2152*ef270ab1SKenneth D. Merry uint32_t ulp0_cq_total; 2153*ef270ab1SKenneth D. Merry uint32_t ulp0_eq_base; 2154*ef270ab1SKenneth D. Merry uint32_t ulp0_eq_total; 2155*ef270ab1SKenneth D. Merry uint32_t ulp0_iscsi_chain_icd_base; 2156*ef270ab1SKenneth D. Merry uint32_t ulp0_iscsi_chain_icd_total; /* Dword 40 */ 2157*ef270ab1SKenneth D. Merry uint32_t ulp1_iscsi_chain_icd_base; 2158*ef270ab1SKenneth D. Merry uint32_t ulp1_iscsi_chain_icd_total; 2159*ef270ab1SKenneth D. Merry } sli4_res_common_query_fw_config_t; 2160*ef270ab1SKenneth D. Merry 2161*ef270ab1SKenneth D. Merry /** 2162*ef270ab1SKenneth D. Merry * @brief COMMON_GET_PORT_NAME 2163*ef270ab1SKenneth D. Merry */ 2164*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_get_port_name_s { 2165*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 2166*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2167*ef270ab1SKenneth D. Merry uint32_t pt:2, /* only COMMON_GET_PORT_NAME_V1 */ 2168*ef270ab1SKenneth D. Merry :30; 2169*ef270ab1SKenneth D. Merry #else 2170*ef270ab1SKenneth D. Merry #error big endian version not defined 2171*ef270ab1SKenneth D. Merry #endif 2172*ef270ab1SKenneth D. Merry } sli4_req_common_get_port_name_t; 2173*ef270ab1SKenneth D. Merry 2174*ef270ab1SKenneth D. Merry typedef struct sli4_res_common_get_port_name_s { 2175*ef270ab1SKenneth D. Merry sli4_res_hdr_t hdr; 2176*ef270ab1SKenneth D. Merry char port_name[4]; 2177*ef270ab1SKenneth D. Merry } sli4_res_common_get_port_name_t; 2178*ef270ab1SKenneth D. Merry 2179*ef270ab1SKenneth D. Merry /** 2180*ef270ab1SKenneth D. Merry * @brief COMMON_WRITE_FLASHROM 2181*ef270ab1SKenneth D. Merry */ 2182*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_write_flashrom_s { 2183*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 2184*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2185*ef270ab1SKenneth D. Merry uint32_t flash_rom_access_opcode; 2186*ef270ab1SKenneth D. Merry uint32_t flash_rom_access_operation_type; 2187*ef270ab1SKenneth D. Merry uint32_t data_buffer_size; 2188*ef270ab1SKenneth D. Merry uint32_t offset; 2189*ef270ab1SKenneth D. Merry uint8_t data_buffer[4]; 2190*ef270ab1SKenneth D. Merry #else 2191*ef270ab1SKenneth D. Merry #error big endian version not defined 2192*ef270ab1SKenneth D. Merry #endif 2193*ef270ab1SKenneth D. Merry } sli4_req_common_write_flashrom_t; 2194*ef270ab1SKenneth D. Merry 2195*ef270ab1SKenneth D. Merry #define SLI4_MGMT_FLASHROM_OPCODE_FLASH 0x01 2196*ef270ab1SKenneth D. Merry #define SLI4_MGMT_FLASHROM_OPCODE_SAVE 0x02 2197*ef270ab1SKenneth D. Merry #define SLI4_MGMT_FLASHROM_OPCODE_CLEAR 0x03 2198*ef270ab1SKenneth D. Merry #define SLI4_MGMT_FLASHROM_OPCODE_REPORT 0x04 2199*ef270ab1SKenneth D. Merry #define SLI4_MGMT_FLASHROM_OPCODE_IMAGE_INFO 0x05 2200*ef270ab1SKenneth D. Merry #define SLI4_MGMT_FLASHROM_OPCODE_IMAGE_CRC 0x06 2201*ef270ab1SKenneth D. Merry #define SLI4_MGMT_FLASHROM_OPCODE_OFFSET_BASED_FLASH 0x07 2202*ef270ab1SKenneth D. Merry #define SLI4_MGMT_FLASHROM_OPCODE_OFFSET_BASED_SAVE 0x08 2203*ef270ab1SKenneth D. Merry #define SLI4_MGMT_PHY_FLASHROM_OPCODE_FLASH 0x09 2204*ef270ab1SKenneth D. Merry #define SLI4_MGMT_PHY_FLASHROM_OPCODE_SAVE 0x0a 2205*ef270ab1SKenneth D. Merry 2206*ef270ab1SKenneth D. Merry #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_ISCSI 0x00 2207*ef270ab1SKenneth D. Merry #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_REDBOOT 0x01 2208*ef270ab1SKenneth D. Merry #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_BIOS 0x02 2209*ef270ab1SKenneth D. Merry #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_PXE_BIOS 0x03 2210*ef270ab1SKenneth D. Merry #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_CODE_CONTROL 0x04 2211*ef270ab1SKenneth D. Merry #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_IPSEC_CFG 0x05 2212*ef270ab1SKenneth D. Merry #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_INIT_DATA 0x06 2213*ef270ab1SKenneth D. Merry #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_ROM_OFFSET 0x07 2214*ef270ab1SKenneth D. Merry #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_FCOE_BIOS 0x08 2215*ef270ab1SKenneth D. Merry #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_ISCSI_BAK 0x09 2216*ef270ab1SKenneth D. Merry #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_FCOE_ACT 0x0a 2217*ef270ab1SKenneth D. Merry #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_FCOE_BAK 0x0b 2218*ef270ab1SKenneth D. Merry #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_CODE_CTRL_P 0x0c 2219*ef270ab1SKenneth D. Merry #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_NCSI 0x0d 2220*ef270ab1SKenneth D. Merry #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_NIC 0x0e 2221*ef270ab1SKenneth D. Merry #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_DCBX 0x0f 2222*ef270ab1SKenneth D. Merry #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_PXE_BIOS_CFG 0x10 2223*ef270ab1SKenneth D. Merry #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_ALL_CFG_DATA 0x11 2224*ef270ab1SKenneth D. Merry 2225*ef270ab1SKenneth D. Merry /** 2226*ef270ab1SKenneth D. Merry * @brief COMMON_MANAGE_FAT 2227*ef270ab1SKenneth D. Merry */ 2228*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_manage_fat_s { 2229*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 2230*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2231*ef270ab1SKenneth D. Merry uint32_t fat_operation; 2232*ef270ab1SKenneth D. Merry uint32_t read_log_offset; 2233*ef270ab1SKenneth D. Merry uint32_t read_log_length; 2234*ef270ab1SKenneth D. Merry uint32_t data_buffer_size; 2235*ef270ab1SKenneth D. Merry uint32_t data_buffer; /* response only */ 2236*ef270ab1SKenneth D. Merry #else 2237*ef270ab1SKenneth D. Merry #error big endian version not defined 2238*ef270ab1SKenneth D. Merry #endif 2239*ef270ab1SKenneth D. Merry } sli4_req_common_manage_fat_t; 2240*ef270ab1SKenneth D. Merry 2241*ef270ab1SKenneth D. Merry /** 2242*ef270ab1SKenneth D. Merry * @brief COMMON_GET_EXT_FAT_CAPABILITIES 2243*ef270ab1SKenneth D. Merry */ 2244*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_get_ext_fat_capabilities_s { 2245*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 2246*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2247*ef270ab1SKenneth D. Merry uint32_t parameter_type; 2248*ef270ab1SKenneth D. Merry #else 2249*ef270ab1SKenneth D. Merry #error big endian version not defined 2250*ef270ab1SKenneth D. Merry #endif 2251*ef270ab1SKenneth D. Merry } sli4_req_common_get_ext_fat_capabilities_t; 2252*ef270ab1SKenneth D. Merry 2253*ef270ab1SKenneth D. Merry /** 2254*ef270ab1SKenneth D. Merry * @brief COMMON_SET_EXT_FAT_CAPABILITIES 2255*ef270ab1SKenneth D. Merry */ 2256*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_set_ext_fat_capabilities_s { 2257*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 2258*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2259*ef270ab1SKenneth D. Merry uint32_t maximum_log_entries; 2260*ef270ab1SKenneth D. Merry uint32_t log_entry_size; 2261*ef270ab1SKenneth D. Merry uint32_t logging_type:8, 2262*ef270ab1SKenneth D. Merry maximum_logging_functions:8, 2263*ef270ab1SKenneth D. Merry maximum_logging_ports:8, 2264*ef270ab1SKenneth D. Merry :8; 2265*ef270ab1SKenneth D. Merry uint32_t supported_modes; 2266*ef270ab1SKenneth D. Merry uint32_t number_modules; 2267*ef270ab1SKenneth D. Merry uint32_t debug_module[14]; 2268*ef270ab1SKenneth D. Merry #else 2269*ef270ab1SKenneth D. Merry #error big endian version not defined 2270*ef270ab1SKenneth D. Merry #endif 2271*ef270ab1SKenneth D. Merry } sli4_req_common_set_ext_fat_capabilities_t; 2272*ef270ab1SKenneth D. Merry 2273*ef270ab1SKenneth D. Merry /** 2274*ef270ab1SKenneth D. Merry * @brief COMMON_EXT_FAT_CONFIGURE_SNAPSHOT 2275*ef270ab1SKenneth D. Merry */ 2276*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_ext_fat_configure_snapshot_s { 2277*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 2278*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2279*ef270ab1SKenneth D. Merry uint32_t total_log_entries; 2280*ef270ab1SKenneth D. Merry #else 2281*ef270ab1SKenneth D. Merry #error big endian version not defined 2282*ef270ab1SKenneth D. Merry #endif 2283*ef270ab1SKenneth D. Merry } sli4_req_common_ext_fat_configure_snapshot_t; 2284*ef270ab1SKenneth D. Merry 2285*ef270ab1SKenneth D. Merry /** 2286*ef270ab1SKenneth D. Merry * @brief COMMON_EXT_FAT_RETRIEVE_SNAPSHOT 2287*ef270ab1SKenneth D. Merry */ 2288*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_ext_fat_retrieve_snapshot_s { 2289*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 2290*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2291*ef270ab1SKenneth D. Merry uint32_t snapshot_mode; 2292*ef270ab1SKenneth D. Merry uint32_t start_index; 2293*ef270ab1SKenneth D. Merry uint32_t number_log_entries; 2294*ef270ab1SKenneth D. Merry #else 2295*ef270ab1SKenneth D. Merry #error big endian version not defined 2296*ef270ab1SKenneth D. Merry #endif 2297*ef270ab1SKenneth D. Merry } sli4_req_common_ext_fat_retrieve_snapshot_t; 2298*ef270ab1SKenneth D. Merry 2299*ef270ab1SKenneth D. Merry typedef struct sli4_res_common_ext_fat_retrieve_snapshot_s { 2300*ef270ab1SKenneth D. Merry sli4_res_hdr_t hdr; 2301*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2302*ef270ab1SKenneth D. Merry uint32_t number_log_entries; 2303*ef270ab1SKenneth D. Merry uint32_t version:8, 2304*ef270ab1SKenneth D. Merry physical_port:8, 2305*ef270ab1SKenneth D. Merry function_id:16; 2306*ef270ab1SKenneth D. Merry uint32_t trace_level; 2307*ef270ab1SKenneth D. Merry uint32_t module_mask[2]; 2308*ef270ab1SKenneth D. Merry uint32_t trace_table_index; 2309*ef270ab1SKenneth D. Merry uint32_t timestamp; 2310*ef270ab1SKenneth D. Merry uint8_t string_data[16]; 2311*ef270ab1SKenneth D. Merry uint32_t data[6]; 2312*ef270ab1SKenneth D. Merry #else 2313*ef270ab1SKenneth D. Merry #error big endian version not defined 2314*ef270ab1SKenneth D. Merry #endif 2315*ef270ab1SKenneth D. Merry } sli4_res_common_ext_fat_retrieve_snapshot_t; 2316*ef270ab1SKenneth D. Merry 2317*ef270ab1SKenneth D. Merry /** 2318*ef270ab1SKenneth D. Merry * @brief COMMON_EXT_FAT_READ_STRING_TABLE 2319*ef270ab1SKenneth D. Merry */ 2320*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_ext_fat_read_string_table_s { 2321*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 2322*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2323*ef270ab1SKenneth D. Merry uint32_t byte_offset; 2324*ef270ab1SKenneth D. Merry uint32_t number_bytes; 2325*ef270ab1SKenneth D. Merry #else 2326*ef270ab1SKenneth D. Merry #error big endian version not defined 2327*ef270ab1SKenneth D. Merry #endif 2328*ef270ab1SKenneth D. Merry } sli4_req_common_ext_fat_read_string_table_t; 2329*ef270ab1SKenneth D. Merry 2330*ef270ab1SKenneth D. Merry typedef struct sli4_res_common_ext_fat_read_string_table_s { 2331*ef270ab1SKenneth D. Merry sli4_res_hdr_t hdr; 2332*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2333*ef270ab1SKenneth D. Merry uint32_t number_returned_bytes; 2334*ef270ab1SKenneth D. Merry uint32_t number_remaining_bytes; 2335*ef270ab1SKenneth D. Merry uint32_t table_data0:8, 2336*ef270ab1SKenneth D. Merry :24; 2337*ef270ab1SKenneth D. Merry uint8_t table_data[0]; 2338*ef270ab1SKenneth D. Merry #else 2339*ef270ab1SKenneth D. Merry #error big endian version not defined 2340*ef270ab1SKenneth D. Merry #endif 2341*ef270ab1SKenneth D. Merry } sli4_res_common_ext_fat_read_string_table_t; 2342*ef270ab1SKenneth D. Merry 2343*ef270ab1SKenneth D. Merry /** 2344*ef270ab1SKenneth D. Merry * @brief COMMON_READ_TRANSCEIVER_DATA 2345*ef270ab1SKenneth D. Merry * 2346*ef270ab1SKenneth D. Merry * This command reads SFF transceiver data(Format is defined 2347*ef270ab1SKenneth D. Merry * by the SFF-8472 specification). 2348*ef270ab1SKenneth D. Merry */ 2349*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_read_transceiver_data_s { 2350*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 2351*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2352*ef270ab1SKenneth D. Merry uint32_t page_number; 2353*ef270ab1SKenneth D. Merry uint32_t port; 2354*ef270ab1SKenneth D. Merry #else 2355*ef270ab1SKenneth D. Merry #error big endian version not defined 2356*ef270ab1SKenneth D. Merry #endif 2357*ef270ab1SKenneth D. Merry } sli4_req_common_read_transceiver_data_t; 2358*ef270ab1SKenneth D. Merry 2359*ef270ab1SKenneth D. Merry typedef struct sli4_res_common_read_transceiver_data_s { 2360*ef270ab1SKenneth D. Merry sli4_res_hdr_t hdr; 2361*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2362*ef270ab1SKenneth D. Merry uint32_t page_number; 2363*ef270ab1SKenneth D. Merry uint32_t port; 2364*ef270ab1SKenneth D. Merry uint32_t page_data[32]; 2365*ef270ab1SKenneth D. Merry uint32_t page_data_2[32]; 2366*ef270ab1SKenneth D. Merry #else 2367*ef270ab1SKenneth D. Merry #error big endian version not defined 2368*ef270ab1SKenneth D. Merry #endif 2369*ef270ab1SKenneth D. Merry } sli4_res_common_read_transceiver_data_t; 2370*ef270ab1SKenneth D. Merry 2371*ef270ab1SKenneth D. Merry /** 2372*ef270ab1SKenneth D. Merry * @brief COMMON_READ_OBJECT 2373*ef270ab1SKenneth D. Merry */ 2374*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_read_object_s { 2375*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 2376*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2377*ef270ab1SKenneth D. Merry uint32_t desired_read_length:24, 2378*ef270ab1SKenneth D. Merry :8; 2379*ef270ab1SKenneth D. Merry uint32_t read_offset; 2380*ef270ab1SKenneth D. Merry uint8_t object_name[104]; 2381*ef270ab1SKenneth D. Merry uint32_t host_buffer_descriptor_count; 2382*ef270ab1SKenneth D. Merry sli4_bde_t host_buffer_descriptor[0]; 2383*ef270ab1SKenneth D. Merry #else 2384*ef270ab1SKenneth D. Merry #error big endian version not defined 2385*ef270ab1SKenneth D. Merry #endif 2386*ef270ab1SKenneth D. Merry } sli4_req_common_read_object_t; 2387*ef270ab1SKenneth D. Merry 2388*ef270ab1SKenneth D. Merry typedef struct sli4_res_common_read_object_s { 2389*ef270ab1SKenneth D. Merry sli4_res_hdr_t hdr; 2390*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2391*ef270ab1SKenneth D. Merry uint32_t actual_read_length; 2392*ef270ab1SKenneth D. Merry uint32_t resv:31, 2393*ef270ab1SKenneth D. Merry eof:1; 2394*ef270ab1SKenneth D. Merry #else 2395*ef270ab1SKenneth D. Merry #error big endian version not defined 2396*ef270ab1SKenneth D. Merry #endif 2397*ef270ab1SKenneth D. Merry } sli4_res_common_read_object_t; 2398*ef270ab1SKenneth D. Merry 2399*ef270ab1SKenneth D. Merry /** 2400*ef270ab1SKenneth D. Merry * @brief COMMON_WRITE_OBJECT 2401*ef270ab1SKenneth D. Merry */ 2402*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_write_object_s { 2403*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 2404*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2405*ef270ab1SKenneth D. Merry uint32_t desired_write_length:24, 2406*ef270ab1SKenneth D. Merry :6, 2407*ef270ab1SKenneth D. Merry noc:1, 2408*ef270ab1SKenneth D. Merry eof:1; 2409*ef270ab1SKenneth D. Merry uint32_t write_offset; 2410*ef270ab1SKenneth D. Merry uint8_t object_name[104]; 2411*ef270ab1SKenneth D. Merry uint32_t host_buffer_descriptor_count; 2412*ef270ab1SKenneth D. Merry sli4_bde_t host_buffer_descriptor[0]; 2413*ef270ab1SKenneth D. Merry #else 2414*ef270ab1SKenneth D. Merry #error big endian version not defined 2415*ef270ab1SKenneth D. Merry #endif 2416*ef270ab1SKenneth D. Merry } sli4_req_common_write_object_t; 2417*ef270ab1SKenneth D. Merry 2418*ef270ab1SKenneth D. Merry typedef struct sli4_res_common_write_object_s { 2419*ef270ab1SKenneth D. Merry sli4_res_hdr_t hdr; 2420*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2421*ef270ab1SKenneth D. Merry uint32_t actual_write_length; 2422*ef270ab1SKenneth D. Merry uint32_t change_status:8, 2423*ef270ab1SKenneth D. Merry :24; 2424*ef270ab1SKenneth D. Merry #else 2425*ef270ab1SKenneth D. Merry #error big endian version not defined 2426*ef270ab1SKenneth D. Merry #endif 2427*ef270ab1SKenneth D. Merry } sli4_res_common_write_object_t; 2428*ef270ab1SKenneth D. Merry 2429*ef270ab1SKenneth D. Merry /** 2430*ef270ab1SKenneth D. Merry * @brief COMMON_DELETE_OBJECT 2431*ef270ab1SKenneth D. Merry */ 2432*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_delete_object_s { 2433*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 2434*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2435*ef270ab1SKenneth D. Merry uint32_t rsvd4; 2436*ef270ab1SKenneth D. Merry uint32_t rsvd5; 2437*ef270ab1SKenneth D. Merry uint8_t object_name[104]; 2438*ef270ab1SKenneth D. Merry #else 2439*ef270ab1SKenneth D. Merry #error big endian version not defined 2440*ef270ab1SKenneth D. Merry #endif 2441*ef270ab1SKenneth D. Merry } sli4_req_common_delete_object_t; 2442*ef270ab1SKenneth D. Merry 2443*ef270ab1SKenneth D. Merry /** 2444*ef270ab1SKenneth D. Merry * @brief COMMON_READ_OBJECT_LIST 2445*ef270ab1SKenneth D. Merry */ 2446*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_read_object_list_s { 2447*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 2448*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2449*ef270ab1SKenneth D. Merry uint32_t desired_read_length:24, 2450*ef270ab1SKenneth D. Merry :8; 2451*ef270ab1SKenneth D. Merry uint32_t read_offset; 2452*ef270ab1SKenneth D. Merry uint8_t object_name[104]; 2453*ef270ab1SKenneth D. Merry uint32_t host_buffer_descriptor_count; 2454*ef270ab1SKenneth D. Merry sli4_bde_t host_buffer_descriptor[0]; 2455*ef270ab1SKenneth D. Merry #else 2456*ef270ab1SKenneth D. Merry #error big endian version not defined 2457*ef270ab1SKenneth D. Merry #endif 2458*ef270ab1SKenneth D. Merry } sli4_req_common_read_object_list_t; 2459*ef270ab1SKenneth D. Merry 2460*ef270ab1SKenneth D. Merry /** 2461*ef270ab1SKenneth D. Merry * @brief COMMON_SET_DUMP_LOCATION 2462*ef270ab1SKenneth D. Merry */ 2463*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_set_dump_location_s { 2464*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 2465*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2466*ef270ab1SKenneth D. Merry uint32_t buffer_length:24, 2467*ef270ab1SKenneth D. Merry :5, 2468*ef270ab1SKenneth D. Merry fdb:1, 2469*ef270ab1SKenneth D. Merry blp:1, 2470*ef270ab1SKenneth D. Merry qry:1; 2471*ef270ab1SKenneth D. Merry uint32_t buf_addr_low; 2472*ef270ab1SKenneth D. Merry uint32_t buf_addr_high; 2473*ef270ab1SKenneth D. Merry #else 2474*ef270ab1SKenneth D. Merry #error big endian version not defined 2475*ef270ab1SKenneth D. Merry #endif 2476*ef270ab1SKenneth D. Merry } sli4_req_common_set_dump_location_t; 2477*ef270ab1SKenneth D. Merry 2478*ef270ab1SKenneth D. Merry typedef struct sli4_res_common_set_dump_location_s { 2479*ef270ab1SKenneth D. Merry sli4_res_hdr_t hdr; 2480*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2481*ef270ab1SKenneth D. Merry uint32_t buffer_length:24, 2482*ef270ab1SKenneth D. Merry :8; 2483*ef270ab1SKenneth D. Merry #else 2484*ef270ab1SKenneth D. Merry #error big endian version not defined 2485*ef270ab1SKenneth D. Merry #endif 2486*ef270ab1SKenneth D. Merry }sli4_res_common_set_dump_location_t; 2487*ef270ab1SKenneth D. Merry 2488*ef270ab1SKenneth D. Merry /** 2489*ef270ab1SKenneth D. Merry * @brief COMMON_SET_SET_FEATURES 2490*ef270ab1SKenneth D. Merry */ 2491*ef270ab1SKenneth D. Merry #define SLI4_SET_FEATURES_DIF_SEED 0x01 2492*ef270ab1SKenneth D. Merry #define SLI4_SET_FEATURES_XRI_TIMER 0x03 2493*ef270ab1SKenneth D. Merry #define SLI4_SET_FEATURES_MAX_PCIE_SPEED 0x04 2494*ef270ab1SKenneth D. Merry #define SLI4_SET_FEATURES_FCTL_CHECK 0x05 2495*ef270ab1SKenneth D. Merry #define SLI4_SET_FEATURES_FEC 0x06 2496*ef270ab1SKenneth D. Merry #define SLI4_SET_FEATURES_PCIE_RECV_DETECT 0x07 2497*ef270ab1SKenneth D. Merry #define SLI4_SET_FEATURES_DIF_MEMORY_MODE 0x08 2498*ef270ab1SKenneth D. Merry #define SLI4_SET_FEATURES_DISABLE_SLI_PORT_PAUSE_STATE 0x09 2499*ef270ab1SKenneth D. Merry #define SLI4_SET_FEATURES_ENABLE_PCIE_OPTIONS 0x0A 2500*ef270ab1SKenneth D. Merry #define SLI4_SET_FEATURES_SET_CONFIG_AUTO_XFER_RDY_T10PI 0x0C 2501*ef270ab1SKenneth D. Merry #define SLI4_SET_FEATURES_ENABLE_MULTI_RECEIVE_QUEUE 0x0D 2502*ef270ab1SKenneth D. Merry #define SLI4_SET_FEATURES_SET_FTD_XFER_HINT 0x0F 2503*ef270ab1SKenneth D. Merry #define SLI4_SET_FEATURES_SLI_PORT_HEALTH_CHECK 0x11 2504*ef270ab1SKenneth D. Merry 2505*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_set_features_s { 2506*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 2507*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2508*ef270ab1SKenneth D. Merry uint32_t feature; 2509*ef270ab1SKenneth D. Merry uint32_t param_len; 2510*ef270ab1SKenneth D. Merry uint32_t params[8]; 2511*ef270ab1SKenneth D. Merry #else 2512*ef270ab1SKenneth D. Merry #error big endian version not defined 2513*ef270ab1SKenneth D. Merry #endif 2514*ef270ab1SKenneth D. Merry } sli4_req_common_set_features_t; 2515*ef270ab1SKenneth D. Merry 2516*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_set_features_dif_seed_s { 2517*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2518*ef270ab1SKenneth D. Merry uint32_t seed:16, 2519*ef270ab1SKenneth D. Merry :16; 2520*ef270ab1SKenneth D. Merry #else 2521*ef270ab1SKenneth D. Merry #error big endian version not defined 2522*ef270ab1SKenneth D. Merry #endif 2523*ef270ab1SKenneth D. Merry } sli4_req_common_set_features_dif_seed_t; 2524*ef270ab1SKenneth D. Merry 2525*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_set_features_t10_pi_mem_model_s { 2526*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2527*ef270ab1SKenneth D. Merry uint32_t tmm:1, 2528*ef270ab1SKenneth D. Merry :31; 2529*ef270ab1SKenneth D. Merry #else 2530*ef270ab1SKenneth D. Merry #error big endian version not defined 2531*ef270ab1SKenneth D. Merry #endif 2532*ef270ab1SKenneth D. Merry } sli4_req_common_set_features_t10_pi_mem_model_t; 2533*ef270ab1SKenneth D. Merry 2534*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_set_features_multirq_s { 2535*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2536*ef270ab1SKenneth D. Merry uint32_t isr:1, /*<< Include Sequence Reporting */ 2537*ef270ab1SKenneth D. Merry agxfe:1, /*<< Auto Generate XFER-RDY Feature Enabled */ 2538*ef270ab1SKenneth D. Merry :30; 2539*ef270ab1SKenneth D. Merry uint32_t num_rqs:8, 2540*ef270ab1SKenneth D. Merry rq_select_policy:4, 2541*ef270ab1SKenneth D. Merry :20; 2542*ef270ab1SKenneth D. Merry #else 2543*ef270ab1SKenneth D. Merry #error big endian version not defined 2544*ef270ab1SKenneth D. Merry #endif 2545*ef270ab1SKenneth D. Merry } sli4_req_common_set_features_multirq_t; 2546*ef270ab1SKenneth D. Merry 2547*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_set_features_xfer_rdy_t10pi_s { 2548*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2549*ef270ab1SKenneth D. Merry uint32_t rtc:1, 2550*ef270ab1SKenneth D. Merry atv:1, 2551*ef270ab1SKenneth D. Merry tmm:1, 2552*ef270ab1SKenneth D. Merry :1, 2553*ef270ab1SKenneth D. Merry p_type:3, 2554*ef270ab1SKenneth D. Merry blk_size:3, 2555*ef270ab1SKenneth D. Merry :22; 2556*ef270ab1SKenneth D. Merry uint32_t app_tag:16, 2557*ef270ab1SKenneth D. Merry :16; 2558*ef270ab1SKenneth D. Merry #else 2559*ef270ab1SKenneth D. Merry #error big endian version not defined 2560*ef270ab1SKenneth D. Merry #endif 2561*ef270ab1SKenneth D. Merry } sli4_req_common_set_features_xfer_rdy_t10pi_t; 2562*ef270ab1SKenneth D. Merry 2563*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_set_features_health_check_s { 2564*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2565*ef270ab1SKenneth D. Merry uint32_t hck:1, 2566*ef270ab1SKenneth D. Merry qry:1, 2567*ef270ab1SKenneth D. Merry :30; 2568*ef270ab1SKenneth D. Merry #else 2569*ef270ab1SKenneth D. Merry #error big endian version not defined 2570*ef270ab1SKenneth D. Merry #endif 2571*ef270ab1SKenneth D. Merry } sli4_req_common_set_features_health_check_t; 2572*ef270ab1SKenneth D. Merry 2573*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_set_features_set_fdt_xfer_hint_s { 2574*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2575*ef270ab1SKenneth D. Merry uint32_t fdt_xfer_hint; 2576*ef270ab1SKenneth D. Merry #else 2577*ef270ab1SKenneth D. Merry #error big endian version not defined 2578*ef270ab1SKenneth D. Merry #endif 2579*ef270ab1SKenneth D. Merry } sli4_req_common_set_features_set_fdt_xfer_hint_t; 2580*ef270ab1SKenneth D. Merry 2581*ef270ab1SKenneth D. Merry /** 2582*ef270ab1SKenneth D. Merry * @brief DMTF_EXEC_CLP_CMD 2583*ef270ab1SKenneth D. Merry */ 2584*ef270ab1SKenneth D. Merry typedef struct sli4_req_dmtf_exec_clp_cmd_s { 2585*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 2586*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2587*ef270ab1SKenneth D. Merry uint32_t cmd_buf_length; 2588*ef270ab1SKenneth D. Merry uint32_t resp_buf_length; 2589*ef270ab1SKenneth D. Merry uint32_t cmd_buf_addr_low; 2590*ef270ab1SKenneth D. Merry uint32_t cmd_buf_addr_high; 2591*ef270ab1SKenneth D. Merry uint32_t resp_buf_addr_low; 2592*ef270ab1SKenneth D. Merry uint32_t resp_buf_addr_high; 2593*ef270ab1SKenneth D. Merry #else 2594*ef270ab1SKenneth D. Merry #error big endian version not defined 2595*ef270ab1SKenneth D. Merry #endif 2596*ef270ab1SKenneth D. Merry } sli4_req_dmtf_exec_clp_cmd_t; 2597*ef270ab1SKenneth D. Merry 2598*ef270ab1SKenneth D. Merry typedef struct sli4_res_dmtf_exec_clp_cmd_s { 2599*ef270ab1SKenneth D. Merry sli4_res_hdr_t hdr; 2600*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2601*ef270ab1SKenneth D. Merry uint32_t :32; 2602*ef270ab1SKenneth D. Merry uint32_t resp_length; 2603*ef270ab1SKenneth D. Merry uint32_t :32; 2604*ef270ab1SKenneth D. Merry uint32_t :32; 2605*ef270ab1SKenneth D. Merry uint32_t :32; 2606*ef270ab1SKenneth D. Merry uint32_t :32; 2607*ef270ab1SKenneth D. Merry uint32_t clp_status; 2608*ef270ab1SKenneth D. Merry uint32_t clp_detailed_status; 2609*ef270ab1SKenneth D. Merry #else 2610*ef270ab1SKenneth D. Merry #error big endian version not defined 2611*ef270ab1SKenneth D. Merry #endif 2612*ef270ab1SKenneth D. Merry } sli4_res_dmtf_exec_clp_cmd_t; 2613*ef270ab1SKenneth D. Merry 2614*ef270ab1SKenneth D. Merry /** 2615*ef270ab1SKenneth D. Merry * @brief Resource descriptor 2616*ef270ab1SKenneth D. Merry */ 2617*ef270ab1SKenneth D. Merry 2618*ef270ab1SKenneth D. Merry #define SLI4_RESOURCE_DESCRIPTOR_TYPE_PCIE 0x50 2619*ef270ab1SKenneth D. Merry #define SLI4_RESOURCE_DESCRIPTOR_TYPE_NIC 0x51 2620*ef270ab1SKenneth D. Merry #define SLI4_RESOURCE_DESCRIPTOR_TYPE_ISCSI 0x52 2621*ef270ab1SKenneth D. Merry #define SLI4_RESOURCE_DESCRIPTOR_TYPE_FCFCOE 0x53 2622*ef270ab1SKenneth D. Merry #define SLI4_RESOURCE_DESCRIPTOR_TYPE_RDMA 0x54 2623*ef270ab1SKenneth D. Merry #define SLI4_RESOURCE_DESCRIPTOR_TYPE_PORT 0x55 2624*ef270ab1SKenneth D. Merry #define SLI4_RESOURCE_DESCRIPTOR_TYPE_ISAP 0x56 2625*ef270ab1SKenneth D. Merry 2626*ef270ab1SKenneth D. Merry #define SLI4_PROTOCOL_NIC_TOE 0x01 2627*ef270ab1SKenneth D. Merry #define SLI4_PROTOCOL_ISCSI 0x02 2628*ef270ab1SKenneth D. Merry #define SLI4_PROTOCOL_FCOE 0x04 2629*ef270ab1SKenneth D. Merry #define SLI4_PROTOCOL_NIC_TOE_RDMA 0x08 2630*ef270ab1SKenneth D. Merry #define SLI4_PROTOCOL_FC 0x10 2631*ef270ab1SKenneth D. Merry #define SLI4_PROTOCOL_DEFAULT 0xff 2632*ef270ab1SKenneth D. Merry 2633*ef270ab1SKenneth D. Merry typedef struct sli4_resource_descriptor_v1_s { 2634*ef270ab1SKenneth D. Merry uint32_t descriptor_type:8, 2635*ef270ab1SKenneth D. Merry descriptor_length:8, 2636*ef270ab1SKenneth D. Merry :16; 2637*ef270ab1SKenneth D. Merry uint32_t type_specific[0]; 2638*ef270ab1SKenneth D. Merry } sli4_resource_descriptor_v1_t; 2639*ef270ab1SKenneth D. Merry 2640*ef270ab1SKenneth D. Merry typedef struct sli4_pcie_resource_descriptor_v1_s { 2641*ef270ab1SKenneth D. Merry uint32_t descriptor_type:8, 2642*ef270ab1SKenneth D. Merry descriptor_length:8, 2643*ef270ab1SKenneth D. Merry :14, 2644*ef270ab1SKenneth D. Merry imm:1, 2645*ef270ab1SKenneth D. Merry nosv:1; 2646*ef270ab1SKenneth D. Merry uint32_t :16, 2647*ef270ab1SKenneth D. Merry pf_number:10, 2648*ef270ab1SKenneth D. Merry :6; 2649*ef270ab1SKenneth D. Merry uint32_t rsvd1; 2650*ef270ab1SKenneth D. Merry uint32_t sriov_state:8, 2651*ef270ab1SKenneth D. Merry pf_state:8, 2652*ef270ab1SKenneth D. Merry pf_type:8, 2653*ef270ab1SKenneth D. Merry :8; 2654*ef270ab1SKenneth D. Merry uint32_t number_of_vfs:16, 2655*ef270ab1SKenneth D. Merry :16; 2656*ef270ab1SKenneth D. Merry uint32_t mission_roles:8, 2657*ef270ab1SKenneth D. Merry :19, 2658*ef270ab1SKenneth D. Merry pchg:1, 2659*ef270ab1SKenneth D. Merry schg:1, 2660*ef270ab1SKenneth D. Merry xchg:1, 2661*ef270ab1SKenneth D. Merry xrom:2; 2662*ef270ab1SKenneth D. Merry uint32_t rsvd2[16]; 2663*ef270ab1SKenneth D. Merry } sli4_pcie_resource_descriptor_v1_t; 2664*ef270ab1SKenneth D. Merry 2665*ef270ab1SKenneth D. Merry typedef struct sli4_isap_resource_descriptor_v1_s { 2666*ef270ab1SKenneth D. Merry uint32_t descriptor_type:8, 2667*ef270ab1SKenneth D. Merry descriptor_length:8, 2668*ef270ab1SKenneth D. Merry :16; 2669*ef270ab1SKenneth D. Merry uint32_t iscsi_tgt:1, 2670*ef270ab1SKenneth D. Merry iscsi_ini:1, 2671*ef270ab1SKenneth D. Merry iscsi_dif:1, 2672*ef270ab1SKenneth D. Merry :29; 2673*ef270ab1SKenneth D. Merry uint32_t rsvd1[3]; 2674*ef270ab1SKenneth D. Merry uint32_t fcoe_tgt:1, 2675*ef270ab1SKenneth D. Merry fcoe_ini:1, 2676*ef270ab1SKenneth D. Merry fcoe_dif:1, 2677*ef270ab1SKenneth D. Merry :29; 2678*ef270ab1SKenneth D. Merry uint32_t rsvd2[7]; 2679*ef270ab1SKenneth D. Merry uint32_t mc_type0:8, 2680*ef270ab1SKenneth D. Merry mc_type1:8, 2681*ef270ab1SKenneth D. Merry mc_type2:8, 2682*ef270ab1SKenneth D. Merry mc_type3:8; 2683*ef270ab1SKenneth D. Merry uint32_t rsvd3[3]; 2684*ef270ab1SKenneth D. Merry } sli4_isap_resouce_descriptor_v1_t; 2685*ef270ab1SKenneth D. Merry 2686*ef270ab1SKenneth D. Merry /** 2687*ef270ab1SKenneth D. Merry * @brief COMMON_GET_FUNCTION_CONFIG 2688*ef270ab1SKenneth D. Merry */ 2689*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_get_function_config_s { 2690*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 2691*ef270ab1SKenneth D. Merry } sli4_req_common_get_function_config_t; 2692*ef270ab1SKenneth D. Merry 2693*ef270ab1SKenneth D. Merry typedef struct sli4_res_common_get_function_config_s { 2694*ef270ab1SKenneth D. Merry sli4_res_hdr_t hdr; 2695*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2696*ef270ab1SKenneth D. Merry uint32_t desc_count; 2697*ef270ab1SKenneth D. Merry uint32_t desc[54]; 2698*ef270ab1SKenneth D. Merry #else 2699*ef270ab1SKenneth D. Merry #error big endian version not defined 2700*ef270ab1SKenneth D. Merry #endif 2701*ef270ab1SKenneth D. Merry } sli4_res_common_get_function_config_t; 2702*ef270ab1SKenneth D. Merry 2703*ef270ab1SKenneth D. Merry /** 2704*ef270ab1SKenneth D. Merry * @brief COMMON_GET_PROFILE_CONFIG 2705*ef270ab1SKenneth D. Merry */ 2706*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_get_profile_config_s { 2707*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 2708*ef270ab1SKenneth D. Merry uint32_t profile_id:8, 2709*ef270ab1SKenneth D. Merry typ:2, 2710*ef270ab1SKenneth D. Merry :22; 2711*ef270ab1SKenneth D. Merry } sli4_req_common_get_profile_config_t; 2712*ef270ab1SKenneth D. Merry 2713*ef270ab1SKenneth D. Merry typedef struct sli4_res_common_get_profile_config_s { 2714*ef270ab1SKenneth D. Merry sli4_res_hdr_t hdr; 2715*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2716*ef270ab1SKenneth D. Merry uint32_t desc_count; 2717*ef270ab1SKenneth D. Merry uint32_t desc[0]; 2718*ef270ab1SKenneth D. Merry #else 2719*ef270ab1SKenneth D. Merry #error big endian version not defined 2720*ef270ab1SKenneth D. Merry #endif 2721*ef270ab1SKenneth D. Merry } sli4_res_common_get_profile_config_t; 2722*ef270ab1SKenneth D. Merry 2723*ef270ab1SKenneth D. Merry /** 2724*ef270ab1SKenneth D. Merry * @brief COMMON_SET_PROFILE_CONFIG 2725*ef270ab1SKenneth D. Merry */ 2726*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_set_profile_config_s { 2727*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 2728*ef270ab1SKenneth D. Merry uint32_t profile_id:8, 2729*ef270ab1SKenneth D. Merry :23, 2730*ef270ab1SKenneth D. Merry isap:1; 2731*ef270ab1SKenneth D. Merry uint32_t desc_count; 2732*ef270ab1SKenneth D. Merry uint32_t desc[0]; 2733*ef270ab1SKenneth D. Merry } sli4_req_common_set_profile_config_t; 2734*ef270ab1SKenneth D. Merry 2735*ef270ab1SKenneth D. Merry typedef struct sli4_res_common_set_profile_config_s { 2736*ef270ab1SKenneth D. Merry sli4_res_hdr_t hdr; 2737*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2738*ef270ab1SKenneth D. Merry #else 2739*ef270ab1SKenneth D. Merry #error big endian version not defined 2740*ef270ab1SKenneth D. Merry #endif 2741*ef270ab1SKenneth D. Merry } sli4_res_common_set_profile_config_t; 2742*ef270ab1SKenneth D. Merry 2743*ef270ab1SKenneth D. Merry /** 2744*ef270ab1SKenneth D. Merry * @brief Profile Descriptor for profile functions 2745*ef270ab1SKenneth D. Merry */ 2746*ef270ab1SKenneth D. Merry typedef struct sli4_profile_descriptor_s { 2747*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2748*ef270ab1SKenneth D. Merry uint32_t profile_id:8, 2749*ef270ab1SKenneth D. Merry :8, 2750*ef270ab1SKenneth D. Merry profile_index:8, 2751*ef270ab1SKenneth D. Merry :8; 2752*ef270ab1SKenneth D. Merry uint32_t profile_description[128]; 2753*ef270ab1SKenneth D. Merry #else 2754*ef270ab1SKenneth D. Merry #error big endian version not defined 2755*ef270ab1SKenneth D. Merry #endif 2756*ef270ab1SKenneth D. Merry } sli4_profile_descriptor_t; 2757*ef270ab1SKenneth D. Merry 2758*ef270ab1SKenneth D. Merry /* We don't know in advance how many descriptors there are. We have 2759*ef270ab1SKenneth D. Merry to pick a number that we think will be big enough and ask for that 2760*ef270ab1SKenneth D. Merry many. */ 2761*ef270ab1SKenneth D. Merry 2762*ef270ab1SKenneth D. Merry #define MAX_PRODUCT_DESCRIPTORS 40 2763*ef270ab1SKenneth D. Merry 2764*ef270ab1SKenneth D. Merry /** 2765*ef270ab1SKenneth D. Merry * @brief COMMON_GET_PROFILE_LIST 2766*ef270ab1SKenneth D. Merry */ 2767*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_get_profile_list_s { 2768*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 2769*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2770*ef270ab1SKenneth D. Merry uint32_t start_profile_index:8, 2771*ef270ab1SKenneth D. Merry :24; 2772*ef270ab1SKenneth D. Merry #else 2773*ef270ab1SKenneth D. Merry #error big endian version not defined 2774*ef270ab1SKenneth D. Merry #endif 2775*ef270ab1SKenneth D. Merry } sli4_req_common_get_profile_list_t; 2776*ef270ab1SKenneth D. Merry 2777*ef270ab1SKenneth D. Merry typedef struct sli4_res_common_get_profile_list_s { 2778*ef270ab1SKenneth D. Merry sli4_res_hdr_t hdr; 2779*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2780*ef270ab1SKenneth D. Merry uint32_t profile_descriptor_count; 2781*ef270ab1SKenneth D. Merry sli4_profile_descriptor_t profile_descriptor[MAX_PRODUCT_DESCRIPTORS]; 2782*ef270ab1SKenneth D. Merry #else 2783*ef270ab1SKenneth D. Merry #error big endian version not defined 2784*ef270ab1SKenneth D. Merry #endif 2785*ef270ab1SKenneth D. Merry } sli4_res_common_get_profile_list_t; 2786*ef270ab1SKenneth D. Merry 2787*ef270ab1SKenneth D. Merry /** 2788*ef270ab1SKenneth D. Merry * @brief COMMON_GET_ACTIVE_PROFILE 2789*ef270ab1SKenneth D. Merry */ 2790*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_get_active_profile_s { 2791*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 2792*ef270ab1SKenneth D. Merry } sli4_req_common_get_active_profile_t; 2793*ef270ab1SKenneth D. Merry 2794*ef270ab1SKenneth D. Merry typedef struct sli4_res_common_get_active_profile_s { 2795*ef270ab1SKenneth D. Merry sli4_res_hdr_t hdr; 2796*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2797*ef270ab1SKenneth D. Merry uint32_t active_profile_id:8, 2798*ef270ab1SKenneth D. Merry :8, 2799*ef270ab1SKenneth D. Merry next_profile_id:8, 2800*ef270ab1SKenneth D. Merry :8; 2801*ef270ab1SKenneth D. Merry #else 2802*ef270ab1SKenneth D. Merry #error big endian version not defined 2803*ef270ab1SKenneth D. Merry #endif 2804*ef270ab1SKenneth D. Merry } sli4_res_common_get_active_profile_t; 2805*ef270ab1SKenneth D. Merry 2806*ef270ab1SKenneth D. Merry /** 2807*ef270ab1SKenneth D. Merry * @brief COMMON_SET_ACTIVE_PROFILE 2808*ef270ab1SKenneth D. Merry */ 2809*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_set_active_profile_s { 2810*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 2811*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2812*ef270ab1SKenneth D. Merry uint32_t active_profile_id:8, 2813*ef270ab1SKenneth D. Merry :23, 2814*ef270ab1SKenneth D. Merry fd:1; 2815*ef270ab1SKenneth D. Merry #else 2816*ef270ab1SKenneth D. Merry #error big endian version not defined 2817*ef270ab1SKenneth D. Merry #endif 2818*ef270ab1SKenneth D. Merry } sli4_req_common_set_active_profile_t; 2819*ef270ab1SKenneth D. Merry 2820*ef270ab1SKenneth D. Merry typedef struct sli4_res_common_set_active_profile_s { 2821*ef270ab1SKenneth D. Merry sli4_res_hdr_t hdr; 2822*ef270ab1SKenneth D. Merry } sli4_res_common_set_active_profile_t; 2823*ef270ab1SKenneth D. Merry 2824*ef270ab1SKenneth D. Merry /** 2825*ef270ab1SKenneth D. Merry * @brief Link Config Descriptor for link config functions 2826*ef270ab1SKenneth D. Merry */ 2827*ef270ab1SKenneth D. Merry typedef struct sli4_link_config_descriptor_s { 2828*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2829*ef270ab1SKenneth D. Merry uint32_t link_config_id:8, 2830*ef270ab1SKenneth D. Merry :24; 2831*ef270ab1SKenneth D. Merry uint32_t config_description[8]; 2832*ef270ab1SKenneth D. Merry #else 2833*ef270ab1SKenneth D. Merry #error big endian version not defined 2834*ef270ab1SKenneth D. Merry #endif 2835*ef270ab1SKenneth D. Merry } sli4_link_config_descriptor_t; 2836*ef270ab1SKenneth D. Merry 2837*ef270ab1SKenneth D. Merry #define MAX_LINK_CONFIG_DESCRIPTORS 10 2838*ef270ab1SKenneth D. Merry 2839*ef270ab1SKenneth D. Merry /** 2840*ef270ab1SKenneth D. Merry * @brief COMMON_GET_RECONFIG_LINK_INFO 2841*ef270ab1SKenneth D. Merry */ 2842*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_get_reconfig_link_info_s { 2843*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 2844*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2845*ef270ab1SKenneth D. Merry #else 2846*ef270ab1SKenneth D. Merry #error big endian version not defined 2847*ef270ab1SKenneth D. Merry #endif 2848*ef270ab1SKenneth D. Merry } sli4_req_common_get_reconfig_link_info_t; 2849*ef270ab1SKenneth D. Merry 2850*ef270ab1SKenneth D. Merry typedef struct sli4_res_common_get_reconfig_link_info_s { 2851*ef270ab1SKenneth D. Merry sli4_res_hdr_t hdr; 2852*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2853*ef270ab1SKenneth D. Merry uint32_t active_link_config_id:8, 2854*ef270ab1SKenneth D. Merry :8, 2855*ef270ab1SKenneth D. Merry next_link_config_id:8, 2856*ef270ab1SKenneth D. Merry :8; 2857*ef270ab1SKenneth D. Merry uint32_t link_configuration_descriptor_count; 2858*ef270ab1SKenneth D. Merry sli4_link_config_descriptor_t desc[MAX_LINK_CONFIG_DESCRIPTORS]; 2859*ef270ab1SKenneth D. Merry #else 2860*ef270ab1SKenneth D. Merry #error big endian version not defined 2861*ef270ab1SKenneth D. Merry #endif 2862*ef270ab1SKenneth D. Merry } sli4_res_common_get_reconfig_link_info_t; 2863*ef270ab1SKenneth D. Merry 2864*ef270ab1SKenneth D. Merry /** 2865*ef270ab1SKenneth D. Merry * @brief COMMON_SET_RECONFIG_LINK_ID 2866*ef270ab1SKenneth D. Merry */ 2867*ef270ab1SKenneth D. Merry typedef struct sli4_req_common_set_reconfig_link_id_s { 2868*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 2869*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2870*ef270ab1SKenneth D. Merry uint32_t next_link_config_id:8, 2871*ef270ab1SKenneth D. Merry :23, 2872*ef270ab1SKenneth D. Merry fd:1; 2873*ef270ab1SKenneth D. Merry #else 2874*ef270ab1SKenneth D. Merry #error big endian version not defined 2875*ef270ab1SKenneth D. Merry #endif 2876*ef270ab1SKenneth D. Merry } sli4_req_common_set_reconfig_link_id_t; 2877*ef270ab1SKenneth D. Merry 2878*ef270ab1SKenneth D. Merry typedef struct sli4_res_common_set_reconfig_link_id_s { 2879*ef270ab1SKenneth D. Merry sli4_res_hdr_t hdr; 2880*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2881*ef270ab1SKenneth D. Merry #else 2882*ef270ab1SKenneth D. Merry #error big endian version not defined 2883*ef270ab1SKenneth D. Merry #endif 2884*ef270ab1SKenneth D. Merry } sli4_res_common_set_reconfig_link_id_t; 2885*ef270ab1SKenneth D. Merry 2886*ef270ab1SKenneth D. Merry 2887*ef270ab1SKenneth D. Merry typedef struct sli4_req_lowlevel_set_watchdog_s { 2888*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 2889*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2890*ef270ab1SKenneth D. Merry uint32_t watchdog_timeout:16, 2891*ef270ab1SKenneth D. Merry :16; 2892*ef270ab1SKenneth D. Merry #else 2893*ef270ab1SKenneth D. Merry #error big endian version not defined 2894*ef270ab1SKenneth D. Merry #endif 2895*ef270ab1SKenneth D. Merry 2896*ef270ab1SKenneth D. Merry } sli4_req_lowlevel_set_watchdog_t; 2897*ef270ab1SKenneth D. Merry 2898*ef270ab1SKenneth D. Merry 2899*ef270ab1SKenneth D. Merry typedef struct sli4_res_lowlevel_set_watchdog_s { 2900*ef270ab1SKenneth D. Merry sli4_res_hdr_t hdr; 2901*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2902*ef270ab1SKenneth D. Merry uint32_t rsvd; 2903*ef270ab1SKenneth D. Merry #else 2904*ef270ab1SKenneth D. Merry #error big endian version not defined 2905*ef270ab1SKenneth D. Merry #endif 2906*ef270ab1SKenneth D. Merry } sli4_res_lowlevel_set_watchdog_t; 2907*ef270ab1SKenneth D. Merry 2908*ef270ab1SKenneth D. Merry /** 2909*ef270ab1SKenneth D. Merry * @brief Event Queue Entry 2910*ef270ab1SKenneth D. Merry */ 2911*ef270ab1SKenneth D. Merry typedef struct sli4_eqe_s { 2912*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2913*ef270ab1SKenneth D. Merry uint32_t vld:1, /** valid */ 2914*ef270ab1SKenneth D. Merry major_code:3, 2915*ef270ab1SKenneth D. Merry minor_code:12, 2916*ef270ab1SKenneth D. Merry resource_id:16; 2917*ef270ab1SKenneth D. Merry #else 2918*ef270ab1SKenneth D. Merry #error big endian version not defined 2919*ef270ab1SKenneth D. Merry #endif 2920*ef270ab1SKenneth D. Merry } sli4_eqe_t; 2921*ef270ab1SKenneth D. Merry 2922*ef270ab1SKenneth D. Merry #define SLI4_MAJOR_CODE_STANDARD 0 2923*ef270ab1SKenneth D. Merry #define SLI4_MAJOR_CODE_SENTINEL 1 2924*ef270ab1SKenneth D. Merry 2925*ef270ab1SKenneth D. Merry /** 2926*ef270ab1SKenneth D. Merry * @brief Mailbox Completion Queue Entry 2927*ef270ab1SKenneth D. Merry * 2928*ef270ab1SKenneth D. Merry * A CQE generated on the completion of a MQE from a MQ. 2929*ef270ab1SKenneth D. Merry */ 2930*ef270ab1SKenneth D. Merry typedef struct sli4_mcqe_s { 2931*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2932*ef270ab1SKenneth D. Merry uint32_t completion_status:16, /** values are protocol specific */ 2933*ef270ab1SKenneth D. Merry extended_status:16; 2934*ef270ab1SKenneth D. Merry uint32_t mqe_tag_low; 2935*ef270ab1SKenneth D. Merry uint32_t mqe_tag_high; 2936*ef270ab1SKenneth D. Merry uint32_t :27, 2937*ef270ab1SKenneth D. Merry con:1, /** consumed - command now being executed */ 2938*ef270ab1SKenneth D. Merry cmp:1, /** completed - command still executing if clear */ 2939*ef270ab1SKenneth D. Merry :1, 2940*ef270ab1SKenneth D. Merry ae:1, /** async event - this is an ACQE */ 2941*ef270ab1SKenneth D. Merry val:1; /** valid - contents of CQE are valid */ 2942*ef270ab1SKenneth D. Merry #else 2943*ef270ab1SKenneth D. Merry #error big endian version not defined 2944*ef270ab1SKenneth D. Merry #endif 2945*ef270ab1SKenneth D. Merry } sli4_mcqe_t; 2946*ef270ab1SKenneth D. Merry 2947*ef270ab1SKenneth D. Merry 2948*ef270ab1SKenneth D. Merry /** 2949*ef270ab1SKenneth D. Merry * @brief Asynchronous Completion Queue Entry 2950*ef270ab1SKenneth D. Merry * 2951*ef270ab1SKenneth D. Merry * A CQE generated asynchronously in response to the link or other internal events. 2952*ef270ab1SKenneth D. Merry */ 2953*ef270ab1SKenneth D. Merry typedef struct sli4_acqe_s { 2954*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 2955*ef270ab1SKenneth D. Merry uint32_t event_data[3]; 2956*ef270ab1SKenneth D. Merry uint32_t :8, 2957*ef270ab1SKenneth D. Merry event_code:8, 2958*ef270ab1SKenneth D. Merry event_type:8, /** values are protocol specific */ 2959*ef270ab1SKenneth D. Merry :6, 2960*ef270ab1SKenneth D. Merry ae:1, /** async event - this is an ACQE */ 2961*ef270ab1SKenneth D. Merry val:1; /** valid - contents of CQE are valid */ 2962*ef270ab1SKenneth D. Merry #else 2963*ef270ab1SKenneth D. Merry #error big endian version not defined 2964*ef270ab1SKenneth D. Merry #endif 2965*ef270ab1SKenneth D. Merry } sli4_acqe_t; 2966*ef270ab1SKenneth D. Merry 2967*ef270ab1SKenneth D. Merry #define SLI4_ACQE_EVENT_CODE_LINK_STATE 0x01 2968*ef270ab1SKenneth D. Merry #define SLI4_ACQE_EVENT_CODE_FCOE_FIP 0x02 2969*ef270ab1SKenneth D. Merry #define SLI4_ACQE_EVENT_CODE_DCBX 0x03 2970*ef270ab1SKenneth D. Merry #define SLI4_ACQE_EVENT_CODE_ISCSI 0x04 2971*ef270ab1SKenneth D. Merry #define SLI4_ACQE_EVENT_CODE_GRP_5 0x05 2972*ef270ab1SKenneth D. Merry #define SLI4_ACQE_EVENT_CODE_FC_LINK_EVENT 0x10 2973*ef270ab1SKenneth D. Merry #define SLI4_ACQE_EVENT_CODE_SLI_PORT_EVENT 0x11 2974*ef270ab1SKenneth D. Merry #define SLI4_ACQE_EVENT_CODE_VF_EVENT 0x12 2975*ef270ab1SKenneth D. Merry #define SLI4_ACQE_EVENT_CODE_MR_EVENT 0x13 2976*ef270ab1SKenneth D. Merry 2977*ef270ab1SKenneth D. Merry /** 2978*ef270ab1SKenneth D. Merry * @brief Register name enums 2979*ef270ab1SKenneth D. Merry */ 2980*ef270ab1SKenneth D. Merry typedef enum { 2981*ef270ab1SKenneth D. Merry SLI4_REG_BMBX, 2982*ef270ab1SKenneth D. Merry SLI4_REG_EQCQ_DOORBELL, 2983*ef270ab1SKenneth D. Merry SLI4_REG_FCOE_RQ_DOORBELL, 2984*ef270ab1SKenneth D. Merry SLI4_REG_IO_WQ_DOORBELL, 2985*ef270ab1SKenneth D. Merry SLI4_REG_MQ_DOORBELL, 2986*ef270ab1SKenneth D. Merry SLI4_REG_PHYSDEV_CONTROL, 2987*ef270ab1SKenneth D. Merry SLI4_REG_SLIPORT_CONTROL, 2988*ef270ab1SKenneth D. Merry SLI4_REG_SLIPORT_ERROR1, 2989*ef270ab1SKenneth D. Merry SLI4_REG_SLIPORT_ERROR2, 2990*ef270ab1SKenneth D. Merry SLI4_REG_SLIPORT_SEMAPHORE, 2991*ef270ab1SKenneth D. Merry SLI4_REG_SLIPORT_STATUS, 2992*ef270ab1SKenneth D. Merry SLI4_REG_UERR_MASK_HI, 2993*ef270ab1SKenneth D. Merry SLI4_REG_UERR_MASK_LO, 2994*ef270ab1SKenneth D. Merry SLI4_REG_UERR_STATUS_HI, 2995*ef270ab1SKenneth D. Merry SLI4_REG_UERR_STATUS_LO, 2996*ef270ab1SKenneth D. Merry SLI4_REG_SW_UE_CSR1, 2997*ef270ab1SKenneth D. Merry SLI4_REG_SW_UE_CSR2, 2998*ef270ab1SKenneth D. Merry SLI4_REG_MAX /* must be last */ 2999*ef270ab1SKenneth D. Merry } sli4_regname_e; 3000*ef270ab1SKenneth D. Merry 3001*ef270ab1SKenneth D. Merry typedef struct sli4_reg_s { 3002*ef270ab1SKenneth D. Merry uint32_t rset; 3003*ef270ab1SKenneth D. Merry uint32_t off; 3004*ef270ab1SKenneth D. Merry } sli4_reg_t; 3005*ef270ab1SKenneth D. Merry 3006*ef270ab1SKenneth D. Merry typedef enum { 3007*ef270ab1SKenneth D. Merry SLI_QTYPE_EQ, 3008*ef270ab1SKenneth D. Merry SLI_QTYPE_CQ, 3009*ef270ab1SKenneth D. Merry SLI_QTYPE_MQ, 3010*ef270ab1SKenneth D. Merry SLI_QTYPE_WQ, 3011*ef270ab1SKenneth D. Merry SLI_QTYPE_RQ, 3012*ef270ab1SKenneth D. Merry SLI_QTYPE_MAX, /* must be last */ 3013*ef270ab1SKenneth D. Merry } sli4_qtype_e; 3014*ef270ab1SKenneth D. Merry 3015*ef270ab1SKenneth D. Merry #define SLI_USER_MQ_COUNT 1 /** User specified max mail queues */ 3016*ef270ab1SKenneth D. Merry #define SLI_MAX_CQ_SET_COUNT 16 3017*ef270ab1SKenneth D. Merry #define SLI_MAX_RQ_SET_COUNT 16 3018*ef270ab1SKenneth D. Merry 3019*ef270ab1SKenneth D. Merry typedef enum { 3020*ef270ab1SKenneth D. Merry SLI_QENTRY_ASYNC, 3021*ef270ab1SKenneth D. Merry SLI_QENTRY_MQ, 3022*ef270ab1SKenneth D. Merry SLI_QENTRY_RQ, 3023*ef270ab1SKenneth D. Merry SLI_QENTRY_WQ, 3024*ef270ab1SKenneth D. Merry SLI_QENTRY_WQ_RELEASE, 3025*ef270ab1SKenneth D. Merry SLI_QENTRY_OPT_WRITE_CMD, 3026*ef270ab1SKenneth D. Merry SLI_QENTRY_OPT_WRITE_DATA, 3027*ef270ab1SKenneth D. Merry SLI_QENTRY_XABT, 3028*ef270ab1SKenneth D. Merry SLI_QENTRY_MAX /* must be last */ 3029*ef270ab1SKenneth D. Merry } sli4_qentry_e; 3030*ef270ab1SKenneth D. Merry 3031*ef270ab1SKenneth D. Merry typedef struct sli4_queue_s { 3032*ef270ab1SKenneth D. Merry /* Common to all queue types */ 3033*ef270ab1SKenneth D. Merry ocs_dma_t dma; 3034*ef270ab1SKenneth D. Merry ocs_lock_t lock; 3035*ef270ab1SKenneth D. Merry uint32_t index; /** current host entry index */ 3036*ef270ab1SKenneth D. Merry uint16_t size; /** entry size */ 3037*ef270ab1SKenneth D. Merry uint16_t length; /** number of entries */ 3038*ef270ab1SKenneth D. Merry uint16_t n_posted; /** number entries posted */ 3039*ef270ab1SKenneth D. Merry uint16_t id; /** Port assigned xQ_ID */ 3040*ef270ab1SKenneth D. Merry uint16_t ulp; /** ULP assigned to this queue */ 3041*ef270ab1SKenneth D. Merry uint32_t doorbell_offset;/** The offset for the doorbell */ 3042*ef270ab1SKenneth D. Merry uint16_t doorbell_rset; /** register set for the doorbell */ 3043*ef270ab1SKenneth D. Merry uint8_t type; /** queue type ie EQ, CQ, ... */ 3044*ef270ab1SKenneth D. Merry uint32_t proc_limit; /** limit number of CQE processed per iteration */ 3045*ef270ab1SKenneth D. Merry uint32_t posted_limit; /** number of CQE/EQE to process before ringing doorbell */ 3046*ef270ab1SKenneth D. Merry uint32_t max_num_processed; 3047*ef270ab1SKenneth D. Merry time_t max_process_time; 3048*ef270ab1SKenneth D. Merry 3049*ef270ab1SKenneth D. Merry /* Type specific gunk */ 3050*ef270ab1SKenneth D. Merry union { 3051*ef270ab1SKenneth D. Merry uint32_t r_idx; /** "read" index (MQ only) */ 3052*ef270ab1SKenneth D. Merry struct { 3053*ef270ab1SKenneth D. Merry uint32_t is_mq:1,/** CQ contains MQ/Async completions */ 3054*ef270ab1SKenneth D. Merry is_hdr:1,/** is a RQ for packet headers */ 3055*ef270ab1SKenneth D. Merry rq_batch:1;/** RQ index incremented by 8 */ 3056*ef270ab1SKenneth D. Merry } flag; 3057*ef270ab1SKenneth D. Merry } u; 3058*ef270ab1SKenneth D. Merry } sli4_queue_t; 3059*ef270ab1SKenneth D. Merry 3060*ef270ab1SKenneth D. Merry static inline void 3061*ef270ab1SKenneth D. Merry sli_queue_lock(sli4_queue_t *q) 3062*ef270ab1SKenneth D. Merry { 3063*ef270ab1SKenneth D. Merry ocs_lock(&q->lock); 3064*ef270ab1SKenneth D. Merry } 3065*ef270ab1SKenneth D. Merry 3066*ef270ab1SKenneth D. Merry static inline void 3067*ef270ab1SKenneth D. Merry sli_queue_unlock(sli4_queue_t *q) 3068*ef270ab1SKenneth D. Merry { 3069*ef270ab1SKenneth D. Merry ocs_unlock(&q->lock); 3070*ef270ab1SKenneth D. Merry } 3071*ef270ab1SKenneth D. Merry 3072*ef270ab1SKenneth D. Merry 3073*ef270ab1SKenneth D. Merry #define SLI4_QUEUE_DEFAULT_CQ UINT16_MAX /** Use the default CQ */ 3074*ef270ab1SKenneth D. Merry 3075*ef270ab1SKenneth D. Merry #define SLI4_QUEUE_RQ_BATCH 8 3076*ef270ab1SKenneth D. Merry 3077*ef270ab1SKenneth D. Merry typedef enum { 3078*ef270ab1SKenneth D. Merry SLI4_CB_LINK, 3079*ef270ab1SKenneth D. Merry SLI4_CB_FIP, 3080*ef270ab1SKenneth D. Merry SLI4_CB_MAX /* must be last */ 3081*ef270ab1SKenneth D. Merry } sli4_callback_e; 3082*ef270ab1SKenneth D. Merry 3083*ef270ab1SKenneth D. Merry typedef enum { 3084*ef270ab1SKenneth D. Merry SLI_LINK_STATUS_UP, 3085*ef270ab1SKenneth D. Merry SLI_LINK_STATUS_DOWN, 3086*ef270ab1SKenneth D. Merry SLI_LINK_STATUS_NO_ALPA, 3087*ef270ab1SKenneth D. Merry SLI_LINK_STATUS_MAX, 3088*ef270ab1SKenneth D. Merry } sli4_link_status_e; 3089*ef270ab1SKenneth D. Merry 3090*ef270ab1SKenneth D. Merry typedef enum { 3091*ef270ab1SKenneth D. Merry SLI_LINK_TOPO_NPORT = 1, /** fabric or point-to-point */ 3092*ef270ab1SKenneth D. Merry SLI_LINK_TOPO_LOOP, 3093*ef270ab1SKenneth D. Merry SLI_LINK_TOPO_LOOPBACK_INTERNAL, 3094*ef270ab1SKenneth D. Merry SLI_LINK_TOPO_LOOPBACK_EXTERNAL, 3095*ef270ab1SKenneth D. Merry SLI_LINK_TOPO_NONE, 3096*ef270ab1SKenneth D. Merry SLI_LINK_TOPO_MAX, 3097*ef270ab1SKenneth D. Merry } sli4_link_topology_e; 3098*ef270ab1SKenneth D. Merry 3099*ef270ab1SKenneth D. Merry /* TODO do we need both sli4_port_type_e & sli4_link_medium_e */ 3100*ef270ab1SKenneth D. Merry typedef enum { 3101*ef270ab1SKenneth D. Merry SLI_LINK_MEDIUM_ETHERNET, 3102*ef270ab1SKenneth D. Merry SLI_LINK_MEDIUM_FC, 3103*ef270ab1SKenneth D. Merry SLI_LINK_MEDIUM_MAX, 3104*ef270ab1SKenneth D. Merry } sli4_link_medium_e; 3105*ef270ab1SKenneth D. Merry 3106*ef270ab1SKenneth D. Merry typedef struct sli4_link_event_s { 3107*ef270ab1SKenneth D. Merry sli4_link_status_e status; /* link up/down */ 3108*ef270ab1SKenneth D. Merry sli4_link_topology_e topology; 3109*ef270ab1SKenneth D. Merry sli4_link_medium_e medium; /* Ethernet / FC */ 3110*ef270ab1SKenneth D. Merry uint32_t speed; /* Mbps */ 3111*ef270ab1SKenneth D. Merry uint8_t *loop_map; 3112*ef270ab1SKenneth D. Merry uint32_t fc_id; 3113*ef270ab1SKenneth D. Merry } sli4_link_event_t; 3114*ef270ab1SKenneth D. Merry 3115*ef270ab1SKenneth D. Merry /** 3116*ef270ab1SKenneth D. Merry * @brief Fields retrieved from skyhawk that used used to build chained SGL 3117*ef270ab1SKenneth D. Merry */ 3118*ef270ab1SKenneth D. Merry typedef struct sli4_sgl_chaining_params_s { 3119*ef270ab1SKenneth D. Merry uint8_t chaining_capable; 3120*ef270ab1SKenneth D. Merry uint16_t frag_num_field_offset; 3121*ef270ab1SKenneth D. Merry uint16_t sgl_index_field_offset; 3122*ef270ab1SKenneth D. Merry uint64_t frag_num_field_mask; 3123*ef270ab1SKenneth D. Merry uint64_t sgl_index_field_mask; 3124*ef270ab1SKenneth D. Merry uint32_t chain_sge_initial_value_lo; 3125*ef270ab1SKenneth D. Merry uint32_t chain_sge_initial_value_hi; 3126*ef270ab1SKenneth D. Merry } sli4_sgl_chaining_params_t; 3127*ef270ab1SKenneth D. Merry 3128*ef270ab1SKenneth D. Merry typedef struct sli4_fip_event_s { 3129*ef270ab1SKenneth D. Merry uint32_t type; 3130*ef270ab1SKenneth D. Merry uint32_t index; /* FCF index or UINT32_MAX if invalid */ 3131*ef270ab1SKenneth D. Merry } sli4_fip_event_t; 3132*ef270ab1SKenneth D. Merry 3133*ef270ab1SKenneth D. Merry typedef enum { 3134*ef270ab1SKenneth D. Merry SLI_RSRC_FCOE_VFI, 3135*ef270ab1SKenneth D. Merry SLI_RSRC_FCOE_VPI, 3136*ef270ab1SKenneth D. Merry SLI_RSRC_FCOE_RPI, 3137*ef270ab1SKenneth D. Merry SLI_RSRC_FCOE_XRI, 3138*ef270ab1SKenneth D. Merry SLI_RSRC_FCOE_FCFI, 3139*ef270ab1SKenneth D. Merry SLI_RSRC_MAX /* must be last */ 3140*ef270ab1SKenneth D. Merry } sli4_resource_e; 3141*ef270ab1SKenneth D. Merry 3142*ef270ab1SKenneth D. Merry typedef enum { 3143*ef270ab1SKenneth D. Merry SLI4_PORT_TYPE_FC, 3144*ef270ab1SKenneth D. Merry SLI4_PORT_TYPE_NIC, 3145*ef270ab1SKenneth D. Merry SLI4_PORT_TYPE_MAX /* must be last */ 3146*ef270ab1SKenneth D. Merry } sli4_port_type_e; 3147*ef270ab1SKenneth D. Merry 3148*ef270ab1SKenneth D. Merry typedef enum { 3149*ef270ab1SKenneth D. Merry SLI4_ASIC_TYPE_BE3 = 1, 3150*ef270ab1SKenneth D. Merry SLI4_ASIC_TYPE_SKYHAWK, 3151*ef270ab1SKenneth D. Merry SLI4_ASIC_TYPE_LANCER, 3152*ef270ab1SKenneth D. Merry SLI4_ASIC_TYPE_CORSAIR, 3153*ef270ab1SKenneth D. Merry SLI4_ASIC_TYPE_LANCERG6, 3154*ef270ab1SKenneth D. Merry } sli4_asic_type_e; 3155*ef270ab1SKenneth D. Merry 3156*ef270ab1SKenneth D. Merry typedef enum { 3157*ef270ab1SKenneth D. Merry SLI4_ASIC_REV_FPGA = 1, 3158*ef270ab1SKenneth D. Merry SLI4_ASIC_REV_A0, 3159*ef270ab1SKenneth D. Merry SLI4_ASIC_REV_A1, 3160*ef270ab1SKenneth D. Merry SLI4_ASIC_REV_A2, 3161*ef270ab1SKenneth D. Merry SLI4_ASIC_REV_A3, 3162*ef270ab1SKenneth D. Merry SLI4_ASIC_REV_B0, 3163*ef270ab1SKenneth D. Merry SLI4_ASIC_REV_B1, 3164*ef270ab1SKenneth D. Merry SLI4_ASIC_REV_C0, 3165*ef270ab1SKenneth D. Merry SLI4_ASIC_REV_D0, 3166*ef270ab1SKenneth D. Merry } sli4_asic_rev_e; 3167*ef270ab1SKenneth D. Merry 3168*ef270ab1SKenneth D. Merry typedef struct sli4_s { 3169*ef270ab1SKenneth D. Merry ocs_os_handle_t os; 3170*ef270ab1SKenneth D. Merry sli4_port_type_e port_type; 3171*ef270ab1SKenneth D. Merry 3172*ef270ab1SKenneth D. Merry uint32_t sli_rev; /* SLI revision number */ 3173*ef270ab1SKenneth D. Merry uint32_t sli_family; 3174*ef270ab1SKenneth D. Merry uint32_t if_type; /* SLI Interface type */ 3175*ef270ab1SKenneth D. Merry 3176*ef270ab1SKenneth D. Merry sli4_asic_type_e asic_type; /*<< ASIC type */ 3177*ef270ab1SKenneth D. Merry sli4_asic_rev_e asic_rev; /*<< ASIC revision */ 3178*ef270ab1SKenneth D. Merry uint32_t physical_port; 3179*ef270ab1SKenneth D. Merry 3180*ef270ab1SKenneth D. Merry struct { 3181*ef270ab1SKenneth D. Merry uint16_t e_d_tov; 3182*ef270ab1SKenneth D. Merry uint16_t r_a_tov; 3183*ef270ab1SKenneth D. Merry uint16_t max_qcount[SLI_QTYPE_MAX]; 3184*ef270ab1SKenneth D. Merry uint32_t max_qentries[SLI_QTYPE_MAX]; 3185*ef270ab1SKenneth D. Merry uint16_t count_mask[SLI_QTYPE_MAX]; 3186*ef270ab1SKenneth D. Merry uint16_t count_method[SLI_QTYPE_MAX]; 3187*ef270ab1SKenneth D. Merry uint32_t qpage_count[SLI_QTYPE_MAX]; 3188*ef270ab1SKenneth D. Merry uint16_t link_module_type; 3189*ef270ab1SKenneth D. Merry uint8_t rq_batch; 3190*ef270ab1SKenneth D. Merry uint16_t rq_min_buf_size; 3191*ef270ab1SKenneth D. Merry uint32_t rq_max_buf_size; 3192*ef270ab1SKenneth D. Merry uint8_t topology; 3193*ef270ab1SKenneth D. Merry uint8_t wwpn[8]; 3194*ef270ab1SKenneth D. Merry uint8_t wwnn[8]; 3195*ef270ab1SKenneth D. Merry uint32_t fw_rev[2]; 3196*ef270ab1SKenneth D. Merry uint8_t fw_name[2][16]; 3197*ef270ab1SKenneth D. Merry char ipl_name[16]; 3198*ef270ab1SKenneth D. Merry uint32_t hw_rev[3]; 3199*ef270ab1SKenneth D. Merry uint8_t port_number; 3200*ef270ab1SKenneth D. Merry char port_name[2]; 3201*ef270ab1SKenneth D. Merry char bios_version_string[32]; 3202*ef270ab1SKenneth D. Merry uint8_t dual_ulp_capable; 3203*ef270ab1SKenneth D. Merry uint8_t is_ulp_fc[2]; 3204*ef270ab1SKenneth D. Merry /* 3205*ef270ab1SKenneth D. Merry * Tracks the port resources using extents metaphor. For 3206*ef270ab1SKenneth D. Merry * devices that don't implement extents (i.e. 3207*ef270ab1SKenneth D. Merry * has_extents == FALSE), the code models each resource as 3208*ef270ab1SKenneth D. Merry * a single large extent. 3209*ef270ab1SKenneth D. Merry */ 3210*ef270ab1SKenneth D. Merry struct { 3211*ef270ab1SKenneth D. Merry uint32_t number; /* number of extents */ 3212*ef270ab1SKenneth D. Merry uint32_t size; /* number of elements in each extent */ 3213*ef270ab1SKenneth D. Merry uint32_t n_alloc;/* number of elements allocated */ 3214*ef270ab1SKenneth D. Merry uint32_t *base; 3215*ef270ab1SKenneth D. Merry ocs_bitmap_t *use_map;/* bitmap showing resources in use */ 3216*ef270ab1SKenneth D. Merry uint32_t map_size;/* number of bits in bitmap */ 3217*ef270ab1SKenneth D. Merry } extent[SLI_RSRC_MAX]; 3218*ef270ab1SKenneth D. Merry sli4_features_t features; 3219*ef270ab1SKenneth D. Merry uint32_t has_extents:1, 3220*ef270ab1SKenneth D. Merry auto_reg:1, 3221*ef270ab1SKenneth D. Merry auto_xfer_rdy:1, 3222*ef270ab1SKenneth D. Merry hdr_template_req:1, 3223*ef270ab1SKenneth D. Merry perf_hint:1, 3224*ef270ab1SKenneth D. Merry perf_wq_id_association:1, 3225*ef270ab1SKenneth D. Merry cq_create_version:2, 3226*ef270ab1SKenneth D. Merry mq_create_version:2, 3227*ef270ab1SKenneth D. Merry high_login_mode:1, 3228*ef270ab1SKenneth D. Merry sgl_pre_registered:1, 3229*ef270ab1SKenneth D. Merry sgl_pre_registration_required:1, 3230*ef270ab1SKenneth D. Merry t10_dif_inline_capable:1, 3231*ef270ab1SKenneth D. Merry t10_dif_separate_capable:1; 3232*ef270ab1SKenneth D. Merry uint32_t sge_supported_length; 3233*ef270ab1SKenneth D. Merry uint32_t sgl_page_sizes; 3234*ef270ab1SKenneth D. Merry uint32_t max_sgl_pages; 3235*ef270ab1SKenneth D. Merry sli4_sgl_chaining_params_t sgl_chaining_params; 3236*ef270ab1SKenneth D. Merry size_t wqe_size; 3237*ef270ab1SKenneth D. Merry } config; 3238*ef270ab1SKenneth D. Merry 3239*ef270ab1SKenneth D. Merry /* 3240*ef270ab1SKenneth D. Merry * Callback functions 3241*ef270ab1SKenneth D. Merry */ 3242*ef270ab1SKenneth D. Merry int32_t (*link)(void *, void *); 3243*ef270ab1SKenneth D. Merry void *link_arg; 3244*ef270ab1SKenneth D. Merry int32_t (*fip)(void *, void *); 3245*ef270ab1SKenneth D. Merry void *fip_arg; 3246*ef270ab1SKenneth D. Merry 3247*ef270ab1SKenneth D. Merry ocs_dma_t bmbx; 3248*ef270ab1SKenneth D. Merry #if defined(OCS_INCLUDE_DEBUG) 3249*ef270ab1SKenneth D. Merry /* Save pointer to physical memory descriptor for non-embedded SLI_CONFIG 3250*ef270ab1SKenneth D. Merry * commands for BMBX dumping purposes */ 3251*ef270ab1SKenneth D. Merry ocs_dma_t *bmbx_non_emb_pmd; 3252*ef270ab1SKenneth D. Merry #endif 3253*ef270ab1SKenneth D. Merry 3254*ef270ab1SKenneth D. Merry struct { 3255*ef270ab1SKenneth D. Merry ocs_dma_t data; 3256*ef270ab1SKenneth D. Merry uint32_t length; 3257*ef270ab1SKenneth D. Merry } vpd; 3258*ef270ab1SKenneth D. Merry } sli4_t; 3259*ef270ab1SKenneth D. Merry 3260*ef270ab1SKenneth D. Merry /** 3261*ef270ab1SKenneth D. Merry * Get / set parameter functions 3262*ef270ab1SKenneth D. Merry */ 3263*ef270ab1SKenneth D. Merry static inline uint32_t 3264*ef270ab1SKenneth D. Merry sli_get_max_rsrc(sli4_t *sli4, sli4_resource_e rsrc) 3265*ef270ab1SKenneth D. Merry { 3266*ef270ab1SKenneth D. Merry if (rsrc >= SLI_RSRC_MAX) { 3267*ef270ab1SKenneth D. Merry return 0; 3268*ef270ab1SKenneth D. Merry } 3269*ef270ab1SKenneth D. Merry 3270*ef270ab1SKenneth D. Merry return sli4->config.extent[rsrc].size; 3271*ef270ab1SKenneth D. Merry } 3272*ef270ab1SKenneth D. Merry 3273*ef270ab1SKenneth D. Merry static inline uint32_t 3274*ef270ab1SKenneth D. Merry sli_get_max_queue(sli4_t *sli4, sli4_qtype_e qtype) 3275*ef270ab1SKenneth D. Merry { 3276*ef270ab1SKenneth D. Merry if (qtype >= SLI_QTYPE_MAX) { 3277*ef270ab1SKenneth D. Merry return 0; 3278*ef270ab1SKenneth D. Merry } 3279*ef270ab1SKenneth D. Merry return sli4->config.max_qcount[qtype]; 3280*ef270ab1SKenneth D. Merry } 3281*ef270ab1SKenneth D. Merry 3282*ef270ab1SKenneth D. Merry static inline uint32_t 3283*ef270ab1SKenneth D. Merry sli_get_max_qentries(sli4_t *sli4, sli4_qtype_e qtype) 3284*ef270ab1SKenneth D. Merry { 3285*ef270ab1SKenneth D. Merry 3286*ef270ab1SKenneth D. Merry return sli4->config.max_qentries[qtype]; 3287*ef270ab1SKenneth D. Merry } 3288*ef270ab1SKenneth D. Merry 3289*ef270ab1SKenneth D. Merry static inline uint32_t 3290*ef270ab1SKenneth D. Merry sli_get_max_sge(sli4_t *sli4) 3291*ef270ab1SKenneth D. Merry { 3292*ef270ab1SKenneth D. Merry return sli4->config.sge_supported_length; 3293*ef270ab1SKenneth D. Merry } 3294*ef270ab1SKenneth D. Merry 3295*ef270ab1SKenneth D. Merry static inline uint32_t 3296*ef270ab1SKenneth D. Merry sli_get_max_sgl(sli4_t *sli4) 3297*ef270ab1SKenneth D. Merry { 3298*ef270ab1SKenneth D. Merry 3299*ef270ab1SKenneth D. Merry if (sli4->config.sgl_page_sizes != 1) { 3300*ef270ab1SKenneth D. Merry ocs_log_test(sli4->os, "unsupported SGL page sizes %#x\n", 3301*ef270ab1SKenneth D. Merry sli4->config.sgl_page_sizes); 3302*ef270ab1SKenneth D. Merry return 0; 3303*ef270ab1SKenneth D. Merry } 3304*ef270ab1SKenneth D. Merry 3305*ef270ab1SKenneth D. Merry return ((sli4->config.max_sgl_pages * SLI_PAGE_SIZE) / sizeof(sli4_sge_t)); 3306*ef270ab1SKenneth D. Merry } 3307*ef270ab1SKenneth D. Merry 3308*ef270ab1SKenneth D. Merry static inline sli4_link_medium_e 3309*ef270ab1SKenneth D. Merry sli_get_medium(sli4_t *sli4) 3310*ef270ab1SKenneth D. Merry { 3311*ef270ab1SKenneth D. Merry switch (sli4->config.topology) { 3312*ef270ab1SKenneth D. Merry case SLI4_READ_CFG_TOPO_FCOE: 3313*ef270ab1SKenneth D. Merry return SLI_LINK_MEDIUM_ETHERNET; 3314*ef270ab1SKenneth D. Merry case SLI4_READ_CFG_TOPO_FC: 3315*ef270ab1SKenneth D. Merry case SLI4_READ_CFG_TOPO_FC_DA: 3316*ef270ab1SKenneth D. Merry case SLI4_READ_CFG_TOPO_FC_AL: 3317*ef270ab1SKenneth D. Merry return SLI_LINK_MEDIUM_FC; 3318*ef270ab1SKenneth D. Merry default: 3319*ef270ab1SKenneth D. Merry return SLI_LINK_MEDIUM_MAX; 3320*ef270ab1SKenneth D. Merry } 3321*ef270ab1SKenneth D. Merry } 3322*ef270ab1SKenneth D. Merry 3323*ef270ab1SKenneth D. Merry static inline void 3324*ef270ab1SKenneth D. Merry sli_skh_chain_sge_build(sli4_t *sli4, sli4_sge_t *sge, uint32_t xri_index, uint32_t frag_num, uint32_t offset) 3325*ef270ab1SKenneth D. Merry { 3326*ef270ab1SKenneth D. Merry sli4_sgl_chaining_params_t *cparms = &sli4->config.sgl_chaining_params; 3327*ef270ab1SKenneth D. Merry 3328*ef270ab1SKenneth D. Merry 3329*ef270ab1SKenneth D. Merry ocs_memset(sge, 0, sizeof(*sge)); 3330*ef270ab1SKenneth D. Merry sge->sge_type = SLI4_SGE_TYPE_CHAIN; 3331*ef270ab1SKenneth D. Merry sge->buffer_address_high = (uint32_t)cparms->chain_sge_initial_value_hi; 3332*ef270ab1SKenneth D. Merry sge->buffer_address_low = 3333*ef270ab1SKenneth D. Merry (uint32_t)((cparms->chain_sge_initial_value_lo | 3334*ef270ab1SKenneth D. Merry (((uintptr_t)(xri_index & cparms->sgl_index_field_mask)) << 3335*ef270ab1SKenneth D. Merry cparms->sgl_index_field_offset) | 3336*ef270ab1SKenneth D. Merry (((uintptr_t)(frag_num & cparms->frag_num_field_mask)) << 3337*ef270ab1SKenneth D. Merry cparms->frag_num_field_offset) | 3338*ef270ab1SKenneth D. Merry offset) >> 3); 3339*ef270ab1SKenneth D. Merry } 3340*ef270ab1SKenneth D. Merry 3341*ef270ab1SKenneth D. Merry static inline uint32_t 3342*ef270ab1SKenneth D. Merry sli_get_sli_rev(sli4_t *sli4) 3343*ef270ab1SKenneth D. Merry { 3344*ef270ab1SKenneth D. Merry return sli4->sli_rev; 3345*ef270ab1SKenneth D. Merry } 3346*ef270ab1SKenneth D. Merry 3347*ef270ab1SKenneth D. Merry static inline uint32_t 3348*ef270ab1SKenneth D. Merry sli_get_sli_family(sli4_t *sli4) 3349*ef270ab1SKenneth D. Merry { 3350*ef270ab1SKenneth D. Merry return sli4->sli_family; 3351*ef270ab1SKenneth D. Merry } 3352*ef270ab1SKenneth D. Merry 3353*ef270ab1SKenneth D. Merry static inline uint32_t 3354*ef270ab1SKenneth D. Merry sli_get_if_type(sli4_t *sli4) 3355*ef270ab1SKenneth D. Merry { 3356*ef270ab1SKenneth D. Merry return sli4->if_type; 3357*ef270ab1SKenneth D. Merry } 3358*ef270ab1SKenneth D. Merry 3359*ef270ab1SKenneth D. Merry static inline void * 3360*ef270ab1SKenneth D. Merry sli_get_wwn_port(sli4_t *sli4) 3361*ef270ab1SKenneth D. Merry { 3362*ef270ab1SKenneth D. Merry return sli4->config.wwpn; 3363*ef270ab1SKenneth D. Merry } 3364*ef270ab1SKenneth D. Merry 3365*ef270ab1SKenneth D. Merry static inline void * 3366*ef270ab1SKenneth D. Merry sli_get_wwn_node(sli4_t *sli4) 3367*ef270ab1SKenneth D. Merry { 3368*ef270ab1SKenneth D. Merry return sli4->config.wwnn; 3369*ef270ab1SKenneth D. Merry } 3370*ef270ab1SKenneth D. Merry 3371*ef270ab1SKenneth D. Merry static inline void * 3372*ef270ab1SKenneth D. Merry sli_get_vpd(sli4_t *sli4) 3373*ef270ab1SKenneth D. Merry { 3374*ef270ab1SKenneth D. Merry return sli4->vpd.data.virt; 3375*ef270ab1SKenneth D. Merry } 3376*ef270ab1SKenneth D. Merry 3377*ef270ab1SKenneth D. Merry static inline uint32_t 3378*ef270ab1SKenneth D. Merry sli_get_vpd_len(sli4_t *sli4) 3379*ef270ab1SKenneth D. Merry { 3380*ef270ab1SKenneth D. Merry return sli4->vpd.length; 3381*ef270ab1SKenneth D. Merry } 3382*ef270ab1SKenneth D. Merry 3383*ef270ab1SKenneth D. Merry static inline uint32_t 3384*ef270ab1SKenneth D. Merry sli_get_fw_revision(sli4_t *sli4, uint32_t which) 3385*ef270ab1SKenneth D. Merry { 3386*ef270ab1SKenneth D. Merry return sli4->config.fw_rev[which]; 3387*ef270ab1SKenneth D. Merry } 3388*ef270ab1SKenneth D. Merry 3389*ef270ab1SKenneth D. Merry static inline void * 3390*ef270ab1SKenneth D. Merry sli_get_fw_name(sli4_t *sli4, uint32_t which) 3391*ef270ab1SKenneth D. Merry { 3392*ef270ab1SKenneth D. Merry return sli4->config.fw_name[which]; 3393*ef270ab1SKenneth D. Merry } 3394*ef270ab1SKenneth D. Merry 3395*ef270ab1SKenneth D. Merry static inline char * 3396*ef270ab1SKenneth D. Merry sli_get_ipl_name(sli4_t *sli4) 3397*ef270ab1SKenneth D. Merry { 3398*ef270ab1SKenneth D. Merry return sli4->config.ipl_name; 3399*ef270ab1SKenneth D. Merry } 3400*ef270ab1SKenneth D. Merry 3401*ef270ab1SKenneth D. Merry static inline uint32_t 3402*ef270ab1SKenneth D. Merry sli_get_hw_revision(sli4_t *sli4, uint32_t which) 3403*ef270ab1SKenneth D. Merry { 3404*ef270ab1SKenneth D. Merry return sli4->config.hw_rev[which]; 3405*ef270ab1SKenneth D. Merry } 3406*ef270ab1SKenneth D. Merry 3407*ef270ab1SKenneth D. Merry static inline uint32_t 3408*ef270ab1SKenneth D. Merry sli_get_auto_xfer_rdy_capable(sli4_t *sli4) 3409*ef270ab1SKenneth D. Merry { 3410*ef270ab1SKenneth D. Merry return sli4->config.auto_xfer_rdy; 3411*ef270ab1SKenneth D. Merry } 3412*ef270ab1SKenneth D. Merry 3413*ef270ab1SKenneth D. Merry static inline uint32_t 3414*ef270ab1SKenneth D. Merry sli_get_dif_capable(sli4_t *sli4) 3415*ef270ab1SKenneth D. Merry { 3416*ef270ab1SKenneth D. Merry return sli4->config.features.flag.dif; 3417*ef270ab1SKenneth D. Merry } 3418*ef270ab1SKenneth D. Merry 3419*ef270ab1SKenneth D. Merry static inline uint32_t 3420*ef270ab1SKenneth D. Merry sli_is_dif_inline_capable(sli4_t *sli4) 3421*ef270ab1SKenneth D. Merry { 3422*ef270ab1SKenneth D. Merry return sli_get_dif_capable(sli4) && sli4->config.t10_dif_inline_capable; 3423*ef270ab1SKenneth D. Merry } 3424*ef270ab1SKenneth D. Merry 3425*ef270ab1SKenneth D. Merry static inline uint32_t 3426*ef270ab1SKenneth D. Merry sli_is_dif_separate_capable(sli4_t *sli4) 3427*ef270ab1SKenneth D. Merry { 3428*ef270ab1SKenneth D. Merry return sli_get_dif_capable(sli4) && sli4->config.t10_dif_separate_capable; 3429*ef270ab1SKenneth D. Merry } 3430*ef270ab1SKenneth D. Merry 3431*ef270ab1SKenneth D. Merry static inline uint32_t 3432*ef270ab1SKenneth D. Merry sli_get_is_dual_ulp_capable(sli4_t *sli4) 3433*ef270ab1SKenneth D. Merry { 3434*ef270ab1SKenneth D. Merry return sli4->config.dual_ulp_capable; 3435*ef270ab1SKenneth D. Merry } 3436*ef270ab1SKenneth D. Merry 3437*ef270ab1SKenneth D. Merry static inline uint32_t 3438*ef270ab1SKenneth D. Merry sli_get_is_sgl_chaining_capable(sli4_t *sli4) 3439*ef270ab1SKenneth D. Merry { 3440*ef270ab1SKenneth D. Merry return sli4->config.sgl_chaining_params.chaining_capable; 3441*ef270ab1SKenneth D. Merry } 3442*ef270ab1SKenneth D. Merry 3443*ef270ab1SKenneth D. Merry static inline uint32_t 3444*ef270ab1SKenneth D. Merry sli_get_is_ulp_enabled(sli4_t *sli4, uint16_t ulp) 3445*ef270ab1SKenneth D. Merry { 3446*ef270ab1SKenneth D. Merry return sli4->config.is_ulp_fc[ulp]; 3447*ef270ab1SKenneth D. Merry } 3448*ef270ab1SKenneth D. Merry 3449*ef270ab1SKenneth D. Merry static inline uint32_t 3450*ef270ab1SKenneth D. Merry sli_get_hlm_capable(sli4_t *sli4) 3451*ef270ab1SKenneth D. Merry { 3452*ef270ab1SKenneth D. Merry return sli4->config.features.flag.hlm; 3453*ef270ab1SKenneth D. Merry } 3454*ef270ab1SKenneth D. Merry 3455*ef270ab1SKenneth D. Merry static inline int32_t 3456*ef270ab1SKenneth D. Merry sli_set_hlm(sli4_t *sli4, uint32_t value) 3457*ef270ab1SKenneth D. Merry { 3458*ef270ab1SKenneth D. Merry if (value && !sli4->config.features.flag.hlm) { 3459*ef270ab1SKenneth D. Merry ocs_log_test(sli4->os, "HLM not supported\n"); 3460*ef270ab1SKenneth D. Merry return -1; 3461*ef270ab1SKenneth D. Merry } 3462*ef270ab1SKenneth D. Merry 3463*ef270ab1SKenneth D. Merry sli4->config.high_login_mode = value != 0 ? TRUE : FALSE; 3464*ef270ab1SKenneth D. Merry 3465*ef270ab1SKenneth D. Merry return 0; 3466*ef270ab1SKenneth D. Merry } 3467*ef270ab1SKenneth D. Merry 3468*ef270ab1SKenneth D. Merry static inline uint32_t 3469*ef270ab1SKenneth D. Merry sli_get_hlm(sli4_t *sli4) 3470*ef270ab1SKenneth D. Merry { 3471*ef270ab1SKenneth D. Merry return sli4->config.high_login_mode; 3472*ef270ab1SKenneth D. Merry } 3473*ef270ab1SKenneth D. Merry 3474*ef270ab1SKenneth D. Merry static inline uint32_t 3475*ef270ab1SKenneth D. Merry sli_get_sgl_preregister_required(sli4_t *sli4) 3476*ef270ab1SKenneth D. Merry { 3477*ef270ab1SKenneth D. Merry return sli4->config.sgl_pre_registration_required; 3478*ef270ab1SKenneth D. Merry } 3479*ef270ab1SKenneth D. Merry 3480*ef270ab1SKenneth D. Merry static inline uint32_t 3481*ef270ab1SKenneth D. Merry sli_get_sgl_preregister(sli4_t *sli4) 3482*ef270ab1SKenneth D. Merry { 3483*ef270ab1SKenneth D. Merry return sli4->config.sgl_pre_registered; 3484*ef270ab1SKenneth D. Merry } 3485*ef270ab1SKenneth D. Merry 3486*ef270ab1SKenneth D. Merry static inline int32_t 3487*ef270ab1SKenneth D. Merry sli_set_sgl_preregister(sli4_t *sli4, uint32_t value) 3488*ef270ab1SKenneth D. Merry { 3489*ef270ab1SKenneth D. Merry if ((value == 0) && sli4->config.sgl_pre_registration_required) { 3490*ef270ab1SKenneth D. Merry ocs_log_test(sli4->os, "SGL pre-registration required\n"); 3491*ef270ab1SKenneth D. Merry return -1; 3492*ef270ab1SKenneth D. Merry } 3493*ef270ab1SKenneth D. Merry 3494*ef270ab1SKenneth D. Merry sli4->config.sgl_pre_registered = value != 0 ? TRUE : FALSE; 3495*ef270ab1SKenneth D. Merry 3496*ef270ab1SKenneth D. Merry return 0; 3497*ef270ab1SKenneth D. Merry } 3498*ef270ab1SKenneth D. Merry 3499*ef270ab1SKenneth D. Merry static inline sli4_asic_type_e 3500*ef270ab1SKenneth D. Merry sli_get_asic_type(sli4_t *sli4) 3501*ef270ab1SKenneth D. Merry { 3502*ef270ab1SKenneth D. Merry return sli4->asic_type; 3503*ef270ab1SKenneth D. Merry } 3504*ef270ab1SKenneth D. Merry 3505*ef270ab1SKenneth D. Merry static inline sli4_asic_rev_e 3506*ef270ab1SKenneth D. Merry sli_get_asic_rev(sli4_t *sli4) 3507*ef270ab1SKenneth D. Merry { 3508*ef270ab1SKenneth D. Merry return sli4->asic_rev; 3509*ef270ab1SKenneth D. Merry } 3510*ef270ab1SKenneth D. Merry 3511*ef270ab1SKenneth D. Merry static inline int32_t 3512*ef270ab1SKenneth D. Merry sli_set_topology(sli4_t *sli4, uint32_t value) 3513*ef270ab1SKenneth D. Merry { 3514*ef270ab1SKenneth D. Merry int32_t rc = 0; 3515*ef270ab1SKenneth D. Merry 3516*ef270ab1SKenneth D. Merry switch (value) { 3517*ef270ab1SKenneth D. Merry case SLI4_READ_CFG_TOPO_FCOE: 3518*ef270ab1SKenneth D. Merry case SLI4_READ_CFG_TOPO_FC: 3519*ef270ab1SKenneth D. Merry case SLI4_READ_CFG_TOPO_FC_DA: 3520*ef270ab1SKenneth D. Merry case SLI4_READ_CFG_TOPO_FC_AL: 3521*ef270ab1SKenneth D. Merry sli4->config.topology = value; 3522*ef270ab1SKenneth D. Merry break; 3523*ef270ab1SKenneth D. Merry default: 3524*ef270ab1SKenneth D. Merry ocs_log_test(sli4->os, "unsupported topology %#x\n", value); 3525*ef270ab1SKenneth D. Merry rc = -1; 3526*ef270ab1SKenneth D. Merry } 3527*ef270ab1SKenneth D. Merry 3528*ef270ab1SKenneth D. Merry return rc; 3529*ef270ab1SKenneth D. Merry } 3530*ef270ab1SKenneth D. Merry 3531*ef270ab1SKenneth D. Merry static inline uint16_t 3532*ef270ab1SKenneth D. Merry sli_get_link_module_type(sli4_t *sli4) 3533*ef270ab1SKenneth D. Merry { 3534*ef270ab1SKenneth D. Merry return sli4->config.link_module_type; 3535*ef270ab1SKenneth D. Merry } 3536*ef270ab1SKenneth D. Merry 3537*ef270ab1SKenneth D. Merry static inline char * 3538*ef270ab1SKenneth D. Merry sli_get_portnum(sli4_t *sli4) 3539*ef270ab1SKenneth D. Merry { 3540*ef270ab1SKenneth D. Merry return sli4->config.port_name; 3541*ef270ab1SKenneth D. Merry } 3542*ef270ab1SKenneth D. Merry 3543*ef270ab1SKenneth D. Merry static inline char * 3544*ef270ab1SKenneth D. Merry sli_get_bios_version_string(sli4_t *sli4) 3545*ef270ab1SKenneth D. Merry { 3546*ef270ab1SKenneth D. Merry return sli4->config.bios_version_string; 3547*ef270ab1SKenneth D. Merry } 3548*ef270ab1SKenneth D. Merry 3549*ef270ab1SKenneth D. Merry static inline uint32_t 3550*ef270ab1SKenneth D. Merry sli_convert_mask_to_count(uint32_t method, uint32_t mask) 3551*ef270ab1SKenneth D. Merry { 3552*ef270ab1SKenneth D. Merry uint32_t count = 0; 3553*ef270ab1SKenneth D. Merry 3554*ef270ab1SKenneth D. Merry if (method) { 3555*ef270ab1SKenneth D. Merry count = 1 << ocs_lg2(mask); 3556*ef270ab1SKenneth D. Merry count *= 16; 3557*ef270ab1SKenneth D. Merry } else { 3558*ef270ab1SKenneth D. Merry count = mask; 3559*ef270ab1SKenneth D. Merry } 3560*ef270ab1SKenneth D. Merry 3561*ef270ab1SKenneth D. Merry return count; 3562*ef270ab1SKenneth D. Merry } 3563*ef270ab1SKenneth D. Merry 3564*ef270ab1SKenneth D. Merry /** 3565*ef270ab1SKenneth D. Merry * @brief Common Create Queue function prototype 3566*ef270ab1SKenneth D. Merry */ 3567*ef270ab1SKenneth D. Merry typedef int32_t (*sli4_create_q_fn_t)(sli4_t *, void *, size_t, ocs_dma_t *, uint16_t, uint16_t); 3568*ef270ab1SKenneth D. Merry 3569*ef270ab1SKenneth D. Merry /** 3570*ef270ab1SKenneth D. Merry * @brief Common Destroy Queue function prototype 3571*ef270ab1SKenneth D. Merry */ 3572*ef270ab1SKenneth D. Merry typedef int32_t (*sli4_destroy_q_fn_t)(sli4_t *, void *, size_t, uint16_t); 3573*ef270ab1SKenneth D. Merry 3574*ef270ab1SKenneth D. Merry 3575*ef270ab1SKenneth D. Merry /**************************************************************************** 3576*ef270ab1SKenneth D. Merry * Function prototypes 3577*ef270ab1SKenneth D. Merry */ 3578*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_config_auto_xfer_rdy(sli4_t *, void *, size_t, uint32_t); 3579*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_config_auto_xfer_rdy_hp(sli4_t *, void *, size_t, uint32_t, uint32_t, uint32_t); 3580*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_config_link(sli4_t *, void *, size_t); 3581*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_down_link(sli4_t *, void *, size_t); 3582*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_dump_type4(sli4_t *, void *, size_t, uint16_t); 3583*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_common_read_transceiver_data(sli4_t *, void *, size_t, uint32_t, ocs_dma_t *); 3584*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_read_link_stats(sli4_t *, void *, size_t,uint8_t, uint8_t, uint8_t); 3585*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_read_status(sli4_t *sli4, void *buf, size_t size, uint8_t clear_counters); 3586*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_init_link(sli4_t *, void *, size_t, uint32_t, uint8_t); 3587*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_init_vfi(sli4_t *, void *, size_t, uint16_t, uint16_t, uint16_t); 3588*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_init_vpi(sli4_t *, void *, size_t, uint16_t, uint16_t); 3589*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_post_xri(sli4_t *, void *, size_t, uint16_t, uint16_t); 3590*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_release_xri(sli4_t *, void *, size_t, uint8_t); 3591*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_read_sparm64(sli4_t *, void *, size_t, ocs_dma_t *, uint16_t); 3592*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_read_topology(sli4_t *, void *, size_t, ocs_dma_t *); 3593*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_read_nvparms(sli4_t *, void *, size_t); 3594*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_write_nvparms(sli4_t *, void *, size_t, uint8_t *, uint8_t *, uint8_t, uint32_t); 3595*ef270ab1SKenneth D. Merry typedef struct { 3596*ef270ab1SKenneth D. Merry uint16_t rq_id; 3597*ef270ab1SKenneth D. Merry uint8_t r_ctl_mask; 3598*ef270ab1SKenneth D. Merry uint8_t r_ctl_match; 3599*ef270ab1SKenneth D. Merry uint8_t type_mask; 3600*ef270ab1SKenneth D. Merry uint8_t type_match; 3601*ef270ab1SKenneth D. Merry } sli4_cmd_rq_cfg_t; 3602*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_reg_fcfi(sli4_t *, void *, size_t, uint16_t, 3603*ef270ab1SKenneth D. Merry sli4_cmd_rq_cfg_t rq_cfg[SLI4_CMD_REG_FCFI_NUM_RQ_CFG], uint16_t); 3604*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_reg_fcfi_mrq(sli4_t *, void *, size_t, uint8_t, uint16_t, uint16_t, uint8_t, uint8_t , uint16_t, sli4_cmd_rq_cfg_t *); 3605*ef270ab1SKenneth D. Merry 3606*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_reg_rpi(sli4_t *, void *, size_t, uint32_t, uint16_t, uint16_t, ocs_dma_t *, uint8_t, uint8_t); 3607*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_reg_vfi(sli4_t *, void *, size_t, ocs_domain_t *); 3608*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_reg_vpi(sli4_t *, void *, size_t, ocs_sli_port_t *, uint8_t); 3609*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_sli_config(sli4_t *, void *, size_t, uint32_t, ocs_dma_t *); 3610*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_unreg_fcfi(sli4_t *, void *, size_t, uint16_t); 3611*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_unreg_rpi(sli4_t *, void *, size_t, uint16_t, sli4_resource_e, uint32_t); 3612*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_unreg_vfi(sli4_t *, void *, size_t, ocs_domain_t *, uint32_t); 3613*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_unreg_vpi(sli4_t *, void *, size_t, uint16_t, uint32_t); 3614*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_common_nop(sli4_t *, void *, size_t, uint64_t); 3615*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_common_get_resource_extent_info(sli4_t *, void *, size_t, uint16_t); 3616*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_common_get_sli4_parameters(sli4_t *, void *, size_t); 3617*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_common_write_object(sli4_t *, void *, size_t, 3618*ef270ab1SKenneth D. Merry uint16_t, uint16_t, uint32_t, uint32_t, char *, ocs_dma_t *); 3619*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_common_delete_object(sli4_t *, void *, size_t, char *); 3620*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_common_read_object(sli4_t *, void *, size_t, uint32_t, 3621*ef270ab1SKenneth D. Merry uint32_t, char *, ocs_dma_t *); 3622*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_dmtf_exec_clp_cmd(sli4_t *sli4, void *buf, size_t size, 3623*ef270ab1SKenneth D. Merry ocs_dma_t *cmd, 3624*ef270ab1SKenneth D. Merry ocs_dma_t *resp); 3625*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_common_set_dump_location(sli4_t *sli4, void *buf, size_t size, 3626*ef270ab1SKenneth D. Merry uint8_t query, uint8_t is_buffer_list, 3627*ef270ab1SKenneth D. Merry ocs_dma_t *buffer, uint8_t fdb); 3628*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_common_set_features(sli4_t *, void *, size_t, uint32_t, uint32_t, void*); 3629*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_common_get_profile_list(sli4_t *sli4, void *buf, 3630*ef270ab1SKenneth D. Merry size_t size, uint32_t start_profile_index, ocs_dma_t *dma); 3631*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_common_get_active_profile(sli4_t *sli4, void *buf, 3632*ef270ab1SKenneth D. Merry size_t size); 3633*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_common_set_active_profile(sli4_t *sli4, void *buf, 3634*ef270ab1SKenneth D. Merry size_t size, 3635*ef270ab1SKenneth D. Merry uint32_t fd, 3636*ef270ab1SKenneth D. Merry uint32_t active_profile_id); 3637*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_common_get_reconfig_link_info(sli4_t *sli4, void *buf, 3638*ef270ab1SKenneth D. Merry size_t size, ocs_dma_t *dma); 3639*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_common_set_reconfig_link_id(sli4_t *sli4, void *buf, 3640*ef270ab1SKenneth D. Merry size_t size, ocs_dma_t *dma, 3641*ef270ab1SKenneth D. Merry uint32_t fd, uint32_t active_link_config_id); 3642*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_common_get_function_config(sli4_t *sli4, void *buf, 3643*ef270ab1SKenneth D. Merry size_t size); 3644*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_common_get_profile_config(sli4_t *sli4, void *buf, 3645*ef270ab1SKenneth D. Merry size_t size, ocs_dma_t *dma); 3646*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_common_set_profile_config(sli4_t *sli4, void *buf, 3647*ef270ab1SKenneth D. Merry size_t size, ocs_dma_t *dma, 3648*ef270ab1SKenneth D. Merry uint8_t profile_id, uint32_t descriptor_count, 3649*ef270ab1SKenneth D. Merry uint8_t isap); 3650*ef270ab1SKenneth D. Merry 3651*ef270ab1SKenneth D. Merry extern int32_t sli_cqe_mq(void *); 3652*ef270ab1SKenneth D. Merry extern int32_t sli_cqe_async(sli4_t *, void *); 3653*ef270ab1SKenneth D. Merry 3654*ef270ab1SKenneth D. Merry extern int32_t sli_setup(sli4_t *, ocs_os_handle_t, sli4_port_type_e); 3655*ef270ab1SKenneth D. Merry extern void sli_calc_max_qentries(sli4_t *sli4); 3656*ef270ab1SKenneth D. Merry extern int32_t sli_init(sli4_t *); 3657*ef270ab1SKenneth D. Merry extern int32_t sli_reset(sli4_t *); 3658*ef270ab1SKenneth D. Merry extern int32_t sli_fw_reset(sli4_t *); 3659*ef270ab1SKenneth D. Merry extern int32_t sli_teardown(sli4_t *); 3660*ef270ab1SKenneth D. Merry extern int32_t sli_callback(sli4_t *, sli4_callback_e, void *, void *); 3661*ef270ab1SKenneth D. Merry extern int32_t sli_bmbx_command(sli4_t *); 3662*ef270ab1SKenneth D. Merry extern int32_t __sli_queue_init(sli4_t *, sli4_queue_t *, uint32_t, size_t, uint32_t, uint32_t); 3663*ef270ab1SKenneth D. Merry extern int32_t __sli_create_queue(sli4_t *, sli4_queue_t *); 3664*ef270ab1SKenneth D. Merry extern int32_t sli_eq_modify_delay(sli4_t *sli4, sli4_queue_t *eq, uint32_t num_eq, uint32_t shift, uint32_t delay_mult); 3665*ef270ab1SKenneth D. Merry extern int32_t sli_queue_alloc(sli4_t *, uint32_t, sli4_queue_t *, uint32_t, sli4_queue_t *, uint16_t); 3666*ef270ab1SKenneth D. Merry extern int32_t sli_cq_alloc_set(sli4_t *, sli4_queue_t *qs[], uint32_t, uint32_t, sli4_queue_t *eqs[]); 3667*ef270ab1SKenneth D. Merry extern int32_t sli_get_queue_entry_size(sli4_t *, uint32_t); 3668*ef270ab1SKenneth D. Merry extern int32_t sli_queue_free(sli4_t *, sli4_queue_t *, uint32_t, uint32_t); 3669*ef270ab1SKenneth D. Merry extern int32_t sli_queue_reset(sli4_t *, sli4_queue_t *); 3670*ef270ab1SKenneth D. Merry extern int32_t sli_queue_is_empty(sli4_t *, sli4_queue_t *); 3671*ef270ab1SKenneth D. Merry extern int32_t sli_queue_eq_arm(sli4_t *, sli4_queue_t *, uint8_t); 3672*ef270ab1SKenneth D. Merry extern int32_t sli_queue_arm(sli4_t *, sli4_queue_t *, uint8_t); 3673*ef270ab1SKenneth D. Merry extern int32_t _sli_queue_write(sli4_t *, sli4_queue_t *, uint8_t *); 3674*ef270ab1SKenneth D. Merry extern int32_t sli_queue_write(sli4_t *, sli4_queue_t *, uint8_t *); 3675*ef270ab1SKenneth D. Merry extern int32_t sli_queue_read(sli4_t *, sli4_queue_t *, uint8_t *); 3676*ef270ab1SKenneth D. Merry extern int32_t sli_queue_index(sli4_t *, sli4_queue_t *); 3677*ef270ab1SKenneth D. Merry extern int32_t _sli_queue_poke(sli4_t *, sli4_queue_t *, uint32_t, uint8_t *); 3678*ef270ab1SKenneth D. Merry extern int32_t sli_queue_poke(sli4_t *, sli4_queue_t *, uint32_t, uint8_t *); 3679*ef270ab1SKenneth D. Merry extern int32_t sli_resource_alloc(sli4_t *, sli4_resource_e, uint32_t *, uint32_t *); 3680*ef270ab1SKenneth D. Merry extern int32_t sli_resource_free(sli4_t *, sli4_resource_e, uint32_t); 3681*ef270ab1SKenneth D. Merry extern int32_t sli_resource_reset(sli4_t *, sli4_resource_e); 3682*ef270ab1SKenneth D. Merry extern int32_t sli_eq_parse(sli4_t *, uint8_t *, uint16_t *); 3683*ef270ab1SKenneth D. Merry extern int32_t sli_cq_parse(sli4_t *, sli4_queue_t *, uint8_t *, sli4_qentry_e *, uint16_t *); 3684*ef270ab1SKenneth D. Merry 3685*ef270ab1SKenneth D. Merry extern int32_t sli_raise_ue(sli4_t *, uint8_t); 3686*ef270ab1SKenneth D. Merry extern int32_t sli_dump_is_ready(sli4_t *); 3687*ef270ab1SKenneth D. Merry extern int32_t sli_dump_is_present(sli4_t *); 3688*ef270ab1SKenneth D. Merry extern int32_t sli_reset_required(sli4_t *); 3689*ef270ab1SKenneth D. Merry extern int32_t sli_fw_error_status(sli4_t *); 3690*ef270ab1SKenneth D. Merry extern int32_t sli_fw_ready(sli4_t *); 3691*ef270ab1SKenneth D. Merry extern uint32_t sli_reg_read(sli4_t *, sli4_regname_e); 3692*ef270ab1SKenneth D. Merry extern void sli_reg_write(sli4_t *, sli4_regname_e, uint32_t); 3693*ef270ab1SKenneth D. Merry extern int32_t sli_link_is_configurable(sli4_t *); 3694*ef270ab1SKenneth D. Merry 3695*ef270ab1SKenneth D. Merry #include "ocs_fcp.h" 3696*ef270ab1SKenneth D. Merry 3697*ef270ab1SKenneth D. Merry /** 3698*ef270ab1SKenneth D. Merry * @brief Maximum value for a FCFI 3699*ef270ab1SKenneth D. Merry * 3700*ef270ab1SKenneth D. Merry * Note that although most commands provide a 16 bit field for the FCFI, 3701*ef270ab1SKenneth D. Merry * the FC/FCoE Asynchronous Recived CQE format only provides 6 bits for 3702*ef270ab1SKenneth D. Merry * the returned FCFI. Then effectively, the FCFI cannot be larger than 3703*ef270ab1SKenneth D. Merry * 1 << 6 or 64. 3704*ef270ab1SKenneth D. Merry */ 3705*ef270ab1SKenneth D. Merry #define SLI4_MAX_FCFI 64 3706*ef270ab1SKenneth D. Merry 3707*ef270ab1SKenneth D. Merry /** 3708*ef270ab1SKenneth D. Merry * @brief Maximum value for FCF index 3709*ef270ab1SKenneth D. Merry * 3710*ef270ab1SKenneth D. Merry * The SLI-4 specification uses a 16 bit field in most places for the FCF 3711*ef270ab1SKenneth D. Merry * index, but practically, this value will be much smaller. Arbitrarily 3712*ef270ab1SKenneth D. Merry * limit the max FCF index to match the max FCFI value. 3713*ef270ab1SKenneth D. Merry */ 3714*ef270ab1SKenneth D. Merry #define SLI4_MAX_FCF_INDEX SLI4_MAX_FCFI 3715*ef270ab1SKenneth D. Merry 3716*ef270ab1SKenneth D. Merry /************************************************************************* 3717*ef270ab1SKenneth D. Merry * SLI-4 FC/FCoE mailbox command formats and definitions. 3718*ef270ab1SKenneth D. Merry */ 3719*ef270ab1SKenneth D. Merry 3720*ef270ab1SKenneth D. Merry /** 3721*ef270ab1SKenneth D. Merry * FC/FCoE opcode (OPC) values. 3722*ef270ab1SKenneth D. Merry */ 3723*ef270ab1SKenneth D. Merry #define SLI4_OPC_FCOE_WQ_CREATE 0x1 3724*ef270ab1SKenneth D. Merry #define SLI4_OPC_FCOE_WQ_DESTROY 0x2 3725*ef270ab1SKenneth D. Merry #define SLI4_OPC_FCOE_POST_SGL_PAGES 0x3 3726*ef270ab1SKenneth D. Merry #define SLI4_OPC_FCOE_RQ_CREATE 0x5 3727*ef270ab1SKenneth D. Merry #define SLI4_OPC_FCOE_RQ_DESTROY 0x6 3728*ef270ab1SKenneth D. Merry #define SLI4_OPC_FCOE_READ_FCF_TABLE 0x8 3729*ef270ab1SKenneth D. Merry #define SLI4_OPC_FCOE_POST_HDR_TEMPLATES 0xb 3730*ef270ab1SKenneth D. Merry #define SLI4_OPC_FCOE_REDISCOVER_FCF 0x10 3731*ef270ab1SKenneth D. Merry 3732*ef270ab1SKenneth D. Merry /* Use the default CQ associated with the WQ */ 3733*ef270ab1SKenneth D. Merry #define SLI4_CQ_DEFAULT 0xffff 3734*ef270ab1SKenneth D. Merry 3735*ef270ab1SKenneth D. Merry typedef struct sli4_physical_page_descriptor_s { 3736*ef270ab1SKenneth D. Merry uint32_t low; 3737*ef270ab1SKenneth D. Merry uint32_t high; 3738*ef270ab1SKenneth D. Merry } sli4_physical_page_descriptor_t; 3739*ef270ab1SKenneth D. Merry 3740*ef270ab1SKenneth D. Merry /** 3741*ef270ab1SKenneth D. Merry * @brief FCOE_WQ_CREATE 3742*ef270ab1SKenneth D. Merry * 3743*ef270ab1SKenneth D. Merry * Create a Work Queue for FC/FCoE use. 3744*ef270ab1SKenneth D. Merry */ 3745*ef270ab1SKenneth D. Merry #define SLI4_FCOE_WQ_CREATE_V0_MAX_PAGES 4 3746*ef270ab1SKenneth D. Merry 3747*ef270ab1SKenneth D. Merry typedef struct sli4_req_fcoe_wq_create_s { 3748*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 3749*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 3750*ef270ab1SKenneth D. Merry uint32_t num_pages:8, 3751*ef270ab1SKenneth D. Merry dua:1, 3752*ef270ab1SKenneth D. Merry :7, 3753*ef270ab1SKenneth D. Merry cq_id:16; 3754*ef270ab1SKenneth D. Merry sli4_physical_page_descriptor_t page_physical_address[SLI4_FCOE_WQ_CREATE_V0_MAX_PAGES]; 3755*ef270ab1SKenneth D. Merry uint32_t bqu:1, 3756*ef270ab1SKenneth D. Merry :7, 3757*ef270ab1SKenneth D. Merry ulp:8, 3758*ef270ab1SKenneth D. Merry :16; 3759*ef270ab1SKenneth D. Merry #else 3760*ef270ab1SKenneth D. Merry #error big endian version not defined 3761*ef270ab1SKenneth D. Merry #endif 3762*ef270ab1SKenneth D. Merry } sli4_req_fcoe_wq_create_t; 3763*ef270ab1SKenneth D. Merry 3764*ef270ab1SKenneth D. Merry /** 3765*ef270ab1SKenneth D. Merry * @brief FCOE_WQ_CREATE_V1 3766*ef270ab1SKenneth D. Merry * 3767*ef270ab1SKenneth D. Merry * Create a version 1 Work Queue for FC/FCoE use. 3768*ef270ab1SKenneth D. Merry */ 3769*ef270ab1SKenneth D. Merry typedef struct sli4_req_fcoe_wq_create_v1_s { 3770*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 3771*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 3772*ef270ab1SKenneth D. Merry uint32_t num_pages:16, 3773*ef270ab1SKenneth D. Merry cq_id:16; 3774*ef270ab1SKenneth D. Merry uint32_t page_size:8, 3775*ef270ab1SKenneth D. Merry wqe_size:4, 3776*ef270ab1SKenneth D. Merry :4, 3777*ef270ab1SKenneth D. Merry wqe_count:16; 3778*ef270ab1SKenneth D. Merry uint32_t rsvd6; 3779*ef270ab1SKenneth D. Merry sli4_physical_page_descriptor_t page_physical_address[8]; 3780*ef270ab1SKenneth D. Merry #else 3781*ef270ab1SKenneth D. Merry #error big endian version not defined 3782*ef270ab1SKenneth D. Merry #endif 3783*ef270ab1SKenneth D. Merry } sli4_req_fcoe_wq_create_v1_t; 3784*ef270ab1SKenneth D. Merry 3785*ef270ab1SKenneth D. Merry #define SLI4_FCOE_WQ_CREATE_V1_MAX_PAGES 8 3786*ef270ab1SKenneth D. Merry 3787*ef270ab1SKenneth D. Merry /** 3788*ef270ab1SKenneth D. Merry * @brief FCOE_WQ_DESTROY 3789*ef270ab1SKenneth D. Merry * 3790*ef270ab1SKenneth D. Merry * Destroy an FC/FCoE Work Queue. 3791*ef270ab1SKenneth D. Merry */ 3792*ef270ab1SKenneth D. Merry typedef struct sli4_req_fcoe_wq_destroy_s { 3793*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 3794*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 3795*ef270ab1SKenneth D. Merry uint32_t wq_id:16, 3796*ef270ab1SKenneth D. Merry :16; 3797*ef270ab1SKenneth D. Merry #else 3798*ef270ab1SKenneth D. Merry #error big endian version not defined 3799*ef270ab1SKenneth D. Merry #endif 3800*ef270ab1SKenneth D. Merry } sli4_req_fcoe_wq_destroy_t; 3801*ef270ab1SKenneth D. Merry 3802*ef270ab1SKenneth D. Merry /** 3803*ef270ab1SKenneth D. Merry * @brief FCOE_POST_SGL_PAGES 3804*ef270ab1SKenneth D. Merry * 3805*ef270ab1SKenneth D. Merry * Register the scatter gather list (SGL) memory and associate it with an XRI. 3806*ef270ab1SKenneth D. Merry */ 3807*ef270ab1SKenneth D. Merry typedef struct sli4_req_fcoe_post_sgl_pages_s { 3808*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 3809*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 3810*ef270ab1SKenneth D. Merry uint32_t xri_start:16, 3811*ef270ab1SKenneth D. Merry xri_count:16; 3812*ef270ab1SKenneth D. Merry struct { 3813*ef270ab1SKenneth D. Merry uint32_t page0_low; 3814*ef270ab1SKenneth D. Merry uint32_t page0_high; 3815*ef270ab1SKenneth D. Merry uint32_t page1_low; 3816*ef270ab1SKenneth D. Merry uint32_t page1_high; 3817*ef270ab1SKenneth D. Merry } page_set[10]; 3818*ef270ab1SKenneth D. Merry #else 3819*ef270ab1SKenneth D. Merry #error big endian version not defined 3820*ef270ab1SKenneth D. Merry #endif 3821*ef270ab1SKenneth D. Merry } sli4_req_fcoe_post_sgl_pages_t; 3822*ef270ab1SKenneth D. Merry 3823*ef270ab1SKenneth D. Merry /** 3824*ef270ab1SKenneth D. Merry * @brief FCOE_RQ_CREATE 3825*ef270ab1SKenneth D. Merry * 3826*ef270ab1SKenneth D. Merry * Create a Receive Queue for FC/FCoE use. 3827*ef270ab1SKenneth D. Merry */ 3828*ef270ab1SKenneth D. Merry typedef struct sli4_req_fcoe_rq_create_s { 3829*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 3830*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 3831*ef270ab1SKenneth D. Merry uint32_t num_pages:16, 3832*ef270ab1SKenneth D. Merry dua:1, 3833*ef270ab1SKenneth D. Merry bqu:1, 3834*ef270ab1SKenneth D. Merry :6, 3835*ef270ab1SKenneth D. Merry ulp:8; 3836*ef270ab1SKenneth D. Merry uint32_t :16, 3837*ef270ab1SKenneth D. Merry rqe_count:4, 3838*ef270ab1SKenneth D. Merry :12; 3839*ef270ab1SKenneth D. Merry uint32_t rsvd6; 3840*ef270ab1SKenneth D. Merry uint32_t buffer_size:16, 3841*ef270ab1SKenneth D. Merry cq_id:16; 3842*ef270ab1SKenneth D. Merry uint32_t rsvd8; 3843*ef270ab1SKenneth D. Merry sli4_physical_page_descriptor_t page_physical_address[8]; 3844*ef270ab1SKenneth D. Merry #else 3845*ef270ab1SKenneth D. Merry #error big endian version not defined 3846*ef270ab1SKenneth D. Merry #endif 3847*ef270ab1SKenneth D. Merry } sli4_req_fcoe_rq_create_t; 3848*ef270ab1SKenneth D. Merry 3849*ef270ab1SKenneth D. Merry #define SLI4_FCOE_RQ_CREATE_V0_MAX_PAGES 8 3850*ef270ab1SKenneth D. Merry #define SLI4_FCOE_RQ_CREATE_V0_MIN_BUF_SIZE 128 3851*ef270ab1SKenneth D. Merry #define SLI4_FCOE_RQ_CREATE_V0_MAX_BUF_SIZE 2048 3852*ef270ab1SKenneth D. Merry 3853*ef270ab1SKenneth D. Merry /** 3854*ef270ab1SKenneth D. Merry * @brief FCOE_RQ_CREATE_V1 3855*ef270ab1SKenneth D. Merry * 3856*ef270ab1SKenneth D. Merry * Create a version 1 Receive Queue for FC/FCoE use. 3857*ef270ab1SKenneth D. Merry */ 3858*ef270ab1SKenneth D. Merry typedef struct sli4_req_fcoe_rq_create_v1_s { 3859*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 3860*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 3861*ef270ab1SKenneth D. Merry uint32_t num_pages:16, 3862*ef270ab1SKenneth D. Merry :13, 3863*ef270ab1SKenneth D. Merry dim:1, 3864*ef270ab1SKenneth D. Merry dfd:1, 3865*ef270ab1SKenneth D. Merry dnb:1; 3866*ef270ab1SKenneth D. Merry uint32_t page_size:8, 3867*ef270ab1SKenneth D. Merry rqe_size:4, 3868*ef270ab1SKenneth D. Merry :4, 3869*ef270ab1SKenneth D. Merry rqe_count:16; 3870*ef270ab1SKenneth D. Merry uint32_t rsvd6; 3871*ef270ab1SKenneth D. Merry uint32_t :16, 3872*ef270ab1SKenneth D. Merry cq_id:16; 3873*ef270ab1SKenneth D. Merry uint32_t buffer_size; 3874*ef270ab1SKenneth D. Merry sli4_physical_page_descriptor_t page_physical_address[8]; 3875*ef270ab1SKenneth D. Merry #else 3876*ef270ab1SKenneth D. Merry #error big endian version not defined 3877*ef270ab1SKenneth D. Merry #endif 3878*ef270ab1SKenneth D. Merry } sli4_req_fcoe_rq_create_v1_t; 3879*ef270ab1SKenneth D. Merry 3880*ef270ab1SKenneth D. Merry 3881*ef270ab1SKenneth D. Merry /** 3882*ef270ab1SKenneth D. Merry * @brief FCOE_RQ_CREATE_V2 3883*ef270ab1SKenneth D. Merry * 3884*ef270ab1SKenneth D. Merry * Create a version 2 Receive Queue for FC/FCoE use. 3885*ef270ab1SKenneth D. Merry */ 3886*ef270ab1SKenneth D. Merry typedef struct sli4_req_fcoe_rq_create_v2_s { 3887*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 3888*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 3889*ef270ab1SKenneth D. Merry uint32_t num_pages:16, 3890*ef270ab1SKenneth D. Merry rq_count:8, 3891*ef270ab1SKenneth D. Merry :5, 3892*ef270ab1SKenneth D. Merry dim:1, 3893*ef270ab1SKenneth D. Merry dfd:1, 3894*ef270ab1SKenneth D. Merry dnb:1; 3895*ef270ab1SKenneth D. Merry uint32_t page_size:8, 3896*ef270ab1SKenneth D. Merry rqe_size:4, 3897*ef270ab1SKenneth D. Merry :4, 3898*ef270ab1SKenneth D. Merry rqe_count:16; 3899*ef270ab1SKenneth D. Merry uint32_t hdr_buffer_size:16, 3900*ef270ab1SKenneth D. Merry payload_buffer_size:16; 3901*ef270ab1SKenneth D. Merry uint32_t base_cq_id:16, 3902*ef270ab1SKenneth D. Merry :16; 3903*ef270ab1SKenneth D. Merry uint32_t rsvd; 3904*ef270ab1SKenneth D. Merry sli4_physical_page_descriptor_t page_physical_address[0]; 3905*ef270ab1SKenneth D. Merry #else 3906*ef270ab1SKenneth D. Merry #error big endian version not defined 3907*ef270ab1SKenneth D. Merry #endif 3908*ef270ab1SKenneth D. Merry } sli4_req_fcoe_rq_create_v2_t; 3909*ef270ab1SKenneth D. Merry 3910*ef270ab1SKenneth D. Merry 3911*ef270ab1SKenneth D. Merry #define SLI4_FCOE_RQ_CREATE_V1_MAX_PAGES 8 3912*ef270ab1SKenneth D. Merry #define SLI4_FCOE_RQ_CREATE_V1_MIN_BUF_SIZE 64 3913*ef270ab1SKenneth D. Merry #define SLI4_FCOE_RQ_CREATE_V1_MAX_BUF_SIZE 2048 3914*ef270ab1SKenneth D. Merry 3915*ef270ab1SKenneth D. Merry #define SLI4_FCOE_RQE_SIZE_8 0x2 3916*ef270ab1SKenneth D. Merry #define SLI4_FCOE_RQE_SIZE_16 0x3 3917*ef270ab1SKenneth D. Merry #define SLI4_FCOE_RQE_SIZE_32 0x4 3918*ef270ab1SKenneth D. Merry #define SLI4_FCOE_RQE_SIZE_64 0x5 3919*ef270ab1SKenneth D. Merry #define SLI4_FCOE_RQE_SIZE_128 0x6 3920*ef270ab1SKenneth D. Merry 3921*ef270ab1SKenneth D. Merry #define SLI4_FCOE_RQ_PAGE_SIZE_4096 0x1 3922*ef270ab1SKenneth D. Merry #define SLI4_FCOE_RQ_PAGE_SIZE_8192 0x2 3923*ef270ab1SKenneth D. Merry #define SLI4_FCOE_RQ_PAGE_SIZE_16384 0x4 3924*ef270ab1SKenneth D. Merry #define SLI4_FCOE_RQ_PAGE_SIZE_32768 0x8 3925*ef270ab1SKenneth D. Merry #define SLI4_FCOE_RQ_PAGE_SIZE_64536 0x10 3926*ef270ab1SKenneth D. Merry 3927*ef270ab1SKenneth D. Merry #define SLI4_FCOE_RQE_SIZE 8 3928*ef270ab1SKenneth D. Merry 3929*ef270ab1SKenneth D. Merry /** 3930*ef270ab1SKenneth D. Merry * @brief FCOE_RQ_DESTROY 3931*ef270ab1SKenneth D. Merry * 3932*ef270ab1SKenneth D. Merry * Destroy an FC/FCoE Receive Queue. 3933*ef270ab1SKenneth D. Merry */ 3934*ef270ab1SKenneth D. Merry typedef struct sli4_req_fcoe_rq_destroy_s { 3935*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 3936*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 3937*ef270ab1SKenneth D. Merry uint32_t rq_id:16, 3938*ef270ab1SKenneth D. Merry :16; 3939*ef270ab1SKenneth D. Merry #else 3940*ef270ab1SKenneth D. Merry #error big endian version not defined 3941*ef270ab1SKenneth D. Merry #endif 3942*ef270ab1SKenneth D. Merry } sli4_req_fcoe_rq_destroy_t; 3943*ef270ab1SKenneth D. Merry 3944*ef270ab1SKenneth D. Merry /** 3945*ef270ab1SKenneth D. Merry * @brief FCOE_READ_FCF_TABLE 3946*ef270ab1SKenneth D. Merry * 3947*ef270ab1SKenneth D. Merry * Retrieve a FCF database (also known as a table) entry created by the SLI Port 3948*ef270ab1SKenneth D. Merry * during FIP discovery. 3949*ef270ab1SKenneth D. Merry */ 3950*ef270ab1SKenneth D. Merry typedef struct sli4_req_fcoe_read_fcf_table_s { 3951*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 3952*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 3953*ef270ab1SKenneth D. Merry uint32_t fcf_index:16, 3954*ef270ab1SKenneth D. Merry :16; 3955*ef270ab1SKenneth D. Merry #else 3956*ef270ab1SKenneth D. Merry #error big endian version not defined 3957*ef270ab1SKenneth D. Merry #endif 3958*ef270ab1SKenneth D. Merry } sli4_req_fcoe_read_fcf_table_t; 3959*ef270ab1SKenneth D. Merry 3960*ef270ab1SKenneth D. Merry /* A FCF index of -1 on the request means return the first valid entry */ 3961*ef270ab1SKenneth D. Merry #define SLI4_FCOE_FCF_TABLE_FIRST (UINT16_MAX) 3962*ef270ab1SKenneth D. Merry 3963*ef270ab1SKenneth D. Merry /** 3964*ef270ab1SKenneth D. Merry * @brief FCF table entry 3965*ef270ab1SKenneth D. Merry * 3966*ef270ab1SKenneth D. Merry * This is the information returned by the FCOE_READ_FCF_TABLE command. 3967*ef270ab1SKenneth D. Merry */ 3968*ef270ab1SKenneth D. Merry typedef struct sli4_fcf_entry_s { 3969*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 3970*ef270ab1SKenneth D. Merry uint32_t max_receive_size; 3971*ef270ab1SKenneth D. Merry uint32_t fip_keep_alive; 3972*ef270ab1SKenneth D. Merry uint32_t fip_priority; 3973*ef270ab1SKenneth D. Merry uint8_t fcf_mac_address[6]; 3974*ef270ab1SKenneth D. Merry uint8_t fcf_available; 3975*ef270ab1SKenneth D. Merry uint8_t mac_address_provider; 3976*ef270ab1SKenneth D. Merry uint8_t fabric_name_id[8]; 3977*ef270ab1SKenneth D. Merry uint8_t fc_map[3]; 3978*ef270ab1SKenneth D. Merry uint8_t val:1, 3979*ef270ab1SKenneth D. Merry fc:1, 3980*ef270ab1SKenneth D. Merry :5, 3981*ef270ab1SKenneth D. Merry sol:1; 3982*ef270ab1SKenneth D. Merry uint32_t fcf_index:16, 3983*ef270ab1SKenneth D. Merry fcf_state:16; 3984*ef270ab1SKenneth D. Merry uint8_t vlan_bitmap[512]; 3985*ef270ab1SKenneth D. Merry uint8_t switch_name[8]; 3986*ef270ab1SKenneth D. Merry #else 3987*ef270ab1SKenneth D. Merry #error big endian version not defined 3988*ef270ab1SKenneth D. Merry #endif 3989*ef270ab1SKenneth D. Merry } sli4_fcf_entry_t; 3990*ef270ab1SKenneth D. Merry 3991*ef270ab1SKenneth D. Merry /** 3992*ef270ab1SKenneth D. Merry * @brief FCOE_READ_FCF_TABLE response. 3993*ef270ab1SKenneth D. Merry */ 3994*ef270ab1SKenneth D. Merry typedef struct sli4_res_fcoe_read_fcf_table_s { 3995*ef270ab1SKenneth D. Merry sli4_res_hdr_t hdr; 3996*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 3997*ef270ab1SKenneth D. Merry uint32_t event_tag; 3998*ef270ab1SKenneth D. Merry uint32_t next_index:16, 3999*ef270ab1SKenneth D. Merry :16; 4000*ef270ab1SKenneth D. Merry sli4_fcf_entry_t fcf_entry; 4001*ef270ab1SKenneth D. Merry #else 4002*ef270ab1SKenneth D. Merry #error big endian version not defined 4003*ef270ab1SKenneth D. Merry #endif 4004*ef270ab1SKenneth D. Merry } sli4_res_fcoe_read_fcf_table_t; 4005*ef270ab1SKenneth D. Merry 4006*ef270ab1SKenneth D. Merry /* A next FCF index of -1 in the response means this is the last valid entry */ 4007*ef270ab1SKenneth D. Merry #define SLI4_FCOE_FCF_TABLE_LAST (UINT16_MAX) 4008*ef270ab1SKenneth D. Merry 4009*ef270ab1SKenneth D. Merry 4010*ef270ab1SKenneth D. Merry /** 4011*ef270ab1SKenneth D. Merry * @brief FCOE_POST_HDR_TEMPLATES 4012*ef270ab1SKenneth D. Merry */ 4013*ef270ab1SKenneth D. Merry typedef struct sli4_req_fcoe_post_hdr_templates_s { 4014*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 4015*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 4016*ef270ab1SKenneth D. Merry uint32_t rpi_offset:16, 4017*ef270ab1SKenneth D. Merry page_count:16; 4018*ef270ab1SKenneth D. Merry sli4_physical_page_descriptor_t page_descriptor[0]; 4019*ef270ab1SKenneth D. Merry #else 4020*ef270ab1SKenneth D. Merry #error big endian version not defined 4021*ef270ab1SKenneth D. Merry #endif 4022*ef270ab1SKenneth D. Merry } sli4_req_fcoe_post_hdr_templates_t; 4023*ef270ab1SKenneth D. Merry 4024*ef270ab1SKenneth D. Merry #define SLI4_FCOE_HDR_TEMPLATE_SIZE 64 4025*ef270ab1SKenneth D. Merry 4026*ef270ab1SKenneth D. Merry /** 4027*ef270ab1SKenneth D. Merry * @brief FCOE_REDISCOVER_FCF 4028*ef270ab1SKenneth D. Merry */ 4029*ef270ab1SKenneth D. Merry typedef struct sli4_req_fcoe_rediscover_fcf_s { 4030*ef270ab1SKenneth D. Merry sli4_req_hdr_t hdr; 4031*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 4032*ef270ab1SKenneth D. Merry uint32_t fcf_count:16, 4033*ef270ab1SKenneth D. Merry :16; 4034*ef270ab1SKenneth D. Merry uint32_t rsvd5; 4035*ef270ab1SKenneth D. Merry uint16_t fcf_index[16]; 4036*ef270ab1SKenneth D. Merry #else 4037*ef270ab1SKenneth D. Merry #error big endian version not defined 4038*ef270ab1SKenneth D. Merry #endif 4039*ef270ab1SKenneth D. Merry } sli4_req_fcoe_rediscover_fcf_t; 4040*ef270ab1SKenneth D. Merry 4041*ef270ab1SKenneth D. Merry 4042*ef270ab1SKenneth D. Merry /** 4043*ef270ab1SKenneth D. Merry * Work Queue Entry (WQE) types. 4044*ef270ab1SKenneth D. Merry */ 4045*ef270ab1SKenneth D. Merry #define SLI4_WQE_ABORT 0x0f 4046*ef270ab1SKenneth D. Merry #define SLI4_WQE_ELS_REQUEST64 0x8a 4047*ef270ab1SKenneth D. Merry #define SLI4_WQE_FCP_IBIDIR64 0xac 4048*ef270ab1SKenneth D. Merry #define SLI4_WQE_FCP_IREAD64 0x9a 4049*ef270ab1SKenneth D. Merry #define SLI4_WQE_FCP_IWRITE64 0x98 4050*ef270ab1SKenneth D. Merry #define SLI4_WQE_FCP_ICMND64 0x9c 4051*ef270ab1SKenneth D. Merry #define SLI4_WQE_FCP_TRECEIVE64 0xa1 4052*ef270ab1SKenneth D. Merry #define SLI4_WQE_FCP_CONT_TRECEIVE64 0xe5 4053*ef270ab1SKenneth D. Merry #define SLI4_WQE_FCP_TRSP64 0xa3 4054*ef270ab1SKenneth D. Merry #define SLI4_WQE_FCP_TSEND64 0x9f 4055*ef270ab1SKenneth D. Merry #define SLI4_WQE_GEN_REQUEST64 0xc2 4056*ef270ab1SKenneth D. Merry #define SLI4_WQE_SEND_FRAME 0xe1 4057*ef270ab1SKenneth D. Merry #define SLI4_WQE_XMIT_BCAST64 0X84 4058*ef270ab1SKenneth D. Merry #define SLI4_WQE_XMIT_BLS_RSP 0x97 4059*ef270ab1SKenneth D. Merry #define SLI4_WQE_ELS_RSP64 0x95 4060*ef270ab1SKenneth D. Merry #define SLI4_WQE_XMIT_SEQUENCE64 0x82 4061*ef270ab1SKenneth D. Merry #define SLI4_WQE_REQUEUE_XRI 0x93 4062*ef270ab1SKenneth D. Merry 4063*ef270ab1SKenneth D. Merry /** 4064*ef270ab1SKenneth D. Merry * WQE command types. 4065*ef270ab1SKenneth D. Merry */ 4066*ef270ab1SKenneth D. Merry #define SLI4_CMD_FCP_IREAD64_WQE 0x00 4067*ef270ab1SKenneth D. Merry #define SLI4_CMD_FCP_ICMND64_WQE 0x00 4068*ef270ab1SKenneth D. Merry #define SLI4_CMD_FCP_IWRITE64_WQE 0x01 4069*ef270ab1SKenneth D. Merry #define SLI4_CMD_FCP_TRECEIVE64_WQE 0x02 4070*ef270ab1SKenneth D. Merry #define SLI4_CMD_FCP_TRSP64_WQE 0x03 4071*ef270ab1SKenneth D. Merry #define SLI4_CMD_FCP_TSEND64_WQE 0x07 4072*ef270ab1SKenneth D. Merry #define SLI4_CMD_GEN_REQUEST64_WQE 0x08 4073*ef270ab1SKenneth D. Merry #define SLI4_CMD_XMIT_BCAST64_WQE 0x08 4074*ef270ab1SKenneth D. Merry #define SLI4_CMD_XMIT_BLS_RSP64_WQE 0x08 4075*ef270ab1SKenneth D. Merry #define SLI4_CMD_ABORT_WQE 0x08 4076*ef270ab1SKenneth D. Merry #define SLI4_CMD_XMIT_SEQUENCE64_WQE 0x08 4077*ef270ab1SKenneth D. Merry #define SLI4_CMD_REQUEUE_XRI_WQE 0x0A 4078*ef270ab1SKenneth D. Merry #define SLI4_CMD_SEND_FRAME_WQE 0x0a 4079*ef270ab1SKenneth D. Merry 4080*ef270ab1SKenneth D. Merry #define SLI4_WQE_SIZE 0x05 4081*ef270ab1SKenneth D. Merry #define SLI4_WQE_EXT_SIZE 0x06 4082*ef270ab1SKenneth D. Merry 4083*ef270ab1SKenneth D. Merry #define SLI4_WQE_BYTES (16 * sizeof(uint32_t)) 4084*ef270ab1SKenneth D. Merry #define SLI4_WQE_EXT_BYTES (32 * sizeof(uint32_t)) 4085*ef270ab1SKenneth D. Merry 4086*ef270ab1SKenneth D. Merry /* Mask for ccp (CS_CTL) */ 4087*ef270ab1SKenneth D. Merry #define SLI4_MASK_CCP 0xfe /* Upper 7 bits of CS_CTL is priority */ 4088*ef270ab1SKenneth D. Merry 4089*ef270ab1SKenneth D. Merry /** 4090*ef270ab1SKenneth D. Merry * @brief Generic WQE 4091*ef270ab1SKenneth D. Merry */ 4092*ef270ab1SKenneth D. Merry typedef struct sli4_generic_wqe_s { 4093*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 4094*ef270ab1SKenneth D. Merry uint32_t cmd_spec0_5[6]; 4095*ef270ab1SKenneth D. Merry uint32_t xri_tag:16, 4096*ef270ab1SKenneth D. Merry context_tag:16; 4097*ef270ab1SKenneth D. Merry uint32_t :2, 4098*ef270ab1SKenneth D. Merry ct:2, 4099*ef270ab1SKenneth D. Merry :4, 4100*ef270ab1SKenneth D. Merry command:8, 4101*ef270ab1SKenneth D. Merry class:3, 4102*ef270ab1SKenneth D. Merry :1, 4103*ef270ab1SKenneth D. Merry pu:2, 4104*ef270ab1SKenneth D. Merry :2, 4105*ef270ab1SKenneth D. Merry timer:8; 4106*ef270ab1SKenneth D. Merry uint32_t abort_tag; 4107*ef270ab1SKenneth D. Merry uint32_t request_tag:16, 4108*ef270ab1SKenneth D. Merry :16; 4109*ef270ab1SKenneth D. Merry uint32_t ebde_cnt:4, 4110*ef270ab1SKenneth D. Merry :3, 4111*ef270ab1SKenneth D. Merry len_loc:2, 4112*ef270ab1SKenneth D. Merry qosd:1, 4113*ef270ab1SKenneth D. Merry :1, 4114*ef270ab1SKenneth D. Merry xbl:1, 4115*ef270ab1SKenneth D. Merry hlm:1, 4116*ef270ab1SKenneth D. Merry iod:1, 4117*ef270ab1SKenneth D. Merry dbde:1, 4118*ef270ab1SKenneth D. Merry wqes:1, 4119*ef270ab1SKenneth D. Merry pri:3, 4120*ef270ab1SKenneth D. Merry pv:1, 4121*ef270ab1SKenneth D. Merry eat:1, 4122*ef270ab1SKenneth D. Merry xc:1, 4123*ef270ab1SKenneth D. Merry :1, 4124*ef270ab1SKenneth D. Merry ccpe:1, 4125*ef270ab1SKenneth D. Merry ccp:8; 4126*ef270ab1SKenneth D. Merry uint32_t cmd_type:4, 4127*ef270ab1SKenneth D. Merry :3, 4128*ef270ab1SKenneth D. Merry wqec:1, 4129*ef270ab1SKenneth D. Merry :8, 4130*ef270ab1SKenneth D. Merry cq_id:16; 4131*ef270ab1SKenneth D. Merry #else 4132*ef270ab1SKenneth D. Merry #error big endian version not defined 4133*ef270ab1SKenneth D. Merry #endif 4134*ef270ab1SKenneth D. Merry } sli4_generic_wqe_t; 4135*ef270ab1SKenneth D. Merry 4136*ef270ab1SKenneth D. Merry /** 4137*ef270ab1SKenneth D. Merry * @brief WQE used to abort exchanges. 4138*ef270ab1SKenneth D. Merry */ 4139*ef270ab1SKenneth D. Merry typedef struct sli4_abort_wqe_s { 4140*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 4141*ef270ab1SKenneth D. Merry uint32_t rsvd0; 4142*ef270ab1SKenneth D. Merry uint32_t rsvd1; 4143*ef270ab1SKenneth D. Merry uint32_t ext_t_tag; 4144*ef270ab1SKenneth D. Merry uint32_t ia:1, 4145*ef270ab1SKenneth D. Merry ir:1, 4146*ef270ab1SKenneth D. Merry :6, 4147*ef270ab1SKenneth D. Merry criteria:8, 4148*ef270ab1SKenneth D. Merry :16; 4149*ef270ab1SKenneth D. Merry uint32_t ext_t_mask; 4150*ef270ab1SKenneth D. Merry uint32_t t_mask; 4151*ef270ab1SKenneth D. Merry uint32_t xri_tag:16, 4152*ef270ab1SKenneth D. Merry context_tag:16; 4153*ef270ab1SKenneth D. Merry uint32_t :2, 4154*ef270ab1SKenneth D. Merry ct:2, 4155*ef270ab1SKenneth D. Merry :4, 4156*ef270ab1SKenneth D. Merry command:8, 4157*ef270ab1SKenneth D. Merry class:3, 4158*ef270ab1SKenneth D. Merry :1, 4159*ef270ab1SKenneth D. Merry pu:2, 4160*ef270ab1SKenneth D. Merry :2, 4161*ef270ab1SKenneth D. Merry timer:8; 4162*ef270ab1SKenneth D. Merry uint32_t t_tag; 4163*ef270ab1SKenneth D. Merry uint32_t request_tag:16, 4164*ef270ab1SKenneth D. Merry :16; 4165*ef270ab1SKenneth D. Merry uint32_t ebde_cnt:4, 4166*ef270ab1SKenneth D. Merry :3, 4167*ef270ab1SKenneth D. Merry len_loc:2, 4168*ef270ab1SKenneth D. Merry qosd:1, 4169*ef270ab1SKenneth D. Merry :1, 4170*ef270ab1SKenneth D. Merry xbl:1, 4171*ef270ab1SKenneth D. Merry :1, 4172*ef270ab1SKenneth D. Merry iod:1, 4173*ef270ab1SKenneth D. Merry dbde:1, 4174*ef270ab1SKenneth D. Merry wqes:1, 4175*ef270ab1SKenneth D. Merry pri:3, 4176*ef270ab1SKenneth D. Merry pv:1, 4177*ef270ab1SKenneth D. Merry eat:1, 4178*ef270ab1SKenneth D. Merry xc:1, 4179*ef270ab1SKenneth D. Merry :1, 4180*ef270ab1SKenneth D. Merry ccpe:1, 4181*ef270ab1SKenneth D. Merry ccp:8; 4182*ef270ab1SKenneth D. Merry uint32_t cmd_type:4, 4183*ef270ab1SKenneth D. Merry :3, 4184*ef270ab1SKenneth D. Merry wqec:1, 4185*ef270ab1SKenneth D. Merry :8, 4186*ef270ab1SKenneth D. Merry cq_id:16; 4187*ef270ab1SKenneth D. Merry #else 4188*ef270ab1SKenneth D. Merry #error big endian version not defined 4189*ef270ab1SKenneth D. Merry #endif 4190*ef270ab1SKenneth D. Merry } sli4_abort_wqe_t; 4191*ef270ab1SKenneth D. Merry 4192*ef270ab1SKenneth D. Merry #define SLI4_ABORT_CRITERIA_XRI_TAG 0x01 4193*ef270ab1SKenneth D. Merry #define SLI4_ABORT_CRITERIA_ABORT_TAG 0x02 4194*ef270ab1SKenneth D. Merry #define SLI4_ABORT_CRITERIA_REQUEST_TAG 0x03 4195*ef270ab1SKenneth D. Merry #define SLI4_ABORT_CRITERIA_EXT_ABORT_TAG 0x04 4196*ef270ab1SKenneth D. Merry 4197*ef270ab1SKenneth D. Merry typedef enum { 4198*ef270ab1SKenneth D. Merry SLI_ABORT_XRI, 4199*ef270ab1SKenneth D. Merry SLI_ABORT_ABORT_ID, 4200*ef270ab1SKenneth D. Merry SLI_ABORT_REQUEST_ID, 4201*ef270ab1SKenneth D. Merry SLI_ABORT_MAX, /* must be last */ 4202*ef270ab1SKenneth D. Merry } sli4_abort_type_e; 4203*ef270ab1SKenneth D. Merry 4204*ef270ab1SKenneth D. Merry /** 4205*ef270ab1SKenneth D. Merry * @brief WQE used to create an ELS request. 4206*ef270ab1SKenneth D. Merry */ 4207*ef270ab1SKenneth D. Merry typedef struct sli4_els_request64_wqe_s { 4208*ef270ab1SKenneth D. Merry sli4_bde_t els_request_payload; 4209*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 4210*ef270ab1SKenneth D. Merry uint32_t els_request_payload_length; 4211*ef270ab1SKenneth D. Merry uint32_t sid:24, 4212*ef270ab1SKenneth D. Merry sp:1, 4213*ef270ab1SKenneth D. Merry :7; 4214*ef270ab1SKenneth D. Merry uint32_t remote_id:24, 4215*ef270ab1SKenneth D. Merry :8; 4216*ef270ab1SKenneth D. Merry uint32_t xri_tag:16, 4217*ef270ab1SKenneth D. Merry context_tag:16; 4218*ef270ab1SKenneth D. Merry uint32_t :2, 4219*ef270ab1SKenneth D. Merry ct:2, 4220*ef270ab1SKenneth D. Merry :4, 4221*ef270ab1SKenneth D. Merry command:8, 4222*ef270ab1SKenneth D. Merry class:3, 4223*ef270ab1SKenneth D. Merry ar:1, 4224*ef270ab1SKenneth D. Merry pu:2, 4225*ef270ab1SKenneth D. Merry :2, 4226*ef270ab1SKenneth D. Merry timer:8; 4227*ef270ab1SKenneth D. Merry uint32_t abort_tag; 4228*ef270ab1SKenneth D. Merry uint32_t request_tag:16, 4229*ef270ab1SKenneth D. Merry temporary_rpi:16; 4230*ef270ab1SKenneth D. Merry uint32_t ebde_cnt:4, 4231*ef270ab1SKenneth D. Merry :3, 4232*ef270ab1SKenneth D. Merry len_loc:2, 4233*ef270ab1SKenneth D. Merry qosd:1, 4234*ef270ab1SKenneth D. Merry :1, 4235*ef270ab1SKenneth D. Merry xbl:1, 4236*ef270ab1SKenneth D. Merry hlm:1, 4237*ef270ab1SKenneth D. Merry iod:1, 4238*ef270ab1SKenneth D. Merry dbde:1, 4239*ef270ab1SKenneth D. Merry wqes:1, 4240*ef270ab1SKenneth D. Merry pri:3, 4241*ef270ab1SKenneth D. Merry pv:1, 4242*ef270ab1SKenneth D. Merry eat:1, 4243*ef270ab1SKenneth D. Merry xc:1, 4244*ef270ab1SKenneth D. Merry :1, 4245*ef270ab1SKenneth D. Merry ccpe:1, 4246*ef270ab1SKenneth D. Merry ccp:8; 4247*ef270ab1SKenneth D. Merry uint32_t cmd_type:4, 4248*ef270ab1SKenneth D. Merry els_id:3, 4249*ef270ab1SKenneth D. Merry wqec:1, 4250*ef270ab1SKenneth D. Merry :8, 4251*ef270ab1SKenneth D. Merry cq_id:16; 4252*ef270ab1SKenneth D. Merry sli4_bde_t els_response_payload_bde; 4253*ef270ab1SKenneth D. Merry uint32_t max_response_payload_length; 4254*ef270ab1SKenneth D. Merry #else 4255*ef270ab1SKenneth D. Merry #error big endian version not defined 4256*ef270ab1SKenneth D. Merry #endif 4257*ef270ab1SKenneth D. Merry } sli4_els_request64_wqe_t; 4258*ef270ab1SKenneth D. Merry 4259*ef270ab1SKenneth D. Merry #define SLI4_ELS_REQUEST64_CONTEXT_RPI 0x0 4260*ef270ab1SKenneth D. Merry #define SLI4_ELS_REQUEST64_CONTEXT_VPI 0x1 4261*ef270ab1SKenneth D. Merry #define SLI4_ELS_REQUEST64_CONTEXT_VFI 0x2 4262*ef270ab1SKenneth D. Merry #define SLI4_ELS_REQUEST64_CONTEXT_FCFI 0x3 4263*ef270ab1SKenneth D. Merry 4264*ef270ab1SKenneth D. Merry #define SLI4_ELS_REQUEST64_CLASS_2 0x1 4265*ef270ab1SKenneth D. Merry #define SLI4_ELS_REQUEST64_CLASS_3 0x2 4266*ef270ab1SKenneth D. Merry 4267*ef270ab1SKenneth D. Merry #define SLI4_ELS_REQUEST64_DIR_WRITE 0x0 4268*ef270ab1SKenneth D. Merry #define SLI4_ELS_REQUEST64_DIR_READ 0x1 4269*ef270ab1SKenneth D. Merry 4270*ef270ab1SKenneth D. Merry #define SLI4_ELS_REQUEST64_OTHER 0x0 4271*ef270ab1SKenneth D. Merry #define SLI4_ELS_REQUEST64_LOGO 0x1 4272*ef270ab1SKenneth D. Merry #define SLI4_ELS_REQUEST64_FDISC 0x2 4273*ef270ab1SKenneth D. Merry #define SLI4_ELS_REQUEST64_FLOGIN 0x3 4274*ef270ab1SKenneth D. Merry #define SLI4_ELS_REQUEST64_PLOGI 0x4 4275*ef270ab1SKenneth D. Merry 4276*ef270ab1SKenneth D. Merry #define SLI4_ELS_REQUEST64_CMD_GEN 0x08 4277*ef270ab1SKenneth D. Merry #define SLI4_ELS_REQUEST64_CMD_NON_FABRIC 0x0c 4278*ef270ab1SKenneth D. Merry #define SLI4_ELS_REQUEST64_CMD_FABRIC 0x0d 4279*ef270ab1SKenneth D. Merry 4280*ef270ab1SKenneth D. Merry /** 4281*ef270ab1SKenneth D. Merry * @brief WQE used to create an FCP initiator no data command. 4282*ef270ab1SKenneth D. Merry */ 4283*ef270ab1SKenneth D. Merry typedef struct sli4_fcp_icmnd64_wqe_s { 4284*ef270ab1SKenneth D. Merry sli4_bde_t bde; 4285*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 4286*ef270ab1SKenneth D. Merry uint32_t payload_offset_length:16, 4287*ef270ab1SKenneth D. Merry fcp_cmd_buffer_length:16; 4288*ef270ab1SKenneth D. Merry uint32_t rsvd4; 4289*ef270ab1SKenneth D. Merry uint32_t remote_n_port_id:24, 4290*ef270ab1SKenneth D. Merry :8; 4291*ef270ab1SKenneth D. Merry uint32_t xri_tag:16, 4292*ef270ab1SKenneth D. Merry context_tag:16; 4293*ef270ab1SKenneth D. Merry uint32_t dif:2, 4294*ef270ab1SKenneth D. Merry ct:2, 4295*ef270ab1SKenneth D. Merry bs:3, 4296*ef270ab1SKenneth D. Merry :1, 4297*ef270ab1SKenneth D. Merry command:8, 4298*ef270ab1SKenneth D. Merry class:3, 4299*ef270ab1SKenneth D. Merry :1, 4300*ef270ab1SKenneth D. Merry pu:2, 4301*ef270ab1SKenneth D. Merry erp:1, 4302*ef270ab1SKenneth D. Merry lnk:1, 4303*ef270ab1SKenneth D. Merry timer:8; 4304*ef270ab1SKenneth D. Merry uint32_t abort_tag; 4305*ef270ab1SKenneth D. Merry uint32_t request_tag:16, 4306*ef270ab1SKenneth D. Merry :16; 4307*ef270ab1SKenneth D. Merry uint32_t ebde_cnt:4, 4308*ef270ab1SKenneth D. Merry :3, 4309*ef270ab1SKenneth D. Merry len_loc:2, 4310*ef270ab1SKenneth D. Merry qosd:1, 4311*ef270ab1SKenneth D. Merry :1, 4312*ef270ab1SKenneth D. Merry xbl:1, 4313*ef270ab1SKenneth D. Merry hlm:1, 4314*ef270ab1SKenneth D. Merry iod:1, 4315*ef270ab1SKenneth D. Merry dbde:1, 4316*ef270ab1SKenneth D. Merry wqes:1, 4317*ef270ab1SKenneth D. Merry pri:3, 4318*ef270ab1SKenneth D. Merry pv:1, 4319*ef270ab1SKenneth D. Merry eat:1, 4320*ef270ab1SKenneth D. Merry xc:1, 4321*ef270ab1SKenneth D. Merry :1, 4322*ef270ab1SKenneth D. Merry ccpe:1, 4323*ef270ab1SKenneth D. Merry ccp:8; 4324*ef270ab1SKenneth D. Merry uint32_t cmd_type:4, 4325*ef270ab1SKenneth D. Merry :3, 4326*ef270ab1SKenneth D. Merry wqec:1, 4327*ef270ab1SKenneth D. Merry :8, 4328*ef270ab1SKenneth D. Merry cq_id:16; 4329*ef270ab1SKenneth D. Merry uint32_t rsvd12; 4330*ef270ab1SKenneth D. Merry uint32_t rsvd13; 4331*ef270ab1SKenneth D. Merry uint32_t rsvd14; 4332*ef270ab1SKenneth D. Merry uint32_t rsvd15; 4333*ef270ab1SKenneth D. Merry #else 4334*ef270ab1SKenneth D. Merry #error big endian version not defined 4335*ef270ab1SKenneth D. Merry #endif 4336*ef270ab1SKenneth D. Merry } sli4_fcp_icmnd64_wqe_t; 4337*ef270ab1SKenneth D. Merry 4338*ef270ab1SKenneth D. Merry /** 4339*ef270ab1SKenneth D. Merry * @brief WQE used to create an FCP initiator read. 4340*ef270ab1SKenneth D. Merry */ 4341*ef270ab1SKenneth D. Merry typedef struct sli4_fcp_iread64_wqe_s { 4342*ef270ab1SKenneth D. Merry sli4_bde_t bde; 4343*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 4344*ef270ab1SKenneth D. Merry uint32_t payload_offset_length:16, 4345*ef270ab1SKenneth D. Merry fcp_cmd_buffer_length:16; 4346*ef270ab1SKenneth D. Merry uint32_t total_transfer_length; 4347*ef270ab1SKenneth D. Merry uint32_t remote_n_port_id:24, 4348*ef270ab1SKenneth D. Merry :8; 4349*ef270ab1SKenneth D. Merry uint32_t xri_tag:16, 4350*ef270ab1SKenneth D. Merry context_tag:16; 4351*ef270ab1SKenneth D. Merry uint32_t dif:2, 4352*ef270ab1SKenneth D. Merry ct:2, 4353*ef270ab1SKenneth D. Merry bs:3, 4354*ef270ab1SKenneth D. Merry :1, 4355*ef270ab1SKenneth D. Merry command:8, 4356*ef270ab1SKenneth D. Merry class:3, 4357*ef270ab1SKenneth D. Merry :1, 4358*ef270ab1SKenneth D. Merry pu:2, 4359*ef270ab1SKenneth D. Merry erp:1, 4360*ef270ab1SKenneth D. Merry lnk:1, 4361*ef270ab1SKenneth D. Merry timer:8; 4362*ef270ab1SKenneth D. Merry uint32_t abort_tag; 4363*ef270ab1SKenneth D. Merry uint32_t request_tag:16, 4364*ef270ab1SKenneth D. Merry :16; 4365*ef270ab1SKenneth D. Merry uint32_t ebde_cnt:4, 4366*ef270ab1SKenneth D. Merry :3, 4367*ef270ab1SKenneth D. Merry len_loc:2, 4368*ef270ab1SKenneth D. Merry qosd:1, 4369*ef270ab1SKenneth D. Merry :1, 4370*ef270ab1SKenneth D. Merry xbl:1, 4371*ef270ab1SKenneth D. Merry hlm:1, 4372*ef270ab1SKenneth D. Merry iod:1, 4373*ef270ab1SKenneth D. Merry dbde:1, 4374*ef270ab1SKenneth D. Merry wqes:1, 4375*ef270ab1SKenneth D. Merry pri:3, 4376*ef270ab1SKenneth D. Merry pv:1, 4377*ef270ab1SKenneth D. Merry eat:1, 4378*ef270ab1SKenneth D. Merry xc:1, 4379*ef270ab1SKenneth D. Merry :1, 4380*ef270ab1SKenneth D. Merry ccpe:1, 4381*ef270ab1SKenneth D. Merry ccp:8; 4382*ef270ab1SKenneth D. Merry uint32_t cmd_type:4, 4383*ef270ab1SKenneth D. Merry :3, 4384*ef270ab1SKenneth D. Merry wqec:1, 4385*ef270ab1SKenneth D. Merry :8, 4386*ef270ab1SKenneth D. Merry cq_id:16; 4387*ef270ab1SKenneth D. Merry uint32_t rsvd12; 4388*ef270ab1SKenneth D. Merry #else 4389*ef270ab1SKenneth D. Merry #error big endian version not defined 4390*ef270ab1SKenneth D. Merry #endif 4391*ef270ab1SKenneth D. Merry sli4_bde_t first_data_bde; /* reserved if performance hints disabled */ 4392*ef270ab1SKenneth D. Merry } sli4_fcp_iread64_wqe_t; 4393*ef270ab1SKenneth D. Merry 4394*ef270ab1SKenneth D. Merry /** 4395*ef270ab1SKenneth D. Merry * @brief WQE used to create an FCP initiator write. 4396*ef270ab1SKenneth D. Merry */ 4397*ef270ab1SKenneth D. Merry typedef struct sli4_fcp_iwrite64_wqe_s { 4398*ef270ab1SKenneth D. Merry sli4_bde_t bde; 4399*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 4400*ef270ab1SKenneth D. Merry uint32_t payload_offset_length:16, 4401*ef270ab1SKenneth D. Merry fcp_cmd_buffer_length:16; 4402*ef270ab1SKenneth D. Merry uint32_t total_transfer_length; 4403*ef270ab1SKenneth D. Merry uint32_t initial_transfer_length; 4404*ef270ab1SKenneth D. Merry uint32_t xri_tag:16, 4405*ef270ab1SKenneth D. Merry context_tag:16; 4406*ef270ab1SKenneth D. Merry uint32_t dif:2, 4407*ef270ab1SKenneth D. Merry ct:2, 4408*ef270ab1SKenneth D. Merry bs:3, 4409*ef270ab1SKenneth D. Merry :1, 4410*ef270ab1SKenneth D. Merry command:8, 4411*ef270ab1SKenneth D. Merry class:3, 4412*ef270ab1SKenneth D. Merry :1, 4413*ef270ab1SKenneth D. Merry pu:2, 4414*ef270ab1SKenneth D. Merry erp:1, 4415*ef270ab1SKenneth D. Merry lnk:1, 4416*ef270ab1SKenneth D. Merry timer:8; 4417*ef270ab1SKenneth D. Merry uint32_t abort_tag; 4418*ef270ab1SKenneth D. Merry uint32_t request_tag:16, 4419*ef270ab1SKenneth D. Merry :16; 4420*ef270ab1SKenneth D. Merry uint32_t ebde_cnt:4, 4421*ef270ab1SKenneth D. Merry :3, 4422*ef270ab1SKenneth D. Merry len_loc:2, 4423*ef270ab1SKenneth D. Merry qosd:1, 4424*ef270ab1SKenneth D. Merry :1, 4425*ef270ab1SKenneth D. Merry xbl:1, 4426*ef270ab1SKenneth D. Merry hlm:1, 4427*ef270ab1SKenneth D. Merry iod:1, 4428*ef270ab1SKenneth D. Merry dbde:1, 4429*ef270ab1SKenneth D. Merry wqes:1, 4430*ef270ab1SKenneth D. Merry pri:3, 4431*ef270ab1SKenneth D. Merry pv:1, 4432*ef270ab1SKenneth D. Merry eat:1, 4433*ef270ab1SKenneth D. Merry xc:1, 4434*ef270ab1SKenneth D. Merry :1, 4435*ef270ab1SKenneth D. Merry ccpe:1, 4436*ef270ab1SKenneth D. Merry ccp:8; 4437*ef270ab1SKenneth D. Merry uint32_t cmd_type:4, 4438*ef270ab1SKenneth D. Merry :3, 4439*ef270ab1SKenneth D. Merry wqec:1, 4440*ef270ab1SKenneth D. Merry :8, 4441*ef270ab1SKenneth D. Merry cq_id:16; 4442*ef270ab1SKenneth D. Merry uint32_t remote_n_port_id:24, 4443*ef270ab1SKenneth D. Merry :8; 4444*ef270ab1SKenneth D. Merry #else 4445*ef270ab1SKenneth D. Merry #error big endian version not defined 4446*ef270ab1SKenneth D. Merry #endif 4447*ef270ab1SKenneth D. Merry sli4_bde_t first_data_bde; 4448*ef270ab1SKenneth D. Merry } sli4_fcp_iwrite64_wqe_t; 4449*ef270ab1SKenneth D. Merry 4450*ef270ab1SKenneth D. Merry 4451*ef270ab1SKenneth D. Merry typedef struct sli4_fcp_128byte_wqe_s { 4452*ef270ab1SKenneth D. Merry uint32_t dw[32]; 4453*ef270ab1SKenneth D. Merry } sli4_fcp_128byte_wqe_t; 4454*ef270ab1SKenneth D. Merry 4455*ef270ab1SKenneth D. Merry /** 4456*ef270ab1SKenneth D. Merry * @brief WQE used to create an FCP target receive, and FCP target 4457*ef270ab1SKenneth D. Merry * receive continue. 4458*ef270ab1SKenneth D. Merry */ 4459*ef270ab1SKenneth D. Merry typedef struct sli4_fcp_treceive64_wqe_s { 4460*ef270ab1SKenneth D. Merry sli4_bde_t bde; 4461*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 4462*ef270ab1SKenneth D. Merry uint32_t payload_offset_length; 4463*ef270ab1SKenneth D. Merry uint32_t relative_offset; 4464*ef270ab1SKenneth D. Merry /** 4465*ef270ab1SKenneth D. Merry * DWord 5 can either be the task retry identifier (HLM=0) or 4466*ef270ab1SKenneth D. Merry * the remote N_Port ID (HLM=1), or if implementing the Skyhawk 4467*ef270ab1SKenneth D. Merry * T10-PI workaround, the secondary xri tag 4468*ef270ab1SKenneth D. Merry */ 4469*ef270ab1SKenneth D. Merry union { 4470*ef270ab1SKenneth D. Merry uint32_t sec_xri_tag:16, 4471*ef270ab1SKenneth D. Merry :16; 4472*ef270ab1SKenneth D. Merry uint32_t dword; 4473*ef270ab1SKenneth D. Merry } dword5; 4474*ef270ab1SKenneth D. Merry uint32_t xri_tag:16, 4475*ef270ab1SKenneth D. Merry context_tag:16; 4476*ef270ab1SKenneth D. Merry uint32_t dif:2, 4477*ef270ab1SKenneth D. Merry ct:2, 4478*ef270ab1SKenneth D. Merry bs:3, 4479*ef270ab1SKenneth D. Merry :1, 4480*ef270ab1SKenneth D. Merry command:8, 4481*ef270ab1SKenneth D. Merry class:3, 4482*ef270ab1SKenneth D. Merry ar:1, 4483*ef270ab1SKenneth D. Merry pu:2, 4484*ef270ab1SKenneth D. Merry conf:1, 4485*ef270ab1SKenneth D. Merry lnk:1, 4486*ef270ab1SKenneth D. Merry timer:8; 4487*ef270ab1SKenneth D. Merry uint32_t abort_tag; 4488*ef270ab1SKenneth D. Merry uint32_t request_tag:16, 4489*ef270ab1SKenneth D. Merry remote_xid:16; 4490*ef270ab1SKenneth D. Merry uint32_t ebde_cnt:4, 4491*ef270ab1SKenneth D. Merry :1, 4492*ef270ab1SKenneth D. Merry app_id_valid:1, 4493*ef270ab1SKenneth D. Merry :1, 4494*ef270ab1SKenneth D. Merry len_loc:2, 4495*ef270ab1SKenneth D. Merry qosd:1, 4496*ef270ab1SKenneth D. Merry wchn:1, 4497*ef270ab1SKenneth D. Merry xbl:1, 4498*ef270ab1SKenneth D. Merry hlm:1, 4499*ef270ab1SKenneth D. Merry iod:1, 4500*ef270ab1SKenneth D. Merry dbde:1, 4501*ef270ab1SKenneth D. Merry wqes:1, 4502*ef270ab1SKenneth D. Merry pri:3, 4503*ef270ab1SKenneth D. Merry pv:1, 4504*ef270ab1SKenneth D. Merry eat:1, 4505*ef270ab1SKenneth D. Merry xc:1, 4506*ef270ab1SKenneth D. Merry sr:1, 4507*ef270ab1SKenneth D. Merry ccpe:1, 4508*ef270ab1SKenneth D. Merry ccp:8; 4509*ef270ab1SKenneth D. Merry uint32_t cmd_type:4, 4510*ef270ab1SKenneth D. Merry :3, 4511*ef270ab1SKenneth D. Merry wqec:1, 4512*ef270ab1SKenneth D. Merry :8, 4513*ef270ab1SKenneth D. Merry cq_id:16; 4514*ef270ab1SKenneth D. Merry uint32_t fcp_data_receive_length; 4515*ef270ab1SKenneth D. Merry 4516*ef270ab1SKenneth D. Merry #else 4517*ef270ab1SKenneth D. Merry #error big endian version not defined 4518*ef270ab1SKenneth D. Merry #endif 4519*ef270ab1SKenneth D. Merry sli4_bde_t first_data_bde; /* For performance hints */ 4520*ef270ab1SKenneth D. Merry 4521*ef270ab1SKenneth D. Merry } sli4_fcp_treceive64_wqe_t; 4522*ef270ab1SKenneth D. Merry 4523*ef270ab1SKenneth D. Merry /** 4524*ef270ab1SKenneth D. Merry * @brief WQE used to create an FCP target response. 4525*ef270ab1SKenneth D. Merry */ 4526*ef270ab1SKenneth D. Merry typedef struct sli4_fcp_trsp64_wqe_s { 4527*ef270ab1SKenneth D. Merry sli4_bde_t bde; 4528*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 4529*ef270ab1SKenneth D. Merry uint32_t fcp_response_length; 4530*ef270ab1SKenneth D. Merry uint32_t rsvd4; 4531*ef270ab1SKenneth D. Merry /** 4532*ef270ab1SKenneth D. Merry * DWord 5 can either be the task retry identifier (HLM=0) or 4533*ef270ab1SKenneth D. Merry * the remote N_Port ID (HLM=1) 4534*ef270ab1SKenneth D. Merry */ 4535*ef270ab1SKenneth D. Merry uint32_t dword5; 4536*ef270ab1SKenneth D. Merry uint32_t xri_tag:16, 4537*ef270ab1SKenneth D. Merry rpi:16; 4538*ef270ab1SKenneth D. Merry uint32_t :2, 4539*ef270ab1SKenneth D. Merry ct:2, 4540*ef270ab1SKenneth D. Merry dnrx:1, 4541*ef270ab1SKenneth D. Merry :3, 4542*ef270ab1SKenneth D. Merry command:8, 4543*ef270ab1SKenneth D. Merry class:3, 4544*ef270ab1SKenneth D. Merry ag:1, 4545*ef270ab1SKenneth D. Merry pu:2, 4546*ef270ab1SKenneth D. Merry conf:1, 4547*ef270ab1SKenneth D. Merry lnk:1, 4548*ef270ab1SKenneth D. Merry timer:8; 4549*ef270ab1SKenneth D. Merry uint32_t abort_tag; 4550*ef270ab1SKenneth D. Merry uint32_t request_tag:16, 4551*ef270ab1SKenneth D. Merry remote_xid:16; 4552*ef270ab1SKenneth D. Merry uint32_t ebde_cnt:4, 4553*ef270ab1SKenneth D. Merry :1, 4554*ef270ab1SKenneth D. Merry app_id_valid:1, 4555*ef270ab1SKenneth D. Merry :1, 4556*ef270ab1SKenneth D. Merry len_loc:2, 4557*ef270ab1SKenneth D. Merry qosd:1, 4558*ef270ab1SKenneth D. Merry wchn:1, 4559*ef270ab1SKenneth D. Merry xbl:1, 4560*ef270ab1SKenneth D. Merry hlm:1, 4561*ef270ab1SKenneth D. Merry iod:1, 4562*ef270ab1SKenneth D. Merry dbde:1, 4563*ef270ab1SKenneth D. Merry wqes:1, 4564*ef270ab1SKenneth D. Merry pri:3, 4565*ef270ab1SKenneth D. Merry pv:1, 4566*ef270ab1SKenneth D. Merry eat:1, 4567*ef270ab1SKenneth D. Merry xc:1, 4568*ef270ab1SKenneth D. Merry sr:1, 4569*ef270ab1SKenneth D. Merry ccpe:1, 4570*ef270ab1SKenneth D. Merry ccp:8; 4571*ef270ab1SKenneth D. Merry uint32_t cmd_type:4, 4572*ef270ab1SKenneth D. Merry :3, 4573*ef270ab1SKenneth D. Merry wqec:1, 4574*ef270ab1SKenneth D. Merry :8, 4575*ef270ab1SKenneth D. Merry cq_id:16; 4576*ef270ab1SKenneth D. Merry uint32_t rsvd12; 4577*ef270ab1SKenneth D. Merry uint32_t rsvd13; 4578*ef270ab1SKenneth D. Merry uint32_t rsvd14; 4579*ef270ab1SKenneth D. Merry uint32_t rsvd15; 4580*ef270ab1SKenneth D. Merry #else 4581*ef270ab1SKenneth D. Merry #error big endian version not defined 4582*ef270ab1SKenneth D. Merry #endif 4583*ef270ab1SKenneth D. Merry } sli4_fcp_trsp64_wqe_t; 4584*ef270ab1SKenneth D. Merry 4585*ef270ab1SKenneth D. Merry /** 4586*ef270ab1SKenneth D. Merry * @brief WQE used to create an FCP target send (DATA IN). 4587*ef270ab1SKenneth D. Merry */ 4588*ef270ab1SKenneth D. Merry typedef struct sli4_fcp_tsend64_wqe_s { 4589*ef270ab1SKenneth D. Merry sli4_bde_t bde; 4590*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 4591*ef270ab1SKenneth D. Merry uint32_t payload_offset_length; 4592*ef270ab1SKenneth D. Merry uint32_t relative_offset; 4593*ef270ab1SKenneth D. Merry /** 4594*ef270ab1SKenneth D. Merry * DWord 5 can either be the task retry identifier (HLM=0) or 4595*ef270ab1SKenneth D. Merry * the remote N_Port ID (HLM=1) 4596*ef270ab1SKenneth D. Merry */ 4597*ef270ab1SKenneth D. Merry uint32_t dword5; 4598*ef270ab1SKenneth D. Merry uint32_t xri_tag:16, 4599*ef270ab1SKenneth D. Merry rpi:16; 4600*ef270ab1SKenneth D. Merry uint32_t dif:2, 4601*ef270ab1SKenneth D. Merry ct:2, 4602*ef270ab1SKenneth D. Merry bs:3, 4603*ef270ab1SKenneth D. Merry :1, 4604*ef270ab1SKenneth D. Merry command:8, 4605*ef270ab1SKenneth D. Merry class:3, 4606*ef270ab1SKenneth D. Merry ar:1, 4607*ef270ab1SKenneth D. Merry pu:2, 4608*ef270ab1SKenneth D. Merry conf:1, 4609*ef270ab1SKenneth D. Merry lnk:1, 4610*ef270ab1SKenneth D. Merry timer:8; 4611*ef270ab1SKenneth D. Merry uint32_t abort_tag; 4612*ef270ab1SKenneth D. Merry uint32_t request_tag:16, 4613*ef270ab1SKenneth D. Merry remote_xid:16; 4614*ef270ab1SKenneth D. Merry uint32_t ebde_cnt:4, 4615*ef270ab1SKenneth D. Merry :1, 4616*ef270ab1SKenneth D. Merry app_id_valid:1, 4617*ef270ab1SKenneth D. Merry :1, 4618*ef270ab1SKenneth D. Merry len_loc:2, 4619*ef270ab1SKenneth D. Merry qosd:1, 4620*ef270ab1SKenneth D. Merry wchn:1, 4621*ef270ab1SKenneth D. Merry xbl:1, 4622*ef270ab1SKenneth D. Merry hlm:1, 4623*ef270ab1SKenneth D. Merry iod:1, 4624*ef270ab1SKenneth D. Merry dbde:1, 4625*ef270ab1SKenneth D. Merry wqes:1, 4626*ef270ab1SKenneth D. Merry pri:3, 4627*ef270ab1SKenneth D. Merry pv:1, 4628*ef270ab1SKenneth D. Merry eat:1, 4629*ef270ab1SKenneth D. Merry xc:1, 4630*ef270ab1SKenneth D. Merry sr:1, 4631*ef270ab1SKenneth D. Merry ccpe:1, 4632*ef270ab1SKenneth D. Merry ccp:8; 4633*ef270ab1SKenneth D. Merry uint32_t cmd_type:4, 4634*ef270ab1SKenneth D. Merry :3, 4635*ef270ab1SKenneth D. Merry wqec:1, 4636*ef270ab1SKenneth D. Merry :8, 4637*ef270ab1SKenneth D. Merry cq_id:16; 4638*ef270ab1SKenneth D. Merry uint32_t fcp_data_transmit_length; 4639*ef270ab1SKenneth D. Merry 4640*ef270ab1SKenneth D. Merry #else 4641*ef270ab1SKenneth D. Merry #error big endian version not defined 4642*ef270ab1SKenneth D. Merry #endif 4643*ef270ab1SKenneth D. Merry sli4_bde_t first_data_bde; /* For performance hints */ 4644*ef270ab1SKenneth D. Merry } sli4_fcp_tsend64_wqe_t; 4645*ef270ab1SKenneth D. Merry 4646*ef270ab1SKenneth D. Merry #define SLI4_IO_CONTINUATION BIT(0) /** The XRI associated with this IO is already active */ 4647*ef270ab1SKenneth D. Merry #define SLI4_IO_AUTO_GOOD_RESPONSE BIT(1) /** Automatically generate a good RSP frame */ 4648*ef270ab1SKenneth D. Merry #define SLI4_IO_NO_ABORT BIT(2) 4649*ef270ab1SKenneth D. Merry #define SLI4_IO_DNRX BIT(3) /** Set the DNRX bit because no auto xref rdy buffer is posted */ 4650*ef270ab1SKenneth D. Merry 4651*ef270ab1SKenneth D. Merry /* WQE DIF field contents */ 4652*ef270ab1SKenneth D. Merry #define SLI4_DIF_DISABLED 0 4653*ef270ab1SKenneth D. Merry #define SLI4_DIF_PASS_THROUGH 1 4654*ef270ab1SKenneth D. Merry #define SLI4_DIF_STRIP 2 4655*ef270ab1SKenneth D. Merry #define SLI4_DIF_INSERT 3 4656*ef270ab1SKenneth D. Merry 4657*ef270ab1SKenneth D. Merry /** 4658*ef270ab1SKenneth D. Merry * @brief WQE used to create a general request. 4659*ef270ab1SKenneth D. Merry */ 4660*ef270ab1SKenneth D. Merry typedef struct sli4_gen_request64_wqe_s { 4661*ef270ab1SKenneth D. Merry sli4_bde_t bde; 4662*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 4663*ef270ab1SKenneth D. Merry uint32_t request_payload_length; 4664*ef270ab1SKenneth D. Merry uint32_t relative_offset; 4665*ef270ab1SKenneth D. Merry uint32_t :8, 4666*ef270ab1SKenneth D. Merry df_ctl:8, 4667*ef270ab1SKenneth D. Merry type:8, 4668*ef270ab1SKenneth D. Merry r_ctl:8; 4669*ef270ab1SKenneth D. Merry uint32_t xri_tag:16, 4670*ef270ab1SKenneth D. Merry context_tag:16; 4671*ef270ab1SKenneth D. Merry uint32_t :2, 4672*ef270ab1SKenneth D. Merry ct:2, 4673*ef270ab1SKenneth D. Merry :4, 4674*ef270ab1SKenneth D. Merry command:8, 4675*ef270ab1SKenneth D. Merry class:3, 4676*ef270ab1SKenneth D. Merry :1, 4677*ef270ab1SKenneth D. Merry pu:2, 4678*ef270ab1SKenneth D. Merry :2, 4679*ef270ab1SKenneth D. Merry timer:8; 4680*ef270ab1SKenneth D. Merry uint32_t abort_tag; 4681*ef270ab1SKenneth D. Merry uint32_t request_tag:16, 4682*ef270ab1SKenneth D. Merry :16; 4683*ef270ab1SKenneth D. Merry uint32_t ebde_cnt:4, 4684*ef270ab1SKenneth D. Merry :3, 4685*ef270ab1SKenneth D. Merry len_loc:2, 4686*ef270ab1SKenneth D. Merry qosd:1, 4687*ef270ab1SKenneth D. Merry :1, 4688*ef270ab1SKenneth D. Merry xbl:1, 4689*ef270ab1SKenneth D. Merry hlm:1, 4690*ef270ab1SKenneth D. Merry iod:1, 4691*ef270ab1SKenneth D. Merry dbde:1, 4692*ef270ab1SKenneth D. Merry wqes:1, 4693*ef270ab1SKenneth D. Merry pri:3, 4694*ef270ab1SKenneth D. Merry pv:1, 4695*ef270ab1SKenneth D. Merry eat:1, 4696*ef270ab1SKenneth D. Merry xc:1, 4697*ef270ab1SKenneth D. Merry :1, 4698*ef270ab1SKenneth D. Merry ccpe:1, 4699*ef270ab1SKenneth D. Merry ccp:8; 4700*ef270ab1SKenneth D. Merry uint32_t cmd_type:4, 4701*ef270ab1SKenneth D. Merry :3, 4702*ef270ab1SKenneth D. Merry wqec:1, 4703*ef270ab1SKenneth D. Merry :8, 4704*ef270ab1SKenneth D. Merry cq_id:16; 4705*ef270ab1SKenneth D. Merry uint32_t remote_n_port_id:24, 4706*ef270ab1SKenneth D. Merry :8; 4707*ef270ab1SKenneth D. Merry uint32_t rsvd13; 4708*ef270ab1SKenneth D. Merry uint32_t rsvd14; 4709*ef270ab1SKenneth D. Merry uint32_t max_response_payload_length; 4710*ef270ab1SKenneth D. Merry #else 4711*ef270ab1SKenneth D. Merry #error big endian version not defined 4712*ef270ab1SKenneth D. Merry #endif 4713*ef270ab1SKenneth D. Merry } sli4_gen_request64_wqe_t; 4714*ef270ab1SKenneth D. Merry 4715*ef270ab1SKenneth D. Merry /** 4716*ef270ab1SKenneth D. Merry * @brief WQE used to create a send frame request. 4717*ef270ab1SKenneth D. Merry */ 4718*ef270ab1SKenneth D. Merry typedef struct sli4_send_frame_wqe_s { 4719*ef270ab1SKenneth D. Merry sli4_bde_t bde; 4720*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 4721*ef270ab1SKenneth D. Merry uint32_t frame_length; 4722*ef270ab1SKenneth D. Merry uint32_t fc_header_0_1[2]; 4723*ef270ab1SKenneth D. Merry uint32_t xri_tag:16, 4724*ef270ab1SKenneth D. Merry context_tag:16; 4725*ef270ab1SKenneth D. Merry uint32_t :2, 4726*ef270ab1SKenneth D. Merry ct:2, 4727*ef270ab1SKenneth D. Merry :4, 4728*ef270ab1SKenneth D. Merry command:8, 4729*ef270ab1SKenneth D. Merry class:3, 4730*ef270ab1SKenneth D. Merry :1, 4731*ef270ab1SKenneth D. Merry pu:2, 4732*ef270ab1SKenneth D. Merry :2, 4733*ef270ab1SKenneth D. Merry timer:8; 4734*ef270ab1SKenneth D. Merry uint32_t abort_tag; 4735*ef270ab1SKenneth D. Merry uint32_t request_tag:16, 4736*ef270ab1SKenneth D. Merry eof:8, 4737*ef270ab1SKenneth D. Merry sof:8; 4738*ef270ab1SKenneth D. Merry uint32_t ebde_cnt:4, 4739*ef270ab1SKenneth D. Merry :3, 4740*ef270ab1SKenneth D. Merry lenloc:2, 4741*ef270ab1SKenneth D. Merry qosd:1, 4742*ef270ab1SKenneth D. Merry wchn:1, 4743*ef270ab1SKenneth D. Merry xbl:1, 4744*ef270ab1SKenneth D. Merry hlm:1, 4745*ef270ab1SKenneth D. Merry iod:1, 4746*ef270ab1SKenneth D. Merry dbde:1, 4747*ef270ab1SKenneth D. Merry wqes:1, 4748*ef270ab1SKenneth D. Merry pri:3, 4749*ef270ab1SKenneth D. Merry pv:1, 4750*ef270ab1SKenneth D. Merry eat:1, 4751*ef270ab1SKenneth D. Merry xc:1, 4752*ef270ab1SKenneth D. Merry :1, 4753*ef270ab1SKenneth D. Merry ccpe:1, 4754*ef270ab1SKenneth D. Merry ccp:8; 4755*ef270ab1SKenneth D. Merry uint32_t cmd_type:4, 4756*ef270ab1SKenneth D. Merry :3, 4757*ef270ab1SKenneth D. Merry wqec:1, 4758*ef270ab1SKenneth D. Merry :8, 4759*ef270ab1SKenneth D. Merry cq_id:16; 4760*ef270ab1SKenneth D. Merry uint32_t fc_header_2_5[4]; 4761*ef270ab1SKenneth D. Merry #else 4762*ef270ab1SKenneth D. Merry #error big endian version not defined 4763*ef270ab1SKenneth D. Merry #endif 4764*ef270ab1SKenneth D. Merry } sli4_send_frame_wqe_t; 4765*ef270ab1SKenneth D. Merry 4766*ef270ab1SKenneth D. Merry /** 4767*ef270ab1SKenneth D. Merry * @brief WQE used to create a transmit sequence. 4768*ef270ab1SKenneth D. Merry */ 4769*ef270ab1SKenneth D. Merry typedef struct sli4_xmit_sequence64_wqe_s { 4770*ef270ab1SKenneth D. Merry sli4_bde_t bde; 4771*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 4772*ef270ab1SKenneth D. Merry uint32_t remote_n_port_id:24, 4773*ef270ab1SKenneth D. Merry :8; 4774*ef270ab1SKenneth D. Merry uint32_t relative_offset; 4775*ef270ab1SKenneth D. Merry uint32_t :2, 4776*ef270ab1SKenneth D. Merry si:1, 4777*ef270ab1SKenneth D. Merry ft:1, 4778*ef270ab1SKenneth D. Merry :2, 4779*ef270ab1SKenneth D. Merry xo:1, 4780*ef270ab1SKenneth D. Merry ls:1, 4781*ef270ab1SKenneth D. Merry df_ctl:8, 4782*ef270ab1SKenneth D. Merry type:8, 4783*ef270ab1SKenneth D. Merry r_ctl:8; 4784*ef270ab1SKenneth D. Merry uint32_t xri_tag:16, 4785*ef270ab1SKenneth D. Merry context_tag:16; 4786*ef270ab1SKenneth D. Merry uint32_t dif:2, 4787*ef270ab1SKenneth D. Merry ct:2, 4788*ef270ab1SKenneth D. Merry bs:3, 4789*ef270ab1SKenneth D. Merry :1, 4790*ef270ab1SKenneth D. Merry command:8, 4791*ef270ab1SKenneth D. Merry class:3, 4792*ef270ab1SKenneth D. Merry :1, 4793*ef270ab1SKenneth D. Merry pu:2, 4794*ef270ab1SKenneth D. Merry :2, 4795*ef270ab1SKenneth D. Merry timer:8; 4796*ef270ab1SKenneth D. Merry uint32_t abort_tag; 4797*ef270ab1SKenneth D. Merry uint32_t request_tag:16, 4798*ef270ab1SKenneth D. Merry remote_xid:16; 4799*ef270ab1SKenneth D. Merry uint32_t ebde_cnt:4, 4800*ef270ab1SKenneth D. Merry :3, 4801*ef270ab1SKenneth D. Merry len_loc:2, 4802*ef270ab1SKenneth D. Merry qosd:1, 4803*ef270ab1SKenneth D. Merry :1, 4804*ef270ab1SKenneth D. Merry xbl:1, 4805*ef270ab1SKenneth D. Merry hlm:1, 4806*ef270ab1SKenneth D. Merry iod:1, 4807*ef270ab1SKenneth D. Merry dbde:1, 4808*ef270ab1SKenneth D. Merry wqes:1, 4809*ef270ab1SKenneth D. Merry pri:3, 4810*ef270ab1SKenneth D. Merry pv:1, 4811*ef270ab1SKenneth D. Merry eat:1, 4812*ef270ab1SKenneth D. Merry xc:1, 4813*ef270ab1SKenneth D. Merry sr:1, 4814*ef270ab1SKenneth D. Merry ccpe:1, 4815*ef270ab1SKenneth D. Merry ccp:8; 4816*ef270ab1SKenneth D. Merry uint32_t cmd_type:4, 4817*ef270ab1SKenneth D. Merry :3, 4818*ef270ab1SKenneth D. Merry wqec:1, 4819*ef270ab1SKenneth D. Merry :8, 4820*ef270ab1SKenneth D. Merry cq_id:16; 4821*ef270ab1SKenneth D. Merry uint32_t sequence_payload_len; 4822*ef270ab1SKenneth D. Merry uint32_t rsvd13; 4823*ef270ab1SKenneth D. Merry uint32_t rsvd14; 4824*ef270ab1SKenneth D. Merry uint32_t rsvd15; 4825*ef270ab1SKenneth D. Merry #else 4826*ef270ab1SKenneth D. Merry #error big endian version not defined 4827*ef270ab1SKenneth D. Merry #endif 4828*ef270ab1SKenneth D. Merry } sli4_xmit_sequence64_wqe_t; 4829*ef270ab1SKenneth D. Merry 4830*ef270ab1SKenneth D. Merry /** 4831*ef270ab1SKenneth D. Merry * @brief WQE used unblock the specified XRI and to release it to the SLI Port's free pool. 4832*ef270ab1SKenneth D. Merry */ 4833*ef270ab1SKenneth D. Merry typedef struct sli4_requeue_xri_wqe_s { 4834*ef270ab1SKenneth D. Merry uint32_t rsvd0; 4835*ef270ab1SKenneth D. Merry uint32_t rsvd1; 4836*ef270ab1SKenneth D. Merry uint32_t rsvd2; 4837*ef270ab1SKenneth D. Merry uint32_t rsvd3; 4838*ef270ab1SKenneth D. Merry uint32_t rsvd4; 4839*ef270ab1SKenneth D. Merry uint32_t rsvd5; 4840*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 4841*ef270ab1SKenneth D. Merry uint32_t xri_tag:16, 4842*ef270ab1SKenneth D. Merry context_tag:16; 4843*ef270ab1SKenneth D. Merry uint32_t :2, 4844*ef270ab1SKenneth D. Merry ct:2, 4845*ef270ab1SKenneth D. Merry :4, 4846*ef270ab1SKenneth D. Merry command:8, 4847*ef270ab1SKenneth D. Merry class:3, 4848*ef270ab1SKenneth D. Merry :1, 4849*ef270ab1SKenneth D. Merry pu:2, 4850*ef270ab1SKenneth D. Merry :2, 4851*ef270ab1SKenneth D. Merry timer:8; 4852*ef270ab1SKenneth D. Merry uint32_t rsvd8; 4853*ef270ab1SKenneth D. Merry uint32_t request_tag:16, 4854*ef270ab1SKenneth D. Merry :16; 4855*ef270ab1SKenneth D. Merry uint32_t ebde_cnt:4, 4856*ef270ab1SKenneth D. Merry :3, 4857*ef270ab1SKenneth D. Merry len_loc:2, 4858*ef270ab1SKenneth D. Merry qosd:1, 4859*ef270ab1SKenneth D. Merry wchn:1, 4860*ef270ab1SKenneth D. Merry xbl:1, 4861*ef270ab1SKenneth D. Merry hlm:1, 4862*ef270ab1SKenneth D. Merry iod:1, 4863*ef270ab1SKenneth D. Merry dbde:1, 4864*ef270ab1SKenneth D. Merry wqes:1, 4865*ef270ab1SKenneth D. Merry pri:3, 4866*ef270ab1SKenneth D. Merry pv:1, 4867*ef270ab1SKenneth D. Merry eat:1, 4868*ef270ab1SKenneth D. Merry xc:1, 4869*ef270ab1SKenneth D. Merry :1, 4870*ef270ab1SKenneth D. Merry ccpe:1, 4871*ef270ab1SKenneth D. Merry ccp:8; 4872*ef270ab1SKenneth D. Merry uint32_t cmd_type:4, 4873*ef270ab1SKenneth D. Merry :3, 4874*ef270ab1SKenneth D. Merry wqec:1, 4875*ef270ab1SKenneth D. Merry :8, 4876*ef270ab1SKenneth D. Merry cq_id:16; 4877*ef270ab1SKenneth D. Merry uint32_t rsvd12; 4878*ef270ab1SKenneth D. Merry uint32_t rsvd13; 4879*ef270ab1SKenneth D. Merry uint32_t rsvd14; 4880*ef270ab1SKenneth D. Merry uint32_t rsvd15; 4881*ef270ab1SKenneth D. Merry #else 4882*ef270ab1SKenneth D. Merry #error big endian version not defined 4883*ef270ab1SKenneth D. Merry #endif 4884*ef270ab1SKenneth D. Merry } sli4_requeue_xri_wqe_t; 4885*ef270ab1SKenneth D. Merry 4886*ef270ab1SKenneth D. Merry /** 4887*ef270ab1SKenneth D. Merry * @brief WQE used to send a single frame sequence to broadcast address 4888*ef270ab1SKenneth D. Merry */ 4889*ef270ab1SKenneth D. Merry typedef struct sli4_xmit_bcast64_wqe_s { 4890*ef270ab1SKenneth D. Merry sli4_bde_t sequence_payload; 4891*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 4892*ef270ab1SKenneth D. Merry uint32_t sequence_payload_length; 4893*ef270ab1SKenneth D. Merry uint32_t rsvd4; 4894*ef270ab1SKenneth D. Merry uint32_t :8, 4895*ef270ab1SKenneth D. Merry df_ctl:8, 4896*ef270ab1SKenneth D. Merry type:8, 4897*ef270ab1SKenneth D. Merry r_ctl:8; 4898*ef270ab1SKenneth D. Merry uint32_t xri_tag:16, 4899*ef270ab1SKenneth D. Merry context_tag:16; 4900*ef270ab1SKenneth D. Merry uint32_t :2, 4901*ef270ab1SKenneth D. Merry ct:2, 4902*ef270ab1SKenneth D. Merry :4, 4903*ef270ab1SKenneth D. Merry command:8, 4904*ef270ab1SKenneth D. Merry class:3, 4905*ef270ab1SKenneth D. Merry :1, 4906*ef270ab1SKenneth D. Merry pu:2, 4907*ef270ab1SKenneth D. Merry :2, 4908*ef270ab1SKenneth D. Merry timer:8; 4909*ef270ab1SKenneth D. Merry uint32_t abort_tag; 4910*ef270ab1SKenneth D. Merry uint32_t request_tag:16, 4911*ef270ab1SKenneth D. Merry temporary_rpi:16; 4912*ef270ab1SKenneth D. Merry uint32_t ebde_cnt:4, 4913*ef270ab1SKenneth D. Merry :3, 4914*ef270ab1SKenneth D. Merry len_loc:2, 4915*ef270ab1SKenneth D. Merry qosd:1, 4916*ef270ab1SKenneth D. Merry :1, 4917*ef270ab1SKenneth D. Merry xbl:1, 4918*ef270ab1SKenneth D. Merry hlm:1, 4919*ef270ab1SKenneth D. Merry iod:1, 4920*ef270ab1SKenneth D. Merry dbde:1, 4921*ef270ab1SKenneth D. Merry wqes:1, 4922*ef270ab1SKenneth D. Merry pri:3, 4923*ef270ab1SKenneth D. Merry pv:1, 4924*ef270ab1SKenneth D. Merry eat:1, 4925*ef270ab1SKenneth D. Merry xc:1, 4926*ef270ab1SKenneth D. Merry :1, 4927*ef270ab1SKenneth D. Merry ccpe:1, 4928*ef270ab1SKenneth D. Merry ccp:8; 4929*ef270ab1SKenneth D. Merry uint32_t cmd_type:4, 4930*ef270ab1SKenneth D. Merry :3, 4931*ef270ab1SKenneth D. Merry wqec:1, 4932*ef270ab1SKenneth D. Merry :8, 4933*ef270ab1SKenneth D. Merry cq_id:16; 4934*ef270ab1SKenneth D. Merry uint32_t rsvd12; 4935*ef270ab1SKenneth D. Merry uint32_t rsvd13; 4936*ef270ab1SKenneth D. Merry uint32_t rsvd14; 4937*ef270ab1SKenneth D. Merry uint32_t rsvd15; 4938*ef270ab1SKenneth D. Merry #else 4939*ef270ab1SKenneth D. Merry #error big endian version not defined 4940*ef270ab1SKenneth D. Merry #endif 4941*ef270ab1SKenneth D. Merry } sli4_xmit_bcast64_wqe_t; 4942*ef270ab1SKenneth D. Merry 4943*ef270ab1SKenneth D. Merry /** 4944*ef270ab1SKenneth D. Merry * @brief WQE used to create a BLS response. 4945*ef270ab1SKenneth D. Merry */ 4946*ef270ab1SKenneth D. Merry typedef struct sli4_xmit_bls_rsp_wqe_s { 4947*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 4948*ef270ab1SKenneth D. Merry uint32_t payload_word0; 4949*ef270ab1SKenneth D. Merry uint32_t rx_id:16, 4950*ef270ab1SKenneth D. Merry ox_id:16; 4951*ef270ab1SKenneth D. Merry uint32_t high_seq_cnt:16, 4952*ef270ab1SKenneth D. Merry low_seq_cnt:16; 4953*ef270ab1SKenneth D. Merry uint32_t rsvd3; 4954*ef270ab1SKenneth D. Merry uint32_t local_n_port_id:24, 4955*ef270ab1SKenneth D. Merry :8; 4956*ef270ab1SKenneth D. Merry uint32_t remote_id:24, 4957*ef270ab1SKenneth D. Merry :6, 4958*ef270ab1SKenneth D. Merry ar:1, 4959*ef270ab1SKenneth D. Merry xo:1; 4960*ef270ab1SKenneth D. Merry uint32_t xri_tag:16, 4961*ef270ab1SKenneth D. Merry context_tag:16; 4962*ef270ab1SKenneth D. Merry uint32_t :2, 4963*ef270ab1SKenneth D. Merry ct:2, 4964*ef270ab1SKenneth D. Merry :4, 4965*ef270ab1SKenneth D. Merry command:8, 4966*ef270ab1SKenneth D. Merry class:3, 4967*ef270ab1SKenneth D. Merry :1, 4968*ef270ab1SKenneth D. Merry pu:2, 4969*ef270ab1SKenneth D. Merry :2, 4970*ef270ab1SKenneth D. Merry timer:8; 4971*ef270ab1SKenneth D. Merry uint32_t abort_tag; 4972*ef270ab1SKenneth D. Merry uint32_t request_tag:16, 4973*ef270ab1SKenneth D. Merry :16; 4974*ef270ab1SKenneth D. Merry uint32_t ebde_cnt:4, 4975*ef270ab1SKenneth D. Merry :3, 4976*ef270ab1SKenneth D. Merry len_loc:2, 4977*ef270ab1SKenneth D. Merry qosd:1, 4978*ef270ab1SKenneth D. Merry :1, 4979*ef270ab1SKenneth D. Merry xbl:1, 4980*ef270ab1SKenneth D. Merry hlm:1, 4981*ef270ab1SKenneth D. Merry iod:1, 4982*ef270ab1SKenneth D. Merry dbde:1, 4983*ef270ab1SKenneth D. Merry wqes:1, 4984*ef270ab1SKenneth D. Merry pri:3, 4985*ef270ab1SKenneth D. Merry pv:1, 4986*ef270ab1SKenneth D. Merry eat:1, 4987*ef270ab1SKenneth D. Merry xc:1, 4988*ef270ab1SKenneth D. Merry :1, 4989*ef270ab1SKenneth D. Merry ccpe:1, 4990*ef270ab1SKenneth D. Merry ccp:8; 4991*ef270ab1SKenneth D. Merry uint32_t cmd_type:4, 4992*ef270ab1SKenneth D. Merry :3, 4993*ef270ab1SKenneth D. Merry wqec:1, 4994*ef270ab1SKenneth D. Merry :8, 4995*ef270ab1SKenneth D. Merry cq_id:16; 4996*ef270ab1SKenneth D. Merry uint32_t temporary_rpi:16, 4997*ef270ab1SKenneth D. Merry :16; 4998*ef270ab1SKenneth D. Merry uint32_t rsvd13; 4999*ef270ab1SKenneth D. Merry uint32_t rsvd14; 5000*ef270ab1SKenneth D. Merry uint32_t rsvd15; 5001*ef270ab1SKenneth D. Merry #else 5002*ef270ab1SKenneth D. Merry #error big endian version not defined 5003*ef270ab1SKenneth D. Merry #endif 5004*ef270ab1SKenneth D. Merry } sli4_xmit_bls_rsp_wqe_t; 5005*ef270ab1SKenneth D. Merry 5006*ef270ab1SKenneth D. Merry typedef enum { 5007*ef270ab1SKenneth D. Merry SLI_BLS_ACC, 5008*ef270ab1SKenneth D. Merry SLI_BLS_RJT, 5009*ef270ab1SKenneth D. Merry SLI_BLS_MAX 5010*ef270ab1SKenneth D. Merry } sli_bls_type_e; 5011*ef270ab1SKenneth D. Merry 5012*ef270ab1SKenneth D. Merry typedef struct sli_bls_payload_s { 5013*ef270ab1SKenneth D. Merry sli_bls_type_e type; 5014*ef270ab1SKenneth D. Merry uint16_t ox_id; 5015*ef270ab1SKenneth D. Merry uint16_t rx_id; 5016*ef270ab1SKenneth D. Merry union { 5017*ef270ab1SKenneth D. Merry struct { 5018*ef270ab1SKenneth D. Merry uint32_t seq_id_validity:8, 5019*ef270ab1SKenneth D. Merry seq_id_last:8, 5020*ef270ab1SKenneth D. Merry :16; 5021*ef270ab1SKenneth D. Merry uint16_t ox_id; 5022*ef270ab1SKenneth D. Merry uint16_t rx_id; 5023*ef270ab1SKenneth D. Merry uint16_t low_seq_cnt; 5024*ef270ab1SKenneth D. Merry uint16_t high_seq_cnt; 5025*ef270ab1SKenneth D. Merry } acc; 5026*ef270ab1SKenneth D. Merry struct { 5027*ef270ab1SKenneth D. Merry uint32_t vendor_unique:8, 5028*ef270ab1SKenneth D. Merry reason_explanation:8, 5029*ef270ab1SKenneth D. Merry reason_code:8, 5030*ef270ab1SKenneth D. Merry :8; 5031*ef270ab1SKenneth D. Merry } rjt; 5032*ef270ab1SKenneth D. Merry } u; 5033*ef270ab1SKenneth D. Merry } sli_bls_payload_t; 5034*ef270ab1SKenneth D. Merry 5035*ef270ab1SKenneth D. Merry /** 5036*ef270ab1SKenneth D. Merry * @brief WQE used to create an ELS response. 5037*ef270ab1SKenneth D. Merry */ 5038*ef270ab1SKenneth D. Merry typedef struct sli4_xmit_els_rsp64_wqe_s { 5039*ef270ab1SKenneth D. Merry sli4_bde_t els_response_payload; 5040*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 5041*ef270ab1SKenneth D. Merry uint32_t els_response_payload_length; 5042*ef270ab1SKenneth D. Merry uint32_t s_id:24, 5043*ef270ab1SKenneth D. Merry sp:1, 5044*ef270ab1SKenneth D. Merry :7; 5045*ef270ab1SKenneth D. Merry uint32_t remote_id:24, 5046*ef270ab1SKenneth D. Merry :8; 5047*ef270ab1SKenneth D. Merry uint32_t xri_tag:16, 5048*ef270ab1SKenneth D. Merry context_tag:16; 5049*ef270ab1SKenneth D. Merry uint32_t :2, 5050*ef270ab1SKenneth D. Merry ct:2, 5051*ef270ab1SKenneth D. Merry :4, 5052*ef270ab1SKenneth D. Merry command:8, 5053*ef270ab1SKenneth D. Merry class:3, 5054*ef270ab1SKenneth D. Merry :1, 5055*ef270ab1SKenneth D. Merry pu:2, 5056*ef270ab1SKenneth D. Merry :2, 5057*ef270ab1SKenneth D. Merry timer:8; 5058*ef270ab1SKenneth D. Merry uint32_t abort_tag; 5059*ef270ab1SKenneth D. Merry uint32_t request_tag:16, 5060*ef270ab1SKenneth D. Merry ox_id:16; 5061*ef270ab1SKenneth D. Merry uint32_t ebde_cnt:4, 5062*ef270ab1SKenneth D. Merry :3, 5063*ef270ab1SKenneth D. Merry len_loc:2, 5064*ef270ab1SKenneth D. Merry qosd:1, 5065*ef270ab1SKenneth D. Merry :1, 5066*ef270ab1SKenneth D. Merry xbl:1, 5067*ef270ab1SKenneth D. Merry hlm:1, 5068*ef270ab1SKenneth D. Merry iod:1, 5069*ef270ab1SKenneth D. Merry dbde:1, 5070*ef270ab1SKenneth D. Merry wqes:1, 5071*ef270ab1SKenneth D. Merry pri:3, 5072*ef270ab1SKenneth D. Merry pv:1, 5073*ef270ab1SKenneth D. Merry eat:1, 5074*ef270ab1SKenneth D. Merry xc:1, 5075*ef270ab1SKenneth D. Merry :1, 5076*ef270ab1SKenneth D. Merry ccpe:1, 5077*ef270ab1SKenneth D. Merry ccp:8; 5078*ef270ab1SKenneth D. Merry uint32_t cmd_type:4, 5079*ef270ab1SKenneth D. Merry :3, 5080*ef270ab1SKenneth D. Merry wqec:1, 5081*ef270ab1SKenneth D. Merry :8, 5082*ef270ab1SKenneth D. Merry cq_id:16; 5083*ef270ab1SKenneth D. Merry uint32_t temporary_rpi:16, 5084*ef270ab1SKenneth D. Merry :16; 5085*ef270ab1SKenneth D. Merry uint32_t rsvd13; 5086*ef270ab1SKenneth D. Merry uint32_t rsvd14; 5087*ef270ab1SKenneth D. Merry uint32_t rsvd15; 5088*ef270ab1SKenneth D. Merry #else 5089*ef270ab1SKenneth D. Merry #error big endian version not defined 5090*ef270ab1SKenneth D. Merry #endif 5091*ef270ab1SKenneth D. Merry } sli4_xmit_els_rsp64_wqe_t; 5092*ef270ab1SKenneth D. Merry 5093*ef270ab1SKenneth D. Merry /** 5094*ef270ab1SKenneth D. Merry * @brief Asynchronouse Event: Link State ACQE. 5095*ef270ab1SKenneth D. Merry */ 5096*ef270ab1SKenneth D. Merry typedef struct sli4_link_state_s { 5097*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 5098*ef270ab1SKenneth D. Merry uint32_t link_number:6, 5099*ef270ab1SKenneth D. Merry link_type:2, 5100*ef270ab1SKenneth D. Merry port_link_status:8, 5101*ef270ab1SKenneth D. Merry port_duplex:8, 5102*ef270ab1SKenneth D. Merry port_speed:8; 5103*ef270ab1SKenneth D. Merry uint32_t port_fault:8, 5104*ef270ab1SKenneth D. Merry :8, 5105*ef270ab1SKenneth D. Merry logical_link_speed:16; 5106*ef270ab1SKenneth D. Merry uint32_t event_tag; 5107*ef270ab1SKenneth D. Merry uint32_t :8, 5108*ef270ab1SKenneth D. Merry event_code:8, 5109*ef270ab1SKenneth D. Merry event_type:8, /** values are protocol specific */ 5110*ef270ab1SKenneth D. Merry :6, 5111*ef270ab1SKenneth D. Merry ae:1, /** async event - this is an ACQE */ 5112*ef270ab1SKenneth D. Merry val:1; /** valid - contents of CQE are valid */ 5113*ef270ab1SKenneth D. Merry #else 5114*ef270ab1SKenneth D. Merry #error big endian version not defined 5115*ef270ab1SKenneth D. Merry #endif 5116*ef270ab1SKenneth D. Merry } sli4_link_state_t; 5117*ef270ab1SKenneth D. Merry 5118*ef270ab1SKenneth D. Merry 5119*ef270ab1SKenneth D. Merry #define SLI4_LINK_ATTN_TYPE_LINK_UP 0x01 5120*ef270ab1SKenneth D. Merry #define SLI4_LINK_ATTN_TYPE_LINK_DOWN 0x02 5121*ef270ab1SKenneth D. Merry #define SLI4_LINK_ATTN_TYPE_NO_HARD_ALPA 0x03 5122*ef270ab1SKenneth D. Merry 5123*ef270ab1SKenneth D. Merry #define SLI4_LINK_ATTN_P2P 0x01 5124*ef270ab1SKenneth D. Merry #define SLI4_LINK_ATTN_FC_AL 0x02 5125*ef270ab1SKenneth D. Merry #define SLI4_LINK_ATTN_INTERNAL_LOOPBACK 0x03 5126*ef270ab1SKenneth D. Merry #define SLI4_LINK_ATTN_SERDES_LOOPBACK 0x04 5127*ef270ab1SKenneth D. Merry 5128*ef270ab1SKenneth D. Merry #define SLI4_LINK_ATTN_1G 0x01 5129*ef270ab1SKenneth D. Merry #define SLI4_LINK_ATTN_2G 0x02 5130*ef270ab1SKenneth D. Merry #define SLI4_LINK_ATTN_4G 0x04 5131*ef270ab1SKenneth D. Merry #define SLI4_LINK_ATTN_8G 0x08 5132*ef270ab1SKenneth D. Merry #define SLI4_LINK_ATTN_10G 0x0a 5133*ef270ab1SKenneth D. Merry #define SLI4_LINK_ATTN_16G 0x10 5134*ef270ab1SKenneth D. Merry 5135*ef270ab1SKenneth D. Merry #define SLI4_LINK_TYPE_ETHERNET 0x0 5136*ef270ab1SKenneth D. Merry #define SLI4_LINK_TYPE_FC 0x1 5137*ef270ab1SKenneth D. Merry 5138*ef270ab1SKenneth D. Merry /** 5139*ef270ab1SKenneth D. Merry * @brief Asynchronouse Event: FC Link Attention Event. 5140*ef270ab1SKenneth D. Merry */ 5141*ef270ab1SKenneth D. Merry typedef struct sli4_link_attention_s { 5142*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 5143*ef270ab1SKenneth D. Merry uint32_t link_number:8, 5144*ef270ab1SKenneth D. Merry attn_type:8, 5145*ef270ab1SKenneth D. Merry topology:8, 5146*ef270ab1SKenneth D. Merry port_speed:8; 5147*ef270ab1SKenneth D. Merry uint32_t port_fault:8, 5148*ef270ab1SKenneth D. Merry shared_link_status:8, 5149*ef270ab1SKenneth D. Merry logical_link_speed:16; 5150*ef270ab1SKenneth D. Merry uint32_t event_tag; 5151*ef270ab1SKenneth D. Merry uint32_t :8, 5152*ef270ab1SKenneth D. Merry event_code:8, 5153*ef270ab1SKenneth D. Merry event_type:8, /** values are protocol specific */ 5154*ef270ab1SKenneth D. Merry :6, 5155*ef270ab1SKenneth D. Merry ae:1, /** async event - this is an ACQE */ 5156*ef270ab1SKenneth D. Merry val:1; /** valid - contents of CQE are valid */ 5157*ef270ab1SKenneth D. Merry #else 5158*ef270ab1SKenneth D. Merry #error big endian version not defined 5159*ef270ab1SKenneth D. Merry #endif 5160*ef270ab1SKenneth D. Merry } sli4_link_attention_t; 5161*ef270ab1SKenneth D. Merry 5162*ef270ab1SKenneth D. Merry /** 5163*ef270ab1SKenneth D. Merry * @brief FC/FCoE event types. 5164*ef270ab1SKenneth D. Merry */ 5165*ef270ab1SKenneth D. Merry #define SLI4_LINK_STATE_PHYSICAL 0x00 5166*ef270ab1SKenneth D. Merry #define SLI4_LINK_STATE_LOGICAL 0x01 5167*ef270ab1SKenneth D. Merry 5168*ef270ab1SKenneth D. Merry #define SLI4_FCOE_FIP_FCF_DISCOVERED 0x01 5169*ef270ab1SKenneth D. Merry #define SLI4_FCOE_FIP_FCF_TABLE_FULL 0x02 5170*ef270ab1SKenneth D. Merry #define SLI4_FCOE_FIP_FCF_DEAD 0x03 5171*ef270ab1SKenneth D. Merry #define SLI4_FCOE_FIP_FCF_CLEAR_VLINK 0x04 5172*ef270ab1SKenneth D. Merry #define SLI4_FCOE_FIP_FCF_MODIFIED 0x05 5173*ef270ab1SKenneth D. Merry 5174*ef270ab1SKenneth D. Merry #define SLI4_GRP5_QOS_SPEED 0x01 5175*ef270ab1SKenneth D. Merry 5176*ef270ab1SKenneth D. Merry #define SLI4_FC_EVENT_LINK_ATTENTION 0x01 5177*ef270ab1SKenneth D. Merry #define SLI4_FC_EVENT_SHARED_LINK_ATTENTION 0x02 5178*ef270ab1SKenneth D. Merry 5179*ef270ab1SKenneth D. Merry #define SLI4_PORT_SPEED_NO_LINK 0x0 5180*ef270ab1SKenneth D. Merry #define SLI4_PORT_SPEED_10_MBPS 0x1 5181*ef270ab1SKenneth D. Merry #define SLI4_PORT_SPEED_100_MBPS 0x2 5182*ef270ab1SKenneth D. Merry #define SLI4_PORT_SPEED_1_GBPS 0x3 5183*ef270ab1SKenneth D. Merry #define SLI4_PORT_SPEED_10_GBPS 0x4 5184*ef270ab1SKenneth D. Merry 5185*ef270ab1SKenneth D. Merry #define SLI4_PORT_DUPLEX_NONE 0x0 5186*ef270ab1SKenneth D. Merry #define SLI4_PORT_DUPLEX_HWF 0x1 5187*ef270ab1SKenneth D. Merry #define SLI4_PORT_DUPLEX_FULL 0x2 5188*ef270ab1SKenneth D. Merry 5189*ef270ab1SKenneth D. Merry #define SLI4_PORT_LINK_STATUS_PHYSICAL_DOWN 0x0 5190*ef270ab1SKenneth D. Merry #define SLI4_PORT_LINK_STATUS_PHYSICAL_UP 0x1 5191*ef270ab1SKenneth D. Merry #define SLI4_PORT_LINK_STATUS_LOGICAL_DOWN 0x2 5192*ef270ab1SKenneth D. Merry #define SLI4_PORT_LINK_STATUS_LOGICAL_UP 0x3 5193*ef270ab1SKenneth D. Merry 5194*ef270ab1SKenneth D. Merry /** 5195*ef270ab1SKenneth D. Merry * @brief Asynchronouse Event: FCoE/FIP ACQE. 5196*ef270ab1SKenneth D. Merry */ 5197*ef270ab1SKenneth D. Merry typedef struct sli4_fcoe_fip_s { 5198*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 5199*ef270ab1SKenneth D. Merry uint32_t event_information; 5200*ef270ab1SKenneth D. Merry uint32_t fcf_count:16, 5201*ef270ab1SKenneth D. Merry fcoe_event_type:16; 5202*ef270ab1SKenneth D. Merry uint32_t event_tag; 5203*ef270ab1SKenneth D. Merry uint32_t :8, 5204*ef270ab1SKenneth D. Merry event_code:8, 5205*ef270ab1SKenneth D. Merry event_type:8, /** values are protocol specific */ 5206*ef270ab1SKenneth D. Merry :6, 5207*ef270ab1SKenneth D. Merry ae:1, /** async event - this is an ACQE */ 5208*ef270ab1SKenneth D. Merry val:1; /** valid - contents of CQE are valid */ 5209*ef270ab1SKenneth D. Merry #else 5210*ef270ab1SKenneth D. Merry #error big endian version not defined 5211*ef270ab1SKenneth D. Merry #endif 5212*ef270ab1SKenneth D. Merry } sli4_fcoe_fip_t; 5213*ef270ab1SKenneth D. Merry 5214*ef270ab1SKenneth D. Merry /** 5215*ef270ab1SKenneth D. Merry * @brief FC/FCoE WQ completion queue entry. 5216*ef270ab1SKenneth D. Merry */ 5217*ef270ab1SKenneth D. Merry typedef struct sli4_fc_wcqe_s { 5218*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 5219*ef270ab1SKenneth D. Merry uint32_t hw_status:8, 5220*ef270ab1SKenneth D. Merry status:8, 5221*ef270ab1SKenneth D. Merry request_tag:16; 5222*ef270ab1SKenneth D. Merry uint32_t wqe_specific_1; 5223*ef270ab1SKenneth D. Merry uint32_t wqe_specific_2; 5224*ef270ab1SKenneth D. Merry uint32_t :15, 5225*ef270ab1SKenneth D. Merry qx:1, 5226*ef270ab1SKenneth D. Merry code:8, 5227*ef270ab1SKenneth D. Merry pri:3, 5228*ef270ab1SKenneth D. Merry pv:1, 5229*ef270ab1SKenneth D. Merry xb:1, 5230*ef270ab1SKenneth D. Merry :2, 5231*ef270ab1SKenneth D. Merry vld:1; 5232*ef270ab1SKenneth D. Merry #else 5233*ef270ab1SKenneth D. Merry #error big endian version not defined 5234*ef270ab1SKenneth D. Merry #endif 5235*ef270ab1SKenneth D. Merry } sli4_fc_wcqe_t; 5236*ef270ab1SKenneth D. Merry 5237*ef270ab1SKenneth D. Merry /** 5238*ef270ab1SKenneth D. Merry * @brief FC/FCoE WQ consumed CQ queue entry. 5239*ef270ab1SKenneth D. Merry */ 5240*ef270ab1SKenneth D. Merry typedef struct sli4_fc_wqec_s { 5241*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 5242*ef270ab1SKenneth D. Merry uint32_t :32; 5243*ef270ab1SKenneth D. Merry uint32_t :32; 5244*ef270ab1SKenneth D. Merry uint32_t wqe_index:16, 5245*ef270ab1SKenneth D. Merry wq_id:16; 5246*ef270ab1SKenneth D. Merry uint32_t :16, 5247*ef270ab1SKenneth D. Merry code:8, 5248*ef270ab1SKenneth D. Merry :7, 5249*ef270ab1SKenneth D. Merry vld:1; 5250*ef270ab1SKenneth D. Merry #else 5251*ef270ab1SKenneth D. Merry #error big endian version not defined 5252*ef270ab1SKenneth D. Merry #endif 5253*ef270ab1SKenneth D. Merry } sli4_fc_wqec_t; 5254*ef270ab1SKenneth D. Merry 5255*ef270ab1SKenneth D. Merry /** 5256*ef270ab1SKenneth D. Merry * @brief FC/FCoE Completion Status Codes. 5257*ef270ab1SKenneth D. Merry */ 5258*ef270ab1SKenneth D. Merry #define SLI4_FC_WCQE_STATUS_SUCCESS 0x00 5259*ef270ab1SKenneth D. Merry #define SLI4_FC_WCQE_STATUS_FCP_RSP_FAILURE 0x01 5260*ef270ab1SKenneth D. Merry #define SLI4_FC_WCQE_STATUS_REMOTE_STOP 0x02 5261*ef270ab1SKenneth D. Merry #define SLI4_FC_WCQE_STATUS_LOCAL_REJECT 0x03 5262*ef270ab1SKenneth D. Merry #define SLI4_FC_WCQE_STATUS_NPORT_RJT 0x04 5263*ef270ab1SKenneth D. Merry #define SLI4_FC_WCQE_STATUS_FABRIC_RJT 0x05 5264*ef270ab1SKenneth D. Merry #define SLI4_FC_WCQE_STATUS_NPORT_BSY 0x06 5265*ef270ab1SKenneth D. Merry #define SLI4_FC_WCQE_STATUS_FABRIC_BSY 0x07 5266*ef270ab1SKenneth D. Merry #define SLI4_FC_WCQE_STATUS_LS_RJT 0x09 5267*ef270ab1SKenneth D. Merry #define SLI4_FC_WCQE_STATUS_CMD_REJECT 0x0b 5268*ef270ab1SKenneth D. Merry #define SLI4_FC_WCQE_STATUS_FCP_TGT_LENCHECK 0x0c 5269*ef270ab1SKenneth D. Merry #define SLI4_FC_WCQE_STATUS_RQ_BUF_LEN_EXCEEDED 0x11 5270*ef270ab1SKenneth D. Merry #define SLI4_FC_WCQE_STATUS_RQ_INSUFF_BUF_NEEDED 0x12 5271*ef270ab1SKenneth D. Merry #define SLI4_FC_WCQE_STATUS_RQ_INSUFF_FRM_DISC 0x13 5272*ef270ab1SKenneth D. Merry #define SLI4_FC_WCQE_STATUS_RQ_DMA_FAILURE 0x14 5273*ef270ab1SKenneth D. Merry #define SLI4_FC_WCQE_STATUS_FCP_RSP_TRUNCATE 0x15 5274*ef270ab1SKenneth D. Merry #define SLI4_FC_WCQE_STATUS_DI_ERROR 0x16 5275*ef270ab1SKenneth D. Merry #define SLI4_FC_WCQE_STATUS_BA_RJT 0x17 5276*ef270ab1SKenneth D. Merry #define SLI4_FC_WCQE_STATUS_RQ_INSUFF_XRI_NEEDED 0x18 5277*ef270ab1SKenneth D. Merry #define SLI4_FC_WCQE_STATUS_RQ_INSUFF_XRI_DISC 0x19 5278*ef270ab1SKenneth D. Merry #define SLI4_FC_WCQE_STATUS_RX_ERROR_DETECT 0x1a 5279*ef270ab1SKenneth D. Merry #define SLI4_FC_WCQE_STATUS_RX_ABORT_REQUEST 0x1b 5280*ef270ab1SKenneth D. Merry 5281*ef270ab1SKenneth D. Merry /* driver generated status codes; better not overlap with chip's status codes! */ 5282*ef270ab1SKenneth D. Merry #define SLI4_FC_WCQE_STATUS_TARGET_WQE_TIMEOUT 0xff 5283*ef270ab1SKenneth D. Merry #define SLI4_FC_WCQE_STATUS_SHUTDOWN 0xfe 5284*ef270ab1SKenneth D. Merry #define SLI4_FC_WCQE_STATUS_DISPATCH_ERROR 0xfd 5285*ef270ab1SKenneth D. Merry 5286*ef270ab1SKenneth D. Merry /** 5287*ef270ab1SKenneth D. Merry * @brief DI_ERROR Extended Status 5288*ef270ab1SKenneth D. Merry */ 5289*ef270ab1SKenneth D. Merry #define SLI4_FC_DI_ERROR_GE (1 << 0) /* Guard Error */ 5290*ef270ab1SKenneth D. Merry #define SLI4_FC_DI_ERROR_AE (1 << 1) /* Application Tag Error */ 5291*ef270ab1SKenneth D. Merry #define SLI4_FC_DI_ERROR_RE (1 << 2) /* Reference Tag Error */ 5292*ef270ab1SKenneth D. Merry #define SLI4_FC_DI_ERROR_TDPV (1 << 3) /* Total Data Placed Valid */ 5293*ef270ab1SKenneth D. Merry #define SLI4_FC_DI_ERROR_UDB (1 << 4) /* Uninitialized DIF Block */ 5294*ef270ab1SKenneth D. Merry #define SLI4_FC_DI_ERROR_EDIR (1 << 5) /* Error direction */ 5295*ef270ab1SKenneth D. Merry 5296*ef270ab1SKenneth D. Merry /** 5297*ef270ab1SKenneth D. Merry * @brief Local Reject Reason Codes. 5298*ef270ab1SKenneth D. Merry */ 5299*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_MISSING_CONTINUE 0x01 5300*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_SEQUENCE_TIMEOUT 0x02 5301*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_INTERNAL_ERROR 0x03 5302*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_INVALID_RPI 0x04 5303*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_NO_XRI 0x05 5304*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_ILLEGAL_COMMAND 0x06 5305*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_XCHG_DROPPED 0x07 5306*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_ILLEGAL_FIELD 0x08 5307*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_NO_ABORT_MATCH 0x0c 5308*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_TX_DMA_FAILED 0x0d 5309*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_RX_DMA_FAILED 0x0e 5310*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_ILLEGAL_FRAME 0x0f 5311*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_NO_RESOURCES 0x11 5312*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_FCP_CONF_FAILURE 0x12 5313*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_ILLEGAL_LENGTH 0x13 5314*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_UNSUPPORTED_FEATURE 0x14 5315*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_ABORT_IN_PROGRESS 0x15 5316*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_ABORT_REQUESTED 0x16 5317*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_RCV_BUFFER_TIMEOUT 0x17 5318*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_LOOP_OPEN_FAILURE 0x18 5319*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_LINK_DOWN 0x1a 5320*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_CORRUPTED_DATA 0x1b 5321*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_CORRUPTED_RPI 0x1c 5322*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_OUT_OF_ORDER_DATA 0x1d 5323*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_OUT_OF_ORDER_ACK 0x1e 5324*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_DUP_FRAME 0x1f 5325*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_LINK_CONTROL_FRAME 0x20 5326*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_BAD_HOST_ADDRESS 0x21 5327*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_MISSING_HDR_BUFFER 0x23 5328*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_MSEQ_CHAIN_CORRUPTED 0x24 5329*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_ABORTMULT_REQUESTED 0x25 5330*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_BUFFER_SHORTAGE 0x28 5331*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_RCV_XRIBUF_WAITING 0x29 5332*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_INVALID_VPI 0x2e 5333*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_MISSING_XRIBUF 0x30 5334*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_INVALID_RELOFFSET 0x40 5335*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_MISSING_RELOFFSET 0x41 5336*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_INSUFF_BUFFERSPACE 0x42 5337*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_MISSING_SI 0x43 5338*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_MISSING_ES 0x44 5339*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_INCOMPLETE_XFER 0x45 5340*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_SLER_FAILURE 0x46 5341*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_SLER_CMD_RCV_FAILURE 0x47 5342*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_SLER_REC_RJT_ERR 0x48 5343*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_SLER_REC_SRR_RETRY_ERR 0x49 5344*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_SLER_SRR_RJT_ERR 0x4a 5345*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_SLER_RRQ_RJT_ERR 0x4c 5346*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_SLER_RRQ_RETRY_ERR 0x4d 5347*ef270ab1SKenneth D. Merry #define SLI4_FC_LOCAL_REJECT_SLER_ABTS_ERR 0x4e 5348*ef270ab1SKenneth D. Merry 5349*ef270ab1SKenneth D. Merry typedef struct sli4_fc_async_rcqe_s { 5350*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 5351*ef270ab1SKenneth D. Merry uint32_t :8, 5352*ef270ab1SKenneth D. Merry status:8, 5353*ef270ab1SKenneth D. Merry rq_element_index:12, 5354*ef270ab1SKenneth D. Merry :4; 5355*ef270ab1SKenneth D. Merry uint32_t rsvd1; 5356*ef270ab1SKenneth D. Merry uint32_t fcfi:6, 5357*ef270ab1SKenneth D. Merry rq_id:10, 5358*ef270ab1SKenneth D. Merry payload_data_placement_length:16; 5359*ef270ab1SKenneth D. Merry uint32_t sof_byte:8, 5360*ef270ab1SKenneth D. Merry eof_byte:8, 5361*ef270ab1SKenneth D. Merry code:8, 5362*ef270ab1SKenneth D. Merry header_data_placement_length:6, 5363*ef270ab1SKenneth D. Merry :1, 5364*ef270ab1SKenneth D. Merry vld:1; 5365*ef270ab1SKenneth D. Merry #else 5366*ef270ab1SKenneth D. Merry #error big endian version not defined 5367*ef270ab1SKenneth D. Merry #endif 5368*ef270ab1SKenneth D. Merry } sli4_fc_async_rcqe_t; 5369*ef270ab1SKenneth D. Merry 5370*ef270ab1SKenneth D. Merry typedef struct sli4_fc_async_rcqe_v1_s { 5371*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 5372*ef270ab1SKenneth D. Merry uint32_t :8, 5373*ef270ab1SKenneth D. Merry status:8, 5374*ef270ab1SKenneth D. Merry rq_element_index:12, 5375*ef270ab1SKenneth D. Merry :4; 5376*ef270ab1SKenneth D. Merry uint32_t fcfi:6, 5377*ef270ab1SKenneth D. Merry :26; 5378*ef270ab1SKenneth D. Merry uint32_t rq_id:16, 5379*ef270ab1SKenneth D. Merry payload_data_placement_length:16; 5380*ef270ab1SKenneth D. Merry uint32_t sof_byte:8, 5381*ef270ab1SKenneth D. Merry eof_byte:8, 5382*ef270ab1SKenneth D. Merry code:8, 5383*ef270ab1SKenneth D. Merry header_data_placement_length:6, 5384*ef270ab1SKenneth D. Merry :1, 5385*ef270ab1SKenneth D. Merry vld:1; 5386*ef270ab1SKenneth D. Merry #else 5387*ef270ab1SKenneth D. Merry #error big endian version not defined 5388*ef270ab1SKenneth D. Merry #endif 5389*ef270ab1SKenneth D. Merry } sli4_fc_async_rcqe_v1_t; 5390*ef270ab1SKenneth D. Merry 5391*ef270ab1SKenneth D. Merry #define SLI4_FC_ASYNC_RQ_SUCCESS 0x10 5392*ef270ab1SKenneth D. Merry #define SLI4_FC_ASYNC_RQ_BUF_LEN_EXCEEDED 0x11 5393*ef270ab1SKenneth D. Merry #define SLI4_FC_ASYNC_RQ_INSUFF_BUF_NEEDED 0x12 5394*ef270ab1SKenneth D. Merry #define SLI4_FC_ASYNC_RQ_INSUFF_BUF_FRM_DISC 0x13 5395*ef270ab1SKenneth D. Merry #define SLI4_FC_ASYNC_RQ_DMA_FAILURE 0x14 5396*ef270ab1SKenneth D. Merry 5397*ef270ab1SKenneth D. Merry typedef struct sli4_fc_coalescing_rcqe_s { 5398*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 5399*ef270ab1SKenneth D. Merry uint32_t :8, 5400*ef270ab1SKenneth D. Merry status:8, 5401*ef270ab1SKenneth D. Merry rq_element_index:12, 5402*ef270ab1SKenneth D. Merry :4; 5403*ef270ab1SKenneth D. Merry uint32_t rsvd1; 5404*ef270ab1SKenneth D. Merry uint32_t rq_id:16, 5405*ef270ab1SKenneth D. Merry sequence_reporting_placement_length:16; 5406*ef270ab1SKenneth D. Merry uint32_t :16, 5407*ef270ab1SKenneth D. Merry code:8, 5408*ef270ab1SKenneth D. Merry :7, 5409*ef270ab1SKenneth D. Merry vld:1; 5410*ef270ab1SKenneth D. Merry #else 5411*ef270ab1SKenneth D. Merry #error big endian version not defined 5412*ef270ab1SKenneth D. Merry #endif 5413*ef270ab1SKenneth D. Merry } sli4_fc_coalescing_rcqe_t; 5414*ef270ab1SKenneth D. Merry 5415*ef270ab1SKenneth D. Merry #define SLI4_FC_COALESCE_RQ_SUCCESS 0x10 5416*ef270ab1SKenneth D. Merry #define SLI4_FC_COALESCE_RQ_INSUFF_XRI_NEEDED 0x18 5417*ef270ab1SKenneth D. Merry 5418*ef270ab1SKenneth D. Merry typedef struct sli4_fc_optimized_write_cmd_cqe_s { 5419*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 5420*ef270ab1SKenneth D. Merry uint32_t :8, 5421*ef270ab1SKenneth D. Merry status:8, 5422*ef270ab1SKenneth D. Merry rq_element_index:15, 5423*ef270ab1SKenneth D. Merry iv:1; 5424*ef270ab1SKenneth D. Merry uint32_t fcfi:6, 5425*ef270ab1SKenneth D. Merry :8, 5426*ef270ab1SKenneth D. Merry oox:1, 5427*ef270ab1SKenneth D. Merry agxr:1, 5428*ef270ab1SKenneth D. Merry xri:16; 5429*ef270ab1SKenneth D. Merry uint32_t rq_id:16, 5430*ef270ab1SKenneth D. Merry payload_data_placement_length:16; 5431*ef270ab1SKenneth D. Merry uint32_t rpi:16, 5432*ef270ab1SKenneth D. Merry code:8, 5433*ef270ab1SKenneth D. Merry header_data_placement_length:6, 5434*ef270ab1SKenneth D. Merry :1, 5435*ef270ab1SKenneth D. Merry vld:1; 5436*ef270ab1SKenneth D. Merry #else 5437*ef270ab1SKenneth D. Merry #error big endian version not defined 5438*ef270ab1SKenneth D. Merry #endif 5439*ef270ab1SKenneth D. Merry } sli4_fc_optimized_write_cmd_cqe_t; 5440*ef270ab1SKenneth D. Merry 5441*ef270ab1SKenneth D. Merry typedef struct sli4_fc_optimized_write_data_cqe_s { 5442*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 5443*ef270ab1SKenneth D. Merry uint32_t hw_status:8, 5444*ef270ab1SKenneth D. Merry status:8, 5445*ef270ab1SKenneth D. Merry xri:16; 5446*ef270ab1SKenneth D. Merry uint32_t total_data_placed; 5447*ef270ab1SKenneth D. Merry uint32_t extended_status; 5448*ef270ab1SKenneth D. Merry uint32_t :16, 5449*ef270ab1SKenneth D. Merry code:8, 5450*ef270ab1SKenneth D. Merry pri:3, 5451*ef270ab1SKenneth D. Merry pv:1, 5452*ef270ab1SKenneth D. Merry xb:1, 5453*ef270ab1SKenneth D. Merry rha:1, 5454*ef270ab1SKenneth D. Merry :1, 5455*ef270ab1SKenneth D. Merry vld:1; 5456*ef270ab1SKenneth D. Merry #else 5457*ef270ab1SKenneth D. Merry #error big endian version not defined 5458*ef270ab1SKenneth D. Merry #endif 5459*ef270ab1SKenneth D. Merry } sli4_fc_optimized_write_data_cqe_t; 5460*ef270ab1SKenneth D. Merry 5461*ef270ab1SKenneth D. Merry typedef struct sli4_fc_xri_aborted_cqe_s { 5462*ef270ab1SKenneth D. Merry #if BYTE_ORDER == LITTLE_ENDIAN 5463*ef270ab1SKenneth D. Merry uint32_t :8, 5464*ef270ab1SKenneth D. Merry status:8, 5465*ef270ab1SKenneth D. Merry :16; 5466*ef270ab1SKenneth D. Merry uint32_t extended_status; 5467*ef270ab1SKenneth D. Merry uint32_t xri:16, 5468*ef270ab1SKenneth D. Merry remote_xid:16; 5469*ef270ab1SKenneth D. Merry uint32_t :16, 5470*ef270ab1SKenneth D. Merry code:8, 5471*ef270ab1SKenneth D. Merry xr:1, 5472*ef270ab1SKenneth D. Merry :3, 5473*ef270ab1SKenneth D. Merry eo:1, 5474*ef270ab1SKenneth D. Merry br:1, 5475*ef270ab1SKenneth D. Merry ia:1, 5476*ef270ab1SKenneth D. Merry vld:1; 5477*ef270ab1SKenneth D. Merry #else 5478*ef270ab1SKenneth D. Merry #error big endian version not defined 5479*ef270ab1SKenneth D. Merry #endif 5480*ef270ab1SKenneth D. Merry } sli4_fc_xri_aborted_cqe_t; 5481*ef270ab1SKenneth D. Merry 5482*ef270ab1SKenneth D. Merry /** 5483*ef270ab1SKenneth D. Merry * Code definitions applicable to all FC/FCoE CQE types. 5484*ef270ab1SKenneth D. Merry */ 5485*ef270ab1SKenneth D. Merry #define SLI4_CQE_CODE_OFFSET 14 5486*ef270ab1SKenneth D. Merry 5487*ef270ab1SKenneth D. Merry #define SLI4_CQE_CODE_WORK_REQUEST_COMPLETION 0x01 5488*ef270ab1SKenneth D. Merry #define SLI4_CQE_CODE_RELEASE_WQE 0x02 5489*ef270ab1SKenneth D. Merry #define SLI4_CQE_CODE_RQ_ASYNC 0x04 5490*ef270ab1SKenneth D. Merry #define SLI4_CQE_CODE_XRI_ABORTED 0x05 5491*ef270ab1SKenneth D. Merry #define SLI4_CQE_CODE_RQ_COALESCING 0x06 5492*ef270ab1SKenneth D. Merry #define SLI4_CQE_CODE_RQ_CONSUMPTION 0x07 5493*ef270ab1SKenneth D. Merry #define SLI4_CQE_CODE_MEASUREMENT_REPORTING 0x08 5494*ef270ab1SKenneth D. Merry #define SLI4_CQE_CODE_RQ_ASYNC_V1 0x09 5495*ef270ab1SKenneth D. Merry #define SLI4_CQE_CODE_OPTIMIZED_WRITE_CMD 0x0B 5496*ef270ab1SKenneth D. Merry #define SLI4_CQE_CODE_OPTIMIZED_WRITE_DATA 0x0C 5497*ef270ab1SKenneth D. Merry 5498*ef270ab1SKenneth D. Merry extern int32_t sli_fc_process_link_state(sli4_t *, void *); 5499*ef270ab1SKenneth D. Merry extern int32_t sli_fc_process_link_attention(sli4_t *, void *); 5500*ef270ab1SKenneth D. Merry extern int32_t sli_fc_cqe_parse(sli4_t *, sli4_queue_t *, uint8_t *, sli4_qentry_e *, uint16_t *); 5501*ef270ab1SKenneth D. Merry extern uint32_t sli_fc_response_length(sli4_t *, uint8_t *); 5502*ef270ab1SKenneth D. Merry extern uint32_t sli_fc_io_length(sli4_t *, uint8_t *); 5503*ef270ab1SKenneth D. Merry extern int32_t sli_fc_els_did(sli4_t *, uint8_t *, uint32_t *); 5504*ef270ab1SKenneth D. Merry extern uint32_t sli_fc_ext_status(sli4_t *, uint8_t *); 5505*ef270ab1SKenneth D. Merry extern int32_t sli_fc_rqe_rqid_and_index(sli4_t *, uint8_t *, uint16_t *, uint32_t *); 5506*ef270ab1SKenneth D. Merry extern int32_t sli_fc_process_fcoe(sli4_t *, void *); 5507*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_fcoe_wq_create(sli4_t *, void *, size_t, ocs_dma_t *, uint16_t, uint16_t); 5508*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_fcoe_wq_create_v1(sli4_t *, void *, size_t, ocs_dma_t *, uint16_t, uint16_t); 5509*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_fcoe_wq_destroy(sli4_t *, void *, size_t, uint16_t); 5510*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_fcoe_post_sgl_pages(sli4_t *, void *, size_t, uint16_t, uint32_t, ocs_dma_t **, ocs_dma_t **, 5511*ef270ab1SKenneth D. Merry ocs_dma_t *); 5512*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_fcoe_rq_create(sli4_t *, void *, size_t, ocs_dma_t *, uint16_t, uint16_t, uint16_t); 5513*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_fcoe_rq_create_v1(sli4_t *, void *, size_t, ocs_dma_t *, uint16_t, uint16_t, uint16_t); 5514*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_fcoe_rq_destroy(sli4_t *, void *, size_t, uint16_t); 5515*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_fcoe_read_fcf_table(sli4_t *, void *, size_t, ocs_dma_t *, uint16_t); 5516*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_fcoe_post_hdr_templates(sli4_t *, void *, size_t, ocs_dma_t *, uint16_t, ocs_dma_t *); 5517*ef270ab1SKenneth D. Merry extern int32_t sli_cmd_fcoe_rediscover_fcf(sli4_t *, void *, size_t, uint16_t); 5518*ef270ab1SKenneth D. Merry extern int32_t sli_fc_rq_alloc(sli4_t *, sli4_queue_t *, uint32_t, uint32_t, sli4_queue_t *, uint16_t, uint8_t); 5519*ef270ab1SKenneth D. Merry extern int32_t sli_fc_rq_set_alloc(sli4_t *, uint32_t, sli4_queue_t *[], uint32_t, uint32_t, uint32_t, uint32_t, uint16_t); 5520*ef270ab1SKenneth D. Merry extern uint32_t sli_fc_get_rpi_requirements(sli4_t *, uint32_t); 5521*ef270ab1SKenneth D. Merry extern int32_t sli_abort_wqe(sli4_t *, void *, size_t, sli4_abort_type_e, uint32_t, uint32_t, uint32_t, uint16_t, uint16_t); 5522*ef270ab1SKenneth D. Merry 5523*ef270ab1SKenneth D. Merry extern int32_t sli_els_request64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint8_t, uint32_t, uint32_t, uint8_t, uint16_t, uint16_t, uint16_t, ocs_remote_node_t *); 5524*ef270ab1SKenneth D. Merry extern int32_t sli_fcp_iread64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint32_t, uint32_t, uint16_t, uint16_t, uint16_t, uint32_t, ocs_remote_node_t *, uint8_t, uint8_t, uint8_t); 5525*ef270ab1SKenneth D. Merry extern int32_t sli_fcp_iwrite64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint32_t, uint32_t, uint32_t, uint16_t, uint16_t, uint16_t, uint32_t, ocs_remote_node_t *, uint8_t, uint8_t, uint8_t); 5526*ef270ab1SKenneth D. Merry extern int32_t sli_fcp_icmnd64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint16_t, uint16_t, uint16_t, uint32_t, ocs_remote_node_t *, uint8_t); 5527*ef270ab1SKenneth D. Merry 5528*ef270ab1SKenneth D. Merry extern int32_t sli_fcp_treceive64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint32_t, uint32_t, uint32_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, ocs_remote_node_t *, uint32_t, uint8_t, uint8_t, uint8_t, uint32_t); 5529*ef270ab1SKenneth D. Merry extern int32_t sli_fcp_trsp64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint32_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, ocs_remote_node_t *, uint32_t, uint8_t, uint8_t, uint32_t); 5530*ef270ab1SKenneth D. Merry extern int32_t sli_fcp_tsend64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint32_t, uint32_t, uint32_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, ocs_remote_node_t *, uint32_t, uint8_t, uint8_t, uint8_t, uint32_t); 5531*ef270ab1SKenneth D. Merry extern int32_t sli_fcp_cont_treceive64_wqe(sli4_t *, void*, size_t, ocs_dma_t *, uint32_t, uint32_t, uint32_t, uint16_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, ocs_remote_node_t *, uint32_t, uint8_t, uint8_t, uint8_t, uint32_t); 5532*ef270ab1SKenneth D. Merry extern int32_t sli_gen_request64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint32_t, uint32_t,uint8_t, uint16_t, uint16_t, uint16_t, ocs_remote_node_t *, uint8_t, uint8_t, uint8_t); 5533*ef270ab1SKenneth D. Merry extern int32_t sli_send_frame_wqe(sli4_t *sli4, void *buf, size_t size, uint8_t sof, uint8_t eof, uint32_t *hdr, 5534*ef270ab1SKenneth D. Merry ocs_dma_t *payload, uint32_t req_len, uint8_t timeout, 5535*ef270ab1SKenneth D. Merry uint16_t xri, uint16_t req_tag); 5536*ef270ab1SKenneth D. Merry extern int32_t sli_xmit_sequence64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint32_t, uint8_t, uint16_t, uint16_t, uint16_t, ocs_remote_node_t *, uint8_t, uint8_t, uint8_t); 5537*ef270ab1SKenneth D. Merry extern int32_t sli_xmit_bcast64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint32_t, uint8_t, uint16_t, uint16_t, uint16_t, ocs_remote_node_t *, uint8_t, uint8_t, uint8_t); 5538*ef270ab1SKenneth D. Merry extern int32_t sli_xmit_bls_rsp64_wqe(sli4_t *, void *, size_t, sli_bls_payload_t *, uint16_t, uint16_t, uint16_t, ocs_remote_node_t *, uint32_t); 5539*ef270ab1SKenneth D. Merry extern int32_t sli_xmit_els_rsp64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint32_t, uint16_t, uint16_t, uint16_t, uint16_t, ocs_remote_node_t *, uint32_t, uint32_t); 5540*ef270ab1SKenneth D. Merry extern int32_t sli_requeue_xri_wqe(sli4_t *, void *, size_t, uint16_t, uint16_t, uint16_t); 5541*ef270ab1SKenneth D. Merry extern void sli4_cmd_lowlevel_set_watchdog(sli4_t *sli4, void *buf, size_t size, uint16_t timeout); 5542*ef270ab1SKenneth D. Merry 5543*ef270ab1SKenneth D. Merry /** 5544*ef270ab1SKenneth D. Merry * @ingroup sli_fc 5545*ef270ab1SKenneth D. Merry * @brief Retrieve the received header and payload length. 5546*ef270ab1SKenneth D. Merry * 5547*ef270ab1SKenneth D. Merry * @param sli4 SLI context. 5548*ef270ab1SKenneth D. Merry * @param cqe Pointer to the CQ entry. 5549*ef270ab1SKenneth D. Merry * @param len_hdr Pointer where the header length is written. 5550*ef270ab1SKenneth D. Merry * @param len_data Pointer where the payload length is written. 5551*ef270ab1SKenneth D. Merry * 5552*ef270ab1SKenneth D. Merry * @return Returns 0 on success, or a non-zero value on failure. 5553*ef270ab1SKenneth D. Merry */ 5554*ef270ab1SKenneth D. Merry static inline int32_t 5555*ef270ab1SKenneth D. Merry sli_fc_rqe_length(sli4_t *sli4, void *cqe, uint32_t *len_hdr, uint32_t *len_data) 5556*ef270ab1SKenneth D. Merry { 5557*ef270ab1SKenneth D. Merry sli4_fc_async_rcqe_t *rcqe = cqe; 5558*ef270ab1SKenneth D. Merry 5559*ef270ab1SKenneth D. Merry *len_hdr = *len_data = 0; 5560*ef270ab1SKenneth D. Merry 5561*ef270ab1SKenneth D. Merry if (SLI4_FC_ASYNC_RQ_SUCCESS == rcqe->status) { 5562*ef270ab1SKenneth D. Merry *len_hdr = rcqe->header_data_placement_length; 5563*ef270ab1SKenneth D. Merry *len_data = rcqe->payload_data_placement_length; 5564*ef270ab1SKenneth D. Merry return 0; 5565*ef270ab1SKenneth D. Merry } else { 5566*ef270ab1SKenneth D. Merry return -1; 5567*ef270ab1SKenneth D. Merry } 5568*ef270ab1SKenneth D. Merry } 5569*ef270ab1SKenneth D. Merry 5570*ef270ab1SKenneth D. Merry /** 5571*ef270ab1SKenneth D. Merry * @ingroup sli_fc 5572*ef270ab1SKenneth D. Merry * @brief Retrieve the received FCFI. 5573*ef270ab1SKenneth D. Merry * 5574*ef270ab1SKenneth D. Merry * @param sli4 SLI context. 5575*ef270ab1SKenneth D. Merry * @param cqe Pointer to the CQ entry. 5576*ef270ab1SKenneth D. Merry * 5577*ef270ab1SKenneth D. Merry * @return Returns the FCFI in the CQE. or UINT8_MAX if invalid CQE code. 5578*ef270ab1SKenneth D. Merry */ 5579*ef270ab1SKenneth D. Merry static inline uint8_t 5580*ef270ab1SKenneth D. Merry sli_fc_rqe_fcfi(sli4_t *sli4, void *cqe) 5581*ef270ab1SKenneth D. Merry { 5582*ef270ab1SKenneth D. Merry uint8_t code = ((uint8_t*)cqe)[SLI4_CQE_CODE_OFFSET]; 5583*ef270ab1SKenneth D. Merry uint8_t fcfi = UINT8_MAX; 5584*ef270ab1SKenneth D. Merry 5585*ef270ab1SKenneth D. Merry switch(code) { 5586*ef270ab1SKenneth D. Merry case SLI4_CQE_CODE_RQ_ASYNC: { 5587*ef270ab1SKenneth D. Merry sli4_fc_async_rcqe_t *rcqe = cqe; 5588*ef270ab1SKenneth D. Merry fcfi = rcqe->fcfi; 5589*ef270ab1SKenneth D. Merry break; 5590*ef270ab1SKenneth D. Merry } 5591*ef270ab1SKenneth D. Merry case SLI4_CQE_CODE_RQ_ASYNC_V1: { 5592*ef270ab1SKenneth D. Merry sli4_fc_async_rcqe_v1_t *rcqev1 = cqe; 5593*ef270ab1SKenneth D. Merry fcfi = rcqev1->fcfi; 5594*ef270ab1SKenneth D. Merry break; 5595*ef270ab1SKenneth D. Merry } 5596*ef270ab1SKenneth D. Merry case SLI4_CQE_CODE_OPTIMIZED_WRITE_CMD: { 5597*ef270ab1SKenneth D. Merry sli4_fc_optimized_write_cmd_cqe_t *opt_wr = cqe; 5598*ef270ab1SKenneth D. Merry fcfi = opt_wr->fcfi; 5599*ef270ab1SKenneth D. Merry break; 5600*ef270ab1SKenneth D. Merry } 5601*ef270ab1SKenneth D. Merry } 5602*ef270ab1SKenneth D. Merry 5603*ef270ab1SKenneth D. Merry return fcfi; 5604*ef270ab1SKenneth D. Merry } 5605*ef270ab1SKenneth D. Merry 5606*ef270ab1SKenneth D. Merry extern const char *sli_fc_get_status_string(uint32_t status); 5607*ef270ab1SKenneth D. Merry 5608*ef270ab1SKenneth D. Merry #endif /* !_SLI4_H */ 5609*ef270ab1SKenneth D. Merry 5610