xref: /linux/drivers/net/wireless/nxp/nxpwifi/cfg.h (revision 91ec2035134982b98fab0609a9fd8480e8217dc1)
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