101489e5dSAlfredo Cardigliano /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB OR BSD-3-Clause */ 2126fe197SAndrew Boyer /* Copyright (c) 2017-2020 Pensando Systems, Inc. All rights reserved. */ 301489e5dSAlfredo Cardigliano 401489e5dSAlfredo Cardigliano #ifndef _IONIC_IF_H_ 501489e5dSAlfredo Cardigliano #define _IONIC_IF_H_ 601489e5dSAlfredo Cardigliano 701489e5dSAlfredo Cardigliano #define IONIC_DEV_INFO_SIGNATURE 0x44455649 /* 'DEVI' */ 801489e5dSAlfredo Cardigliano #define IONIC_DEV_INFO_VERSION 1 901489e5dSAlfredo Cardigliano #define IONIC_IFNAMSIZ 16 1001489e5dSAlfredo Cardigliano 1101489e5dSAlfredo Cardigliano /** 12126fe197SAndrew Boyer * enum ionic_cmd_opcode - Device commands 1301489e5dSAlfredo Cardigliano */ 1401489e5dSAlfredo Cardigliano enum ionic_cmd_opcode { 1501489e5dSAlfredo Cardigliano IONIC_CMD_NOP = 0, 1601489e5dSAlfredo Cardigliano 1701489e5dSAlfredo Cardigliano /* Device commands */ 1801489e5dSAlfredo Cardigliano IONIC_CMD_IDENTIFY = 1, 1901489e5dSAlfredo Cardigliano IONIC_CMD_INIT = 2, 2001489e5dSAlfredo Cardigliano IONIC_CMD_RESET = 3, 2101489e5dSAlfredo Cardigliano IONIC_CMD_GETATTR = 4, 2201489e5dSAlfredo Cardigliano IONIC_CMD_SETATTR = 5, 2301489e5dSAlfredo Cardigliano 2401489e5dSAlfredo Cardigliano /* Port commands */ 2501489e5dSAlfredo Cardigliano IONIC_CMD_PORT_IDENTIFY = 10, 2601489e5dSAlfredo Cardigliano IONIC_CMD_PORT_INIT = 11, 2701489e5dSAlfredo Cardigliano IONIC_CMD_PORT_RESET = 12, 2801489e5dSAlfredo Cardigliano IONIC_CMD_PORT_GETATTR = 13, 2901489e5dSAlfredo Cardigliano IONIC_CMD_PORT_SETATTR = 14, 3001489e5dSAlfredo Cardigliano 3101489e5dSAlfredo Cardigliano /* LIF commands */ 3201489e5dSAlfredo Cardigliano IONIC_CMD_LIF_IDENTIFY = 20, 3301489e5dSAlfredo Cardigliano IONIC_CMD_LIF_INIT = 21, 3401489e5dSAlfredo Cardigliano IONIC_CMD_LIF_RESET = 22, 3501489e5dSAlfredo Cardigliano IONIC_CMD_LIF_GETATTR = 23, 3601489e5dSAlfredo Cardigliano IONIC_CMD_LIF_SETATTR = 24, 3701489e5dSAlfredo Cardigliano 3801489e5dSAlfredo Cardigliano IONIC_CMD_RX_MODE_SET = 30, 3901489e5dSAlfredo Cardigliano IONIC_CMD_RX_FILTER_ADD = 31, 4001489e5dSAlfredo Cardigliano IONIC_CMD_RX_FILTER_DEL = 32, 4101489e5dSAlfredo Cardigliano 4201489e5dSAlfredo Cardigliano /* Queue commands */ 43126fe197SAndrew Boyer IONIC_CMD_Q_IDENTIFY = 39, 4401489e5dSAlfredo Cardigliano IONIC_CMD_Q_INIT = 40, 4501489e5dSAlfredo Cardigliano IONIC_CMD_Q_CONTROL = 41, 4601489e5dSAlfredo Cardigliano 4701489e5dSAlfredo Cardigliano /* RDMA commands */ 4801489e5dSAlfredo Cardigliano IONIC_CMD_RDMA_RESET_LIF = 50, 4901489e5dSAlfredo Cardigliano IONIC_CMD_RDMA_CREATE_EQ = 51, 5001489e5dSAlfredo Cardigliano IONIC_CMD_RDMA_CREATE_CQ = 52, 5101489e5dSAlfredo Cardigliano IONIC_CMD_RDMA_CREATE_ADMINQ = 53, 5201489e5dSAlfredo Cardigliano 53126fe197SAndrew Boyer /* SR/IOV commands */ 54126fe197SAndrew Boyer IONIC_CMD_VF_GETATTR = 60, 55126fe197SAndrew Boyer IONIC_CMD_VF_SETATTR = 61, 56126fe197SAndrew Boyer 5701489e5dSAlfredo Cardigliano /* QoS commands */ 5801489e5dSAlfredo Cardigliano IONIC_CMD_QOS_CLASS_IDENTIFY = 240, 5901489e5dSAlfredo Cardigliano IONIC_CMD_QOS_CLASS_INIT = 241, 6001489e5dSAlfredo Cardigliano IONIC_CMD_QOS_CLASS_RESET = 242, 61126fe197SAndrew Boyer IONIC_CMD_QOS_CLASS_UPDATE = 243, 62126fe197SAndrew Boyer IONIC_CMD_QOS_CLEAR_STATS = 244, 63126fe197SAndrew Boyer IONIC_CMD_QOS_RESET = 245, 6401489e5dSAlfredo Cardigliano 6501489e5dSAlfredo Cardigliano /* Firmware commands */ 6601489e5dSAlfredo Cardigliano IONIC_CMD_FW_DOWNLOAD = 254, 6701489e5dSAlfredo Cardigliano IONIC_CMD_FW_CONTROL = 255, 6801489e5dSAlfredo Cardigliano }; 6901489e5dSAlfredo Cardigliano 7001489e5dSAlfredo Cardigliano /** 71126fe197SAndrew Boyer * enum ionic_status_code - Device command return codes 7201489e5dSAlfredo Cardigliano */ 7301489e5dSAlfredo Cardigliano enum ionic_status_code { 7401489e5dSAlfredo Cardigliano IONIC_RC_SUCCESS = 0, /* Success */ 7501489e5dSAlfredo Cardigliano IONIC_RC_EVERSION = 1, /* Incorrect version for request */ 7601489e5dSAlfredo Cardigliano IONIC_RC_EOPCODE = 2, /* Invalid cmd opcode */ 7701489e5dSAlfredo Cardigliano IONIC_RC_EIO = 3, /* I/O error */ 7801489e5dSAlfredo Cardigliano IONIC_RC_EPERM = 4, /* Permission denied */ 7901489e5dSAlfredo Cardigliano IONIC_RC_EQID = 5, /* Bad qid */ 8001489e5dSAlfredo Cardigliano IONIC_RC_EQTYPE = 6, /* Bad qtype */ 8101489e5dSAlfredo Cardigliano IONIC_RC_ENOENT = 7, /* No such element */ 8201489e5dSAlfredo Cardigliano IONIC_RC_EINTR = 8, /* operation interrupted */ 8301489e5dSAlfredo Cardigliano IONIC_RC_EAGAIN = 9, /* Try again */ 8401489e5dSAlfredo Cardigliano IONIC_RC_ENOMEM = 10, /* Out of memory */ 8501489e5dSAlfredo Cardigliano IONIC_RC_EFAULT = 11, /* Bad address */ 8601489e5dSAlfredo Cardigliano IONIC_RC_EBUSY = 12, /* Device or resource busy */ 8701489e5dSAlfredo Cardigliano IONIC_RC_EEXIST = 13, /* object already exists */ 8801489e5dSAlfredo Cardigliano IONIC_RC_EINVAL = 14, /* Invalid argument */ 8901489e5dSAlfredo Cardigliano IONIC_RC_ENOSPC = 15, /* No space left or alloc failure */ 9001489e5dSAlfredo Cardigliano IONIC_RC_ERANGE = 16, /* Parameter out of range */ 9101489e5dSAlfredo Cardigliano IONIC_RC_BAD_ADDR = 17, /* Descriptor contains a bad ptr */ 9201489e5dSAlfredo Cardigliano IONIC_RC_DEV_CMD = 18, /* Device cmd attempted on AdminQ */ 9301489e5dSAlfredo Cardigliano IONIC_RC_ENOSUPP = 19, /* Operation not supported */ 9401489e5dSAlfredo Cardigliano IONIC_RC_ERROR = 29, /* Generic error */ 9501489e5dSAlfredo Cardigliano IONIC_RC_ERDMA = 30, /* Generic RDMA error */ 96126fe197SAndrew Boyer IONIC_RC_EVFID = 31, /* VF ID does not exist */ 9701489e5dSAlfredo Cardigliano }; 9801489e5dSAlfredo Cardigliano 9901489e5dSAlfredo Cardigliano enum ionic_notifyq_opcode { 10001489e5dSAlfredo Cardigliano IONIC_EVENT_LINK_CHANGE = 1, 10101489e5dSAlfredo Cardigliano IONIC_EVENT_RESET = 2, 10201489e5dSAlfredo Cardigliano IONIC_EVENT_HEARTBEAT = 3, 10301489e5dSAlfredo Cardigliano IONIC_EVENT_LOG = 4, 104126fe197SAndrew Boyer IONIC_EVENT_XCVR = 5, 10501489e5dSAlfredo Cardigliano }; 10601489e5dSAlfredo Cardigliano 10701489e5dSAlfredo Cardigliano /** 108126fe197SAndrew Boyer * struct ionic_admin_cmd - General admin command format 10901489e5dSAlfredo Cardigliano * @opcode: Opcode for the command 11001489e5dSAlfredo Cardigliano * @lif_index: LIF index 11101489e5dSAlfredo Cardigliano * @cmd_data: Opcode-specific command bytes 11201489e5dSAlfredo Cardigliano */ 11301489e5dSAlfredo Cardigliano struct ionic_admin_cmd { 11401489e5dSAlfredo Cardigliano u8 opcode; 11501489e5dSAlfredo Cardigliano u8 rsvd; 11601489e5dSAlfredo Cardigliano __le16 lif_index; 11701489e5dSAlfredo Cardigliano u8 cmd_data[60]; 11801489e5dSAlfredo Cardigliano }; 11901489e5dSAlfredo Cardigliano 12001489e5dSAlfredo Cardigliano /** 12101489e5dSAlfredo Cardigliano * struct ionic_admin_comp - General admin command completion format 122126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 123126fe197SAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 124126fe197SAndrew Boyer * @cmd_data: Command-specific bytes 125126fe197SAndrew Boyer * @color: Color bit (Always 0 for commands issued to the 126126fe197SAndrew Boyer * Device Cmd Registers) 12701489e5dSAlfredo Cardigliano */ 12801489e5dSAlfredo Cardigliano struct ionic_admin_comp { 12901489e5dSAlfredo Cardigliano u8 status; 13001489e5dSAlfredo Cardigliano u8 rsvd; 13101489e5dSAlfredo Cardigliano __le16 comp_index; 13201489e5dSAlfredo Cardigliano u8 cmd_data[11]; 13301489e5dSAlfredo Cardigliano u8 color; 13401489e5dSAlfredo Cardigliano #define IONIC_COMP_COLOR_MASK 0x80 13501489e5dSAlfredo Cardigliano }; 13601489e5dSAlfredo Cardigliano 13701489e5dSAlfredo Cardigliano static inline u8 color_match(u8 color, u8 done_color) 13801489e5dSAlfredo Cardigliano { 13901489e5dSAlfredo Cardigliano return (!!(color & IONIC_COMP_COLOR_MASK)) == done_color; 14001489e5dSAlfredo Cardigliano } 14101489e5dSAlfredo Cardigliano 14201489e5dSAlfredo Cardigliano /** 14301489e5dSAlfredo Cardigliano * struct ionic_nop_cmd - NOP command 14401489e5dSAlfredo Cardigliano * @opcode: opcode 14501489e5dSAlfredo Cardigliano */ 14601489e5dSAlfredo Cardigliano struct ionic_nop_cmd { 14701489e5dSAlfredo Cardigliano u8 opcode; 14801489e5dSAlfredo Cardigliano u8 rsvd[63]; 14901489e5dSAlfredo Cardigliano }; 15001489e5dSAlfredo Cardigliano 15101489e5dSAlfredo Cardigliano /** 15201489e5dSAlfredo Cardigliano * struct ionic_nop_comp - NOP command completion 153126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 15401489e5dSAlfredo Cardigliano */ 15501489e5dSAlfredo Cardigliano struct ionic_nop_comp { 15601489e5dSAlfredo Cardigliano u8 status; 15701489e5dSAlfredo Cardigliano u8 rsvd[15]; 15801489e5dSAlfredo Cardigliano }; 15901489e5dSAlfredo Cardigliano 16001489e5dSAlfredo Cardigliano /** 16101489e5dSAlfredo Cardigliano * struct ionic_dev_init_cmd - Device init command 16201489e5dSAlfredo Cardigliano * @opcode: opcode 163126fe197SAndrew Boyer * @type: Device type 16401489e5dSAlfredo Cardigliano */ 16501489e5dSAlfredo Cardigliano struct ionic_dev_init_cmd { 16601489e5dSAlfredo Cardigliano u8 opcode; 16701489e5dSAlfredo Cardigliano u8 type; 16801489e5dSAlfredo Cardigliano u8 rsvd[62]; 16901489e5dSAlfredo Cardigliano }; 17001489e5dSAlfredo Cardigliano 17101489e5dSAlfredo Cardigliano /** 172126fe197SAndrew Boyer * struct ionic_dev_init_comp - Device init command completion 173126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 17401489e5dSAlfredo Cardigliano */ 17501489e5dSAlfredo Cardigliano struct ionic_dev_init_comp { 17601489e5dSAlfredo Cardigliano u8 status; 17701489e5dSAlfredo Cardigliano u8 rsvd[15]; 17801489e5dSAlfredo Cardigliano }; 17901489e5dSAlfredo Cardigliano 18001489e5dSAlfredo Cardigliano /** 18101489e5dSAlfredo Cardigliano * struct ionic_dev_reset_cmd - Device reset command 18201489e5dSAlfredo Cardigliano * @opcode: opcode 18301489e5dSAlfredo Cardigliano */ 18401489e5dSAlfredo Cardigliano struct ionic_dev_reset_cmd { 18501489e5dSAlfredo Cardigliano u8 opcode; 18601489e5dSAlfredo Cardigliano u8 rsvd[63]; 18701489e5dSAlfredo Cardigliano }; 18801489e5dSAlfredo Cardigliano 18901489e5dSAlfredo Cardigliano /** 190126fe197SAndrew Boyer * struct ionic_dev_reset_comp - Reset command completion 191126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 19201489e5dSAlfredo Cardigliano */ 19301489e5dSAlfredo Cardigliano struct ionic_dev_reset_comp { 19401489e5dSAlfredo Cardigliano u8 status; 19501489e5dSAlfredo Cardigliano u8 rsvd[15]; 19601489e5dSAlfredo Cardigliano }; 19701489e5dSAlfredo Cardigliano 19801489e5dSAlfredo Cardigliano #define IONIC_IDENTITY_VERSION_1 1 19901489e5dSAlfredo Cardigliano 20001489e5dSAlfredo Cardigliano /** 20101489e5dSAlfredo Cardigliano * struct ionic_dev_identify_cmd - Driver/device identify command 20201489e5dSAlfredo Cardigliano * @opcode: opcode 20301489e5dSAlfredo Cardigliano * @ver: Highest version of identify supported by driver 20401489e5dSAlfredo Cardigliano */ 20501489e5dSAlfredo Cardigliano struct ionic_dev_identify_cmd { 20601489e5dSAlfredo Cardigliano u8 opcode; 20701489e5dSAlfredo Cardigliano u8 ver; 20801489e5dSAlfredo Cardigliano u8 rsvd[62]; 20901489e5dSAlfredo Cardigliano }; 21001489e5dSAlfredo Cardigliano 21101489e5dSAlfredo Cardigliano /** 212126fe197SAndrew Boyer * struct ionic_dev_identify_comp - Driver/device identify command completion 213126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 21401489e5dSAlfredo Cardigliano * @ver: Version of identify returned by device 21501489e5dSAlfredo Cardigliano */ 21601489e5dSAlfredo Cardigliano struct ionic_dev_identify_comp { 21701489e5dSAlfredo Cardigliano u8 status; 21801489e5dSAlfredo Cardigliano u8 ver; 21901489e5dSAlfredo Cardigliano u8 rsvd[14]; 22001489e5dSAlfredo Cardigliano }; 22101489e5dSAlfredo Cardigliano 22201489e5dSAlfredo Cardigliano enum ionic_os_type { 22301489e5dSAlfredo Cardigliano IONIC_OS_TYPE_LINUX = 1, 22401489e5dSAlfredo Cardigliano IONIC_OS_TYPE_WIN = 2, 22501489e5dSAlfredo Cardigliano IONIC_OS_TYPE_DPDK = 3, 22601489e5dSAlfredo Cardigliano IONIC_OS_TYPE_FREEBSD = 4, 22701489e5dSAlfredo Cardigliano IONIC_OS_TYPE_IPXE = 5, 22801489e5dSAlfredo Cardigliano IONIC_OS_TYPE_ESXI = 6, 22901489e5dSAlfredo Cardigliano }; 23001489e5dSAlfredo Cardigliano 23101489e5dSAlfredo Cardigliano /** 232126fe197SAndrew Boyer * union ionic_drv_identity - driver identity information 233126fe197SAndrew Boyer * @os_type: OS type (see enum ionic_os_type) 23401489e5dSAlfredo Cardigliano * @os_dist: OS distribution, numeric format 23501489e5dSAlfredo Cardigliano * @os_dist_str: OS distribution, string format 23601489e5dSAlfredo Cardigliano * @kernel_ver: Kernel version, numeric format 23701489e5dSAlfredo Cardigliano * @kernel_ver_str: Kernel version, string format 23801489e5dSAlfredo Cardigliano * @driver_ver_str: Driver version, string format 23901489e5dSAlfredo Cardigliano */ 24001489e5dSAlfredo Cardigliano union ionic_drv_identity { 24101489e5dSAlfredo Cardigliano struct { 24201489e5dSAlfredo Cardigliano __le32 os_type; 24301489e5dSAlfredo Cardigliano __le32 os_dist; 24401489e5dSAlfredo Cardigliano char os_dist_str[128]; 24501489e5dSAlfredo Cardigliano __le32 kernel_ver; 24601489e5dSAlfredo Cardigliano char kernel_ver_str[32]; 24701489e5dSAlfredo Cardigliano char driver_ver_str[32]; 24801489e5dSAlfredo Cardigliano }; 249126fe197SAndrew Boyer __le32 words[478]; 25001489e5dSAlfredo Cardigliano }; 25101489e5dSAlfredo Cardigliano 25201489e5dSAlfredo Cardigliano /** 253126fe197SAndrew Boyer * union ionic_dev_identity - device identity information 25401489e5dSAlfredo Cardigliano * @version: Version of device identify 25501489e5dSAlfredo Cardigliano * @type: Identify type (0 for now) 25601489e5dSAlfredo Cardigliano * @nports: Number of ports provisioned 25701489e5dSAlfredo Cardigliano * @nlifs: Number of LIFs provisioned 25801489e5dSAlfredo Cardigliano * @nintrs: Number of interrupts provisioned 25901489e5dSAlfredo Cardigliano * @ndbpgs_per_lif: Number of doorbell pages per LIF 260126fe197SAndrew Boyer * @intr_coal_mult: Interrupt coalescing multiplication factor 26101489e5dSAlfredo Cardigliano * Scale user-supplied interrupt coalescing 26201489e5dSAlfredo Cardigliano * value in usecs to device units using: 26301489e5dSAlfredo Cardigliano * device units = usecs * mult / div 264126fe197SAndrew Boyer * @intr_coal_div: Interrupt coalescing division factor 26501489e5dSAlfredo Cardigliano * Scale user-supplied interrupt coalescing 26601489e5dSAlfredo Cardigliano * value in usecs to device units using: 26701489e5dSAlfredo Cardigliano * device units = usecs * mult / div 268126fe197SAndrew Boyer * @eq_count: Number of shared event queues 26901489e5dSAlfredo Cardigliano */ 27001489e5dSAlfredo Cardigliano union ionic_dev_identity { 27101489e5dSAlfredo Cardigliano struct { 27201489e5dSAlfredo Cardigliano u8 version; 27301489e5dSAlfredo Cardigliano u8 type; 27401489e5dSAlfredo Cardigliano u8 rsvd[2]; 27501489e5dSAlfredo Cardigliano u8 nports; 27601489e5dSAlfredo Cardigliano u8 rsvd2[3]; 27701489e5dSAlfredo Cardigliano __le32 nlifs; 27801489e5dSAlfredo Cardigliano __le32 nintrs; 27901489e5dSAlfredo Cardigliano __le32 ndbpgs_per_lif; 28001489e5dSAlfredo Cardigliano __le32 intr_coal_mult; 28101489e5dSAlfredo Cardigliano __le32 intr_coal_div; 282126fe197SAndrew Boyer __le32 eq_count; 28301489e5dSAlfredo Cardigliano }; 284126fe197SAndrew Boyer __le32 words[478]; 28501489e5dSAlfredo Cardigliano }; 28601489e5dSAlfredo Cardigliano 28701489e5dSAlfredo Cardigliano enum ionic_lif_type { 28801489e5dSAlfredo Cardigliano IONIC_LIF_TYPE_CLASSIC = 0, 28901489e5dSAlfredo Cardigliano IONIC_LIF_TYPE_MACVLAN = 1, 29001489e5dSAlfredo Cardigliano IONIC_LIF_TYPE_NETQUEUE = 2, 29101489e5dSAlfredo Cardigliano }; 29201489e5dSAlfredo Cardigliano 29301489e5dSAlfredo Cardigliano /** 294126fe197SAndrew Boyer * struct ionic_lif_identify_cmd - LIF identify command 29501489e5dSAlfredo Cardigliano * @opcode: opcode 296126fe197SAndrew Boyer * @type: LIF type (enum ionic_lif_type) 297126fe197SAndrew Boyer * @ver: Version of identify returned by device 29801489e5dSAlfredo Cardigliano */ 29901489e5dSAlfredo Cardigliano struct ionic_lif_identify_cmd { 30001489e5dSAlfredo Cardigliano u8 opcode; 30101489e5dSAlfredo Cardigliano u8 type; 30201489e5dSAlfredo Cardigliano u8 ver; 30301489e5dSAlfredo Cardigliano u8 rsvd[61]; 30401489e5dSAlfredo Cardigliano }; 30501489e5dSAlfredo Cardigliano 30601489e5dSAlfredo Cardigliano /** 307126fe197SAndrew Boyer * struct ionic_lif_identify_comp - LIF identify command completion 308126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 309126fe197SAndrew Boyer * @ver: Version of identify returned by device 31001489e5dSAlfredo Cardigliano */ 31101489e5dSAlfredo Cardigliano struct ionic_lif_identify_comp { 31201489e5dSAlfredo Cardigliano u8 status; 31301489e5dSAlfredo Cardigliano u8 ver; 31401489e5dSAlfredo Cardigliano u8 rsvd2[14]; 31501489e5dSAlfredo Cardigliano }; 31601489e5dSAlfredo Cardigliano 317126fe197SAndrew Boyer /** 318126fe197SAndrew Boyer * enum ionic_lif_capability - LIF capabilities 319126fe197SAndrew Boyer * @IONIC_LIF_CAP_ETH: LIF supports Ethernet 320126fe197SAndrew Boyer * @IONIC_LIF_CAP_RDMA: LIF support RDMA 321126fe197SAndrew Boyer */ 32201489e5dSAlfredo Cardigliano enum ionic_lif_capability { 32301489e5dSAlfredo Cardigliano IONIC_LIF_CAP_ETH = BIT(0), 32401489e5dSAlfredo Cardigliano IONIC_LIF_CAP_RDMA = BIT(1), 32501489e5dSAlfredo Cardigliano }; 32601489e5dSAlfredo Cardigliano 32701489e5dSAlfredo Cardigliano /** 328126fe197SAndrew Boyer * enum ionic_logical_qtype - Logical Queue Types 329126fe197SAndrew Boyer * @IONIC_QTYPE_ADMINQ: Administrative Queue 330126fe197SAndrew Boyer * @IONIC_QTYPE_NOTIFYQ: Notify Queue 331126fe197SAndrew Boyer * @IONIC_QTYPE_RXQ: Receive Queue 332126fe197SAndrew Boyer * @IONIC_QTYPE_TXQ: Transmit Queue 333126fe197SAndrew Boyer * @IONIC_QTYPE_EQ: Event Queue 334126fe197SAndrew Boyer * @IONIC_QTYPE_MAX: Max queue type supported 33501489e5dSAlfredo Cardigliano */ 33601489e5dSAlfredo Cardigliano enum ionic_logical_qtype { 33701489e5dSAlfredo Cardigliano IONIC_QTYPE_ADMINQ = 0, 33801489e5dSAlfredo Cardigliano IONIC_QTYPE_NOTIFYQ = 1, 33901489e5dSAlfredo Cardigliano IONIC_QTYPE_RXQ = 2, 34001489e5dSAlfredo Cardigliano IONIC_QTYPE_TXQ = 3, 34101489e5dSAlfredo Cardigliano IONIC_QTYPE_EQ = 4, 34201489e5dSAlfredo Cardigliano IONIC_QTYPE_MAX = 16, 34301489e5dSAlfredo Cardigliano }; 34401489e5dSAlfredo Cardigliano 34501489e5dSAlfredo Cardigliano /** 346126fe197SAndrew Boyer * struct ionic_lif_logical_qtype - Descriptor of logical to HW queue type 347126fe197SAndrew Boyer * @qtype: Hardware Queue Type 348126fe197SAndrew Boyer * @qid_count: Number of Queue IDs of the logical type 349126fe197SAndrew Boyer * @qid_base: Minimum Queue ID of the logical type 35001489e5dSAlfredo Cardigliano */ 35101489e5dSAlfredo Cardigliano struct ionic_lif_logical_qtype { 35201489e5dSAlfredo Cardigliano u8 qtype; 35301489e5dSAlfredo Cardigliano u8 rsvd[3]; 35401489e5dSAlfredo Cardigliano __le32 qid_count; 35501489e5dSAlfredo Cardigliano __le32 qid_base; 35601489e5dSAlfredo Cardigliano }; 35701489e5dSAlfredo Cardigliano 358126fe197SAndrew Boyer /** 359126fe197SAndrew Boyer * enum ionic_lif_state - LIF state 360126fe197SAndrew Boyer * @IONIC_LIF_DISABLE: LIF disabled 361126fe197SAndrew Boyer * @IONIC_LIF_ENABLE: LIF enabled 362126fe197SAndrew Boyer * @IONIC_LIF_QUIESCE: LIF Quiesced 363126fe197SAndrew Boyer */ 36401489e5dSAlfredo Cardigliano enum ionic_lif_state { 365126fe197SAndrew Boyer IONIC_LIF_QUIESCE = 0, 36601489e5dSAlfredo Cardigliano IONIC_LIF_ENABLE = 1, 367126fe197SAndrew Boyer IONIC_LIF_DISABLE = 2, 36801489e5dSAlfredo Cardigliano }; 36901489e5dSAlfredo Cardigliano 37001489e5dSAlfredo Cardigliano /** 371126fe197SAndrew Boyer * union ionic_lif_config - LIF configuration 372126fe197SAndrew Boyer * @state: LIF state (enum ionic_lif_state) 373126fe197SAndrew Boyer * @name: LIF name 374126fe197SAndrew Boyer * @mtu: MTU 375126fe197SAndrew Boyer * @mac: Station MAC address 376126fe197SAndrew Boyer * @vlan: Default Vlan ID 377126fe197SAndrew Boyer * @features: Features (enum ionic_eth_hw_features) 378126fe197SAndrew Boyer * @queue_count: Queue counts per queue-type 37901489e5dSAlfredo Cardigliano */ 38001489e5dSAlfredo Cardigliano union ionic_lif_config { 38101489e5dSAlfredo Cardigliano struct { 38201489e5dSAlfredo Cardigliano u8 state; 38301489e5dSAlfredo Cardigliano u8 rsvd[3]; 38401489e5dSAlfredo Cardigliano char name[IONIC_IFNAMSIZ]; 38501489e5dSAlfredo Cardigliano __le32 mtu; 38601489e5dSAlfredo Cardigliano u8 mac[6]; 387126fe197SAndrew Boyer __le16 vlan; 38801489e5dSAlfredo Cardigliano __le64 features; 38901489e5dSAlfredo Cardigliano __le32 queue_count[IONIC_QTYPE_MAX]; 390126fe197SAndrew Boyer } __rte_packed; 39101489e5dSAlfredo Cardigliano __le32 words[64]; 39201489e5dSAlfredo Cardigliano }; 39301489e5dSAlfredo Cardigliano 39401489e5dSAlfredo Cardigliano /** 395126fe197SAndrew Boyer * struct ionic_lif_identity - LIF identity information (type-specific) 39601489e5dSAlfredo Cardigliano * 397126fe197SAndrew Boyer * @capabilities: LIF capabilities 39801489e5dSAlfredo Cardigliano * 399126fe197SAndrew Boyer * @eth: Ethernet identify structure 400126fe197SAndrew Boyer * @version: Ethernet identify structure version 401126fe197SAndrew Boyer * @max_ucast_filters: Number of perfect unicast addresses supported 402126fe197SAndrew Boyer * @max_mcast_filters: Number of perfect multicast addresses supported 40301489e5dSAlfredo Cardigliano * @min_frame_size: Minimum size of frames to be sent 40401489e5dSAlfredo Cardigliano * @max_frame_size: Maximum size of frames to be sent 40501489e5dSAlfredo Cardigliano * @config: LIF config struct with features, mtu, mac, q counts 40601489e5dSAlfredo Cardigliano * 407126fe197SAndrew Boyer * @rdma: RDMA identify structure 408126fe197SAndrew Boyer * @version: RDMA version of opcodes and queue descriptors 409126fe197SAndrew Boyer * @qp_opcodes: Number of RDMA queue pair opcodes supported 410126fe197SAndrew Boyer * @admin_opcodes: Number of RDMA admin opcodes supported 411126fe197SAndrew Boyer * @npts_per_lif: Page table size per LIF 412126fe197SAndrew Boyer * @nmrs_per_lif: Number of memory regions per LIF 413126fe197SAndrew Boyer * @nahs_per_lif: Number of address handles per LIF 414126fe197SAndrew Boyer * @max_stride: Max work request stride 415126fe197SAndrew Boyer * @cl_stride: Cache line stride 416126fe197SAndrew Boyer * @pte_stride: Page table entry stride 417126fe197SAndrew Boyer * @rrq_stride: Remote RQ work request stride 418126fe197SAndrew Boyer * @rsq_stride: Remote SQ work request stride 41901489e5dSAlfredo Cardigliano * @dcqcn_profiles: Number of DCQCN profiles 420126fe197SAndrew Boyer * @aq_qtype: RDMA Admin Qtype 421126fe197SAndrew Boyer * @sq_qtype: RDMA Send Qtype 422126fe197SAndrew Boyer * @rq_qtype: RDMA Receive Qtype 423126fe197SAndrew Boyer * @cq_qtype: RDMA Completion Qtype 424126fe197SAndrew Boyer * @eq_qtype: RDMA Event Qtype 42501489e5dSAlfredo Cardigliano */ 42601489e5dSAlfredo Cardigliano union ionic_lif_identity { 42701489e5dSAlfredo Cardigliano struct { 42801489e5dSAlfredo Cardigliano __le64 capabilities; 42901489e5dSAlfredo Cardigliano 43001489e5dSAlfredo Cardigliano struct { 43101489e5dSAlfredo Cardigliano u8 version; 43201489e5dSAlfredo Cardigliano u8 rsvd[3]; 43301489e5dSAlfredo Cardigliano __le32 max_ucast_filters; 43401489e5dSAlfredo Cardigliano __le32 max_mcast_filters; 43501489e5dSAlfredo Cardigliano __le16 rss_ind_tbl_sz; 43601489e5dSAlfredo Cardigliano __le32 min_frame_size; 43701489e5dSAlfredo Cardigliano __le32 max_frame_size; 43801489e5dSAlfredo Cardigliano u8 rsvd2[106]; 43901489e5dSAlfredo Cardigliano union ionic_lif_config config; 440126fe197SAndrew Boyer } __rte_packed eth; 44101489e5dSAlfredo Cardigliano 44201489e5dSAlfredo Cardigliano struct { 44301489e5dSAlfredo Cardigliano u8 version; 44401489e5dSAlfredo Cardigliano u8 qp_opcodes; 44501489e5dSAlfredo Cardigliano u8 admin_opcodes; 44601489e5dSAlfredo Cardigliano u8 rsvd; 44701489e5dSAlfredo Cardigliano __le32 npts_per_lif; 44801489e5dSAlfredo Cardigliano __le32 nmrs_per_lif; 44901489e5dSAlfredo Cardigliano __le32 nahs_per_lif; 45001489e5dSAlfredo Cardigliano u8 max_stride; 45101489e5dSAlfredo Cardigliano u8 cl_stride; 45201489e5dSAlfredo Cardigliano u8 pte_stride; 45301489e5dSAlfredo Cardigliano u8 rrq_stride; 45401489e5dSAlfredo Cardigliano u8 rsq_stride; 45501489e5dSAlfredo Cardigliano u8 dcqcn_profiles; 45601489e5dSAlfredo Cardigliano u8 rsvd_dimensions[10]; 45701489e5dSAlfredo Cardigliano struct ionic_lif_logical_qtype aq_qtype; 45801489e5dSAlfredo Cardigliano struct ionic_lif_logical_qtype sq_qtype; 45901489e5dSAlfredo Cardigliano struct ionic_lif_logical_qtype rq_qtype; 46001489e5dSAlfredo Cardigliano struct ionic_lif_logical_qtype cq_qtype; 46101489e5dSAlfredo Cardigliano struct ionic_lif_logical_qtype eq_qtype; 462126fe197SAndrew Boyer } __rte_packed rdma; 463126fe197SAndrew Boyer } __rte_packed; 464126fe197SAndrew Boyer __le32 words[478]; 46501489e5dSAlfredo Cardigliano }; 46601489e5dSAlfredo Cardigliano 46701489e5dSAlfredo Cardigliano /** 46801489e5dSAlfredo Cardigliano * struct ionic_lif_init_cmd - LIF init command 469126fe197SAndrew Boyer * @opcode: Opcode 470126fe197SAndrew Boyer * @type: LIF type (enum ionic_lif_type) 47101489e5dSAlfredo Cardigliano * @index: LIF index 472126fe197SAndrew Boyer * @info_pa: Destination address for LIF info (struct ionic_lif_info) 47301489e5dSAlfredo Cardigliano */ 47401489e5dSAlfredo Cardigliano struct ionic_lif_init_cmd { 47501489e5dSAlfredo Cardigliano u8 opcode; 47601489e5dSAlfredo Cardigliano u8 type; 47701489e5dSAlfredo Cardigliano __le16 index; 47801489e5dSAlfredo Cardigliano __le32 rsvd; 47901489e5dSAlfredo Cardigliano __le64 info_pa; 48001489e5dSAlfredo Cardigliano u8 rsvd2[48]; 48101489e5dSAlfredo Cardigliano }; 48201489e5dSAlfredo Cardigliano 48301489e5dSAlfredo Cardigliano /** 48401489e5dSAlfredo Cardigliano * struct ionic_lif_init_comp - LIF init command completion 485126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 486126fe197SAndrew Boyer * @hw_index: Hardware index of the initialized LIF 48701489e5dSAlfredo Cardigliano */ 48801489e5dSAlfredo Cardigliano struct ionic_lif_init_comp { 48901489e5dSAlfredo Cardigliano u8 status; 49001489e5dSAlfredo Cardigliano u8 rsvd; 49101489e5dSAlfredo Cardigliano __le16 hw_index; 49201489e5dSAlfredo Cardigliano u8 rsvd2[12]; 49301489e5dSAlfredo Cardigliano }; 49401489e5dSAlfredo Cardigliano 49501489e5dSAlfredo Cardigliano /** 496126fe197SAndrew Boyer * struct ionic_q_identify_cmd - queue identify command 497126fe197SAndrew Boyer * @opcode: opcode 498126fe197SAndrew Boyer * @lif_type: LIF type (enum ionic_lif_type) 499126fe197SAndrew Boyer * @type: Logical queue type (enum ionic_logical_qtype) 500126fe197SAndrew Boyer * @ver: Highest queue type version that the driver supports 501126fe197SAndrew Boyer */ 502126fe197SAndrew Boyer struct ionic_q_identify_cmd { 503126fe197SAndrew Boyer u8 opcode; 504126fe197SAndrew Boyer u8 rsvd; 505126fe197SAndrew Boyer __le16 lif_type; 506126fe197SAndrew Boyer u8 type; 507126fe197SAndrew Boyer u8 ver; 508126fe197SAndrew Boyer u8 rsvd2[58]; 509126fe197SAndrew Boyer }; 510126fe197SAndrew Boyer 511126fe197SAndrew Boyer /** 512126fe197SAndrew Boyer * struct ionic_q_identify_comp - queue identify command completion 513126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 514126fe197SAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 515126fe197SAndrew Boyer * @ver: Queue type version that can be used with FW 516126fe197SAndrew Boyer */ 517126fe197SAndrew Boyer struct ionic_q_identify_comp { 518126fe197SAndrew Boyer u8 status; 519126fe197SAndrew Boyer u8 rsvd; 520126fe197SAndrew Boyer __le16 comp_index; 521126fe197SAndrew Boyer u8 ver; 522126fe197SAndrew Boyer u8 rsvd2[11]; 523126fe197SAndrew Boyer }; 524126fe197SAndrew Boyer 525126fe197SAndrew Boyer /** 526126fe197SAndrew Boyer * union ionic_q_identity - queue identity information 527126fe197SAndrew Boyer * @version: Queue type version that can be used with FW 528126fe197SAndrew Boyer * @supported: Bitfield of queue versions, first bit = ver 0 529126fe197SAndrew Boyer * @features: Queue features 530126fe197SAndrew Boyer * @desc_sz: Descriptor size 531126fe197SAndrew Boyer * @comp_sz: Completion descriptor size 532126fe197SAndrew Boyer * @sg_desc_sz: Scatter/Gather descriptor size 533126fe197SAndrew Boyer * @max_sg_elems: Maximum number of Scatter/Gather elements 534126fe197SAndrew Boyer * @sg_desc_stride: Number of Scatter/Gather elements per descriptor 535126fe197SAndrew Boyer */ 536126fe197SAndrew Boyer union ionic_q_identity { 537126fe197SAndrew Boyer struct { 538126fe197SAndrew Boyer u8 version; 539126fe197SAndrew Boyer u8 supported; 540126fe197SAndrew Boyer u8 rsvd[6]; 541126fe197SAndrew Boyer #define IONIC_QIDENT_F_CQ 0x01 /* queue has completion ring */ 542126fe197SAndrew Boyer #define IONIC_QIDENT_F_SG 0x02 /* queue has scatter/gather ring */ 543126fe197SAndrew Boyer #define IONIC_QIDENT_F_EQ 0x04 /* queue can use event queue */ 544126fe197SAndrew Boyer #define IONIC_QIDENT_F_CMB 0x08 /* queue is in cmb bar */ 545126fe197SAndrew Boyer __le64 features; 546126fe197SAndrew Boyer __le16 desc_sz; 547126fe197SAndrew Boyer __le16 comp_sz; 548126fe197SAndrew Boyer __le16 sg_desc_sz; 549126fe197SAndrew Boyer __le16 max_sg_elems; 550126fe197SAndrew Boyer __le16 sg_desc_stride; 551126fe197SAndrew Boyer }; 552126fe197SAndrew Boyer __le32 words[478]; 553126fe197SAndrew Boyer }; 554126fe197SAndrew Boyer 555126fe197SAndrew Boyer /** 55601489e5dSAlfredo Cardigliano * struct ionic_q_init_cmd - Queue init command 55701489e5dSAlfredo Cardigliano * @opcode: opcode 55801489e5dSAlfredo Cardigliano * @type: Logical queue type 559126fe197SAndrew Boyer * @ver: Queue type version 56001489e5dSAlfredo Cardigliano * @lif_index: LIF index 561126fe197SAndrew Boyer * @index: (LIF, qtype) relative admin queue index 562126fe197SAndrew Boyer * @intr_index: Interrupt control register index, or Event queue index 56301489e5dSAlfredo Cardigliano * @pid: Process ID 56401489e5dSAlfredo Cardigliano * @flags: 56501489e5dSAlfredo Cardigliano * IRQ: Interrupt requested on completion 56601489e5dSAlfredo Cardigliano * ENA: Enable the queue. If ENA=0 the queue is initialized 56701489e5dSAlfredo Cardigliano * but remains disabled, to be later enabled with the 56801489e5dSAlfredo Cardigliano * Queue Enable command. If ENA=1, then queue is 56901489e5dSAlfredo Cardigliano * initialized and then enabled. 57001489e5dSAlfredo Cardigliano * SG: Enable Scatter-Gather on the queue. 57101489e5dSAlfredo Cardigliano * in number of descs. The actual ring size is 57201489e5dSAlfredo Cardigliano * (1 << ring_size). For example, to 57301489e5dSAlfredo Cardigliano * select a ring size of 64 descriptors write 57401489e5dSAlfredo Cardigliano * ring_size = 6. The minimum ring_size value is 2 57501489e5dSAlfredo Cardigliano * for a ring size of 4 descriptors. The maximum 57601489e5dSAlfredo Cardigliano * ring_size value is 16 for a ring size of 64k 57701489e5dSAlfredo Cardigliano * descriptors. Values of ring_size <2 and >16 are 57801489e5dSAlfredo Cardigliano * reserved. 57901489e5dSAlfredo Cardigliano * EQ: Enable the Event Queue 580126fe197SAndrew Boyer * @cos: Class of service for this queue 58101489e5dSAlfredo Cardigliano * @ring_size: Queue ring size, encoded as a log2(size) 58201489e5dSAlfredo Cardigliano * @ring_base: Queue ring base address 58301489e5dSAlfredo Cardigliano * @cq_ring_base: Completion queue ring base address 58401489e5dSAlfredo Cardigliano * @sg_ring_base: Scatter/Gather ring base address 58501489e5dSAlfredo Cardigliano */ 58601489e5dSAlfredo Cardigliano struct ionic_q_init_cmd { 58701489e5dSAlfredo Cardigliano u8 opcode; 58801489e5dSAlfredo Cardigliano u8 rsvd; 58901489e5dSAlfredo Cardigliano __le16 lif_index; 59001489e5dSAlfredo Cardigliano u8 type; 59101489e5dSAlfredo Cardigliano u8 ver; 59201489e5dSAlfredo Cardigliano u8 rsvd1[2]; 59301489e5dSAlfredo Cardigliano __le32 index; 59401489e5dSAlfredo Cardigliano __le16 pid; 59501489e5dSAlfredo Cardigliano __le16 intr_index; 59601489e5dSAlfredo Cardigliano __le16 flags; 59701489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_IRQ 0x01 /* Request interrupt on completion */ 59801489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_ENA 0x02 /* Enable the queue */ 59901489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_SG 0x04 /* Enable scatter/gather on the queue */ 60001489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_EQ 0x08 /* Enable event queue */ 601126fe197SAndrew Boyer #define IONIC_QINIT_F_CMB 0x10 /* Enable cmb-based queue */ 60201489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_DEBUG 0x80 /* Enable queue debugging */ 60301489e5dSAlfredo Cardigliano u8 cos; 60401489e5dSAlfredo Cardigliano u8 ring_size; 60501489e5dSAlfredo Cardigliano __le64 ring_base; 60601489e5dSAlfredo Cardigliano __le64 cq_ring_base; 60701489e5dSAlfredo Cardigliano __le64 sg_ring_base; 608126fe197SAndrew Boyer u8 rsvd2[20]; 609126fe197SAndrew Boyer } __rte_packed; 61001489e5dSAlfredo Cardigliano 61101489e5dSAlfredo Cardigliano /** 61201489e5dSAlfredo Cardigliano * struct ionic_q_init_comp - Queue init command completion 613126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 614126fe197SAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 61501489e5dSAlfredo Cardigliano * @hw_index: Hardware Queue ID 61601489e5dSAlfredo Cardigliano * @hw_type: Hardware Queue type 61701489e5dSAlfredo Cardigliano * @color: Color 61801489e5dSAlfredo Cardigliano */ 61901489e5dSAlfredo Cardigliano struct ionic_q_init_comp { 62001489e5dSAlfredo Cardigliano u8 status; 621126fe197SAndrew Boyer u8 rsvd; 62201489e5dSAlfredo Cardigliano __le16 comp_index; 62301489e5dSAlfredo Cardigliano __le32 hw_index; 62401489e5dSAlfredo Cardigliano u8 hw_type; 62501489e5dSAlfredo Cardigliano u8 rsvd2[6]; 62601489e5dSAlfredo Cardigliano u8 color; 62701489e5dSAlfredo Cardigliano }; 62801489e5dSAlfredo Cardigliano 62901489e5dSAlfredo Cardigliano /* the device's internal addressing uses up to 52 bits */ 63001489e5dSAlfredo Cardigliano #define IONIC_ADDR_LEN 52 63101489e5dSAlfredo Cardigliano #define IONIC_ADDR_MASK (BIT_ULL(IONIC_ADDR_LEN) - 1) 63201489e5dSAlfredo Cardigliano 63301489e5dSAlfredo Cardigliano enum ionic_txq_desc_opcode { 63401489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_OPCODE_CSUM_NONE = 0, 63501489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_OPCODE_CSUM_PARTIAL = 1, 63601489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_OPCODE_CSUM_HW = 2, 63701489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_OPCODE_TSO = 3, 63801489e5dSAlfredo Cardigliano }; 63901489e5dSAlfredo Cardigliano 64001489e5dSAlfredo Cardigliano /** 64101489e5dSAlfredo Cardigliano * struct ionic_txq_desc - Ethernet Tx queue descriptor format 642126fe197SAndrew Boyer * @cmd: Tx operation, see IONIC_TXQ_DESC_OPCODE_*: 64301489e5dSAlfredo Cardigliano * 64401489e5dSAlfredo Cardigliano * IONIC_TXQ_DESC_OPCODE_CSUM_NONE: 64501489e5dSAlfredo Cardigliano * Non-offload send. No segmentation, 64601489e5dSAlfredo Cardigliano * fragmentation or checksum calc/insertion is 64701489e5dSAlfredo Cardigliano * performed by device; packet is prepared 64801489e5dSAlfredo Cardigliano * to send by software stack and requires 64901489e5dSAlfredo Cardigliano * no further manipulation from device. 65001489e5dSAlfredo Cardigliano * 65101489e5dSAlfredo Cardigliano * IONIC_TXQ_DESC_OPCODE_CSUM_PARTIAL: 65201489e5dSAlfredo Cardigliano * Offload 16-bit L4 checksum 65301489e5dSAlfredo Cardigliano * calculation/insertion. The device will 65401489e5dSAlfredo Cardigliano * calculate the L4 checksum value and 65501489e5dSAlfredo Cardigliano * insert the result in the packet's L4 65601489e5dSAlfredo Cardigliano * header checksum field. The L4 checksum 65701489e5dSAlfredo Cardigliano * is calculated starting at @csum_start bytes 65801489e5dSAlfredo Cardigliano * into the packet to the end of the packet. 65901489e5dSAlfredo Cardigliano * The checksum insertion position is given 660126fe197SAndrew Boyer * in @csum_offset, which is the offset from 661126fe197SAndrew Boyer * @csum_start to the checksum field in the L4 662126fe197SAndrew Boyer * header. This feature is only applicable to 663126fe197SAndrew Boyer * protocols such as TCP, UDP and ICMP where a 664126fe197SAndrew Boyer * standard (i.e. the 'IP-style' checksum) 665126fe197SAndrew Boyer * one's complement 16-bit checksum is used, 666126fe197SAndrew Boyer * using an IP pseudo-header to seed the 667126fe197SAndrew Boyer * calculation. Software will preload the L4 668126fe197SAndrew Boyer * checksum field with the IP pseudo-header 669126fe197SAndrew Boyer * checksum. 67001489e5dSAlfredo Cardigliano * 67101489e5dSAlfredo Cardigliano * For tunnel encapsulation, @csum_start and 67201489e5dSAlfredo Cardigliano * @csum_offset refer to the inner L4 67301489e5dSAlfredo Cardigliano * header. Supported tunnels encapsulations 67401489e5dSAlfredo Cardigliano * are: IPIP, GRE, and UDP. If the @encap 67501489e5dSAlfredo Cardigliano * is clear, no further processing by the 67601489e5dSAlfredo Cardigliano * device is required; software will 67701489e5dSAlfredo Cardigliano * calculate the outer header checksums. If 67801489e5dSAlfredo Cardigliano * the @encap is set, the device will 67901489e5dSAlfredo Cardigliano * offload the outer header checksums using 68001489e5dSAlfredo Cardigliano * LCO (local checksum offload) (see 681126fe197SAndrew Boyer * Documentation/networking/checksum-offloads.rst 682126fe197SAndrew Boyer * for more info). 68301489e5dSAlfredo Cardigliano * 68401489e5dSAlfredo Cardigliano * IONIC_TXQ_DESC_OPCODE_CSUM_HW: 68501489e5dSAlfredo Cardigliano * Offload 16-bit checksum computation to hardware. 68601489e5dSAlfredo Cardigliano * If @csum_l3 is set then the packet's L3 checksum is 687*b53d106dSSean Morrissey * updated. Similarly, if @csum_l4 is set the L4 68801489e5dSAlfredo Cardigliano * checksum is updated. If @encap is set then encap header 68901489e5dSAlfredo Cardigliano * checksums are also updated. 69001489e5dSAlfredo Cardigliano * 69101489e5dSAlfredo Cardigliano * IONIC_TXQ_DESC_OPCODE_TSO: 69201489e5dSAlfredo Cardigliano * Device performs TCP segmentation offload 69301489e5dSAlfredo Cardigliano * (TSO). @hdr_len is the number of bytes 69401489e5dSAlfredo Cardigliano * to the end of TCP header (the offset to 69501489e5dSAlfredo Cardigliano * the TCP payload). @mss is the desired 69601489e5dSAlfredo Cardigliano * MSS, the TCP payload length for each 69701489e5dSAlfredo Cardigliano * segment. The device will calculate/ 69801489e5dSAlfredo Cardigliano * insert IP (IPv4 only) and TCP checksums 69901489e5dSAlfredo Cardigliano * for each segment. In the first data 70001489e5dSAlfredo Cardigliano * buffer containing the header template, 70101489e5dSAlfredo Cardigliano * the driver will set IPv4 checksum to 0 70201489e5dSAlfredo Cardigliano * and preload TCP checksum with the IP 70301489e5dSAlfredo Cardigliano * pseudo header calculated with IP length = 0. 70401489e5dSAlfredo Cardigliano * 70501489e5dSAlfredo Cardigliano * Supported tunnel encapsulations are IPIP, 70601489e5dSAlfredo Cardigliano * layer-3 GRE, and UDP. @hdr_len includes 70701489e5dSAlfredo Cardigliano * both outer and inner headers. The driver 70801489e5dSAlfredo Cardigliano * will set IPv4 checksum to zero and 70901489e5dSAlfredo Cardigliano * preload TCP checksum with IP pseudo 71001489e5dSAlfredo Cardigliano * header on the inner header. 71101489e5dSAlfredo Cardigliano * 71201489e5dSAlfredo Cardigliano * TCP ECN offload is supported. The device 71301489e5dSAlfredo Cardigliano * will set CWR flag in the first segment if 71401489e5dSAlfredo Cardigliano * CWR is set in the template header, and 71501489e5dSAlfredo Cardigliano * clear CWR in remaining segments. 71601489e5dSAlfredo Cardigliano * @flags: 71701489e5dSAlfredo Cardigliano * vlan: 718126fe197SAndrew Boyer * Insert an L2 VLAN header using @vlan_tci 71901489e5dSAlfredo Cardigliano * encap: 720126fe197SAndrew Boyer * Calculate encap header checksum 72101489e5dSAlfredo Cardigliano * csum_l3: 722126fe197SAndrew Boyer * Compute L3 header checksum 72301489e5dSAlfredo Cardigliano * csum_l4: 724126fe197SAndrew Boyer * Compute L4 header checksum 72501489e5dSAlfredo Cardigliano * tso_sot: 72601489e5dSAlfredo Cardigliano * TSO start 72701489e5dSAlfredo Cardigliano * tso_eot: 72801489e5dSAlfredo Cardigliano * TSO end 72901489e5dSAlfredo Cardigliano * @num_sg_elems: Number of scatter-gather elements in SG 73001489e5dSAlfredo Cardigliano * descriptor 731126fe197SAndrew Boyer * @addr: First data buffer's DMA address 732126fe197SAndrew Boyer * (Subsequent data buffers are on txq_sg_desc) 73301489e5dSAlfredo Cardigliano * @len: First data buffer's length, in bytes 73401489e5dSAlfredo Cardigliano * @vlan_tci: VLAN tag to insert in the packet (if requested 73501489e5dSAlfredo Cardigliano * by @V-bit). Includes .1p and .1q tags 73601489e5dSAlfredo Cardigliano * @hdr_len: Length of packet headers, including 737126fe197SAndrew Boyer * encapsulating outer header, if applicable 738126fe197SAndrew Boyer * Valid for opcodes IONIC_TXQ_DESC_OPCODE_CALC_CSUM and 739126fe197SAndrew Boyer * IONIC_TXQ_DESC_OPCODE_TSO. Should be set to zero for 74001489e5dSAlfredo Cardigliano * all other modes. For 741126fe197SAndrew Boyer * IONIC_TXQ_DESC_OPCODE_CALC_CSUM, @hdr_len is length 74201489e5dSAlfredo Cardigliano * of headers up to inner-most L4 header. For 743126fe197SAndrew Boyer * IONIC_TXQ_DESC_OPCODE_TSO, @hdr_len is up to 74401489e5dSAlfredo Cardigliano * inner-most L4 payload, so inclusive of 74501489e5dSAlfredo Cardigliano * inner-most L4 header. 746126fe197SAndrew Boyer * @mss: Desired MSS value for TSO; only applicable for 747126fe197SAndrew Boyer * IONIC_TXQ_DESC_OPCODE_TSO 748126fe197SAndrew Boyer * @csum_start: Offset from packet to first byte checked in L4 checksum 749126fe197SAndrew Boyer * @csum_offset: Offset from csum_start to L4 checksum field 75001489e5dSAlfredo Cardigliano */ 751126fe197SAndrew Boyer struct ionic_txq_desc { 752126fe197SAndrew Boyer __le64 cmd; 75301489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_OPCODE_MASK 0xf 75401489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_OPCODE_SHIFT 4 75501489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAGS_MASK 0xf 75601489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAGS_SHIFT 0 75701489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_NSGE_MASK 0xf 75801489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_NSGE_SHIFT 8 75901489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_ADDR_MASK (BIT_ULL(IONIC_ADDR_LEN) - 1) 76001489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_ADDR_SHIFT 12 76101489e5dSAlfredo Cardigliano 76201489e5dSAlfredo Cardigliano /* common flags */ 76301489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_VLAN 0x1 76401489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_ENCAP 0x2 76501489e5dSAlfredo Cardigliano 76601489e5dSAlfredo Cardigliano /* flags for csum_hw opcode */ 76701489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_CSUM_L3 0x4 76801489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_CSUM_L4 0x8 76901489e5dSAlfredo Cardigliano 77001489e5dSAlfredo Cardigliano /* flags for tso opcode */ 77101489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_TSO_SOT 0x4 77201489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_TSO_EOT 0x8 77301489e5dSAlfredo Cardigliano 77401489e5dSAlfredo Cardigliano __le16 len; 77501489e5dSAlfredo Cardigliano union { 77601489e5dSAlfredo Cardigliano __le16 vlan_tci; 77701489e5dSAlfredo Cardigliano __le16 hword0; 77801489e5dSAlfredo Cardigliano }; 77901489e5dSAlfredo Cardigliano union { 78001489e5dSAlfredo Cardigliano __le16 csum_start; 78101489e5dSAlfredo Cardigliano __le16 hdr_len; 78201489e5dSAlfredo Cardigliano __le16 hword1; 78301489e5dSAlfredo Cardigliano }; 78401489e5dSAlfredo Cardigliano union { 78501489e5dSAlfredo Cardigliano __le16 csum_offset; 78601489e5dSAlfredo Cardigliano __le16 mss; 78701489e5dSAlfredo Cardigliano __le16 hword2; 78801489e5dSAlfredo Cardigliano }; 78901489e5dSAlfredo Cardigliano }; 79001489e5dSAlfredo Cardigliano 79101489e5dSAlfredo Cardigliano static inline u64 encode_txq_desc_cmd(u8 opcode, u8 flags, 79201489e5dSAlfredo Cardigliano u8 nsge, u64 addr) 79301489e5dSAlfredo Cardigliano { 79401489e5dSAlfredo Cardigliano u64 cmd; 79501489e5dSAlfredo Cardigliano 79601489e5dSAlfredo Cardigliano cmd = (opcode & IONIC_TXQ_DESC_OPCODE_MASK) << 79701489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_OPCODE_SHIFT; 79801489e5dSAlfredo Cardigliano cmd |= (flags & IONIC_TXQ_DESC_FLAGS_MASK) << 79901489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_FLAGS_SHIFT; 800126fe197SAndrew Boyer cmd |= (nsge & IONIC_TXQ_DESC_NSGE_MASK) << 801126fe197SAndrew Boyer IONIC_TXQ_DESC_NSGE_SHIFT; 802126fe197SAndrew Boyer cmd |= (addr & IONIC_TXQ_DESC_ADDR_MASK) << 803126fe197SAndrew Boyer IONIC_TXQ_DESC_ADDR_SHIFT; 80401489e5dSAlfredo Cardigliano 80501489e5dSAlfredo Cardigliano return cmd; 80601489e5dSAlfredo Cardigliano }; 80701489e5dSAlfredo Cardigliano 808126fe197SAndrew Boyer static inline void 809126fe197SAndrew Boyer decode_txq_desc_cmd(u64 cmd, u8 *opcode, u8 *flags, 81001489e5dSAlfredo Cardigliano u8 *nsge, u64 *addr) 81101489e5dSAlfredo Cardigliano { 81201489e5dSAlfredo Cardigliano *opcode = (cmd >> IONIC_TXQ_DESC_OPCODE_SHIFT) & 81301489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_OPCODE_MASK; 81401489e5dSAlfredo Cardigliano *flags = (cmd >> IONIC_TXQ_DESC_FLAGS_SHIFT) & 81501489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_FLAGS_MASK; 816126fe197SAndrew Boyer *nsge = (cmd >> IONIC_TXQ_DESC_NSGE_SHIFT) & 817126fe197SAndrew Boyer IONIC_TXQ_DESC_NSGE_MASK; 818126fe197SAndrew Boyer *addr = (cmd >> IONIC_TXQ_DESC_ADDR_SHIFT) & 819126fe197SAndrew Boyer IONIC_TXQ_DESC_ADDR_MASK; 82001489e5dSAlfredo Cardigliano }; 82101489e5dSAlfredo Cardigliano 82201489e5dSAlfredo Cardigliano /** 823126fe197SAndrew Boyer * struct ionic_txq_sg_elem - Transmit scatter-gather (SG) descriptor element 82401489e5dSAlfredo Cardigliano * @addr: DMA address of SG element data buffer 82501489e5dSAlfredo Cardigliano * @len: Length of SG element data buffer, in bytes 82601489e5dSAlfredo Cardigliano */ 82701489e5dSAlfredo Cardigliano struct ionic_txq_sg_elem { 82801489e5dSAlfredo Cardigliano __le64 addr; 82901489e5dSAlfredo Cardigliano __le16 len; 83001489e5dSAlfredo Cardigliano __le16 rsvd[3]; 831126fe197SAndrew Boyer }; 832126fe197SAndrew Boyer 833126fe197SAndrew Boyer /** 834126fe197SAndrew Boyer * struct ionic_txq_sg_desc - Transmit scatter-gather (SG) list 835126fe197SAndrew Boyer * @elems: Scatter-gather elements 836126fe197SAndrew Boyer */ 837126fe197SAndrew Boyer struct ionic_txq_sg_desc { 838126fe197SAndrew Boyer #define IONIC_TX_MAX_SG_ELEMS 8 839126fe197SAndrew Boyer #define IONIC_TX_SG_DESC_STRIDE 8 840126fe197SAndrew Boyer struct ionic_txq_sg_elem elems[IONIC_TX_MAX_SG_ELEMS]; 841126fe197SAndrew Boyer }; 842126fe197SAndrew Boyer 843126fe197SAndrew Boyer struct ionic_txq_sg_desc_v1 { 844126fe197SAndrew Boyer #define IONIC_TX_MAX_SG_ELEMS_V1 15 845126fe197SAndrew Boyer #define IONIC_TX_SG_DESC_STRIDE_V1 16 846126fe197SAndrew Boyer struct ionic_txq_sg_elem elems[IONIC_TX_SG_DESC_STRIDE_V1]; 84701489e5dSAlfredo Cardigliano }; 84801489e5dSAlfredo Cardigliano 84901489e5dSAlfredo Cardigliano /** 85001489e5dSAlfredo Cardigliano * struct ionic_txq_comp - Ethernet transmit queue completion descriptor 851126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 852126fe197SAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 853126fe197SAndrew Boyer * @color: Color bit 85401489e5dSAlfredo Cardigliano */ 85501489e5dSAlfredo Cardigliano struct ionic_txq_comp { 85601489e5dSAlfredo Cardigliano u8 status; 85701489e5dSAlfredo Cardigliano u8 rsvd; 85801489e5dSAlfredo Cardigliano __le16 comp_index; 85901489e5dSAlfredo Cardigliano u8 rsvd2[11]; 86001489e5dSAlfredo Cardigliano u8 color; 86101489e5dSAlfredo Cardigliano }; 86201489e5dSAlfredo Cardigliano 86301489e5dSAlfredo Cardigliano enum ionic_rxq_desc_opcode { 86401489e5dSAlfredo Cardigliano IONIC_RXQ_DESC_OPCODE_SIMPLE = 0, 86501489e5dSAlfredo Cardigliano IONIC_RXQ_DESC_OPCODE_SG = 1, 86601489e5dSAlfredo Cardigliano }; 86701489e5dSAlfredo Cardigliano 86801489e5dSAlfredo Cardigliano /** 86901489e5dSAlfredo Cardigliano * struct ionic_rxq_desc - Ethernet Rx queue descriptor format 870126fe197SAndrew Boyer * @opcode: Rx operation, see IONIC_RXQ_DESC_OPCODE_*: 87101489e5dSAlfredo Cardigliano * 872126fe197SAndrew Boyer * IONIC_RXQ_DESC_OPCODE_SIMPLE: 87301489e5dSAlfredo Cardigliano * Receive full packet into data buffer 87401489e5dSAlfredo Cardigliano * starting at @addr. Results of 87501489e5dSAlfredo Cardigliano * receive, including actual bytes received, 87601489e5dSAlfredo Cardigliano * are recorded in Rx completion descriptor. 87701489e5dSAlfredo Cardigliano * 878126fe197SAndrew Boyer * @len: Data buffer's length, in bytes 87901489e5dSAlfredo Cardigliano * @addr: Data buffer's DMA address 88001489e5dSAlfredo Cardigliano */ 88101489e5dSAlfredo Cardigliano struct ionic_rxq_desc { 88201489e5dSAlfredo Cardigliano u8 opcode; 88301489e5dSAlfredo Cardigliano u8 rsvd[5]; 88401489e5dSAlfredo Cardigliano __le16 len; 88501489e5dSAlfredo Cardigliano __le64 addr; 88601489e5dSAlfredo Cardigliano }; 88701489e5dSAlfredo Cardigliano 88801489e5dSAlfredo Cardigliano /** 889126fe197SAndrew Boyer * struct ionic_rxq_sg_elem - Receive scatter-gather (SG) descriptor element 89001489e5dSAlfredo Cardigliano * @addr: DMA address of SG element data buffer 89101489e5dSAlfredo Cardigliano * @len: Length of SG element data buffer, in bytes 89201489e5dSAlfredo Cardigliano */ 89301489e5dSAlfredo Cardigliano struct ionic_rxq_sg_elem { 89401489e5dSAlfredo Cardigliano __le64 addr; 89501489e5dSAlfredo Cardigliano __le16 len; 89601489e5dSAlfredo Cardigliano __le16 rsvd[3]; 897126fe197SAndrew Boyer }; 898126fe197SAndrew Boyer 899126fe197SAndrew Boyer /** 900126fe197SAndrew Boyer * struct ionic_rxq_sg_desc - Receive scatter-gather (SG) list 901126fe197SAndrew Boyer * @elems: Scatter-gather elements 902126fe197SAndrew Boyer */ 903126fe197SAndrew Boyer struct ionic_rxq_sg_desc { 904126fe197SAndrew Boyer #define IONIC_RX_MAX_SG_ELEMS 8 905126fe197SAndrew Boyer #define IONIC_RX_SG_DESC_STRIDE 8 906126fe197SAndrew Boyer struct ionic_rxq_sg_elem elems[IONIC_RX_SG_DESC_STRIDE]; 90701489e5dSAlfredo Cardigliano }; 90801489e5dSAlfredo Cardigliano 90901489e5dSAlfredo Cardigliano /** 91001489e5dSAlfredo Cardigliano * struct ionic_rxq_comp - Ethernet receive queue completion descriptor 911126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 91201489e5dSAlfredo Cardigliano * @num_sg_elems: Number of SG elements used by this descriptor 913126fe197SAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 91401489e5dSAlfredo Cardigliano * @rss_hash: 32-bit RSS hash 915126fe197SAndrew Boyer * @csum: 16-bit sum of the packet's L2 payload 91601489e5dSAlfredo Cardigliano * If the packet's L2 payload is odd length, an extra 91701489e5dSAlfredo Cardigliano * zero-value byte is included in the @csum calculation but 91801489e5dSAlfredo Cardigliano * not included in @len. 91901489e5dSAlfredo Cardigliano * @vlan_tci: VLAN tag stripped from the packet. Valid if @VLAN is 92001489e5dSAlfredo Cardigliano * set. Includes .1p and .1q tags. 92101489e5dSAlfredo Cardigliano * @len: Received packet length, in bytes. Excludes FCS. 92201489e5dSAlfredo Cardigliano * @csum_calc L2 payload checksum is computed or not 923126fe197SAndrew Boyer * @csum_flags: See IONIC_RXQ_COMP_CSUM_F_*: 924126fe197SAndrew Boyer * 925126fe197SAndrew Boyer * IONIC_RXQ_COMP_CSUM_F_TCP_OK: 926126fe197SAndrew Boyer * The TCP checksum calculated by the device 92701489e5dSAlfredo Cardigliano * matched the checksum in the receive packet's 928126fe197SAndrew Boyer * TCP header. 929126fe197SAndrew Boyer * 930126fe197SAndrew Boyer * IONIC_RXQ_COMP_CSUM_F_TCP_BAD: 931126fe197SAndrew Boyer * The TCP checksum calculated by the device did 93201489e5dSAlfredo Cardigliano * not match the checksum in the receive packet's 93301489e5dSAlfredo Cardigliano * TCP header. 934126fe197SAndrew Boyer * 935126fe197SAndrew Boyer * IONIC_RXQ_COMP_CSUM_F_UDP_OK: 936126fe197SAndrew Boyer * The UDP checksum calculated by the device 93701489e5dSAlfredo Cardigliano * matched the checksum in the receive packet's 93801489e5dSAlfredo Cardigliano * UDP header 939126fe197SAndrew Boyer * 940126fe197SAndrew Boyer * IONIC_RXQ_COMP_CSUM_F_UDP_BAD: 941126fe197SAndrew Boyer * The UDP checksum calculated by the device did 94201489e5dSAlfredo Cardigliano * not match the checksum in the receive packet's 94301489e5dSAlfredo Cardigliano * UDP header. 944126fe197SAndrew Boyer * 945126fe197SAndrew Boyer * IONIC_RXQ_COMP_CSUM_F_IP_OK: 946126fe197SAndrew Boyer * The IPv4 checksum calculated by the device 94701489e5dSAlfredo Cardigliano * matched the checksum in the receive packet's 94801489e5dSAlfredo Cardigliano * first IPv4 header. If the receive packet 94901489e5dSAlfredo Cardigliano * contains both a tunnel IPv4 header and a 95001489e5dSAlfredo Cardigliano * transport IPv4 header, the device validates the 95101489e5dSAlfredo Cardigliano * checksum for the both IPv4 headers. 952126fe197SAndrew Boyer * 953126fe197SAndrew Boyer * IONIC_RXQ_COMP_CSUM_F_IP_BAD: 954126fe197SAndrew Boyer * The IPv4 checksum calculated by the device did 95501489e5dSAlfredo Cardigliano * not match the checksum in the receive packet's 95601489e5dSAlfredo Cardigliano * first IPv4 header. If the receive packet 95701489e5dSAlfredo Cardigliano * contains both a tunnel IPv4 header and a 95801489e5dSAlfredo Cardigliano * transport IPv4 header, the device validates the 95901489e5dSAlfredo Cardigliano * checksum for both IP headers. 960126fe197SAndrew Boyer * 961126fe197SAndrew Boyer * IONIC_RXQ_COMP_CSUM_F_VLAN: 962126fe197SAndrew Boyer * The VLAN header was stripped and placed in @vlan_tci. 963126fe197SAndrew Boyer * 964126fe197SAndrew Boyer * IONIC_RXQ_COMP_CSUM_F_CALC: 965126fe197SAndrew Boyer * The checksum was calculated by the device. 966126fe197SAndrew Boyer * 967126fe197SAndrew Boyer * @pkt_type_color: Packet type and color bit; see IONIC_RXQ_COMP_PKT_TYPE_MASK 96801489e5dSAlfredo Cardigliano */ 96901489e5dSAlfredo Cardigliano struct ionic_rxq_comp { 97001489e5dSAlfredo Cardigliano u8 status; 97101489e5dSAlfredo Cardigliano u8 num_sg_elems; 97201489e5dSAlfredo Cardigliano __le16 comp_index; 97301489e5dSAlfredo Cardigliano __le32 rss_hash; 97401489e5dSAlfredo Cardigliano __le16 csum; 97501489e5dSAlfredo Cardigliano __le16 vlan_tci; 97601489e5dSAlfredo Cardigliano __le16 len; 97701489e5dSAlfredo Cardigliano u8 csum_flags; 97801489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_TCP_OK 0x01 97901489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_TCP_BAD 0x02 98001489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_UDP_OK 0x04 98101489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_UDP_BAD 0x08 98201489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_IP_OK 0x10 98301489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_IP_BAD 0x20 98401489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_VLAN 0x40 98501489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_CALC 0x80 98601489e5dSAlfredo Cardigliano u8 pkt_type_color; 9876645b283SAlfredo Cardigliano #define IONIC_RXQ_COMP_PKT_TYPE_MASK 0x7f 98801489e5dSAlfredo Cardigliano }; 98901489e5dSAlfredo Cardigliano 99001489e5dSAlfredo Cardigliano enum ionic_pkt_type { 991126fe197SAndrew Boyer IONIC_PKT_TYPE_NON_IP = 0x00, 992126fe197SAndrew Boyer IONIC_PKT_TYPE_IPV4 = 0x01, 993126fe197SAndrew Boyer IONIC_PKT_TYPE_IPV4_TCP = 0x03, 994126fe197SAndrew Boyer IONIC_PKT_TYPE_IPV4_UDP = 0x05, 995126fe197SAndrew Boyer IONIC_PKT_TYPE_IPV6 = 0x08, 996126fe197SAndrew Boyer IONIC_PKT_TYPE_IPV6_TCP = 0x18, 997126fe197SAndrew Boyer IONIC_PKT_TYPE_IPV6_UDP = 0x28, 998126fe197SAndrew Boyer /* below types are only used if encap offloads are enabled on lif */ 999126fe197SAndrew Boyer IONIC_PKT_TYPE_ENCAP_NON_IP = 0x40, 1000126fe197SAndrew Boyer IONIC_PKT_TYPE_ENCAP_IPV4 = 0x41, 1001126fe197SAndrew Boyer IONIC_PKT_TYPE_ENCAP_IPV4_TCP = 0x43, 1002126fe197SAndrew Boyer IONIC_PKT_TYPE_ENCAP_IPV4_UDP = 0x45, 1003126fe197SAndrew Boyer IONIC_PKT_TYPE_ENCAP_IPV6 = 0x48, 1004126fe197SAndrew Boyer IONIC_PKT_TYPE_ENCAP_IPV6_TCP = 0x58, 1005126fe197SAndrew Boyer IONIC_PKT_TYPE_ENCAP_IPV6_UDP = 0x68, 100601489e5dSAlfredo Cardigliano }; 100701489e5dSAlfredo Cardigliano 100801489e5dSAlfredo Cardigliano enum ionic_eth_hw_features { 100901489e5dSAlfredo Cardigliano IONIC_ETH_HW_VLAN_TX_TAG = BIT(0), 101001489e5dSAlfredo Cardigliano IONIC_ETH_HW_VLAN_RX_STRIP = BIT(1), 101101489e5dSAlfredo Cardigliano IONIC_ETH_HW_VLAN_RX_FILTER = BIT(2), 101201489e5dSAlfredo Cardigliano IONIC_ETH_HW_RX_HASH = BIT(3), 101301489e5dSAlfredo Cardigliano IONIC_ETH_HW_RX_CSUM = BIT(4), 101401489e5dSAlfredo Cardigliano IONIC_ETH_HW_TX_SG = BIT(5), 101501489e5dSAlfredo Cardigliano IONIC_ETH_HW_RX_SG = BIT(6), 101601489e5dSAlfredo Cardigliano IONIC_ETH_HW_TX_CSUM = BIT(7), 101701489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO = BIT(8), 101801489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_IPV6 = BIT(9), 101901489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_ECN = BIT(10), 102001489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_GRE = BIT(11), 102101489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_GRE_CSUM = BIT(12), 102201489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_IPXIP4 = BIT(13), 102301489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_IPXIP6 = BIT(14), 102401489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_UDP = BIT(15), 102501489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_UDP_CSUM = BIT(16), 1026126fe197SAndrew Boyer IONIC_ETH_HW_RX_CSUM_GENEVE = BIT(17), 1027126fe197SAndrew Boyer IONIC_ETH_HW_TX_CSUM_GENEVE = BIT(18), 1028126fe197SAndrew Boyer IONIC_ETH_HW_TSO_GENEVE = BIT(19) 102901489e5dSAlfredo Cardigliano }; 103001489e5dSAlfredo Cardigliano 103101489e5dSAlfredo Cardigliano /** 103201489e5dSAlfredo Cardigliano * struct ionic_q_control_cmd - Queue control command 103301489e5dSAlfredo Cardigliano * @opcode: opcode 103401489e5dSAlfredo Cardigliano * @type: Queue type 103501489e5dSAlfredo Cardigliano * @lif_index: LIF index 103601489e5dSAlfredo Cardigliano * @index: Queue index 1037126fe197SAndrew Boyer * @oper: Operation (enum ionic_q_control_oper) 103801489e5dSAlfredo Cardigliano */ 103901489e5dSAlfredo Cardigliano struct ionic_q_control_cmd { 104001489e5dSAlfredo Cardigliano u8 opcode; 104101489e5dSAlfredo Cardigliano u8 type; 104201489e5dSAlfredo Cardigliano __le16 lif_index; 104301489e5dSAlfredo Cardigliano __le32 index; 104401489e5dSAlfredo Cardigliano u8 oper; 104501489e5dSAlfredo Cardigliano u8 rsvd[55]; 104601489e5dSAlfredo Cardigliano }; 104701489e5dSAlfredo Cardigliano 104801489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_q_control_comp; 104901489e5dSAlfredo Cardigliano 1050126fe197SAndrew Boyer enum ionic_q_control_oper { 105101489e5dSAlfredo Cardigliano IONIC_Q_DISABLE = 0, 105201489e5dSAlfredo Cardigliano IONIC_Q_ENABLE = 1, 105301489e5dSAlfredo Cardigliano IONIC_Q_HANG_RESET = 2, 105401489e5dSAlfredo Cardigliano }; 105501489e5dSAlfredo Cardigliano 105601489e5dSAlfredo Cardigliano /** 1057126fe197SAndrew Boyer * enum ionic_phy_type - Physical connection type 1058126fe197SAndrew Boyer * @IONIC_PHY_TYPE_NONE: No PHY installed 1059126fe197SAndrew Boyer * @IONIC_PHY_TYPE_COPPER: Copper PHY 1060126fe197SAndrew Boyer * @IONIC_PHY_TYPE_FIBER: Fiber PHY 106101489e5dSAlfredo Cardigliano */ 106201489e5dSAlfredo Cardigliano enum ionic_phy_type { 106301489e5dSAlfredo Cardigliano IONIC_PHY_TYPE_NONE = 0, 106401489e5dSAlfredo Cardigliano IONIC_PHY_TYPE_COPPER = 1, 106501489e5dSAlfredo Cardigliano IONIC_PHY_TYPE_FIBER = 2, 106601489e5dSAlfredo Cardigliano }; 106701489e5dSAlfredo Cardigliano 106801489e5dSAlfredo Cardigliano /** 1069126fe197SAndrew Boyer * enum ionic_xcvr_state - Transceiver status 1070126fe197SAndrew Boyer * @IONIC_XCVR_STATE_REMOVED: Transceiver removed 1071126fe197SAndrew Boyer * @IONIC_XCVR_STATE_INSERTED: Transceiver inserted 1072126fe197SAndrew Boyer * @IONIC_XCVR_STATE_PENDING: Transceiver pending 1073126fe197SAndrew Boyer * @IONIC_XCVR_STATE_SPROM_READ: Transceiver data read 1074126fe197SAndrew Boyer * @IONIC_XCVR_STATE_SPROM_READ_ERR: Transceiver data read error 107501489e5dSAlfredo Cardigliano */ 107601489e5dSAlfredo Cardigliano enum ionic_xcvr_state { 107701489e5dSAlfredo Cardigliano IONIC_XCVR_STATE_REMOVED = 0, 107801489e5dSAlfredo Cardigliano IONIC_XCVR_STATE_INSERTED = 1, 107901489e5dSAlfredo Cardigliano IONIC_XCVR_STATE_PENDING = 2, 108001489e5dSAlfredo Cardigliano IONIC_XCVR_STATE_SPROM_READ = 3, 108101489e5dSAlfredo Cardigliano IONIC_XCVR_STATE_SPROM_READ_ERR = 4, 108201489e5dSAlfredo Cardigliano }; 108301489e5dSAlfredo Cardigliano 108401489e5dSAlfredo Cardigliano /** 1085126fe197SAndrew Boyer * enum ionic_xcvr_pid - Supported link modes 108601489e5dSAlfredo Cardigliano */ 108701489e5dSAlfredo Cardigliano enum ionic_xcvr_pid { 108801489e5dSAlfredo Cardigliano IONIC_XCVR_PID_UNKNOWN = 0, 108901489e5dSAlfredo Cardigliano 109001489e5dSAlfredo Cardigliano /* CU */ 109101489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_CR4 = 1, 109201489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_40GBASE_CR4 = 2, 109301489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_25GBASE_CR_S = 3, 109401489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_25GBASE_CR_L = 4, 109501489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_25GBASE_CR_N = 5, 109601489e5dSAlfredo Cardigliano 109701489e5dSAlfredo Cardigliano /* Fiber */ 109801489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_AOC = 50, 109901489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_ACC = 51, 110001489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_SR4 = 52, 110101489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_LR4 = 53, 110201489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_ER4 = 54, 110301489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_40GBASE_ER4 = 55, 110401489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_40GBASE_SR4 = 56, 110501489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_40GBASE_LR4 = 57, 110601489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_40GBASE_AOC = 58, 110701489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_25GBASE_SR = 59, 110801489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_25GBASE_LR = 60, 110901489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_25GBASE_ER = 61, 111001489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_25GBASE_AOC = 62, 111101489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_10GBASE_SR = 63, 111201489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_10GBASE_LR = 64, 111301489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_10GBASE_LRM = 65, 111401489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_10GBASE_ER = 66, 111501489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_10GBASE_AOC = 67, 111601489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_10GBASE_CU = 68, 111701489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_CWDM4 = 69, 111801489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_PSM4 = 70, 1119126fe197SAndrew Boyer IONIC_XCVR_PID_SFP_25GBASE_ACC = 71, 112001489e5dSAlfredo Cardigliano }; 112101489e5dSAlfredo Cardigliano 112201489e5dSAlfredo Cardigliano /** 1123126fe197SAndrew Boyer * enum ionic_port_admin_state - Port config state 1124126fe197SAndrew Boyer * @IONIC_PORT_ADMIN_STATE_NONE: Port admin state not configured 1125126fe197SAndrew Boyer * @IONIC_PORT_ADMIN_STATE_DOWN: Port admin disabled 1126126fe197SAndrew Boyer * @IONIC_PORT_ADMIN_STATE_UP: Port admin enabled 112701489e5dSAlfredo Cardigliano */ 112801489e5dSAlfredo Cardigliano enum ionic_port_admin_state { 1129126fe197SAndrew Boyer IONIC_PORT_ADMIN_STATE_NONE = 0, 1130126fe197SAndrew Boyer IONIC_PORT_ADMIN_STATE_DOWN = 1, 1131126fe197SAndrew Boyer IONIC_PORT_ADMIN_STATE_UP = 2, 113201489e5dSAlfredo Cardigliano }; 113301489e5dSAlfredo Cardigliano 113401489e5dSAlfredo Cardigliano /** 1135126fe197SAndrew Boyer * enum ionic_port_oper_status - Port operational status 1136126fe197SAndrew Boyer * @IONIC_PORT_OPER_STATUS_NONE: Port disabled 1137126fe197SAndrew Boyer * @IONIC_PORT_OPER_STATUS_UP: Port link status up 1138126fe197SAndrew Boyer * @IONIC_PORT_OPER_STATUS_DOWN: Port link status down 113901489e5dSAlfredo Cardigliano */ 114001489e5dSAlfredo Cardigliano enum ionic_port_oper_status { 1141126fe197SAndrew Boyer IONIC_PORT_OPER_STATUS_NONE = 0, 1142126fe197SAndrew Boyer IONIC_PORT_OPER_STATUS_UP = 1, 1143126fe197SAndrew Boyer IONIC_PORT_OPER_STATUS_DOWN = 2, 114401489e5dSAlfredo Cardigliano }; 114501489e5dSAlfredo Cardigliano 114601489e5dSAlfredo Cardigliano /** 1147126fe197SAndrew Boyer * enum ionic_port_fec_type - Ethernet Forward error correction (FEC) modes 1148126fe197SAndrew Boyer * @IONIC_PORT_FEC_TYPE_NONE: FEC Disabled 1149126fe197SAndrew Boyer * @IONIC_PORT_FEC_TYPE_FC: FireCode FEC 1150126fe197SAndrew Boyer * @IONIC_PORT_FEC_TYPE_RS: ReedSolomon FEC 115101489e5dSAlfredo Cardigliano */ 115201489e5dSAlfredo Cardigliano enum ionic_port_fec_type { 1153126fe197SAndrew Boyer IONIC_PORT_FEC_TYPE_NONE = 0, 1154126fe197SAndrew Boyer IONIC_PORT_FEC_TYPE_FC = 1, 1155126fe197SAndrew Boyer IONIC_PORT_FEC_TYPE_RS = 2, 115601489e5dSAlfredo Cardigliano }; 115701489e5dSAlfredo Cardigliano 115801489e5dSAlfredo Cardigliano /** 1159126fe197SAndrew Boyer * enum ionic_port_pause_type - Ethernet pause (flow control) modes 1160126fe197SAndrew Boyer * @IONIC_PORT_PAUSE_TYPE_NONE: Disable Pause 1161126fe197SAndrew Boyer * @IONIC_PORT_PAUSE_TYPE_LINK: Link level pause 1162126fe197SAndrew Boyer * @IONIC_PORT_PAUSE_TYPE_PFC: Priority-Flow Control 116301489e5dSAlfredo Cardigliano */ 116401489e5dSAlfredo Cardigliano enum ionic_port_pause_type { 1165126fe197SAndrew Boyer IONIC_PORT_PAUSE_TYPE_NONE = 0, 1166126fe197SAndrew Boyer IONIC_PORT_PAUSE_TYPE_LINK = 1, 1167126fe197SAndrew Boyer IONIC_PORT_PAUSE_TYPE_PFC = 2, 116801489e5dSAlfredo Cardigliano }; 116901489e5dSAlfredo Cardigliano 117001489e5dSAlfredo Cardigliano /** 1171126fe197SAndrew Boyer * enum ionic_port_loopback_mode - Loopback modes 1172126fe197SAndrew Boyer * @IONIC_PORT_LOOPBACK_MODE_NONE: Disable loopback 1173126fe197SAndrew Boyer * @IONIC_PORT_LOOPBACK_MODE_MAC: MAC loopback 1174126fe197SAndrew Boyer * @IONIC_PORT_LOOPBACK_MODE_PHY: PHY/SerDes loopback 117501489e5dSAlfredo Cardigliano */ 117601489e5dSAlfredo Cardigliano enum ionic_port_loopback_mode { 1177126fe197SAndrew Boyer IONIC_PORT_LOOPBACK_MODE_NONE = 0, 1178126fe197SAndrew Boyer IONIC_PORT_LOOPBACK_MODE_MAC = 1, 1179126fe197SAndrew Boyer IONIC_PORT_LOOPBACK_MODE_PHY = 2, 118001489e5dSAlfredo Cardigliano }; 118101489e5dSAlfredo Cardigliano 118201489e5dSAlfredo Cardigliano /** 1183126fe197SAndrew Boyer * struct ionic_xcvr_status - Transceiver Status information 118401489e5dSAlfredo Cardigliano * @state: Transceiver status (enum ionic_xcvr_state) 118501489e5dSAlfredo Cardigliano * @phy: Physical connection type (enum ionic_phy_type) 1186126fe197SAndrew Boyer * @pid: Transceiver link mode (enum ionic_xcvr_pid) 118701489e5dSAlfredo Cardigliano * @sprom: Transceiver sprom contents 118801489e5dSAlfredo Cardigliano */ 118901489e5dSAlfredo Cardigliano struct ionic_xcvr_status { 119001489e5dSAlfredo Cardigliano u8 state; 119101489e5dSAlfredo Cardigliano u8 phy; 119201489e5dSAlfredo Cardigliano __le16 pid; 119301489e5dSAlfredo Cardigliano u8 sprom[256]; 119401489e5dSAlfredo Cardigliano }; 119501489e5dSAlfredo Cardigliano 119601489e5dSAlfredo Cardigliano /** 1197126fe197SAndrew Boyer * union ionic_port_config - Port configuration 119801489e5dSAlfredo Cardigliano * @speed: port speed (in Mbps) 119901489e5dSAlfredo Cardigliano * @mtu: mtu 1200126fe197SAndrew Boyer * @state: port admin state (enum ionic_port_admin_state) 120101489e5dSAlfredo Cardigliano * @an_enable: autoneg enable 120201489e5dSAlfredo Cardigliano * @fec_type: fec type (enum ionic_port_fec_type) 120301489e5dSAlfredo Cardigliano * @pause_type: pause type (enum ionic_port_pause_type) 120401489e5dSAlfredo Cardigliano * @loopback_mode: loopback mode (enum ionic_port_loopback_mode) 120501489e5dSAlfredo Cardigliano */ 120601489e5dSAlfredo Cardigliano union ionic_port_config { 120701489e5dSAlfredo Cardigliano struct { 120801489e5dSAlfredo Cardigliano #define IONIC_SPEED_100G 100000 /* 100G in Mbps */ 120901489e5dSAlfredo Cardigliano #define IONIC_SPEED_50G 50000 /* 50G in Mbps */ 121001489e5dSAlfredo Cardigliano #define IONIC_SPEED_40G 40000 /* 40G in Mbps */ 121101489e5dSAlfredo Cardigliano #define IONIC_SPEED_25G 25000 /* 25G in Mbps */ 121201489e5dSAlfredo Cardigliano #define IONIC_SPEED_10G 10000 /* 10G in Mbps */ 121301489e5dSAlfredo Cardigliano #define IONIC_SPEED_1G 1000 /* 1G in Mbps */ 121401489e5dSAlfredo Cardigliano __le32 speed; 121501489e5dSAlfredo Cardigliano __le32 mtu; 121601489e5dSAlfredo Cardigliano u8 state; 121701489e5dSAlfredo Cardigliano u8 an_enable; 121801489e5dSAlfredo Cardigliano u8 fec_type; 121901489e5dSAlfredo Cardigliano #define IONIC_PAUSE_TYPE_MASK 0x0f 122001489e5dSAlfredo Cardigliano #define IONIC_PAUSE_FLAGS_MASK 0xf0 122101489e5dSAlfredo Cardigliano #define IONIC_PAUSE_F_TX 0x10 122201489e5dSAlfredo Cardigliano #define IONIC_PAUSE_F_RX 0x20 122301489e5dSAlfredo Cardigliano u8 pause_type; 122401489e5dSAlfredo Cardigliano u8 loopback_mode; 122501489e5dSAlfredo Cardigliano }; 122601489e5dSAlfredo Cardigliano __le32 words[64]; 122701489e5dSAlfredo Cardigliano }; 122801489e5dSAlfredo Cardigliano 122901489e5dSAlfredo Cardigliano /** 1230126fe197SAndrew Boyer * struct ionic_port_status - Port Status information 123101489e5dSAlfredo Cardigliano * @status: link status (enum ionic_port_oper_status) 123201489e5dSAlfredo Cardigliano * @id: port id 123301489e5dSAlfredo Cardigliano * @speed: link speed (in Mbps) 1234126fe197SAndrew Boyer * @link_down_count: number of times link went from up to down 1235126fe197SAndrew Boyer * @fec_type: fec type (enum ionic_port_fec_type) 123601489e5dSAlfredo Cardigliano * @xcvr: transceiver status 123701489e5dSAlfredo Cardigliano */ 123801489e5dSAlfredo Cardigliano struct ionic_port_status { 123901489e5dSAlfredo Cardigliano __le32 id; 124001489e5dSAlfredo Cardigliano __le32 speed; 124101489e5dSAlfredo Cardigliano u8 status; 1242126fe197SAndrew Boyer __le16 link_down_count; 1243126fe197SAndrew Boyer u8 fec_type; 1244126fe197SAndrew Boyer u8 rsvd[48]; 124501489e5dSAlfredo Cardigliano struct ionic_xcvr_status xcvr; 1246126fe197SAndrew Boyer } __rte_packed; 124701489e5dSAlfredo Cardigliano 124801489e5dSAlfredo Cardigliano /** 124901489e5dSAlfredo Cardigliano * struct ionic_port_identify_cmd - Port identify command 125001489e5dSAlfredo Cardigliano * @opcode: opcode 125101489e5dSAlfredo Cardigliano * @index: port index 125201489e5dSAlfredo Cardigliano * @ver: Highest version of identify supported by driver 125301489e5dSAlfredo Cardigliano */ 125401489e5dSAlfredo Cardigliano struct ionic_port_identify_cmd { 125501489e5dSAlfredo Cardigliano u8 opcode; 125601489e5dSAlfredo Cardigliano u8 index; 125701489e5dSAlfredo Cardigliano u8 ver; 125801489e5dSAlfredo Cardigliano u8 rsvd[61]; 125901489e5dSAlfredo Cardigliano }; 126001489e5dSAlfredo Cardigliano 126101489e5dSAlfredo Cardigliano /** 126201489e5dSAlfredo Cardigliano * struct ionic_port_identify_comp - Port identify command completion 1263126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 126401489e5dSAlfredo Cardigliano * @ver: Version of identify returned by device 126501489e5dSAlfredo Cardigliano */ 126601489e5dSAlfredo Cardigliano struct ionic_port_identify_comp { 126701489e5dSAlfredo Cardigliano u8 status; 126801489e5dSAlfredo Cardigliano u8 ver; 126901489e5dSAlfredo Cardigliano u8 rsvd[14]; 127001489e5dSAlfredo Cardigliano }; 127101489e5dSAlfredo Cardigliano 127201489e5dSAlfredo Cardigliano /** 127301489e5dSAlfredo Cardigliano * struct ionic_port_init_cmd - Port initialization command 127401489e5dSAlfredo Cardigliano * @opcode: opcode 127501489e5dSAlfredo Cardigliano * @index: port index 127601489e5dSAlfredo Cardigliano * @info_pa: destination address for port info (struct ionic_port_info) 127701489e5dSAlfredo Cardigliano */ 127801489e5dSAlfredo Cardigliano struct ionic_port_init_cmd { 127901489e5dSAlfredo Cardigliano u8 opcode; 128001489e5dSAlfredo Cardigliano u8 index; 128101489e5dSAlfredo Cardigliano u8 rsvd[6]; 128201489e5dSAlfredo Cardigliano __le64 info_pa; 128301489e5dSAlfredo Cardigliano u8 rsvd2[48]; 128401489e5dSAlfredo Cardigliano }; 128501489e5dSAlfredo Cardigliano 128601489e5dSAlfredo Cardigliano /** 128701489e5dSAlfredo Cardigliano * struct ionic_port_init_comp - Port initialization command completion 1288126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 128901489e5dSAlfredo Cardigliano */ 129001489e5dSAlfredo Cardigliano struct ionic_port_init_comp { 129101489e5dSAlfredo Cardigliano u8 status; 129201489e5dSAlfredo Cardigliano u8 rsvd[15]; 129301489e5dSAlfredo Cardigliano }; 129401489e5dSAlfredo Cardigliano 129501489e5dSAlfredo Cardigliano /** 129601489e5dSAlfredo Cardigliano * struct ionic_port_reset_cmd - Port reset command 129701489e5dSAlfredo Cardigliano * @opcode: opcode 129801489e5dSAlfredo Cardigliano * @index: port index 129901489e5dSAlfredo Cardigliano */ 130001489e5dSAlfredo Cardigliano struct ionic_port_reset_cmd { 130101489e5dSAlfredo Cardigliano u8 opcode; 130201489e5dSAlfredo Cardigliano u8 index; 130301489e5dSAlfredo Cardigliano u8 rsvd[62]; 130401489e5dSAlfredo Cardigliano }; 130501489e5dSAlfredo Cardigliano 130601489e5dSAlfredo Cardigliano /** 130701489e5dSAlfredo Cardigliano * struct ionic_port_reset_comp - Port reset command completion 1308126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 130901489e5dSAlfredo Cardigliano */ 131001489e5dSAlfredo Cardigliano struct ionic_port_reset_comp { 131101489e5dSAlfredo Cardigliano u8 status; 131201489e5dSAlfredo Cardigliano u8 rsvd[15]; 131301489e5dSAlfredo Cardigliano }; 131401489e5dSAlfredo Cardigliano 131501489e5dSAlfredo Cardigliano /** 1316126fe197SAndrew Boyer * enum ionic_stats_ctl_cmd - List of commands for stats control 1317126fe197SAndrew Boyer * @IONIC_STATS_CTL_RESET: Reset statistics 131801489e5dSAlfredo Cardigliano */ 131901489e5dSAlfredo Cardigliano enum ionic_stats_ctl_cmd { 132001489e5dSAlfredo Cardigliano IONIC_STATS_CTL_RESET = 0, 132101489e5dSAlfredo Cardigliano }; 132201489e5dSAlfredo Cardigliano 132301489e5dSAlfredo Cardigliano /** 132401489e5dSAlfredo Cardigliano * enum ionic_port_attr - List of device attributes 1325126fe197SAndrew Boyer * @IONIC_PORT_ATTR_STATE: Port state attribute 1326126fe197SAndrew Boyer * @IONIC_PORT_ATTR_SPEED: Port speed attribute 1327126fe197SAndrew Boyer * @IONIC_PORT_ATTR_MTU: Port MTU attribute 1328126fe197SAndrew Boyer * @IONIC_PORT_ATTR_AUTONEG: Port autonegotiation attribute 1329126fe197SAndrew Boyer * @IONIC_PORT_ATTR_FEC: Port FEC attribute 1330126fe197SAndrew Boyer * @IONIC_PORT_ATTR_PAUSE: Port pause attribute 1331126fe197SAndrew Boyer * @IONIC_PORT_ATTR_LOOPBACK: Port loopback attribute 1332126fe197SAndrew Boyer * @IONIC_PORT_ATTR_STATS_CTRL: Port statistics control attribute 133301489e5dSAlfredo Cardigliano */ 133401489e5dSAlfredo Cardigliano enum ionic_port_attr { 133501489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_STATE = 0, 133601489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_SPEED = 1, 133701489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_MTU = 2, 133801489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_AUTONEG = 3, 133901489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_FEC = 4, 134001489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_PAUSE = 5, 134101489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_LOOPBACK = 6, 134201489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_STATS_CTRL = 7, 134301489e5dSAlfredo Cardigliano }; 134401489e5dSAlfredo Cardigliano 134501489e5dSAlfredo Cardigliano /** 134601489e5dSAlfredo Cardigliano * struct ionic_port_setattr_cmd - Set port attributes on the NIC 134701489e5dSAlfredo Cardigliano * @opcode: Opcode 1348126fe197SAndrew Boyer * @index: Port index 134901489e5dSAlfredo Cardigliano * @attr: Attribute type (enum ionic_port_attr) 1350126fe197SAndrew Boyer * @state: Port state 1351126fe197SAndrew Boyer * @speed: Port speed 1352126fe197SAndrew Boyer * @mtu: Port MTU 1353126fe197SAndrew Boyer * @an_enable: Port autonegotiation setting 1354126fe197SAndrew Boyer * @fec_type: Port FEC type setting 1355126fe197SAndrew Boyer * @pause_type: Port pause type setting 1356126fe197SAndrew Boyer * @loopback_mode: Port loopback mode 1357126fe197SAndrew Boyer * @stats_ctl: Port stats setting 135801489e5dSAlfredo Cardigliano */ 135901489e5dSAlfredo Cardigliano struct ionic_port_setattr_cmd { 136001489e5dSAlfredo Cardigliano u8 opcode; 136101489e5dSAlfredo Cardigliano u8 index; 136201489e5dSAlfredo Cardigliano u8 attr; 136301489e5dSAlfredo Cardigliano u8 rsvd; 136401489e5dSAlfredo Cardigliano union { 136501489e5dSAlfredo Cardigliano u8 state; 136601489e5dSAlfredo Cardigliano __le32 speed; 136701489e5dSAlfredo Cardigliano __le32 mtu; 136801489e5dSAlfredo Cardigliano u8 an_enable; 136901489e5dSAlfredo Cardigliano u8 fec_type; 137001489e5dSAlfredo Cardigliano u8 pause_type; 137101489e5dSAlfredo Cardigliano u8 loopback_mode; 137201489e5dSAlfredo Cardigliano u8 stats_ctl; 137301489e5dSAlfredo Cardigliano u8 rsvd2[60]; 137401489e5dSAlfredo Cardigliano }; 137501489e5dSAlfredo Cardigliano }; 137601489e5dSAlfredo Cardigliano 137701489e5dSAlfredo Cardigliano /** 137801489e5dSAlfredo Cardigliano * struct ionic_port_setattr_comp - Port set attr command completion 1379126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 138001489e5dSAlfredo Cardigliano * @color: Color bit 138101489e5dSAlfredo Cardigliano */ 138201489e5dSAlfredo Cardigliano struct ionic_port_setattr_comp { 138301489e5dSAlfredo Cardigliano u8 status; 138401489e5dSAlfredo Cardigliano u8 rsvd[14]; 138501489e5dSAlfredo Cardigliano u8 color; 138601489e5dSAlfredo Cardigliano }; 138701489e5dSAlfredo Cardigliano 138801489e5dSAlfredo Cardigliano /** 138901489e5dSAlfredo Cardigliano * struct ionic_port_getattr_cmd - Get port attributes from the NIC 139001489e5dSAlfredo Cardigliano * @opcode: Opcode 139101489e5dSAlfredo Cardigliano * @index: port index 139201489e5dSAlfredo Cardigliano * @attr: Attribute type (enum ionic_port_attr) 139301489e5dSAlfredo Cardigliano */ 139401489e5dSAlfredo Cardigliano struct ionic_port_getattr_cmd { 139501489e5dSAlfredo Cardigliano u8 opcode; 139601489e5dSAlfredo Cardigliano u8 index; 139701489e5dSAlfredo Cardigliano u8 attr; 139801489e5dSAlfredo Cardigliano u8 rsvd[61]; 139901489e5dSAlfredo Cardigliano }; 140001489e5dSAlfredo Cardigliano 140101489e5dSAlfredo Cardigliano /** 140201489e5dSAlfredo Cardigliano * struct ionic_port_getattr_comp - Port get attr command completion 1403126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 1404126fe197SAndrew Boyer * @state: Port state 1405126fe197SAndrew Boyer * @speed: Port speed 1406126fe197SAndrew Boyer * @mtu: Port MTU 1407126fe197SAndrew Boyer * @an_enable: Port autonegotiation setting 1408126fe197SAndrew Boyer * @fec_type: Port FEC type setting 1409126fe197SAndrew Boyer * @pause_type: Port pause type setting 1410126fe197SAndrew Boyer * @loopback_mode: Port loopback mode 141101489e5dSAlfredo Cardigliano * @color: Color bit 141201489e5dSAlfredo Cardigliano */ 141301489e5dSAlfredo Cardigliano struct ionic_port_getattr_comp { 141401489e5dSAlfredo Cardigliano u8 status; 141501489e5dSAlfredo Cardigliano u8 rsvd[3]; 141601489e5dSAlfredo Cardigliano union { 141701489e5dSAlfredo Cardigliano u8 state; 141801489e5dSAlfredo Cardigliano __le32 speed; 141901489e5dSAlfredo Cardigliano __le32 mtu; 142001489e5dSAlfredo Cardigliano u8 an_enable; 142101489e5dSAlfredo Cardigliano u8 fec_type; 142201489e5dSAlfredo Cardigliano u8 pause_type; 142301489e5dSAlfredo Cardigliano u8 loopback_mode; 142401489e5dSAlfredo Cardigliano u8 rsvd2[11]; 1425126fe197SAndrew Boyer } __rte_packed; 142601489e5dSAlfredo Cardigliano u8 color; 142701489e5dSAlfredo Cardigliano }; 142801489e5dSAlfredo Cardigliano 142901489e5dSAlfredo Cardigliano /** 1430126fe197SAndrew Boyer * struct ionic_lif_status - LIF status register 143101489e5dSAlfredo Cardigliano * @eid: most recent NotifyQ event id 1432126fe197SAndrew Boyer * @port_num: port the LIF is connected to 143301489e5dSAlfredo Cardigliano * @link_status: port status (enum ionic_port_oper_status) 143401489e5dSAlfredo Cardigliano * @link_speed: speed of link in Mbps 1435126fe197SAndrew Boyer * @link_down_count: number of times link went from up to down 143601489e5dSAlfredo Cardigliano */ 143701489e5dSAlfredo Cardigliano struct ionic_lif_status { 143801489e5dSAlfredo Cardigliano __le64 eid; 143901489e5dSAlfredo Cardigliano u8 port_num; 144001489e5dSAlfredo Cardigliano u8 rsvd; 144101489e5dSAlfredo Cardigliano __le16 link_status; 144201489e5dSAlfredo Cardigliano __le32 link_speed; /* units of 1Mbps: eg 10000 = 10Gbps */ 144301489e5dSAlfredo Cardigliano __le16 link_down_count; 144401489e5dSAlfredo Cardigliano u8 rsvd2[46]; 144501489e5dSAlfredo Cardigliano }; 144601489e5dSAlfredo Cardigliano 144701489e5dSAlfredo Cardigliano /** 144801489e5dSAlfredo Cardigliano * struct ionic_lif_reset_cmd - LIF reset command 144901489e5dSAlfredo Cardigliano * @opcode: opcode 145001489e5dSAlfredo Cardigliano * @index: LIF index 145101489e5dSAlfredo Cardigliano */ 145201489e5dSAlfredo Cardigliano struct ionic_lif_reset_cmd { 145301489e5dSAlfredo Cardigliano u8 opcode; 145401489e5dSAlfredo Cardigliano u8 rsvd; 145501489e5dSAlfredo Cardigliano __le16 index; 145601489e5dSAlfredo Cardigliano __le32 rsvd2[15]; 145701489e5dSAlfredo Cardigliano }; 145801489e5dSAlfredo Cardigliano 145901489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_lif_reset_comp; 146001489e5dSAlfredo Cardigliano 146101489e5dSAlfredo Cardigliano enum ionic_dev_state { 146201489e5dSAlfredo Cardigliano IONIC_DEV_DISABLE = 0, 146301489e5dSAlfredo Cardigliano IONIC_DEV_ENABLE = 1, 146401489e5dSAlfredo Cardigliano IONIC_DEV_HANG_RESET = 2, 146501489e5dSAlfredo Cardigliano }; 146601489e5dSAlfredo Cardigliano 146701489e5dSAlfredo Cardigliano /** 146801489e5dSAlfredo Cardigliano * enum ionic_dev_attr - List of device attributes 1469126fe197SAndrew Boyer * @IONIC_DEV_ATTR_STATE: Device state attribute 1470126fe197SAndrew Boyer * @IONIC_DEV_ATTR_NAME: Device name attribute 1471126fe197SAndrew Boyer * @IONIC_DEV_ATTR_FEATURES: Device feature attributes 147201489e5dSAlfredo Cardigliano */ 147301489e5dSAlfredo Cardigliano enum ionic_dev_attr { 147401489e5dSAlfredo Cardigliano IONIC_DEV_ATTR_STATE = 0, 147501489e5dSAlfredo Cardigliano IONIC_DEV_ATTR_NAME = 1, 147601489e5dSAlfredo Cardigliano IONIC_DEV_ATTR_FEATURES = 2, 147701489e5dSAlfredo Cardigliano }; 147801489e5dSAlfredo Cardigliano 147901489e5dSAlfredo Cardigliano /** 148001489e5dSAlfredo Cardigliano * struct ionic_dev_setattr_cmd - Set Device attributes on the NIC 148101489e5dSAlfredo Cardigliano * @opcode: Opcode 148201489e5dSAlfredo Cardigliano * @attr: Attribute type (enum ionic_dev_attr) 148301489e5dSAlfredo Cardigliano * @state: Device state (enum ionic_dev_state) 148401489e5dSAlfredo Cardigliano * @name: The bus info, e.g. PCI slot-device-function, 0 terminated 148501489e5dSAlfredo Cardigliano * @features: Device features 148601489e5dSAlfredo Cardigliano */ 148701489e5dSAlfredo Cardigliano struct ionic_dev_setattr_cmd { 148801489e5dSAlfredo Cardigliano u8 opcode; 148901489e5dSAlfredo Cardigliano u8 attr; 149001489e5dSAlfredo Cardigliano __le16 rsvd; 149101489e5dSAlfredo Cardigliano union { 149201489e5dSAlfredo Cardigliano u8 state; 149301489e5dSAlfredo Cardigliano char name[IONIC_IFNAMSIZ]; 149401489e5dSAlfredo Cardigliano __le64 features; 149501489e5dSAlfredo Cardigliano u8 rsvd2[60]; 1496126fe197SAndrew Boyer } __rte_packed; 149701489e5dSAlfredo Cardigliano }; 149801489e5dSAlfredo Cardigliano 149901489e5dSAlfredo Cardigliano /** 150001489e5dSAlfredo Cardigliano * struct ionic_dev_setattr_comp - Device set attr command completion 1501126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 150201489e5dSAlfredo Cardigliano * @features: Device features 150301489e5dSAlfredo Cardigliano * @color: Color bit 150401489e5dSAlfredo Cardigliano */ 150501489e5dSAlfredo Cardigliano struct ionic_dev_setattr_comp { 150601489e5dSAlfredo Cardigliano u8 status; 150701489e5dSAlfredo Cardigliano u8 rsvd[3]; 150801489e5dSAlfredo Cardigliano union { 150901489e5dSAlfredo Cardigliano __le64 features; 151001489e5dSAlfredo Cardigliano u8 rsvd2[11]; 1511126fe197SAndrew Boyer } __rte_packed; 151201489e5dSAlfredo Cardigliano u8 color; 151301489e5dSAlfredo Cardigliano }; 151401489e5dSAlfredo Cardigliano 151501489e5dSAlfredo Cardigliano /** 151601489e5dSAlfredo Cardigliano * struct ionic_dev_getattr_cmd - Get Device attributes from the NIC 151701489e5dSAlfredo Cardigliano * @opcode: opcode 151801489e5dSAlfredo Cardigliano * @attr: Attribute type (enum ionic_dev_attr) 151901489e5dSAlfredo Cardigliano */ 152001489e5dSAlfredo Cardigliano struct ionic_dev_getattr_cmd { 152101489e5dSAlfredo Cardigliano u8 opcode; 152201489e5dSAlfredo Cardigliano u8 attr; 152301489e5dSAlfredo Cardigliano u8 rsvd[62]; 152401489e5dSAlfredo Cardigliano }; 152501489e5dSAlfredo Cardigliano 152601489e5dSAlfredo Cardigliano /** 152701489e5dSAlfredo Cardigliano * struct ionic_dev_setattr_comp - Device set attr command completion 1528126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 152901489e5dSAlfredo Cardigliano * @features: Device features 153001489e5dSAlfredo Cardigliano * @color: Color bit 153101489e5dSAlfredo Cardigliano */ 153201489e5dSAlfredo Cardigliano struct ionic_dev_getattr_comp { 153301489e5dSAlfredo Cardigliano u8 status; 153401489e5dSAlfredo Cardigliano u8 rsvd[3]; 153501489e5dSAlfredo Cardigliano union { 153601489e5dSAlfredo Cardigliano __le64 features; 153701489e5dSAlfredo Cardigliano u8 rsvd2[11]; 1538126fe197SAndrew Boyer } __rte_packed; 153901489e5dSAlfredo Cardigliano u8 color; 154001489e5dSAlfredo Cardigliano }; 154101489e5dSAlfredo Cardigliano 154201489e5dSAlfredo Cardigliano /** 154301489e5dSAlfredo Cardigliano * RSS parameters 154401489e5dSAlfredo Cardigliano */ 154501489e5dSAlfredo Cardigliano #define IONIC_RSS_HASH_KEY_SIZE 40 154601489e5dSAlfredo Cardigliano 154701489e5dSAlfredo Cardigliano enum ionic_rss_hash_types { 154801489e5dSAlfredo Cardigliano IONIC_RSS_TYPE_IPV4 = BIT(0), 154901489e5dSAlfredo Cardigliano IONIC_RSS_TYPE_IPV4_TCP = BIT(1), 155001489e5dSAlfredo Cardigliano IONIC_RSS_TYPE_IPV4_UDP = BIT(2), 155101489e5dSAlfredo Cardigliano IONIC_RSS_TYPE_IPV6 = BIT(3), 155201489e5dSAlfredo Cardigliano IONIC_RSS_TYPE_IPV6_TCP = BIT(4), 155301489e5dSAlfredo Cardigliano IONIC_RSS_TYPE_IPV6_UDP = BIT(5), 155401489e5dSAlfredo Cardigliano }; 155501489e5dSAlfredo Cardigliano 155601489e5dSAlfredo Cardigliano /** 155701489e5dSAlfredo Cardigliano * enum ionic_lif_attr - List of LIF attributes 1558126fe197SAndrew Boyer * @IONIC_LIF_ATTR_STATE: LIF state attribute 1559126fe197SAndrew Boyer * @IONIC_LIF_ATTR_NAME: LIF name attribute 1560126fe197SAndrew Boyer * @IONIC_LIF_ATTR_MTU: LIF MTU attribute 1561126fe197SAndrew Boyer * @IONIC_LIF_ATTR_MAC: LIF MAC attribute 1562126fe197SAndrew Boyer * @IONIC_LIF_ATTR_FEATURES: LIF features attribute 1563126fe197SAndrew Boyer * @IONIC_LIF_ATTR_RSS: LIF RSS attribute 1564126fe197SAndrew Boyer * @IONIC_LIF_ATTR_STATS_CTRL: LIF statistics control attribute 156501489e5dSAlfredo Cardigliano */ 156601489e5dSAlfredo Cardigliano enum ionic_lif_attr { 156701489e5dSAlfredo Cardigliano IONIC_LIF_ATTR_STATE = 0, 156801489e5dSAlfredo Cardigliano IONIC_LIF_ATTR_NAME = 1, 156901489e5dSAlfredo Cardigliano IONIC_LIF_ATTR_MTU = 2, 157001489e5dSAlfredo Cardigliano IONIC_LIF_ATTR_MAC = 3, 157101489e5dSAlfredo Cardigliano IONIC_LIF_ATTR_FEATURES = 4, 157201489e5dSAlfredo Cardigliano IONIC_LIF_ATTR_RSS = 5, 157301489e5dSAlfredo Cardigliano IONIC_LIF_ATTR_STATS_CTRL = 6, 157401489e5dSAlfredo Cardigliano }; 157501489e5dSAlfredo Cardigliano 157601489e5dSAlfredo Cardigliano /** 157701489e5dSAlfredo Cardigliano * struct ionic_lif_setattr_cmd - Set LIF attributes on the NIC 157801489e5dSAlfredo Cardigliano * @opcode: Opcode 1579126fe197SAndrew Boyer * @attr: Attribute type (enum ionic_lif_attr) 158001489e5dSAlfredo Cardigliano * @index: LIF index 1581126fe197SAndrew Boyer * @state: LIF state (enum ionic_lif_state) 158201489e5dSAlfredo Cardigliano * @name: The netdev name string, 0 terminated 158301489e5dSAlfredo Cardigliano * @mtu: Mtu 158401489e5dSAlfredo Cardigliano * @mac: Station mac 158501489e5dSAlfredo Cardigliano * @features: Features (enum ionic_eth_hw_features) 158601489e5dSAlfredo Cardigliano * @rss: RSS properties 1587126fe197SAndrew Boyer * @types: The hash types to enable (see rss_hash_types) 1588126fe197SAndrew Boyer * @key: The hash secret key 1589126fe197SAndrew Boyer * @addr: Address for the indirection table shared memory 1590126fe197SAndrew Boyer * @stats_ctl: stats control commands (enum ionic_stats_ctl_cmd) 159101489e5dSAlfredo Cardigliano */ 159201489e5dSAlfredo Cardigliano struct ionic_lif_setattr_cmd { 159301489e5dSAlfredo Cardigliano u8 opcode; 159401489e5dSAlfredo Cardigliano u8 attr; 159501489e5dSAlfredo Cardigliano __le16 index; 159601489e5dSAlfredo Cardigliano union { 159701489e5dSAlfredo Cardigliano u8 state; 159801489e5dSAlfredo Cardigliano char name[IONIC_IFNAMSIZ]; 159901489e5dSAlfredo Cardigliano __le32 mtu; 160001489e5dSAlfredo Cardigliano u8 mac[6]; 160101489e5dSAlfredo Cardigliano __le64 features; 160201489e5dSAlfredo Cardigliano struct { 160301489e5dSAlfredo Cardigliano __le16 types; 160401489e5dSAlfredo Cardigliano u8 key[IONIC_RSS_HASH_KEY_SIZE]; 160501489e5dSAlfredo Cardigliano u8 rsvd[6]; 160601489e5dSAlfredo Cardigliano __le64 addr; 160701489e5dSAlfredo Cardigliano } rss; 160801489e5dSAlfredo Cardigliano u8 stats_ctl; 160901489e5dSAlfredo Cardigliano u8 rsvd[60]; 1610126fe197SAndrew Boyer } __rte_packed; 161101489e5dSAlfredo Cardigliano }; 161201489e5dSAlfredo Cardigliano 161301489e5dSAlfredo Cardigliano /** 161401489e5dSAlfredo Cardigliano * struct ionic_lif_setattr_comp - LIF set attr command completion 1615126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 1616126fe197SAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 161701489e5dSAlfredo Cardigliano * @features: features (enum ionic_eth_hw_features) 161801489e5dSAlfredo Cardigliano * @color: Color bit 161901489e5dSAlfredo Cardigliano */ 162001489e5dSAlfredo Cardigliano struct ionic_lif_setattr_comp { 162101489e5dSAlfredo Cardigliano u8 status; 162201489e5dSAlfredo Cardigliano u8 rsvd; 162301489e5dSAlfredo Cardigliano __le16 comp_index; 162401489e5dSAlfredo Cardigliano union { 162501489e5dSAlfredo Cardigliano __le64 features; 162601489e5dSAlfredo Cardigliano u8 rsvd2[11]; 1627126fe197SAndrew Boyer } __rte_packed; 162801489e5dSAlfredo Cardigliano u8 color; 162901489e5dSAlfredo Cardigliano }; 163001489e5dSAlfredo Cardigliano 163101489e5dSAlfredo Cardigliano /** 163201489e5dSAlfredo Cardigliano * struct ionic_lif_getattr_cmd - Get LIF attributes from the NIC 163301489e5dSAlfredo Cardigliano * @opcode: Opcode 163401489e5dSAlfredo Cardigliano * @attr: Attribute type (enum ionic_lif_attr) 163501489e5dSAlfredo Cardigliano * @index: LIF index 163601489e5dSAlfredo Cardigliano */ 163701489e5dSAlfredo Cardigliano struct ionic_lif_getattr_cmd { 163801489e5dSAlfredo Cardigliano u8 opcode; 163901489e5dSAlfredo Cardigliano u8 attr; 164001489e5dSAlfredo Cardigliano __le16 index; 164101489e5dSAlfredo Cardigliano u8 rsvd[60]; 164201489e5dSAlfredo Cardigliano }; 164301489e5dSAlfredo Cardigliano 164401489e5dSAlfredo Cardigliano /** 164501489e5dSAlfredo Cardigliano * struct ionic_lif_getattr_comp - LIF get attr command completion 1646126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 1647126fe197SAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 1648126fe197SAndrew Boyer * @state: LIF state (enum ionic_lif_state) 164901489e5dSAlfredo Cardigliano * @name: The netdev name string, 0 terminated 165001489e5dSAlfredo Cardigliano * @mtu: Mtu 165101489e5dSAlfredo Cardigliano * @mac: Station mac 165201489e5dSAlfredo Cardigliano * @features: Features (enum ionic_eth_hw_features) 165301489e5dSAlfredo Cardigliano * @color: Color bit 165401489e5dSAlfredo Cardigliano */ 165501489e5dSAlfredo Cardigliano struct ionic_lif_getattr_comp { 165601489e5dSAlfredo Cardigliano u8 status; 165701489e5dSAlfredo Cardigliano u8 rsvd; 165801489e5dSAlfredo Cardigliano __le16 comp_index; 165901489e5dSAlfredo Cardigliano union { 166001489e5dSAlfredo Cardigliano u8 state; 166101489e5dSAlfredo Cardigliano __le32 mtu; 166201489e5dSAlfredo Cardigliano u8 mac[6]; 166301489e5dSAlfredo Cardigliano __le64 features; 166401489e5dSAlfredo Cardigliano u8 rsvd2[11]; 1665126fe197SAndrew Boyer } __rte_packed; 166601489e5dSAlfredo Cardigliano u8 color; 166701489e5dSAlfredo Cardigliano }; 166801489e5dSAlfredo Cardigliano 166901489e5dSAlfredo Cardigliano enum ionic_rx_mode { 167001489e5dSAlfredo Cardigliano IONIC_RX_MODE_F_UNICAST = BIT(0), 167101489e5dSAlfredo Cardigliano IONIC_RX_MODE_F_MULTICAST = BIT(1), 167201489e5dSAlfredo Cardigliano IONIC_RX_MODE_F_BROADCAST = BIT(2), 167301489e5dSAlfredo Cardigliano IONIC_RX_MODE_F_PROMISC = BIT(3), 167401489e5dSAlfredo Cardigliano IONIC_RX_MODE_F_ALLMULTI = BIT(4), 1675126fe197SAndrew Boyer IONIC_RX_MODE_F_RDMA_SNIFFER = BIT(5), 167601489e5dSAlfredo Cardigliano }; 167701489e5dSAlfredo Cardigliano 167801489e5dSAlfredo Cardigliano /** 167901489e5dSAlfredo Cardigliano * struct ionic_rx_mode_set_cmd - Set LIF's Rx mode command 168001489e5dSAlfredo Cardigliano * @opcode: opcode 168101489e5dSAlfredo Cardigliano * @lif_index: LIF index 168201489e5dSAlfredo Cardigliano * @rx_mode: Rx mode flags: 1683126fe197SAndrew Boyer * IONIC_RX_MODE_F_UNICAST: Accept known unicast packets 1684126fe197SAndrew Boyer * IONIC_RX_MODE_F_MULTICAST: Accept known multicast packets 1685126fe197SAndrew Boyer * IONIC_RX_MODE_F_BROADCAST: Accept broadcast packets 1686126fe197SAndrew Boyer * IONIC_RX_MODE_F_PROMISC: Accept any packets 1687126fe197SAndrew Boyer * IONIC_RX_MODE_F_ALLMULTI: Accept any multicast packets 1688126fe197SAndrew Boyer * IONIC_RX_MODE_F_RDMA_SNIFFER: Sniff RDMA packets 168901489e5dSAlfredo Cardigliano */ 169001489e5dSAlfredo Cardigliano struct ionic_rx_mode_set_cmd { 169101489e5dSAlfredo Cardigliano u8 opcode; 169201489e5dSAlfredo Cardigliano u8 rsvd; 169301489e5dSAlfredo Cardigliano __le16 lif_index; 169401489e5dSAlfredo Cardigliano __le16 rx_mode; 169501489e5dSAlfredo Cardigliano __le16 rsvd2[29]; 169601489e5dSAlfredo Cardigliano }; 169701489e5dSAlfredo Cardigliano 169801489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_rx_mode_set_comp; 169901489e5dSAlfredo Cardigliano 170001489e5dSAlfredo Cardigliano enum ionic_rx_filter_match_type { 170101489e5dSAlfredo Cardigliano IONIC_RX_FILTER_MATCH_VLAN = 0, 170201489e5dSAlfredo Cardigliano IONIC_RX_FILTER_MATCH_MAC, 170301489e5dSAlfredo Cardigliano IONIC_RX_FILTER_MATCH_MAC_VLAN, 170401489e5dSAlfredo Cardigliano }; 170501489e5dSAlfredo Cardigliano 170601489e5dSAlfredo Cardigliano /** 170701489e5dSAlfredo Cardigliano * struct ionic_rx_filter_add_cmd - Add LIF Rx filter command 170801489e5dSAlfredo Cardigliano * @opcode: opcode 170901489e5dSAlfredo Cardigliano * @qtype: Queue type 171001489e5dSAlfredo Cardigliano * @lif_index: LIF index 171101489e5dSAlfredo Cardigliano * @qid: Queue ID 1712126fe197SAndrew Boyer * @match: Rx filter match type (see IONIC_RX_FILTER_MATCH_xxx) 1713126fe197SAndrew Boyer * @vlan: VLAN filter 1714126fe197SAndrew Boyer * @vlan: VLAN ID 1715126fe197SAndrew Boyer * @mac: MAC filter 1716126fe197SAndrew Boyer * @addr: MAC address (network-byte order) 1717126fe197SAndrew Boyer * @mac_vlan: MACVLAN filter 171801489e5dSAlfredo Cardigliano * @vlan: VLAN ID 171901489e5dSAlfredo Cardigliano * @addr: MAC address (network-byte order) 172001489e5dSAlfredo Cardigliano */ 172101489e5dSAlfredo Cardigliano struct ionic_rx_filter_add_cmd { 172201489e5dSAlfredo Cardigliano u8 opcode; 172301489e5dSAlfredo Cardigliano u8 qtype; 172401489e5dSAlfredo Cardigliano __le16 lif_index; 172501489e5dSAlfredo Cardigliano __le32 qid; 172601489e5dSAlfredo Cardigliano __le16 match; 172701489e5dSAlfredo Cardigliano union { 172801489e5dSAlfredo Cardigliano struct { 172901489e5dSAlfredo Cardigliano __le16 vlan; 173001489e5dSAlfredo Cardigliano } vlan; 173101489e5dSAlfredo Cardigliano struct { 173201489e5dSAlfredo Cardigliano u8 addr[6]; 173301489e5dSAlfredo Cardigliano } mac; 173401489e5dSAlfredo Cardigliano struct { 173501489e5dSAlfredo Cardigliano __le16 vlan; 173601489e5dSAlfredo Cardigliano u8 addr[6]; 173701489e5dSAlfredo Cardigliano } mac_vlan; 173801489e5dSAlfredo Cardigliano u8 rsvd[54]; 173901489e5dSAlfredo Cardigliano }; 174001489e5dSAlfredo Cardigliano }; 174101489e5dSAlfredo Cardigliano 174201489e5dSAlfredo Cardigliano /** 174301489e5dSAlfredo Cardigliano * struct ionic_rx_filter_add_comp - Add LIF Rx filter command completion 1744126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 1745126fe197SAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 174601489e5dSAlfredo Cardigliano * @filter_id: Filter ID 1747126fe197SAndrew Boyer * @color: Color bit 174801489e5dSAlfredo Cardigliano */ 174901489e5dSAlfredo Cardigliano struct ionic_rx_filter_add_comp { 175001489e5dSAlfredo Cardigliano u8 status; 175101489e5dSAlfredo Cardigliano u8 rsvd; 175201489e5dSAlfredo Cardigliano __le16 comp_index; 175301489e5dSAlfredo Cardigliano __le32 filter_id; 175401489e5dSAlfredo Cardigliano u8 rsvd2[7]; 175501489e5dSAlfredo Cardigliano u8 color; 175601489e5dSAlfredo Cardigliano }; 175701489e5dSAlfredo Cardigliano 175801489e5dSAlfredo Cardigliano /** 175901489e5dSAlfredo Cardigliano * struct ionic_rx_filter_del_cmd - Delete LIF Rx filter command 176001489e5dSAlfredo Cardigliano * @opcode: opcode 176101489e5dSAlfredo Cardigliano * @lif_index: LIF index 176201489e5dSAlfredo Cardigliano * @filter_id: Filter ID 176301489e5dSAlfredo Cardigliano */ 176401489e5dSAlfredo Cardigliano struct ionic_rx_filter_del_cmd { 176501489e5dSAlfredo Cardigliano u8 opcode; 176601489e5dSAlfredo Cardigliano u8 rsvd; 176701489e5dSAlfredo Cardigliano __le16 lif_index; 176801489e5dSAlfredo Cardigliano __le32 filter_id; 176901489e5dSAlfredo Cardigliano u8 rsvd2[56]; 177001489e5dSAlfredo Cardigliano }; 177101489e5dSAlfredo Cardigliano 177201489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_rx_filter_del_comp; 177301489e5dSAlfredo Cardigliano 1774126fe197SAndrew Boyer enum ionic_vf_attr { 1775126fe197SAndrew Boyer IONIC_VF_ATTR_SPOOFCHK = 1, 1776126fe197SAndrew Boyer IONIC_VF_ATTR_TRUST = 2, 1777126fe197SAndrew Boyer IONIC_VF_ATTR_MAC = 3, 1778126fe197SAndrew Boyer IONIC_VF_ATTR_LINKSTATE = 4, 1779126fe197SAndrew Boyer IONIC_VF_ATTR_VLAN = 5, 1780126fe197SAndrew Boyer IONIC_VF_ATTR_RATE = 6, 1781126fe197SAndrew Boyer IONIC_VF_ATTR_STATSADDR = 7, 1782126fe197SAndrew Boyer }; 1783126fe197SAndrew Boyer 1784126fe197SAndrew Boyer /** 1785126fe197SAndrew Boyer * enum ionic_vf_link_status - Virtual Function link status 1786126fe197SAndrew Boyer * @IONIC_VF_LINK_STATUS_AUTO: Use link state of the uplink 1787126fe197SAndrew Boyer * @IONIC_VF_LINK_STATUS_UP: Link always up 1788126fe197SAndrew Boyer * @IONIC_VF_LINK_STATUS_DOWN: Link always down 1789126fe197SAndrew Boyer */ 1790126fe197SAndrew Boyer enum ionic_vf_link_status { 1791126fe197SAndrew Boyer IONIC_VF_LINK_STATUS_AUTO = 0, 1792126fe197SAndrew Boyer IONIC_VF_LINK_STATUS_UP = 1, 1793126fe197SAndrew Boyer IONIC_VF_LINK_STATUS_DOWN = 2, 1794126fe197SAndrew Boyer }; 1795126fe197SAndrew Boyer 1796126fe197SAndrew Boyer /** 1797126fe197SAndrew Boyer * struct ionic_vf_setattr_cmd - Set VF attributes on the NIC 1798126fe197SAndrew Boyer * @opcode: Opcode 1799126fe197SAndrew Boyer * @attr: Attribute type (enum ionic_vf_attr) 1800126fe197SAndrew Boyer * @vf_index: VF index 1801126fe197SAndrew Boyer * @macaddr: mac address 1802126fe197SAndrew Boyer * @vlanid: vlan ID 1803126fe197SAndrew Boyer * @maxrate: max Tx rate in Mbps 1804126fe197SAndrew Boyer * @spoofchk: enable address spoof checking 1805126fe197SAndrew Boyer * @trust: enable VF trust 1806126fe197SAndrew Boyer * @linkstate: set link up or down 1807126fe197SAndrew Boyer * @stats_pa: set DMA address for VF stats 1808126fe197SAndrew Boyer */ 1809126fe197SAndrew Boyer struct ionic_vf_setattr_cmd { 1810126fe197SAndrew Boyer u8 opcode; 1811126fe197SAndrew Boyer u8 attr; 1812126fe197SAndrew Boyer __le16 vf_index; 1813126fe197SAndrew Boyer union { 1814126fe197SAndrew Boyer u8 macaddr[6]; 1815126fe197SAndrew Boyer __le16 vlanid; 1816126fe197SAndrew Boyer __le32 maxrate; 1817126fe197SAndrew Boyer u8 spoofchk; 1818126fe197SAndrew Boyer u8 trust; 1819126fe197SAndrew Boyer u8 linkstate; 1820126fe197SAndrew Boyer __le64 stats_pa; 1821126fe197SAndrew Boyer u8 pad[60]; 1822126fe197SAndrew Boyer } __rte_packed; 1823126fe197SAndrew Boyer }; 1824126fe197SAndrew Boyer 1825126fe197SAndrew Boyer struct ionic_vf_setattr_comp { 1826126fe197SAndrew Boyer u8 status; 1827126fe197SAndrew Boyer u8 attr; 1828126fe197SAndrew Boyer __le16 vf_index; 1829126fe197SAndrew Boyer __le16 comp_index; 1830126fe197SAndrew Boyer u8 rsvd[9]; 1831126fe197SAndrew Boyer u8 color; 1832126fe197SAndrew Boyer }; 1833126fe197SAndrew Boyer 1834126fe197SAndrew Boyer /** 1835126fe197SAndrew Boyer * struct ionic_vf_getattr_cmd - Get VF attributes from the NIC 1836126fe197SAndrew Boyer * @opcode: Opcode 1837126fe197SAndrew Boyer * @attr: Attribute type (enum ionic_vf_attr) 1838126fe197SAndrew Boyer * @vf_index: VF index 1839126fe197SAndrew Boyer */ 1840126fe197SAndrew Boyer struct ionic_vf_getattr_cmd { 1841126fe197SAndrew Boyer u8 opcode; 1842126fe197SAndrew Boyer u8 attr; 1843126fe197SAndrew Boyer __le16 vf_index; 1844126fe197SAndrew Boyer u8 rsvd[60]; 1845126fe197SAndrew Boyer }; 1846126fe197SAndrew Boyer 1847126fe197SAndrew Boyer struct ionic_vf_getattr_comp { 1848126fe197SAndrew Boyer u8 status; 1849126fe197SAndrew Boyer u8 attr; 1850126fe197SAndrew Boyer __le16 vf_index; 1851126fe197SAndrew Boyer union { 1852126fe197SAndrew Boyer u8 macaddr[6]; 1853126fe197SAndrew Boyer __le16 vlanid; 1854126fe197SAndrew Boyer __le32 maxrate; 1855126fe197SAndrew Boyer u8 spoofchk; 1856126fe197SAndrew Boyer u8 trust; 1857126fe197SAndrew Boyer u8 linkstate; 1858126fe197SAndrew Boyer __le64 stats_pa; 1859126fe197SAndrew Boyer u8 pad[11]; 1860126fe197SAndrew Boyer } __rte_packed; 1861126fe197SAndrew Boyer u8 color; 1862126fe197SAndrew Boyer }; 1863126fe197SAndrew Boyer 186401489e5dSAlfredo Cardigliano /** 186501489e5dSAlfredo Cardigliano * struct ionic_qos_identify_cmd - QoS identify command 186601489e5dSAlfredo Cardigliano * @opcode: opcode 186701489e5dSAlfredo Cardigliano * @ver: Highest version of identify supported by driver 186801489e5dSAlfredo Cardigliano * 186901489e5dSAlfredo Cardigliano */ 187001489e5dSAlfredo Cardigliano struct ionic_qos_identify_cmd { 187101489e5dSAlfredo Cardigliano u8 opcode; 187201489e5dSAlfredo Cardigliano u8 ver; 187301489e5dSAlfredo Cardigliano u8 rsvd[62]; 187401489e5dSAlfredo Cardigliano }; 187501489e5dSAlfredo Cardigliano 187601489e5dSAlfredo Cardigliano /** 187701489e5dSAlfredo Cardigliano * struct ionic_qos_identify_comp - QoS identify command completion 1878126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 187901489e5dSAlfredo Cardigliano * @ver: Version of identify returned by device 188001489e5dSAlfredo Cardigliano */ 188101489e5dSAlfredo Cardigliano struct ionic_qos_identify_comp { 188201489e5dSAlfredo Cardigliano u8 status; 188301489e5dSAlfredo Cardigliano u8 ver; 188401489e5dSAlfredo Cardigliano u8 rsvd[14]; 188501489e5dSAlfredo Cardigliano }; 188601489e5dSAlfredo Cardigliano 1887126fe197SAndrew Boyer #define IONIC_QOS_TC_MAX 8 1888126fe197SAndrew Boyer #define IONIC_QOS_ALL_TC 0xFF 1889126fe197SAndrew Boyer /* Capri max supported, should be renamed. */ 189001489e5dSAlfredo Cardigliano #define IONIC_QOS_CLASS_MAX 7 1891126fe197SAndrew Boyer #define IONIC_QOS_PCP_MAX 8 189201489e5dSAlfredo Cardigliano #define IONIC_QOS_CLASS_NAME_SZ 32 1893126fe197SAndrew Boyer #define IONIC_QOS_DSCP_MAX 64 1894126fe197SAndrew Boyer #define IONIC_QOS_ALL_PCP 0xFF 1895126fe197SAndrew Boyer #define IONIC_DSCP_BLOCK_SIZE 8 189601489e5dSAlfredo Cardigliano 189701489e5dSAlfredo Cardigliano /** 189801489e5dSAlfredo Cardigliano * enum ionic_qos_class 189901489e5dSAlfredo Cardigliano */ 190001489e5dSAlfredo Cardigliano enum ionic_qos_class { 190101489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_DEFAULT = 0, 190201489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_USER_DEFINED_1 = 1, 190301489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_USER_DEFINED_2 = 2, 190401489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_USER_DEFINED_3 = 3, 190501489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_USER_DEFINED_4 = 4, 190601489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_USER_DEFINED_5 = 5, 190701489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_USER_DEFINED_6 = 6, 190801489e5dSAlfredo Cardigliano }; 190901489e5dSAlfredo Cardigliano 191001489e5dSAlfredo Cardigliano /** 191101489e5dSAlfredo Cardigliano * enum ionic_qos_class_type - Traffic classification criteria 1912126fe197SAndrew Boyer * @IONIC_QOS_CLASS_TYPE_NONE: No QoS 1913126fe197SAndrew Boyer * @IONIC_QOS_CLASS_TYPE_PCP: Dot1Q PCP 1914126fe197SAndrew Boyer * @IONIC_QOS_CLASS_TYPE_DSCP: IP DSCP 191501489e5dSAlfredo Cardigliano */ 191601489e5dSAlfredo Cardigliano enum ionic_qos_class_type { 191701489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_TYPE_NONE = 0, 1918126fe197SAndrew Boyer IONIC_QOS_CLASS_TYPE_PCP = 1, 1919126fe197SAndrew Boyer IONIC_QOS_CLASS_TYPE_DSCP = 2, 192001489e5dSAlfredo Cardigliano }; 192101489e5dSAlfredo Cardigliano 192201489e5dSAlfredo Cardigliano /** 1923126fe197SAndrew Boyer * enum ionic_qos_sched_type - QoS class scheduling type 1924126fe197SAndrew Boyer * @IONIC_QOS_SCHED_TYPE_STRICT: Strict priority 1925126fe197SAndrew Boyer * @IONIC_QOS_SCHED_TYPE_DWRR: Deficit weighted round-robin 192601489e5dSAlfredo Cardigliano */ 192701489e5dSAlfredo Cardigliano enum ionic_qos_sched_type { 192801489e5dSAlfredo Cardigliano IONIC_QOS_SCHED_TYPE_STRICT = 0, 192901489e5dSAlfredo Cardigliano IONIC_QOS_SCHED_TYPE_DWRR = 1, 193001489e5dSAlfredo Cardigliano }; 193101489e5dSAlfredo Cardigliano 193201489e5dSAlfredo Cardigliano /** 1933126fe197SAndrew Boyer * union ionic_qos_config - QoS configuration structure 193401489e5dSAlfredo Cardigliano * @flags: Configuration flags 193501489e5dSAlfredo Cardigliano * IONIC_QOS_CONFIG_F_ENABLE enable 1936126fe197SAndrew Boyer * IONIC_QOS_CONFIG_F_NO_DROP drop/nodrop 193701489e5dSAlfredo Cardigliano * IONIC_QOS_CONFIG_F_RW_DOT1Q_PCP enable dot1q pcp rewrite 193801489e5dSAlfredo Cardigliano * IONIC_QOS_CONFIG_F_RW_IP_DSCP enable ip dscp rewrite 1939126fe197SAndrew Boyer * IONIC_QOS_CONFIG_F_NON_DISRUPTIVE Non-disruptive TC update 1940126fe197SAndrew Boyer * @sched_type: QoS class scheduling type (enum ionic_qos_sched_type) 1941126fe197SAndrew Boyer * @class_type: QoS class type (enum ionic_qos_class_type) 1942126fe197SAndrew Boyer * @pause_type: QoS pause type (enum ionic_qos_pause_type) 1943126fe197SAndrew Boyer * @name: QoS class name 194401489e5dSAlfredo Cardigliano * @mtu: MTU of the class 1945126fe197SAndrew Boyer * @pfc_cos: Priority-Flow Control class of service 1946126fe197SAndrew Boyer * @dwrr_weight: QoS class scheduling weight 194701489e5dSAlfredo Cardigliano * @strict_rlmt: Rate limit for strict priority scheduling 1948126fe197SAndrew Boyer * @rw_dot1q_pcp: Rewrite dot1q pcp to value (valid iff F_RW_DOT1Q_PCP) 1949126fe197SAndrew Boyer * @rw_ip_dscp: Rewrite ip dscp to value (valid iff F_RW_IP_DSCP) 195001489e5dSAlfredo Cardigliano * @dot1q_pcp: Dot1q pcp value 195101489e5dSAlfredo Cardigliano * @ndscp: Number of valid dscp values in the ip_dscp field 195201489e5dSAlfredo Cardigliano * @ip_dscp: IP dscp values 195301489e5dSAlfredo Cardigliano */ 195401489e5dSAlfredo Cardigliano union ionic_qos_config { 195501489e5dSAlfredo Cardigliano struct { 195601489e5dSAlfredo Cardigliano #define IONIC_QOS_CONFIG_F_ENABLE BIT(0) 1957126fe197SAndrew Boyer #define IONIC_QOS_CONFIG_F_NO_DROP BIT(1) 1958126fe197SAndrew Boyer /* Used to rewrite PCP or DSCP value. */ 195901489e5dSAlfredo Cardigliano #define IONIC_QOS_CONFIG_F_RW_DOT1Q_PCP BIT(2) 196001489e5dSAlfredo Cardigliano #define IONIC_QOS_CONFIG_F_RW_IP_DSCP BIT(3) 1961126fe197SAndrew Boyer /* Non-disruptive TC update */ 1962126fe197SAndrew Boyer #define IONIC_QOS_CONFIG_F_NON_DISRUPTIVE BIT(4) 196301489e5dSAlfredo Cardigliano u8 flags; 196401489e5dSAlfredo Cardigliano u8 sched_type; 196501489e5dSAlfredo Cardigliano u8 class_type; 196601489e5dSAlfredo Cardigliano u8 pause_type; 196701489e5dSAlfredo Cardigliano char name[IONIC_QOS_CLASS_NAME_SZ]; 196801489e5dSAlfredo Cardigliano __le32 mtu; 196901489e5dSAlfredo Cardigliano /* flow control */ 197001489e5dSAlfredo Cardigliano u8 pfc_cos; 197101489e5dSAlfredo Cardigliano /* scheduler */ 197201489e5dSAlfredo Cardigliano union { 197301489e5dSAlfredo Cardigliano u8 dwrr_weight; 197401489e5dSAlfredo Cardigliano __le64 strict_rlmt; 197501489e5dSAlfredo Cardigliano }; 197601489e5dSAlfredo Cardigliano /* marking */ 1977126fe197SAndrew Boyer /* Used to rewrite PCP or DSCP value. */ 197801489e5dSAlfredo Cardigliano union { 197901489e5dSAlfredo Cardigliano u8 rw_dot1q_pcp; 198001489e5dSAlfredo Cardigliano u8 rw_ip_dscp; 198101489e5dSAlfredo Cardigliano }; 198201489e5dSAlfredo Cardigliano /* classification */ 198301489e5dSAlfredo Cardigliano union { 198401489e5dSAlfredo Cardigliano u8 dot1q_pcp; 198501489e5dSAlfredo Cardigliano struct { 198601489e5dSAlfredo Cardigliano u8 ndscp; 1987126fe197SAndrew Boyer u8 ip_dscp[IONIC_QOS_DSCP_MAX]; 198801489e5dSAlfredo Cardigliano }; 198901489e5dSAlfredo Cardigliano }; 1990126fe197SAndrew Boyer } __rte_packed; 199101489e5dSAlfredo Cardigliano __le32 words[64]; 199201489e5dSAlfredo Cardigliano }; 199301489e5dSAlfredo Cardigliano 199401489e5dSAlfredo Cardigliano /** 199501489e5dSAlfredo Cardigliano * union ionic_qos_identity - QoS identity structure 199601489e5dSAlfredo Cardigliano * @version: Version of the identify structure 199701489e5dSAlfredo Cardigliano * @type: QoS system type 199801489e5dSAlfredo Cardigliano * @nclasses: Number of usable QoS classes 199901489e5dSAlfredo Cardigliano * @config: Current configuration of classes 200001489e5dSAlfredo Cardigliano */ 200101489e5dSAlfredo Cardigliano union ionic_qos_identity { 200201489e5dSAlfredo Cardigliano struct { 200301489e5dSAlfredo Cardigliano u8 version; 200401489e5dSAlfredo Cardigliano u8 type; 200501489e5dSAlfredo Cardigliano u8 rsvd[62]; 200601489e5dSAlfredo Cardigliano union ionic_qos_config config[IONIC_QOS_CLASS_MAX]; 200701489e5dSAlfredo Cardigliano }; 2008126fe197SAndrew Boyer __le32 words[478]; 200901489e5dSAlfredo Cardigliano }; 201001489e5dSAlfredo Cardigliano 201101489e5dSAlfredo Cardigliano /** 2012126fe197SAndrew Boyer * struct ionic_qos_init_cmd - QoS config init command 201301489e5dSAlfredo Cardigliano * @opcode: Opcode 2014126fe197SAndrew Boyer * @group: QoS class id 201501489e5dSAlfredo Cardigliano * @info_pa: destination address for qos info 201601489e5dSAlfredo Cardigliano */ 201701489e5dSAlfredo Cardigliano struct ionic_qos_init_cmd { 201801489e5dSAlfredo Cardigliano u8 opcode; 201901489e5dSAlfredo Cardigliano u8 group; 202001489e5dSAlfredo Cardigliano u8 rsvd[6]; 202101489e5dSAlfredo Cardigliano __le64 info_pa; 202201489e5dSAlfredo Cardigliano u8 rsvd1[48]; 202301489e5dSAlfredo Cardigliano }; 202401489e5dSAlfredo Cardigliano 202501489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_qos_init_comp; 202601489e5dSAlfredo Cardigliano 202701489e5dSAlfredo Cardigliano /** 2028126fe197SAndrew Boyer * struct ionic_qos_reset_cmd - QoS config reset command 202901489e5dSAlfredo Cardigliano * @opcode: Opcode 2030126fe197SAndrew Boyer * @group: QoS class id 203101489e5dSAlfredo Cardigliano */ 203201489e5dSAlfredo Cardigliano struct ionic_qos_reset_cmd { 203301489e5dSAlfredo Cardigliano u8 opcode; 203401489e5dSAlfredo Cardigliano u8 group; 203501489e5dSAlfredo Cardigliano u8 rsvd[62]; 203601489e5dSAlfredo Cardigliano }; 203701489e5dSAlfredo Cardigliano 2038126fe197SAndrew Boyer /** 2039126fe197SAndrew Boyer * struct ionic_qos_clear_port_stats_cmd - Qos config reset command 2040126fe197SAndrew Boyer * @opcode: Opcode 2041126fe197SAndrew Boyer */ 2042126fe197SAndrew Boyer struct ionic_qos_clear_stats_cmd { 2043126fe197SAndrew Boyer u8 opcode; 2044126fe197SAndrew Boyer u8 group_bitmap; 2045126fe197SAndrew Boyer u8 rsvd[62]; 2046126fe197SAndrew Boyer }; 2047126fe197SAndrew Boyer 204801489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_qos_reset_comp; 204901489e5dSAlfredo Cardigliano 205001489e5dSAlfredo Cardigliano /** 205101489e5dSAlfredo Cardigliano * struct ionic_fw_download_cmd - Firmware download command 205201489e5dSAlfredo Cardigliano * @opcode: opcode 205301489e5dSAlfredo Cardigliano * @addr: dma address of the firmware buffer 205401489e5dSAlfredo Cardigliano * @offset: offset of the firmware buffer within the full image 205501489e5dSAlfredo Cardigliano * @length: number of valid bytes in the firmware buffer 205601489e5dSAlfredo Cardigliano */ 205701489e5dSAlfredo Cardigliano struct ionic_fw_download_cmd { 205801489e5dSAlfredo Cardigliano u8 opcode; 205901489e5dSAlfredo Cardigliano u8 rsvd[3]; 206001489e5dSAlfredo Cardigliano __le32 offset; 206101489e5dSAlfredo Cardigliano __le64 addr; 206201489e5dSAlfredo Cardigliano __le32 length; 206301489e5dSAlfredo Cardigliano }; 206401489e5dSAlfredo Cardigliano 206501489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_fw_download_comp; 206601489e5dSAlfredo Cardigliano 2067126fe197SAndrew Boyer /** 2068126fe197SAndrew Boyer * enum ionic_fw_control_oper - FW control operations 2069126fe197SAndrew Boyer * @IONIC_FW_RESET: Reset firmware 2070126fe197SAndrew Boyer * @IONIC_FW_INSTALL: Install firmware 2071126fe197SAndrew Boyer * @IONIC_FW_ACTIVATE: Acticate firmware 2072126fe197SAndrew Boyer */ 207301489e5dSAlfredo Cardigliano enum ionic_fw_control_oper { 2074126fe197SAndrew Boyer IONIC_FW_RESET = 0, 2075126fe197SAndrew Boyer IONIC_FW_INSTALL = 1, 2076126fe197SAndrew Boyer IONIC_FW_ACTIVATE = 2, 207701489e5dSAlfredo Cardigliano }; 207801489e5dSAlfredo Cardigliano 207901489e5dSAlfredo Cardigliano /** 208001489e5dSAlfredo Cardigliano * struct ionic_fw_control_cmd - Firmware control command 208101489e5dSAlfredo Cardigliano * @opcode: opcode 208201489e5dSAlfredo Cardigliano * @oper: firmware control operation (enum ionic_fw_control_oper) 208301489e5dSAlfredo Cardigliano * @slot: slot to activate 208401489e5dSAlfredo Cardigliano */ 208501489e5dSAlfredo Cardigliano struct ionic_fw_control_cmd { 208601489e5dSAlfredo Cardigliano u8 opcode; 208701489e5dSAlfredo Cardigliano u8 rsvd[3]; 208801489e5dSAlfredo Cardigliano u8 oper; 208901489e5dSAlfredo Cardigliano u8 slot; 209001489e5dSAlfredo Cardigliano u8 rsvd1[58]; 209101489e5dSAlfredo Cardigliano }; 209201489e5dSAlfredo Cardigliano 209301489e5dSAlfredo Cardigliano /** 209401489e5dSAlfredo Cardigliano * struct ionic_fw_control_comp - Firmware control copletion 2095126fe197SAndrew Boyer * @status: Status of the command (enum ionic_status_code) 2096126fe197SAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 2097126fe197SAndrew Boyer * @slot: Slot where the firmware was installed 2098126fe197SAndrew Boyer * @color: Color bit 209901489e5dSAlfredo Cardigliano */ 210001489e5dSAlfredo Cardigliano struct ionic_fw_control_comp { 210101489e5dSAlfredo Cardigliano u8 status; 210201489e5dSAlfredo Cardigliano u8 rsvd; 210301489e5dSAlfredo Cardigliano __le16 comp_index; 210401489e5dSAlfredo Cardigliano u8 slot; 210501489e5dSAlfredo Cardigliano u8 rsvd1[10]; 210601489e5dSAlfredo Cardigliano u8 color; 210701489e5dSAlfredo Cardigliano }; 210801489e5dSAlfredo Cardigliano 210901489e5dSAlfredo Cardigliano /****************************************************************** 211001489e5dSAlfredo Cardigliano ******************* RDMA Commands ******************************** 211101489e5dSAlfredo Cardigliano ******************************************************************/ 211201489e5dSAlfredo Cardigliano 211301489e5dSAlfredo Cardigliano /** 211401489e5dSAlfredo Cardigliano * struct ionic_rdma_reset_cmd - Reset RDMA LIF cmd 211501489e5dSAlfredo Cardigliano * @opcode: opcode 2116126fe197SAndrew Boyer * @lif_index: LIF index 211701489e5dSAlfredo Cardigliano * 2118126fe197SAndrew Boyer * There is no RDMA specific dev command completion struct. Completion uses 211901489e5dSAlfredo Cardigliano * the common struct ionic_admin_comp. Only the status is indicated. 2120126fe197SAndrew Boyer * Nonzero status means the LIF does not support RDMA. 212101489e5dSAlfredo Cardigliano **/ 212201489e5dSAlfredo Cardigliano struct ionic_rdma_reset_cmd { 212301489e5dSAlfredo Cardigliano u8 opcode; 212401489e5dSAlfredo Cardigliano u8 rsvd; 212501489e5dSAlfredo Cardigliano __le16 lif_index; 212601489e5dSAlfredo Cardigliano u8 rsvd2[60]; 212701489e5dSAlfredo Cardigliano }; 212801489e5dSAlfredo Cardigliano 212901489e5dSAlfredo Cardigliano /** 213001489e5dSAlfredo Cardigliano * struct ionic_rdma_queue_cmd - Create RDMA Queue command 213101489e5dSAlfredo Cardigliano * @opcode: opcode, 52, 53 2132126fe197SAndrew Boyer * @lif_index: LIF index 2133126fe197SAndrew Boyer * @qid_ver: (qid | (RDMA version << 24)) 213401489e5dSAlfredo Cardigliano * @cid: intr, eq_id, or cq_id 213501489e5dSAlfredo Cardigliano * @dbid: doorbell page id 213601489e5dSAlfredo Cardigliano * @depth_log2: log base two of queue depth 213701489e5dSAlfredo Cardigliano * @stride_log2: log base two of queue stride 213801489e5dSAlfredo Cardigliano * @dma_addr: address of the queue memory 213901489e5dSAlfredo Cardigliano * 2140126fe197SAndrew Boyer * The same command struct is used to create an RDMA event queue, completion 2141126fe197SAndrew Boyer * queue, or RDMA admin queue. The cid is an interrupt number for an event 214201489e5dSAlfredo Cardigliano * queue, an event queue id for a completion queue, or a completion queue id 2143126fe197SAndrew Boyer * for an RDMA admin queue. 214401489e5dSAlfredo Cardigliano * 214501489e5dSAlfredo Cardigliano * The queue created via a dev command must be contiguous in dma space. 214601489e5dSAlfredo Cardigliano * 214701489e5dSAlfredo Cardigliano * The dev commands are intended only to be used during driver initialization, 2148126fe197SAndrew Boyer * to create queues supporting the RDMA admin queue. Other queues, and other 2149126fe197SAndrew Boyer * types of RDMA resources like memory regions, will be created and registered 2150126fe197SAndrew Boyer * via the RDMA admin queue, and will support a more complete interface 215101489e5dSAlfredo Cardigliano * providing scatter gather lists for larger, scattered queue buffers and 215201489e5dSAlfredo Cardigliano * memory registration. 215301489e5dSAlfredo Cardigliano * 2154126fe197SAndrew Boyer * There is no RDMA specific dev command completion struct. Completion uses 215501489e5dSAlfredo Cardigliano * the common struct ionic_admin_comp. Only the status is indicated. 215601489e5dSAlfredo Cardigliano **/ 215701489e5dSAlfredo Cardigliano struct ionic_rdma_queue_cmd { 215801489e5dSAlfredo Cardigliano u8 opcode; 215901489e5dSAlfredo Cardigliano u8 rsvd; 216001489e5dSAlfredo Cardigliano __le16 lif_index; 216101489e5dSAlfredo Cardigliano __le32 qid_ver; 216201489e5dSAlfredo Cardigliano __le32 cid; 216301489e5dSAlfredo Cardigliano __le16 dbid; 216401489e5dSAlfredo Cardigliano u8 depth_log2; 216501489e5dSAlfredo Cardigliano u8 stride_log2; 216601489e5dSAlfredo Cardigliano __le64 dma_addr; 2167126fe197SAndrew Boyer u8 rsvd2[40]; 216801489e5dSAlfredo Cardigliano }; 216901489e5dSAlfredo Cardigliano 217001489e5dSAlfredo Cardigliano /****************************************************************** 217101489e5dSAlfredo Cardigliano ******************* Notify Events ******************************** 217201489e5dSAlfredo Cardigliano ******************************************************************/ 217301489e5dSAlfredo Cardigliano 217401489e5dSAlfredo Cardigliano /** 2175126fe197SAndrew Boyer * struct ionic_notifyq_event - Generic event reporting structure 217601489e5dSAlfredo Cardigliano * @eid: event number 217701489e5dSAlfredo Cardigliano * @ecode: event code 217801489e5dSAlfredo Cardigliano * @data: unspecified data about the event 217901489e5dSAlfredo Cardigliano * 218001489e5dSAlfredo Cardigliano * This is the generic event report struct from which the other 218101489e5dSAlfredo Cardigliano * actual events will be formed. 218201489e5dSAlfredo Cardigliano */ 218301489e5dSAlfredo Cardigliano struct ionic_notifyq_event { 218401489e5dSAlfredo Cardigliano __le64 eid; 218501489e5dSAlfredo Cardigliano __le16 ecode; 218601489e5dSAlfredo Cardigliano u8 data[54]; 218701489e5dSAlfredo Cardigliano }; 218801489e5dSAlfredo Cardigliano 218901489e5dSAlfredo Cardigliano /** 2190126fe197SAndrew Boyer * struct ionic_link_change_event - Link change event notification 219101489e5dSAlfredo Cardigliano * @eid: event number 2192126fe197SAndrew Boyer * @ecode: event code = IONIC_EVENT_LINK_CHANGE 2193126fe197SAndrew Boyer * @link_status: link up/down, with error bits (enum ionic_port_status) 219401489e5dSAlfredo Cardigliano * @link_speed: speed of the network link 219501489e5dSAlfredo Cardigliano * 219601489e5dSAlfredo Cardigliano * Sent when the network link state changes between UP and DOWN 219701489e5dSAlfredo Cardigliano */ 219801489e5dSAlfredo Cardigliano struct ionic_link_change_event { 219901489e5dSAlfredo Cardigliano __le64 eid; 220001489e5dSAlfredo Cardigliano __le16 ecode; 220101489e5dSAlfredo Cardigliano __le16 link_status; 220201489e5dSAlfredo Cardigliano __le32 link_speed; /* units of 1Mbps: e.g. 10000 = 10Gbps */ 220301489e5dSAlfredo Cardigliano u8 rsvd[48]; 220401489e5dSAlfredo Cardigliano }; 220501489e5dSAlfredo Cardigliano 220601489e5dSAlfredo Cardigliano /** 2207126fe197SAndrew Boyer * struct ionic_reset_event - Reset event notification 220801489e5dSAlfredo Cardigliano * @eid: event number 2209126fe197SAndrew Boyer * @ecode: event code = IONIC_EVENT_RESET 221001489e5dSAlfredo Cardigliano * @reset_code: reset type 221101489e5dSAlfredo Cardigliano * @state: 0=pending, 1=complete, 2=error 221201489e5dSAlfredo Cardigliano * 221301489e5dSAlfredo Cardigliano * Sent when the NIC or some subsystem is going to be or 221401489e5dSAlfredo Cardigliano * has been reset. 221501489e5dSAlfredo Cardigliano */ 221601489e5dSAlfredo Cardigliano struct ionic_reset_event { 221701489e5dSAlfredo Cardigliano __le64 eid; 221801489e5dSAlfredo Cardigliano __le16 ecode; 221901489e5dSAlfredo Cardigliano u8 reset_code; 222001489e5dSAlfredo Cardigliano u8 state; 222101489e5dSAlfredo Cardigliano u8 rsvd[52]; 222201489e5dSAlfredo Cardigliano }; 222301489e5dSAlfredo Cardigliano 222401489e5dSAlfredo Cardigliano /** 2225126fe197SAndrew Boyer * struct ionic_heartbeat_event - Sent periodically by NIC to indicate health 222601489e5dSAlfredo Cardigliano * @eid: event number 2227126fe197SAndrew Boyer * @ecode: event code = IONIC_EVENT_HEARTBEAT 222801489e5dSAlfredo Cardigliano */ 222901489e5dSAlfredo Cardigliano struct ionic_heartbeat_event { 223001489e5dSAlfredo Cardigliano __le64 eid; 223101489e5dSAlfredo Cardigliano __le16 ecode; 223201489e5dSAlfredo Cardigliano u8 rsvd[54]; 223301489e5dSAlfredo Cardigliano }; 223401489e5dSAlfredo Cardigliano 223501489e5dSAlfredo Cardigliano /** 2236126fe197SAndrew Boyer * struct ionic_log_event - Sent to notify the driver of an internal error 223701489e5dSAlfredo Cardigliano * @eid: event number 2238126fe197SAndrew Boyer * @ecode: event code = IONIC_EVENT_LOG 223901489e5dSAlfredo Cardigliano * @data: log data 224001489e5dSAlfredo Cardigliano */ 224101489e5dSAlfredo Cardigliano struct ionic_log_event { 224201489e5dSAlfredo Cardigliano __le64 eid; 224301489e5dSAlfredo Cardigliano __le16 ecode; 224401489e5dSAlfredo Cardigliano u8 data[54]; 224501489e5dSAlfredo Cardigliano }; 224601489e5dSAlfredo Cardigliano 224701489e5dSAlfredo Cardigliano /** 2248126fe197SAndrew Boyer * struct ionic_xcvr_event - Transceiver change event 2249126fe197SAndrew Boyer * @eid: event number 2250126fe197SAndrew Boyer * @ecode: event code = IONIC_EVENT_XCVR 2251126fe197SAndrew Boyer */ 2252126fe197SAndrew Boyer struct ionic_xcvr_event { 2253126fe197SAndrew Boyer __le64 eid; 2254126fe197SAndrew Boyer __le16 ecode; 2255126fe197SAndrew Boyer u8 rsvd[54]; 2256126fe197SAndrew Boyer }; 2257126fe197SAndrew Boyer 2258126fe197SAndrew Boyer /** 2259126fe197SAndrew Boyer * struct ionic_port_stats - Port statistics structure 226001489e5dSAlfredo Cardigliano */ 226101489e5dSAlfredo Cardigliano struct ionic_port_stats { 226201489e5dSAlfredo Cardigliano __le64 frames_rx_ok; 226301489e5dSAlfredo Cardigliano __le64 frames_rx_all; 226401489e5dSAlfredo Cardigliano __le64 frames_rx_bad_fcs; 226501489e5dSAlfredo Cardigliano __le64 frames_rx_bad_all; 226601489e5dSAlfredo Cardigliano __le64 octets_rx_ok; 226701489e5dSAlfredo Cardigliano __le64 octets_rx_all; 226801489e5dSAlfredo Cardigliano __le64 frames_rx_unicast; 226901489e5dSAlfredo Cardigliano __le64 frames_rx_multicast; 227001489e5dSAlfredo Cardigliano __le64 frames_rx_broadcast; 227101489e5dSAlfredo Cardigliano __le64 frames_rx_pause; 227201489e5dSAlfredo Cardigliano __le64 frames_rx_bad_length; 227301489e5dSAlfredo Cardigliano __le64 frames_rx_undersized; 227401489e5dSAlfredo Cardigliano __le64 frames_rx_oversized; 227501489e5dSAlfredo Cardigliano __le64 frames_rx_fragments; 227601489e5dSAlfredo Cardigliano __le64 frames_rx_jabber; 227701489e5dSAlfredo Cardigliano __le64 frames_rx_pripause; 227801489e5dSAlfredo Cardigliano __le64 frames_rx_stomped_crc; 227901489e5dSAlfredo Cardigliano __le64 frames_rx_too_long; 228001489e5dSAlfredo Cardigliano __le64 frames_rx_vlan_good; 228101489e5dSAlfredo Cardigliano __le64 frames_rx_dropped; 228201489e5dSAlfredo Cardigliano __le64 frames_rx_less_than_64b; 228301489e5dSAlfredo Cardigliano __le64 frames_rx_64b; 228401489e5dSAlfredo Cardigliano __le64 frames_rx_65b_127b; 228501489e5dSAlfredo Cardigliano __le64 frames_rx_128b_255b; 228601489e5dSAlfredo Cardigliano __le64 frames_rx_256b_511b; 228701489e5dSAlfredo Cardigliano __le64 frames_rx_512b_1023b; 228801489e5dSAlfredo Cardigliano __le64 frames_rx_1024b_1518b; 228901489e5dSAlfredo Cardigliano __le64 frames_rx_1519b_2047b; 229001489e5dSAlfredo Cardigliano __le64 frames_rx_2048b_4095b; 229101489e5dSAlfredo Cardigliano __le64 frames_rx_4096b_8191b; 229201489e5dSAlfredo Cardigliano __le64 frames_rx_8192b_9215b; 229301489e5dSAlfredo Cardigliano __le64 frames_rx_other; 229401489e5dSAlfredo Cardigliano __le64 frames_tx_ok; 229501489e5dSAlfredo Cardigliano __le64 frames_tx_all; 229601489e5dSAlfredo Cardigliano __le64 frames_tx_bad; 229701489e5dSAlfredo Cardigliano __le64 octets_tx_ok; 229801489e5dSAlfredo Cardigliano __le64 octets_tx_total; 229901489e5dSAlfredo Cardigliano __le64 frames_tx_unicast; 230001489e5dSAlfredo Cardigliano __le64 frames_tx_multicast; 230101489e5dSAlfredo Cardigliano __le64 frames_tx_broadcast; 230201489e5dSAlfredo Cardigliano __le64 frames_tx_pause; 230301489e5dSAlfredo Cardigliano __le64 frames_tx_pripause; 230401489e5dSAlfredo Cardigliano __le64 frames_tx_vlan; 230501489e5dSAlfredo Cardigliano __le64 frames_tx_less_than_64b; 230601489e5dSAlfredo Cardigliano __le64 frames_tx_64b; 230701489e5dSAlfredo Cardigliano __le64 frames_tx_65b_127b; 230801489e5dSAlfredo Cardigliano __le64 frames_tx_128b_255b; 230901489e5dSAlfredo Cardigliano __le64 frames_tx_256b_511b; 231001489e5dSAlfredo Cardigliano __le64 frames_tx_512b_1023b; 231101489e5dSAlfredo Cardigliano __le64 frames_tx_1024b_1518b; 231201489e5dSAlfredo Cardigliano __le64 frames_tx_1519b_2047b; 231301489e5dSAlfredo Cardigliano __le64 frames_tx_2048b_4095b; 231401489e5dSAlfredo Cardigliano __le64 frames_tx_4096b_8191b; 231501489e5dSAlfredo Cardigliano __le64 frames_tx_8192b_9215b; 231601489e5dSAlfredo Cardigliano __le64 frames_tx_other; 231701489e5dSAlfredo Cardigliano __le64 frames_tx_pri_0; 231801489e5dSAlfredo Cardigliano __le64 frames_tx_pri_1; 231901489e5dSAlfredo Cardigliano __le64 frames_tx_pri_2; 232001489e5dSAlfredo Cardigliano __le64 frames_tx_pri_3; 232101489e5dSAlfredo Cardigliano __le64 frames_tx_pri_4; 232201489e5dSAlfredo Cardigliano __le64 frames_tx_pri_5; 232301489e5dSAlfredo Cardigliano __le64 frames_tx_pri_6; 232401489e5dSAlfredo Cardigliano __le64 frames_tx_pri_7; 232501489e5dSAlfredo Cardigliano __le64 frames_rx_pri_0; 232601489e5dSAlfredo Cardigliano __le64 frames_rx_pri_1; 232701489e5dSAlfredo Cardigliano __le64 frames_rx_pri_2; 232801489e5dSAlfredo Cardigliano __le64 frames_rx_pri_3; 232901489e5dSAlfredo Cardigliano __le64 frames_rx_pri_4; 233001489e5dSAlfredo Cardigliano __le64 frames_rx_pri_5; 233101489e5dSAlfredo Cardigliano __le64 frames_rx_pri_6; 233201489e5dSAlfredo Cardigliano __le64 frames_rx_pri_7; 233301489e5dSAlfredo Cardigliano __le64 tx_pripause_0_1us_count; 233401489e5dSAlfredo Cardigliano __le64 tx_pripause_1_1us_count; 233501489e5dSAlfredo Cardigliano __le64 tx_pripause_2_1us_count; 233601489e5dSAlfredo Cardigliano __le64 tx_pripause_3_1us_count; 233701489e5dSAlfredo Cardigliano __le64 tx_pripause_4_1us_count; 233801489e5dSAlfredo Cardigliano __le64 tx_pripause_5_1us_count; 233901489e5dSAlfredo Cardigliano __le64 tx_pripause_6_1us_count; 234001489e5dSAlfredo Cardigliano __le64 tx_pripause_7_1us_count; 234101489e5dSAlfredo Cardigliano __le64 rx_pripause_0_1us_count; 234201489e5dSAlfredo Cardigliano __le64 rx_pripause_1_1us_count; 234301489e5dSAlfredo Cardigliano __le64 rx_pripause_2_1us_count; 234401489e5dSAlfredo Cardigliano __le64 rx_pripause_3_1us_count; 234501489e5dSAlfredo Cardigliano __le64 rx_pripause_4_1us_count; 234601489e5dSAlfredo Cardigliano __le64 rx_pripause_5_1us_count; 234701489e5dSAlfredo Cardigliano __le64 rx_pripause_6_1us_count; 234801489e5dSAlfredo Cardigliano __le64 rx_pripause_7_1us_count; 234901489e5dSAlfredo Cardigliano __le64 rx_pause_1us_count; 235001489e5dSAlfredo Cardigliano __le64 frames_tx_truncated; 235101489e5dSAlfredo Cardigliano }; 235201489e5dSAlfredo Cardigliano 235301489e5dSAlfredo Cardigliano struct ionic_mgmt_port_stats { 235401489e5dSAlfredo Cardigliano __le64 frames_rx_ok; 235501489e5dSAlfredo Cardigliano __le64 frames_rx_all; 235601489e5dSAlfredo Cardigliano __le64 frames_rx_bad_fcs; 235701489e5dSAlfredo Cardigliano __le64 frames_rx_bad_all; 235801489e5dSAlfredo Cardigliano __le64 octets_rx_ok; 235901489e5dSAlfredo Cardigliano __le64 octets_rx_all; 236001489e5dSAlfredo Cardigliano __le64 frames_rx_unicast; 236101489e5dSAlfredo Cardigliano __le64 frames_rx_multicast; 236201489e5dSAlfredo Cardigliano __le64 frames_rx_broadcast; 236301489e5dSAlfredo Cardigliano __le64 frames_rx_pause; 2364126fe197SAndrew Boyer __le64 frames_rx_bad_length; 2365126fe197SAndrew Boyer __le64 frames_rx_undersized; 2366126fe197SAndrew Boyer __le64 frames_rx_oversized; 2367126fe197SAndrew Boyer __le64 frames_rx_fragments; 2368126fe197SAndrew Boyer __le64 frames_rx_jabber; 2369126fe197SAndrew Boyer __le64 frames_rx_64b; 2370126fe197SAndrew Boyer __le64 frames_rx_65b_127b; 2371126fe197SAndrew Boyer __le64 frames_rx_128b_255b; 2372126fe197SAndrew Boyer __le64 frames_rx_256b_511b; 2373126fe197SAndrew Boyer __le64 frames_rx_512b_1023b; 2374126fe197SAndrew Boyer __le64 frames_rx_1024b_1518b; 2375126fe197SAndrew Boyer __le64 frames_rx_gt_1518b; 2376126fe197SAndrew Boyer __le64 frames_rx_fifo_full; 2377126fe197SAndrew Boyer __le64 frames_tx_ok; 2378126fe197SAndrew Boyer __le64 frames_tx_all; 2379126fe197SAndrew Boyer __le64 frames_tx_bad; 2380126fe197SAndrew Boyer __le64 octets_tx_ok; 2381126fe197SAndrew Boyer __le64 octets_tx_total; 2382126fe197SAndrew Boyer __le64 frames_tx_unicast; 2383126fe197SAndrew Boyer __le64 frames_tx_multicast; 2384126fe197SAndrew Boyer __le64 frames_tx_broadcast; 2385126fe197SAndrew Boyer __le64 frames_tx_pause; 2386126fe197SAndrew Boyer }; 2387126fe197SAndrew Boyer 2388126fe197SAndrew Boyer enum ionic_pb_buffer_drop_stats { 2389126fe197SAndrew Boyer IONIC_BUFFER_INTRINSIC_DROP = 0, 2390126fe197SAndrew Boyer IONIC_BUFFER_DISCARDED, 2391126fe197SAndrew Boyer IONIC_BUFFER_ADMITTED, 2392126fe197SAndrew Boyer IONIC_BUFFER_OUT_OF_CELLS_DROP, 2393126fe197SAndrew Boyer IONIC_BUFFER_OUT_OF_CELLS_DROP_2, 2394126fe197SAndrew Boyer IONIC_BUFFER_OUT_OF_CREDIT_DROP, 2395126fe197SAndrew Boyer IONIC_BUFFER_TRUNCATION_DROP, 2396126fe197SAndrew Boyer IONIC_BUFFER_PORT_DISABLED_DROP, 2397126fe197SAndrew Boyer IONIC_BUFFER_COPY_TO_CPU_TAIL_DROP, 2398126fe197SAndrew Boyer IONIC_BUFFER_SPAN_TAIL_DROP, 2399126fe197SAndrew Boyer IONIC_BUFFER_MIN_SIZE_VIOLATION_DROP, 2400126fe197SAndrew Boyer IONIC_BUFFER_ENQUEUE_ERROR_DROP, 2401126fe197SAndrew Boyer IONIC_BUFFER_INVALID_PORT_DROP, 2402126fe197SAndrew Boyer IONIC_BUFFER_INVALID_OUTPUT_QUEUE_DROP, 2403126fe197SAndrew Boyer IONIC_BUFFER_DROP_MAX, 2404126fe197SAndrew Boyer }; 2405126fe197SAndrew Boyer 2406126fe197SAndrew Boyer enum ionic_oflow_drop_stats { 2407126fe197SAndrew Boyer IONIC_OFLOW_OCCUPANCY_DROP, 2408126fe197SAndrew Boyer IONIC_OFLOW_EMERGENCY_STOP_DROP, 2409126fe197SAndrew Boyer IONIC_OFLOW_WRITE_BUFFER_ACK_FILL_UP_DROP, 2410126fe197SAndrew Boyer IONIC_OFLOW_WRITE_BUFFER_ACK_FULL_DROP, 2411126fe197SAndrew Boyer IONIC_OFLOW_WRITE_BUFFER_FULL_DROP, 2412126fe197SAndrew Boyer IONIC_OFLOW_CONTROL_FIFO_FULL_DROP, 2413126fe197SAndrew Boyer IONIC_OFLOW_DROP_MAX, 2414126fe197SAndrew Boyer }; 2415126fe197SAndrew Boyer 2416126fe197SAndrew Boyer /** 2417126fe197SAndrew Boyer * struct port_pb_stats - packet buffers system stats 2418126fe197SAndrew Boyer * uses ionic_pb_buffer_drop_stats for drop_counts[] 2419126fe197SAndrew Boyer */ 2420126fe197SAndrew Boyer struct ionic_port_pb_stats { 2421126fe197SAndrew Boyer __le64 sop_count_in; 2422126fe197SAndrew Boyer __le64 eop_count_in; 2423126fe197SAndrew Boyer __le64 sop_count_out; 2424126fe197SAndrew Boyer __le64 eop_count_out; 2425126fe197SAndrew Boyer __le64 drop_counts[IONIC_BUFFER_DROP_MAX]; 2426126fe197SAndrew Boyer __le64 input_queue_buffer_occupancy[IONIC_QOS_TC_MAX]; 2427126fe197SAndrew Boyer __le64 input_queue_port_monitor[IONIC_QOS_TC_MAX]; 2428126fe197SAndrew Boyer __le64 output_queue_port_monitor[IONIC_QOS_TC_MAX]; 2429126fe197SAndrew Boyer __le64 oflow_drop_counts[IONIC_OFLOW_DROP_MAX]; 2430126fe197SAndrew Boyer __le64 input_queue_good_pkts_in[IONIC_QOS_TC_MAX]; 2431126fe197SAndrew Boyer __le64 input_queue_good_pkts_out[IONIC_QOS_TC_MAX]; 2432126fe197SAndrew Boyer __le64 input_queue_err_pkts_in[IONIC_QOS_TC_MAX]; 2433126fe197SAndrew Boyer __le64 input_queue_fifo_depth[IONIC_QOS_TC_MAX]; 2434126fe197SAndrew Boyer __le64 input_queue_max_fifo_depth[IONIC_QOS_TC_MAX]; 2435126fe197SAndrew Boyer __le64 input_queue_peak_occupancy[IONIC_QOS_TC_MAX]; 2436126fe197SAndrew Boyer __le64 output_queue_buffer_occupancy[IONIC_QOS_TC_MAX]; 2437126fe197SAndrew Boyer }; 2438126fe197SAndrew Boyer 2439126fe197SAndrew Boyer /** 2440126fe197SAndrew Boyer * enum ionic_port_type - Port types 2441126fe197SAndrew Boyer * @IONIC_ETH_UNKNOWN: Port type not configured 2442126fe197SAndrew Boyer * @IONIC_ETH_HOST: Port carries ethernet traffic (inband) 2443126fe197SAndrew Boyer * @IONIC_ETH_HOST_MGMT: Port carries mgmt traffic (out-of-band) 2444126fe197SAndrew Boyer * @IONIC_ETH_MNIC_OOB_MGMT: 2445126fe197SAndrew Boyer * @IONIC_ETH_MNIC_INTERNAL_MGMT: 2446126fe197SAndrew Boyer * @IONIC_ETH_MNIC_INBAND_MGMT: 2447126fe197SAndrew Boyer * @IONIC_ETH_MNIC_CPU: 2448126fe197SAndrew Boyer * @IONIC_ETH_MNIC_LEARN: 2449126fe197SAndrew Boyer * @IONIC_ETH_MNIC_CONTROL: 2450126fe197SAndrew Boyer */ 2451126fe197SAndrew Boyer enum ionic_port_type { 2452126fe197SAndrew Boyer IONIC_ETH_UNKNOWN, 2453126fe197SAndrew Boyer IONIC_ETH_HOST, 2454126fe197SAndrew Boyer IONIC_ETH_HOST_MGMT, 2455126fe197SAndrew Boyer IONIC_ETH_MNIC_OOB_MGMT, 2456126fe197SAndrew Boyer IONIC_ETH_MNIC_INTERNAL_MGMT, 2457126fe197SAndrew Boyer IONIC_ETH_MNIC_INBAND_MGMT, 2458126fe197SAndrew Boyer IONIC_ETH_MNIC_CPU, 2459126fe197SAndrew Boyer IONIC_ETH_MNIC_LEARN, 2460126fe197SAndrew Boyer IONIC_ETH_MNIC_CONTROL, 246101489e5dSAlfredo Cardigliano }; 246201489e5dSAlfredo Cardigliano 246301489e5dSAlfredo Cardigliano /** 246401489e5dSAlfredo Cardigliano * struct ionic_port_identity - port identity structure 246501489e5dSAlfredo Cardigliano * @version: identity structure version 2466126fe197SAndrew Boyer * @type: type of port (enum ionic_port_type) 246701489e5dSAlfredo Cardigliano * @num_lanes: number of lanes for the port 246801489e5dSAlfredo Cardigliano * @autoneg: autoneg supported 246901489e5dSAlfredo Cardigliano * @min_frame_size: minimum frame size supported 247001489e5dSAlfredo Cardigliano * @max_frame_size: maximum frame size supported 247101489e5dSAlfredo Cardigliano * @fec_type: supported fec types 247201489e5dSAlfredo Cardigliano * @pause_type: supported pause types 247301489e5dSAlfredo Cardigliano * @loopback_mode: supported loopback mode 247401489e5dSAlfredo Cardigliano * @speeds: supported speeds 247501489e5dSAlfredo Cardigliano * @config: current port configuration 247601489e5dSAlfredo Cardigliano */ 247701489e5dSAlfredo Cardigliano union ionic_port_identity { 247801489e5dSAlfredo Cardigliano struct { 247901489e5dSAlfredo Cardigliano u8 version; 248001489e5dSAlfredo Cardigliano u8 type; 248101489e5dSAlfredo Cardigliano u8 num_lanes; 248201489e5dSAlfredo Cardigliano u8 autoneg; 248301489e5dSAlfredo Cardigliano __le32 min_frame_size; 248401489e5dSAlfredo Cardigliano __le32 max_frame_size; 248501489e5dSAlfredo Cardigliano u8 fec_type[4]; 248601489e5dSAlfredo Cardigliano u8 pause_type[2]; 248701489e5dSAlfredo Cardigliano u8 loopback_mode[2]; 248801489e5dSAlfredo Cardigliano __le32 speeds[16]; 248901489e5dSAlfredo Cardigliano u8 rsvd2[44]; 249001489e5dSAlfredo Cardigliano union ionic_port_config config; 249101489e5dSAlfredo Cardigliano }; 2492126fe197SAndrew Boyer __le32 words[478]; 249301489e5dSAlfredo Cardigliano }; 249401489e5dSAlfredo Cardigliano 249501489e5dSAlfredo Cardigliano /** 249601489e5dSAlfredo Cardigliano * struct ionic_port_info - port info structure 2497126fe197SAndrew Boyer * @config: Port configuration data 2498126fe197SAndrew Boyer * @status: Port status data 2499126fe197SAndrew Boyer * @stats: Port statistics data 2500126fe197SAndrew Boyer * @mgmt_stats: Port management statistics data 2501126fe197SAndrew Boyer * @port_pb_drop_stats: uplink pb drop stats 250201489e5dSAlfredo Cardigliano */ 250301489e5dSAlfredo Cardigliano struct ionic_port_info { 250401489e5dSAlfredo Cardigliano union ionic_port_config config; 250501489e5dSAlfredo Cardigliano struct ionic_port_status status; 2506126fe197SAndrew Boyer union { 250701489e5dSAlfredo Cardigliano struct ionic_port_stats stats; 2508126fe197SAndrew Boyer struct ionic_mgmt_port_stats mgmt_stats; 2509126fe197SAndrew Boyer }; 2510126fe197SAndrew Boyer /* room for pb_stats to start at 2k offset */ 2511126fe197SAndrew Boyer u8 rsvd[760]; 2512126fe197SAndrew Boyer struct ionic_port_pb_stats pb_stats; 251301489e5dSAlfredo Cardigliano }; 251401489e5dSAlfredo Cardigliano 251501489e5dSAlfredo Cardigliano /** 2516126fe197SAndrew Boyer * struct ionic_lif_stats - LIF statistics structure 251701489e5dSAlfredo Cardigliano */ 251801489e5dSAlfredo Cardigliano struct ionic_lif_stats { 251901489e5dSAlfredo Cardigliano /* RX */ 252001489e5dSAlfredo Cardigliano __le64 rx_ucast_bytes; 252101489e5dSAlfredo Cardigliano __le64 rx_ucast_packets; 252201489e5dSAlfredo Cardigliano __le64 rx_mcast_bytes; 252301489e5dSAlfredo Cardigliano __le64 rx_mcast_packets; 252401489e5dSAlfredo Cardigliano __le64 rx_bcast_bytes; 252501489e5dSAlfredo Cardigliano __le64 rx_bcast_packets; 252601489e5dSAlfredo Cardigliano __le64 rsvd0; 252701489e5dSAlfredo Cardigliano __le64 rsvd1; 252801489e5dSAlfredo Cardigliano /* RX drops */ 252901489e5dSAlfredo Cardigliano __le64 rx_ucast_drop_bytes; 253001489e5dSAlfredo Cardigliano __le64 rx_ucast_drop_packets; 253101489e5dSAlfredo Cardigliano __le64 rx_mcast_drop_bytes; 253201489e5dSAlfredo Cardigliano __le64 rx_mcast_drop_packets; 253301489e5dSAlfredo Cardigliano __le64 rx_bcast_drop_bytes; 253401489e5dSAlfredo Cardigliano __le64 rx_bcast_drop_packets; 253501489e5dSAlfredo Cardigliano __le64 rx_dma_error; 253601489e5dSAlfredo Cardigliano __le64 rsvd2; 253701489e5dSAlfredo Cardigliano /* TX */ 253801489e5dSAlfredo Cardigliano __le64 tx_ucast_bytes; 253901489e5dSAlfredo Cardigliano __le64 tx_ucast_packets; 254001489e5dSAlfredo Cardigliano __le64 tx_mcast_bytes; 254101489e5dSAlfredo Cardigliano __le64 tx_mcast_packets; 254201489e5dSAlfredo Cardigliano __le64 tx_bcast_bytes; 254301489e5dSAlfredo Cardigliano __le64 tx_bcast_packets; 254401489e5dSAlfredo Cardigliano __le64 rsvd3; 254501489e5dSAlfredo Cardigliano __le64 rsvd4; 254601489e5dSAlfredo Cardigliano /* TX drops */ 254701489e5dSAlfredo Cardigliano __le64 tx_ucast_drop_bytes; 254801489e5dSAlfredo Cardigliano __le64 tx_ucast_drop_packets; 254901489e5dSAlfredo Cardigliano __le64 tx_mcast_drop_bytes; 255001489e5dSAlfredo Cardigliano __le64 tx_mcast_drop_packets; 255101489e5dSAlfredo Cardigliano __le64 tx_bcast_drop_bytes; 255201489e5dSAlfredo Cardigliano __le64 tx_bcast_drop_packets; 255301489e5dSAlfredo Cardigliano __le64 tx_dma_error; 255401489e5dSAlfredo Cardigliano __le64 rsvd5; 255501489e5dSAlfredo Cardigliano /* Rx Queue/Ring drops */ 255601489e5dSAlfredo Cardigliano __le64 rx_queue_disabled; 255701489e5dSAlfredo Cardigliano __le64 rx_queue_empty; 255801489e5dSAlfredo Cardigliano __le64 rx_queue_error; 255901489e5dSAlfredo Cardigliano __le64 rx_desc_fetch_error; 256001489e5dSAlfredo Cardigliano __le64 rx_desc_data_error; 256101489e5dSAlfredo Cardigliano __le64 rsvd6; 256201489e5dSAlfredo Cardigliano __le64 rsvd7; 256301489e5dSAlfredo Cardigliano __le64 rsvd8; 256401489e5dSAlfredo Cardigliano /* Tx Queue/Ring drops */ 256501489e5dSAlfredo Cardigliano __le64 tx_queue_disabled; 256601489e5dSAlfredo Cardigliano __le64 tx_queue_error; 256701489e5dSAlfredo Cardigliano __le64 tx_desc_fetch_error; 256801489e5dSAlfredo Cardigliano __le64 tx_desc_data_error; 2569126fe197SAndrew Boyer __le64 tx_queue_empty; 257001489e5dSAlfredo Cardigliano __le64 rsvd10; 257101489e5dSAlfredo Cardigliano __le64 rsvd11; 257201489e5dSAlfredo Cardigliano __le64 rsvd12; 257301489e5dSAlfredo Cardigliano 257401489e5dSAlfredo Cardigliano /* RDMA/ROCE TX */ 257501489e5dSAlfredo Cardigliano __le64 tx_rdma_ucast_bytes; 257601489e5dSAlfredo Cardigliano __le64 tx_rdma_ucast_packets; 257701489e5dSAlfredo Cardigliano __le64 tx_rdma_mcast_bytes; 257801489e5dSAlfredo Cardigliano __le64 tx_rdma_mcast_packets; 257901489e5dSAlfredo Cardigliano __le64 tx_rdma_cnp_packets; 258001489e5dSAlfredo Cardigliano __le64 rsvd13; 258101489e5dSAlfredo Cardigliano __le64 rsvd14; 258201489e5dSAlfredo Cardigliano __le64 rsvd15; 258301489e5dSAlfredo Cardigliano 258401489e5dSAlfredo Cardigliano /* RDMA/ROCE RX */ 258501489e5dSAlfredo Cardigliano __le64 rx_rdma_ucast_bytes; 258601489e5dSAlfredo Cardigliano __le64 rx_rdma_ucast_packets; 258701489e5dSAlfredo Cardigliano __le64 rx_rdma_mcast_bytes; 258801489e5dSAlfredo Cardigliano __le64 rx_rdma_mcast_packets; 258901489e5dSAlfredo Cardigliano __le64 rx_rdma_cnp_packets; 259001489e5dSAlfredo Cardigliano __le64 rx_rdma_ecn_packets; 259101489e5dSAlfredo Cardigliano __le64 rsvd16; 259201489e5dSAlfredo Cardigliano __le64 rsvd17; 259301489e5dSAlfredo Cardigliano 259401489e5dSAlfredo Cardigliano __le64 rsvd18; 259501489e5dSAlfredo Cardigliano __le64 rsvd19; 259601489e5dSAlfredo Cardigliano __le64 rsvd20; 259701489e5dSAlfredo Cardigliano __le64 rsvd21; 259801489e5dSAlfredo Cardigliano __le64 rsvd22; 259901489e5dSAlfredo Cardigliano __le64 rsvd23; 260001489e5dSAlfredo Cardigliano __le64 rsvd24; 260101489e5dSAlfredo Cardigliano __le64 rsvd25; 260201489e5dSAlfredo Cardigliano 260301489e5dSAlfredo Cardigliano __le64 rsvd26; 260401489e5dSAlfredo Cardigliano __le64 rsvd27; 260501489e5dSAlfredo Cardigliano __le64 rsvd28; 260601489e5dSAlfredo Cardigliano __le64 rsvd29; 260701489e5dSAlfredo Cardigliano __le64 rsvd30; 260801489e5dSAlfredo Cardigliano __le64 rsvd31; 260901489e5dSAlfredo Cardigliano __le64 rsvd32; 261001489e5dSAlfredo Cardigliano __le64 rsvd33; 261101489e5dSAlfredo Cardigliano 261201489e5dSAlfredo Cardigliano __le64 rsvd34; 261301489e5dSAlfredo Cardigliano __le64 rsvd35; 261401489e5dSAlfredo Cardigliano __le64 rsvd36; 261501489e5dSAlfredo Cardigliano __le64 rsvd37; 261601489e5dSAlfredo Cardigliano __le64 rsvd38; 261701489e5dSAlfredo Cardigliano __le64 rsvd39; 261801489e5dSAlfredo Cardigliano __le64 rsvd40; 261901489e5dSAlfredo Cardigliano __le64 rsvd41; 262001489e5dSAlfredo Cardigliano 262101489e5dSAlfredo Cardigliano __le64 rsvd42; 262201489e5dSAlfredo Cardigliano __le64 rsvd43; 262301489e5dSAlfredo Cardigliano __le64 rsvd44; 262401489e5dSAlfredo Cardigliano __le64 rsvd45; 262501489e5dSAlfredo Cardigliano __le64 rsvd46; 262601489e5dSAlfredo Cardigliano __le64 rsvd47; 262701489e5dSAlfredo Cardigliano __le64 rsvd48; 262801489e5dSAlfredo Cardigliano __le64 rsvd49; 262901489e5dSAlfredo Cardigliano 263001489e5dSAlfredo Cardigliano /* RDMA/ROCE REQ Error/Debugs (768 - 895) */ 263101489e5dSAlfredo Cardigliano __le64 rdma_req_rx_pkt_seq_err; 263201489e5dSAlfredo Cardigliano __le64 rdma_req_rx_rnr_retry_err; 263301489e5dSAlfredo Cardigliano __le64 rdma_req_rx_remote_access_err; 263401489e5dSAlfredo Cardigliano __le64 rdma_req_rx_remote_inv_req_err; 263501489e5dSAlfredo Cardigliano __le64 rdma_req_rx_remote_oper_err; 263601489e5dSAlfredo Cardigliano __le64 rdma_req_rx_implied_nak_seq_err; 263701489e5dSAlfredo Cardigliano __le64 rdma_req_rx_cqe_err; 263801489e5dSAlfredo Cardigliano __le64 rdma_req_rx_cqe_flush_err; 263901489e5dSAlfredo Cardigliano 264001489e5dSAlfredo Cardigliano __le64 rdma_req_rx_dup_responses; 264101489e5dSAlfredo Cardigliano __le64 rdma_req_rx_invalid_packets; 264201489e5dSAlfredo Cardigliano __le64 rdma_req_tx_local_access_err; 264301489e5dSAlfredo Cardigliano __le64 rdma_req_tx_local_oper_err; 264401489e5dSAlfredo Cardigliano __le64 rdma_req_tx_memory_mgmt_err; 264501489e5dSAlfredo Cardigliano __le64 rsvd52; 264601489e5dSAlfredo Cardigliano __le64 rsvd53; 264701489e5dSAlfredo Cardigliano __le64 rsvd54; 264801489e5dSAlfredo Cardigliano 264901489e5dSAlfredo Cardigliano /* RDMA/ROCE RESP Error/Debugs (896 - 1023) */ 265001489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_dup_requests; 265101489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_out_of_buffer; 265201489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_out_of_seq_pkts; 265301489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_cqe_err; 265401489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_cqe_flush_err; 265501489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_local_len_err; 265601489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_inv_request_err; 265701489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_local_qp_oper_err; 265801489e5dSAlfredo Cardigliano 265901489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_out_of_atomic_resource; 266001489e5dSAlfredo Cardigliano __le64 rdma_resp_tx_pkt_seq_err; 266101489e5dSAlfredo Cardigliano __le64 rdma_resp_tx_remote_inv_req_err; 266201489e5dSAlfredo Cardigliano __le64 rdma_resp_tx_remote_access_err; 266301489e5dSAlfredo Cardigliano __le64 rdma_resp_tx_remote_oper_err; 266401489e5dSAlfredo Cardigliano __le64 rdma_resp_tx_rnr_retry_err; 266501489e5dSAlfredo Cardigliano __le64 rsvd57; 266601489e5dSAlfredo Cardigliano __le64 rsvd58; 266701489e5dSAlfredo Cardigliano }; 266801489e5dSAlfredo Cardigliano 266901489e5dSAlfredo Cardigliano /** 2670126fe197SAndrew Boyer * struct ionic_lif_info - LIF info structure 2671126fe197SAndrew Boyer * @config: LIF configuration structure 2672126fe197SAndrew Boyer * @status: LIF status structure 2673126fe197SAndrew Boyer * @stats: LIF statistics structure 267401489e5dSAlfredo Cardigliano */ 267501489e5dSAlfredo Cardigliano struct ionic_lif_info { 267601489e5dSAlfredo Cardigliano union ionic_lif_config config; 267701489e5dSAlfredo Cardigliano struct ionic_lif_status status; 267801489e5dSAlfredo Cardigliano struct ionic_lif_stats stats; 267901489e5dSAlfredo Cardigliano }; 268001489e5dSAlfredo Cardigliano 268101489e5dSAlfredo Cardigliano union ionic_dev_cmd { 268201489e5dSAlfredo Cardigliano u32 words[16]; 268301489e5dSAlfredo Cardigliano struct ionic_admin_cmd cmd; 268401489e5dSAlfredo Cardigliano struct ionic_nop_cmd nop; 268501489e5dSAlfredo Cardigliano 268601489e5dSAlfredo Cardigliano struct ionic_dev_identify_cmd identify; 268701489e5dSAlfredo Cardigliano struct ionic_dev_init_cmd init; 268801489e5dSAlfredo Cardigliano struct ionic_dev_reset_cmd reset; 268901489e5dSAlfredo Cardigliano struct ionic_dev_getattr_cmd getattr; 269001489e5dSAlfredo Cardigliano struct ionic_dev_setattr_cmd setattr; 269101489e5dSAlfredo Cardigliano 269201489e5dSAlfredo Cardigliano struct ionic_port_identify_cmd port_identify; 269301489e5dSAlfredo Cardigliano struct ionic_port_init_cmd port_init; 269401489e5dSAlfredo Cardigliano struct ionic_port_reset_cmd port_reset; 269501489e5dSAlfredo Cardigliano struct ionic_port_getattr_cmd port_getattr; 269601489e5dSAlfredo Cardigliano struct ionic_port_setattr_cmd port_setattr; 269701489e5dSAlfredo Cardigliano 2698126fe197SAndrew Boyer struct ionic_vf_setattr_cmd vf_setattr; 2699126fe197SAndrew Boyer struct ionic_vf_getattr_cmd vf_getattr; 2700126fe197SAndrew Boyer 270101489e5dSAlfredo Cardigliano struct ionic_lif_identify_cmd lif_identify; 270201489e5dSAlfredo Cardigliano struct ionic_lif_init_cmd lif_init; 270301489e5dSAlfredo Cardigliano struct ionic_lif_reset_cmd lif_reset; 270401489e5dSAlfredo Cardigliano 270501489e5dSAlfredo Cardigliano struct ionic_qos_identify_cmd qos_identify; 270601489e5dSAlfredo Cardigliano struct ionic_qos_init_cmd qos_init; 270701489e5dSAlfredo Cardigliano struct ionic_qos_reset_cmd qos_reset; 2708126fe197SAndrew Boyer struct ionic_qos_clear_stats_cmd qos_clear_stats; 270901489e5dSAlfredo Cardigliano 2710126fe197SAndrew Boyer struct ionic_q_identify_cmd q_identify; 271101489e5dSAlfredo Cardigliano struct ionic_q_init_cmd q_init; 2712126fe197SAndrew Boyer struct ionic_q_control_cmd q_control; 271301489e5dSAlfredo Cardigliano }; 271401489e5dSAlfredo Cardigliano 271501489e5dSAlfredo Cardigliano union ionic_dev_cmd_comp { 271601489e5dSAlfredo Cardigliano u32 words[4]; 271701489e5dSAlfredo Cardigliano u8 status; 271801489e5dSAlfredo Cardigliano struct ionic_admin_comp comp; 271901489e5dSAlfredo Cardigliano struct ionic_nop_comp nop; 272001489e5dSAlfredo Cardigliano 272101489e5dSAlfredo Cardigliano struct ionic_dev_identify_comp identify; 272201489e5dSAlfredo Cardigliano struct ionic_dev_init_comp init; 272301489e5dSAlfredo Cardigliano struct ionic_dev_reset_comp reset; 272401489e5dSAlfredo Cardigliano struct ionic_dev_getattr_comp getattr; 272501489e5dSAlfredo Cardigliano struct ionic_dev_setattr_comp setattr; 272601489e5dSAlfredo Cardigliano 272701489e5dSAlfredo Cardigliano struct ionic_port_identify_comp port_identify; 272801489e5dSAlfredo Cardigliano struct ionic_port_init_comp port_init; 272901489e5dSAlfredo Cardigliano struct ionic_port_reset_comp port_reset; 273001489e5dSAlfredo Cardigliano struct ionic_port_getattr_comp port_getattr; 273101489e5dSAlfredo Cardigliano struct ionic_port_setattr_comp port_setattr; 273201489e5dSAlfredo Cardigliano 2733126fe197SAndrew Boyer struct ionic_vf_setattr_comp vf_setattr; 2734126fe197SAndrew Boyer struct ionic_vf_getattr_comp vf_getattr; 2735126fe197SAndrew Boyer 273601489e5dSAlfredo Cardigliano struct ionic_lif_identify_comp lif_identify; 273701489e5dSAlfredo Cardigliano struct ionic_lif_init_comp lif_init; 273801489e5dSAlfredo Cardigliano ionic_lif_reset_comp lif_reset; 273901489e5dSAlfredo Cardigliano 274001489e5dSAlfredo Cardigliano struct ionic_qos_identify_comp qos_identify; 274101489e5dSAlfredo Cardigliano ionic_qos_init_comp qos_init; 274201489e5dSAlfredo Cardigliano ionic_qos_reset_comp qos_reset; 274301489e5dSAlfredo Cardigliano 2744126fe197SAndrew Boyer struct ionic_q_identify_comp q_identify; 274501489e5dSAlfredo Cardigliano struct ionic_q_init_comp q_init; 274601489e5dSAlfredo Cardigliano }; 274701489e5dSAlfredo Cardigliano 274801489e5dSAlfredo Cardigliano /** 2749126fe197SAndrew Boyer * union ionic_dev_info_regs - Device info register format (read-only) 2750126fe197SAndrew Boyer * @signature: Signature value of 0x44455649 ('DEVI') 2751126fe197SAndrew Boyer * @version: Current version of info 2752126fe197SAndrew Boyer * @asic_type: Asic type 2753126fe197SAndrew Boyer * @asic_rev: Asic revision 2754126fe197SAndrew Boyer * @fw_status: Firmware status 2755126fe197SAndrew Boyer * @fw_heartbeat: Firmware heartbeat counter 2756126fe197SAndrew Boyer * @serial_num: Serial number 2757126fe197SAndrew Boyer * @fw_version: Firmware version 275801489e5dSAlfredo Cardigliano */ 275901489e5dSAlfredo Cardigliano union ionic_dev_info_regs { 276001489e5dSAlfredo Cardigliano #define IONIC_DEVINFO_FWVERS_BUFLEN 32 276101489e5dSAlfredo Cardigliano #define IONIC_DEVINFO_SERIAL_BUFLEN 32 276201489e5dSAlfredo Cardigliano struct { 276301489e5dSAlfredo Cardigliano u32 signature; 276401489e5dSAlfredo Cardigliano u8 version; 276501489e5dSAlfredo Cardigliano u8 asic_type; 276601489e5dSAlfredo Cardigliano u8 asic_rev; 2767126fe197SAndrew Boyer #define IONIC_FW_STS_F_RUNNING 0x1 276801489e5dSAlfredo Cardigliano u8 fw_status; 276901489e5dSAlfredo Cardigliano u32 fw_heartbeat; 277001489e5dSAlfredo Cardigliano char fw_version[IONIC_DEVINFO_FWVERS_BUFLEN]; 277101489e5dSAlfredo Cardigliano char serial_num[IONIC_DEVINFO_SERIAL_BUFLEN]; 277201489e5dSAlfredo Cardigliano }; 277301489e5dSAlfredo Cardigliano u32 words[512]; 277401489e5dSAlfredo Cardigliano }; 277501489e5dSAlfredo Cardigliano 277601489e5dSAlfredo Cardigliano /** 277701489e5dSAlfredo Cardigliano * union ionic_dev_cmd_regs - Device command register format (read-write) 2778126fe197SAndrew Boyer * @doorbell: Device Cmd Doorbell, write-only 277901489e5dSAlfredo Cardigliano * Write a 1 to signal device to process cmd, 278001489e5dSAlfredo Cardigliano * poll done for completion. 2781126fe197SAndrew Boyer * @done: Done indicator, bit 0 == 1 when command is complete 278201489e5dSAlfredo Cardigliano * @cmd: Opcode-specific command bytes 278301489e5dSAlfredo Cardigliano * @comp: Opcode-specific response bytes 278401489e5dSAlfredo Cardigliano * @data: Opcode-specific side-data 278501489e5dSAlfredo Cardigliano */ 278601489e5dSAlfredo Cardigliano union ionic_dev_cmd_regs { 278701489e5dSAlfredo Cardigliano struct { 278801489e5dSAlfredo Cardigliano u32 doorbell; 278901489e5dSAlfredo Cardigliano u32 done; 279001489e5dSAlfredo Cardigliano union ionic_dev_cmd cmd; 279101489e5dSAlfredo Cardigliano union ionic_dev_cmd_comp comp; 279201489e5dSAlfredo Cardigliano u8 rsvd[48]; 279301489e5dSAlfredo Cardigliano u32 data[478]; 2794126fe197SAndrew Boyer } __rte_packed; 279501489e5dSAlfredo Cardigliano u32 words[512]; 279601489e5dSAlfredo Cardigliano }; 279701489e5dSAlfredo Cardigliano 279801489e5dSAlfredo Cardigliano /** 2799126fe197SAndrew Boyer * union ionic_dev_regs - Device register format for bar 0 page 0 280001489e5dSAlfredo Cardigliano * @info: Device info registers 280101489e5dSAlfredo Cardigliano * @devcmd: Device command registers 280201489e5dSAlfredo Cardigliano */ 280301489e5dSAlfredo Cardigliano union ionic_dev_regs { 280401489e5dSAlfredo Cardigliano struct { 280501489e5dSAlfredo Cardigliano union ionic_dev_info_regs info; 280601489e5dSAlfredo Cardigliano union ionic_dev_cmd_regs devcmd; 2807126fe197SAndrew Boyer } __rte_packed; 280801489e5dSAlfredo Cardigliano __le32 words[1024]; 280901489e5dSAlfredo Cardigliano }; 281001489e5dSAlfredo Cardigliano 281101489e5dSAlfredo Cardigliano union ionic_adminq_cmd { 281201489e5dSAlfredo Cardigliano struct ionic_admin_cmd cmd; 281301489e5dSAlfredo Cardigliano struct ionic_nop_cmd nop; 2814126fe197SAndrew Boyer struct ionic_q_identify_cmd q_identify; 281501489e5dSAlfredo Cardigliano struct ionic_q_init_cmd q_init; 281601489e5dSAlfredo Cardigliano struct ionic_q_control_cmd q_control; 281701489e5dSAlfredo Cardigliano struct ionic_lif_setattr_cmd lif_setattr; 281801489e5dSAlfredo Cardigliano struct ionic_lif_getattr_cmd lif_getattr; 281901489e5dSAlfredo Cardigliano struct ionic_rx_mode_set_cmd rx_mode_set; 282001489e5dSAlfredo Cardigliano struct ionic_rx_filter_add_cmd rx_filter_add; 282101489e5dSAlfredo Cardigliano struct ionic_rx_filter_del_cmd rx_filter_del; 282201489e5dSAlfredo Cardigliano struct ionic_rdma_reset_cmd rdma_reset; 282301489e5dSAlfredo Cardigliano struct ionic_rdma_queue_cmd rdma_queue; 282401489e5dSAlfredo Cardigliano struct ionic_fw_download_cmd fw_download; 282501489e5dSAlfredo Cardigliano struct ionic_fw_control_cmd fw_control; 282601489e5dSAlfredo Cardigliano }; 282701489e5dSAlfredo Cardigliano 282801489e5dSAlfredo Cardigliano union ionic_adminq_comp { 282901489e5dSAlfredo Cardigliano struct ionic_admin_comp comp; 283001489e5dSAlfredo Cardigliano struct ionic_nop_comp nop; 2831126fe197SAndrew Boyer struct ionic_q_identify_comp q_identify; 283201489e5dSAlfredo Cardigliano struct ionic_q_init_comp q_init; 283301489e5dSAlfredo Cardigliano struct ionic_lif_setattr_comp lif_setattr; 283401489e5dSAlfredo Cardigliano struct ionic_lif_getattr_comp lif_getattr; 283501489e5dSAlfredo Cardigliano struct ionic_rx_filter_add_comp rx_filter_add; 283601489e5dSAlfredo Cardigliano struct ionic_fw_control_comp fw_control; 283701489e5dSAlfredo Cardigliano }; 283801489e5dSAlfredo Cardigliano 283901489e5dSAlfredo Cardigliano #define IONIC_BARS_MAX 6 284001489e5dSAlfredo Cardigliano #define IONIC_PCI_BAR_DBELL 1 284101489e5dSAlfredo Cardigliano 284201489e5dSAlfredo Cardigliano /* BAR0 */ 284301489e5dSAlfredo Cardigliano #define IONIC_BAR0_SIZE 0x8000 284401489e5dSAlfredo Cardigliano 284501489e5dSAlfredo Cardigliano #define IONIC_BAR0_DEV_INFO_REGS_OFFSET 0x0000 284601489e5dSAlfredo Cardigliano #define IONIC_BAR0_DEV_CMD_REGS_OFFSET 0x0800 284701489e5dSAlfredo Cardigliano #define IONIC_BAR0_DEV_CMD_DATA_REGS_OFFSET 0x0c00 284801489e5dSAlfredo Cardigliano #define IONIC_BAR0_INTR_STATUS_OFFSET 0x1000 284901489e5dSAlfredo Cardigliano #define IONIC_BAR0_INTR_CTRL_OFFSET 0x2000 285001489e5dSAlfredo Cardigliano #define IONIC_DEV_CMD_DONE 0x00000001 285101489e5dSAlfredo Cardigliano 285201489e5dSAlfredo Cardigliano #define IONIC_ASIC_TYPE_CAPRI 0 285301489e5dSAlfredo Cardigliano 285401489e5dSAlfredo Cardigliano /** 285501489e5dSAlfredo Cardigliano * struct ionic_doorbell - Doorbell register layout 285601489e5dSAlfredo Cardigliano * @p_index: Producer index 2857126fe197SAndrew Boyer * @ring: Selects the specific ring of the queue to update 285801489e5dSAlfredo Cardigliano * Type-specific meaning: 2859126fe197SAndrew Boyer * ring=0: Default producer/consumer queue 286001489e5dSAlfredo Cardigliano * ring=1: (CQ, EQ) Re-Arm queue. RDMA CQs 286101489e5dSAlfredo Cardigliano * send events to EQs when armed. EQs send 286201489e5dSAlfredo Cardigliano * interrupts when armed. 2863126fe197SAndrew Boyer * @qid_lo: Queue destination for the producer index and flags (low bits) 2864126fe197SAndrew Boyer * @qid_hi: Queue destination for the producer index and flags (high bits) 286501489e5dSAlfredo Cardigliano */ 286601489e5dSAlfredo Cardigliano struct ionic_doorbell { 286701489e5dSAlfredo Cardigliano __le16 p_index; 286801489e5dSAlfredo Cardigliano u8 ring; 286901489e5dSAlfredo Cardigliano u8 qid_lo; 287001489e5dSAlfredo Cardigliano __le16 qid_hi; 287101489e5dSAlfredo Cardigliano u16 rsvd2; 287201489e5dSAlfredo Cardigliano }; 287301489e5dSAlfredo Cardigliano 2874126fe197SAndrew Boyer /** 2875126fe197SAndrew Boyer * struct ionic_intr_ctrl - Interrupt control register 2876126fe197SAndrew Boyer * @coalescing_init: Coalescing timer initial value, in 2877126fe197SAndrew Boyer * device units. Use @identity->intr_coal_mult 2878126fe197SAndrew Boyer * and @identity->intr_coal_div to convert from 2879126fe197SAndrew Boyer * usecs to device units: 2880126fe197SAndrew Boyer * 2881126fe197SAndrew Boyer * coal_init = coal_usecs * coal_mutl / coal_div 2882126fe197SAndrew Boyer * 2883126fe197SAndrew Boyer * When an interrupt is sent the interrupt 2884126fe197SAndrew Boyer * coalescing timer current value 2885126fe197SAndrew Boyer * (@coalescing_curr) is initialized with this 2886126fe197SAndrew Boyer * value and begins counting down. No more 2887126fe197SAndrew Boyer * interrupts are sent until the coalescing 2888126fe197SAndrew Boyer * timer reaches 0. When @coalescing_init=0 2889126fe197SAndrew Boyer * interrupt coalescing is effectively disabled 2890126fe197SAndrew Boyer * and every interrupt assert results in an 2891126fe197SAndrew Boyer * interrupt. Reset value: 0 2892126fe197SAndrew Boyer * @mask: Interrupt mask. When @mask=1 the interrupt 2893126fe197SAndrew Boyer * resource will not send an interrupt. When 2894126fe197SAndrew Boyer * @mask=0 the interrupt resource will send an 2895126fe197SAndrew Boyer * interrupt if an interrupt event is pending 2896126fe197SAndrew Boyer * or on the next interrupt assertion event. 2897126fe197SAndrew Boyer * Reset value: 1 2898126fe197SAndrew Boyer * @int_credits: Interrupt credits. This register indicates 2899126fe197SAndrew Boyer * how many interrupt events the hardware has 2900126fe197SAndrew Boyer * sent. When written by software this 2901126fe197SAndrew Boyer * register atomically decrements @int_credits 2902126fe197SAndrew Boyer * by the value written. When @int_credits 2903126fe197SAndrew Boyer * becomes 0 then the "pending interrupt" bit 2904126fe197SAndrew Boyer * in the Interrupt Status register is cleared 2905126fe197SAndrew Boyer * by the hardware and any pending but unsent 2906126fe197SAndrew Boyer * interrupts are cleared. 2907126fe197SAndrew Boyer * !!!IMPORTANT!!! This is a signed register. 2908126fe197SAndrew Boyer * @flags: Interrupt control flags 2909126fe197SAndrew Boyer * @unmask -- When this bit is written with a 1 2910126fe197SAndrew Boyer * the interrupt resource will set mask=0. 2911126fe197SAndrew Boyer * @coal_timer_reset -- When this 2912126fe197SAndrew Boyer * bit is written with a 1 the 2913126fe197SAndrew Boyer * @coalescing_curr will be reloaded with 2914126fe197SAndrew Boyer * @coalescing_init to reset the coalescing 2915126fe197SAndrew Boyer * timer. 2916126fe197SAndrew Boyer * @mask_on_assert: Automatically mask on assertion. When 2917126fe197SAndrew Boyer * @mask_on_assert=1 the interrupt resource 2918126fe197SAndrew Boyer * will set @mask=1 whenever an interrupt is 2919126fe197SAndrew Boyer * sent. When using interrupts in Legacy 2920126fe197SAndrew Boyer * Interrupt mode the driver must select 2921126fe197SAndrew Boyer * @mask_on_assert=0 for proper interrupt 2922126fe197SAndrew Boyer * operation. 2923126fe197SAndrew Boyer * @coalescing_curr: Coalescing timer current value, in 2924126fe197SAndrew Boyer * microseconds. When this value reaches 0 2925126fe197SAndrew Boyer * the interrupt resource is again eligible to 2926126fe197SAndrew Boyer * send an interrupt. If an interrupt event 2927126fe197SAndrew Boyer * is already pending when @coalescing_curr 2928126fe197SAndrew Boyer * reaches 0 the pending interrupt will be 2929126fe197SAndrew Boyer * sent, otherwise an interrupt will be sent 2930126fe197SAndrew Boyer * on the next interrupt assertion event. 2931126fe197SAndrew Boyer */ 2932126fe197SAndrew Boyer struct ionic_intr_ctrl { 2933126fe197SAndrew Boyer u8 coalescing_init; 2934126fe197SAndrew Boyer u8 rsvd[3]; 2935126fe197SAndrew Boyer u8 mask; 2936126fe197SAndrew Boyer u8 rsvd2[3]; 2937126fe197SAndrew Boyer u16 int_credits; 2938126fe197SAndrew Boyer u16 flags; 2939126fe197SAndrew Boyer #define INTR_F_UNMASK 0x0001 2940126fe197SAndrew Boyer #define INTR_F_TIMER_RESET 0x0002 2941126fe197SAndrew Boyer u8 mask_on_assert; 2942126fe197SAndrew Boyer u8 rsvd3[3]; 2943126fe197SAndrew Boyer u8 coalescing_curr; 2944126fe197SAndrew Boyer u8 rsvd4[3]; 2945126fe197SAndrew Boyer u32 rsvd6[3]; 2946126fe197SAndrew Boyer }; 2947126fe197SAndrew Boyer 2948126fe197SAndrew Boyer #define IONIC_INTR_CTRL_REGS_MAX 2048 2949126fe197SAndrew Boyer #define IONIC_INTR_CTRL_COAL_MAX 0x3F 2950126fe197SAndrew Boyer 2951126fe197SAndrew Boyer #define intr_to_coal(intr_ctrl) \ 2952126fe197SAndrew Boyer ((void __iomem *)&(intr_ctrl)->coalescing_init) 2953126fe197SAndrew Boyer #define intr_to_mask(intr_ctrl) \ 2954126fe197SAndrew Boyer ((void __iomem *)&(intr_ctrl)->mask) 2955126fe197SAndrew Boyer #define intr_to_credits(intr_ctrl) \ 2956126fe197SAndrew Boyer ((void __iomem *)&(intr_ctrl)->int_credits) 2957126fe197SAndrew Boyer #define intr_to_mask_on_assert(intr_ctrl)\ 2958126fe197SAndrew Boyer ((void __iomem *)&(intr_ctrl)->mask_on_assert) 2959126fe197SAndrew Boyer 296001489e5dSAlfredo Cardigliano struct ionic_intr_status { 296101489e5dSAlfredo Cardigliano u32 status[2]; 296201489e5dSAlfredo Cardigliano }; 296301489e5dSAlfredo Cardigliano 296401489e5dSAlfredo Cardigliano struct ionic_notifyq_cmd { 296501489e5dSAlfredo Cardigliano __le32 data; /* Not used but needed for qcq structure */ 296601489e5dSAlfredo Cardigliano }; 296701489e5dSAlfredo Cardigliano 296801489e5dSAlfredo Cardigliano union ionic_notifyq_comp { 296901489e5dSAlfredo Cardigliano struct ionic_notifyq_event event; 297001489e5dSAlfredo Cardigliano struct ionic_link_change_event link_change; 297101489e5dSAlfredo Cardigliano struct ionic_reset_event reset; 297201489e5dSAlfredo Cardigliano struct ionic_heartbeat_event heartbeat; 297301489e5dSAlfredo Cardigliano struct ionic_log_event log; 297401489e5dSAlfredo Cardigliano }; 297501489e5dSAlfredo Cardigliano 2976126fe197SAndrew Boyer /** 2977126fe197SAndrew Boyer * struct ionic_eq_comp - Event queue completion descriptor 2978126fe197SAndrew Boyer * 2979126fe197SAndrew Boyer * @code: Event code, see enum ionic_eq_comp_code 2980126fe197SAndrew Boyer * @lif_index: To which LIF the event pertains 2981126fe197SAndrew Boyer * @qid: To which queue id the event pertains 2982126fe197SAndrew Boyer * @gen_color: Event queue wrap counter, init 1, incr each wrap 2983126fe197SAndrew Boyer */ 2984126fe197SAndrew Boyer struct ionic_eq_comp { 2985126fe197SAndrew Boyer __le16 code; 2986126fe197SAndrew Boyer __le16 lif_index; 2987126fe197SAndrew Boyer __le32 qid; 2988126fe197SAndrew Boyer u8 rsvd[7]; 2989126fe197SAndrew Boyer u8 gen_color; 2990126fe197SAndrew Boyer }; 2991126fe197SAndrew Boyer 2992126fe197SAndrew Boyer enum ionic_eq_comp_code { 2993126fe197SAndrew Boyer IONIC_EQ_COMP_CODE_NONE = 0, 2994126fe197SAndrew Boyer IONIC_EQ_COMP_CODE_RX_COMP = 1, 2995126fe197SAndrew Boyer IONIC_EQ_COMP_CODE_TX_COMP = 2, 2996126fe197SAndrew Boyer }; 2997126fe197SAndrew Boyer 299801489e5dSAlfredo Cardigliano /* Deprecate */ 299901489e5dSAlfredo Cardigliano struct ionic_identity { 300001489e5dSAlfredo Cardigliano union ionic_drv_identity drv; 300101489e5dSAlfredo Cardigliano union ionic_dev_identity dev; 300201489e5dSAlfredo Cardigliano union ionic_lif_identity lif; 300301489e5dSAlfredo Cardigliano union ionic_port_identity port; 300401489e5dSAlfredo Cardigliano union ionic_qos_identity qos; 3005126fe197SAndrew Boyer union ionic_q_identity txq; 300601489e5dSAlfredo Cardigliano }; 300701489e5dSAlfredo Cardigliano 300801489e5dSAlfredo Cardigliano #endif /* _IONIC_IF_H_ */ 3009