cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ionic_if.h (88841B)


      1/* SPDX-License-Identifier: (GPL-2.0 OR Linux-OpenIB) OR BSD-2-Clause */
      2/* Copyright (c) 2017-2020 Pensando Systems, Inc.  All rights reserved. */
      3
      4#ifndef _IONIC_IF_H_
      5#define _IONIC_IF_H_
      6
      7#define IONIC_DEV_INFO_SIGNATURE		0x44455649      /* 'DEVI' */
      8#define IONIC_DEV_INFO_VERSION			1
      9#define IONIC_IFNAMSIZ				16
     10
     11/**
     12 * enum ionic_cmd_opcode - Device commands
     13 */
     14enum ionic_cmd_opcode {
     15	IONIC_CMD_NOP				= 0,
     16
     17	/* Device commands */
     18	IONIC_CMD_IDENTIFY			= 1,
     19	IONIC_CMD_INIT				= 2,
     20	IONIC_CMD_RESET				= 3,
     21	IONIC_CMD_GETATTR			= 4,
     22	IONIC_CMD_SETATTR			= 5,
     23
     24	/* Port commands */
     25	IONIC_CMD_PORT_IDENTIFY			= 10,
     26	IONIC_CMD_PORT_INIT			= 11,
     27	IONIC_CMD_PORT_RESET			= 12,
     28	IONIC_CMD_PORT_GETATTR			= 13,
     29	IONIC_CMD_PORT_SETATTR			= 14,
     30
     31	/* LIF commands */
     32	IONIC_CMD_LIF_IDENTIFY			= 20,
     33	IONIC_CMD_LIF_INIT			= 21,
     34	IONIC_CMD_LIF_RESET			= 22,
     35	IONIC_CMD_LIF_GETATTR			= 23,
     36	IONIC_CMD_LIF_SETATTR			= 24,
     37	IONIC_CMD_LIF_SETPHC			= 25,
     38
     39	IONIC_CMD_RX_MODE_SET			= 30,
     40	IONIC_CMD_RX_FILTER_ADD			= 31,
     41	IONIC_CMD_RX_FILTER_DEL			= 32,
     42
     43	/* Queue commands */
     44	IONIC_CMD_Q_IDENTIFY			= 39,
     45	IONIC_CMD_Q_INIT			= 40,
     46	IONIC_CMD_Q_CONTROL			= 41,
     47
     48	/* RDMA commands */
     49	IONIC_CMD_RDMA_RESET_LIF		= 50,
     50	IONIC_CMD_RDMA_CREATE_EQ		= 51,
     51	IONIC_CMD_RDMA_CREATE_CQ		= 52,
     52	IONIC_CMD_RDMA_CREATE_ADMINQ		= 53,
     53
     54	/* SR/IOV commands */
     55	IONIC_CMD_VF_GETATTR			= 60,
     56	IONIC_CMD_VF_SETATTR			= 61,
     57
     58	/* QoS commands */
     59	IONIC_CMD_QOS_CLASS_IDENTIFY		= 240,
     60	IONIC_CMD_QOS_CLASS_INIT		= 241,
     61	IONIC_CMD_QOS_CLASS_RESET		= 242,
     62	IONIC_CMD_QOS_CLASS_UPDATE		= 243,
     63	IONIC_CMD_QOS_CLEAR_STATS		= 244,
     64	IONIC_CMD_QOS_RESET			= 245,
     65
     66	/* Firmware commands */
     67	IONIC_CMD_FW_DOWNLOAD                   = 252,
     68	IONIC_CMD_FW_CONTROL                    = 253,
     69	IONIC_CMD_FW_DOWNLOAD_V1		= 254,
     70	IONIC_CMD_FW_CONTROL_V1		        = 255,
     71};
     72
     73/**
     74 * enum ionic_status_code - Device command return codes
     75 */
     76enum ionic_status_code {
     77	IONIC_RC_SUCCESS	= 0,	/* Success */
     78	IONIC_RC_EVERSION	= 1,	/* Incorrect version for request */
     79	IONIC_RC_EOPCODE	= 2,	/* Invalid cmd opcode */
     80	IONIC_RC_EIO		= 3,	/* I/O error */
     81	IONIC_RC_EPERM		= 4,	/* Permission denied */
     82	IONIC_RC_EQID		= 5,	/* Bad qid */
     83	IONIC_RC_EQTYPE		= 6,	/* Bad qtype */
     84	IONIC_RC_ENOENT		= 7,	/* No such element */
     85	IONIC_RC_EINTR		= 8,	/* operation interrupted */
     86	IONIC_RC_EAGAIN		= 9,	/* Try again */
     87	IONIC_RC_ENOMEM		= 10,	/* Out of memory */
     88	IONIC_RC_EFAULT		= 11,	/* Bad address */
     89	IONIC_RC_EBUSY		= 12,	/* Device or resource busy */
     90	IONIC_RC_EEXIST		= 13,	/* object already exists */
     91	IONIC_RC_EINVAL		= 14,	/* Invalid argument */
     92	IONIC_RC_ENOSPC		= 15,	/* No space left or alloc failure */
     93	IONIC_RC_ERANGE		= 16,	/* Parameter out of range */
     94	IONIC_RC_BAD_ADDR	= 17,	/* Descriptor contains a bad ptr */
     95	IONIC_RC_DEV_CMD	= 18,	/* Device cmd attempted on AdminQ */
     96	IONIC_RC_ENOSUPP	= 19,	/* Operation not supported */
     97	IONIC_RC_ERROR		= 29,	/* Generic error */
     98	IONIC_RC_ERDMA		= 30,	/* Generic RDMA error */
     99	IONIC_RC_EVFID		= 31,	/* VF ID does not exist */
    100	IONIC_RC_EBAD_FW	= 32,	/* FW file is invalid or corrupted */
    101};
    102
    103enum ionic_notifyq_opcode {
    104	IONIC_EVENT_LINK_CHANGE		= 1,
    105	IONIC_EVENT_RESET		= 2,
    106	IONIC_EVENT_HEARTBEAT		= 3,
    107	IONIC_EVENT_LOG			= 4,
    108	IONIC_EVENT_XCVR		= 5,
    109};
    110
    111/**
    112 * struct ionic_admin_cmd - General admin command format
    113 * @opcode:     Opcode for the command
    114 * @lif_index:  LIF index
    115 * @cmd_data:   Opcode-specific command bytes
    116 */
    117struct ionic_admin_cmd {
    118	u8     opcode;
    119	u8     rsvd;
    120	__le16 lif_index;
    121	u8     cmd_data[60];
    122};
    123
    124/**
    125 * struct ionic_admin_comp - General admin command completion format
    126 * @status:     Status of the command (enum ionic_status_code)
    127 * @comp_index: Index in the descriptor ring for which this is the completion
    128 * @cmd_data:   Command-specific bytes
    129 * @color:      Color bit (Always 0 for commands issued to the
    130 *              Device Cmd Registers)
    131 */
    132struct ionic_admin_comp {
    133	u8     status;
    134	u8     rsvd;
    135	__le16 comp_index;
    136	u8     cmd_data[11];
    137	u8     color;
    138#define IONIC_COMP_COLOR_MASK  0x80
    139};
    140
    141static inline u8 color_match(u8 color, u8 done_color)
    142{
    143	return (!!(color & IONIC_COMP_COLOR_MASK)) == done_color;
    144}
    145
    146/**
    147 * struct ionic_nop_cmd - NOP command
    148 * @opcode: opcode
    149 */
    150struct ionic_nop_cmd {
    151	u8 opcode;
    152	u8 rsvd[63];
    153};
    154
    155/**
    156 * struct ionic_nop_comp - NOP command completion
    157 * @status: Status of the command (enum ionic_status_code)
    158 */
    159struct ionic_nop_comp {
    160	u8 status;
    161	u8 rsvd[15];
    162};
    163
    164/**
    165 * struct ionic_dev_init_cmd - Device init command
    166 * @opcode:    opcode
    167 * @type:      Device type
    168 */
    169struct ionic_dev_init_cmd {
    170	u8     opcode;
    171	u8     type;
    172	u8     rsvd[62];
    173};
    174
    175/**
    176 * struct ionic_dev_init_comp - Device init command completion
    177 * @status: Status of the command (enum ionic_status_code)
    178 */
    179struct ionic_dev_init_comp {
    180	u8 status;
    181	u8 rsvd[15];
    182};
    183
    184/**
    185 * struct ionic_dev_reset_cmd - Device reset command
    186 * @opcode: opcode
    187 */
    188struct ionic_dev_reset_cmd {
    189	u8 opcode;
    190	u8 rsvd[63];
    191};
    192
    193/**
    194 * struct ionic_dev_reset_comp - Reset command completion
    195 * @status: Status of the command (enum ionic_status_code)
    196 */
    197struct ionic_dev_reset_comp {
    198	u8 status;
    199	u8 rsvd[15];
    200};
    201
    202#define IONIC_IDENTITY_VERSION_1	1
    203
    204/**
    205 * struct ionic_dev_identify_cmd - Driver/device identify command
    206 * @opcode:  opcode
    207 * @ver:     Highest version of identify supported by driver
    208 */
    209struct ionic_dev_identify_cmd {
    210	u8 opcode;
    211	u8 ver;
    212	u8 rsvd[62];
    213};
    214
    215/**
    216 * struct ionic_dev_identify_comp - Driver/device identify command completion
    217 * @status: Status of the command (enum ionic_status_code)
    218 * @ver:    Version of identify returned by device
    219 */
    220struct ionic_dev_identify_comp {
    221	u8 status;
    222	u8 ver;
    223	u8 rsvd[14];
    224};
    225
    226enum ionic_os_type {
    227	IONIC_OS_TYPE_LINUX   = 1,
    228	IONIC_OS_TYPE_WIN     = 2,
    229	IONIC_OS_TYPE_DPDK    = 3,
    230	IONIC_OS_TYPE_FREEBSD = 4,
    231	IONIC_OS_TYPE_IPXE    = 5,
    232	IONIC_OS_TYPE_ESXI    = 6,
    233};
    234
    235/**
    236 * union ionic_drv_identity - driver identity information
    237 * @os_type:          OS type (see enum ionic_os_type)
    238 * @os_dist:          OS distribution, numeric format
    239 * @os_dist_str:      OS distribution, string format
    240 * @kernel_ver:       Kernel version, numeric format
    241 * @kernel_ver_str:   Kernel version, string format
    242 * @driver_ver_str:   Driver version, string format
    243 */
    244union ionic_drv_identity {
    245	struct {
    246		__le32 os_type;
    247		__le32 os_dist;
    248		char   os_dist_str[128];
    249		__le32 kernel_ver;
    250		char   kernel_ver_str[32];
    251		char   driver_ver_str[32];
    252	};
    253	__le32 words[478];
    254};
    255
    256/**
    257 * union ionic_dev_identity - device identity information
    258 * @version:          Version of device identify
    259 * @type:             Identify type (0 for now)
    260 * @nports:           Number of ports provisioned
    261 * @nlifs:            Number of LIFs provisioned
    262 * @nintrs:           Number of interrupts provisioned
    263 * @ndbpgs_per_lif:   Number of doorbell pages per LIF
    264 * @intr_coal_mult:   Interrupt coalescing multiplication factor
    265 *                    Scale user-supplied interrupt coalescing
    266 *                    value in usecs to device units using:
    267 *                    device units = usecs * mult / div
    268 * @intr_coal_div:    Interrupt coalescing division factor
    269 *                    Scale user-supplied interrupt coalescing
    270 *                    value in usecs to device units using:
    271 *                    device units = usecs * mult / div
    272 * @eq_count:         Number of shared event queues
    273 * @hwstamp_mask:     Bitmask for subtraction of hardware tick values.
    274 * @hwstamp_mult:     Hardware tick to nanosecond multiplier.
    275 * @hwstamp_shift:    Hardware tick to nanosecond divisor (power of two).
    276 */
    277union ionic_dev_identity {
    278	struct {
    279		u8     version;
    280		u8     type;
    281		u8     rsvd[2];
    282		u8     nports;
    283		u8     rsvd2[3];
    284		__le32 nlifs;
    285		__le32 nintrs;
    286		__le32 ndbpgs_per_lif;
    287		__le32 intr_coal_mult;
    288		__le32 intr_coal_div;
    289		__le32 eq_count;
    290		__le64 hwstamp_mask;
    291		__le32 hwstamp_mult;
    292		__le32 hwstamp_shift;
    293	};
    294	__le32 words[478];
    295};
    296
    297enum ionic_lif_type {
    298	IONIC_LIF_TYPE_CLASSIC = 0,
    299	IONIC_LIF_TYPE_MACVLAN = 1,
    300	IONIC_LIF_TYPE_NETQUEUE = 2,
    301};
    302
    303/**
    304 * struct ionic_lif_identify_cmd - LIF identify command
    305 * @opcode:  opcode
    306 * @type:    LIF type (enum ionic_lif_type)
    307 * @ver:     Version of identify returned by device
    308 */
    309struct ionic_lif_identify_cmd {
    310	u8 opcode;
    311	u8 type;
    312	u8 ver;
    313	u8 rsvd[61];
    314};
    315
    316/**
    317 * struct ionic_lif_identify_comp - LIF identify command completion
    318 * @status:  Status of the command (enum ionic_status_code)
    319 * @ver:     Version of identify returned by device
    320 */
    321struct ionic_lif_identify_comp {
    322	u8 status;
    323	u8 ver;
    324	u8 rsvd2[14];
    325};
    326
    327/**
    328 * enum ionic_lif_capability - LIF capabilities
    329 * @IONIC_LIF_CAP_ETH:     LIF supports Ethernet
    330 * @IONIC_LIF_CAP_RDMA:    LIF supports RDMA
    331 */
    332enum ionic_lif_capability {
    333	IONIC_LIF_CAP_ETH        = BIT(0),
    334	IONIC_LIF_CAP_RDMA       = BIT(1),
    335};
    336
    337/**
    338 * enum ionic_logical_qtype - Logical Queue Types
    339 * @IONIC_QTYPE_ADMINQ:    Administrative Queue
    340 * @IONIC_QTYPE_NOTIFYQ:   Notify Queue
    341 * @IONIC_QTYPE_RXQ:       Receive Queue
    342 * @IONIC_QTYPE_TXQ:       Transmit Queue
    343 * @IONIC_QTYPE_EQ:        Event Queue
    344 * @IONIC_QTYPE_MAX:       Max queue type supported
    345 */
    346enum ionic_logical_qtype {
    347	IONIC_QTYPE_ADMINQ  = 0,
    348	IONIC_QTYPE_NOTIFYQ = 1,
    349	IONIC_QTYPE_RXQ     = 2,
    350	IONIC_QTYPE_TXQ     = 3,
    351	IONIC_QTYPE_EQ      = 4,
    352	IONIC_QTYPE_MAX     = 16,
    353};
    354
    355/**
    356 * enum ionic_q_feature - Common Features for most queue types
    357 *
    358 * Common features use bits 0-15. Per-queue-type features use higher bits.
    359 *
    360 * @IONIC_QIDENT_F_CQ:      Queue has completion ring
    361 * @IONIC_QIDENT_F_SG:      Queue has scatter/gather ring
    362 * @IONIC_QIDENT_F_EQ:      Queue can use event queue
    363 * @IONIC_QIDENT_F_CMB:     Queue is in cmb bar
    364 * @IONIC_Q_F_2X_DESC:      Double main descriptor size
    365 * @IONIC_Q_F_2X_CQ_DESC:   Double cq descriptor size
    366 * @IONIC_Q_F_2X_SG_DESC:   Double sg descriptor size
    367 * @IONIC_Q_F_4X_DESC:      Quadruple main descriptor size
    368 * @IONIC_Q_F_4X_CQ_DESC:   Quadruple cq descriptor size
    369 * @IONIC_Q_F_4X_SG_DESC:   Quadruple sg descriptor size
    370 */
    371enum ionic_q_feature {
    372	IONIC_QIDENT_F_CQ		= BIT_ULL(0),
    373	IONIC_QIDENT_F_SG		= BIT_ULL(1),
    374	IONIC_QIDENT_F_EQ		= BIT_ULL(2),
    375	IONIC_QIDENT_F_CMB		= BIT_ULL(3),
    376	IONIC_Q_F_2X_DESC		= BIT_ULL(4),
    377	IONIC_Q_F_2X_CQ_DESC		= BIT_ULL(5),
    378	IONIC_Q_F_2X_SG_DESC		= BIT_ULL(6),
    379	IONIC_Q_F_4X_DESC		= BIT_ULL(7),
    380	IONIC_Q_F_4X_CQ_DESC		= BIT_ULL(8),
    381	IONIC_Q_F_4X_SG_DESC		= BIT_ULL(9),
    382};
    383
    384/**
    385 * enum ionic_rxq_feature - RXQ-specific Features
    386 *
    387 * Per-queue-type features use bits 16 and higher.
    388 *
    389 * @IONIC_RXQ_F_HWSTAMP:   Queue supports Hardware Timestamping
    390 */
    391enum ionic_rxq_feature {
    392	IONIC_RXQ_F_HWSTAMP		= BIT_ULL(16),
    393};
    394
    395/**
    396 * enum ionic_txq_feature - TXQ-specific Features
    397 *
    398 * Per-queue-type features use bits 16 and higher.
    399 *
    400 * @IONIC_TXQ_F_HWSTAMP:   Queue supports Hardware Timestamping
    401 */
    402enum ionic_txq_feature {
    403	IONIC_TXQ_F_HWSTAMP		= BIT(16),
    404};
    405
    406/**
    407 * struct ionic_hwstamp_bits - Hardware timestamp decoding bits
    408 * @IONIC_HWSTAMP_INVALID:          Invalid hardware timestamp value
    409 * @IONIC_HWSTAMP_CQ_NEGOFFSET:     Timestamp field negative offset
    410 *                                  from the base cq descriptor.
    411 */
    412enum ionic_hwstamp_bits {
    413	IONIC_HWSTAMP_INVALID	    = ~0ull,
    414	IONIC_HWSTAMP_CQ_NEGOFFSET  = 8,
    415};
    416
    417/**
    418 * struct ionic_lif_logical_qtype - Descriptor of logical to HW queue type
    419 * @qtype:          Hardware Queue Type
    420 * @qid_count:      Number of Queue IDs of the logical type
    421 * @qid_base:       Minimum Queue ID of the logical type
    422 */
    423struct ionic_lif_logical_qtype {
    424	u8     qtype;
    425	u8     rsvd[3];
    426	__le32 qid_count;
    427	__le32 qid_base;
    428};
    429
    430/**
    431 * enum ionic_lif_state - LIF state
    432 * @IONIC_LIF_DISABLE:     LIF disabled
    433 * @IONIC_LIF_ENABLE:      LIF enabled
    434 * @IONIC_LIF_QUIESCE:     LIF Quiesced
    435 */
    436enum ionic_lif_state {
    437	IONIC_LIF_QUIESCE	= 0,
    438	IONIC_LIF_ENABLE	= 1,
    439	IONIC_LIF_DISABLE	= 2,
    440};
    441
    442/**
    443 * union ionic_lif_config - LIF configuration
    444 * @state:          LIF state (enum ionic_lif_state)
    445 * @name:           LIF name
    446 * @mtu:            MTU
    447 * @mac:            Station MAC address
    448 * @vlan:           Default Vlan ID
    449 * @features:       Features (enum ionic_eth_hw_features)
    450 * @queue_count:    Queue counts per queue-type
    451 */
    452union ionic_lif_config {
    453	struct {
    454		u8     state;
    455		u8     rsvd[3];
    456		char   name[IONIC_IFNAMSIZ];
    457		__le32 mtu;
    458		u8     mac[6];
    459		__le16 vlan;
    460		__le64 features;
    461		__le32 queue_count[IONIC_QTYPE_MAX];
    462	} __packed;
    463	__le32 words[64];
    464};
    465
    466/**
    467 * struct ionic_lif_identity - LIF identity information (type-specific)
    468 *
    469 * @capabilities:        LIF capabilities
    470 *
    471 * @eth:                    Ethernet identify structure
    472 *     @version:            Ethernet identify structure version
    473 *     @max_ucast_filters:  Number of perfect unicast addresses supported
    474 *     @max_mcast_filters:  Number of perfect multicast addresses supported
    475 *     @min_frame_size:     Minimum size of frames to be sent
    476 *     @max_frame_size:     Maximum size of frames to be sent
    477 *     @hwstamp_tx_modes:   Bitmask of BIT_ULL(enum ionic_txstamp_mode)
    478 *     @hwstamp_rx_filters: Bitmask of enum ionic_pkt_class
    479 *     @config:             LIF config struct with features, mtu, mac, q counts
    480 *
    481 * @rdma:                RDMA identify structure
    482 *     @version:         RDMA version of opcodes and queue descriptors
    483 *     @qp_opcodes:      Number of RDMA queue pair opcodes supported
    484 *     @admin_opcodes:   Number of RDMA admin opcodes supported
    485 *     @npts_per_lif:    Page table size per LIF
    486 *     @nmrs_per_lif:    Number of memory regions per LIF
    487 *     @nahs_per_lif:    Number of address handles per LIF
    488 *     @max_stride:      Max work request stride
    489 *     @cl_stride:       Cache line stride
    490 *     @pte_stride:      Page table entry stride
    491 *     @rrq_stride:      Remote RQ work request stride
    492 *     @rsq_stride:      Remote SQ work request stride
    493 *     @dcqcn_profiles:  Number of DCQCN profiles
    494 *     @aq_qtype:        RDMA Admin Qtype
    495 *     @sq_qtype:        RDMA Send Qtype
    496 *     @rq_qtype:        RDMA Receive Qtype
    497 *     @cq_qtype:        RDMA Completion Qtype
    498 *     @eq_qtype:        RDMA Event Qtype
    499 */
    500union ionic_lif_identity {
    501	struct {
    502		__le64 capabilities;
    503
    504		struct {
    505			u8 version;
    506			u8 rsvd[3];
    507			__le32 max_ucast_filters;
    508			__le32 max_mcast_filters;
    509			__le16 rss_ind_tbl_sz;
    510			__le32 min_frame_size;
    511			__le32 max_frame_size;
    512			u8 rsvd2[2];
    513			__le64 hwstamp_tx_modes;
    514			__le64 hwstamp_rx_filters;
    515			u8 rsvd3[88];
    516			union ionic_lif_config config;
    517		} __packed eth;
    518
    519		struct {
    520			u8 version;
    521			u8 qp_opcodes;
    522			u8 admin_opcodes;
    523			u8 rsvd;
    524			__le32 npts_per_lif;
    525			__le32 nmrs_per_lif;
    526			__le32 nahs_per_lif;
    527			u8 max_stride;
    528			u8 cl_stride;
    529			u8 pte_stride;
    530			u8 rrq_stride;
    531			u8 rsq_stride;
    532			u8 dcqcn_profiles;
    533			u8 rsvd_dimensions[10];
    534			struct ionic_lif_logical_qtype aq_qtype;
    535			struct ionic_lif_logical_qtype sq_qtype;
    536			struct ionic_lif_logical_qtype rq_qtype;
    537			struct ionic_lif_logical_qtype cq_qtype;
    538			struct ionic_lif_logical_qtype eq_qtype;
    539		} __packed rdma;
    540	} __packed;
    541	__le32 words[478];
    542};
    543
    544/**
    545 * struct ionic_lif_init_cmd - LIF init command
    546 * @opcode:       Opcode
    547 * @type:         LIF type (enum ionic_lif_type)
    548 * @index:        LIF index
    549 * @info_pa:      Destination address for LIF info (struct ionic_lif_info)
    550 */
    551struct ionic_lif_init_cmd {
    552	u8     opcode;
    553	u8     type;
    554	__le16 index;
    555	__le32 rsvd;
    556	__le64 info_pa;
    557	u8     rsvd2[48];
    558};
    559
    560/**
    561 * struct ionic_lif_init_comp - LIF init command completion
    562 * @status:	Status of the command (enum ionic_status_code)
    563 * @hw_index:	Hardware index of the initialized LIF
    564 */
    565struct ionic_lif_init_comp {
    566	u8 status;
    567	u8 rsvd;
    568	__le16 hw_index;
    569	u8 rsvd2[12];
    570};
    571
    572/**
    573 * struct ionic_q_identify_cmd - queue identify command
    574 * @opcode:     opcode
    575 * @lif_type:   LIF type (enum ionic_lif_type)
    576 * @type:       Logical queue type (enum ionic_logical_qtype)
    577 * @ver:        Highest queue type version that the driver supports
    578 */
    579struct ionic_q_identify_cmd {
    580	u8     opcode;
    581	u8     rsvd;
    582	__le16 lif_type;
    583	u8     type;
    584	u8     ver;
    585	u8     rsvd2[58];
    586};
    587
    588/**
    589 * struct ionic_q_identify_comp - queue identify command completion
    590 * @status:     Status of the command (enum ionic_status_code)
    591 * @comp_index: Index in the descriptor ring for which this is the completion
    592 * @ver:        Queue type version that can be used with FW
    593 */
    594struct ionic_q_identify_comp {
    595	u8     status;
    596	u8     rsvd;
    597	__le16 comp_index;
    598	u8     ver;
    599	u8     rsvd2[11];
    600};
    601
    602/**
    603 * union ionic_q_identity - queue identity information
    604 *     @version:        Queue type version that can be used with FW
    605 *     @supported:      Bitfield of queue versions, first bit = ver 0
    606 *     @features:       Queue features (enum ionic_q_feature, etc)
    607 *     @desc_sz:        Descriptor size
    608 *     @comp_sz:        Completion descriptor size
    609 *     @sg_desc_sz:     Scatter/Gather descriptor size
    610 *     @max_sg_elems:   Maximum number of Scatter/Gather elements
    611 *     @sg_desc_stride: Number of Scatter/Gather elements per descriptor
    612 */
    613union ionic_q_identity {
    614	struct {
    615		u8      version;
    616		u8      supported;
    617		u8      rsvd[6];
    618		__le64  features;
    619		__le16  desc_sz;
    620		__le16  comp_sz;
    621		__le16  sg_desc_sz;
    622		__le16  max_sg_elems;
    623		__le16  sg_desc_stride;
    624	};
    625	__le32 words[478];
    626};
    627
    628/**
    629 * struct ionic_q_init_cmd - Queue init command
    630 * @opcode:       opcode
    631 * @type:         Logical queue type
    632 * @ver:          Queue type version
    633 * @lif_index:    LIF index
    634 * @index:        (LIF, qtype) relative admin queue index
    635 * @intr_index:   Interrupt control register index, or Event queue index
    636 * @pid:          Process ID
    637 * @flags:
    638 *    IRQ:        Interrupt requested on completion
    639 *    ENA:        Enable the queue.  If ENA=0 the queue is initialized
    640 *                but remains disabled, to be later enabled with the
    641 *                Queue Enable command.  If ENA=1, then queue is
    642 *                initialized and then enabled.
    643 *    SG:         Enable Scatter-Gather on the queue.
    644 *                in number of descs.  The actual ring size is
    645 *                (1 << ring_size).  For example, to
    646 *                select a ring size of 64 descriptors write
    647 *                ring_size = 6.  The minimum ring_size value is 2
    648 *                for a ring size of 4 descriptors.  The maximum
    649 *                ring_size value is 16 for a ring size of 64k
    650 *                descriptors.  Values of ring_size <2 and >16 are
    651 *                reserved.
    652 *    EQ:         Enable the Event Queue
    653 * @cos:          Class of service for this queue
    654 * @ring_size:    Queue ring size, encoded as a log2(size)
    655 * @ring_base:    Queue ring base address
    656 * @cq_ring_base: Completion queue ring base address
    657 * @sg_ring_base: Scatter/Gather ring base address
    658 * @features:     Mask of queue features to enable, if not in the flags above.
    659 */
    660struct ionic_q_init_cmd {
    661	u8     opcode;
    662	u8     rsvd;
    663	__le16 lif_index;
    664	u8     type;
    665	u8     ver;
    666	u8     rsvd1[2];
    667	__le32 index;
    668	__le16 pid;
    669	__le16 intr_index;
    670	__le16 flags;
    671#define IONIC_QINIT_F_IRQ	0x01	/* Request interrupt on completion */
    672#define IONIC_QINIT_F_ENA	0x02	/* Enable the queue */
    673#define IONIC_QINIT_F_SG	0x04	/* Enable scatter/gather on the queue */
    674#define IONIC_QINIT_F_EQ	0x08	/* Enable event queue */
    675#define IONIC_QINIT_F_CMB	0x10	/* Enable cmb-based queue */
    676#define IONIC_QINIT_F_DEBUG	0x80	/* Enable queue debugging */
    677	u8     cos;
    678	u8     ring_size;
    679	__le64 ring_base;
    680	__le64 cq_ring_base;
    681	__le64 sg_ring_base;
    682	u8     rsvd2[12];
    683	__le64 features;
    684} __packed;
    685
    686/**
    687 * struct ionic_q_init_comp - Queue init command completion
    688 * @status:     Status of the command (enum ionic_status_code)
    689 * @comp_index: Index in the descriptor ring for which this is the completion
    690 * @hw_index:   Hardware Queue ID
    691 * @hw_type:    Hardware Queue type
    692 * @color:      Color
    693 */
    694struct ionic_q_init_comp {
    695	u8     status;
    696	u8     rsvd;
    697	__le16 comp_index;
    698	__le32 hw_index;
    699	u8     hw_type;
    700	u8     rsvd2[6];
    701	u8     color;
    702};
    703
    704/* the device's internal addressing uses up to 52 bits */
    705#define IONIC_ADDR_LEN		52
    706#define IONIC_ADDR_MASK		(BIT_ULL(IONIC_ADDR_LEN) - 1)
    707
    708enum ionic_txq_desc_opcode {
    709	IONIC_TXQ_DESC_OPCODE_CSUM_NONE = 0,
    710	IONIC_TXQ_DESC_OPCODE_CSUM_PARTIAL = 1,
    711	IONIC_TXQ_DESC_OPCODE_CSUM_HW = 2,
    712	IONIC_TXQ_DESC_OPCODE_TSO = 3,
    713};
    714
    715/**
    716 * struct ionic_txq_desc - Ethernet Tx queue descriptor format
    717 * @cmd:          Tx operation, see IONIC_TXQ_DESC_OPCODE_*:
    718 *
    719 *                   IONIC_TXQ_DESC_OPCODE_CSUM_NONE:
    720 *                      Non-offload send.  No segmentation,
    721 *                      fragmentation or checksum calc/insertion is
    722 *                      performed by device; packet is prepared
    723 *                      to send by software stack and requires
    724 *                      no further manipulation from device.
    725 *
    726 *                   IONIC_TXQ_DESC_OPCODE_CSUM_PARTIAL:
    727 *                      Offload 16-bit L4 checksum
    728 *                      calculation/insertion.  The device will
    729 *                      calculate the L4 checksum value and
    730 *                      insert the result in the packet's L4
    731 *                      header checksum field.  The L4 checksum
    732 *                      is calculated starting at @csum_start bytes
    733 *                      into the packet to the end of the packet.
    734 *                      The checksum insertion position is given
    735 *                      in @csum_offset, which is the offset from
    736 *                      @csum_start to the checksum field in the L4
    737 *                      header.  This feature is only applicable to
    738 *                      protocols such as TCP, UDP and ICMP where a
    739 *                      standard (i.e. the 'IP-style' checksum)
    740 *                      one's complement 16-bit checksum is used,
    741 *                      using an IP pseudo-header to seed the
    742 *                      calculation.  Software will preload the L4
    743 *                      checksum field with the IP pseudo-header
    744 *                      checksum.
    745 *
    746 *                      For tunnel encapsulation, @csum_start and
    747 *                      @csum_offset refer to the inner L4
    748 *                      header.  Supported tunnels encapsulations
    749 *                      are: IPIP, GRE, and UDP.  If the @encap
    750 *                      is clear, no further processing by the
    751 *                      device is required; software will
    752 *                      calculate the outer header checksums.  If
    753 *                      the @encap is set, the device will
    754 *                      offload the outer header checksums using
    755 *                      LCO (local checksum offload) (see
    756 *                      Documentation/networking/checksum-offloads.rst
    757 *                      for more info).
    758 *
    759 *                   IONIC_TXQ_DESC_OPCODE_CSUM_HW:
    760 *                      Offload 16-bit checksum computation to hardware.
    761 *                      If @csum_l3 is set then the packet's L3 checksum is
    762 *                      updated. Similarly, if @csum_l4 is set the L4
    763 *                      checksum is updated. If @encap is set then encap header
    764 *                      checksums are also updated.
    765 *
    766 *                   IONIC_TXQ_DESC_OPCODE_TSO:
    767 *                      Device performs TCP segmentation offload
    768 *                      (TSO).  @hdr_len is the number of bytes
    769 *                      to the end of TCP header (the offset to
    770 *                      the TCP payload).  @mss is the desired
    771 *                      MSS, the TCP payload length for each
    772 *                      segment.  The device will calculate/
    773 *                      insert IP (IPv4 only) and TCP checksums
    774 *                      for each segment.  In the first data
    775 *                      buffer containing the header template,
    776 *                      the driver will set IPv4 checksum to 0
    777 *                      and preload TCP checksum with the IP
    778 *                      pseudo header calculated with IP length = 0.
    779 *
    780 *                      Supported tunnel encapsulations are IPIP,
    781 *                      layer-3 GRE, and UDP. @hdr_len includes
    782 *                      both outer and inner headers.  The driver
    783 *                      will set IPv4 checksum to zero and
    784 *                      preload TCP checksum with IP pseudo
    785 *                      header on the inner header.
    786 *
    787 *                      TCP ECN offload is supported.  The device
    788 *                      will set CWR flag in the first segment if
    789 *                      CWR is set in the template header, and
    790 *                      clear CWR in remaining segments.
    791 * @flags:
    792 *                vlan:
    793 *                    Insert an L2 VLAN header using @vlan_tci
    794 *                encap:
    795 *                    Calculate encap header checksum
    796 *                csum_l3:
    797 *                    Compute L3 header checksum
    798 *                csum_l4:
    799 *                    Compute L4 header checksum
    800 *                tso_sot:
    801 *                    TSO start
    802 *                tso_eot:
    803 *                    TSO end
    804 * @num_sg_elems: Number of scatter-gather elements in SG
    805 *                descriptor
    806 * @addr:         First data buffer's DMA address
    807 *                (Subsequent data buffers are on txq_sg_desc)
    808 * @len:          First data buffer's length, in bytes
    809 * @vlan_tci:     VLAN tag to insert in the packet (if requested
    810 *                by @V-bit).  Includes .1p and .1q tags
    811 * @hdr_len:      Length of packet headers, including
    812 *                encapsulating outer header, if applicable
    813 *                Valid for opcodes IONIC_TXQ_DESC_OPCODE_CALC_CSUM and
    814 *                IONIC_TXQ_DESC_OPCODE_TSO.  Should be set to zero for
    815 *                all other modes.  For
    816 *                IONIC_TXQ_DESC_OPCODE_CALC_CSUM, @hdr_len is length
    817 *                of headers up to inner-most L4 header.  For
    818 *                IONIC_TXQ_DESC_OPCODE_TSO, @hdr_len is up to
    819 *                inner-most L4 payload, so inclusive of
    820 *                inner-most L4 header.
    821 * @mss:          Desired MSS value for TSO; only applicable for
    822 *                IONIC_TXQ_DESC_OPCODE_TSO
    823 * @csum_start:   Offset from packet to first byte checked in L4 checksum
    824 * @csum_offset:  Offset from csum_start to L4 checksum field
    825 */
    826struct ionic_txq_desc {
    827	__le64  cmd;
    828#define IONIC_TXQ_DESC_OPCODE_MASK		0xf
    829#define IONIC_TXQ_DESC_OPCODE_SHIFT		4
    830#define IONIC_TXQ_DESC_FLAGS_MASK		0xf
    831#define IONIC_TXQ_DESC_FLAGS_SHIFT		0
    832#define IONIC_TXQ_DESC_NSGE_MASK		0xf
    833#define IONIC_TXQ_DESC_NSGE_SHIFT		8
    834#define IONIC_TXQ_DESC_ADDR_MASK		(BIT_ULL(IONIC_ADDR_LEN) - 1)
    835#define IONIC_TXQ_DESC_ADDR_SHIFT		12
    836
    837/* common flags */
    838#define IONIC_TXQ_DESC_FLAG_VLAN		0x1
    839#define IONIC_TXQ_DESC_FLAG_ENCAP		0x2
    840
    841/* flags for csum_hw opcode */
    842#define IONIC_TXQ_DESC_FLAG_CSUM_L3		0x4
    843#define IONIC_TXQ_DESC_FLAG_CSUM_L4		0x8
    844
    845/* flags for tso opcode */
    846#define IONIC_TXQ_DESC_FLAG_TSO_SOT		0x4
    847#define IONIC_TXQ_DESC_FLAG_TSO_EOT		0x8
    848
    849	__le16  len;
    850	union {
    851		__le16  vlan_tci;
    852		__le16  hword0;
    853	};
    854	union {
    855		__le16  csum_start;
    856		__le16  hdr_len;
    857		__le16  hword1;
    858	};
    859	union {
    860		__le16  csum_offset;
    861		__le16  mss;
    862		__le16  hword2;
    863	};
    864};
    865
    866static inline u64 encode_txq_desc_cmd(u8 opcode, u8 flags,
    867				      u8 nsge, u64 addr)
    868{
    869	u64 cmd;
    870
    871	cmd = (opcode & IONIC_TXQ_DESC_OPCODE_MASK) << IONIC_TXQ_DESC_OPCODE_SHIFT;
    872	cmd |= (flags & IONIC_TXQ_DESC_FLAGS_MASK) << IONIC_TXQ_DESC_FLAGS_SHIFT;
    873	cmd |= (nsge & IONIC_TXQ_DESC_NSGE_MASK) << IONIC_TXQ_DESC_NSGE_SHIFT;
    874	cmd |= (addr & IONIC_TXQ_DESC_ADDR_MASK) << IONIC_TXQ_DESC_ADDR_SHIFT;
    875
    876	return cmd;
    877};
    878
    879static inline void decode_txq_desc_cmd(u64 cmd, u8 *opcode, u8 *flags,
    880				       u8 *nsge, u64 *addr)
    881{
    882	*opcode = (cmd >> IONIC_TXQ_DESC_OPCODE_SHIFT) & IONIC_TXQ_DESC_OPCODE_MASK;
    883	*flags = (cmd >> IONIC_TXQ_DESC_FLAGS_SHIFT) & IONIC_TXQ_DESC_FLAGS_MASK;
    884	*nsge = (cmd >> IONIC_TXQ_DESC_NSGE_SHIFT) & IONIC_TXQ_DESC_NSGE_MASK;
    885	*addr = (cmd >> IONIC_TXQ_DESC_ADDR_SHIFT) & IONIC_TXQ_DESC_ADDR_MASK;
    886};
    887
    888/**
    889 * struct ionic_txq_sg_elem - Transmit scatter-gather (SG) descriptor element
    890 * @addr:      DMA address of SG element data buffer
    891 * @len:       Length of SG element data buffer, in bytes
    892 */
    893struct ionic_txq_sg_elem {
    894	__le64 addr;
    895	__le16 len;
    896	__le16 rsvd[3];
    897};
    898
    899/**
    900 * struct ionic_txq_sg_desc - Transmit scatter-gather (SG) list
    901 * @elems:     Scatter-gather elements
    902 */
    903struct ionic_txq_sg_desc {
    904#define IONIC_TX_MAX_SG_ELEMS		8
    905#define IONIC_TX_SG_DESC_STRIDE		8
    906	struct ionic_txq_sg_elem elems[IONIC_TX_MAX_SG_ELEMS];
    907};
    908
    909struct ionic_txq_sg_desc_v1 {
    910#define IONIC_TX_MAX_SG_ELEMS_V1		15
    911#define IONIC_TX_SG_DESC_STRIDE_V1		16
    912	struct ionic_txq_sg_elem elems[IONIC_TX_SG_DESC_STRIDE_V1];
    913};
    914
    915/**
    916 * struct ionic_txq_comp - Ethernet transmit queue completion descriptor
    917 * @status:     Status of the command (enum ionic_status_code)
    918 * @comp_index: Index in the descriptor ring for which this is the completion
    919 * @color:      Color bit
    920 */
    921struct ionic_txq_comp {
    922	u8     status;
    923	u8     rsvd;
    924	__le16 comp_index;
    925	u8     rsvd2[11];
    926	u8     color;
    927};
    928
    929enum ionic_rxq_desc_opcode {
    930	IONIC_RXQ_DESC_OPCODE_SIMPLE = 0,
    931	IONIC_RXQ_DESC_OPCODE_SG = 1,
    932};
    933
    934/**
    935 * struct ionic_rxq_desc - Ethernet Rx queue descriptor format
    936 * @opcode:       Rx operation, see IONIC_RXQ_DESC_OPCODE_*:
    937 *
    938 *                   IONIC_RXQ_DESC_OPCODE_SIMPLE:
    939 *                      Receive full packet into data buffer
    940 *                      starting at @addr.  Results of
    941 *                      receive, including actual bytes received,
    942 *                      are recorded in Rx completion descriptor.
    943 *
    944 * @len:          Data buffer's length, in bytes
    945 * @addr:         Data buffer's DMA address
    946 */
    947struct ionic_rxq_desc {
    948	u8     opcode;
    949	u8     rsvd[5];
    950	__le16 len;
    951	__le64 addr;
    952};
    953
    954/**
    955 * struct ionic_rxq_sg_elem - Receive scatter-gather (SG) descriptor element
    956 * @addr:      DMA address of SG element data buffer
    957 * @len:       Length of SG element data buffer, in bytes
    958 */
    959struct ionic_rxq_sg_elem {
    960	__le64 addr;
    961	__le16 len;
    962	__le16 rsvd[3];
    963};
    964
    965/**
    966 * struct ionic_rxq_sg_desc - Receive scatter-gather (SG) list
    967 * @elems:     Scatter-gather elements
    968 */
    969struct ionic_rxq_sg_desc {
    970#define IONIC_RX_MAX_SG_ELEMS		8
    971#define IONIC_RX_SG_DESC_STRIDE		8
    972	struct ionic_rxq_sg_elem elems[IONIC_RX_SG_DESC_STRIDE];
    973};
    974
    975/**
    976 * struct ionic_rxq_comp - Ethernet receive queue completion descriptor
    977 * @status:       Status of the command (enum ionic_status_code)
    978 * @num_sg_elems: Number of SG elements used by this descriptor
    979 * @comp_index:   Index in the descriptor ring for which this is the completion
    980 * @rss_hash:     32-bit RSS hash
    981 * @csum:         16-bit sum of the packet's L2 payload
    982 *                If the packet's L2 payload is odd length, an extra
    983 *                zero-value byte is included in the @csum calculation but
    984 *                not included in @len.
    985 * @vlan_tci:     VLAN tag stripped from the packet.  Valid if @VLAN is
    986 *                set.  Includes .1p and .1q tags.
    987 * @len:          Received packet length, in bytes.  Excludes FCS.
    988 * @csum_calc     L2 payload checksum is computed or not
    989 * @csum_flags:   See IONIC_RXQ_COMP_CSUM_F_*:
    990 *
    991 *                  IONIC_RXQ_COMP_CSUM_F_TCP_OK:
    992 *                    The TCP checksum calculated by the device
    993 *                    matched the checksum in the receive packet's
    994 *                    TCP header.
    995 *
    996 *                  IONIC_RXQ_COMP_CSUM_F_TCP_BAD:
    997 *                    The TCP checksum calculated by the device did
    998 *                    not match the checksum in the receive packet's
    999 *                    TCP header.
   1000 *
   1001 *                  IONIC_RXQ_COMP_CSUM_F_UDP_OK:
   1002 *                    The UDP checksum calculated by the device
   1003 *                    matched the checksum in the receive packet's
   1004 *                    UDP header
   1005 *
   1006 *                  IONIC_RXQ_COMP_CSUM_F_UDP_BAD:
   1007 *                    The UDP checksum calculated by the device did
   1008 *                    not match the checksum in the receive packet's
   1009 *                    UDP header.
   1010 *
   1011 *                  IONIC_RXQ_COMP_CSUM_F_IP_OK:
   1012 *                    The IPv4 checksum calculated by the device
   1013 *                    matched the checksum in the receive packet's
   1014 *                    first IPv4 header.  If the receive packet
   1015 *                    contains both a tunnel IPv4 header and a
   1016 *                    transport IPv4 header, the device validates the
   1017 *                    checksum for the both IPv4 headers.
   1018 *
   1019 *                  IONIC_RXQ_COMP_CSUM_F_IP_BAD:
   1020 *                    The IPv4 checksum calculated by the device did
   1021 *                    not match the checksum in the receive packet's
   1022 *                    first IPv4 header. If the receive packet
   1023 *                    contains both a tunnel IPv4 header and a
   1024 *                    transport IPv4 header, the device validates the
   1025 *                    checksum for both IP headers.
   1026 *
   1027 *                  IONIC_RXQ_COMP_CSUM_F_VLAN:
   1028 *                    The VLAN header was stripped and placed in @vlan_tci.
   1029 *
   1030 *                  IONIC_RXQ_COMP_CSUM_F_CALC:
   1031 *                    The checksum was calculated by the device.
   1032 *
   1033 * @pkt_type_color: Packet type and color bit; see IONIC_RXQ_COMP_PKT_TYPE_MASK
   1034 */
   1035struct ionic_rxq_comp {
   1036	u8     status;
   1037	u8     num_sg_elems;
   1038	__le16 comp_index;
   1039	__le32 rss_hash;
   1040	__le16 csum;
   1041	__le16 vlan_tci;
   1042	__le16 len;
   1043	u8     csum_flags;
   1044#define IONIC_RXQ_COMP_CSUM_F_TCP_OK	0x01
   1045#define IONIC_RXQ_COMP_CSUM_F_TCP_BAD	0x02
   1046#define IONIC_RXQ_COMP_CSUM_F_UDP_OK	0x04
   1047#define IONIC_RXQ_COMP_CSUM_F_UDP_BAD	0x08
   1048#define IONIC_RXQ_COMP_CSUM_F_IP_OK	0x10
   1049#define IONIC_RXQ_COMP_CSUM_F_IP_BAD	0x20
   1050#define IONIC_RXQ_COMP_CSUM_F_VLAN	0x40
   1051#define IONIC_RXQ_COMP_CSUM_F_CALC	0x80
   1052	u8     pkt_type_color;
   1053#define IONIC_RXQ_COMP_PKT_TYPE_MASK	0x7f
   1054};
   1055
   1056enum ionic_pkt_type {
   1057	IONIC_PKT_TYPE_NON_IP		= 0x00,
   1058	IONIC_PKT_TYPE_IPV4		= 0x01,
   1059	IONIC_PKT_TYPE_IPV4_TCP		= 0x03,
   1060	IONIC_PKT_TYPE_IPV4_UDP		= 0x05,
   1061	IONIC_PKT_TYPE_IPV6		= 0x08,
   1062	IONIC_PKT_TYPE_IPV6_TCP		= 0x18,
   1063	IONIC_PKT_TYPE_IPV6_UDP		= 0x28,
   1064	/* below types are only used if encap offloads are enabled on lif */
   1065	IONIC_PKT_TYPE_ENCAP_NON_IP	= 0x40,
   1066	IONIC_PKT_TYPE_ENCAP_IPV4	= 0x41,
   1067	IONIC_PKT_TYPE_ENCAP_IPV4_TCP	= 0x43,
   1068	IONIC_PKT_TYPE_ENCAP_IPV4_UDP	= 0x45,
   1069	IONIC_PKT_TYPE_ENCAP_IPV6	= 0x48,
   1070	IONIC_PKT_TYPE_ENCAP_IPV6_TCP	= 0x58,
   1071	IONIC_PKT_TYPE_ENCAP_IPV6_UDP	= 0x68,
   1072};
   1073
   1074enum ionic_eth_hw_features {
   1075	IONIC_ETH_HW_VLAN_TX_TAG	= BIT(0),
   1076	IONIC_ETH_HW_VLAN_RX_STRIP	= BIT(1),
   1077	IONIC_ETH_HW_VLAN_RX_FILTER	= BIT(2),
   1078	IONIC_ETH_HW_RX_HASH		= BIT(3),
   1079	IONIC_ETH_HW_RX_CSUM		= BIT(4),
   1080	IONIC_ETH_HW_TX_SG		= BIT(5),
   1081	IONIC_ETH_HW_RX_SG		= BIT(6),
   1082	IONIC_ETH_HW_TX_CSUM		= BIT(7),
   1083	IONIC_ETH_HW_TSO		= BIT(8),
   1084	IONIC_ETH_HW_TSO_IPV6		= BIT(9),
   1085	IONIC_ETH_HW_TSO_ECN		= BIT(10),
   1086	IONIC_ETH_HW_TSO_GRE		= BIT(11),
   1087	IONIC_ETH_HW_TSO_GRE_CSUM	= BIT(12),
   1088	IONIC_ETH_HW_TSO_IPXIP4		= BIT(13),
   1089	IONIC_ETH_HW_TSO_IPXIP6		= BIT(14),
   1090	IONIC_ETH_HW_TSO_UDP		= BIT(15),
   1091	IONIC_ETH_HW_TSO_UDP_CSUM	= BIT(16),
   1092	IONIC_ETH_HW_RX_CSUM_GENEVE	= BIT(17),
   1093	IONIC_ETH_HW_TX_CSUM_GENEVE	= BIT(18),
   1094	IONIC_ETH_HW_TSO_GENEVE		= BIT(19),
   1095	IONIC_ETH_HW_TIMESTAMP		= BIT(20),
   1096};
   1097
   1098/**
   1099 * enum ionic_pkt_class - Packet classification mask.
   1100 *
   1101 * Used with rx steering filter, packets indicated by the mask can be steered
   1102 * toward a specific receive queue.
   1103 *
   1104 * @IONIC_PKT_CLS_NTP_ALL:          All NTP packets.
   1105 * @IONIC_PKT_CLS_PTP1_SYNC:        PTPv1 sync
   1106 * @IONIC_PKT_CLS_PTP1_DREQ:        PTPv1 delay-request
   1107 * @IONIC_PKT_CLS_PTP1_ALL:         PTPv1 all packets
   1108 * @IONIC_PKT_CLS_PTP2_L4_SYNC:     PTPv2-UDP sync
   1109 * @IONIC_PKT_CLS_PTP2_L4_DREQ:     PTPv2-UDP delay-request
   1110 * @IONIC_PKT_CLS_PTP2_L4_ALL:      PTPv2-UDP all packets
   1111 * @IONIC_PKT_CLS_PTP2_L2_SYNC:     PTPv2-ETH sync
   1112 * @IONIC_PKT_CLS_PTP2_L2_DREQ:     PTPv2-ETH delay-request
   1113 * @IONIC_PKT_CLS_PTP2_L2_ALL:      PTPv2-ETH all packets
   1114 * @IONIC_PKT_CLS_PTP2_SYNC:        PTPv2 sync
   1115 * @IONIC_PKT_CLS_PTP2_DREQ:        PTPv2 delay-request
   1116 * @IONIC_PKT_CLS_PTP2_ALL:         PTPv2 all packets
   1117 * @IONIC_PKT_CLS_PTP_SYNC:         PTP sync
   1118 * @IONIC_PKT_CLS_PTP_DREQ:         PTP delay-request
   1119 * @IONIC_PKT_CLS_PTP_ALL:          PTP all packets
   1120 */
   1121enum ionic_pkt_class {
   1122	IONIC_PKT_CLS_NTP_ALL		= BIT(0),
   1123
   1124	IONIC_PKT_CLS_PTP1_SYNC		= BIT(1),
   1125	IONIC_PKT_CLS_PTP1_DREQ		= BIT(2),
   1126	IONIC_PKT_CLS_PTP1_ALL		= BIT(3) |
   1127		IONIC_PKT_CLS_PTP1_SYNC | IONIC_PKT_CLS_PTP1_DREQ,
   1128
   1129	IONIC_PKT_CLS_PTP2_L4_SYNC	= BIT(4),
   1130	IONIC_PKT_CLS_PTP2_L4_DREQ	= BIT(5),
   1131	IONIC_PKT_CLS_PTP2_L4_ALL	= BIT(6) |
   1132		IONIC_PKT_CLS_PTP2_L4_SYNC | IONIC_PKT_CLS_PTP2_L4_DREQ,
   1133
   1134	IONIC_PKT_CLS_PTP2_L2_SYNC	= BIT(7),
   1135	IONIC_PKT_CLS_PTP2_L2_DREQ	= BIT(8),
   1136	IONIC_PKT_CLS_PTP2_L2_ALL	= BIT(9) |
   1137		IONIC_PKT_CLS_PTP2_L2_SYNC | IONIC_PKT_CLS_PTP2_L2_DREQ,
   1138
   1139	IONIC_PKT_CLS_PTP2_SYNC		=
   1140		IONIC_PKT_CLS_PTP2_L4_SYNC | IONIC_PKT_CLS_PTP2_L2_SYNC,
   1141	IONIC_PKT_CLS_PTP2_DREQ		=
   1142		IONIC_PKT_CLS_PTP2_L4_DREQ | IONIC_PKT_CLS_PTP2_L2_DREQ,
   1143	IONIC_PKT_CLS_PTP2_ALL		=
   1144		IONIC_PKT_CLS_PTP2_L4_ALL | IONIC_PKT_CLS_PTP2_L2_ALL,
   1145
   1146	IONIC_PKT_CLS_PTP_SYNC		=
   1147		IONIC_PKT_CLS_PTP1_SYNC | IONIC_PKT_CLS_PTP2_SYNC,
   1148	IONIC_PKT_CLS_PTP_DREQ		=
   1149		IONIC_PKT_CLS_PTP1_DREQ | IONIC_PKT_CLS_PTP2_DREQ,
   1150	IONIC_PKT_CLS_PTP_ALL		=
   1151		IONIC_PKT_CLS_PTP1_ALL | IONIC_PKT_CLS_PTP2_ALL,
   1152};
   1153
   1154/**
   1155 * struct ionic_q_control_cmd - Queue control command
   1156 * @opcode:     opcode
   1157 * @type:       Queue type
   1158 * @lif_index:  LIF index
   1159 * @index:      Queue index
   1160 * @oper:       Operation (enum ionic_q_control_oper)
   1161 */
   1162struct ionic_q_control_cmd {
   1163	u8     opcode;
   1164	u8     type;
   1165	__le16 lif_index;
   1166	__le32 index;
   1167	u8     oper;
   1168	u8     rsvd[55];
   1169};
   1170
   1171typedef struct ionic_admin_comp ionic_q_control_comp;
   1172
   1173enum q_control_oper {
   1174	IONIC_Q_DISABLE		= 0,
   1175	IONIC_Q_ENABLE		= 1,
   1176	IONIC_Q_HANG_RESET	= 2,
   1177};
   1178
   1179/**
   1180 * enum ionic_phy_type - Physical connection type
   1181 * @IONIC_PHY_TYPE_NONE:    No PHY installed
   1182 * @IONIC_PHY_TYPE_COPPER:  Copper PHY
   1183 * @IONIC_PHY_TYPE_FIBER:   Fiber PHY
   1184 */
   1185enum ionic_phy_type {
   1186	IONIC_PHY_TYPE_NONE	= 0,
   1187	IONIC_PHY_TYPE_COPPER	= 1,
   1188	IONIC_PHY_TYPE_FIBER	= 2,
   1189};
   1190
   1191/**
   1192 * enum ionic_xcvr_state - Transceiver status
   1193 * @IONIC_XCVR_STATE_REMOVED:        Transceiver removed
   1194 * @IONIC_XCVR_STATE_INSERTED:       Transceiver inserted
   1195 * @IONIC_XCVR_STATE_PENDING:        Transceiver pending
   1196 * @IONIC_XCVR_STATE_SPROM_READ:     Transceiver data read
   1197 * @IONIC_XCVR_STATE_SPROM_READ_ERR: Transceiver data read error
   1198 */
   1199enum ionic_xcvr_state {
   1200	IONIC_XCVR_STATE_REMOVED	 = 0,
   1201	IONIC_XCVR_STATE_INSERTED	 = 1,
   1202	IONIC_XCVR_STATE_PENDING	 = 2,
   1203	IONIC_XCVR_STATE_SPROM_READ	 = 3,
   1204	IONIC_XCVR_STATE_SPROM_READ_ERR	 = 4,
   1205};
   1206
   1207/**
   1208 * enum ionic_xcvr_pid - Supported link modes
   1209 */
   1210enum ionic_xcvr_pid {
   1211	IONIC_XCVR_PID_UNKNOWN           = 0,
   1212
   1213	/* CU */
   1214	IONIC_XCVR_PID_QSFP_100G_CR4     = 1,
   1215	IONIC_XCVR_PID_QSFP_40GBASE_CR4  = 2,
   1216	IONIC_XCVR_PID_SFP_25GBASE_CR_S  = 3,
   1217	IONIC_XCVR_PID_SFP_25GBASE_CR_L  = 4,
   1218	IONIC_XCVR_PID_SFP_25GBASE_CR_N  = 5,
   1219
   1220	/* Fiber */
   1221	IONIC_XCVR_PID_QSFP_100G_AOC    = 50,
   1222	IONIC_XCVR_PID_QSFP_100G_ACC    = 51,
   1223	IONIC_XCVR_PID_QSFP_100G_SR4    = 52,
   1224	IONIC_XCVR_PID_QSFP_100G_LR4    = 53,
   1225	IONIC_XCVR_PID_QSFP_100G_ER4    = 54,
   1226	IONIC_XCVR_PID_QSFP_40GBASE_ER4 = 55,
   1227	IONIC_XCVR_PID_QSFP_40GBASE_SR4 = 56,
   1228	IONIC_XCVR_PID_QSFP_40GBASE_LR4 = 57,
   1229	IONIC_XCVR_PID_QSFP_40GBASE_AOC = 58,
   1230	IONIC_XCVR_PID_SFP_25GBASE_SR   = 59,
   1231	IONIC_XCVR_PID_SFP_25GBASE_LR   = 60,
   1232	IONIC_XCVR_PID_SFP_25GBASE_ER   = 61,
   1233	IONIC_XCVR_PID_SFP_25GBASE_AOC  = 62,
   1234	IONIC_XCVR_PID_SFP_10GBASE_SR   = 63,
   1235	IONIC_XCVR_PID_SFP_10GBASE_LR   = 64,
   1236	IONIC_XCVR_PID_SFP_10GBASE_LRM  = 65,
   1237	IONIC_XCVR_PID_SFP_10GBASE_ER   = 66,
   1238	IONIC_XCVR_PID_SFP_10GBASE_AOC  = 67,
   1239	IONIC_XCVR_PID_SFP_10GBASE_CU   = 68,
   1240	IONIC_XCVR_PID_QSFP_100G_CWDM4  = 69,
   1241	IONIC_XCVR_PID_QSFP_100G_PSM4   = 70,
   1242	IONIC_XCVR_PID_SFP_25GBASE_ACC  = 71,
   1243	IONIC_XCVR_PID_SFP_10GBASE_T    = 72,
   1244	IONIC_XCVR_PID_SFP_1000BASE_T   = 73,
   1245};
   1246
   1247/**
   1248 * enum ionic_port_type - Port types
   1249 * @IONIC_PORT_TYPE_NONE:           Port type not configured
   1250 * @IONIC_PORT_TYPE_ETH:            Port carries ethernet traffic (inband)
   1251 * @IONIC_PORT_TYPE_MGMT:           Port carries mgmt traffic (out-of-band)
   1252 */
   1253enum ionic_port_type {
   1254	IONIC_PORT_TYPE_NONE = 0,
   1255	IONIC_PORT_TYPE_ETH  = 1,
   1256	IONIC_PORT_TYPE_MGMT = 2,
   1257};
   1258
   1259/**
   1260 * enum ionic_port_admin_state - Port config state
   1261 * @IONIC_PORT_ADMIN_STATE_NONE:    Port admin state not configured
   1262 * @IONIC_PORT_ADMIN_STATE_DOWN:    Port admin disabled
   1263 * @IONIC_PORT_ADMIN_STATE_UP:      Port admin enabled
   1264 */
   1265enum ionic_port_admin_state {
   1266	IONIC_PORT_ADMIN_STATE_NONE = 0,
   1267	IONIC_PORT_ADMIN_STATE_DOWN = 1,
   1268	IONIC_PORT_ADMIN_STATE_UP   = 2,
   1269};
   1270
   1271/**
   1272 * enum ionic_port_oper_status - Port operational status
   1273 * @IONIC_PORT_OPER_STATUS_NONE:    Port disabled
   1274 * @IONIC_PORT_OPER_STATUS_UP:      Port link status up
   1275 * @IONIC_PORT_OPER_STATUS_DOWN:    Port link status down
   1276 */
   1277enum ionic_port_oper_status {
   1278	IONIC_PORT_OPER_STATUS_NONE  = 0,
   1279	IONIC_PORT_OPER_STATUS_UP    = 1,
   1280	IONIC_PORT_OPER_STATUS_DOWN  = 2,
   1281};
   1282
   1283/**
   1284 * enum ionic_port_fec_type - Ethernet Forward error correction (FEC) modes
   1285 * @IONIC_PORT_FEC_TYPE_NONE:       FEC Disabled
   1286 * @IONIC_PORT_FEC_TYPE_FC:         FireCode FEC
   1287 * @IONIC_PORT_FEC_TYPE_RS:         ReedSolomon FEC
   1288 */
   1289enum ionic_port_fec_type {
   1290	IONIC_PORT_FEC_TYPE_NONE = 0,
   1291	IONIC_PORT_FEC_TYPE_FC   = 1,
   1292	IONIC_PORT_FEC_TYPE_RS   = 2,
   1293};
   1294
   1295/**
   1296 * enum ionic_port_pause_type - Ethernet pause (flow control) modes
   1297 * @IONIC_PORT_PAUSE_TYPE_NONE:     Disable Pause
   1298 * @IONIC_PORT_PAUSE_TYPE_LINK:     Link level pause
   1299 * @IONIC_PORT_PAUSE_TYPE_PFC:      Priority-Flow Control
   1300 */
   1301enum ionic_port_pause_type {
   1302	IONIC_PORT_PAUSE_TYPE_NONE = 0,
   1303	IONIC_PORT_PAUSE_TYPE_LINK = 1,
   1304	IONIC_PORT_PAUSE_TYPE_PFC  = 2,
   1305};
   1306
   1307/**
   1308 * enum ionic_port_loopback_mode - Loopback modes
   1309 * @IONIC_PORT_LOOPBACK_MODE_NONE:  Disable loopback
   1310 * @IONIC_PORT_LOOPBACK_MODE_MAC:   MAC loopback
   1311 * @IONIC_PORT_LOOPBACK_MODE_PHY:   PHY/SerDes loopback
   1312 */
   1313enum ionic_port_loopback_mode {
   1314	IONIC_PORT_LOOPBACK_MODE_NONE = 0,
   1315	IONIC_PORT_LOOPBACK_MODE_MAC  = 1,
   1316	IONIC_PORT_LOOPBACK_MODE_PHY  = 2,
   1317};
   1318
   1319/**
   1320 * struct ionic_xcvr_status - Transceiver Status information
   1321 * @state:    Transceiver status (enum ionic_xcvr_state)
   1322 * @phy:      Physical connection type (enum ionic_phy_type)
   1323 * @pid:      Transceiver link mode (enum ionic_xcvr_pid)
   1324 * @sprom:    Transceiver sprom contents
   1325 */
   1326struct ionic_xcvr_status {
   1327	u8     state;
   1328	u8     phy;
   1329	__le16 pid;
   1330	u8     sprom[256];
   1331};
   1332
   1333/**
   1334 * union ionic_port_config - Port configuration
   1335 * @speed:              port speed (in Mbps)
   1336 * @mtu:                mtu
   1337 * @state:              port admin state (enum ionic_port_admin_state)
   1338 * @an_enable:          autoneg enable
   1339 * @fec_type:           fec type (enum ionic_port_fec_type)
   1340 * @pause_type:         pause type (enum ionic_port_pause_type)
   1341 * @loopback_mode:      loopback mode (enum ionic_port_loopback_mode)
   1342 */
   1343union ionic_port_config {
   1344	struct {
   1345#define IONIC_SPEED_100G	100000	/* 100G in Mbps */
   1346#define IONIC_SPEED_50G		50000	/* 50G in Mbps */
   1347#define IONIC_SPEED_40G		40000	/* 40G in Mbps */
   1348#define IONIC_SPEED_25G		25000	/* 25G in Mbps */
   1349#define IONIC_SPEED_10G		10000	/* 10G in Mbps */
   1350#define IONIC_SPEED_1G		1000	/* 1G in Mbps */
   1351		__le32 speed;
   1352		__le32 mtu;
   1353		u8     state;
   1354		u8     an_enable;
   1355		u8     fec_type;
   1356#define IONIC_PAUSE_TYPE_MASK		0x0f
   1357#define IONIC_PAUSE_FLAGS_MASK		0xf0
   1358#define IONIC_PAUSE_F_TX		0x10
   1359#define IONIC_PAUSE_F_RX		0x20
   1360		u8     pause_type;
   1361		u8     loopback_mode;
   1362	};
   1363	__le32 words[64];
   1364};
   1365
   1366/**
   1367 * struct ionic_port_status - Port Status information
   1368 * @status:             link status (enum ionic_port_oper_status)
   1369 * @id:                 port id
   1370 * @speed:              link speed (in Mbps)
   1371 * @link_down_count:    number of times link went from up to down
   1372 * @fec_type:           fec type (enum ionic_port_fec_type)
   1373 * @xcvr:               transceiver status
   1374 */
   1375struct ionic_port_status {
   1376	__le32 id;
   1377	__le32 speed;
   1378	u8     status;
   1379	__le16 link_down_count;
   1380	u8     fec_type;
   1381	u8     rsvd[48];
   1382	struct ionic_xcvr_status  xcvr;
   1383} __packed;
   1384
   1385/**
   1386 * struct ionic_port_identify_cmd - Port identify command
   1387 * @opcode:     opcode
   1388 * @index:      port index
   1389 * @ver:        Highest version of identify supported by driver
   1390 */
   1391struct ionic_port_identify_cmd {
   1392	u8 opcode;
   1393	u8 index;
   1394	u8 ver;
   1395	u8 rsvd[61];
   1396};
   1397
   1398/**
   1399 * struct ionic_port_identify_comp - Port identify command completion
   1400 * @status: Status of the command (enum ionic_status_code)
   1401 * @ver:    Version of identify returned by device
   1402 */
   1403struct ionic_port_identify_comp {
   1404	u8 status;
   1405	u8 ver;
   1406	u8 rsvd[14];
   1407};
   1408
   1409/**
   1410 * struct ionic_port_init_cmd - Port initialization command
   1411 * @opcode:     opcode
   1412 * @index:      port index
   1413 * @info_pa:    destination address for port info (struct ionic_port_info)
   1414 */
   1415struct ionic_port_init_cmd {
   1416	u8     opcode;
   1417	u8     index;
   1418	u8     rsvd[6];
   1419	__le64 info_pa;
   1420	u8     rsvd2[48];
   1421};
   1422
   1423/**
   1424 * struct ionic_port_init_comp - Port initialization command completion
   1425 * @status: Status of the command (enum ionic_status_code)
   1426 */
   1427struct ionic_port_init_comp {
   1428	u8 status;
   1429	u8 rsvd[15];
   1430};
   1431
   1432/**
   1433 * struct ionic_port_reset_cmd - Port reset command
   1434 * @opcode:     opcode
   1435 * @index:      port index
   1436 */
   1437struct ionic_port_reset_cmd {
   1438	u8 opcode;
   1439	u8 index;
   1440	u8 rsvd[62];
   1441};
   1442
   1443/**
   1444 * struct ionic_port_reset_comp - Port reset command completion
   1445 * @status: Status of the command (enum ionic_status_code)
   1446 */
   1447struct ionic_port_reset_comp {
   1448	u8 status;
   1449	u8 rsvd[15];
   1450};
   1451
   1452/**
   1453 * enum ionic_stats_ctl_cmd - List of commands for stats control
   1454 * @IONIC_STATS_CTL_RESET:      Reset statistics
   1455 */
   1456enum ionic_stats_ctl_cmd {
   1457	IONIC_STATS_CTL_RESET		= 0,
   1458};
   1459
   1460/**
   1461 * enum ionic_txstamp_mode - List of TX Timestamping Modes
   1462 * @IONIC_TXSTAMP_OFF:           Disable TX hardware timetamping.
   1463 * @IONIC_TXSTAMP_ON:            Enable local TX hardware timetamping.
   1464 * @IONIC_TXSTAMP_ONESTEP_SYNC:  Modify TX PTP Sync packets.
   1465 * @IONIC_TXSTAMP_ONESTEP_P2P:   Modify TX PTP Sync and PDelayResp.
   1466 */
   1467enum ionic_txstamp_mode {
   1468	IONIC_TXSTAMP_OFF		= 0,
   1469	IONIC_TXSTAMP_ON		= 1,
   1470	IONIC_TXSTAMP_ONESTEP_SYNC	= 2,
   1471	IONIC_TXSTAMP_ONESTEP_P2P	= 3,
   1472};
   1473
   1474/**
   1475 * enum ionic_port_attr - List of device attributes
   1476 * @IONIC_PORT_ATTR_STATE:      Port state attribute
   1477 * @IONIC_PORT_ATTR_SPEED:      Port speed attribute
   1478 * @IONIC_PORT_ATTR_MTU:        Port MTU attribute
   1479 * @IONIC_PORT_ATTR_AUTONEG:    Port autonegotiation attribute
   1480 * @IONIC_PORT_ATTR_FEC:        Port FEC attribute
   1481 * @IONIC_PORT_ATTR_PAUSE:      Port pause attribute
   1482 * @IONIC_PORT_ATTR_LOOPBACK:   Port loopback attribute
   1483 * @IONIC_PORT_ATTR_STATS_CTRL: Port statistics control attribute
   1484 */
   1485enum ionic_port_attr {
   1486	IONIC_PORT_ATTR_STATE		= 0,
   1487	IONIC_PORT_ATTR_SPEED		= 1,
   1488	IONIC_PORT_ATTR_MTU		= 2,
   1489	IONIC_PORT_ATTR_AUTONEG		= 3,
   1490	IONIC_PORT_ATTR_FEC		= 4,
   1491	IONIC_PORT_ATTR_PAUSE		= 5,
   1492	IONIC_PORT_ATTR_LOOPBACK	= 6,
   1493	IONIC_PORT_ATTR_STATS_CTRL	= 7,
   1494};
   1495
   1496/**
   1497 * struct ionic_port_setattr_cmd - Set port attributes on the NIC
   1498 * @opcode:         Opcode
   1499 * @index:          Port index
   1500 * @attr:           Attribute type (enum ionic_port_attr)
   1501 * @state:          Port state
   1502 * @speed:          Port speed
   1503 * @mtu:            Port MTU
   1504 * @an_enable:      Port autonegotiation setting
   1505 * @fec_type:       Port FEC type setting
   1506 * @pause_type:     Port pause type setting
   1507 * @loopback_mode:  Port loopback mode
   1508 * @stats_ctl:      Port stats setting
   1509 */
   1510struct ionic_port_setattr_cmd {
   1511	u8     opcode;
   1512	u8     index;
   1513	u8     attr;
   1514	u8     rsvd;
   1515	union {
   1516		u8      state;
   1517		__le32  speed;
   1518		__le32  mtu;
   1519		u8      an_enable;
   1520		u8      fec_type;
   1521		u8      pause_type;
   1522		u8      loopback_mode;
   1523		u8      stats_ctl;
   1524		u8      rsvd2[60];
   1525	};
   1526};
   1527
   1528/**
   1529 * struct ionic_port_setattr_comp - Port set attr command completion
   1530 * @status:     Status of the command (enum ionic_status_code)
   1531 * @color:      Color bit
   1532 */
   1533struct ionic_port_setattr_comp {
   1534	u8     status;
   1535	u8     rsvd[14];
   1536	u8     color;
   1537};
   1538
   1539/**
   1540 * struct ionic_port_getattr_cmd - Get port attributes from the NIC
   1541 * @opcode:     Opcode
   1542 * @index:      port index
   1543 * @attr:       Attribute type (enum ionic_port_attr)
   1544 */
   1545struct ionic_port_getattr_cmd {
   1546	u8     opcode;
   1547	u8     index;
   1548	u8     attr;
   1549	u8     rsvd[61];
   1550};
   1551
   1552/**
   1553 * struct ionic_port_getattr_comp - Port get attr command completion
   1554 * @status:         Status of the command (enum ionic_status_code)
   1555 * @state:          Port state
   1556 * @speed:          Port speed
   1557 * @mtu:            Port MTU
   1558 * @an_enable:      Port autonegotiation setting
   1559 * @fec_type:       Port FEC type setting
   1560 * @pause_type:     Port pause type setting
   1561 * @loopback_mode:  Port loopback mode
   1562 * @color:          Color bit
   1563 */
   1564struct ionic_port_getattr_comp {
   1565	u8     status;
   1566	u8     rsvd[3];
   1567	union {
   1568		u8      state;
   1569		__le32  speed;
   1570		__le32  mtu;
   1571		u8      an_enable;
   1572		u8      fec_type;
   1573		u8      pause_type;
   1574		u8      loopback_mode;
   1575		u8      rsvd2[11];
   1576	} __packed;
   1577	u8     color;
   1578};
   1579
   1580/**
   1581 * struct ionic_lif_status - LIF status register
   1582 * @eid:             most recent NotifyQ event id
   1583 * @port_num:        port the LIF is connected to
   1584 * @link_status:     port status (enum ionic_port_oper_status)
   1585 * @link_speed:      speed of link in Mbps
   1586 * @link_down_count: number of times link went from up to down
   1587 */
   1588struct ionic_lif_status {
   1589	__le64 eid;
   1590	u8     port_num;
   1591	u8     rsvd;
   1592	__le16 link_status;
   1593	__le32 link_speed;		/* units of 1Mbps: eg 10000 = 10Gbps */
   1594	__le16 link_down_count;
   1595	u8      rsvd2[46];
   1596};
   1597
   1598/**
   1599 * struct ionic_lif_reset_cmd - LIF reset command
   1600 * @opcode:    opcode
   1601 * @index:     LIF index
   1602 */
   1603struct ionic_lif_reset_cmd {
   1604	u8     opcode;
   1605	u8     rsvd;
   1606	__le16 index;
   1607	__le32 rsvd2[15];
   1608};
   1609
   1610typedef struct ionic_admin_comp ionic_lif_reset_comp;
   1611
   1612enum ionic_dev_state {
   1613	IONIC_DEV_DISABLE	= 0,
   1614	IONIC_DEV_ENABLE	= 1,
   1615	IONIC_DEV_HANG_RESET	= 2,
   1616};
   1617
   1618/**
   1619 * enum ionic_dev_attr - List of device attributes
   1620 * @IONIC_DEV_ATTR_STATE:     Device state attribute
   1621 * @IONIC_DEV_ATTR_NAME:      Device name attribute
   1622 * @IONIC_DEV_ATTR_FEATURES:  Device feature attributes
   1623 */
   1624enum ionic_dev_attr {
   1625	IONIC_DEV_ATTR_STATE    = 0,
   1626	IONIC_DEV_ATTR_NAME     = 1,
   1627	IONIC_DEV_ATTR_FEATURES = 2,
   1628};
   1629
   1630/**
   1631 * struct ionic_dev_setattr_cmd - Set Device attributes on the NIC
   1632 * @opcode:     Opcode
   1633 * @attr:       Attribute type (enum ionic_dev_attr)
   1634 * @state:      Device state (enum ionic_dev_state)
   1635 * @name:       The bus info, e.g. PCI slot-device-function, 0 terminated
   1636 * @features:   Device features
   1637 */
   1638struct ionic_dev_setattr_cmd {
   1639	u8     opcode;
   1640	u8     attr;
   1641	__le16 rsvd;
   1642	union {
   1643		u8      state;
   1644		char    name[IONIC_IFNAMSIZ];
   1645		__le64  features;
   1646		u8      rsvd2[60];
   1647	} __packed;
   1648};
   1649
   1650/**
   1651 * struct ionic_dev_setattr_comp - Device set attr command completion
   1652 * @status:     Status of the command (enum ionic_status_code)
   1653 * @features:   Device features
   1654 * @color:      Color bit
   1655 */
   1656struct ionic_dev_setattr_comp {
   1657	u8     status;
   1658	u8     rsvd[3];
   1659	union {
   1660		__le64  features;
   1661		u8      rsvd2[11];
   1662	} __packed;
   1663	u8     color;
   1664};
   1665
   1666/**
   1667 * struct ionic_dev_getattr_cmd - Get Device attributes from the NIC
   1668 * @opcode:     opcode
   1669 * @attr:       Attribute type (enum ionic_dev_attr)
   1670 */
   1671struct ionic_dev_getattr_cmd {
   1672	u8     opcode;
   1673	u8     attr;
   1674	u8     rsvd[62];
   1675};
   1676
   1677/**
   1678 * struct ionic_dev_setattr_comp - Device set attr command completion
   1679 * @status:     Status of the command (enum ionic_status_code)
   1680 * @features:   Device features
   1681 * @color:      Color bit
   1682 */
   1683struct ionic_dev_getattr_comp {
   1684	u8     status;
   1685	u8     rsvd[3];
   1686	union {
   1687		__le64  features;
   1688		u8      rsvd2[11];
   1689	} __packed;
   1690	u8     color;
   1691};
   1692
   1693/**
   1694 * RSS parameters
   1695 */
   1696#define IONIC_RSS_HASH_KEY_SIZE		40
   1697
   1698enum ionic_rss_hash_types {
   1699	IONIC_RSS_TYPE_IPV4	= BIT(0),
   1700	IONIC_RSS_TYPE_IPV4_TCP	= BIT(1),
   1701	IONIC_RSS_TYPE_IPV4_UDP	= BIT(2),
   1702	IONIC_RSS_TYPE_IPV6	= BIT(3),
   1703	IONIC_RSS_TYPE_IPV6_TCP	= BIT(4),
   1704	IONIC_RSS_TYPE_IPV6_UDP	= BIT(5),
   1705};
   1706
   1707/**
   1708 * enum ionic_lif_attr - List of LIF attributes
   1709 * @IONIC_LIF_ATTR_STATE:       LIF state attribute
   1710 * @IONIC_LIF_ATTR_NAME:        LIF name attribute
   1711 * @IONIC_LIF_ATTR_MTU:         LIF MTU attribute
   1712 * @IONIC_LIF_ATTR_MAC:         LIF MAC attribute
   1713 * @IONIC_LIF_ATTR_FEATURES:    LIF features attribute
   1714 * @IONIC_LIF_ATTR_RSS:         LIF RSS attribute
   1715 * @IONIC_LIF_ATTR_STATS_CTRL:  LIF statistics control attribute
   1716 * @IONIC_LIF_ATTR_TXSTAMP:     LIF TX timestamping mode
   1717 */
   1718enum ionic_lif_attr {
   1719	IONIC_LIF_ATTR_STATE        = 0,
   1720	IONIC_LIF_ATTR_NAME         = 1,
   1721	IONIC_LIF_ATTR_MTU          = 2,
   1722	IONIC_LIF_ATTR_MAC          = 3,
   1723	IONIC_LIF_ATTR_FEATURES     = 4,
   1724	IONIC_LIF_ATTR_RSS          = 5,
   1725	IONIC_LIF_ATTR_STATS_CTRL   = 6,
   1726	IONIC_LIF_ATTR_TXSTAMP      = 7,
   1727};
   1728
   1729/**
   1730 * struct ionic_lif_setattr_cmd - Set LIF attributes on the NIC
   1731 * @opcode:     Opcode
   1732 * @attr:       Attribute type (enum ionic_lif_attr)
   1733 * @index:      LIF index
   1734 * @state:      LIF state (enum ionic_lif_state)
   1735 * @name:       The netdev name string, 0 terminated
   1736 * @mtu:        Mtu
   1737 * @mac:        Station mac
   1738 * @features:   Features (enum ionic_eth_hw_features)
   1739 * @rss:        RSS properties
   1740 *              @types:     The hash types to enable (see rss_hash_types)
   1741 *              @key:       The hash secret key
   1742 *              @addr:      Address for the indirection table shared memory
   1743 * @stats_ctl:  stats control commands (enum ionic_stats_ctl_cmd)
   1744 * @txstamp:    TX Timestamping Mode (enum ionic_txstamp_mode)
   1745 */
   1746struct ionic_lif_setattr_cmd {
   1747	u8     opcode;
   1748	u8     attr;
   1749	__le16 index;
   1750	union {
   1751		u8      state;
   1752		char    name[IONIC_IFNAMSIZ];
   1753		__le32  mtu;
   1754		u8      mac[6];
   1755		__le64  features;
   1756		struct {
   1757			__le16 types;
   1758			u8     key[IONIC_RSS_HASH_KEY_SIZE];
   1759			u8     rsvd[6];
   1760			__le64 addr;
   1761		} rss;
   1762		u8      stats_ctl;
   1763		__le16 txstamp_mode;
   1764		u8      rsvd[60];
   1765	} __packed;
   1766};
   1767
   1768/**
   1769 * struct ionic_lif_setattr_comp - LIF set attr command completion
   1770 * @status:     Status of the command (enum ionic_status_code)
   1771 * @comp_index: Index in the descriptor ring for which this is the completion
   1772 * @features:   features (enum ionic_eth_hw_features)
   1773 * @color:      Color bit
   1774 */
   1775struct ionic_lif_setattr_comp {
   1776	u8     status;
   1777	u8     rsvd;
   1778	__le16 comp_index;
   1779	union {
   1780		__le64  features;
   1781		u8      rsvd2[11];
   1782	} __packed;
   1783	u8     color;
   1784};
   1785
   1786/**
   1787 * struct ionic_lif_getattr_cmd - Get LIF attributes from the NIC
   1788 * @opcode:     Opcode
   1789 * @attr:       Attribute type (enum ionic_lif_attr)
   1790 * @index:      LIF index
   1791 */
   1792struct ionic_lif_getattr_cmd {
   1793	u8     opcode;
   1794	u8     attr;
   1795	__le16 index;
   1796	u8     rsvd[60];
   1797};
   1798
   1799/**
   1800 * struct ionic_lif_getattr_comp - LIF get attr command completion
   1801 * @status:     Status of the command (enum ionic_status_code)
   1802 * @comp_index: Index in the descriptor ring for which this is the completion
   1803 * @state:      LIF state (enum ionic_lif_state)
   1804 * @name:       The netdev name string, 0 terminated
   1805 * @mtu:        Mtu
   1806 * @mac:        Station mac
   1807 * @features:   Features (enum ionic_eth_hw_features)
   1808 * @txstamp:    TX Timestamping Mode (enum ionic_txstamp_mode)
   1809 * @color:      Color bit
   1810 */
   1811struct ionic_lif_getattr_comp {
   1812	u8     status;
   1813	u8     rsvd;
   1814	__le16 comp_index;
   1815	union {
   1816		u8      state;
   1817		__le32  mtu;
   1818		u8      mac[6];
   1819		__le64  features;
   1820		__le16  txstamp_mode;
   1821		u8      rsvd2[11];
   1822	} __packed;
   1823	u8     color;
   1824};
   1825
   1826/**
   1827 * struct ionic_lif_setphc_cmd - Set LIF PTP Hardware Clock
   1828 * @opcode:     Opcode
   1829 * @lif_index:  LIF index
   1830 * @tick:       Hardware stamp tick of an instant in time.
   1831 * @nsec:       Nanosecond stamp of the same instant.
   1832 * @frac:       Fractional nanoseconds at the same instant.
   1833 * @mult:       Cycle to nanosecond multiplier.
   1834 * @shift:      Cycle to nanosecond divisor (power of two).
   1835 */
   1836struct ionic_lif_setphc_cmd {
   1837	u8	opcode;
   1838	u8	rsvd1;
   1839	__le16  lif_index;
   1840	u8      rsvd2[4];
   1841	__le64	tick;
   1842	__le64	nsec;
   1843	__le64	frac;
   1844	__le32	mult;
   1845	__le32	shift;
   1846	u8     rsvd3[24];
   1847};
   1848
   1849enum ionic_rx_mode {
   1850	IONIC_RX_MODE_F_UNICAST		= BIT(0),
   1851	IONIC_RX_MODE_F_MULTICAST	= BIT(1),
   1852	IONIC_RX_MODE_F_BROADCAST	= BIT(2),
   1853	IONIC_RX_MODE_F_PROMISC		= BIT(3),
   1854	IONIC_RX_MODE_F_ALLMULTI	= BIT(4),
   1855	IONIC_RX_MODE_F_RDMA_SNIFFER	= BIT(5),
   1856};
   1857
   1858/**
   1859 * struct ionic_rx_mode_set_cmd - Set LIF's Rx mode command
   1860 * @opcode:     opcode
   1861 * @lif_index:  LIF index
   1862 * @rx_mode:    Rx mode flags:
   1863 *                  IONIC_RX_MODE_F_UNICAST: Accept known unicast packets
   1864 *                  IONIC_RX_MODE_F_MULTICAST: Accept known multicast packets
   1865 *                  IONIC_RX_MODE_F_BROADCAST: Accept broadcast packets
   1866 *                  IONIC_RX_MODE_F_PROMISC: Accept any packets
   1867 *                  IONIC_RX_MODE_F_ALLMULTI: Accept any multicast packets
   1868 *                  IONIC_RX_MODE_F_RDMA_SNIFFER: Sniff RDMA packets
   1869 */
   1870struct ionic_rx_mode_set_cmd {
   1871	u8     opcode;
   1872	u8     rsvd;
   1873	__le16 lif_index;
   1874	__le16 rx_mode;
   1875	__le16 rsvd2[29];
   1876};
   1877
   1878typedef struct ionic_admin_comp ionic_rx_mode_set_comp;
   1879
   1880enum ionic_rx_filter_match_type {
   1881	IONIC_RX_FILTER_MATCH_VLAN	= 0x0,
   1882	IONIC_RX_FILTER_MATCH_MAC	= 0x1,
   1883	IONIC_RX_FILTER_MATCH_MAC_VLAN	= 0x2,
   1884	IONIC_RX_FILTER_STEER_PKTCLASS	= 0x10,
   1885};
   1886
   1887/**
   1888 * struct ionic_rx_filter_add_cmd - Add LIF Rx filter command
   1889 * @opcode:     opcode
   1890 * @qtype:      Queue type
   1891 * @lif_index:  LIF index
   1892 * @qid:        Queue ID
   1893 * @match:      Rx filter match type (see IONIC_RX_FILTER_MATCH_xxx)
   1894 * @vlan:       VLAN filter
   1895 *              @vlan:  VLAN ID
   1896 * @mac:        MAC filter
   1897 *              @addr:  MAC address (network-byte order)
   1898 * @mac_vlan:   MACVLAN filter
   1899 *              @vlan:  VLAN ID
   1900 *              @addr:  MAC address (network-byte order)
   1901 * @pkt_class:  Packet classification filter
   1902 */
   1903struct ionic_rx_filter_add_cmd {
   1904	u8     opcode;
   1905	u8     qtype;
   1906	__le16 lif_index;
   1907	__le32 qid;
   1908	__le16 match;
   1909	union {
   1910		struct {
   1911			__le16 vlan;
   1912		} vlan;
   1913		struct {
   1914			u8     addr[6];
   1915		} mac;
   1916		struct {
   1917			__le16 vlan;
   1918			u8     addr[6];
   1919		} mac_vlan;
   1920		__le64 pkt_class;
   1921		u8 rsvd[54];
   1922	} __packed;
   1923};
   1924
   1925/**
   1926 * struct ionic_rx_filter_add_comp - Add LIF Rx filter command completion
   1927 * @status:     Status of the command (enum ionic_status_code)
   1928 * @comp_index: Index in the descriptor ring for which this is the completion
   1929 * @filter_id:  Filter ID
   1930 * @color:      Color bit
   1931 */
   1932struct ionic_rx_filter_add_comp {
   1933	u8     status;
   1934	u8     rsvd;
   1935	__le16 comp_index;
   1936	__le32 filter_id;
   1937	u8     rsvd2[7];
   1938	u8     color;
   1939};
   1940
   1941/**
   1942 * struct ionic_rx_filter_del_cmd - Delete LIF Rx filter command
   1943 * @opcode:     opcode
   1944 * @lif_index:  LIF index
   1945 * @filter_id:  Filter ID
   1946 */
   1947struct ionic_rx_filter_del_cmd {
   1948	u8     opcode;
   1949	u8     rsvd;
   1950	__le16 lif_index;
   1951	__le32 filter_id;
   1952	u8     rsvd2[56];
   1953};
   1954
   1955typedef struct ionic_admin_comp ionic_rx_filter_del_comp;
   1956
   1957enum ionic_vf_attr {
   1958	IONIC_VF_ATTR_SPOOFCHK	= 1,
   1959	IONIC_VF_ATTR_TRUST	= 2,
   1960	IONIC_VF_ATTR_MAC	= 3,
   1961	IONIC_VF_ATTR_LINKSTATE	= 4,
   1962	IONIC_VF_ATTR_VLAN	= 5,
   1963	IONIC_VF_ATTR_RATE	= 6,
   1964	IONIC_VF_ATTR_STATSADDR	= 7,
   1965};
   1966
   1967/**
   1968 * enum ionic_vf_link_status - Virtual Function link status
   1969 * @IONIC_VF_LINK_STATUS_AUTO:   Use link state of the uplink
   1970 * @IONIC_VF_LINK_STATUS_UP:     Link always up
   1971 * @IONIC_VF_LINK_STATUS_DOWN:   Link always down
   1972 */
   1973enum ionic_vf_link_status {
   1974	IONIC_VF_LINK_STATUS_AUTO = 0,
   1975	IONIC_VF_LINK_STATUS_UP   = 1,
   1976	IONIC_VF_LINK_STATUS_DOWN = 2,
   1977};
   1978
   1979/**
   1980 * struct ionic_vf_setattr_cmd - Set VF attributes on the NIC
   1981 * @opcode:     Opcode
   1982 * @attr:       Attribute type (enum ionic_vf_attr)
   1983 * @vf_index:   VF index
   1984 *	@macaddr:	mac address
   1985 *	@vlanid:	vlan ID
   1986 *	@maxrate:	max Tx rate in Mbps
   1987 *	@spoofchk:	enable address spoof checking
   1988 *	@trust:		enable VF trust
   1989 *	@linkstate:	set link up or down
   1990 *	@stats_pa:	set DMA address for VF stats
   1991 */
   1992struct ionic_vf_setattr_cmd {
   1993	u8     opcode;
   1994	u8     attr;
   1995	__le16 vf_index;
   1996	union {
   1997		u8     macaddr[6];
   1998		__le16 vlanid;
   1999		__le32 maxrate;
   2000		u8     spoofchk;
   2001		u8     trust;
   2002		u8     linkstate;
   2003		__le64 stats_pa;
   2004		u8     pad[60];
   2005	} __packed;
   2006};
   2007
   2008struct ionic_vf_setattr_comp {
   2009	u8     status;
   2010	u8     attr;
   2011	__le16 vf_index;
   2012	__le16 comp_index;
   2013	u8     rsvd[9];
   2014	u8     color;
   2015};
   2016
   2017/**
   2018 * struct ionic_vf_getattr_cmd - Get VF attributes from the NIC
   2019 * @opcode:     Opcode
   2020 * @attr:       Attribute type (enum ionic_vf_attr)
   2021 * @vf_index:   VF index
   2022 */
   2023struct ionic_vf_getattr_cmd {
   2024	u8     opcode;
   2025	u8     attr;
   2026	__le16 vf_index;
   2027	u8     rsvd[60];
   2028};
   2029
   2030struct ionic_vf_getattr_comp {
   2031	u8     status;
   2032	u8     attr;
   2033	__le16 vf_index;
   2034	union {
   2035		u8     macaddr[6];
   2036		__le16 vlanid;
   2037		__le32 maxrate;
   2038		u8     spoofchk;
   2039		u8     trust;
   2040		u8     linkstate;
   2041		__le64 stats_pa;
   2042		u8     pad[11];
   2043	} __packed;
   2044	u8     color;
   2045};
   2046
   2047/**
   2048 * struct ionic_qos_identify_cmd - QoS identify command
   2049 * @opcode:  opcode
   2050 * @ver:     Highest version of identify supported by driver
   2051 *
   2052 */
   2053struct ionic_qos_identify_cmd {
   2054	u8 opcode;
   2055	u8 ver;
   2056	u8 rsvd[62];
   2057};
   2058
   2059/**
   2060 * struct ionic_qos_identify_comp - QoS identify command completion
   2061 * @status: Status of the command (enum ionic_status_code)
   2062 * @ver:    Version of identify returned by device
   2063 */
   2064struct ionic_qos_identify_comp {
   2065	u8 status;
   2066	u8 ver;
   2067	u8 rsvd[14];
   2068};
   2069
   2070#define IONIC_QOS_TC_MAX		8
   2071#define IONIC_QOS_ALL_TC		0xFF
   2072/* Capri max supported, should be renamed. */
   2073#define IONIC_QOS_CLASS_MAX		7
   2074#define IONIC_QOS_PCP_MAX		8
   2075#define IONIC_QOS_CLASS_NAME_SZ	32
   2076#define IONIC_QOS_DSCP_MAX		64
   2077#define IONIC_QOS_ALL_PCP		0xFF
   2078#define IONIC_DSCP_BLOCK_SIZE		8
   2079
   2080/**
   2081 * enum ionic_qos_class
   2082 */
   2083enum ionic_qos_class {
   2084	IONIC_QOS_CLASS_DEFAULT		= 0,
   2085	IONIC_QOS_CLASS_USER_DEFINED_1	= 1,
   2086	IONIC_QOS_CLASS_USER_DEFINED_2	= 2,
   2087	IONIC_QOS_CLASS_USER_DEFINED_3	= 3,
   2088	IONIC_QOS_CLASS_USER_DEFINED_4	= 4,
   2089	IONIC_QOS_CLASS_USER_DEFINED_5	= 5,
   2090	IONIC_QOS_CLASS_USER_DEFINED_6	= 6,
   2091};
   2092
   2093/**
   2094 * enum ionic_qos_class_type - Traffic classification criteria
   2095 * @IONIC_QOS_CLASS_TYPE_NONE:    No QoS
   2096 * @IONIC_QOS_CLASS_TYPE_PCP:     Dot1Q PCP
   2097 * @IONIC_QOS_CLASS_TYPE_DSCP:    IP DSCP
   2098 */
   2099enum ionic_qos_class_type {
   2100	IONIC_QOS_CLASS_TYPE_NONE	= 0,
   2101	IONIC_QOS_CLASS_TYPE_PCP	= 1,
   2102	IONIC_QOS_CLASS_TYPE_DSCP	= 2,
   2103};
   2104
   2105/**
   2106 * enum ionic_qos_sched_type - QoS class scheduling type
   2107 * @IONIC_QOS_SCHED_TYPE_STRICT:  Strict priority
   2108 * @IONIC_QOS_SCHED_TYPE_DWRR:    Deficit weighted round-robin
   2109 */
   2110enum ionic_qos_sched_type {
   2111	IONIC_QOS_SCHED_TYPE_STRICT	= 0,
   2112	IONIC_QOS_SCHED_TYPE_DWRR	= 1,
   2113};
   2114
   2115/**
   2116 * union ionic_qos_config - QoS configuration structure
   2117 * @flags:		Configuration flags
   2118 *	IONIC_QOS_CONFIG_F_ENABLE		enable
   2119 *	IONIC_QOS_CONFIG_F_NO_DROP		drop/nodrop
   2120 *	IONIC_QOS_CONFIG_F_RW_DOT1Q_PCP		enable dot1q pcp rewrite
   2121 *	IONIC_QOS_CONFIG_F_RW_IP_DSCP		enable ip dscp rewrite
   2122 *	IONIC_QOS_CONFIG_F_NON_DISRUPTIVE	Non-disruptive TC update
   2123 * @sched_type:		QoS class scheduling type (enum ionic_qos_sched_type)
   2124 * @class_type:		QoS class type (enum ionic_qos_class_type)
   2125 * @pause_type:		QoS pause type (enum ionic_qos_pause_type)
   2126 * @name:		QoS class name
   2127 * @mtu:		MTU of the class
   2128 * @pfc_cos:		Priority-Flow Control class of service
   2129 * @dwrr_weight:	QoS class scheduling weight
   2130 * @strict_rlmt:	Rate limit for strict priority scheduling
   2131 * @rw_dot1q_pcp:	Rewrite dot1q pcp to value (valid iff F_RW_DOT1Q_PCP)
   2132 * @rw_ip_dscp:		Rewrite ip dscp to value (valid iff F_RW_IP_DSCP)
   2133 * @dot1q_pcp:		Dot1q pcp value
   2134 * @ndscp:		Number of valid dscp values in the ip_dscp field
   2135 * @ip_dscp:		IP dscp values
   2136 */
   2137union ionic_qos_config {
   2138	struct {
   2139#define IONIC_QOS_CONFIG_F_ENABLE		BIT(0)
   2140#define IONIC_QOS_CONFIG_F_NO_DROP		BIT(1)
   2141/* Used to rewrite PCP or DSCP value. */
   2142#define IONIC_QOS_CONFIG_F_RW_DOT1Q_PCP		BIT(2)
   2143#define IONIC_QOS_CONFIG_F_RW_IP_DSCP		BIT(3)
   2144/* Non-disruptive TC update */
   2145#define IONIC_QOS_CONFIG_F_NON_DISRUPTIVE	BIT(4)
   2146		u8      flags;
   2147		u8      sched_type;
   2148		u8      class_type;
   2149		u8      pause_type;
   2150		char    name[IONIC_QOS_CLASS_NAME_SZ];
   2151		__le32  mtu;
   2152		/* flow control */
   2153		u8      pfc_cos;
   2154		/* scheduler */
   2155		union {
   2156			u8      dwrr_weight;
   2157			__le64  strict_rlmt;
   2158		};
   2159		/* marking */
   2160		/* Used to rewrite PCP or DSCP value. */
   2161		union {
   2162			u8      rw_dot1q_pcp;
   2163			u8      rw_ip_dscp;
   2164		};
   2165		/* classification */
   2166		union {
   2167			u8      dot1q_pcp;
   2168			struct {
   2169				u8      ndscp;
   2170				u8      ip_dscp[IONIC_QOS_DSCP_MAX];
   2171			};
   2172		};
   2173	};
   2174	__le32  words[64];
   2175};
   2176
   2177/**
   2178 * union ionic_qos_identity - QoS identity structure
   2179 * @version:	Version of the identify structure
   2180 * @type:	QoS system type
   2181 * @nclasses:	Number of usable QoS classes
   2182 * @config:	Current configuration of classes
   2183 */
   2184union ionic_qos_identity {
   2185	struct {
   2186		u8     version;
   2187		u8     type;
   2188		u8     rsvd[62];
   2189		union ionic_qos_config config[IONIC_QOS_CLASS_MAX];
   2190	};
   2191	__le32 words[478];
   2192};
   2193
   2194/**
   2195 * struct ionic_qos_init_cmd - QoS config init command
   2196 * @opcode:	Opcode
   2197 * @group:	QoS class id
   2198 * @info_pa:	destination address for qos info
   2199 */
   2200struct ionic_qos_init_cmd {
   2201	u8     opcode;
   2202	u8     group;
   2203	u8     rsvd[6];
   2204	__le64 info_pa;
   2205	u8     rsvd1[48];
   2206};
   2207
   2208typedef struct ionic_admin_comp ionic_qos_init_comp;
   2209
   2210/**
   2211 * struct ionic_qos_reset_cmd - QoS config reset command
   2212 * @opcode:	Opcode
   2213 * @group:	QoS class id
   2214 */
   2215struct ionic_qos_reset_cmd {
   2216	u8    opcode;
   2217	u8    group;
   2218	u8    rsvd[62];
   2219};
   2220
   2221/**
   2222 * struct ionic_qos_clear_port_stats_cmd - Qos config reset command
   2223 * @opcode:	Opcode
   2224 */
   2225struct ionic_qos_clear_stats_cmd {
   2226	u8    opcode;
   2227	u8    group_bitmap;
   2228	u8    rsvd[62];
   2229};
   2230
   2231typedef struct ionic_admin_comp ionic_qos_reset_comp;
   2232
   2233/**
   2234 * struct ionic_fw_download_cmd - Firmware download command
   2235 * @opcode:	opcode
   2236 * @addr:	dma address of the firmware buffer
   2237 * @offset:	offset of the firmware buffer within the full image
   2238 * @length:	number of valid bytes in the firmware buffer
   2239 */
   2240struct ionic_fw_download_cmd {
   2241	u8     opcode;
   2242	u8     rsvd[3];
   2243	__le32 offset;
   2244	__le64 addr;
   2245	__le32 length;
   2246};
   2247
   2248typedef struct ionic_admin_comp ionic_fw_download_comp;
   2249
   2250/**
   2251 * enum ionic_fw_control_oper - FW control operations
   2252 * @IONIC_FW_RESET:		Reset firmware
   2253 * @IONIC_FW_INSTALL:		Install firmware
   2254 * @IONIC_FW_ACTIVATE:		Activate firmware
   2255 * @IONIC_FW_INSTALL_ASYNC:	Install firmware asynchronously
   2256 * @IONIC_FW_INSTALL_STATUS:	Firmware installation status
   2257 * @IONIC_FW_ACTIVATE_ASYNC:	Activate firmware asynchronously
   2258 * @IONIC_FW_ACTIVATE_STATUS:	Firmware activate status
   2259 */
   2260enum ionic_fw_control_oper {
   2261	IONIC_FW_RESET			= 0,
   2262	IONIC_FW_INSTALL		= 1,
   2263	IONIC_FW_ACTIVATE		= 2,
   2264	IONIC_FW_INSTALL_ASYNC		= 3,
   2265	IONIC_FW_INSTALL_STATUS		= 4,
   2266	IONIC_FW_ACTIVATE_ASYNC		= 5,
   2267	IONIC_FW_ACTIVATE_STATUS	= 6,
   2268	IONIC_FW_UPDATE_CLEANUP		= 7,
   2269};
   2270
   2271/**
   2272 * struct ionic_fw_control_cmd - Firmware control command
   2273 * @opcode:    opcode
   2274 * @oper:      firmware control operation (enum ionic_fw_control_oper)
   2275 * @slot:      slot to activate
   2276 */
   2277struct ionic_fw_control_cmd {
   2278	u8  opcode;
   2279	u8  rsvd[3];
   2280	u8  oper;
   2281	u8  slot;
   2282	u8  rsvd1[58];
   2283};
   2284
   2285/**
   2286 * struct ionic_fw_control_comp - Firmware control copletion
   2287 * @status:     Status of the command (enum ionic_status_code)
   2288 * @comp_index: Index in the descriptor ring for which this is the completion
   2289 * @slot:       Slot where the firmware was installed
   2290 * @color:      Color bit
   2291 */
   2292struct ionic_fw_control_comp {
   2293	u8     status;
   2294	u8     rsvd;
   2295	__le16 comp_index;
   2296	u8     slot;
   2297	u8     rsvd1[10];
   2298	u8     color;
   2299};
   2300
   2301/******************************************************************
   2302 ******************* RDMA Commands ********************************
   2303 ******************************************************************/
   2304
   2305/**
   2306 * struct ionic_rdma_reset_cmd - Reset RDMA LIF cmd
   2307 * @opcode:        opcode
   2308 * @lif_index:     LIF index
   2309 *
   2310 * There is no RDMA specific dev command completion struct.  Completion uses
   2311 * the common struct ionic_admin_comp.  Only the status is indicated.
   2312 * Nonzero status means the LIF does not support RDMA.
   2313 **/
   2314struct ionic_rdma_reset_cmd {
   2315	u8     opcode;
   2316	u8     rsvd;
   2317	__le16 lif_index;
   2318	u8     rsvd2[60];
   2319};
   2320
   2321/**
   2322 * struct ionic_rdma_queue_cmd - Create RDMA Queue command
   2323 * @opcode:        opcode, 52, 53
   2324 * @lif_index:     LIF index
   2325 * @qid_ver:       (qid | (RDMA version << 24))
   2326 * @cid:           intr, eq_id, or cq_id
   2327 * @dbid:          doorbell page id
   2328 * @depth_log2:    log base two of queue depth
   2329 * @stride_log2:   log base two of queue stride
   2330 * @dma_addr:      address of the queue memory
   2331 *
   2332 * The same command struct is used to create an RDMA event queue, completion
   2333 * queue, or RDMA admin queue.  The cid is an interrupt number for an event
   2334 * queue, an event queue id for a completion queue, or a completion queue id
   2335 * for an RDMA admin queue.
   2336 *
   2337 * The queue created via a dev command must be contiguous in dma space.
   2338 *
   2339 * The dev commands are intended only to be used during driver initialization,
   2340 * to create queues supporting the RDMA admin queue.  Other queues, and other
   2341 * types of RDMA resources like memory regions, will be created and registered
   2342 * via the RDMA admin queue, and will support a more complete interface
   2343 * providing scatter gather lists for larger, scattered queue buffers and
   2344 * memory registration.
   2345 *
   2346 * There is no RDMA specific dev command completion struct.  Completion uses
   2347 * the common struct ionic_admin_comp.  Only the status is indicated.
   2348 **/
   2349struct ionic_rdma_queue_cmd {
   2350	u8     opcode;
   2351	u8     rsvd;
   2352	__le16 lif_index;
   2353	__le32 qid_ver;
   2354	__le32 cid;
   2355	__le16 dbid;
   2356	u8     depth_log2;
   2357	u8     stride_log2;
   2358	__le64 dma_addr;
   2359	u8     rsvd2[40];
   2360};
   2361
   2362/******************************************************************
   2363 ******************* Notify Events ********************************
   2364 ******************************************************************/
   2365
   2366/**
   2367 * struct ionic_notifyq_event - Generic event reporting structure
   2368 * @eid:   event number
   2369 * @ecode: event code
   2370 * @data:  unspecified data about the event
   2371 *
   2372 * This is the generic event report struct from which the other
   2373 * actual events will be formed.
   2374 */
   2375struct ionic_notifyq_event {
   2376	__le64 eid;
   2377	__le16 ecode;
   2378	u8     data[54];
   2379};
   2380
   2381/**
   2382 * struct ionic_link_change_event - Link change event notification
   2383 * @eid:		event number
   2384 * @ecode:		event code = IONIC_EVENT_LINK_CHANGE
   2385 * @link_status:	link up/down, with error bits (enum ionic_port_status)
   2386 * @link_speed:		speed of the network link
   2387 *
   2388 * Sent when the network link state changes between UP and DOWN
   2389 */
   2390struct ionic_link_change_event {
   2391	__le64 eid;
   2392	__le16 ecode;
   2393	__le16 link_status;
   2394	__le32 link_speed;	/* units of 1Mbps: e.g. 10000 = 10Gbps */
   2395	u8     rsvd[48];
   2396};
   2397
   2398/**
   2399 * struct ionic_reset_event - Reset event notification
   2400 * @eid:		event number
   2401 * @ecode:		event code = IONIC_EVENT_RESET
   2402 * @reset_code:		reset type
   2403 * @state:		0=pending, 1=complete, 2=error
   2404 *
   2405 * Sent when the NIC or some subsystem is going to be or
   2406 * has been reset.
   2407 */
   2408struct ionic_reset_event {
   2409	__le64 eid;
   2410	__le16 ecode;
   2411	u8     reset_code;
   2412	u8     state;
   2413	u8     rsvd[52];
   2414};
   2415
   2416/**
   2417 * struct ionic_heartbeat_event - Sent periodically by NIC to indicate health
   2418 * @eid:	event number
   2419 * @ecode:	event code = IONIC_EVENT_HEARTBEAT
   2420 */
   2421struct ionic_heartbeat_event {
   2422	__le64 eid;
   2423	__le16 ecode;
   2424	u8     rsvd[54];
   2425};
   2426
   2427/**
   2428 * struct ionic_log_event - Sent to notify the driver of an internal error
   2429 * @eid:	event number
   2430 * @ecode:	event code = IONIC_EVENT_LOG
   2431 * @data:	log data
   2432 */
   2433struct ionic_log_event {
   2434	__le64 eid;
   2435	__le16 ecode;
   2436	u8     data[54];
   2437};
   2438
   2439/**
   2440 * struct ionic_xcvr_event - Transceiver change event
   2441 * @eid:	event number
   2442 * @ecode:	event code = IONIC_EVENT_XCVR
   2443 */
   2444struct ionic_xcvr_event {
   2445	__le64 eid;
   2446	__le16 ecode;
   2447	u8     rsvd[54];
   2448};
   2449
   2450/**
   2451 * struct ionic_port_stats - Port statistics structure
   2452 */
   2453struct ionic_port_stats {
   2454	__le64 frames_rx_ok;
   2455	__le64 frames_rx_all;
   2456	__le64 frames_rx_bad_fcs;
   2457	__le64 frames_rx_bad_all;
   2458	__le64 octets_rx_ok;
   2459	__le64 octets_rx_all;
   2460	__le64 frames_rx_unicast;
   2461	__le64 frames_rx_multicast;
   2462	__le64 frames_rx_broadcast;
   2463	__le64 frames_rx_pause;
   2464	__le64 frames_rx_bad_length;
   2465	__le64 frames_rx_undersized;
   2466	__le64 frames_rx_oversized;
   2467	__le64 frames_rx_fragments;
   2468	__le64 frames_rx_jabber;
   2469	__le64 frames_rx_pripause;
   2470	__le64 frames_rx_stomped_crc;
   2471	__le64 frames_rx_too_long;
   2472	__le64 frames_rx_vlan_good;
   2473	__le64 frames_rx_dropped;
   2474	__le64 frames_rx_less_than_64b;
   2475	__le64 frames_rx_64b;
   2476	__le64 frames_rx_65b_127b;
   2477	__le64 frames_rx_128b_255b;
   2478	__le64 frames_rx_256b_511b;
   2479	__le64 frames_rx_512b_1023b;
   2480	__le64 frames_rx_1024b_1518b;
   2481	__le64 frames_rx_1519b_2047b;
   2482	__le64 frames_rx_2048b_4095b;
   2483	__le64 frames_rx_4096b_8191b;
   2484	__le64 frames_rx_8192b_9215b;
   2485	__le64 frames_rx_other;
   2486	__le64 frames_tx_ok;
   2487	__le64 frames_tx_all;
   2488	__le64 frames_tx_bad;
   2489	__le64 octets_tx_ok;
   2490	__le64 octets_tx_total;
   2491	__le64 frames_tx_unicast;
   2492	__le64 frames_tx_multicast;
   2493	__le64 frames_tx_broadcast;
   2494	__le64 frames_tx_pause;
   2495	__le64 frames_tx_pripause;
   2496	__le64 frames_tx_vlan;
   2497	__le64 frames_tx_less_than_64b;
   2498	__le64 frames_tx_64b;
   2499	__le64 frames_tx_65b_127b;
   2500	__le64 frames_tx_128b_255b;
   2501	__le64 frames_tx_256b_511b;
   2502	__le64 frames_tx_512b_1023b;
   2503	__le64 frames_tx_1024b_1518b;
   2504	__le64 frames_tx_1519b_2047b;
   2505	__le64 frames_tx_2048b_4095b;
   2506	__le64 frames_tx_4096b_8191b;
   2507	__le64 frames_tx_8192b_9215b;
   2508	__le64 frames_tx_other;
   2509	__le64 frames_tx_pri_0;
   2510	__le64 frames_tx_pri_1;
   2511	__le64 frames_tx_pri_2;
   2512	__le64 frames_tx_pri_3;
   2513	__le64 frames_tx_pri_4;
   2514	__le64 frames_tx_pri_5;
   2515	__le64 frames_tx_pri_6;
   2516	__le64 frames_tx_pri_7;
   2517	__le64 frames_rx_pri_0;
   2518	__le64 frames_rx_pri_1;
   2519	__le64 frames_rx_pri_2;
   2520	__le64 frames_rx_pri_3;
   2521	__le64 frames_rx_pri_4;
   2522	__le64 frames_rx_pri_5;
   2523	__le64 frames_rx_pri_6;
   2524	__le64 frames_rx_pri_7;
   2525	__le64 tx_pripause_0_1us_count;
   2526	__le64 tx_pripause_1_1us_count;
   2527	__le64 tx_pripause_2_1us_count;
   2528	__le64 tx_pripause_3_1us_count;
   2529	__le64 tx_pripause_4_1us_count;
   2530	__le64 tx_pripause_5_1us_count;
   2531	__le64 tx_pripause_6_1us_count;
   2532	__le64 tx_pripause_7_1us_count;
   2533	__le64 rx_pripause_0_1us_count;
   2534	__le64 rx_pripause_1_1us_count;
   2535	__le64 rx_pripause_2_1us_count;
   2536	__le64 rx_pripause_3_1us_count;
   2537	__le64 rx_pripause_4_1us_count;
   2538	__le64 rx_pripause_5_1us_count;
   2539	__le64 rx_pripause_6_1us_count;
   2540	__le64 rx_pripause_7_1us_count;
   2541	__le64 rx_pause_1us_count;
   2542	__le64 frames_tx_truncated;
   2543};
   2544
   2545struct ionic_mgmt_port_stats {
   2546	__le64 frames_rx_ok;
   2547	__le64 frames_rx_all;
   2548	__le64 frames_rx_bad_fcs;
   2549	__le64 frames_rx_bad_all;
   2550	__le64 octets_rx_ok;
   2551	__le64 octets_rx_all;
   2552	__le64 frames_rx_unicast;
   2553	__le64 frames_rx_multicast;
   2554	__le64 frames_rx_broadcast;
   2555	__le64 frames_rx_pause;
   2556	__le64 frames_rx_bad_length;
   2557	__le64 frames_rx_undersized;
   2558	__le64 frames_rx_oversized;
   2559	__le64 frames_rx_fragments;
   2560	__le64 frames_rx_jabber;
   2561	__le64 frames_rx_64b;
   2562	__le64 frames_rx_65b_127b;
   2563	__le64 frames_rx_128b_255b;
   2564	__le64 frames_rx_256b_511b;
   2565	__le64 frames_rx_512b_1023b;
   2566	__le64 frames_rx_1024b_1518b;
   2567	__le64 frames_rx_gt_1518b;
   2568	__le64 frames_rx_fifo_full;
   2569	__le64 frames_tx_ok;
   2570	__le64 frames_tx_all;
   2571	__le64 frames_tx_bad;
   2572	__le64 octets_tx_ok;
   2573	__le64 octets_tx_total;
   2574	__le64 frames_tx_unicast;
   2575	__le64 frames_tx_multicast;
   2576	__le64 frames_tx_broadcast;
   2577	__le64 frames_tx_pause;
   2578};
   2579
   2580enum ionic_pb_buffer_drop_stats {
   2581	IONIC_BUFFER_INTRINSIC_DROP = 0,
   2582	IONIC_BUFFER_DISCARDED,
   2583	IONIC_BUFFER_ADMITTED,
   2584	IONIC_BUFFER_OUT_OF_CELLS_DROP,
   2585	IONIC_BUFFER_OUT_OF_CELLS_DROP_2,
   2586	IONIC_BUFFER_OUT_OF_CREDIT_DROP,
   2587	IONIC_BUFFER_TRUNCATION_DROP,
   2588	IONIC_BUFFER_PORT_DISABLED_DROP,
   2589	IONIC_BUFFER_COPY_TO_CPU_TAIL_DROP,
   2590	IONIC_BUFFER_SPAN_TAIL_DROP,
   2591	IONIC_BUFFER_MIN_SIZE_VIOLATION_DROP,
   2592	IONIC_BUFFER_ENQUEUE_ERROR_DROP,
   2593	IONIC_BUFFER_INVALID_PORT_DROP,
   2594	IONIC_BUFFER_INVALID_OUTPUT_QUEUE_DROP,
   2595	IONIC_BUFFER_DROP_MAX,
   2596};
   2597
   2598enum ionic_oflow_drop_stats {
   2599	IONIC_OFLOW_OCCUPANCY_DROP,
   2600	IONIC_OFLOW_EMERGENCY_STOP_DROP,
   2601	IONIC_OFLOW_WRITE_BUFFER_ACK_FILL_UP_DROP,
   2602	IONIC_OFLOW_WRITE_BUFFER_ACK_FULL_DROP,
   2603	IONIC_OFLOW_WRITE_BUFFER_FULL_DROP,
   2604	IONIC_OFLOW_CONTROL_FIFO_FULL_DROP,
   2605	IONIC_OFLOW_DROP_MAX,
   2606};
   2607
   2608/**
   2609 * struct port_pb_stats - packet buffers system stats
   2610 * uses ionic_pb_buffer_drop_stats for drop_counts[]
   2611 */
   2612struct ionic_port_pb_stats {
   2613	__le64 sop_count_in;
   2614	__le64 eop_count_in;
   2615	__le64 sop_count_out;
   2616	__le64 eop_count_out;
   2617	__le64 drop_counts[IONIC_BUFFER_DROP_MAX];
   2618	__le64 input_queue_buffer_occupancy[IONIC_QOS_TC_MAX];
   2619	__le64 input_queue_port_monitor[IONIC_QOS_TC_MAX];
   2620	__le64 output_queue_port_monitor[IONIC_QOS_TC_MAX];
   2621	__le64 oflow_drop_counts[IONIC_OFLOW_DROP_MAX];
   2622	__le64 input_queue_good_pkts_in[IONIC_QOS_TC_MAX];
   2623	__le64 input_queue_good_pkts_out[IONIC_QOS_TC_MAX];
   2624	__le64 input_queue_err_pkts_in[IONIC_QOS_TC_MAX];
   2625	__le64 input_queue_fifo_depth[IONIC_QOS_TC_MAX];
   2626	__le64 input_queue_max_fifo_depth[IONIC_QOS_TC_MAX];
   2627	__le64 input_queue_peak_occupancy[IONIC_QOS_TC_MAX];
   2628	__le64 output_queue_buffer_occupancy[IONIC_QOS_TC_MAX];
   2629};
   2630
   2631/**
   2632 * struct ionic_port_identity - port identity structure
   2633 * @version:        identity structure version
   2634 * @type:           type of port (enum ionic_port_type)
   2635 * @num_lanes:      number of lanes for the port
   2636 * @autoneg:        autoneg supported
   2637 * @min_frame_size: minimum frame size supported
   2638 * @max_frame_size: maximum frame size supported
   2639 * @fec_type:       supported fec types
   2640 * @pause_type:     supported pause types
   2641 * @loopback_mode:  supported loopback mode
   2642 * @speeds:         supported speeds
   2643 * @config:         current port configuration
   2644 */
   2645union ionic_port_identity {
   2646	struct {
   2647		u8     version;
   2648		u8     type;
   2649		u8     num_lanes;
   2650		u8     autoneg;
   2651		__le32 min_frame_size;
   2652		__le32 max_frame_size;
   2653		u8     fec_type[4];
   2654		u8     pause_type[2];
   2655		u8     loopback_mode[2];
   2656		__le32 speeds[16];
   2657		u8     rsvd2[44];
   2658		union ionic_port_config config;
   2659	};
   2660	__le32 words[478];
   2661};
   2662
   2663/**
   2664 * struct ionic_port_info - port info structure
   2665 * @config:          Port configuration data
   2666 * @status:          Port status data
   2667 * @stats:           Port statistics data
   2668 * @mgmt_stats:      Port management statistics data
   2669 * @port_pb_drop_stats:   uplink pb drop stats
   2670 */
   2671struct ionic_port_info {
   2672	union ionic_port_config config;
   2673	struct ionic_port_status status;
   2674	union {
   2675		struct ionic_port_stats      stats;
   2676		struct ionic_mgmt_port_stats mgmt_stats;
   2677	};
   2678	/* room for pb_stats to start at 2k offset */
   2679	u8                          rsvd[760];
   2680	struct ionic_port_pb_stats  pb_stats;
   2681};
   2682
   2683/**
   2684 * struct ionic_lif_stats - LIF statistics structure
   2685 */
   2686struct ionic_lif_stats {
   2687	/* RX */
   2688	__le64 rx_ucast_bytes;
   2689	__le64 rx_ucast_packets;
   2690	__le64 rx_mcast_bytes;
   2691	__le64 rx_mcast_packets;
   2692	__le64 rx_bcast_bytes;
   2693	__le64 rx_bcast_packets;
   2694	__le64 rsvd0;
   2695	__le64 rsvd1;
   2696	/* RX drops */
   2697	__le64 rx_ucast_drop_bytes;
   2698	__le64 rx_ucast_drop_packets;
   2699	__le64 rx_mcast_drop_bytes;
   2700	__le64 rx_mcast_drop_packets;
   2701	__le64 rx_bcast_drop_bytes;
   2702	__le64 rx_bcast_drop_packets;
   2703	__le64 rx_dma_error;
   2704	__le64 rsvd2;
   2705	/* TX */
   2706	__le64 tx_ucast_bytes;
   2707	__le64 tx_ucast_packets;
   2708	__le64 tx_mcast_bytes;
   2709	__le64 tx_mcast_packets;
   2710	__le64 tx_bcast_bytes;
   2711	__le64 tx_bcast_packets;
   2712	__le64 rsvd3;
   2713	__le64 rsvd4;
   2714	/* TX drops */
   2715	__le64 tx_ucast_drop_bytes;
   2716	__le64 tx_ucast_drop_packets;
   2717	__le64 tx_mcast_drop_bytes;
   2718	__le64 tx_mcast_drop_packets;
   2719	__le64 tx_bcast_drop_bytes;
   2720	__le64 tx_bcast_drop_packets;
   2721	__le64 tx_dma_error;
   2722	__le64 rsvd5;
   2723	/* Rx Queue/Ring drops */
   2724	__le64 rx_queue_disabled;
   2725	__le64 rx_queue_empty;
   2726	__le64 rx_queue_error;
   2727	__le64 rx_desc_fetch_error;
   2728	__le64 rx_desc_data_error;
   2729	__le64 rsvd6;
   2730	__le64 rsvd7;
   2731	__le64 rsvd8;
   2732	/* Tx Queue/Ring drops */
   2733	__le64 tx_queue_disabled;
   2734	__le64 tx_queue_error;
   2735	__le64 tx_desc_fetch_error;
   2736	__le64 tx_desc_data_error;
   2737	__le64 tx_queue_empty;
   2738	__le64 rsvd10;
   2739	__le64 rsvd11;
   2740	__le64 rsvd12;
   2741
   2742	/* RDMA/ROCE TX */
   2743	__le64 tx_rdma_ucast_bytes;
   2744	__le64 tx_rdma_ucast_packets;
   2745	__le64 tx_rdma_mcast_bytes;
   2746	__le64 tx_rdma_mcast_packets;
   2747	__le64 tx_rdma_cnp_packets;
   2748	__le64 rsvd13;
   2749	__le64 rsvd14;
   2750	__le64 rsvd15;
   2751
   2752	/* RDMA/ROCE RX */
   2753	__le64 rx_rdma_ucast_bytes;
   2754	__le64 rx_rdma_ucast_packets;
   2755	__le64 rx_rdma_mcast_bytes;
   2756	__le64 rx_rdma_mcast_packets;
   2757	__le64 rx_rdma_cnp_packets;
   2758	__le64 rx_rdma_ecn_packets;
   2759	__le64 rsvd16;
   2760	__le64 rsvd17;
   2761
   2762	__le64 rsvd18;
   2763	__le64 rsvd19;
   2764	__le64 rsvd20;
   2765	__le64 rsvd21;
   2766	__le64 rsvd22;
   2767	__le64 rsvd23;
   2768	__le64 rsvd24;
   2769	__le64 rsvd25;
   2770
   2771	__le64 rsvd26;
   2772	__le64 rsvd27;
   2773	__le64 rsvd28;
   2774	__le64 rsvd29;
   2775	__le64 rsvd30;
   2776	__le64 rsvd31;
   2777	__le64 rsvd32;
   2778	__le64 rsvd33;
   2779
   2780	__le64 rsvd34;
   2781	__le64 rsvd35;
   2782	__le64 rsvd36;
   2783	__le64 rsvd37;
   2784	__le64 rsvd38;
   2785	__le64 rsvd39;
   2786	__le64 rsvd40;
   2787	__le64 rsvd41;
   2788
   2789	__le64 rsvd42;
   2790	__le64 rsvd43;
   2791	__le64 rsvd44;
   2792	__le64 rsvd45;
   2793	__le64 rsvd46;
   2794	__le64 rsvd47;
   2795	__le64 rsvd48;
   2796	__le64 rsvd49;
   2797
   2798	/* RDMA/ROCE REQ Error/Debugs (768 - 895) */
   2799	__le64 rdma_req_rx_pkt_seq_err;
   2800	__le64 rdma_req_rx_rnr_retry_err;
   2801	__le64 rdma_req_rx_remote_access_err;
   2802	__le64 rdma_req_rx_remote_inv_req_err;
   2803	__le64 rdma_req_rx_remote_oper_err;
   2804	__le64 rdma_req_rx_implied_nak_seq_err;
   2805	__le64 rdma_req_rx_cqe_err;
   2806	__le64 rdma_req_rx_cqe_flush_err;
   2807
   2808	__le64 rdma_req_rx_dup_responses;
   2809	__le64 rdma_req_rx_invalid_packets;
   2810	__le64 rdma_req_tx_local_access_err;
   2811	__le64 rdma_req_tx_local_oper_err;
   2812	__le64 rdma_req_tx_memory_mgmt_err;
   2813	__le64 rsvd52;
   2814	__le64 rsvd53;
   2815	__le64 rsvd54;
   2816
   2817	/* RDMA/ROCE RESP Error/Debugs (896 - 1023) */
   2818	__le64 rdma_resp_rx_dup_requests;
   2819	__le64 rdma_resp_rx_out_of_buffer;
   2820	__le64 rdma_resp_rx_out_of_seq_pkts;
   2821	__le64 rdma_resp_rx_cqe_err;
   2822	__le64 rdma_resp_rx_cqe_flush_err;
   2823	__le64 rdma_resp_rx_local_len_err;
   2824	__le64 rdma_resp_rx_inv_request_err;
   2825	__le64 rdma_resp_rx_local_qp_oper_err;
   2826
   2827	__le64 rdma_resp_rx_out_of_atomic_resource;
   2828	__le64 rdma_resp_tx_pkt_seq_err;
   2829	__le64 rdma_resp_tx_remote_inv_req_err;
   2830	__le64 rdma_resp_tx_remote_access_err;
   2831	__le64 rdma_resp_tx_remote_oper_err;
   2832	__le64 rdma_resp_tx_rnr_retry_err;
   2833	__le64 rsvd57;
   2834	__le64 rsvd58;
   2835};
   2836
   2837/**
   2838 * struct ionic_lif_info - LIF info structure
   2839 * @config:	LIF configuration structure
   2840 * @status:	LIF status structure
   2841 * @stats:	LIF statistics structure
   2842 */
   2843struct ionic_lif_info {
   2844	union ionic_lif_config config;
   2845	struct ionic_lif_status status;
   2846	struct ionic_lif_stats stats;
   2847};
   2848
   2849union ionic_dev_cmd {
   2850	u32 words[16];
   2851	struct ionic_admin_cmd cmd;
   2852	struct ionic_nop_cmd nop;
   2853
   2854	struct ionic_dev_identify_cmd identify;
   2855	struct ionic_dev_init_cmd init;
   2856	struct ionic_dev_reset_cmd reset;
   2857	struct ionic_dev_getattr_cmd getattr;
   2858	struct ionic_dev_setattr_cmd setattr;
   2859
   2860	struct ionic_port_identify_cmd port_identify;
   2861	struct ionic_port_init_cmd port_init;
   2862	struct ionic_port_reset_cmd port_reset;
   2863	struct ionic_port_getattr_cmd port_getattr;
   2864	struct ionic_port_setattr_cmd port_setattr;
   2865
   2866	struct ionic_vf_setattr_cmd vf_setattr;
   2867	struct ionic_vf_getattr_cmd vf_getattr;
   2868
   2869	struct ionic_lif_identify_cmd lif_identify;
   2870	struct ionic_lif_init_cmd lif_init;
   2871	struct ionic_lif_reset_cmd lif_reset;
   2872
   2873	struct ionic_qos_identify_cmd qos_identify;
   2874	struct ionic_qos_init_cmd qos_init;
   2875	struct ionic_qos_reset_cmd qos_reset;
   2876	struct ionic_qos_clear_stats_cmd qos_clear_stats;
   2877
   2878	struct ionic_q_identify_cmd q_identify;
   2879	struct ionic_q_init_cmd q_init;
   2880	struct ionic_q_control_cmd q_control;
   2881
   2882	struct ionic_fw_download_cmd fw_download;
   2883	struct ionic_fw_control_cmd fw_control;
   2884};
   2885
   2886union ionic_dev_cmd_comp {
   2887	u32 words[4];
   2888	u8 status;
   2889	struct ionic_admin_comp comp;
   2890	struct ionic_nop_comp nop;
   2891
   2892	struct ionic_dev_identify_comp identify;
   2893	struct ionic_dev_init_comp init;
   2894	struct ionic_dev_reset_comp reset;
   2895	struct ionic_dev_getattr_comp getattr;
   2896	struct ionic_dev_setattr_comp setattr;
   2897
   2898	struct ionic_port_identify_comp port_identify;
   2899	struct ionic_port_init_comp port_init;
   2900	struct ionic_port_reset_comp port_reset;
   2901	struct ionic_port_getattr_comp port_getattr;
   2902	struct ionic_port_setattr_comp port_setattr;
   2903
   2904	struct ionic_vf_setattr_comp vf_setattr;
   2905	struct ionic_vf_getattr_comp vf_getattr;
   2906
   2907	struct ionic_lif_identify_comp lif_identify;
   2908	struct ionic_lif_init_comp lif_init;
   2909	ionic_lif_reset_comp lif_reset;
   2910
   2911	struct ionic_qos_identify_comp qos_identify;
   2912	ionic_qos_init_comp qos_init;
   2913	ionic_qos_reset_comp qos_reset;
   2914
   2915	struct ionic_q_identify_comp q_identify;
   2916	struct ionic_q_init_comp q_init;
   2917
   2918	ionic_fw_download_comp fw_download;
   2919	struct ionic_fw_control_comp fw_control;
   2920};
   2921
   2922/**
   2923 * struct ionic_hwstamp_regs - Hardware current timestamp registers
   2924 * @tick_low:        Low 32 bits of hardware timestamp
   2925 * @tick_high:       High 32 bits of hardware timestamp
   2926 */
   2927struct ionic_hwstamp_regs {
   2928	u32    tick_low;
   2929	u32    tick_high;
   2930};
   2931
   2932/**
   2933 * union ionic_dev_info_regs - Device info register format (read-only)
   2934 * @signature:       Signature value of 0x44455649 ('DEVI')
   2935 * @version:         Current version of info
   2936 * @asic_type:       Asic type
   2937 * @asic_rev:        Asic revision
   2938 * @fw_status:       Firmware status
   2939 *			bit 0   - 1 = fw running
   2940 *			bit 4-7 - 4 bit generation number, changes on fw restart
   2941 * @fw_heartbeat:    Firmware heartbeat counter
   2942 * @serial_num:      Serial number
   2943 * @fw_version:      Firmware version
   2944 * @hwstamp_regs:    Hardware current timestamp registers
   2945 */
   2946union ionic_dev_info_regs {
   2947#define IONIC_DEVINFO_FWVERS_BUFLEN 32
   2948#define IONIC_DEVINFO_SERIAL_BUFLEN 32
   2949	struct {
   2950		u32    signature;
   2951		u8     version;
   2952		u8     asic_type;
   2953		u8     asic_rev;
   2954#define IONIC_FW_STS_F_RUNNING		0x01
   2955#define IONIC_FW_STS_F_GENERATION	0xF0
   2956		u8     fw_status;
   2957		u32    fw_heartbeat;
   2958		char   fw_version[IONIC_DEVINFO_FWVERS_BUFLEN];
   2959		char   serial_num[IONIC_DEVINFO_SERIAL_BUFLEN];
   2960		u8     rsvd_pad1024[948];
   2961		struct ionic_hwstamp_regs hwstamp;
   2962	};
   2963	u32 words[512];
   2964};
   2965
   2966/**
   2967 * union ionic_dev_cmd_regs - Device command register format (read-write)
   2968 * @doorbell:        Device Cmd Doorbell, write-only
   2969 *                   Write a 1 to signal device to process cmd,
   2970 *                   poll done for completion.
   2971 * @done:            Done indicator, bit 0 == 1 when command is complete
   2972 * @cmd:             Opcode-specific command bytes
   2973 * @comp:            Opcode-specific response bytes
   2974 * @data:            Opcode-specific side-data
   2975 */
   2976union ionic_dev_cmd_regs {
   2977	struct {
   2978		u32                   doorbell;
   2979		u32                   done;
   2980		union ionic_dev_cmd         cmd;
   2981		union ionic_dev_cmd_comp    comp;
   2982		u8                    rsvd[48];
   2983		u32                   data[478];
   2984	} __packed;
   2985	u32 words[512];
   2986};
   2987
   2988/**
   2989 * union ionic_dev_regs - Device register format for bar 0 page 0
   2990 * @info:            Device info registers
   2991 * @devcmd:          Device command registers
   2992 */
   2993union ionic_dev_regs {
   2994	struct {
   2995		union ionic_dev_info_regs info;
   2996		union ionic_dev_cmd_regs  devcmd;
   2997	} __packed;
   2998	__le32 words[1024];
   2999};
   3000
   3001union ionic_adminq_cmd {
   3002	struct ionic_admin_cmd cmd;
   3003	struct ionic_nop_cmd nop;
   3004	struct ionic_q_identify_cmd q_identify;
   3005	struct ionic_q_init_cmd q_init;
   3006	struct ionic_q_control_cmd q_control;
   3007	struct ionic_lif_setattr_cmd lif_setattr;
   3008	struct ionic_lif_getattr_cmd lif_getattr;
   3009	struct ionic_lif_setphc_cmd lif_setphc;
   3010	struct ionic_rx_mode_set_cmd rx_mode_set;
   3011	struct ionic_rx_filter_add_cmd rx_filter_add;
   3012	struct ionic_rx_filter_del_cmd rx_filter_del;
   3013	struct ionic_rdma_reset_cmd rdma_reset;
   3014	struct ionic_rdma_queue_cmd rdma_queue;
   3015	struct ionic_fw_download_cmd fw_download;
   3016	struct ionic_fw_control_cmd fw_control;
   3017};
   3018
   3019union ionic_adminq_comp {
   3020	struct ionic_admin_comp comp;
   3021	struct ionic_nop_comp nop;
   3022	struct ionic_q_identify_comp q_identify;
   3023	struct ionic_q_init_comp q_init;
   3024	struct ionic_lif_setattr_comp lif_setattr;
   3025	struct ionic_lif_getattr_comp lif_getattr;
   3026	struct ionic_admin_comp lif_setphc;
   3027	struct ionic_rx_filter_add_comp rx_filter_add;
   3028	struct ionic_fw_control_comp fw_control;
   3029};
   3030
   3031#define IONIC_BARS_MAX			6
   3032#define IONIC_PCI_BAR_DBELL		1
   3033
   3034/* BAR0 */
   3035#define IONIC_BAR0_SIZE				0x8000
   3036
   3037#define IONIC_BAR0_DEV_INFO_REGS_OFFSET		0x0000
   3038#define IONIC_BAR0_DEV_CMD_REGS_OFFSET		0x0800
   3039#define IONIC_BAR0_DEV_CMD_DATA_REGS_OFFSET	0x0c00
   3040#define IONIC_BAR0_INTR_STATUS_OFFSET		0x1000
   3041#define IONIC_BAR0_INTR_CTRL_OFFSET		0x2000
   3042#define IONIC_DEV_CMD_DONE			0x00000001
   3043
   3044#define IONIC_ASIC_TYPE_CAPRI			0
   3045
   3046/**
   3047 * struct ionic_doorbell - Doorbell register layout
   3048 * @p_index: Producer index
   3049 * @ring:    Selects the specific ring of the queue to update
   3050 *           Type-specific meaning:
   3051 *              ring=0: Default producer/consumer queue
   3052 *              ring=1: (CQ, EQ) Re-Arm queue.  RDMA CQs
   3053 *              send events to EQs when armed.  EQs send
   3054 *              interrupts when armed.
   3055 * @qid_lo:  Queue destination for the producer index and flags (low bits)
   3056 * @qid_hi:  Queue destination for the producer index and flags (high bits)
   3057 */
   3058struct ionic_doorbell {
   3059	__le16 p_index;
   3060	u8     ring;
   3061	u8     qid_lo;
   3062	__le16 qid_hi;
   3063	u16    rsvd2;
   3064};
   3065
   3066struct ionic_intr_status {
   3067	u32 status[2];
   3068};
   3069
   3070struct ionic_notifyq_cmd {
   3071	__le32 data;	/* Not used but needed for qcq structure */
   3072};
   3073
   3074union ionic_notifyq_comp {
   3075	struct ionic_notifyq_event event;
   3076	struct ionic_link_change_event link_change;
   3077	struct ionic_reset_event reset;
   3078	struct ionic_heartbeat_event heartbeat;
   3079	struct ionic_log_event log;
   3080};
   3081
   3082/* Deprecate */
   3083struct ionic_identity {
   3084	union ionic_drv_identity drv;
   3085	union ionic_dev_identity dev;
   3086	union ionic_lif_identity lif;
   3087	union ionic_port_identity port;
   3088	union ionic_qos_identity qos;
   3089	union ionic_q_identity txq;
   3090};
   3091
   3092#endif /* _IONIC_IF_H_ */