/* SPDX-License-Identifier: Apache-2.0 */
/*
 * WFx hardware interface definitions
 *
 * Copyright (c) 2018-2019, Silicon Laboratories Inc.
 */

#ifndef WFX_HIF_API_MIB_H
#define WFX_HIF_API_MIB_H

#include "hif_api_general.h"

#define HIF_API_IPV4_ADDRESS_SIZE                       4
#define HIF_API_IPV6_ADDRESS_SIZE                       16

enum hif_mib_ids {
	HIF_MIB_ID_GL_OPERATIONAL_POWER_MODE       = 0x2000,
	HIF_MIB_ID_GL_BLOCK_ACK_INFO               = 0x2001,
	HIF_MIB_ID_GL_SET_MULTI_MSG                = 0x2002,
	HIF_MIB_ID_CCA_CONFIG                      = 0x2003,
	HIF_MIB_ID_ETHERTYPE_DATAFRAME_CONDITION   = 0x2010,
	HIF_MIB_ID_PORT_DATAFRAME_CONDITION        = 0x2011,
	HIF_MIB_ID_MAGIC_DATAFRAME_CONDITION       = 0x2012,
	HIF_MIB_ID_MAC_ADDR_DATAFRAME_CONDITION    = 0x2013,
	HIF_MIB_ID_IPV4_ADDR_DATAFRAME_CONDITION   = 0x2014,
	HIF_MIB_ID_IPV6_ADDR_DATAFRAME_CONDITION   = 0x2015,
	HIF_MIB_ID_UC_MC_BC_DATAFRAME_CONDITION    = 0x2016,
	HIF_MIB_ID_CONFIG_DATA_FILTER              = 0x2017,
	HIF_MIB_ID_SET_DATA_FILTERING              = 0x2018,
	HIF_MIB_ID_ARP_IP_ADDRESSES_TABLE          = 0x2019,
	HIF_MIB_ID_NS_IP_ADDRESSES_TABLE           = 0x201A,
	HIF_MIB_ID_RX_FILTER                       = 0x201B,
	HIF_MIB_ID_BEACON_FILTER_TABLE             = 0x201C,
	HIF_MIB_ID_BEACON_FILTER_ENABLE            = 0x201D,
	HIF_MIB_ID_GRP_SEQ_COUNTER                 = 0x2030,
	HIF_MIB_ID_TSF_COUNTER                     = 0x2031,
	HIF_MIB_ID_STATISTICS_TABLE                = 0x2032,
	HIF_MIB_ID_COUNTERS_TABLE                  = 0x2033,
	HIF_MIB_ID_MAX_TX_POWER_LEVEL              = 0x2034,
	HIF_MIB_ID_EXTENDED_COUNTERS_TABLE         = 0x2035,
	HIF_MIB_ID_DOT11_MAC_ADDRESS               = 0x2040,
	HIF_MIB_ID_DOT11_MAX_TRANSMIT_MSDU_LIFETIME = 0x2041,
	HIF_MIB_ID_DOT11_MAX_RECEIVE_LIFETIME      = 0x2042,
	HIF_MIB_ID_DOT11_WEP_DEFAULT_KEY_ID        = 0x2043,
	HIF_MIB_ID_DOT11_RTS_THRESHOLD             = 0x2044,
	HIF_MIB_ID_SLOT_TIME                       = 0x2045,
	HIF_MIB_ID_CURRENT_TX_POWER_LEVEL          = 0x2046,
	HIF_MIB_ID_NON_ERP_PROTECTION              = 0x2047,
	HIF_MIB_ID_TEMPLATE_FRAME                  = 0x2048,
	HIF_MIB_ID_BEACON_WAKEUP_PERIOD            = 0x2049,
	HIF_MIB_ID_RCPI_RSSI_THRESHOLD             = 0x204A,
	HIF_MIB_ID_BLOCK_ACK_POLICY                = 0x204B,
	HIF_MIB_ID_OVERRIDE_INTERNAL_TX_RATE       = 0x204C,
	HIF_MIB_ID_SET_ASSOCIATION_MODE            = 0x204D,
	HIF_MIB_ID_SET_UAPSD_INFORMATION           = 0x204E,
	HIF_MIB_ID_SET_TX_RATE_RETRY_POLICY        = 0x204F,
	HIF_MIB_ID_PROTECTED_MGMT_POLICY           = 0x2050,
	HIF_MIB_ID_SET_HT_PROTECTION               = 0x2051,
	HIF_MIB_ID_KEEP_ALIVE_PERIOD               = 0x2052,
	HIF_MIB_ID_ARP_KEEP_ALIVE_PERIOD           = 0x2053,
	HIF_MIB_ID_INACTIVITY_TIMER                = 0x2054,
	HIF_MIB_ID_INTERFACE_PROTECTION            = 0x2055,
	HIF_MIB_ID_BEACON_STATS                    = 0x2056,
};

#define HIF_OP_POWER_MODE_MASK                     0xf

enum hif_op_power_mode {
	HIF_OP_POWER_MODE_ACTIVE                   = 0x0,
	HIF_OP_POWER_MODE_DOZE                     = 0x1,
	HIF_OP_POWER_MODE_QUIESCENT                = 0x2
};

struct hif_mib_gl_operational_power_mode {
	u8    power_mode:4;
	u8    reserved1:3;
	u8    wup_ind_activation:1;
	u8    reserved2[3];
} __packed;

struct hif_mib_gl_block_ack_info {
	u8    rx_buffer_size;
	u8    rx_max_num_agreements;
	u8    tx_buffer_size;
	u8    tx_max_num_agreements;
} __packed;

struct hif_mib_gl_set_multi_msg {
	u8    enable_multi_tx_conf:1;
	u8    reserved1:7;
	u8    reserved2[3];
} __packed;

enum hif_cca_thr_mode {
	HIF_CCA_THR_MODE_RELATIVE = 0x0,
	HIF_CCA_THR_MODE_ABSOLUTE = 0x1
};

struct hif_mib_gl_cca_config {
	u8  cca_thr_mode;
	u8  reserved[3];
} __packed;

#define MAX_NUMBER_DATA_FILTERS             0xA

#define MAX_NUMBER_IPV4_ADDR_CONDITIONS     0x4
#define MAX_NUMBER_IPV6_ADDR_CONDITIONS     0x4
#define MAX_NUMBER_MAC_ADDR_CONDITIONS      0x4
#define MAX_NUMBER_UC_MC_BC_CONDITIONS      0x4
#define MAX_NUMBER_ETHER_TYPE_CONDITIONS    0x4
#define MAX_NUMBER_PORT_CONDITIONS          0x4
#define MAX_NUMBER_MAGIC_CONDITIONS         0x4
#define MAX_NUMBER_ARP_CONDITIONS           0x2
#define MAX_NUMBER_NS_CONDITIONS            0x2

struct hif_mib_ethertype_data_frame_condition {
	u8    condition_idx;
	u8    reserved;
	u16   ether_type;
} __packed;

enum hif_udp_tcp_protocol {
	HIF_PROTOCOL_UDP                       = 0x0,
	HIF_PROTOCOL_TCP                       = 0x1,
	HIF_PROTOCOL_BOTH_UDP_TCP              = 0x2
};

enum hif_which_port {
	HIF_PORT_DST                           = 0x0,
	HIF_PORT_SRC                           = 0x1,
	HIF_PORT_SRC_OR_DST                    = 0x2
};

struct hif_mib_ports_data_frame_condition {
	u8    condition_idx;
	u8    protocol;
	u8    which_port;
	u8    reserved1;
	u16   port_number;
	u8    reserved2[2];
} __packed;

#define HIF_API_MAGIC_PATTERN_SIZE                 32

struct hif_mib_magic_data_frame_condition {
	u8    condition_idx;
	u8    offset;
	u8    magic_pattern_length;
	u8    reserved;
	u8    magic_pattern[HIF_API_MAGIC_PATTERN_SIZE];
} __packed;

enum hif_mac_addr_type {
	HIF_MAC_ADDR_A1                            = 0x0,
	HIF_MAC_ADDR_A2                            = 0x1,
	HIF_MAC_ADDR_A3                            = 0x2
};

struct hif_mib_mac_addr_data_frame_condition {
	u8    condition_idx;
	u8    address_type;
	u8    mac_address[ETH_ALEN];
} __packed;

enum hif_ip_addr_mode {
	HIF_IP_ADDR_SRC                            = 0x0,
	HIF_IP_ADDR_DST                            = 0x1
};

struct hif_mib_ipv4_addr_data_frame_condition {
	u8    condition_idx;
	u8    address_mode;
	u8    reserved[2];
	u8    i_pv4_address[HIF_API_IPV4_ADDRESS_SIZE];
} __packed;

struct hif_mib_ipv6_addr_data_frame_condition {
	u8    condition_idx;
	u8    address_mode;
	u8    reserved[2];
	u8    i_pv6_address[HIF_API_IPV6_ADDRESS_SIZE];
} __packed;

#define HIF_FILTER_UNICAST   0x1
#define HIF_FILTER_MULTICAST 0x2
#define HIF_FILTER_BROADCAST 0x4

struct hif_mib_uc_mc_bc_data_frame_condition {
	u8    condition_idx;
	u8    allowed_frames;
	u8    reserved[2];
} __packed;

struct hif_mib_config_data_filter {
	u8    filter_idx;
	u8    enable;
	u8    reserved1[2];
	u8    eth_type_cond;
	u8    port_cond;
	u8    magic_cond;
	u8    mac_cond;
	u8    ipv4_cond;
	u8    ipv6_cond;
	u8    uc_mc_bc_cond;
	u8    reserved2;
} __packed;

struct hif_mib_set_data_filtering {
	u8    invert_matching:1;
	u8    reserved1:7;
	u8    enable:1;
	u8    reserved2:7;
	u8    reserved3[2];
} __packed;

enum hif_arp_ns_frame_treatment {
	HIF_ARP_NS_FILTERING_DISABLE                  = 0x0,
	HIF_ARP_NS_FILTERING_ENABLE                   = 0x1,
	HIF_ARP_NS_REPLY_ENABLE                       = 0x2
};

struct hif_mib_arp_ip_addr_table {
	u8    condition_idx;
	u8    arp_enable;
	u8    reserved[2];
	u8    ipv4_address[HIF_API_IPV4_ADDRESS_SIZE];
} __packed;

struct hif_mib_ns_ip_addr_table {
	u8    condition_idx;
	u8    ns_enable;
	u8    reserved[2];
	u8    ipv6_address[HIF_API_IPV6_ADDRESS_SIZE];
} __packed;

struct hif_mib_rx_filter {
	u8    reserved1:1;
	u8    bssid_filter:1;
	u8    reserved2:1;
	u8    fwd_probe_req:1;
	u8    keep_alive_filter:1;
	u8    reserved3:3;
	u8    reserved4[3];
} __packed;

#define HIF_API_OUI_SIZE                                3
#define HIF_API_MATCH_DATA_SIZE                         3

struct hif_ie_table_entry {
	u8    ie_id;
	u8    has_changed:1;
	u8    no_longer:1;
	u8    has_appeared:1;
	u8    reserved:1;
	u8    num_match_data:4;
	u8    oui[HIF_API_OUI_SIZE];
	u8    match_data[HIF_API_MATCH_DATA_SIZE];
} __packed;

struct hif_mib_bcn_filter_table {
	u32   num_of_info_elmts;
	struct hif_ie_table_entry ie_table[];
} __packed;

enum hif_beacon_filter {
	HIF_BEACON_FILTER_DISABLE                  = 0x0,
	HIF_BEACON_FILTER_ENABLE                   = 0x1,
	HIF_BEACON_FILTER_AUTO_ERP                 = 0x2
};

struct hif_mib_bcn_filter_enable {
	u32   enable;
	u32   bcn_count;
} __packed;

struct hif_mib_group_seq_counter {
	u32   bits4716;
	u16   bits1500;
	u16   reserved;
} __packed;

struct hif_mib_tsf_counter {
	u32   tsf_counterlo;
	u32   tsf_counterhi;
} __packed;

struct hif_mib_stats_table {
	s16    latest_snr;
	u8    latest_rcpi;
	s8     latest_rssi;
} __packed;

struct hif_mib_extended_count_table {
	u32   count_plcp_errors;
	u32   count_fcs_errors;
	u32   count_tx_packets;
	u32   count_rx_packets;
	u32   count_rx_packet_errors;
	u32   count_rx_decryption_failures;
	u32   count_rx_mic_failures;
	u32   count_rx_no_key_failures;
	u32   count_tx_multicast_frames;
	u32   count_tx_frames_success;
	u32   count_tx_frame_failures;
	u32   count_tx_frames_retried;
	u32   count_tx_frames_multi_retried;
	u32   count_rx_frame_duplicates;
	u32   count_rts_success;
	u32   count_rts_failures;
	u32   count_ack_failures;
	u32   count_rx_multicast_frames;
	u32   count_rx_frames_success;
	u32   count_rx_cmacicv_errors;
	u32   count_rx_cmac_replays;
	u32   count_rx_mgmt_ccmp_replays;
	u32   count_rx_bipmic_errors;
	u32   count_rx_beacon;
	u32   count_miss_beacon;
	u32   reserved[15];
} __packed;

struct hif_mib_count_table {
	u32   count_plcp_errors;
	u32   count_fcs_errors;
	u32   count_tx_packets;
	u32   count_rx_packets;
	u32   count_rx_packet_errors;
	u32   count_rx_decryption_failures;
	u32   count_rx_mic_failures;
	u32   count_rx_no_key_failures;
	u32   count_tx_multicast_frames;
	u32   count_tx_frames_success;
	u32   count_tx_frame_failures;
	u32   count_tx_frames_retried;
	u32   count_tx_frames_multi_retried;
	u32   count_rx_frame_duplicates;
	u32   count_rts_success;
	u32   count_rts_failures;
	u32   count_ack_failures;
	u32   count_rx_multicast_frames;
	u32   count_rx_frames_success;
	u32   count_rx_cmacicv_errors;
	u32   count_rx_cmac_replays;
	u32   count_rx_mgmt_ccmp_replays;
	u32   count_rx_bipmic_errors;
} __packed;

struct hif_mib_max_tx_power_level {
	s32       max_tx_power_level_rf_port1;
	s32       max_tx_power_level_rf_port2;
} __packed;

struct hif_mib_beacon_stats {
	s32     latest_tbtt_diff;
	u32    reserved[4];
} __packed;

struct hif_mib_mac_address {
	u8    mac_addr[ETH_ALEN];
	u16   reserved;
} __packed;

struct hif_mib_dot11_max_transmit_msdu_lifetime {
	u32   max_life_time;
} __packed;

struct hif_mib_dot11_max_receive_lifetime {
	u32   max_life_time;
} __packed;

struct hif_mib_wep_default_key_id {
	u8    wep_default_key_id;
	u8    reserved[3];
} __packed;

struct hif_mib_dot11_rts_threshold {
	u32   threshold;
} __packed;

struct hif_mib_slot_time {
	u32   slot_time;
} __packed;

struct hif_mib_current_tx_power_level {
	s32   power_level;
} __packed;

struct hif_mib_non_erp_protection {
	u8   use_cts_to_self:1;
	u8   reserved1:7;
	u8   reserved2[3];
} __packed;

enum hif_tmplt {
	HIF_TMPLT_PRBREQ                           = 0x0,
	HIF_TMPLT_BCN                              = 0x1,
	HIF_TMPLT_NULL                             = 0x2,
	HIF_TMPLT_QOSNUL                           = 0x3,
	HIF_TMPLT_PSPOLL                           = 0x4,
	HIF_TMPLT_PRBRES                           = 0x5,
	HIF_TMPLT_ARP                              = 0x6,
	HIF_TMPLT_NA                               = 0x7
};

#define HIF_API_MAX_TEMPLATE_FRAME_SIZE                              700

struct hif_mib_template_frame {
	u8    frame_type;
	u8    init_rate:7;
	u8    mode:1;
	u16   frame_length;
	u8    frame[HIF_API_MAX_TEMPLATE_FRAME_SIZE];
} __packed;

struct hif_mib_beacon_wake_up_period {
	u8    wakeup_period_min;
	u8    receive_dtim:1;
	u8    reserved1:7;
	u8    wakeup_period_max;
	u8    reserved2;
} __packed;

struct hif_mib_rcpi_rssi_threshold {
	u8    detection:1;
	u8    rcpi_rssi:1;
	u8    upperthresh:1;
	u8    lowerthresh:1;
	u8    reserved:4;
	u8    lower_threshold;
	u8    upper_threshold;
	u8    rolling_average_count;
} __packed;

#define DEFAULT_BA_MAX_RX_BUFFER_SIZE 16

struct hif_mib_block_ack_policy {
	u8    block_ack_tx_tid_policy;
	u8    reserved1;
	u8    block_ack_rx_tid_policy;
	u8    block_ack_rx_max_buffer_size;
} __packed;

struct hif_mib_override_int_rate {
	u8    internal_tx_rate;
	u8    non_erp_internal_tx_rate;
	u8    reserved[2];
} __packed;

enum hif_mpdu_start_spacing {
	HIF_MPDU_START_SPACING_NO_RESTRIC          = 0x0,
	HIF_MPDU_START_SPACING_QUARTER             = 0x1,
	HIF_MPDU_START_SPACING_HALF                = 0x2,
	HIF_MPDU_START_SPACING_ONE                 = 0x3,
	HIF_MPDU_START_SPACING_TWO                 = 0x4,
	HIF_MPDU_START_SPACING_FOUR                = 0x5,
	HIF_MPDU_START_SPACING_EIGHT               = 0x6,
	HIF_MPDU_START_SPACING_SIXTEEN             = 0x7
};

struct hif_mib_set_association_mode {
	u8    preambtype_use:1;
	u8    mode:1;
	u8    rateset:1;
	u8    spacing:1;
	u8    reserved1:4;
	u8    short_preamble:1;
	u8    reserved2:7;
	u8    greenfield:1;
	u8    reserved3:7;
	u8    mpdu_start_spacing;
	u32   basic_rate_set;
} __packed;

struct hif_mib_set_uapsd_information {
	u8    trig_bckgrnd:1;
	u8    trig_be:1;
	u8    trig_video:1;
	u8    trig_voice:1;
	u8    reserved1:4;
	u8    deliv_bckgrnd:1;
	u8    deliv_be:1;
	u8    deliv_video:1;
	u8    deliv_voice:1;
	u8    reserved2:4;
	u16   min_auto_trigger_interval;
	u16   max_auto_trigger_interval;
	u16   auto_trigger_step;
} __packed;

struct hif_mib_tx_rate_retry_policy {
	u8    policy_index;
	u8    short_retry_count;
	u8    long_retry_count;
	u8    first_rate_sel:2;
	u8    terminate:1;
	u8    count_init:1;
	u8    reserved1:4;
	u8    rate_recovery_count;
	u8    reserved2[3];
	u8    rates[12];
} __packed;

#define HIF_MIB_NUM_TX_RATE_RETRY_POLICIES    15

struct hif_mib_set_tx_rate_retry_policy {
	u8    num_tx_rate_policies;
	u8    reserved[3];
	struct hif_mib_tx_rate_retry_policy tx_rate_retry_policy[];
} __packed;

struct hif_mib_protected_mgmt_policy {
	u8   pmf_enable:1;
	u8   unpmf_allowed:1;
	u8   host_enc_auth_frames:1;
	u8   reserved1:5;
	u8   reserved2[3];
} __packed;

struct hif_mib_set_ht_protection {
	u8   dual_cts_prot:1;
	u8   reserved1:7;
	u8   reserved2[3];
} __packed;

struct hif_mib_keep_alive_period {
	u16   keep_alive_period;
	u8    reserved[2];
} __packed;

struct hif_mib_arp_keep_alive_period {
	u16   arp_keep_alive_period;
	u8    encr_type;
	u8    reserved;
	u8    sender_ipv4_address[HIF_API_IPV4_ADDRESS_SIZE];
	u8    target_ipv4_address[HIF_API_IPV4_ADDRESS_SIZE];
} __packed;

struct hif_mib_inactivity_timer {
	u8    min_active_time;
	u8    max_active_time;
	u16   reserved;
} __packed;

struct hif_mib_interface_protection {
	u8   use_cts_prot:1;
	u8   reserved1:7;
	u8   reserved2[3];
} __packed;

#endif
