1*73b01e57SJeff Chen /* SPDX-License-Identifier: GPL-2.0-only */
2*73b01e57SJeff Chen /*
3*73b01e57SJeff Chen * NXP Wireless LAN device driver: ioctl data structures & APIs
4*73b01e57SJeff Chen *
5*73b01e57SJeff Chen * Copyright 2011-2024 NXP
6*73b01e57SJeff Chen */
7*73b01e57SJeff Chen
8*73b01e57SJeff Chen #ifndef _NXPWIFI_CFG_H_
9*73b01e57SJeff Chen #define _NXPWIFI_CFG_H_
10*73b01e57SJeff Chen
11*73b01e57SJeff Chen #include <linux/wait.h>
12*73b01e57SJeff Chen #include <linux/timer.h>
13*73b01e57SJeff Chen #include <linux/ieee80211.h>
14*73b01e57SJeff Chen #include <uapi/linux/if_arp.h>
15*73b01e57SJeff Chen #include <net/cfg80211.h>
16*73b01e57SJeff Chen
17*73b01e57SJeff Chen #define NUM_WEP_KEYS 4
18*73b01e57SJeff Chen
19*73b01e57SJeff Chen #define NXPWIFI_BSS_COEX_COUNT 2
20*73b01e57SJeff Chen #define NXPWIFI_MAX_BSS_NUM (3)
21*73b01e57SJeff Chen
22*73b01e57SJeff Chen #define NXPWIFI_MAX_CSA_COUNTERS 5
23*73b01e57SJeff Chen
24*73b01e57SJeff Chen #define NXPWIFI_DMA_ALIGN_SZ 64
25*73b01e57SJeff Chen #define NXPWIFI_RX_HEADROOM 64
26*73b01e57SJeff Chen #define MAX_TXPD_SZ 32
27*73b01e57SJeff Chen #define INTF_HDR_ALIGN 4
28*73b01e57SJeff Chen /* special FW 4 address management header */
29*73b01e57SJeff Chen #define NXPWIFI_MIN_DATA_HEADER_LEN (NXPWIFI_DMA_ALIGN_SZ + INTF_HDR_ALIGN + \
30*73b01e57SJeff Chen MAX_TXPD_SZ)
31*73b01e57SJeff Chen
32*73b01e57SJeff Chen #define NXPWIFI_MGMT_FRAME_HEADER_SIZE 8 /* sizeof(pkt_type)
33*73b01e57SJeff Chen * + sizeof(tx_control)
34*73b01e57SJeff Chen */
35*73b01e57SJeff Chen
36*73b01e57SJeff Chen #define FRMCTL_LEN 2
37*73b01e57SJeff Chen #define DURATION_LEN 2
38*73b01e57SJeff Chen #define SEQCTL_LEN 2
39*73b01e57SJeff Chen #define NXPWIFI_MGMT_HEADER_LEN (FRMCTL_LEN + FRMCTL_LEN + ETH_ALEN + \
40*73b01e57SJeff Chen ETH_ALEN + ETH_ALEN + SEQCTL_LEN + ETH_ALEN)
41*73b01e57SJeff Chen
42*73b01e57SJeff Chen #define AUTH_ALG_LEN 2
43*73b01e57SJeff Chen #define AUTH_TRANSACTION_LEN 2
44*73b01e57SJeff Chen #define AUTH_STATUS_LEN 2
45*73b01e57SJeff Chen #define NXPWIFI_AUTH_BODY_LEN (AUTH_ALG_LEN + AUTH_TRANSACTION_LEN + \
46*73b01e57SJeff Chen AUTH_STATUS_LEN)
47*73b01e57SJeff Chen
48*73b01e57SJeff Chen #define HOST_MLME_AUTH_PENDING BIT(0)
49*73b01e57SJeff Chen #define HOST_MLME_AUTH_DONE BIT(1)
50*73b01e57SJeff Chen
51*73b01e57SJeff Chen #define HOST_MLME_MGMT_MASK (BIT(IEEE80211_STYPE_AUTH >> 4) | \
52*73b01e57SJeff Chen BIT(IEEE80211_STYPE_DEAUTH >> 4) | \
53*73b01e57SJeff Chen BIT(IEEE80211_STYPE_DISASSOC >> 4))
54*73b01e57SJeff Chen
55*73b01e57SJeff Chen #define AUTH_TX_DEFAULT_WAIT_TIME 2400
56*73b01e57SJeff Chen
57*73b01e57SJeff Chen #define WLAN_AUTH_NONE 0xFFFF
58*73b01e57SJeff Chen
59*73b01e57SJeff Chen #define NXPWIFI_MAX_TX_BASTREAM_SUPPORTED 2
60*73b01e57SJeff Chen #define NXPWIFI_MAX_RX_BASTREAM_SUPPORTED 16
61*73b01e57SJeff Chen
62*73b01e57SJeff Chen #define NXPWIFI_STA_AMPDU_DEF_TXWINSIZE 64
63*73b01e57SJeff Chen #define NXPWIFI_STA_AMPDU_DEF_RXWINSIZE 64
64*73b01e57SJeff Chen #define NXPWIFI_STA_COEX_AMPDU_DEF_RXWINSIZE 16
65*73b01e57SJeff Chen
66*73b01e57SJeff Chen #define NXPWIFI_UAP_AMPDU_DEF_TXWINSIZE 32
67*73b01e57SJeff Chen
68*73b01e57SJeff Chen #define NXPWIFI_UAP_COEX_AMPDU_DEF_RXWINSIZE 16
69*73b01e57SJeff Chen
70*73b01e57SJeff Chen #define NXPWIFI_UAP_AMPDU_DEF_RXWINSIZE 16
71*73b01e57SJeff Chen #define NXPWIFI_11AC_STA_AMPDU_DEF_TXWINSIZE 64
72*73b01e57SJeff Chen #define NXPWIFI_11AC_STA_AMPDU_DEF_RXWINSIZE 64
73*73b01e57SJeff Chen #define NXPWIFI_11AC_UAP_AMPDU_DEF_TXWINSIZE 64
74*73b01e57SJeff Chen #define NXPWIFI_11AC_UAP_AMPDU_DEF_RXWINSIZE 64
75*73b01e57SJeff Chen
76*73b01e57SJeff Chen #define NXPWIFI_DEFAULT_BLOCK_ACK_TIMEOUT 0xffff
77*73b01e57SJeff Chen
78*73b01e57SJeff Chen #define NXPWIFI_RATE_BITMAP_MCS0 32
79*73b01e57SJeff Chen
80*73b01e57SJeff Chen #define NXPWIFI_RX_DATA_BUF_SIZE (4 * 1024)
81*73b01e57SJeff Chen #define NXPWIFI_RX_CMD_BUF_SIZE (2 * 1024)
82*73b01e57SJeff Chen
83*73b01e57SJeff Chen #define NXPWIFI_BEACON_PERIOD_MAX (4000)
84*73b01e57SJeff Chen #define NXPWIFI_BEACON_PERIOD_MIN (50)
85*73b01e57SJeff Chen #define NXPWIFI_INVALID_BEACON_PERIOD (NXPWIFI_BEACON_PERIOD_MAX + 1)
86*73b01e57SJeff Chen #define NXPWIFI_MAX_DTIM_PERIOD (100)
87*73b01e57SJeff Chen #define NXPWIFI_MIN_DTIM_PERIOD (1)
88*73b01e57SJeff Chen #define NXPWIFI_INVALID_DTIM_PERIOD (NXPWIFI_MAX_DTIM_PERIOD + 1)
89*73b01e57SJeff Chen #define NXPWIFI_RTS_THRESHOLD_MIN (0)
90*73b01e57SJeff Chen #define NXPWIFI_RTS_THRESHOLD_MAX (2347)
91*73b01e57SJeff Chen #define NXPWIFI_INVALID_RTS (NXPWIFI_RTS_THRESHOLD_MAX + 1)
92*73b01e57SJeff Chen #define NXPWIFI_FRAG_THRESHOLD_MIN (256)
93*73b01e57SJeff Chen #define NXPWIFI_FRAG_THRESHOLD_MAX (2346)
94*73b01e57SJeff Chen #define NXPWIFI_INVALID_FRAG (NXPWIFI_FRAG_THRESHOLD_MAX + 1)
95*73b01e57SJeff Chen #define NXPWIFI_RETRY_LIMIT_MAX 14
96*73b01e57SJeff Chen #define NXPWIFI_INVALID_RETRY_LIMI (NXPWIFI_RETRY_LIMIT_MAX + 1)
97*73b01e57SJeff Chen
98*73b01e57SJeff Chen enum nxpwifi_bcast_ssid_ctl {
99*73b01e57SJeff Chen /* Hide SSID in beacons (SSID length = 0) */
100*73b01e57SJeff Chen NXPWIFI_BCAST_SSID_HIDE_LEN_ZERO = 0,
101*73b01e57SJeff Chen /* Do not hide SSID (normal broadcast) */
102*73b01e57SJeff Chen NXPWIFI_BCAST_SSID_VISIBLE,
103*73b01e57SJeff Chen /* Hide SSID, clear SSID content (ASCII 0),
104*73b01e57SJeff Chen * but keep the original SSID length
105*73b01e57SJeff Chen */
106*73b01e57SJeff Chen NXPWIFI_BCAST_SSID_HIDE_LEN_RETAIN,
107*73b01e57SJeff Chen };
108*73b01e57SJeff Chen
109*73b01e57SJeff Chen enum nxpwifi_radio_ctl {
110*73b01e57SJeff Chen NXPWIFI_RADIO_CTL_DISABLE = 0,
111*73b01e57SJeff Chen NXPWIFI_RADIO_CTL_ENABLE,
112*73b01e57SJeff Chen __NXPWIFI_RADIO_CTL_MAX,
113*73b01e57SJeff Chen };
114*73b01e57SJeff Chen
nxpwifi_radio_ctl_valid(enum nxpwifi_radio_ctl v)115*73b01e57SJeff Chen static inline bool nxpwifi_radio_ctl_valid(enum nxpwifi_radio_ctl v)
116*73b01e57SJeff Chen {
117*73b01e57SJeff Chen return v < __NXPWIFI_RADIO_CTL_MAX;
118*73b01e57SJeff Chen }
119*73b01e57SJeff Chen
120*73b01e57SJeff Chen #define NXPWIFI_WMM_VERSION 0x01
121*73b01e57SJeff Chen #define NXPWIFI_WMM_SUBTYPE 0x01
122*73b01e57SJeff Chen
123*73b01e57SJeff Chen #define NXPWIFI_SDIO_BLOCK_SIZE 256
124*73b01e57SJeff Chen
125*73b01e57SJeff Chen #define NXPWIFI_BUF_FLAG_REQUEUED_PKT BIT(0)
126*73b01e57SJeff Chen #define NXPWIFI_BUF_FLAG_BRIDGED_PKT BIT(1)
127*73b01e57SJeff Chen #define NXPWIFI_BUF_FLAG_EAPOL_TX_STATUS BIT(3)
128*73b01e57SJeff Chen #define NXPWIFI_BUF_FLAG_ACTION_TX_STATUS BIT(4)
129*73b01e57SJeff Chen #define NXPWIFI_BUF_FLAG_AGGR_PKT BIT(5)
130*73b01e57SJeff Chen
131*73b01e57SJeff Chen #define NXPWIFI_BRIDGED_PKTS_THR_HIGH 1024
132*73b01e57SJeff Chen #define NXPWIFI_BRIDGED_PKTS_THR_LOW 128
133*73b01e57SJeff Chen
134*73b01e57SJeff Chen /* 54M rates, index from 0 to 11 */
135*73b01e57SJeff Chen #define NXPWIFI_RATE_INDEX_MCS0 12
136*73b01e57SJeff Chen /* 12-27=MCS0-15(BW20) */
137*73b01e57SJeff Chen #define NXPWIFI_BW20_MCS_NUM 15
138*73b01e57SJeff Chen
139*73b01e57SJeff Chen /* Rate index for OFDM 0 */
140*73b01e57SJeff Chen #define NXPWIFI_RATE_INDEX_OFDM0 4
141*73b01e57SJeff Chen
142*73b01e57SJeff Chen #define NXPWIFI_MAX_STA_NUM 3
143*73b01e57SJeff Chen #define NXPWIFI_MAX_UAP_NUM 3
144*73b01e57SJeff Chen
145*73b01e57SJeff Chen #define NXPWIFI_A_BAND_START_FREQ 5000
146*73b01e57SJeff Chen
147*73b01e57SJeff Chen /* SDIO Aggr data packet special info */
148*73b01e57SJeff Chen #define SDIO_MAX_AGGR_BUF_SIZE (256 * 255)
149*73b01e57SJeff Chen #define BLOCK_NUMBER_OFFSET 15
150*73b01e57SJeff Chen #define SDIO_HEADER_OFFSET 28
151*73b01e57SJeff Chen
152*73b01e57SJeff Chen #define NXPWIFI_SIZE_4K 0x4000
153*73b01e57SJeff Chen #define NXPWIFI_EXT_CAPAB_IE_LEN 10
154*73b01e57SJeff Chen
155*73b01e57SJeff Chen enum nxpwifi_bss_type {
156*73b01e57SJeff Chen NXPWIFI_BSS_TYPE_STA = 0,
157*73b01e57SJeff Chen NXPWIFI_BSS_TYPE_UAP = 1,
158*73b01e57SJeff Chen NXPWIFI_BSS_TYPE_ANY = 0xff,
159*73b01e57SJeff Chen };
160*73b01e57SJeff Chen
161*73b01e57SJeff Chen enum nxpwifi_bss_role {
162*73b01e57SJeff Chen NXPWIFI_BSS_ROLE_STA = 0,
163*73b01e57SJeff Chen NXPWIFI_BSS_ROLE_UAP = 1,
164*73b01e57SJeff Chen NXPWIFI_BSS_ROLE_ANY = 0xff,
165*73b01e57SJeff Chen };
166*73b01e57SJeff Chen
167*73b01e57SJeff Chen #define BSS_ROLE_BIT_MASK BIT(0)
168*73b01e57SJeff Chen
169*73b01e57SJeff Chen #define GET_BSS_ROLE(priv) ((priv)->bss_role & BSS_ROLE_BIT_MASK)
170*73b01e57SJeff Chen
171*73b01e57SJeff Chen enum nxpwifi_data_frame_type {
172*73b01e57SJeff Chen NXPWIFI_DATA_FRAME_TYPE_ETH_II = 0,
173*73b01e57SJeff Chen NXPWIFI_DATA_FRAME_TYPE_802_11,
174*73b01e57SJeff Chen };
175*73b01e57SJeff Chen
176*73b01e57SJeff Chen struct nxpwifi_fw_image {
177*73b01e57SJeff Chen u8 *helper_buf;
178*73b01e57SJeff Chen u32 helper_len;
179*73b01e57SJeff Chen u8 *fw_buf;
180*73b01e57SJeff Chen u32 fw_len;
181*73b01e57SJeff Chen };
182*73b01e57SJeff Chen
183*73b01e57SJeff Chen struct nxpwifi_802_11_ssid {
184*73b01e57SJeff Chen u32 ssid_len;
185*73b01e57SJeff Chen u8 ssid[IEEE80211_MAX_SSID_LEN];
186*73b01e57SJeff Chen };
187*73b01e57SJeff Chen
188*73b01e57SJeff Chen struct nxpwifi_wait_queue {
189*73b01e57SJeff Chen wait_queue_head_t wait;
190*73b01e57SJeff Chen int status;
191*73b01e57SJeff Chen };
192*73b01e57SJeff Chen
193*73b01e57SJeff Chen struct nxpwifi_rxinfo {
194*73b01e57SJeff Chen struct sk_buff *parent;
195*73b01e57SJeff Chen u8 bss_num;
196*73b01e57SJeff Chen u8 bss_type;
197*73b01e57SJeff Chen u8 use_count;
198*73b01e57SJeff Chen u8 buf_type;
199*73b01e57SJeff Chen u16 pkt_len;
200*73b01e57SJeff Chen };
201*73b01e57SJeff Chen
202*73b01e57SJeff Chen struct nxpwifi_txinfo {
203*73b01e57SJeff Chen u8 flags;
204*73b01e57SJeff Chen u8 bss_num;
205*73b01e57SJeff Chen u8 bss_type;
206*73b01e57SJeff Chen u8 aggr_num;
207*73b01e57SJeff Chen u32 pkt_len;
208*73b01e57SJeff Chen u8 ack_frame_id;
209*73b01e57SJeff Chen u64 cookie;
210*73b01e57SJeff Chen };
211*73b01e57SJeff Chen
212*73b01e57SJeff Chen enum nxpwifi_wmm_ac_e {
213*73b01e57SJeff Chen WMM_AC_BK,
214*73b01e57SJeff Chen WMM_AC_BE,
215*73b01e57SJeff Chen WMM_AC_VI,
216*73b01e57SJeff Chen WMM_AC_VO
217*73b01e57SJeff Chen } __packed;
218*73b01e57SJeff Chen
219*73b01e57SJeff Chen struct nxpwifi_types_wmm_info {
220*73b01e57SJeff Chen u8 oui[4];
221*73b01e57SJeff Chen u8 subtype;
222*73b01e57SJeff Chen u8 version;
223*73b01e57SJeff Chen u8 qos_info;
224*73b01e57SJeff Chen u8 reserved;
225*73b01e57SJeff Chen struct ieee80211_wmm_ac_param ac[IEEE80211_NUM_ACS];
226*73b01e57SJeff Chen } __packed;
227*73b01e57SJeff Chen
228*73b01e57SJeff Chen struct nxpwifi_arp_eth_header {
229*73b01e57SJeff Chen struct arphdr hdr;
230*73b01e57SJeff Chen u8 ar_sha[ETH_ALEN];
231*73b01e57SJeff Chen u8 ar_sip[4];
232*73b01e57SJeff Chen u8 ar_tha[ETH_ALEN];
233*73b01e57SJeff Chen u8 ar_tip[4];
234*73b01e57SJeff Chen } __packed;
235*73b01e57SJeff Chen
236*73b01e57SJeff Chen struct nxpwifi_chan_stats {
237*73b01e57SJeff Chen u8 chan_num;
238*73b01e57SJeff Chen u8 bandcfg;
239*73b01e57SJeff Chen u8 flags;
240*73b01e57SJeff Chen s8 noise;
241*73b01e57SJeff Chen u16 total_bss;
242*73b01e57SJeff Chen u16 cca_scan_dur;
243*73b01e57SJeff Chen u16 cca_busy_dur;
244*73b01e57SJeff Chen } __packed;
245*73b01e57SJeff Chen
246*73b01e57SJeff Chen #define NXPWIFI_HIST_MAX_SAMPLES 1048576
247*73b01e57SJeff Chen #define NXPWIFI_MAX_RX_RATES 44
248*73b01e57SJeff Chen #define NXPWIFI_MAX_AC_RX_RATES 74
249*73b01e57SJeff Chen #define NXPWIFI_MAX_SNR 256
250*73b01e57SJeff Chen #define NXPWIFI_MAX_NOISE_FLR 256
251*73b01e57SJeff Chen #define NXPWIFI_MAX_SIG_STRENGTH 256
252*73b01e57SJeff Chen
253*73b01e57SJeff Chen struct nxpwifi_histogram_data {
254*73b01e57SJeff Chen atomic_t rx_rate[NXPWIFI_MAX_AC_RX_RATES];
255*73b01e57SJeff Chen atomic_t snr[NXPWIFI_MAX_SNR];
256*73b01e57SJeff Chen atomic_t noise_flr[NXPWIFI_MAX_NOISE_FLR];
257*73b01e57SJeff Chen atomic_t sig_str[NXPWIFI_MAX_SIG_STRENGTH];
258*73b01e57SJeff Chen atomic_t num_samples;
259*73b01e57SJeff Chen };
260*73b01e57SJeff Chen
261*73b01e57SJeff Chen struct nxpwifi_iface_comb {
262*73b01e57SJeff Chen u8 sta_intf;
263*73b01e57SJeff Chen u8 uap_intf;
264*73b01e57SJeff Chen };
265*73b01e57SJeff Chen
266*73b01e57SJeff Chen struct nxpwifi_radar_params {
267*73b01e57SJeff Chen struct cfg80211_chan_def *chandef;
268*73b01e57SJeff Chen u32 cac_time_ms;
269*73b01e57SJeff Chen } __packed;
270*73b01e57SJeff Chen
271*73b01e57SJeff Chen struct nxpwifi_11h_intf_state {
272*73b01e57SJeff Chen bool is_11h_enabled;
273*73b01e57SJeff Chen bool is_11h_active;
274*73b01e57SJeff Chen } __packed;
275*73b01e57SJeff Chen
276*73b01e57SJeff Chen #define NXPWIFI_FW_DUMP_IDX 0xff
277*73b01e57SJeff Chen #define NXPWIFI_FW_DUMP_MAX_MEMSIZE 0x160000
278*73b01e57SJeff Chen #define NXPWIFI_DRV_INFO_IDX 20
279*73b01e57SJeff Chen #define FW_DUMP_MAX_NAME_LEN 8
280*73b01e57SJeff Chen #define FW_DUMP_HOST_READY 0xEE
281*73b01e57SJeff Chen #define FW_DUMP_DONE 0xFF
282*73b01e57SJeff Chen #define FW_DUMP_READ_DONE 0xFE
283*73b01e57SJeff Chen
284*73b01e57SJeff Chen /* Channel bandwidth */
285*73b01e57SJeff Chen #define CHANNEL_BW_20MHZ 0
286*73b01e57SJeff Chen #define CHANNEL_BW_40MHZ_ABOVE 1
287*73b01e57SJeff Chen #define CHANNEL_BW_40MHZ_BELOW 3
288*73b01e57SJeff Chen /* secondary channel is 80MHz bandwidth for 11ac */
289*73b01e57SJeff Chen #define CHANNEL_BW_80MHZ 4
290*73b01e57SJeff Chen #define CHANNEL_BW_160MHZ 5
291*73b01e57SJeff Chen
292*73b01e57SJeff Chen struct memory_type_mapping {
293*73b01e57SJeff Chen u8 mem_name[FW_DUMP_MAX_NAME_LEN];
294*73b01e57SJeff Chen u8 *mem_ptr;
295*73b01e57SJeff Chen u32 mem_size;
296*73b01e57SJeff Chen u8 done_flag;
297*73b01e57SJeff Chen };
298*73b01e57SJeff Chen
299*73b01e57SJeff Chen enum rdwr_status {
300*73b01e57SJeff Chen RDWR_STATUS_SUCCESS = 0,
301*73b01e57SJeff Chen RDWR_STATUS_FAILURE = 1,
302*73b01e57SJeff Chen RDWR_STATUS_DONE = 2
303*73b01e57SJeff Chen };
304*73b01e57SJeff Chen
305*73b01e57SJeff Chen enum nxpwifi_chan_band {
306*73b01e57SJeff Chen BAND_2GHZ = 0,
307*73b01e57SJeff Chen BAND_5GHZ,
308*73b01e57SJeff Chen BAND_6GHZ,
309*73b01e57SJeff Chen BAND_4GHZ,
310*73b01e57SJeff Chen };
311*73b01e57SJeff Chen
312*73b01e57SJeff Chen enum nxpwifi_chan_width {
313*73b01e57SJeff Chen CHAN_BW_20MHZ = 0,
314*73b01e57SJeff Chen CHAN_BW_10MHZ,
315*73b01e57SJeff Chen CHAN_BW_40MHZ,
316*73b01e57SJeff Chen CHAN_BW_80MHZ,
317*73b01e57SJeff Chen CHAN_BW_8080MHZ,
318*73b01e57SJeff Chen CHAN_BW_160MHZ,
319*73b01e57SJeff Chen CHAN_BW_5MHZ,
320*73b01e57SJeff Chen };
321*73b01e57SJeff Chen
322*73b01e57SJeff Chen enum {
323*73b01e57SJeff Chen NXPWIFI_SCAN_TYPE_UNCHANGED = 0,
324*73b01e57SJeff Chen NXPWIFI_SCAN_TYPE_ACTIVE,
325*73b01e57SJeff Chen NXPWIFI_SCAN_TYPE_PASSIVE
326*73b01e57SJeff Chen };
327*73b01e57SJeff Chen
328*73b01e57SJeff Chen #define NXPWIFI_PROMISC_MODE 1
329*73b01e57SJeff Chen #define NXPWIFI_MULTICAST_MODE 2
330*73b01e57SJeff Chen #define NXPWIFI_ALL_MULTI_MODE 4
331*73b01e57SJeff Chen #define NXPWIFI_MAX_MULTICAST_LIST_SIZE 32
332*73b01e57SJeff Chen
333*73b01e57SJeff Chen struct nxpwifi_multicast_list {
334*73b01e57SJeff Chen u32 mode;
335*73b01e57SJeff Chen u32 num_multicast_addr;
336*73b01e57SJeff Chen u8 mac_list[NXPWIFI_MAX_MULTICAST_LIST_SIZE][ETH_ALEN];
337*73b01e57SJeff Chen };
338*73b01e57SJeff Chen
339*73b01e57SJeff Chen struct nxpwifi_chan_freq {
340*73b01e57SJeff Chen u32 channel;
341*73b01e57SJeff Chen u32 freq;
342*73b01e57SJeff Chen };
343*73b01e57SJeff Chen
344*73b01e57SJeff Chen struct nxpwifi_ssid_bssid {
345*73b01e57SJeff Chen struct cfg80211_ssid ssid;
346*73b01e57SJeff Chen u8 bssid[ETH_ALEN];
347*73b01e57SJeff Chen };
348*73b01e57SJeff Chen
349*73b01e57SJeff Chen enum {
350*73b01e57SJeff Chen BAND_B = 1,
351*73b01e57SJeff Chen BAND_G = 2,
352*73b01e57SJeff Chen BAND_A = 4,
353*73b01e57SJeff Chen BAND_GN = 8,
354*73b01e57SJeff Chen BAND_AN = 16,
355*73b01e57SJeff Chen BAND_GAC = 32,
356*73b01e57SJeff Chen BAND_AAC = 64,
357*73b01e57SJeff Chen BAND_GAX = 256,
358*73b01e57SJeff Chen BAND_AAX = 512,
359*73b01e57SJeff Chen };
360*73b01e57SJeff Chen
361*73b01e57SJeff Chen #define NXPWIFI_WPA_PASSHPHRASE_LEN 64
362*73b01e57SJeff Chen struct wpa_param {
363*73b01e57SJeff Chen u8 pairwise_cipher_wpa;
364*73b01e57SJeff Chen u8 pairwise_cipher_wpa2;
365*73b01e57SJeff Chen u8 group_cipher;
366*73b01e57SJeff Chen u32 length;
367*73b01e57SJeff Chen u8 passphrase[NXPWIFI_WPA_PASSHPHRASE_LEN];
368*73b01e57SJeff Chen };
369*73b01e57SJeff Chen
370*73b01e57SJeff Chen struct wep_key {
371*73b01e57SJeff Chen u8 key_index;
372*73b01e57SJeff Chen u8 is_default;
373*73b01e57SJeff Chen u16 length;
374*73b01e57SJeff Chen u8 key[WLAN_KEY_LEN_WEP104];
375*73b01e57SJeff Chen };
376*73b01e57SJeff Chen
377*73b01e57SJeff Chen #define KEY_MGMT_ON_HOST 0x03
378*73b01e57SJeff Chen #define NXPWIFI_AUTH_MODE_AUTO 0xFF
379*73b01e57SJeff Chen #define BAND_CONFIG_BG 0x00
380*73b01e57SJeff Chen #define BAND_CONFIG_A 0x01
381*73b01e57SJeff Chen #define NXPWIFI_SEC_CHAN_BELOW 0x03
382*73b01e57SJeff Chen #define NXPWIFI_SEC_CHAN_ABOVE 0x01
383*73b01e57SJeff Chen #define NXPWIFI_SUPPORTED_RATES 14
384*73b01e57SJeff Chen #define NXPWIFI_SUPPORTED_RATES_EXT 32
385*73b01e57SJeff Chen #define NXPWIFI_PRIO_BK 2
386*73b01e57SJeff Chen #define NXPWIFI_PRIO_VI 5
387*73b01e57SJeff Chen #define NXPWIFI_SUPPORTED_CHANNELS 2
388*73b01e57SJeff Chen #define NXPWIFI_OPERATING_CLASSES 16
389*73b01e57SJeff Chen
390*73b01e57SJeff Chen struct nxpwifi_uap_bss_param {
391*73b01e57SJeff Chen u8 mac_addr[ETH_ALEN];
392*73b01e57SJeff Chen u8 channel;
393*73b01e57SJeff Chen u8 band_cfg;
394*73b01e57SJeff Chen u16 rts_threshold;
395*73b01e57SJeff Chen u16 frag_threshold;
396*73b01e57SJeff Chen u8 retry_limit;
397*73b01e57SJeff Chen struct nxpwifi_802_11_ssid ssid;
398*73b01e57SJeff Chen u8 bcast_ssid_ctl;
399*73b01e57SJeff Chen u8 radio_ctl;
400*73b01e57SJeff Chen u8 dtim_period;
401*73b01e57SJeff Chen u16 beacon_period;
402*73b01e57SJeff Chen u16 auth_mode;
403*73b01e57SJeff Chen u16 protocol;
404*73b01e57SJeff Chen u16 key_mgmt;
405*73b01e57SJeff Chen u16 key_mgmt_operation;
406*73b01e57SJeff Chen struct wpa_param wpa_cfg;
407*73b01e57SJeff Chen struct wep_key wep_cfg[NUM_WEP_KEYS];
408*73b01e57SJeff Chen struct ieee80211_ht_cap ht_cap;
409*73b01e57SJeff Chen struct ieee80211_vht_cap vht_cap;
410*73b01e57SJeff Chen u8 rates[NXPWIFI_SUPPORTED_RATES];
411*73b01e57SJeff Chen u32 sta_ao_timer;
412*73b01e57SJeff Chen u32 ps_sta_ao_timer;
413*73b01e57SJeff Chen u8 power_constraint;
414*73b01e57SJeff Chen struct ieee80211_wmm_param_ie wmm_element;
415*73b01e57SJeff Chen };
416*73b01e57SJeff Chen
417*73b01e57SJeff Chen struct nxpwifi_ds_get_stats {
418*73b01e57SJeff Chen u32 mcast_tx_frame;
419*73b01e57SJeff Chen u32 failed;
420*73b01e57SJeff Chen u32 retry;
421*73b01e57SJeff Chen u32 multi_retry;
422*73b01e57SJeff Chen u32 frame_dup;
423*73b01e57SJeff Chen u32 rts_success;
424*73b01e57SJeff Chen u32 rts_failure;
425*73b01e57SJeff Chen u32 ack_failure;
426*73b01e57SJeff Chen u32 rx_frag;
427*73b01e57SJeff Chen u32 mcast_rx_frame;
428*73b01e57SJeff Chen u32 fcs_error;
429*73b01e57SJeff Chen u32 tx_frame;
430*73b01e57SJeff Chen u32 wep_icv_error[4];
431*73b01e57SJeff Chen u32 bcn_rcv_cnt;
432*73b01e57SJeff Chen u32 bcn_miss_cnt;
433*73b01e57SJeff Chen };
434*73b01e57SJeff Chen
435*73b01e57SJeff Chen #define NXPWIFI_MAX_VER_STR_LEN 128
436*73b01e57SJeff Chen
437*73b01e57SJeff Chen struct nxpwifi_ver_ext {
438*73b01e57SJeff Chen u32 version_str_sel;
439*73b01e57SJeff Chen char version_str[NXPWIFI_MAX_VER_STR_LEN];
440*73b01e57SJeff Chen };
441*73b01e57SJeff Chen
442*73b01e57SJeff Chen struct nxpwifi_bss_info {
443*73b01e57SJeff Chen u32 bss_mode;
444*73b01e57SJeff Chen struct cfg80211_ssid ssid;
445*73b01e57SJeff Chen u32 bss_chan;
446*73b01e57SJeff Chen u8 country_code[3];
447*73b01e57SJeff Chen u32 media_connected;
448*73b01e57SJeff Chen u32 max_power_level;
449*73b01e57SJeff Chen u32 min_power_level;
450*73b01e57SJeff Chen signed int bcn_nf_last;
451*73b01e57SJeff Chen u32 wep_status;
452*73b01e57SJeff Chen u32 is_hs_configured;
453*73b01e57SJeff Chen u32 is_deep_sleep;
454*73b01e57SJeff Chen u8 bssid[ETH_ALEN];
455*73b01e57SJeff Chen };
456*73b01e57SJeff Chen
457*73b01e57SJeff Chen struct nxpwifi_sta_info {
458*73b01e57SJeff Chen u8 peer_mac[ETH_ALEN];
459*73b01e57SJeff Chen struct station_parameters *params;
460*73b01e57SJeff Chen };
461*73b01e57SJeff Chen
462*73b01e57SJeff Chen #define MAX_NUM_TID 8
463*73b01e57SJeff Chen
464*73b01e57SJeff Chen #define MAX_RX_WINSIZE 64
465*73b01e57SJeff Chen
466*73b01e57SJeff Chen struct nxpwifi_ds_rx_reorder_tbl {
467*73b01e57SJeff Chen u16 tid;
468*73b01e57SJeff Chen u8 ta[ETH_ALEN];
469*73b01e57SJeff Chen u32 start_win;
470*73b01e57SJeff Chen u32 win_size;
471*73b01e57SJeff Chen u32 buffer[MAX_RX_WINSIZE];
472*73b01e57SJeff Chen };
473*73b01e57SJeff Chen
474*73b01e57SJeff Chen struct nxpwifi_ds_tx_ba_stream_tbl {
475*73b01e57SJeff Chen u16 tid;
476*73b01e57SJeff Chen u8 ra[ETH_ALEN];
477*73b01e57SJeff Chen u8 amsdu;
478*73b01e57SJeff Chen };
479*73b01e57SJeff Chen
480*73b01e57SJeff Chen #define DBG_CMD_NUM 5
481*73b01e57SJeff Chen #define NXPWIFI_DBG_SDIO_MP_NUM 10
482*73b01e57SJeff Chen
483*73b01e57SJeff Chen struct nxpwifi_debug_info {
484*73b01e57SJeff Chen unsigned int debug_mask;
485*73b01e57SJeff Chen u32 int_counter;
486*73b01e57SJeff Chen u32 packets_out[MAX_NUM_TID];
487*73b01e57SJeff Chen u32 tx_buf_size;
488*73b01e57SJeff Chen u32 curr_tx_buf_size;
489*73b01e57SJeff Chen u32 tx_tbl_num;
490*73b01e57SJeff Chen struct nxpwifi_ds_tx_ba_stream_tbl
491*73b01e57SJeff Chen tx_tbl[NXPWIFI_MAX_TX_BASTREAM_SUPPORTED];
492*73b01e57SJeff Chen u32 rx_tbl_num;
493*73b01e57SJeff Chen struct nxpwifi_ds_rx_reorder_tbl rx_tbl
494*73b01e57SJeff Chen [NXPWIFI_MAX_RX_BASTREAM_SUPPORTED];
495*73b01e57SJeff Chen u16 ps_mode;
496*73b01e57SJeff Chen u32 ps_state;
497*73b01e57SJeff Chen u8 is_deep_sleep;
498*73b01e57SJeff Chen u8 pm_wakeup_card_req;
499*73b01e57SJeff Chen u32 pm_wakeup_fw_try;
500*73b01e57SJeff Chen u8 is_hs_configured;
501*73b01e57SJeff Chen u8 hs_activated;
502*73b01e57SJeff Chen u32 num_cmd_host_to_card_failure;
503*73b01e57SJeff Chen u32 num_cmd_sleep_cfm_host_to_card_failure;
504*73b01e57SJeff Chen u32 num_tx_host_to_card_failure;
505*73b01e57SJeff Chen u32 num_event_deauth;
506*73b01e57SJeff Chen u32 num_event_disassoc;
507*73b01e57SJeff Chen u32 num_event_link_lost;
508*73b01e57SJeff Chen u32 num_cmd_deauth;
509*73b01e57SJeff Chen u32 num_cmd_assoc_success;
510*73b01e57SJeff Chen u32 num_cmd_assoc_failure;
511*73b01e57SJeff Chen u32 num_tx_timeout;
512*73b01e57SJeff Chen u8 is_cmd_timedout;
513*73b01e57SJeff Chen u16 timeout_cmd_id;
514*73b01e57SJeff Chen u16 timeout_cmd_act;
515*73b01e57SJeff Chen u16 last_cmd_id[DBG_CMD_NUM];
516*73b01e57SJeff Chen u16 last_cmd_act[DBG_CMD_NUM];
517*73b01e57SJeff Chen u16 last_cmd_index;
518*73b01e57SJeff Chen u16 last_cmd_resp_id[DBG_CMD_NUM];
519*73b01e57SJeff Chen u16 last_cmd_resp_index;
520*73b01e57SJeff Chen u16 last_event[DBG_CMD_NUM];
521*73b01e57SJeff Chen u16 last_event_index;
522*73b01e57SJeff Chen u8 data_sent;
523*73b01e57SJeff Chen u8 cmd_sent;
524*73b01e57SJeff Chen u8 cmd_resp_received;
525*73b01e57SJeff Chen u8 event_received;
526*73b01e57SJeff Chen u32 last_mp_wr_bitmap[NXPWIFI_DBG_SDIO_MP_NUM];
527*73b01e57SJeff Chen u32 last_mp_wr_ports[NXPWIFI_DBG_SDIO_MP_NUM];
528*73b01e57SJeff Chen u32 last_mp_wr_len[NXPWIFI_DBG_SDIO_MP_NUM];
529*73b01e57SJeff Chen u32 last_mp_curr_wr_port[NXPWIFI_DBG_SDIO_MP_NUM];
530*73b01e57SJeff Chen u8 last_sdio_mp_index;
531*73b01e57SJeff Chen };
532*73b01e57SJeff Chen
533*73b01e57SJeff Chen #define NXPWIFI_KEY_INDEX_UNICAST 0x40000000
534*73b01e57SJeff Chen #define PN_LEN 16
535*73b01e57SJeff Chen
536*73b01e57SJeff Chen struct nxpwifi_ds_encrypt_key {
537*73b01e57SJeff Chen u32 key_disable;
538*73b01e57SJeff Chen u32 key_index;
539*73b01e57SJeff Chen u32 key_len;
540*73b01e57SJeff Chen u32 key_cipher;
541*73b01e57SJeff Chen u8 key_material[WLAN_MAX_KEY_LEN];
542*73b01e57SJeff Chen u8 mac_addr[ETH_ALEN];
543*73b01e57SJeff Chen u8 pn[PN_LEN]; /* packet number */
544*73b01e57SJeff Chen u8 pn_len;
545*73b01e57SJeff Chen u8 is_igtk_key;
546*73b01e57SJeff Chen u8 is_current_wep_key;
547*73b01e57SJeff Chen u8 is_rx_seq_valid;
548*73b01e57SJeff Chen u8 is_igtk_def_key;
549*73b01e57SJeff Chen };
550*73b01e57SJeff Chen
551*73b01e57SJeff Chen struct nxpwifi_power_cfg {
552*73b01e57SJeff Chen u32 is_power_auto;
553*73b01e57SJeff Chen u32 is_power_fixed;
554*73b01e57SJeff Chen u32 power_level;
555*73b01e57SJeff Chen };
556*73b01e57SJeff Chen
557*73b01e57SJeff Chen struct nxpwifi_ds_hs_cfg {
558*73b01e57SJeff Chen u32 is_invoke_hostcmd;
559*73b01e57SJeff Chen /*
560*73b01e57SJeff Chen * Bit0: non-unicast data
561*73b01e57SJeff Chen * Bit1: unicast data
562*73b01e57SJeff Chen * Bit2: mac events
563*73b01e57SJeff Chen * Bit3: magic packet
564*73b01e57SJeff Chen */
565*73b01e57SJeff Chen u32 conditions;
566*73b01e57SJeff Chen u32 gpio;
567*73b01e57SJeff Chen u32 gap;
568*73b01e57SJeff Chen };
569*73b01e57SJeff Chen
570*73b01e57SJeff Chen struct nxpwifi_ds_wakeup_reason {
571*73b01e57SJeff Chen u16 hs_wakeup_reason;
572*73b01e57SJeff Chen };
573*73b01e57SJeff Chen
574*73b01e57SJeff Chen #define DEEP_SLEEP_ON 1
575*73b01e57SJeff Chen #define DEEP_SLEEP_OFF 0
576*73b01e57SJeff Chen #define DEEP_SLEEP_IDLE_TIME 100
577*73b01e57SJeff Chen #define PS_MODE_AUTO 1
578*73b01e57SJeff Chen
579*73b01e57SJeff Chen struct nxpwifi_ds_auto_ds {
580*73b01e57SJeff Chen u16 auto_ds;
581*73b01e57SJeff Chen u16 idle_time;
582*73b01e57SJeff Chen };
583*73b01e57SJeff Chen
584*73b01e57SJeff Chen struct nxpwifi_ds_pm_cfg {
585*73b01e57SJeff Chen union {
586*73b01e57SJeff Chen u32 ps_mode;
587*73b01e57SJeff Chen struct nxpwifi_ds_hs_cfg hs_cfg;
588*73b01e57SJeff Chen struct nxpwifi_ds_auto_ds auto_deep_sleep;
589*73b01e57SJeff Chen u32 sleep_period;
590*73b01e57SJeff Chen } param;
591*73b01e57SJeff Chen };
592*73b01e57SJeff Chen
593*73b01e57SJeff Chen struct nxpwifi_11ac_vht_cfg {
594*73b01e57SJeff Chen u8 band_config;
595*73b01e57SJeff Chen u8 misc_config;
596*73b01e57SJeff Chen u32 cap_info;
597*73b01e57SJeff Chen u32 mcs_tx_set;
598*73b01e57SJeff Chen u32 mcs_rx_set;
599*73b01e57SJeff Chen };
600*73b01e57SJeff Chen
601*73b01e57SJeff Chen struct nxpwifi_ds_11n_tx_cfg {
602*73b01e57SJeff Chen u16 tx_htcap;
603*73b01e57SJeff Chen u16 tx_htinfo;
604*73b01e57SJeff Chen u16 misc_config; /* Needed for 802.11AC cards only */
605*73b01e57SJeff Chen };
606*73b01e57SJeff Chen
607*73b01e57SJeff Chen struct nxpwifi_ds_11n_amsdu_aggr_ctrl {
608*73b01e57SJeff Chen u16 enable;
609*73b01e57SJeff Chen u16 curr_buf_size;
610*73b01e57SJeff Chen };
611*73b01e57SJeff Chen
612*73b01e57SJeff Chen struct nxpwifi_ds_ant_cfg {
613*73b01e57SJeff Chen u32 tx_ant;
614*73b01e57SJeff Chen u32 rx_ant;
615*73b01e57SJeff Chen };
616*73b01e57SJeff Chen
617*73b01e57SJeff Chen #define NXPWIFI_NUM_OF_CMD_BUFFER 50
618*73b01e57SJeff Chen #define NXPWIFI_SIZE_OF_CMD_BUFFER 2048
619*73b01e57SJeff Chen
620*73b01e57SJeff Chen enum {
621*73b01e57SJeff Chen NXPWIFI_IE_TYPE_GEN_IE = 0,
622*73b01e57SJeff Chen NXPWIFI_IE_TYPE_ARP_FILTER,
623*73b01e57SJeff Chen };
624*73b01e57SJeff Chen
625*73b01e57SJeff Chen enum {
626*73b01e57SJeff Chen NXPWIFI_REG_MAC = 1,
627*73b01e57SJeff Chen NXPWIFI_REG_BBP,
628*73b01e57SJeff Chen NXPWIFI_REG_RF,
629*73b01e57SJeff Chen NXPWIFI_REG_PMIC,
630*73b01e57SJeff Chen NXPWIFI_REG_CAU,
631*73b01e57SJeff Chen };
632*73b01e57SJeff Chen
633*73b01e57SJeff Chen struct nxpwifi_ds_reg_rw {
634*73b01e57SJeff Chen u32 type;
635*73b01e57SJeff Chen u32 offset;
636*73b01e57SJeff Chen u32 value;
637*73b01e57SJeff Chen };
638*73b01e57SJeff Chen
639*73b01e57SJeff Chen #define MAX_EEPROM_DATA 256
640*73b01e57SJeff Chen
641*73b01e57SJeff Chen struct nxpwifi_ds_read_eeprom {
642*73b01e57SJeff Chen u16 offset;
643*73b01e57SJeff Chen u16 byte_count;
644*73b01e57SJeff Chen u8 value[MAX_EEPROM_DATA];
645*73b01e57SJeff Chen };
646*73b01e57SJeff Chen
647*73b01e57SJeff Chen struct nxpwifi_ds_mem_rw {
648*73b01e57SJeff Chen u32 addr;
649*73b01e57SJeff Chen u32 value;
650*73b01e57SJeff Chen };
651*73b01e57SJeff Chen
652*73b01e57SJeff Chen #define IEEE_MAX_IE_SIZE 256
653*73b01e57SJeff Chen
654*73b01e57SJeff Chen #define NXPWIFI_IE_HDR_SIZE (sizeof(struct nxpwifi_ie) - IEEE_MAX_IE_SIZE)
655*73b01e57SJeff Chen
656*73b01e57SJeff Chen struct nxpwifi_ds_misc_gen_ie {
657*73b01e57SJeff Chen u32 type;
658*73b01e57SJeff Chen u32 len;
659*73b01e57SJeff Chen u8 ie_data[IEEE_MAX_IE_SIZE];
660*73b01e57SJeff Chen };
661*73b01e57SJeff Chen
662*73b01e57SJeff Chen struct nxpwifi_ds_misc_cmd {
663*73b01e57SJeff Chen u32 len;
664*73b01e57SJeff Chen u8 cmd[NXPWIFI_SIZE_OF_CMD_BUFFER];
665*73b01e57SJeff Chen };
666*73b01e57SJeff Chen
667*73b01e57SJeff Chen #define BITMASK_BCN_RSSI_LOW BIT(0)
668*73b01e57SJeff Chen #define BITMASK_BCN_RSSI_HIGH BIT(4)
669*73b01e57SJeff Chen
670*73b01e57SJeff Chen enum subsc_evt_rssi_state {
671*73b01e57SJeff Chen EVENT_HANDLED,
672*73b01e57SJeff Chen RSSI_LOW_RECVD,
673*73b01e57SJeff Chen RSSI_HIGH_RECVD
674*73b01e57SJeff Chen };
675*73b01e57SJeff Chen
676*73b01e57SJeff Chen struct subsc_evt_cfg {
677*73b01e57SJeff Chen u8 abs_value;
678*73b01e57SJeff Chen u8 evt_freq;
679*73b01e57SJeff Chen };
680*73b01e57SJeff Chen
681*73b01e57SJeff Chen struct nxpwifi_ds_misc_subsc_evt {
682*73b01e57SJeff Chen u16 action;
683*73b01e57SJeff Chen u16 events;
684*73b01e57SJeff Chen struct subsc_evt_cfg bcn_l_rssi_cfg;
685*73b01e57SJeff Chen struct subsc_evt_cfg bcn_h_rssi_cfg;
686*73b01e57SJeff Chen };
687*73b01e57SJeff Chen
688*73b01e57SJeff Chen #define NXPWIFI_MEF_MAX_BYTESEQ 6 /* non-adjustable */
689*73b01e57SJeff Chen #define NXPWIFI_MEF_MAX_FILTERS 10
690*73b01e57SJeff Chen
691*73b01e57SJeff Chen struct nxpwifi_mef_filter {
692*73b01e57SJeff Chen u16 repeat;
693*73b01e57SJeff Chen u16 offset;
694*73b01e57SJeff Chen s8 byte_seq[NXPWIFI_MEF_MAX_BYTESEQ + 1];
695*73b01e57SJeff Chen u8 filt_type;
696*73b01e57SJeff Chen u8 filt_action;
697*73b01e57SJeff Chen };
698*73b01e57SJeff Chen
699*73b01e57SJeff Chen struct nxpwifi_mef_entry {
700*73b01e57SJeff Chen u8 mode;
701*73b01e57SJeff Chen u8 action;
702*73b01e57SJeff Chen struct nxpwifi_mef_filter filter[NXPWIFI_MEF_MAX_FILTERS];
703*73b01e57SJeff Chen };
704*73b01e57SJeff Chen
705*73b01e57SJeff Chen struct nxpwifi_ds_mef_cfg {
706*73b01e57SJeff Chen u32 criteria;
707*73b01e57SJeff Chen u16 num_entries;
708*73b01e57SJeff Chen struct nxpwifi_mef_entry *mef_entry;
709*73b01e57SJeff Chen };
710*73b01e57SJeff Chen
711*73b01e57SJeff Chen #define NXPWIFI_MAX_VSIE_LEN (256)
712*73b01e57SJeff Chen #define NXPWIFI_MAX_VSIE_NUM (8)
713*73b01e57SJeff Chen #define NXPWIFI_VSIE_MASK_CLEAR 0x00
714*73b01e57SJeff Chen #define NXPWIFI_VSIE_MASK_SCAN 0x01
715*73b01e57SJeff Chen #define NXPWIFI_VSIE_MASK_ASSOC 0x02
716*73b01e57SJeff Chen #define NXPWIFI_VSIE_MASK_BGSCAN 0x08
717*73b01e57SJeff Chen
718*73b01e57SJeff Chen enum {
719*73b01e57SJeff Chen NXPWIFI_FUNC_INIT = 1,
720*73b01e57SJeff Chen NXPWIFI_FUNC_SHUTDOWN,
721*73b01e57SJeff Chen };
722*73b01e57SJeff Chen
723*73b01e57SJeff Chen enum COALESCE_OPERATION {
724*73b01e57SJeff Chen RECV_FILTER_MATCH_TYPE_EQ = 0x80,
725*73b01e57SJeff Chen RECV_FILTER_MATCH_TYPE_NE,
726*73b01e57SJeff Chen };
727*73b01e57SJeff Chen
728*73b01e57SJeff Chen enum COALESCE_PACKET_TYPE {
729*73b01e57SJeff Chen PACKET_TYPE_UNICAST = 1,
730*73b01e57SJeff Chen PACKET_TYPE_MULTICAST = 2,
731*73b01e57SJeff Chen PACKET_TYPE_BROADCAST = 3
732*73b01e57SJeff Chen };
733*73b01e57SJeff Chen
734*73b01e57SJeff Chen #define NXPWIFI_COALESCE_MAX_RULES 8
735*73b01e57SJeff Chen #define NXPWIFI_COALESCE_MAX_BYTESEQ 4 /* non-adjustable */
736*73b01e57SJeff Chen #define NXPWIFI_COALESCE_MAX_FILTERS 4
737*73b01e57SJeff Chen #define NXPWIFI_MAX_COALESCING_DELAY 100 /* in msecs */
738*73b01e57SJeff Chen
739*73b01e57SJeff Chen struct filt_field_param {
740*73b01e57SJeff Chen u8 operation;
741*73b01e57SJeff Chen u8 operand_len;
742*73b01e57SJeff Chen u16 offset;
743*73b01e57SJeff Chen u8 operand_byte_stream[NXPWIFI_COALESCE_MAX_BYTESEQ];
744*73b01e57SJeff Chen };
745*73b01e57SJeff Chen
746*73b01e57SJeff Chen struct nxpwifi_coalesce_rule {
747*73b01e57SJeff Chen u16 max_coalescing_delay;
748*73b01e57SJeff Chen u8 num_of_fields;
749*73b01e57SJeff Chen u8 pkt_type;
750*73b01e57SJeff Chen struct filt_field_param params[NXPWIFI_COALESCE_MAX_FILTERS];
751*73b01e57SJeff Chen };
752*73b01e57SJeff Chen
753*73b01e57SJeff Chen struct nxpwifi_ds_coalesce_cfg {
754*73b01e57SJeff Chen u16 num_of_rules;
755*73b01e57SJeff Chen struct nxpwifi_coalesce_rule rule[NXPWIFI_COALESCE_MAX_RULES];
756*73b01e57SJeff Chen };
757*73b01e57SJeff Chen
758*73b01e57SJeff Chen struct nxpwifi_11ax_he_cap_cfg {
759*73b01e57SJeff Chen u16 id;
760*73b01e57SJeff Chen u16 len;
761*73b01e57SJeff Chen u8 ext_id;
762*73b01e57SJeff Chen struct ieee80211_he_cap_elem cap_elem;
763*73b01e57SJeff Chen u8 he_txrx_mcs_support[4];
764*73b01e57SJeff Chen u8 val[28];
765*73b01e57SJeff Chen };
766*73b01e57SJeff Chen
767*73b01e57SJeff Chen #define HE_CAP_MAX_SIZE 54
768*73b01e57SJeff Chen
769*73b01e57SJeff Chen struct nxpwifi_11ax_he_cfg {
770*73b01e57SJeff Chen u8 band;
771*73b01e57SJeff Chen union {
772*73b01e57SJeff Chen struct nxpwifi_11ax_he_cap_cfg he_cap_cfg;
773*73b01e57SJeff Chen u8 data[HE_CAP_MAX_SIZE];
774*73b01e57SJeff Chen };
775*73b01e57SJeff Chen };
776*73b01e57SJeff Chen
777*73b01e57SJeff Chen #define NXPWIFI_11AXCMD_CFG_ID_SR_OBSS_PD_OFFSET 1
778*73b01e57SJeff Chen #define NXPWIFI_11AXCMD_CFG_ID_SR_ENABLE 2
779*73b01e57SJeff Chen #define NXPWIFI_11AXCMD_CFG_ID_BEAM_CHANGE 3
780*73b01e57SJeff Chen #define NXPWIFI_11AXCMD_CFG_ID_HTC_ENABLE 4
781*73b01e57SJeff Chen #define NXPWIFI_11AXCMD_CFG_ID_TXOP_RTS 5
782*73b01e57SJeff Chen #define NXPWIFI_11AXCMD_CFG_ID_TX_OMI 6
783*73b01e57SJeff Chen #define NXPWIFI_11AXCMD_CFG_ID_OBSSNBRU_TOLTIME 7
784*73b01e57SJeff Chen #define NXPWIFI_11AXCMD_CFG_ID_SET_BSRP 8
785*73b01e57SJeff Chen #define NXPWIFI_11AXCMD_CFG_ID_LLDE 9
786*73b01e57SJeff Chen
787*73b01e57SJeff Chen #define NXPWIFI_11AXCMD_SR_SUBID 0x102
788*73b01e57SJeff Chen #define NXPWIFI_11AXCMD_BEAM_SUBID 0x103
789*73b01e57SJeff Chen #define NXPWIFI_11AXCMD_HTC_SUBID 0x104
790*73b01e57SJeff Chen #define NXPWIFI_11AXCMD_TXOMI_SUBID 0x105
791*73b01e57SJeff Chen #define NXPWIFI_11AXCMD_OBSS_TOLTIME_SUBID 0x106
792*73b01e57SJeff Chen #define NXPWIFI_11AXCMD_TXOPRTS_SUBID 0x108
793*73b01e57SJeff Chen #define NXPWIFI_11AXCMD_SET_BSRP_SUBID 0x109
794*73b01e57SJeff Chen #define NXPWIFI_11AXCMD_LLDE_SUBID 0x110
795*73b01e57SJeff Chen
796*73b01e57SJeff Chen #define NXPWIFI_11AX_TWT_SETUP_SUBID 0x114
797*73b01e57SJeff Chen #define NXPWIFI_11AX_TWT_TEARDOWN_SUBID 0x115
798*73b01e57SJeff Chen #define NXPWIFI_11AX_TWT_REPORT_SUBID 0x116
799*73b01e57SJeff Chen #define NXPWIFI_11AX_TWT_INFORMATION_SUBID 0x119
800*73b01e57SJeff Chen #define NXPWIFI_11AX_BTWT_AP_CONFIG_SUBID 0x120
801*73b01e57SJeff Chen #define BTWT_AGREEMENT_MAX 5
802*73b01e57SJeff Chen
803*73b01e57SJeff Chen struct nxpwifi_11axcmdcfg_obss_pd_offset {
804*73b01e57SJeff Chen /* <NON_SRG_OffSET, SRG_OFFSET> */
805*73b01e57SJeff Chen u8 offset[2];
806*73b01e57SJeff Chen };
807*73b01e57SJeff Chen
808*73b01e57SJeff Chen struct nxpwifi_11axcmdcfg_sr_control {
809*73b01e57SJeff Chen /* 1 enable, 0 disable */
810*73b01e57SJeff Chen u8 control;
811*73b01e57SJeff Chen };
812*73b01e57SJeff Chen
813*73b01e57SJeff Chen struct nxpwifi_11ax_sr_cmd {
814*73b01e57SJeff Chen /* type */
815*73b01e57SJeff Chen u16 type;
816*73b01e57SJeff Chen /* length of TLV */
817*73b01e57SJeff Chen u16 len;
818*73b01e57SJeff Chen /* value */
819*73b01e57SJeff Chen union {
820*73b01e57SJeff Chen struct nxpwifi_11axcmdcfg_obss_pd_offset obss_pd_offset;
821*73b01e57SJeff Chen struct nxpwifi_11axcmdcfg_sr_control sr_control;
822*73b01e57SJeff Chen } param;
823*73b01e57SJeff Chen };
824*73b01e57SJeff Chen
825*73b01e57SJeff Chen struct nxpwifi_11ax_beam_cmd {
826*73b01e57SJeff Chen /* command value: 1 is disable, 0 is enable */
827*73b01e57SJeff Chen u8 value;
828*73b01e57SJeff Chen };
829*73b01e57SJeff Chen
830*73b01e57SJeff Chen struct nxpwifi_11ax_htc_cmd {
831*73b01e57SJeff Chen /* command value: 1 is enable, 0 is disable */
832*73b01e57SJeff Chen u8 value;
833*73b01e57SJeff Chen };
834*73b01e57SJeff Chen
835*73b01e57SJeff Chen struct nxpwifi_11ax_txomi_cmd {
836*73b01e57SJeff Chen /* 11ax spec 9.2.4.6a.2 OM Control 12 bits. Bit 0 to bit 11 */
837*73b01e57SJeff Chen u16 omi;
838*73b01e57SJeff Chen /*
839*73b01e57SJeff Chen * tx option
840*73b01e57SJeff Chen * 0: send OMI in QoS NULL; 1: send OMI in QoS data; 0xFF: set OMI in
841*73b01e57SJeff Chen * both
842*73b01e57SJeff Chen */
843*73b01e57SJeff Chen u8 tx_option;
844*73b01e57SJeff Chen /*
845*73b01e57SJeff Chen * if OMI is sent in QoS data, specify the number of consecutive data
846*73b01e57SJeff Chen * packets containing the OMI
847*73b01e57SJeff Chen */
848*73b01e57SJeff Chen u8 num_data_pkts;
849*73b01e57SJeff Chen };
850*73b01e57SJeff Chen
851*73b01e57SJeff Chen struct nxpwifi_11ax_toltime_cmd {
852*73b01e57SJeff Chen /* OBSS Narrow Bandwidth RU Tolerance Time */
853*73b01e57SJeff Chen u32 tol_time;
854*73b01e57SJeff Chen };
855*73b01e57SJeff Chen
856*73b01e57SJeff Chen struct nxpwifi_11ax_txop_cmd {
857*73b01e57SJeff Chen /*
858*73b01e57SJeff Chen * Two byte rts threshold value of which only 10 bits, bit 0 to bit 9
859*73b01e57SJeff Chen * are valid
860*73b01e57SJeff Chen */
861*73b01e57SJeff Chen u16 rts_thres;
862*73b01e57SJeff Chen };
863*73b01e57SJeff Chen
864*73b01e57SJeff Chen struct nxpwifi_11ax_set_bsrp_cmd {
865*73b01e57SJeff Chen /* command value: 1 is enable, 0 is disable */
866*73b01e57SJeff Chen u8 value;
867*73b01e57SJeff Chen };
868*73b01e57SJeff Chen
869*73b01e57SJeff Chen struct nxpwifi_11ax_llde_cmd {
870*73b01e57SJeff Chen /* Uplink LLDE: enable=1,disable=0 */
871*73b01e57SJeff Chen u8 llde;
872*73b01e57SJeff Chen /* operation mode: default=0,carplay=1,gameplay=2 */
873*73b01e57SJeff Chen u8 mode;
874*73b01e57SJeff Chen /* trigger frame rate: auto=0xff */
875*73b01e57SJeff Chen u8 fixrate;
876*73b01e57SJeff Chen /* cap airtime limit index: auto=0xff */
877*73b01e57SJeff Chen u8 trigger_limit;
878*73b01e57SJeff Chen /* cap peak UL rate */
879*73b01e57SJeff Chen u8 peak_ul_rate;
880*73b01e57SJeff Chen /* Downlink LLDE: enable=1,disable=0 */
881*73b01e57SJeff Chen u8 dl_llde;
882*73b01e57SJeff Chen /* Set trigger frame interval(us): auto=0 */
883*73b01e57SJeff Chen u16 poll_interval;
884*73b01e57SJeff Chen /* Set TxOp duration */
885*73b01e57SJeff Chen u16 tx_op_duration;
886*73b01e57SJeff Chen /* for other configurations */
887*73b01e57SJeff Chen u16 llde_ctrl;
888*73b01e57SJeff Chen u16 mu_rts_successcnt;
889*73b01e57SJeff Chen u16 mu_rts_failcnt;
890*73b01e57SJeff Chen u16 basic_trigger_successcnt;
891*73b01e57SJeff Chen u16 basic_trigger_failcnt;
892*73b01e57SJeff Chen u16 tbppdu_nullcnt;
893*73b01e57SJeff Chen u16 tbppdu_datacnt;
894*73b01e57SJeff Chen };
895*73b01e57SJeff Chen
896*73b01e57SJeff Chen struct nxpwifi_11ax_cmd_cfg {
897*73b01e57SJeff Chen u32 sub_command;
898*73b01e57SJeff Chen u32 sub_id;
899*73b01e57SJeff Chen union {
900*73b01e57SJeff Chen struct nxpwifi_11ax_sr_cmd sr_cfg;
901*73b01e57SJeff Chen struct nxpwifi_11ax_beam_cmd beam_cfg;
902*73b01e57SJeff Chen struct nxpwifi_11ax_htc_cmd htc_cfg;
903*73b01e57SJeff Chen struct nxpwifi_11ax_txomi_cmd txomi_cfg;
904*73b01e57SJeff Chen struct nxpwifi_11ax_toltime_cmd toltime_cfg;
905*73b01e57SJeff Chen struct nxpwifi_11ax_txop_cmd txop_cfg;
906*73b01e57SJeff Chen struct nxpwifi_11ax_set_bsrp_cmd setbsrp_cfg;
907*73b01e57SJeff Chen struct nxpwifi_11ax_llde_cmd llde_cfg;
908*73b01e57SJeff Chen } param;
909*73b01e57SJeff Chen };
910*73b01e57SJeff Chen
911*73b01e57SJeff Chen struct nxpwifi_twt_setup {
912*73b01e57SJeff Chen /** Implicit, 0: TWT session is explicit, 1: Session is implicit */
913*73b01e57SJeff Chen u8 implicit;
914*73b01e57SJeff Chen /** Announced, 0: Unannounced, 1: Announced TWT */
915*73b01e57SJeff Chen u8 announced;
916*73b01e57SJeff Chen /** Trigger Enabled, 0: Non-Trigger enabled, 1: Trigger enabled TWT */
917*73b01e57SJeff Chen u8 trigger_enabled;
918*73b01e57SJeff Chen /** TWT Information Disabled, 0: TWT info enabled, 1: TWT info disabled */
919*73b01e57SJeff Chen u8 twt_info_disabled;
920*73b01e57SJeff Chen /*
921*73b01e57SJeff Chen * Negotiation Type, 0: Future Individual TWT SP start time, 1:
922*73b01e57SJeff Chen * Next Wake TBTT time
923*73b01e57SJeff Chen */
924*73b01e57SJeff Chen u8 negotiation_type;
925*73b01e57SJeff Chen /*
926*73b01e57SJeff Chen * TWT Wakeup Duration, time after which the TWT requesting STA can
927*73b01e57SJeff Chen * transition to doze state
928*73b01e57SJeff Chen */
929*73b01e57SJeff Chen u8 twt_wakeup_duration;
930*73b01e57SJeff Chen /** Flow Identifier. Range: [0-7]*/
931*73b01e57SJeff Chen u8 flow_identifier;
932*73b01e57SJeff Chen /*
933*73b01e57SJeff Chen * Hard Constraint, 0: FW can tweak the TWT setup parameters if it is
934*73b01e57SJeff Chen * rejected by AP.
935*73b01e57SJeff Chen * 1: Firmware should not tweak any parameters.
936*73b01e57SJeff Chen */
937*73b01e57SJeff Chen u8 hard_constraint;
938*73b01e57SJeff Chen /** TWT Exponent, Range: [0-63] */
939*73b01e57SJeff Chen u8 twt_exponent;
940*73b01e57SJeff Chen /** TWT Mantissa Range: [0-sizeof(UINT16)] */
941*73b01e57SJeff Chen __le16 twt_mantissa;
942*73b01e57SJeff Chen /** TWT Request Type, 0: REQUEST_TWT, 1: SUGGEST_TWT*/
943*73b01e57SJeff Chen u8 twt_request;
944*73b01e57SJeff Chen /** TWT Setup State. Set to 0 by driver, filled by FW in response*/
945*73b01e57SJeff Chen u8 twt_setup_state;
946*73b01e57SJeff Chen /** TWT link lost timeout threshold */
947*73b01e57SJeff Chen __le16 bcn_miss_threshold;
948*73b01e57SJeff Chen } __packed;
949*73b01e57SJeff Chen
950*73b01e57SJeff Chen struct nxpwifi_twt_teardown {
951*73b01e57SJeff Chen /** TWT Flow Identifier. Range: [0-7] */
952*73b01e57SJeff Chen u8 flow_identifier;
953*73b01e57SJeff Chen /*
954*73b01e57SJeff Chen * Negotiation Type. 0: Future Individual TWT SP start time, 1: Next
955*73b01e57SJeff Chen * Wake TBTT time
956*73b01e57SJeff Chen */
957*73b01e57SJeff Chen u8 negotiation_type;
958*73b01e57SJeff Chen /** Tear down all TWT. 1: To teardown all TWT, 0 otherwise */
959*73b01e57SJeff Chen u8 teardown_all_twt;
960*73b01e57SJeff Chen /** TWT Teardown State. Set to 0 by driver, filled by FW in response */
961*73b01e57SJeff Chen u8 twt_teardown_state;
962*73b01e57SJeff Chen /** Reserved, set to 0. */
963*73b01e57SJeff Chen u8 reserved[3];
964*73b01e57SJeff Chen } __packed;
965*73b01e57SJeff Chen
966*73b01e57SJeff Chen #define NXPWIFI_BTWT_REPORT_LEN 9
967*73b01e57SJeff Chen #define NXPWIFI_BTWT_REPORT_MAX_NUM 4
968*73b01e57SJeff Chen struct nxpwifi_twt_report {
969*73b01e57SJeff Chen /** TWT report type, 0: BTWT id */
970*73b01e57SJeff Chen u8 type;
971*73b01e57SJeff Chen /** TWT report length of value in data */
972*73b01e57SJeff Chen u8 length;
973*73b01e57SJeff Chen u8 reserve[2];
974*73b01e57SJeff Chen /** TWT report payload for FW response to fill */
975*73b01e57SJeff Chen u8 data[NXPWIFI_BTWT_REPORT_LEN * NXPWIFI_BTWT_REPORT_MAX_NUM];
976*73b01e57SJeff Chen } __packed;
977*73b01e57SJeff Chen
978*73b01e57SJeff Chen struct nxpwifi_twt_information {
979*73b01e57SJeff Chen /** TWT Flow Identifier. Range: [0-7] */
980*73b01e57SJeff Chen u8 flow_identifier;
981*73b01e57SJeff Chen /*
982*73b01e57SJeff Chen * Suspend Duration. Range: [0-UINT32_MAX]
983*73b01e57SJeff Chen * 0:Suspend forever;
984*73b01e57SJeff Chen * Else:Suspend agreement for specific duration in milli seconds,
985*73b01e57SJeff Chen * after than resume the agreement and enter SP immediately
986*73b01e57SJeff Chen */
987*73b01e57SJeff Chen __le32 suspend_duration;
988*73b01e57SJeff Chen /** TWT Information State. Set to 0 by driver, filled by FW in response */
989*73b01e57SJeff Chen u8 twt_information_state;
990*73b01e57SJeff Chen } __packed;
991*73b01e57SJeff Chen
992*73b01e57SJeff Chen struct btwt_set {
993*73b01e57SJeff Chen u8 btwt_id;
994*73b01e57SJeff Chen __le16 ap_bcast_mantissa;
995*73b01e57SJeff Chen u8 ap_bcast_exponent;
996*73b01e57SJeff Chen u8 nominalwake;
997*73b01e57SJeff Chen } __packed;
998*73b01e57SJeff Chen
999*73b01e57SJeff Chen #define BTWT_AGREEMENT_MAX 5
1000*73b01e57SJeff Chen struct nxpwifi_btwt_ap_config {
1001*73b01e57SJeff Chen u8 ap_bcast_bet_sta_wait;
1002*73b01e57SJeff Chen __le16 ap_bcast_offset;
1003*73b01e57SJeff Chen u8 bcast_twtli;
1004*73b01e57SJeff Chen u8 count;
1005*73b01e57SJeff Chen struct btwt_set btwt_sets[BTWT_AGREEMENT_MAX];
1006*73b01e57SJeff Chen } __packed;
1007*73b01e57SJeff Chen
1008*73b01e57SJeff Chen struct nxpwifi_twt_cfg {
1009*73b01e57SJeff Chen u16 action;
1010*73b01e57SJeff Chen u16 sub_id;
1011*73b01e57SJeff Chen union {
1012*73b01e57SJeff Chen struct nxpwifi_twt_setup twt_setup;
1013*73b01e57SJeff Chen struct nxpwifi_twt_teardown twt_teardown;
1014*73b01e57SJeff Chen struct nxpwifi_twt_report twt_report;
1015*73b01e57SJeff Chen struct nxpwifi_twt_information twt_information;
1016*73b01e57SJeff Chen struct nxpwifi_btwt_ap_config btwt_ap_config;
1017*73b01e57SJeff Chen } param;
1018*73b01e57SJeff Chen };
1019*73b01e57SJeff Chen #endif /* !_NXPWIFI_CFG_H_ */
1020