xref: /openbmc/linux/drivers/net/wireless/silabs/wfx/hif_api_general.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
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