1*4a5fb1bbSJérôme Pouiller /* SPDX-License-Identifier: GPL-2.0-only or Apache-2.0 */ 2*4a5fb1bbSJérôme Pouiller /* 3*4a5fb1bbSJérôme Pouiller * WF200 hardware interface definitions 4*4a5fb1bbSJérôme Pouiller * 5*4a5fb1bbSJérôme Pouiller * Copyright (c) 2018-2020, Silicon Laboratories Inc. 6*4a5fb1bbSJérôme Pouiller */ 7*4a5fb1bbSJérôme Pouiller 8*4a5fb1bbSJérôme Pouiller #ifndef WFX_HIF_API_GENERAL_H 9*4a5fb1bbSJérôme Pouiller #define WFX_HIF_API_GENERAL_H 10*4a5fb1bbSJérôme Pouiller 11*4a5fb1bbSJérôme Pouiller #include <linux/types.h> 12*4a5fb1bbSJérôme Pouiller #include <linux/if_ether.h> 13*4a5fb1bbSJérôme Pouiller 14*4a5fb1bbSJérôme Pouiller #define HIF_ID_IS_INDICATION 0x80 15*4a5fb1bbSJérôme Pouiller #define HIF_COUNTER_MAX 7 16*4a5fb1bbSJérôme Pouiller 17*4a5fb1bbSJérôme Pouiller struct wfx_hif_msg { 18*4a5fb1bbSJérôme Pouiller __le16 len; 19*4a5fb1bbSJérôme Pouiller u8 id; 20*4a5fb1bbSJérôme Pouiller u8 reserved:1; 21*4a5fb1bbSJérôme Pouiller u8 interface:2; 22*4a5fb1bbSJérôme Pouiller u8 seqnum:3; 23*4a5fb1bbSJérôme Pouiller u8 encrypted:2; 24*4a5fb1bbSJérôme Pouiller u8 body[]; 25*4a5fb1bbSJérôme Pouiller } __packed; 26*4a5fb1bbSJérôme Pouiller 27*4a5fb1bbSJérôme Pouiller enum wfx_hif_general_requests_ids { 28*4a5fb1bbSJérôme Pouiller HIF_REQ_ID_CONFIGURATION = 0x09, 29*4a5fb1bbSJérôme Pouiller HIF_REQ_ID_CONTROL_GPIO = 0x26, 30*4a5fb1bbSJérôme Pouiller HIF_REQ_ID_SET_SL_MAC_KEY = 0x27, 31*4a5fb1bbSJérôme Pouiller HIF_REQ_ID_SL_EXCHANGE_PUB_KEYS = 0x28, 32*4a5fb1bbSJérôme Pouiller HIF_REQ_ID_SL_CONFIGURE = 0x29, 33*4a5fb1bbSJérôme Pouiller HIF_REQ_ID_PREVENT_ROLLBACK = 0x2a, 34*4a5fb1bbSJérôme Pouiller HIF_REQ_ID_PTA_SETTINGS = 0x2b, 35*4a5fb1bbSJérôme Pouiller HIF_REQ_ID_PTA_PRIORITY = 0x2c, 36*4a5fb1bbSJérôme Pouiller HIF_REQ_ID_PTA_STATE = 0x2d, 37*4a5fb1bbSJérôme Pouiller HIF_REQ_ID_SHUT_DOWN = 0x32, 38*4a5fb1bbSJérôme Pouiller }; 39*4a5fb1bbSJérôme Pouiller 40*4a5fb1bbSJérôme Pouiller enum wfx_hif_general_confirmations_ids { 41*4a5fb1bbSJérôme Pouiller HIF_CNF_ID_CONFIGURATION = 0x09, 42*4a5fb1bbSJérôme Pouiller HIF_CNF_ID_CONTROL_GPIO = 0x26, 43*4a5fb1bbSJérôme Pouiller HIF_CNF_ID_SET_SL_MAC_KEY = 0x27, 44*4a5fb1bbSJérôme Pouiller HIF_CNF_ID_SL_EXCHANGE_PUB_KEYS = 0x28, 45*4a5fb1bbSJérôme Pouiller HIF_CNF_ID_SL_CONFIGURE = 0x29, 46*4a5fb1bbSJérôme Pouiller HIF_CNF_ID_PREVENT_ROLLBACK = 0x2a, 47*4a5fb1bbSJérôme Pouiller HIF_CNF_ID_PTA_SETTINGS = 0x2b, 48*4a5fb1bbSJérôme Pouiller HIF_CNF_ID_PTA_PRIORITY = 0x2c, 49*4a5fb1bbSJérôme Pouiller HIF_CNF_ID_PTA_STATE = 0x2d, 50*4a5fb1bbSJérôme Pouiller HIF_CNF_ID_SHUT_DOWN = 0x32, 51*4a5fb1bbSJérôme Pouiller }; 52*4a5fb1bbSJérôme Pouiller 53*4a5fb1bbSJérôme Pouiller enum wfx_hif_general_indications_ids { 54*4a5fb1bbSJérôme Pouiller HIF_IND_ID_EXCEPTION = 0xe0, 55*4a5fb1bbSJérôme Pouiller HIF_IND_ID_STARTUP = 0xe1, 56*4a5fb1bbSJérôme Pouiller HIF_IND_ID_WAKEUP = 0xe2, 57*4a5fb1bbSJérôme Pouiller HIF_IND_ID_GENERIC = 0xe3, 58*4a5fb1bbSJérôme Pouiller HIF_IND_ID_ERROR = 0xe4, 59*4a5fb1bbSJérôme Pouiller HIF_IND_ID_SL_EXCHANGE_PUB_KEYS = 0xe5 60*4a5fb1bbSJérôme Pouiller }; 61*4a5fb1bbSJérôme Pouiller 62*4a5fb1bbSJérôme Pouiller #define HIF_STATUS_SUCCESS (cpu_to_le32(0x0000)) 63*4a5fb1bbSJérôme Pouiller #define HIF_STATUS_FAIL (cpu_to_le32(0x0001)) 64*4a5fb1bbSJérôme Pouiller #define HIF_STATUS_INVALID_PARAMETER (cpu_to_le32(0x0002)) 65*4a5fb1bbSJérôme Pouiller #define HIF_STATUS_WARNING (cpu_to_le32(0x0003)) 66*4a5fb1bbSJérôme Pouiller #define HIF_STATUS_UNKNOWN_REQUEST (cpu_to_le32(0x0004)) 67*4a5fb1bbSJérôme Pouiller #define HIF_STATUS_RX_FAIL_DECRYPT (cpu_to_le32(0x0010)) 68*4a5fb1bbSJérôme Pouiller #define HIF_STATUS_RX_FAIL_MIC (cpu_to_le32(0x0011)) 69*4a5fb1bbSJérôme Pouiller #define HIF_STATUS_RX_FAIL_NO_KEY (cpu_to_le32(0x0012)) 70*4a5fb1bbSJérôme Pouiller #define HIF_STATUS_TX_FAIL_RETRIES (cpu_to_le32(0x0013)) 71*4a5fb1bbSJérôme Pouiller #define HIF_STATUS_TX_FAIL_TIMEOUT (cpu_to_le32(0x0014)) 72*4a5fb1bbSJérôme Pouiller #define HIF_STATUS_TX_FAIL_REQUEUE (cpu_to_le32(0x0015)) 73*4a5fb1bbSJérôme Pouiller #define HIF_STATUS_REFUSED (cpu_to_le32(0x0016)) 74*4a5fb1bbSJérôme Pouiller #define HIF_STATUS_BUSY (cpu_to_le32(0x0017)) 75*4a5fb1bbSJérôme Pouiller #define HIF_STATUS_SLK_SET_KEY_SUCCESS (cpu_to_le32(0x005A)) 76*4a5fb1bbSJérôme Pouiller #define HIF_STATUS_SLK_SET_KEY_ALREADY_BURNED (cpu_to_le32(0x006B)) 77*4a5fb1bbSJérôme Pouiller #define HIF_STATUS_SLK_SET_KEY_DISALLOWED_MODE (cpu_to_le32(0x007C)) 78*4a5fb1bbSJérôme Pouiller #define HIF_STATUS_SLK_SET_KEY_UNKNOWN_MODE (cpu_to_le32(0x008D)) 79*4a5fb1bbSJérôme Pouiller #define HIF_STATUS_SLK_NEGO_SUCCESS (cpu_to_le32(0x009E)) 80*4a5fb1bbSJérôme Pouiller #define HIF_STATUS_SLK_NEGO_FAILED (cpu_to_le32(0x00AF)) 81*4a5fb1bbSJérôme Pouiller #define HIF_STATUS_ROLLBACK_SUCCESS (cpu_to_le32(0x1234)) 82*4a5fb1bbSJérôme Pouiller #define HIF_STATUS_ROLLBACK_FAIL (cpu_to_le32(0x1256)) 83*4a5fb1bbSJérôme Pouiller 84*4a5fb1bbSJérôme Pouiller enum wfx_hif_api_rate_index { 85*4a5fb1bbSJérôme Pouiller API_RATE_INDEX_B_1MBPS = 0, 86*4a5fb1bbSJérôme Pouiller API_RATE_INDEX_B_2MBPS = 1, 87*4a5fb1bbSJérôme Pouiller API_RATE_INDEX_B_5P5MBPS = 2, 88*4a5fb1bbSJérôme Pouiller API_RATE_INDEX_B_11MBPS = 3, 89*4a5fb1bbSJérôme Pouiller API_RATE_INDEX_PBCC_22MBPS = 4, 90*4a5fb1bbSJérôme Pouiller API_RATE_INDEX_PBCC_33MBPS = 5, 91*4a5fb1bbSJérôme Pouiller API_RATE_INDEX_G_6MBPS = 6, 92*4a5fb1bbSJérôme Pouiller API_RATE_INDEX_G_9MBPS = 7, 93*4a5fb1bbSJérôme Pouiller API_RATE_INDEX_G_12MBPS = 8, 94*4a5fb1bbSJérôme Pouiller API_RATE_INDEX_G_18MBPS = 9, 95*4a5fb1bbSJérôme Pouiller API_RATE_INDEX_G_24MBPS = 10, 96*4a5fb1bbSJérôme Pouiller API_RATE_INDEX_G_36MBPS = 11, 97*4a5fb1bbSJérôme Pouiller API_RATE_INDEX_G_48MBPS = 12, 98*4a5fb1bbSJérôme Pouiller API_RATE_INDEX_G_54MBPS = 13, 99*4a5fb1bbSJérôme Pouiller API_RATE_INDEX_N_6P5MBPS = 14, 100*4a5fb1bbSJérôme Pouiller API_RATE_INDEX_N_13MBPS = 15, 101*4a5fb1bbSJérôme Pouiller API_RATE_INDEX_N_19P5MBPS = 16, 102*4a5fb1bbSJérôme Pouiller API_RATE_INDEX_N_26MBPS = 17, 103*4a5fb1bbSJérôme Pouiller API_RATE_INDEX_N_39MBPS = 18, 104*4a5fb1bbSJérôme Pouiller API_RATE_INDEX_N_52MBPS = 19, 105*4a5fb1bbSJérôme Pouiller API_RATE_INDEX_N_58P5MBPS = 20, 106*4a5fb1bbSJérôme Pouiller API_RATE_INDEX_N_65MBPS = 21, 107*4a5fb1bbSJérôme Pouiller API_RATE_NUM_ENTRIES = 22 108*4a5fb1bbSJérôme Pouiller }; 109*4a5fb1bbSJérôme Pouiller 110*4a5fb1bbSJérôme Pouiller struct wfx_hif_ind_startup { 111*4a5fb1bbSJérôme Pouiller __le32 status; 112*4a5fb1bbSJérôme Pouiller __le16 hardware_id; 113*4a5fb1bbSJérôme Pouiller u8 opn[14]; 114*4a5fb1bbSJérôme Pouiller u8 uid[8]; 115*4a5fb1bbSJérôme Pouiller __le16 num_inp_ch_bufs; 116*4a5fb1bbSJérôme Pouiller __le16 size_inp_ch_buf; 117*4a5fb1bbSJérôme Pouiller u8 num_links_ap; 118*4a5fb1bbSJérôme Pouiller u8 num_interfaces; 119*4a5fb1bbSJérôme Pouiller u8 mac_addr[2][ETH_ALEN]; 120*4a5fb1bbSJérôme Pouiller u8 api_version_minor; 121*4a5fb1bbSJérôme Pouiller u8 api_version_major; 122*4a5fb1bbSJérôme Pouiller u8 link_mode:2; 123*4a5fb1bbSJérôme Pouiller u8 reserved1:6; 124*4a5fb1bbSJérôme Pouiller u8 reserved2; 125*4a5fb1bbSJérôme Pouiller u8 reserved3; 126*4a5fb1bbSJérôme Pouiller u8 reserved4; 127*4a5fb1bbSJérôme Pouiller u8 firmware_build; 128*4a5fb1bbSJérôme Pouiller u8 firmware_minor; 129*4a5fb1bbSJérôme Pouiller u8 firmware_major; 130*4a5fb1bbSJérôme Pouiller u8 firmware_type; 131*4a5fb1bbSJérôme Pouiller u8 disabled_channel_list[2]; 132*4a5fb1bbSJérôme Pouiller u8 region_sel_mode:4; 133*4a5fb1bbSJérôme Pouiller u8 reserved5:4; 134*4a5fb1bbSJérôme Pouiller u8 phy1_region:3; 135*4a5fb1bbSJérôme Pouiller u8 phy0_region:3; 136*4a5fb1bbSJérôme Pouiller u8 otp_phy_ver:2; 137*4a5fb1bbSJérôme Pouiller __le32 supported_rate_mask; 138*4a5fb1bbSJérôme Pouiller u8 firmware_label[128]; 139*4a5fb1bbSJérôme Pouiller } __packed; 140*4a5fb1bbSJérôme Pouiller 141*4a5fb1bbSJérôme Pouiller struct wfx_hif_ind_wakeup { 142*4a5fb1bbSJérôme Pouiller } __packed; 143*4a5fb1bbSJérôme Pouiller 144*4a5fb1bbSJérôme Pouiller struct wfx_hif_req_configuration { 145*4a5fb1bbSJérôme Pouiller __le16 length; 146*4a5fb1bbSJérôme Pouiller u8 pds_data[]; 147*4a5fb1bbSJérôme Pouiller } __packed; 148*4a5fb1bbSJérôme Pouiller 149*4a5fb1bbSJérôme Pouiller struct wfx_hif_cnf_configuration { 150*4a5fb1bbSJérôme Pouiller __le32 status; 151*4a5fb1bbSJérôme Pouiller } __packed; 152*4a5fb1bbSJérôme Pouiller 153*4a5fb1bbSJérôme Pouiller enum wfx_hif_gpio_mode { 154*4a5fb1bbSJérôme Pouiller HIF_GPIO_MODE_D0 = 0x0, 155*4a5fb1bbSJérôme Pouiller HIF_GPIO_MODE_D1 = 0x1, 156*4a5fb1bbSJérôme Pouiller HIF_GPIO_MODE_OD0 = 0x2, 157*4a5fb1bbSJérôme Pouiller HIF_GPIO_MODE_OD1 = 0x3, 158*4a5fb1bbSJérôme Pouiller HIF_GPIO_MODE_TRISTATE = 0x4, 159*4a5fb1bbSJérôme Pouiller HIF_GPIO_MODE_TOGGLE = 0x5, 160*4a5fb1bbSJérôme Pouiller HIF_GPIO_MODE_READ = 0x6 161*4a5fb1bbSJérôme Pouiller }; 162*4a5fb1bbSJérôme Pouiller 163*4a5fb1bbSJérôme Pouiller struct wfx_hif_req_control_gpio { 164*4a5fb1bbSJérôme Pouiller u8 gpio_label; 165*4a5fb1bbSJérôme Pouiller u8 gpio_mode; 166*4a5fb1bbSJérôme Pouiller } __packed; 167*4a5fb1bbSJérôme Pouiller 168*4a5fb1bbSJérôme Pouiller struct wfx_hif_cnf_control_gpio { 169*4a5fb1bbSJérôme Pouiller __le32 status; 170*4a5fb1bbSJérôme Pouiller __le32 value; 171*4a5fb1bbSJérôme Pouiller } __packed; 172*4a5fb1bbSJérôme Pouiller 173*4a5fb1bbSJérôme Pouiller enum wfx_hif_generic_indication_type { 174*4a5fb1bbSJérôme Pouiller HIF_GENERIC_INDICATION_TYPE_RAW = 0x0, 175*4a5fb1bbSJérôme Pouiller HIF_GENERIC_INDICATION_TYPE_STRING = 0x1, 176*4a5fb1bbSJérôme Pouiller HIF_GENERIC_INDICATION_TYPE_RX_STATS = 0x2, 177*4a5fb1bbSJérôme Pouiller HIF_GENERIC_INDICATION_TYPE_TX_POWER_LOOP_INFO = 0x3, 178*4a5fb1bbSJérôme Pouiller }; 179*4a5fb1bbSJérôme Pouiller 180*4a5fb1bbSJérôme Pouiller struct wfx_hif_rx_stats { 181*4a5fb1bbSJérôme Pouiller __le32 nb_rx_frame; 182*4a5fb1bbSJérôme Pouiller __le32 nb_crc_frame; 183*4a5fb1bbSJérôme Pouiller __le32 per_total; 184*4a5fb1bbSJérôme Pouiller __le32 throughput; 185*4a5fb1bbSJérôme Pouiller __le32 nb_rx_by_rate[API_RATE_NUM_ENTRIES]; 186*4a5fb1bbSJérôme Pouiller __le16 per[API_RATE_NUM_ENTRIES]; 187*4a5fb1bbSJérôme Pouiller __le16 snr[API_RATE_NUM_ENTRIES]; /* signed value */ 188*4a5fb1bbSJérôme Pouiller __le16 rssi[API_RATE_NUM_ENTRIES]; /* signed value */ 189*4a5fb1bbSJérôme Pouiller __le16 cfo[API_RATE_NUM_ENTRIES]; /* signed value */ 190*4a5fb1bbSJérôme Pouiller __le32 date; 191*4a5fb1bbSJérôme Pouiller __le32 pwr_clk_freq; 192*4a5fb1bbSJérôme Pouiller u8 is_ext_pwr_clk; 193*4a5fb1bbSJérôme Pouiller s8 current_temp; 194*4a5fb1bbSJérôme Pouiller } __packed; 195*4a5fb1bbSJérôme Pouiller 196*4a5fb1bbSJérôme Pouiller struct wfx_hif_tx_power_loop_info { 197*4a5fb1bbSJérôme Pouiller __le16 tx_gain_dig; 198*4a5fb1bbSJérôme Pouiller __le16 tx_gain_pa; 199*4a5fb1bbSJérôme Pouiller __le16 target_pout; /* signed value */ 200*4a5fb1bbSJérôme Pouiller __le16 p_estimation; /* signed value */ 201*4a5fb1bbSJérôme Pouiller __le16 vpdet; 202*4a5fb1bbSJérôme Pouiller u8 measurement_index; 203*4a5fb1bbSJérôme Pouiller u8 reserved; 204*4a5fb1bbSJérôme Pouiller } __packed; 205*4a5fb1bbSJérôme Pouiller 206*4a5fb1bbSJérôme Pouiller struct wfx_hif_ind_generic { 207*4a5fb1bbSJérôme Pouiller __le32 type; 208*4a5fb1bbSJérôme Pouiller union { 209*4a5fb1bbSJérôme Pouiller struct wfx_hif_rx_stats rx_stats; 210*4a5fb1bbSJérôme Pouiller struct wfx_hif_tx_power_loop_info tx_power_loop_info; 211*4a5fb1bbSJérôme Pouiller } data; 212*4a5fb1bbSJérôme Pouiller } __packed; 213*4a5fb1bbSJérôme Pouiller 214*4a5fb1bbSJérôme Pouiller enum wfx_hif_error { 215*4a5fb1bbSJérôme Pouiller HIF_ERROR_FIRMWARE_ROLLBACK = 0x00, 216*4a5fb1bbSJérôme Pouiller HIF_ERROR_FIRMWARE_DEBUG_ENABLED = 0x01, 217*4a5fb1bbSJérôme Pouiller HIF_ERROR_SLK_OUTDATED_SESSION_KEY = 0x02, 218*4a5fb1bbSJérôme Pouiller HIF_ERROR_SLK_SESSION_KEY = 0x03, 219*4a5fb1bbSJérôme Pouiller HIF_ERROR_OOR_VOLTAGE = 0x04, 220*4a5fb1bbSJérôme Pouiller HIF_ERROR_PDS_PAYLOAD = 0x05, 221*4a5fb1bbSJérôme Pouiller HIF_ERROR_OOR_TEMPERATURE = 0x06, 222*4a5fb1bbSJérôme Pouiller HIF_ERROR_SLK_REQ_DURING_KEY_EXCHANGE = 0x07, 223*4a5fb1bbSJérôme Pouiller HIF_ERROR_SLK_MULTI_TX_UNSUPPORTED = 0x08, 224*4a5fb1bbSJérôme Pouiller HIF_ERROR_SLK_OVERFLOW = 0x09, 225*4a5fb1bbSJérôme Pouiller HIF_ERROR_SLK_DECRYPTION = 0x0a, 226*4a5fb1bbSJérôme Pouiller HIF_ERROR_SLK_WRONG_ENCRYPTION_STATE = 0x0b, 227*4a5fb1bbSJérôme Pouiller HIF_ERROR_HIF_BUS_FREQUENCY_TOO_LOW = 0x0c, 228*4a5fb1bbSJérôme Pouiller HIF_ERROR_HIF_RX_DATA_TOO_LARGE = 0x0e, 229*4a5fb1bbSJérôme Pouiller HIF_ERROR_HIF_TX_QUEUE_FULL = 0x0d, 230*4a5fb1bbSJérôme Pouiller HIF_ERROR_HIF_BUS = 0x0f, 231*4a5fb1bbSJérôme Pouiller HIF_ERROR_PDS_TESTFEATURE = 0x10, 232*4a5fb1bbSJérôme Pouiller HIF_ERROR_SLK_UNCONFIGURED = 0x11, 233*4a5fb1bbSJérôme Pouiller }; 234*4a5fb1bbSJérôme Pouiller 235*4a5fb1bbSJérôme Pouiller struct wfx_hif_ind_error { 236*4a5fb1bbSJérôme Pouiller __le32 type; 237*4a5fb1bbSJérôme Pouiller u8 data[]; 238*4a5fb1bbSJérôme Pouiller } __packed; 239*4a5fb1bbSJérôme Pouiller 240*4a5fb1bbSJérôme Pouiller struct wfx_hif_ind_exception { 241*4a5fb1bbSJérôme Pouiller __le32 type; 242*4a5fb1bbSJérôme Pouiller u8 data[]; 243*4a5fb1bbSJérôme Pouiller } __packed; 244*4a5fb1bbSJérôme Pouiller 245*4a5fb1bbSJérôme Pouiller enum wfx_hif_secure_link_state { 246*4a5fb1bbSJérôme Pouiller SEC_LINK_UNAVAILABLE = 0x0, 247*4a5fb1bbSJérôme Pouiller SEC_LINK_RESERVED = 0x1, 248*4a5fb1bbSJérôme Pouiller SEC_LINK_EVAL = 0x2, 249*4a5fb1bbSJérôme Pouiller SEC_LINK_ENFORCED = 0x3 250*4a5fb1bbSJérôme Pouiller }; 251*4a5fb1bbSJérôme Pouiller 252*4a5fb1bbSJérôme Pouiller #endif 253