101489e5dSAlfredo Cardigliano /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB OR BSD-3-Clause */ 201489e5dSAlfredo Cardigliano /* Copyright (c) 2017-2019 Pensando Systems, Inc. All rights reserved. */ 301489e5dSAlfredo Cardigliano 401489e5dSAlfredo Cardigliano #ifndef _IONIC_IF_H_ 501489e5dSAlfredo Cardigliano #define _IONIC_IF_H_ 601489e5dSAlfredo Cardigliano 701489e5dSAlfredo Cardigliano #pragma pack(push, 1) 801489e5dSAlfredo Cardigliano 901489e5dSAlfredo Cardigliano #define IONIC_DEV_INFO_SIGNATURE 0x44455649 /* 'DEVI' */ 1001489e5dSAlfredo Cardigliano #define IONIC_DEV_INFO_VERSION 1 1101489e5dSAlfredo Cardigliano #define IONIC_IFNAMSIZ 16 1201489e5dSAlfredo Cardigliano 1301489e5dSAlfredo Cardigliano /** 1401489e5dSAlfredo Cardigliano * Commands 1501489e5dSAlfredo Cardigliano */ 1601489e5dSAlfredo Cardigliano enum ionic_cmd_opcode { 1701489e5dSAlfredo Cardigliano IONIC_CMD_NOP = 0, 1801489e5dSAlfredo Cardigliano 1901489e5dSAlfredo Cardigliano /* Device commands */ 2001489e5dSAlfredo Cardigliano IONIC_CMD_IDENTIFY = 1, 2101489e5dSAlfredo Cardigliano IONIC_CMD_INIT = 2, 2201489e5dSAlfredo Cardigliano IONIC_CMD_RESET = 3, 2301489e5dSAlfredo Cardigliano IONIC_CMD_GETATTR = 4, 2401489e5dSAlfredo Cardigliano IONIC_CMD_SETATTR = 5, 2501489e5dSAlfredo Cardigliano 2601489e5dSAlfredo Cardigliano /* Port commands */ 2701489e5dSAlfredo Cardigliano IONIC_CMD_PORT_IDENTIFY = 10, 2801489e5dSAlfredo Cardigliano IONIC_CMD_PORT_INIT = 11, 2901489e5dSAlfredo Cardigliano IONIC_CMD_PORT_RESET = 12, 3001489e5dSAlfredo Cardigliano IONIC_CMD_PORT_GETATTR = 13, 3101489e5dSAlfredo Cardigliano IONIC_CMD_PORT_SETATTR = 14, 3201489e5dSAlfredo Cardigliano 3301489e5dSAlfredo Cardigliano /* LIF commands */ 3401489e5dSAlfredo Cardigliano IONIC_CMD_LIF_IDENTIFY = 20, 3501489e5dSAlfredo Cardigliano IONIC_CMD_LIF_INIT = 21, 3601489e5dSAlfredo Cardigliano IONIC_CMD_LIF_RESET = 22, 3701489e5dSAlfredo Cardigliano IONIC_CMD_LIF_GETATTR = 23, 3801489e5dSAlfredo Cardigliano IONIC_CMD_LIF_SETATTR = 24, 3901489e5dSAlfredo Cardigliano 4001489e5dSAlfredo Cardigliano IONIC_CMD_RX_MODE_SET = 30, 4101489e5dSAlfredo Cardigliano IONIC_CMD_RX_FILTER_ADD = 31, 4201489e5dSAlfredo Cardigliano IONIC_CMD_RX_FILTER_DEL = 32, 4301489e5dSAlfredo Cardigliano 4401489e5dSAlfredo Cardigliano /* Queue commands */ 4501489e5dSAlfredo Cardigliano IONIC_CMD_Q_INIT = 40, 4601489e5dSAlfredo Cardigliano IONIC_CMD_Q_CONTROL = 41, 4701489e5dSAlfredo Cardigliano 4801489e5dSAlfredo Cardigliano /* RDMA commands */ 4901489e5dSAlfredo Cardigliano IONIC_CMD_RDMA_RESET_LIF = 50, 5001489e5dSAlfredo Cardigliano IONIC_CMD_RDMA_CREATE_EQ = 51, 5101489e5dSAlfredo Cardigliano IONIC_CMD_RDMA_CREATE_CQ = 52, 5201489e5dSAlfredo Cardigliano IONIC_CMD_RDMA_CREATE_ADMINQ = 53, 5301489e5dSAlfredo Cardigliano 5401489e5dSAlfredo Cardigliano /* QoS commands */ 5501489e5dSAlfredo Cardigliano IONIC_CMD_QOS_CLASS_IDENTIFY = 240, 5601489e5dSAlfredo Cardigliano IONIC_CMD_QOS_CLASS_INIT = 241, 5701489e5dSAlfredo Cardigliano IONIC_CMD_QOS_CLASS_RESET = 242, 5801489e5dSAlfredo Cardigliano 5901489e5dSAlfredo Cardigliano /* Firmware commands */ 6001489e5dSAlfredo Cardigliano IONIC_CMD_FW_DOWNLOAD = 254, 6101489e5dSAlfredo Cardigliano IONIC_CMD_FW_CONTROL = 255, 6201489e5dSAlfredo Cardigliano }; 6301489e5dSAlfredo Cardigliano 6401489e5dSAlfredo Cardigliano /** 6501489e5dSAlfredo Cardigliano * Command Return codes 6601489e5dSAlfredo Cardigliano */ 6701489e5dSAlfredo Cardigliano enum ionic_status_code { 6801489e5dSAlfredo Cardigliano IONIC_RC_SUCCESS = 0, /* Success */ 6901489e5dSAlfredo Cardigliano IONIC_RC_EVERSION = 1, /* Incorrect version for request */ 7001489e5dSAlfredo Cardigliano IONIC_RC_EOPCODE = 2, /* Invalid cmd opcode */ 7101489e5dSAlfredo Cardigliano IONIC_RC_EIO = 3, /* I/O error */ 7201489e5dSAlfredo Cardigliano IONIC_RC_EPERM = 4, /* Permission denied */ 7301489e5dSAlfredo Cardigliano IONIC_RC_EQID = 5, /* Bad qid */ 7401489e5dSAlfredo Cardigliano IONIC_RC_EQTYPE = 6, /* Bad qtype */ 7501489e5dSAlfredo Cardigliano IONIC_RC_ENOENT = 7, /* No such element */ 7601489e5dSAlfredo Cardigliano IONIC_RC_EINTR = 8, /* operation interrupted */ 7701489e5dSAlfredo Cardigliano IONIC_RC_EAGAIN = 9, /* Try again */ 7801489e5dSAlfredo Cardigliano IONIC_RC_ENOMEM = 10, /* Out of memory */ 7901489e5dSAlfredo Cardigliano IONIC_RC_EFAULT = 11, /* Bad address */ 8001489e5dSAlfredo Cardigliano IONIC_RC_EBUSY = 12, /* Device or resource busy */ 8101489e5dSAlfredo Cardigliano IONIC_RC_EEXIST = 13, /* object already exists */ 8201489e5dSAlfredo Cardigliano IONIC_RC_EINVAL = 14, /* Invalid argument */ 8301489e5dSAlfredo Cardigliano IONIC_RC_ENOSPC = 15, /* No space left or alloc failure */ 8401489e5dSAlfredo Cardigliano IONIC_RC_ERANGE = 16, /* Parameter out of range */ 8501489e5dSAlfredo Cardigliano IONIC_RC_BAD_ADDR = 17, /* Descriptor contains a bad ptr */ 8601489e5dSAlfredo Cardigliano IONIC_RC_DEV_CMD = 18, /* Device cmd attempted on AdminQ */ 8701489e5dSAlfredo Cardigliano IONIC_RC_ENOSUPP = 19, /* Operation not supported */ 8801489e5dSAlfredo Cardigliano IONIC_RC_ERROR = 29, /* Generic error */ 8901489e5dSAlfredo Cardigliano 9001489e5dSAlfredo Cardigliano IONIC_RC_ERDMA = 30, /* Generic RDMA error */ 9101489e5dSAlfredo Cardigliano }; 9201489e5dSAlfredo Cardigliano 9301489e5dSAlfredo Cardigliano enum ionic_notifyq_opcode { 9401489e5dSAlfredo Cardigliano IONIC_EVENT_LINK_CHANGE = 1, 9501489e5dSAlfredo Cardigliano IONIC_EVENT_RESET = 2, 9601489e5dSAlfredo Cardigliano IONIC_EVENT_HEARTBEAT = 3, 9701489e5dSAlfredo Cardigliano IONIC_EVENT_LOG = 4, 9801489e5dSAlfredo Cardigliano }; 9901489e5dSAlfredo Cardigliano 10001489e5dSAlfredo Cardigliano /** 10101489e5dSAlfredo Cardigliano * struct cmd - General admin command format 10201489e5dSAlfredo Cardigliano * @opcode: Opcode for the command 10301489e5dSAlfredo Cardigliano * @lif_index: LIF index 10401489e5dSAlfredo Cardigliano * @cmd_data: Opcode-specific command bytes 10501489e5dSAlfredo Cardigliano */ 10601489e5dSAlfredo Cardigliano struct ionic_admin_cmd { 10701489e5dSAlfredo Cardigliano u8 opcode; 10801489e5dSAlfredo Cardigliano u8 rsvd; 10901489e5dSAlfredo Cardigliano __le16 lif_index; 11001489e5dSAlfredo Cardigliano u8 cmd_data[60]; 11101489e5dSAlfredo Cardigliano }; 11201489e5dSAlfredo Cardigliano 11301489e5dSAlfredo Cardigliano /** 11401489e5dSAlfredo Cardigliano * struct ionic_admin_comp - General admin command completion format 11501489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 11601489e5dSAlfredo Cardigliano * @comp_index: The index in the descriptor ring for which this 11701489e5dSAlfredo Cardigliano * is the completion. 11801489e5dSAlfredo Cardigliano * @cmd_data: Command-specific bytes. 11901489e5dSAlfredo Cardigliano * @color: Color bit. (Always 0 for commands issued to the 12001489e5dSAlfredo Cardigliano * Device Cmd Registers.) 12101489e5dSAlfredo Cardigliano */ 12201489e5dSAlfredo Cardigliano struct ionic_admin_comp { 12301489e5dSAlfredo Cardigliano u8 status; 12401489e5dSAlfredo Cardigliano u8 rsvd; 12501489e5dSAlfredo Cardigliano __le16 comp_index; 12601489e5dSAlfredo Cardigliano u8 cmd_data[11]; 12701489e5dSAlfredo Cardigliano u8 color; 12801489e5dSAlfredo Cardigliano #define IONIC_COMP_COLOR_MASK 0x80 12901489e5dSAlfredo Cardigliano }; 13001489e5dSAlfredo Cardigliano 13101489e5dSAlfredo Cardigliano static inline u8 color_match(u8 color, u8 done_color) 13201489e5dSAlfredo Cardigliano { 13301489e5dSAlfredo Cardigliano return (!!(color & IONIC_COMP_COLOR_MASK)) == done_color; 13401489e5dSAlfredo Cardigliano } 13501489e5dSAlfredo Cardigliano 13601489e5dSAlfredo Cardigliano /** 13701489e5dSAlfredo Cardigliano * struct ionic_nop_cmd - NOP command 13801489e5dSAlfredo Cardigliano * @opcode: opcode 13901489e5dSAlfredo Cardigliano */ 14001489e5dSAlfredo Cardigliano struct ionic_nop_cmd { 14101489e5dSAlfredo Cardigliano u8 opcode; 14201489e5dSAlfredo Cardigliano u8 rsvd[63]; 14301489e5dSAlfredo Cardigliano }; 14401489e5dSAlfredo Cardigliano 14501489e5dSAlfredo Cardigliano /** 14601489e5dSAlfredo Cardigliano * struct ionic_nop_comp - NOP command completion 14701489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 14801489e5dSAlfredo Cardigliano */ 14901489e5dSAlfredo Cardigliano struct ionic_nop_comp { 15001489e5dSAlfredo Cardigliano u8 status; 15101489e5dSAlfredo Cardigliano u8 rsvd[15]; 15201489e5dSAlfredo Cardigliano }; 15301489e5dSAlfredo Cardigliano 15401489e5dSAlfredo Cardigliano /** 15501489e5dSAlfredo Cardigliano * struct ionic_dev_init_cmd - Device init command 15601489e5dSAlfredo Cardigliano * @opcode: opcode 15701489e5dSAlfredo Cardigliano * @type: device type 15801489e5dSAlfredo Cardigliano */ 15901489e5dSAlfredo Cardigliano struct ionic_dev_init_cmd { 16001489e5dSAlfredo Cardigliano u8 opcode; 16101489e5dSAlfredo Cardigliano u8 type; 16201489e5dSAlfredo Cardigliano u8 rsvd[62]; 16301489e5dSAlfredo Cardigliano }; 16401489e5dSAlfredo Cardigliano 16501489e5dSAlfredo Cardigliano /** 16601489e5dSAlfredo Cardigliano * struct init_comp - Device init command completion 16701489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 16801489e5dSAlfredo Cardigliano */ 16901489e5dSAlfredo Cardigliano struct ionic_dev_init_comp { 17001489e5dSAlfredo Cardigliano u8 status; 17101489e5dSAlfredo Cardigliano u8 rsvd[15]; 17201489e5dSAlfredo Cardigliano }; 17301489e5dSAlfredo Cardigliano 17401489e5dSAlfredo Cardigliano /** 17501489e5dSAlfredo Cardigliano * struct ionic_dev_reset_cmd - Device reset command 17601489e5dSAlfredo Cardigliano * @opcode: opcode 17701489e5dSAlfredo Cardigliano */ 17801489e5dSAlfredo Cardigliano struct ionic_dev_reset_cmd { 17901489e5dSAlfredo Cardigliano u8 opcode; 18001489e5dSAlfredo Cardigliano u8 rsvd[63]; 18101489e5dSAlfredo Cardigliano }; 18201489e5dSAlfredo Cardigliano 18301489e5dSAlfredo Cardigliano /** 18401489e5dSAlfredo Cardigliano * struct reset_comp - Reset command completion 18501489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 18601489e5dSAlfredo Cardigliano */ 18701489e5dSAlfredo Cardigliano struct ionic_dev_reset_comp { 18801489e5dSAlfredo Cardigliano u8 status; 18901489e5dSAlfredo Cardigliano u8 rsvd[15]; 19001489e5dSAlfredo Cardigliano }; 19101489e5dSAlfredo Cardigliano 19201489e5dSAlfredo Cardigliano #define IONIC_IDENTITY_VERSION_1 1 19301489e5dSAlfredo Cardigliano 19401489e5dSAlfredo Cardigliano /** 19501489e5dSAlfredo Cardigliano * struct ionic_dev_identify_cmd - Driver/device identify command 19601489e5dSAlfredo Cardigliano * @opcode: opcode 19701489e5dSAlfredo Cardigliano * @ver: Highest version of identify supported by driver 19801489e5dSAlfredo Cardigliano */ 19901489e5dSAlfredo Cardigliano struct ionic_dev_identify_cmd { 20001489e5dSAlfredo Cardigliano u8 opcode; 20101489e5dSAlfredo Cardigliano u8 ver; 20201489e5dSAlfredo Cardigliano u8 rsvd[62]; 20301489e5dSAlfredo Cardigliano }; 20401489e5dSAlfredo Cardigliano 20501489e5dSAlfredo Cardigliano /** 20601489e5dSAlfredo Cardigliano * struct dev_identify_comp - Driver/device identify command completion 20701489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 20801489e5dSAlfredo Cardigliano * @ver: Version of identify returned by device 20901489e5dSAlfredo Cardigliano */ 21001489e5dSAlfredo Cardigliano struct ionic_dev_identify_comp { 21101489e5dSAlfredo Cardigliano u8 status; 21201489e5dSAlfredo Cardigliano u8 ver; 21301489e5dSAlfredo Cardigliano u8 rsvd[14]; 21401489e5dSAlfredo Cardigliano }; 21501489e5dSAlfredo Cardigliano 21601489e5dSAlfredo Cardigliano enum ionic_os_type { 21701489e5dSAlfredo Cardigliano IONIC_OS_TYPE_LINUX = 1, 21801489e5dSAlfredo Cardigliano IONIC_OS_TYPE_WIN = 2, 21901489e5dSAlfredo Cardigliano IONIC_OS_TYPE_DPDK = 3, 22001489e5dSAlfredo Cardigliano IONIC_OS_TYPE_FREEBSD = 4, 22101489e5dSAlfredo Cardigliano IONIC_OS_TYPE_IPXE = 5, 22201489e5dSAlfredo Cardigliano IONIC_OS_TYPE_ESXI = 6, 22301489e5dSAlfredo Cardigliano }; 22401489e5dSAlfredo Cardigliano 22501489e5dSAlfredo Cardigliano /** 22601489e5dSAlfredo Cardigliano * union drv_identity - driver identity information 22701489e5dSAlfredo Cardigliano * @os_type: OS type (see enum os_type) 22801489e5dSAlfredo Cardigliano * @os_dist: OS distribution, numeric format 22901489e5dSAlfredo Cardigliano * @os_dist_str: OS distribution, string format 23001489e5dSAlfredo Cardigliano * @kernel_ver: Kernel version, numeric format 23101489e5dSAlfredo Cardigliano * @kernel_ver_str: Kernel version, string format 23201489e5dSAlfredo Cardigliano * @driver_ver_str: Driver version, string format 23301489e5dSAlfredo Cardigliano */ 23401489e5dSAlfredo Cardigliano union ionic_drv_identity { 23501489e5dSAlfredo Cardigliano struct { 23601489e5dSAlfredo Cardigliano __le32 os_type; 23701489e5dSAlfredo Cardigliano __le32 os_dist; 23801489e5dSAlfredo Cardigliano char os_dist_str[128]; 23901489e5dSAlfredo Cardigliano __le32 kernel_ver; 24001489e5dSAlfredo Cardigliano char kernel_ver_str[32]; 24101489e5dSAlfredo Cardigliano char driver_ver_str[32]; 24201489e5dSAlfredo Cardigliano }; 24301489e5dSAlfredo Cardigliano __le32 words[512]; 24401489e5dSAlfredo Cardigliano }; 24501489e5dSAlfredo Cardigliano 24601489e5dSAlfredo Cardigliano /** 24701489e5dSAlfredo Cardigliano * union dev_identity - device identity information 24801489e5dSAlfredo Cardigliano * @version: Version of device identify 24901489e5dSAlfredo Cardigliano * @type: Identify type (0 for now) 25001489e5dSAlfredo Cardigliano * @nports: Number of ports provisioned 25101489e5dSAlfredo Cardigliano * @nlifs: Number of LIFs provisioned 25201489e5dSAlfredo Cardigliano * @nintrs: Number of interrupts provisioned 25301489e5dSAlfredo Cardigliano * @ndbpgs_per_lif: Number of doorbell pages per LIF 25401489e5dSAlfredo Cardigliano * @intr_coal_mult: Interrupt coalescing multiplication factor. 25501489e5dSAlfredo Cardigliano * Scale user-supplied interrupt coalescing 25601489e5dSAlfredo Cardigliano * value in usecs to device units using: 25701489e5dSAlfredo Cardigliano * device units = usecs * mult / div 25801489e5dSAlfredo Cardigliano * @intr_coal_div: Interrupt coalescing division factor. 25901489e5dSAlfredo Cardigliano * Scale user-supplied interrupt coalescing 26001489e5dSAlfredo Cardigliano * value in usecs to device units using: 26101489e5dSAlfredo Cardigliano * device units = usecs * mult / div 26201489e5dSAlfredo Cardigliano * 26301489e5dSAlfredo Cardigliano */ 26401489e5dSAlfredo Cardigliano union ionic_dev_identity { 26501489e5dSAlfredo Cardigliano struct { 26601489e5dSAlfredo Cardigliano u8 version; 26701489e5dSAlfredo Cardigliano u8 type; 26801489e5dSAlfredo Cardigliano u8 rsvd[2]; 26901489e5dSAlfredo Cardigliano u8 nports; 27001489e5dSAlfredo Cardigliano u8 rsvd2[3]; 27101489e5dSAlfredo Cardigliano __le32 nlifs; 27201489e5dSAlfredo Cardigliano __le32 nintrs; 27301489e5dSAlfredo Cardigliano __le32 ndbpgs_per_lif; 27401489e5dSAlfredo Cardigliano __le32 intr_coal_mult; 27501489e5dSAlfredo Cardigliano __le32 intr_coal_div; 27601489e5dSAlfredo Cardigliano }; 27701489e5dSAlfredo Cardigliano __le32 words[512]; 27801489e5dSAlfredo Cardigliano }; 27901489e5dSAlfredo Cardigliano 28001489e5dSAlfredo Cardigliano enum ionic_lif_type { 28101489e5dSAlfredo Cardigliano IONIC_LIF_TYPE_CLASSIC = 0, 28201489e5dSAlfredo Cardigliano IONIC_LIF_TYPE_MACVLAN = 1, 28301489e5dSAlfredo Cardigliano IONIC_LIF_TYPE_NETQUEUE = 2, 28401489e5dSAlfredo Cardigliano }; 28501489e5dSAlfredo Cardigliano 28601489e5dSAlfredo Cardigliano /** 28701489e5dSAlfredo Cardigliano * struct ionic_lif_identify_cmd - lif identify command 28801489e5dSAlfredo Cardigliano * @opcode: opcode 28901489e5dSAlfredo Cardigliano * @type: lif type (enum lif_type) 29001489e5dSAlfredo Cardigliano * @ver: version of identify returned by device 29101489e5dSAlfredo Cardigliano */ 29201489e5dSAlfredo Cardigliano struct ionic_lif_identify_cmd { 29301489e5dSAlfredo Cardigliano u8 opcode; 29401489e5dSAlfredo Cardigliano u8 type; 29501489e5dSAlfredo Cardigliano u8 ver; 29601489e5dSAlfredo Cardigliano u8 rsvd[61]; 29701489e5dSAlfredo Cardigliano }; 29801489e5dSAlfredo Cardigliano 29901489e5dSAlfredo Cardigliano /** 30001489e5dSAlfredo Cardigliano * struct ionic_lif_identify_comp - lif identify command completion 30101489e5dSAlfredo Cardigliano * @status: status of the command (enum status_code) 30201489e5dSAlfredo Cardigliano * @ver: version of identify returned by device 30301489e5dSAlfredo Cardigliano */ 30401489e5dSAlfredo Cardigliano struct ionic_lif_identify_comp { 30501489e5dSAlfredo Cardigliano u8 status; 30601489e5dSAlfredo Cardigliano u8 ver; 30701489e5dSAlfredo Cardigliano u8 rsvd2[14]; 30801489e5dSAlfredo Cardigliano }; 30901489e5dSAlfredo Cardigliano 31001489e5dSAlfredo Cardigliano enum ionic_lif_capability { 31101489e5dSAlfredo Cardigliano IONIC_LIF_CAP_ETH = BIT(0), 31201489e5dSAlfredo Cardigliano IONIC_LIF_CAP_RDMA = BIT(1), 31301489e5dSAlfredo Cardigliano }; 31401489e5dSAlfredo Cardigliano 31501489e5dSAlfredo Cardigliano /** 31601489e5dSAlfredo Cardigliano * Logical Queue Types 31701489e5dSAlfredo Cardigliano */ 31801489e5dSAlfredo Cardigliano enum ionic_logical_qtype { 31901489e5dSAlfredo Cardigliano IONIC_QTYPE_ADMINQ = 0, 32001489e5dSAlfredo Cardigliano IONIC_QTYPE_NOTIFYQ = 1, 32101489e5dSAlfredo Cardigliano IONIC_QTYPE_RXQ = 2, 32201489e5dSAlfredo Cardigliano IONIC_QTYPE_TXQ = 3, 32301489e5dSAlfredo Cardigliano IONIC_QTYPE_EQ = 4, 32401489e5dSAlfredo Cardigliano IONIC_QTYPE_MAX = 16, 32501489e5dSAlfredo Cardigliano }; 32601489e5dSAlfredo Cardigliano 32701489e5dSAlfredo Cardigliano /** 32801489e5dSAlfredo Cardigliano * struct ionic_lif_logical_qtype - Descriptor of logical to hardware queue 32901489e5dSAlfredo Cardigliano * type. 33001489e5dSAlfredo Cardigliano * @qtype: Hardware Queue Type. 33101489e5dSAlfredo Cardigliano * @qid_count: Number of Queue IDs of the logical type. 33201489e5dSAlfredo Cardigliano * @qid_base: Minimum Queue ID of the logical type. 33301489e5dSAlfredo Cardigliano */ 33401489e5dSAlfredo Cardigliano struct ionic_lif_logical_qtype { 33501489e5dSAlfredo Cardigliano u8 qtype; 33601489e5dSAlfredo Cardigliano u8 rsvd[3]; 33701489e5dSAlfredo Cardigliano __le32 qid_count; 33801489e5dSAlfredo Cardigliano __le32 qid_base; 33901489e5dSAlfredo Cardigliano }; 34001489e5dSAlfredo Cardigliano 34101489e5dSAlfredo Cardigliano enum ionic_lif_state { 34201489e5dSAlfredo Cardigliano IONIC_LIF_DISABLE = 0, 34301489e5dSAlfredo Cardigliano IONIC_LIF_ENABLE = 1, 34401489e5dSAlfredo Cardigliano IONIC_LIF_HANG_RESET = 2, 34501489e5dSAlfredo Cardigliano }; 34601489e5dSAlfredo Cardigliano 34701489e5dSAlfredo Cardigliano /** 34801489e5dSAlfredo Cardigliano * LIF configuration 34901489e5dSAlfredo Cardigliano * @state: lif state (enum lif_state) 35001489e5dSAlfredo Cardigliano * @name: lif name 35101489e5dSAlfredo Cardigliano * @mtu: mtu 35201489e5dSAlfredo Cardigliano * @mac: station mac address 35301489e5dSAlfredo Cardigliano * @features: features (enum ionic_eth_hw_features) 35401489e5dSAlfredo Cardigliano * @queue_count: queue counts per queue-type 35501489e5dSAlfredo Cardigliano */ 35601489e5dSAlfredo Cardigliano union ionic_lif_config { 35701489e5dSAlfredo Cardigliano struct { 35801489e5dSAlfredo Cardigliano u8 state; 35901489e5dSAlfredo Cardigliano u8 rsvd[3]; 36001489e5dSAlfredo Cardigliano char name[IONIC_IFNAMSIZ]; 36101489e5dSAlfredo Cardigliano __le32 mtu; 36201489e5dSAlfredo Cardigliano u8 mac[6]; 36301489e5dSAlfredo Cardigliano u8 rsvd2[2]; 36401489e5dSAlfredo Cardigliano __le64 features; 36501489e5dSAlfredo Cardigliano __le32 queue_count[IONIC_QTYPE_MAX]; 36601489e5dSAlfredo Cardigliano }; 36701489e5dSAlfredo Cardigliano __le32 words[64]; 36801489e5dSAlfredo Cardigliano }; 36901489e5dSAlfredo Cardigliano 37001489e5dSAlfredo Cardigliano /** 37101489e5dSAlfredo Cardigliano * struct ionic_lif_identity - lif identity information (type-specific) 37201489e5dSAlfredo Cardigliano * 37301489e5dSAlfredo Cardigliano * @capabilities LIF capabilities 37401489e5dSAlfredo Cardigliano * 37501489e5dSAlfredo Cardigliano * Ethernet: 37601489e5dSAlfredo Cardigliano * @version: Ethernet identify structure version. 37701489e5dSAlfredo Cardigliano * @features: Ethernet features supported on this lif type. 37801489e5dSAlfredo Cardigliano * @max_ucast_filters: Number of perfect unicast addresses supported. 37901489e5dSAlfredo Cardigliano * @max_mcast_filters: Number of perfect multicast addresses supported. 38001489e5dSAlfredo Cardigliano * @min_frame_size: Minimum size of frames to be sent 38101489e5dSAlfredo Cardigliano * @max_frame_size: Maximum size of frames to be sent 38201489e5dSAlfredo Cardigliano * @config: LIF config struct with features, mtu, mac, q counts 38301489e5dSAlfredo Cardigliano * 38401489e5dSAlfredo Cardigliano * RDMA: 38501489e5dSAlfredo Cardigliano * @version: RDMA version of opcodes and queue descriptors. 38601489e5dSAlfredo Cardigliano * @qp_opcodes: Number of rdma queue pair opcodes supported. 38701489e5dSAlfredo Cardigliano * @admin_opcodes: Number of rdma admin opcodes supported. 38801489e5dSAlfredo Cardigliano * @npts_per_lif: Page table size per lif 38901489e5dSAlfredo Cardigliano * @nmrs_per_lif: Number of memory regions per lif 39001489e5dSAlfredo Cardigliano * @nahs_per_lif: Number of address handles per lif 39101489e5dSAlfredo Cardigliano * @max_stride: Max work request stride. 39201489e5dSAlfredo Cardigliano * @cl_stride: Cache line stride. 39301489e5dSAlfredo Cardigliano * @pte_stride: Page table entry stride. 39401489e5dSAlfredo Cardigliano * @rrq_stride: Remote RQ work request stride. 39501489e5dSAlfredo Cardigliano * @rsq_stride: Remote SQ work request stride. 39601489e5dSAlfredo Cardigliano * @dcqcn_profiles: Number of DCQCN profiles 39701489e5dSAlfredo Cardigliano * @aq_qtype: RDMA Admin Qtype. 39801489e5dSAlfredo Cardigliano * @sq_qtype: RDMA Send Qtype. 39901489e5dSAlfredo Cardigliano * @rq_qtype: RDMA Receive Qtype. 40001489e5dSAlfredo Cardigliano * @cq_qtype: RDMA Completion Qtype. 40101489e5dSAlfredo Cardigliano * @eq_qtype: RDMA Event Qtype. 40201489e5dSAlfredo Cardigliano */ 40301489e5dSAlfredo Cardigliano union ionic_lif_identity { 40401489e5dSAlfredo Cardigliano struct { 40501489e5dSAlfredo Cardigliano __le64 capabilities; 40601489e5dSAlfredo Cardigliano 40701489e5dSAlfredo Cardigliano struct { 40801489e5dSAlfredo Cardigliano u8 version; 40901489e5dSAlfredo Cardigliano u8 rsvd[3]; 41001489e5dSAlfredo Cardigliano __le32 max_ucast_filters; 41101489e5dSAlfredo Cardigliano __le32 max_mcast_filters; 41201489e5dSAlfredo Cardigliano __le16 rss_ind_tbl_sz; 41301489e5dSAlfredo Cardigliano __le32 min_frame_size; 41401489e5dSAlfredo Cardigliano __le32 max_frame_size; 41501489e5dSAlfredo Cardigliano u8 rsvd2[106]; 41601489e5dSAlfredo Cardigliano union ionic_lif_config config; 41701489e5dSAlfredo Cardigliano } eth; 41801489e5dSAlfredo Cardigliano 41901489e5dSAlfredo Cardigliano struct { 42001489e5dSAlfredo Cardigliano u8 version; 42101489e5dSAlfredo Cardigliano u8 qp_opcodes; 42201489e5dSAlfredo Cardigliano u8 admin_opcodes; 42301489e5dSAlfredo Cardigliano u8 rsvd; 42401489e5dSAlfredo Cardigliano __le32 npts_per_lif; 42501489e5dSAlfredo Cardigliano __le32 nmrs_per_lif; 42601489e5dSAlfredo Cardigliano __le32 nahs_per_lif; 42701489e5dSAlfredo Cardigliano u8 max_stride; 42801489e5dSAlfredo Cardigliano u8 cl_stride; 42901489e5dSAlfredo Cardigliano u8 pte_stride; 43001489e5dSAlfredo Cardigliano u8 rrq_stride; 43101489e5dSAlfredo Cardigliano u8 rsq_stride; 43201489e5dSAlfredo Cardigliano u8 dcqcn_profiles; 43301489e5dSAlfredo Cardigliano u8 rsvd_dimensions[10]; 43401489e5dSAlfredo Cardigliano struct ionic_lif_logical_qtype aq_qtype; 43501489e5dSAlfredo Cardigliano struct ionic_lif_logical_qtype sq_qtype; 43601489e5dSAlfredo Cardigliano struct ionic_lif_logical_qtype rq_qtype; 43701489e5dSAlfredo Cardigliano struct ionic_lif_logical_qtype cq_qtype; 43801489e5dSAlfredo Cardigliano struct ionic_lif_logical_qtype eq_qtype; 43901489e5dSAlfredo Cardigliano } rdma; 44001489e5dSAlfredo Cardigliano }; 44101489e5dSAlfredo Cardigliano __le32 words[512]; 44201489e5dSAlfredo Cardigliano }; 44301489e5dSAlfredo Cardigliano 44401489e5dSAlfredo Cardigliano /** 44501489e5dSAlfredo Cardigliano * struct ionic_lif_init_cmd - LIF init command 44601489e5dSAlfredo Cardigliano * @opcode: opcode 44701489e5dSAlfredo Cardigliano * @type: LIF type (enum lif_type) 44801489e5dSAlfredo Cardigliano * @index: LIF index 44901489e5dSAlfredo Cardigliano * @info_pa: destination address for lif info (struct ionic_lif_info) 45001489e5dSAlfredo Cardigliano */ 45101489e5dSAlfredo Cardigliano struct ionic_lif_init_cmd { 45201489e5dSAlfredo Cardigliano u8 opcode; 45301489e5dSAlfredo Cardigliano u8 type; 45401489e5dSAlfredo Cardigliano __le16 index; 45501489e5dSAlfredo Cardigliano __le32 rsvd; 45601489e5dSAlfredo Cardigliano __le64 info_pa; 45701489e5dSAlfredo Cardigliano u8 rsvd2[48]; 45801489e5dSAlfredo Cardigliano }; 45901489e5dSAlfredo Cardigliano 46001489e5dSAlfredo Cardigliano /** 46101489e5dSAlfredo Cardigliano * struct ionic_lif_init_comp - LIF init command completion 46201489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 46301489e5dSAlfredo Cardigliano */ 46401489e5dSAlfredo Cardigliano struct ionic_lif_init_comp { 46501489e5dSAlfredo Cardigliano u8 status; 46601489e5dSAlfredo Cardigliano u8 rsvd; 46701489e5dSAlfredo Cardigliano __le16 hw_index; 46801489e5dSAlfredo Cardigliano u8 rsvd2[12]; 46901489e5dSAlfredo Cardigliano }; 47001489e5dSAlfredo Cardigliano 47101489e5dSAlfredo Cardigliano /** 47201489e5dSAlfredo Cardigliano * struct ionic_q_init_cmd - Queue init command 47301489e5dSAlfredo Cardigliano * @opcode: opcode 47401489e5dSAlfredo Cardigliano * @type: Logical queue type 47501489e5dSAlfredo Cardigliano * @ver: Queue version (defines opcode/descriptor scope) 47601489e5dSAlfredo Cardigliano * @lif_index: LIF index 47701489e5dSAlfredo Cardigliano * @index: (lif, qtype) relative admin queue index 47801489e5dSAlfredo Cardigliano * @intr_index: Interrupt control register index 47901489e5dSAlfredo Cardigliano * @pid: Process ID 48001489e5dSAlfredo Cardigliano * @flags: 48101489e5dSAlfredo Cardigliano * IRQ: Interrupt requested on completion 48201489e5dSAlfredo Cardigliano * ENA: Enable the queue. If ENA=0 the queue is initialized 48301489e5dSAlfredo Cardigliano * but remains disabled, to be later enabled with the 48401489e5dSAlfredo Cardigliano * Queue Enable command. If ENA=1, then queue is 48501489e5dSAlfredo Cardigliano * initialized and then enabled. 48601489e5dSAlfredo Cardigliano * SG: Enable Scatter-Gather on the queue. 48701489e5dSAlfredo Cardigliano * in number of descs. The actual ring size is 48801489e5dSAlfredo Cardigliano * (1 << ring_size). For example, to 48901489e5dSAlfredo Cardigliano * select a ring size of 64 descriptors write 49001489e5dSAlfredo Cardigliano * ring_size = 6. The minimum ring_size value is 2 49101489e5dSAlfredo Cardigliano * for a ring size of 4 descriptors. The maximum 49201489e5dSAlfredo Cardigliano * ring_size value is 16 for a ring size of 64k 49301489e5dSAlfredo Cardigliano * descriptors. Values of ring_size <2 and >16 are 49401489e5dSAlfredo Cardigliano * reserved. 49501489e5dSAlfredo Cardigliano * EQ: Enable the Event Queue 49601489e5dSAlfredo Cardigliano * @cos: Class of service for this queue. 49701489e5dSAlfredo Cardigliano * @ring_size: Queue ring size, encoded as a log2(size) 49801489e5dSAlfredo Cardigliano * @ring_base: Queue ring base address 49901489e5dSAlfredo Cardigliano * @cq_ring_base: Completion queue ring base address 50001489e5dSAlfredo Cardigliano * @sg_ring_base: Scatter/Gather ring base address 50101489e5dSAlfredo Cardigliano * @eq_index: Event queue index 50201489e5dSAlfredo Cardigliano */ 50301489e5dSAlfredo Cardigliano struct ionic_q_init_cmd { 50401489e5dSAlfredo Cardigliano u8 opcode; 50501489e5dSAlfredo Cardigliano u8 rsvd; 50601489e5dSAlfredo Cardigliano __le16 lif_index; 50701489e5dSAlfredo Cardigliano u8 type; 50801489e5dSAlfredo Cardigliano u8 ver; 50901489e5dSAlfredo Cardigliano u8 rsvd1[2]; 51001489e5dSAlfredo Cardigliano __le32 index; 51101489e5dSAlfredo Cardigliano __le16 pid; 51201489e5dSAlfredo Cardigliano __le16 intr_index; 51301489e5dSAlfredo Cardigliano __le16 flags; 51401489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_IRQ 0x01 /* Request interrupt on completion */ 51501489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_ENA 0x02 /* Enable the queue */ 51601489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_SG 0x04 /* Enable scatter/gather on the queue */ 51701489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_EQ 0x08 /* Enable event queue */ 51801489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_DEBUG 0x80 /* Enable queue debugging */ 51901489e5dSAlfredo Cardigliano u8 cos; 52001489e5dSAlfredo Cardigliano u8 ring_size; 52101489e5dSAlfredo Cardigliano __le64 ring_base; 52201489e5dSAlfredo Cardigliano __le64 cq_ring_base; 52301489e5dSAlfredo Cardigliano __le64 sg_ring_base; 52401489e5dSAlfredo Cardigliano __le32 eq_index; 52501489e5dSAlfredo Cardigliano u8 rsvd2[16]; 52601489e5dSAlfredo Cardigliano }; 52701489e5dSAlfredo Cardigliano 52801489e5dSAlfredo Cardigliano /** 52901489e5dSAlfredo Cardigliano * struct ionic_q_init_comp - Queue init command completion 53001489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 53101489e5dSAlfredo Cardigliano * @ver: Queue version (defines opcode/descriptor scope) 53201489e5dSAlfredo Cardigliano * @comp_index: The index in the descriptor ring for which this 53301489e5dSAlfredo Cardigliano * is the completion. 53401489e5dSAlfredo Cardigliano * @hw_index: Hardware Queue ID 53501489e5dSAlfredo Cardigliano * @hw_type: Hardware Queue type 53601489e5dSAlfredo Cardigliano * @color: Color 53701489e5dSAlfredo Cardigliano */ 53801489e5dSAlfredo Cardigliano struct ionic_q_init_comp { 53901489e5dSAlfredo Cardigliano u8 status; 54001489e5dSAlfredo Cardigliano u8 ver; 54101489e5dSAlfredo Cardigliano __le16 comp_index; 54201489e5dSAlfredo Cardigliano __le32 hw_index; 54301489e5dSAlfredo Cardigliano u8 hw_type; 54401489e5dSAlfredo Cardigliano u8 rsvd2[6]; 54501489e5dSAlfredo Cardigliano u8 color; 54601489e5dSAlfredo Cardigliano }; 54701489e5dSAlfredo Cardigliano 54801489e5dSAlfredo Cardigliano /* the device's internal addressing uses up to 52 bits */ 54901489e5dSAlfredo Cardigliano #define IONIC_ADDR_LEN 52 55001489e5dSAlfredo Cardigliano #define IONIC_ADDR_MASK (BIT_ULL(IONIC_ADDR_LEN) - 1) 55101489e5dSAlfredo Cardigliano 55201489e5dSAlfredo Cardigliano enum ionic_txq_desc_opcode { 55301489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_OPCODE_CSUM_NONE = 0, 55401489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_OPCODE_CSUM_PARTIAL = 1, 55501489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_OPCODE_CSUM_HW = 2, 55601489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_OPCODE_TSO = 3, 55701489e5dSAlfredo Cardigliano }; 55801489e5dSAlfredo Cardigliano 55901489e5dSAlfredo Cardigliano /** 56001489e5dSAlfredo Cardigliano * struct ionic_txq_desc - Ethernet Tx queue descriptor format 56101489e5dSAlfredo Cardigliano * @opcode: Tx operation, see TXQ_DESC_OPCODE_*: 56201489e5dSAlfredo Cardigliano * 56301489e5dSAlfredo Cardigliano * IONIC_TXQ_DESC_OPCODE_CSUM_NONE: 56401489e5dSAlfredo Cardigliano * 56501489e5dSAlfredo Cardigliano * Non-offload send. No segmentation, 56601489e5dSAlfredo Cardigliano * fragmentation or checksum calc/insertion is 56701489e5dSAlfredo Cardigliano * performed by device; packet is prepared 56801489e5dSAlfredo Cardigliano * to send by software stack and requires 56901489e5dSAlfredo Cardigliano * no further manipulation from device. 57001489e5dSAlfredo Cardigliano * 57101489e5dSAlfredo Cardigliano * IONIC_TXQ_DESC_OPCODE_CSUM_PARTIAL: 57201489e5dSAlfredo Cardigliano * 57301489e5dSAlfredo Cardigliano * Offload 16-bit L4 checksum 57401489e5dSAlfredo Cardigliano * calculation/insertion. The device will 57501489e5dSAlfredo Cardigliano * calculate the L4 checksum value and 57601489e5dSAlfredo Cardigliano * insert the result in the packet's L4 57701489e5dSAlfredo Cardigliano * header checksum field. The L4 checksum 57801489e5dSAlfredo Cardigliano * is calculated starting at @csum_start bytes 57901489e5dSAlfredo Cardigliano * into the packet to the end of the packet. 58001489e5dSAlfredo Cardigliano * The checksum insertion position is given 58101489e5dSAlfredo Cardigliano * in @csum_offset. This feature is only 58201489e5dSAlfredo Cardigliano * applicable to protocols such as TCP, UDP 58301489e5dSAlfredo Cardigliano * and ICMP where a standard (i.e. the 58401489e5dSAlfredo Cardigliano * 'IP-style' checksum) one's complement 58501489e5dSAlfredo Cardigliano * 16-bit checksum is used, using an IP 58601489e5dSAlfredo Cardigliano * pseudo-header to seed the calculation. 58701489e5dSAlfredo Cardigliano * Software will preload the L4 checksum 58801489e5dSAlfredo Cardigliano * field with the IP pseudo-header checksum. 58901489e5dSAlfredo Cardigliano * 59001489e5dSAlfredo Cardigliano * For tunnel encapsulation, @csum_start and 59101489e5dSAlfredo Cardigliano * @csum_offset refer to the inner L4 59201489e5dSAlfredo Cardigliano * header. Supported tunnels encapsulations 59301489e5dSAlfredo Cardigliano * are: IPIP, GRE, and UDP. If the @encap 59401489e5dSAlfredo Cardigliano * is clear, no further processing by the 59501489e5dSAlfredo Cardigliano * device is required; software will 59601489e5dSAlfredo Cardigliano * calculate the outer header checksums. If 59701489e5dSAlfredo Cardigliano * the @encap is set, the device will 59801489e5dSAlfredo Cardigliano * offload the outer header checksums using 59901489e5dSAlfredo Cardigliano * LCO (local checksum offload) (see 60001489e5dSAlfredo Cardigliano * Documentation/networking/checksum- 60101489e5dSAlfredo Cardigliano * offloads.txt for more info). 60201489e5dSAlfredo Cardigliano * 60301489e5dSAlfredo Cardigliano * IONIC_TXQ_DESC_OPCODE_CSUM_HW: 60401489e5dSAlfredo Cardigliano * 60501489e5dSAlfredo Cardigliano * Offload 16-bit checksum computation to hardware. 60601489e5dSAlfredo Cardigliano * If @csum_l3 is set then the packet's L3 checksum is 60701489e5dSAlfredo Cardigliano * updated. Similarly, if @csum_l4 is set the the L4 60801489e5dSAlfredo Cardigliano * checksum is updated. If @encap is set then encap header 60901489e5dSAlfredo Cardigliano * checksums are also updated. 61001489e5dSAlfredo Cardigliano * 61101489e5dSAlfredo Cardigliano * IONIC_TXQ_DESC_OPCODE_TSO: 61201489e5dSAlfredo Cardigliano * 61301489e5dSAlfredo Cardigliano * Device performs TCP segmentation offload 61401489e5dSAlfredo Cardigliano * (TSO). @hdr_len is the number of bytes 61501489e5dSAlfredo Cardigliano * to the end of TCP header (the offset to 61601489e5dSAlfredo Cardigliano * the TCP payload). @mss is the desired 61701489e5dSAlfredo Cardigliano * MSS, the TCP payload length for each 61801489e5dSAlfredo Cardigliano * segment. The device will calculate/ 61901489e5dSAlfredo Cardigliano * insert IP (IPv4 only) and TCP checksums 62001489e5dSAlfredo Cardigliano * for each segment. In the first data 62101489e5dSAlfredo Cardigliano * buffer containing the header template, 62201489e5dSAlfredo Cardigliano * the driver will set IPv4 checksum to 0 62301489e5dSAlfredo Cardigliano * and preload TCP checksum with the IP 62401489e5dSAlfredo Cardigliano * pseudo header calculated with IP length = 0. 62501489e5dSAlfredo Cardigliano * 62601489e5dSAlfredo Cardigliano * Supported tunnel encapsulations are IPIP, 62701489e5dSAlfredo Cardigliano * layer-3 GRE, and UDP. @hdr_len includes 62801489e5dSAlfredo Cardigliano * both outer and inner headers. The driver 62901489e5dSAlfredo Cardigliano * will set IPv4 checksum to zero and 63001489e5dSAlfredo Cardigliano * preload TCP checksum with IP pseudo 63101489e5dSAlfredo Cardigliano * header on the inner header. 63201489e5dSAlfredo Cardigliano * 63301489e5dSAlfredo Cardigliano * TCP ECN offload is supported. The device 63401489e5dSAlfredo Cardigliano * will set CWR flag in the first segment if 63501489e5dSAlfredo Cardigliano * CWR is set in the template header, and 63601489e5dSAlfredo Cardigliano * clear CWR in remaining segments. 63701489e5dSAlfredo Cardigliano * @flags: 63801489e5dSAlfredo Cardigliano * vlan: 63901489e5dSAlfredo Cardigliano * Insert an L2 VLAN header using @vlan_tci. 64001489e5dSAlfredo Cardigliano * encap: 64101489e5dSAlfredo Cardigliano * Calculate encap header checksum. 64201489e5dSAlfredo Cardigliano * csum_l3: 64301489e5dSAlfredo Cardigliano * Compute L3 header checksum. 64401489e5dSAlfredo Cardigliano * csum_l4: 64501489e5dSAlfredo Cardigliano * Compute L4 header checksum. 64601489e5dSAlfredo Cardigliano * tso_sot: 64701489e5dSAlfredo Cardigliano * TSO start 64801489e5dSAlfredo Cardigliano * tso_eot: 64901489e5dSAlfredo Cardigliano * TSO end 65001489e5dSAlfredo Cardigliano * @num_sg_elems: Number of scatter-gather elements in SG 65101489e5dSAlfredo Cardigliano * descriptor 65201489e5dSAlfredo Cardigliano * @addr: First data buffer's DMA address. 65301489e5dSAlfredo Cardigliano * (Subsequent data buffers are on txq_sg_desc). 65401489e5dSAlfredo Cardigliano * @len: First data buffer's length, in bytes 65501489e5dSAlfredo Cardigliano * @vlan_tci: VLAN tag to insert in the packet (if requested 65601489e5dSAlfredo Cardigliano * by @V-bit). Includes .1p and .1q tags 65701489e5dSAlfredo Cardigliano * @hdr_len: Length of packet headers, including 65801489e5dSAlfredo Cardigliano * encapsulating outer header, if applicable. 65901489e5dSAlfredo Cardigliano * Valid for opcodes TXQ_DESC_OPCODE_CALC_CSUM and 66001489e5dSAlfredo Cardigliano * TXQ_DESC_OPCODE_TSO. Should be set to zero for 66101489e5dSAlfredo Cardigliano * all other modes. For 66201489e5dSAlfredo Cardigliano * TXQ_DESC_OPCODE_CALC_CSUM, @hdr_len is length 66301489e5dSAlfredo Cardigliano * of headers up to inner-most L4 header. For 66401489e5dSAlfredo Cardigliano * TXQ_DESC_OPCODE_TSO, @hdr_len is up to 66501489e5dSAlfredo Cardigliano * inner-most L4 payload, so inclusive of 66601489e5dSAlfredo Cardigliano * inner-most L4 header. 66701489e5dSAlfredo Cardigliano * @mss: Desired MSS value for TSO. Only applicable for 66801489e5dSAlfredo Cardigliano * TXQ_DESC_OPCODE_TSO. 66901489e5dSAlfredo Cardigliano * @csum_start: Offset into inner-most L3 header of checksum 67001489e5dSAlfredo Cardigliano * @csum_offset: Offset into inner-most L4 header of checksum 67101489e5dSAlfredo Cardigliano */ 67201489e5dSAlfredo Cardigliano 67301489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_OPCODE_MASK 0xf 67401489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_OPCODE_SHIFT 4 67501489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAGS_MASK 0xf 67601489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAGS_SHIFT 0 67701489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_NSGE_MASK 0xf 67801489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_NSGE_SHIFT 8 67901489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_ADDR_MASK (BIT_ULL(IONIC_ADDR_LEN) - 1) 68001489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_ADDR_SHIFT 12 68101489e5dSAlfredo Cardigliano 68201489e5dSAlfredo Cardigliano /* common flags */ 68301489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_VLAN 0x1 68401489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_ENCAP 0x2 68501489e5dSAlfredo Cardigliano 68601489e5dSAlfredo Cardigliano /* flags for csum_hw opcode */ 68701489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_CSUM_L3 0x4 68801489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_CSUM_L4 0x8 68901489e5dSAlfredo Cardigliano 69001489e5dSAlfredo Cardigliano /* flags for tso opcode */ 69101489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_TSO_SOT 0x4 69201489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_TSO_EOT 0x8 69301489e5dSAlfredo Cardigliano 69401489e5dSAlfredo Cardigliano struct ionic_txq_desc { 69501489e5dSAlfredo Cardigliano __le64 cmd; 69601489e5dSAlfredo Cardigliano __le16 len; 69701489e5dSAlfredo Cardigliano union { 69801489e5dSAlfredo Cardigliano __le16 vlan_tci; 69901489e5dSAlfredo Cardigliano __le16 hword0; 70001489e5dSAlfredo Cardigliano }; 70101489e5dSAlfredo Cardigliano union { 70201489e5dSAlfredo Cardigliano __le16 csum_start; 70301489e5dSAlfredo Cardigliano __le16 hdr_len; 70401489e5dSAlfredo Cardigliano __le16 hword1; 70501489e5dSAlfredo Cardigliano }; 70601489e5dSAlfredo Cardigliano union { 70701489e5dSAlfredo Cardigliano __le16 csum_offset; 70801489e5dSAlfredo Cardigliano __le16 mss; 70901489e5dSAlfredo Cardigliano __le16 hword2; 71001489e5dSAlfredo Cardigliano }; 71101489e5dSAlfredo Cardigliano }; 71201489e5dSAlfredo Cardigliano 71301489e5dSAlfredo Cardigliano static inline u64 encode_txq_desc_cmd(u8 opcode, u8 flags, 71401489e5dSAlfredo Cardigliano u8 nsge, u64 addr) 71501489e5dSAlfredo Cardigliano { 71601489e5dSAlfredo Cardigliano u64 cmd; 71701489e5dSAlfredo Cardigliano 71801489e5dSAlfredo Cardigliano cmd = (opcode & IONIC_TXQ_DESC_OPCODE_MASK) << 71901489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_OPCODE_SHIFT; 72001489e5dSAlfredo Cardigliano cmd |= (flags & IONIC_TXQ_DESC_FLAGS_MASK) << 72101489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_FLAGS_SHIFT; 72201489e5dSAlfredo Cardigliano cmd |= (nsge & IONIC_TXQ_DESC_NSGE_MASK) << IONIC_TXQ_DESC_NSGE_SHIFT; 72301489e5dSAlfredo Cardigliano cmd |= (addr & IONIC_TXQ_DESC_ADDR_MASK) << IONIC_TXQ_DESC_ADDR_SHIFT; 72401489e5dSAlfredo Cardigliano 72501489e5dSAlfredo Cardigliano return cmd; 72601489e5dSAlfredo Cardigliano }; 72701489e5dSAlfredo Cardigliano 72801489e5dSAlfredo Cardigliano static inline void decode_txq_desc_cmd(u64 cmd, u8 *opcode, u8 *flags, 72901489e5dSAlfredo Cardigliano u8 *nsge, u64 *addr) 73001489e5dSAlfredo Cardigliano { 73101489e5dSAlfredo Cardigliano *opcode = (cmd >> IONIC_TXQ_DESC_OPCODE_SHIFT) & 73201489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_OPCODE_MASK; 73301489e5dSAlfredo Cardigliano *flags = (cmd >> IONIC_TXQ_DESC_FLAGS_SHIFT) & 73401489e5dSAlfredo Cardigliano IONIC_TXQ_DESC_FLAGS_MASK; 73501489e5dSAlfredo Cardigliano *nsge = (cmd >> IONIC_TXQ_DESC_NSGE_SHIFT) & IONIC_TXQ_DESC_NSGE_MASK; 73601489e5dSAlfredo Cardigliano *addr = (cmd >> IONIC_TXQ_DESC_ADDR_SHIFT) & IONIC_TXQ_DESC_ADDR_MASK; 73701489e5dSAlfredo Cardigliano }; 73801489e5dSAlfredo Cardigliano 73901489e5dSAlfredo Cardigliano #define IONIC_TX_MAX_SG_ELEMS 8 74001489e5dSAlfredo Cardigliano #define IONIC_RX_MAX_SG_ELEMS 8 74101489e5dSAlfredo Cardigliano 74201489e5dSAlfredo Cardigliano /** 74301489e5dSAlfredo Cardigliano * struct ionic_txq_sg_desc - Transmit scatter-gather (SG) list 74401489e5dSAlfredo Cardigliano * @addr: DMA address of SG element data buffer 74501489e5dSAlfredo Cardigliano * @len: Length of SG element data buffer, in bytes 74601489e5dSAlfredo Cardigliano */ 74701489e5dSAlfredo Cardigliano struct ionic_txq_sg_desc { 74801489e5dSAlfredo Cardigliano struct ionic_txq_sg_elem { 74901489e5dSAlfredo Cardigliano __le64 addr; 75001489e5dSAlfredo Cardigliano __le16 len; 75101489e5dSAlfredo Cardigliano __le16 rsvd[3]; 75201489e5dSAlfredo Cardigliano } elems[IONIC_TX_MAX_SG_ELEMS]; 75301489e5dSAlfredo Cardigliano }; 75401489e5dSAlfredo Cardigliano 75501489e5dSAlfredo Cardigliano /** 75601489e5dSAlfredo Cardigliano * struct ionic_txq_comp - Ethernet transmit queue completion descriptor 75701489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 75801489e5dSAlfredo Cardigliano * @comp_index: The index in the descriptor ring for which this 75901489e5dSAlfredo Cardigliano * is the completion. 76001489e5dSAlfredo Cardigliano * @color: Color bit. 76101489e5dSAlfredo Cardigliano */ 76201489e5dSAlfredo Cardigliano struct ionic_txq_comp { 76301489e5dSAlfredo Cardigliano u8 status; 76401489e5dSAlfredo Cardigliano u8 rsvd; 76501489e5dSAlfredo Cardigliano __le16 comp_index; 76601489e5dSAlfredo Cardigliano u8 rsvd2[11]; 76701489e5dSAlfredo Cardigliano u8 color; 76801489e5dSAlfredo Cardigliano }; 76901489e5dSAlfredo Cardigliano 77001489e5dSAlfredo Cardigliano enum ionic_rxq_desc_opcode { 77101489e5dSAlfredo Cardigliano IONIC_RXQ_DESC_OPCODE_SIMPLE = 0, 77201489e5dSAlfredo Cardigliano IONIC_RXQ_DESC_OPCODE_SG = 1, 77301489e5dSAlfredo Cardigliano }; 77401489e5dSAlfredo Cardigliano 77501489e5dSAlfredo Cardigliano /** 77601489e5dSAlfredo Cardigliano * struct ionic_rxq_desc - Ethernet Rx queue descriptor format 77701489e5dSAlfredo Cardigliano * @opcode: Rx operation, see RXQ_DESC_OPCODE_*: 77801489e5dSAlfredo Cardigliano * 77901489e5dSAlfredo Cardigliano * RXQ_DESC_OPCODE_SIMPLE: 78001489e5dSAlfredo Cardigliano * 78101489e5dSAlfredo Cardigliano * Receive full packet into data buffer 78201489e5dSAlfredo Cardigliano * starting at @addr. Results of 78301489e5dSAlfredo Cardigliano * receive, including actual bytes received, 78401489e5dSAlfredo Cardigliano * are recorded in Rx completion descriptor. 78501489e5dSAlfredo Cardigliano * 78601489e5dSAlfredo Cardigliano * @len: Data buffer's length, in bytes. 78701489e5dSAlfredo Cardigliano * @addr: Data buffer's DMA address 78801489e5dSAlfredo Cardigliano */ 78901489e5dSAlfredo Cardigliano struct ionic_rxq_desc { 79001489e5dSAlfredo Cardigliano u8 opcode; 79101489e5dSAlfredo Cardigliano u8 rsvd[5]; 79201489e5dSAlfredo Cardigliano __le16 len; 79301489e5dSAlfredo Cardigliano __le64 addr; 79401489e5dSAlfredo Cardigliano }; 79501489e5dSAlfredo Cardigliano 79601489e5dSAlfredo Cardigliano /** 79701489e5dSAlfredo Cardigliano * struct ionic_rxq_sg_desc - Receive scatter-gather (SG) list 79801489e5dSAlfredo Cardigliano * @addr: DMA address of SG element data buffer 79901489e5dSAlfredo Cardigliano * @len: Length of SG element data buffer, in bytes 80001489e5dSAlfredo Cardigliano */ 80101489e5dSAlfredo Cardigliano struct ionic_rxq_sg_desc { 80201489e5dSAlfredo Cardigliano struct ionic_rxq_sg_elem { 80301489e5dSAlfredo Cardigliano __le64 addr; 80401489e5dSAlfredo Cardigliano __le16 len; 80501489e5dSAlfredo Cardigliano __le16 rsvd[3]; 80601489e5dSAlfredo Cardigliano } elems[IONIC_RX_MAX_SG_ELEMS]; 80701489e5dSAlfredo Cardigliano }; 80801489e5dSAlfredo Cardigliano 80901489e5dSAlfredo Cardigliano /** 81001489e5dSAlfredo Cardigliano * struct ionic_rxq_comp - Ethernet receive queue completion descriptor 81101489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 81201489e5dSAlfredo Cardigliano * @num_sg_elems: Number of SG elements used by this descriptor 81301489e5dSAlfredo Cardigliano * @comp_index: The index in the descriptor ring for which this 81401489e5dSAlfredo Cardigliano * is the completion. 81501489e5dSAlfredo Cardigliano * @rss_hash: 32-bit RSS hash 81601489e5dSAlfredo Cardigliano * @csum: 16-bit sum of the packet's L2 payload. 81701489e5dSAlfredo Cardigliano * If the packet's L2 payload is odd length, an extra 81801489e5dSAlfredo Cardigliano * zero-value byte is included in the @csum calculation but 81901489e5dSAlfredo Cardigliano * not included in @len. 82001489e5dSAlfredo Cardigliano * @vlan_tci: VLAN tag stripped from the packet. Valid if @VLAN is 82101489e5dSAlfredo Cardigliano * set. Includes .1p and .1q tags. 82201489e5dSAlfredo Cardigliano * @len: Received packet length, in bytes. Excludes FCS. 82301489e5dSAlfredo Cardigliano * @csum_calc L2 payload checksum is computed or not 82401489e5dSAlfredo Cardigliano * @csum_tcp_ok: The TCP checksum calculated by the device 82501489e5dSAlfredo Cardigliano * matched the checksum in the receive packet's 82601489e5dSAlfredo Cardigliano * TCP header 82701489e5dSAlfredo Cardigliano * @csum_tcp_bad: The TCP checksum calculated by the device did 82801489e5dSAlfredo Cardigliano * not match the checksum in the receive packet's 82901489e5dSAlfredo Cardigliano * TCP header. 83001489e5dSAlfredo Cardigliano * @csum_udp_ok: The UDP checksum calculated by the device 83101489e5dSAlfredo Cardigliano * matched the checksum in the receive packet's 83201489e5dSAlfredo Cardigliano * UDP header 83301489e5dSAlfredo Cardigliano * @csum_udp_bad: The UDP checksum calculated by the device did 83401489e5dSAlfredo Cardigliano * not match the checksum in the receive packet's 83501489e5dSAlfredo Cardigliano * UDP header. 83601489e5dSAlfredo Cardigliano * @csum_ip_ok: The IPv4 checksum calculated by the device 83701489e5dSAlfredo Cardigliano * matched the checksum in the receive packet's 83801489e5dSAlfredo Cardigliano * first IPv4 header. If the receive packet 83901489e5dSAlfredo Cardigliano * contains both a tunnel IPv4 header and a 84001489e5dSAlfredo Cardigliano * transport IPv4 header, the device validates the 84101489e5dSAlfredo Cardigliano * checksum for the both IPv4 headers. 84201489e5dSAlfredo Cardigliano * @csum_ip_bad: The IPv4 checksum calculated by the device did 84301489e5dSAlfredo Cardigliano * not match the checksum in the receive packet's 84401489e5dSAlfredo Cardigliano * first IPv4 header. If the receive packet 84501489e5dSAlfredo Cardigliano * contains both a tunnel IPv4 header and a 84601489e5dSAlfredo Cardigliano * transport IPv4 header, the device validates the 84701489e5dSAlfredo Cardigliano * checksum for both IP headers. 84801489e5dSAlfredo Cardigliano * @VLAN: VLAN header was stripped and placed in @vlan_tci. 84901489e5dSAlfredo Cardigliano * @pkt_type: Packet type 85001489e5dSAlfredo Cardigliano * @color: Color bit. 85101489e5dSAlfredo Cardigliano */ 85201489e5dSAlfredo Cardigliano struct ionic_rxq_comp { 85301489e5dSAlfredo Cardigliano u8 status; 85401489e5dSAlfredo Cardigliano u8 num_sg_elems; 85501489e5dSAlfredo Cardigliano __le16 comp_index; 85601489e5dSAlfredo Cardigliano __le32 rss_hash; 85701489e5dSAlfredo Cardigliano __le16 csum; 85801489e5dSAlfredo Cardigliano __le16 vlan_tci; 85901489e5dSAlfredo Cardigliano __le16 len; 86001489e5dSAlfredo Cardigliano u8 csum_flags; 86101489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_TCP_OK 0x01 86201489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_TCP_BAD 0x02 86301489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_UDP_OK 0x04 86401489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_UDP_BAD 0x08 86501489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_IP_OK 0x10 86601489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_IP_BAD 0x20 86701489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_VLAN 0x40 86801489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_CALC 0x80 86901489e5dSAlfredo Cardigliano u8 pkt_type_color; 870*6645b283SAlfredo Cardigliano #define IONIC_RXQ_COMP_PKT_TYPE_MASK 0x7f 87101489e5dSAlfredo Cardigliano }; 87201489e5dSAlfredo Cardigliano 87301489e5dSAlfredo Cardigliano enum ionic_pkt_type { 87401489e5dSAlfredo Cardigliano IONIC_PKT_TYPE_NON_IP = 0x000, 87501489e5dSAlfredo Cardigliano IONIC_PKT_TYPE_IPV4 = 0x001, 87601489e5dSAlfredo Cardigliano IONIC_PKT_TYPE_IPV4_TCP = 0x003, 87701489e5dSAlfredo Cardigliano IONIC_PKT_TYPE_IPV4_UDP = 0x005, 87801489e5dSAlfredo Cardigliano IONIC_PKT_TYPE_IPV6 = 0x008, 87901489e5dSAlfredo Cardigliano IONIC_PKT_TYPE_IPV6_TCP = 0x018, 88001489e5dSAlfredo Cardigliano IONIC_PKT_TYPE_IPV6_UDP = 0x028, 88101489e5dSAlfredo Cardigliano }; 88201489e5dSAlfredo Cardigliano 88301489e5dSAlfredo Cardigliano enum ionic_eth_hw_features { 88401489e5dSAlfredo Cardigliano IONIC_ETH_HW_VLAN_TX_TAG = BIT(0), 88501489e5dSAlfredo Cardigliano IONIC_ETH_HW_VLAN_RX_STRIP = BIT(1), 88601489e5dSAlfredo Cardigliano IONIC_ETH_HW_VLAN_RX_FILTER = BIT(2), 88701489e5dSAlfredo Cardigliano IONIC_ETH_HW_RX_HASH = BIT(3), 88801489e5dSAlfredo Cardigliano IONIC_ETH_HW_RX_CSUM = BIT(4), 88901489e5dSAlfredo Cardigliano IONIC_ETH_HW_TX_SG = BIT(5), 89001489e5dSAlfredo Cardigliano IONIC_ETH_HW_RX_SG = BIT(6), 89101489e5dSAlfredo Cardigliano IONIC_ETH_HW_TX_CSUM = BIT(7), 89201489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO = BIT(8), 89301489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_IPV6 = BIT(9), 89401489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_ECN = BIT(10), 89501489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_GRE = BIT(11), 89601489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_GRE_CSUM = BIT(12), 89701489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_IPXIP4 = BIT(13), 89801489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_IPXIP6 = BIT(14), 89901489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_UDP = BIT(15), 90001489e5dSAlfredo Cardigliano IONIC_ETH_HW_TSO_UDP_CSUM = BIT(16), 90101489e5dSAlfredo Cardigliano }; 90201489e5dSAlfredo Cardigliano 90301489e5dSAlfredo Cardigliano /** 90401489e5dSAlfredo Cardigliano * struct ionic_q_control_cmd - Queue control command 90501489e5dSAlfredo Cardigliano * @opcode: opcode 90601489e5dSAlfredo Cardigliano * @type: Queue type 90701489e5dSAlfredo Cardigliano * @lif_index: LIF index 90801489e5dSAlfredo Cardigliano * @index: Queue index 90901489e5dSAlfredo Cardigliano * @oper: Operation (enum q_control_oper) 91001489e5dSAlfredo Cardigliano */ 91101489e5dSAlfredo Cardigliano struct ionic_q_control_cmd { 91201489e5dSAlfredo Cardigliano u8 opcode; 91301489e5dSAlfredo Cardigliano u8 type; 91401489e5dSAlfredo Cardigliano __le16 lif_index; 91501489e5dSAlfredo Cardigliano __le32 index; 91601489e5dSAlfredo Cardigliano u8 oper; 91701489e5dSAlfredo Cardigliano u8 rsvd[55]; 91801489e5dSAlfredo Cardigliano }; 91901489e5dSAlfredo Cardigliano 92001489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_q_control_comp; 92101489e5dSAlfredo Cardigliano 92201489e5dSAlfredo Cardigliano enum q_control_oper { 92301489e5dSAlfredo Cardigliano IONIC_Q_DISABLE = 0, 92401489e5dSAlfredo Cardigliano IONIC_Q_ENABLE = 1, 92501489e5dSAlfredo Cardigliano IONIC_Q_HANG_RESET = 2, 92601489e5dSAlfredo Cardigliano }; 92701489e5dSAlfredo Cardigliano 92801489e5dSAlfredo Cardigliano /** 92901489e5dSAlfredo Cardigliano * Physical connection type 93001489e5dSAlfredo Cardigliano */ 93101489e5dSAlfredo Cardigliano enum ionic_phy_type { 93201489e5dSAlfredo Cardigliano IONIC_PHY_TYPE_NONE = 0, 93301489e5dSAlfredo Cardigliano IONIC_PHY_TYPE_COPPER = 1, 93401489e5dSAlfredo Cardigliano IONIC_PHY_TYPE_FIBER = 2, 93501489e5dSAlfredo Cardigliano }; 93601489e5dSAlfredo Cardigliano 93701489e5dSAlfredo Cardigliano /** 93801489e5dSAlfredo Cardigliano * Transceiver status 93901489e5dSAlfredo Cardigliano */ 94001489e5dSAlfredo Cardigliano enum ionic_xcvr_state { 94101489e5dSAlfredo Cardigliano IONIC_XCVR_STATE_REMOVED = 0, 94201489e5dSAlfredo Cardigliano IONIC_XCVR_STATE_INSERTED = 1, 94301489e5dSAlfredo Cardigliano IONIC_XCVR_STATE_PENDING = 2, 94401489e5dSAlfredo Cardigliano IONIC_XCVR_STATE_SPROM_READ = 3, 94501489e5dSAlfredo Cardigliano IONIC_XCVR_STATE_SPROM_READ_ERR = 4, 94601489e5dSAlfredo Cardigliano }; 94701489e5dSAlfredo Cardigliano 94801489e5dSAlfredo Cardigliano /** 94901489e5dSAlfredo Cardigliano * Supported link modes 95001489e5dSAlfredo Cardigliano */ 95101489e5dSAlfredo Cardigliano enum ionic_xcvr_pid { 95201489e5dSAlfredo Cardigliano IONIC_XCVR_PID_UNKNOWN = 0, 95301489e5dSAlfredo Cardigliano 95401489e5dSAlfredo Cardigliano /* CU */ 95501489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_CR4 = 1, 95601489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_40GBASE_CR4 = 2, 95701489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_25GBASE_CR_S = 3, 95801489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_25GBASE_CR_L = 4, 95901489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_25GBASE_CR_N = 5, 96001489e5dSAlfredo Cardigliano 96101489e5dSAlfredo Cardigliano /* Fiber */ 96201489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_AOC = 50, 96301489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_ACC = 51, 96401489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_SR4 = 52, 96501489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_LR4 = 53, 96601489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_ER4 = 54, 96701489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_40GBASE_ER4 = 55, 96801489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_40GBASE_SR4 = 56, 96901489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_40GBASE_LR4 = 57, 97001489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_40GBASE_AOC = 58, 97101489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_25GBASE_SR = 59, 97201489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_25GBASE_LR = 60, 97301489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_25GBASE_ER = 61, 97401489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_25GBASE_AOC = 62, 97501489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_10GBASE_SR = 63, 97601489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_10GBASE_LR = 64, 97701489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_10GBASE_LRM = 65, 97801489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_10GBASE_ER = 66, 97901489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_10GBASE_AOC = 67, 98001489e5dSAlfredo Cardigliano IONIC_XCVR_PID_SFP_10GBASE_CU = 68, 98101489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_CWDM4 = 69, 98201489e5dSAlfredo Cardigliano IONIC_XCVR_PID_QSFP_100G_PSM4 = 70, 98301489e5dSAlfredo Cardigliano }; 98401489e5dSAlfredo Cardigliano 98501489e5dSAlfredo Cardigliano /** 98601489e5dSAlfredo Cardigliano * Port types 98701489e5dSAlfredo Cardigliano */ 98801489e5dSAlfredo Cardigliano enum ionic_port_type { 98901489e5dSAlfredo Cardigliano IONIC_PORT_TYPE_NONE = 0, /* port type not configured */ 99001489e5dSAlfredo Cardigliano IONIC_PORT_TYPE_ETH = 1, /* port carries ethernet traffic (inband) */ 99101489e5dSAlfredo Cardigliano IONIC_PORT_TYPE_MGMT = 2, /* port carries mgmt traffic (out-of-band) */ 99201489e5dSAlfredo Cardigliano }; 99301489e5dSAlfredo Cardigliano 99401489e5dSAlfredo Cardigliano /** 99501489e5dSAlfredo Cardigliano * Port config state 99601489e5dSAlfredo Cardigliano */ 99701489e5dSAlfredo Cardigliano enum ionic_port_admin_state { 99801489e5dSAlfredo Cardigliano IONIC_PORT_ADMIN_STATE_NONE = 0, /* port admin state not configured */ 99901489e5dSAlfredo Cardigliano IONIC_PORT_ADMIN_STATE_DOWN = 1, /* port is admin disabled */ 100001489e5dSAlfredo Cardigliano IONIC_PORT_ADMIN_STATE_UP = 2, /* port is admin enabled */ 100101489e5dSAlfredo Cardigliano }; 100201489e5dSAlfredo Cardigliano 100301489e5dSAlfredo Cardigliano /** 100401489e5dSAlfredo Cardigliano * Port operational status 100501489e5dSAlfredo Cardigliano */ 100601489e5dSAlfredo Cardigliano enum ionic_port_oper_status { 100701489e5dSAlfredo Cardigliano IONIC_PORT_OPER_STATUS_NONE = 0, /* port is disabled */ 100801489e5dSAlfredo Cardigliano IONIC_PORT_OPER_STATUS_UP = 1, /* port is linked up */ 100901489e5dSAlfredo Cardigliano IONIC_PORT_OPER_STATUS_DOWN = 2, /* port link status is down */ 101001489e5dSAlfredo Cardigliano }; 101101489e5dSAlfredo Cardigliano 101201489e5dSAlfredo Cardigliano /** 101301489e5dSAlfredo Cardigliano * Ethernet Forward error correction (fec) modes 101401489e5dSAlfredo Cardigliano */ 101501489e5dSAlfredo Cardigliano enum ionic_port_fec_type { 101601489e5dSAlfredo Cardigliano IONIC_PORT_FEC_TYPE_NONE = 0, /* Disabled */ 101701489e5dSAlfredo Cardigliano IONIC_PORT_FEC_TYPE_FC = 1, /* FireCode */ 101801489e5dSAlfredo Cardigliano IONIC_PORT_FEC_TYPE_RS = 2, /* ReedSolomon */ 101901489e5dSAlfredo Cardigliano }; 102001489e5dSAlfredo Cardigliano 102101489e5dSAlfredo Cardigliano /** 102201489e5dSAlfredo Cardigliano * Ethernet pause (flow control) modes 102301489e5dSAlfredo Cardigliano */ 102401489e5dSAlfredo Cardigliano enum ionic_port_pause_type { 102501489e5dSAlfredo Cardigliano IONIC_PORT_PAUSE_TYPE_NONE = 0, /* Disable Pause */ 102601489e5dSAlfredo Cardigliano IONIC_PORT_PAUSE_TYPE_LINK = 1, /* Link level pause */ 102701489e5dSAlfredo Cardigliano IONIC_PORT_PAUSE_TYPE_PFC = 2, /* Priority-Flow control */ 102801489e5dSAlfredo Cardigliano }; 102901489e5dSAlfredo Cardigliano 103001489e5dSAlfredo Cardigliano /** 103101489e5dSAlfredo Cardigliano * Loopback modes 103201489e5dSAlfredo Cardigliano */ 103301489e5dSAlfredo Cardigliano enum ionic_port_loopback_mode { 103401489e5dSAlfredo Cardigliano IONIC_PORT_LOOPBACK_MODE_NONE = 0, /* Disable loopback */ 103501489e5dSAlfredo Cardigliano IONIC_PORT_LOOPBACK_MODE_MAC = 1, /* MAC loopback */ 103601489e5dSAlfredo Cardigliano IONIC_PORT_LOOPBACK_MODE_PHY = 2, /* PHY/Serdes loopback */ 103701489e5dSAlfredo Cardigliano }; 103801489e5dSAlfredo Cardigliano 103901489e5dSAlfredo Cardigliano /** 104001489e5dSAlfredo Cardigliano * Transceiver Status information 104101489e5dSAlfredo Cardigliano * @state: Transceiver status (enum ionic_xcvr_state) 104201489e5dSAlfredo Cardigliano * @phy: Physical connection type (enum ionic_phy_type) 104301489e5dSAlfredo Cardigliano * @pid: Transceiver link mode (enum pid) 104401489e5dSAlfredo Cardigliano * @sprom: Transceiver sprom contents 104501489e5dSAlfredo Cardigliano */ 104601489e5dSAlfredo Cardigliano struct ionic_xcvr_status { 104701489e5dSAlfredo Cardigliano u8 state; 104801489e5dSAlfredo Cardigliano u8 phy; 104901489e5dSAlfredo Cardigliano __le16 pid; 105001489e5dSAlfredo Cardigliano u8 sprom[256]; 105101489e5dSAlfredo Cardigliano }; 105201489e5dSAlfredo Cardigliano 105301489e5dSAlfredo Cardigliano /** 105401489e5dSAlfredo Cardigliano * Port configuration 105501489e5dSAlfredo Cardigliano * @speed: port speed (in Mbps) 105601489e5dSAlfredo Cardigliano * @mtu: mtu 105701489e5dSAlfredo Cardigliano * @state: port admin state (enum port_admin_state) 105801489e5dSAlfredo Cardigliano * @an_enable: autoneg enable 105901489e5dSAlfredo Cardigliano * @fec_type: fec type (enum ionic_port_fec_type) 106001489e5dSAlfredo Cardigliano * @pause_type: pause type (enum ionic_port_pause_type) 106101489e5dSAlfredo Cardigliano * @loopback_mode: loopback mode (enum ionic_port_loopback_mode) 106201489e5dSAlfredo Cardigliano */ 106301489e5dSAlfredo Cardigliano union ionic_port_config { 106401489e5dSAlfredo Cardigliano struct { 106501489e5dSAlfredo Cardigliano #define IONIC_SPEED_100G 100000 /* 100G in Mbps */ 106601489e5dSAlfredo Cardigliano #define IONIC_SPEED_50G 50000 /* 50G in Mbps */ 106701489e5dSAlfredo Cardigliano #define IONIC_SPEED_40G 40000 /* 40G in Mbps */ 106801489e5dSAlfredo Cardigliano #define IONIC_SPEED_25G 25000 /* 25G in Mbps */ 106901489e5dSAlfredo Cardigliano #define IONIC_SPEED_10G 10000 /* 10G in Mbps */ 107001489e5dSAlfredo Cardigliano #define IONIC_SPEED_1G 1000 /* 1G in Mbps */ 107101489e5dSAlfredo Cardigliano __le32 speed; 107201489e5dSAlfredo Cardigliano __le32 mtu; 107301489e5dSAlfredo Cardigliano u8 state; 107401489e5dSAlfredo Cardigliano u8 an_enable; 107501489e5dSAlfredo Cardigliano u8 fec_type; 107601489e5dSAlfredo Cardigliano #define IONIC_PAUSE_TYPE_MASK 0x0f 107701489e5dSAlfredo Cardigliano #define IONIC_PAUSE_FLAGS_MASK 0xf0 107801489e5dSAlfredo Cardigliano #define IONIC_PAUSE_F_TX 0x10 107901489e5dSAlfredo Cardigliano #define IONIC_PAUSE_F_RX 0x20 108001489e5dSAlfredo Cardigliano u8 pause_type; 108101489e5dSAlfredo Cardigliano u8 loopback_mode; 108201489e5dSAlfredo Cardigliano }; 108301489e5dSAlfredo Cardigliano __le32 words[64]; 108401489e5dSAlfredo Cardigliano }; 108501489e5dSAlfredo Cardigliano 108601489e5dSAlfredo Cardigliano /** 108701489e5dSAlfredo Cardigliano * Port Status information 108801489e5dSAlfredo Cardigliano * @status: link status (enum ionic_port_oper_status) 108901489e5dSAlfredo Cardigliano * @id: port id 109001489e5dSAlfredo Cardigliano * @speed: link speed (in Mbps) 109101489e5dSAlfredo Cardigliano * @xcvr: transceiver status 109201489e5dSAlfredo Cardigliano */ 109301489e5dSAlfredo Cardigliano struct ionic_port_status { 109401489e5dSAlfredo Cardigliano __le32 id; 109501489e5dSAlfredo Cardigliano __le32 speed; 109601489e5dSAlfredo Cardigliano u8 status; 109701489e5dSAlfredo Cardigliano u8 rsvd[51]; 109801489e5dSAlfredo Cardigliano struct ionic_xcvr_status xcvr; 109901489e5dSAlfredo Cardigliano }; 110001489e5dSAlfredo Cardigliano 110101489e5dSAlfredo Cardigliano /** 110201489e5dSAlfredo Cardigliano * struct ionic_port_identify_cmd - Port identify command 110301489e5dSAlfredo Cardigliano * @opcode: opcode 110401489e5dSAlfredo Cardigliano * @index: port index 110501489e5dSAlfredo Cardigliano * @ver: Highest version of identify supported by driver 110601489e5dSAlfredo Cardigliano */ 110701489e5dSAlfredo Cardigliano struct ionic_port_identify_cmd { 110801489e5dSAlfredo Cardigliano u8 opcode; 110901489e5dSAlfredo Cardigliano u8 index; 111001489e5dSAlfredo Cardigliano u8 ver; 111101489e5dSAlfredo Cardigliano u8 rsvd[61]; 111201489e5dSAlfredo Cardigliano }; 111301489e5dSAlfredo Cardigliano 111401489e5dSAlfredo Cardigliano /** 111501489e5dSAlfredo Cardigliano * struct ionic_port_identify_comp - Port identify command completion 111601489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 111701489e5dSAlfredo Cardigliano * @ver: Version of identify returned by device 111801489e5dSAlfredo Cardigliano */ 111901489e5dSAlfredo Cardigliano struct ionic_port_identify_comp { 112001489e5dSAlfredo Cardigliano u8 status; 112101489e5dSAlfredo Cardigliano u8 ver; 112201489e5dSAlfredo Cardigliano u8 rsvd[14]; 112301489e5dSAlfredo Cardigliano }; 112401489e5dSAlfredo Cardigliano 112501489e5dSAlfredo Cardigliano /** 112601489e5dSAlfredo Cardigliano * struct ionic_port_init_cmd - Port initialization command 112701489e5dSAlfredo Cardigliano * @opcode: opcode 112801489e5dSAlfredo Cardigliano * @index: port index 112901489e5dSAlfredo Cardigliano * @info_pa: destination address for port info (struct ionic_port_info) 113001489e5dSAlfredo Cardigliano */ 113101489e5dSAlfredo Cardigliano struct ionic_port_init_cmd { 113201489e5dSAlfredo Cardigliano u8 opcode; 113301489e5dSAlfredo Cardigliano u8 index; 113401489e5dSAlfredo Cardigliano u8 rsvd[6]; 113501489e5dSAlfredo Cardigliano __le64 info_pa; 113601489e5dSAlfredo Cardigliano u8 rsvd2[48]; 113701489e5dSAlfredo Cardigliano }; 113801489e5dSAlfredo Cardigliano 113901489e5dSAlfredo Cardigliano /** 114001489e5dSAlfredo Cardigliano * struct ionic_port_init_comp - Port initialization command completion 114101489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 114201489e5dSAlfredo Cardigliano */ 114301489e5dSAlfredo Cardigliano struct ionic_port_init_comp { 114401489e5dSAlfredo Cardigliano u8 status; 114501489e5dSAlfredo Cardigliano u8 rsvd[15]; 114601489e5dSAlfredo Cardigliano }; 114701489e5dSAlfredo Cardigliano 114801489e5dSAlfredo Cardigliano /** 114901489e5dSAlfredo Cardigliano * struct ionic_port_reset_cmd - Port reset command 115001489e5dSAlfredo Cardigliano * @opcode: opcode 115101489e5dSAlfredo Cardigliano * @index: port index 115201489e5dSAlfredo Cardigliano */ 115301489e5dSAlfredo Cardigliano struct ionic_port_reset_cmd { 115401489e5dSAlfredo Cardigliano u8 opcode; 115501489e5dSAlfredo Cardigliano u8 index; 115601489e5dSAlfredo Cardigliano u8 rsvd[62]; 115701489e5dSAlfredo Cardigliano }; 115801489e5dSAlfredo Cardigliano 115901489e5dSAlfredo Cardigliano /** 116001489e5dSAlfredo Cardigliano * struct ionic_port_reset_comp - Port reset command completion 116101489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 116201489e5dSAlfredo Cardigliano */ 116301489e5dSAlfredo Cardigliano struct ionic_port_reset_comp { 116401489e5dSAlfredo Cardigliano u8 status; 116501489e5dSAlfredo Cardigliano u8 rsvd[15]; 116601489e5dSAlfredo Cardigliano }; 116701489e5dSAlfredo Cardigliano 116801489e5dSAlfredo Cardigliano /** 116901489e5dSAlfredo Cardigliano * enum stats_ctl_cmd - List of commands for stats control 117001489e5dSAlfredo Cardigliano */ 117101489e5dSAlfredo Cardigliano enum ionic_stats_ctl_cmd { 117201489e5dSAlfredo Cardigliano IONIC_STATS_CTL_RESET = 0, 117301489e5dSAlfredo Cardigliano }; 117401489e5dSAlfredo Cardigliano 117501489e5dSAlfredo Cardigliano 117601489e5dSAlfredo Cardigliano /** 117701489e5dSAlfredo Cardigliano * enum ionic_port_attr - List of device attributes 117801489e5dSAlfredo Cardigliano */ 117901489e5dSAlfredo Cardigliano enum ionic_port_attr { 118001489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_STATE = 0, 118101489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_SPEED = 1, 118201489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_MTU = 2, 118301489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_AUTONEG = 3, 118401489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_FEC = 4, 118501489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_PAUSE = 5, 118601489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_LOOPBACK = 6, 118701489e5dSAlfredo Cardigliano IONIC_PORT_ATTR_STATS_CTRL = 7, 118801489e5dSAlfredo Cardigliano }; 118901489e5dSAlfredo Cardigliano 119001489e5dSAlfredo Cardigliano /** 119101489e5dSAlfredo Cardigliano * struct ionic_port_setattr_cmd - Set port attributes on the NIC 119201489e5dSAlfredo Cardigliano * @opcode: Opcode 119301489e5dSAlfredo Cardigliano * @index: port index 119401489e5dSAlfredo Cardigliano * @attr: Attribute type (enum ionic_port_attr) 119501489e5dSAlfredo Cardigliano */ 119601489e5dSAlfredo Cardigliano struct ionic_port_setattr_cmd { 119701489e5dSAlfredo Cardigliano u8 opcode; 119801489e5dSAlfredo Cardigliano u8 index; 119901489e5dSAlfredo Cardigliano u8 attr; 120001489e5dSAlfredo Cardigliano u8 rsvd; 120101489e5dSAlfredo Cardigliano union { 120201489e5dSAlfredo Cardigliano u8 state; 120301489e5dSAlfredo Cardigliano __le32 speed; 120401489e5dSAlfredo Cardigliano __le32 mtu; 120501489e5dSAlfredo Cardigliano u8 an_enable; 120601489e5dSAlfredo Cardigliano u8 fec_type; 120701489e5dSAlfredo Cardigliano u8 pause_type; 120801489e5dSAlfredo Cardigliano u8 loopback_mode; 120901489e5dSAlfredo Cardigliano u8 stats_ctl; 121001489e5dSAlfredo Cardigliano u8 rsvd2[60]; 121101489e5dSAlfredo Cardigliano }; 121201489e5dSAlfredo Cardigliano }; 121301489e5dSAlfredo Cardigliano 121401489e5dSAlfredo Cardigliano /** 121501489e5dSAlfredo Cardigliano * struct ionic_port_setattr_comp - Port set attr command completion 121601489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 121701489e5dSAlfredo Cardigliano * @color: Color bit 121801489e5dSAlfredo Cardigliano */ 121901489e5dSAlfredo Cardigliano struct ionic_port_setattr_comp { 122001489e5dSAlfredo Cardigliano u8 status; 122101489e5dSAlfredo Cardigliano u8 rsvd[14]; 122201489e5dSAlfredo Cardigliano u8 color; 122301489e5dSAlfredo Cardigliano }; 122401489e5dSAlfredo Cardigliano 122501489e5dSAlfredo Cardigliano /** 122601489e5dSAlfredo Cardigliano * struct ionic_port_getattr_cmd - Get port attributes from the NIC 122701489e5dSAlfredo Cardigliano * @opcode: Opcode 122801489e5dSAlfredo Cardigliano * @index: port index 122901489e5dSAlfredo Cardigliano * @attr: Attribute type (enum ionic_port_attr) 123001489e5dSAlfredo Cardigliano */ 123101489e5dSAlfredo Cardigliano struct ionic_port_getattr_cmd { 123201489e5dSAlfredo Cardigliano u8 opcode; 123301489e5dSAlfredo Cardigliano u8 index; 123401489e5dSAlfredo Cardigliano u8 attr; 123501489e5dSAlfredo Cardigliano u8 rsvd[61]; 123601489e5dSAlfredo Cardigliano }; 123701489e5dSAlfredo Cardigliano 123801489e5dSAlfredo Cardigliano /** 123901489e5dSAlfredo Cardigliano * struct ionic_port_getattr_comp - Port get attr command completion 124001489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 124101489e5dSAlfredo Cardigliano * @color: Color bit 124201489e5dSAlfredo Cardigliano */ 124301489e5dSAlfredo Cardigliano struct ionic_port_getattr_comp { 124401489e5dSAlfredo Cardigliano u8 status; 124501489e5dSAlfredo Cardigliano u8 rsvd[3]; 124601489e5dSAlfredo Cardigliano union { 124701489e5dSAlfredo Cardigliano u8 state; 124801489e5dSAlfredo Cardigliano __le32 speed; 124901489e5dSAlfredo Cardigliano __le32 mtu; 125001489e5dSAlfredo Cardigliano u8 an_enable; 125101489e5dSAlfredo Cardigliano u8 fec_type; 125201489e5dSAlfredo Cardigliano u8 pause_type; 125301489e5dSAlfredo Cardigliano u8 loopback_mode; 125401489e5dSAlfredo Cardigliano u8 rsvd2[11]; 125501489e5dSAlfredo Cardigliano }; 125601489e5dSAlfredo Cardigliano u8 color; 125701489e5dSAlfredo Cardigliano }; 125801489e5dSAlfredo Cardigliano 125901489e5dSAlfredo Cardigliano /** 126001489e5dSAlfredo Cardigliano * struct ionic_lif_status - Lif status register 126101489e5dSAlfredo Cardigliano * @eid: most recent NotifyQ event id 126201489e5dSAlfredo Cardigliano * @port_num: port the lif is connected to 126301489e5dSAlfredo Cardigliano * @link_status: port status (enum ionic_port_oper_status) 126401489e5dSAlfredo Cardigliano * @link_speed: speed of link in Mbps 126501489e5dSAlfredo Cardigliano * @link_down_count: number of times link status changes 126601489e5dSAlfredo Cardigliano */ 126701489e5dSAlfredo Cardigliano struct ionic_lif_status { 126801489e5dSAlfredo Cardigliano __le64 eid; 126901489e5dSAlfredo Cardigliano u8 port_num; 127001489e5dSAlfredo Cardigliano u8 rsvd; 127101489e5dSAlfredo Cardigliano __le16 link_status; 127201489e5dSAlfredo Cardigliano __le32 link_speed; /* units of 1Mbps: eg 10000 = 10Gbps */ 127301489e5dSAlfredo Cardigliano __le16 link_down_count; 127401489e5dSAlfredo Cardigliano u8 rsvd2[46]; 127501489e5dSAlfredo Cardigliano }; 127601489e5dSAlfredo Cardigliano 127701489e5dSAlfredo Cardigliano /** 127801489e5dSAlfredo Cardigliano * struct ionic_lif_reset_cmd - LIF reset command 127901489e5dSAlfredo Cardigliano * @opcode: opcode 128001489e5dSAlfredo Cardigliano * @index: LIF index 128101489e5dSAlfredo Cardigliano */ 128201489e5dSAlfredo Cardigliano struct ionic_lif_reset_cmd { 128301489e5dSAlfredo Cardigliano u8 opcode; 128401489e5dSAlfredo Cardigliano u8 rsvd; 128501489e5dSAlfredo Cardigliano __le16 index; 128601489e5dSAlfredo Cardigliano __le32 rsvd2[15]; 128701489e5dSAlfredo Cardigliano }; 128801489e5dSAlfredo Cardigliano 128901489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_lif_reset_comp; 129001489e5dSAlfredo Cardigliano 129101489e5dSAlfredo Cardigliano enum ionic_dev_state { 129201489e5dSAlfredo Cardigliano IONIC_DEV_DISABLE = 0, 129301489e5dSAlfredo Cardigliano IONIC_DEV_ENABLE = 1, 129401489e5dSAlfredo Cardigliano IONIC_DEV_HANG_RESET = 2, 129501489e5dSAlfredo Cardigliano }; 129601489e5dSAlfredo Cardigliano 129701489e5dSAlfredo Cardigliano /** 129801489e5dSAlfredo Cardigliano * enum ionic_dev_attr - List of device attributes 129901489e5dSAlfredo Cardigliano */ 130001489e5dSAlfredo Cardigliano enum ionic_dev_attr { 130101489e5dSAlfredo Cardigliano IONIC_DEV_ATTR_STATE = 0, 130201489e5dSAlfredo Cardigliano IONIC_DEV_ATTR_NAME = 1, 130301489e5dSAlfredo Cardigliano IONIC_DEV_ATTR_FEATURES = 2, 130401489e5dSAlfredo Cardigliano }; 130501489e5dSAlfredo Cardigliano 130601489e5dSAlfredo Cardigliano /** 130701489e5dSAlfredo Cardigliano * struct ionic_dev_setattr_cmd - Set Device attributes on the NIC 130801489e5dSAlfredo Cardigliano * @opcode: Opcode 130901489e5dSAlfredo Cardigliano * @attr: Attribute type (enum ionic_dev_attr) 131001489e5dSAlfredo Cardigliano * @state: Device state (enum ionic_dev_state) 131101489e5dSAlfredo Cardigliano * @name: The bus info, e.g. PCI slot-device-function, 0 terminated 131201489e5dSAlfredo Cardigliano * @features: Device features 131301489e5dSAlfredo Cardigliano */ 131401489e5dSAlfredo Cardigliano struct ionic_dev_setattr_cmd { 131501489e5dSAlfredo Cardigliano u8 opcode; 131601489e5dSAlfredo Cardigliano u8 attr; 131701489e5dSAlfredo Cardigliano __le16 rsvd; 131801489e5dSAlfredo Cardigliano union { 131901489e5dSAlfredo Cardigliano u8 state; 132001489e5dSAlfredo Cardigliano char name[IONIC_IFNAMSIZ]; 132101489e5dSAlfredo Cardigliano __le64 features; 132201489e5dSAlfredo Cardigliano u8 rsvd2[60]; 132301489e5dSAlfredo Cardigliano }; 132401489e5dSAlfredo Cardigliano }; 132501489e5dSAlfredo Cardigliano 132601489e5dSAlfredo Cardigliano /** 132701489e5dSAlfredo Cardigliano * struct ionic_dev_setattr_comp - Device set attr command completion 132801489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 132901489e5dSAlfredo Cardigliano * @features: Device features 133001489e5dSAlfredo Cardigliano * @color: Color bit 133101489e5dSAlfredo Cardigliano */ 133201489e5dSAlfredo Cardigliano struct ionic_dev_setattr_comp { 133301489e5dSAlfredo Cardigliano u8 status; 133401489e5dSAlfredo Cardigliano u8 rsvd[3]; 133501489e5dSAlfredo Cardigliano union { 133601489e5dSAlfredo Cardigliano __le64 features; 133701489e5dSAlfredo Cardigliano u8 rsvd2[11]; 133801489e5dSAlfredo Cardigliano }; 133901489e5dSAlfredo Cardigliano u8 color; 134001489e5dSAlfredo Cardigliano }; 134101489e5dSAlfredo Cardigliano 134201489e5dSAlfredo Cardigliano /** 134301489e5dSAlfredo Cardigliano * struct ionic_dev_getattr_cmd - Get Device attributes from the NIC 134401489e5dSAlfredo Cardigliano * @opcode: opcode 134501489e5dSAlfredo Cardigliano * @attr: Attribute type (enum ionic_dev_attr) 134601489e5dSAlfredo Cardigliano */ 134701489e5dSAlfredo Cardigliano struct ionic_dev_getattr_cmd { 134801489e5dSAlfredo Cardigliano u8 opcode; 134901489e5dSAlfredo Cardigliano u8 attr; 135001489e5dSAlfredo Cardigliano u8 rsvd[62]; 135101489e5dSAlfredo Cardigliano }; 135201489e5dSAlfredo Cardigliano 135301489e5dSAlfredo Cardigliano /** 135401489e5dSAlfredo Cardigliano * struct ionic_dev_setattr_comp - Device set attr command completion 135501489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 135601489e5dSAlfredo Cardigliano * @features: Device features 135701489e5dSAlfredo Cardigliano * @color: Color bit 135801489e5dSAlfredo Cardigliano */ 135901489e5dSAlfredo Cardigliano struct ionic_dev_getattr_comp { 136001489e5dSAlfredo Cardigliano u8 status; 136101489e5dSAlfredo Cardigliano u8 rsvd[3]; 136201489e5dSAlfredo Cardigliano union { 136301489e5dSAlfredo Cardigliano __le64 features; 136401489e5dSAlfredo Cardigliano u8 rsvd2[11]; 136501489e5dSAlfredo Cardigliano }; 136601489e5dSAlfredo Cardigliano u8 color; 136701489e5dSAlfredo Cardigliano }; 136801489e5dSAlfredo Cardigliano 136901489e5dSAlfredo Cardigliano /** 137001489e5dSAlfredo Cardigliano * RSS parameters 137101489e5dSAlfredo Cardigliano */ 137201489e5dSAlfredo Cardigliano #define IONIC_RSS_HASH_KEY_SIZE 40 137301489e5dSAlfredo Cardigliano 137401489e5dSAlfredo Cardigliano enum ionic_rss_hash_types { 137501489e5dSAlfredo Cardigliano IONIC_RSS_TYPE_IPV4 = BIT(0), 137601489e5dSAlfredo Cardigliano IONIC_RSS_TYPE_IPV4_TCP = BIT(1), 137701489e5dSAlfredo Cardigliano IONIC_RSS_TYPE_IPV4_UDP = BIT(2), 137801489e5dSAlfredo Cardigliano IONIC_RSS_TYPE_IPV6 = BIT(3), 137901489e5dSAlfredo Cardigliano IONIC_RSS_TYPE_IPV6_TCP = BIT(4), 138001489e5dSAlfredo Cardigliano IONIC_RSS_TYPE_IPV6_UDP = BIT(5), 138101489e5dSAlfredo Cardigliano }; 138201489e5dSAlfredo Cardigliano 138301489e5dSAlfredo Cardigliano /** 138401489e5dSAlfredo Cardigliano * enum ionic_lif_attr - List of LIF attributes 138501489e5dSAlfredo Cardigliano */ 138601489e5dSAlfredo Cardigliano enum ionic_lif_attr { 138701489e5dSAlfredo Cardigliano IONIC_LIF_ATTR_STATE = 0, 138801489e5dSAlfredo Cardigliano IONIC_LIF_ATTR_NAME = 1, 138901489e5dSAlfredo Cardigliano IONIC_LIF_ATTR_MTU = 2, 139001489e5dSAlfredo Cardigliano IONIC_LIF_ATTR_MAC = 3, 139101489e5dSAlfredo Cardigliano IONIC_LIF_ATTR_FEATURES = 4, 139201489e5dSAlfredo Cardigliano IONIC_LIF_ATTR_RSS = 5, 139301489e5dSAlfredo Cardigliano IONIC_LIF_ATTR_STATS_CTRL = 6, 139401489e5dSAlfredo Cardigliano }; 139501489e5dSAlfredo Cardigliano 139601489e5dSAlfredo Cardigliano /** 139701489e5dSAlfredo Cardigliano * struct ionic_lif_setattr_cmd - Set LIF attributes on the NIC 139801489e5dSAlfredo Cardigliano * @opcode: Opcode 139901489e5dSAlfredo Cardigliano * @type: Attribute type (enum ionic_lif_attr) 140001489e5dSAlfredo Cardigliano * @index: LIF index 140101489e5dSAlfredo Cardigliano * @state: lif state (enum lif_state) 140201489e5dSAlfredo Cardigliano * @name: The netdev name string, 0 terminated 140301489e5dSAlfredo Cardigliano * @mtu: Mtu 140401489e5dSAlfredo Cardigliano * @mac: Station mac 140501489e5dSAlfredo Cardigliano * @features: Features (enum ionic_eth_hw_features) 140601489e5dSAlfredo Cardigliano * @rss: RSS properties 140701489e5dSAlfredo Cardigliano * @types: The hash types to enable (see rss_hash_types). 140801489e5dSAlfredo Cardigliano * @key: The hash secret key. 140901489e5dSAlfredo Cardigliano * @addr: Address for the indirection table shared memory. 141001489e5dSAlfredo Cardigliano * @stats_ctl: stats control commands (enum stats_ctl_cmd) 141101489e5dSAlfredo Cardigliano */ 141201489e5dSAlfredo Cardigliano struct ionic_lif_setattr_cmd { 141301489e5dSAlfredo Cardigliano u8 opcode; 141401489e5dSAlfredo Cardigliano u8 attr; 141501489e5dSAlfredo Cardigliano __le16 index; 141601489e5dSAlfredo Cardigliano union { 141701489e5dSAlfredo Cardigliano u8 state; 141801489e5dSAlfredo Cardigliano char name[IONIC_IFNAMSIZ]; 141901489e5dSAlfredo Cardigliano __le32 mtu; 142001489e5dSAlfredo Cardigliano u8 mac[6]; 142101489e5dSAlfredo Cardigliano __le64 features; 142201489e5dSAlfredo Cardigliano struct { 142301489e5dSAlfredo Cardigliano __le16 types; 142401489e5dSAlfredo Cardigliano u8 key[IONIC_RSS_HASH_KEY_SIZE]; 142501489e5dSAlfredo Cardigliano u8 rsvd[6]; 142601489e5dSAlfredo Cardigliano __le64 addr; 142701489e5dSAlfredo Cardigliano } rss; 142801489e5dSAlfredo Cardigliano u8 stats_ctl; 142901489e5dSAlfredo Cardigliano u8 rsvd[60]; 143001489e5dSAlfredo Cardigliano }; 143101489e5dSAlfredo Cardigliano }; 143201489e5dSAlfredo Cardigliano 143301489e5dSAlfredo Cardigliano /** 143401489e5dSAlfredo Cardigliano * struct ionic_lif_setattr_comp - LIF set attr command completion 143501489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 143601489e5dSAlfredo Cardigliano * @comp_index: The index in the descriptor ring for which this 143701489e5dSAlfredo Cardigliano * is the completion. 143801489e5dSAlfredo Cardigliano * @features: features (enum ionic_eth_hw_features) 143901489e5dSAlfredo Cardigliano * @color: Color bit 144001489e5dSAlfredo Cardigliano */ 144101489e5dSAlfredo Cardigliano struct ionic_lif_setattr_comp { 144201489e5dSAlfredo Cardigliano u8 status; 144301489e5dSAlfredo Cardigliano u8 rsvd; 144401489e5dSAlfredo Cardigliano __le16 comp_index; 144501489e5dSAlfredo Cardigliano union { 144601489e5dSAlfredo Cardigliano __le64 features; 144701489e5dSAlfredo Cardigliano u8 rsvd2[11]; 144801489e5dSAlfredo Cardigliano }; 144901489e5dSAlfredo Cardigliano u8 color; 145001489e5dSAlfredo Cardigliano }; 145101489e5dSAlfredo Cardigliano 145201489e5dSAlfredo Cardigliano /** 145301489e5dSAlfredo Cardigliano * struct ionic_lif_getattr_cmd - Get LIF attributes from the NIC 145401489e5dSAlfredo Cardigliano * @opcode: Opcode 145501489e5dSAlfredo Cardigliano * @attr: Attribute type (enum ionic_lif_attr) 145601489e5dSAlfredo Cardigliano * @index: LIF index 145701489e5dSAlfredo Cardigliano */ 145801489e5dSAlfredo Cardigliano struct ionic_lif_getattr_cmd { 145901489e5dSAlfredo Cardigliano u8 opcode; 146001489e5dSAlfredo Cardigliano u8 attr; 146101489e5dSAlfredo Cardigliano __le16 index; 146201489e5dSAlfredo Cardigliano u8 rsvd[60]; 146301489e5dSAlfredo Cardigliano }; 146401489e5dSAlfredo Cardigliano 146501489e5dSAlfredo Cardigliano /** 146601489e5dSAlfredo Cardigliano * struct ionic_lif_getattr_comp - LIF get attr command completion 146701489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 146801489e5dSAlfredo Cardigliano * @comp_index: The index in the descriptor ring for which this 146901489e5dSAlfredo Cardigliano * is the completion. 147001489e5dSAlfredo Cardigliano * @state: lif state (enum lif_state) 147101489e5dSAlfredo Cardigliano * @name: The netdev name string, 0 terminated 147201489e5dSAlfredo Cardigliano * @mtu: Mtu 147301489e5dSAlfredo Cardigliano * @mac: Station mac 147401489e5dSAlfredo Cardigliano * @features: Features (enum ionic_eth_hw_features) 147501489e5dSAlfredo Cardigliano * @color: Color bit 147601489e5dSAlfredo Cardigliano */ 147701489e5dSAlfredo Cardigliano struct ionic_lif_getattr_comp { 147801489e5dSAlfredo Cardigliano u8 status; 147901489e5dSAlfredo Cardigliano u8 rsvd; 148001489e5dSAlfredo Cardigliano __le16 comp_index; 148101489e5dSAlfredo Cardigliano union { 148201489e5dSAlfredo Cardigliano u8 state; 148301489e5dSAlfredo Cardigliano __le32 mtu; 148401489e5dSAlfredo Cardigliano u8 mac[6]; 148501489e5dSAlfredo Cardigliano __le64 features; 148601489e5dSAlfredo Cardigliano u8 rsvd2[11]; 148701489e5dSAlfredo Cardigliano }; 148801489e5dSAlfredo Cardigliano u8 color; 148901489e5dSAlfredo Cardigliano }; 149001489e5dSAlfredo Cardigliano 149101489e5dSAlfredo Cardigliano enum ionic_rx_mode { 149201489e5dSAlfredo Cardigliano IONIC_RX_MODE_F_UNICAST = BIT(0), 149301489e5dSAlfredo Cardigliano IONIC_RX_MODE_F_MULTICAST = BIT(1), 149401489e5dSAlfredo Cardigliano IONIC_RX_MODE_F_BROADCAST = BIT(2), 149501489e5dSAlfredo Cardigliano IONIC_RX_MODE_F_PROMISC = BIT(3), 149601489e5dSAlfredo Cardigliano IONIC_RX_MODE_F_ALLMULTI = BIT(4), 149701489e5dSAlfredo Cardigliano }; 149801489e5dSAlfredo Cardigliano 149901489e5dSAlfredo Cardigliano /** 150001489e5dSAlfredo Cardigliano * struct ionic_rx_mode_set_cmd - Set LIF's Rx mode command 150101489e5dSAlfredo Cardigliano * @opcode: opcode 150201489e5dSAlfredo Cardigliano * @lif_index: LIF index 150301489e5dSAlfredo Cardigliano * @rx_mode: Rx mode flags: 150401489e5dSAlfredo Cardigliano * IONIC_RX_MODE_F_UNICAST: Accept known unicast packets. 150501489e5dSAlfredo Cardigliano * IONIC_RX_MODE_F_MULTICAST: Accept known multicast packets. 150601489e5dSAlfredo Cardigliano * IONIC_RX_MODE_F_BROADCAST: Accept broadcast packets. 150701489e5dSAlfredo Cardigliano * IONIC_RX_MODE_F_PROMISC: Accept any packets. 150801489e5dSAlfredo Cardigliano * IONIC_RX_MODE_F_ALLMULTI: Accept any multicast packets. 150901489e5dSAlfredo Cardigliano */ 151001489e5dSAlfredo Cardigliano struct ionic_rx_mode_set_cmd { 151101489e5dSAlfredo Cardigliano u8 opcode; 151201489e5dSAlfredo Cardigliano u8 rsvd; 151301489e5dSAlfredo Cardigliano __le16 lif_index; 151401489e5dSAlfredo Cardigliano __le16 rx_mode; 151501489e5dSAlfredo Cardigliano __le16 rsvd2[29]; 151601489e5dSAlfredo Cardigliano }; 151701489e5dSAlfredo Cardigliano 151801489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_rx_mode_set_comp; 151901489e5dSAlfredo Cardigliano 152001489e5dSAlfredo Cardigliano enum ionic_rx_filter_match_type { 152101489e5dSAlfredo Cardigliano IONIC_RX_FILTER_MATCH_VLAN = 0, 152201489e5dSAlfredo Cardigliano IONIC_RX_FILTER_MATCH_MAC, 152301489e5dSAlfredo Cardigliano IONIC_RX_FILTER_MATCH_MAC_VLAN, 152401489e5dSAlfredo Cardigliano }; 152501489e5dSAlfredo Cardigliano 152601489e5dSAlfredo Cardigliano /** 152701489e5dSAlfredo Cardigliano * struct ionic_rx_filter_add_cmd - Add LIF Rx filter command 152801489e5dSAlfredo Cardigliano * @opcode: opcode 152901489e5dSAlfredo Cardigliano * @qtype: Queue type 153001489e5dSAlfredo Cardigliano * @lif_index: LIF index 153101489e5dSAlfredo Cardigliano * @qid: Queue ID 153201489e5dSAlfredo Cardigliano * @match: Rx filter match type. (See IONIC_RX_FILTER_MATCH_xxx) 153301489e5dSAlfredo Cardigliano * @vlan: VLAN ID 153401489e5dSAlfredo Cardigliano * @addr: MAC address (network-byte order) 153501489e5dSAlfredo Cardigliano */ 153601489e5dSAlfredo Cardigliano struct ionic_rx_filter_add_cmd { 153701489e5dSAlfredo Cardigliano u8 opcode; 153801489e5dSAlfredo Cardigliano u8 qtype; 153901489e5dSAlfredo Cardigliano __le16 lif_index; 154001489e5dSAlfredo Cardigliano __le32 qid; 154101489e5dSAlfredo Cardigliano __le16 match; 154201489e5dSAlfredo Cardigliano union { 154301489e5dSAlfredo Cardigliano struct { 154401489e5dSAlfredo Cardigliano __le16 vlan; 154501489e5dSAlfredo Cardigliano } vlan; 154601489e5dSAlfredo Cardigliano struct { 154701489e5dSAlfredo Cardigliano u8 addr[6]; 154801489e5dSAlfredo Cardigliano } mac; 154901489e5dSAlfredo Cardigliano struct { 155001489e5dSAlfredo Cardigliano __le16 vlan; 155101489e5dSAlfredo Cardigliano u8 addr[6]; 155201489e5dSAlfredo Cardigliano } mac_vlan; 155301489e5dSAlfredo Cardigliano u8 rsvd[54]; 155401489e5dSAlfredo Cardigliano }; 155501489e5dSAlfredo Cardigliano }; 155601489e5dSAlfredo Cardigliano 155701489e5dSAlfredo Cardigliano /** 155801489e5dSAlfredo Cardigliano * struct ionic_rx_filter_add_comp - Add LIF Rx filter command completion 155901489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 156001489e5dSAlfredo Cardigliano * @comp_index: The index in the descriptor ring for which this 156101489e5dSAlfredo Cardigliano * is the completion. 156201489e5dSAlfredo Cardigliano * @filter_id: Filter ID 156301489e5dSAlfredo Cardigliano * @color: Color bit. 156401489e5dSAlfredo Cardigliano */ 156501489e5dSAlfredo Cardigliano struct ionic_rx_filter_add_comp { 156601489e5dSAlfredo Cardigliano u8 status; 156701489e5dSAlfredo Cardigliano u8 rsvd; 156801489e5dSAlfredo Cardigliano __le16 comp_index; 156901489e5dSAlfredo Cardigliano __le32 filter_id; 157001489e5dSAlfredo Cardigliano u8 rsvd2[7]; 157101489e5dSAlfredo Cardigliano u8 color; 157201489e5dSAlfredo Cardigliano }; 157301489e5dSAlfredo Cardigliano 157401489e5dSAlfredo Cardigliano /** 157501489e5dSAlfredo Cardigliano * struct ionic_rx_filter_del_cmd - Delete LIF Rx filter command 157601489e5dSAlfredo Cardigliano * @opcode: opcode 157701489e5dSAlfredo Cardigliano * @lif_index: LIF index 157801489e5dSAlfredo Cardigliano * @filter_id: Filter ID 157901489e5dSAlfredo Cardigliano */ 158001489e5dSAlfredo Cardigliano struct ionic_rx_filter_del_cmd { 158101489e5dSAlfredo Cardigliano u8 opcode; 158201489e5dSAlfredo Cardigliano u8 rsvd; 158301489e5dSAlfredo Cardigliano __le16 lif_index; 158401489e5dSAlfredo Cardigliano __le32 filter_id; 158501489e5dSAlfredo Cardigliano u8 rsvd2[56]; 158601489e5dSAlfredo Cardigliano }; 158701489e5dSAlfredo Cardigliano 158801489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_rx_filter_del_comp; 158901489e5dSAlfredo Cardigliano 159001489e5dSAlfredo Cardigliano /** 159101489e5dSAlfredo Cardigliano * struct ionic_qos_identify_cmd - QoS identify command 159201489e5dSAlfredo Cardigliano * @opcode: opcode 159301489e5dSAlfredo Cardigliano * @ver: Highest version of identify supported by driver 159401489e5dSAlfredo Cardigliano * 159501489e5dSAlfredo Cardigliano */ 159601489e5dSAlfredo Cardigliano struct ionic_qos_identify_cmd { 159701489e5dSAlfredo Cardigliano u8 opcode; 159801489e5dSAlfredo Cardigliano u8 ver; 159901489e5dSAlfredo Cardigliano u8 rsvd[62]; 160001489e5dSAlfredo Cardigliano }; 160101489e5dSAlfredo Cardigliano 160201489e5dSAlfredo Cardigliano /** 160301489e5dSAlfredo Cardigliano * struct ionic_qos_identify_comp - QoS identify command completion 160401489e5dSAlfredo Cardigliano * @status: The status of the command (enum status_code) 160501489e5dSAlfredo Cardigliano * @ver: Version of identify returned by device 160601489e5dSAlfredo Cardigliano */ 160701489e5dSAlfredo Cardigliano struct ionic_qos_identify_comp { 160801489e5dSAlfredo Cardigliano u8 status; 160901489e5dSAlfredo Cardigliano u8 ver; 161001489e5dSAlfredo Cardigliano u8 rsvd[14]; 161101489e5dSAlfredo Cardigliano }; 161201489e5dSAlfredo Cardigliano 161301489e5dSAlfredo Cardigliano #define IONIC_QOS_CLASS_MAX 7 161401489e5dSAlfredo Cardigliano #define IONIC_QOS_CLASS_NAME_SZ 32 161501489e5dSAlfredo Cardigliano #define IONIC_QOS_DSCP_MAX_VALUES 64 161601489e5dSAlfredo Cardigliano 161701489e5dSAlfredo Cardigliano /** 161801489e5dSAlfredo Cardigliano * enum ionic_qos_class 161901489e5dSAlfredo Cardigliano */ 162001489e5dSAlfredo Cardigliano enum ionic_qos_class { 162101489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_DEFAULT = 0, 162201489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_USER_DEFINED_1 = 1, 162301489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_USER_DEFINED_2 = 2, 162401489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_USER_DEFINED_3 = 3, 162501489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_USER_DEFINED_4 = 4, 162601489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_USER_DEFINED_5 = 5, 162701489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_USER_DEFINED_6 = 6, 162801489e5dSAlfredo Cardigliano }; 162901489e5dSAlfredo Cardigliano 163001489e5dSAlfredo Cardigliano /** 163101489e5dSAlfredo Cardigliano * enum ionic_qos_class_type - Traffic classification criteria 163201489e5dSAlfredo Cardigliano */ 163301489e5dSAlfredo Cardigliano enum ionic_qos_class_type { 163401489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_TYPE_NONE = 0, 163501489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_TYPE_PCP = 1, /* Dot1Q pcp */ 163601489e5dSAlfredo Cardigliano IONIC_QOS_CLASS_TYPE_DSCP = 2, /* IP dscp */ 163701489e5dSAlfredo Cardigliano }; 163801489e5dSAlfredo Cardigliano 163901489e5dSAlfredo Cardigliano /** 164001489e5dSAlfredo Cardigliano * enum ionic_qos_sched_type - Qos class scheduling type 164101489e5dSAlfredo Cardigliano */ 164201489e5dSAlfredo Cardigliano enum ionic_qos_sched_type { 164301489e5dSAlfredo Cardigliano /* Strict priority */ 164401489e5dSAlfredo Cardigliano IONIC_QOS_SCHED_TYPE_STRICT = 0, 164501489e5dSAlfredo Cardigliano /* Deficit weighted round-robin */ 164601489e5dSAlfredo Cardigliano IONIC_QOS_SCHED_TYPE_DWRR = 1, 164701489e5dSAlfredo Cardigliano }; 164801489e5dSAlfredo Cardigliano 164901489e5dSAlfredo Cardigliano /** 165001489e5dSAlfredo Cardigliano * union ionic_qos_config - Qos configuration structure 165101489e5dSAlfredo Cardigliano * @flags: Configuration flags 165201489e5dSAlfredo Cardigliano * IONIC_QOS_CONFIG_F_ENABLE enable 165301489e5dSAlfredo Cardigliano * IONIC_QOS_CONFIG_F_DROP drop/nodrop 165401489e5dSAlfredo Cardigliano * IONIC_QOS_CONFIG_F_RW_DOT1Q_PCP enable dot1q pcp rewrite 165501489e5dSAlfredo Cardigliano * IONIC_QOS_CONFIG_F_RW_IP_DSCP enable ip dscp rewrite 165601489e5dSAlfredo Cardigliano * @sched_type: Qos class scheduling type (enum ionic_qos_sched_type) 165701489e5dSAlfredo Cardigliano * @class_type: Qos class type (enum ionic_qos_class_type) 165801489e5dSAlfredo Cardigliano * @pause_type: Qos pause type (enum qos_pause_type) 165901489e5dSAlfredo Cardigliano * @name: Qos class name 166001489e5dSAlfredo Cardigliano * @mtu: MTU of the class 166101489e5dSAlfredo Cardigliano * @pfc_dot1q_pcp: Pcp value for pause frames (valid iff F_NODROP) 166201489e5dSAlfredo Cardigliano * @dwrr_weight: Qos class scheduling weight 166301489e5dSAlfredo Cardigliano * @strict_rlmt: Rate limit for strict priority scheduling 166401489e5dSAlfredo Cardigliano * @rw_dot1q_pcp: Rewrite dot1q pcp to this value 166501489e5dSAlfredo Cardigliano * (valid iff F_RW_DOT1Q_PCP) 166601489e5dSAlfredo Cardigliano * @rw_ip_dscp: Rewrite ip dscp to this value 166701489e5dSAlfredo Cardigliano * (valid iff F_RW_IP_DSCP) 166801489e5dSAlfredo Cardigliano * @dot1q_pcp: Dot1q pcp value 166901489e5dSAlfredo Cardigliano * @ndscp: Number of valid dscp values in the ip_dscp field 167001489e5dSAlfredo Cardigliano * @ip_dscp: IP dscp values 167101489e5dSAlfredo Cardigliano */ 167201489e5dSAlfredo Cardigliano union ionic_qos_config { 167301489e5dSAlfredo Cardigliano struct { 167401489e5dSAlfredo Cardigliano #define IONIC_QOS_CONFIG_F_ENABLE BIT(0) 167501489e5dSAlfredo Cardigliano #define IONIC_QOS_CONFIG_F_DROP BIT(1) 167601489e5dSAlfredo Cardigliano #define IONIC_QOS_CONFIG_F_RW_DOT1Q_PCP BIT(2) 167701489e5dSAlfredo Cardigliano #define IONIC_QOS_CONFIG_F_RW_IP_DSCP BIT(3) 167801489e5dSAlfredo Cardigliano u8 flags; 167901489e5dSAlfredo Cardigliano u8 sched_type; 168001489e5dSAlfredo Cardigliano u8 class_type; 168101489e5dSAlfredo Cardigliano u8 pause_type; 168201489e5dSAlfredo Cardigliano char name[IONIC_QOS_CLASS_NAME_SZ]; 168301489e5dSAlfredo Cardigliano __le32 mtu; 168401489e5dSAlfredo Cardigliano /* flow control */ 168501489e5dSAlfredo Cardigliano u8 pfc_cos; 168601489e5dSAlfredo Cardigliano /* scheduler */ 168701489e5dSAlfredo Cardigliano union { 168801489e5dSAlfredo Cardigliano u8 dwrr_weight; 168901489e5dSAlfredo Cardigliano __le64 strict_rlmt; 169001489e5dSAlfredo Cardigliano }; 169101489e5dSAlfredo Cardigliano /* marking */ 169201489e5dSAlfredo Cardigliano union { 169301489e5dSAlfredo Cardigliano u8 rw_dot1q_pcp; 169401489e5dSAlfredo Cardigliano u8 rw_ip_dscp; 169501489e5dSAlfredo Cardigliano }; 169601489e5dSAlfredo Cardigliano /* classification */ 169701489e5dSAlfredo Cardigliano union { 169801489e5dSAlfredo Cardigliano u8 dot1q_pcp; 169901489e5dSAlfredo Cardigliano struct { 170001489e5dSAlfredo Cardigliano u8 ndscp; 170101489e5dSAlfredo Cardigliano u8 ip_dscp[IONIC_QOS_DSCP_MAX_VALUES]; 170201489e5dSAlfredo Cardigliano }; 170301489e5dSAlfredo Cardigliano }; 170401489e5dSAlfredo Cardigliano }; 170501489e5dSAlfredo Cardigliano __le32 words[64]; 170601489e5dSAlfredo Cardigliano }; 170701489e5dSAlfredo Cardigliano 170801489e5dSAlfredo Cardigliano /** 170901489e5dSAlfredo Cardigliano * union ionic_qos_identity - QoS identity structure 171001489e5dSAlfredo Cardigliano * @version: Version of the identify structure 171101489e5dSAlfredo Cardigliano * @type: QoS system type 171201489e5dSAlfredo Cardigliano * @nclasses: Number of usable QoS classes 171301489e5dSAlfredo Cardigliano * @config: Current configuration of classes 171401489e5dSAlfredo Cardigliano */ 171501489e5dSAlfredo Cardigliano union ionic_qos_identity { 171601489e5dSAlfredo Cardigliano struct { 171701489e5dSAlfredo Cardigliano u8 version; 171801489e5dSAlfredo Cardigliano u8 type; 171901489e5dSAlfredo Cardigliano u8 rsvd[62]; 172001489e5dSAlfredo Cardigliano union ionic_qos_config config[IONIC_QOS_CLASS_MAX]; 172101489e5dSAlfredo Cardigliano }; 172201489e5dSAlfredo Cardigliano __le32 words[512]; 172301489e5dSAlfredo Cardigliano }; 172401489e5dSAlfredo Cardigliano 172501489e5dSAlfredo Cardigliano /** 172601489e5dSAlfredo Cardigliano * struct qos_init_cmd - QoS config init command 172701489e5dSAlfredo Cardigliano * @opcode: Opcode 172801489e5dSAlfredo Cardigliano * @group: Qos class id 172901489e5dSAlfredo Cardigliano * @info_pa: destination address for qos info 173001489e5dSAlfredo Cardigliano */ 173101489e5dSAlfredo Cardigliano struct ionic_qos_init_cmd { 173201489e5dSAlfredo Cardigliano u8 opcode; 173301489e5dSAlfredo Cardigliano u8 group; 173401489e5dSAlfredo Cardigliano u8 rsvd[6]; 173501489e5dSAlfredo Cardigliano __le64 info_pa; 173601489e5dSAlfredo Cardigliano u8 rsvd1[48]; 173701489e5dSAlfredo Cardigliano }; 173801489e5dSAlfredo Cardigliano 173901489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_qos_init_comp; 174001489e5dSAlfredo Cardigliano 174101489e5dSAlfredo Cardigliano /** 174201489e5dSAlfredo Cardigliano * struct ionic_qos_reset_cmd - Qos config reset command 174301489e5dSAlfredo Cardigliano * @opcode: Opcode 174401489e5dSAlfredo Cardigliano */ 174501489e5dSAlfredo Cardigliano struct ionic_qos_reset_cmd { 174601489e5dSAlfredo Cardigliano u8 opcode; 174701489e5dSAlfredo Cardigliano u8 group; 174801489e5dSAlfredo Cardigliano u8 rsvd[62]; 174901489e5dSAlfredo Cardigliano }; 175001489e5dSAlfredo Cardigliano 175101489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_qos_reset_comp; 175201489e5dSAlfredo Cardigliano 175301489e5dSAlfredo Cardigliano /** 175401489e5dSAlfredo Cardigliano * struct ionic_fw_download_cmd - Firmware download command 175501489e5dSAlfredo Cardigliano * @opcode: opcode 175601489e5dSAlfredo Cardigliano * @addr: dma address of the firmware buffer 175701489e5dSAlfredo Cardigliano * @offset: offset of the firmware buffer within the full image 175801489e5dSAlfredo Cardigliano * @length: number of valid bytes in the firmware buffer 175901489e5dSAlfredo Cardigliano */ 176001489e5dSAlfredo Cardigliano struct ionic_fw_download_cmd { 176101489e5dSAlfredo Cardigliano u8 opcode; 176201489e5dSAlfredo Cardigliano u8 rsvd[3]; 176301489e5dSAlfredo Cardigliano __le32 offset; 176401489e5dSAlfredo Cardigliano __le64 addr; 176501489e5dSAlfredo Cardigliano __le32 length; 176601489e5dSAlfredo Cardigliano }; 176701489e5dSAlfredo Cardigliano 176801489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_fw_download_comp; 176901489e5dSAlfredo Cardigliano 177001489e5dSAlfredo Cardigliano enum ionic_fw_control_oper { 177101489e5dSAlfredo Cardigliano IONIC_FW_RESET = 0, /* Reset firmware */ 177201489e5dSAlfredo Cardigliano IONIC_FW_INSTALL = 1, /* Install firmware */ 177301489e5dSAlfredo Cardigliano IONIC_FW_ACTIVATE = 2, /* Activate firmware */ 177401489e5dSAlfredo Cardigliano }; 177501489e5dSAlfredo Cardigliano 177601489e5dSAlfredo Cardigliano /** 177701489e5dSAlfredo Cardigliano * struct ionic_fw_control_cmd - Firmware control command 177801489e5dSAlfredo Cardigliano * @opcode: opcode 177901489e5dSAlfredo Cardigliano * @oper: firmware control operation (enum ionic_fw_control_oper) 178001489e5dSAlfredo Cardigliano * @slot: slot to activate 178101489e5dSAlfredo Cardigliano */ 178201489e5dSAlfredo Cardigliano struct ionic_fw_control_cmd { 178301489e5dSAlfredo Cardigliano u8 opcode; 178401489e5dSAlfredo Cardigliano u8 rsvd[3]; 178501489e5dSAlfredo Cardigliano u8 oper; 178601489e5dSAlfredo Cardigliano u8 slot; 178701489e5dSAlfredo Cardigliano u8 rsvd1[58]; 178801489e5dSAlfredo Cardigliano }; 178901489e5dSAlfredo Cardigliano 179001489e5dSAlfredo Cardigliano /** 179101489e5dSAlfredo Cardigliano * struct ionic_fw_control_comp - Firmware control copletion 179201489e5dSAlfredo Cardigliano * @opcode: opcode 179301489e5dSAlfredo Cardigliano * @slot: slot where the firmware was installed 179401489e5dSAlfredo Cardigliano */ 179501489e5dSAlfredo Cardigliano struct ionic_fw_control_comp { 179601489e5dSAlfredo Cardigliano u8 status; 179701489e5dSAlfredo Cardigliano u8 rsvd; 179801489e5dSAlfredo Cardigliano __le16 comp_index; 179901489e5dSAlfredo Cardigliano u8 slot; 180001489e5dSAlfredo Cardigliano u8 rsvd1[10]; 180101489e5dSAlfredo Cardigliano u8 color; 180201489e5dSAlfredo Cardigliano }; 180301489e5dSAlfredo Cardigliano 180401489e5dSAlfredo Cardigliano /****************************************************************** 180501489e5dSAlfredo Cardigliano ******************* RDMA Commands ******************************** 180601489e5dSAlfredo Cardigliano ******************************************************************/ 180701489e5dSAlfredo Cardigliano 180801489e5dSAlfredo Cardigliano /** 180901489e5dSAlfredo Cardigliano * struct ionic_rdma_reset_cmd - Reset RDMA LIF cmd 181001489e5dSAlfredo Cardigliano * @opcode: opcode 181101489e5dSAlfredo Cardigliano * @lif_index: lif index 181201489e5dSAlfredo Cardigliano * 181301489e5dSAlfredo Cardigliano * There is no rdma specific dev command completion struct. Completion uses 181401489e5dSAlfredo Cardigliano * the common struct ionic_admin_comp. Only the status is indicated. 181501489e5dSAlfredo Cardigliano * Nonzero status means the LIF does not support rdma. 181601489e5dSAlfredo Cardigliano **/ 181701489e5dSAlfredo Cardigliano struct ionic_rdma_reset_cmd { 181801489e5dSAlfredo Cardigliano u8 opcode; 181901489e5dSAlfredo Cardigliano u8 rsvd; 182001489e5dSAlfredo Cardigliano __le16 lif_index; 182101489e5dSAlfredo Cardigliano u8 rsvd2[60]; 182201489e5dSAlfredo Cardigliano }; 182301489e5dSAlfredo Cardigliano 182401489e5dSAlfredo Cardigliano /** 182501489e5dSAlfredo Cardigliano * struct ionic_rdma_queue_cmd - Create RDMA Queue command 182601489e5dSAlfredo Cardigliano * @opcode: opcode, 52, 53 182701489e5dSAlfredo Cardigliano * @lif_index lif index 182801489e5dSAlfredo Cardigliano * @qid_ver: (qid | (rdma version << 24)) 182901489e5dSAlfredo Cardigliano * @cid: intr, eq_id, or cq_id 183001489e5dSAlfredo Cardigliano * @dbid: doorbell page id 183101489e5dSAlfredo Cardigliano * @depth_log2: log base two of queue depth 183201489e5dSAlfredo Cardigliano * @stride_log2: log base two of queue stride 183301489e5dSAlfredo Cardigliano * @dma_addr: address of the queue memory 183401489e5dSAlfredo Cardigliano * @xxx_table_index: temporary, but should not need pgtbl for contig. queues. 183501489e5dSAlfredo Cardigliano * 183601489e5dSAlfredo Cardigliano * The same command struct is used to create an rdma event queue, completion 183701489e5dSAlfredo Cardigliano * queue, or rdma admin queue. The cid is an interrupt number for an event 183801489e5dSAlfredo Cardigliano * queue, an event queue id for a completion queue, or a completion queue id 183901489e5dSAlfredo Cardigliano * for an rdma admin queue. 184001489e5dSAlfredo Cardigliano * 184101489e5dSAlfredo Cardigliano * The queue created via a dev command must be contiguous in dma space. 184201489e5dSAlfredo Cardigliano * 184301489e5dSAlfredo Cardigliano * The dev commands are intended only to be used during driver initialization, 184401489e5dSAlfredo Cardigliano * to create queues supporting the rdma admin queue. Other queues, and other 184501489e5dSAlfredo Cardigliano * types of rdma resources like memory regions, will be created and registered 184601489e5dSAlfredo Cardigliano * via the rdma admin queue, and will support a more complete interface 184701489e5dSAlfredo Cardigliano * providing scatter gather lists for larger, scattered queue buffers and 184801489e5dSAlfredo Cardigliano * memory registration. 184901489e5dSAlfredo Cardigliano * 185001489e5dSAlfredo Cardigliano * There is no rdma specific dev command completion struct. Completion uses 185101489e5dSAlfredo Cardigliano * the common struct ionic_admin_comp. Only the status is indicated. 185201489e5dSAlfredo Cardigliano **/ 185301489e5dSAlfredo Cardigliano struct ionic_rdma_queue_cmd { 185401489e5dSAlfredo Cardigliano u8 opcode; 185501489e5dSAlfredo Cardigliano u8 rsvd; 185601489e5dSAlfredo Cardigliano __le16 lif_index; 185701489e5dSAlfredo Cardigliano __le32 qid_ver; 185801489e5dSAlfredo Cardigliano __le32 cid; 185901489e5dSAlfredo Cardigliano __le16 dbid; 186001489e5dSAlfredo Cardigliano u8 depth_log2; 186101489e5dSAlfredo Cardigliano u8 stride_log2; 186201489e5dSAlfredo Cardigliano __le64 dma_addr; 186301489e5dSAlfredo Cardigliano u8 rsvd2[36]; 186401489e5dSAlfredo Cardigliano __le32 xxx_table_index; 186501489e5dSAlfredo Cardigliano }; 186601489e5dSAlfredo Cardigliano 186701489e5dSAlfredo Cardigliano /****************************************************************** 186801489e5dSAlfredo Cardigliano ******************* Notify Events ******************************** 186901489e5dSAlfredo Cardigliano ******************************************************************/ 187001489e5dSAlfredo Cardigliano 187101489e5dSAlfredo Cardigliano /** 187201489e5dSAlfredo Cardigliano * struct ionic_notifyq_event 187301489e5dSAlfredo Cardigliano * @eid: event number 187401489e5dSAlfredo Cardigliano * @ecode: event code 187501489e5dSAlfredo Cardigliano * @data: unspecified data about the event 187601489e5dSAlfredo Cardigliano * 187701489e5dSAlfredo Cardigliano * This is the generic event report struct from which the other 187801489e5dSAlfredo Cardigliano * actual events will be formed. 187901489e5dSAlfredo Cardigliano */ 188001489e5dSAlfredo Cardigliano struct ionic_notifyq_event { 188101489e5dSAlfredo Cardigliano __le64 eid; 188201489e5dSAlfredo Cardigliano __le16 ecode; 188301489e5dSAlfredo Cardigliano u8 data[54]; 188401489e5dSAlfredo Cardigliano }; 188501489e5dSAlfredo Cardigliano 188601489e5dSAlfredo Cardigliano /** 188701489e5dSAlfredo Cardigliano * struct ionic_link_change_event 188801489e5dSAlfredo Cardigliano * @eid: event number 188901489e5dSAlfredo Cardigliano * @ecode: event code = EVENT_OPCODE_LINK_CHANGE 189001489e5dSAlfredo Cardigliano * @link_status: link up or down, with error bits (enum port_status) 189101489e5dSAlfredo Cardigliano * @link_speed: speed of the network link 189201489e5dSAlfredo Cardigliano * 189301489e5dSAlfredo Cardigliano * Sent when the network link state changes between UP and DOWN 189401489e5dSAlfredo Cardigliano */ 189501489e5dSAlfredo Cardigliano struct ionic_link_change_event { 189601489e5dSAlfredo Cardigliano __le64 eid; 189701489e5dSAlfredo Cardigliano __le16 ecode; 189801489e5dSAlfredo Cardigliano __le16 link_status; 189901489e5dSAlfredo Cardigliano __le32 link_speed; /* units of 1Mbps: e.g. 10000 = 10Gbps */ 190001489e5dSAlfredo Cardigliano u8 rsvd[48]; 190101489e5dSAlfredo Cardigliano }; 190201489e5dSAlfredo Cardigliano 190301489e5dSAlfredo Cardigliano /** 190401489e5dSAlfredo Cardigliano * struct ionic_reset_event 190501489e5dSAlfredo Cardigliano * @eid: event number 190601489e5dSAlfredo Cardigliano * @ecode: event code = EVENT_OPCODE_RESET 190701489e5dSAlfredo Cardigliano * @reset_code: reset type 190801489e5dSAlfredo Cardigliano * @state: 0=pending, 1=complete, 2=error 190901489e5dSAlfredo Cardigliano * 191001489e5dSAlfredo Cardigliano * Sent when the NIC or some subsystem is going to be or 191101489e5dSAlfredo Cardigliano * has been reset. 191201489e5dSAlfredo Cardigliano */ 191301489e5dSAlfredo Cardigliano struct ionic_reset_event { 191401489e5dSAlfredo Cardigliano __le64 eid; 191501489e5dSAlfredo Cardigliano __le16 ecode; 191601489e5dSAlfredo Cardigliano u8 reset_code; 191701489e5dSAlfredo Cardigliano u8 state; 191801489e5dSAlfredo Cardigliano u8 rsvd[52]; 191901489e5dSAlfredo Cardigliano }; 192001489e5dSAlfredo Cardigliano 192101489e5dSAlfredo Cardigliano /** 192201489e5dSAlfredo Cardigliano * struct ionic_heartbeat_event 192301489e5dSAlfredo Cardigliano * @eid: event number 192401489e5dSAlfredo Cardigliano * @ecode: event code = EVENT_OPCODE_HEARTBEAT 192501489e5dSAlfredo Cardigliano * 192601489e5dSAlfredo Cardigliano * Sent periodically by the NIC to indicate continued health 192701489e5dSAlfredo Cardigliano */ 192801489e5dSAlfredo Cardigliano struct ionic_heartbeat_event { 192901489e5dSAlfredo Cardigliano __le64 eid; 193001489e5dSAlfredo Cardigliano __le16 ecode; 193101489e5dSAlfredo Cardigliano u8 rsvd[54]; 193201489e5dSAlfredo Cardigliano }; 193301489e5dSAlfredo Cardigliano 193401489e5dSAlfredo Cardigliano /** 193501489e5dSAlfredo Cardigliano * struct ionic_log_event 193601489e5dSAlfredo Cardigliano * @eid: event number 193701489e5dSAlfredo Cardigliano * @ecode: event code = EVENT_OPCODE_LOG 193801489e5dSAlfredo Cardigliano * @data: log data 193901489e5dSAlfredo Cardigliano * 194001489e5dSAlfredo Cardigliano * Sent to notify the driver of an internal error. 194101489e5dSAlfredo Cardigliano */ 194201489e5dSAlfredo Cardigliano struct ionic_log_event { 194301489e5dSAlfredo Cardigliano __le64 eid; 194401489e5dSAlfredo Cardigliano __le16 ecode; 194501489e5dSAlfredo Cardigliano u8 data[54]; 194601489e5dSAlfredo Cardigliano }; 194701489e5dSAlfredo Cardigliano 194801489e5dSAlfredo Cardigliano /** 194901489e5dSAlfredo Cardigliano * struct ionic_port_stats 195001489e5dSAlfredo Cardigliano */ 195101489e5dSAlfredo Cardigliano struct ionic_port_stats { 195201489e5dSAlfredo Cardigliano __le64 frames_rx_ok; 195301489e5dSAlfredo Cardigliano __le64 frames_rx_all; 195401489e5dSAlfredo Cardigliano __le64 frames_rx_bad_fcs; 195501489e5dSAlfredo Cardigliano __le64 frames_rx_bad_all; 195601489e5dSAlfredo Cardigliano __le64 octets_rx_ok; 195701489e5dSAlfredo Cardigliano __le64 octets_rx_all; 195801489e5dSAlfredo Cardigliano __le64 frames_rx_unicast; 195901489e5dSAlfredo Cardigliano __le64 frames_rx_multicast; 196001489e5dSAlfredo Cardigliano __le64 frames_rx_broadcast; 196101489e5dSAlfredo Cardigliano __le64 frames_rx_pause; 196201489e5dSAlfredo Cardigliano __le64 frames_rx_bad_length; 196301489e5dSAlfredo Cardigliano __le64 frames_rx_undersized; 196401489e5dSAlfredo Cardigliano __le64 frames_rx_oversized; 196501489e5dSAlfredo Cardigliano __le64 frames_rx_fragments; 196601489e5dSAlfredo Cardigliano __le64 frames_rx_jabber; 196701489e5dSAlfredo Cardigliano __le64 frames_rx_pripause; 196801489e5dSAlfredo Cardigliano __le64 frames_rx_stomped_crc; 196901489e5dSAlfredo Cardigliano __le64 frames_rx_too_long; 197001489e5dSAlfredo Cardigliano __le64 frames_rx_vlan_good; 197101489e5dSAlfredo Cardigliano __le64 frames_rx_dropped; 197201489e5dSAlfredo Cardigliano __le64 frames_rx_less_than_64b; 197301489e5dSAlfredo Cardigliano __le64 frames_rx_64b; 197401489e5dSAlfredo Cardigliano __le64 frames_rx_65b_127b; 197501489e5dSAlfredo Cardigliano __le64 frames_rx_128b_255b; 197601489e5dSAlfredo Cardigliano __le64 frames_rx_256b_511b; 197701489e5dSAlfredo Cardigliano __le64 frames_rx_512b_1023b; 197801489e5dSAlfredo Cardigliano __le64 frames_rx_1024b_1518b; 197901489e5dSAlfredo Cardigliano __le64 frames_rx_1519b_2047b; 198001489e5dSAlfredo Cardigliano __le64 frames_rx_2048b_4095b; 198101489e5dSAlfredo Cardigliano __le64 frames_rx_4096b_8191b; 198201489e5dSAlfredo Cardigliano __le64 frames_rx_8192b_9215b; 198301489e5dSAlfredo Cardigliano __le64 frames_rx_other; 198401489e5dSAlfredo Cardigliano __le64 frames_tx_ok; 198501489e5dSAlfredo Cardigliano __le64 frames_tx_all; 198601489e5dSAlfredo Cardigliano __le64 frames_tx_bad; 198701489e5dSAlfredo Cardigliano __le64 octets_tx_ok; 198801489e5dSAlfredo Cardigliano __le64 octets_tx_total; 198901489e5dSAlfredo Cardigliano __le64 frames_tx_unicast; 199001489e5dSAlfredo Cardigliano __le64 frames_tx_multicast; 199101489e5dSAlfredo Cardigliano __le64 frames_tx_broadcast; 199201489e5dSAlfredo Cardigliano __le64 frames_tx_pause; 199301489e5dSAlfredo Cardigliano __le64 frames_tx_pripause; 199401489e5dSAlfredo Cardigliano __le64 frames_tx_vlan; 199501489e5dSAlfredo Cardigliano __le64 frames_tx_less_than_64b; 199601489e5dSAlfredo Cardigliano __le64 frames_tx_64b; 199701489e5dSAlfredo Cardigliano __le64 frames_tx_65b_127b; 199801489e5dSAlfredo Cardigliano __le64 frames_tx_128b_255b; 199901489e5dSAlfredo Cardigliano __le64 frames_tx_256b_511b; 200001489e5dSAlfredo Cardigliano __le64 frames_tx_512b_1023b; 200101489e5dSAlfredo Cardigliano __le64 frames_tx_1024b_1518b; 200201489e5dSAlfredo Cardigliano __le64 frames_tx_1519b_2047b; 200301489e5dSAlfredo Cardigliano __le64 frames_tx_2048b_4095b; 200401489e5dSAlfredo Cardigliano __le64 frames_tx_4096b_8191b; 200501489e5dSAlfredo Cardigliano __le64 frames_tx_8192b_9215b; 200601489e5dSAlfredo Cardigliano __le64 frames_tx_other; 200701489e5dSAlfredo Cardigliano __le64 frames_tx_pri_0; 200801489e5dSAlfredo Cardigliano __le64 frames_tx_pri_1; 200901489e5dSAlfredo Cardigliano __le64 frames_tx_pri_2; 201001489e5dSAlfredo Cardigliano __le64 frames_tx_pri_3; 201101489e5dSAlfredo Cardigliano __le64 frames_tx_pri_4; 201201489e5dSAlfredo Cardigliano __le64 frames_tx_pri_5; 201301489e5dSAlfredo Cardigliano __le64 frames_tx_pri_6; 201401489e5dSAlfredo Cardigliano __le64 frames_tx_pri_7; 201501489e5dSAlfredo Cardigliano __le64 frames_rx_pri_0; 201601489e5dSAlfredo Cardigliano __le64 frames_rx_pri_1; 201701489e5dSAlfredo Cardigliano __le64 frames_rx_pri_2; 201801489e5dSAlfredo Cardigliano __le64 frames_rx_pri_3; 201901489e5dSAlfredo Cardigliano __le64 frames_rx_pri_4; 202001489e5dSAlfredo Cardigliano __le64 frames_rx_pri_5; 202101489e5dSAlfredo Cardigliano __le64 frames_rx_pri_6; 202201489e5dSAlfredo Cardigliano __le64 frames_rx_pri_7; 202301489e5dSAlfredo Cardigliano __le64 tx_pripause_0_1us_count; 202401489e5dSAlfredo Cardigliano __le64 tx_pripause_1_1us_count; 202501489e5dSAlfredo Cardigliano __le64 tx_pripause_2_1us_count; 202601489e5dSAlfredo Cardigliano __le64 tx_pripause_3_1us_count; 202701489e5dSAlfredo Cardigliano __le64 tx_pripause_4_1us_count; 202801489e5dSAlfredo Cardigliano __le64 tx_pripause_5_1us_count; 202901489e5dSAlfredo Cardigliano __le64 tx_pripause_6_1us_count; 203001489e5dSAlfredo Cardigliano __le64 tx_pripause_7_1us_count; 203101489e5dSAlfredo Cardigliano __le64 rx_pripause_0_1us_count; 203201489e5dSAlfredo Cardigliano __le64 rx_pripause_1_1us_count; 203301489e5dSAlfredo Cardigliano __le64 rx_pripause_2_1us_count; 203401489e5dSAlfredo Cardigliano __le64 rx_pripause_3_1us_count; 203501489e5dSAlfredo Cardigliano __le64 rx_pripause_4_1us_count; 203601489e5dSAlfredo Cardigliano __le64 rx_pripause_5_1us_count; 203701489e5dSAlfredo Cardigliano __le64 rx_pripause_6_1us_count; 203801489e5dSAlfredo Cardigliano __le64 rx_pripause_7_1us_count; 203901489e5dSAlfredo Cardigliano __le64 rx_pause_1us_count; 204001489e5dSAlfredo Cardigliano __le64 frames_tx_truncated; 204101489e5dSAlfredo Cardigliano }; 204201489e5dSAlfredo Cardigliano 204301489e5dSAlfredo Cardigliano struct ionic_mgmt_port_stats { 204401489e5dSAlfredo Cardigliano __le64 frames_rx_ok; 204501489e5dSAlfredo Cardigliano __le64 frames_rx_all; 204601489e5dSAlfredo Cardigliano __le64 frames_rx_bad_fcs; 204701489e5dSAlfredo Cardigliano __le64 frames_rx_bad_all; 204801489e5dSAlfredo Cardigliano __le64 octets_rx_ok; 204901489e5dSAlfredo Cardigliano __le64 octets_rx_all; 205001489e5dSAlfredo Cardigliano __le64 frames_rx_unicast; 205101489e5dSAlfredo Cardigliano __le64 frames_rx_multicast; 205201489e5dSAlfredo Cardigliano __le64 frames_rx_broadcast; 205301489e5dSAlfredo Cardigliano __le64 frames_rx_pause; 205401489e5dSAlfredo Cardigliano __le64 frames_rx_bad_length0; 205501489e5dSAlfredo Cardigliano __le64 frames_rx_undersized1; 205601489e5dSAlfredo Cardigliano __le64 frames_rx_oversized2; 205701489e5dSAlfredo Cardigliano __le64 frames_rx_fragments3; 205801489e5dSAlfredo Cardigliano __le64 frames_rx_jabber4; 205901489e5dSAlfredo Cardigliano __le64 frames_rx_64b5; 206001489e5dSAlfredo Cardigliano __le64 frames_rx_65b_127b6; 206101489e5dSAlfredo Cardigliano __le64 frames_rx_128b_255b7; 206201489e5dSAlfredo Cardigliano __le64 frames_rx_256b_511b8; 206301489e5dSAlfredo Cardigliano __le64 frames_rx_512b_1023b9; 206401489e5dSAlfredo Cardigliano __le64 frames_rx_1024b_1518b0; 206501489e5dSAlfredo Cardigliano __le64 frames_rx_gt_1518b1; 206601489e5dSAlfredo Cardigliano __le64 frames_rx_fifo_full2; 206701489e5dSAlfredo Cardigliano __le64 frames_tx_ok3; 206801489e5dSAlfredo Cardigliano __le64 frames_tx_all4; 206901489e5dSAlfredo Cardigliano __le64 frames_tx_bad5; 207001489e5dSAlfredo Cardigliano __le64 octets_tx_ok6; 207101489e5dSAlfredo Cardigliano __le64 octets_tx_total7; 207201489e5dSAlfredo Cardigliano __le64 frames_tx_unicast8; 207301489e5dSAlfredo Cardigliano __le64 frames_tx_multicast9; 207401489e5dSAlfredo Cardigliano __le64 frames_tx_broadcast0; 207501489e5dSAlfredo Cardigliano __le64 frames_tx_pause1; 207601489e5dSAlfredo Cardigliano }; 207701489e5dSAlfredo Cardigliano 207801489e5dSAlfredo Cardigliano /** 207901489e5dSAlfredo Cardigliano * struct ionic_port_identity - port identity structure 208001489e5dSAlfredo Cardigliano * @version: identity structure version 208101489e5dSAlfredo Cardigliano * @type: type of port (enum port_type) 208201489e5dSAlfredo Cardigliano * @num_lanes: number of lanes for the port 208301489e5dSAlfredo Cardigliano * @autoneg: autoneg supported 208401489e5dSAlfredo Cardigliano * @min_frame_size: minimum frame size supported 208501489e5dSAlfredo Cardigliano * @max_frame_size: maximum frame size supported 208601489e5dSAlfredo Cardigliano * @fec_type: supported fec types 208701489e5dSAlfredo Cardigliano * @pause_type: supported pause types 208801489e5dSAlfredo Cardigliano * @loopback_mode: supported loopback mode 208901489e5dSAlfredo Cardigliano * @speeds: supported speeds 209001489e5dSAlfredo Cardigliano * @config: current port configuration 209101489e5dSAlfredo Cardigliano */ 209201489e5dSAlfredo Cardigliano union ionic_port_identity { 209301489e5dSAlfredo Cardigliano struct { 209401489e5dSAlfredo Cardigliano u8 version; 209501489e5dSAlfredo Cardigliano u8 type; 209601489e5dSAlfredo Cardigliano u8 num_lanes; 209701489e5dSAlfredo Cardigliano u8 autoneg; 209801489e5dSAlfredo Cardigliano __le32 min_frame_size; 209901489e5dSAlfredo Cardigliano __le32 max_frame_size; 210001489e5dSAlfredo Cardigliano u8 fec_type[4]; 210101489e5dSAlfredo Cardigliano u8 pause_type[2]; 210201489e5dSAlfredo Cardigliano u8 loopback_mode[2]; 210301489e5dSAlfredo Cardigliano __le32 speeds[16]; 210401489e5dSAlfredo Cardigliano u8 rsvd2[44]; 210501489e5dSAlfredo Cardigliano union ionic_port_config config; 210601489e5dSAlfredo Cardigliano }; 210701489e5dSAlfredo Cardigliano __le32 words[512]; 210801489e5dSAlfredo Cardigliano }; 210901489e5dSAlfredo Cardigliano 211001489e5dSAlfredo Cardigliano /** 211101489e5dSAlfredo Cardigliano * struct ionic_port_info - port info structure 211201489e5dSAlfredo Cardigliano * @port_status: port status 211301489e5dSAlfredo Cardigliano * @port_stats: port stats 211401489e5dSAlfredo Cardigliano */ 211501489e5dSAlfredo Cardigliano struct ionic_port_info { 211601489e5dSAlfredo Cardigliano union ionic_port_config config; 211701489e5dSAlfredo Cardigliano struct ionic_port_status status; 211801489e5dSAlfredo Cardigliano struct ionic_port_stats stats; 211901489e5dSAlfredo Cardigliano }; 212001489e5dSAlfredo Cardigliano 212101489e5dSAlfredo Cardigliano /** 212201489e5dSAlfredo Cardigliano * struct ionic_lif_stats 212301489e5dSAlfredo Cardigliano */ 212401489e5dSAlfredo Cardigliano struct ionic_lif_stats { 212501489e5dSAlfredo Cardigliano /* RX */ 212601489e5dSAlfredo Cardigliano __le64 rx_ucast_bytes; 212701489e5dSAlfredo Cardigliano __le64 rx_ucast_packets; 212801489e5dSAlfredo Cardigliano __le64 rx_mcast_bytes; 212901489e5dSAlfredo Cardigliano __le64 rx_mcast_packets; 213001489e5dSAlfredo Cardigliano __le64 rx_bcast_bytes; 213101489e5dSAlfredo Cardigliano __le64 rx_bcast_packets; 213201489e5dSAlfredo Cardigliano __le64 rsvd0; 213301489e5dSAlfredo Cardigliano __le64 rsvd1; 213401489e5dSAlfredo Cardigliano /* RX drops */ 213501489e5dSAlfredo Cardigliano __le64 rx_ucast_drop_bytes; 213601489e5dSAlfredo Cardigliano __le64 rx_ucast_drop_packets; 213701489e5dSAlfredo Cardigliano __le64 rx_mcast_drop_bytes; 213801489e5dSAlfredo Cardigliano __le64 rx_mcast_drop_packets; 213901489e5dSAlfredo Cardigliano __le64 rx_bcast_drop_bytes; 214001489e5dSAlfredo Cardigliano __le64 rx_bcast_drop_packets; 214101489e5dSAlfredo Cardigliano __le64 rx_dma_error; 214201489e5dSAlfredo Cardigliano __le64 rsvd2; 214301489e5dSAlfredo Cardigliano /* TX */ 214401489e5dSAlfredo Cardigliano __le64 tx_ucast_bytes; 214501489e5dSAlfredo Cardigliano __le64 tx_ucast_packets; 214601489e5dSAlfredo Cardigliano __le64 tx_mcast_bytes; 214701489e5dSAlfredo Cardigliano __le64 tx_mcast_packets; 214801489e5dSAlfredo Cardigliano __le64 tx_bcast_bytes; 214901489e5dSAlfredo Cardigliano __le64 tx_bcast_packets; 215001489e5dSAlfredo Cardigliano __le64 rsvd3; 215101489e5dSAlfredo Cardigliano __le64 rsvd4; 215201489e5dSAlfredo Cardigliano /* TX drops */ 215301489e5dSAlfredo Cardigliano __le64 tx_ucast_drop_bytes; 215401489e5dSAlfredo Cardigliano __le64 tx_ucast_drop_packets; 215501489e5dSAlfredo Cardigliano __le64 tx_mcast_drop_bytes; 215601489e5dSAlfredo Cardigliano __le64 tx_mcast_drop_packets; 215701489e5dSAlfredo Cardigliano __le64 tx_bcast_drop_bytes; 215801489e5dSAlfredo Cardigliano __le64 tx_bcast_drop_packets; 215901489e5dSAlfredo Cardigliano __le64 tx_dma_error; 216001489e5dSAlfredo Cardigliano __le64 rsvd5; 216101489e5dSAlfredo Cardigliano /* Rx Queue/Ring drops */ 216201489e5dSAlfredo Cardigliano __le64 rx_queue_disabled; 216301489e5dSAlfredo Cardigliano __le64 rx_queue_empty; 216401489e5dSAlfredo Cardigliano __le64 rx_queue_error; 216501489e5dSAlfredo Cardigliano __le64 rx_desc_fetch_error; 216601489e5dSAlfredo Cardigliano __le64 rx_desc_data_error; 216701489e5dSAlfredo Cardigliano __le64 rsvd6; 216801489e5dSAlfredo Cardigliano __le64 rsvd7; 216901489e5dSAlfredo Cardigliano __le64 rsvd8; 217001489e5dSAlfredo Cardigliano /* Tx Queue/Ring drops */ 217101489e5dSAlfredo Cardigliano __le64 tx_queue_disabled; 217201489e5dSAlfredo Cardigliano __le64 tx_queue_error; 217301489e5dSAlfredo Cardigliano __le64 tx_desc_fetch_error; 217401489e5dSAlfredo Cardigliano __le64 tx_desc_data_error; 217501489e5dSAlfredo Cardigliano __le64 rsvd9; 217601489e5dSAlfredo Cardigliano __le64 rsvd10; 217701489e5dSAlfredo Cardigliano __le64 rsvd11; 217801489e5dSAlfredo Cardigliano __le64 rsvd12; 217901489e5dSAlfredo Cardigliano 218001489e5dSAlfredo Cardigliano /* RDMA/ROCE TX */ 218101489e5dSAlfredo Cardigliano __le64 tx_rdma_ucast_bytes; 218201489e5dSAlfredo Cardigliano __le64 tx_rdma_ucast_packets; 218301489e5dSAlfredo Cardigliano __le64 tx_rdma_mcast_bytes; 218401489e5dSAlfredo Cardigliano __le64 tx_rdma_mcast_packets; 218501489e5dSAlfredo Cardigliano __le64 tx_rdma_cnp_packets; 218601489e5dSAlfredo Cardigliano __le64 rsvd13; 218701489e5dSAlfredo Cardigliano __le64 rsvd14; 218801489e5dSAlfredo Cardigliano __le64 rsvd15; 218901489e5dSAlfredo Cardigliano 219001489e5dSAlfredo Cardigliano /* RDMA/ROCE RX */ 219101489e5dSAlfredo Cardigliano __le64 rx_rdma_ucast_bytes; 219201489e5dSAlfredo Cardigliano __le64 rx_rdma_ucast_packets; 219301489e5dSAlfredo Cardigliano __le64 rx_rdma_mcast_bytes; 219401489e5dSAlfredo Cardigliano __le64 rx_rdma_mcast_packets; 219501489e5dSAlfredo Cardigliano __le64 rx_rdma_cnp_packets; 219601489e5dSAlfredo Cardigliano __le64 rx_rdma_ecn_packets; 219701489e5dSAlfredo Cardigliano __le64 rsvd16; 219801489e5dSAlfredo Cardigliano __le64 rsvd17; 219901489e5dSAlfredo Cardigliano 220001489e5dSAlfredo Cardigliano __le64 rsvd18; 220101489e5dSAlfredo Cardigliano __le64 rsvd19; 220201489e5dSAlfredo Cardigliano __le64 rsvd20; 220301489e5dSAlfredo Cardigliano __le64 rsvd21; 220401489e5dSAlfredo Cardigliano __le64 rsvd22; 220501489e5dSAlfredo Cardigliano __le64 rsvd23; 220601489e5dSAlfredo Cardigliano __le64 rsvd24; 220701489e5dSAlfredo Cardigliano __le64 rsvd25; 220801489e5dSAlfredo Cardigliano 220901489e5dSAlfredo Cardigliano __le64 rsvd26; 221001489e5dSAlfredo Cardigliano __le64 rsvd27; 221101489e5dSAlfredo Cardigliano __le64 rsvd28; 221201489e5dSAlfredo Cardigliano __le64 rsvd29; 221301489e5dSAlfredo Cardigliano __le64 rsvd30; 221401489e5dSAlfredo Cardigliano __le64 rsvd31; 221501489e5dSAlfredo Cardigliano __le64 rsvd32; 221601489e5dSAlfredo Cardigliano __le64 rsvd33; 221701489e5dSAlfredo Cardigliano 221801489e5dSAlfredo Cardigliano __le64 rsvd34; 221901489e5dSAlfredo Cardigliano __le64 rsvd35; 222001489e5dSAlfredo Cardigliano __le64 rsvd36; 222101489e5dSAlfredo Cardigliano __le64 rsvd37; 222201489e5dSAlfredo Cardigliano __le64 rsvd38; 222301489e5dSAlfredo Cardigliano __le64 rsvd39; 222401489e5dSAlfredo Cardigliano __le64 rsvd40; 222501489e5dSAlfredo Cardigliano __le64 rsvd41; 222601489e5dSAlfredo Cardigliano 222701489e5dSAlfredo Cardigliano __le64 rsvd42; 222801489e5dSAlfredo Cardigliano __le64 rsvd43; 222901489e5dSAlfredo Cardigliano __le64 rsvd44; 223001489e5dSAlfredo Cardigliano __le64 rsvd45; 223101489e5dSAlfredo Cardigliano __le64 rsvd46; 223201489e5dSAlfredo Cardigliano __le64 rsvd47; 223301489e5dSAlfredo Cardigliano __le64 rsvd48; 223401489e5dSAlfredo Cardigliano __le64 rsvd49; 223501489e5dSAlfredo Cardigliano 223601489e5dSAlfredo Cardigliano /* RDMA/ROCE REQ Error/Debugs (768 - 895) */ 223701489e5dSAlfredo Cardigliano __le64 rdma_req_rx_pkt_seq_err; 223801489e5dSAlfredo Cardigliano __le64 rdma_req_rx_rnr_retry_err; 223901489e5dSAlfredo Cardigliano __le64 rdma_req_rx_remote_access_err; 224001489e5dSAlfredo Cardigliano __le64 rdma_req_rx_remote_inv_req_err; 224101489e5dSAlfredo Cardigliano __le64 rdma_req_rx_remote_oper_err; 224201489e5dSAlfredo Cardigliano __le64 rdma_req_rx_implied_nak_seq_err; 224301489e5dSAlfredo Cardigliano __le64 rdma_req_rx_cqe_err; 224401489e5dSAlfredo Cardigliano __le64 rdma_req_rx_cqe_flush_err; 224501489e5dSAlfredo Cardigliano 224601489e5dSAlfredo Cardigliano __le64 rdma_req_rx_dup_responses; 224701489e5dSAlfredo Cardigliano __le64 rdma_req_rx_invalid_packets; 224801489e5dSAlfredo Cardigliano __le64 rdma_req_tx_local_access_err; 224901489e5dSAlfredo Cardigliano __le64 rdma_req_tx_local_oper_err; 225001489e5dSAlfredo Cardigliano __le64 rdma_req_tx_memory_mgmt_err; 225101489e5dSAlfredo Cardigliano __le64 rsvd52; 225201489e5dSAlfredo Cardigliano __le64 rsvd53; 225301489e5dSAlfredo Cardigliano __le64 rsvd54; 225401489e5dSAlfredo Cardigliano 225501489e5dSAlfredo Cardigliano /* RDMA/ROCE RESP Error/Debugs (896 - 1023) */ 225601489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_dup_requests; 225701489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_out_of_buffer; 225801489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_out_of_seq_pkts; 225901489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_cqe_err; 226001489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_cqe_flush_err; 226101489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_local_len_err; 226201489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_inv_request_err; 226301489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_local_qp_oper_err; 226401489e5dSAlfredo Cardigliano 226501489e5dSAlfredo Cardigliano __le64 rdma_resp_rx_out_of_atomic_resource; 226601489e5dSAlfredo Cardigliano __le64 rdma_resp_tx_pkt_seq_err; 226701489e5dSAlfredo Cardigliano __le64 rdma_resp_tx_remote_inv_req_err; 226801489e5dSAlfredo Cardigliano __le64 rdma_resp_tx_remote_access_err; 226901489e5dSAlfredo Cardigliano __le64 rdma_resp_tx_remote_oper_err; 227001489e5dSAlfredo Cardigliano __le64 rdma_resp_tx_rnr_retry_err; 227101489e5dSAlfredo Cardigliano __le64 rsvd57; 227201489e5dSAlfredo Cardigliano __le64 rsvd58; 227301489e5dSAlfredo Cardigliano }; 227401489e5dSAlfredo Cardigliano 227501489e5dSAlfredo Cardigliano /** 227601489e5dSAlfredo Cardigliano * struct ionic_lif_info - lif info structure 227701489e5dSAlfredo Cardigliano */ 227801489e5dSAlfredo Cardigliano struct ionic_lif_info { 227901489e5dSAlfredo Cardigliano union ionic_lif_config config; 228001489e5dSAlfredo Cardigliano struct ionic_lif_status status; 228101489e5dSAlfredo Cardigliano struct ionic_lif_stats stats; 228201489e5dSAlfredo Cardigliano }; 228301489e5dSAlfredo Cardigliano 228401489e5dSAlfredo Cardigliano union ionic_dev_cmd { 228501489e5dSAlfredo Cardigliano u32 words[16]; 228601489e5dSAlfredo Cardigliano struct ionic_admin_cmd cmd; 228701489e5dSAlfredo Cardigliano struct ionic_nop_cmd nop; 228801489e5dSAlfredo Cardigliano 228901489e5dSAlfredo Cardigliano struct ionic_dev_identify_cmd identify; 229001489e5dSAlfredo Cardigliano struct ionic_dev_init_cmd init; 229101489e5dSAlfredo Cardigliano struct ionic_dev_reset_cmd reset; 229201489e5dSAlfredo Cardigliano struct ionic_dev_getattr_cmd getattr; 229301489e5dSAlfredo Cardigliano struct ionic_dev_setattr_cmd setattr; 229401489e5dSAlfredo Cardigliano 229501489e5dSAlfredo Cardigliano struct ionic_port_identify_cmd port_identify; 229601489e5dSAlfredo Cardigliano struct ionic_port_init_cmd port_init; 229701489e5dSAlfredo Cardigliano struct ionic_port_reset_cmd port_reset; 229801489e5dSAlfredo Cardigliano struct ionic_port_getattr_cmd port_getattr; 229901489e5dSAlfredo Cardigliano struct ionic_port_setattr_cmd port_setattr; 230001489e5dSAlfredo Cardigliano 230101489e5dSAlfredo Cardigliano struct ionic_lif_identify_cmd lif_identify; 230201489e5dSAlfredo Cardigliano struct ionic_lif_init_cmd lif_init; 230301489e5dSAlfredo Cardigliano struct ionic_lif_reset_cmd lif_reset; 230401489e5dSAlfredo Cardigliano 230501489e5dSAlfredo Cardigliano struct ionic_qos_identify_cmd qos_identify; 230601489e5dSAlfredo Cardigliano struct ionic_qos_init_cmd qos_init; 230701489e5dSAlfredo Cardigliano struct ionic_qos_reset_cmd qos_reset; 230801489e5dSAlfredo Cardigliano 230901489e5dSAlfredo Cardigliano struct ionic_q_init_cmd q_init; 231001489e5dSAlfredo Cardigliano }; 231101489e5dSAlfredo Cardigliano 231201489e5dSAlfredo Cardigliano union ionic_dev_cmd_comp { 231301489e5dSAlfredo Cardigliano u32 words[4]; 231401489e5dSAlfredo Cardigliano u8 status; 231501489e5dSAlfredo Cardigliano struct ionic_admin_comp comp; 231601489e5dSAlfredo Cardigliano struct ionic_nop_comp nop; 231701489e5dSAlfredo Cardigliano 231801489e5dSAlfredo Cardigliano struct ionic_dev_identify_comp identify; 231901489e5dSAlfredo Cardigliano struct ionic_dev_init_comp init; 232001489e5dSAlfredo Cardigliano struct ionic_dev_reset_comp reset; 232101489e5dSAlfredo Cardigliano struct ionic_dev_getattr_comp getattr; 232201489e5dSAlfredo Cardigliano struct ionic_dev_setattr_comp setattr; 232301489e5dSAlfredo Cardigliano 232401489e5dSAlfredo Cardigliano struct ionic_port_identify_comp port_identify; 232501489e5dSAlfredo Cardigliano struct ionic_port_init_comp port_init; 232601489e5dSAlfredo Cardigliano struct ionic_port_reset_comp port_reset; 232701489e5dSAlfredo Cardigliano struct ionic_port_getattr_comp port_getattr; 232801489e5dSAlfredo Cardigliano struct ionic_port_setattr_comp port_setattr; 232901489e5dSAlfredo Cardigliano 233001489e5dSAlfredo Cardigliano struct ionic_lif_identify_comp lif_identify; 233101489e5dSAlfredo Cardigliano struct ionic_lif_init_comp lif_init; 233201489e5dSAlfredo Cardigliano ionic_lif_reset_comp lif_reset; 233301489e5dSAlfredo Cardigliano 233401489e5dSAlfredo Cardigliano struct ionic_qos_identify_comp qos_identify; 233501489e5dSAlfredo Cardigliano ionic_qos_init_comp qos_init; 233601489e5dSAlfredo Cardigliano ionic_qos_reset_comp qos_reset; 233701489e5dSAlfredo Cardigliano 233801489e5dSAlfredo Cardigliano struct ionic_q_init_comp q_init; 233901489e5dSAlfredo Cardigliano }; 234001489e5dSAlfredo Cardigliano 234101489e5dSAlfredo Cardigliano /** 234201489e5dSAlfredo Cardigliano * union dev_info - Device info register format (read-only) 234301489e5dSAlfredo Cardigliano * @signature: Signature value of 0x44455649 ('DEVI'). 234401489e5dSAlfredo Cardigliano * @version: Current version of info. 234501489e5dSAlfredo Cardigliano * @asic_type: Asic type. 234601489e5dSAlfredo Cardigliano * @asic_rev: Asic revision. 234701489e5dSAlfredo Cardigliano * @fw_status: Firmware status. 234801489e5dSAlfredo Cardigliano * @fw_heartbeat: Firmware heartbeat counter. 234901489e5dSAlfredo Cardigliano * @serial_num: Serial number. 235001489e5dSAlfredo Cardigliano * @fw_version: Firmware version. 235101489e5dSAlfredo Cardigliano */ 235201489e5dSAlfredo Cardigliano union ionic_dev_info_regs { 235301489e5dSAlfredo Cardigliano #define IONIC_DEVINFO_FWVERS_BUFLEN 32 235401489e5dSAlfredo Cardigliano #define IONIC_DEVINFO_SERIAL_BUFLEN 32 235501489e5dSAlfredo Cardigliano struct { 235601489e5dSAlfredo Cardigliano u32 signature; 235701489e5dSAlfredo Cardigliano u8 version; 235801489e5dSAlfredo Cardigliano u8 asic_type; 235901489e5dSAlfredo Cardigliano u8 asic_rev; 236001489e5dSAlfredo Cardigliano u8 fw_status; 236101489e5dSAlfredo Cardigliano u32 fw_heartbeat; 236201489e5dSAlfredo Cardigliano char fw_version[IONIC_DEVINFO_FWVERS_BUFLEN]; 236301489e5dSAlfredo Cardigliano char serial_num[IONIC_DEVINFO_SERIAL_BUFLEN]; 236401489e5dSAlfredo Cardigliano }; 236501489e5dSAlfredo Cardigliano u32 words[512]; 236601489e5dSAlfredo Cardigliano }; 236701489e5dSAlfredo Cardigliano 236801489e5dSAlfredo Cardigliano /** 236901489e5dSAlfredo Cardigliano * union ionic_dev_cmd_regs - Device command register format (read-write) 237001489e5dSAlfredo Cardigliano * @doorbell: Device Cmd Doorbell, write-only. 237101489e5dSAlfredo Cardigliano * Write a 1 to signal device to process cmd, 237201489e5dSAlfredo Cardigliano * poll done for completion. 237301489e5dSAlfredo Cardigliano * @done: Done indicator, bit 0 == 1 when command is complete. 237401489e5dSAlfredo Cardigliano * @cmd: Opcode-specific command bytes 237501489e5dSAlfredo Cardigliano * @comp: Opcode-specific response bytes 237601489e5dSAlfredo Cardigliano * @data: Opcode-specific side-data 237701489e5dSAlfredo Cardigliano */ 237801489e5dSAlfredo Cardigliano union ionic_dev_cmd_regs { 237901489e5dSAlfredo Cardigliano struct { 238001489e5dSAlfredo Cardigliano u32 doorbell; 238101489e5dSAlfredo Cardigliano u32 done; 238201489e5dSAlfredo Cardigliano union ionic_dev_cmd cmd; 238301489e5dSAlfredo Cardigliano union ionic_dev_cmd_comp comp; 238401489e5dSAlfredo Cardigliano u8 rsvd[48]; 238501489e5dSAlfredo Cardigliano u32 data[478]; 238601489e5dSAlfredo Cardigliano }; 238701489e5dSAlfredo Cardigliano u32 words[512]; 238801489e5dSAlfredo Cardigliano }; 238901489e5dSAlfredo Cardigliano 239001489e5dSAlfredo Cardigliano /** 239101489e5dSAlfredo Cardigliano * union ionic_dev_regs - Device register format in for bar 0 page 0 239201489e5dSAlfredo Cardigliano * @info: Device info registers 239301489e5dSAlfredo Cardigliano * @devcmd: Device command registers 239401489e5dSAlfredo Cardigliano */ 239501489e5dSAlfredo Cardigliano union ionic_dev_regs { 239601489e5dSAlfredo Cardigliano struct { 239701489e5dSAlfredo Cardigliano union ionic_dev_info_regs info; 239801489e5dSAlfredo Cardigliano union ionic_dev_cmd_regs devcmd; 239901489e5dSAlfredo Cardigliano }; 240001489e5dSAlfredo Cardigliano __le32 words[1024]; 240101489e5dSAlfredo Cardigliano }; 240201489e5dSAlfredo Cardigliano 240301489e5dSAlfredo Cardigliano union ionic_adminq_cmd { 240401489e5dSAlfredo Cardigliano struct ionic_admin_cmd cmd; 240501489e5dSAlfredo Cardigliano struct ionic_nop_cmd nop; 240601489e5dSAlfredo Cardigliano struct ionic_q_init_cmd q_init; 240701489e5dSAlfredo Cardigliano struct ionic_q_control_cmd q_control; 240801489e5dSAlfredo Cardigliano struct ionic_lif_setattr_cmd lif_setattr; 240901489e5dSAlfredo Cardigliano struct ionic_lif_getattr_cmd lif_getattr; 241001489e5dSAlfredo Cardigliano struct ionic_rx_mode_set_cmd rx_mode_set; 241101489e5dSAlfredo Cardigliano struct ionic_rx_filter_add_cmd rx_filter_add; 241201489e5dSAlfredo Cardigliano struct ionic_rx_filter_del_cmd rx_filter_del; 241301489e5dSAlfredo Cardigliano struct ionic_rdma_reset_cmd rdma_reset; 241401489e5dSAlfredo Cardigliano struct ionic_rdma_queue_cmd rdma_queue; 241501489e5dSAlfredo Cardigliano struct ionic_fw_download_cmd fw_download; 241601489e5dSAlfredo Cardigliano struct ionic_fw_control_cmd fw_control; 241701489e5dSAlfredo Cardigliano }; 241801489e5dSAlfredo Cardigliano 241901489e5dSAlfredo Cardigliano union ionic_adminq_comp { 242001489e5dSAlfredo Cardigliano struct ionic_admin_comp comp; 242101489e5dSAlfredo Cardigliano struct ionic_nop_comp nop; 242201489e5dSAlfredo Cardigliano struct ionic_q_init_comp q_init; 242301489e5dSAlfredo Cardigliano struct ionic_lif_setattr_comp lif_setattr; 242401489e5dSAlfredo Cardigliano struct ionic_lif_getattr_comp lif_getattr; 242501489e5dSAlfredo Cardigliano struct ionic_rx_filter_add_comp rx_filter_add; 242601489e5dSAlfredo Cardigliano struct ionic_fw_control_comp fw_control; 242701489e5dSAlfredo Cardigliano }; 242801489e5dSAlfredo Cardigliano 242901489e5dSAlfredo Cardigliano #define IONIC_BARS_MAX 6 243001489e5dSAlfredo Cardigliano #define IONIC_PCI_BAR_DBELL 1 243101489e5dSAlfredo Cardigliano 243201489e5dSAlfredo Cardigliano /* BAR0 */ 243301489e5dSAlfredo Cardigliano #define IONIC_BAR0_SIZE 0x8000 243401489e5dSAlfredo Cardigliano 243501489e5dSAlfredo Cardigliano #define IONIC_BAR0_DEV_INFO_REGS_OFFSET 0x0000 243601489e5dSAlfredo Cardigliano #define IONIC_BAR0_DEV_CMD_REGS_OFFSET 0x0800 243701489e5dSAlfredo Cardigliano #define IONIC_BAR0_DEV_CMD_DATA_REGS_OFFSET 0x0c00 243801489e5dSAlfredo Cardigliano #define IONIC_BAR0_INTR_STATUS_OFFSET 0x1000 243901489e5dSAlfredo Cardigliano #define IONIC_BAR0_INTR_CTRL_OFFSET 0x2000 244001489e5dSAlfredo Cardigliano #define IONIC_DEV_CMD_DONE 0x00000001 244101489e5dSAlfredo Cardigliano 244201489e5dSAlfredo Cardigliano #define IONIC_ASIC_TYPE_CAPRI 0 244301489e5dSAlfredo Cardigliano 244401489e5dSAlfredo Cardigliano /** 244501489e5dSAlfredo Cardigliano * struct ionic_doorbell - Doorbell register layout 244601489e5dSAlfredo Cardigliano * @p_index: Producer index 244701489e5dSAlfredo Cardigliano * @ring: Selects the specific ring of the queue to update. 244801489e5dSAlfredo Cardigliano * Type-specific meaning: 244901489e5dSAlfredo Cardigliano * ring=0: Default producer/consumer queue. 245001489e5dSAlfredo Cardigliano * ring=1: (CQ, EQ) Re-Arm queue. RDMA CQs 245101489e5dSAlfredo Cardigliano * send events to EQs when armed. EQs send 245201489e5dSAlfredo Cardigliano * interrupts when armed. 245301489e5dSAlfredo Cardigliano * @qid: The queue id selects the queue destination for the 245401489e5dSAlfredo Cardigliano * producer index and flags. 245501489e5dSAlfredo Cardigliano */ 245601489e5dSAlfredo Cardigliano struct ionic_doorbell { 245701489e5dSAlfredo Cardigliano __le16 p_index; 245801489e5dSAlfredo Cardigliano u8 ring; 245901489e5dSAlfredo Cardigliano u8 qid_lo; 246001489e5dSAlfredo Cardigliano __le16 qid_hi; 246101489e5dSAlfredo Cardigliano u16 rsvd2; 246201489e5dSAlfredo Cardigliano }; 246301489e5dSAlfredo Cardigliano 246401489e5dSAlfredo Cardigliano struct ionic_intr_status { 246501489e5dSAlfredo Cardigliano u32 status[2]; 246601489e5dSAlfredo Cardigliano }; 246701489e5dSAlfredo Cardigliano 246801489e5dSAlfredo Cardigliano struct ionic_notifyq_cmd { 246901489e5dSAlfredo Cardigliano __le32 data; /* Not used but needed for qcq structure */ 247001489e5dSAlfredo Cardigliano }; 247101489e5dSAlfredo Cardigliano 247201489e5dSAlfredo Cardigliano union ionic_notifyq_comp { 247301489e5dSAlfredo Cardigliano struct ionic_notifyq_event event; 247401489e5dSAlfredo Cardigliano struct ionic_link_change_event link_change; 247501489e5dSAlfredo Cardigliano struct ionic_reset_event reset; 247601489e5dSAlfredo Cardigliano struct ionic_heartbeat_event heartbeat; 247701489e5dSAlfredo Cardigliano struct ionic_log_event log; 247801489e5dSAlfredo Cardigliano }; 247901489e5dSAlfredo Cardigliano 248001489e5dSAlfredo Cardigliano /* Deprecate */ 248101489e5dSAlfredo Cardigliano struct ionic_identity { 248201489e5dSAlfredo Cardigliano union ionic_drv_identity drv; 248301489e5dSAlfredo Cardigliano union ionic_dev_identity dev; 248401489e5dSAlfredo Cardigliano union ionic_lif_identity lif; 248501489e5dSAlfredo Cardigliano union ionic_port_identity port; 248601489e5dSAlfredo Cardigliano union ionic_qos_identity qos; 248701489e5dSAlfredo Cardigliano }; 248801489e5dSAlfredo Cardigliano 248901489e5dSAlfredo Cardigliano #pragma pack(pop) 249001489e5dSAlfredo Cardigliano 249101489e5dSAlfredo Cardigliano #endif /* _IONIC_IF_H_ */ 2492