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