1*01489e5dSAlfredo Cardigliano /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB OR BSD-3-Clause */ 2*01489e5dSAlfredo Cardigliano /* Copyright (c) 2017-2019 Pensando Systems, Inc. All rights reserved. */ 3*01489e5dSAlfredo Cardigliano 4*01489e5dSAlfredo Cardigliano #ifndef _IONIC_IF_H_ 5*01489e5dSAlfredo Cardigliano #define _IONIC_IF_H_ 6*01489e5dSAlfredo Cardigliano 7*01489e5dSAlfredo Cardigliano #pragma pack(push, 1) 8*01489e5dSAlfredo Cardigliano 9*01489e5dSAlfredo Cardigliano #define IONIC_DEV_INFO_SIGNATURE 0x44455649 /* 'DEVI' */ 10*01489e5dSAlfredo Cardigliano #define IONIC_DEV_INFO_VERSION 1 11*01489e5dSAlfredo Cardigliano #define IONIC_IFNAMSIZ 16 12*01489e5dSAlfredo Cardigliano 13*01489e5dSAlfredo Cardigliano /** 14*01489e5dSAlfredo Cardigliano * Commands 15*01489e5dSAlfredo Cardigliano */ 16*01489e5dSAlfredo Cardigliano enum ionic_cmd_opcode { 17*01489e5dSAlfredo Cardigliano IONIC_CMD_NOP = 0, 18*01489e5dSAlfredo Cardigliano 19*01489e5dSAlfredo Cardigliano /* Device commands */ 20*01489e5dSAlfredo Cardigliano IONIC_CMD_IDENTIFY = 1, 21*01489e5dSAlfredo Cardigliano IONIC_CMD_INIT = 2, 22*01489e5dSAlfredo Cardigliano IONIC_CMD_RESET = 3, 23*01489e5dSAlfredo Cardigliano IONIC_CMD_GETATTR = 4, 24*01489e5dSAlfredo Cardigliano IONIC_CMD_SETATTR = 5, 25*01489e5dSAlfredo Cardigliano 26*01489e5dSAlfredo Cardigliano /* Port commands */ 27*01489e5dSAlfredo Cardigliano IONIC_CMD_PORT_IDENTIFY = 10, 28*01489e5dSAlfredo Cardigliano IONIC_CMD_PORT_INIT = 11, 29*01489e5dSAlfredo Cardigliano IONIC_CMD_PORT_RESET = 12, 30*01489e5dSAlfredo Cardigliano IONIC_CMD_PORT_GETATTR = 13, 31*01489e5dSAlfredo Cardigliano IONIC_CMD_PORT_SETATTR = 14, 32*01489e5dSAlfredo Cardigliano 33*01489e5dSAlfredo Cardigliano /* LIF commands */ 34*01489e5dSAlfredo Cardigliano IONIC_CMD_LIF_IDENTIFY = 20, 35*01489e5dSAlfredo Cardigliano IONIC_CMD_LIF_INIT = 21, 36*01489e5dSAlfredo Cardigliano IONIC_CMD_LIF_RESET = 22, 37*01489e5dSAlfredo Cardigliano IONIC_CMD_LIF_GETATTR = 23, 38*01489e5dSAlfredo Cardigliano IONIC_CMD_LIF_SETATTR = 24, 39*01489e5dSAlfredo Cardigliano 40*01489e5dSAlfredo Cardigliano IONIC_CMD_RX_MODE_SET = 30, 41*01489e5dSAlfredo Cardigliano IONIC_CMD_RX_FILTER_ADD = 31, 42*01489e5dSAlfredo Cardigliano IONIC_CMD_RX_FILTER_DEL = 32, 43*01489e5dSAlfredo Cardigliano 44*01489e5dSAlfredo Cardigliano /* Queue commands */ 45*01489e5dSAlfredo Cardigliano IONIC_CMD_Q_INIT = 40, 46*01489e5dSAlfredo Cardigliano IONIC_CMD_Q_CONTROL = 41, 47*01489e5dSAlfredo Cardigliano 48*01489e5dSAlfredo Cardigliano /* RDMA commands */ 49*01489e5dSAlfredo Cardigliano IONIC_CMD_RDMA_RESET_LIF = 50, 50*01489e5dSAlfredo Cardigliano IONIC_CMD_RDMA_CREATE_EQ = 51, 51*01489e5dSAlfredo Cardigliano IONIC_CMD_RDMA_CREATE_CQ = 52, 52*01489e5dSAlfredo Cardigliano IONIC_CMD_RDMA_CREATE_ADMINQ = 53, 53*01489e5dSAlfredo Cardigliano 54*01489e5dSAlfredo Cardigliano /* QoS commands */ 55*01489e5dSAlfredo Cardigliano IONIC_CMD_QOS_CLASS_IDENTIFY = 240, 56*01489e5dSAlfredo Cardigliano IONIC_CMD_QOS_CLASS_INIT = 241, 57*01489e5dSAlfredo Cardigliano IONIC_CMD_QOS_CLASS_RESET = 242, 58*01489e5dSAlfredo Cardigliano 59*01489e5dSAlfredo Cardigliano /* Firmware commands */ 60*01489e5dSAlfredo Cardigliano IONIC_CMD_FW_DOWNLOAD = 254, 61*01489e5dSAlfredo Cardigliano IONIC_CMD_FW_CONTROL = 255, 62*01489e5dSAlfredo Cardigliano }; 63*01489e5dSAlfredo Cardigliano 64*01489e5dSAlfredo Cardigliano /** 65*01489e5dSAlfredo Cardigliano * Command Return codes 66*01489e5dSAlfredo Cardigliano */ 67*01489e5dSAlfredo Cardigliano enum ionic_status_code { 68*01489e5dSAlfredo Cardigliano IONIC_RC_SUCCESS = 0, /* Success */ 69*01489e5dSAlfredo Cardigliano IONIC_RC_EVERSION = 1, /* Incorrect version for request */ 70*01489e5dSAlfredo Cardigliano IONIC_RC_EOPCODE = 2, /* Invalid cmd opcode */ 71*01489e5dSAlfredo Cardigliano IONIC_RC_EIO = 3, /* I/O error */ 72*01489e5dSAlfredo Cardigliano IONIC_RC_EPERM = 4, /* Permission denied */ 73*01489e5dSAlfredo Cardigliano IONIC_RC_EQID = 5, /* Bad qid */ 74*01489e5dSAlfredo Cardigliano IONIC_RC_EQTYPE = 6, /* Bad qtype */ 75*01489e5dSAlfredo Cardigliano IONIC_RC_ENOENT = 7, /* No such element */ 76*01489e5dSAlfredo Cardigliano IONIC_RC_EINTR = 8, /* operation interrupted */ 77*01489e5dSAlfredo Cardigliano IONIC_RC_EAGAIN = 9, /* Try again */ 78*01489e5dSAlfredo Cardigliano IONIC_RC_ENOMEM = 10, /* Out of memory */ 79*01489e5dSAlfredo Cardigliano IONIC_RC_EFAULT = 11, /* Bad address */ 80*01489e5dSAlfredo Cardigliano IONIC_RC_EBUSY = 12, /* Device or resource busy */ 81*01489e5dSAlfredo Cardigliano IONIC_RC_EEXIST = 13, /* object already exists */ 82*01489e5dSAlfredo Cardigliano IONIC_RC_EINVAL = 14, /* Invalid argument */ 83*01489e5dSAlfredo Cardigliano IONIC_RC_ENOSPC = 15, /* No space left or alloc failure */ 84*01489e5dSAlfredo Cardigliano IONIC_RC_ERANGE = 16, /* Parameter out of range */ 85*01489e5dSAlfredo Cardigliano IONIC_RC_BAD_ADDR = 17, /* Descriptor contains a bad ptr */ 86*01489e5dSAlfredo Cardigliano IONIC_RC_DEV_CMD = 18, /* Device cmd attempted on AdminQ */ 87*01489e5dSAlfredo Cardigliano IONIC_RC_ENOSUPP = 19, /* Operation not supported */ 88*01489e5dSAlfredo Cardigliano IONIC_RC_ERROR = 29, /* Generic error */ 89*01489e5dSAlfredo Cardigliano 90*01489e5dSAlfredo Cardigliano IONIC_RC_ERDMA = 30, /* Generic RDMA error */ 91*01489e5dSAlfredo Cardigliano }; 92*01489e5dSAlfredo Cardigliano 93*01489e5dSAlfredo Cardigliano enum ionic_notifyq_opcode { 94*01489e5dSAlfredo Cardigliano IONIC_EVENT_LINK_CHANGE = 1, 95*01489e5dSAlfredo Cardigliano IONIC_EVENT_RESET = 2, 96*01489e5dSAlfredo Cardigliano IONIC_EVENT_HEARTBEAT = 3, 97*01489e5dSAlfredo Cardigliano IONIC_EVENT_LOG = 4, 98*01489e5dSAlfredo Cardigliano }; 99*01489e5dSAlfredo Cardigliano 100*01489e5dSAlfredo Cardigliano /** 101*01489e5dSAlfredo Cardigliano * struct cmd - General admin command format 102*01489e5dSAlfredo Cardigliano * @opcode: Opcode for the command 103*01489e5dSAlfredo Cardigliano * @lif_index: LIF index 104*01489e5dSAlfredo Cardigliano * @cmd_data: Opcode-specific command bytes 105*01489e5dSAlfredo Cardigliano */ 106*01489e5dSAlfredo Cardigliano struct ionic_admin_cmd { 107*01489e5dSAlfredo Cardigliano u8 opcode; 108*01489e5dSAlfredo Cardigliano u8 rsvd; 109*01489e5dSAlfredo Cardigliano __le16 lif_index; 110*01489e5dSAlfredo Cardigliano u8 cmd_data[60]; 111*01489e5dSAlfredo Cardigliano }; 112*01489e5dSAlfredo Cardigliano 113*01489e5dSAlfredo Cardigliano /** 114*01489e5dSAlfredo Cardigliano * struct ionic_admin_comp - General admin command completion format 115*01489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 116*01489e5dSAlfredo Cardigliano * @comp_index: The index in the descriptor ring for which this 117*01489e5dSAlfredo Cardigliano * is the completion. 118*01489e5dSAlfredo Cardigliano * @cmd_data: Command-specific bytes. 119*01489e5dSAlfredo Cardigliano * @color: Color bit. (Always 0 for commands issued to the 120*01489e5dSAlfredo Cardigliano * Device Cmd Registers.) 121*01489e5dSAlfredo Cardigliano */ 122*01489e5dSAlfredo Cardigliano struct ionic_admin_comp { 123*01489e5dSAlfredo Cardigliano u8 status; 124*01489e5dSAlfredo Cardigliano u8 rsvd; 125*01489e5dSAlfredo Cardigliano __le16 comp_index; 126*01489e5dSAlfredo Cardigliano u8 cmd_data[11]; 127*01489e5dSAlfredo Cardigliano u8 color; 128*01489e5dSAlfredo Cardigliano #define IONIC_COMP_COLOR_MASK 0x80 129*01489e5dSAlfredo Cardigliano }; 130*01489e5dSAlfredo Cardigliano 131*01489e5dSAlfredo Cardigliano static inline u8 color_match(u8 color, u8 done_color) 132*01489e5dSAlfredo Cardigliano { 133*01489e5dSAlfredo Cardigliano return (!!(color & IONIC_COMP_COLOR_MASK)) == done_color; 134*01489e5dSAlfredo Cardigliano } 135*01489e5dSAlfredo Cardigliano 136*01489e5dSAlfredo Cardigliano /** 137*01489e5dSAlfredo Cardigliano * struct ionic_nop_cmd - NOP command 138*01489e5dSAlfredo Cardigliano * @opcode: opcode 139*01489e5dSAlfredo Cardigliano */ 140*01489e5dSAlfredo Cardigliano struct ionic_nop_cmd { 141*01489e5dSAlfredo Cardigliano u8 opcode; 142*01489e5dSAlfredo Cardigliano u8 rsvd[63]; 143*01489e5dSAlfredo Cardigliano }; 144*01489e5dSAlfredo Cardigliano 145*01489e5dSAlfredo Cardigliano /** 146*01489e5dSAlfredo Cardigliano * struct ionic_nop_comp - NOP command completion 147*01489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 148*01489e5dSAlfredo Cardigliano */ 149*01489e5dSAlfredo Cardigliano struct ionic_nop_comp { 150*01489e5dSAlfredo Cardigliano u8 status; 151*01489e5dSAlfredo Cardigliano u8 rsvd[15]; 152*01489e5dSAlfredo Cardigliano }; 153*01489e5dSAlfredo Cardigliano 154*01489e5dSAlfredo Cardigliano /** 155*01489e5dSAlfredo Cardigliano * struct ionic_dev_init_cmd - Device init command 156*01489e5dSAlfredo Cardigliano * @opcode: opcode 157*01489e5dSAlfredo Cardigliano * @type: device type 158*01489e5dSAlfredo Cardigliano */ 159*01489e5dSAlfredo Cardigliano struct ionic_dev_init_cmd { 160*01489e5dSAlfredo Cardigliano u8 opcode; 161*01489e5dSAlfredo Cardigliano u8 type; 162*01489e5dSAlfredo Cardigliano u8 rsvd[62]; 163*01489e5dSAlfredo Cardigliano }; 164*01489e5dSAlfredo Cardigliano 165*01489e5dSAlfredo Cardigliano /** 166*01489e5dSAlfredo Cardigliano * struct init_comp - Device init command completion 167*01489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 168*01489e5dSAlfredo Cardigliano */ 169*01489e5dSAlfredo Cardigliano struct ionic_dev_init_comp { 170*01489e5dSAlfredo Cardigliano u8 status; 171*01489e5dSAlfredo Cardigliano u8 rsvd[15]; 172*01489e5dSAlfredo Cardigliano }; 173*01489e5dSAlfredo Cardigliano 174*01489e5dSAlfredo Cardigliano /** 175*01489e5dSAlfredo Cardigliano * struct ionic_dev_reset_cmd - Device reset command 176*01489e5dSAlfredo Cardigliano * @opcode: opcode 177*01489e5dSAlfredo Cardigliano */ 178*01489e5dSAlfredo Cardigliano struct ionic_dev_reset_cmd { 179*01489e5dSAlfredo Cardigliano u8 opcode; 180*01489e5dSAlfredo Cardigliano u8 rsvd[63]; 181*01489e5dSAlfredo Cardigliano }; 182*01489e5dSAlfredo Cardigliano 183*01489e5dSAlfredo Cardigliano /** 184*01489e5dSAlfredo Cardigliano * struct reset_comp - Reset command completion 185*01489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 186*01489e5dSAlfredo Cardigliano */ 187*01489e5dSAlfredo Cardigliano struct ionic_dev_reset_comp { 188*01489e5dSAlfredo Cardigliano u8 status; 189*01489e5dSAlfredo Cardigliano u8 rsvd[15]; 190*01489e5dSAlfredo Cardigliano }; 191*01489e5dSAlfredo Cardigliano 192*01489e5dSAlfredo Cardigliano #define IONIC_IDENTITY_VERSION_1 1 193*01489e5dSAlfredo Cardigliano 194*01489e5dSAlfredo Cardigliano /** 195*01489e5dSAlfredo Cardigliano * struct ionic_dev_identify_cmd - Driver/device identify command 196*01489e5dSAlfredo Cardigliano * @opcode: opcode 197*01489e5dSAlfredo Cardigliano * @ver: Highest version of identify supported by driver 198*01489e5dSAlfredo Cardigliano */ 199*01489e5dSAlfredo Cardigliano struct ionic_dev_identify_cmd { 200*01489e5dSAlfredo Cardigliano u8 opcode; 201*01489e5dSAlfredo Cardigliano u8 ver; 202*01489e5dSAlfredo Cardigliano u8 rsvd[62]; 203*01489e5dSAlfredo Cardigliano }; 204*01489e5dSAlfredo Cardigliano 205*01489e5dSAlfredo Cardigliano /** 206*01489e5dSAlfredo Cardigliano * struct dev_identify_comp - Driver/device identify command completion 207*01489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 208*01489e5dSAlfredo Cardigliano * @ver: Version of identify returned by device 209*01489e5dSAlfredo Cardigliano */ 210*01489e5dSAlfredo Cardigliano struct ionic_dev_identify_comp { 211*01489e5dSAlfredo Cardigliano u8 status; 212*01489e5dSAlfredo Cardigliano u8 ver; 213*01489e5dSAlfredo Cardigliano u8 rsvd[14]; 214*01489e5dSAlfredo Cardigliano }; 215*01489e5dSAlfredo Cardigliano 216*01489e5dSAlfredo Cardigliano enum ionic_os_type { 217*01489e5dSAlfredo Cardigliano IONIC_OS_TYPE_LINUX = 1, 218*01489e5dSAlfredo Cardigliano IONIC_OS_TYPE_WIN = 2, 219*01489e5dSAlfredo Cardigliano IONIC_OS_TYPE_DPDK = 3, 220*01489e5dSAlfredo Cardigliano IONIC_OS_TYPE_FREEBSD = 4, 221*01489e5dSAlfredo Cardigliano IONIC_OS_TYPE_IPXE = 5, 222*01489e5dSAlfredo Cardigliano IONIC_OS_TYPE_ESXI = 6, 223*01489e5dSAlfredo Cardigliano }; 224*01489e5dSAlfredo Cardigliano 225*01489e5dSAlfredo Cardigliano /** 226*01489e5dSAlfredo Cardigliano * union drv_identity - driver identity information 227*01489e5dSAlfredo Cardigliano * @os_type: OS type (see enum os_type) 228*01489e5dSAlfredo Cardigliano * @os_dist: OS distribution, numeric format 229*01489e5dSAlfredo Cardigliano * @os_dist_str: OS distribution, string format 230*01489e5dSAlfredo Cardigliano * @kernel_ver: Kernel version, numeric format 231*01489e5dSAlfredo Cardigliano * @kernel_ver_str: Kernel version, string format 232*01489e5dSAlfredo Cardigliano * @driver_ver_str: Driver version, string format 233*01489e5dSAlfredo Cardigliano */ 234*01489e5dSAlfredo Cardigliano union ionic_drv_identity { 235*01489e5dSAlfredo Cardigliano struct { 236*01489e5dSAlfredo Cardigliano __le32 os_type; 237*01489e5dSAlfredo Cardigliano __le32 os_dist; 238*01489e5dSAlfredo Cardigliano char os_dist_str[128]; 239*01489e5dSAlfredo Cardigliano __le32 kernel_ver; 240*01489e5dSAlfredo Cardigliano char kernel_ver_str[32]; 241*01489e5dSAlfredo Cardigliano char driver_ver_str[32]; 242*01489e5dSAlfredo Cardigliano }; 243*01489e5dSAlfredo Cardigliano __le32 words[512]; 244*01489e5dSAlfredo Cardigliano }; 245*01489e5dSAlfredo Cardigliano 246*01489e5dSAlfredo Cardigliano /** 247*01489e5dSAlfredo Cardigliano * union dev_identity - device identity information 248*01489e5dSAlfredo Cardigliano * @version: Version of device identify 249*01489e5dSAlfredo Cardigliano * @type: Identify type (0 for now) 250*01489e5dSAlfredo Cardigliano * @nports: Number of ports provisioned 251*01489e5dSAlfredo Cardigliano * @nlifs: Number of LIFs provisioned 252*01489e5dSAlfredo Cardigliano * @nintrs: Number of interrupts provisioned 253*01489e5dSAlfredo Cardigliano * @ndbpgs_per_lif: Number of doorbell pages per LIF 254*01489e5dSAlfredo Cardigliano * @intr_coal_mult: Interrupt coalescing multiplication factor. 255*01489e5dSAlfredo Cardigliano * Scale user-supplied interrupt coalescing 256*01489e5dSAlfredo Cardigliano * value in usecs to device units using: 257*01489e5dSAlfredo Cardigliano * device units = usecs * mult / div 258*01489e5dSAlfredo Cardigliano * @intr_coal_div: Interrupt coalescing division factor. 259*01489e5dSAlfredo Cardigliano * Scale user-supplied interrupt coalescing 260*01489e5dSAlfredo Cardigliano * value in usecs to device units using: 261*01489e5dSAlfredo Cardigliano * device units = usecs * mult / div 262*01489e5dSAlfredo Cardigliano * 263*01489e5dSAlfredo Cardigliano */ 264*01489e5dSAlfredo Cardigliano union ionic_dev_identity { 265*01489e5dSAlfredo Cardigliano struct { 266*01489e5dSAlfredo Cardigliano u8 version; 267*01489e5dSAlfredo Cardigliano u8 type; 268*01489e5dSAlfredo Cardigliano u8 rsvd[2]; 269*01489e5dSAlfredo Cardigliano u8 nports; 270*01489e5dSAlfredo Cardigliano u8 rsvd2[3]; 271*01489e5dSAlfredo Cardigliano __le32 nlifs; 272*01489e5dSAlfredo Cardigliano __le32 nintrs; 273*01489e5dSAlfredo Cardigliano __le32 ndbpgs_per_lif; 274*01489e5dSAlfredo Cardigliano __le32 intr_coal_mult; 275*01489e5dSAlfredo Cardigliano __le32 intr_coal_div; 276*01489e5dSAlfredo Cardigliano }; 277*01489e5dSAlfredo Cardigliano __le32 words[512]; 278*01489e5dSAlfredo Cardigliano }; 279*01489e5dSAlfredo Cardigliano 280*01489e5dSAlfredo Cardigliano enum ionic_lif_type { 281*01489e5dSAlfredo Cardigliano IONIC_LIF_TYPE_CLASSIC = 0, 282*01489e5dSAlfredo Cardigliano IONIC_LIF_TYPE_MACVLAN = 1, 283*01489e5dSAlfredo Cardigliano IONIC_LIF_TYPE_NETQUEUE = 2, 284*01489e5dSAlfredo Cardigliano }; 285*01489e5dSAlfredo Cardigliano 286*01489e5dSAlfredo Cardigliano /** 287*01489e5dSAlfredo Cardigliano * struct ionic_lif_identify_cmd - lif identify command 288*01489e5dSAlfredo Cardigliano * @opcode: opcode 289*01489e5dSAlfredo Cardigliano * @type: lif type (enum lif_type) 290*01489e5dSAlfredo Cardigliano * @ver: version of identify returned by device 291*01489e5dSAlfredo Cardigliano */ 292*01489e5dSAlfredo Cardigliano struct ionic_lif_identify_cmd { 293*01489e5dSAlfredo Cardigliano u8 opcode; 294*01489e5dSAlfredo Cardigliano u8 type; 295*01489e5dSAlfredo Cardigliano u8 ver; 296*01489e5dSAlfredo Cardigliano u8 rsvd[61]; 297*01489e5dSAlfredo Cardigliano }; 298*01489e5dSAlfredo Cardigliano 299*01489e5dSAlfredo Cardigliano /** 300*01489e5dSAlfredo Cardigliano * struct ionic_lif_identify_comp - lif identify command completion 301*01489e5dSAlfredo Cardigliano * @status: status of the command (enum status_code) 302*01489e5dSAlfredo Cardigliano * @ver: version of identify returned by device 303*01489e5dSAlfredo Cardigliano */ 304*01489e5dSAlfredo Cardigliano struct ionic_lif_identify_comp { 305*01489e5dSAlfredo Cardigliano u8 status; 306*01489e5dSAlfredo Cardigliano u8 ver; 307*01489e5dSAlfredo Cardigliano u8 rsvd2[14]; 308*01489e5dSAlfredo Cardigliano }; 309*01489e5dSAlfredo Cardigliano 310*01489e5dSAlfredo Cardigliano enum ionic_lif_capability { 311*01489e5dSAlfredo Cardigliano IONIC_LIF_CAP_ETH = BIT(0), 312*01489e5dSAlfredo Cardigliano IONIC_LIF_CAP_RDMA = BIT(1), 313*01489e5dSAlfredo Cardigliano }; 314*01489e5dSAlfredo Cardigliano 315*01489e5dSAlfredo Cardigliano /** 316*01489e5dSAlfredo Cardigliano * Logical Queue Types 317*01489e5dSAlfredo Cardigliano */ 318*01489e5dSAlfredo Cardigliano enum ionic_logical_qtype { 319*01489e5dSAlfredo Cardigliano IONIC_QTYPE_ADMINQ = 0, 320*01489e5dSAlfredo Cardigliano IONIC_QTYPE_NOTIFYQ = 1, 321*01489e5dSAlfredo Cardigliano IONIC_QTYPE_RXQ = 2, 322*01489e5dSAlfredo Cardigliano IONIC_QTYPE_TXQ = 3, 323*01489e5dSAlfredo Cardigliano IONIC_QTYPE_EQ = 4, 324*01489e5dSAlfredo Cardigliano IONIC_QTYPE_MAX = 16, 325*01489e5dSAlfredo Cardigliano }; 326*01489e5dSAlfredo Cardigliano 327*01489e5dSAlfredo Cardigliano /** 328*01489e5dSAlfredo Cardigliano * struct ionic_lif_logical_qtype - Descriptor of logical to hardware queue 329*01489e5dSAlfredo Cardigliano * type. 330*01489e5dSAlfredo Cardigliano * @qtype: Hardware Queue Type. 331*01489e5dSAlfredo Cardigliano * @qid_count: Number of Queue IDs of the logical type. 332*01489e5dSAlfredo Cardigliano * @qid_base: Minimum Queue ID of the logical type. 333*01489e5dSAlfredo Cardigliano */ 334*01489e5dSAlfredo Cardigliano struct ionic_lif_logical_qtype { 335*01489e5dSAlfredo Cardigliano u8 qtype; 336*01489e5dSAlfredo Cardigliano u8 rsvd[3]; 337*01489e5dSAlfredo Cardigliano __le32 qid_count; 338*01489e5dSAlfredo Cardigliano __le32 qid_base; 339*01489e5dSAlfredo Cardigliano }; 340*01489e5dSAlfredo Cardigliano 341*01489e5dSAlfredo Cardigliano enum ionic_lif_state { 342*01489e5dSAlfredo Cardigliano IONIC_LIF_DISABLE = 0, 343*01489e5dSAlfredo Cardigliano IONIC_LIF_ENABLE = 1, 344*01489e5dSAlfredo Cardigliano IONIC_LIF_HANG_RESET = 2, 345*01489e5dSAlfredo Cardigliano }; 346*01489e5dSAlfredo Cardigliano 347*01489e5dSAlfredo Cardigliano /** 348*01489e5dSAlfredo Cardigliano * LIF configuration 349*01489e5dSAlfredo Cardigliano * @state: lif state (enum lif_state) 350*01489e5dSAlfredo Cardigliano * @name: lif name 351*01489e5dSAlfredo Cardigliano * @mtu: mtu 352*01489e5dSAlfredo Cardigliano * @mac: station mac address 353*01489e5dSAlfredo Cardigliano * @features: features (enum ionic_eth_hw_features) 354*01489e5dSAlfredo Cardigliano * @queue_count: queue counts per queue-type 355*01489e5dSAlfredo Cardigliano */ 356*01489e5dSAlfredo Cardigliano union ionic_lif_config { 357*01489e5dSAlfredo Cardigliano struct { 358*01489e5dSAlfredo Cardigliano u8 state; 359*01489e5dSAlfredo Cardigliano u8 rsvd[3]; 360*01489e5dSAlfredo Cardigliano char name[IONIC_IFNAMSIZ]; 361*01489e5dSAlfredo Cardigliano __le32 mtu; 362*01489e5dSAlfredo Cardigliano u8 mac[6]; 363*01489e5dSAlfredo Cardigliano u8 rsvd2[2]; 364*01489e5dSAlfredo Cardigliano __le64 features; 365*01489e5dSAlfredo Cardigliano __le32 queue_count[IONIC_QTYPE_MAX]; 366*01489e5dSAlfredo Cardigliano }; 367*01489e5dSAlfredo Cardigliano __le32 words[64]; 368*01489e5dSAlfredo Cardigliano }; 369*01489e5dSAlfredo Cardigliano 370*01489e5dSAlfredo Cardigliano /** 371*01489e5dSAlfredo Cardigliano * struct ionic_lif_identity - lif identity information (type-specific) 372*01489e5dSAlfredo Cardigliano * 373*01489e5dSAlfredo Cardigliano * @capabilities LIF capabilities 374*01489e5dSAlfredo Cardigliano * 375*01489e5dSAlfredo Cardigliano * Ethernet: 376*01489e5dSAlfredo Cardigliano * @version: Ethernet identify structure version. 377*01489e5dSAlfredo Cardigliano * @features: Ethernet features supported on this lif type. 378*01489e5dSAlfredo Cardigliano * @max_ucast_filters: Number of perfect unicast addresses supported. 379*01489e5dSAlfredo Cardigliano * @max_mcast_filters: Number of perfect multicast addresses supported. 380*01489e5dSAlfredo Cardigliano * @min_frame_size: Minimum size of frames to be sent 381*01489e5dSAlfredo Cardigliano * @max_frame_size: Maximum size of frames to be sent 382*01489e5dSAlfredo Cardigliano * @config: LIF config struct with features, mtu, mac, q counts 383*01489e5dSAlfredo Cardigliano * 384*01489e5dSAlfredo Cardigliano * RDMA: 385*01489e5dSAlfredo Cardigliano * @version: RDMA version of opcodes and queue descriptors. 386*01489e5dSAlfredo Cardigliano * @qp_opcodes: Number of rdma queue pair opcodes supported. 387*01489e5dSAlfredo Cardigliano * @admin_opcodes: Number of rdma admin opcodes supported. 388*01489e5dSAlfredo Cardigliano * @npts_per_lif: Page table size per lif 389*01489e5dSAlfredo Cardigliano * @nmrs_per_lif: Number of memory regions per lif 390*01489e5dSAlfredo Cardigliano * @nahs_per_lif: Number of address handles per lif 391*01489e5dSAlfredo Cardigliano * @max_stride: Max work request stride. 392*01489e5dSAlfredo Cardigliano * @cl_stride: Cache line stride. 393*01489e5dSAlfredo Cardigliano * @pte_stride: Page table entry stride. 394*01489e5dSAlfredo Cardigliano * @rrq_stride: Remote RQ work request stride. 395*01489e5dSAlfredo Cardigliano * @rsq_stride: Remote SQ work request stride. 396*01489e5dSAlfredo Cardigliano * @dcqcn_profiles: Number of DCQCN profiles 397*01489e5dSAlfredo Cardigliano * @aq_qtype: RDMA Admin Qtype. 398*01489e5dSAlfredo Cardigliano * @sq_qtype: RDMA Send Qtype. 399*01489e5dSAlfredo Cardigliano * @rq_qtype: RDMA Receive Qtype. 400*01489e5dSAlfredo Cardigliano * @cq_qtype: RDMA Completion Qtype. 401*01489e5dSAlfredo Cardigliano * @eq_qtype: RDMA Event Qtype. 402*01489e5dSAlfredo Cardigliano */ 403*01489e5dSAlfredo Cardigliano union ionic_lif_identity { 404*01489e5dSAlfredo Cardigliano struct { 405*01489e5dSAlfredo Cardigliano __le64 capabilities; 406*01489e5dSAlfredo Cardigliano 407*01489e5dSAlfredo Cardigliano struct { 408*01489e5dSAlfredo Cardigliano u8 version; 409*01489e5dSAlfredo Cardigliano u8 rsvd[3]; 410*01489e5dSAlfredo Cardigliano __le32 max_ucast_filters; 411*01489e5dSAlfredo Cardigliano __le32 max_mcast_filters; 412*01489e5dSAlfredo Cardigliano __le16 rss_ind_tbl_sz; 413*01489e5dSAlfredo Cardigliano __le32 min_frame_size; 414*01489e5dSAlfredo Cardigliano __le32 max_frame_size; 415*01489e5dSAlfredo Cardigliano u8 rsvd2[106]; 416*01489e5dSAlfredo Cardigliano union ionic_lif_config config; 417*01489e5dSAlfredo Cardigliano } eth; 418*01489e5dSAlfredo Cardigliano 419*01489e5dSAlfredo Cardigliano struct { 420*01489e5dSAlfredo Cardigliano u8 version; 421*01489e5dSAlfredo Cardigliano u8 qp_opcodes; 422*01489e5dSAlfredo Cardigliano u8 admin_opcodes; 423*01489e5dSAlfredo Cardigliano u8 rsvd; 424*01489e5dSAlfredo Cardigliano __le32 npts_per_lif; 425*01489e5dSAlfredo Cardigliano __le32 nmrs_per_lif; 426*01489e5dSAlfredo Cardigliano __le32 nahs_per_lif; 427*01489e5dSAlfredo Cardigliano u8 max_stride; 428*01489e5dSAlfredo Cardigliano u8 cl_stride; 429*01489e5dSAlfredo Cardigliano u8 pte_stride; 430*01489e5dSAlfredo Cardigliano u8 rrq_stride; 431*01489e5dSAlfredo Cardigliano u8 rsq_stride; 432*01489e5dSAlfredo Cardigliano u8 dcqcn_profiles; 433*01489e5dSAlfredo Cardigliano u8 rsvd_dimensions[10]; 434*01489e5dSAlfredo Cardigliano struct ionic_lif_logical_qtype aq_qtype; 435*01489e5dSAlfredo Cardigliano struct ionic_lif_logical_qtype sq_qtype; 436*01489e5dSAlfredo Cardigliano struct ionic_lif_logical_qtype rq_qtype; 437*01489e5dSAlfredo Cardigliano struct ionic_lif_logical_qtype cq_qtype; 438*01489e5dSAlfredo Cardigliano struct ionic_lif_logical_qtype eq_qtype; 439*01489e5dSAlfredo Cardigliano } rdma; 440*01489e5dSAlfredo Cardigliano }; 441*01489e5dSAlfredo Cardigliano __le32 words[512]; 442*01489e5dSAlfredo Cardigliano }; 443*01489e5dSAlfredo Cardigliano 444*01489e5dSAlfredo Cardigliano /** 445*01489e5dSAlfredo Cardigliano * struct ionic_lif_init_cmd - LIF init command 446*01489e5dSAlfredo Cardigliano * @opcode: opcode 447*01489e5dSAlfredo Cardigliano * @type: LIF type (enum lif_type) 448*01489e5dSAlfredo Cardigliano * @index: LIF index 449*01489e5dSAlfredo Cardigliano * @info_pa: destination address for lif info (struct ionic_lif_info) 450*01489e5dSAlfredo Cardigliano */ 451*01489e5dSAlfredo Cardigliano struct ionic_lif_init_cmd { 452*01489e5dSAlfredo Cardigliano u8 opcode; 453*01489e5dSAlfredo Cardigliano u8 type; 454*01489e5dSAlfredo Cardigliano __le16 index; 455*01489e5dSAlfredo Cardigliano __le32 rsvd; 456*01489e5dSAlfredo Cardigliano __le64 info_pa; 457*01489e5dSAlfredo Cardigliano u8 rsvd2[48]; 458*01489e5dSAlfredo Cardigliano }; 459*01489e5dSAlfredo Cardigliano 460*01489e5dSAlfredo Cardigliano /** 461*01489e5dSAlfredo Cardigliano * struct ionic_lif_init_comp - LIF init command completion 462*01489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 463*01489e5dSAlfredo Cardigliano */ 464*01489e5dSAlfredo Cardigliano struct ionic_lif_init_comp { 465*01489e5dSAlfredo Cardigliano u8 status; 466*01489e5dSAlfredo Cardigliano u8 rsvd; 467*01489e5dSAlfredo Cardigliano __le16 hw_index; 468*01489e5dSAlfredo Cardigliano u8 rsvd2[12]; 469*01489e5dSAlfredo Cardigliano }; 470*01489e5dSAlfredo Cardigliano 471*01489e5dSAlfredo Cardigliano /** 472*01489e5dSAlfredo Cardigliano * struct ionic_q_init_cmd - Queue init command 473*01489e5dSAlfredo Cardigliano * @opcode: opcode 474*01489e5dSAlfredo Cardigliano * @type: Logical queue type 475*01489e5dSAlfredo Cardigliano * @ver: Queue version (defines opcode/descriptor scope) 476*01489e5dSAlfredo Cardigliano * @lif_index: LIF index 477*01489e5dSAlfredo Cardigliano * @index: (lif, qtype) relative admin queue index 478*01489e5dSAlfredo Cardigliano * @intr_index: Interrupt control register index 479*01489e5dSAlfredo Cardigliano * @pid: Process ID 480*01489e5dSAlfredo Cardigliano * @flags: 481*01489e5dSAlfredo Cardigliano * IRQ: Interrupt requested on completion 482*01489e5dSAlfredo Cardigliano * ENA: Enable the queue. If ENA=0 the queue is initialized 483*01489e5dSAlfredo Cardigliano * but remains disabled, to be later enabled with the 484*01489e5dSAlfredo Cardigliano * Queue Enable command. If ENA=1, then queue is 485*01489e5dSAlfredo Cardigliano * initialized and then enabled. 486*01489e5dSAlfredo Cardigliano * SG: Enable Scatter-Gather on the queue. 487*01489e5dSAlfredo Cardigliano * in number of descs. The actual ring size is 488*01489e5dSAlfredo Cardigliano * (1 << ring_size). For example, to 489*01489e5dSAlfredo Cardigliano * select a ring size of 64 descriptors write 490*01489e5dSAlfredo Cardigliano * ring_size = 6. The minimum ring_size value is 2 491*01489e5dSAlfredo Cardigliano * for a ring size of 4 descriptors. The maximum 492*01489e5dSAlfredo Cardigliano * ring_size value is 16 for a ring size of 64k 493*01489e5dSAlfredo Cardigliano * descriptors. Values of ring_size <2 and >16 are 494*01489e5dSAlfredo Cardigliano * reserved. 495*01489e5dSAlfredo Cardigliano * EQ: Enable the Event Queue 496*01489e5dSAlfredo Cardigliano * @cos: Class of service for this queue. 497*01489e5dSAlfredo Cardigliano * @ring_size: Queue ring size, encoded as a log2(size) 498*01489e5dSAlfredo Cardigliano * @ring_base: Queue ring base address 499*01489e5dSAlfredo Cardigliano * @cq_ring_base: Completion queue ring base address 500*01489e5dSAlfredo Cardigliano * @sg_ring_base: Scatter/Gather ring base address 501*01489e5dSAlfredo Cardigliano * @eq_index: Event queue index 502*01489e5dSAlfredo Cardigliano */ 503*01489e5dSAlfredo Cardigliano struct ionic_q_init_cmd { 504*01489e5dSAlfredo Cardigliano u8 opcode; 505*01489e5dSAlfredo Cardigliano u8 rsvd; 506*01489e5dSAlfredo Cardigliano __le16 lif_index; 507*01489e5dSAlfredo Cardigliano u8 type; 508*01489e5dSAlfredo Cardigliano u8 ver; 509*01489e5dSAlfredo Cardigliano u8 rsvd1[2]; 510*01489e5dSAlfredo Cardigliano __le32 index; 511*01489e5dSAlfredo Cardigliano __le16 pid; 512*01489e5dSAlfredo Cardigliano __le16 intr_index; 513*01489e5dSAlfredo Cardigliano __le16 flags; 514*01489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_IRQ 0x01 /* Request interrupt on completion */ 515*01489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_ENA 0x02 /* Enable the queue */ 516*01489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_SG 0x04 /* Enable scatter/gather on the queue */ 517*01489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_EQ 0x08 /* Enable event queue */ 518*01489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_DEBUG 0x80 /* Enable queue debugging */ 519*01489e5dSAlfredo Cardigliano u8 cos; 520*01489e5dSAlfredo Cardigliano u8 ring_size; 521*01489e5dSAlfredo Cardigliano __le64 ring_base; 522*01489e5dSAlfredo Cardigliano __le64 cq_ring_base; 523*01489e5dSAlfredo Cardigliano __le64 sg_ring_base; 524*01489e5dSAlfredo Cardigliano __le32 eq_index; 525*01489e5dSAlfredo Cardigliano u8 rsvd2[16]; 526*01489e5dSAlfredo Cardigliano }; 527*01489e5dSAlfredo Cardigliano 528*01489e5dSAlfredo Cardigliano /** 529*01489e5dSAlfredo Cardigliano * struct ionic_q_init_comp - Queue init command completion 530*01489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 531*01489e5dSAlfredo Cardigliano * @ver: Queue version (defines opcode/descriptor scope) 532*01489e5dSAlfredo Cardigliano * @comp_index: The index in the descriptor ring for which this 533*01489e5dSAlfredo Cardigliano * is the completion. 534*01489e5dSAlfredo Cardigliano * @hw_index: Hardware Queue ID 535*01489e5dSAlfredo Cardigliano * @hw_type: Hardware Queue type 536*01489e5dSAlfredo Cardigliano * @color: Color 537*01489e5dSAlfredo Cardigliano */ 538*01489e5dSAlfredo Cardigliano struct ionic_q_init_comp { 539*01489e5dSAlfredo Cardigliano u8 status; 540*01489e5dSAlfredo Cardigliano u8 ver; 541*01489e5dSAlfredo Cardigliano __le16 comp_index; 542*01489e5dSAlfredo Cardigliano __le32 hw_index; 543*01489e5dSAlfredo Cardigliano u8 hw_type; 544*01489e5dSAlfredo Cardigliano u8 rsvd2[6]; 545*01489e5dSAlfredo Cardigliano u8 color; 546*01489e5dSAlfredo Cardigliano }; 547*01489e5dSAlfredo Cardigliano 548*01489e5dSAlfredo Cardigliano /* the device's internal addressing uses up to 52 bits */ 549*01489e5dSAlfredo Cardigliano #define IONIC_ADDR_LEN 52 550*01489e5dSAlfredo Cardigliano #define IONIC_ADDR_MASK (BIT_ULL(IONIC_ADDR_LEN) - 1) 551*01489e5dSAlfredo Cardigliano 552*01489e5dSAlfredo Cardigliano enum ionic_txq_desc_opcode { 553*01489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_OPCODE_CSUM_NONE = 0, 554*01489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_OPCODE_CSUM_PARTIAL = 1, 555*01489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_OPCODE_CSUM_HW = 2, 556*01489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_OPCODE_TSO = 3, 557*01489e5dSAlfredo Cardigliano }; 558*01489e5dSAlfredo Cardigliano 559*01489e5dSAlfredo Cardigliano /** 560*01489e5dSAlfredo Cardigliano * struct ionic_txq_desc - Ethernet Tx queue descriptor format 561*01489e5dSAlfredo Cardigliano * @opcode: Tx operation, see TXQ_DESC_OPCODE_*: 562*01489e5dSAlfredo Cardigliano * 563*01489e5dSAlfredo Cardigliano * IONIC_TXQ_DESC_OPCODE_CSUM_NONE: 564*01489e5dSAlfredo Cardigliano * 565*01489e5dSAlfredo Cardigliano * Non-offload send. No segmentation, 566*01489e5dSAlfredo Cardigliano * fragmentation or checksum calc/insertion is 567*01489e5dSAlfredo Cardigliano * performed by device; packet is prepared 568*01489e5dSAlfredo Cardigliano * to send by software stack and requires 569*01489e5dSAlfredo Cardigliano * no further manipulation from device. 570*01489e5dSAlfredo Cardigliano * 571*01489e5dSAlfredo Cardigliano * IONIC_TXQ_DESC_OPCODE_CSUM_PARTIAL: 572*01489e5dSAlfredo Cardigliano * 573*01489e5dSAlfredo Cardigliano * Offload 16-bit L4 checksum 574*01489e5dSAlfredo Cardigliano * calculation/insertion. The device will 575*01489e5dSAlfredo Cardigliano * calculate the L4 checksum value and 576*01489e5dSAlfredo Cardigliano * insert the result in the packet's L4 577*01489e5dSAlfredo Cardigliano * header checksum field. The L4 checksum 578*01489e5dSAlfredo Cardigliano * is calculated starting at @csum_start bytes 579*01489e5dSAlfredo Cardigliano * into the packet to the end of the packet. 580*01489e5dSAlfredo Cardigliano * The checksum insertion position is given 581*01489e5dSAlfredo Cardigliano * in @csum_offset. This feature is only 582*01489e5dSAlfredo Cardigliano * applicable to protocols such as TCP, UDP 583*01489e5dSAlfredo Cardigliano * and ICMP where a standard (i.e. the 584*01489e5dSAlfredo Cardigliano * 'IP-style' checksum) one's complement 585*01489e5dSAlfredo Cardigliano * 16-bit checksum is used, using an IP 586*01489e5dSAlfredo Cardigliano * pseudo-header to seed the calculation. 587*01489e5dSAlfredo Cardigliano * Software will preload the L4 checksum 588*01489e5dSAlfredo Cardigliano * field with the IP pseudo-header checksum. 589*01489e5dSAlfredo Cardigliano * 590*01489e5dSAlfredo Cardigliano * For tunnel encapsulation, @csum_start and 591*01489e5dSAlfredo Cardigliano * @csum_offset refer to the inner L4 592*01489e5dSAlfredo Cardigliano * header. Supported tunnels encapsulations 593*01489e5dSAlfredo Cardigliano * are: IPIP, GRE, and UDP. If the @encap 594*01489e5dSAlfredo Cardigliano * is clear, no further processing by the 595*01489e5dSAlfredo Cardigliano * device is required; software will 596*01489e5dSAlfredo Cardigliano * calculate the outer header checksums. If 597*01489e5dSAlfredo Cardigliano * the @encap is set, the device will 598*01489e5dSAlfredo Cardigliano * offload the outer header checksums using 599*01489e5dSAlfredo Cardigliano * LCO (local checksum offload) (see 600*01489e5dSAlfredo Cardigliano * Documentation/networking/checksum- 601*01489e5dSAlfredo Cardigliano * offloads.txt for more info). 602*01489e5dSAlfredo Cardigliano * 603*01489e5dSAlfredo Cardigliano * IONIC_TXQ_DESC_OPCODE_CSUM_HW: 604*01489e5dSAlfredo Cardigliano * 605*01489e5dSAlfredo Cardigliano * Offload 16-bit checksum computation to hardware. 606*01489e5dSAlfredo Cardigliano * If @csum_l3 is set then the packet's L3 checksum is 607*01489e5dSAlfredo Cardigliano * updated. Similarly, if @csum_l4 is set the the L4 608*01489e5dSAlfredo Cardigliano * checksum is updated. If @encap is set then encap header 609*01489e5dSAlfredo Cardigliano * checksums are also updated. 610*01489e5dSAlfredo Cardigliano * 611*01489e5dSAlfredo Cardigliano * IONIC_TXQ_DESC_OPCODE_TSO: 612*01489e5dSAlfredo Cardigliano * 613*01489e5dSAlfredo Cardigliano * Device performs TCP segmentation offload 614*01489e5dSAlfredo Cardigliano * (TSO). @hdr_len is the number of bytes 615*01489e5dSAlfredo Cardigliano * to the end of TCP header (the offset to 616*01489e5dSAlfredo Cardigliano * the TCP payload). @mss is the desired 617*01489e5dSAlfredo Cardigliano * MSS, the TCP payload length for each 618*01489e5dSAlfredo Cardigliano * segment. The device will calculate/ 619*01489e5dSAlfredo Cardigliano * insert IP (IPv4 only) and TCP checksums 620*01489e5dSAlfredo Cardigliano * for each segment. In the first data 621*01489e5dSAlfredo Cardigliano * buffer containing the header template, 622*01489e5dSAlfredo Cardigliano * the driver will set IPv4 checksum to 0 623*01489e5dSAlfredo Cardigliano * and preload TCP checksum with the IP 624*01489e5dSAlfredo Cardigliano * pseudo header calculated with IP length = 0. 625*01489e5dSAlfredo Cardigliano * 626*01489e5dSAlfredo Cardigliano * Supported tunnel encapsulations are IPIP, 627*01489e5dSAlfredo Cardigliano * layer-3 GRE, and UDP. @hdr_len includes 628*01489e5dSAlfredo Cardigliano * both outer and inner headers. The driver 629*01489e5dSAlfredo Cardigliano * will set IPv4 checksum to zero and 630*01489e5dSAlfredo Cardigliano * preload TCP checksum with IP pseudo 631*01489e5dSAlfredo Cardigliano * header on the inner header. 632*01489e5dSAlfredo Cardigliano * 633*01489e5dSAlfredo Cardigliano * TCP ECN offload is supported. The device 634*01489e5dSAlfredo Cardigliano * will set CWR flag in the first segment if 635*01489e5dSAlfredo Cardigliano * CWR is set in the template header, and 636*01489e5dSAlfredo Cardigliano * clear CWR in remaining segments. 637*01489e5dSAlfredo Cardigliano * @flags: 638*01489e5dSAlfredo Cardigliano * vlan: 639*01489e5dSAlfredo Cardigliano * Insert an L2 VLAN header using @vlan_tci. 640*01489e5dSAlfredo Cardigliano * encap: 641*01489e5dSAlfredo Cardigliano * Calculate encap header checksum. 642*01489e5dSAlfredo Cardigliano * csum_l3: 643*01489e5dSAlfredo Cardigliano * Compute L3 header checksum. 644*01489e5dSAlfredo Cardigliano * csum_l4: 645*01489e5dSAlfredo Cardigliano * Compute L4 header checksum. 646*01489e5dSAlfredo Cardigliano * tso_sot: 647*01489e5dSAlfredo Cardigliano * TSO start 648*01489e5dSAlfredo Cardigliano * tso_eot: 649*01489e5dSAlfredo Cardigliano * TSO end 650*01489e5dSAlfredo Cardigliano * @num_sg_elems: Number of scatter-gather elements in SG 651*01489e5dSAlfredo Cardigliano * descriptor 652*01489e5dSAlfredo Cardigliano * @addr: First data buffer's DMA address. 653*01489e5dSAlfredo Cardigliano * (Subsequent data buffers are on txq_sg_desc). 654*01489e5dSAlfredo Cardigliano * @len: First data buffer's length, in bytes 655*01489e5dSAlfredo Cardigliano * @vlan_tci: VLAN tag to insert in the packet (if requested 656*01489e5dSAlfredo Cardigliano * by @V-bit). Includes .1p and .1q tags 657*01489e5dSAlfredo Cardigliano * @hdr_len: Length of packet headers, including 658*01489e5dSAlfredo Cardigliano * encapsulating outer header, if applicable. 659*01489e5dSAlfredo Cardigliano * Valid for opcodes TXQ_DESC_OPCODE_CALC_CSUM and 660*01489e5dSAlfredo Cardigliano * TXQ_DESC_OPCODE_TSO. Should be set to zero for 661*01489e5dSAlfredo Cardigliano * all other modes. For 662*01489e5dSAlfredo Cardigliano * TXQ_DESC_OPCODE_CALC_CSUM, @hdr_len is length 663*01489e5dSAlfredo Cardigliano * of headers up to inner-most L4 header. For 664*01489e5dSAlfredo Cardigliano * TXQ_DESC_OPCODE_TSO, @hdr_len is up to 665*01489e5dSAlfredo Cardigliano * inner-most L4 payload, so inclusive of 666*01489e5dSAlfredo Cardigliano * inner-most L4 header. 667*01489e5dSAlfredo Cardigliano * @mss: Desired MSS value for TSO. Only applicable for 668*01489e5dSAlfredo Cardigliano * TXQ_DESC_OPCODE_TSO. 669*01489e5dSAlfredo Cardigliano * @csum_start: Offset into inner-most L3 header of checksum 670*01489e5dSAlfredo Cardigliano * @csum_offset: Offset into inner-most L4 header of checksum 671*01489e5dSAlfredo Cardigliano */ 672*01489e5dSAlfredo Cardigliano 673*01489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_OPCODE_MASK 0xf 674*01489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_OPCODE_SHIFT 4 675*01489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAGS_MASK 0xf 676*01489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAGS_SHIFT 0 677*01489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_NSGE_MASK 0xf 678*01489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_NSGE_SHIFT 8 679*01489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_ADDR_MASK (BIT_ULL(IONIC_ADDR_LEN) - 1) 680*01489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_ADDR_SHIFT 12 681*01489e5dSAlfredo Cardigliano 682*01489e5dSAlfredo Cardigliano /* common flags */ 683*01489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_VLAN 0x1 684*01489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_ENCAP 0x2 685*01489e5dSAlfredo Cardigliano 686*01489e5dSAlfredo Cardigliano /* flags for csum_hw opcode */ 687*01489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_CSUM_L3 0x4 688*01489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_CSUM_L4 0x8 689*01489e5dSAlfredo Cardigliano 690*01489e5dSAlfredo Cardigliano /* flags for tso opcode */ 691*01489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_TSO_SOT 0x4 692*01489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_TSO_EOT 0x8 693*01489e5dSAlfredo Cardigliano 694*01489e5dSAlfredo Cardigliano struct ionic_txq_desc { 695*01489e5dSAlfredo Cardigliano __le64 cmd; 696*01489e5dSAlfredo Cardigliano __le16 len; 697*01489e5dSAlfredo Cardigliano union { 698*01489e5dSAlfredo Cardigliano __le16 vlan_tci; 699*01489e5dSAlfredo Cardigliano __le16 hword0; 700*01489e5dSAlfredo Cardigliano }; 701*01489e5dSAlfredo Cardigliano union { 702*01489e5dSAlfredo Cardigliano __le16 csum_start; 703*01489e5dSAlfredo Cardigliano __le16 hdr_len; 704*01489e5dSAlfredo Cardigliano __le16 hword1; 705*01489e5dSAlfredo Cardigliano }; 706*01489e5dSAlfredo Cardigliano union { 707*01489e5dSAlfredo Cardigliano __le16 csum_offset; 708*01489e5dSAlfredo Cardigliano __le16 mss; 709*01489e5dSAlfredo Cardigliano __le16 hword2; 710*01489e5dSAlfredo Cardigliano }; 711*01489e5dSAlfredo Cardigliano }; 712*01489e5dSAlfredo Cardigliano 713*01489e5dSAlfredo Cardigliano static inline u64 encode_txq_desc_cmd(u8 opcode, u8 flags, 714*01489e5dSAlfredo Cardigliano u8 nsge, u64 addr) 715*01489e5dSAlfredo Cardigliano { 716*01489e5dSAlfredo Cardigliano u64 cmd; 717*01489e5dSAlfredo Cardigliano 718*01489e5dSAlfredo Cardigliano cmd = (opcode & IONIC_TXQ_DESC_OPCODE_MASK) << 719*01489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_OPCODE_SHIFT; 720*01489e5dSAlfredo Cardigliano cmd |= (flags & IONIC_TXQ_DESC_FLAGS_MASK) << 721*01489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_FLAGS_SHIFT; 722*01489e5dSAlfredo Cardigliano cmd |= (nsge & IONIC_TXQ_DESC_NSGE_MASK) << IONIC_TXQ_DESC_NSGE_SHIFT; 723*01489e5dSAlfredo Cardigliano cmd |= (addr & IONIC_TXQ_DESC_ADDR_MASK) << IONIC_TXQ_DESC_ADDR_SHIFT; 724*01489e5dSAlfredo Cardigliano 725*01489e5dSAlfredo Cardigliano return cmd; 726*01489e5dSAlfredo Cardigliano }; 727*01489e5dSAlfredo Cardigliano 728*01489e5dSAlfredo Cardigliano static inline void decode_txq_desc_cmd(u64 cmd, u8 *opcode, u8 *flags, 729*01489e5dSAlfredo Cardigliano u8 *nsge, u64 *addr) 730*01489e5dSAlfredo Cardigliano { 731*01489e5dSAlfredo Cardigliano *opcode = (cmd >> IONIC_TXQ_DESC_OPCODE_SHIFT) & 732*01489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_OPCODE_MASK; 733*01489e5dSAlfredo Cardigliano *flags = (cmd >> IONIC_TXQ_DESC_FLAGS_SHIFT) & 734*01489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_FLAGS_MASK; 735*01489e5dSAlfredo Cardigliano *nsge = (cmd >> IONIC_TXQ_DESC_NSGE_SHIFT) & IONIC_TXQ_DESC_NSGE_MASK; 736*01489e5dSAlfredo Cardigliano *addr = (cmd >> IONIC_TXQ_DESC_ADDR_SHIFT) & IONIC_TXQ_DESC_ADDR_MASK; 737*01489e5dSAlfredo Cardigliano }; 738*01489e5dSAlfredo Cardigliano 739*01489e5dSAlfredo Cardigliano #define IONIC_TX_MAX_SG_ELEMS 8 740*01489e5dSAlfredo Cardigliano #define IONIC_RX_MAX_SG_ELEMS 8 741*01489e5dSAlfredo Cardigliano 742*01489e5dSAlfredo Cardigliano /** 743*01489e5dSAlfredo Cardigliano * struct ionic_txq_sg_desc - Transmit scatter-gather (SG) list 744*01489e5dSAlfredo Cardigliano * @addr: DMA address of SG element data buffer 745*01489e5dSAlfredo Cardigliano * @len: Length of SG element data buffer, in bytes 746*01489e5dSAlfredo Cardigliano */ 747*01489e5dSAlfredo Cardigliano struct ionic_txq_sg_desc { 748*01489e5dSAlfredo Cardigliano struct ionic_txq_sg_elem { 749*01489e5dSAlfredo Cardigliano __le64 addr; 750*01489e5dSAlfredo Cardigliano __le16 len; 751*01489e5dSAlfredo Cardigliano __le16 rsvd[3]; 752*01489e5dSAlfredo Cardigliano } elems[IONIC_TX_MAX_SG_ELEMS]; 753*01489e5dSAlfredo Cardigliano }; 754*01489e5dSAlfredo Cardigliano 755*01489e5dSAlfredo Cardigliano /** 756*01489e5dSAlfredo Cardigliano * struct ionic_txq_comp - Ethernet transmit queue completion descriptor 757*01489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 758*01489e5dSAlfredo Cardigliano * @comp_index: The index in the descriptor ring for which this 759*01489e5dSAlfredo Cardigliano * is the completion. 760*01489e5dSAlfredo Cardigliano * @color: Color bit. 761*01489e5dSAlfredo Cardigliano */ 762*01489e5dSAlfredo Cardigliano struct ionic_txq_comp { 763*01489e5dSAlfredo Cardigliano u8 status; 764*01489e5dSAlfredo Cardigliano u8 rsvd; 765*01489e5dSAlfredo Cardigliano __le16 comp_index; 766*01489e5dSAlfredo Cardigliano u8 rsvd2[11]; 767*01489e5dSAlfredo Cardigliano u8 color; 768*01489e5dSAlfredo Cardigliano }; 769*01489e5dSAlfredo Cardigliano 770*01489e5dSAlfredo Cardigliano enum ionic_rxq_desc_opcode { 771*01489e5dSAlfredo Cardigliano IONIC_RXQ_DESC_OPCODE_SIMPLE = 0, 772*01489e5dSAlfredo Cardigliano IONIC_RXQ_DESC_OPCODE_SG = 1, 773*01489e5dSAlfredo Cardigliano }; 774*01489e5dSAlfredo Cardigliano 775*01489e5dSAlfredo Cardigliano /** 776*01489e5dSAlfredo Cardigliano * struct ionic_rxq_desc - Ethernet Rx queue descriptor format 777*01489e5dSAlfredo Cardigliano * @opcode: Rx operation, see RXQ_DESC_OPCODE_*: 778*01489e5dSAlfredo Cardigliano * 779*01489e5dSAlfredo Cardigliano * RXQ_DESC_OPCODE_SIMPLE: 780*01489e5dSAlfredo Cardigliano * 781*01489e5dSAlfredo Cardigliano * Receive full packet into data buffer 782*01489e5dSAlfredo Cardigliano * starting at @addr. Results of 783*01489e5dSAlfredo Cardigliano * receive, including actual bytes received, 784*01489e5dSAlfredo Cardigliano * are recorded in Rx completion descriptor. 785*01489e5dSAlfredo Cardigliano * 786*01489e5dSAlfredo Cardigliano * @len: Data buffer's length, in bytes. 787*01489e5dSAlfredo Cardigliano * @addr: Data buffer's DMA address 788*01489e5dSAlfredo Cardigliano */ 789*01489e5dSAlfredo Cardigliano struct ionic_rxq_desc { 790*01489e5dSAlfredo Cardigliano u8 opcode; 791*01489e5dSAlfredo Cardigliano u8 rsvd[5]; 792*01489e5dSAlfredo Cardigliano __le16 len; 793*01489e5dSAlfredo Cardigliano __le64 addr; 794*01489e5dSAlfredo Cardigliano }; 795*01489e5dSAlfredo Cardigliano 796*01489e5dSAlfredo Cardigliano /** 797*01489e5dSAlfredo Cardigliano * struct ionic_rxq_sg_desc - Receive scatter-gather (SG) list 798*01489e5dSAlfredo Cardigliano * @addr: DMA address of SG element data buffer 799*01489e5dSAlfredo Cardigliano * @len: Length of SG element data buffer, in bytes 800*01489e5dSAlfredo Cardigliano */ 801*01489e5dSAlfredo Cardigliano struct ionic_rxq_sg_desc { 802*01489e5dSAlfredo Cardigliano struct ionic_rxq_sg_elem { 803*01489e5dSAlfredo Cardigliano __le64 addr; 804*01489e5dSAlfredo Cardigliano __le16 len; 805*01489e5dSAlfredo Cardigliano __le16 rsvd[3]; 806*01489e5dSAlfredo Cardigliano } elems[IONIC_RX_MAX_SG_ELEMS]; 807*01489e5dSAlfredo Cardigliano }; 808*01489e5dSAlfredo Cardigliano 809*01489e5dSAlfredo Cardigliano /** 810*01489e5dSAlfredo Cardigliano * struct ionic_rxq_comp - Ethernet receive queue completion descriptor 811*01489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 812*01489e5dSAlfredo Cardigliano * @num_sg_elems: Number of SG elements used by this descriptor 813*01489e5dSAlfredo Cardigliano * @comp_index: The index in the descriptor ring for which this 814*01489e5dSAlfredo Cardigliano * is the completion. 815*01489e5dSAlfredo Cardigliano * @rss_hash: 32-bit RSS hash 816*01489e5dSAlfredo Cardigliano * @csum: 16-bit sum of the packet's L2 payload. 817*01489e5dSAlfredo Cardigliano * If the packet's L2 payload is odd length, an extra 818*01489e5dSAlfredo Cardigliano * zero-value byte is included in the @csum calculation but 819*01489e5dSAlfredo Cardigliano * not included in @len. 820*01489e5dSAlfredo Cardigliano * @vlan_tci: VLAN tag stripped from the packet. Valid if @VLAN is 821*01489e5dSAlfredo Cardigliano * set. Includes .1p and .1q tags. 822*01489e5dSAlfredo Cardigliano * @len: Received packet length, in bytes. Excludes FCS. 823*01489e5dSAlfredo Cardigliano * @csum_calc L2 payload checksum is computed or not 824*01489e5dSAlfredo Cardigliano * @csum_tcp_ok: The TCP checksum calculated by the device 825*01489e5dSAlfredo Cardigliano * matched the checksum in the receive packet's 826*01489e5dSAlfredo Cardigliano * TCP header 827*01489e5dSAlfredo Cardigliano * @csum_tcp_bad: The TCP checksum calculated by the device did 828*01489e5dSAlfredo Cardigliano * not match the checksum in the receive packet's 829*01489e5dSAlfredo Cardigliano * TCP header. 830*01489e5dSAlfredo Cardigliano * @csum_udp_ok: The UDP checksum calculated by the device 831*01489e5dSAlfredo Cardigliano * matched the checksum in the receive packet's 832*01489e5dSAlfredo Cardigliano * UDP header 833*01489e5dSAlfredo Cardigliano * @csum_udp_bad: The UDP checksum calculated by the device did 834*01489e5dSAlfredo Cardigliano * not match the checksum in the receive packet's 835*01489e5dSAlfredo Cardigliano * UDP header. 836*01489e5dSAlfredo Cardigliano * @csum_ip_ok: The IPv4 checksum calculated by the device 837*01489e5dSAlfredo Cardigliano * matched the checksum in the receive packet's 838*01489e5dSAlfredo Cardigliano * first IPv4 header. If the receive packet 839*01489e5dSAlfredo Cardigliano * contains both a tunnel IPv4 header and a 840*01489e5dSAlfredo Cardigliano * transport IPv4 header, the device validates the 841*01489e5dSAlfredo Cardigliano * checksum for the both IPv4 headers. 842*01489e5dSAlfredo Cardigliano * @csum_ip_bad: The IPv4 checksum calculated by the device did 843*01489e5dSAlfredo Cardigliano * not match the checksum in the receive packet's 844*01489e5dSAlfredo Cardigliano * first IPv4 header. If the receive packet 845*01489e5dSAlfredo Cardigliano * contains both a tunnel IPv4 header and a 846*01489e5dSAlfredo Cardigliano * transport IPv4 header, the device validates the 847*01489e5dSAlfredo Cardigliano * checksum for both IP headers. 848*01489e5dSAlfredo Cardigliano * @VLAN: VLAN header was stripped and placed in @vlan_tci. 849*01489e5dSAlfredo Cardigliano * @pkt_type: Packet type 850*01489e5dSAlfredo Cardigliano * @color: Color bit. 851*01489e5dSAlfredo Cardigliano */ 852*01489e5dSAlfredo Cardigliano struct ionic_rxq_comp { 853*01489e5dSAlfredo Cardigliano u8 status; 854*01489e5dSAlfredo Cardigliano u8 num_sg_elems; 855*01489e5dSAlfredo Cardigliano __le16 comp_index; 856*01489e5dSAlfredo Cardigliano __le32 rss_hash; 857*01489e5dSAlfredo Cardigliano __le16 csum; 858*01489e5dSAlfredo Cardigliano __le16 vlan_tci; 859*01489e5dSAlfredo Cardigliano __le16 len; 860*01489e5dSAlfredo Cardigliano u8 csum_flags; 861*01489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_TCP_OK 0x01 862*01489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_TCP_BAD 0x02 863*01489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_UDP_OK 0x04 864*01489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_UDP_BAD 0x08 865*01489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_IP_OK 0x10 866*01489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_IP_BAD 0x20 867*01489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_VLAN 0x40 868*01489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_CALC 0x80 869*01489e5dSAlfredo Cardigliano u8 pkt_type_color; 870*01489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_PKT_TYPE_MASK 0x0f 871*01489e5dSAlfredo Cardigliano }; 872*01489e5dSAlfredo Cardigliano 873*01489e5dSAlfredo Cardigliano enum ionic_pkt_type { 874*01489e5dSAlfredo Cardigliano IONIC_PKT_TYPE_NON_IP = 0x000, 875*01489e5dSAlfredo Cardigliano IONIC_PKT_TYPE_IPV4 = 0x001, 876*01489e5dSAlfredo Cardigliano IONIC_PKT_TYPE_IPV4_TCP = 0x003, 877*01489e5dSAlfredo Cardigliano IONIC_PKT_TYPE_IPV4_UDP = 0x005, 878*01489e5dSAlfredo Cardigliano IONIC_PKT_TYPE_IPV6 = 0x008, 879*01489e5dSAlfredo Cardigliano IONIC_PKT_TYPE_IPV6_TCP = 0x018, 880*01489e5dSAlfredo Cardigliano IONIC_PKT_TYPE_IPV6_UDP = 0x028, 881*01489e5dSAlfredo Cardigliano }; 882*01489e5dSAlfredo Cardigliano 883*01489e5dSAlfredo Cardigliano enum ionic_eth_hw_features { 884*01489e5dSAlfredo Cardigliano IONIC_ETH_HW_VLAN_TX_TAG = BIT(0), 885*01489e5dSAlfredo Cardigliano IONIC_ETH_HW_VLAN_RX_STRIP = BIT(1), 886*01489e5dSAlfredo Cardigliano IONIC_ETH_HW_VLAN_RX_FILTER = BIT(2), 887*01489e5dSAlfredo Cardigliano IONIC_ETH_HW_RX_HASH = BIT(3), 888*01489e5dSAlfredo Cardigliano IONIC_ETH_HW_RX_CSUM = BIT(4), 889*01489e5dSAlfredo Cardigliano IONIC_ETH_HW_TX_SG = BIT(5), 890*01489e5dSAlfredo Cardigliano IONIC_ETH_HW_RX_SG = BIT(6), 891*01489e5dSAlfredo Cardigliano IONIC_ETH_HW_TX_CSUM = BIT(7), 892*01489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO = BIT(8), 893*01489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_IPV6 = BIT(9), 894*01489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_ECN = BIT(10), 895*01489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_GRE = BIT(11), 896*01489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_GRE_CSUM = BIT(12), 897*01489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_IPXIP4 = BIT(13), 898*01489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_IPXIP6 = BIT(14), 899*01489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_UDP = BIT(15), 900*01489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_UDP_CSUM = BIT(16), 901*01489e5dSAlfredo Cardigliano }; 902*01489e5dSAlfredo Cardigliano 903*01489e5dSAlfredo Cardigliano /** 904*01489e5dSAlfredo Cardigliano * struct ionic_q_control_cmd - Queue control command 905*01489e5dSAlfredo Cardigliano * @opcode: opcode 906*01489e5dSAlfredo Cardigliano * @type: Queue type 907*01489e5dSAlfredo Cardigliano * @lif_index: LIF index 908*01489e5dSAlfredo Cardigliano * @index: Queue index 909*01489e5dSAlfredo Cardigliano * @oper: Operation (enum q_control_oper) 910*01489e5dSAlfredo Cardigliano */ 911*01489e5dSAlfredo Cardigliano struct ionic_q_control_cmd { 912*01489e5dSAlfredo Cardigliano u8 opcode; 913*01489e5dSAlfredo Cardigliano u8 type; 914*01489e5dSAlfredo Cardigliano __le16 lif_index; 915*01489e5dSAlfredo Cardigliano __le32 index; 916*01489e5dSAlfredo Cardigliano u8 oper; 917*01489e5dSAlfredo Cardigliano u8 rsvd[55]; 918*01489e5dSAlfredo Cardigliano }; 919*01489e5dSAlfredo Cardigliano 920*01489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_q_control_comp; 921*01489e5dSAlfredo Cardigliano 922*01489e5dSAlfredo Cardigliano enum q_control_oper { 923*01489e5dSAlfredo Cardigliano IONIC_Q_DISABLE = 0, 924*01489e5dSAlfredo Cardigliano IONIC_Q_ENABLE = 1, 925*01489e5dSAlfredo Cardigliano IONIC_Q_HANG_RESET = 2, 926*01489e5dSAlfredo Cardigliano }; 927*01489e5dSAlfredo Cardigliano 928*01489e5dSAlfredo Cardigliano /** 929*01489e5dSAlfredo Cardigliano * Physical connection type 930*01489e5dSAlfredo Cardigliano */ 931*01489e5dSAlfredo Cardigliano enum ionic_phy_type { 932*01489e5dSAlfredo Cardigliano IONIC_PHY_TYPE_NONE = 0, 933*01489e5dSAlfredo Cardigliano IONIC_PHY_TYPE_COPPER = 1, 934*01489e5dSAlfredo Cardigliano IONIC_PHY_TYPE_FIBER = 2, 935*01489e5dSAlfredo Cardigliano }; 936*01489e5dSAlfredo Cardigliano 937*01489e5dSAlfredo Cardigliano /** 938*01489e5dSAlfredo Cardigliano * Transceiver status 939*01489e5dSAlfredo Cardigliano */ 940*01489e5dSAlfredo Cardigliano enum ionic_xcvr_state { 941*01489e5dSAlfredo Cardigliano IONIC_XCVR_STATE_REMOVED = 0, 942*01489e5dSAlfredo Cardigliano IONIC_XCVR_STATE_INSERTED = 1, 943*01489e5dSAlfredo Cardigliano IONIC_XCVR_STATE_PENDING = 2, 944*01489e5dSAlfredo Cardigliano IONIC_XCVR_STATE_SPROM_READ = 3, 945*01489e5dSAlfredo Cardigliano IONIC_XCVR_STATE_SPROM_READ_ERR = 4, 946*01489e5dSAlfredo Cardigliano }; 947*01489e5dSAlfredo Cardigliano 948*01489e5dSAlfredo Cardigliano /** 949*01489e5dSAlfredo Cardigliano * Supported link modes 950*01489e5dSAlfredo Cardigliano */ 951*01489e5dSAlfredo Cardigliano enum ionic_xcvr_pid { 952*01489e5dSAlfredo Cardigliano IONIC_XCVR_PID_UNKNOWN = 0, 953*01489e5dSAlfredo Cardigliano 954*01489e5dSAlfredo Cardigliano /* CU */ 955*01489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_CR4 = 1, 956*01489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_40GBASE_CR4 = 2, 957*01489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_25GBASE_CR_S = 3, 958*01489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_25GBASE_CR_L = 4, 959*01489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_25GBASE_CR_N = 5, 960*01489e5dSAlfredo Cardigliano 961*01489e5dSAlfredo Cardigliano /* Fiber */ 962*01489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_AOC = 50, 963*01489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_ACC = 51, 964*01489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_SR4 = 52, 965*01489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_LR4 = 53, 966*01489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_ER4 = 54, 967*01489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_40GBASE_ER4 = 55, 968*01489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_40GBASE_SR4 = 56, 969*01489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_40GBASE_LR4 = 57, 970*01489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_40GBASE_AOC = 58, 971*01489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_25GBASE_SR = 59, 972*01489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_25GBASE_LR = 60, 973*01489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_25GBASE_ER = 61, 974*01489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_25GBASE_AOC = 62, 975*01489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_10GBASE_SR = 63, 976*01489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_10GBASE_LR = 64, 977*01489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_10GBASE_LRM = 65, 978*01489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_10GBASE_ER = 66, 979*01489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_10GBASE_AOC = 67, 980*01489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_10GBASE_CU = 68, 981*01489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_CWDM4 = 69, 982*01489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_PSM4 = 70, 983*01489e5dSAlfredo Cardigliano }; 984*01489e5dSAlfredo Cardigliano 985*01489e5dSAlfredo Cardigliano /** 986*01489e5dSAlfredo Cardigliano * Port types 987*01489e5dSAlfredo Cardigliano */ 988*01489e5dSAlfredo Cardigliano enum ionic_port_type { 989*01489e5dSAlfredo Cardigliano IONIC_PORT_TYPE_NONE = 0, /* port type not configured */ 990*01489e5dSAlfredo Cardigliano IONIC_PORT_TYPE_ETH = 1, /* port carries ethernet traffic (inband) */ 991*01489e5dSAlfredo Cardigliano IONIC_PORT_TYPE_MGMT = 2, /* port carries mgmt traffic (out-of-band) */ 992*01489e5dSAlfredo Cardigliano }; 993*01489e5dSAlfredo Cardigliano 994*01489e5dSAlfredo Cardigliano /** 995*01489e5dSAlfredo Cardigliano * Port config state 996*01489e5dSAlfredo Cardigliano */ 997*01489e5dSAlfredo Cardigliano enum ionic_port_admin_state { 998*01489e5dSAlfredo Cardigliano IONIC_PORT_ADMIN_STATE_NONE = 0, /* port admin state not configured */ 999*01489e5dSAlfredo Cardigliano IONIC_PORT_ADMIN_STATE_DOWN = 1, /* port is admin disabled */ 1000*01489e5dSAlfredo Cardigliano IONIC_PORT_ADMIN_STATE_UP = 2, /* port is admin enabled */ 1001*01489e5dSAlfredo Cardigliano }; 1002*01489e5dSAlfredo Cardigliano 1003*01489e5dSAlfredo Cardigliano /** 1004*01489e5dSAlfredo Cardigliano * Port operational status 1005*01489e5dSAlfredo Cardigliano */ 1006*01489e5dSAlfredo Cardigliano enum ionic_port_oper_status { 1007*01489e5dSAlfredo Cardigliano IONIC_PORT_OPER_STATUS_NONE = 0, /* port is disabled */ 1008*01489e5dSAlfredo Cardigliano IONIC_PORT_OPER_STATUS_UP = 1, /* port is linked up */ 1009*01489e5dSAlfredo Cardigliano IONIC_PORT_OPER_STATUS_DOWN = 2, /* port link status is down */ 1010*01489e5dSAlfredo Cardigliano }; 1011*01489e5dSAlfredo Cardigliano 1012*01489e5dSAlfredo Cardigliano /** 1013*01489e5dSAlfredo Cardigliano * Ethernet Forward error correction (fec) modes 1014*01489e5dSAlfredo Cardigliano */ 1015*01489e5dSAlfredo Cardigliano enum ionic_port_fec_type { 1016*01489e5dSAlfredo Cardigliano IONIC_PORT_FEC_TYPE_NONE = 0, /* Disabled */ 1017*01489e5dSAlfredo Cardigliano IONIC_PORT_FEC_TYPE_FC = 1, /* FireCode */ 1018*01489e5dSAlfredo Cardigliano IONIC_PORT_FEC_TYPE_RS = 2, /* ReedSolomon */ 1019*01489e5dSAlfredo Cardigliano }; 1020*01489e5dSAlfredo Cardigliano 1021*01489e5dSAlfredo Cardigliano /** 1022*01489e5dSAlfredo Cardigliano * Ethernet pause (flow control) modes 1023*01489e5dSAlfredo Cardigliano */ 1024*01489e5dSAlfredo Cardigliano enum ionic_port_pause_type { 1025*01489e5dSAlfredo Cardigliano IONIC_PORT_PAUSE_TYPE_NONE = 0, /* Disable Pause */ 1026*01489e5dSAlfredo Cardigliano IONIC_PORT_PAUSE_TYPE_LINK = 1, /* Link level pause */ 1027*01489e5dSAlfredo Cardigliano IONIC_PORT_PAUSE_TYPE_PFC = 2, /* Priority-Flow control */ 1028*01489e5dSAlfredo Cardigliano }; 1029*01489e5dSAlfredo Cardigliano 1030*01489e5dSAlfredo Cardigliano /** 1031*01489e5dSAlfredo Cardigliano * Loopback modes 1032*01489e5dSAlfredo Cardigliano */ 1033*01489e5dSAlfredo Cardigliano enum ionic_port_loopback_mode { 1034*01489e5dSAlfredo Cardigliano IONIC_PORT_LOOPBACK_MODE_NONE = 0, /* Disable loopback */ 1035*01489e5dSAlfredo Cardigliano IONIC_PORT_LOOPBACK_MODE_MAC = 1, /* MAC loopback */ 1036*01489e5dSAlfredo Cardigliano IONIC_PORT_LOOPBACK_MODE_PHY = 2, /* PHY/Serdes loopback */ 1037*01489e5dSAlfredo Cardigliano }; 1038*01489e5dSAlfredo Cardigliano 1039*01489e5dSAlfredo Cardigliano /** 1040*01489e5dSAlfredo Cardigliano * Transceiver Status information 1041*01489e5dSAlfredo Cardigliano * @state: Transceiver status (enum ionic_xcvr_state) 1042*01489e5dSAlfredo Cardigliano * @phy: Physical connection type (enum ionic_phy_type) 1043*01489e5dSAlfredo Cardigliano * @pid: Transceiver link mode (enum pid) 1044*01489e5dSAlfredo Cardigliano * @sprom: Transceiver sprom contents 1045*01489e5dSAlfredo Cardigliano */ 1046*01489e5dSAlfredo Cardigliano struct ionic_xcvr_status { 1047*01489e5dSAlfredo Cardigliano u8 state; 1048*01489e5dSAlfredo Cardigliano u8 phy; 1049*01489e5dSAlfredo Cardigliano __le16 pid; 1050*01489e5dSAlfredo Cardigliano u8 sprom[256]; 1051*01489e5dSAlfredo Cardigliano }; 1052*01489e5dSAlfredo Cardigliano 1053*01489e5dSAlfredo Cardigliano /** 1054*01489e5dSAlfredo Cardigliano * Port configuration 1055*01489e5dSAlfredo Cardigliano * @speed: port speed (in Mbps) 1056*01489e5dSAlfredo Cardigliano * @mtu: mtu 1057*01489e5dSAlfredo Cardigliano * @state: port admin state (enum port_admin_state) 1058*01489e5dSAlfredo Cardigliano * @an_enable: autoneg enable 1059*01489e5dSAlfredo Cardigliano * @fec_type: fec type (enum ionic_port_fec_type) 1060*01489e5dSAlfredo Cardigliano * @pause_type: pause type (enum ionic_port_pause_type) 1061*01489e5dSAlfredo Cardigliano * @loopback_mode: loopback mode (enum ionic_port_loopback_mode) 1062*01489e5dSAlfredo Cardigliano */ 1063*01489e5dSAlfredo Cardigliano union ionic_port_config { 1064*01489e5dSAlfredo Cardigliano struct { 1065*01489e5dSAlfredo Cardigliano #define IONIC_SPEED_100G 100000 /* 100G in Mbps */ 1066*01489e5dSAlfredo Cardigliano #define IONIC_SPEED_50G 50000 /* 50G in Mbps */ 1067*01489e5dSAlfredo Cardigliano #define IONIC_SPEED_40G 40000 /* 40G in Mbps */ 1068*01489e5dSAlfredo Cardigliano #define IONIC_SPEED_25G 25000 /* 25G in Mbps */ 1069*01489e5dSAlfredo Cardigliano #define IONIC_SPEED_10G 10000 /* 10G in Mbps */ 1070*01489e5dSAlfredo Cardigliano #define IONIC_SPEED_1G 1000 /* 1G in Mbps */ 1071*01489e5dSAlfredo Cardigliano __le32 speed; 1072*01489e5dSAlfredo Cardigliano __le32 mtu; 1073*01489e5dSAlfredo Cardigliano u8 state; 1074*01489e5dSAlfredo Cardigliano u8 an_enable; 1075*01489e5dSAlfredo Cardigliano u8 fec_type; 1076*01489e5dSAlfredo Cardigliano #define IONIC_PAUSE_TYPE_MASK 0x0f 1077*01489e5dSAlfredo Cardigliano #define IONIC_PAUSE_FLAGS_MASK 0xf0 1078*01489e5dSAlfredo Cardigliano #define IONIC_PAUSE_F_TX 0x10 1079*01489e5dSAlfredo Cardigliano #define IONIC_PAUSE_F_RX 0x20 1080*01489e5dSAlfredo Cardigliano u8 pause_type; 1081*01489e5dSAlfredo Cardigliano u8 loopback_mode; 1082*01489e5dSAlfredo Cardigliano }; 1083*01489e5dSAlfredo Cardigliano __le32 words[64]; 1084*01489e5dSAlfredo Cardigliano }; 1085*01489e5dSAlfredo Cardigliano 1086*01489e5dSAlfredo Cardigliano /** 1087*01489e5dSAlfredo Cardigliano * Port Status information 1088*01489e5dSAlfredo Cardigliano * @status: link status (enum ionic_port_oper_status) 1089*01489e5dSAlfredo Cardigliano * @id: port id 1090*01489e5dSAlfredo Cardigliano * @speed: link speed (in Mbps) 1091*01489e5dSAlfredo Cardigliano * @xcvr: transceiver status 1092*01489e5dSAlfredo Cardigliano */ 1093*01489e5dSAlfredo Cardigliano struct ionic_port_status { 1094*01489e5dSAlfredo Cardigliano __le32 id; 1095*01489e5dSAlfredo Cardigliano __le32 speed; 1096*01489e5dSAlfredo Cardigliano u8 status; 1097*01489e5dSAlfredo Cardigliano u8 rsvd[51]; 1098*01489e5dSAlfredo Cardigliano struct ionic_xcvr_status xcvr; 1099*01489e5dSAlfredo Cardigliano }; 1100*01489e5dSAlfredo Cardigliano 1101*01489e5dSAlfredo Cardigliano /** 1102*01489e5dSAlfredo Cardigliano * struct ionic_port_identify_cmd - Port identify command 1103*01489e5dSAlfredo Cardigliano * @opcode: opcode 1104*01489e5dSAlfredo Cardigliano * @index: port index 1105*01489e5dSAlfredo Cardigliano * @ver: Highest version of identify supported by driver 1106*01489e5dSAlfredo Cardigliano */ 1107*01489e5dSAlfredo Cardigliano struct ionic_port_identify_cmd { 1108*01489e5dSAlfredo Cardigliano u8 opcode; 1109*01489e5dSAlfredo Cardigliano u8 index; 1110*01489e5dSAlfredo Cardigliano u8 ver; 1111*01489e5dSAlfredo Cardigliano u8 rsvd[61]; 1112*01489e5dSAlfredo Cardigliano }; 1113*01489e5dSAlfredo Cardigliano 1114*01489e5dSAlfredo Cardigliano /** 1115*01489e5dSAlfredo Cardigliano * struct ionic_port_identify_comp - Port identify command completion 1116*01489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 1117*01489e5dSAlfredo Cardigliano * @ver: Version of identify returned by device 1118*01489e5dSAlfredo Cardigliano */ 1119*01489e5dSAlfredo Cardigliano struct ionic_port_identify_comp { 1120*01489e5dSAlfredo Cardigliano u8 status; 1121*01489e5dSAlfredo Cardigliano u8 ver; 1122*01489e5dSAlfredo Cardigliano u8 rsvd[14]; 1123*01489e5dSAlfredo Cardigliano }; 1124*01489e5dSAlfredo Cardigliano 1125*01489e5dSAlfredo Cardigliano /** 1126*01489e5dSAlfredo Cardigliano * struct ionic_port_init_cmd - Port initialization command 1127*01489e5dSAlfredo Cardigliano * @opcode: opcode 1128*01489e5dSAlfredo Cardigliano * @index: port index 1129*01489e5dSAlfredo Cardigliano * @info_pa: destination address for port info (struct ionic_port_info) 1130*01489e5dSAlfredo Cardigliano */ 1131*01489e5dSAlfredo Cardigliano struct ionic_port_init_cmd { 1132*01489e5dSAlfredo Cardigliano u8 opcode; 1133*01489e5dSAlfredo Cardigliano u8 index; 1134*01489e5dSAlfredo Cardigliano u8 rsvd[6]; 1135*01489e5dSAlfredo Cardigliano __le64 info_pa; 1136*01489e5dSAlfredo Cardigliano u8 rsvd2[48]; 1137*01489e5dSAlfredo Cardigliano }; 1138*01489e5dSAlfredo Cardigliano 1139*01489e5dSAlfredo Cardigliano /** 1140*01489e5dSAlfredo Cardigliano * struct ionic_port_init_comp - Port initialization command completion 1141*01489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 1142*01489e5dSAlfredo Cardigliano */ 1143*01489e5dSAlfredo Cardigliano struct ionic_port_init_comp { 1144*01489e5dSAlfredo Cardigliano u8 status; 1145*01489e5dSAlfredo Cardigliano u8 rsvd[15]; 1146*01489e5dSAlfredo Cardigliano }; 1147*01489e5dSAlfredo Cardigliano 1148*01489e5dSAlfredo Cardigliano /** 1149*01489e5dSAlfredo Cardigliano * struct ionic_port_reset_cmd - Port reset command 1150*01489e5dSAlfredo Cardigliano * @opcode: opcode 1151*01489e5dSAlfredo Cardigliano * @index: port index 1152*01489e5dSAlfredo Cardigliano */ 1153*01489e5dSAlfredo Cardigliano struct ionic_port_reset_cmd { 1154*01489e5dSAlfredo Cardigliano u8 opcode; 1155*01489e5dSAlfredo Cardigliano u8 index; 1156*01489e5dSAlfredo Cardigliano u8 rsvd[62]; 1157*01489e5dSAlfredo Cardigliano }; 1158*01489e5dSAlfredo Cardigliano 1159*01489e5dSAlfredo Cardigliano /** 1160*01489e5dSAlfredo Cardigliano * struct ionic_port_reset_comp - Port reset command completion 1161*01489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 1162*01489e5dSAlfredo Cardigliano */ 1163*01489e5dSAlfredo Cardigliano struct ionic_port_reset_comp { 1164*01489e5dSAlfredo Cardigliano u8 status; 1165*01489e5dSAlfredo Cardigliano u8 rsvd[15]; 1166*01489e5dSAlfredo Cardigliano }; 1167*01489e5dSAlfredo Cardigliano 1168*01489e5dSAlfredo Cardigliano /** 1169*01489e5dSAlfredo Cardigliano * enum stats_ctl_cmd - List of commands for stats control 1170*01489e5dSAlfredo Cardigliano */ 1171*01489e5dSAlfredo Cardigliano enum ionic_stats_ctl_cmd { 1172*01489e5dSAlfredo Cardigliano IONIC_STATS_CTL_RESET = 0, 1173*01489e5dSAlfredo Cardigliano }; 1174*01489e5dSAlfredo Cardigliano 1175*01489e5dSAlfredo Cardigliano 1176*01489e5dSAlfredo Cardigliano /** 1177*01489e5dSAlfredo Cardigliano * enum ionic_port_attr - List of device attributes 1178*01489e5dSAlfredo Cardigliano */ 1179*01489e5dSAlfredo Cardigliano enum ionic_port_attr { 1180*01489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_STATE = 0, 1181*01489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_SPEED = 1, 1182*01489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_MTU = 2, 1183*01489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_AUTONEG = 3, 1184*01489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_FEC = 4, 1185*01489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_PAUSE = 5, 1186*01489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_LOOPBACK = 6, 1187*01489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_STATS_CTRL = 7, 1188*01489e5dSAlfredo Cardigliano }; 1189*01489e5dSAlfredo Cardigliano 1190*01489e5dSAlfredo Cardigliano /** 1191*01489e5dSAlfredo Cardigliano * struct ionic_port_setattr_cmd - Set port attributes on the NIC 1192*01489e5dSAlfredo Cardigliano * @opcode: Opcode 1193*01489e5dSAlfredo Cardigliano * @index: port index 1194*01489e5dSAlfredo Cardigliano * @attr: Attribute type (enum ionic_port_attr) 1195*01489e5dSAlfredo Cardigliano */ 1196*01489e5dSAlfredo Cardigliano struct ionic_port_setattr_cmd { 1197*01489e5dSAlfredo Cardigliano u8 opcode; 1198*01489e5dSAlfredo Cardigliano u8 index; 1199*01489e5dSAlfredo Cardigliano u8 attr; 1200*01489e5dSAlfredo Cardigliano u8 rsvd; 1201*01489e5dSAlfredo Cardigliano union { 1202*01489e5dSAlfredo Cardigliano u8 state; 1203*01489e5dSAlfredo Cardigliano __le32 speed; 1204*01489e5dSAlfredo Cardigliano __le32 mtu; 1205*01489e5dSAlfredo Cardigliano u8 an_enable; 1206*01489e5dSAlfredo Cardigliano u8 fec_type; 1207*01489e5dSAlfredo Cardigliano u8 pause_type; 1208*01489e5dSAlfredo Cardigliano u8 loopback_mode; 1209*01489e5dSAlfredo Cardigliano u8 stats_ctl; 1210*01489e5dSAlfredo Cardigliano u8 rsvd2[60]; 1211*01489e5dSAlfredo Cardigliano }; 1212*01489e5dSAlfredo Cardigliano }; 1213*01489e5dSAlfredo Cardigliano 1214*01489e5dSAlfredo Cardigliano /** 1215*01489e5dSAlfredo Cardigliano * struct ionic_port_setattr_comp - Port set attr command completion 1216*01489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 1217*01489e5dSAlfredo Cardigliano * @color: Color bit 1218*01489e5dSAlfredo Cardigliano */ 1219*01489e5dSAlfredo Cardigliano struct ionic_port_setattr_comp { 1220*01489e5dSAlfredo Cardigliano u8 status; 1221*01489e5dSAlfredo Cardigliano u8 rsvd[14]; 1222*01489e5dSAlfredo Cardigliano u8 color; 1223*01489e5dSAlfredo Cardigliano }; 1224*01489e5dSAlfredo Cardigliano 1225*01489e5dSAlfredo Cardigliano /** 1226*01489e5dSAlfredo Cardigliano * struct ionic_port_getattr_cmd - Get port attributes from the NIC 1227*01489e5dSAlfredo Cardigliano * @opcode: Opcode 1228*01489e5dSAlfredo Cardigliano * @index: port index 1229*01489e5dSAlfredo Cardigliano * @attr: Attribute type (enum ionic_port_attr) 1230*01489e5dSAlfredo Cardigliano */ 1231*01489e5dSAlfredo Cardigliano struct ionic_port_getattr_cmd { 1232*01489e5dSAlfredo Cardigliano u8 opcode; 1233*01489e5dSAlfredo Cardigliano u8 index; 1234*01489e5dSAlfredo Cardigliano u8 attr; 1235*01489e5dSAlfredo Cardigliano u8 rsvd[61]; 1236*01489e5dSAlfredo Cardigliano }; 1237*01489e5dSAlfredo Cardigliano 1238*01489e5dSAlfredo Cardigliano /** 1239*01489e5dSAlfredo Cardigliano * struct ionic_port_getattr_comp - Port get attr command completion 1240*01489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 1241*01489e5dSAlfredo Cardigliano * @color: Color bit 1242*01489e5dSAlfredo Cardigliano */ 1243*01489e5dSAlfredo Cardigliano struct ionic_port_getattr_comp { 1244*01489e5dSAlfredo Cardigliano u8 status; 1245*01489e5dSAlfredo Cardigliano u8 rsvd[3]; 1246*01489e5dSAlfredo Cardigliano union { 1247*01489e5dSAlfredo Cardigliano u8 state; 1248*01489e5dSAlfredo Cardigliano __le32 speed; 1249*01489e5dSAlfredo Cardigliano __le32 mtu; 1250*01489e5dSAlfredo Cardigliano u8 an_enable; 1251*01489e5dSAlfredo Cardigliano u8 fec_type; 1252*01489e5dSAlfredo Cardigliano u8 pause_type; 1253*01489e5dSAlfredo Cardigliano u8 loopback_mode; 1254*01489e5dSAlfredo Cardigliano u8 rsvd2[11]; 1255*01489e5dSAlfredo Cardigliano }; 1256*01489e5dSAlfredo Cardigliano u8 color; 1257*01489e5dSAlfredo Cardigliano }; 1258*01489e5dSAlfredo Cardigliano 1259*01489e5dSAlfredo Cardigliano /** 1260*01489e5dSAlfredo Cardigliano * struct ionic_lif_status - Lif status register 1261*01489e5dSAlfredo Cardigliano * @eid: most recent NotifyQ event id 1262*01489e5dSAlfredo Cardigliano * @port_num: port the lif is connected to 1263*01489e5dSAlfredo Cardigliano * @link_status: port status (enum ionic_port_oper_status) 1264*01489e5dSAlfredo Cardigliano * @link_speed: speed of link in Mbps 1265*01489e5dSAlfredo Cardigliano * @link_down_count: number of times link status changes 1266*01489e5dSAlfredo Cardigliano */ 1267*01489e5dSAlfredo Cardigliano struct ionic_lif_status { 1268*01489e5dSAlfredo Cardigliano __le64 eid; 1269*01489e5dSAlfredo Cardigliano u8 port_num; 1270*01489e5dSAlfredo Cardigliano u8 rsvd; 1271*01489e5dSAlfredo Cardigliano __le16 link_status; 1272*01489e5dSAlfredo Cardigliano __le32 link_speed; /* units of 1Mbps: eg 10000 = 10Gbps */ 1273*01489e5dSAlfredo Cardigliano __le16 link_down_count; 1274*01489e5dSAlfredo Cardigliano u8 rsvd2[46]; 1275*01489e5dSAlfredo Cardigliano }; 1276*01489e5dSAlfredo Cardigliano 1277*01489e5dSAlfredo Cardigliano /** 1278*01489e5dSAlfredo Cardigliano * struct ionic_lif_reset_cmd - LIF reset command 1279*01489e5dSAlfredo Cardigliano * @opcode: opcode 1280*01489e5dSAlfredo Cardigliano * @index: LIF index 1281*01489e5dSAlfredo Cardigliano */ 1282*01489e5dSAlfredo Cardigliano struct ionic_lif_reset_cmd { 1283*01489e5dSAlfredo Cardigliano u8 opcode; 1284*01489e5dSAlfredo Cardigliano u8 rsvd; 1285*01489e5dSAlfredo Cardigliano __le16 index; 1286*01489e5dSAlfredo Cardigliano __le32 rsvd2[15]; 1287*01489e5dSAlfredo Cardigliano }; 1288*01489e5dSAlfredo Cardigliano 1289*01489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_lif_reset_comp; 1290*01489e5dSAlfredo Cardigliano 1291*01489e5dSAlfredo Cardigliano enum ionic_dev_state { 1292*01489e5dSAlfredo Cardigliano IONIC_DEV_DISABLE = 0, 1293*01489e5dSAlfredo Cardigliano IONIC_DEV_ENABLE = 1, 1294*01489e5dSAlfredo Cardigliano IONIC_DEV_HANG_RESET = 2, 1295*01489e5dSAlfredo Cardigliano }; 1296*01489e5dSAlfredo Cardigliano 1297*01489e5dSAlfredo Cardigliano /** 1298*01489e5dSAlfredo Cardigliano * enum ionic_dev_attr - List of device attributes 1299*01489e5dSAlfredo Cardigliano */ 1300*01489e5dSAlfredo Cardigliano enum ionic_dev_attr { 1301*01489e5dSAlfredo Cardigliano IONIC_DEV_ATTR_STATE = 0, 1302*01489e5dSAlfredo Cardigliano IONIC_DEV_ATTR_NAME = 1, 1303*01489e5dSAlfredo Cardigliano IONIC_DEV_ATTR_FEATURES = 2, 1304*01489e5dSAlfredo Cardigliano }; 1305*01489e5dSAlfredo Cardigliano 1306*01489e5dSAlfredo Cardigliano /** 1307*01489e5dSAlfredo Cardigliano * struct ionic_dev_setattr_cmd - Set Device attributes on the NIC 1308*01489e5dSAlfredo Cardigliano * @opcode: Opcode 1309*01489e5dSAlfredo Cardigliano * @attr: Attribute type (enum ionic_dev_attr) 1310*01489e5dSAlfredo Cardigliano * @state: Device state (enum ionic_dev_state) 1311*01489e5dSAlfredo Cardigliano * @name: The bus info, e.g. PCI slot-device-function, 0 terminated 1312*01489e5dSAlfredo Cardigliano * @features: Device features 1313*01489e5dSAlfredo Cardigliano */ 1314*01489e5dSAlfredo Cardigliano struct ionic_dev_setattr_cmd { 1315*01489e5dSAlfredo Cardigliano u8 opcode; 1316*01489e5dSAlfredo Cardigliano u8 attr; 1317*01489e5dSAlfredo Cardigliano __le16 rsvd; 1318*01489e5dSAlfredo Cardigliano union { 1319*01489e5dSAlfredo Cardigliano u8 state; 1320*01489e5dSAlfredo Cardigliano char name[IONIC_IFNAMSIZ]; 1321*01489e5dSAlfredo Cardigliano __le64 features; 1322*01489e5dSAlfredo Cardigliano u8 rsvd2[60]; 1323*01489e5dSAlfredo Cardigliano }; 1324*01489e5dSAlfredo Cardigliano }; 1325*01489e5dSAlfredo Cardigliano 1326*01489e5dSAlfredo Cardigliano /** 1327*01489e5dSAlfredo Cardigliano * struct ionic_dev_setattr_comp - Device set attr command completion 1328*01489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 1329*01489e5dSAlfredo Cardigliano * @features: Device features 1330*01489e5dSAlfredo Cardigliano * @color: Color bit 1331*01489e5dSAlfredo Cardigliano */ 1332*01489e5dSAlfredo Cardigliano struct ionic_dev_setattr_comp { 1333*01489e5dSAlfredo Cardigliano u8 status; 1334*01489e5dSAlfredo Cardigliano u8 rsvd[3]; 1335*01489e5dSAlfredo Cardigliano union { 1336*01489e5dSAlfredo Cardigliano __le64 features; 1337*01489e5dSAlfredo Cardigliano u8 rsvd2[11]; 1338*01489e5dSAlfredo Cardigliano }; 1339*01489e5dSAlfredo Cardigliano u8 color; 1340*01489e5dSAlfredo Cardigliano }; 1341*01489e5dSAlfredo Cardigliano 1342*01489e5dSAlfredo Cardigliano /** 1343*01489e5dSAlfredo Cardigliano * struct ionic_dev_getattr_cmd - Get Device attributes from the NIC 1344*01489e5dSAlfredo Cardigliano * @opcode: opcode 1345*01489e5dSAlfredo Cardigliano * @attr: Attribute type (enum ionic_dev_attr) 1346*01489e5dSAlfredo Cardigliano */ 1347*01489e5dSAlfredo Cardigliano struct ionic_dev_getattr_cmd { 1348*01489e5dSAlfredo Cardigliano u8 opcode; 1349*01489e5dSAlfredo Cardigliano u8 attr; 1350*01489e5dSAlfredo Cardigliano u8 rsvd[62]; 1351*01489e5dSAlfredo Cardigliano }; 1352*01489e5dSAlfredo Cardigliano 1353*01489e5dSAlfredo Cardigliano /** 1354*01489e5dSAlfredo Cardigliano * struct ionic_dev_setattr_comp - Device set attr command completion 1355*01489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 1356*01489e5dSAlfredo Cardigliano * @features: Device features 1357*01489e5dSAlfredo Cardigliano * @color: Color bit 1358*01489e5dSAlfredo Cardigliano */ 1359*01489e5dSAlfredo Cardigliano struct ionic_dev_getattr_comp { 1360*01489e5dSAlfredo Cardigliano u8 status; 1361*01489e5dSAlfredo Cardigliano u8 rsvd[3]; 1362*01489e5dSAlfredo Cardigliano union { 1363*01489e5dSAlfredo Cardigliano __le64 features; 1364*01489e5dSAlfredo Cardigliano u8 rsvd2[11]; 1365*01489e5dSAlfredo Cardigliano }; 1366*01489e5dSAlfredo Cardigliano u8 color; 1367*01489e5dSAlfredo Cardigliano }; 1368*01489e5dSAlfredo Cardigliano 1369*01489e5dSAlfredo Cardigliano /** 1370*01489e5dSAlfredo Cardigliano * RSS parameters 1371*01489e5dSAlfredo Cardigliano */ 1372*01489e5dSAlfredo Cardigliano #define IONIC_RSS_HASH_KEY_SIZE 40 1373*01489e5dSAlfredo Cardigliano 1374*01489e5dSAlfredo Cardigliano enum ionic_rss_hash_types { 1375*01489e5dSAlfredo Cardigliano IONIC_RSS_TYPE_IPV4 = BIT(0), 1376*01489e5dSAlfredo Cardigliano IONIC_RSS_TYPE_IPV4_TCP = BIT(1), 1377*01489e5dSAlfredo Cardigliano IONIC_RSS_TYPE_IPV4_UDP = BIT(2), 1378*01489e5dSAlfredo Cardigliano IONIC_RSS_TYPE_IPV6 = BIT(3), 1379*01489e5dSAlfredo Cardigliano IONIC_RSS_TYPE_IPV6_TCP = BIT(4), 1380*01489e5dSAlfredo Cardigliano IONIC_RSS_TYPE_IPV6_UDP = BIT(5), 1381*01489e5dSAlfredo Cardigliano }; 1382*01489e5dSAlfredo Cardigliano 1383*01489e5dSAlfredo Cardigliano /** 1384*01489e5dSAlfredo Cardigliano * enum ionic_lif_attr - List of LIF attributes 1385*01489e5dSAlfredo Cardigliano */ 1386*01489e5dSAlfredo Cardigliano enum ionic_lif_attr { 1387*01489e5dSAlfredo Cardigliano IONIC_LIF_ATTR_STATE = 0, 1388*01489e5dSAlfredo Cardigliano IONIC_LIF_ATTR_NAME = 1, 1389*01489e5dSAlfredo Cardigliano IONIC_LIF_ATTR_MTU = 2, 1390*01489e5dSAlfredo Cardigliano IONIC_LIF_ATTR_MAC = 3, 1391*01489e5dSAlfredo Cardigliano IONIC_LIF_ATTR_FEATURES = 4, 1392*01489e5dSAlfredo Cardigliano IONIC_LIF_ATTR_RSS = 5, 1393*01489e5dSAlfredo Cardigliano IONIC_LIF_ATTR_STATS_CTRL = 6, 1394*01489e5dSAlfredo Cardigliano }; 1395*01489e5dSAlfredo Cardigliano 1396*01489e5dSAlfredo Cardigliano /** 1397*01489e5dSAlfredo Cardigliano * struct ionic_lif_setattr_cmd - Set LIF attributes on the NIC 1398*01489e5dSAlfredo Cardigliano * @opcode: Opcode 1399*01489e5dSAlfredo Cardigliano * @type: Attribute type (enum ionic_lif_attr) 1400*01489e5dSAlfredo Cardigliano * @index: LIF index 1401*01489e5dSAlfredo Cardigliano * @state: lif state (enum lif_state) 1402*01489e5dSAlfredo Cardigliano * @name: The netdev name string, 0 terminated 1403*01489e5dSAlfredo Cardigliano * @mtu: Mtu 1404*01489e5dSAlfredo Cardigliano * @mac: Station mac 1405*01489e5dSAlfredo Cardigliano * @features: Features (enum ionic_eth_hw_features) 1406*01489e5dSAlfredo Cardigliano * @rss: RSS properties 1407*01489e5dSAlfredo Cardigliano * @types: The hash types to enable (see rss_hash_types). 1408*01489e5dSAlfredo Cardigliano * @key: The hash secret key. 1409*01489e5dSAlfredo Cardigliano * @addr: Address for the indirection table shared memory. 1410*01489e5dSAlfredo Cardigliano * @stats_ctl: stats control commands (enum stats_ctl_cmd) 1411*01489e5dSAlfredo Cardigliano */ 1412*01489e5dSAlfredo Cardigliano struct ionic_lif_setattr_cmd { 1413*01489e5dSAlfredo Cardigliano u8 opcode; 1414*01489e5dSAlfredo Cardigliano u8 attr; 1415*01489e5dSAlfredo Cardigliano __le16 index; 1416*01489e5dSAlfredo Cardigliano union { 1417*01489e5dSAlfredo Cardigliano u8 state; 1418*01489e5dSAlfredo Cardigliano char name[IONIC_IFNAMSIZ]; 1419*01489e5dSAlfredo Cardigliano __le32 mtu; 1420*01489e5dSAlfredo Cardigliano u8 mac[6]; 1421*01489e5dSAlfredo Cardigliano __le64 features; 1422*01489e5dSAlfredo Cardigliano struct { 1423*01489e5dSAlfredo Cardigliano __le16 types; 1424*01489e5dSAlfredo Cardigliano u8 key[IONIC_RSS_HASH_KEY_SIZE]; 1425*01489e5dSAlfredo Cardigliano u8 rsvd[6]; 1426*01489e5dSAlfredo Cardigliano __le64 addr; 1427*01489e5dSAlfredo Cardigliano } rss; 1428*01489e5dSAlfredo Cardigliano u8 stats_ctl; 1429*01489e5dSAlfredo Cardigliano u8 rsvd[60]; 1430*01489e5dSAlfredo Cardigliano }; 1431*01489e5dSAlfredo Cardigliano }; 1432*01489e5dSAlfredo Cardigliano 1433*01489e5dSAlfredo Cardigliano /** 1434*01489e5dSAlfredo Cardigliano * struct ionic_lif_setattr_comp - LIF set attr command completion 1435*01489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 1436*01489e5dSAlfredo Cardigliano * @comp_index: The index in the descriptor ring for which this 1437*01489e5dSAlfredo Cardigliano * is the completion. 1438*01489e5dSAlfredo Cardigliano * @features: features (enum ionic_eth_hw_features) 1439*01489e5dSAlfredo Cardigliano * @color: Color bit 1440*01489e5dSAlfredo Cardigliano */ 1441*01489e5dSAlfredo Cardigliano struct ionic_lif_setattr_comp { 1442*01489e5dSAlfredo Cardigliano u8 status; 1443*01489e5dSAlfredo Cardigliano u8 rsvd; 1444*01489e5dSAlfredo Cardigliano __le16 comp_index; 1445*01489e5dSAlfredo Cardigliano union { 1446*01489e5dSAlfredo Cardigliano __le64 features; 1447*01489e5dSAlfredo Cardigliano u8 rsvd2[11]; 1448*01489e5dSAlfredo Cardigliano }; 1449*01489e5dSAlfredo Cardigliano u8 color; 1450*01489e5dSAlfredo Cardigliano }; 1451*01489e5dSAlfredo Cardigliano 1452*01489e5dSAlfredo Cardigliano /** 1453*01489e5dSAlfredo Cardigliano * struct ionic_lif_getattr_cmd - Get LIF attributes from the NIC 1454*01489e5dSAlfredo Cardigliano * @opcode: Opcode 1455*01489e5dSAlfredo Cardigliano * @attr: Attribute type (enum ionic_lif_attr) 1456*01489e5dSAlfredo Cardigliano * @index: LIF index 1457*01489e5dSAlfredo Cardigliano */ 1458*01489e5dSAlfredo Cardigliano struct ionic_lif_getattr_cmd { 1459*01489e5dSAlfredo Cardigliano u8 opcode; 1460*01489e5dSAlfredo Cardigliano u8 attr; 1461*01489e5dSAlfredo Cardigliano __le16 index; 1462*01489e5dSAlfredo Cardigliano u8 rsvd[60]; 1463*01489e5dSAlfredo Cardigliano }; 1464*01489e5dSAlfredo Cardigliano 1465*01489e5dSAlfredo Cardigliano /** 1466*01489e5dSAlfredo Cardigliano * struct ionic_lif_getattr_comp - LIF get attr command completion 1467*01489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 1468*01489e5dSAlfredo Cardigliano * @comp_index: The index in the descriptor ring for which this 1469*01489e5dSAlfredo Cardigliano * is the completion. 1470*01489e5dSAlfredo Cardigliano * @state: lif state (enum lif_state) 1471*01489e5dSAlfredo Cardigliano * @name: The netdev name string, 0 terminated 1472*01489e5dSAlfredo Cardigliano * @mtu: Mtu 1473*01489e5dSAlfredo Cardigliano * @mac: Station mac 1474*01489e5dSAlfredo Cardigliano * @features: Features (enum ionic_eth_hw_features) 1475*01489e5dSAlfredo Cardigliano * @color: Color bit 1476*01489e5dSAlfredo Cardigliano */ 1477*01489e5dSAlfredo Cardigliano struct ionic_lif_getattr_comp { 1478*01489e5dSAlfredo Cardigliano u8 status; 1479*01489e5dSAlfredo Cardigliano u8 rsvd; 1480*01489e5dSAlfredo Cardigliano __le16 comp_index; 1481*01489e5dSAlfredo Cardigliano union { 1482*01489e5dSAlfredo Cardigliano u8 state; 1483*01489e5dSAlfredo Cardigliano __le32 mtu; 1484*01489e5dSAlfredo Cardigliano u8 mac[6]; 1485*01489e5dSAlfredo Cardigliano __le64 features; 1486*01489e5dSAlfredo Cardigliano u8 rsvd2[11]; 1487*01489e5dSAlfredo Cardigliano }; 1488*01489e5dSAlfredo Cardigliano u8 color; 1489*01489e5dSAlfredo Cardigliano }; 1490*01489e5dSAlfredo Cardigliano 1491*01489e5dSAlfredo Cardigliano enum ionic_rx_mode { 1492*01489e5dSAlfredo Cardigliano IONIC_RX_MODE_F_UNICAST = BIT(0), 1493*01489e5dSAlfredo Cardigliano IONIC_RX_MODE_F_MULTICAST = BIT(1), 1494*01489e5dSAlfredo Cardigliano IONIC_RX_MODE_F_BROADCAST = BIT(2), 1495*01489e5dSAlfredo Cardigliano IONIC_RX_MODE_F_PROMISC = BIT(3), 1496*01489e5dSAlfredo Cardigliano IONIC_RX_MODE_F_ALLMULTI = BIT(4), 1497*01489e5dSAlfredo Cardigliano }; 1498*01489e5dSAlfredo Cardigliano 1499*01489e5dSAlfredo Cardigliano /** 1500*01489e5dSAlfredo Cardigliano * struct ionic_rx_mode_set_cmd - Set LIF's Rx mode command 1501*01489e5dSAlfredo Cardigliano * @opcode: opcode 1502*01489e5dSAlfredo Cardigliano * @lif_index: LIF index 1503*01489e5dSAlfredo Cardigliano * @rx_mode: Rx mode flags: 1504*01489e5dSAlfredo Cardigliano * IONIC_RX_MODE_F_UNICAST: Accept known unicast packets. 1505*01489e5dSAlfredo Cardigliano * IONIC_RX_MODE_F_MULTICAST: Accept known multicast packets. 1506*01489e5dSAlfredo Cardigliano * IONIC_RX_MODE_F_BROADCAST: Accept broadcast packets. 1507*01489e5dSAlfredo Cardigliano * IONIC_RX_MODE_F_PROMISC: Accept any packets. 1508*01489e5dSAlfredo Cardigliano * IONIC_RX_MODE_F_ALLMULTI: Accept any multicast packets. 1509*01489e5dSAlfredo Cardigliano */ 1510*01489e5dSAlfredo Cardigliano struct ionic_rx_mode_set_cmd { 1511*01489e5dSAlfredo Cardigliano u8 opcode; 1512*01489e5dSAlfredo Cardigliano u8 rsvd; 1513*01489e5dSAlfredo Cardigliano __le16 lif_index; 1514*01489e5dSAlfredo Cardigliano __le16 rx_mode; 1515*01489e5dSAlfredo Cardigliano __le16 rsvd2[29]; 1516*01489e5dSAlfredo Cardigliano }; 1517*01489e5dSAlfredo Cardigliano 1518*01489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_rx_mode_set_comp; 1519*01489e5dSAlfredo Cardigliano 1520*01489e5dSAlfredo Cardigliano enum ionic_rx_filter_match_type { 1521*01489e5dSAlfredo Cardigliano IONIC_RX_FILTER_MATCH_VLAN = 0, 1522*01489e5dSAlfredo Cardigliano IONIC_RX_FILTER_MATCH_MAC, 1523*01489e5dSAlfredo Cardigliano IONIC_RX_FILTER_MATCH_MAC_VLAN, 1524*01489e5dSAlfredo Cardigliano }; 1525*01489e5dSAlfredo Cardigliano 1526*01489e5dSAlfredo Cardigliano /** 1527*01489e5dSAlfredo Cardigliano * struct ionic_rx_filter_add_cmd - Add LIF Rx filter command 1528*01489e5dSAlfredo Cardigliano * @opcode: opcode 1529*01489e5dSAlfredo Cardigliano * @qtype: Queue type 1530*01489e5dSAlfredo Cardigliano * @lif_index: LIF index 1531*01489e5dSAlfredo Cardigliano * @qid: Queue ID 1532*01489e5dSAlfredo Cardigliano * @match: Rx filter match type. (See IONIC_RX_FILTER_MATCH_xxx) 1533*01489e5dSAlfredo Cardigliano * @vlan: VLAN ID 1534*01489e5dSAlfredo Cardigliano * @addr: MAC address (network-byte order) 1535*01489e5dSAlfredo Cardigliano */ 1536*01489e5dSAlfredo Cardigliano struct ionic_rx_filter_add_cmd { 1537*01489e5dSAlfredo Cardigliano u8 opcode; 1538*01489e5dSAlfredo Cardigliano u8 qtype; 1539*01489e5dSAlfredo Cardigliano __le16 lif_index; 1540*01489e5dSAlfredo Cardigliano __le32 qid; 1541*01489e5dSAlfredo Cardigliano __le16 match; 1542*01489e5dSAlfredo Cardigliano union { 1543*01489e5dSAlfredo Cardigliano struct { 1544*01489e5dSAlfredo Cardigliano __le16 vlan; 1545*01489e5dSAlfredo Cardigliano } vlan; 1546*01489e5dSAlfredo Cardigliano struct { 1547*01489e5dSAlfredo Cardigliano u8 addr[6]; 1548*01489e5dSAlfredo Cardigliano } mac; 1549*01489e5dSAlfredo Cardigliano struct { 1550*01489e5dSAlfredo Cardigliano __le16 vlan; 1551*01489e5dSAlfredo Cardigliano u8 addr[6]; 1552*01489e5dSAlfredo Cardigliano } mac_vlan; 1553*01489e5dSAlfredo Cardigliano u8 rsvd[54]; 1554*01489e5dSAlfredo Cardigliano }; 1555*01489e5dSAlfredo Cardigliano }; 1556*01489e5dSAlfredo Cardigliano 1557*01489e5dSAlfredo Cardigliano /** 1558*01489e5dSAlfredo Cardigliano * struct ionic_rx_filter_add_comp - Add LIF Rx filter command completion 1559*01489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 1560*01489e5dSAlfredo Cardigliano * @comp_index: The index in the descriptor ring for which this 1561*01489e5dSAlfredo Cardigliano * is the completion. 1562*01489e5dSAlfredo Cardigliano * @filter_id: Filter ID 1563*01489e5dSAlfredo Cardigliano * @color: Color bit. 1564*01489e5dSAlfredo Cardigliano */ 1565*01489e5dSAlfredo Cardigliano struct ionic_rx_filter_add_comp { 1566*01489e5dSAlfredo Cardigliano u8 status; 1567*01489e5dSAlfredo Cardigliano u8 rsvd; 1568*01489e5dSAlfredo Cardigliano __le16 comp_index; 1569*01489e5dSAlfredo Cardigliano __le32 filter_id; 1570*01489e5dSAlfredo Cardigliano u8 rsvd2[7]; 1571*01489e5dSAlfredo Cardigliano u8 color; 1572*01489e5dSAlfredo Cardigliano }; 1573*01489e5dSAlfredo Cardigliano 1574*01489e5dSAlfredo Cardigliano /** 1575*01489e5dSAlfredo Cardigliano * struct ionic_rx_filter_del_cmd - Delete LIF Rx filter command 1576*01489e5dSAlfredo Cardigliano * @opcode: opcode 1577*01489e5dSAlfredo Cardigliano * @lif_index: LIF index 1578*01489e5dSAlfredo Cardigliano * @filter_id: Filter ID 1579*01489e5dSAlfredo Cardigliano */ 1580*01489e5dSAlfredo Cardigliano struct ionic_rx_filter_del_cmd { 1581*01489e5dSAlfredo Cardigliano u8 opcode; 1582*01489e5dSAlfredo Cardigliano u8 rsvd; 1583*01489e5dSAlfredo Cardigliano __le16 lif_index; 1584*01489e5dSAlfredo Cardigliano __le32 filter_id; 1585*01489e5dSAlfredo Cardigliano u8 rsvd2[56]; 1586*01489e5dSAlfredo Cardigliano }; 1587*01489e5dSAlfredo Cardigliano 1588*01489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_rx_filter_del_comp; 1589*01489e5dSAlfredo Cardigliano 1590*01489e5dSAlfredo Cardigliano /** 1591*01489e5dSAlfredo Cardigliano * struct ionic_qos_identify_cmd - QoS identify command 1592*01489e5dSAlfredo Cardigliano * @opcode: opcode 1593*01489e5dSAlfredo Cardigliano * @ver: Highest version of identify supported by driver 1594*01489e5dSAlfredo Cardigliano * 1595*01489e5dSAlfredo Cardigliano */ 1596*01489e5dSAlfredo Cardigliano struct ionic_qos_identify_cmd { 1597*01489e5dSAlfredo Cardigliano u8 opcode; 1598*01489e5dSAlfredo Cardigliano u8 ver; 1599*01489e5dSAlfredo Cardigliano u8 rsvd[62]; 1600*01489e5dSAlfredo Cardigliano }; 1601*01489e5dSAlfredo Cardigliano 1602*01489e5dSAlfredo Cardigliano /** 1603*01489e5dSAlfredo Cardigliano * struct ionic_qos_identify_comp - QoS identify command completion 1604*01489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 1605*01489e5dSAlfredo Cardigliano * @ver: Version of identify returned by device 1606*01489e5dSAlfredo Cardigliano */ 1607*01489e5dSAlfredo Cardigliano struct ionic_qos_identify_comp { 1608*01489e5dSAlfredo Cardigliano u8 status; 1609*01489e5dSAlfredo Cardigliano u8 ver; 1610*01489e5dSAlfredo Cardigliano u8 rsvd[14]; 1611*01489e5dSAlfredo Cardigliano }; 1612*01489e5dSAlfredo Cardigliano 1613*01489e5dSAlfredo Cardigliano #define IONIC_QOS_CLASS_MAX 7 1614*01489e5dSAlfredo Cardigliano #define IONIC_QOS_CLASS_NAME_SZ 32 1615*01489e5dSAlfredo Cardigliano #define IONIC_QOS_DSCP_MAX_VALUES 64 1616*01489e5dSAlfredo Cardigliano 1617*01489e5dSAlfredo Cardigliano /** 1618*01489e5dSAlfredo Cardigliano * enum ionic_qos_class 1619*01489e5dSAlfredo Cardigliano */ 1620*01489e5dSAlfredo Cardigliano enum ionic_qos_class { 1621*01489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_DEFAULT = 0, 1622*01489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_USER_DEFINED_1 = 1, 1623*01489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_USER_DEFINED_2 = 2, 1624*01489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_USER_DEFINED_3 = 3, 1625*01489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_USER_DEFINED_4 = 4, 1626*01489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_USER_DEFINED_5 = 5, 1627*01489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_USER_DEFINED_6 = 6, 1628*01489e5dSAlfredo Cardigliano }; 1629*01489e5dSAlfredo Cardigliano 1630*01489e5dSAlfredo Cardigliano /** 1631*01489e5dSAlfredo Cardigliano * enum ionic_qos_class_type - Traffic classification criteria 1632*01489e5dSAlfredo Cardigliano */ 1633*01489e5dSAlfredo Cardigliano enum ionic_qos_class_type { 1634*01489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_TYPE_NONE = 0, 1635*01489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_TYPE_PCP = 1, /* Dot1Q pcp */ 1636*01489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_TYPE_DSCP = 2, /* IP dscp */ 1637*01489e5dSAlfredo Cardigliano }; 1638*01489e5dSAlfredo Cardigliano 1639*01489e5dSAlfredo Cardigliano /** 1640*01489e5dSAlfredo Cardigliano * enum ionic_qos_sched_type - Qos class scheduling type 1641*01489e5dSAlfredo Cardigliano */ 1642*01489e5dSAlfredo Cardigliano enum ionic_qos_sched_type { 1643*01489e5dSAlfredo Cardigliano /* Strict priority */ 1644*01489e5dSAlfredo Cardigliano IONIC_QOS_SCHED_TYPE_STRICT = 0, 1645*01489e5dSAlfredo Cardigliano /* Deficit weighted round-robin */ 1646*01489e5dSAlfredo Cardigliano IONIC_QOS_SCHED_TYPE_DWRR = 1, 1647*01489e5dSAlfredo Cardigliano }; 1648*01489e5dSAlfredo Cardigliano 1649*01489e5dSAlfredo Cardigliano /** 1650*01489e5dSAlfredo Cardigliano * union ionic_qos_config - Qos configuration structure 1651*01489e5dSAlfredo Cardigliano * @flags: Configuration flags 1652*01489e5dSAlfredo Cardigliano * IONIC_QOS_CONFIG_F_ENABLE enable 1653*01489e5dSAlfredo Cardigliano * IONIC_QOS_CONFIG_F_DROP drop/nodrop 1654*01489e5dSAlfredo Cardigliano * IONIC_QOS_CONFIG_F_RW_DOT1Q_PCP enable dot1q pcp rewrite 1655*01489e5dSAlfredo Cardigliano * IONIC_QOS_CONFIG_F_RW_IP_DSCP enable ip dscp rewrite 1656*01489e5dSAlfredo Cardigliano * @sched_type: Qos class scheduling type (enum ionic_qos_sched_type) 1657*01489e5dSAlfredo Cardigliano * @class_type: Qos class type (enum ionic_qos_class_type) 1658*01489e5dSAlfredo Cardigliano * @pause_type: Qos pause type (enum qos_pause_type) 1659*01489e5dSAlfredo Cardigliano * @name: Qos class name 1660*01489e5dSAlfredo Cardigliano * @mtu: MTU of the class 1661*01489e5dSAlfredo Cardigliano * @pfc_dot1q_pcp: Pcp value for pause frames (valid iff F_NODROP) 1662*01489e5dSAlfredo Cardigliano * @dwrr_weight: Qos class scheduling weight 1663*01489e5dSAlfredo Cardigliano * @strict_rlmt: Rate limit for strict priority scheduling 1664*01489e5dSAlfredo Cardigliano * @rw_dot1q_pcp: Rewrite dot1q pcp to this value 1665*01489e5dSAlfredo Cardigliano * (valid iff F_RW_DOT1Q_PCP) 1666*01489e5dSAlfredo Cardigliano * @rw_ip_dscp: Rewrite ip dscp to this value 1667*01489e5dSAlfredo Cardigliano * (valid iff F_RW_IP_DSCP) 1668*01489e5dSAlfredo Cardigliano * @dot1q_pcp: Dot1q pcp value 1669*01489e5dSAlfredo Cardigliano * @ndscp: Number of valid dscp values in the ip_dscp field 1670*01489e5dSAlfredo Cardigliano * @ip_dscp: IP dscp values 1671*01489e5dSAlfredo Cardigliano */ 1672*01489e5dSAlfredo Cardigliano union ionic_qos_config { 1673*01489e5dSAlfredo Cardigliano struct { 1674*01489e5dSAlfredo Cardigliano #define IONIC_QOS_CONFIG_F_ENABLE BIT(0) 1675*01489e5dSAlfredo Cardigliano #define IONIC_QOS_CONFIG_F_DROP BIT(1) 1676*01489e5dSAlfredo Cardigliano #define IONIC_QOS_CONFIG_F_RW_DOT1Q_PCP BIT(2) 1677*01489e5dSAlfredo Cardigliano #define IONIC_QOS_CONFIG_F_RW_IP_DSCP BIT(3) 1678*01489e5dSAlfredo Cardigliano u8 flags; 1679*01489e5dSAlfredo Cardigliano u8 sched_type; 1680*01489e5dSAlfredo Cardigliano u8 class_type; 1681*01489e5dSAlfredo Cardigliano u8 pause_type; 1682*01489e5dSAlfredo Cardigliano char name[IONIC_QOS_CLASS_NAME_SZ]; 1683*01489e5dSAlfredo Cardigliano __le32 mtu; 1684*01489e5dSAlfredo Cardigliano /* flow control */ 1685*01489e5dSAlfredo Cardigliano u8 pfc_cos; 1686*01489e5dSAlfredo Cardigliano /* scheduler */ 1687*01489e5dSAlfredo Cardigliano union { 1688*01489e5dSAlfredo Cardigliano u8 dwrr_weight; 1689*01489e5dSAlfredo Cardigliano __le64 strict_rlmt; 1690*01489e5dSAlfredo Cardigliano }; 1691*01489e5dSAlfredo Cardigliano /* marking */ 1692*01489e5dSAlfredo Cardigliano union { 1693*01489e5dSAlfredo Cardigliano u8 rw_dot1q_pcp; 1694*01489e5dSAlfredo Cardigliano u8 rw_ip_dscp; 1695*01489e5dSAlfredo Cardigliano }; 1696*01489e5dSAlfredo Cardigliano /* classification */ 1697*01489e5dSAlfredo Cardigliano union { 1698*01489e5dSAlfredo Cardigliano u8 dot1q_pcp; 1699*01489e5dSAlfredo Cardigliano struct { 1700*01489e5dSAlfredo Cardigliano u8 ndscp; 1701*01489e5dSAlfredo Cardigliano u8 ip_dscp[IONIC_QOS_DSCP_MAX_VALUES]; 1702*01489e5dSAlfredo Cardigliano }; 1703*01489e5dSAlfredo Cardigliano }; 1704*01489e5dSAlfredo Cardigliano }; 1705*01489e5dSAlfredo Cardigliano __le32 words[64]; 1706*01489e5dSAlfredo Cardigliano }; 1707*01489e5dSAlfredo Cardigliano 1708*01489e5dSAlfredo Cardigliano /** 1709*01489e5dSAlfredo Cardigliano * union ionic_qos_identity - QoS identity structure 1710*01489e5dSAlfredo Cardigliano * @version: Version of the identify structure 1711*01489e5dSAlfredo Cardigliano * @type: QoS system type 1712*01489e5dSAlfredo Cardigliano * @nclasses: Number of usable QoS classes 1713*01489e5dSAlfredo Cardigliano * @config: Current configuration of classes 1714*01489e5dSAlfredo Cardigliano */ 1715*01489e5dSAlfredo Cardigliano union ionic_qos_identity { 1716*01489e5dSAlfredo Cardigliano struct { 1717*01489e5dSAlfredo Cardigliano u8 version; 1718*01489e5dSAlfredo Cardigliano u8 type; 1719*01489e5dSAlfredo Cardigliano u8 rsvd[62]; 1720*01489e5dSAlfredo Cardigliano union ionic_qos_config config[IONIC_QOS_CLASS_MAX]; 1721*01489e5dSAlfredo Cardigliano }; 1722*01489e5dSAlfredo Cardigliano __le32 words[512]; 1723*01489e5dSAlfredo Cardigliano }; 1724*01489e5dSAlfredo Cardigliano 1725*01489e5dSAlfredo Cardigliano /** 1726*01489e5dSAlfredo Cardigliano * struct qos_init_cmd - QoS config init command 1727*01489e5dSAlfredo Cardigliano * @opcode: Opcode 1728*01489e5dSAlfredo Cardigliano * @group: Qos class id 1729*01489e5dSAlfredo Cardigliano * @info_pa: destination address for qos info 1730*01489e5dSAlfredo Cardigliano */ 1731*01489e5dSAlfredo Cardigliano struct ionic_qos_init_cmd { 1732*01489e5dSAlfredo Cardigliano u8 opcode; 1733*01489e5dSAlfredo Cardigliano u8 group; 1734*01489e5dSAlfredo Cardigliano u8 rsvd[6]; 1735*01489e5dSAlfredo Cardigliano __le64 info_pa; 1736*01489e5dSAlfredo Cardigliano u8 rsvd1[48]; 1737*01489e5dSAlfredo Cardigliano }; 1738*01489e5dSAlfredo Cardigliano 1739*01489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_qos_init_comp; 1740*01489e5dSAlfredo Cardigliano 1741*01489e5dSAlfredo Cardigliano /** 1742*01489e5dSAlfredo Cardigliano * struct ionic_qos_reset_cmd - Qos config reset command 1743*01489e5dSAlfredo Cardigliano * @opcode: Opcode 1744*01489e5dSAlfredo Cardigliano */ 1745*01489e5dSAlfredo Cardigliano struct ionic_qos_reset_cmd { 1746*01489e5dSAlfredo Cardigliano u8 opcode; 1747*01489e5dSAlfredo Cardigliano u8 group; 1748*01489e5dSAlfredo Cardigliano u8 rsvd[62]; 1749*01489e5dSAlfredo Cardigliano }; 1750*01489e5dSAlfredo Cardigliano 1751*01489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_qos_reset_comp; 1752*01489e5dSAlfredo Cardigliano 1753*01489e5dSAlfredo Cardigliano /** 1754*01489e5dSAlfredo Cardigliano * struct ionic_fw_download_cmd - Firmware download command 1755*01489e5dSAlfredo Cardigliano * @opcode: opcode 1756*01489e5dSAlfredo Cardigliano * @addr: dma address of the firmware buffer 1757*01489e5dSAlfredo Cardigliano * @offset: offset of the firmware buffer within the full image 1758*01489e5dSAlfredo Cardigliano * @length: number of valid bytes in the firmware buffer 1759*01489e5dSAlfredo Cardigliano */ 1760*01489e5dSAlfredo Cardigliano struct ionic_fw_download_cmd { 1761*01489e5dSAlfredo Cardigliano u8 opcode; 1762*01489e5dSAlfredo Cardigliano u8 rsvd[3]; 1763*01489e5dSAlfredo Cardigliano __le32 offset; 1764*01489e5dSAlfredo Cardigliano __le64 addr; 1765*01489e5dSAlfredo Cardigliano __le32 length; 1766*01489e5dSAlfredo Cardigliano }; 1767*01489e5dSAlfredo Cardigliano 1768*01489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_fw_download_comp; 1769*01489e5dSAlfredo Cardigliano 1770*01489e5dSAlfredo Cardigliano enum ionic_fw_control_oper { 1771*01489e5dSAlfredo Cardigliano IONIC_FW_RESET = 0, /* Reset firmware */ 1772*01489e5dSAlfredo Cardigliano IONIC_FW_INSTALL = 1, /* Install firmware */ 1773*01489e5dSAlfredo Cardigliano IONIC_FW_ACTIVATE = 2, /* Activate firmware */ 1774*01489e5dSAlfredo Cardigliano }; 1775*01489e5dSAlfredo Cardigliano 1776*01489e5dSAlfredo Cardigliano /** 1777*01489e5dSAlfredo Cardigliano * struct ionic_fw_control_cmd - Firmware control command 1778*01489e5dSAlfredo Cardigliano * @opcode: opcode 1779*01489e5dSAlfredo Cardigliano * @oper: firmware control operation (enum ionic_fw_control_oper) 1780*01489e5dSAlfredo Cardigliano * @slot: slot to activate 1781*01489e5dSAlfredo Cardigliano */ 1782*01489e5dSAlfredo Cardigliano struct ionic_fw_control_cmd { 1783*01489e5dSAlfredo Cardigliano u8 opcode; 1784*01489e5dSAlfredo Cardigliano u8 rsvd[3]; 1785*01489e5dSAlfredo Cardigliano u8 oper; 1786*01489e5dSAlfredo Cardigliano u8 slot; 1787*01489e5dSAlfredo Cardigliano u8 rsvd1[58]; 1788*01489e5dSAlfredo Cardigliano }; 1789*01489e5dSAlfredo Cardigliano 1790*01489e5dSAlfredo Cardigliano /** 1791*01489e5dSAlfredo Cardigliano * struct ionic_fw_control_comp - Firmware control copletion 1792*01489e5dSAlfredo Cardigliano * @opcode: opcode 1793*01489e5dSAlfredo Cardigliano * @slot: slot where the firmware was installed 1794*01489e5dSAlfredo Cardigliano */ 1795*01489e5dSAlfredo Cardigliano struct ionic_fw_control_comp { 1796*01489e5dSAlfredo Cardigliano u8 status; 1797*01489e5dSAlfredo Cardigliano u8 rsvd; 1798*01489e5dSAlfredo Cardigliano __le16 comp_index; 1799*01489e5dSAlfredo Cardigliano u8 slot; 1800*01489e5dSAlfredo Cardigliano u8 rsvd1[10]; 1801*01489e5dSAlfredo Cardigliano u8 color; 1802*01489e5dSAlfredo Cardigliano }; 1803*01489e5dSAlfredo Cardigliano 1804*01489e5dSAlfredo Cardigliano /****************************************************************** 1805*01489e5dSAlfredo Cardigliano ******************* RDMA Commands ******************************** 1806*01489e5dSAlfredo Cardigliano ******************************************************************/ 1807*01489e5dSAlfredo Cardigliano 1808*01489e5dSAlfredo Cardigliano /** 1809*01489e5dSAlfredo Cardigliano * struct ionic_rdma_reset_cmd - Reset RDMA LIF cmd 1810*01489e5dSAlfredo Cardigliano * @opcode: opcode 1811*01489e5dSAlfredo Cardigliano * @lif_index: lif index 1812*01489e5dSAlfredo Cardigliano * 1813*01489e5dSAlfredo Cardigliano * There is no rdma specific dev command completion struct. Completion uses 1814*01489e5dSAlfredo Cardigliano * the common struct ionic_admin_comp. Only the status is indicated. 1815*01489e5dSAlfredo Cardigliano * Nonzero status means the LIF does not support rdma. 1816*01489e5dSAlfredo Cardigliano **/ 1817*01489e5dSAlfredo Cardigliano struct ionic_rdma_reset_cmd { 1818*01489e5dSAlfredo Cardigliano u8 opcode; 1819*01489e5dSAlfredo Cardigliano u8 rsvd; 1820*01489e5dSAlfredo Cardigliano __le16 lif_index; 1821*01489e5dSAlfredo Cardigliano u8 rsvd2[60]; 1822*01489e5dSAlfredo Cardigliano }; 1823*01489e5dSAlfredo Cardigliano 1824*01489e5dSAlfredo Cardigliano /** 1825*01489e5dSAlfredo Cardigliano * struct ionic_rdma_queue_cmd - Create RDMA Queue command 1826*01489e5dSAlfredo Cardigliano * @opcode: opcode, 52, 53 1827*01489e5dSAlfredo Cardigliano * @lif_index lif index 1828*01489e5dSAlfredo Cardigliano * @qid_ver: (qid | (rdma version << 24)) 1829*01489e5dSAlfredo Cardigliano * @cid: intr, eq_id, or cq_id 1830*01489e5dSAlfredo Cardigliano * @dbid: doorbell page id 1831*01489e5dSAlfredo Cardigliano * @depth_log2: log base two of queue depth 1832*01489e5dSAlfredo Cardigliano * @stride_log2: log base two of queue stride 1833*01489e5dSAlfredo Cardigliano * @dma_addr: address of the queue memory 1834*01489e5dSAlfredo Cardigliano * @xxx_table_index: temporary, but should not need pgtbl for contig. queues. 1835*01489e5dSAlfredo Cardigliano * 1836*01489e5dSAlfredo Cardigliano * The same command struct is used to create an rdma event queue, completion 1837*01489e5dSAlfredo Cardigliano * queue, or rdma admin queue. The cid is an interrupt number for an event 1838*01489e5dSAlfredo Cardigliano * queue, an event queue id for a completion queue, or a completion queue id 1839*01489e5dSAlfredo Cardigliano * for an rdma admin queue. 1840*01489e5dSAlfredo Cardigliano * 1841*01489e5dSAlfredo Cardigliano * The queue created via a dev command must be contiguous in dma space. 1842*01489e5dSAlfredo Cardigliano * 1843*01489e5dSAlfredo Cardigliano * The dev commands are intended only to be used during driver initialization, 1844*01489e5dSAlfredo Cardigliano * to create queues supporting the rdma admin queue. Other queues, and other 1845*01489e5dSAlfredo Cardigliano * types of rdma resources like memory regions, will be created and registered 1846*01489e5dSAlfredo Cardigliano * via the rdma admin queue, and will support a more complete interface 1847*01489e5dSAlfredo Cardigliano * providing scatter gather lists for larger, scattered queue buffers and 1848*01489e5dSAlfredo Cardigliano * memory registration. 1849*01489e5dSAlfredo Cardigliano * 1850*01489e5dSAlfredo Cardigliano * There is no rdma specific dev command completion struct. Completion uses 1851*01489e5dSAlfredo Cardigliano * the common struct ionic_admin_comp. Only the status is indicated. 1852*01489e5dSAlfredo Cardigliano **/ 1853*01489e5dSAlfredo Cardigliano struct ionic_rdma_queue_cmd { 1854*01489e5dSAlfredo Cardigliano u8 opcode; 1855*01489e5dSAlfredo Cardigliano u8 rsvd; 1856*01489e5dSAlfredo Cardigliano __le16 lif_index; 1857*01489e5dSAlfredo Cardigliano __le32 qid_ver; 1858*01489e5dSAlfredo Cardigliano __le32 cid; 1859*01489e5dSAlfredo Cardigliano __le16 dbid; 1860*01489e5dSAlfredo Cardigliano u8 depth_log2; 1861*01489e5dSAlfredo Cardigliano u8 stride_log2; 1862*01489e5dSAlfredo Cardigliano __le64 dma_addr; 1863*01489e5dSAlfredo Cardigliano u8 rsvd2[36]; 1864*01489e5dSAlfredo Cardigliano __le32 xxx_table_index; 1865*01489e5dSAlfredo Cardigliano }; 1866*01489e5dSAlfredo Cardigliano 1867*01489e5dSAlfredo Cardigliano /****************************************************************** 1868*01489e5dSAlfredo Cardigliano ******************* Notify Events ******************************** 1869*01489e5dSAlfredo Cardigliano ******************************************************************/ 1870*01489e5dSAlfredo Cardigliano 1871*01489e5dSAlfredo Cardigliano /** 1872*01489e5dSAlfredo Cardigliano * struct ionic_notifyq_event 1873*01489e5dSAlfredo Cardigliano * @eid: event number 1874*01489e5dSAlfredo Cardigliano * @ecode: event code 1875*01489e5dSAlfredo Cardigliano * @data: unspecified data about the event 1876*01489e5dSAlfredo Cardigliano * 1877*01489e5dSAlfredo Cardigliano * This is the generic event report struct from which the other 1878*01489e5dSAlfredo Cardigliano * actual events will be formed. 1879*01489e5dSAlfredo Cardigliano */ 1880*01489e5dSAlfredo Cardigliano struct ionic_notifyq_event { 1881*01489e5dSAlfredo Cardigliano __le64 eid; 1882*01489e5dSAlfredo Cardigliano __le16 ecode; 1883*01489e5dSAlfredo Cardigliano u8 data[54]; 1884*01489e5dSAlfredo Cardigliano }; 1885*01489e5dSAlfredo Cardigliano 1886*01489e5dSAlfredo Cardigliano /** 1887*01489e5dSAlfredo Cardigliano * struct ionic_link_change_event 1888*01489e5dSAlfredo Cardigliano * @eid: event number 1889*01489e5dSAlfredo Cardigliano * @ecode: event code = EVENT_OPCODE_LINK_CHANGE 1890*01489e5dSAlfredo Cardigliano * @link_status: link up or down, with error bits (enum port_status) 1891*01489e5dSAlfredo Cardigliano * @link_speed: speed of the network link 1892*01489e5dSAlfredo Cardigliano * 1893*01489e5dSAlfredo Cardigliano * Sent when the network link state changes between UP and DOWN 1894*01489e5dSAlfredo Cardigliano */ 1895*01489e5dSAlfredo Cardigliano struct ionic_link_change_event { 1896*01489e5dSAlfredo Cardigliano __le64 eid; 1897*01489e5dSAlfredo Cardigliano __le16 ecode; 1898*01489e5dSAlfredo Cardigliano __le16 link_status; 1899*01489e5dSAlfredo Cardigliano __le32 link_speed; /* units of 1Mbps: e.g. 10000 = 10Gbps */ 1900*01489e5dSAlfredo Cardigliano u8 rsvd[48]; 1901*01489e5dSAlfredo Cardigliano }; 1902*01489e5dSAlfredo Cardigliano 1903*01489e5dSAlfredo Cardigliano /** 1904*01489e5dSAlfredo Cardigliano * struct ionic_reset_event 1905*01489e5dSAlfredo Cardigliano * @eid: event number 1906*01489e5dSAlfredo Cardigliano * @ecode: event code = EVENT_OPCODE_RESET 1907*01489e5dSAlfredo Cardigliano * @reset_code: reset type 1908*01489e5dSAlfredo Cardigliano * @state: 0=pending, 1=complete, 2=error 1909*01489e5dSAlfredo Cardigliano * 1910*01489e5dSAlfredo Cardigliano * Sent when the NIC or some subsystem is going to be or 1911*01489e5dSAlfredo Cardigliano * has been reset. 1912*01489e5dSAlfredo Cardigliano */ 1913*01489e5dSAlfredo Cardigliano struct ionic_reset_event { 1914*01489e5dSAlfredo Cardigliano __le64 eid; 1915*01489e5dSAlfredo Cardigliano __le16 ecode; 1916*01489e5dSAlfredo Cardigliano u8 reset_code; 1917*01489e5dSAlfredo Cardigliano u8 state; 1918*01489e5dSAlfredo Cardigliano u8 rsvd[52]; 1919*01489e5dSAlfredo Cardigliano }; 1920*01489e5dSAlfredo Cardigliano 1921*01489e5dSAlfredo Cardigliano /** 1922*01489e5dSAlfredo Cardigliano * struct ionic_heartbeat_event 1923*01489e5dSAlfredo Cardigliano * @eid: event number 1924*01489e5dSAlfredo Cardigliano * @ecode: event code = EVENT_OPCODE_HEARTBEAT 1925*01489e5dSAlfredo Cardigliano * 1926*01489e5dSAlfredo Cardigliano * Sent periodically by the NIC to indicate continued health 1927*01489e5dSAlfredo Cardigliano */ 1928*01489e5dSAlfredo Cardigliano struct ionic_heartbeat_event { 1929*01489e5dSAlfredo Cardigliano __le64 eid; 1930*01489e5dSAlfredo Cardigliano __le16 ecode; 1931*01489e5dSAlfredo Cardigliano u8 rsvd[54]; 1932*01489e5dSAlfredo Cardigliano }; 1933*01489e5dSAlfredo Cardigliano 1934*01489e5dSAlfredo Cardigliano /** 1935*01489e5dSAlfredo Cardigliano * struct ionic_log_event 1936*01489e5dSAlfredo Cardigliano * @eid: event number 1937*01489e5dSAlfredo Cardigliano * @ecode: event code = EVENT_OPCODE_LOG 1938*01489e5dSAlfredo Cardigliano * @data: log data 1939*01489e5dSAlfredo Cardigliano * 1940*01489e5dSAlfredo Cardigliano * Sent to notify the driver of an internal error. 1941*01489e5dSAlfredo Cardigliano */ 1942*01489e5dSAlfredo Cardigliano struct ionic_log_event { 1943*01489e5dSAlfredo Cardigliano __le64 eid; 1944*01489e5dSAlfredo Cardigliano __le16 ecode; 1945*01489e5dSAlfredo Cardigliano u8 data[54]; 1946*01489e5dSAlfredo Cardigliano }; 1947*01489e5dSAlfredo Cardigliano 1948*01489e5dSAlfredo Cardigliano /** 1949*01489e5dSAlfredo Cardigliano * struct ionic_port_stats 1950*01489e5dSAlfredo Cardigliano */ 1951*01489e5dSAlfredo Cardigliano struct ionic_port_stats { 1952*01489e5dSAlfredo Cardigliano __le64 frames_rx_ok; 1953*01489e5dSAlfredo Cardigliano __le64 frames_rx_all; 1954*01489e5dSAlfredo Cardigliano __le64 frames_rx_bad_fcs; 1955*01489e5dSAlfredo Cardigliano __le64 frames_rx_bad_all; 1956*01489e5dSAlfredo Cardigliano __le64 octets_rx_ok; 1957*01489e5dSAlfredo Cardigliano __le64 octets_rx_all; 1958*01489e5dSAlfredo Cardigliano __le64 frames_rx_unicast; 1959*01489e5dSAlfredo Cardigliano __le64 frames_rx_multicast; 1960*01489e5dSAlfredo Cardigliano __le64 frames_rx_broadcast; 1961*01489e5dSAlfredo Cardigliano __le64 frames_rx_pause; 1962*01489e5dSAlfredo Cardigliano __le64 frames_rx_bad_length; 1963*01489e5dSAlfredo Cardigliano __le64 frames_rx_undersized; 1964*01489e5dSAlfredo Cardigliano __le64 frames_rx_oversized; 1965*01489e5dSAlfredo Cardigliano __le64 frames_rx_fragments; 1966*01489e5dSAlfredo Cardigliano __le64 frames_rx_jabber; 1967*01489e5dSAlfredo Cardigliano __le64 frames_rx_pripause; 1968*01489e5dSAlfredo Cardigliano __le64 frames_rx_stomped_crc; 1969*01489e5dSAlfredo Cardigliano __le64 frames_rx_too_long; 1970*01489e5dSAlfredo Cardigliano __le64 frames_rx_vlan_good; 1971*01489e5dSAlfredo Cardigliano __le64 frames_rx_dropped; 1972*01489e5dSAlfredo Cardigliano __le64 frames_rx_less_than_64b; 1973*01489e5dSAlfredo Cardigliano __le64 frames_rx_64b; 1974*01489e5dSAlfredo Cardigliano __le64 frames_rx_65b_127b; 1975*01489e5dSAlfredo Cardigliano __le64 frames_rx_128b_255b; 1976*01489e5dSAlfredo Cardigliano __le64 frames_rx_256b_511b; 1977*01489e5dSAlfredo Cardigliano __le64 frames_rx_512b_1023b; 1978*01489e5dSAlfredo Cardigliano __le64 frames_rx_1024b_1518b; 1979*01489e5dSAlfredo Cardigliano __le64 frames_rx_1519b_2047b; 1980*01489e5dSAlfredo Cardigliano __le64 frames_rx_2048b_4095b; 1981*01489e5dSAlfredo Cardigliano __le64 frames_rx_4096b_8191b; 1982*01489e5dSAlfredo Cardigliano __le64 frames_rx_8192b_9215b; 1983*01489e5dSAlfredo Cardigliano __le64 frames_rx_other; 1984*01489e5dSAlfredo Cardigliano __le64 frames_tx_ok; 1985*01489e5dSAlfredo Cardigliano __le64 frames_tx_all; 1986*01489e5dSAlfredo Cardigliano __le64 frames_tx_bad; 1987*01489e5dSAlfredo Cardigliano __le64 octets_tx_ok; 1988*01489e5dSAlfredo Cardigliano __le64 octets_tx_total; 1989*01489e5dSAlfredo Cardigliano __le64 frames_tx_unicast; 1990*01489e5dSAlfredo Cardigliano __le64 frames_tx_multicast; 1991*01489e5dSAlfredo Cardigliano __le64 frames_tx_broadcast; 1992*01489e5dSAlfredo Cardigliano __le64 frames_tx_pause; 1993*01489e5dSAlfredo Cardigliano __le64 frames_tx_pripause; 1994*01489e5dSAlfredo Cardigliano __le64 frames_tx_vlan; 1995*01489e5dSAlfredo Cardigliano __le64 frames_tx_less_than_64b; 1996*01489e5dSAlfredo Cardigliano __le64 frames_tx_64b; 1997*01489e5dSAlfredo Cardigliano __le64 frames_tx_65b_127b; 1998*01489e5dSAlfredo Cardigliano __le64 frames_tx_128b_255b; 1999*01489e5dSAlfredo Cardigliano __le64 frames_tx_256b_511b; 2000*01489e5dSAlfredo Cardigliano __le64 frames_tx_512b_1023b; 2001*01489e5dSAlfredo Cardigliano __le64 frames_tx_1024b_1518b; 2002*01489e5dSAlfredo Cardigliano __le64 frames_tx_1519b_2047b; 2003*01489e5dSAlfredo Cardigliano __le64 frames_tx_2048b_4095b; 2004*01489e5dSAlfredo Cardigliano __le64 frames_tx_4096b_8191b; 2005*01489e5dSAlfredo Cardigliano __le64 frames_tx_8192b_9215b; 2006*01489e5dSAlfredo Cardigliano __le64 frames_tx_other; 2007*01489e5dSAlfredo Cardigliano __le64 frames_tx_pri_0; 2008*01489e5dSAlfredo Cardigliano __le64 frames_tx_pri_1; 2009*01489e5dSAlfredo Cardigliano __le64 frames_tx_pri_2; 2010*01489e5dSAlfredo Cardigliano __le64 frames_tx_pri_3; 2011*01489e5dSAlfredo Cardigliano __le64 frames_tx_pri_4; 2012*01489e5dSAlfredo Cardigliano __le64 frames_tx_pri_5; 2013*01489e5dSAlfredo Cardigliano __le64 frames_tx_pri_6; 2014*01489e5dSAlfredo Cardigliano __le64 frames_tx_pri_7; 2015*01489e5dSAlfredo Cardigliano __le64 frames_rx_pri_0; 2016*01489e5dSAlfredo Cardigliano __le64 frames_rx_pri_1; 2017*01489e5dSAlfredo Cardigliano __le64 frames_rx_pri_2; 2018*01489e5dSAlfredo Cardigliano __le64 frames_rx_pri_3; 2019*01489e5dSAlfredo Cardigliano __le64 frames_rx_pri_4; 2020*01489e5dSAlfredo Cardigliano __le64 frames_rx_pri_5; 2021*01489e5dSAlfredo Cardigliano __le64 frames_rx_pri_6; 2022*01489e5dSAlfredo Cardigliano __le64 frames_rx_pri_7; 2023*01489e5dSAlfredo Cardigliano __le64 tx_pripause_0_1us_count; 2024*01489e5dSAlfredo Cardigliano __le64 tx_pripause_1_1us_count; 2025*01489e5dSAlfredo Cardigliano __le64 tx_pripause_2_1us_count; 2026*01489e5dSAlfredo Cardigliano __le64 tx_pripause_3_1us_count; 2027*01489e5dSAlfredo Cardigliano __le64 tx_pripause_4_1us_count; 2028*01489e5dSAlfredo Cardigliano __le64 tx_pripause_5_1us_count; 2029*01489e5dSAlfredo Cardigliano __le64 tx_pripause_6_1us_count; 2030*01489e5dSAlfredo Cardigliano __le64 tx_pripause_7_1us_count; 2031*01489e5dSAlfredo Cardigliano __le64 rx_pripause_0_1us_count; 2032*01489e5dSAlfredo Cardigliano __le64 rx_pripause_1_1us_count; 2033*01489e5dSAlfredo Cardigliano __le64 rx_pripause_2_1us_count; 2034*01489e5dSAlfredo Cardigliano __le64 rx_pripause_3_1us_count; 2035*01489e5dSAlfredo Cardigliano __le64 rx_pripause_4_1us_count; 2036*01489e5dSAlfredo Cardigliano __le64 rx_pripause_5_1us_count; 2037*01489e5dSAlfredo Cardigliano __le64 rx_pripause_6_1us_count; 2038*01489e5dSAlfredo Cardigliano __le64 rx_pripause_7_1us_count; 2039*01489e5dSAlfredo Cardigliano __le64 rx_pause_1us_count; 2040*01489e5dSAlfredo Cardigliano __le64 frames_tx_truncated; 2041*01489e5dSAlfredo Cardigliano }; 2042*01489e5dSAlfredo Cardigliano 2043*01489e5dSAlfredo Cardigliano struct ionic_mgmt_port_stats { 2044*01489e5dSAlfredo Cardigliano __le64 frames_rx_ok; 2045*01489e5dSAlfredo Cardigliano __le64 frames_rx_all; 2046*01489e5dSAlfredo Cardigliano __le64 frames_rx_bad_fcs; 2047*01489e5dSAlfredo Cardigliano __le64 frames_rx_bad_all; 2048*01489e5dSAlfredo Cardigliano __le64 octets_rx_ok; 2049*01489e5dSAlfredo Cardigliano __le64 octets_rx_all; 2050*01489e5dSAlfredo Cardigliano __le64 frames_rx_unicast; 2051*01489e5dSAlfredo Cardigliano __le64 frames_rx_multicast; 2052*01489e5dSAlfredo Cardigliano __le64 frames_rx_broadcast; 2053*01489e5dSAlfredo Cardigliano __le64 frames_rx_pause; 2054*01489e5dSAlfredo Cardigliano __le64 frames_rx_bad_length0; 2055*01489e5dSAlfredo Cardigliano __le64 frames_rx_undersized1; 2056*01489e5dSAlfredo Cardigliano __le64 frames_rx_oversized2; 2057*01489e5dSAlfredo Cardigliano __le64 frames_rx_fragments3; 2058*01489e5dSAlfredo Cardigliano __le64 frames_rx_jabber4; 2059*01489e5dSAlfredo Cardigliano __le64 frames_rx_64b5; 2060*01489e5dSAlfredo Cardigliano __le64 frames_rx_65b_127b6; 2061*01489e5dSAlfredo Cardigliano __le64 frames_rx_128b_255b7; 2062*01489e5dSAlfredo Cardigliano __le64 frames_rx_256b_511b8; 2063*01489e5dSAlfredo Cardigliano __le64 frames_rx_512b_1023b9; 2064*01489e5dSAlfredo Cardigliano __le64 frames_rx_1024b_1518b0; 2065*01489e5dSAlfredo Cardigliano __le64 frames_rx_gt_1518b1; 2066*01489e5dSAlfredo Cardigliano __le64 frames_rx_fifo_full2; 2067*01489e5dSAlfredo Cardigliano __le64 frames_tx_ok3; 2068*01489e5dSAlfredo Cardigliano __le64 frames_tx_all4; 2069*01489e5dSAlfredo Cardigliano __le64 frames_tx_bad5; 2070*01489e5dSAlfredo Cardigliano __le64 octets_tx_ok6; 2071*01489e5dSAlfredo Cardigliano __le64 octets_tx_total7; 2072*01489e5dSAlfredo Cardigliano __le64 frames_tx_unicast8; 2073*01489e5dSAlfredo Cardigliano __le64 frames_tx_multicast9; 2074*01489e5dSAlfredo Cardigliano __le64 frames_tx_broadcast0; 2075*01489e5dSAlfredo Cardigliano __le64 frames_tx_pause1; 2076*01489e5dSAlfredo Cardigliano }; 2077*01489e5dSAlfredo Cardigliano 2078*01489e5dSAlfredo Cardigliano /** 2079*01489e5dSAlfredo Cardigliano * struct ionic_port_identity - port identity structure 2080*01489e5dSAlfredo Cardigliano * @version: identity structure version 2081*01489e5dSAlfredo Cardigliano * @type: type of port (enum port_type) 2082*01489e5dSAlfredo Cardigliano * @num_lanes: number of lanes for the port 2083*01489e5dSAlfredo Cardigliano * @autoneg: autoneg supported 2084*01489e5dSAlfredo Cardigliano * @min_frame_size: minimum frame size supported 2085*01489e5dSAlfredo Cardigliano * @max_frame_size: maximum frame size supported 2086*01489e5dSAlfredo Cardigliano * @fec_type: supported fec types 2087*01489e5dSAlfredo Cardigliano * @pause_type: supported pause types 2088*01489e5dSAlfredo Cardigliano * @loopback_mode: supported loopback mode 2089*01489e5dSAlfredo Cardigliano * @speeds: supported speeds 2090*01489e5dSAlfredo Cardigliano * @config: current port configuration 2091*01489e5dSAlfredo Cardigliano */ 2092*01489e5dSAlfredo Cardigliano union ionic_port_identity { 2093*01489e5dSAlfredo Cardigliano struct { 2094*01489e5dSAlfredo Cardigliano u8 version; 2095*01489e5dSAlfredo Cardigliano u8 type; 2096*01489e5dSAlfredo Cardigliano u8 num_lanes; 2097*01489e5dSAlfredo Cardigliano u8 autoneg; 2098*01489e5dSAlfredo Cardigliano __le32 min_frame_size; 2099*01489e5dSAlfredo Cardigliano __le32 max_frame_size; 2100*01489e5dSAlfredo Cardigliano u8 fec_type[4]; 2101*01489e5dSAlfredo Cardigliano u8 pause_type[2]; 2102*01489e5dSAlfredo Cardigliano u8 loopback_mode[2]; 2103*01489e5dSAlfredo Cardigliano __le32 speeds[16]; 2104*01489e5dSAlfredo Cardigliano u8 rsvd2[44]; 2105*01489e5dSAlfredo Cardigliano union ionic_port_config config; 2106*01489e5dSAlfredo Cardigliano }; 2107*01489e5dSAlfredo Cardigliano __le32 words[512]; 2108*01489e5dSAlfredo Cardigliano }; 2109*01489e5dSAlfredo Cardigliano 2110*01489e5dSAlfredo Cardigliano /** 2111*01489e5dSAlfredo Cardigliano * struct ionic_port_info - port info structure 2112*01489e5dSAlfredo Cardigliano * @port_status: port status 2113*01489e5dSAlfredo Cardigliano * @port_stats: port stats 2114*01489e5dSAlfredo Cardigliano */ 2115*01489e5dSAlfredo Cardigliano struct ionic_port_info { 2116*01489e5dSAlfredo Cardigliano union ionic_port_config config; 2117*01489e5dSAlfredo Cardigliano struct ionic_port_status status; 2118*01489e5dSAlfredo Cardigliano struct ionic_port_stats stats; 2119*01489e5dSAlfredo Cardigliano }; 2120*01489e5dSAlfredo Cardigliano 2121*01489e5dSAlfredo Cardigliano /** 2122*01489e5dSAlfredo Cardigliano * struct ionic_lif_stats 2123*01489e5dSAlfredo Cardigliano */ 2124*01489e5dSAlfredo Cardigliano struct ionic_lif_stats { 2125*01489e5dSAlfredo Cardigliano /* RX */ 2126*01489e5dSAlfredo Cardigliano __le64 rx_ucast_bytes; 2127*01489e5dSAlfredo Cardigliano __le64 rx_ucast_packets; 2128*01489e5dSAlfredo Cardigliano __le64 rx_mcast_bytes; 2129*01489e5dSAlfredo Cardigliano __le64 rx_mcast_packets; 2130*01489e5dSAlfredo Cardigliano __le64 rx_bcast_bytes; 2131*01489e5dSAlfredo Cardigliano __le64 rx_bcast_packets; 2132*01489e5dSAlfredo Cardigliano __le64 rsvd0; 2133*01489e5dSAlfredo Cardigliano __le64 rsvd1; 2134*01489e5dSAlfredo Cardigliano /* RX drops */ 2135*01489e5dSAlfredo Cardigliano __le64 rx_ucast_drop_bytes; 2136*01489e5dSAlfredo Cardigliano __le64 rx_ucast_drop_packets; 2137*01489e5dSAlfredo Cardigliano __le64 rx_mcast_drop_bytes; 2138*01489e5dSAlfredo Cardigliano __le64 rx_mcast_drop_packets; 2139*01489e5dSAlfredo Cardigliano __le64 rx_bcast_drop_bytes; 2140*01489e5dSAlfredo Cardigliano __le64 rx_bcast_drop_packets; 2141*01489e5dSAlfredo Cardigliano __le64 rx_dma_error; 2142*01489e5dSAlfredo Cardigliano __le64 rsvd2; 2143*01489e5dSAlfredo Cardigliano /* TX */ 2144*01489e5dSAlfredo Cardigliano __le64 tx_ucast_bytes; 2145*01489e5dSAlfredo Cardigliano __le64 tx_ucast_packets; 2146*01489e5dSAlfredo Cardigliano __le64 tx_mcast_bytes; 2147*01489e5dSAlfredo Cardigliano __le64 tx_mcast_packets; 2148*01489e5dSAlfredo Cardigliano __le64 tx_bcast_bytes; 2149*01489e5dSAlfredo Cardigliano __le64 tx_bcast_packets; 2150*01489e5dSAlfredo Cardigliano __le64 rsvd3; 2151*01489e5dSAlfredo Cardigliano __le64 rsvd4; 2152*01489e5dSAlfredo Cardigliano /* TX drops */ 2153*01489e5dSAlfredo Cardigliano __le64 tx_ucast_drop_bytes; 2154*01489e5dSAlfredo Cardigliano __le64 tx_ucast_drop_packets; 2155*01489e5dSAlfredo Cardigliano __le64 tx_mcast_drop_bytes; 2156*01489e5dSAlfredo Cardigliano __le64 tx_mcast_drop_packets; 2157*01489e5dSAlfredo Cardigliano __le64 tx_bcast_drop_bytes; 2158*01489e5dSAlfredo Cardigliano __le64 tx_bcast_drop_packets; 2159*01489e5dSAlfredo Cardigliano __le64 tx_dma_error; 2160*01489e5dSAlfredo Cardigliano __le64 rsvd5; 2161*01489e5dSAlfredo Cardigliano /* Rx Queue/Ring drops */ 2162*01489e5dSAlfredo Cardigliano __le64 rx_queue_disabled; 2163*01489e5dSAlfredo Cardigliano __le64 rx_queue_empty; 2164*01489e5dSAlfredo Cardigliano __le64 rx_queue_error; 2165*01489e5dSAlfredo Cardigliano __le64 rx_desc_fetch_error; 2166*01489e5dSAlfredo Cardigliano __le64 rx_desc_data_error; 2167*01489e5dSAlfredo Cardigliano __le64 rsvd6; 2168*01489e5dSAlfredo Cardigliano __le64 rsvd7; 2169*01489e5dSAlfredo Cardigliano __le64 rsvd8; 2170*01489e5dSAlfredo Cardigliano /* Tx Queue/Ring drops */ 2171*01489e5dSAlfredo Cardigliano __le64 tx_queue_disabled; 2172*01489e5dSAlfredo Cardigliano __le64 tx_queue_error; 2173*01489e5dSAlfredo Cardigliano __le64 tx_desc_fetch_error; 2174*01489e5dSAlfredo Cardigliano __le64 tx_desc_data_error; 2175*01489e5dSAlfredo Cardigliano __le64 rsvd9; 2176*01489e5dSAlfredo Cardigliano __le64 rsvd10; 2177*01489e5dSAlfredo Cardigliano __le64 rsvd11; 2178*01489e5dSAlfredo Cardigliano __le64 rsvd12; 2179*01489e5dSAlfredo Cardigliano 2180*01489e5dSAlfredo Cardigliano /* RDMA/ROCE TX */ 2181*01489e5dSAlfredo Cardigliano __le64 tx_rdma_ucast_bytes; 2182*01489e5dSAlfredo Cardigliano __le64 tx_rdma_ucast_packets; 2183*01489e5dSAlfredo Cardigliano __le64 tx_rdma_mcast_bytes; 2184*01489e5dSAlfredo Cardigliano __le64 tx_rdma_mcast_packets; 2185*01489e5dSAlfredo Cardigliano __le64 tx_rdma_cnp_packets; 2186*01489e5dSAlfredo Cardigliano __le64 rsvd13; 2187*01489e5dSAlfredo Cardigliano __le64 rsvd14; 2188*01489e5dSAlfredo Cardigliano __le64 rsvd15; 2189*01489e5dSAlfredo Cardigliano 2190*01489e5dSAlfredo Cardigliano /* RDMA/ROCE RX */ 2191*01489e5dSAlfredo Cardigliano __le64 rx_rdma_ucast_bytes; 2192*01489e5dSAlfredo Cardigliano __le64 rx_rdma_ucast_packets; 2193*01489e5dSAlfredo Cardigliano __le64 rx_rdma_mcast_bytes; 2194*01489e5dSAlfredo Cardigliano __le64 rx_rdma_mcast_packets; 2195*01489e5dSAlfredo Cardigliano __le64 rx_rdma_cnp_packets; 2196*01489e5dSAlfredo Cardigliano __le64 rx_rdma_ecn_packets; 2197*01489e5dSAlfredo Cardigliano __le64 rsvd16; 2198*01489e5dSAlfredo Cardigliano __le64 rsvd17; 2199*01489e5dSAlfredo Cardigliano 2200*01489e5dSAlfredo Cardigliano __le64 rsvd18; 2201*01489e5dSAlfredo Cardigliano __le64 rsvd19; 2202*01489e5dSAlfredo Cardigliano __le64 rsvd20; 2203*01489e5dSAlfredo Cardigliano __le64 rsvd21; 2204*01489e5dSAlfredo Cardigliano __le64 rsvd22; 2205*01489e5dSAlfredo Cardigliano __le64 rsvd23; 2206*01489e5dSAlfredo Cardigliano __le64 rsvd24; 2207*01489e5dSAlfredo Cardigliano __le64 rsvd25; 2208*01489e5dSAlfredo Cardigliano 2209*01489e5dSAlfredo Cardigliano __le64 rsvd26; 2210*01489e5dSAlfredo Cardigliano __le64 rsvd27; 2211*01489e5dSAlfredo Cardigliano __le64 rsvd28; 2212*01489e5dSAlfredo Cardigliano __le64 rsvd29; 2213*01489e5dSAlfredo Cardigliano __le64 rsvd30; 2214*01489e5dSAlfredo Cardigliano __le64 rsvd31; 2215*01489e5dSAlfredo Cardigliano __le64 rsvd32; 2216*01489e5dSAlfredo Cardigliano __le64 rsvd33; 2217*01489e5dSAlfredo Cardigliano 2218*01489e5dSAlfredo Cardigliano __le64 rsvd34; 2219*01489e5dSAlfredo Cardigliano __le64 rsvd35; 2220*01489e5dSAlfredo Cardigliano __le64 rsvd36; 2221*01489e5dSAlfredo Cardigliano __le64 rsvd37; 2222*01489e5dSAlfredo Cardigliano __le64 rsvd38; 2223*01489e5dSAlfredo Cardigliano __le64 rsvd39; 2224*01489e5dSAlfredo Cardigliano __le64 rsvd40; 2225*01489e5dSAlfredo Cardigliano __le64 rsvd41; 2226*01489e5dSAlfredo Cardigliano 2227*01489e5dSAlfredo Cardigliano __le64 rsvd42; 2228*01489e5dSAlfredo Cardigliano __le64 rsvd43; 2229*01489e5dSAlfredo Cardigliano __le64 rsvd44; 2230*01489e5dSAlfredo Cardigliano __le64 rsvd45; 2231*01489e5dSAlfredo Cardigliano __le64 rsvd46; 2232*01489e5dSAlfredo Cardigliano __le64 rsvd47; 2233*01489e5dSAlfredo Cardigliano __le64 rsvd48; 2234*01489e5dSAlfredo Cardigliano __le64 rsvd49; 2235*01489e5dSAlfredo Cardigliano 2236*01489e5dSAlfredo Cardigliano /* RDMA/ROCE REQ Error/Debugs (768 - 895) */ 2237*01489e5dSAlfredo Cardigliano __le64 rdma_req_rx_pkt_seq_err; 2238*01489e5dSAlfredo Cardigliano __le64 rdma_req_rx_rnr_retry_err; 2239*01489e5dSAlfredo Cardigliano __le64 rdma_req_rx_remote_access_err; 2240*01489e5dSAlfredo Cardigliano __le64 rdma_req_rx_remote_inv_req_err; 2241*01489e5dSAlfredo Cardigliano __le64 rdma_req_rx_remote_oper_err; 2242*01489e5dSAlfredo Cardigliano __le64 rdma_req_rx_implied_nak_seq_err; 2243*01489e5dSAlfredo Cardigliano __le64 rdma_req_rx_cqe_err; 2244*01489e5dSAlfredo Cardigliano __le64 rdma_req_rx_cqe_flush_err; 2245*01489e5dSAlfredo Cardigliano 2246*01489e5dSAlfredo Cardigliano __le64 rdma_req_rx_dup_responses; 2247*01489e5dSAlfredo Cardigliano __le64 rdma_req_rx_invalid_packets; 2248*01489e5dSAlfredo Cardigliano __le64 rdma_req_tx_local_access_err; 2249*01489e5dSAlfredo Cardigliano __le64 rdma_req_tx_local_oper_err; 2250*01489e5dSAlfredo Cardigliano __le64 rdma_req_tx_memory_mgmt_err; 2251*01489e5dSAlfredo Cardigliano __le64 rsvd52; 2252*01489e5dSAlfredo Cardigliano __le64 rsvd53; 2253*01489e5dSAlfredo Cardigliano __le64 rsvd54; 2254*01489e5dSAlfredo Cardigliano 2255*01489e5dSAlfredo Cardigliano /* RDMA/ROCE RESP Error/Debugs (896 - 1023) */ 2256*01489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_dup_requests; 2257*01489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_out_of_buffer; 2258*01489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_out_of_seq_pkts; 2259*01489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_cqe_err; 2260*01489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_cqe_flush_err; 2261*01489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_local_len_err; 2262*01489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_inv_request_err; 2263*01489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_local_qp_oper_err; 2264*01489e5dSAlfredo Cardigliano 2265*01489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_out_of_atomic_resource; 2266*01489e5dSAlfredo Cardigliano __le64 rdma_resp_tx_pkt_seq_err; 2267*01489e5dSAlfredo Cardigliano __le64 rdma_resp_tx_remote_inv_req_err; 2268*01489e5dSAlfredo Cardigliano __le64 rdma_resp_tx_remote_access_err; 2269*01489e5dSAlfredo Cardigliano __le64 rdma_resp_tx_remote_oper_err; 2270*01489e5dSAlfredo Cardigliano __le64 rdma_resp_tx_rnr_retry_err; 2271*01489e5dSAlfredo Cardigliano __le64 rsvd57; 2272*01489e5dSAlfredo Cardigliano __le64 rsvd58; 2273*01489e5dSAlfredo Cardigliano }; 2274*01489e5dSAlfredo Cardigliano 2275*01489e5dSAlfredo Cardigliano /** 2276*01489e5dSAlfredo Cardigliano * struct ionic_lif_info - lif info structure 2277*01489e5dSAlfredo Cardigliano */ 2278*01489e5dSAlfredo Cardigliano struct ionic_lif_info { 2279*01489e5dSAlfredo Cardigliano union ionic_lif_config config; 2280*01489e5dSAlfredo Cardigliano struct ionic_lif_status status; 2281*01489e5dSAlfredo Cardigliano struct ionic_lif_stats stats; 2282*01489e5dSAlfredo Cardigliano }; 2283*01489e5dSAlfredo Cardigliano 2284*01489e5dSAlfredo Cardigliano union ionic_dev_cmd { 2285*01489e5dSAlfredo Cardigliano u32 words[16]; 2286*01489e5dSAlfredo Cardigliano struct ionic_admin_cmd cmd; 2287*01489e5dSAlfredo Cardigliano struct ionic_nop_cmd nop; 2288*01489e5dSAlfredo Cardigliano 2289*01489e5dSAlfredo Cardigliano struct ionic_dev_identify_cmd identify; 2290*01489e5dSAlfredo Cardigliano struct ionic_dev_init_cmd init; 2291*01489e5dSAlfredo Cardigliano struct ionic_dev_reset_cmd reset; 2292*01489e5dSAlfredo Cardigliano struct ionic_dev_getattr_cmd getattr; 2293*01489e5dSAlfredo Cardigliano struct ionic_dev_setattr_cmd setattr; 2294*01489e5dSAlfredo Cardigliano 2295*01489e5dSAlfredo Cardigliano struct ionic_port_identify_cmd port_identify; 2296*01489e5dSAlfredo Cardigliano struct ionic_port_init_cmd port_init; 2297*01489e5dSAlfredo Cardigliano struct ionic_port_reset_cmd port_reset; 2298*01489e5dSAlfredo Cardigliano struct ionic_port_getattr_cmd port_getattr; 2299*01489e5dSAlfredo Cardigliano struct ionic_port_setattr_cmd port_setattr; 2300*01489e5dSAlfredo Cardigliano 2301*01489e5dSAlfredo Cardigliano struct ionic_lif_identify_cmd lif_identify; 2302*01489e5dSAlfredo Cardigliano struct ionic_lif_init_cmd lif_init; 2303*01489e5dSAlfredo Cardigliano struct ionic_lif_reset_cmd lif_reset; 2304*01489e5dSAlfredo Cardigliano 2305*01489e5dSAlfredo Cardigliano struct ionic_qos_identify_cmd qos_identify; 2306*01489e5dSAlfredo Cardigliano struct ionic_qos_init_cmd qos_init; 2307*01489e5dSAlfredo Cardigliano struct ionic_qos_reset_cmd qos_reset; 2308*01489e5dSAlfredo Cardigliano 2309*01489e5dSAlfredo Cardigliano struct ionic_q_init_cmd q_init; 2310*01489e5dSAlfredo Cardigliano }; 2311*01489e5dSAlfredo Cardigliano 2312*01489e5dSAlfredo Cardigliano union ionic_dev_cmd_comp { 2313*01489e5dSAlfredo Cardigliano u32 words[4]; 2314*01489e5dSAlfredo Cardigliano u8 status; 2315*01489e5dSAlfredo Cardigliano struct ionic_admin_comp comp; 2316*01489e5dSAlfredo Cardigliano struct ionic_nop_comp nop; 2317*01489e5dSAlfredo Cardigliano 2318*01489e5dSAlfredo Cardigliano struct ionic_dev_identify_comp identify; 2319*01489e5dSAlfredo Cardigliano struct ionic_dev_init_comp init; 2320*01489e5dSAlfredo Cardigliano struct ionic_dev_reset_comp reset; 2321*01489e5dSAlfredo Cardigliano struct ionic_dev_getattr_comp getattr; 2322*01489e5dSAlfredo Cardigliano struct ionic_dev_setattr_comp setattr; 2323*01489e5dSAlfredo Cardigliano 2324*01489e5dSAlfredo Cardigliano struct ionic_port_identify_comp port_identify; 2325*01489e5dSAlfredo Cardigliano struct ionic_port_init_comp port_init; 2326*01489e5dSAlfredo Cardigliano struct ionic_port_reset_comp port_reset; 2327*01489e5dSAlfredo Cardigliano struct ionic_port_getattr_comp port_getattr; 2328*01489e5dSAlfredo Cardigliano struct ionic_port_setattr_comp port_setattr; 2329*01489e5dSAlfredo Cardigliano 2330*01489e5dSAlfredo Cardigliano struct ionic_lif_identify_comp lif_identify; 2331*01489e5dSAlfredo Cardigliano struct ionic_lif_init_comp lif_init; 2332*01489e5dSAlfredo Cardigliano ionic_lif_reset_comp lif_reset; 2333*01489e5dSAlfredo Cardigliano 2334*01489e5dSAlfredo Cardigliano struct ionic_qos_identify_comp qos_identify; 2335*01489e5dSAlfredo Cardigliano ionic_qos_init_comp qos_init; 2336*01489e5dSAlfredo Cardigliano ionic_qos_reset_comp qos_reset; 2337*01489e5dSAlfredo Cardigliano 2338*01489e5dSAlfredo Cardigliano struct ionic_q_init_comp q_init; 2339*01489e5dSAlfredo Cardigliano }; 2340*01489e5dSAlfredo Cardigliano 2341*01489e5dSAlfredo Cardigliano /** 2342*01489e5dSAlfredo Cardigliano * union dev_info - Device info register format (read-only) 2343*01489e5dSAlfredo Cardigliano * @signature: Signature value of 0x44455649 ('DEVI'). 2344*01489e5dSAlfredo Cardigliano * @version: Current version of info. 2345*01489e5dSAlfredo Cardigliano * @asic_type: Asic type. 2346*01489e5dSAlfredo Cardigliano * @asic_rev: Asic revision. 2347*01489e5dSAlfredo Cardigliano * @fw_status: Firmware status. 2348*01489e5dSAlfredo Cardigliano * @fw_heartbeat: Firmware heartbeat counter. 2349*01489e5dSAlfredo Cardigliano * @serial_num: Serial number. 2350*01489e5dSAlfredo Cardigliano * @fw_version: Firmware version. 2351*01489e5dSAlfredo Cardigliano */ 2352*01489e5dSAlfredo Cardigliano union ionic_dev_info_regs { 2353*01489e5dSAlfredo Cardigliano #define IONIC_DEVINFO_FWVERS_BUFLEN 32 2354*01489e5dSAlfredo Cardigliano #define IONIC_DEVINFO_SERIAL_BUFLEN 32 2355*01489e5dSAlfredo Cardigliano struct { 2356*01489e5dSAlfredo Cardigliano u32 signature; 2357*01489e5dSAlfredo Cardigliano u8 version; 2358*01489e5dSAlfredo Cardigliano u8 asic_type; 2359*01489e5dSAlfredo Cardigliano u8 asic_rev; 2360*01489e5dSAlfredo Cardigliano u8 fw_status; 2361*01489e5dSAlfredo Cardigliano u32 fw_heartbeat; 2362*01489e5dSAlfredo Cardigliano char fw_version[IONIC_DEVINFO_FWVERS_BUFLEN]; 2363*01489e5dSAlfredo Cardigliano char serial_num[IONIC_DEVINFO_SERIAL_BUFLEN]; 2364*01489e5dSAlfredo Cardigliano }; 2365*01489e5dSAlfredo Cardigliano u32 words[512]; 2366*01489e5dSAlfredo Cardigliano }; 2367*01489e5dSAlfredo Cardigliano 2368*01489e5dSAlfredo Cardigliano /** 2369*01489e5dSAlfredo Cardigliano * union ionic_dev_cmd_regs - Device command register format (read-write) 2370*01489e5dSAlfredo Cardigliano * @doorbell: Device Cmd Doorbell, write-only. 2371*01489e5dSAlfredo Cardigliano * Write a 1 to signal device to process cmd, 2372*01489e5dSAlfredo Cardigliano * poll done for completion. 2373*01489e5dSAlfredo Cardigliano * @done: Done indicator, bit 0 == 1 when command is complete. 2374*01489e5dSAlfredo Cardigliano * @cmd: Opcode-specific command bytes 2375*01489e5dSAlfredo Cardigliano * @comp: Opcode-specific response bytes 2376*01489e5dSAlfredo Cardigliano * @data: Opcode-specific side-data 2377*01489e5dSAlfredo Cardigliano */ 2378*01489e5dSAlfredo Cardigliano union ionic_dev_cmd_regs { 2379*01489e5dSAlfredo Cardigliano struct { 2380*01489e5dSAlfredo Cardigliano u32 doorbell; 2381*01489e5dSAlfredo Cardigliano u32 done; 2382*01489e5dSAlfredo Cardigliano union ionic_dev_cmd cmd; 2383*01489e5dSAlfredo Cardigliano union ionic_dev_cmd_comp comp; 2384*01489e5dSAlfredo Cardigliano u8 rsvd[48]; 2385*01489e5dSAlfredo Cardigliano u32 data[478]; 2386*01489e5dSAlfredo Cardigliano }; 2387*01489e5dSAlfredo Cardigliano u32 words[512]; 2388*01489e5dSAlfredo Cardigliano }; 2389*01489e5dSAlfredo Cardigliano 2390*01489e5dSAlfredo Cardigliano /** 2391*01489e5dSAlfredo Cardigliano * union ionic_dev_regs - Device register format in for bar 0 page 0 2392*01489e5dSAlfredo Cardigliano * @info: Device info registers 2393*01489e5dSAlfredo Cardigliano * @devcmd: Device command registers 2394*01489e5dSAlfredo Cardigliano */ 2395*01489e5dSAlfredo Cardigliano union ionic_dev_regs { 2396*01489e5dSAlfredo Cardigliano struct { 2397*01489e5dSAlfredo Cardigliano union ionic_dev_info_regs info; 2398*01489e5dSAlfredo Cardigliano union ionic_dev_cmd_regs devcmd; 2399*01489e5dSAlfredo Cardigliano }; 2400*01489e5dSAlfredo Cardigliano __le32 words[1024]; 2401*01489e5dSAlfredo Cardigliano }; 2402*01489e5dSAlfredo Cardigliano 2403*01489e5dSAlfredo Cardigliano union ionic_adminq_cmd { 2404*01489e5dSAlfredo Cardigliano struct ionic_admin_cmd cmd; 2405*01489e5dSAlfredo Cardigliano struct ionic_nop_cmd nop; 2406*01489e5dSAlfredo Cardigliano struct ionic_q_init_cmd q_init; 2407*01489e5dSAlfredo Cardigliano struct ionic_q_control_cmd q_control; 2408*01489e5dSAlfredo Cardigliano struct ionic_lif_setattr_cmd lif_setattr; 2409*01489e5dSAlfredo Cardigliano struct ionic_lif_getattr_cmd lif_getattr; 2410*01489e5dSAlfredo Cardigliano struct ionic_rx_mode_set_cmd rx_mode_set; 2411*01489e5dSAlfredo Cardigliano struct ionic_rx_filter_add_cmd rx_filter_add; 2412*01489e5dSAlfredo Cardigliano struct ionic_rx_filter_del_cmd rx_filter_del; 2413*01489e5dSAlfredo Cardigliano struct ionic_rdma_reset_cmd rdma_reset; 2414*01489e5dSAlfredo Cardigliano struct ionic_rdma_queue_cmd rdma_queue; 2415*01489e5dSAlfredo Cardigliano struct ionic_fw_download_cmd fw_download; 2416*01489e5dSAlfredo Cardigliano struct ionic_fw_control_cmd fw_control; 2417*01489e5dSAlfredo Cardigliano }; 2418*01489e5dSAlfredo Cardigliano 2419*01489e5dSAlfredo Cardigliano union ionic_adminq_comp { 2420*01489e5dSAlfredo Cardigliano struct ionic_admin_comp comp; 2421*01489e5dSAlfredo Cardigliano struct ionic_nop_comp nop; 2422*01489e5dSAlfredo Cardigliano struct ionic_q_init_comp q_init; 2423*01489e5dSAlfredo Cardigliano struct ionic_lif_setattr_comp lif_setattr; 2424*01489e5dSAlfredo Cardigliano struct ionic_lif_getattr_comp lif_getattr; 2425*01489e5dSAlfredo Cardigliano struct ionic_rx_filter_add_comp rx_filter_add; 2426*01489e5dSAlfredo Cardigliano struct ionic_fw_control_comp fw_control; 2427*01489e5dSAlfredo Cardigliano }; 2428*01489e5dSAlfredo Cardigliano 2429*01489e5dSAlfredo Cardigliano #define IONIC_BARS_MAX 6 2430*01489e5dSAlfredo Cardigliano #define IONIC_PCI_BAR_DBELL 1 2431*01489e5dSAlfredo Cardigliano 2432*01489e5dSAlfredo Cardigliano /* BAR0 */ 2433*01489e5dSAlfredo Cardigliano #define IONIC_BAR0_SIZE 0x8000 2434*01489e5dSAlfredo Cardigliano 2435*01489e5dSAlfredo Cardigliano #define IONIC_BAR0_DEV_INFO_REGS_OFFSET 0x0000 2436*01489e5dSAlfredo Cardigliano #define IONIC_BAR0_DEV_CMD_REGS_OFFSET 0x0800 2437*01489e5dSAlfredo Cardigliano #define IONIC_BAR0_DEV_CMD_DATA_REGS_OFFSET 0x0c00 2438*01489e5dSAlfredo Cardigliano #define IONIC_BAR0_INTR_STATUS_OFFSET 0x1000 2439*01489e5dSAlfredo Cardigliano #define IONIC_BAR0_INTR_CTRL_OFFSET 0x2000 2440*01489e5dSAlfredo Cardigliano #define IONIC_DEV_CMD_DONE 0x00000001 2441*01489e5dSAlfredo Cardigliano 2442*01489e5dSAlfredo Cardigliano #define IONIC_ASIC_TYPE_CAPRI 0 2443*01489e5dSAlfredo Cardigliano 2444*01489e5dSAlfredo Cardigliano /** 2445*01489e5dSAlfredo Cardigliano * struct ionic_doorbell - Doorbell register layout 2446*01489e5dSAlfredo Cardigliano * @p_index: Producer index 2447*01489e5dSAlfredo Cardigliano * @ring: Selects the specific ring of the queue to update. 2448*01489e5dSAlfredo Cardigliano * Type-specific meaning: 2449*01489e5dSAlfredo Cardigliano * ring=0: Default producer/consumer queue. 2450*01489e5dSAlfredo Cardigliano * ring=1: (CQ, EQ) Re-Arm queue. RDMA CQs 2451*01489e5dSAlfredo Cardigliano * send events to EQs when armed. EQs send 2452*01489e5dSAlfredo Cardigliano * interrupts when armed. 2453*01489e5dSAlfredo Cardigliano * @qid: The queue id selects the queue destination for the 2454*01489e5dSAlfredo Cardigliano * producer index and flags. 2455*01489e5dSAlfredo Cardigliano */ 2456*01489e5dSAlfredo Cardigliano struct ionic_doorbell { 2457*01489e5dSAlfredo Cardigliano __le16 p_index; 2458*01489e5dSAlfredo Cardigliano u8 ring; 2459*01489e5dSAlfredo Cardigliano u8 qid_lo; 2460*01489e5dSAlfredo Cardigliano __le16 qid_hi; 2461*01489e5dSAlfredo Cardigliano u16 rsvd2; 2462*01489e5dSAlfredo Cardigliano }; 2463*01489e5dSAlfredo Cardigliano 2464*01489e5dSAlfredo Cardigliano struct ionic_intr_status { 2465*01489e5dSAlfredo Cardigliano u32 status[2]; 2466*01489e5dSAlfredo Cardigliano }; 2467*01489e5dSAlfredo Cardigliano 2468*01489e5dSAlfredo Cardigliano struct ionic_notifyq_cmd { 2469*01489e5dSAlfredo Cardigliano __le32 data; /* Not used but needed for qcq structure */ 2470*01489e5dSAlfredo Cardigliano }; 2471*01489e5dSAlfredo Cardigliano 2472*01489e5dSAlfredo Cardigliano union ionic_notifyq_comp { 2473*01489e5dSAlfredo Cardigliano struct ionic_notifyq_event event; 2474*01489e5dSAlfredo Cardigliano struct ionic_link_change_event link_change; 2475*01489e5dSAlfredo Cardigliano struct ionic_reset_event reset; 2476*01489e5dSAlfredo Cardigliano struct ionic_heartbeat_event heartbeat; 2477*01489e5dSAlfredo Cardigliano struct ionic_log_event log; 2478*01489e5dSAlfredo Cardigliano }; 2479*01489e5dSAlfredo Cardigliano 2480*01489e5dSAlfredo Cardigliano /* Deprecate */ 2481*01489e5dSAlfredo Cardigliano struct ionic_identity { 2482*01489e5dSAlfredo Cardigliano union ionic_drv_identity drv; 2483*01489e5dSAlfredo Cardigliano union ionic_dev_identity dev; 2484*01489e5dSAlfredo Cardigliano union ionic_lif_identity lif; 2485*01489e5dSAlfredo Cardigliano union ionic_port_identity port; 2486*01489e5dSAlfredo Cardigliano union ionic_qos_identity qos; 2487*01489e5dSAlfredo Cardigliano }; 2488*01489e5dSAlfredo Cardigliano 2489*01489e5dSAlfredo Cardigliano #pragma pack(pop) 2490*01489e5dSAlfredo Cardigliano 2491*01489e5dSAlfredo Cardigliano #endif /* _IONIC_IF_H_ */ 2492