176668754SAndrew Boyer /* SPDX-License-Identifier: BSD-3-Clause 276668754SAndrew Boyer * Copyright 2017-2022 Advanced Micro Devices, Inc. 376668754SAndrew Boyer */ 401489e5dSAlfredo Cardigliano 501489e5dSAlfredo Cardigliano #ifndef _IONIC_IF_H_ 601489e5dSAlfredo Cardigliano #define _IONIC_IF_H_ 701489e5dSAlfredo Cardigliano 801489e5dSAlfredo Cardigliano #define IONIC_DEV_INFO_SIGNATURE 0x44455649 /* 'DEVI' */ 901489e5dSAlfredo Cardigliano #define IONIC_DEV_INFO_VERSION 1 1001489e5dSAlfredo Cardigliano #define IONIC_IFNAMSIZ 16 1101489e5dSAlfredo Cardigliano 1201489e5dSAlfredo Cardigliano /** 13126fe197SAndrew Boyer * enum ionic_cmd_opcode - Device commands 1401489e5dSAlfredo Cardigliano */ 1501489e5dSAlfredo Cardigliano enum ionic_cmd_opcode { 1601489e5dSAlfredo Cardigliano IONIC_CMD_NOP = 0, 1701489e5dSAlfredo Cardigliano 1801489e5dSAlfredo Cardigliano /* Device commands */ 1901489e5dSAlfredo Cardigliano IONIC_CMD_IDENTIFY = 1, 2001489e5dSAlfredo Cardigliano IONIC_CMD_INIT = 2, 2101489e5dSAlfredo Cardigliano IONIC_CMD_RESET = 3, 2201489e5dSAlfredo Cardigliano IONIC_CMD_GETATTR = 4, 2301489e5dSAlfredo Cardigliano IONIC_CMD_SETATTR = 5, 2401489e5dSAlfredo Cardigliano 2501489e5dSAlfredo Cardigliano /* Port commands */ 2601489e5dSAlfredo Cardigliano IONIC_CMD_PORT_IDENTIFY = 10, 2701489e5dSAlfredo Cardigliano IONIC_CMD_PORT_INIT = 11, 2801489e5dSAlfredo Cardigliano IONIC_CMD_PORT_RESET = 12, 2901489e5dSAlfredo Cardigliano IONIC_CMD_PORT_GETATTR = 13, 3001489e5dSAlfredo Cardigliano IONIC_CMD_PORT_SETATTR = 14, 3101489e5dSAlfredo Cardigliano 3201489e5dSAlfredo Cardigliano /* LIF commands */ 3301489e5dSAlfredo Cardigliano IONIC_CMD_LIF_IDENTIFY = 20, 3401489e5dSAlfredo Cardigliano IONIC_CMD_LIF_INIT = 21, 3501489e5dSAlfredo Cardigliano IONIC_CMD_LIF_RESET = 22, 3601489e5dSAlfredo Cardigliano IONIC_CMD_LIF_GETATTR = 23, 3701489e5dSAlfredo Cardigliano IONIC_CMD_LIF_SETATTR = 24, 3801489e5dSAlfredo Cardigliano 3901489e5dSAlfredo Cardigliano IONIC_CMD_RX_MODE_SET = 30, 4001489e5dSAlfredo Cardigliano IONIC_CMD_RX_FILTER_ADD = 31, 4101489e5dSAlfredo Cardigliano IONIC_CMD_RX_FILTER_DEL = 32, 4201489e5dSAlfredo Cardigliano 4301489e5dSAlfredo Cardigliano /* Queue commands */ 44126fe197SAndrew Boyer IONIC_CMD_Q_IDENTIFY = 39, 4501489e5dSAlfredo Cardigliano IONIC_CMD_Q_INIT = 40, 4601489e5dSAlfredo Cardigliano IONIC_CMD_Q_CONTROL = 41, 4701489e5dSAlfredo Cardigliano 4801489e5dSAlfredo Cardigliano /* RDMA commands */ 4901489e5dSAlfredo Cardigliano IONIC_CMD_RDMA_RESET_LIF = 50, 5001489e5dSAlfredo Cardigliano IONIC_CMD_RDMA_CREATE_EQ = 51, 5101489e5dSAlfredo Cardigliano IONIC_CMD_RDMA_CREATE_CQ = 52, 5201489e5dSAlfredo Cardigliano IONIC_CMD_RDMA_CREATE_ADMINQ = 53, 5301489e5dSAlfredo Cardigliano 54126fe197SAndrew Boyer /* SR/IOV commands */ 55126fe197SAndrew Boyer IONIC_CMD_VF_GETATTR = 60, 56126fe197SAndrew Boyer IONIC_CMD_VF_SETATTR = 61, 57126fe197SAndrew Boyer 5801489e5dSAlfredo Cardigliano /* QoS commands */ 5901489e5dSAlfredo Cardigliano IONIC_CMD_QOS_CLASS_IDENTIFY = 240, 6001489e5dSAlfredo Cardigliano IONIC_CMD_QOS_CLASS_INIT = 241, 6101489e5dSAlfredo Cardigliano IONIC_CMD_QOS_CLASS_RESET = 242, 62126fe197SAndrew Boyer IONIC_CMD_QOS_CLASS_UPDATE = 243, 63126fe197SAndrew Boyer IONIC_CMD_QOS_CLEAR_STATS = 244, 64126fe197SAndrew Boyer IONIC_CMD_QOS_RESET = 245, 6501489e5dSAlfredo Cardigliano 6601489e5dSAlfredo Cardigliano /* Firmware commands */ 6701489e5dSAlfredo Cardigliano IONIC_CMD_FW_DOWNLOAD = 254, 6801489e5dSAlfredo Cardigliano IONIC_CMD_FW_CONTROL = 255, 6901489e5dSAlfredo Cardigliano }; 7001489e5dSAlfredo Cardigliano 7101489e5dSAlfredo Cardigliano /** 72126fe197SAndrew Boyer * enum ionic_status_code - Device command return codes 7301489e5dSAlfredo Cardigliano */ 7401489e5dSAlfredo Cardigliano enum ionic_status_code { 7501489e5dSAlfredo Cardigliano IONIC_RC_SUCCESS = 0, /* Success */ 7601489e5dSAlfredo Cardigliano IONIC_RC_EVERSION = 1, /* Incorrect version for request */ 7701489e5dSAlfredo Cardigliano IONIC_RC_EOPCODE = 2, /* Invalid cmd opcode */ 7801489e5dSAlfredo Cardigliano IONIC_RC_EIO = 3, /* I/O error */ 7901489e5dSAlfredo Cardigliano IONIC_RC_EPERM = 4, /* Permission denied */ 8001489e5dSAlfredo Cardigliano IONIC_RC_EQID = 5, /* Bad qid */ 8101489e5dSAlfredo Cardigliano IONIC_RC_EQTYPE = 6, /* Bad qtype */ 8201489e5dSAlfredo Cardigliano IONIC_RC_ENOENT = 7, /* No such element */ 8301489e5dSAlfredo Cardigliano IONIC_RC_EINTR = 8, /* operation interrupted */ 8401489e5dSAlfredo Cardigliano IONIC_RC_EAGAIN = 9, /* Try again */ 8501489e5dSAlfredo Cardigliano IONIC_RC_ENOMEM = 10, /* Out of memory */ 8601489e5dSAlfredo Cardigliano IONIC_RC_EFAULT = 11, /* Bad address */ 8701489e5dSAlfredo Cardigliano IONIC_RC_EBUSY = 12, /* Device or resource busy */ 8801489e5dSAlfredo Cardigliano IONIC_RC_EEXIST = 13, /* object already exists */ 8901489e5dSAlfredo Cardigliano IONIC_RC_EINVAL = 14, /* Invalid argument */ 9001489e5dSAlfredo Cardigliano IONIC_RC_ENOSPC = 15, /* No space left or alloc failure */ 9101489e5dSAlfredo Cardigliano IONIC_RC_ERANGE = 16, /* Parameter out of range */ 9201489e5dSAlfredo Cardigliano IONIC_RC_BAD_ADDR = 17, /* Descriptor contains a bad ptr */ 9301489e5dSAlfredo Cardigliano IONIC_RC_DEV_CMD = 18, /* Device cmd attempted on AdminQ */ 9401489e5dSAlfredo Cardigliano IONIC_RC_ENOSUPP = 19, /* Operation not supported */ 9501489e5dSAlfredo Cardigliano IONIC_RC_ERROR = 29, /* Generic error */ 9601489e5dSAlfredo Cardigliano IONIC_RC_ERDMA = 30, /* Generic RDMA error */ 97126fe197SAndrew Boyer IONIC_RC_EVFID = 31, /* VF ID does not exist */ 9801489e5dSAlfredo Cardigliano }; 9901489e5dSAlfredo Cardigliano 10001489e5dSAlfredo Cardigliano enum ionic_notifyq_opcode { 10101489e5dSAlfredo Cardigliano IONIC_EVENT_LINK_CHANGE = 1, 10201489e5dSAlfredo Cardigliano IONIC_EVENT_RESET = 2, 10301489e5dSAlfredo Cardigliano IONIC_EVENT_HEARTBEAT = 3, 10401489e5dSAlfredo Cardigliano IONIC_EVENT_LOG = 4, 105126fe197SAndrew Boyer IONIC_EVENT_XCVR = 5, 10601489e5dSAlfredo Cardigliano }; 10701489e5dSAlfredo Cardigliano 10801489e5dSAlfredo Cardigliano /** 109126fe197SAndrew Boyer * struct ionic_admin_cmd - General admin command format 11001489e5dSAlfredo Cardigliano * @opcode: Opcode for the command 11101489e5dSAlfredo Cardigliano * @lif_index: LIF index 11201489e5dSAlfredo Cardigliano * @cmd_data: Opcode-specific command bytes 11301489e5dSAlfredo Cardigliano */ 11401489e5dSAlfredo Cardigliano struct ionic_admin_cmd { 11501489e5dSAlfredo Cardigliano u8 opcode; 11601489e5dSAlfredo Cardigliano u8 rsvd; 11701489e5dSAlfredo Cardigliano __le16 lif_index; 11801489e5dSAlfredo Cardigliano u8 cmd_data[60]; 11901489e5dSAlfredo Cardigliano }; 12001489e5dSAlfredo Cardigliano 12101489e5dSAlfredo Cardigliano /** 12201489e5dSAlfredo Cardigliano * struct ionic_admin_comp - General admin command completion format 123126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 124126fe197SAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 125126fe197SAndrew Boyer * @cmd_data: Command-specific bytes 126126fe197SAndrew Boyer * @color: Color bit (Always 0 for commands issued to the 127126fe197SAndrew Boyer * Device Cmd Registers) 12801489e5dSAlfredo Cardigliano */ 12901489e5dSAlfredo Cardigliano struct ionic_admin_comp { 13001489e5dSAlfredo Cardigliano u8 status; 13101489e5dSAlfredo Cardigliano u8 rsvd; 13201489e5dSAlfredo Cardigliano __le16 comp_index; 13301489e5dSAlfredo Cardigliano u8 cmd_data[11]; 13401489e5dSAlfredo Cardigliano u8 color; 13501489e5dSAlfredo Cardigliano #define IONIC_COMP_COLOR_MASK 0x80 13601489e5dSAlfredo Cardigliano }; 13701489e5dSAlfredo Cardigliano 13801489e5dSAlfredo Cardigliano static inline u8 color_match(u8 color, u8 done_color) 13901489e5dSAlfredo Cardigliano { 14001489e5dSAlfredo Cardigliano return (!!(color & IONIC_COMP_COLOR_MASK)) == done_color; 14101489e5dSAlfredo Cardigliano } 14201489e5dSAlfredo Cardigliano 14301489e5dSAlfredo Cardigliano /** 14401489e5dSAlfredo Cardigliano * struct ionic_nop_cmd - NOP command 14501489e5dSAlfredo Cardigliano * @opcode: opcode 14601489e5dSAlfredo Cardigliano */ 14701489e5dSAlfredo Cardigliano struct ionic_nop_cmd { 14801489e5dSAlfredo Cardigliano u8 opcode; 14901489e5dSAlfredo Cardigliano u8 rsvd[63]; 15001489e5dSAlfredo Cardigliano }; 15101489e5dSAlfredo Cardigliano 15201489e5dSAlfredo Cardigliano /** 15301489e5dSAlfredo Cardigliano * struct ionic_nop_comp - NOP command completion 154126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 15501489e5dSAlfredo Cardigliano */ 15601489e5dSAlfredo Cardigliano struct ionic_nop_comp { 15701489e5dSAlfredo Cardigliano u8 status; 15801489e5dSAlfredo Cardigliano u8 rsvd[15]; 15901489e5dSAlfredo Cardigliano }; 16001489e5dSAlfredo Cardigliano 16101489e5dSAlfredo Cardigliano /** 16201489e5dSAlfredo Cardigliano * struct ionic_dev_init_cmd - Device init command 16301489e5dSAlfredo Cardigliano * @opcode: opcode 164126fe197SAndrew Boyer * @type: Device type 16501489e5dSAlfredo Cardigliano */ 16601489e5dSAlfredo Cardigliano struct ionic_dev_init_cmd { 16701489e5dSAlfredo Cardigliano u8 opcode; 16801489e5dSAlfredo Cardigliano u8 type; 16901489e5dSAlfredo Cardigliano u8 rsvd[62]; 17001489e5dSAlfredo Cardigliano }; 17101489e5dSAlfredo Cardigliano 17201489e5dSAlfredo Cardigliano /** 173126fe197SAndrew Boyer * struct ionic_dev_init_comp - Device init command completion 174126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 17501489e5dSAlfredo Cardigliano */ 17601489e5dSAlfredo Cardigliano struct ionic_dev_init_comp { 17701489e5dSAlfredo Cardigliano u8 status; 17801489e5dSAlfredo Cardigliano u8 rsvd[15]; 17901489e5dSAlfredo Cardigliano }; 18001489e5dSAlfredo Cardigliano 18101489e5dSAlfredo Cardigliano /** 18201489e5dSAlfredo Cardigliano * struct ionic_dev_reset_cmd - Device reset command 18301489e5dSAlfredo Cardigliano * @opcode: opcode 18401489e5dSAlfredo Cardigliano */ 18501489e5dSAlfredo Cardigliano struct ionic_dev_reset_cmd { 18601489e5dSAlfredo Cardigliano u8 opcode; 18701489e5dSAlfredo Cardigliano u8 rsvd[63]; 18801489e5dSAlfredo Cardigliano }; 18901489e5dSAlfredo Cardigliano 19001489e5dSAlfredo Cardigliano /** 191126fe197SAndrew Boyer * struct ionic_dev_reset_comp - Reset command completion 192126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 19301489e5dSAlfredo Cardigliano */ 19401489e5dSAlfredo Cardigliano struct ionic_dev_reset_comp { 19501489e5dSAlfredo Cardigliano u8 status; 19601489e5dSAlfredo Cardigliano u8 rsvd[15]; 19701489e5dSAlfredo Cardigliano }; 19801489e5dSAlfredo Cardigliano 19901489e5dSAlfredo Cardigliano #define IONIC_IDENTITY_VERSION_1 1 20001489e5dSAlfredo Cardigliano 20101489e5dSAlfredo Cardigliano /** 20201489e5dSAlfredo Cardigliano * struct ionic_dev_identify_cmd - Driver/device identify command 20301489e5dSAlfredo Cardigliano * @opcode: opcode 20401489e5dSAlfredo Cardigliano * @ver: Highest version of identify supported by driver 20501489e5dSAlfredo Cardigliano */ 20601489e5dSAlfredo Cardigliano struct ionic_dev_identify_cmd { 20701489e5dSAlfredo Cardigliano u8 opcode; 20801489e5dSAlfredo Cardigliano u8 ver; 20901489e5dSAlfredo Cardigliano u8 rsvd[62]; 21001489e5dSAlfredo Cardigliano }; 21101489e5dSAlfredo Cardigliano 21201489e5dSAlfredo Cardigliano /** 213126fe197SAndrew Boyer * struct ionic_dev_identify_comp - Driver/device identify command completion 214126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 21501489e5dSAlfredo Cardigliano * @ver: Version of identify returned by device 21601489e5dSAlfredo Cardigliano */ 21701489e5dSAlfredo Cardigliano struct ionic_dev_identify_comp { 21801489e5dSAlfredo Cardigliano u8 status; 21901489e5dSAlfredo Cardigliano u8 ver; 22001489e5dSAlfredo Cardigliano u8 rsvd[14]; 22101489e5dSAlfredo Cardigliano }; 22201489e5dSAlfredo Cardigliano 22301489e5dSAlfredo Cardigliano enum ionic_os_type { 22401489e5dSAlfredo Cardigliano IONIC_OS_TYPE_LINUX = 1, 22501489e5dSAlfredo Cardigliano IONIC_OS_TYPE_WIN = 2, 22601489e5dSAlfredo Cardigliano IONIC_OS_TYPE_DPDK = 3, 22701489e5dSAlfredo Cardigliano IONIC_OS_TYPE_FREEBSD = 4, 22801489e5dSAlfredo Cardigliano IONIC_OS_TYPE_IPXE = 5, 22901489e5dSAlfredo Cardigliano IONIC_OS_TYPE_ESXI = 6, 23001489e5dSAlfredo Cardigliano }; 23101489e5dSAlfredo Cardigliano 23201489e5dSAlfredo Cardigliano /** 233126fe197SAndrew Boyer * union ionic_drv_identity - driver identity information 234126fe197SAndrew Boyer * @os_type: OS type (see enum ionic_os_type) 23501489e5dSAlfredo Cardigliano * @os_dist: OS distribution, numeric format 23601489e5dSAlfredo Cardigliano * @os_dist_str: OS distribution, string format 23701489e5dSAlfredo Cardigliano * @kernel_ver: Kernel version, numeric format 23801489e5dSAlfredo Cardigliano * @kernel_ver_str: Kernel version, string format 23901489e5dSAlfredo Cardigliano * @driver_ver_str: Driver version, string format 24001489e5dSAlfredo Cardigliano */ 24101489e5dSAlfredo Cardigliano union ionic_drv_identity { 24201489e5dSAlfredo Cardigliano struct { 24301489e5dSAlfredo Cardigliano __le32 os_type; 24401489e5dSAlfredo Cardigliano __le32 os_dist; 24501489e5dSAlfredo Cardigliano char os_dist_str[128]; 24601489e5dSAlfredo Cardigliano __le32 kernel_ver; 24701489e5dSAlfredo Cardigliano char kernel_ver_str[32]; 24801489e5dSAlfredo Cardigliano char driver_ver_str[32]; 24901489e5dSAlfredo Cardigliano }; 250126fe197SAndrew Boyer __le32 words[478]; 25101489e5dSAlfredo Cardigliano }; 25201489e5dSAlfredo Cardigliano 25301489e5dSAlfredo Cardigliano /** 254126fe197SAndrew Boyer * union ionic_dev_identity - device identity information 25501489e5dSAlfredo Cardigliano * @version: Version of device identify 25601489e5dSAlfredo Cardigliano * @type: Identify type (0 for now) 25701489e5dSAlfredo Cardigliano * @nports: Number of ports provisioned 25801489e5dSAlfredo Cardigliano * @nlifs: Number of LIFs provisioned 25901489e5dSAlfredo Cardigliano * @nintrs: Number of interrupts provisioned 26001489e5dSAlfredo Cardigliano * @ndbpgs_per_lif: Number of doorbell pages per LIF 261126fe197SAndrew Boyer * @intr_coal_mult: Interrupt coalescing multiplication factor 26201489e5dSAlfredo Cardigliano * Scale user-supplied interrupt coalescing 26301489e5dSAlfredo Cardigliano * value in usecs to device units using: 26401489e5dSAlfredo Cardigliano * device units = usecs * mult / div 265126fe197SAndrew Boyer * @intr_coal_div: Interrupt coalescing division factor 26601489e5dSAlfredo Cardigliano * Scale user-supplied interrupt coalescing 26701489e5dSAlfredo Cardigliano * value in usecs to device units using: 26801489e5dSAlfredo Cardigliano * device units = usecs * mult / div 269126fe197SAndrew Boyer * @eq_count: Number of shared event queues 27001489e5dSAlfredo Cardigliano */ 27101489e5dSAlfredo Cardigliano union ionic_dev_identity { 27201489e5dSAlfredo Cardigliano struct { 27301489e5dSAlfredo Cardigliano u8 version; 27401489e5dSAlfredo Cardigliano u8 type; 27501489e5dSAlfredo Cardigliano u8 rsvd[2]; 27601489e5dSAlfredo Cardigliano u8 nports; 27701489e5dSAlfredo Cardigliano u8 rsvd2[3]; 27801489e5dSAlfredo Cardigliano __le32 nlifs; 27901489e5dSAlfredo Cardigliano __le32 nintrs; 28001489e5dSAlfredo Cardigliano __le32 ndbpgs_per_lif; 28101489e5dSAlfredo Cardigliano __le32 intr_coal_mult; 28201489e5dSAlfredo Cardigliano __le32 intr_coal_div; 283126fe197SAndrew Boyer __le32 eq_count; 28401489e5dSAlfredo Cardigliano }; 285126fe197SAndrew Boyer __le32 words[478]; 28601489e5dSAlfredo Cardigliano }; 28701489e5dSAlfredo Cardigliano 28801489e5dSAlfredo Cardigliano enum ionic_lif_type { 28901489e5dSAlfredo Cardigliano IONIC_LIF_TYPE_CLASSIC = 0, 29001489e5dSAlfredo Cardigliano IONIC_LIF_TYPE_MACVLAN = 1, 29101489e5dSAlfredo Cardigliano IONIC_LIF_TYPE_NETQUEUE = 2, 29201489e5dSAlfredo Cardigliano }; 29301489e5dSAlfredo Cardigliano 29401489e5dSAlfredo Cardigliano /** 295126fe197SAndrew Boyer * struct ionic_lif_identify_cmd - LIF identify command 29601489e5dSAlfredo Cardigliano * @opcode: opcode 297126fe197SAndrew Boyer * @type: LIF type (enum ionic_lif_type) 298126fe197SAndrew Boyer * @ver: Version of identify returned by device 29901489e5dSAlfredo Cardigliano */ 30001489e5dSAlfredo Cardigliano struct ionic_lif_identify_cmd { 30101489e5dSAlfredo Cardigliano u8 opcode; 30201489e5dSAlfredo Cardigliano u8 type; 30301489e5dSAlfredo Cardigliano u8 ver; 30401489e5dSAlfredo Cardigliano u8 rsvd[61]; 30501489e5dSAlfredo Cardigliano }; 30601489e5dSAlfredo Cardigliano 30701489e5dSAlfredo Cardigliano /** 308126fe197SAndrew Boyer * struct ionic_lif_identify_comp - LIF identify command completion 309126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 310126fe197SAndrew Boyer * @ver: Version of identify returned by device 31101489e5dSAlfredo Cardigliano */ 31201489e5dSAlfredo Cardigliano struct ionic_lif_identify_comp { 31301489e5dSAlfredo Cardigliano u8 status; 31401489e5dSAlfredo Cardigliano u8 ver; 31501489e5dSAlfredo Cardigliano u8 rsvd2[14]; 31601489e5dSAlfredo Cardigliano }; 31701489e5dSAlfredo Cardigliano 318126fe197SAndrew Boyer /** 319126fe197SAndrew Boyer * enum ionic_lif_capability - LIF capabilities 320126fe197SAndrew Boyer * @IONIC_LIF_CAP_ETH: LIF supports Ethernet 321126fe197SAndrew Boyer * @IONIC_LIF_CAP_RDMA: LIF support RDMA 322126fe197SAndrew Boyer */ 32301489e5dSAlfredo Cardigliano enum ionic_lif_capability { 32401489e5dSAlfredo Cardigliano IONIC_LIF_CAP_ETH = BIT(0), 32501489e5dSAlfredo Cardigliano IONIC_LIF_CAP_RDMA = BIT(1), 32601489e5dSAlfredo Cardigliano }; 32701489e5dSAlfredo Cardigliano 32801489e5dSAlfredo Cardigliano /** 329126fe197SAndrew Boyer * enum ionic_logical_qtype - Logical Queue Types 330126fe197SAndrew Boyer * @IONIC_QTYPE_ADMINQ: Administrative Queue 331126fe197SAndrew Boyer * @IONIC_QTYPE_NOTIFYQ: Notify Queue 332126fe197SAndrew Boyer * @IONIC_QTYPE_RXQ: Receive Queue 333126fe197SAndrew Boyer * @IONIC_QTYPE_TXQ: Transmit Queue 334126fe197SAndrew Boyer * @IONIC_QTYPE_EQ: Event Queue 335126fe197SAndrew Boyer * @IONIC_QTYPE_MAX: Max queue type supported 33601489e5dSAlfredo Cardigliano */ 33701489e5dSAlfredo Cardigliano enum ionic_logical_qtype { 33801489e5dSAlfredo Cardigliano IONIC_QTYPE_ADMINQ = 0, 33901489e5dSAlfredo Cardigliano IONIC_QTYPE_NOTIFYQ = 1, 34001489e5dSAlfredo Cardigliano IONIC_QTYPE_RXQ = 2, 34101489e5dSAlfredo Cardigliano IONIC_QTYPE_TXQ = 3, 34201489e5dSAlfredo Cardigliano IONIC_QTYPE_EQ = 4, 34301489e5dSAlfredo Cardigliano IONIC_QTYPE_MAX = 16, 34401489e5dSAlfredo Cardigliano }; 34501489e5dSAlfredo Cardigliano 34601489e5dSAlfredo Cardigliano /** 347126fe197SAndrew Boyer * struct ionic_lif_logical_qtype - Descriptor of logical to HW queue type 348126fe197SAndrew Boyer * @qtype: Hardware Queue Type 349126fe197SAndrew Boyer * @qid_count: Number of Queue IDs of the logical type 350126fe197SAndrew Boyer * @qid_base: Minimum Queue ID of the logical type 35101489e5dSAlfredo Cardigliano */ 35201489e5dSAlfredo Cardigliano struct ionic_lif_logical_qtype { 35301489e5dSAlfredo Cardigliano u8 qtype; 35401489e5dSAlfredo Cardigliano u8 rsvd[3]; 35501489e5dSAlfredo Cardigliano __le32 qid_count; 35601489e5dSAlfredo Cardigliano __le32 qid_base; 35701489e5dSAlfredo Cardigliano }; 35801489e5dSAlfredo Cardigliano 359126fe197SAndrew Boyer /** 360126fe197SAndrew Boyer * enum ionic_lif_state - LIF state 361126fe197SAndrew Boyer * @IONIC_LIF_DISABLE: LIF disabled 362126fe197SAndrew Boyer * @IONIC_LIF_ENABLE: LIF enabled 363126fe197SAndrew Boyer * @IONIC_LIF_QUIESCE: LIF Quiesced 364126fe197SAndrew Boyer */ 36501489e5dSAlfredo Cardigliano enum ionic_lif_state { 366126fe197SAndrew Boyer IONIC_LIF_QUIESCE = 0, 36701489e5dSAlfredo Cardigliano IONIC_LIF_ENABLE = 1, 368126fe197SAndrew Boyer IONIC_LIF_DISABLE = 2, 36901489e5dSAlfredo Cardigliano }; 37001489e5dSAlfredo Cardigliano 37101489e5dSAlfredo Cardigliano /** 372126fe197SAndrew Boyer * union ionic_lif_config - LIF configuration 373126fe197SAndrew Boyer * @state: LIF state (enum ionic_lif_state) 374126fe197SAndrew Boyer * @name: LIF name 375126fe197SAndrew Boyer * @mtu: MTU 376126fe197SAndrew Boyer * @mac: Station MAC address 377126fe197SAndrew Boyer * @vlan: Default Vlan ID 378126fe197SAndrew Boyer * @features: Features (enum ionic_eth_hw_features) 379126fe197SAndrew Boyer * @queue_count: Queue counts per queue-type 38001489e5dSAlfredo Cardigliano */ 38101489e5dSAlfredo Cardigliano union ionic_lif_config { 382*e7750639SAndre Muezerie struct __rte_packed_begin { 38301489e5dSAlfredo Cardigliano u8 state; 38401489e5dSAlfredo Cardigliano u8 rsvd[3]; 38501489e5dSAlfredo Cardigliano char name[IONIC_IFNAMSIZ]; 38601489e5dSAlfredo Cardigliano __le32 mtu; 38701489e5dSAlfredo Cardigliano u8 mac[6]; 388126fe197SAndrew Boyer __le16 vlan; 38901489e5dSAlfredo Cardigliano __le64 features; 39001489e5dSAlfredo Cardigliano __le32 queue_count[IONIC_QTYPE_MAX]; 391*e7750639SAndre Muezerie } __rte_packed_end; 39201489e5dSAlfredo Cardigliano __le32 words[64]; 39301489e5dSAlfredo Cardigliano }; 39401489e5dSAlfredo Cardigliano 39501489e5dSAlfredo Cardigliano /** 396126fe197SAndrew Boyer * struct ionic_lif_identity - LIF identity information (type-specific) 39701489e5dSAlfredo Cardigliano * 398126fe197SAndrew Boyer * @capabilities: LIF capabilities 39901489e5dSAlfredo Cardigliano * 400126fe197SAndrew Boyer * @eth: Ethernet identify structure 401126fe197SAndrew Boyer * @version: Ethernet identify structure version 402126fe197SAndrew Boyer * @max_ucast_filters: Number of perfect unicast addresses supported 403126fe197SAndrew Boyer * @max_mcast_filters: Number of perfect multicast addresses supported 404b671e69aSAndrew Boyer * @min_mtu: Minimum MTU of frames to be sent 405b671e69aSAndrew Boyer * @max_mtu: Maximum MTU of frames to be sent 40601489e5dSAlfredo Cardigliano * @config: LIF config struct with features, mtu, mac, q counts 40701489e5dSAlfredo Cardigliano * 408126fe197SAndrew Boyer * @rdma: RDMA identify structure 409126fe197SAndrew Boyer * @version: RDMA version of opcodes and queue descriptors 410126fe197SAndrew Boyer * @qp_opcodes: Number of RDMA queue pair opcodes supported 411126fe197SAndrew Boyer * @admin_opcodes: Number of RDMA admin opcodes supported 412126fe197SAndrew Boyer * @npts_per_lif: Page table size per LIF 413126fe197SAndrew Boyer * @nmrs_per_lif: Number of memory regions per LIF 414126fe197SAndrew Boyer * @nahs_per_lif: Number of address handles per LIF 415126fe197SAndrew Boyer * @max_stride: Max work request stride 416126fe197SAndrew Boyer * @cl_stride: Cache line stride 417126fe197SAndrew Boyer * @pte_stride: Page table entry stride 418126fe197SAndrew Boyer * @rrq_stride: Remote RQ work request stride 419126fe197SAndrew Boyer * @rsq_stride: Remote SQ work request stride 42001489e5dSAlfredo Cardigliano * @dcqcn_profiles: Number of DCQCN profiles 421126fe197SAndrew Boyer * @aq_qtype: RDMA Admin Qtype 422126fe197SAndrew Boyer * @sq_qtype: RDMA Send Qtype 423126fe197SAndrew Boyer * @rq_qtype: RDMA Receive Qtype 424126fe197SAndrew Boyer * @cq_qtype: RDMA Completion Qtype 425126fe197SAndrew Boyer * @eq_qtype: RDMA Event Qtype 42601489e5dSAlfredo Cardigliano */ 42701489e5dSAlfredo Cardigliano union ionic_lif_identity { 428*e7750639SAndre Muezerie struct __rte_packed_begin { 42901489e5dSAlfredo Cardigliano __le64 capabilities; 43001489e5dSAlfredo Cardigliano 431*e7750639SAndre Muezerie struct __rte_packed_begin { 43201489e5dSAlfredo Cardigliano u8 version; 43301489e5dSAlfredo Cardigliano u8 rsvd[3]; 43401489e5dSAlfredo Cardigliano __le32 max_ucast_filters; 43501489e5dSAlfredo Cardigliano __le32 max_mcast_filters; 43601489e5dSAlfredo Cardigliano __le16 rss_ind_tbl_sz; 437b671e69aSAndrew Boyer __le32 min_mtu; 438b671e69aSAndrew Boyer __le32 max_mtu; 43901489e5dSAlfredo Cardigliano u8 rsvd2[106]; 44001489e5dSAlfredo Cardigliano union ionic_lif_config config; 441*e7750639SAndre Muezerie } __rte_packed_end eth; 44201489e5dSAlfredo Cardigliano 443*e7750639SAndre Muezerie struct __rte_packed_begin { 44401489e5dSAlfredo Cardigliano u8 version; 44501489e5dSAlfredo Cardigliano u8 qp_opcodes; 44601489e5dSAlfredo Cardigliano u8 admin_opcodes; 44701489e5dSAlfredo Cardigliano u8 rsvd; 44801489e5dSAlfredo Cardigliano __le32 npts_per_lif; 44901489e5dSAlfredo Cardigliano __le32 nmrs_per_lif; 45001489e5dSAlfredo Cardigliano __le32 nahs_per_lif; 45101489e5dSAlfredo Cardigliano u8 max_stride; 45201489e5dSAlfredo Cardigliano u8 cl_stride; 45301489e5dSAlfredo Cardigliano u8 pte_stride; 45401489e5dSAlfredo Cardigliano u8 rrq_stride; 45501489e5dSAlfredo Cardigliano u8 rsq_stride; 45601489e5dSAlfredo Cardigliano u8 dcqcn_profiles; 45701489e5dSAlfredo Cardigliano u8 rsvd_dimensions[10]; 45801489e5dSAlfredo Cardigliano struct ionic_lif_logical_qtype aq_qtype; 45901489e5dSAlfredo Cardigliano struct ionic_lif_logical_qtype sq_qtype; 46001489e5dSAlfredo Cardigliano struct ionic_lif_logical_qtype rq_qtype; 46101489e5dSAlfredo Cardigliano struct ionic_lif_logical_qtype cq_qtype; 46201489e5dSAlfredo Cardigliano struct ionic_lif_logical_qtype eq_qtype; 463*e7750639SAndre Muezerie } __rte_packed_end rdma; 464*e7750639SAndre Muezerie } __rte_packed_end; 465126fe197SAndrew Boyer __le32 words[478]; 46601489e5dSAlfredo Cardigliano }; 46701489e5dSAlfredo Cardigliano 46801489e5dSAlfredo Cardigliano /** 46901489e5dSAlfredo Cardigliano * struct ionic_lif_init_cmd - LIF init command 470126fe197SAndrew Boyer * @opcode: Opcode 471126fe197SAndrew Boyer * @type: LIF type (enum ionic_lif_type) 47201489e5dSAlfredo Cardigliano * @index: LIF index 473126fe197SAndrew Boyer * @info_pa: Destination address for LIF info (struct ionic_lif_info) 47401489e5dSAlfredo Cardigliano */ 47501489e5dSAlfredo Cardigliano struct ionic_lif_init_cmd { 47601489e5dSAlfredo Cardigliano u8 opcode; 47701489e5dSAlfredo Cardigliano u8 type; 47801489e5dSAlfredo Cardigliano __le16 index; 47901489e5dSAlfredo Cardigliano __le32 rsvd; 48001489e5dSAlfredo Cardigliano __le64 info_pa; 48101489e5dSAlfredo Cardigliano u8 rsvd2[48]; 48201489e5dSAlfredo Cardigliano }; 48301489e5dSAlfredo Cardigliano 48401489e5dSAlfredo Cardigliano /** 48501489e5dSAlfredo Cardigliano * struct ionic_lif_init_comp - LIF init command completion 486126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 487126fe197SAndrew Boyer * @hw_index: Hardware index of the initialized LIF 48801489e5dSAlfredo Cardigliano */ 48901489e5dSAlfredo Cardigliano struct ionic_lif_init_comp { 49001489e5dSAlfredo Cardigliano u8 status; 49101489e5dSAlfredo Cardigliano u8 rsvd; 49201489e5dSAlfredo Cardigliano __le16 hw_index; 49301489e5dSAlfredo Cardigliano u8 rsvd2[12]; 49401489e5dSAlfredo Cardigliano }; 49501489e5dSAlfredo Cardigliano 49601489e5dSAlfredo Cardigliano /** 497126fe197SAndrew Boyer * struct ionic_q_identify_cmd - queue identify command 498126fe197SAndrew Boyer * @opcode: opcode 499126fe197SAndrew Boyer * @lif_type: LIF type (enum ionic_lif_type) 500126fe197SAndrew Boyer * @type: Logical queue type (enum ionic_logical_qtype) 501126fe197SAndrew Boyer * @ver: Highest queue type version that the driver supports 502126fe197SAndrew Boyer */ 503126fe197SAndrew Boyer struct ionic_q_identify_cmd { 504126fe197SAndrew Boyer u8 opcode; 505126fe197SAndrew Boyer u8 rsvd; 506126fe197SAndrew Boyer __le16 lif_type; 507126fe197SAndrew Boyer u8 type; 508126fe197SAndrew Boyer u8 ver; 509126fe197SAndrew Boyer u8 rsvd2[58]; 510126fe197SAndrew Boyer }; 511126fe197SAndrew Boyer 512126fe197SAndrew Boyer /** 513126fe197SAndrew Boyer * struct ionic_q_identify_comp - queue identify command completion 514126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 515126fe197SAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 516126fe197SAndrew Boyer * @ver: Queue type version that can be used with FW 517126fe197SAndrew Boyer */ 518126fe197SAndrew Boyer struct ionic_q_identify_comp { 519126fe197SAndrew Boyer u8 status; 520126fe197SAndrew Boyer u8 rsvd; 521126fe197SAndrew Boyer __le16 comp_index; 522126fe197SAndrew Boyer u8 ver; 523126fe197SAndrew Boyer u8 rsvd2[11]; 524126fe197SAndrew Boyer }; 525126fe197SAndrew Boyer 526126fe197SAndrew Boyer /** 527126fe197SAndrew Boyer * union ionic_q_identity - queue identity information 528126fe197SAndrew Boyer * @version: Queue type version that can be used with FW 529126fe197SAndrew Boyer * @supported: Bitfield of queue versions, first bit = ver 0 530126fe197SAndrew Boyer * @features: Queue features 531126fe197SAndrew Boyer * @desc_sz: Descriptor size 532126fe197SAndrew Boyer * @comp_sz: Completion descriptor size 533126fe197SAndrew Boyer * @sg_desc_sz: Scatter/Gather descriptor size 534126fe197SAndrew Boyer * @max_sg_elems: Maximum number of Scatter/Gather elements 535126fe197SAndrew Boyer * @sg_desc_stride: Number of Scatter/Gather elements per descriptor 536126fe197SAndrew Boyer */ 537126fe197SAndrew Boyer union ionic_q_identity { 538126fe197SAndrew Boyer struct { 539126fe197SAndrew Boyer u8 version; 540126fe197SAndrew Boyer u8 supported; 541126fe197SAndrew Boyer u8 rsvd[6]; 542126fe197SAndrew Boyer #define IONIC_QIDENT_F_CQ 0x01 /* queue has completion ring */ 543126fe197SAndrew Boyer #define IONIC_QIDENT_F_SG 0x02 /* queue has scatter/gather ring */ 544126fe197SAndrew Boyer #define IONIC_QIDENT_F_EQ 0x04 /* queue can use event queue */ 545126fe197SAndrew Boyer #define IONIC_QIDENT_F_CMB 0x08 /* queue is in cmb bar */ 546126fe197SAndrew Boyer __le64 features; 547126fe197SAndrew Boyer __le16 desc_sz; 548126fe197SAndrew Boyer __le16 comp_sz; 549126fe197SAndrew Boyer __le16 sg_desc_sz; 550126fe197SAndrew Boyer __le16 max_sg_elems; 551126fe197SAndrew Boyer __le16 sg_desc_stride; 552126fe197SAndrew Boyer }; 553126fe197SAndrew Boyer __le32 words[478]; 554126fe197SAndrew Boyer }; 555126fe197SAndrew Boyer 556126fe197SAndrew Boyer /** 55701489e5dSAlfredo Cardigliano * struct ionic_q_init_cmd - Queue init command 55801489e5dSAlfredo Cardigliano * @opcode: opcode 55901489e5dSAlfredo Cardigliano * @type: Logical queue type 560126fe197SAndrew Boyer * @ver: Queue type version 56101489e5dSAlfredo Cardigliano * @lif_index: LIF index 562126fe197SAndrew Boyer * @index: (LIF, qtype) relative admin queue index 563126fe197SAndrew Boyer * @intr_index: Interrupt control register index, or Event queue index 56401489e5dSAlfredo Cardigliano * @pid: Process ID 56501489e5dSAlfredo Cardigliano * @flags: 56601489e5dSAlfredo Cardigliano * IRQ: Interrupt requested on completion 56701489e5dSAlfredo Cardigliano * ENA: Enable the queue. If ENA=0 the queue is initialized 56801489e5dSAlfredo Cardigliano * but remains disabled, to be later enabled with the 56901489e5dSAlfredo Cardigliano * Queue Enable command. If ENA=1, then queue is 57001489e5dSAlfredo Cardigliano * initialized and then enabled. 57101489e5dSAlfredo Cardigliano * SG: Enable Scatter-Gather on the queue. 57201489e5dSAlfredo Cardigliano * in number of descs. The actual ring size is 57301489e5dSAlfredo Cardigliano * (1 << ring_size). For example, to 57401489e5dSAlfredo Cardigliano * select a ring size of 64 descriptors write 57501489e5dSAlfredo Cardigliano * ring_size = 6. The minimum ring_size value is 2 57601489e5dSAlfredo Cardigliano * for a ring size of 4 descriptors. The maximum 57701489e5dSAlfredo Cardigliano * ring_size value is 16 for a ring size of 64k 57801489e5dSAlfredo Cardigliano * descriptors. Values of ring_size <2 and >16 are 57901489e5dSAlfredo Cardigliano * reserved. 58001489e5dSAlfredo Cardigliano * EQ: Enable the Event Queue 581126fe197SAndrew Boyer * @cos: Class of service for this queue 58201489e5dSAlfredo Cardigliano * @ring_size: Queue ring size, encoded as a log2(size) 58301489e5dSAlfredo Cardigliano * @ring_base: Queue ring base address 58401489e5dSAlfredo Cardigliano * @cq_ring_base: Completion queue ring base address 58501489e5dSAlfredo Cardigliano * @sg_ring_base: Scatter/Gather ring base address 58601489e5dSAlfredo Cardigliano */ 587*e7750639SAndre Muezerie struct __rte_packed_begin ionic_q_init_cmd { 58801489e5dSAlfredo Cardigliano u8 opcode; 58901489e5dSAlfredo Cardigliano u8 rsvd; 59001489e5dSAlfredo Cardigliano __le16 lif_index; 59101489e5dSAlfredo Cardigliano u8 type; 59201489e5dSAlfredo Cardigliano u8 ver; 59301489e5dSAlfredo Cardigliano u8 rsvd1[2]; 59401489e5dSAlfredo Cardigliano __le32 index; 59501489e5dSAlfredo Cardigliano __le16 pid; 59601489e5dSAlfredo Cardigliano __le16 intr_index; 59701489e5dSAlfredo Cardigliano __le16 flags; 59801489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_IRQ 0x01 /* Request interrupt on completion */ 59901489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_ENA 0x02 /* Enable the queue */ 60001489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_SG 0x04 /* Enable scatter/gather on the queue */ 60101489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_EQ 0x08 /* Enable event queue */ 602126fe197SAndrew Boyer #define IONIC_QINIT_F_CMB 0x10 /* Enable cmb-based queue */ 60301489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_DEBUG 0x80 /* Enable queue debugging */ 60401489e5dSAlfredo Cardigliano u8 cos; 60501489e5dSAlfredo Cardigliano u8 ring_size; 60601489e5dSAlfredo Cardigliano __le64 ring_base; 60701489e5dSAlfredo Cardigliano __le64 cq_ring_base; 60801489e5dSAlfredo Cardigliano __le64 sg_ring_base; 609126fe197SAndrew Boyer u8 rsvd2[20]; 610*e7750639SAndre Muezerie } __rte_packed_end; 61101489e5dSAlfredo Cardigliano 61201489e5dSAlfredo Cardigliano /** 61301489e5dSAlfredo Cardigliano * struct ionic_q_init_comp - Queue init command completion 614126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 615126fe197SAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 61601489e5dSAlfredo Cardigliano * @hw_index: Hardware Queue ID 61701489e5dSAlfredo Cardigliano * @hw_type: Hardware Queue type 61801489e5dSAlfredo Cardigliano * @color: Color 61901489e5dSAlfredo Cardigliano */ 62001489e5dSAlfredo Cardigliano struct ionic_q_init_comp { 62101489e5dSAlfredo Cardigliano u8 status; 622126fe197SAndrew Boyer u8 rsvd; 62301489e5dSAlfredo Cardigliano __le16 comp_index; 62401489e5dSAlfredo Cardigliano __le32 hw_index; 62501489e5dSAlfredo Cardigliano u8 hw_type; 62601489e5dSAlfredo Cardigliano u8 rsvd2[6]; 62701489e5dSAlfredo Cardigliano u8 color; 62801489e5dSAlfredo Cardigliano }; 62901489e5dSAlfredo Cardigliano 63001489e5dSAlfredo Cardigliano /* the device's internal addressing uses up to 52 bits */ 63101489e5dSAlfredo Cardigliano #define IONIC_ADDR_LEN 52 63201489e5dSAlfredo Cardigliano #define IONIC_ADDR_MASK (BIT_ULL(IONIC_ADDR_LEN) - 1) 63301489e5dSAlfredo Cardigliano 63401489e5dSAlfredo Cardigliano enum ionic_txq_desc_opcode { 63501489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_OPCODE_CSUM_NONE = 0, 63601489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_OPCODE_CSUM_PARTIAL = 1, 63701489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_OPCODE_CSUM_HW = 2, 63801489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_OPCODE_TSO = 3, 63901489e5dSAlfredo Cardigliano }; 64001489e5dSAlfredo Cardigliano 64101489e5dSAlfredo Cardigliano /** 64201489e5dSAlfredo Cardigliano * struct ionic_txq_desc - Ethernet Tx queue descriptor format 643126fe197SAndrew Boyer * @cmd: Tx operation, see IONIC_TXQ_DESC_OPCODE_*: 64401489e5dSAlfredo Cardigliano * 64501489e5dSAlfredo Cardigliano * IONIC_TXQ_DESC_OPCODE_CSUM_NONE: 64601489e5dSAlfredo Cardigliano * Non-offload send. No segmentation, 64701489e5dSAlfredo Cardigliano * fragmentation or checksum calc/insertion is 64801489e5dSAlfredo Cardigliano * performed by device; packet is prepared 64901489e5dSAlfredo Cardigliano * to send by software stack and requires 65001489e5dSAlfredo Cardigliano * no further manipulation from device. 65101489e5dSAlfredo Cardigliano * 65201489e5dSAlfredo Cardigliano * IONIC_TXQ_DESC_OPCODE_CSUM_PARTIAL: 65301489e5dSAlfredo Cardigliano * Offload 16-bit L4 checksum 65401489e5dSAlfredo Cardigliano * calculation/insertion. The device will 65501489e5dSAlfredo Cardigliano * calculate the L4 checksum value and 65601489e5dSAlfredo Cardigliano * insert the result in the packet's L4 65701489e5dSAlfredo Cardigliano * header checksum field. The L4 checksum 65801489e5dSAlfredo Cardigliano * is calculated starting at @csum_start bytes 65901489e5dSAlfredo Cardigliano * into the packet to the end of the packet. 66001489e5dSAlfredo Cardigliano * The checksum insertion position is given 661126fe197SAndrew Boyer * in @csum_offset, which is the offset from 662126fe197SAndrew Boyer * @csum_start to the checksum field in the L4 663126fe197SAndrew Boyer * header. This feature is only applicable to 664126fe197SAndrew Boyer * protocols such as TCP, UDP and ICMP where a 665126fe197SAndrew Boyer * standard (i.e. the 'IP-style' checksum) 666126fe197SAndrew Boyer * one's complement 16-bit checksum is used, 667126fe197SAndrew Boyer * using an IP pseudo-header to seed the 668126fe197SAndrew Boyer * calculation. Software will preload the L4 669126fe197SAndrew Boyer * checksum field with the IP pseudo-header 670126fe197SAndrew Boyer * checksum. 67101489e5dSAlfredo Cardigliano * 67201489e5dSAlfredo Cardigliano * For tunnel encapsulation, @csum_start and 67301489e5dSAlfredo Cardigliano * @csum_offset refer to the inner L4 67401489e5dSAlfredo Cardigliano * header. Supported tunnels encapsulations 67501489e5dSAlfredo Cardigliano * are: IPIP, GRE, and UDP. If the @encap 67601489e5dSAlfredo Cardigliano * is clear, no further processing by the 67701489e5dSAlfredo Cardigliano * device is required; software will 67801489e5dSAlfredo Cardigliano * calculate the outer header checksums. If 67901489e5dSAlfredo Cardigliano * the @encap is set, the device will 68001489e5dSAlfredo Cardigliano * offload the outer header checksums using 68101489e5dSAlfredo Cardigliano * LCO (local checksum offload) (see 682126fe197SAndrew Boyer * Documentation/networking/checksum-offloads.rst 683126fe197SAndrew Boyer * for more info). 68401489e5dSAlfredo Cardigliano * 68501489e5dSAlfredo Cardigliano * IONIC_TXQ_DESC_OPCODE_CSUM_HW: 68601489e5dSAlfredo Cardigliano * Offload 16-bit checksum computation to hardware. 68701489e5dSAlfredo Cardigliano * If @csum_l3 is set then the packet's L3 checksum is 688b53d106dSSean Morrissey * updated. Similarly, if @csum_l4 is set the L4 68901489e5dSAlfredo Cardigliano * checksum is updated. If @encap is set then encap header 69001489e5dSAlfredo Cardigliano * checksums are also updated. 69101489e5dSAlfredo Cardigliano * 69201489e5dSAlfredo Cardigliano * IONIC_TXQ_DESC_OPCODE_TSO: 69301489e5dSAlfredo Cardigliano * Device performs TCP segmentation offload 69401489e5dSAlfredo Cardigliano * (TSO). @hdr_len is the number of bytes 69501489e5dSAlfredo Cardigliano * to the end of TCP header (the offset to 69601489e5dSAlfredo Cardigliano * the TCP payload). @mss is the desired 69701489e5dSAlfredo Cardigliano * MSS, the TCP payload length for each 69801489e5dSAlfredo Cardigliano * segment. The device will calculate/ 69901489e5dSAlfredo Cardigliano * insert IP (IPv4 only) and TCP checksums 70001489e5dSAlfredo Cardigliano * for each segment. In the first data 70101489e5dSAlfredo Cardigliano * buffer containing the header template, 70201489e5dSAlfredo Cardigliano * the driver will set IPv4 checksum to 0 70301489e5dSAlfredo Cardigliano * and preload TCP checksum with the IP 70401489e5dSAlfredo Cardigliano * pseudo header calculated with IP length = 0. 70501489e5dSAlfredo Cardigliano * 70601489e5dSAlfredo Cardigliano * Supported tunnel encapsulations are IPIP, 70701489e5dSAlfredo Cardigliano * layer-3 GRE, and UDP. @hdr_len includes 70801489e5dSAlfredo Cardigliano * both outer and inner headers. The driver 70901489e5dSAlfredo Cardigliano * will set IPv4 checksum to zero and 71001489e5dSAlfredo Cardigliano * preload TCP checksum with IP pseudo 71101489e5dSAlfredo Cardigliano * header on the inner header. 71201489e5dSAlfredo Cardigliano * 71301489e5dSAlfredo Cardigliano * TCP ECN offload is supported. The device 71401489e5dSAlfredo Cardigliano * will set CWR flag in the first segment if 71501489e5dSAlfredo Cardigliano * CWR is set in the template header, and 71601489e5dSAlfredo Cardigliano * clear CWR in remaining segments. 71701489e5dSAlfredo Cardigliano * @flags: 71801489e5dSAlfredo Cardigliano * vlan: 719126fe197SAndrew Boyer * Insert an L2 VLAN header using @vlan_tci 72001489e5dSAlfredo Cardigliano * encap: 721126fe197SAndrew Boyer * Calculate encap header checksum 72201489e5dSAlfredo Cardigliano * csum_l3: 723126fe197SAndrew Boyer * Compute L3 header checksum 72401489e5dSAlfredo Cardigliano * csum_l4: 725126fe197SAndrew Boyer * Compute L4 header checksum 72601489e5dSAlfredo Cardigliano * tso_sot: 72701489e5dSAlfredo Cardigliano * TSO start 72801489e5dSAlfredo Cardigliano * tso_eot: 72901489e5dSAlfredo Cardigliano * TSO end 73001489e5dSAlfredo Cardigliano * @num_sg_elems: Number of scatter-gather elements in SG 73101489e5dSAlfredo Cardigliano * descriptor 732126fe197SAndrew Boyer * @addr: First data buffer's DMA address 733126fe197SAndrew Boyer * (Subsequent data buffers are on txq_sg_desc) 73401489e5dSAlfredo Cardigliano * @len: First data buffer's length, in bytes 73501489e5dSAlfredo Cardigliano * @vlan_tci: VLAN tag to insert in the packet (if requested 73601489e5dSAlfredo Cardigliano * by @V-bit). Includes .1p and .1q tags 73701489e5dSAlfredo Cardigliano * @hdr_len: Length of packet headers, including 738126fe197SAndrew Boyer * encapsulating outer header, if applicable 739126fe197SAndrew Boyer * Valid for opcodes IONIC_TXQ_DESC_OPCODE_CALC_CSUM and 740126fe197SAndrew Boyer * IONIC_TXQ_DESC_OPCODE_TSO. Should be set to zero for 74101489e5dSAlfredo Cardigliano * all other modes. For 742126fe197SAndrew Boyer * IONIC_TXQ_DESC_OPCODE_CALC_CSUM, @hdr_len is length 74301489e5dSAlfredo Cardigliano * of headers up to inner-most L4 header. For 744126fe197SAndrew Boyer * IONIC_TXQ_DESC_OPCODE_TSO, @hdr_len is up to 74501489e5dSAlfredo Cardigliano * inner-most L4 payload, so inclusive of 74601489e5dSAlfredo Cardigliano * inner-most L4 header. 747126fe197SAndrew Boyer * @mss: Desired MSS value for TSO; only applicable for 748126fe197SAndrew Boyer * IONIC_TXQ_DESC_OPCODE_TSO 749126fe197SAndrew Boyer * @csum_start: Offset from packet to first byte checked in L4 checksum 750126fe197SAndrew Boyer * @csum_offset: Offset from csum_start to L4 checksum field 75101489e5dSAlfredo Cardigliano */ 752126fe197SAndrew Boyer struct ionic_txq_desc { 753126fe197SAndrew Boyer __le64 cmd; 75401489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_OPCODE_MASK 0xf 75501489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_OPCODE_SHIFT 4 75601489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAGS_MASK 0xf 75701489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAGS_SHIFT 0 75801489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_NSGE_MASK 0xf 75901489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_NSGE_SHIFT 8 76001489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_ADDR_MASK (BIT_ULL(IONIC_ADDR_LEN) - 1) 76101489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_ADDR_SHIFT 12 76201489e5dSAlfredo Cardigliano 76301489e5dSAlfredo Cardigliano /* common flags */ 76401489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_VLAN 0x1 76501489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_ENCAP 0x2 76601489e5dSAlfredo Cardigliano 76701489e5dSAlfredo Cardigliano /* flags for csum_hw opcode */ 76801489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_CSUM_L3 0x4 76901489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_CSUM_L4 0x8 77001489e5dSAlfredo Cardigliano 77101489e5dSAlfredo Cardigliano /* flags for tso opcode */ 77201489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_TSO_SOT 0x4 77301489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_TSO_EOT 0x8 77401489e5dSAlfredo Cardigliano 77501489e5dSAlfredo Cardigliano __le16 len; 77601489e5dSAlfredo Cardigliano union { 77701489e5dSAlfredo Cardigliano __le16 vlan_tci; 77801489e5dSAlfredo Cardigliano __le16 hword0; 77901489e5dSAlfredo Cardigliano }; 78001489e5dSAlfredo Cardigliano union { 78101489e5dSAlfredo Cardigliano __le16 csum_start; 78201489e5dSAlfredo Cardigliano __le16 hdr_len; 78301489e5dSAlfredo Cardigliano __le16 hword1; 78401489e5dSAlfredo Cardigliano }; 78501489e5dSAlfredo Cardigliano union { 78601489e5dSAlfredo Cardigliano __le16 csum_offset; 78701489e5dSAlfredo Cardigliano __le16 mss; 78801489e5dSAlfredo Cardigliano __le16 hword2; 78901489e5dSAlfredo Cardigliano }; 79001489e5dSAlfredo Cardigliano }; 79101489e5dSAlfredo Cardigliano 79201489e5dSAlfredo Cardigliano static inline u64 encode_txq_desc_cmd(u8 opcode, u8 flags, 79301489e5dSAlfredo Cardigliano u8 nsge, u64 addr) 79401489e5dSAlfredo Cardigliano { 79501489e5dSAlfredo Cardigliano u64 cmd; 79601489e5dSAlfredo Cardigliano 79701489e5dSAlfredo Cardigliano cmd = (opcode & IONIC_TXQ_DESC_OPCODE_MASK) << 79801489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_OPCODE_SHIFT; 79901489e5dSAlfredo Cardigliano cmd |= (flags & IONIC_TXQ_DESC_FLAGS_MASK) << 80001489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_FLAGS_SHIFT; 801126fe197SAndrew Boyer cmd |= (nsge & IONIC_TXQ_DESC_NSGE_MASK) << 802126fe197SAndrew Boyer IONIC_TXQ_DESC_NSGE_SHIFT; 803126fe197SAndrew Boyer cmd |= (addr & IONIC_TXQ_DESC_ADDR_MASK) << 804126fe197SAndrew Boyer IONIC_TXQ_DESC_ADDR_SHIFT; 80501489e5dSAlfredo Cardigliano 80601489e5dSAlfredo Cardigliano return cmd; 80701489e5dSAlfredo Cardigliano }; 80801489e5dSAlfredo Cardigliano 809126fe197SAndrew Boyer static inline void 810126fe197SAndrew Boyer decode_txq_desc_cmd(u64 cmd, u8 *opcode, u8 *flags, 81101489e5dSAlfredo Cardigliano u8 *nsge, u64 *addr) 81201489e5dSAlfredo Cardigliano { 81301489e5dSAlfredo Cardigliano *opcode = (cmd >> IONIC_TXQ_DESC_OPCODE_SHIFT) & 81401489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_OPCODE_MASK; 81501489e5dSAlfredo Cardigliano *flags = (cmd >> IONIC_TXQ_DESC_FLAGS_SHIFT) & 81601489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_FLAGS_MASK; 817126fe197SAndrew Boyer *nsge = (cmd >> IONIC_TXQ_DESC_NSGE_SHIFT) & 818126fe197SAndrew Boyer IONIC_TXQ_DESC_NSGE_MASK; 819126fe197SAndrew Boyer *addr = (cmd >> IONIC_TXQ_DESC_ADDR_SHIFT) & 820126fe197SAndrew Boyer IONIC_TXQ_DESC_ADDR_MASK; 82101489e5dSAlfredo Cardigliano }; 82201489e5dSAlfredo Cardigliano 82301489e5dSAlfredo Cardigliano /** 824126fe197SAndrew Boyer * struct ionic_txq_sg_elem - Transmit scatter-gather (SG) descriptor element 82501489e5dSAlfredo Cardigliano * @addr: DMA address of SG element data buffer 82601489e5dSAlfredo Cardigliano * @len: Length of SG element data buffer, in bytes 82701489e5dSAlfredo Cardigliano */ 82801489e5dSAlfredo Cardigliano struct ionic_txq_sg_elem { 82901489e5dSAlfredo Cardigliano __le64 addr; 83001489e5dSAlfredo Cardigliano __le16 len; 83101489e5dSAlfredo Cardigliano __le16 rsvd[3]; 832126fe197SAndrew Boyer }; 833126fe197SAndrew Boyer 834126fe197SAndrew Boyer /** 835126fe197SAndrew Boyer * struct ionic_txq_sg_desc - Transmit scatter-gather (SG) list 836126fe197SAndrew Boyer * @elems: Scatter-gather elements 837126fe197SAndrew Boyer */ 838126fe197SAndrew Boyer struct ionic_txq_sg_desc { 839126fe197SAndrew Boyer #define IONIC_TX_MAX_SG_ELEMS 8 840126fe197SAndrew Boyer #define IONIC_TX_SG_DESC_STRIDE 8 841126fe197SAndrew Boyer struct ionic_txq_sg_elem elems[IONIC_TX_MAX_SG_ELEMS]; 842126fe197SAndrew Boyer }; 843126fe197SAndrew Boyer 844126fe197SAndrew Boyer struct ionic_txq_sg_desc_v1 { 845126fe197SAndrew Boyer #define IONIC_TX_MAX_SG_ELEMS_V1 15 846126fe197SAndrew Boyer #define IONIC_TX_SG_DESC_STRIDE_V1 16 847126fe197SAndrew Boyer struct ionic_txq_sg_elem elems[IONIC_TX_SG_DESC_STRIDE_V1]; 84801489e5dSAlfredo Cardigliano }; 84901489e5dSAlfredo Cardigliano 85001489e5dSAlfredo Cardigliano /** 85101489e5dSAlfredo Cardigliano * struct ionic_txq_comp - Ethernet transmit queue completion descriptor 852126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 853126fe197SAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 854126fe197SAndrew Boyer * @color: Color bit 85501489e5dSAlfredo Cardigliano */ 85601489e5dSAlfredo Cardigliano struct ionic_txq_comp { 85701489e5dSAlfredo Cardigliano u8 status; 85801489e5dSAlfredo Cardigliano u8 rsvd; 85901489e5dSAlfredo Cardigliano __le16 comp_index; 86001489e5dSAlfredo Cardigliano u8 rsvd2[11]; 86101489e5dSAlfredo Cardigliano u8 color; 86201489e5dSAlfredo Cardigliano }; 86301489e5dSAlfredo Cardigliano 86401489e5dSAlfredo Cardigliano enum ionic_rxq_desc_opcode { 86501489e5dSAlfredo Cardigliano IONIC_RXQ_DESC_OPCODE_SIMPLE = 0, 86601489e5dSAlfredo Cardigliano IONIC_RXQ_DESC_OPCODE_SG = 1, 86701489e5dSAlfredo Cardigliano }; 86801489e5dSAlfredo Cardigliano 86901489e5dSAlfredo Cardigliano /** 87001489e5dSAlfredo Cardigliano * struct ionic_rxq_desc - Ethernet Rx queue descriptor format 871126fe197SAndrew Boyer * @opcode: Rx operation, see IONIC_RXQ_DESC_OPCODE_*: 87201489e5dSAlfredo Cardigliano * 873126fe197SAndrew Boyer * IONIC_RXQ_DESC_OPCODE_SIMPLE: 87401489e5dSAlfredo Cardigliano * Receive full packet into data buffer 87501489e5dSAlfredo Cardigliano * starting at @addr. Results of 87601489e5dSAlfredo Cardigliano * receive, including actual bytes received, 87701489e5dSAlfredo Cardigliano * are recorded in Rx completion descriptor. 87801489e5dSAlfredo Cardigliano * 879126fe197SAndrew Boyer * @len: Data buffer's length, in bytes 88001489e5dSAlfredo Cardigliano * @addr: Data buffer's DMA address 88101489e5dSAlfredo Cardigliano */ 88201489e5dSAlfredo Cardigliano struct ionic_rxq_desc { 88301489e5dSAlfredo Cardigliano u8 opcode; 88401489e5dSAlfredo Cardigliano u8 rsvd[5]; 88501489e5dSAlfredo Cardigliano __le16 len; 88601489e5dSAlfredo Cardigliano __le64 addr; 88701489e5dSAlfredo Cardigliano }; 88801489e5dSAlfredo Cardigliano 88901489e5dSAlfredo Cardigliano /** 890126fe197SAndrew Boyer * struct ionic_rxq_sg_elem - Receive scatter-gather (SG) descriptor element 89101489e5dSAlfredo Cardigliano * @addr: DMA address of SG element data buffer 89201489e5dSAlfredo Cardigliano * @len: Length of SG element data buffer, in bytes 89301489e5dSAlfredo Cardigliano */ 89401489e5dSAlfredo Cardigliano struct ionic_rxq_sg_elem { 89501489e5dSAlfredo Cardigliano __le64 addr; 89601489e5dSAlfredo Cardigliano __le16 len; 89701489e5dSAlfredo Cardigliano __le16 rsvd[3]; 898126fe197SAndrew Boyer }; 899126fe197SAndrew Boyer 900126fe197SAndrew Boyer /** 901126fe197SAndrew Boyer * struct ionic_rxq_sg_desc - Receive scatter-gather (SG) list 902126fe197SAndrew Boyer * @elems: Scatter-gather elements 903126fe197SAndrew Boyer */ 904126fe197SAndrew Boyer struct ionic_rxq_sg_desc { 905126fe197SAndrew Boyer #define IONIC_RX_MAX_SG_ELEMS 8 906126fe197SAndrew Boyer #define IONIC_RX_SG_DESC_STRIDE 8 907126fe197SAndrew Boyer struct ionic_rxq_sg_elem elems[IONIC_RX_SG_DESC_STRIDE]; 90801489e5dSAlfredo Cardigliano }; 90901489e5dSAlfredo Cardigliano 91001489e5dSAlfredo Cardigliano /** 91101489e5dSAlfredo Cardigliano * struct ionic_rxq_comp - Ethernet receive queue completion descriptor 912126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 91301489e5dSAlfredo Cardigliano * @num_sg_elems: Number of SG elements used by this descriptor 914126fe197SAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 91501489e5dSAlfredo Cardigliano * @rss_hash: 32-bit RSS hash 916126fe197SAndrew Boyer * @csum: 16-bit sum of the packet's L2 payload 91701489e5dSAlfredo Cardigliano * If the packet's L2 payload is odd length, an extra 91801489e5dSAlfredo Cardigliano * zero-value byte is included in the @csum calculation but 91901489e5dSAlfredo Cardigliano * not included in @len. 92001489e5dSAlfredo Cardigliano * @vlan_tci: VLAN tag stripped from the packet. Valid if @VLAN is 92101489e5dSAlfredo Cardigliano * set. Includes .1p and .1q tags. 92201489e5dSAlfredo Cardigliano * @len: Received packet length, in bytes. Excludes FCS. 92301489e5dSAlfredo Cardigliano * @csum_calc L2 payload checksum is computed or not 924126fe197SAndrew Boyer * @csum_flags: See IONIC_RXQ_COMP_CSUM_F_*: 925126fe197SAndrew Boyer * 926126fe197SAndrew Boyer * IONIC_RXQ_COMP_CSUM_F_TCP_OK: 927126fe197SAndrew Boyer * The TCP checksum calculated by the device 92801489e5dSAlfredo Cardigliano * matched the checksum in the receive packet's 929126fe197SAndrew Boyer * TCP header. 930126fe197SAndrew Boyer * 931126fe197SAndrew Boyer * IONIC_RXQ_COMP_CSUM_F_TCP_BAD: 932126fe197SAndrew Boyer * The TCP checksum calculated by the device did 93301489e5dSAlfredo Cardigliano * not match the checksum in the receive packet's 93401489e5dSAlfredo Cardigliano * TCP header. 935126fe197SAndrew Boyer * 936126fe197SAndrew Boyer * IONIC_RXQ_COMP_CSUM_F_UDP_OK: 937126fe197SAndrew Boyer * The UDP checksum calculated by the device 93801489e5dSAlfredo Cardigliano * matched the checksum in the receive packet's 93901489e5dSAlfredo Cardigliano * UDP header 940126fe197SAndrew Boyer * 941126fe197SAndrew Boyer * IONIC_RXQ_COMP_CSUM_F_UDP_BAD: 942126fe197SAndrew Boyer * The UDP checksum calculated by the device did 94301489e5dSAlfredo Cardigliano * not match the checksum in the receive packet's 94401489e5dSAlfredo Cardigliano * UDP header. 945126fe197SAndrew Boyer * 946126fe197SAndrew Boyer * IONIC_RXQ_COMP_CSUM_F_IP_OK: 947126fe197SAndrew Boyer * The IPv4 checksum calculated by the device 94801489e5dSAlfredo Cardigliano * matched the checksum in the receive packet's 94901489e5dSAlfredo Cardigliano * first IPv4 header. If the receive packet 95001489e5dSAlfredo Cardigliano * contains both a tunnel IPv4 header and a 95101489e5dSAlfredo Cardigliano * transport IPv4 header, the device validates the 95201489e5dSAlfredo Cardigliano * checksum for the both IPv4 headers. 953126fe197SAndrew Boyer * 954126fe197SAndrew Boyer * IONIC_RXQ_COMP_CSUM_F_IP_BAD: 955126fe197SAndrew Boyer * The IPv4 checksum calculated by the device did 95601489e5dSAlfredo Cardigliano * not match the checksum in the receive packet's 95701489e5dSAlfredo Cardigliano * first IPv4 header. If the receive packet 95801489e5dSAlfredo Cardigliano * contains both a tunnel IPv4 header and a 95901489e5dSAlfredo Cardigliano * transport IPv4 header, the device validates the 96001489e5dSAlfredo Cardigliano * checksum for both IP headers. 961126fe197SAndrew Boyer * 962126fe197SAndrew Boyer * IONIC_RXQ_COMP_CSUM_F_VLAN: 963126fe197SAndrew Boyer * The VLAN header was stripped and placed in @vlan_tci. 964126fe197SAndrew Boyer * 965126fe197SAndrew Boyer * IONIC_RXQ_COMP_CSUM_F_CALC: 966126fe197SAndrew Boyer * The checksum was calculated by the device. 967126fe197SAndrew Boyer * 968126fe197SAndrew Boyer * @pkt_type_color: Packet type and color bit; see IONIC_RXQ_COMP_PKT_TYPE_MASK 96901489e5dSAlfredo Cardigliano */ 97001489e5dSAlfredo Cardigliano struct ionic_rxq_comp { 97101489e5dSAlfredo Cardigliano u8 status; 97201489e5dSAlfredo Cardigliano u8 num_sg_elems; 97301489e5dSAlfredo Cardigliano __le16 comp_index; 97401489e5dSAlfredo Cardigliano __le32 rss_hash; 97501489e5dSAlfredo Cardigliano __le16 csum; 97601489e5dSAlfredo Cardigliano __le16 vlan_tci; 97701489e5dSAlfredo Cardigliano __le16 len; 97801489e5dSAlfredo Cardigliano u8 csum_flags; 97901489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_TCP_OK 0x01 98001489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_TCP_BAD 0x02 98101489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_UDP_OK 0x04 98201489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_UDP_BAD 0x08 98301489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_IP_OK 0x10 98401489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_IP_BAD 0x20 98501489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_VLAN 0x40 98601489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_CALC 0x80 98701489e5dSAlfredo Cardigliano u8 pkt_type_color; 9886645b283SAlfredo Cardigliano #define IONIC_RXQ_COMP_PKT_TYPE_MASK 0x7f 98901489e5dSAlfredo Cardigliano }; 99001489e5dSAlfredo Cardigliano 99101489e5dSAlfredo Cardigliano enum ionic_pkt_type { 992126fe197SAndrew Boyer IONIC_PKT_TYPE_NON_IP = 0x00, 993126fe197SAndrew Boyer IONIC_PKT_TYPE_IPV4 = 0x01, 994126fe197SAndrew Boyer IONIC_PKT_TYPE_IPV4_TCP = 0x03, 995126fe197SAndrew Boyer IONIC_PKT_TYPE_IPV4_UDP = 0x05, 996126fe197SAndrew Boyer IONIC_PKT_TYPE_IPV6 = 0x08, 997126fe197SAndrew Boyer IONIC_PKT_TYPE_IPV6_TCP = 0x18, 998126fe197SAndrew Boyer IONIC_PKT_TYPE_IPV6_UDP = 0x28, 999126fe197SAndrew Boyer /* below types are only used if encap offloads are enabled on lif */ 1000126fe197SAndrew Boyer IONIC_PKT_TYPE_ENCAP_NON_IP = 0x40, 1001126fe197SAndrew Boyer IONIC_PKT_TYPE_ENCAP_IPV4 = 0x41, 1002126fe197SAndrew Boyer IONIC_PKT_TYPE_ENCAP_IPV4_TCP = 0x43, 1003126fe197SAndrew Boyer IONIC_PKT_TYPE_ENCAP_IPV4_UDP = 0x45, 1004126fe197SAndrew Boyer IONIC_PKT_TYPE_ENCAP_IPV6 = 0x48, 1005126fe197SAndrew Boyer IONIC_PKT_TYPE_ENCAP_IPV6_TCP = 0x58, 1006126fe197SAndrew Boyer IONIC_PKT_TYPE_ENCAP_IPV6_UDP = 0x68, 100701489e5dSAlfredo Cardigliano }; 100801489e5dSAlfredo Cardigliano 100901489e5dSAlfredo Cardigliano enum ionic_eth_hw_features { 101001489e5dSAlfredo Cardigliano IONIC_ETH_HW_VLAN_TX_TAG = BIT(0), 101101489e5dSAlfredo Cardigliano IONIC_ETH_HW_VLAN_RX_STRIP = BIT(1), 101201489e5dSAlfredo Cardigliano IONIC_ETH_HW_VLAN_RX_FILTER = BIT(2), 101301489e5dSAlfredo Cardigliano IONIC_ETH_HW_RX_HASH = BIT(3), 101401489e5dSAlfredo Cardigliano IONIC_ETH_HW_RX_CSUM = BIT(4), 101501489e5dSAlfredo Cardigliano IONIC_ETH_HW_TX_SG = BIT(5), 101601489e5dSAlfredo Cardigliano IONIC_ETH_HW_RX_SG = BIT(6), 101701489e5dSAlfredo Cardigliano IONIC_ETH_HW_TX_CSUM = BIT(7), 101801489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO = BIT(8), 101901489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_IPV6 = BIT(9), 102001489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_ECN = BIT(10), 102101489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_GRE = BIT(11), 102201489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_GRE_CSUM = BIT(12), 102301489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_IPXIP4 = BIT(13), 102401489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_IPXIP6 = BIT(14), 102501489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_UDP = BIT(15), 102601489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_UDP_CSUM = BIT(16), 1027126fe197SAndrew Boyer IONIC_ETH_HW_RX_CSUM_GENEVE = BIT(17), 1028126fe197SAndrew Boyer IONIC_ETH_HW_TX_CSUM_GENEVE = BIT(18), 1029126fe197SAndrew Boyer IONIC_ETH_HW_TSO_GENEVE = BIT(19) 103001489e5dSAlfredo Cardigliano }; 103101489e5dSAlfredo Cardigliano 103201489e5dSAlfredo Cardigliano /** 103301489e5dSAlfredo Cardigliano * struct ionic_q_control_cmd - Queue control command 103401489e5dSAlfredo Cardigliano * @opcode: opcode 103501489e5dSAlfredo Cardigliano * @type: Queue type 103601489e5dSAlfredo Cardigliano * @lif_index: LIF index 103701489e5dSAlfredo Cardigliano * @index: Queue index 1038126fe197SAndrew Boyer * @oper: Operation (enum ionic_q_control_oper) 103901489e5dSAlfredo Cardigliano */ 104001489e5dSAlfredo Cardigliano struct ionic_q_control_cmd { 104101489e5dSAlfredo Cardigliano u8 opcode; 104201489e5dSAlfredo Cardigliano u8 type; 104301489e5dSAlfredo Cardigliano __le16 lif_index; 104401489e5dSAlfredo Cardigliano __le32 index; 104501489e5dSAlfredo Cardigliano u8 oper; 104601489e5dSAlfredo Cardigliano u8 rsvd[55]; 104701489e5dSAlfredo Cardigliano }; 104801489e5dSAlfredo Cardigliano 104901489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_q_control_comp; 105001489e5dSAlfredo Cardigliano 1051126fe197SAndrew Boyer enum ionic_q_control_oper { 105201489e5dSAlfredo Cardigliano IONIC_Q_DISABLE = 0, 105301489e5dSAlfredo Cardigliano IONIC_Q_ENABLE = 1, 105401489e5dSAlfredo Cardigliano IONIC_Q_HANG_RESET = 2, 105501489e5dSAlfredo Cardigliano }; 105601489e5dSAlfredo Cardigliano 105701489e5dSAlfredo Cardigliano /** 1058126fe197SAndrew Boyer * enum ionic_phy_type - Physical connection type 1059126fe197SAndrew Boyer * @IONIC_PHY_TYPE_NONE: No PHY installed 1060126fe197SAndrew Boyer * @IONIC_PHY_TYPE_COPPER: Copper PHY 1061126fe197SAndrew Boyer * @IONIC_PHY_TYPE_FIBER: Fiber PHY 106201489e5dSAlfredo Cardigliano */ 106301489e5dSAlfredo Cardigliano enum ionic_phy_type { 106401489e5dSAlfredo Cardigliano IONIC_PHY_TYPE_NONE = 0, 106501489e5dSAlfredo Cardigliano IONIC_PHY_TYPE_COPPER = 1, 106601489e5dSAlfredo Cardigliano IONIC_PHY_TYPE_FIBER = 2, 106701489e5dSAlfredo Cardigliano }; 106801489e5dSAlfredo Cardigliano 106901489e5dSAlfredo Cardigliano /** 1070126fe197SAndrew Boyer * enum ionic_xcvr_state - Transceiver status 1071126fe197SAndrew Boyer * @IONIC_XCVR_STATE_REMOVED: Transceiver removed 1072126fe197SAndrew Boyer * @IONIC_XCVR_STATE_INSERTED: Transceiver inserted 1073126fe197SAndrew Boyer * @IONIC_XCVR_STATE_PENDING: Transceiver pending 1074126fe197SAndrew Boyer * @IONIC_XCVR_STATE_SPROM_READ: Transceiver data read 1075126fe197SAndrew Boyer * @IONIC_XCVR_STATE_SPROM_READ_ERR: Transceiver data read error 107601489e5dSAlfredo Cardigliano */ 107701489e5dSAlfredo Cardigliano enum ionic_xcvr_state { 107801489e5dSAlfredo Cardigliano IONIC_XCVR_STATE_REMOVED = 0, 107901489e5dSAlfredo Cardigliano IONIC_XCVR_STATE_INSERTED = 1, 108001489e5dSAlfredo Cardigliano IONIC_XCVR_STATE_PENDING = 2, 108101489e5dSAlfredo Cardigliano IONIC_XCVR_STATE_SPROM_READ = 3, 108201489e5dSAlfredo Cardigliano IONIC_XCVR_STATE_SPROM_READ_ERR = 4, 108301489e5dSAlfredo Cardigliano }; 108401489e5dSAlfredo Cardigliano 108501489e5dSAlfredo Cardigliano /** 1086126fe197SAndrew Boyer * enum ionic_xcvr_pid - Supported link modes 108701489e5dSAlfredo Cardigliano */ 108801489e5dSAlfredo Cardigliano enum ionic_xcvr_pid { 108901489e5dSAlfredo Cardigliano IONIC_XCVR_PID_UNKNOWN = 0, 109001489e5dSAlfredo Cardigliano 109101489e5dSAlfredo Cardigliano /* CU */ 109201489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_CR4 = 1, 109301489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_40GBASE_CR4 = 2, 109401489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_25GBASE_CR_S = 3, 109501489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_25GBASE_CR_L = 4, 109601489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_25GBASE_CR_N = 5, 109701489e5dSAlfredo Cardigliano 109801489e5dSAlfredo Cardigliano /* Fiber */ 109901489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_AOC = 50, 110001489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_ACC = 51, 110101489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_SR4 = 52, 110201489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_LR4 = 53, 110301489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_ER4 = 54, 110401489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_40GBASE_ER4 = 55, 110501489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_40GBASE_SR4 = 56, 110601489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_40GBASE_LR4 = 57, 110701489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_40GBASE_AOC = 58, 110801489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_25GBASE_SR = 59, 110901489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_25GBASE_LR = 60, 111001489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_25GBASE_ER = 61, 111101489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_25GBASE_AOC = 62, 111201489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_10GBASE_SR = 63, 111301489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_10GBASE_LR = 64, 111401489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_10GBASE_LRM = 65, 111501489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_10GBASE_ER = 66, 111601489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_10GBASE_AOC = 67, 111701489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_10GBASE_CU = 68, 111801489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_CWDM4 = 69, 111901489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_PSM4 = 70, 1120126fe197SAndrew Boyer IONIC_XCVR_PID_SFP_25GBASE_ACC = 71, 112101489e5dSAlfredo Cardigliano }; 112201489e5dSAlfredo Cardigliano 112301489e5dSAlfredo Cardigliano /** 1124126fe197SAndrew Boyer * enum ionic_port_admin_state - Port config state 1125126fe197SAndrew Boyer * @IONIC_PORT_ADMIN_STATE_NONE: Port admin state not configured 1126126fe197SAndrew Boyer * @IONIC_PORT_ADMIN_STATE_DOWN: Port admin disabled 1127126fe197SAndrew Boyer * @IONIC_PORT_ADMIN_STATE_UP: Port admin enabled 112801489e5dSAlfredo Cardigliano */ 112901489e5dSAlfredo Cardigliano enum ionic_port_admin_state { 1130126fe197SAndrew Boyer IONIC_PORT_ADMIN_STATE_NONE = 0, 1131126fe197SAndrew Boyer IONIC_PORT_ADMIN_STATE_DOWN = 1, 1132126fe197SAndrew Boyer IONIC_PORT_ADMIN_STATE_UP = 2, 113301489e5dSAlfredo Cardigliano }; 113401489e5dSAlfredo Cardigliano 113501489e5dSAlfredo Cardigliano /** 1136126fe197SAndrew Boyer * enum ionic_port_oper_status - Port operational status 1137126fe197SAndrew Boyer * @IONIC_PORT_OPER_STATUS_NONE: Port disabled 1138126fe197SAndrew Boyer * @IONIC_PORT_OPER_STATUS_UP: Port link status up 1139126fe197SAndrew Boyer * @IONIC_PORT_OPER_STATUS_DOWN: Port link status down 114001489e5dSAlfredo Cardigliano */ 114101489e5dSAlfredo Cardigliano enum ionic_port_oper_status { 1142126fe197SAndrew Boyer IONIC_PORT_OPER_STATUS_NONE = 0, 1143126fe197SAndrew Boyer IONIC_PORT_OPER_STATUS_UP = 1, 1144126fe197SAndrew Boyer IONIC_PORT_OPER_STATUS_DOWN = 2, 114501489e5dSAlfredo Cardigliano }; 114601489e5dSAlfredo Cardigliano 114701489e5dSAlfredo Cardigliano /** 1148126fe197SAndrew Boyer * enum ionic_port_fec_type - Ethernet Forward error correction (FEC) modes 1149126fe197SAndrew Boyer * @IONIC_PORT_FEC_TYPE_NONE: FEC Disabled 1150126fe197SAndrew Boyer * @IONIC_PORT_FEC_TYPE_FC: FireCode FEC 1151126fe197SAndrew Boyer * @IONIC_PORT_FEC_TYPE_RS: ReedSolomon FEC 115201489e5dSAlfredo Cardigliano */ 115301489e5dSAlfredo Cardigliano enum ionic_port_fec_type { 1154126fe197SAndrew Boyer IONIC_PORT_FEC_TYPE_NONE = 0, 1155126fe197SAndrew Boyer IONIC_PORT_FEC_TYPE_FC = 1, 1156126fe197SAndrew Boyer IONIC_PORT_FEC_TYPE_RS = 2, 115701489e5dSAlfredo Cardigliano }; 115801489e5dSAlfredo Cardigliano 115901489e5dSAlfredo Cardigliano /** 1160126fe197SAndrew Boyer * enum ionic_port_pause_type - Ethernet pause (flow control) modes 1161126fe197SAndrew Boyer * @IONIC_PORT_PAUSE_TYPE_NONE: Disable Pause 1162126fe197SAndrew Boyer * @IONIC_PORT_PAUSE_TYPE_LINK: Link level pause 1163126fe197SAndrew Boyer * @IONIC_PORT_PAUSE_TYPE_PFC: Priority-Flow Control 116401489e5dSAlfredo Cardigliano */ 116501489e5dSAlfredo Cardigliano enum ionic_port_pause_type { 1166126fe197SAndrew Boyer IONIC_PORT_PAUSE_TYPE_NONE = 0, 1167126fe197SAndrew Boyer IONIC_PORT_PAUSE_TYPE_LINK = 1, 1168126fe197SAndrew Boyer IONIC_PORT_PAUSE_TYPE_PFC = 2, 116901489e5dSAlfredo Cardigliano }; 117001489e5dSAlfredo Cardigliano 117101489e5dSAlfredo Cardigliano /** 1172126fe197SAndrew Boyer * enum ionic_port_loopback_mode - Loopback modes 1173126fe197SAndrew Boyer * @IONIC_PORT_LOOPBACK_MODE_NONE: Disable loopback 1174126fe197SAndrew Boyer * @IONIC_PORT_LOOPBACK_MODE_MAC: MAC loopback 1175126fe197SAndrew Boyer * @IONIC_PORT_LOOPBACK_MODE_PHY: PHY/SerDes loopback 117601489e5dSAlfredo Cardigliano */ 117701489e5dSAlfredo Cardigliano enum ionic_port_loopback_mode { 1178126fe197SAndrew Boyer IONIC_PORT_LOOPBACK_MODE_NONE = 0, 1179126fe197SAndrew Boyer IONIC_PORT_LOOPBACK_MODE_MAC = 1, 1180126fe197SAndrew Boyer IONIC_PORT_LOOPBACK_MODE_PHY = 2, 118101489e5dSAlfredo Cardigliano }; 118201489e5dSAlfredo Cardigliano 118301489e5dSAlfredo Cardigliano /** 1184126fe197SAndrew Boyer * struct ionic_xcvr_status - Transceiver Status information 118501489e5dSAlfredo Cardigliano * @state: Transceiver status (enum ionic_xcvr_state) 118601489e5dSAlfredo Cardigliano * @phy: Physical connection type (enum ionic_phy_type) 1187126fe197SAndrew Boyer * @pid: Transceiver link mode (enum ionic_xcvr_pid) 118801489e5dSAlfredo Cardigliano * @sprom: Transceiver sprom contents 118901489e5dSAlfredo Cardigliano */ 119001489e5dSAlfredo Cardigliano struct ionic_xcvr_status { 119101489e5dSAlfredo Cardigliano u8 state; 119201489e5dSAlfredo Cardigliano u8 phy; 119301489e5dSAlfredo Cardigliano __le16 pid; 119401489e5dSAlfredo Cardigliano u8 sprom[256]; 119501489e5dSAlfredo Cardigliano }; 119601489e5dSAlfredo Cardigliano 119701489e5dSAlfredo Cardigliano /** 1198126fe197SAndrew Boyer * union ionic_port_config - Port configuration 119901489e5dSAlfredo Cardigliano * @speed: port speed (in Mbps) 120001489e5dSAlfredo Cardigliano * @mtu: mtu 1201126fe197SAndrew Boyer * @state: port admin state (enum ionic_port_admin_state) 120201489e5dSAlfredo Cardigliano * @an_enable: autoneg enable 120301489e5dSAlfredo Cardigliano * @fec_type: fec type (enum ionic_port_fec_type) 120401489e5dSAlfredo Cardigliano * @pause_type: pause type (enum ionic_port_pause_type) 120501489e5dSAlfredo Cardigliano * @loopback_mode: loopback mode (enum ionic_port_loopback_mode) 120601489e5dSAlfredo Cardigliano */ 120701489e5dSAlfredo Cardigliano union ionic_port_config { 120801489e5dSAlfredo Cardigliano struct { 120901489e5dSAlfredo Cardigliano #define IONIC_SPEED_100G 100000 /* 100G in Mbps */ 121001489e5dSAlfredo Cardigliano #define IONIC_SPEED_50G 50000 /* 50G in Mbps */ 121101489e5dSAlfredo Cardigliano #define IONIC_SPEED_40G 40000 /* 40G in Mbps */ 121201489e5dSAlfredo Cardigliano #define IONIC_SPEED_25G 25000 /* 25G in Mbps */ 121301489e5dSAlfredo Cardigliano #define IONIC_SPEED_10G 10000 /* 10G in Mbps */ 121401489e5dSAlfredo Cardigliano #define IONIC_SPEED_1G 1000 /* 1G in Mbps */ 121501489e5dSAlfredo Cardigliano __le32 speed; 121601489e5dSAlfredo Cardigliano __le32 mtu; 121701489e5dSAlfredo Cardigliano u8 state; 121801489e5dSAlfredo Cardigliano u8 an_enable; 121901489e5dSAlfredo Cardigliano u8 fec_type; 122001489e5dSAlfredo Cardigliano #define IONIC_PAUSE_TYPE_MASK 0x0f 122101489e5dSAlfredo Cardigliano #define IONIC_PAUSE_FLAGS_MASK 0xf0 122201489e5dSAlfredo Cardigliano #define IONIC_PAUSE_F_TX 0x10 122301489e5dSAlfredo Cardigliano #define IONIC_PAUSE_F_RX 0x20 122401489e5dSAlfredo Cardigliano u8 pause_type; 122501489e5dSAlfredo Cardigliano u8 loopback_mode; 122601489e5dSAlfredo Cardigliano }; 122701489e5dSAlfredo Cardigliano __le32 words[64]; 122801489e5dSAlfredo Cardigliano }; 122901489e5dSAlfredo Cardigliano 123001489e5dSAlfredo Cardigliano /** 1231126fe197SAndrew Boyer * struct ionic_port_status - Port Status information 123201489e5dSAlfredo Cardigliano * @status: link status (enum ionic_port_oper_status) 123301489e5dSAlfredo Cardigliano * @id: port id 123401489e5dSAlfredo Cardigliano * @speed: link speed (in Mbps) 1235126fe197SAndrew Boyer * @link_down_count: number of times link went from up to down 1236126fe197SAndrew Boyer * @fec_type: fec type (enum ionic_port_fec_type) 123701489e5dSAlfredo Cardigliano * @xcvr: transceiver status 123801489e5dSAlfredo Cardigliano */ 1239*e7750639SAndre Muezerie struct __rte_packed_begin ionic_port_status { 124001489e5dSAlfredo Cardigliano __le32 id; 124101489e5dSAlfredo Cardigliano __le32 speed; 124201489e5dSAlfredo Cardigliano u8 status; 1243126fe197SAndrew Boyer __le16 link_down_count; 1244126fe197SAndrew Boyer u8 fec_type; 1245126fe197SAndrew Boyer u8 rsvd[48]; 124601489e5dSAlfredo Cardigliano struct ionic_xcvr_status xcvr; 1247*e7750639SAndre Muezerie } __rte_packed_end; 124801489e5dSAlfredo Cardigliano 124901489e5dSAlfredo Cardigliano /** 125001489e5dSAlfredo Cardigliano * struct ionic_port_identify_cmd - Port identify command 125101489e5dSAlfredo Cardigliano * @opcode: opcode 125201489e5dSAlfredo Cardigliano * @index: port index 125301489e5dSAlfredo Cardigliano * @ver: Highest version of identify supported by driver 125401489e5dSAlfredo Cardigliano */ 125501489e5dSAlfredo Cardigliano struct ionic_port_identify_cmd { 125601489e5dSAlfredo Cardigliano u8 opcode; 125701489e5dSAlfredo Cardigliano u8 index; 125801489e5dSAlfredo Cardigliano u8 ver; 125901489e5dSAlfredo Cardigliano u8 rsvd[61]; 126001489e5dSAlfredo Cardigliano }; 126101489e5dSAlfredo Cardigliano 126201489e5dSAlfredo Cardigliano /** 126301489e5dSAlfredo Cardigliano * struct ionic_port_identify_comp - Port identify command completion 1264126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 126501489e5dSAlfredo Cardigliano * @ver: Version of identify returned by device 126601489e5dSAlfredo Cardigliano */ 126701489e5dSAlfredo Cardigliano struct ionic_port_identify_comp { 126801489e5dSAlfredo Cardigliano u8 status; 126901489e5dSAlfredo Cardigliano u8 ver; 127001489e5dSAlfredo Cardigliano u8 rsvd[14]; 127101489e5dSAlfredo Cardigliano }; 127201489e5dSAlfredo Cardigliano 127301489e5dSAlfredo Cardigliano /** 127401489e5dSAlfredo Cardigliano * struct ionic_port_init_cmd - Port initialization command 127501489e5dSAlfredo Cardigliano * @opcode: opcode 127601489e5dSAlfredo Cardigliano * @index: port index 127701489e5dSAlfredo Cardigliano * @info_pa: destination address for port info (struct ionic_port_info) 127801489e5dSAlfredo Cardigliano */ 127901489e5dSAlfredo Cardigliano struct ionic_port_init_cmd { 128001489e5dSAlfredo Cardigliano u8 opcode; 128101489e5dSAlfredo Cardigliano u8 index; 128201489e5dSAlfredo Cardigliano u8 rsvd[6]; 128301489e5dSAlfredo Cardigliano __le64 info_pa; 128401489e5dSAlfredo Cardigliano u8 rsvd2[48]; 128501489e5dSAlfredo Cardigliano }; 128601489e5dSAlfredo Cardigliano 128701489e5dSAlfredo Cardigliano /** 128801489e5dSAlfredo Cardigliano * struct ionic_port_init_comp - Port initialization command completion 1289126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 129001489e5dSAlfredo Cardigliano */ 129101489e5dSAlfredo Cardigliano struct ionic_port_init_comp { 129201489e5dSAlfredo Cardigliano u8 status; 129301489e5dSAlfredo Cardigliano u8 rsvd[15]; 129401489e5dSAlfredo Cardigliano }; 129501489e5dSAlfredo Cardigliano 129601489e5dSAlfredo Cardigliano /** 129701489e5dSAlfredo Cardigliano * struct ionic_port_reset_cmd - Port reset command 129801489e5dSAlfredo Cardigliano * @opcode: opcode 129901489e5dSAlfredo Cardigliano * @index: port index 130001489e5dSAlfredo Cardigliano */ 130101489e5dSAlfredo Cardigliano struct ionic_port_reset_cmd { 130201489e5dSAlfredo Cardigliano u8 opcode; 130301489e5dSAlfredo Cardigliano u8 index; 130401489e5dSAlfredo Cardigliano u8 rsvd[62]; 130501489e5dSAlfredo Cardigliano }; 130601489e5dSAlfredo Cardigliano 130701489e5dSAlfredo Cardigliano /** 130801489e5dSAlfredo Cardigliano * struct ionic_port_reset_comp - Port reset command completion 1309126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 131001489e5dSAlfredo Cardigliano */ 131101489e5dSAlfredo Cardigliano struct ionic_port_reset_comp { 131201489e5dSAlfredo Cardigliano u8 status; 131301489e5dSAlfredo Cardigliano u8 rsvd[15]; 131401489e5dSAlfredo Cardigliano }; 131501489e5dSAlfredo Cardigliano 131601489e5dSAlfredo Cardigliano /** 1317126fe197SAndrew Boyer * enum ionic_stats_ctl_cmd - List of commands for stats control 1318126fe197SAndrew Boyer * @IONIC_STATS_CTL_RESET: Reset statistics 131901489e5dSAlfredo Cardigliano */ 132001489e5dSAlfredo Cardigliano enum ionic_stats_ctl_cmd { 132101489e5dSAlfredo Cardigliano IONIC_STATS_CTL_RESET = 0, 132201489e5dSAlfredo Cardigliano }; 132301489e5dSAlfredo Cardigliano 132401489e5dSAlfredo Cardigliano /** 132501489e5dSAlfredo Cardigliano * enum ionic_port_attr - List of device attributes 1326126fe197SAndrew Boyer * @IONIC_PORT_ATTR_STATE: Port state attribute 1327126fe197SAndrew Boyer * @IONIC_PORT_ATTR_SPEED: Port speed attribute 1328126fe197SAndrew Boyer * @IONIC_PORT_ATTR_MTU: Port MTU attribute 1329126fe197SAndrew Boyer * @IONIC_PORT_ATTR_AUTONEG: Port autonegotiation attribute 1330126fe197SAndrew Boyer * @IONIC_PORT_ATTR_FEC: Port FEC attribute 1331126fe197SAndrew Boyer * @IONIC_PORT_ATTR_PAUSE: Port pause attribute 1332126fe197SAndrew Boyer * @IONIC_PORT_ATTR_LOOPBACK: Port loopback attribute 1333126fe197SAndrew Boyer * @IONIC_PORT_ATTR_STATS_CTRL: Port statistics control attribute 133401489e5dSAlfredo Cardigliano */ 133501489e5dSAlfredo Cardigliano enum ionic_port_attr { 133601489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_STATE = 0, 133701489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_SPEED = 1, 133801489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_MTU = 2, 133901489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_AUTONEG = 3, 134001489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_FEC = 4, 134101489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_PAUSE = 5, 134201489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_LOOPBACK = 6, 134301489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_STATS_CTRL = 7, 134401489e5dSAlfredo Cardigliano }; 134501489e5dSAlfredo Cardigliano 134601489e5dSAlfredo Cardigliano /** 134701489e5dSAlfredo Cardigliano * struct ionic_port_setattr_cmd - Set port attributes on the NIC 134801489e5dSAlfredo Cardigliano * @opcode: Opcode 1349126fe197SAndrew Boyer * @index: Port index 135001489e5dSAlfredo Cardigliano * @attr: Attribute type (enum ionic_port_attr) 1351126fe197SAndrew Boyer * @state: Port state 1352126fe197SAndrew Boyer * @speed: Port speed 1353126fe197SAndrew Boyer * @mtu: Port MTU 1354126fe197SAndrew Boyer * @an_enable: Port autonegotiation setting 1355126fe197SAndrew Boyer * @fec_type: Port FEC type setting 1356126fe197SAndrew Boyer * @pause_type: Port pause type setting 1357126fe197SAndrew Boyer * @loopback_mode: Port loopback mode 1358126fe197SAndrew Boyer * @stats_ctl: Port stats setting 135901489e5dSAlfredo Cardigliano */ 136001489e5dSAlfredo Cardigliano struct ionic_port_setattr_cmd { 136101489e5dSAlfredo Cardigliano u8 opcode; 136201489e5dSAlfredo Cardigliano u8 index; 136301489e5dSAlfredo Cardigliano u8 attr; 136401489e5dSAlfredo Cardigliano u8 rsvd; 136501489e5dSAlfredo Cardigliano union { 136601489e5dSAlfredo Cardigliano u8 state; 136701489e5dSAlfredo Cardigliano __le32 speed; 136801489e5dSAlfredo Cardigliano __le32 mtu; 136901489e5dSAlfredo Cardigliano u8 an_enable; 137001489e5dSAlfredo Cardigliano u8 fec_type; 137101489e5dSAlfredo Cardigliano u8 pause_type; 137201489e5dSAlfredo Cardigliano u8 loopback_mode; 137301489e5dSAlfredo Cardigliano u8 stats_ctl; 137401489e5dSAlfredo Cardigliano u8 rsvd2[60]; 137501489e5dSAlfredo Cardigliano }; 137601489e5dSAlfredo Cardigliano }; 137701489e5dSAlfredo Cardigliano 137801489e5dSAlfredo Cardigliano /** 137901489e5dSAlfredo Cardigliano * struct ionic_port_setattr_comp - Port set attr command completion 1380126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 138101489e5dSAlfredo Cardigliano * @color: Color bit 138201489e5dSAlfredo Cardigliano */ 138301489e5dSAlfredo Cardigliano struct ionic_port_setattr_comp { 138401489e5dSAlfredo Cardigliano u8 status; 138501489e5dSAlfredo Cardigliano u8 rsvd[14]; 138601489e5dSAlfredo Cardigliano u8 color; 138701489e5dSAlfredo Cardigliano }; 138801489e5dSAlfredo Cardigliano 138901489e5dSAlfredo Cardigliano /** 139001489e5dSAlfredo Cardigliano * struct ionic_port_getattr_cmd - Get port attributes from the NIC 139101489e5dSAlfredo Cardigliano * @opcode: Opcode 139201489e5dSAlfredo Cardigliano * @index: port index 139301489e5dSAlfredo Cardigliano * @attr: Attribute type (enum ionic_port_attr) 139401489e5dSAlfredo Cardigliano */ 139501489e5dSAlfredo Cardigliano struct ionic_port_getattr_cmd { 139601489e5dSAlfredo Cardigliano u8 opcode; 139701489e5dSAlfredo Cardigliano u8 index; 139801489e5dSAlfredo Cardigliano u8 attr; 139901489e5dSAlfredo Cardigliano u8 rsvd[61]; 140001489e5dSAlfredo Cardigliano }; 140101489e5dSAlfredo Cardigliano 140201489e5dSAlfredo Cardigliano /** 140301489e5dSAlfredo Cardigliano * struct ionic_port_getattr_comp - Port get attr command completion 1404126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 1405126fe197SAndrew Boyer * @state: Port state 1406126fe197SAndrew Boyer * @speed: Port speed 1407126fe197SAndrew Boyer * @mtu: Port MTU 1408126fe197SAndrew Boyer * @an_enable: Port autonegotiation setting 1409126fe197SAndrew Boyer * @fec_type: Port FEC type setting 1410126fe197SAndrew Boyer * @pause_type: Port pause type setting 1411126fe197SAndrew Boyer * @loopback_mode: Port loopback mode 141201489e5dSAlfredo Cardigliano * @color: Color bit 141301489e5dSAlfredo Cardigliano */ 141401489e5dSAlfredo Cardigliano struct ionic_port_getattr_comp { 141501489e5dSAlfredo Cardigliano u8 status; 141601489e5dSAlfredo Cardigliano u8 rsvd[3]; 1417*e7750639SAndre Muezerie union __rte_packed_begin { 141801489e5dSAlfredo Cardigliano u8 state; 141901489e5dSAlfredo Cardigliano __le32 speed; 142001489e5dSAlfredo Cardigliano __le32 mtu; 142101489e5dSAlfredo Cardigliano u8 an_enable; 142201489e5dSAlfredo Cardigliano u8 fec_type; 142301489e5dSAlfredo Cardigliano u8 pause_type; 142401489e5dSAlfredo Cardigliano u8 loopback_mode; 142501489e5dSAlfredo Cardigliano u8 rsvd2[11]; 1426*e7750639SAndre Muezerie } __rte_packed_end; 142701489e5dSAlfredo Cardigliano u8 color; 142801489e5dSAlfredo Cardigliano }; 142901489e5dSAlfredo Cardigliano 143001489e5dSAlfredo Cardigliano /** 1431126fe197SAndrew Boyer * struct ionic_lif_status - LIF status register 143201489e5dSAlfredo Cardigliano * @eid: most recent NotifyQ event id 1433126fe197SAndrew Boyer * @port_num: port the LIF is connected to 143401489e5dSAlfredo Cardigliano * @link_status: port status (enum ionic_port_oper_status) 143501489e5dSAlfredo Cardigliano * @link_speed: speed of link in Mbps 1436126fe197SAndrew Boyer * @link_down_count: number of times link went from up to down 143701489e5dSAlfredo Cardigliano */ 143801489e5dSAlfredo Cardigliano struct ionic_lif_status { 143901489e5dSAlfredo Cardigliano __le64 eid; 144001489e5dSAlfredo Cardigliano u8 port_num; 144101489e5dSAlfredo Cardigliano u8 rsvd; 144201489e5dSAlfredo Cardigliano __le16 link_status; 144301489e5dSAlfredo Cardigliano __le32 link_speed; /* units of 1Mbps: eg 10000 = 10Gbps */ 144401489e5dSAlfredo Cardigliano __le16 link_down_count; 144501489e5dSAlfredo Cardigliano u8 rsvd2[46]; 144601489e5dSAlfredo Cardigliano }; 144701489e5dSAlfredo Cardigliano 144801489e5dSAlfredo Cardigliano /** 144901489e5dSAlfredo Cardigliano * struct ionic_lif_reset_cmd - LIF reset command 145001489e5dSAlfredo Cardigliano * @opcode: opcode 145101489e5dSAlfredo Cardigliano * @index: LIF index 145201489e5dSAlfredo Cardigliano */ 145301489e5dSAlfredo Cardigliano struct ionic_lif_reset_cmd { 145401489e5dSAlfredo Cardigliano u8 opcode; 145501489e5dSAlfredo Cardigliano u8 rsvd; 145601489e5dSAlfredo Cardigliano __le16 index; 145701489e5dSAlfredo Cardigliano __le32 rsvd2[15]; 145801489e5dSAlfredo Cardigliano }; 145901489e5dSAlfredo Cardigliano 146001489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_lif_reset_comp; 146101489e5dSAlfredo Cardigliano 146201489e5dSAlfredo Cardigliano enum ionic_dev_state { 146301489e5dSAlfredo Cardigliano IONIC_DEV_DISABLE = 0, 146401489e5dSAlfredo Cardigliano IONIC_DEV_ENABLE = 1, 146501489e5dSAlfredo Cardigliano IONIC_DEV_HANG_RESET = 2, 146601489e5dSAlfredo Cardigliano }; 146701489e5dSAlfredo Cardigliano 146801489e5dSAlfredo Cardigliano /** 146901489e5dSAlfredo Cardigliano * enum ionic_dev_attr - List of device attributes 1470126fe197SAndrew Boyer * @IONIC_DEV_ATTR_STATE: Device state attribute 1471126fe197SAndrew Boyer * @IONIC_DEV_ATTR_NAME: Device name attribute 1472126fe197SAndrew Boyer * @IONIC_DEV_ATTR_FEATURES: Device feature attributes 147301489e5dSAlfredo Cardigliano */ 147401489e5dSAlfredo Cardigliano enum ionic_dev_attr { 147501489e5dSAlfredo Cardigliano IONIC_DEV_ATTR_STATE = 0, 147601489e5dSAlfredo Cardigliano IONIC_DEV_ATTR_NAME = 1, 147701489e5dSAlfredo Cardigliano IONIC_DEV_ATTR_FEATURES = 2, 147801489e5dSAlfredo Cardigliano }; 147901489e5dSAlfredo Cardigliano 148001489e5dSAlfredo Cardigliano /** 148101489e5dSAlfredo Cardigliano * struct ionic_dev_setattr_cmd - Set Device attributes on the NIC 148201489e5dSAlfredo Cardigliano * @opcode: Opcode 148301489e5dSAlfredo Cardigliano * @attr: Attribute type (enum ionic_dev_attr) 148401489e5dSAlfredo Cardigliano * @state: Device state (enum ionic_dev_state) 148501489e5dSAlfredo Cardigliano * @name: The bus info, e.g. PCI slot-device-function, 0 terminated 148601489e5dSAlfredo Cardigliano * @features: Device features 148701489e5dSAlfredo Cardigliano */ 148801489e5dSAlfredo Cardigliano struct ionic_dev_setattr_cmd { 148901489e5dSAlfredo Cardigliano u8 opcode; 149001489e5dSAlfredo Cardigliano u8 attr; 149101489e5dSAlfredo Cardigliano __le16 rsvd; 1492*e7750639SAndre Muezerie union __rte_packed_begin { 149301489e5dSAlfredo Cardigliano u8 state; 149401489e5dSAlfredo Cardigliano char name[IONIC_IFNAMSIZ]; 149501489e5dSAlfredo Cardigliano __le64 features; 149601489e5dSAlfredo Cardigliano u8 rsvd2[60]; 1497*e7750639SAndre Muezerie } __rte_packed_end; 149801489e5dSAlfredo Cardigliano }; 149901489e5dSAlfredo Cardigliano 150001489e5dSAlfredo Cardigliano /** 150101489e5dSAlfredo Cardigliano * struct ionic_dev_setattr_comp - Device set attr command completion 1502126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 150301489e5dSAlfredo Cardigliano * @features: Device features 150401489e5dSAlfredo Cardigliano * @color: Color bit 150501489e5dSAlfredo Cardigliano */ 150601489e5dSAlfredo Cardigliano struct ionic_dev_setattr_comp { 150701489e5dSAlfredo Cardigliano u8 status; 150801489e5dSAlfredo Cardigliano u8 rsvd[3]; 1509*e7750639SAndre Muezerie union __rte_packed_begin { 151001489e5dSAlfredo Cardigliano __le64 features; 151101489e5dSAlfredo Cardigliano u8 rsvd2[11]; 1512*e7750639SAndre Muezerie } __rte_packed_end; 151301489e5dSAlfredo Cardigliano u8 color; 151401489e5dSAlfredo Cardigliano }; 151501489e5dSAlfredo Cardigliano 151601489e5dSAlfredo Cardigliano /** 151701489e5dSAlfredo Cardigliano * struct ionic_dev_getattr_cmd - Get Device attributes from the NIC 151801489e5dSAlfredo Cardigliano * @opcode: opcode 151901489e5dSAlfredo Cardigliano * @attr: Attribute type (enum ionic_dev_attr) 152001489e5dSAlfredo Cardigliano */ 152101489e5dSAlfredo Cardigliano struct ionic_dev_getattr_cmd { 152201489e5dSAlfredo Cardigliano u8 opcode; 152301489e5dSAlfredo Cardigliano u8 attr; 152401489e5dSAlfredo Cardigliano u8 rsvd[62]; 152501489e5dSAlfredo Cardigliano }; 152601489e5dSAlfredo Cardigliano 152701489e5dSAlfredo Cardigliano /** 152801489e5dSAlfredo Cardigliano * struct ionic_dev_setattr_comp - Device set attr command completion 1529126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 153001489e5dSAlfredo Cardigliano * @features: Device features 153101489e5dSAlfredo Cardigliano * @color: Color bit 153201489e5dSAlfredo Cardigliano */ 153301489e5dSAlfredo Cardigliano struct ionic_dev_getattr_comp { 153401489e5dSAlfredo Cardigliano u8 status; 153501489e5dSAlfredo Cardigliano u8 rsvd[3]; 1536*e7750639SAndre Muezerie union __rte_packed_begin { 153701489e5dSAlfredo Cardigliano __le64 features; 153801489e5dSAlfredo Cardigliano u8 rsvd2[11]; 1539*e7750639SAndre Muezerie } __rte_packed_end; 154001489e5dSAlfredo Cardigliano u8 color; 154101489e5dSAlfredo Cardigliano }; 154201489e5dSAlfredo Cardigliano 154301489e5dSAlfredo Cardigliano /** 154401489e5dSAlfredo Cardigliano * RSS parameters 154501489e5dSAlfredo Cardigliano */ 154601489e5dSAlfredo Cardigliano #define IONIC_RSS_HASH_KEY_SIZE 40 154701489e5dSAlfredo Cardigliano 154801489e5dSAlfredo Cardigliano enum ionic_rss_hash_types { 154901489e5dSAlfredo Cardigliano IONIC_RSS_TYPE_IPV4 = BIT(0), 155001489e5dSAlfredo Cardigliano IONIC_RSS_TYPE_IPV4_TCP = BIT(1), 155101489e5dSAlfredo Cardigliano IONIC_RSS_TYPE_IPV4_UDP = BIT(2), 155201489e5dSAlfredo Cardigliano IONIC_RSS_TYPE_IPV6 = BIT(3), 155301489e5dSAlfredo Cardigliano IONIC_RSS_TYPE_IPV6_TCP = BIT(4), 155401489e5dSAlfredo Cardigliano IONIC_RSS_TYPE_IPV6_UDP = BIT(5), 155501489e5dSAlfredo Cardigliano }; 155601489e5dSAlfredo Cardigliano 155701489e5dSAlfredo Cardigliano /** 155801489e5dSAlfredo Cardigliano * enum ionic_lif_attr - List of LIF attributes 1559126fe197SAndrew Boyer * @IONIC_LIF_ATTR_STATE: LIF state attribute 1560126fe197SAndrew Boyer * @IONIC_LIF_ATTR_NAME: LIF name attribute 1561126fe197SAndrew Boyer * @IONIC_LIF_ATTR_MTU: LIF MTU attribute 1562126fe197SAndrew Boyer * @IONIC_LIF_ATTR_MAC: LIF MAC attribute 1563126fe197SAndrew Boyer * @IONIC_LIF_ATTR_FEATURES: LIF features attribute 1564126fe197SAndrew Boyer * @IONIC_LIF_ATTR_RSS: LIF RSS attribute 1565126fe197SAndrew Boyer * @IONIC_LIF_ATTR_STATS_CTRL: LIF statistics control attribute 156601489e5dSAlfredo Cardigliano */ 156701489e5dSAlfredo Cardigliano enum ionic_lif_attr { 156801489e5dSAlfredo Cardigliano IONIC_LIF_ATTR_STATE = 0, 156901489e5dSAlfredo Cardigliano IONIC_LIF_ATTR_NAME = 1, 157001489e5dSAlfredo Cardigliano IONIC_LIF_ATTR_MTU = 2, 157101489e5dSAlfredo Cardigliano IONIC_LIF_ATTR_MAC = 3, 157201489e5dSAlfredo Cardigliano IONIC_LIF_ATTR_FEATURES = 4, 157301489e5dSAlfredo Cardigliano IONIC_LIF_ATTR_RSS = 5, 157401489e5dSAlfredo Cardigliano IONIC_LIF_ATTR_STATS_CTRL = 6, 157501489e5dSAlfredo Cardigliano }; 157601489e5dSAlfredo Cardigliano 157701489e5dSAlfredo Cardigliano /** 157801489e5dSAlfredo Cardigliano * struct ionic_lif_setattr_cmd - Set LIF attributes on the NIC 157901489e5dSAlfredo Cardigliano * @opcode: Opcode 1580126fe197SAndrew Boyer * @attr: Attribute type (enum ionic_lif_attr) 158101489e5dSAlfredo Cardigliano * @index: LIF index 1582126fe197SAndrew Boyer * @state: LIF state (enum ionic_lif_state) 158301489e5dSAlfredo Cardigliano * @name: The netdev name string, 0 terminated 158401489e5dSAlfredo Cardigliano * @mtu: Mtu 158501489e5dSAlfredo Cardigliano * @mac: Station mac 158601489e5dSAlfredo Cardigliano * @features: Features (enum ionic_eth_hw_features) 158701489e5dSAlfredo Cardigliano * @rss: RSS properties 1588126fe197SAndrew Boyer * @types: The hash types to enable (see rss_hash_types) 1589126fe197SAndrew Boyer * @key: The hash secret key 1590126fe197SAndrew Boyer * @addr: Address for the indirection table shared memory 1591126fe197SAndrew Boyer * @stats_ctl: stats control commands (enum ionic_stats_ctl_cmd) 159201489e5dSAlfredo Cardigliano */ 159301489e5dSAlfredo Cardigliano struct ionic_lif_setattr_cmd { 159401489e5dSAlfredo Cardigliano u8 opcode; 159501489e5dSAlfredo Cardigliano u8 attr; 159601489e5dSAlfredo Cardigliano __le16 index; 1597*e7750639SAndre Muezerie union __rte_packed_begin { 159801489e5dSAlfredo Cardigliano u8 state; 159901489e5dSAlfredo Cardigliano char name[IONIC_IFNAMSIZ]; 160001489e5dSAlfredo Cardigliano __le32 mtu; 160101489e5dSAlfredo Cardigliano u8 mac[6]; 160201489e5dSAlfredo Cardigliano __le64 features; 160301489e5dSAlfredo Cardigliano struct { 160401489e5dSAlfredo Cardigliano __le16 types; 160501489e5dSAlfredo Cardigliano u8 key[IONIC_RSS_HASH_KEY_SIZE]; 160601489e5dSAlfredo Cardigliano u8 rsvd[6]; 160701489e5dSAlfredo Cardigliano __le64 addr; 160801489e5dSAlfredo Cardigliano } rss; 160901489e5dSAlfredo Cardigliano u8 stats_ctl; 161001489e5dSAlfredo Cardigliano u8 rsvd[60]; 1611*e7750639SAndre Muezerie } __rte_packed_end; 161201489e5dSAlfredo Cardigliano }; 161301489e5dSAlfredo Cardigliano 161401489e5dSAlfredo Cardigliano /** 161501489e5dSAlfredo Cardigliano * struct ionic_lif_setattr_comp - LIF set attr command completion 1616126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 1617126fe197SAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 161801489e5dSAlfredo Cardigliano * @features: features (enum ionic_eth_hw_features) 161901489e5dSAlfredo Cardigliano * @color: Color bit 162001489e5dSAlfredo Cardigliano */ 162101489e5dSAlfredo Cardigliano struct ionic_lif_setattr_comp { 162201489e5dSAlfredo Cardigliano u8 status; 162301489e5dSAlfredo Cardigliano u8 rsvd; 162401489e5dSAlfredo Cardigliano __le16 comp_index; 1625*e7750639SAndre Muezerie union __rte_packed_begin { 162601489e5dSAlfredo Cardigliano __le64 features; 162701489e5dSAlfredo Cardigliano u8 rsvd2[11]; 1628*e7750639SAndre Muezerie } __rte_packed_end; 162901489e5dSAlfredo Cardigliano u8 color; 163001489e5dSAlfredo Cardigliano }; 163101489e5dSAlfredo Cardigliano 163201489e5dSAlfredo Cardigliano /** 163301489e5dSAlfredo Cardigliano * struct ionic_lif_getattr_cmd - Get LIF attributes from the NIC 163401489e5dSAlfredo Cardigliano * @opcode: Opcode 163501489e5dSAlfredo Cardigliano * @attr: Attribute type (enum ionic_lif_attr) 163601489e5dSAlfredo Cardigliano * @index: LIF index 163701489e5dSAlfredo Cardigliano */ 163801489e5dSAlfredo Cardigliano struct ionic_lif_getattr_cmd { 163901489e5dSAlfredo Cardigliano u8 opcode; 164001489e5dSAlfredo Cardigliano u8 attr; 164101489e5dSAlfredo Cardigliano __le16 index; 164201489e5dSAlfredo Cardigliano u8 rsvd[60]; 164301489e5dSAlfredo Cardigliano }; 164401489e5dSAlfredo Cardigliano 164501489e5dSAlfredo Cardigliano /** 164601489e5dSAlfredo Cardigliano * struct ionic_lif_getattr_comp - LIF get attr command completion 1647126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 1648126fe197SAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 1649126fe197SAndrew Boyer * @state: LIF state (enum ionic_lif_state) 165001489e5dSAlfredo Cardigliano * @name: The netdev name string, 0 terminated 165101489e5dSAlfredo Cardigliano * @mtu: Mtu 165201489e5dSAlfredo Cardigliano * @mac: Station mac 165301489e5dSAlfredo Cardigliano * @features: Features (enum ionic_eth_hw_features) 165401489e5dSAlfredo Cardigliano * @color: Color bit 165501489e5dSAlfredo Cardigliano */ 165601489e5dSAlfredo Cardigliano struct ionic_lif_getattr_comp { 165701489e5dSAlfredo Cardigliano u8 status; 165801489e5dSAlfredo Cardigliano u8 rsvd; 165901489e5dSAlfredo Cardigliano __le16 comp_index; 1660*e7750639SAndre Muezerie union __rte_packed_begin { 166101489e5dSAlfredo Cardigliano u8 state; 166201489e5dSAlfredo Cardigliano __le32 mtu; 166301489e5dSAlfredo Cardigliano u8 mac[6]; 166401489e5dSAlfredo Cardigliano __le64 features; 166501489e5dSAlfredo Cardigliano u8 rsvd2[11]; 1666*e7750639SAndre Muezerie } __rte_packed_end; 166701489e5dSAlfredo Cardigliano u8 color; 166801489e5dSAlfredo Cardigliano }; 166901489e5dSAlfredo Cardigliano 167001489e5dSAlfredo Cardigliano enum ionic_rx_mode { 167101489e5dSAlfredo Cardigliano IONIC_RX_MODE_F_UNICAST = BIT(0), 167201489e5dSAlfredo Cardigliano IONIC_RX_MODE_F_MULTICAST = BIT(1), 167301489e5dSAlfredo Cardigliano IONIC_RX_MODE_F_BROADCAST = BIT(2), 167401489e5dSAlfredo Cardigliano IONIC_RX_MODE_F_PROMISC = BIT(3), 167501489e5dSAlfredo Cardigliano IONIC_RX_MODE_F_ALLMULTI = BIT(4), 1676126fe197SAndrew Boyer IONIC_RX_MODE_F_RDMA_SNIFFER = BIT(5), 167701489e5dSAlfredo Cardigliano }; 167801489e5dSAlfredo Cardigliano 167901489e5dSAlfredo Cardigliano /** 168001489e5dSAlfredo Cardigliano * struct ionic_rx_mode_set_cmd - Set LIF's Rx mode command 168101489e5dSAlfredo Cardigliano * @opcode: opcode 168201489e5dSAlfredo Cardigliano * @lif_index: LIF index 168301489e5dSAlfredo Cardigliano * @rx_mode: Rx mode flags: 1684126fe197SAndrew Boyer * IONIC_RX_MODE_F_UNICAST: Accept known unicast packets 1685126fe197SAndrew Boyer * IONIC_RX_MODE_F_MULTICAST: Accept known multicast packets 1686126fe197SAndrew Boyer * IONIC_RX_MODE_F_BROADCAST: Accept broadcast packets 1687126fe197SAndrew Boyer * IONIC_RX_MODE_F_PROMISC: Accept any packets 1688126fe197SAndrew Boyer * IONIC_RX_MODE_F_ALLMULTI: Accept any multicast packets 1689126fe197SAndrew Boyer * IONIC_RX_MODE_F_RDMA_SNIFFER: Sniff RDMA packets 169001489e5dSAlfredo Cardigliano */ 169101489e5dSAlfredo Cardigliano struct ionic_rx_mode_set_cmd { 169201489e5dSAlfredo Cardigliano u8 opcode; 169301489e5dSAlfredo Cardigliano u8 rsvd; 169401489e5dSAlfredo Cardigliano __le16 lif_index; 169501489e5dSAlfredo Cardigliano __le16 rx_mode; 169601489e5dSAlfredo Cardigliano __le16 rsvd2[29]; 169701489e5dSAlfredo Cardigliano }; 169801489e5dSAlfredo Cardigliano 169901489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_rx_mode_set_comp; 170001489e5dSAlfredo Cardigliano 170101489e5dSAlfredo Cardigliano enum ionic_rx_filter_match_type { 170201489e5dSAlfredo Cardigliano IONIC_RX_FILTER_MATCH_VLAN = 0, 170301489e5dSAlfredo Cardigliano IONIC_RX_FILTER_MATCH_MAC, 170401489e5dSAlfredo Cardigliano IONIC_RX_FILTER_MATCH_MAC_VLAN, 170501489e5dSAlfredo Cardigliano }; 170601489e5dSAlfredo Cardigliano 170701489e5dSAlfredo Cardigliano /** 170801489e5dSAlfredo Cardigliano * struct ionic_rx_filter_add_cmd - Add LIF Rx filter command 170901489e5dSAlfredo Cardigliano * @opcode: opcode 171001489e5dSAlfredo Cardigliano * @qtype: Queue type 171101489e5dSAlfredo Cardigliano * @lif_index: LIF index 171201489e5dSAlfredo Cardigliano * @qid: Queue ID 1713126fe197SAndrew Boyer * @match: Rx filter match type (see IONIC_RX_FILTER_MATCH_xxx) 1714126fe197SAndrew Boyer * @vlan: VLAN filter 1715126fe197SAndrew Boyer * @vlan: VLAN ID 1716126fe197SAndrew Boyer * @mac: MAC filter 1717126fe197SAndrew Boyer * @addr: MAC address (network-byte order) 1718126fe197SAndrew Boyer * @mac_vlan: MACVLAN filter 171901489e5dSAlfredo Cardigliano * @vlan: VLAN ID 172001489e5dSAlfredo Cardigliano * @addr: MAC address (network-byte order) 172101489e5dSAlfredo Cardigliano */ 172201489e5dSAlfredo Cardigliano struct ionic_rx_filter_add_cmd { 172301489e5dSAlfredo Cardigliano u8 opcode; 172401489e5dSAlfredo Cardigliano u8 qtype; 172501489e5dSAlfredo Cardigliano __le16 lif_index; 172601489e5dSAlfredo Cardigliano __le32 qid; 172701489e5dSAlfredo Cardigliano __le16 match; 172801489e5dSAlfredo Cardigliano union { 172901489e5dSAlfredo Cardigliano struct { 173001489e5dSAlfredo Cardigliano __le16 vlan; 173101489e5dSAlfredo Cardigliano } vlan; 173201489e5dSAlfredo Cardigliano struct { 173301489e5dSAlfredo Cardigliano u8 addr[6]; 173401489e5dSAlfredo Cardigliano } mac; 173501489e5dSAlfredo Cardigliano struct { 173601489e5dSAlfredo Cardigliano __le16 vlan; 173701489e5dSAlfredo Cardigliano u8 addr[6]; 173801489e5dSAlfredo Cardigliano } mac_vlan; 173901489e5dSAlfredo Cardigliano u8 rsvd[54]; 174001489e5dSAlfredo Cardigliano }; 174101489e5dSAlfredo Cardigliano }; 174201489e5dSAlfredo Cardigliano 174301489e5dSAlfredo Cardigliano /** 174401489e5dSAlfredo Cardigliano * struct ionic_rx_filter_add_comp - Add LIF Rx filter command completion 1745126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 1746126fe197SAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 174701489e5dSAlfredo Cardigliano * @filter_id: Filter ID 1748126fe197SAndrew Boyer * @color: Color bit 174901489e5dSAlfredo Cardigliano */ 175001489e5dSAlfredo Cardigliano struct ionic_rx_filter_add_comp { 175101489e5dSAlfredo Cardigliano u8 status; 175201489e5dSAlfredo Cardigliano u8 rsvd; 175301489e5dSAlfredo Cardigliano __le16 comp_index; 175401489e5dSAlfredo Cardigliano __le32 filter_id; 175501489e5dSAlfredo Cardigliano u8 rsvd2[7]; 175601489e5dSAlfredo Cardigliano u8 color; 175701489e5dSAlfredo Cardigliano }; 175801489e5dSAlfredo Cardigliano 175901489e5dSAlfredo Cardigliano /** 176001489e5dSAlfredo Cardigliano * struct ionic_rx_filter_del_cmd - Delete LIF Rx filter command 176101489e5dSAlfredo Cardigliano * @opcode: opcode 176201489e5dSAlfredo Cardigliano * @lif_index: LIF index 176301489e5dSAlfredo Cardigliano * @filter_id: Filter ID 176401489e5dSAlfredo Cardigliano */ 176501489e5dSAlfredo Cardigliano struct ionic_rx_filter_del_cmd { 176601489e5dSAlfredo Cardigliano u8 opcode; 176701489e5dSAlfredo Cardigliano u8 rsvd; 176801489e5dSAlfredo Cardigliano __le16 lif_index; 176901489e5dSAlfredo Cardigliano __le32 filter_id; 177001489e5dSAlfredo Cardigliano u8 rsvd2[56]; 177101489e5dSAlfredo Cardigliano }; 177201489e5dSAlfredo Cardigliano 177301489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_rx_filter_del_comp; 177401489e5dSAlfredo Cardigliano 1775126fe197SAndrew Boyer enum ionic_vf_attr { 1776126fe197SAndrew Boyer IONIC_VF_ATTR_SPOOFCHK = 1, 1777126fe197SAndrew Boyer IONIC_VF_ATTR_TRUST = 2, 1778126fe197SAndrew Boyer IONIC_VF_ATTR_MAC = 3, 1779126fe197SAndrew Boyer IONIC_VF_ATTR_LINKSTATE = 4, 1780126fe197SAndrew Boyer IONIC_VF_ATTR_VLAN = 5, 1781126fe197SAndrew Boyer IONIC_VF_ATTR_RATE = 6, 1782126fe197SAndrew Boyer IONIC_VF_ATTR_STATSADDR = 7, 1783126fe197SAndrew Boyer }; 1784126fe197SAndrew Boyer 1785126fe197SAndrew Boyer /** 1786126fe197SAndrew Boyer * enum ionic_vf_link_status - Virtual Function link status 1787126fe197SAndrew Boyer * @IONIC_VF_LINK_STATUS_AUTO: Use link state of the uplink 1788126fe197SAndrew Boyer * @IONIC_VF_LINK_STATUS_UP: Link always up 1789126fe197SAndrew Boyer * @IONIC_VF_LINK_STATUS_DOWN: Link always down 1790126fe197SAndrew Boyer */ 1791126fe197SAndrew Boyer enum ionic_vf_link_status { 1792126fe197SAndrew Boyer IONIC_VF_LINK_STATUS_AUTO = 0, 1793126fe197SAndrew Boyer IONIC_VF_LINK_STATUS_UP = 1, 1794126fe197SAndrew Boyer IONIC_VF_LINK_STATUS_DOWN = 2, 1795126fe197SAndrew Boyer }; 1796126fe197SAndrew Boyer 1797126fe197SAndrew Boyer /** 1798126fe197SAndrew Boyer * struct ionic_vf_setattr_cmd - Set VF attributes on the NIC 1799126fe197SAndrew Boyer * @opcode: Opcode 1800126fe197SAndrew Boyer * @attr: Attribute type (enum ionic_vf_attr) 1801126fe197SAndrew Boyer * @vf_index: VF index 1802126fe197SAndrew Boyer * @macaddr: mac address 1803126fe197SAndrew Boyer * @vlanid: vlan ID 1804126fe197SAndrew Boyer * @maxrate: max Tx rate in Mbps 1805126fe197SAndrew Boyer * @spoofchk: enable address spoof checking 1806126fe197SAndrew Boyer * @trust: enable VF trust 1807126fe197SAndrew Boyer * @linkstate: set link up or down 1808126fe197SAndrew Boyer * @stats_pa: set DMA address for VF stats 1809126fe197SAndrew Boyer */ 1810126fe197SAndrew Boyer struct ionic_vf_setattr_cmd { 1811126fe197SAndrew Boyer u8 opcode; 1812126fe197SAndrew Boyer u8 attr; 1813126fe197SAndrew Boyer __le16 vf_index; 1814*e7750639SAndre Muezerie union __rte_packed_begin { 1815126fe197SAndrew Boyer u8 macaddr[6]; 1816126fe197SAndrew Boyer __le16 vlanid; 1817126fe197SAndrew Boyer __le32 maxrate; 1818126fe197SAndrew Boyer u8 spoofchk; 1819126fe197SAndrew Boyer u8 trust; 1820126fe197SAndrew Boyer u8 linkstate; 1821126fe197SAndrew Boyer __le64 stats_pa; 1822126fe197SAndrew Boyer u8 pad[60]; 1823*e7750639SAndre Muezerie } __rte_packed_end; 1824126fe197SAndrew Boyer }; 1825126fe197SAndrew Boyer 1826126fe197SAndrew Boyer struct ionic_vf_setattr_comp { 1827126fe197SAndrew Boyer u8 status; 1828126fe197SAndrew Boyer u8 attr; 1829126fe197SAndrew Boyer __le16 vf_index; 1830126fe197SAndrew Boyer __le16 comp_index; 1831126fe197SAndrew Boyer u8 rsvd[9]; 1832126fe197SAndrew Boyer u8 color; 1833126fe197SAndrew Boyer }; 1834126fe197SAndrew Boyer 1835126fe197SAndrew Boyer /** 1836126fe197SAndrew Boyer * struct ionic_vf_getattr_cmd - Get VF attributes from the NIC 1837126fe197SAndrew Boyer * @opcode: Opcode 1838126fe197SAndrew Boyer * @attr: Attribute type (enum ionic_vf_attr) 1839126fe197SAndrew Boyer * @vf_index: VF index 1840126fe197SAndrew Boyer */ 1841126fe197SAndrew Boyer struct ionic_vf_getattr_cmd { 1842126fe197SAndrew Boyer u8 opcode; 1843126fe197SAndrew Boyer u8 attr; 1844126fe197SAndrew Boyer __le16 vf_index; 1845126fe197SAndrew Boyer u8 rsvd[60]; 1846126fe197SAndrew Boyer }; 1847126fe197SAndrew Boyer 1848126fe197SAndrew Boyer struct ionic_vf_getattr_comp { 1849126fe197SAndrew Boyer u8 status; 1850126fe197SAndrew Boyer u8 attr; 1851126fe197SAndrew Boyer __le16 vf_index; 1852*e7750639SAndre Muezerie union __rte_packed_begin { 1853126fe197SAndrew Boyer u8 macaddr[6]; 1854126fe197SAndrew Boyer __le16 vlanid; 1855126fe197SAndrew Boyer __le32 maxrate; 1856126fe197SAndrew Boyer u8 spoofchk; 1857126fe197SAndrew Boyer u8 trust; 1858126fe197SAndrew Boyer u8 linkstate; 1859126fe197SAndrew Boyer __le64 stats_pa; 1860126fe197SAndrew Boyer u8 pad[11]; 1861*e7750639SAndre Muezerie } __rte_packed_end; 1862126fe197SAndrew Boyer u8 color; 1863126fe197SAndrew Boyer }; 1864126fe197SAndrew Boyer 186501489e5dSAlfredo Cardigliano /** 186601489e5dSAlfredo Cardigliano * struct ionic_qos_identify_cmd - QoS identify command 186701489e5dSAlfredo Cardigliano * @opcode: opcode 186801489e5dSAlfredo Cardigliano * @ver: Highest version of identify supported by driver 186901489e5dSAlfredo Cardigliano * 187001489e5dSAlfredo Cardigliano */ 187101489e5dSAlfredo Cardigliano struct ionic_qos_identify_cmd { 187201489e5dSAlfredo Cardigliano u8 opcode; 187301489e5dSAlfredo Cardigliano u8 ver; 187401489e5dSAlfredo Cardigliano u8 rsvd[62]; 187501489e5dSAlfredo Cardigliano }; 187601489e5dSAlfredo Cardigliano 187701489e5dSAlfredo Cardigliano /** 187801489e5dSAlfredo Cardigliano * struct ionic_qos_identify_comp - QoS identify command completion 1879126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 188001489e5dSAlfredo Cardigliano * @ver: Version of identify returned by device 188101489e5dSAlfredo Cardigliano */ 188201489e5dSAlfredo Cardigliano struct ionic_qos_identify_comp { 188301489e5dSAlfredo Cardigliano u8 status; 188401489e5dSAlfredo Cardigliano u8 ver; 188501489e5dSAlfredo Cardigliano u8 rsvd[14]; 188601489e5dSAlfredo Cardigliano }; 188701489e5dSAlfredo Cardigliano 1888126fe197SAndrew Boyer #define IONIC_QOS_TC_MAX 8 1889126fe197SAndrew Boyer #define IONIC_QOS_ALL_TC 0xFF 1890126fe197SAndrew Boyer /* Capri max supported, should be renamed. */ 189101489e5dSAlfredo Cardigliano #define IONIC_QOS_CLASS_MAX 7 1892126fe197SAndrew Boyer #define IONIC_QOS_PCP_MAX 8 189301489e5dSAlfredo Cardigliano #define IONIC_QOS_CLASS_NAME_SZ 32 1894126fe197SAndrew Boyer #define IONIC_QOS_DSCP_MAX 64 1895126fe197SAndrew Boyer #define IONIC_QOS_ALL_PCP 0xFF 1896126fe197SAndrew Boyer #define IONIC_DSCP_BLOCK_SIZE 8 189701489e5dSAlfredo Cardigliano 189801489e5dSAlfredo Cardigliano /** 189901489e5dSAlfredo Cardigliano * enum ionic_qos_class 190001489e5dSAlfredo Cardigliano */ 190101489e5dSAlfredo Cardigliano enum ionic_qos_class { 190201489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_DEFAULT = 0, 190301489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_USER_DEFINED_1 = 1, 190401489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_USER_DEFINED_2 = 2, 190501489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_USER_DEFINED_3 = 3, 190601489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_USER_DEFINED_4 = 4, 190701489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_USER_DEFINED_5 = 5, 190801489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_USER_DEFINED_6 = 6, 190901489e5dSAlfredo Cardigliano }; 191001489e5dSAlfredo Cardigliano 191101489e5dSAlfredo Cardigliano /** 191201489e5dSAlfredo Cardigliano * enum ionic_qos_class_type - Traffic classification criteria 1913126fe197SAndrew Boyer * @IONIC_QOS_CLASS_TYPE_NONE: No QoS 1914126fe197SAndrew Boyer * @IONIC_QOS_CLASS_TYPE_PCP: Dot1Q PCP 1915126fe197SAndrew Boyer * @IONIC_QOS_CLASS_TYPE_DSCP: IP DSCP 191601489e5dSAlfredo Cardigliano */ 191701489e5dSAlfredo Cardigliano enum ionic_qos_class_type { 191801489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_TYPE_NONE = 0, 1919126fe197SAndrew Boyer IONIC_QOS_CLASS_TYPE_PCP = 1, 1920126fe197SAndrew Boyer IONIC_QOS_CLASS_TYPE_DSCP = 2, 192101489e5dSAlfredo Cardigliano }; 192201489e5dSAlfredo Cardigliano 192301489e5dSAlfredo Cardigliano /** 1924126fe197SAndrew Boyer * enum ionic_qos_sched_type - QoS class scheduling type 1925126fe197SAndrew Boyer * @IONIC_QOS_SCHED_TYPE_STRICT: Strict priority 1926126fe197SAndrew Boyer * @IONIC_QOS_SCHED_TYPE_DWRR: Deficit weighted round-robin 192701489e5dSAlfredo Cardigliano */ 192801489e5dSAlfredo Cardigliano enum ionic_qos_sched_type { 192901489e5dSAlfredo Cardigliano IONIC_QOS_SCHED_TYPE_STRICT = 0, 193001489e5dSAlfredo Cardigliano IONIC_QOS_SCHED_TYPE_DWRR = 1, 193101489e5dSAlfredo Cardigliano }; 193201489e5dSAlfredo Cardigliano 193301489e5dSAlfredo Cardigliano /** 1934126fe197SAndrew Boyer * union ionic_qos_config - QoS configuration structure 193501489e5dSAlfredo Cardigliano * @flags: Configuration flags 193601489e5dSAlfredo Cardigliano * IONIC_QOS_CONFIG_F_ENABLE enable 1937126fe197SAndrew Boyer * IONIC_QOS_CONFIG_F_NO_DROP drop/nodrop 193801489e5dSAlfredo Cardigliano * IONIC_QOS_CONFIG_F_RW_DOT1Q_PCP enable dot1q pcp rewrite 193901489e5dSAlfredo Cardigliano * IONIC_QOS_CONFIG_F_RW_IP_DSCP enable ip dscp rewrite 1940126fe197SAndrew Boyer * IONIC_QOS_CONFIG_F_NON_DISRUPTIVE Non-disruptive TC update 1941126fe197SAndrew Boyer * @sched_type: QoS class scheduling type (enum ionic_qos_sched_type) 1942126fe197SAndrew Boyer * @class_type: QoS class type (enum ionic_qos_class_type) 1943126fe197SAndrew Boyer * @pause_type: QoS pause type (enum ionic_qos_pause_type) 1944126fe197SAndrew Boyer * @name: QoS class name 194501489e5dSAlfredo Cardigliano * @mtu: MTU of the class 1946126fe197SAndrew Boyer * @pfc_cos: Priority-Flow Control class of service 1947126fe197SAndrew Boyer * @dwrr_weight: QoS class scheduling weight 194801489e5dSAlfredo Cardigliano * @strict_rlmt: Rate limit for strict priority scheduling 1949126fe197SAndrew Boyer * @rw_dot1q_pcp: Rewrite dot1q pcp to value (valid iff F_RW_DOT1Q_PCP) 1950126fe197SAndrew Boyer * @rw_ip_dscp: Rewrite ip dscp to value (valid iff F_RW_IP_DSCP) 195101489e5dSAlfredo Cardigliano * @dot1q_pcp: Dot1q pcp value 195201489e5dSAlfredo Cardigliano * @ndscp: Number of valid dscp values in the ip_dscp field 195301489e5dSAlfredo Cardigliano * @ip_dscp: IP dscp values 195401489e5dSAlfredo Cardigliano */ 195501489e5dSAlfredo Cardigliano union ionic_qos_config { 1956*e7750639SAndre Muezerie struct __rte_packed_begin { 195701489e5dSAlfredo Cardigliano #define IONIC_QOS_CONFIG_F_ENABLE BIT(0) 1958126fe197SAndrew Boyer #define IONIC_QOS_CONFIG_F_NO_DROP BIT(1) 1959126fe197SAndrew Boyer /* Used to rewrite PCP or DSCP value. */ 196001489e5dSAlfredo Cardigliano #define IONIC_QOS_CONFIG_F_RW_DOT1Q_PCP BIT(2) 196101489e5dSAlfredo Cardigliano #define IONIC_QOS_CONFIG_F_RW_IP_DSCP BIT(3) 1962126fe197SAndrew Boyer /* Non-disruptive TC update */ 1963126fe197SAndrew Boyer #define IONIC_QOS_CONFIG_F_NON_DISRUPTIVE BIT(4) 196401489e5dSAlfredo Cardigliano u8 flags; 196501489e5dSAlfredo Cardigliano u8 sched_type; 196601489e5dSAlfredo Cardigliano u8 class_type; 196701489e5dSAlfredo Cardigliano u8 pause_type; 196801489e5dSAlfredo Cardigliano char name[IONIC_QOS_CLASS_NAME_SZ]; 196901489e5dSAlfredo Cardigliano __le32 mtu; 197001489e5dSAlfredo Cardigliano /* flow control */ 197101489e5dSAlfredo Cardigliano u8 pfc_cos; 197201489e5dSAlfredo Cardigliano /* scheduler */ 197301489e5dSAlfredo Cardigliano union { 197401489e5dSAlfredo Cardigliano u8 dwrr_weight; 197501489e5dSAlfredo Cardigliano __le64 strict_rlmt; 197601489e5dSAlfredo Cardigliano }; 197701489e5dSAlfredo Cardigliano /* marking */ 1978126fe197SAndrew Boyer /* Used to rewrite PCP or DSCP value. */ 197901489e5dSAlfredo Cardigliano union { 198001489e5dSAlfredo Cardigliano u8 rw_dot1q_pcp; 198101489e5dSAlfredo Cardigliano u8 rw_ip_dscp; 198201489e5dSAlfredo Cardigliano }; 198301489e5dSAlfredo Cardigliano /* classification */ 198401489e5dSAlfredo Cardigliano union { 198501489e5dSAlfredo Cardigliano u8 dot1q_pcp; 198601489e5dSAlfredo Cardigliano struct { 198701489e5dSAlfredo Cardigliano u8 ndscp; 1988126fe197SAndrew Boyer u8 ip_dscp[IONIC_QOS_DSCP_MAX]; 198901489e5dSAlfredo Cardigliano }; 199001489e5dSAlfredo Cardigliano }; 1991*e7750639SAndre Muezerie } __rte_packed_end; 199201489e5dSAlfredo Cardigliano __le32 words[64]; 199301489e5dSAlfredo Cardigliano }; 199401489e5dSAlfredo Cardigliano 199501489e5dSAlfredo Cardigliano /** 199601489e5dSAlfredo Cardigliano * union ionic_qos_identity - QoS identity structure 199701489e5dSAlfredo Cardigliano * @version: Version of the identify structure 199801489e5dSAlfredo Cardigliano * @type: QoS system type 199901489e5dSAlfredo Cardigliano * @nclasses: Number of usable QoS classes 200001489e5dSAlfredo Cardigliano * @config: Current configuration of classes 200101489e5dSAlfredo Cardigliano */ 200201489e5dSAlfredo Cardigliano union ionic_qos_identity { 200301489e5dSAlfredo Cardigliano struct { 200401489e5dSAlfredo Cardigliano u8 version; 200501489e5dSAlfredo Cardigliano u8 type; 200601489e5dSAlfredo Cardigliano u8 rsvd[62]; 200701489e5dSAlfredo Cardigliano union ionic_qos_config config[IONIC_QOS_CLASS_MAX]; 200801489e5dSAlfredo Cardigliano }; 2009126fe197SAndrew Boyer __le32 words[478]; 201001489e5dSAlfredo Cardigliano }; 201101489e5dSAlfredo Cardigliano 201201489e5dSAlfredo Cardigliano /** 2013126fe197SAndrew Boyer * struct ionic_qos_init_cmd - QoS config init command 201401489e5dSAlfredo Cardigliano * @opcode: Opcode 2015126fe197SAndrew Boyer * @group: QoS class id 201601489e5dSAlfredo Cardigliano * @info_pa: destination address for qos info 201701489e5dSAlfredo Cardigliano */ 201801489e5dSAlfredo Cardigliano struct ionic_qos_init_cmd { 201901489e5dSAlfredo Cardigliano u8 opcode; 202001489e5dSAlfredo Cardigliano u8 group; 202101489e5dSAlfredo Cardigliano u8 rsvd[6]; 202201489e5dSAlfredo Cardigliano __le64 info_pa; 202301489e5dSAlfredo Cardigliano u8 rsvd1[48]; 202401489e5dSAlfredo Cardigliano }; 202501489e5dSAlfredo Cardigliano 202601489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_qos_init_comp; 202701489e5dSAlfredo Cardigliano 202801489e5dSAlfredo Cardigliano /** 2029126fe197SAndrew Boyer * struct ionic_qos_reset_cmd - QoS config reset command 203001489e5dSAlfredo Cardigliano * @opcode: Opcode 2031126fe197SAndrew Boyer * @group: QoS class id 203201489e5dSAlfredo Cardigliano */ 203301489e5dSAlfredo Cardigliano struct ionic_qos_reset_cmd { 203401489e5dSAlfredo Cardigliano u8 opcode; 203501489e5dSAlfredo Cardigliano u8 group; 203601489e5dSAlfredo Cardigliano u8 rsvd[62]; 203701489e5dSAlfredo Cardigliano }; 203801489e5dSAlfredo Cardigliano 2039126fe197SAndrew Boyer /** 2040126fe197SAndrew Boyer * struct ionic_qos_clear_port_stats_cmd - Qos config reset command 2041126fe197SAndrew Boyer * @opcode: Opcode 2042126fe197SAndrew Boyer */ 2043126fe197SAndrew Boyer struct ionic_qos_clear_stats_cmd { 2044126fe197SAndrew Boyer u8 opcode; 2045126fe197SAndrew Boyer u8 group_bitmap; 2046126fe197SAndrew Boyer u8 rsvd[62]; 2047126fe197SAndrew Boyer }; 2048126fe197SAndrew Boyer 204901489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_qos_reset_comp; 205001489e5dSAlfredo Cardigliano 205101489e5dSAlfredo Cardigliano /** 205201489e5dSAlfredo Cardigliano * struct ionic_fw_download_cmd - Firmware download command 205301489e5dSAlfredo Cardigliano * @opcode: opcode 205401489e5dSAlfredo Cardigliano * @addr: dma address of the firmware buffer 205501489e5dSAlfredo Cardigliano * @offset: offset of the firmware buffer within the full image 205601489e5dSAlfredo Cardigliano * @length: number of valid bytes in the firmware buffer 205701489e5dSAlfredo Cardigliano */ 205801489e5dSAlfredo Cardigliano struct ionic_fw_download_cmd { 205901489e5dSAlfredo Cardigliano u8 opcode; 206001489e5dSAlfredo Cardigliano u8 rsvd[3]; 206101489e5dSAlfredo Cardigliano __le32 offset; 206201489e5dSAlfredo Cardigliano __le64 addr; 206301489e5dSAlfredo Cardigliano __le32 length; 206401489e5dSAlfredo Cardigliano }; 206501489e5dSAlfredo Cardigliano 206601489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_fw_download_comp; 206701489e5dSAlfredo Cardigliano 2068126fe197SAndrew Boyer /** 2069126fe197SAndrew Boyer * enum ionic_fw_control_oper - FW control operations 2070126fe197SAndrew Boyer * @IONIC_FW_RESET: Reset firmware 2071126fe197SAndrew Boyer * @IONIC_FW_INSTALL: Install firmware 20727be78d02SJosh Soref * @IONIC_FW_ACTIVATE: Activate firmware 2073126fe197SAndrew Boyer */ 207401489e5dSAlfredo Cardigliano enum ionic_fw_control_oper { 2075126fe197SAndrew Boyer IONIC_FW_RESET = 0, 2076126fe197SAndrew Boyer IONIC_FW_INSTALL = 1, 2077126fe197SAndrew Boyer IONIC_FW_ACTIVATE = 2, 207801489e5dSAlfredo Cardigliano }; 207901489e5dSAlfredo Cardigliano 208001489e5dSAlfredo Cardigliano /** 208101489e5dSAlfredo Cardigliano * struct ionic_fw_control_cmd - Firmware control command 208201489e5dSAlfredo Cardigliano * @opcode: opcode 208301489e5dSAlfredo Cardigliano * @oper: firmware control operation (enum ionic_fw_control_oper) 208401489e5dSAlfredo Cardigliano * @slot: slot to activate 208501489e5dSAlfredo Cardigliano */ 208601489e5dSAlfredo Cardigliano struct ionic_fw_control_cmd { 208701489e5dSAlfredo Cardigliano u8 opcode; 208801489e5dSAlfredo Cardigliano u8 rsvd[3]; 208901489e5dSAlfredo Cardigliano u8 oper; 209001489e5dSAlfredo Cardigliano u8 slot; 209101489e5dSAlfredo Cardigliano u8 rsvd1[58]; 209201489e5dSAlfredo Cardigliano }; 209301489e5dSAlfredo Cardigliano 209401489e5dSAlfredo Cardigliano /** 20957be78d02SJosh Soref * struct ionic_fw_control_comp - Firmware control completion 2096126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 2097126fe197SAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 2098126fe197SAndrew Boyer * @slot: Slot where the firmware was installed 2099126fe197SAndrew Boyer * @color: Color bit 210001489e5dSAlfredo Cardigliano */ 210101489e5dSAlfredo Cardigliano struct ionic_fw_control_comp { 210201489e5dSAlfredo Cardigliano u8 status; 210301489e5dSAlfredo Cardigliano u8 rsvd; 210401489e5dSAlfredo Cardigliano __le16 comp_index; 210501489e5dSAlfredo Cardigliano u8 slot; 210601489e5dSAlfredo Cardigliano u8 rsvd1[10]; 210701489e5dSAlfredo Cardigliano u8 color; 210801489e5dSAlfredo Cardigliano }; 210901489e5dSAlfredo Cardigliano 211001489e5dSAlfredo Cardigliano /****************************************************************** 211101489e5dSAlfredo Cardigliano ******************* RDMA Commands ******************************** 211201489e5dSAlfredo Cardigliano ******************************************************************/ 211301489e5dSAlfredo Cardigliano 211401489e5dSAlfredo Cardigliano /** 211501489e5dSAlfredo Cardigliano * struct ionic_rdma_reset_cmd - Reset RDMA LIF cmd 211601489e5dSAlfredo Cardigliano * @opcode: opcode 2117126fe197SAndrew Boyer * @lif_index: LIF index 211801489e5dSAlfredo Cardigliano * 2119126fe197SAndrew Boyer * There is no RDMA specific dev command completion struct. Completion uses 212001489e5dSAlfredo Cardigliano * the common struct ionic_admin_comp. Only the status is indicated. 2121126fe197SAndrew Boyer * Nonzero status means the LIF does not support RDMA. 212201489e5dSAlfredo Cardigliano **/ 212301489e5dSAlfredo Cardigliano struct ionic_rdma_reset_cmd { 212401489e5dSAlfredo Cardigliano u8 opcode; 212501489e5dSAlfredo Cardigliano u8 rsvd; 212601489e5dSAlfredo Cardigliano __le16 lif_index; 212701489e5dSAlfredo Cardigliano u8 rsvd2[60]; 212801489e5dSAlfredo Cardigliano }; 212901489e5dSAlfredo Cardigliano 213001489e5dSAlfredo Cardigliano /** 213101489e5dSAlfredo Cardigliano * struct ionic_rdma_queue_cmd - Create RDMA Queue command 213201489e5dSAlfredo Cardigliano * @opcode: opcode, 52, 53 2133126fe197SAndrew Boyer * @lif_index: LIF index 2134126fe197SAndrew Boyer * @qid_ver: (qid | (RDMA version << 24)) 213501489e5dSAlfredo Cardigliano * @cid: intr, eq_id, or cq_id 213601489e5dSAlfredo Cardigliano * @dbid: doorbell page id 213701489e5dSAlfredo Cardigliano * @depth_log2: log base two of queue depth 213801489e5dSAlfredo Cardigliano * @stride_log2: log base two of queue stride 213901489e5dSAlfredo Cardigliano * @dma_addr: address of the queue memory 214001489e5dSAlfredo Cardigliano * 2141126fe197SAndrew Boyer * The same command struct is used to create an RDMA event queue, completion 2142126fe197SAndrew Boyer * queue, or RDMA admin queue. The cid is an interrupt number for an event 214301489e5dSAlfredo Cardigliano * queue, an event queue id for a completion queue, or a completion queue id 2144126fe197SAndrew Boyer * for an RDMA admin queue. 214501489e5dSAlfredo Cardigliano * 214601489e5dSAlfredo Cardigliano * The queue created via a dev command must be contiguous in dma space. 214701489e5dSAlfredo Cardigliano * 214801489e5dSAlfredo Cardigliano * The dev commands are intended only to be used during driver initialization, 2149126fe197SAndrew Boyer * to create queues supporting the RDMA admin queue. Other queues, and other 2150126fe197SAndrew Boyer * types of RDMA resources like memory regions, will be created and registered 2151126fe197SAndrew Boyer * via the RDMA admin queue, and will support a more complete interface 215201489e5dSAlfredo Cardigliano * providing scatter gather lists for larger, scattered queue buffers and 215301489e5dSAlfredo Cardigliano * memory registration. 215401489e5dSAlfredo Cardigliano * 2155126fe197SAndrew Boyer * There is no RDMA specific dev command completion struct. Completion uses 215601489e5dSAlfredo Cardigliano * the common struct ionic_admin_comp. Only the status is indicated. 215701489e5dSAlfredo Cardigliano **/ 215801489e5dSAlfredo Cardigliano struct ionic_rdma_queue_cmd { 215901489e5dSAlfredo Cardigliano u8 opcode; 216001489e5dSAlfredo Cardigliano u8 rsvd; 216101489e5dSAlfredo Cardigliano __le16 lif_index; 216201489e5dSAlfredo Cardigliano __le32 qid_ver; 216301489e5dSAlfredo Cardigliano __le32 cid; 216401489e5dSAlfredo Cardigliano __le16 dbid; 216501489e5dSAlfredo Cardigliano u8 depth_log2; 216601489e5dSAlfredo Cardigliano u8 stride_log2; 216701489e5dSAlfredo Cardigliano __le64 dma_addr; 2168126fe197SAndrew Boyer u8 rsvd2[40]; 216901489e5dSAlfredo Cardigliano }; 217001489e5dSAlfredo Cardigliano 217101489e5dSAlfredo Cardigliano /****************************************************************** 217201489e5dSAlfredo Cardigliano ******************* Notify Events ******************************** 217301489e5dSAlfredo Cardigliano ******************************************************************/ 217401489e5dSAlfredo Cardigliano 217501489e5dSAlfredo Cardigliano /** 2176126fe197SAndrew Boyer * struct ionic_notifyq_event - Generic event reporting structure 217701489e5dSAlfredo Cardigliano * @eid: event number 217801489e5dSAlfredo Cardigliano * @ecode: event code 217901489e5dSAlfredo Cardigliano * @data: unspecified data about the event 218001489e5dSAlfredo Cardigliano * 218101489e5dSAlfredo Cardigliano * This is the generic event report struct from which the other 218201489e5dSAlfredo Cardigliano * actual events will be formed. 218301489e5dSAlfredo Cardigliano */ 218401489e5dSAlfredo Cardigliano struct ionic_notifyq_event { 218501489e5dSAlfredo Cardigliano __le64 eid; 218601489e5dSAlfredo Cardigliano __le16 ecode; 218701489e5dSAlfredo Cardigliano u8 data[54]; 218801489e5dSAlfredo Cardigliano }; 218901489e5dSAlfredo Cardigliano 219001489e5dSAlfredo Cardigliano /** 2191126fe197SAndrew Boyer * struct ionic_link_change_event - Link change event notification 219201489e5dSAlfredo Cardigliano * @eid: event number 2193126fe197SAndrew Boyer * @ecode: event code = IONIC_EVENT_LINK_CHANGE 2194126fe197SAndrew Boyer * @link_status: link up/down, with error bits (enum ionic_port_status) 219501489e5dSAlfredo Cardigliano * @link_speed: speed of the network link 219601489e5dSAlfredo Cardigliano * 219701489e5dSAlfredo Cardigliano * Sent when the network link state changes between UP and DOWN 219801489e5dSAlfredo Cardigliano */ 219901489e5dSAlfredo Cardigliano struct ionic_link_change_event { 220001489e5dSAlfredo Cardigliano __le64 eid; 220101489e5dSAlfredo Cardigliano __le16 ecode; 220201489e5dSAlfredo Cardigliano __le16 link_status; 220301489e5dSAlfredo Cardigliano __le32 link_speed; /* units of 1Mbps: e.g. 10000 = 10Gbps */ 220401489e5dSAlfredo Cardigliano u8 rsvd[48]; 220501489e5dSAlfredo Cardigliano }; 220601489e5dSAlfredo Cardigliano 220701489e5dSAlfredo Cardigliano /** 2208126fe197SAndrew Boyer * struct ionic_reset_event - Reset event notification 220901489e5dSAlfredo Cardigliano * @eid: event number 2210126fe197SAndrew Boyer * @ecode: event code = IONIC_EVENT_RESET 221101489e5dSAlfredo Cardigliano * @reset_code: reset type 221201489e5dSAlfredo Cardigliano * @state: 0=pending, 1=complete, 2=error 221301489e5dSAlfredo Cardigliano * 221401489e5dSAlfredo Cardigliano * Sent when the NIC or some subsystem is going to be or 221501489e5dSAlfredo Cardigliano * has been reset. 221601489e5dSAlfredo Cardigliano */ 221701489e5dSAlfredo Cardigliano struct ionic_reset_event { 221801489e5dSAlfredo Cardigliano __le64 eid; 221901489e5dSAlfredo Cardigliano __le16 ecode; 222001489e5dSAlfredo Cardigliano u8 reset_code; 222101489e5dSAlfredo Cardigliano u8 state; 222201489e5dSAlfredo Cardigliano u8 rsvd[52]; 222301489e5dSAlfredo Cardigliano }; 222401489e5dSAlfredo Cardigliano 222501489e5dSAlfredo Cardigliano /** 2226126fe197SAndrew Boyer * struct ionic_heartbeat_event - Sent periodically by NIC to indicate health 222701489e5dSAlfredo Cardigliano * @eid: event number 2228126fe197SAndrew Boyer * @ecode: event code = IONIC_EVENT_HEARTBEAT 222901489e5dSAlfredo Cardigliano */ 223001489e5dSAlfredo Cardigliano struct ionic_heartbeat_event { 223101489e5dSAlfredo Cardigliano __le64 eid; 223201489e5dSAlfredo Cardigliano __le16 ecode; 223301489e5dSAlfredo Cardigliano u8 rsvd[54]; 223401489e5dSAlfredo Cardigliano }; 223501489e5dSAlfredo Cardigliano 223601489e5dSAlfredo Cardigliano /** 2237126fe197SAndrew Boyer * struct ionic_log_event - Sent to notify the driver of an internal error 223801489e5dSAlfredo Cardigliano * @eid: event number 2239126fe197SAndrew Boyer * @ecode: event code = IONIC_EVENT_LOG 224001489e5dSAlfredo Cardigliano * @data: log data 224101489e5dSAlfredo Cardigliano */ 224201489e5dSAlfredo Cardigliano struct ionic_log_event { 224301489e5dSAlfredo Cardigliano __le64 eid; 224401489e5dSAlfredo Cardigliano __le16 ecode; 224501489e5dSAlfredo Cardigliano u8 data[54]; 224601489e5dSAlfredo Cardigliano }; 224701489e5dSAlfredo Cardigliano 224801489e5dSAlfredo Cardigliano /** 2249126fe197SAndrew Boyer * struct ionic_xcvr_event - Transceiver change event 2250126fe197SAndrew Boyer * @eid: event number 2251126fe197SAndrew Boyer * @ecode: event code = IONIC_EVENT_XCVR 2252126fe197SAndrew Boyer */ 2253126fe197SAndrew Boyer struct ionic_xcvr_event { 2254126fe197SAndrew Boyer __le64 eid; 2255126fe197SAndrew Boyer __le16 ecode; 2256126fe197SAndrew Boyer u8 rsvd[54]; 2257126fe197SAndrew Boyer }; 2258126fe197SAndrew Boyer 2259126fe197SAndrew Boyer /** 2260126fe197SAndrew Boyer * struct ionic_port_stats - Port statistics structure 226101489e5dSAlfredo Cardigliano */ 226201489e5dSAlfredo Cardigliano struct ionic_port_stats { 226301489e5dSAlfredo Cardigliano __le64 frames_rx_ok; 226401489e5dSAlfredo Cardigliano __le64 frames_rx_all; 226501489e5dSAlfredo Cardigliano __le64 frames_rx_bad_fcs; 226601489e5dSAlfredo Cardigliano __le64 frames_rx_bad_all; 226701489e5dSAlfredo Cardigliano __le64 octets_rx_ok; 226801489e5dSAlfredo Cardigliano __le64 octets_rx_all; 226901489e5dSAlfredo Cardigliano __le64 frames_rx_unicast; 227001489e5dSAlfredo Cardigliano __le64 frames_rx_multicast; 227101489e5dSAlfredo Cardigliano __le64 frames_rx_broadcast; 227201489e5dSAlfredo Cardigliano __le64 frames_rx_pause; 227301489e5dSAlfredo Cardigliano __le64 frames_rx_bad_length; 227401489e5dSAlfredo Cardigliano __le64 frames_rx_undersized; 227501489e5dSAlfredo Cardigliano __le64 frames_rx_oversized; 227601489e5dSAlfredo Cardigliano __le64 frames_rx_fragments; 227701489e5dSAlfredo Cardigliano __le64 frames_rx_jabber; 227801489e5dSAlfredo Cardigliano __le64 frames_rx_pripause; 227901489e5dSAlfredo Cardigliano __le64 frames_rx_stomped_crc; 228001489e5dSAlfredo Cardigliano __le64 frames_rx_too_long; 228101489e5dSAlfredo Cardigliano __le64 frames_rx_vlan_good; 228201489e5dSAlfredo Cardigliano __le64 frames_rx_dropped; 228301489e5dSAlfredo Cardigliano __le64 frames_rx_less_than_64b; 228401489e5dSAlfredo Cardigliano __le64 frames_rx_64b; 228501489e5dSAlfredo Cardigliano __le64 frames_rx_65b_127b; 228601489e5dSAlfredo Cardigliano __le64 frames_rx_128b_255b; 228701489e5dSAlfredo Cardigliano __le64 frames_rx_256b_511b; 228801489e5dSAlfredo Cardigliano __le64 frames_rx_512b_1023b; 228901489e5dSAlfredo Cardigliano __le64 frames_rx_1024b_1518b; 229001489e5dSAlfredo Cardigliano __le64 frames_rx_1519b_2047b; 229101489e5dSAlfredo Cardigliano __le64 frames_rx_2048b_4095b; 229201489e5dSAlfredo Cardigliano __le64 frames_rx_4096b_8191b; 229301489e5dSAlfredo Cardigliano __le64 frames_rx_8192b_9215b; 229401489e5dSAlfredo Cardigliano __le64 frames_rx_other; 229501489e5dSAlfredo Cardigliano __le64 frames_tx_ok; 229601489e5dSAlfredo Cardigliano __le64 frames_tx_all; 229701489e5dSAlfredo Cardigliano __le64 frames_tx_bad; 229801489e5dSAlfredo Cardigliano __le64 octets_tx_ok; 229901489e5dSAlfredo Cardigliano __le64 octets_tx_total; 230001489e5dSAlfredo Cardigliano __le64 frames_tx_unicast; 230101489e5dSAlfredo Cardigliano __le64 frames_tx_multicast; 230201489e5dSAlfredo Cardigliano __le64 frames_tx_broadcast; 230301489e5dSAlfredo Cardigliano __le64 frames_tx_pause; 230401489e5dSAlfredo Cardigliano __le64 frames_tx_pripause; 230501489e5dSAlfredo Cardigliano __le64 frames_tx_vlan; 230601489e5dSAlfredo Cardigliano __le64 frames_tx_less_than_64b; 230701489e5dSAlfredo Cardigliano __le64 frames_tx_64b; 230801489e5dSAlfredo Cardigliano __le64 frames_tx_65b_127b; 230901489e5dSAlfredo Cardigliano __le64 frames_tx_128b_255b; 231001489e5dSAlfredo Cardigliano __le64 frames_tx_256b_511b; 231101489e5dSAlfredo Cardigliano __le64 frames_tx_512b_1023b; 231201489e5dSAlfredo Cardigliano __le64 frames_tx_1024b_1518b; 231301489e5dSAlfredo Cardigliano __le64 frames_tx_1519b_2047b; 231401489e5dSAlfredo Cardigliano __le64 frames_tx_2048b_4095b; 231501489e5dSAlfredo Cardigliano __le64 frames_tx_4096b_8191b; 231601489e5dSAlfredo Cardigliano __le64 frames_tx_8192b_9215b; 231701489e5dSAlfredo Cardigliano __le64 frames_tx_other; 231801489e5dSAlfredo Cardigliano __le64 frames_tx_pri_0; 231901489e5dSAlfredo Cardigliano __le64 frames_tx_pri_1; 232001489e5dSAlfredo Cardigliano __le64 frames_tx_pri_2; 232101489e5dSAlfredo Cardigliano __le64 frames_tx_pri_3; 232201489e5dSAlfredo Cardigliano __le64 frames_tx_pri_4; 232301489e5dSAlfredo Cardigliano __le64 frames_tx_pri_5; 232401489e5dSAlfredo Cardigliano __le64 frames_tx_pri_6; 232501489e5dSAlfredo Cardigliano __le64 frames_tx_pri_7; 232601489e5dSAlfredo Cardigliano __le64 frames_rx_pri_0; 232701489e5dSAlfredo Cardigliano __le64 frames_rx_pri_1; 232801489e5dSAlfredo Cardigliano __le64 frames_rx_pri_2; 232901489e5dSAlfredo Cardigliano __le64 frames_rx_pri_3; 233001489e5dSAlfredo Cardigliano __le64 frames_rx_pri_4; 233101489e5dSAlfredo Cardigliano __le64 frames_rx_pri_5; 233201489e5dSAlfredo Cardigliano __le64 frames_rx_pri_6; 233301489e5dSAlfredo Cardigliano __le64 frames_rx_pri_7; 233401489e5dSAlfredo Cardigliano __le64 tx_pripause_0_1us_count; 233501489e5dSAlfredo Cardigliano __le64 tx_pripause_1_1us_count; 233601489e5dSAlfredo Cardigliano __le64 tx_pripause_2_1us_count; 233701489e5dSAlfredo Cardigliano __le64 tx_pripause_3_1us_count; 233801489e5dSAlfredo Cardigliano __le64 tx_pripause_4_1us_count; 233901489e5dSAlfredo Cardigliano __le64 tx_pripause_5_1us_count; 234001489e5dSAlfredo Cardigliano __le64 tx_pripause_6_1us_count; 234101489e5dSAlfredo Cardigliano __le64 tx_pripause_7_1us_count; 234201489e5dSAlfredo Cardigliano __le64 rx_pripause_0_1us_count; 234301489e5dSAlfredo Cardigliano __le64 rx_pripause_1_1us_count; 234401489e5dSAlfredo Cardigliano __le64 rx_pripause_2_1us_count; 234501489e5dSAlfredo Cardigliano __le64 rx_pripause_3_1us_count; 234601489e5dSAlfredo Cardigliano __le64 rx_pripause_4_1us_count; 234701489e5dSAlfredo Cardigliano __le64 rx_pripause_5_1us_count; 234801489e5dSAlfredo Cardigliano __le64 rx_pripause_6_1us_count; 234901489e5dSAlfredo Cardigliano __le64 rx_pripause_7_1us_count; 235001489e5dSAlfredo Cardigliano __le64 rx_pause_1us_count; 235101489e5dSAlfredo Cardigliano __le64 frames_tx_truncated; 235201489e5dSAlfredo Cardigliano }; 235301489e5dSAlfredo Cardigliano 235401489e5dSAlfredo Cardigliano struct ionic_mgmt_port_stats { 235501489e5dSAlfredo Cardigliano __le64 frames_rx_ok; 235601489e5dSAlfredo Cardigliano __le64 frames_rx_all; 235701489e5dSAlfredo Cardigliano __le64 frames_rx_bad_fcs; 235801489e5dSAlfredo Cardigliano __le64 frames_rx_bad_all; 235901489e5dSAlfredo Cardigliano __le64 octets_rx_ok; 236001489e5dSAlfredo Cardigliano __le64 octets_rx_all; 236101489e5dSAlfredo Cardigliano __le64 frames_rx_unicast; 236201489e5dSAlfredo Cardigliano __le64 frames_rx_multicast; 236301489e5dSAlfredo Cardigliano __le64 frames_rx_broadcast; 236401489e5dSAlfredo Cardigliano __le64 frames_rx_pause; 2365126fe197SAndrew Boyer __le64 frames_rx_bad_length; 2366126fe197SAndrew Boyer __le64 frames_rx_undersized; 2367126fe197SAndrew Boyer __le64 frames_rx_oversized; 2368126fe197SAndrew Boyer __le64 frames_rx_fragments; 2369126fe197SAndrew Boyer __le64 frames_rx_jabber; 2370126fe197SAndrew Boyer __le64 frames_rx_64b; 2371126fe197SAndrew Boyer __le64 frames_rx_65b_127b; 2372126fe197SAndrew Boyer __le64 frames_rx_128b_255b; 2373126fe197SAndrew Boyer __le64 frames_rx_256b_511b; 2374126fe197SAndrew Boyer __le64 frames_rx_512b_1023b; 2375126fe197SAndrew Boyer __le64 frames_rx_1024b_1518b; 2376126fe197SAndrew Boyer __le64 frames_rx_gt_1518b; 2377126fe197SAndrew Boyer __le64 frames_rx_fifo_full; 2378126fe197SAndrew Boyer __le64 frames_tx_ok; 2379126fe197SAndrew Boyer __le64 frames_tx_all; 2380126fe197SAndrew Boyer __le64 frames_tx_bad; 2381126fe197SAndrew Boyer __le64 octets_tx_ok; 2382126fe197SAndrew Boyer __le64 octets_tx_total; 2383126fe197SAndrew Boyer __le64 frames_tx_unicast; 2384126fe197SAndrew Boyer __le64 frames_tx_multicast; 2385126fe197SAndrew Boyer __le64 frames_tx_broadcast; 2386126fe197SAndrew Boyer __le64 frames_tx_pause; 2387126fe197SAndrew Boyer }; 2388126fe197SAndrew Boyer 2389126fe197SAndrew Boyer enum ionic_pb_buffer_drop_stats { 2390126fe197SAndrew Boyer IONIC_BUFFER_INTRINSIC_DROP = 0, 2391126fe197SAndrew Boyer IONIC_BUFFER_DISCARDED, 2392126fe197SAndrew Boyer IONIC_BUFFER_ADMITTED, 2393126fe197SAndrew Boyer IONIC_BUFFER_OUT_OF_CELLS_DROP, 2394126fe197SAndrew Boyer IONIC_BUFFER_OUT_OF_CELLS_DROP_2, 2395126fe197SAndrew Boyer IONIC_BUFFER_OUT_OF_CREDIT_DROP, 2396126fe197SAndrew Boyer IONIC_BUFFER_TRUNCATION_DROP, 2397126fe197SAndrew Boyer IONIC_BUFFER_PORT_DISABLED_DROP, 2398126fe197SAndrew Boyer IONIC_BUFFER_COPY_TO_CPU_TAIL_DROP, 2399126fe197SAndrew Boyer IONIC_BUFFER_SPAN_TAIL_DROP, 2400126fe197SAndrew Boyer IONIC_BUFFER_MIN_SIZE_VIOLATION_DROP, 2401126fe197SAndrew Boyer IONIC_BUFFER_ENQUEUE_ERROR_DROP, 2402126fe197SAndrew Boyer IONIC_BUFFER_INVALID_PORT_DROP, 2403126fe197SAndrew Boyer IONIC_BUFFER_INVALID_OUTPUT_QUEUE_DROP, 2404126fe197SAndrew Boyer IONIC_BUFFER_DROP_MAX, 2405126fe197SAndrew Boyer }; 2406126fe197SAndrew Boyer 2407126fe197SAndrew Boyer enum ionic_oflow_drop_stats { 2408126fe197SAndrew Boyer IONIC_OFLOW_OCCUPANCY_DROP, 2409126fe197SAndrew Boyer IONIC_OFLOW_EMERGENCY_STOP_DROP, 2410126fe197SAndrew Boyer IONIC_OFLOW_WRITE_BUFFER_ACK_FILL_UP_DROP, 2411126fe197SAndrew Boyer IONIC_OFLOW_WRITE_BUFFER_ACK_FULL_DROP, 2412126fe197SAndrew Boyer IONIC_OFLOW_WRITE_BUFFER_FULL_DROP, 2413126fe197SAndrew Boyer IONIC_OFLOW_CONTROL_FIFO_FULL_DROP, 2414126fe197SAndrew Boyer IONIC_OFLOW_DROP_MAX, 2415126fe197SAndrew Boyer }; 2416126fe197SAndrew Boyer 2417126fe197SAndrew Boyer /** 2418126fe197SAndrew Boyer * struct port_pb_stats - packet buffers system stats 2419126fe197SAndrew Boyer * uses ionic_pb_buffer_drop_stats for drop_counts[] 2420126fe197SAndrew Boyer */ 2421126fe197SAndrew Boyer struct ionic_port_pb_stats { 2422126fe197SAndrew Boyer __le64 sop_count_in; 2423126fe197SAndrew Boyer __le64 eop_count_in; 2424126fe197SAndrew Boyer __le64 sop_count_out; 2425126fe197SAndrew Boyer __le64 eop_count_out; 2426126fe197SAndrew Boyer __le64 drop_counts[IONIC_BUFFER_DROP_MAX]; 2427126fe197SAndrew Boyer __le64 input_queue_buffer_occupancy[IONIC_QOS_TC_MAX]; 2428126fe197SAndrew Boyer __le64 input_queue_port_monitor[IONIC_QOS_TC_MAX]; 2429126fe197SAndrew Boyer __le64 output_queue_port_monitor[IONIC_QOS_TC_MAX]; 2430126fe197SAndrew Boyer __le64 oflow_drop_counts[IONIC_OFLOW_DROP_MAX]; 2431126fe197SAndrew Boyer __le64 input_queue_good_pkts_in[IONIC_QOS_TC_MAX]; 2432126fe197SAndrew Boyer __le64 input_queue_good_pkts_out[IONIC_QOS_TC_MAX]; 2433126fe197SAndrew Boyer __le64 input_queue_err_pkts_in[IONIC_QOS_TC_MAX]; 2434126fe197SAndrew Boyer __le64 input_queue_fifo_depth[IONIC_QOS_TC_MAX]; 2435126fe197SAndrew Boyer __le64 input_queue_max_fifo_depth[IONIC_QOS_TC_MAX]; 2436126fe197SAndrew Boyer __le64 input_queue_peak_occupancy[IONIC_QOS_TC_MAX]; 2437126fe197SAndrew Boyer __le64 output_queue_buffer_occupancy[IONIC_QOS_TC_MAX]; 2438126fe197SAndrew Boyer }; 2439126fe197SAndrew Boyer 2440126fe197SAndrew Boyer /** 2441126fe197SAndrew Boyer * enum ionic_port_type - Port types 2442126fe197SAndrew Boyer * @IONIC_ETH_UNKNOWN: Port type not configured 2443126fe197SAndrew Boyer * @IONIC_ETH_HOST: Port carries ethernet traffic (inband) 2444126fe197SAndrew Boyer * @IONIC_ETH_HOST_MGMT: Port carries mgmt traffic (out-of-band) 2445126fe197SAndrew Boyer * @IONIC_ETH_MNIC_OOB_MGMT: 2446126fe197SAndrew Boyer * @IONIC_ETH_MNIC_INTERNAL_MGMT: 2447126fe197SAndrew Boyer * @IONIC_ETH_MNIC_INBAND_MGMT: 2448126fe197SAndrew Boyer * @IONIC_ETH_MNIC_CPU: 2449126fe197SAndrew Boyer * @IONIC_ETH_MNIC_LEARN: 2450126fe197SAndrew Boyer * @IONIC_ETH_MNIC_CONTROL: 2451126fe197SAndrew Boyer */ 2452126fe197SAndrew Boyer enum ionic_port_type { 2453126fe197SAndrew Boyer IONIC_ETH_UNKNOWN, 2454126fe197SAndrew Boyer IONIC_ETH_HOST, 2455126fe197SAndrew Boyer IONIC_ETH_HOST_MGMT, 2456126fe197SAndrew Boyer IONIC_ETH_MNIC_OOB_MGMT, 2457126fe197SAndrew Boyer IONIC_ETH_MNIC_INTERNAL_MGMT, 2458126fe197SAndrew Boyer IONIC_ETH_MNIC_INBAND_MGMT, 2459126fe197SAndrew Boyer IONIC_ETH_MNIC_CPU, 2460126fe197SAndrew Boyer IONIC_ETH_MNIC_LEARN, 2461126fe197SAndrew Boyer IONIC_ETH_MNIC_CONTROL, 246201489e5dSAlfredo Cardigliano }; 246301489e5dSAlfredo Cardigliano 246401489e5dSAlfredo Cardigliano /** 246501489e5dSAlfredo Cardigliano * struct ionic_port_identity - port identity structure 246601489e5dSAlfredo Cardigliano * @version: identity structure version 2467126fe197SAndrew Boyer * @type: type of port (enum ionic_port_type) 246801489e5dSAlfredo Cardigliano * @num_lanes: number of lanes for the port 246901489e5dSAlfredo Cardigliano * @autoneg: autoneg supported 247001489e5dSAlfredo Cardigliano * @min_frame_size: minimum frame size supported 247101489e5dSAlfredo Cardigliano * @max_frame_size: maximum frame size supported 247201489e5dSAlfredo Cardigliano * @fec_type: supported fec types 247301489e5dSAlfredo Cardigliano * @pause_type: supported pause types 247401489e5dSAlfredo Cardigliano * @loopback_mode: supported loopback mode 247501489e5dSAlfredo Cardigliano * @speeds: supported speeds 247601489e5dSAlfredo Cardigliano * @config: current port configuration 247701489e5dSAlfredo Cardigliano */ 247801489e5dSAlfredo Cardigliano union ionic_port_identity { 247901489e5dSAlfredo Cardigliano struct { 248001489e5dSAlfredo Cardigliano u8 version; 248101489e5dSAlfredo Cardigliano u8 type; 248201489e5dSAlfredo Cardigliano u8 num_lanes; 248301489e5dSAlfredo Cardigliano u8 autoneg; 248401489e5dSAlfredo Cardigliano __le32 min_frame_size; 248501489e5dSAlfredo Cardigliano __le32 max_frame_size; 248601489e5dSAlfredo Cardigliano u8 fec_type[4]; 248701489e5dSAlfredo Cardigliano u8 pause_type[2]; 248801489e5dSAlfredo Cardigliano u8 loopback_mode[2]; 248901489e5dSAlfredo Cardigliano __le32 speeds[16]; 249001489e5dSAlfredo Cardigliano u8 rsvd2[44]; 249101489e5dSAlfredo Cardigliano union ionic_port_config config; 249201489e5dSAlfredo Cardigliano }; 2493126fe197SAndrew Boyer __le32 words[478]; 249401489e5dSAlfredo Cardigliano }; 249501489e5dSAlfredo Cardigliano 249601489e5dSAlfredo Cardigliano /** 249701489e5dSAlfredo Cardigliano * struct ionic_port_info - port info structure 2498126fe197SAndrew Boyer * @config: Port configuration data 2499126fe197SAndrew Boyer * @status: Port status data 2500126fe197SAndrew Boyer * @stats: Port statistics data 2501126fe197SAndrew Boyer * @mgmt_stats: Port management statistics data 2502126fe197SAndrew Boyer * @port_pb_drop_stats: uplink pb drop stats 250301489e5dSAlfredo Cardigliano */ 250401489e5dSAlfredo Cardigliano struct ionic_port_info { 250501489e5dSAlfredo Cardigliano union ionic_port_config config; 250601489e5dSAlfredo Cardigliano struct ionic_port_status status; 2507126fe197SAndrew Boyer union { 250801489e5dSAlfredo Cardigliano struct ionic_port_stats stats; 2509126fe197SAndrew Boyer struct ionic_mgmt_port_stats mgmt_stats; 2510126fe197SAndrew Boyer }; 2511126fe197SAndrew Boyer /* room for pb_stats to start at 2k offset */ 2512126fe197SAndrew Boyer u8 rsvd[760]; 2513126fe197SAndrew Boyer struct ionic_port_pb_stats pb_stats; 251401489e5dSAlfredo Cardigliano }; 251501489e5dSAlfredo Cardigliano 251601489e5dSAlfredo Cardigliano /** 2517126fe197SAndrew Boyer * struct ionic_lif_stats - LIF statistics structure 251801489e5dSAlfredo Cardigliano */ 251901489e5dSAlfredo Cardigliano struct ionic_lif_stats { 252001489e5dSAlfredo Cardigliano /* RX */ 252101489e5dSAlfredo Cardigliano __le64 rx_ucast_bytes; 252201489e5dSAlfredo Cardigliano __le64 rx_ucast_packets; 252301489e5dSAlfredo Cardigliano __le64 rx_mcast_bytes; 252401489e5dSAlfredo Cardigliano __le64 rx_mcast_packets; 252501489e5dSAlfredo Cardigliano __le64 rx_bcast_bytes; 252601489e5dSAlfredo Cardigliano __le64 rx_bcast_packets; 252701489e5dSAlfredo Cardigliano __le64 rsvd0; 252801489e5dSAlfredo Cardigliano __le64 rsvd1; 252901489e5dSAlfredo Cardigliano /* RX drops */ 253001489e5dSAlfredo Cardigliano __le64 rx_ucast_drop_bytes; 253101489e5dSAlfredo Cardigliano __le64 rx_ucast_drop_packets; 253201489e5dSAlfredo Cardigliano __le64 rx_mcast_drop_bytes; 253301489e5dSAlfredo Cardigliano __le64 rx_mcast_drop_packets; 253401489e5dSAlfredo Cardigliano __le64 rx_bcast_drop_bytes; 253501489e5dSAlfredo Cardigliano __le64 rx_bcast_drop_packets; 253601489e5dSAlfredo Cardigliano __le64 rx_dma_error; 253701489e5dSAlfredo Cardigliano __le64 rsvd2; 253801489e5dSAlfredo Cardigliano /* TX */ 253901489e5dSAlfredo Cardigliano __le64 tx_ucast_bytes; 254001489e5dSAlfredo Cardigliano __le64 tx_ucast_packets; 254101489e5dSAlfredo Cardigliano __le64 tx_mcast_bytes; 254201489e5dSAlfredo Cardigliano __le64 tx_mcast_packets; 254301489e5dSAlfredo Cardigliano __le64 tx_bcast_bytes; 254401489e5dSAlfredo Cardigliano __le64 tx_bcast_packets; 254501489e5dSAlfredo Cardigliano __le64 rsvd3; 254601489e5dSAlfredo Cardigliano __le64 rsvd4; 254701489e5dSAlfredo Cardigliano /* TX drops */ 254801489e5dSAlfredo Cardigliano __le64 tx_ucast_drop_bytes; 254901489e5dSAlfredo Cardigliano __le64 tx_ucast_drop_packets; 255001489e5dSAlfredo Cardigliano __le64 tx_mcast_drop_bytes; 255101489e5dSAlfredo Cardigliano __le64 tx_mcast_drop_packets; 255201489e5dSAlfredo Cardigliano __le64 tx_bcast_drop_bytes; 255301489e5dSAlfredo Cardigliano __le64 tx_bcast_drop_packets; 255401489e5dSAlfredo Cardigliano __le64 tx_dma_error; 255501489e5dSAlfredo Cardigliano __le64 rsvd5; 255601489e5dSAlfredo Cardigliano /* Rx Queue/Ring drops */ 255701489e5dSAlfredo Cardigliano __le64 rx_queue_disabled; 255801489e5dSAlfredo Cardigliano __le64 rx_queue_empty; 255901489e5dSAlfredo Cardigliano __le64 rx_queue_error; 256001489e5dSAlfredo Cardigliano __le64 rx_desc_fetch_error; 256101489e5dSAlfredo Cardigliano __le64 rx_desc_data_error; 256201489e5dSAlfredo Cardigliano __le64 rsvd6; 256301489e5dSAlfredo Cardigliano __le64 rsvd7; 256401489e5dSAlfredo Cardigliano __le64 rsvd8; 256501489e5dSAlfredo Cardigliano /* Tx Queue/Ring drops */ 256601489e5dSAlfredo Cardigliano __le64 tx_queue_disabled; 256701489e5dSAlfredo Cardigliano __le64 tx_queue_error; 256801489e5dSAlfredo Cardigliano __le64 tx_desc_fetch_error; 256901489e5dSAlfredo Cardigliano __le64 tx_desc_data_error; 2570126fe197SAndrew Boyer __le64 tx_queue_empty; 257101489e5dSAlfredo Cardigliano __le64 rsvd10; 257201489e5dSAlfredo Cardigliano __le64 rsvd11; 257301489e5dSAlfredo Cardigliano __le64 rsvd12; 257401489e5dSAlfredo Cardigliano 257501489e5dSAlfredo Cardigliano /* RDMA/ROCE TX */ 257601489e5dSAlfredo Cardigliano __le64 tx_rdma_ucast_bytes; 257701489e5dSAlfredo Cardigliano __le64 tx_rdma_ucast_packets; 257801489e5dSAlfredo Cardigliano __le64 tx_rdma_mcast_bytes; 257901489e5dSAlfredo Cardigliano __le64 tx_rdma_mcast_packets; 258001489e5dSAlfredo Cardigliano __le64 tx_rdma_cnp_packets; 258101489e5dSAlfredo Cardigliano __le64 rsvd13; 258201489e5dSAlfredo Cardigliano __le64 rsvd14; 258301489e5dSAlfredo Cardigliano __le64 rsvd15; 258401489e5dSAlfredo Cardigliano 258501489e5dSAlfredo Cardigliano /* RDMA/ROCE RX */ 258601489e5dSAlfredo Cardigliano __le64 rx_rdma_ucast_bytes; 258701489e5dSAlfredo Cardigliano __le64 rx_rdma_ucast_packets; 258801489e5dSAlfredo Cardigliano __le64 rx_rdma_mcast_bytes; 258901489e5dSAlfredo Cardigliano __le64 rx_rdma_mcast_packets; 259001489e5dSAlfredo Cardigliano __le64 rx_rdma_cnp_packets; 259101489e5dSAlfredo Cardigliano __le64 rx_rdma_ecn_packets; 259201489e5dSAlfredo Cardigliano __le64 rsvd16; 259301489e5dSAlfredo Cardigliano __le64 rsvd17; 259401489e5dSAlfredo Cardigliano 2595081d035eSBrad Larson __le64 flex1; 2596081d035eSBrad Larson __le64 flex2; 2597081d035eSBrad Larson __le64 flex3; 2598081d035eSBrad Larson __le64 flex4; 2599081d035eSBrad Larson __le64 flex5; 2600081d035eSBrad Larson __le64 flex6; 2601081d035eSBrad Larson __le64 flex7; 2602081d035eSBrad Larson __le64 flex8; 260301489e5dSAlfredo Cardigliano 2604081d035eSBrad Larson __le64 flex9; 2605081d035eSBrad Larson __le64 flex10; 2606081d035eSBrad Larson __le64 flex11; 2607081d035eSBrad Larson __le64 flex12; 2608081d035eSBrad Larson __le64 flex13; 2609081d035eSBrad Larson __le64 flex14; 2610081d035eSBrad Larson __le64 flex15; 2611081d035eSBrad Larson __le64 flex16; 261201489e5dSAlfredo Cardigliano 2613081d035eSBrad Larson __le64 flex17; 2614081d035eSBrad Larson __le64 flex18; 2615081d035eSBrad Larson __le64 flex19; 2616081d035eSBrad Larson __le64 flex20; 2617081d035eSBrad Larson __le64 flex21; 2618081d035eSBrad Larson __le64 flex22; 2619081d035eSBrad Larson __le64 flex23; 2620081d035eSBrad Larson __le64 flex24; 262101489e5dSAlfredo Cardigliano 2622081d035eSBrad Larson __le64 flex25; 2623081d035eSBrad Larson __le64 flex26; 2624081d035eSBrad Larson __le64 flex27; 2625081d035eSBrad Larson __le64 flex28; 2626081d035eSBrad Larson __le64 flex29; 2627081d035eSBrad Larson __le64 flex30; 2628081d035eSBrad Larson __le64 flex31; 2629081d035eSBrad Larson __le64 flex32; 263001489e5dSAlfredo Cardigliano 263101489e5dSAlfredo Cardigliano /* RDMA/ROCE REQ Error/Debugs (768 - 895) */ 263201489e5dSAlfredo Cardigliano __le64 rdma_req_rx_pkt_seq_err; 263301489e5dSAlfredo Cardigliano __le64 rdma_req_rx_rnr_retry_err; 263401489e5dSAlfredo Cardigliano __le64 rdma_req_rx_remote_access_err; 263501489e5dSAlfredo Cardigliano __le64 rdma_req_rx_remote_inv_req_err; 263601489e5dSAlfredo Cardigliano __le64 rdma_req_rx_remote_oper_err; 263701489e5dSAlfredo Cardigliano __le64 rdma_req_rx_implied_nak_seq_err; 263801489e5dSAlfredo Cardigliano __le64 rdma_req_rx_cqe_err; 263901489e5dSAlfredo Cardigliano __le64 rdma_req_rx_cqe_flush_err; 264001489e5dSAlfredo Cardigliano 264101489e5dSAlfredo Cardigliano __le64 rdma_req_rx_dup_responses; 264201489e5dSAlfredo Cardigliano __le64 rdma_req_rx_invalid_packets; 264301489e5dSAlfredo Cardigliano __le64 rdma_req_tx_local_access_err; 264401489e5dSAlfredo Cardigliano __le64 rdma_req_tx_local_oper_err; 264501489e5dSAlfredo Cardigliano __le64 rdma_req_tx_memory_mgmt_err; 264601489e5dSAlfredo Cardigliano __le64 rsvd52; 264701489e5dSAlfredo Cardigliano __le64 rsvd53; 264801489e5dSAlfredo Cardigliano __le64 rsvd54; 264901489e5dSAlfredo Cardigliano 265001489e5dSAlfredo Cardigliano /* RDMA/ROCE RESP Error/Debugs (896 - 1023) */ 265101489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_dup_requests; 265201489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_out_of_buffer; 265301489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_out_of_seq_pkts; 265401489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_cqe_err; 265501489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_cqe_flush_err; 265601489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_local_len_err; 265701489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_inv_request_err; 265801489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_local_qp_oper_err; 265901489e5dSAlfredo Cardigliano 266001489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_out_of_atomic_resource; 266101489e5dSAlfredo Cardigliano __le64 rdma_resp_tx_pkt_seq_err; 266201489e5dSAlfredo Cardigliano __le64 rdma_resp_tx_remote_inv_req_err; 266301489e5dSAlfredo Cardigliano __le64 rdma_resp_tx_remote_access_err; 266401489e5dSAlfredo Cardigliano __le64 rdma_resp_tx_remote_oper_err; 266501489e5dSAlfredo Cardigliano __le64 rdma_resp_tx_rnr_retry_err; 266601489e5dSAlfredo Cardigliano __le64 rsvd57; 266701489e5dSAlfredo Cardigliano __le64 rsvd58; 266801489e5dSAlfredo Cardigliano }; 266901489e5dSAlfredo Cardigliano 267001489e5dSAlfredo Cardigliano /** 2671126fe197SAndrew Boyer * struct ionic_lif_info - LIF info structure 2672126fe197SAndrew Boyer * @config: LIF configuration structure 2673126fe197SAndrew Boyer * @status: LIF status structure 2674126fe197SAndrew Boyer * @stats: LIF statistics structure 267501489e5dSAlfredo Cardigliano */ 267601489e5dSAlfredo Cardigliano struct ionic_lif_info { 267701489e5dSAlfredo Cardigliano union ionic_lif_config config; 267801489e5dSAlfredo Cardigliano struct ionic_lif_status status; 267901489e5dSAlfredo Cardigliano struct ionic_lif_stats stats; 268001489e5dSAlfredo Cardigliano }; 268101489e5dSAlfredo Cardigliano 268201489e5dSAlfredo Cardigliano union ionic_dev_cmd { 268301489e5dSAlfredo Cardigliano u32 words[16]; 268401489e5dSAlfredo Cardigliano struct ionic_admin_cmd cmd; 268501489e5dSAlfredo Cardigliano struct ionic_nop_cmd nop; 268601489e5dSAlfredo Cardigliano 268701489e5dSAlfredo Cardigliano struct ionic_dev_identify_cmd identify; 268801489e5dSAlfredo Cardigliano struct ionic_dev_init_cmd init; 268901489e5dSAlfredo Cardigliano struct ionic_dev_reset_cmd reset; 269001489e5dSAlfredo Cardigliano struct ionic_dev_getattr_cmd getattr; 269101489e5dSAlfredo Cardigliano struct ionic_dev_setattr_cmd setattr; 269201489e5dSAlfredo Cardigliano 269301489e5dSAlfredo Cardigliano struct ionic_port_identify_cmd port_identify; 269401489e5dSAlfredo Cardigliano struct ionic_port_init_cmd port_init; 269501489e5dSAlfredo Cardigliano struct ionic_port_reset_cmd port_reset; 269601489e5dSAlfredo Cardigliano struct ionic_port_getattr_cmd port_getattr; 269701489e5dSAlfredo Cardigliano struct ionic_port_setattr_cmd port_setattr; 269801489e5dSAlfredo Cardigliano 2699126fe197SAndrew Boyer struct ionic_vf_setattr_cmd vf_setattr; 2700126fe197SAndrew Boyer struct ionic_vf_getattr_cmd vf_getattr; 2701126fe197SAndrew Boyer 270201489e5dSAlfredo Cardigliano struct ionic_lif_identify_cmd lif_identify; 270301489e5dSAlfredo Cardigliano struct ionic_lif_init_cmd lif_init; 270401489e5dSAlfredo Cardigliano struct ionic_lif_reset_cmd lif_reset; 270501489e5dSAlfredo Cardigliano 270601489e5dSAlfredo Cardigliano struct ionic_qos_identify_cmd qos_identify; 270701489e5dSAlfredo Cardigliano struct ionic_qos_init_cmd qos_init; 270801489e5dSAlfredo Cardigliano struct ionic_qos_reset_cmd qos_reset; 2709126fe197SAndrew Boyer struct ionic_qos_clear_stats_cmd qos_clear_stats; 271001489e5dSAlfredo Cardigliano 2711126fe197SAndrew Boyer struct ionic_q_identify_cmd q_identify; 271201489e5dSAlfredo Cardigliano struct ionic_q_init_cmd q_init; 2713126fe197SAndrew Boyer struct ionic_q_control_cmd q_control; 271401489e5dSAlfredo Cardigliano }; 271501489e5dSAlfredo Cardigliano 271601489e5dSAlfredo Cardigliano union ionic_dev_cmd_comp { 271701489e5dSAlfredo Cardigliano u32 words[4]; 271801489e5dSAlfredo Cardigliano u8 status; 271901489e5dSAlfredo Cardigliano struct ionic_admin_comp comp; 272001489e5dSAlfredo Cardigliano struct ionic_nop_comp nop; 272101489e5dSAlfredo Cardigliano 272201489e5dSAlfredo Cardigliano struct ionic_dev_identify_comp identify; 272301489e5dSAlfredo Cardigliano struct ionic_dev_init_comp init; 272401489e5dSAlfredo Cardigliano struct ionic_dev_reset_comp reset; 272501489e5dSAlfredo Cardigliano struct ionic_dev_getattr_comp getattr; 272601489e5dSAlfredo Cardigliano struct ionic_dev_setattr_comp setattr; 272701489e5dSAlfredo Cardigliano 272801489e5dSAlfredo Cardigliano struct ionic_port_identify_comp port_identify; 272901489e5dSAlfredo Cardigliano struct ionic_port_init_comp port_init; 273001489e5dSAlfredo Cardigliano struct ionic_port_reset_comp port_reset; 273101489e5dSAlfredo Cardigliano struct ionic_port_getattr_comp port_getattr; 273201489e5dSAlfredo Cardigliano struct ionic_port_setattr_comp port_setattr; 273301489e5dSAlfredo Cardigliano 2734126fe197SAndrew Boyer struct ionic_vf_setattr_comp vf_setattr; 2735126fe197SAndrew Boyer struct ionic_vf_getattr_comp vf_getattr; 2736126fe197SAndrew Boyer 273701489e5dSAlfredo Cardigliano struct ionic_lif_identify_comp lif_identify; 273801489e5dSAlfredo Cardigliano struct ionic_lif_init_comp lif_init; 273901489e5dSAlfredo Cardigliano ionic_lif_reset_comp lif_reset; 274001489e5dSAlfredo Cardigliano 274101489e5dSAlfredo Cardigliano struct ionic_qos_identify_comp qos_identify; 274201489e5dSAlfredo Cardigliano ionic_qos_init_comp qos_init; 274301489e5dSAlfredo Cardigliano ionic_qos_reset_comp qos_reset; 274401489e5dSAlfredo Cardigliano 2745126fe197SAndrew Boyer struct ionic_q_identify_comp q_identify; 274601489e5dSAlfredo Cardigliano struct ionic_q_init_comp q_init; 274701489e5dSAlfredo Cardigliano }; 274801489e5dSAlfredo Cardigliano 274901489e5dSAlfredo Cardigliano /** 2750126fe197SAndrew Boyer * union ionic_dev_info_regs - Device info register format (read-only) 2751126fe197SAndrew Boyer * @signature: Signature value of 0x44455649 ('DEVI') 2752126fe197SAndrew Boyer * @version: Current version of info 2753126fe197SAndrew Boyer * @asic_type: Asic type 2754126fe197SAndrew Boyer * @asic_rev: Asic revision 2755126fe197SAndrew Boyer * @fw_status: Firmware status 2756126fe197SAndrew Boyer * @fw_heartbeat: Firmware heartbeat counter 2757126fe197SAndrew Boyer * @serial_num: Serial number 2758126fe197SAndrew Boyer * @fw_version: Firmware version 275901489e5dSAlfredo Cardigliano */ 276001489e5dSAlfredo Cardigliano union ionic_dev_info_regs { 276101489e5dSAlfredo Cardigliano #define IONIC_DEVINFO_FWVERS_BUFLEN 32 276201489e5dSAlfredo Cardigliano #define IONIC_DEVINFO_SERIAL_BUFLEN 32 276301489e5dSAlfredo Cardigliano struct { 276401489e5dSAlfredo Cardigliano u32 signature; 276501489e5dSAlfredo Cardigliano u8 version; 276601489e5dSAlfredo Cardigliano u8 asic_type; 276701489e5dSAlfredo Cardigliano u8 asic_rev; 2768126fe197SAndrew Boyer #define IONIC_FW_STS_F_RUNNING 0x1 276901489e5dSAlfredo Cardigliano u8 fw_status; 277001489e5dSAlfredo Cardigliano u32 fw_heartbeat; 277101489e5dSAlfredo Cardigliano char fw_version[IONIC_DEVINFO_FWVERS_BUFLEN]; 277201489e5dSAlfredo Cardigliano char serial_num[IONIC_DEVINFO_SERIAL_BUFLEN]; 277301489e5dSAlfredo Cardigliano }; 277401489e5dSAlfredo Cardigliano u32 words[512]; 277501489e5dSAlfredo Cardigliano }; 277601489e5dSAlfredo Cardigliano 277701489e5dSAlfredo Cardigliano /** 277801489e5dSAlfredo Cardigliano * union ionic_dev_cmd_regs - Device command register format (read-write) 2779126fe197SAndrew Boyer * @doorbell: Device Cmd Doorbell, write-only 278001489e5dSAlfredo Cardigliano * Write a 1 to signal device to process cmd, 278101489e5dSAlfredo Cardigliano * poll done for completion. 2782126fe197SAndrew Boyer * @done: Done indicator, bit 0 == 1 when command is complete 278301489e5dSAlfredo Cardigliano * @cmd: Opcode-specific command bytes 278401489e5dSAlfredo Cardigliano * @comp: Opcode-specific response bytes 278501489e5dSAlfredo Cardigliano * @data: Opcode-specific side-data 278601489e5dSAlfredo Cardigliano */ 278701489e5dSAlfredo Cardigliano union ionic_dev_cmd_regs { 2788*e7750639SAndre Muezerie struct __rte_packed_begin { 278901489e5dSAlfredo Cardigliano u32 doorbell; 279001489e5dSAlfredo Cardigliano u32 done; 279101489e5dSAlfredo Cardigliano union ionic_dev_cmd cmd; 279201489e5dSAlfredo Cardigliano union ionic_dev_cmd_comp comp; 279301489e5dSAlfredo Cardigliano u8 rsvd[48]; 279401489e5dSAlfredo Cardigliano u32 data[478]; 2795*e7750639SAndre Muezerie } __rte_packed_end; 279601489e5dSAlfredo Cardigliano u32 words[512]; 279701489e5dSAlfredo Cardigliano }; 279801489e5dSAlfredo Cardigliano 279901489e5dSAlfredo Cardigliano /** 2800126fe197SAndrew Boyer * union ionic_dev_regs - Device register format for bar 0 page 0 280101489e5dSAlfredo Cardigliano * @info: Device info registers 280201489e5dSAlfredo Cardigliano * @devcmd: Device command registers 280301489e5dSAlfredo Cardigliano */ 280401489e5dSAlfredo Cardigliano union ionic_dev_regs { 2805*e7750639SAndre Muezerie struct __rte_packed_begin { 280601489e5dSAlfredo Cardigliano union ionic_dev_info_regs info; 280701489e5dSAlfredo Cardigliano union ionic_dev_cmd_regs devcmd; 2808*e7750639SAndre Muezerie } __rte_packed_end; 280901489e5dSAlfredo Cardigliano __le32 words[1024]; 281001489e5dSAlfredo Cardigliano }; 281101489e5dSAlfredo Cardigliano 281201489e5dSAlfredo Cardigliano union ionic_adminq_cmd { 281301489e5dSAlfredo Cardigliano struct ionic_admin_cmd cmd; 281401489e5dSAlfredo Cardigliano struct ionic_nop_cmd nop; 2815126fe197SAndrew Boyer struct ionic_q_identify_cmd q_identify; 281601489e5dSAlfredo Cardigliano struct ionic_q_init_cmd q_init; 281701489e5dSAlfredo Cardigliano struct ionic_q_control_cmd q_control; 281801489e5dSAlfredo Cardigliano struct ionic_lif_setattr_cmd lif_setattr; 281901489e5dSAlfredo Cardigliano struct ionic_lif_getattr_cmd lif_getattr; 282001489e5dSAlfredo Cardigliano struct ionic_rx_mode_set_cmd rx_mode_set; 282101489e5dSAlfredo Cardigliano struct ionic_rx_filter_add_cmd rx_filter_add; 282201489e5dSAlfredo Cardigliano struct ionic_rx_filter_del_cmd rx_filter_del; 282301489e5dSAlfredo Cardigliano struct ionic_rdma_reset_cmd rdma_reset; 282401489e5dSAlfredo Cardigliano struct ionic_rdma_queue_cmd rdma_queue; 282501489e5dSAlfredo Cardigliano struct ionic_fw_download_cmd fw_download; 282601489e5dSAlfredo Cardigliano struct ionic_fw_control_cmd fw_control; 282701489e5dSAlfredo Cardigliano }; 282801489e5dSAlfredo Cardigliano 282901489e5dSAlfredo Cardigliano union ionic_adminq_comp { 283001489e5dSAlfredo Cardigliano struct ionic_admin_comp comp; 283101489e5dSAlfredo Cardigliano struct ionic_nop_comp nop; 2832126fe197SAndrew Boyer struct ionic_q_identify_comp q_identify; 283301489e5dSAlfredo Cardigliano struct ionic_q_init_comp q_init; 283401489e5dSAlfredo Cardigliano struct ionic_lif_setattr_comp lif_setattr; 283501489e5dSAlfredo Cardigliano struct ionic_lif_getattr_comp lif_getattr; 283601489e5dSAlfredo Cardigliano struct ionic_rx_filter_add_comp rx_filter_add; 283701489e5dSAlfredo Cardigliano struct ionic_fw_control_comp fw_control; 283801489e5dSAlfredo Cardigliano }; 283901489e5dSAlfredo Cardigliano 284001489e5dSAlfredo Cardigliano struct ionic_notifyq_cmd { 284101489e5dSAlfredo Cardigliano __le32 data; /* Not used but needed for qcq structure */ 284201489e5dSAlfredo Cardigliano }; 284301489e5dSAlfredo Cardigliano 284401489e5dSAlfredo Cardigliano union ionic_notifyq_comp { 284501489e5dSAlfredo Cardigliano struct ionic_notifyq_event event; 284601489e5dSAlfredo Cardigliano struct ionic_link_change_event link_change; 284701489e5dSAlfredo Cardigliano struct ionic_reset_event reset; 284801489e5dSAlfredo Cardigliano struct ionic_heartbeat_event heartbeat; 284901489e5dSAlfredo Cardigliano struct ionic_log_event log; 285001489e5dSAlfredo Cardigliano }; 285101489e5dSAlfredo Cardigliano 2852126fe197SAndrew Boyer /** 2853126fe197SAndrew Boyer * struct ionic_eq_comp - Event queue completion descriptor 2854126fe197SAndrew Boyer * 2855126fe197SAndrew Boyer * @code: Event code, see enum ionic_eq_comp_code 2856126fe197SAndrew Boyer * @lif_index: To which LIF the event pertains 2857126fe197SAndrew Boyer * @qid: To which queue id the event pertains 2858126fe197SAndrew Boyer * @gen_color: Event queue wrap counter, init 1, incr each wrap 2859126fe197SAndrew Boyer */ 2860126fe197SAndrew Boyer struct ionic_eq_comp { 2861126fe197SAndrew Boyer __le16 code; 2862126fe197SAndrew Boyer __le16 lif_index; 2863126fe197SAndrew Boyer __le32 qid; 2864126fe197SAndrew Boyer u8 rsvd[7]; 2865126fe197SAndrew Boyer u8 gen_color; 2866126fe197SAndrew Boyer }; 2867126fe197SAndrew Boyer 2868126fe197SAndrew Boyer enum ionic_eq_comp_code { 2869126fe197SAndrew Boyer IONIC_EQ_COMP_CODE_NONE = 0, 2870126fe197SAndrew Boyer IONIC_EQ_COMP_CODE_RX_COMP = 1, 2871126fe197SAndrew Boyer IONIC_EQ_COMP_CODE_TX_COMP = 2, 2872126fe197SAndrew Boyer }; 2873126fe197SAndrew Boyer 287401489e5dSAlfredo Cardigliano /* Deprecate */ 287501489e5dSAlfredo Cardigliano struct ionic_identity { 287601489e5dSAlfredo Cardigliano union ionic_drv_identity drv; 287701489e5dSAlfredo Cardigliano union ionic_dev_identity dev; 287801489e5dSAlfredo Cardigliano union ionic_lif_identity lif; 287901489e5dSAlfredo Cardigliano union ionic_port_identity port; 288001489e5dSAlfredo Cardigliano union ionic_qos_identity qos; 2881126fe197SAndrew Boyer union ionic_q_identity txq; 288201489e5dSAlfredo Cardigliano }; 288301489e5dSAlfredo Cardigliano 288401489e5dSAlfredo Cardigliano #endif /* _IONIC_IF_H_ */ 2885