root/sys/dev/iavf/iavf_adminq_cmd.h
/* SPDX-License-Identifier: BSD-3-Clause */
/*  Copyright (c) 2021, Intel Corporation
 *  All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *   1. Redistributions of source code must retain the above copyright notice,
 *      this list of conditions and the following disclaimer.
 *
 *   2. Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in the
 *      documentation and/or other materials provided with the distribution.
 *
 *   3. Neither the name of the Intel Corporation nor the names of its
 *      contributors may be used to endorse or promote products derived from
 *      this software without specific prior written permission.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 *  POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef _IAVF_ADMINQ_CMD_H_
#define _IAVF_ADMINQ_CMD_H_

/* This header file defines the iavf Admin Queue commands and is shared between
 * iavf Firmware and Software.  Do not change the names in this file to IAVF
 * because this file should be diff-able against the iavf version, even
 * though many parts have been removed in this VF version.
 *
 * This file needs to comply with the Linux Kernel coding style.
 */

#define IAVF_FW_API_VERSION_MAJOR       0x0001
#define IAVF_FW_API_VERSION_MINOR_X722  0x0006
#define IAVF_FW_API_VERSION_MINOR_X710  0x0007

#define IAVF_FW_MINOR_VERSION(_h) ((_h)->mac.type == IAVF_MAC_XL710 ? \
                                        IAVF_FW_API_VERSION_MINOR_X710 : \
                                        IAVF_FW_API_VERSION_MINOR_X722)

/* API version 1.7 implements additional link and PHY-specific APIs  */
#define IAVF_MINOR_VER_GET_LINK_INFO_XL710 0x0007
/* API version 1.6 for X722 devices adds ability to stop FW LLDP agent */
#define IAVF_MINOR_VER_FW_LLDP_STOPPABLE_X722 0x0006

struct iavf_aq_desc {
        __le16 flags;
        __le16 opcode;
        __le16 datalen;
        __le16 retval;
        __le32 cookie_high;
        __le32 cookie_low;
        union {
                struct {
                        __le32 param0;
                        __le32 param1;
                        __le32 param2;
                        __le32 param3;
                } internal;
                struct {
                        __le32 param0;
                        __le32 param1;
                        __le32 addr_high;
                        __le32 addr_low;
                } external;
                u8 raw[16];
        } params;
};

/* Flags sub-structure
 * |0  |1  |2  |3  |4  |5  |6  |7  |8  |9  |10 |11 |12 |13 |14 |15 |
 * |DD |CMP|ERR|VFE| * *  RESERVED * * |LB |RD |VFC|BUF|SI |EI |FE |
 */

/* command flags and offsets*/
#define IAVF_AQ_FLAG_DD_SHIFT   0
#define IAVF_AQ_FLAG_CMP_SHIFT  1
#define IAVF_AQ_FLAG_ERR_SHIFT  2
#define IAVF_AQ_FLAG_VFE_SHIFT  3
#define IAVF_AQ_FLAG_LB_SHIFT   9
#define IAVF_AQ_FLAG_RD_SHIFT   10
#define IAVF_AQ_FLAG_VFC_SHIFT  11
#define IAVF_AQ_FLAG_BUF_SHIFT  12
#define IAVF_AQ_FLAG_SI_SHIFT   13
#define IAVF_AQ_FLAG_EI_SHIFT   14
#define IAVF_AQ_FLAG_FE_SHIFT   15

#define IAVF_AQ_FLAG_DD         (1 << IAVF_AQ_FLAG_DD_SHIFT)  /* 0x1    */
#define IAVF_AQ_FLAG_CMP        (1 << IAVF_AQ_FLAG_CMP_SHIFT) /* 0x2    */
#define IAVF_AQ_FLAG_ERR        (1 << IAVF_AQ_FLAG_ERR_SHIFT) /* 0x4    */
#define IAVF_AQ_FLAG_VFE        (1 << IAVF_AQ_FLAG_VFE_SHIFT) /* 0x8    */
#define IAVF_AQ_FLAG_LB         (1 << IAVF_AQ_FLAG_LB_SHIFT)  /* 0x200  */
#define IAVF_AQ_FLAG_RD         (1 << IAVF_AQ_FLAG_RD_SHIFT)  /* 0x400  */
#define IAVF_AQ_FLAG_VFC        (1 << IAVF_AQ_FLAG_VFC_SHIFT) /* 0x800  */
#define IAVF_AQ_FLAG_BUF        (1 << IAVF_AQ_FLAG_BUF_SHIFT) /* 0x1000 */
#define IAVF_AQ_FLAG_SI         (1 << IAVF_AQ_FLAG_SI_SHIFT)  /* 0x2000 */
#define IAVF_AQ_FLAG_EI         (1 << IAVF_AQ_FLAG_EI_SHIFT)  /* 0x4000 */
#define IAVF_AQ_FLAG_FE         (1 << IAVF_AQ_FLAG_FE_SHIFT)  /* 0x8000 */

/* error codes */
enum iavf_admin_queue_err {
        IAVF_AQ_RC_OK           = 0,  /* success */
        IAVF_AQ_RC_EPERM        = 1,  /* Operation not permitted */
        IAVF_AQ_RC_ENOENT       = 2,  /* No such element */
        IAVF_AQ_RC_ESRCH        = 3,  /* Bad opcode */
        IAVF_AQ_RC_EINTR        = 4,  /* operation interrupted */
        IAVF_AQ_RC_EIO          = 5,  /* I/O error */
        IAVF_AQ_RC_ENXIO        = 6,  /* No such resource */
        IAVF_AQ_RC_E2BIG        = 7,  /* Arg too long */
        IAVF_AQ_RC_EAGAIN       = 8,  /* Try again */
        IAVF_AQ_RC_ENOMEM       = 9,  /* Out of memory */
        IAVF_AQ_RC_EACCES       = 10, /* Permission denied */
        IAVF_AQ_RC_EFAULT       = 11, /* Bad address */
        IAVF_AQ_RC_EBUSY        = 12, /* Device or resource busy */
        IAVF_AQ_RC_EEXIST       = 13, /* object already exists */
        IAVF_AQ_RC_EINVAL       = 14, /* Invalid argument */
        IAVF_AQ_RC_ENOTTY       = 15, /* Not a typewriter */
        IAVF_AQ_RC_ENOSPC       = 16, /* No space left or alloc failure */
        IAVF_AQ_RC_ENOSYS       = 17, /* Function not implemented */
        IAVF_AQ_RC_ERANGE       = 18, /* Parameter out of range */
        IAVF_AQ_RC_EFLUSHED     = 19, /* Cmd flushed due to prev cmd error */
        IAVF_AQ_RC_BAD_ADDR     = 20, /* Descriptor contains a bad pointer */
        IAVF_AQ_RC_EMODE        = 21, /* Op not allowed in current dev mode */
        IAVF_AQ_RC_EFBIG        = 22, /* File too large */
};

/* Admin Queue command opcodes */
enum iavf_admin_queue_opc {
        /* aq commands */
        iavf_aqc_opc_get_version        = 0x0001,
        iavf_aqc_opc_driver_version     = 0x0002,
        iavf_aqc_opc_queue_shutdown     = 0x0003,
        iavf_aqc_opc_set_pf_context     = 0x0004,

        /* resource ownership */
        iavf_aqc_opc_request_resource   = 0x0008,
        iavf_aqc_opc_release_resource   = 0x0009,

        iavf_aqc_opc_list_func_capabilities     = 0x000A,
        iavf_aqc_opc_list_dev_capabilities      = 0x000B,

        /* Proxy commands */
        iavf_aqc_opc_set_proxy_config           = 0x0104,
        iavf_aqc_opc_set_ns_proxy_table_entry   = 0x0105,

        /* LAA */
        iavf_aqc_opc_mac_address_read   = 0x0107,
        iavf_aqc_opc_mac_address_write  = 0x0108,

        /* PXE */
        iavf_aqc_opc_clear_pxe_mode     = 0x0110,

        /* WoL commands */
        iavf_aqc_opc_set_wol_filter     = 0x0120,
        iavf_aqc_opc_get_wake_reason    = 0x0121,
        iavf_aqc_opc_clear_all_wol_filters = 0x025E,

        /* internal switch commands */
        iavf_aqc_opc_get_switch_config          = 0x0200,
        iavf_aqc_opc_add_statistics             = 0x0201,
        iavf_aqc_opc_remove_statistics          = 0x0202,
        iavf_aqc_opc_set_port_parameters        = 0x0203,
        iavf_aqc_opc_get_switch_resource_alloc  = 0x0204,
        iavf_aqc_opc_set_switch_config          = 0x0205,
        iavf_aqc_opc_rx_ctl_reg_read            = 0x0206,
        iavf_aqc_opc_rx_ctl_reg_write           = 0x0207,

        iavf_aqc_opc_add_vsi                    = 0x0210,
        iavf_aqc_opc_update_vsi_parameters      = 0x0211,
        iavf_aqc_opc_get_vsi_parameters         = 0x0212,

        iavf_aqc_opc_add_pv                     = 0x0220,
        iavf_aqc_opc_update_pv_parameters       = 0x0221,
        iavf_aqc_opc_get_pv_parameters          = 0x0222,

        iavf_aqc_opc_add_veb                    = 0x0230,
        iavf_aqc_opc_update_veb_parameters      = 0x0231,
        iavf_aqc_opc_get_veb_parameters         = 0x0232,

        iavf_aqc_opc_delete_element             = 0x0243,

        iavf_aqc_opc_add_macvlan                = 0x0250,
        iavf_aqc_opc_remove_macvlan             = 0x0251,
        iavf_aqc_opc_add_vlan                   = 0x0252,
        iavf_aqc_opc_remove_vlan                = 0x0253,
        iavf_aqc_opc_set_vsi_promiscuous_modes  = 0x0254,
        iavf_aqc_opc_add_tag                    = 0x0255,
        iavf_aqc_opc_remove_tag                 = 0x0256,
        iavf_aqc_opc_add_multicast_etag         = 0x0257,
        iavf_aqc_opc_remove_multicast_etag      = 0x0258,
        iavf_aqc_opc_update_tag                 = 0x0259,
        iavf_aqc_opc_add_control_packet_filter  = 0x025A,
        iavf_aqc_opc_remove_control_packet_filter       = 0x025B,
        iavf_aqc_opc_add_cloud_filters          = 0x025C,
        iavf_aqc_opc_remove_cloud_filters       = 0x025D,
        iavf_aqc_opc_clear_wol_switch_filters   = 0x025E,
        iavf_aqc_opc_replace_cloud_filters      = 0x025F,

        iavf_aqc_opc_add_mirror_rule    = 0x0260,
        iavf_aqc_opc_delete_mirror_rule = 0x0261,

        /* Dynamic Device Personalization */
        iavf_aqc_opc_write_personalization_profile      = 0x0270,
        iavf_aqc_opc_get_personalization_profile_list   = 0x0271,

        /* DCB commands */
        iavf_aqc_opc_dcb_ignore_pfc     = 0x0301,
        iavf_aqc_opc_dcb_updated        = 0x0302,
        iavf_aqc_opc_set_dcb_parameters = 0x0303,

        /* TX scheduler */
        iavf_aqc_opc_configure_vsi_bw_limit             = 0x0400,
        iavf_aqc_opc_configure_vsi_ets_sla_bw_limit     = 0x0406,
        iavf_aqc_opc_configure_vsi_tc_bw                = 0x0407,
        iavf_aqc_opc_query_vsi_bw_config                = 0x0408,
        iavf_aqc_opc_query_vsi_ets_sla_config           = 0x040A,
        iavf_aqc_opc_configure_switching_comp_bw_limit  = 0x0410,

        iavf_aqc_opc_enable_switching_comp_ets                  = 0x0413,
        iavf_aqc_opc_modify_switching_comp_ets                  = 0x0414,
        iavf_aqc_opc_disable_switching_comp_ets                 = 0x0415,
        iavf_aqc_opc_configure_switching_comp_ets_bw_limit      = 0x0416,
        iavf_aqc_opc_configure_switching_comp_bw_config         = 0x0417,
        iavf_aqc_opc_query_switching_comp_ets_config            = 0x0418,
        iavf_aqc_opc_query_port_ets_config                      = 0x0419,
        iavf_aqc_opc_query_switching_comp_bw_config             = 0x041A,
        iavf_aqc_opc_suspend_port_tx                            = 0x041B,
        iavf_aqc_opc_resume_port_tx                             = 0x041C,
        iavf_aqc_opc_configure_partition_bw                     = 0x041D,
        /* hmc */
        iavf_aqc_opc_query_hmc_resource_profile = 0x0500,
        iavf_aqc_opc_set_hmc_resource_profile   = 0x0501,

        /* phy commands*/

        /* phy commands*/
        iavf_aqc_opc_get_phy_abilities          = 0x0600,
        iavf_aqc_opc_set_phy_config             = 0x0601,
        iavf_aqc_opc_set_mac_config             = 0x0603,
        iavf_aqc_opc_set_link_restart_an        = 0x0605,
        iavf_aqc_opc_get_link_status            = 0x0607,
        iavf_aqc_opc_set_phy_int_mask           = 0x0613,
        iavf_aqc_opc_get_local_advt_reg         = 0x0614,
        iavf_aqc_opc_set_local_advt_reg         = 0x0615,
        iavf_aqc_opc_get_partner_advt           = 0x0616,
        iavf_aqc_opc_set_lb_modes               = 0x0618,
        iavf_aqc_opc_get_phy_wol_caps           = 0x0621,
        iavf_aqc_opc_set_phy_debug              = 0x0622,
        iavf_aqc_opc_upload_ext_phy_fm          = 0x0625,
        iavf_aqc_opc_run_phy_activity           = 0x0626,
        iavf_aqc_opc_set_phy_register           = 0x0628,
        iavf_aqc_opc_get_phy_register           = 0x0629,

        /* NVM commands */
        iavf_aqc_opc_nvm_read                   = 0x0701,
        iavf_aqc_opc_nvm_erase                  = 0x0702,
        iavf_aqc_opc_nvm_update                 = 0x0703,
        iavf_aqc_opc_nvm_config_read            = 0x0704,
        iavf_aqc_opc_nvm_config_write           = 0x0705,
        iavf_aqc_opc_nvm_progress               = 0x0706,
        iavf_aqc_opc_oem_post_update            = 0x0720,
        iavf_aqc_opc_thermal_sensor             = 0x0721,

        /* virtualization commands */
        iavf_aqc_opc_send_msg_to_pf             = 0x0801,
        iavf_aqc_opc_send_msg_to_vf             = 0x0802,
        iavf_aqc_opc_send_msg_to_peer           = 0x0803,

        /* alternate structure */
        iavf_aqc_opc_alternate_write            = 0x0900,
        iavf_aqc_opc_alternate_write_indirect   = 0x0901,
        iavf_aqc_opc_alternate_read             = 0x0902,
        iavf_aqc_opc_alternate_read_indirect    = 0x0903,
        iavf_aqc_opc_alternate_write_done       = 0x0904,
        iavf_aqc_opc_alternate_set_mode         = 0x0905,
        iavf_aqc_opc_alternate_clear_port       = 0x0906,

        /* LLDP commands */
        iavf_aqc_opc_lldp_get_mib       = 0x0A00,
        iavf_aqc_opc_lldp_update_mib    = 0x0A01,
        iavf_aqc_opc_lldp_add_tlv       = 0x0A02,
        iavf_aqc_opc_lldp_update_tlv    = 0x0A03,
        iavf_aqc_opc_lldp_delete_tlv    = 0x0A04,
        iavf_aqc_opc_lldp_stop          = 0x0A05,
        iavf_aqc_opc_lldp_start         = 0x0A06,
        iavf_aqc_opc_get_cee_dcb_cfg    = 0x0A07,
        iavf_aqc_opc_lldp_set_local_mib = 0x0A08,
        iavf_aqc_opc_lldp_stop_start_spec_agent = 0x0A09,

        /* Tunnel commands */
        iavf_aqc_opc_add_udp_tunnel     = 0x0B00,
        iavf_aqc_opc_del_udp_tunnel     = 0x0B01,
        iavf_aqc_opc_set_rss_key        = 0x0B02,
        iavf_aqc_opc_set_rss_lut        = 0x0B03,
        iavf_aqc_opc_get_rss_key        = 0x0B04,
        iavf_aqc_opc_get_rss_lut        = 0x0B05,

        /* Async Events */
        iavf_aqc_opc_event_lan_overflow         = 0x1001,

        /* OEM commands */
        iavf_aqc_opc_oem_parameter_change       = 0xFE00,
        iavf_aqc_opc_oem_device_status_change   = 0xFE01,
        iavf_aqc_opc_oem_ocsd_initialize        = 0xFE02,
        iavf_aqc_opc_oem_ocbb_initialize        = 0xFE03,

        /* debug commands */
        iavf_aqc_opc_debug_read_reg             = 0xFF03,
        iavf_aqc_opc_debug_write_reg            = 0xFF04,
        iavf_aqc_opc_debug_modify_reg           = 0xFF07,
        iavf_aqc_opc_debug_dump_internals       = 0xFF08,
};

/* command structures and indirect data structures */

/* Structure naming conventions:
 * - no suffix for direct command descriptor structures
 * - _data for indirect sent data
 * - _resp for indirect return data (data which is both will use _data)
 * - _completion for direct return data
 * - _element_ for repeated elements (may also be _data or _resp)
 *
 * Command structures are expected to overlay the params.raw member of the basic
 * descriptor, and as such cannot exceed 16 bytes in length.
 */

/* This macro is used to generate a compilation error if a structure
 * is not exactly the correct length. It gives a divide by zero error if the
 * structure is not of the correct size, otherwise it creates an enum that is
 * never used.
 */
#define IAVF_CHECK_STRUCT_LEN(n, X) enum iavf_static_assert_enum_##X \
        { iavf_static_assert_##X = (n)/((sizeof(struct X) == (n)) ? 1 : 0) }

/* This macro is used extensively to ensure that command structures are 16
 * bytes in length as they have to map to the raw array of that size.
 */
#define IAVF_CHECK_CMD_LENGTH(X)        IAVF_CHECK_STRUCT_LEN(16, X)

/* Queue Shutdown (direct 0x0003) */
struct iavf_aqc_queue_shutdown {
        __le32  driver_unloading;
#define IAVF_AQ_DRIVER_UNLOADING        0x1
        u8      reserved[12];
};

IAVF_CHECK_CMD_LENGTH(iavf_aqc_queue_shutdown);

#define IAVF_AQC_WOL_PRESERVE_STATUS    0x200
#define IAVF_AQC_MC_MAG_EN              0x0100
#define IAVF_AQC_WOL_PRESERVE_ON_PFR    0x0200

struct iavf_aqc_vsi_properties_data {
        /* first 96 byte are written by SW */
        __le16  valid_sections;
#define IAVF_AQ_VSI_PROP_SWITCH_VALID           0x0001
#define IAVF_AQ_VSI_PROP_SECURITY_VALID         0x0002
#define IAVF_AQ_VSI_PROP_VLAN_VALID             0x0004
#define IAVF_AQ_VSI_PROP_CAS_PV_VALID           0x0008
#define IAVF_AQ_VSI_PROP_INGRESS_UP_VALID       0x0010
#define IAVF_AQ_VSI_PROP_EGRESS_UP_VALID        0x0020
#define IAVF_AQ_VSI_PROP_QUEUE_MAP_VALID        0x0040
#define IAVF_AQ_VSI_PROP_QUEUE_OPT_VALID        0x0080
#define IAVF_AQ_VSI_PROP_OUTER_UP_VALID         0x0100
#define IAVF_AQ_VSI_PROP_SCHED_VALID            0x0200
        /* switch section */
        __le16  switch_id; /* 12bit id combined with flags below */
#define IAVF_AQ_VSI_SW_ID_SHIFT         0x0000
#define IAVF_AQ_VSI_SW_ID_MASK          (0xFFF << IAVF_AQ_VSI_SW_ID_SHIFT)
#define IAVF_AQ_VSI_SW_ID_FLAG_NOT_STAG 0x1000
#define IAVF_AQ_VSI_SW_ID_FLAG_ALLOW_LB 0x2000
#define IAVF_AQ_VSI_SW_ID_FLAG_LOCAL_LB 0x4000
        u8      sw_reserved[2];
        /* security section */
        u8      sec_flags;
#define IAVF_AQ_VSI_SEC_FLAG_ALLOW_DEST_OVRD    0x01
#define IAVF_AQ_VSI_SEC_FLAG_ENABLE_VLAN_CHK    0x02
#define IAVF_AQ_VSI_SEC_FLAG_ENABLE_MAC_CHK     0x04
        u8      sec_reserved;
        /* VLAN section */
        __le16  pvid; /* VLANS include priority bits */
        __le16  fcoe_pvid;
        u8      port_vlan_flags;
#define IAVF_AQ_VSI_PVLAN_MODE_SHIFT    0x00
#define IAVF_AQ_VSI_PVLAN_MODE_MASK     (0x03 << \
                                         IAVF_AQ_VSI_PVLAN_MODE_SHIFT)
#define IAVF_AQ_VSI_PVLAN_MODE_TAGGED   0x01
#define IAVF_AQ_VSI_PVLAN_MODE_UNTAGGED 0x02
#define IAVF_AQ_VSI_PVLAN_MODE_ALL      0x03
#define IAVF_AQ_VSI_PVLAN_INSERT_PVID   0x04
#define IAVF_AQ_VSI_PVLAN_EMOD_SHIFT    0x03
#define IAVF_AQ_VSI_PVLAN_EMOD_MASK     (0x3 << \
                                         IAVF_AQ_VSI_PVLAN_EMOD_SHIFT)
#define IAVF_AQ_VSI_PVLAN_EMOD_STR_BOTH 0x0
#define IAVF_AQ_VSI_PVLAN_EMOD_STR_UP   0x08
#define IAVF_AQ_VSI_PVLAN_EMOD_STR      0x10
#define IAVF_AQ_VSI_PVLAN_EMOD_NOTHING  0x18
        u8      pvlan_reserved[3];
        /* ingress egress up sections */
        __le32  ingress_table; /* bitmap, 3 bits per up */
#define IAVF_AQ_VSI_UP_TABLE_UP0_SHIFT  0
#define IAVF_AQ_VSI_UP_TABLE_UP0_MASK   (0x7 << \
                                         IAVF_AQ_VSI_UP_TABLE_UP0_SHIFT)
#define IAVF_AQ_VSI_UP_TABLE_UP1_SHIFT  3
#define IAVF_AQ_VSI_UP_TABLE_UP1_MASK   (0x7 << \
                                         IAVF_AQ_VSI_UP_TABLE_UP1_SHIFT)
#define IAVF_AQ_VSI_UP_TABLE_UP2_SHIFT  6
#define IAVF_AQ_VSI_UP_TABLE_UP2_MASK   (0x7 << \
                                         IAVF_AQ_VSI_UP_TABLE_UP2_SHIFT)
#define IAVF_AQ_VSI_UP_TABLE_UP3_SHIFT  9
#define IAVF_AQ_VSI_UP_TABLE_UP3_MASK   (0x7 << \
                                         IAVF_AQ_VSI_UP_TABLE_UP3_SHIFT)
#define IAVF_AQ_VSI_UP_TABLE_UP4_SHIFT  12
#define IAVF_AQ_VSI_UP_TABLE_UP4_MASK   (0x7 << \
                                         IAVF_AQ_VSI_UP_TABLE_UP4_SHIFT)
#define IAVF_AQ_VSI_UP_TABLE_UP5_SHIFT  15
#define IAVF_AQ_VSI_UP_TABLE_UP5_MASK   (0x7 << \
                                         IAVF_AQ_VSI_UP_TABLE_UP5_SHIFT)
#define IAVF_AQ_VSI_UP_TABLE_UP6_SHIFT  18
#define IAVF_AQ_VSI_UP_TABLE_UP6_MASK   (0x7 << \
                                         IAVF_AQ_VSI_UP_TABLE_UP6_SHIFT)
#define IAVF_AQ_VSI_UP_TABLE_UP7_SHIFT  21
#define IAVF_AQ_VSI_UP_TABLE_UP7_MASK   (0x7 << \
                                         IAVF_AQ_VSI_UP_TABLE_UP7_SHIFT)
        __le32  egress_table;   /* same defines as for ingress table */
        /* cascaded PV section */
        __le16  cas_pv_tag;
        u8      cas_pv_flags;
#define IAVF_AQ_VSI_CAS_PV_TAGX_SHIFT           0x00
#define IAVF_AQ_VSI_CAS_PV_TAGX_MASK            (0x03 << \
                                                 IAVF_AQ_VSI_CAS_PV_TAGX_SHIFT)
#define IAVF_AQ_VSI_CAS_PV_TAGX_LEAVE           0x00
#define IAVF_AQ_VSI_CAS_PV_TAGX_REMOVE          0x01
#define IAVF_AQ_VSI_CAS_PV_TAGX_COPY            0x02
#define IAVF_AQ_VSI_CAS_PV_INSERT_TAG           0x10
#define IAVF_AQ_VSI_CAS_PV_ETAG_PRUNE           0x20
#define IAVF_AQ_VSI_CAS_PV_ACCEPT_HOST_TAG      0x40
        u8      cas_pv_reserved;
        /* queue mapping section */
        __le16  mapping_flags;
#define IAVF_AQ_VSI_QUE_MAP_CONTIG      0x0
#define IAVF_AQ_VSI_QUE_MAP_NONCONTIG   0x1
        __le16  queue_mapping[16];
#define IAVF_AQ_VSI_QUEUE_SHIFT         0x0
#define IAVF_AQ_VSI_QUEUE_MASK          (0x7FF << IAVF_AQ_VSI_QUEUE_SHIFT)
        __le16  tc_mapping[8];
#define IAVF_AQ_VSI_TC_QUE_OFFSET_SHIFT 0
#define IAVF_AQ_VSI_TC_QUE_OFFSET_MASK  (0x1FF << \
                                         IAVF_AQ_VSI_TC_QUE_OFFSET_SHIFT)
#define IAVF_AQ_VSI_TC_QUE_NUMBER_SHIFT 9
#define IAVF_AQ_VSI_TC_QUE_NUMBER_MASK  (0x7 << \
                                         IAVF_AQ_VSI_TC_QUE_NUMBER_SHIFT)
        /* queueing option section */
        u8      queueing_opt_flags;
#define IAVF_AQ_VSI_QUE_OPT_MULTICAST_UDP_ENA   0x04
#define IAVF_AQ_VSI_QUE_OPT_UNICAST_UDP_ENA     0x08
#define IAVF_AQ_VSI_QUE_OPT_TCP_ENA     0x10
#define IAVF_AQ_VSI_QUE_OPT_FCOE_ENA    0x20
#define IAVF_AQ_VSI_QUE_OPT_RSS_LUT_PF  0x00
#define IAVF_AQ_VSI_QUE_OPT_RSS_LUT_VSI 0x40
        u8      queueing_opt_reserved[3];
        /* scheduler section */
        u8      up_enable_bits;
        u8      sched_reserved;
        /* outer up section */
        __le32  outer_up_table; /* same structure and defines as ingress tbl */
        u8      cmd_reserved[8];
        /* last 32 bytes are written by FW */
        __le16  qs_handle[8];
#define IAVF_AQ_VSI_QS_HANDLE_INVALID   0xFFFF
        __le16  stat_counter_idx;
        __le16  sched_id;
        u8      resp_reserved[12];
};

IAVF_CHECK_STRUCT_LEN(128, iavf_aqc_vsi_properties_data);

/* Get VEB Parameters (direct 0x0232)
 * uses iavf_aqc_switch_seid for the descriptor
 */
struct iavf_aqc_get_veb_parameters_completion {
        __le16  seid;
        __le16  switch_id;
        __le16  veb_flags; /* only the first/last flags from 0x0230 is valid */
        __le16  statistic_index;
        __le16  vebs_used;
        __le16  vebs_free;
        u8      reserved[4];
};

IAVF_CHECK_CMD_LENGTH(iavf_aqc_get_veb_parameters_completion);

#define IAVF_LINK_SPEED_100MB_SHIFT     0x1
#define IAVF_LINK_SPEED_1000MB_SHIFT    0x2
#define IAVF_LINK_SPEED_10GB_SHIFT      0x3
#define IAVF_LINK_SPEED_40GB_SHIFT      0x4
#define IAVF_LINK_SPEED_20GB_SHIFT      0x5
#define IAVF_LINK_SPEED_25GB_SHIFT      0x6

enum iavf_aq_link_speed {
        IAVF_LINK_SPEED_UNKNOWN = 0,
        IAVF_LINK_SPEED_100MB   = (1 << IAVF_LINK_SPEED_100MB_SHIFT),
        IAVF_LINK_SPEED_1GB     = (1 << IAVF_LINK_SPEED_1000MB_SHIFT),
        IAVF_LINK_SPEED_10GB    = (1 << IAVF_LINK_SPEED_10GB_SHIFT),
        IAVF_LINK_SPEED_40GB    = (1 << IAVF_LINK_SPEED_40GB_SHIFT),
        IAVF_LINK_SPEED_20GB    = (1 << IAVF_LINK_SPEED_20GB_SHIFT),
        IAVF_LINK_SPEED_25GB    = (1 << IAVF_LINK_SPEED_25GB_SHIFT),
};

#define IAVF_AQ_LINK_UP_FUNCTION        0x01

/* Send to PF command (indirect 0x0801) id is only used by PF
 * Send to VF command (indirect 0x0802) id is only used by PF
 * Send to Peer PF command (indirect 0x0803)
 */
struct iavf_aqc_pf_vf_message {
        __le32  id;
        u8      reserved[4];
        __le32  addr_high;
        __le32  addr_low;
};

IAVF_CHECK_CMD_LENGTH(iavf_aqc_pf_vf_message);

/* Get CEE DCBX Oper Config (0x0A07)
 * uses the generic descriptor struct
 * returns below as indirect response
 */

#define IAVF_AQC_CEE_APP_FCOE_SHIFT     0x0
#define IAVF_AQC_CEE_APP_FCOE_MASK      (0x7 << IAVF_AQC_CEE_APP_FCOE_SHIFT)
#define IAVF_AQC_CEE_APP_ISCSI_SHIFT    0x3
#define IAVF_AQC_CEE_APP_ISCSI_MASK     (0x7 << IAVF_AQC_CEE_APP_ISCSI_SHIFT)
#define IAVF_AQC_CEE_APP_FIP_SHIFT      0x8
#define IAVF_AQC_CEE_APP_FIP_MASK       (0x7 << IAVF_AQC_CEE_APP_FIP_SHIFT)

#define IAVF_AQC_CEE_PG_STATUS_SHIFT    0x0
#define IAVF_AQC_CEE_PG_STATUS_MASK     (0x7 << IAVF_AQC_CEE_PG_STATUS_SHIFT)
#define IAVF_AQC_CEE_PFC_STATUS_SHIFT   0x3
#define IAVF_AQC_CEE_PFC_STATUS_MASK    (0x7 << IAVF_AQC_CEE_PFC_STATUS_SHIFT)
#define IAVF_AQC_CEE_APP_STATUS_SHIFT   0x8
#define IAVF_AQC_CEE_APP_STATUS_MASK    (0x7 << IAVF_AQC_CEE_APP_STATUS_SHIFT)
#define IAVF_AQC_CEE_FCOE_STATUS_SHIFT  0x8
#define IAVF_AQC_CEE_FCOE_STATUS_MASK   (0x7 << IAVF_AQC_CEE_FCOE_STATUS_SHIFT)
#define IAVF_AQC_CEE_ISCSI_STATUS_SHIFT 0xB
#define IAVF_AQC_CEE_ISCSI_STATUS_MASK  (0x7 << IAVF_AQC_CEE_ISCSI_STATUS_SHIFT)
#define IAVF_AQC_CEE_FIP_STATUS_SHIFT   0x10
#define IAVF_AQC_CEE_FIP_STATUS_MASK    (0x7 << IAVF_AQC_CEE_FIP_STATUS_SHIFT)

/* struct iavf_aqc_get_cee_dcb_cfg_v1_resp was originally defined with
 * word boundary layout issues, which the Linux compilers silently deal
 * with by adding padding, making the actual struct larger than designed.
 * However, the FW compiler for the NIC is less lenient and complains
 * about the struct.  Hence, the struct defined here has an extra byte in
 * fields reserved3 and reserved4 to directly acknowledge that padding,
 * and the new length is used in the length check macro.
 */
struct iavf_aqc_get_cee_dcb_cfg_v1_resp {
        u8      reserved1;
        u8      oper_num_tc;
        u8      oper_prio_tc[4];
        u8      reserved2;
        u8      oper_tc_bw[8];
        u8      oper_pfc_en;
        u8      reserved3[2];
        __le16  oper_app_prio;
        u8      reserved4[2];
        __le16  tlv_status;
};

IAVF_CHECK_STRUCT_LEN(0x18, iavf_aqc_get_cee_dcb_cfg_v1_resp);

struct iavf_aqc_get_cee_dcb_cfg_resp {
        u8      oper_num_tc;
        u8      oper_prio_tc[4];
        u8      oper_tc_bw[8];
        u8      oper_pfc_en;
        __le16  oper_app_prio;
        __le32  tlv_status;
        u8      reserved[12];
};

IAVF_CHECK_STRUCT_LEN(0x20, iavf_aqc_get_cee_dcb_cfg_resp);

/*      Set Local LLDP MIB (indirect 0x0A08)
 *      Used to replace the local MIB of a given LLDP agent. e.g. DCBx
 */
struct iavf_aqc_lldp_set_local_mib {
#define SET_LOCAL_MIB_AC_TYPE_DCBX_SHIFT        0
#define SET_LOCAL_MIB_AC_TYPE_DCBX_MASK (1 << \
                                        SET_LOCAL_MIB_AC_TYPE_DCBX_SHIFT)
#define SET_LOCAL_MIB_AC_TYPE_LOCAL_MIB 0x0
#define SET_LOCAL_MIB_AC_TYPE_NON_WILLING_APPS_SHIFT    (1)
#define SET_LOCAL_MIB_AC_TYPE_NON_WILLING_APPS_MASK     (1 << \
                                SET_LOCAL_MIB_AC_TYPE_NON_WILLING_APPS_SHIFT)
#define SET_LOCAL_MIB_AC_TYPE_NON_WILLING_APPS          0x1
        u8      type;
        u8      reserved0;
        __le16  length;
        u8      reserved1[4];
        __le32  address_high;
        __le32  address_low;
};

IAVF_CHECK_CMD_LENGTH(iavf_aqc_lldp_set_local_mib);

struct iavf_aqc_lldp_set_local_mib_resp {
#define SET_LOCAL_MIB_RESP_EVENT_TRIGGERED_MASK      0x01
        u8  status;
        u8  reserved[15];
};

IAVF_CHECK_STRUCT_LEN(0x10, iavf_aqc_lldp_set_local_mib_resp);

/*      Stop/Start LLDP Agent (direct 0x0A09)
 *      Used for stopping/starting specific LLDP agent. e.g. DCBx
 */
struct iavf_aqc_lldp_stop_start_specific_agent {
#define IAVF_AQC_START_SPECIFIC_AGENT_SHIFT     0
#define IAVF_AQC_START_SPECIFIC_AGENT_MASK \
                                (1 << IAVF_AQC_START_SPECIFIC_AGENT_SHIFT)
        u8      command;
        u8      reserved[15];
};

IAVF_CHECK_CMD_LENGTH(iavf_aqc_lldp_stop_start_specific_agent);

struct iavf_aqc_get_set_rss_key {
#define IAVF_AQC_SET_RSS_KEY_VSI_VALID          (0x1 << 15)
#define IAVF_AQC_SET_RSS_KEY_VSI_ID_SHIFT       0
#define IAVF_AQC_SET_RSS_KEY_VSI_ID_MASK        (0x3FF << \
                                        IAVF_AQC_SET_RSS_KEY_VSI_ID_SHIFT)
        __le16  vsi_id;
        u8      reserved[6];
        __le32  addr_high;
        __le32  addr_low;
};

IAVF_CHECK_CMD_LENGTH(iavf_aqc_get_set_rss_key);

struct iavf_aqc_get_set_rss_key_data {
        u8 standard_rss_key[0x28];
        u8 extended_hash_key[0xc];
};

IAVF_CHECK_STRUCT_LEN(0x34, iavf_aqc_get_set_rss_key_data);

struct  iavf_aqc_get_set_rss_lut {
#define IAVF_AQC_SET_RSS_LUT_VSI_VALID          (0x1 << 15)
#define IAVF_AQC_SET_RSS_LUT_VSI_ID_SHIFT       0
#define IAVF_AQC_SET_RSS_LUT_VSI_ID_MASK        (0x3FF << \
                                        IAVF_AQC_SET_RSS_LUT_VSI_ID_SHIFT)
        __le16  vsi_id;
#define IAVF_AQC_SET_RSS_LUT_TABLE_TYPE_SHIFT   0
#define IAVF_AQC_SET_RSS_LUT_TABLE_TYPE_MASK    (0x1 << \
                                        IAVF_AQC_SET_RSS_LUT_TABLE_TYPE_SHIFT)

#define IAVF_AQC_SET_RSS_LUT_TABLE_TYPE_VSI     0
#define IAVF_AQC_SET_RSS_LUT_TABLE_TYPE_PF      1
        __le16  flags;
        u8      reserved[4];
        __le32  addr_high;
        __le32  addr_low;
};

IAVF_CHECK_CMD_LENGTH(iavf_aqc_get_set_rss_lut);
#endif /* _IAVF_ADMINQ_CMD_H_ */