xref: /OK3568_Linux_fs/external/rkwifibt/drivers/infineon/wl_cfg80211.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Linux cfg80211 driver
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Portions of this code are copyright (c) 2021 Cypress Semiconductor Corporation
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * Copyright (C) 1999-2017, Broadcom Corporation
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  *      Unless you and Broadcom execute a separate written software license
9*4882a593Smuzhiyun  * agreement governing use of this software, this software is licensed to you
10*4882a593Smuzhiyun  * under the terms of the GNU General Public License version 2 (the "GPL"),
11*4882a593Smuzhiyun  * available at http://www.broadcom.com/licenses/GPLv2.php, with the
12*4882a593Smuzhiyun  * following added to such license:
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  *      As a special exception, the copyright holders of this software give you
15*4882a593Smuzhiyun  * permission to link this software with independent modules, and to copy and
16*4882a593Smuzhiyun  * distribute the resulting executable under terms of your choice, provided that
17*4882a593Smuzhiyun  * you also meet, for each linked independent module, the terms and conditions of
18*4882a593Smuzhiyun  * the license of that module.  An independent module is a module which is not
19*4882a593Smuzhiyun  * derived from this software.  The special exception does not apply to any
20*4882a593Smuzhiyun  * modifications of the software.
21*4882a593Smuzhiyun  *
22*4882a593Smuzhiyun  *      Notwithstanding the above, under no circumstances may you combine this
23*4882a593Smuzhiyun  * software in any way with any other Broadcom software provided under a license
24*4882a593Smuzhiyun  * other than the GPL, without Broadcom's express prior written consent.
25*4882a593Smuzhiyun  *
26*4882a593Smuzhiyun  *
27*4882a593Smuzhiyun  * <<Broadcom-WL-IPTag/Open:>>
28*4882a593Smuzhiyun  *
29*4882a593Smuzhiyun  * $Id: wl_cfg80211.h 815697 2019-04-19 03:53:33Z $
30*4882a593Smuzhiyun  */
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun /**
33*4882a593Smuzhiyun  * Older Linux versions support the 'iw' interface, more recent ones the 'cfg80211' interface.
34*4882a593Smuzhiyun  */
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun #ifndef _wl_cfg80211_h_
37*4882a593Smuzhiyun #define _wl_cfg80211_h_
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun #include <linux/wireless.h>
40*4882a593Smuzhiyun #include <typedefs.h>
41*4882a593Smuzhiyun #include <ethernet.h>
42*4882a593Smuzhiyun #include <wlioctl.h>
43*4882a593Smuzhiyun #include <linux/wireless.h>
44*4882a593Smuzhiyun #include <net/cfg80211.h>
45*4882a593Smuzhiyun #include <linux/rfkill.h>
46*4882a593Smuzhiyun #include <osl.h>
47*4882a593Smuzhiyun #include <dngl_stats.h>
48*4882a593Smuzhiyun #include <dhd.h>
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun #define WL_CFG_DRV_LOCK(lock, flags)	(flags) = osl_spin_lock(lock)
51*4882a593Smuzhiyun #define WL_CFG_DRV_UNLOCK(lock, flags)	osl_spin_unlock((lock), (flags))
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun #define WL_CFG_WPS_SYNC_LOCK(lock, flags)	(flags) = osl_spin_lock(lock)
54*4882a593Smuzhiyun #define WL_CFG_WPS_SYNC_UNLOCK(lock, flags)	osl_spin_unlock((lock), (flags))
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun #define WL_CFG_NET_LIST_SYNC_LOCK(lock, flags)		(flags) = osl_spin_lock(lock)
57*4882a593Smuzhiyun #define WL_CFG_NET_LIST_SYNC_UNLOCK(lock, flags)	osl_spin_unlock((lock), (flags))
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun #define WL_CFG_EQ_LOCK(lock, flags)	(flags) = osl_spin_lock(lock)
60*4882a593Smuzhiyun #define WL_CFG_EQ_UNLOCK(lock, flags)	osl_spin_unlock((lock), (flags))
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun #define WL_CFG_BAM_LOCK(lock, flags)	(flags) = osl_spin_lock(lock)
63*4882a593Smuzhiyun #define WL_CFG_BAM_UNLOCK(lock, flags)	osl_spin_unlock((lock), (flags))
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun #define WL_CFG_VNDR_OUI_SYNC_LOCK(lock, flags)		(flags) = osl_spin_lock(lock)
66*4882a593Smuzhiyun #define WL_CFG_VNDR_OUI_SYNC_UNLOCK(lock, flags)	osl_spin_unlock((lock), (flags))
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun #include <wl_cfgp2p.h>
69*4882a593Smuzhiyun #ifdef WL_NAN
70*4882a593Smuzhiyun #include <wl_cfgnan.h>
71*4882a593Smuzhiyun #endif /* WL_NAN */
72*4882a593Smuzhiyun #ifdef WL_BAM
73*4882a593Smuzhiyun #include <wl_bam.h>
74*4882a593Smuzhiyun #endif  /* WL_BAM */
75*4882a593Smuzhiyun #ifdef BIGDATA_SOFTAP
76*4882a593Smuzhiyun #include <wl_bigdata.h>
77*4882a593Smuzhiyun #endif /* BIGDATA_SOFTAP */
78*4882a593Smuzhiyun struct wl_conf;
79*4882a593Smuzhiyun struct wl_iface;
80*4882a593Smuzhiyun struct bcm_cfg80211;
81*4882a593Smuzhiyun struct wl_security;
82*4882a593Smuzhiyun struct wl_ibss;
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 17, 0) && !defined(WL_SAE))
85*4882a593Smuzhiyun #define WL_SAE
86*4882a593Smuzhiyun #endif // endif
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) && !defined(WL_FILS_ROAM_OFFLD))
89*4882a593Smuzhiyun #define WL_FILS_ROAM_OFFLD
90*4882a593Smuzhiyun #endif // endif
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun #ifdef WL_SAE
93*4882a593Smuzhiyun #define IS_AKM_SAE(akm) (akm == WLAN_AKM_SUITE_SAE)
94*4882a593Smuzhiyun #else
95*4882a593Smuzhiyun #define IS_AKM_SAE(akm) FALSE
96*4882a593Smuzhiyun #endif // endif
97*4882a593Smuzhiyun #ifdef WL_OWE
98*4882a593Smuzhiyun #define IS_AKM_OWE(akm) (akm == WLAN_AKM_SUITE_OWE)
99*4882a593Smuzhiyun #else
100*4882a593Smuzhiyun #define IS_AKM_OWE(akm) FALSE
101*4882a593Smuzhiyun #endif // endif
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun #define htod32(i) (i)
104*4882a593Smuzhiyun #define htod16(i) (i)
105*4882a593Smuzhiyun #define dtoh64(i) (i)
106*4882a593Smuzhiyun #define dtoh32(i) (i)
107*4882a593Smuzhiyun #define dtoh16(i) (i)
108*4882a593Smuzhiyun #define htodchanspec(i) (i)
109*4882a593Smuzhiyun #define dtohchanspec(i) (i)
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun #define WL_DBG_NONE	0
112*4882a593Smuzhiyun #define WL_DBG_P2P_ACTION	(1 << 5)
113*4882a593Smuzhiyun #define WL_DBG_TRACE	(1 << 4)
114*4882a593Smuzhiyun #define WL_DBG_SCAN	(1 << 3)
115*4882a593Smuzhiyun #define WL_DBG_DBG	(1 << 2)
116*4882a593Smuzhiyun #define WL_DBG_INFO	(1 << 1)
117*4882a593Smuzhiyun #define WL_DBG_ERR	(1 << 0)
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun #ifndef WAIT_FOR_DISCONNECT_MAX
120*4882a593Smuzhiyun #define WAIT_FOR_DISCONNECT_MAX 10
121*4882a593Smuzhiyun #endif /* WAIT_FOR_DISCONNECT_MAX */
122*4882a593Smuzhiyun #define WAIT_FOR_DISCONNECT_STATE_SYNC 10
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0))
125*4882a593Smuzhiyun /* Newer kernels use defines from nl80211.h */
126*4882a593Smuzhiyun #define IEEE80211_BAND_2GHZ	NL80211_BAND_2GHZ
127*4882a593Smuzhiyun #define IEEE80211_BAND_5GHZ	NL80211_BAND_5GHZ
128*4882a593Smuzhiyun #define IEEE80211_BAND_60GHZ NL80211_BAND_60GHZ
129*4882a593Smuzhiyun #define IEEE80211_NUM_BANDS	NUM_NL80211_BANDS
130*4882a593Smuzhiyun #endif /* LINUX_VER >= 4.7 */
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun #ifdef DHD_LOG_DUMP
133*4882a593Smuzhiyun extern void dhd_log_dump_write(int type, char *binary_data,
134*4882a593Smuzhiyun 		int binary_len, const char *fmt, ...);
135*4882a593Smuzhiyun extern char *dhd_log_dump_get_timestamp(void);
136*4882a593Smuzhiyun #ifndef _DHD_LOG_DUMP_DEFINITIONS_
137*4882a593Smuzhiyun #define DHD_LOG_DUMP_WRITE(fmt, ...) \
138*4882a593Smuzhiyun 	dhd_log_dump_write(DLD_BUF_TYPE_GENERAL, NULL, 0, fmt, ##__VA_ARGS__)
139*4882a593Smuzhiyun #define DHD_LOG_DUMP_WRITE_EX(fmt, ...) \
140*4882a593Smuzhiyun 	dhd_log_dump_write(DLD_BUF_TYPE_SPECIAL, NULL, 0, fmt, ##__VA_ARGS__)
141*4882a593Smuzhiyun #endif /* !_DHD_LOG_DUMP_DEFINITIONS_ */
142*4882a593Smuzhiyun #endif /* DHD_LOG_DUMP */
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)) || (defined(CONFIG_ARCH_MSM) && \
145*4882a593Smuzhiyun 	defined(CFG80211_DISCONNECTED_V2))
146*4882a593Smuzhiyun #define CFG80211_DISCONNECTED(dev, reason, ie, len, loc_gen, gfp) \
147*4882a593Smuzhiyun 	cfg80211_disconnected(dev, reason, ie, len, loc_gen, gfp);
148*4882a593Smuzhiyun #elif (LINUX_VERSION_CODE < KERNEL_VERSION(4, 2, 0))
149*4882a593Smuzhiyun #define CFG80211_DISCONNECTED(dev, reason, ie, len, loc_gen, gfp) \
150*4882a593Smuzhiyun 	BCM_REFERENCE(loc_gen); \
151*4882a593Smuzhiyun 	cfg80211_disconnected(dev, reason, ie, len, gfp);
152*4882a593Smuzhiyun #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)) */
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun /* 0 invalidates all debug messages.  default is 1 */
155*4882a593Smuzhiyun #define WL_DBG_LEVEL 0xFF
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun #define CFG80211_INFO_TEXT		"CFG80211-INFO) "
158*4882a593Smuzhiyun #ifdef CUSTOMER_HW4_DEBUG
159*4882a593Smuzhiyun #define CFG80211_ERROR_TEXT		"CFG80211-INFO2) "
160*4882a593Smuzhiyun #else
161*4882a593Smuzhiyun #define CFG80211_ERROR_TEXT		"CFG80211-ERROR) "
162*4882a593Smuzhiyun #endif /* CUSTOMER_HW4_DEBUG */
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun #if defined(DHD_DEBUG)
165*4882a593Smuzhiyun #ifdef DHD_LOG_DUMP
166*4882a593Smuzhiyun #define	WL_ERR(args)	\
167*4882a593Smuzhiyun do {	\
168*4882a593Smuzhiyun 	if (wl_dbg_level & WL_DBG_ERR) {	\
169*4882a593Smuzhiyun 		printk(KERN_INFO CFG80211_ERROR_TEXT "%s : ", __func__);	\
170*4882a593Smuzhiyun 		pr_cont args;	\
171*4882a593Smuzhiyun 		DHD_LOG_DUMP_WRITE("[%s] %s: ", dhd_log_dump_get_timestamp(), __func__);	\
172*4882a593Smuzhiyun 		DHD_LOG_DUMP_WRITE args;	\
173*4882a593Smuzhiyun 	}	\
174*4882a593Smuzhiyun } while (0)
175*4882a593Smuzhiyun #define WL_ERR_KERN(args)	\
176*4882a593Smuzhiyun do {	\
177*4882a593Smuzhiyun 	if (wl_dbg_level & WL_DBG_ERR) {	\
178*4882a593Smuzhiyun 		printk(KERN_INFO CFG80211_ERROR_TEXT "%s : ", __func__);	\
179*4882a593Smuzhiyun 		pr_cont args;	\
180*4882a593Smuzhiyun 	}	\
181*4882a593Smuzhiyun } while (0)
182*4882a593Smuzhiyun #define	WL_ERR_MEM(args)	\
183*4882a593Smuzhiyun do {	\
184*4882a593Smuzhiyun 	if (wl_dbg_level & WL_DBG_ERR) {	\
185*4882a593Smuzhiyun 		DHD_LOG_DUMP_WRITE("[%s] %s: ", dhd_log_dump_get_timestamp(), __func__);	\
186*4882a593Smuzhiyun 		DHD_LOG_DUMP_WRITE args;	\
187*4882a593Smuzhiyun 	}	\
188*4882a593Smuzhiyun } while (0)
189*4882a593Smuzhiyun #define	WL_INFORM_MEM(args)	\
190*4882a593Smuzhiyun do {	\
191*4882a593Smuzhiyun 	if (wl_dbg_level & WL_DBG_INFO) {	\
192*4882a593Smuzhiyun 		printk(KERN_INFO CFG80211_INFO_TEXT "%s : ", __func__);	\
193*4882a593Smuzhiyun 		pr_cont args;	\
194*4882a593Smuzhiyun 		DHD_LOG_DUMP_WRITE("[%s] %s: ", dhd_log_dump_get_timestamp(), __func__);	\
195*4882a593Smuzhiyun 		DHD_LOG_DUMP_WRITE args;	\
196*4882a593Smuzhiyun 	}	\
197*4882a593Smuzhiyun } while (0)
198*4882a593Smuzhiyun #define	WL_ERR_EX(args)	\
199*4882a593Smuzhiyun do {	\
200*4882a593Smuzhiyun 	if (wl_dbg_level & WL_DBG_ERR) {	\
201*4882a593Smuzhiyun 		printk(KERN_INFO CFG80211_ERROR_TEXT "%s : ", __func__);	\
202*4882a593Smuzhiyun 		pr_cont args;	\
203*4882a593Smuzhiyun 		DHD_LOG_DUMP_WRITE_EX("[%s] %s: ", dhd_log_dump_get_timestamp(), __func__);	\
204*4882a593Smuzhiyun 		DHD_LOG_DUMP_WRITE_EX args;	\
205*4882a593Smuzhiyun 	}	\
206*4882a593Smuzhiyun } while (0)
207*4882a593Smuzhiyun #define	WL_MEM(args)	\
208*4882a593Smuzhiyun do {	\
209*4882a593Smuzhiyun 	DHD_LOG_DUMP_WRITE("[%s] %s: ", dhd_log_dump_get_timestamp(), __func__);	\
210*4882a593Smuzhiyun 	DHD_LOG_DUMP_WRITE args;	\
211*4882a593Smuzhiyun } while (0)
212*4882a593Smuzhiyun #else
213*4882a593Smuzhiyun #define	WL_ERR(args)									\
214*4882a593Smuzhiyun do {										\
215*4882a593Smuzhiyun 	if (wl_dbg_level & WL_DBG_ERR) {				\
216*4882a593Smuzhiyun 			printk(KERN_INFO CFG80211_ERROR_TEXT "%s : ", __func__);	\
217*4882a593Smuzhiyun 			pr_cont args;						\
218*4882a593Smuzhiyun 		}								\
219*4882a593Smuzhiyun } while (0)
220*4882a593Smuzhiyun #define WL_ERR_KERN(args) WL_ERR(args)
221*4882a593Smuzhiyun #define WL_ERR_MEM(args) WL_ERR(args)
222*4882a593Smuzhiyun #define WL_INFORM_MEM(args) WL_INFORM(args)
223*4882a593Smuzhiyun #define WL_ERR_EX(args) WL_ERR(args)
224*4882a593Smuzhiyun #define WL_MEM(args) WL_DBG(args)
225*4882a593Smuzhiyun #endif /* DHD_LOG_DUMP */
226*4882a593Smuzhiyun #else /* defined(DHD_DEBUG) */
227*4882a593Smuzhiyun #define	WL_ERR(args)									\
228*4882a593Smuzhiyun do {										\
229*4882a593Smuzhiyun 	if ((wl_dbg_level & WL_DBG_ERR) && net_ratelimit()) {				\
230*4882a593Smuzhiyun 			printk(KERN_INFO CFG80211_ERROR_TEXT "%s : ", __func__);	\
231*4882a593Smuzhiyun 			pr_cont args;						\
232*4882a593Smuzhiyun 		}								\
233*4882a593Smuzhiyun } while (0)
234*4882a593Smuzhiyun #define WL_ERR_KERN(args) WL_ERR(args)
235*4882a593Smuzhiyun #define WL_ERR_MEM(args) WL_ERR(args)
236*4882a593Smuzhiyun #define WL_INFORM_MEM(args) WL_INFORM(args)
237*4882a593Smuzhiyun #define WL_ERR_EX(args) WL_ERR(args)
238*4882a593Smuzhiyun #define WL_MEM(args) WL_DBG(args)
239*4882a593Smuzhiyun #endif /* defined(DHD_DEBUG) */
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun #define WL_PRINT_RATE_LIMIT_PERIOD 4000000000u /* 4s in units of ns */
242*4882a593Smuzhiyun #define WL_ERR_RLMT(args) \
243*4882a593Smuzhiyun do {	\
244*4882a593Smuzhiyun 	if (wl_dbg_level & WL_DBG_ERR) {	\
245*4882a593Smuzhiyun 		static uint64 __err_ts = 0; \
246*4882a593Smuzhiyun 		static uint32 __err_cnt = 0; \
247*4882a593Smuzhiyun 		uint64 __cur_ts = 0; \
248*4882a593Smuzhiyun 		__cur_ts = local_clock(); \
249*4882a593Smuzhiyun 		if (__err_ts == 0 || (__cur_ts > __err_ts && \
250*4882a593Smuzhiyun 		(__cur_ts - __err_ts > WL_PRINT_RATE_LIMIT_PERIOD))) { \
251*4882a593Smuzhiyun 			__err_ts = __cur_ts; \
252*4882a593Smuzhiyun 			WL_ERR(args);	\
253*4882a593Smuzhiyun 			WL_ERR(("[Repeats %u times]\n", __err_cnt)); \
254*4882a593Smuzhiyun 			__err_cnt = 0; \
255*4882a593Smuzhiyun 		} else { \
256*4882a593Smuzhiyun 			++__err_cnt; \
257*4882a593Smuzhiyun 		} \
258*4882a593Smuzhiyun 	}	\
259*4882a593Smuzhiyun } while (0)
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun #ifdef WL_INFORM
262*4882a593Smuzhiyun #undef WL_INFORM
263*4882a593Smuzhiyun #endif // endif
264*4882a593Smuzhiyun 
265*4882a593Smuzhiyun #define	WL_INFORM(args)									\
266*4882a593Smuzhiyun do {										\
267*4882a593Smuzhiyun 	if (wl_dbg_level & WL_DBG_INFO) {				\
268*4882a593Smuzhiyun 			printk(KERN_INFO "CFG80211-INFO) %s : ", __func__);	\
269*4882a593Smuzhiyun 			pr_cont args;						\
270*4882a593Smuzhiyun 		}								\
271*4882a593Smuzhiyun } while (0)
272*4882a593Smuzhiyun 
273*4882a593Smuzhiyun #ifdef WL_SCAN
274*4882a593Smuzhiyun #undef WL_SCAN
275*4882a593Smuzhiyun #endif // endif
276*4882a593Smuzhiyun #define	WL_SCAN(args)								\
277*4882a593Smuzhiyun do {									\
278*4882a593Smuzhiyun 	if (wl_dbg_level & WL_DBG_SCAN) {			\
279*4882a593Smuzhiyun 		printk(KERN_INFO "CFG80211-SCAN) %s :", __func__);	\
280*4882a593Smuzhiyun 		pr_cont args;							\
281*4882a593Smuzhiyun 	}									\
282*4882a593Smuzhiyun } while (0)
283*4882a593Smuzhiyun #ifdef WL_TRACE
284*4882a593Smuzhiyun #undef WL_TRACE
285*4882a593Smuzhiyun #endif // endif
286*4882a593Smuzhiyun #define	WL_TRACE(args)								\
287*4882a593Smuzhiyun do {									\
288*4882a593Smuzhiyun 	if (wl_dbg_level & WL_DBG_TRACE) {			\
289*4882a593Smuzhiyun 		printk(KERN_INFO "CFG80211-TRACE) %s :", __func__);	\
290*4882a593Smuzhiyun 		pr_cont args;							\
291*4882a593Smuzhiyun 	}									\
292*4882a593Smuzhiyun } while (0)
293*4882a593Smuzhiyun #ifdef WL_TRACE_HW4
294*4882a593Smuzhiyun #undef WL_TRACE_HW4
295*4882a593Smuzhiyun #endif // endif
296*4882a593Smuzhiyun #ifdef CUSTOMER_HW4_DEBUG
297*4882a593Smuzhiyun #define	WL_TRACE_HW4(args)					\
298*4882a593Smuzhiyun do {										\
299*4882a593Smuzhiyun 	if (wl_dbg_level & WL_DBG_ERR) {				\
300*4882a593Smuzhiyun 			printk(KERN_INFO "CFG80211-TRACE) %s : ", __func__);	\
301*4882a593Smuzhiyun 			pr_cont args;						\
302*4882a593Smuzhiyun 		}								\
303*4882a593Smuzhiyun } while (0)
304*4882a593Smuzhiyun #else
305*4882a593Smuzhiyun #define	WL_TRACE_HW4			WL_TRACE
306*4882a593Smuzhiyun #endif /* CUSTOMER_HW4_DEBUG */
307*4882a593Smuzhiyun #if (WL_DBG_LEVEL > 0)
308*4882a593Smuzhiyun #define	WL_DBG(args)								\
309*4882a593Smuzhiyun do {									\
310*4882a593Smuzhiyun 	if (wl_dbg_level & WL_DBG_DBG) {			\
311*4882a593Smuzhiyun 		printk(KERN_INFO "CFG80211-DEBUG) %s :", __func__);	\
312*4882a593Smuzhiyun 		pr_cont args;							\
313*4882a593Smuzhiyun 	}									\
314*4882a593Smuzhiyun } while (0)
315*4882a593Smuzhiyun #else				/* !(WL_DBG_LEVEL > 0) */
316*4882a593Smuzhiyun #define	WL_DBG(args)
317*4882a593Smuzhiyun #endif				/* (WL_DBG_LEVEL > 0) */
318*4882a593Smuzhiyun #define WL_PNO(x)
319*4882a593Smuzhiyun #define WL_SD(x)
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun #define WL_SCAN_RETRY_MAX	3
322*4882a593Smuzhiyun #define WL_NUM_PMKIDS_MAX	MAXPMKID
323*4882a593Smuzhiyun #define WL_SCAN_BUF_MAX 	(1024 * 8)
324*4882a593Smuzhiyun #define WL_TLV_INFO_MAX 	1500
325*4882a593Smuzhiyun #define WL_SCAN_IE_LEN_MAX      2048
326*4882a593Smuzhiyun #define WL_BSS_INFO_MAX		2048
327*4882a593Smuzhiyun #define WL_ASSOC_INFO_MAX	512
328*4882a593Smuzhiyun #define WL_IOCTL_LEN_MAX	2048
329*4882a593Smuzhiyun #define WL_EXTRA_BUF_MAX	2048
330*4882a593Smuzhiyun #define WL_SCAN_ERSULTS_LAST 	(WL_SCAN_RESULTS_NO_MEM+1)
331*4882a593Smuzhiyun #define WL_AP_MAX			256
332*4882a593Smuzhiyun #define WL_FILE_NAME_MAX	256
333*4882a593Smuzhiyun #define WL_DWELL_TIME		200
334*4882a593Smuzhiyun #define WL_MED_DWELL_TIME	400
335*4882a593Smuzhiyun #define WL_MIN_DWELL_TIME	100
336*4882a593Smuzhiyun #define WL_LONG_DWELL_TIME	1000
337*4882a593Smuzhiyun #define IFACE_MAX_CNT	6
338*4882a593Smuzhiyun #define WL_SCAN_CONNECT_DWELL_TIME_MS		200
339*4882a593Smuzhiyun #define WL_SCAN_JOIN_PROBE_INTERVAL_MS		20
340*4882a593Smuzhiyun #define WL_SCAN_JOIN_ACTIVE_DWELL_TIME_MS	320
341*4882a593Smuzhiyun #define WL_SCAN_JOIN_PASSIVE_DWELL_TIME_MS	400
342*4882a593Smuzhiyun #define WL_AF_TX_MAX_RETRY	5
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun #define WL_AF_SEARCH_TIME_MAX		450
345*4882a593Smuzhiyun #define WL_AF_TX_EXTRA_TIME_MAX		200
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun #define WL_SCAN_TIMER_INTERVAL_MS	10000 /* Scan timeout */
348*4882a593Smuzhiyun #ifdef WL_NAN
349*4882a593Smuzhiyun #define WL_SCAN_TIMER_INTERVAL_MS_NAN	15000 /* Scan timeout */
350*4882a593Smuzhiyun #endif /* WL_NAN */
351*4882a593Smuzhiyun #define WL_CHANNEL_SYNC_RETRY	5
352*4882a593Smuzhiyun #define WL_INVALID		-1
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun #ifdef DHD_LOSSLESS_ROAMING
355*4882a593Smuzhiyun #define WL_ROAM_TIMEOUT_MS	1000 /* Roam timeout */
356*4882a593Smuzhiyun #endif // endif
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun #ifdef ENABLE_HOGSQS
359*4882a593Smuzhiyun #define WL_HOGSQS_TIMEOUT_MS    5000 /* Hogger detection timeout */
360*4882a593Smuzhiyun #endif // endif
361*4882a593Smuzhiyun 
362*4882a593Smuzhiyun /* Bring down SCB Timeout to 20secs from 60secs default */
363*4882a593Smuzhiyun #ifndef WL_SCB_TIMEOUT
364*4882a593Smuzhiyun #define WL_SCB_TIMEOUT	20
365*4882a593Smuzhiyun #endif // endif
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun #if defined(ROAM_ENABLE) || defined(ROAM_CHANNEL_CACHE)
368*4882a593Smuzhiyun #define  ESCAN_CHANNEL_CACHE
369*4882a593Smuzhiyun #endif // endif
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun #ifndef WL_SCB_ACTIVITY_TIME
372*4882a593Smuzhiyun #define WL_SCB_ACTIVITY_TIME	5
373*4882a593Smuzhiyun #endif // endif
374*4882a593Smuzhiyun 
375*4882a593Smuzhiyun #ifndef WL_SCB_MAX_PROBE
376*4882a593Smuzhiyun #define WL_SCB_MAX_PROBE	3
377*4882a593Smuzhiyun #endif // endif
378*4882a593Smuzhiyun 
379*4882a593Smuzhiyun #ifndef WL_PSPRETEND_RETRY_LIMIT
380*4882a593Smuzhiyun #define WL_PSPRETEND_RETRY_LIMIT 1
381*4882a593Smuzhiyun #endif // endif
382*4882a593Smuzhiyun 
383*4882a593Smuzhiyun #ifndef WL_MIN_PSPRETEND_THRESHOLD
384*4882a593Smuzhiyun #define WL_MIN_PSPRETEND_THRESHOLD	2
385*4882a593Smuzhiyun #endif // endif
386*4882a593Smuzhiyun 
387*4882a593Smuzhiyun /* Cipher suites */
388*4882a593Smuzhiyun #ifndef WLAN_CIPHER_SUITE_PMK
389*4882a593Smuzhiyun #define WLAN_CIPHER_SUITE_PMK			0x00904C00
390*4882a593Smuzhiyun #endif /* WLAN_CIPHER_SUITE_PMK */
391*4882a593Smuzhiyun 
392*4882a593Smuzhiyun #ifndef WLAN_AKM_SUITE_FT_8021X
393*4882a593Smuzhiyun #define WLAN_AKM_SUITE_FT_8021X			0x000FAC03
394*4882a593Smuzhiyun #endif /* WLAN_AKM_SUITE_FT_8021X */
395*4882a593Smuzhiyun 
396*4882a593Smuzhiyun #ifndef WLAN_AKM_SUITE_FT_PSK
397*4882a593Smuzhiyun #define WLAN_AKM_SUITE_FT_PSK			0x000FAC04
398*4882a593Smuzhiyun #endif /* WLAN_AKM_SUITE_FT_PSK */
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun #ifndef WLAN_AKM_SUITE_8021X_SUITE_B
401*4882a593Smuzhiyun #define WLAN_AKM_SUITE_8021X_SUITE_B		0x000FAC0B
402*4882a593Smuzhiyun #define WLAN_AKM_SUITE_8021X_SUITE_B_192	0x000FAC0C
403*4882a593Smuzhiyun #endif /* WLAN_AKM_SUITE_8021X_SUITE_B */
404*4882a593Smuzhiyun 
405*4882a593Smuzhiyun #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 8, 0))
406*4882a593Smuzhiyun /* TODO: even in upstream linux(v5.0), FT-1X-SHA384 isn't defined and supported yet.
407*4882a593Smuzhiyun  * need to revisit here to sync correct name later.
408*4882a593Smuzhiyun  */
409*4882a593Smuzhiyun #define WLAN_AKM_SUITE_FT_8021X_SHA384		0x000FAC0D
410*4882a593Smuzhiyun #endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(5, 8, 0)) */
411*4882a593Smuzhiyun 
412*4882a593Smuzhiyun #define WL_AKM_SUITE_SHA256_1X  0x000FAC05
413*4882a593Smuzhiyun #define WL_AKM_SUITE_SHA256_PSK 0x000FAC06
414*4882a593Smuzhiyun #define WLAN_AKM_SUITE_DPP 0x506F9A02
415*4882a593Smuzhiyun #define WFA_AUTH_DPP  0x200000 /* WFA DPP AUTH */
416*4882a593Smuzhiyun 
417*4882a593Smuzhiyun #ifndef WLAN_AKM_SUITE_FILS_SHA256
418*4882a593Smuzhiyun #define WLAN_AKM_SUITE_FILS_SHA256		0x000FAC0E
419*4882a593Smuzhiyun #define WLAN_AKM_SUITE_FILS_SHA384		0x000FAC0F
420*4882a593Smuzhiyun #define WLAN_AKM_SUITE_FT_FILS_SHA256		0x000FAC10
421*4882a593Smuzhiyun #define WLAN_AKM_SUITE_FT_FILS_SHA384		0x000FAC11
422*4882a593Smuzhiyun #endif /* WLAN_AKM_SUITE_FILS_SHA256 */
423*4882a593Smuzhiyun 
424*4882a593Smuzhiyun #define MIN_VENDOR_EXTN_IE_LEN		2
425*4882a593Smuzhiyun #ifdef WL_OWE
426*4882a593Smuzhiyun #ifndef WLAN_AKM_SUITE_OWE
427*4882a593Smuzhiyun #define WLAN_AKM_SUITE_OWE                0X000FAC12
428*4882a593Smuzhiyun #endif /* WPA_KEY_MGMT_OWE */
429*4882a593Smuzhiyun #endif /* WL_OWE */
430*4882a593Smuzhiyun 
431*4882a593Smuzhiyun /*
432*4882a593Smuzhiyun  * BRCM local.
433*4882a593Smuzhiyun  * Use a high number that's unlikely to clash with linux upstream for a while until we can
434*4882a593Smuzhiyun  * submit these changes to the community.
435*4882a593Smuzhiyun */
436*4882a593Smuzhiyun #define NL80211_FEATURE_FW_4WAY_HANDSHAKE (1<<31)
437*4882a593Smuzhiyun 
438*4882a593Smuzhiyun /* SCAN_SUPPRESS timer values in ms */
439*4882a593Smuzhiyun #define WL_SCAN_SUPPRESS_TIMEOUT 31000 /* default Framwork DHCP timeout is 30 sec */
440*4882a593Smuzhiyun #define WL_SCAN_SUPPRESS_RETRY 3000
441*4882a593Smuzhiyun 
442*4882a593Smuzhiyun #define WL_PM_ENABLE_TIMEOUT 10000
443*4882a593Smuzhiyun 
444*4882a593Smuzhiyun /* cfg80211 wowlan definitions */
445*4882a593Smuzhiyun #define WL_WOWLAN_MAX_PATTERNS			8
446*4882a593Smuzhiyun #define WL_WOWLAN_MIN_PATTERN_LEN		1
447*4882a593Smuzhiyun #define WL_WOWLAN_MAX_PATTERN_LEN		255
448*4882a593Smuzhiyun #define WL_WOWLAN_PKT_FILTER_ID_FIRST	201
449*4882a593Smuzhiyun #define WL_WOWLAN_PKT_FILTER_ID_LAST	(WL_WOWLAN_PKT_FILTER_ID_FIRST + \
450*4882a593Smuzhiyun 									WL_WOWLAN_MAX_PATTERNS - 1)
451*4882a593Smuzhiyun #ifdef WLAIBSS
452*4882a593Smuzhiyun #define IBSS_COALESCE_DEFAULT 0
453*4882a593Smuzhiyun #define IBSS_INITIAL_SCAN_ALLOWED_DEFAULT 0
454*4882a593Smuzhiyun #else	/* WLAIBSS */
455*4882a593Smuzhiyun #define IBSS_COALESCE_DEFAULT 1
456*4882a593Smuzhiyun #define IBSS_INITIAL_SCAN_ALLOWED_DEFAULT 1
457*4882a593Smuzhiyun #endif	/* WLAIBSS */
458*4882a593Smuzhiyun 
459*4882a593Smuzhiyun #ifdef WLTDLS
460*4882a593Smuzhiyun #define TDLS_TUNNELED_PRB_REQ	"\x7f\x50\x6f\x9a\04"
461*4882a593Smuzhiyun #define TDLS_TUNNELED_PRB_RESP	"\x7f\x50\x6f\x9a\05"
462*4882a593Smuzhiyun #define TDLS_MAX_IFACE_FOR_ENABLE 1
463*4882a593Smuzhiyun #endif /* WLTDLS */
464*4882a593Smuzhiyun 
465*4882a593Smuzhiyun #ifdef WLAIBSS
466*4882a593Smuzhiyun /* Custom AIBSS beacon parameters */
467*4882a593Smuzhiyun #define AIBSS_INITIAL_MIN_BCN_DUR	500
468*4882a593Smuzhiyun #define AIBSS_MIN_BCN_DUR		5000
469*4882a593Smuzhiyun #define AIBSS_BCN_FLOOD_DUR		5000
470*4882a593Smuzhiyun #define AIBSS_PEER_FREE			3
471*4882a593Smuzhiyun #endif /* WLAIBSS */
472*4882a593Smuzhiyun 
473*4882a593Smuzhiyun #ifndef FILS_INDICATION_IE_TAG_FIXED_LEN
474*4882a593Smuzhiyun #define FILS_INDICATION_IE_TAG_FIXED_LEN		2
475*4882a593Smuzhiyun #endif // endif
476*4882a593Smuzhiyun 
477*4882a593Smuzhiyun /* driver status */
478*4882a593Smuzhiyun enum wl_status {
479*4882a593Smuzhiyun 	WL_STATUS_READY = 0,
480*4882a593Smuzhiyun 	WL_STATUS_SCANNING,
481*4882a593Smuzhiyun 	WL_STATUS_SCAN_ABORTING,
482*4882a593Smuzhiyun 	WL_STATUS_CONNECTING,
483*4882a593Smuzhiyun 	WL_STATUS_CONNECTED,
484*4882a593Smuzhiyun 	WL_STATUS_DISCONNECTING,
485*4882a593Smuzhiyun 	WL_STATUS_AP_CREATING,
486*4882a593Smuzhiyun 	WL_STATUS_AP_CREATED,
487*4882a593Smuzhiyun 	/* whole sending action frame procedure:
488*4882a593Smuzhiyun 	 * includes a) 'finding common channel' for public action request frame
489*4882a593Smuzhiyun 	 * and b) 'sending af via 'actframe' iovar'
490*4882a593Smuzhiyun 	 */
491*4882a593Smuzhiyun 	WL_STATUS_SENDING_ACT_FRM,
492*4882a593Smuzhiyun 	/* find a peer to go to a common channel before sending public action req frame */
493*4882a593Smuzhiyun 	WL_STATUS_FINDING_COMMON_CHANNEL,
494*4882a593Smuzhiyun 	/* waiting for next af to sync time of supplicant.
495*4882a593Smuzhiyun 	 * it includes SENDING_ACT_FRM and WAITING_NEXT_ACT_FRM_LISTEN
496*4882a593Smuzhiyun 	 */
497*4882a593Smuzhiyun 	WL_STATUS_WAITING_NEXT_ACT_FRM,
498*4882a593Smuzhiyun #ifdef WL_CFG80211_SYNC_GON
499*4882a593Smuzhiyun 	/* go to listen state to wait for next af after SENDING_ACT_FRM */
500*4882a593Smuzhiyun 	WL_STATUS_WAITING_NEXT_ACT_FRM_LISTEN,
501*4882a593Smuzhiyun #endif /* WL_CFG80211_SYNC_GON */
502*4882a593Smuzhiyun 	/* it will be set when upper layer requests listen and succeed in setting listen mode.
503*4882a593Smuzhiyun 	 * if set, other scan request can abort current listen state
504*4882a593Smuzhiyun 	 */
505*4882a593Smuzhiyun 	WL_STATUS_REMAINING_ON_CHANNEL,
506*4882a593Smuzhiyun #ifdef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST
507*4882a593Smuzhiyun 	/* it's fake listen state to keep current scan state.
508*4882a593Smuzhiyun 	 * it will be set when upper layer requests listen but scan is running. then just run
509*4882a593Smuzhiyun 	 * a expire timer without actual listen state.
510*4882a593Smuzhiyun 	 * if set, other scan request does not need to abort scan.
511*4882a593Smuzhiyun 	 */
512*4882a593Smuzhiyun 	WL_STATUS_FAKE_REMAINING_ON_CHANNEL,
513*4882a593Smuzhiyun #endif /* WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */
514*4882a593Smuzhiyun 	WL_STATUS_NESTED_CONNECT,
515*4882a593Smuzhiyun 	WL_STATUS_CFG80211_CONNECT
516*4882a593Smuzhiyun };
517*4882a593Smuzhiyun 
518*4882a593Smuzhiyun typedef enum wl_iftype {
519*4882a593Smuzhiyun 	WL_IF_TYPE_STA = 0,
520*4882a593Smuzhiyun 	WL_IF_TYPE_AP = 1,
521*4882a593Smuzhiyun 	WL_IF_TYPE_AWDL = 2,
522*4882a593Smuzhiyun 	WL_IF_TYPE_NAN_NMI = 3,
523*4882a593Smuzhiyun 	WL_IF_TYPE_NAN = 4,
524*4882a593Smuzhiyun 	WL_IF_TYPE_P2P_GO = 5,
525*4882a593Smuzhiyun 	WL_IF_TYPE_P2P_GC = 6,
526*4882a593Smuzhiyun 	WL_IF_TYPE_P2P_DISC = 7,
527*4882a593Smuzhiyun 	WL_IF_TYPE_IBSS = 8,
528*4882a593Smuzhiyun 	WL_IF_TYPE_MONITOR = 9,
529*4882a593Smuzhiyun 	WL_IF_TYPE_AIBSS = 10,
530*4882a593Smuzhiyun 	WL_IF_TYPE_MAX
531*4882a593Smuzhiyun } wl_iftype_t;
532*4882a593Smuzhiyun 
533*4882a593Smuzhiyun typedef enum wl_interface_state {
534*4882a593Smuzhiyun 	WL_IF_CREATE_REQ,
535*4882a593Smuzhiyun 	WL_IF_CREATE_DONE,
536*4882a593Smuzhiyun 	WL_IF_DELETE_REQ,
537*4882a593Smuzhiyun 	WL_IF_DELETE_DONE,
538*4882a593Smuzhiyun 	WL_IF_CHANGE_REQ,
539*4882a593Smuzhiyun 	WL_IF_CHANGE_DONE,
540*4882a593Smuzhiyun 	WL_IF_STATE_MAX,	/* Retain as last one */
541*4882a593Smuzhiyun } wl_interface_state_t;
542*4882a593Smuzhiyun 
543*4882a593Smuzhiyun /* wi-fi mode */
544*4882a593Smuzhiyun enum wl_mode {
545*4882a593Smuzhiyun 	WL_MODE_BSS,
546*4882a593Smuzhiyun 	WL_MODE_IBSS,
547*4882a593Smuzhiyun 	WL_MODE_AP,
548*4882a593Smuzhiyun 	WL_MODE_AWDL,
549*4882a593Smuzhiyun 	WL_MODE_NAN
550*4882a593Smuzhiyun };
551*4882a593Smuzhiyun 
552*4882a593Smuzhiyun /* driver profile list */
553*4882a593Smuzhiyun enum wl_prof_list {
554*4882a593Smuzhiyun 	WL_PROF_MODE,
555*4882a593Smuzhiyun 	WL_PROF_SSID,
556*4882a593Smuzhiyun 	WL_PROF_SEC,
557*4882a593Smuzhiyun 	WL_PROF_IBSS,
558*4882a593Smuzhiyun 	WL_PROF_BAND,
559*4882a593Smuzhiyun 	WL_PROF_CHAN,
560*4882a593Smuzhiyun 	WL_PROF_BSSID,
561*4882a593Smuzhiyun 	WL_PROF_ACT,
562*4882a593Smuzhiyun 	WL_PROF_BEACONINT,
563*4882a593Smuzhiyun 	WL_PROF_DTIMPERIOD,
564*4882a593Smuzhiyun 	WL_PROF_LATEST_BSSID
565*4882a593Smuzhiyun };
566*4882a593Smuzhiyun 
567*4882a593Smuzhiyun /* donlge escan state */
568*4882a593Smuzhiyun enum wl_escan_state {
569*4882a593Smuzhiyun 	WL_ESCAN_STATE_IDLE,
570*4882a593Smuzhiyun 	WL_ESCAN_STATE_SCANING
571*4882a593Smuzhiyun };
572*4882a593Smuzhiyun /* fw downloading status */
573*4882a593Smuzhiyun enum wl_fw_status {
574*4882a593Smuzhiyun 	WL_FW_LOADING_DONE,
575*4882a593Smuzhiyun 	WL_NVRAM_LOADING_DONE
576*4882a593Smuzhiyun };
577*4882a593Smuzhiyun 
578*4882a593Smuzhiyun enum wl_management_type {
579*4882a593Smuzhiyun 	WL_BEACON = 0x1,
580*4882a593Smuzhiyun 	WL_PROBE_RESP = 0x2,
581*4882a593Smuzhiyun 	WL_ASSOC_RESP = 0x4
582*4882a593Smuzhiyun };
583*4882a593Smuzhiyun 
584*4882a593Smuzhiyun enum wl_pm_workq_act_type {
585*4882a593Smuzhiyun 	WL_PM_WORKQ_SHORT,
586*4882a593Smuzhiyun 	WL_PM_WORKQ_LONG,
587*4882a593Smuzhiyun 	WL_PM_WORKQ_DEL
588*4882a593Smuzhiyun };
589*4882a593Smuzhiyun 
590*4882a593Smuzhiyun enum wl_tdls_config {
591*4882a593Smuzhiyun     TDLS_STATE_AP_CREATE,
592*4882a593Smuzhiyun     TDLS_STATE_AP_DELETE,
593*4882a593Smuzhiyun     TDLS_STATE_CONNECT,
594*4882a593Smuzhiyun     TDLS_STATE_DISCONNECT,
595*4882a593Smuzhiyun     TDLS_STATE_SETUP,
596*4882a593Smuzhiyun     TDLS_STATE_TEARDOWN,
597*4882a593Smuzhiyun     TDLS_STATE_IF_CREATE,
598*4882a593Smuzhiyun     TDLS_STATE_IF_DELETE,
599*4882a593Smuzhiyun     TDLS_STATE_NMI_CREATE
600*4882a593Smuzhiyun };
601*4882a593Smuzhiyun 
602*4882a593Smuzhiyun /* beacon / probe_response */
603*4882a593Smuzhiyun struct beacon_proberesp {
604*4882a593Smuzhiyun 	__le64 timestamp;
605*4882a593Smuzhiyun 	__le16 beacon_int;
606*4882a593Smuzhiyun 	__le16 capab_info;
607*4882a593Smuzhiyun 	u8 variable[0];
608*4882a593Smuzhiyun } __attribute__ ((packed));
609*4882a593Smuzhiyun 
610*4882a593Smuzhiyun /* driver configuration */
611*4882a593Smuzhiyun struct wl_conf {
612*4882a593Smuzhiyun 	u32 frag_threshold;
613*4882a593Smuzhiyun 	u32 rts_threshold;
614*4882a593Smuzhiyun 	u32 retry_short;
615*4882a593Smuzhiyun 	u32 retry_long;
616*4882a593Smuzhiyun 	s32 tx_power;
617*4882a593Smuzhiyun 	struct ieee80211_channel channel;
618*4882a593Smuzhiyun };
619*4882a593Smuzhiyun 
620*4882a593Smuzhiyun typedef s32(*EVENT_HANDLER) (struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev,
621*4882a593Smuzhiyun                             const wl_event_msg_t *e, void *data);
622*4882a593Smuzhiyun 
623*4882a593Smuzhiyun /* bss inform structure for cfg80211 interface */
624*4882a593Smuzhiyun struct wl_cfg80211_bss_info {
625*4882a593Smuzhiyun 	u16 band;
626*4882a593Smuzhiyun 	u16 channel;
627*4882a593Smuzhiyun 	s16 rssi;
628*4882a593Smuzhiyun 	u16 frame_len;
629*4882a593Smuzhiyun 	u8 frame_buf[1];
630*4882a593Smuzhiyun };
631*4882a593Smuzhiyun 
632*4882a593Smuzhiyun /* basic structure of scan request */
633*4882a593Smuzhiyun struct wl_scan_req {
634*4882a593Smuzhiyun 	struct wlc_ssid ssid;
635*4882a593Smuzhiyun };
636*4882a593Smuzhiyun 
637*4882a593Smuzhiyun /* basic structure of information element */
638*4882a593Smuzhiyun struct wl_ie {
639*4882a593Smuzhiyun 	u16 offset;
640*4882a593Smuzhiyun 	u8 buf[WL_TLV_INFO_MAX];
641*4882a593Smuzhiyun };
642*4882a593Smuzhiyun 
643*4882a593Smuzhiyun /* event queue for cfg80211 main event */
644*4882a593Smuzhiyun struct wl_event_q {
645*4882a593Smuzhiyun 	struct list_head eq_list;
646*4882a593Smuzhiyun 	u32 etype;
647*4882a593Smuzhiyun 	wl_event_msg_t emsg;
648*4882a593Smuzhiyun 	u32 datalen;
649*4882a593Smuzhiyun 	s8 edata[1];
650*4882a593Smuzhiyun };
651*4882a593Smuzhiyun 
652*4882a593Smuzhiyun /* security information with currently associated ap */
653*4882a593Smuzhiyun struct wl_security {
654*4882a593Smuzhiyun 	u32 wpa_versions;
655*4882a593Smuzhiyun 	u32 auth_type;
656*4882a593Smuzhiyun 	u32 cipher_pairwise;
657*4882a593Smuzhiyun 	u32 cipher_group;
658*4882a593Smuzhiyun 	u32 wpa_auth;
659*4882a593Smuzhiyun 	u32 auth_assoc_res_status;
660*4882a593Smuzhiyun };
661*4882a593Smuzhiyun 
662*4882a593Smuzhiyun /* ibss information for currently joined ibss network */
663*4882a593Smuzhiyun struct wl_ibss {
664*4882a593Smuzhiyun 	u8 beacon_interval;	/* in millisecond */
665*4882a593Smuzhiyun 	u8 atim;		/* in millisecond */
666*4882a593Smuzhiyun 	s8 join_only;
667*4882a593Smuzhiyun 	u8 band;
668*4882a593Smuzhiyun 	u8 channel;
669*4882a593Smuzhiyun };
670*4882a593Smuzhiyun 
671*4882a593Smuzhiyun typedef struct wl_bss_vndr_ies {
672*4882a593Smuzhiyun 	u8  probe_req_ie[VNDR_IES_BUF_LEN];
673*4882a593Smuzhiyun 	u8  probe_res_ie[VNDR_IES_MAX_BUF_LEN];
674*4882a593Smuzhiyun 	u8  assoc_req_ie[VNDR_IES_BUF_LEN];
675*4882a593Smuzhiyun 	u8  assoc_res_ie[VNDR_IES_BUF_LEN];
676*4882a593Smuzhiyun 	u8  beacon_ie[VNDR_IES_MAX_BUF_LEN];
677*4882a593Smuzhiyun 	u8  disassoc_ie[VNDR_IES_BUF_LEN];
678*4882a593Smuzhiyun 	u32 probe_req_ie_len;
679*4882a593Smuzhiyun 	u32 probe_res_ie_len;
680*4882a593Smuzhiyun 	u32 assoc_req_ie_len;
681*4882a593Smuzhiyun 	u32 assoc_res_ie_len;
682*4882a593Smuzhiyun 	u32 beacon_ie_len;
683*4882a593Smuzhiyun 	u32 disassoc_ie_len;
684*4882a593Smuzhiyun } wl_bss_vndr_ies_t;
685*4882a593Smuzhiyun 
686*4882a593Smuzhiyun typedef struct wl_cfgbss {
687*4882a593Smuzhiyun 	u8 *wpa_ie;
688*4882a593Smuzhiyun 	u8 *rsn_ie;
689*4882a593Smuzhiyun 	u8 *wps_ie;
690*4882a593Smuzhiyun 	u8 *fils_ind_ie;
691*4882a593Smuzhiyun 	bool security_mode;
692*4882a593Smuzhiyun 	struct wl_bss_vndr_ies ies;	/* Common for STA, P2P GC, GO, AP, P2P Disc Interface */
693*4882a593Smuzhiyun } wl_cfgbss_t;
694*4882a593Smuzhiyun 
695*4882a593Smuzhiyun #ifdef WL11U
696*4882a593Smuzhiyun /* Max length of Interworking element */
697*4882a593Smuzhiyun #define IW_IES_MAX_BUF_LEN	8
698*4882a593Smuzhiyun #endif // endif
699*4882a593Smuzhiyun 
700*4882a593Smuzhiyun /* cfg driver profile */
701*4882a593Smuzhiyun struct wl_profile {
702*4882a593Smuzhiyun 	u32 mode;
703*4882a593Smuzhiyun 	s32 band;
704*4882a593Smuzhiyun 	u32 channel;
705*4882a593Smuzhiyun 	struct wlc_ssid ssid;
706*4882a593Smuzhiyun 	struct wl_security sec;
707*4882a593Smuzhiyun 	struct wl_ibss ibss;
708*4882a593Smuzhiyun 	u8 bssid[ETHER_ADDR_LEN];
709*4882a593Smuzhiyun 	u16 beacon_interval;
710*4882a593Smuzhiyun 	u8 dtim_period;
711*4882a593Smuzhiyun 	bool active;
712*4882a593Smuzhiyun 	u8 latest_bssid[ETHER_ADDR_LEN];
713*4882a593Smuzhiyun 	u32 channel_width;
714*4882a593Smuzhiyun #ifdef WL11U
715*4882a593Smuzhiyun 	u8 iw_ie[IW_IES_MAX_BUF_LEN];
716*4882a593Smuzhiyun 	u32 iw_ie_len;
717*4882a593Smuzhiyun #endif /* WL11U */
718*4882a593Smuzhiyun 	bool dpp_listen;
719*4882a593Smuzhiyun };
720*4882a593Smuzhiyun 
721*4882a593Smuzhiyun struct wl_wps_ie {
722*4882a593Smuzhiyun 	uint8	id;		/* IE ID: 0xDD */
723*4882a593Smuzhiyun 	uint8	len;		/* IE length */
724*4882a593Smuzhiyun 	uint8	OUI[3];		/* WiFi WPS specific OUI */
725*4882a593Smuzhiyun 	uint8	oui_type;	/*  Vendor specific OUI Type */
726*4882a593Smuzhiyun 	uint8	attrib[1];	/* variable length attributes */
727*4882a593Smuzhiyun } __attribute__ ((packed));
728*4882a593Smuzhiyun typedef struct wl_wps_ie wl_wps_ie_t;
729*4882a593Smuzhiyun 
730*4882a593Smuzhiyun struct wl_eap_msg {
731*4882a593Smuzhiyun 	uint16 attrib;
732*4882a593Smuzhiyun 	uint16 len;
733*4882a593Smuzhiyun 	uint8 type;
734*4882a593Smuzhiyun } __attribute__ ((packed));
735*4882a593Smuzhiyun typedef struct wl_eap_msg wl_eap_msg_t;
736*4882a593Smuzhiyun 
737*4882a593Smuzhiyun struct wl_eap_exp {
738*4882a593Smuzhiyun 	uint8 OUI[3];
739*4882a593Smuzhiyun 	uint32 oui_type;
740*4882a593Smuzhiyun 	uint8 opcode;
741*4882a593Smuzhiyun 	u8 flags;
742*4882a593Smuzhiyun 	u8 data[1];
743*4882a593Smuzhiyun } __attribute__ ((packed));
744*4882a593Smuzhiyun typedef struct wl_eap_exp wl_eap_exp_t;
745*4882a593Smuzhiyun 
746*4882a593Smuzhiyun struct net_info {
747*4882a593Smuzhiyun 	struct net_device *ndev;
748*4882a593Smuzhiyun 	struct wireless_dev *wdev;
749*4882a593Smuzhiyun 	struct wl_profile profile;
750*4882a593Smuzhiyun 	wl_iftype_t iftype;
751*4882a593Smuzhiyun 	s32 roam_off;
752*4882a593Smuzhiyun 	unsigned long sme_state;
753*4882a593Smuzhiyun 	bool pm_restore;
754*4882a593Smuzhiyun 	bool pm_block;
755*4882a593Smuzhiyun 	s32 pm;
756*4882a593Smuzhiyun 	s32 bssidx;
757*4882a593Smuzhiyun 	wl_cfgbss_t bss;
758*4882a593Smuzhiyun 	u8 ifidx;
759*4882a593Smuzhiyun #ifdef WL_SAE
760*4882a593Smuzhiyun 	unsigned long mgmt_txstatus;
761*4882a593Smuzhiyun 	size_t mgmt_txid;
762*4882a593Smuzhiyun 	struct completion mgmt_tx_cpl;
763*4882a593Smuzhiyun #endif /* WL_SAE */
764*4882a593Smuzhiyun 	struct list_head list; /* list of all net_info structure */
765*4882a593Smuzhiyun };
766*4882a593Smuzhiyun #ifdef WL_SAE
767*4882a593Smuzhiyun #define WL_WSEC_MAX_SAE_PASSWORD_LEN 128
768*4882a593Smuzhiyun #define WL_WSEC_MIN_SAE_PASSWORD_LEN 8
769*4882a593Smuzhiyun /**
770*4882a593Smuzhiyun  * struct brcmf_wsec_sae_pwd_le - firmware SAE password material.
771*4882a593Smuzhiyun  *
772*4882a593Smuzhiyun  * @key_len: number of octets in key materials.
773*4882a593Smuzhiyun  * @key: SAE password material.
774*4882a593Smuzhiyun  */
775*4882a593Smuzhiyun struct wl_wsec_sae_pwd_le {
776*4882a593Smuzhiyun 	u16 key_len;
777*4882a593Smuzhiyun 	u8 key[WL_WSEC_MAX_SAE_PASSWORD_LEN];
778*4882a593Smuzhiyun };
779*4882a593Smuzhiyun 
780*4882a593Smuzhiyun #endif // endif
781*4882a593Smuzhiyun #ifdef WL_BCNRECV
782*4882a593Smuzhiyun /* PERIODIC Beacon receive for detecting FakeAPs */
783*4882a593Smuzhiyun typedef struct wl_bcnrecv_result {
784*4882a593Smuzhiyun 	uint8      SSID[DOT11_MAX_SSID_LEN];    /**< SSID String */
785*4882a593Smuzhiyun 	struct ether_addr BSSID;                /**< Network BSSID */
786*4882a593Smuzhiyun 	uint8      channel;                     /**< Channel */
787*4882a593Smuzhiyun 	uint16     beacon_interval;
788*4882a593Smuzhiyun 	uint32	   timestamp[2];		/**< Beacon Timestamp */
789*4882a593Smuzhiyun 	uint64     system_time;
790*4882a593Smuzhiyun } wl_bcnrecv_result_t;
791*4882a593Smuzhiyun 
792*4882a593Smuzhiyun typedef struct wl_bcnrecv_info {
793*4882a593Smuzhiyun 	uint bcnrecv_state;		/* TO know the fakeap state */
794*4882a593Smuzhiyun } wl_bcnrecv_info_t;
795*4882a593Smuzhiyun 
796*4882a593Smuzhiyun typedef enum wl_bcnrecv_state {
797*4882a593Smuzhiyun 	BEACON_RECV_IDLE = 0,
798*4882a593Smuzhiyun 	BEACON_RECV_STARTED,
799*4882a593Smuzhiyun 	BEACON_RECV_STOPPED,
800*4882a593Smuzhiyun 	BEACON_RECV_SUSPENDED
801*4882a593Smuzhiyun } wl_bcnrecv_state_t;
802*4882a593Smuzhiyun 
803*4882a593Smuzhiyun typedef enum wl_bcnrecv_reason {
804*4882a593Smuzhiyun 	WL_BCNRECV_INVALID = 0,
805*4882a593Smuzhiyun 	WL_BCNRECV_USER_TRIGGER,
806*4882a593Smuzhiyun 	WL_BCNRECV_SUSPEND,
807*4882a593Smuzhiyun 	WL_BCNRECV_SCANBUSY,
808*4882a593Smuzhiyun 	WL_BCNRECV_CONCURRENCY,
809*4882a593Smuzhiyun 	WL_BCNRECV_LISTENBUSY,
810*4882a593Smuzhiyun 	WL_BCNRECV_ROAMABORT,
811*4882a593Smuzhiyun 	WL_BCNRECV_HANG
812*4882a593Smuzhiyun } wl_bcnrecv_reason_t;
813*4882a593Smuzhiyun 
814*4882a593Smuzhiyun typedef enum wl_bcnrecv_status {
815*4882a593Smuzhiyun 	WL_BCNRECV_STARTED = 0,
816*4882a593Smuzhiyun 	WL_BCNRECV_STOPPED,
817*4882a593Smuzhiyun 	WL_BCNRECV_ABORTED,
818*4882a593Smuzhiyun 	WL_BCNRECV_SUSPENDED,
819*4882a593Smuzhiyun 	WL_BCNRECV_MAX
820*4882a593Smuzhiyun } wl_bcnrecv_status_t;
821*4882a593Smuzhiyun 
822*4882a593Smuzhiyun typedef enum wl_bcnrecv_attr_type {
823*4882a593Smuzhiyun 	BCNRECV_ATTR_STATUS = 1,
824*4882a593Smuzhiyun 	BCNRECV_ATTR_REASON,
825*4882a593Smuzhiyun 	BCNRECV_ATTR_BCNINFO
826*4882a593Smuzhiyun } wl_bcnrecv_attr_type_t;
827*4882a593Smuzhiyun #endif /* WL_BCNRECV */
828*4882a593Smuzhiyun #ifdef WL_CHAN_UTIL
829*4882a593Smuzhiyun #define CU_ATTR_PERCENTAGE 1
830*4882a593Smuzhiyun #define CU_ATTR_HDR_LEN 30
831*4882a593Smuzhiyun #endif /* WL_CHAN_UTIL */
832*4882a593Smuzhiyun 
833*4882a593Smuzhiyun /* association inform */
834*4882a593Smuzhiyun #define MAX_REQ_LINE 1024u
835*4882a593Smuzhiyun struct wl_connect_info {
836*4882a593Smuzhiyun 	u8 req_ie[MAX_REQ_LINE];
837*4882a593Smuzhiyun 	u32 req_ie_len;
838*4882a593Smuzhiyun 	u8 resp_ie[MAX_REQ_LINE];
839*4882a593Smuzhiyun 	u32 resp_ie_len;
840*4882a593Smuzhiyun };
841*4882a593Smuzhiyun #define WL_MAX_FILS_KEY_LEN 64
842*4882a593Smuzhiyun 
843*4882a593Smuzhiyun struct wl_fils_info {
844*4882a593Smuzhiyun 	u8 fils_kek[WL_MAX_FILS_KEY_LEN];
845*4882a593Smuzhiyun 	u32 fils_kek_len;
846*4882a593Smuzhiyun 	u8 fils_pmk[WL_MAX_FILS_KEY_LEN];
847*4882a593Smuzhiyun 	u32 fils_pmk_len;
848*4882a593Smuzhiyun 	u8 fils_pmkid[WL_MAX_FILS_KEY_LEN];
849*4882a593Smuzhiyun 	u16 fils_erp_next_seq_num;
850*4882a593Smuzhiyun 	bool fils_roam_disabled;
851*4882a593Smuzhiyun 	u32 fils_bcn_timeout_cache;
852*4882a593Smuzhiyun };
853*4882a593Smuzhiyun 
854*4882a593Smuzhiyun /* firmware /nvram downloading controller */
855*4882a593Smuzhiyun struct wl_fw_ctrl {
856*4882a593Smuzhiyun 	const struct firmware *fw_entry;
857*4882a593Smuzhiyun 	unsigned long status;
858*4882a593Smuzhiyun 	u32 ptr;
859*4882a593Smuzhiyun 	s8 fw_name[WL_FILE_NAME_MAX];
860*4882a593Smuzhiyun 	s8 nvram_name[WL_FILE_NAME_MAX];
861*4882a593Smuzhiyun };
862*4882a593Smuzhiyun 
863*4882a593Smuzhiyun /* assoc ie length */
864*4882a593Smuzhiyun struct wl_assoc_ielen {
865*4882a593Smuzhiyun 	u32 req_len;
866*4882a593Smuzhiyun 	u32 resp_len;
867*4882a593Smuzhiyun };
868*4882a593Smuzhiyun 
869*4882a593Smuzhiyun #define MIN_PMKID_LIST_V3_FW_MAJOR 13
870*4882a593Smuzhiyun #define MIN_PMKID_LIST_V3_FW_MINOR 0
871*4882a593Smuzhiyun 
872*4882a593Smuzhiyun #define MIN_PMKID_LIST_V2_FW_MAJOR 12
873*4882a593Smuzhiyun #define MIN_PMKID_LIST_V2_FW_MINOR 0
874*4882a593Smuzhiyun 
875*4882a593Smuzhiyun #define MIN_ESCAN_PARAM_V2_FW_MAJOR 14
876*4882a593Smuzhiyun #define MIN_ESCAN_PARAM_V2_FW_MINOR 0
877*4882a593Smuzhiyun 
878*4882a593Smuzhiyun /* wpa2 pmk list */
879*4882a593Smuzhiyun struct wl_pmk_list {
880*4882a593Smuzhiyun 	pmkid_list_v3_t pmkids;
881*4882a593Smuzhiyun 	pmkid_v3_t foo[MAXPMKID - 1];
882*4882a593Smuzhiyun };
883*4882a593Smuzhiyun 
884*4882a593Smuzhiyun #define KEY_PERM_PMK 0xFFFFFFFF
885*4882a593Smuzhiyun 
886*4882a593Smuzhiyun #ifdef DHD_MAX_IFS
887*4882a593Smuzhiyun #define WL_MAX_IFS DHD_MAX_IFS
888*4882a593Smuzhiyun #else
889*4882a593Smuzhiyun #define WL_MAX_IFS 16
890*4882a593Smuzhiyun #endif // endif
891*4882a593Smuzhiyun 
892*4882a593Smuzhiyun #define MAC_RAND_BYTES	3
893*4882a593Smuzhiyun #define ESCAN_BUF_SIZE (64 * 1024)
894*4882a593Smuzhiyun 
895*4882a593Smuzhiyun struct escan_info {
896*4882a593Smuzhiyun 	u32 escan_state;
897*4882a593Smuzhiyun #ifdef STATIC_WL_PRIV_STRUCT
898*4882a593Smuzhiyun #ifndef CONFIG_DHD_USE_STATIC_BUF
899*4882a593Smuzhiyun #error STATIC_WL_PRIV_STRUCT should be used with CONFIG_DHD_USE_STATIC_BUF
900*4882a593Smuzhiyun #endif /* CONFIG_DHD_USE_STATIC_BUF */
901*4882a593Smuzhiyun #ifdef DUAL_ESCAN_RESULT_BUFFER
902*4882a593Smuzhiyun 	u8 *escan_buf[2];
903*4882a593Smuzhiyun #else
904*4882a593Smuzhiyun 	u8 *escan_buf;
905*4882a593Smuzhiyun #endif /* DUAL_ESCAN_RESULT_BUFFER */
906*4882a593Smuzhiyun #else
907*4882a593Smuzhiyun #ifdef DUAL_ESCAN_RESULT_BUFFER
908*4882a593Smuzhiyun 	u8 escan_buf[2][ESCAN_BUF_SIZE];
909*4882a593Smuzhiyun #else
910*4882a593Smuzhiyun 	u8 escan_buf[ESCAN_BUF_SIZE];
911*4882a593Smuzhiyun #endif /* DUAL_ESCAN_RESULT_BUFFER */
912*4882a593Smuzhiyun #endif /* STATIC_WL_PRIV_STRUCT */
913*4882a593Smuzhiyun #ifdef DUAL_ESCAN_RESULT_BUFFER
914*4882a593Smuzhiyun 	u8 cur_sync_id;
915*4882a593Smuzhiyun 	u8 escan_type[2];
916*4882a593Smuzhiyun #endif /* DUAL_ESCAN_RESULT_BUFFER */
917*4882a593Smuzhiyun 	struct wiphy *wiphy;
918*4882a593Smuzhiyun 	struct net_device *ndev;
919*4882a593Smuzhiyun };
920*4882a593Smuzhiyun 
921*4882a593Smuzhiyun #ifdef ESCAN_BUF_OVERFLOW_MGMT
922*4882a593Smuzhiyun #define BUF_OVERFLOW_MGMT_COUNT 3
923*4882a593Smuzhiyun typedef struct {
924*4882a593Smuzhiyun 	int RSSI;
925*4882a593Smuzhiyun 	int length;
926*4882a593Smuzhiyun 	struct ether_addr BSSID;
927*4882a593Smuzhiyun } removal_element_t;
928*4882a593Smuzhiyun #endif /* ESCAN_BUF_OVERFLOW_MGMT */
929*4882a593Smuzhiyun 
930*4882a593Smuzhiyun struct afx_hdl {
931*4882a593Smuzhiyun 	wl_af_params_t *pending_tx_act_frm;
932*4882a593Smuzhiyun 	struct ether_addr	tx_dst_addr;
933*4882a593Smuzhiyun 	struct net_device *dev;
934*4882a593Smuzhiyun 	struct work_struct work;
935*4882a593Smuzhiyun 	s32 bssidx;
936*4882a593Smuzhiyun 	u32 retry;
937*4882a593Smuzhiyun 	s32 peer_chan;
938*4882a593Smuzhiyun 	s32 peer_listen_chan; /* search channel: configured by upper layer */
939*4882a593Smuzhiyun 	s32 my_listen_chan;	/* listen chanel: extract it from prb req or gon req */
940*4882a593Smuzhiyun 	bool is_listen;
941*4882a593Smuzhiyun 	bool ack_recv;
942*4882a593Smuzhiyun 	bool is_active;
943*4882a593Smuzhiyun };
944*4882a593Smuzhiyun 
945*4882a593Smuzhiyun struct parsed_ies {
946*4882a593Smuzhiyun 	const wpa_ie_fixed_t *wps_ie;
947*4882a593Smuzhiyun 	u32 wps_ie_len;
948*4882a593Smuzhiyun 	const wpa_ie_fixed_t *wpa_ie;
949*4882a593Smuzhiyun 	u32 wpa_ie_len;
950*4882a593Smuzhiyun 	const bcm_tlv_t *wpa2_ie;
951*4882a593Smuzhiyun 	u32 wpa2_ie_len;
952*4882a593Smuzhiyun 	const bcm_tlv_t *fils_ind_ie;
953*4882a593Smuzhiyun 	u32 fils_ind_ie_len;
954*4882a593Smuzhiyun };
955*4882a593Smuzhiyun 
956*4882a593Smuzhiyun #ifdef P2P_LISTEN_OFFLOADING
957*4882a593Smuzhiyun typedef struct {
958*4882a593Smuzhiyun 	uint16	period;                 /* listen offload period */
959*4882a593Smuzhiyun 	uint16	interval;               /* listen offload interval */
960*4882a593Smuzhiyun 	uint16	count;			/* listen offload count */
961*4882a593Smuzhiyun 	uint16	pad;                    /* pad for 32bit align */
962*4882a593Smuzhiyun } wl_p2plo_listen_t;
963*4882a593Smuzhiyun #endif /* P2P_LISTEN_OFFLOADING */
964*4882a593Smuzhiyun 
965*4882a593Smuzhiyun #ifdef WLFBT
966*4882a593Smuzhiyun #define FBT_KEYLEN		32
967*4882a593Smuzhiyun #endif // endif
968*4882a593Smuzhiyun #define MAX_EVENT_BUF_NUM 16
969*4882a593Smuzhiyun typedef struct wl_eventmsg_buf {
970*4882a593Smuzhiyun 	u16 num;
971*4882a593Smuzhiyun 	struct {
972*4882a593Smuzhiyun 		u16 type;
973*4882a593Smuzhiyun 		bool set;
974*4882a593Smuzhiyun 	} event [MAX_EVENT_BUF_NUM];
975*4882a593Smuzhiyun } wl_eventmsg_buf_t;
976*4882a593Smuzhiyun 
977*4882a593Smuzhiyun typedef struct wl_if_event_info {
978*4882a593Smuzhiyun 	bool valid;
979*4882a593Smuzhiyun 	int ifidx;
980*4882a593Smuzhiyun 	int bssidx;
981*4882a593Smuzhiyun 	uint8 mac[ETHER_ADDR_LEN];
982*4882a593Smuzhiyun 	char name[IFNAMSIZ+1];
983*4882a593Smuzhiyun 	uint8 role;
984*4882a593Smuzhiyun } wl_if_event_info;
985*4882a593Smuzhiyun 
986*4882a593Smuzhiyun #ifdef SUPPORT_AP_RADIO_PWRSAVE
987*4882a593Smuzhiyun typedef struct ap_rps_info {
988*4882a593Smuzhiyun 	bool enable;
989*4882a593Smuzhiyun 	int sta_assoc_check;
990*4882a593Smuzhiyun 	int pps;
991*4882a593Smuzhiyun 	int quiet_time;
992*4882a593Smuzhiyun 	int level;
993*4882a593Smuzhiyun } ap_rps_info_t;
994*4882a593Smuzhiyun #endif /* SUPPORT_AP_RADIO_PWRSAVE */
995*4882a593Smuzhiyun 
996*4882a593Smuzhiyun #ifdef SUPPORT_RSSI_SUM_REPORT
997*4882a593Smuzhiyun #define RSSILOG_FLAG_FEATURE_SW		0x1
998*4882a593Smuzhiyun #define RSSILOG_FLAG_REPORT_READY	0x2
999*4882a593Smuzhiyun typedef struct rssilog_set_param {
1000*4882a593Smuzhiyun 	uint8 enable;
1001*4882a593Smuzhiyun 	uint8 rssi_threshold;
1002*4882a593Smuzhiyun 	uint8 time_threshold;
1003*4882a593Smuzhiyun 	uint8 pad;
1004*4882a593Smuzhiyun } rssilog_set_param_t;
1005*4882a593Smuzhiyun 
1006*4882a593Smuzhiyun typedef struct rssilog_get_param {
1007*4882a593Smuzhiyun 	uint8 report_count;
1008*4882a593Smuzhiyun 	uint8 enable;
1009*4882a593Smuzhiyun 	uint8 rssi_threshold;
1010*4882a593Smuzhiyun 	uint8 time_threshold;
1011*4882a593Smuzhiyun } rssilog_get_param_t;
1012*4882a593Smuzhiyun 
1013*4882a593Smuzhiyun typedef struct rssi_ant_param {
1014*4882a593Smuzhiyun 	struct ether_addr ea;
1015*4882a593Smuzhiyun 	chanspec_t chanspec;
1016*4882a593Smuzhiyun } rssi_ant_param_t;
1017*4882a593Smuzhiyun 
1018*4882a593Smuzhiyun typedef struct wl_rssi_ant_mimo {
1019*4882a593Smuzhiyun 	uint32 version;
1020*4882a593Smuzhiyun 	uint32 count;
1021*4882a593Smuzhiyun 	int8 rssi_ant[WL_RSSI_ANT_MAX];
1022*4882a593Smuzhiyun 	int8 rssi_sum;
1023*4882a593Smuzhiyun 	int8 PAD[3];
1024*4882a593Smuzhiyun } wl_rssi_ant_mimo_t;
1025*4882a593Smuzhiyun #endif /* SUPPORT_RSSI_SUM_REPORT */
1026*4882a593Smuzhiyun 
1027*4882a593Smuzhiyun /* MBO-OCE prune event reason codes */
1028*4882a593Smuzhiyun #if defined(WL_MBO) || defined(WL_OCE)
1029*4882a593Smuzhiyun typedef enum wl_prune_evt_reason {
1030*4882a593Smuzhiyun 	WIFI_PRUNE_UNSPECIFIED = 0,		/* Unspecified event reason code */
1031*4882a593Smuzhiyun 	WIFI_PRUNE_ASSOC_RETRY_DELAY = 1,	/* MBO assoc retry delay */
1032*4882a593Smuzhiyun 	WIFI_PRUNE_RSSI_ASSOC_REJ = 2		/* OCE RSSI-based assoc rejection */
1033*4882a593Smuzhiyun } wl_prune_evt_reason_t;
1034*4882a593Smuzhiyun #endif /* WL_MBO || WL_OCE */
1035*4882a593Smuzhiyun 
1036*4882a593Smuzhiyun #if defined(DHD_ENABLE_BIGDATA_LOGGING)
1037*4882a593Smuzhiyun #define GET_BSS_INFO_LEN 90
1038*4882a593Smuzhiyun #endif /* DHD_ENABLE_BIGDATA_LOGGING */
1039*4882a593Smuzhiyun 
1040*4882a593Smuzhiyun #ifdef WL_MBO
1041*4882a593Smuzhiyun typedef struct wl_event_mbo wl_event_mbo_t;
1042*4882a593Smuzhiyun typedef struct wl_event_mbo_cell_nw_switch wl_event_mbo_cell_nw_switch_t;
1043*4882a593Smuzhiyun typedef struct wl_btm_event_type_data wl_btm_event_type_data_t;
1044*4882a593Smuzhiyun #endif /* WL_MBO */
1045*4882a593Smuzhiyun 
1046*4882a593Smuzhiyun #if defined(WL_MBO) || defined(WL_OCE)
1047*4882a593Smuzhiyun typedef struct wl_bssid_prune_evt_info wl_bssid_pruned_evt_info_t;
1048*4882a593Smuzhiyun #endif /* WL_MBO || WL_OCE */
1049*4882a593Smuzhiyun 
1050*4882a593Smuzhiyun #ifdef WL_NAN
1051*4882a593Smuzhiyun #define NAN_MAX_NDI		1u
1052*4882a593Smuzhiyun typedef struct wl_ndi_data
1053*4882a593Smuzhiyun {
1054*4882a593Smuzhiyun 	u8 ifname[IFNAMSIZ];
1055*4882a593Smuzhiyun 	u8 in_use;
1056*4882a593Smuzhiyun 	u8 created;
1057*4882a593Smuzhiyun 	struct net_device *nan_ndev;
1058*4882a593Smuzhiyun } wl_ndi_data_t;
1059*4882a593Smuzhiyun typedef struct wl_nancfg
1060*4882a593Smuzhiyun {
1061*4882a593Smuzhiyun 	wl_nan_ver_t version;
1062*4882a593Smuzhiyun 	wl_ndi_data_t ndi[NAN_MAX_NDI];
1063*4882a593Smuzhiyun 	struct mutex nan_sync;
1064*4882a593Smuzhiyun 	uint8 svc_inst_id_mask[NAN_SVC_INST_SIZE];
1065*4882a593Smuzhiyun 	uint8 inst_id_start;
1066*4882a593Smuzhiyun 	/* wait queue and condition variable for nan event */
1067*4882a593Smuzhiyun 	bool nan_event_recvd;
1068*4882a593Smuzhiyun 	wait_queue_head_t nan_event_wait;
1069*4882a593Smuzhiyun 	nan_stop_reason_code_t disable_reason;
1070*4882a593Smuzhiyun 	bool mac_rand;
1071*4882a593Smuzhiyun 	int range_type;
1072*4882a593Smuzhiyun 	uint8 max_ndp_count;       /* Max no. of NDPs */
1073*4882a593Smuzhiyun 	nan_ndp_peer_t *nan_ndp_peer_info;
1074*4882a593Smuzhiyun } wl_nancfg_t;
1075*4882a593Smuzhiyun 
1076*4882a593Smuzhiyun #ifdef WL_NANP2P
1077*4882a593Smuzhiyun #define WL_CFG_P2P_DISC_BIT 0x1u
1078*4882a593Smuzhiyun #define WL_CFG_NAN_DISC_BIT 0x2u
1079*4882a593Smuzhiyun #define WL_NANP2P_CONC_SUPPORT	(WL_CFG_P2P_DISC_BIT | WL_CFG_NAN_DISC_BIT)
1080*4882a593Smuzhiyun #endif /* WL_NAN2P */
1081*4882a593Smuzhiyun #endif /* WL_NAN */
1082*4882a593Smuzhiyun 
1083*4882a593Smuzhiyun #ifdef WL_IFACE_MGMT
1084*4882a593Smuzhiyun #define WL_IFACE_NOT_PRESENT -1
1085*4882a593Smuzhiyun 
1086*4882a593Smuzhiyun typedef enum iface_conc_policy {
1087*4882a593Smuzhiyun 	WL_IF_POLICY_DEFAULT		= 0,
1088*4882a593Smuzhiyun 	WL_IF_POLICY_FCFS		= 1,
1089*4882a593Smuzhiyun 	WL_IF_POLICY_LP			= 2,
1090*4882a593Smuzhiyun 	WL_IF_POLICY_ROLE_PRIORITY	= 3,
1091*4882a593Smuzhiyun 	WL_IF_POLICY_CUSTOM		= 4,
1092*4882a593Smuzhiyun 	WL_IF_POLICY_INVALID
1093*4882a593Smuzhiyun } iface_conc_policy_t;
1094*4882a593Smuzhiyun 
1095*4882a593Smuzhiyun typedef struct iface_mgmt_data {
1096*4882a593Smuzhiyun 	uint8 policy;
1097*4882a593Smuzhiyun 	uint8 priority[WL_IF_TYPE_MAX];
1098*4882a593Smuzhiyun } iface_mgmt_data_t;
1099*4882a593Smuzhiyun #endif /* WL_IFACE_MGMT */
1100*4882a593Smuzhiyun 
1101*4882a593Smuzhiyun #ifdef WL_WPS_SYNC
1102*4882a593Smuzhiyun #define EAP_PACKET              0
1103*4882a593Smuzhiyun #define EAP_EXPANDED_TYPE       254
1104*4882a593Smuzhiyun #define EAP_EXP_OPCODE_OFFSET   7
1105*4882a593Smuzhiyun #define EAP_EXP_FRAGMENT_LEN_OFFSET	2
1106*4882a593Smuzhiyun #define EAP_EXP_FLAGS_FRAGMENTED_DATA	2
1107*4882a593Smuzhiyun #define EAP_EXP_FLAGS_MORE_DATA	1
1108*4882a593Smuzhiyun #define EAPOL_EAP_HDR_LEN       5
1109*4882a593Smuzhiyun #define EAP_EXP_HDR_MIN_LENGTH	(EAPOL_EAP_HDR_LEN + EAP_EXP_OPCODE_OFFSET)
1110*4882a593Smuzhiyun #define EAP_ATTRIB_MSGTYPE  0x1022
1111*4882a593Smuzhiyun #define EAP_WSC_UPNP        0
1112*4882a593Smuzhiyun #define EAP_WSC_START       1
1113*4882a593Smuzhiyun #define EAP_WSC_ACK         2
1114*4882a593Smuzhiyun #define EAP_WSC_NACK        3
1115*4882a593Smuzhiyun #define EAP_WSC_MSG         4
1116*4882a593Smuzhiyun #define EAP_WSC_DONE        5
1117*4882a593Smuzhiyun #define EAP_WSC_MSG_M8      12
1118*4882a593Smuzhiyun #define EAP_CODE_FAILURE    4
1119*4882a593Smuzhiyun #define WL_WPS_REAUTH_TIMEOUT	10000
1120*4882a593Smuzhiyun 
1121*4882a593Smuzhiyun struct wl_eap_header {
1122*4882a593Smuzhiyun 	unsigned char code; /* EAP code */
1123*4882a593Smuzhiyun 	unsigned char id;   /* Current request ID */
1124*4882a593Smuzhiyun 	unsigned short length;  /* Length including header */
1125*4882a593Smuzhiyun 	unsigned char type; /* EAP type (optional) */
1126*4882a593Smuzhiyun 	unsigned char data[1];  /* Type data (optional) */
1127*4882a593Smuzhiyun } __attribute__ ((packed));
1128*4882a593Smuzhiyun typedef struct wl_eap_header wl_eap_header_t;
1129*4882a593Smuzhiyun 
1130*4882a593Smuzhiyun typedef enum wl_wps_state {
1131*4882a593Smuzhiyun 	WPS_STATE_IDLE = 0,
1132*4882a593Smuzhiyun 	WPS_STATE_STARTED,
1133*4882a593Smuzhiyun 	WPS_STATE_M8_SENT,
1134*4882a593Smuzhiyun 	WPS_STATE_M8_RECVD,
1135*4882a593Smuzhiyun 	WPS_STATE_EAP_FAIL,
1136*4882a593Smuzhiyun 	WPS_STATE_REAUTH_WAIT,
1137*4882a593Smuzhiyun 	WPS_STATE_LINKUP,
1138*4882a593Smuzhiyun 	WPS_STATE_LINKDOWN,
1139*4882a593Smuzhiyun 	WPS_STATE_DISCONNECT,
1140*4882a593Smuzhiyun 	WPS_STATE_DISCONNECT_CLIENT,
1141*4882a593Smuzhiyun 	WPS_STATE_CONNECT_FAIL,
1142*4882a593Smuzhiyun 	WPS_STATE_AUTHORIZE,
1143*4882a593Smuzhiyun 	WPS_STATE_DONE,
1144*4882a593Smuzhiyun 	WPS_STATE_INVALID
1145*4882a593Smuzhiyun } wl_wps_state_t;
1146*4882a593Smuzhiyun 
1147*4882a593Smuzhiyun #define WPS_MAX_SESSIONS	2
1148*4882a593Smuzhiyun typedef struct wl_wps_session {
1149*4882a593Smuzhiyun 	bool in_use;
1150*4882a593Smuzhiyun 	timer_list_compat_t timer;
1151*4882a593Smuzhiyun 	struct net_device *ndev;
1152*4882a593Smuzhiyun 	wl_wps_state_t state;
1153*4882a593Smuzhiyun 	u16 mode;
1154*4882a593Smuzhiyun 	u8 peer_mac[ETHER_ADDR_LEN];
1155*4882a593Smuzhiyun } wl_wps_session_t;
1156*4882a593Smuzhiyun #endif /* WL_WPS_SYNC */
1157*4882a593Smuzhiyun 
1158*4882a593Smuzhiyun #ifndef WL_STATIC_IFNAME_PREFIX
1159*4882a593Smuzhiyun #define WL_STATIC_IFNAME_PREFIX "wlan%d"
1160*4882a593Smuzhiyun #endif /* WL_STATIC_IFNAME */
1161*4882a593Smuzhiyun #define STATIC_INAME_STRING_LEN         6
1162*4882a593Smuzhiyun #ifndef DHD_NUM_STATIC_IFACES
1163*4882a593Smuzhiyun #define DHD_NUM_STATIC_IFACES           2
1164*4882a593Smuzhiyun #endif // endif
1165*4882a593Smuzhiyun 
1166*4882a593Smuzhiyun typedef struct buf_data {
1167*4882a593Smuzhiyun 	u32 ver; /* version of struct */
1168*4882a593Smuzhiyun 	u32 len; /* Total len */
1169*4882a593Smuzhiyun 	/* size of each buffer in case of split buffers (0 - single buffer). */
1170*4882a593Smuzhiyun 	u32 buf_threshold;
1171*4882a593Smuzhiyun 	const void *data_buf[1]; /* array of user space buffer pointers. */
1172*4882a593Smuzhiyun } buf_data_t;
1173*4882a593Smuzhiyun 
1174*4882a593Smuzhiyun /* private data of cfg80211 interface */
1175*4882a593Smuzhiyun struct bcm_cfg80211 {
1176*4882a593Smuzhiyun 	struct wireless_dev *wdev;	/* representing cfg cfg80211 device */
1177*4882a593Smuzhiyun 
1178*4882a593Smuzhiyun 	struct wireless_dev *p2p_wdev;	/* representing cfg cfg80211 device for P2P */
1179*4882a593Smuzhiyun 	struct net_device *p2p_net;    /* reference to p2p0 interface */
1180*4882a593Smuzhiyun 
1181*4882a593Smuzhiyun 	struct wl_conf *conf;
1182*4882a593Smuzhiyun 	struct cfg80211_scan_request *scan_request;	/* scan request object */
1183*4882a593Smuzhiyun 	EVENT_HANDLER evt_handler[WLC_E_LAST];
1184*4882a593Smuzhiyun 	struct list_head eq_list;	/* used for event queue */
1185*4882a593Smuzhiyun 	struct list_head net_list;     /* used for struct net_info */
1186*4882a593Smuzhiyun 	spinlock_t net_list_sync;	/* to protect scan status (and others if needed) */
1187*4882a593Smuzhiyun 	spinlock_t eq_lock;	/* for event queue synchronization */
1188*4882a593Smuzhiyun 	spinlock_t cfgdrv_lock;	/* to protect scan status (and others if needed) */
1189*4882a593Smuzhiyun 	struct completion act_frm_scan;
1190*4882a593Smuzhiyun 	struct completion iface_disable;
1191*4882a593Smuzhiyun 	struct completion wait_next_af;
1192*4882a593Smuzhiyun 	struct mutex usr_sync;	/* maily for up/down synchronization */
1193*4882a593Smuzhiyun 	struct mutex if_sync;	/* maily for iface op synchronization */
1194*4882a593Smuzhiyun 	struct mutex scan_sync;	/* scan sync from different scan contexts  */
1195*4882a593Smuzhiyun 	struct wl_scan_results *bss_list;
1196*4882a593Smuzhiyun 	struct wl_scan_results *scan_results;
1197*4882a593Smuzhiyun 
1198*4882a593Smuzhiyun 	/* scan request object for internal purpose */
1199*4882a593Smuzhiyun 	struct wl_scan_req *scan_req_int;
1200*4882a593Smuzhiyun 	/* information element object for internal purpose */
1201*4882a593Smuzhiyun #if defined(STATIC_WL_PRIV_STRUCT)
1202*4882a593Smuzhiyun 	struct wl_ie *ie;
1203*4882a593Smuzhiyun #else
1204*4882a593Smuzhiyun 	struct wl_ie ie;
1205*4882a593Smuzhiyun #endif // endif
1206*4882a593Smuzhiyun 
1207*4882a593Smuzhiyun 	/* association information container */
1208*4882a593Smuzhiyun #if defined(STATIC_WL_PRIV_STRUCT)
1209*4882a593Smuzhiyun 	struct wl_connect_info *conn_info;
1210*4882a593Smuzhiyun #else
1211*4882a593Smuzhiyun 	struct wl_connect_info conn_info;
1212*4882a593Smuzhiyun #endif // endif
1213*4882a593Smuzhiyun #ifdef DEBUGFS_CFG80211
1214*4882a593Smuzhiyun 	struct dentry		*debugfs;
1215*4882a593Smuzhiyun #endif /* DEBUGFS_CFG80211 */
1216*4882a593Smuzhiyun 	struct wl_pmk_list *pmk_list;	/* wpa2 pmk list */
1217*4882a593Smuzhiyun 	tsk_ctl_t event_tsk;  		/* task of main event handler thread */
1218*4882a593Smuzhiyun 	void *pub;
1219*4882a593Smuzhiyun 	u32 iface_cnt;
1220*4882a593Smuzhiyun 	u32 channel;		/* current channel */
1221*4882a593Smuzhiyun 	u32 af_sent_channel;	/* channel action frame is sent */
1222*4882a593Smuzhiyun 	/* next af subtype to cancel the remained dwell time in rx process */
1223*4882a593Smuzhiyun 	u8 next_af_subtype;
1224*4882a593Smuzhiyun #ifdef WL_CFG80211_SYNC_GON
1225*4882a593Smuzhiyun 	ulong af_tx_sent_jiffies;
1226*4882a593Smuzhiyun #endif /* WL_CFG80211_SYNC_GON */
1227*4882a593Smuzhiyun 	struct escan_info escan_info;   /* escan information */
1228*4882a593Smuzhiyun 	bool active_scan;	/* current scan mode */
1229*4882a593Smuzhiyun 	bool ibss_starter;	/* indicates this sta is ibss starter */
1230*4882a593Smuzhiyun 	bool link_up;		/* link/connection up flag */
1231*4882a593Smuzhiyun 
1232*4882a593Smuzhiyun 	/* indicate whether chip to support power save mode */
1233*4882a593Smuzhiyun 	bool pwr_save;
1234*4882a593Smuzhiyun 	bool roam_on;		/* on/off switch for self-roaming */
1235*4882a593Smuzhiyun 	bool scan_tried;	/* indicates if first scan attempted */
1236*4882a593Smuzhiyun #if defined(BCMSDIO) || defined(BCMPCIE)
1237*4882a593Smuzhiyun 	bool wlfc_on;
1238*4882a593Smuzhiyun #endif // endif
1239*4882a593Smuzhiyun 	bool vsdb_mode;
1240*4882a593Smuzhiyun #define WL_ROAM_OFF_ON_CONCURRENT 	0x0001
1241*4882a593Smuzhiyun #define WL_ROAM_REVERT_STATUS		0x0002
1242*4882a593Smuzhiyun 	u32 roam_flags;
1243*4882a593Smuzhiyun 	u8 *ioctl_buf;		/* ioctl buffer */
1244*4882a593Smuzhiyun 	struct mutex ioctl_buf_sync;
1245*4882a593Smuzhiyun 	u8 *escan_ioctl_buf;
1246*4882a593Smuzhiyun 	u8 *extra_buf;	/* maily to grab assoc information */
1247*4882a593Smuzhiyun 	struct dentry *debugfsdir;
1248*4882a593Smuzhiyun 	struct rfkill *rfkill;
1249*4882a593Smuzhiyun 	bool rf_blocked;
1250*4882a593Smuzhiyun 	struct ieee80211_channel remain_on_chan;
1251*4882a593Smuzhiyun 	enum nl80211_channel_type remain_on_chan_type;
1252*4882a593Smuzhiyun 	u64 send_action_id;
1253*4882a593Smuzhiyun 	u64 last_roc_id;
1254*4882a593Smuzhiyun 	wait_queue_head_t netif_change_event;
1255*4882a593Smuzhiyun 	wl_if_event_info if_event_info;
1256*4882a593Smuzhiyun 	struct completion send_af_done;
1257*4882a593Smuzhiyun 	struct afx_hdl *afx_hdl;
1258*4882a593Smuzhiyun 	struct p2p_info *p2p;
1259*4882a593Smuzhiyun 	bool p2p_supported;
1260*4882a593Smuzhiyun 	void *btcoex_info;
1261*4882a593Smuzhiyun 	timer_list_compat_t scan_timeout;   /* Timer for catch scan event timeout */
1262*4882a593Smuzhiyun #ifdef WL_CFG80211_GON_COLLISION
1263*4882a593Smuzhiyun 	u8 block_gon_req_tx_count;
1264*4882a593Smuzhiyun 	u8 block_gon_req_rx_count;
1265*4882a593Smuzhiyun #endif /* WL_CFG80211_GON_COLLISION */
1266*4882a593Smuzhiyun #if defined(P2P_IE_MISSING_FIX)
1267*4882a593Smuzhiyun 	bool p2p_prb_noti;
1268*4882a593Smuzhiyun #endif // endif
1269*4882a593Smuzhiyun 	s32(*state_notifier) (struct bcm_cfg80211 *cfg,
1270*4882a593Smuzhiyun 		struct net_info *_net_info, enum wl_status state, bool set);
1271*4882a593Smuzhiyun 	unsigned long interrested_state;
1272*4882a593Smuzhiyun 	wlc_ssid_t hostapd_ssid;
1273*4882a593Smuzhiyun #ifdef WL11U
1274*4882a593Smuzhiyun 	bool wl11u;
1275*4882a593Smuzhiyun #endif /* WL11U */
1276*4882a593Smuzhiyun 	bool sched_scan_running;	/* scheduled scan req status */
1277*4882a593Smuzhiyun 	struct cfg80211_sched_scan_request *sched_scan_req;	/* scheduled scan req */
1278*4882a593Smuzhiyun #ifdef WL_HOST_BAND_MGMT
1279*4882a593Smuzhiyun 	u8 curr_band;
1280*4882a593Smuzhiyun #endif /* WL_HOST_BAND_MGMT */
1281*4882a593Smuzhiyun 	bool scan_suppressed;
1282*4882a593Smuzhiyun #ifdef OEM_ANDROID
1283*4882a593Smuzhiyun 	timer_list_compat_t scan_supp_timer;
1284*4882a593Smuzhiyun 	struct work_struct wlan_work;
1285*4882a593Smuzhiyun #endif /* OEM_ANDROID */
1286*4882a593Smuzhiyun 	struct mutex event_sync;	/* maily for up/down synchronization */
1287*4882a593Smuzhiyun 	bool disable_roam_event;
1288*4882a593Smuzhiyun 	struct delayed_work pm_enable_work;
1289*4882a593Smuzhiyun #ifdef OEM_ANDROID
1290*4882a593Smuzhiyun 	struct workqueue_struct *event_workq;   /* workqueue for event */
1291*4882a593Smuzhiyun #else
1292*4882a593Smuzhiyun 	bool event_workq_init;
1293*4882a593Smuzhiyun #endif /* OEM_ANDROID */
1294*4882a593Smuzhiyun 	struct work_struct event_work;		/* work item for event */
1295*4882a593Smuzhiyun 	struct mutex pm_sync;	/* mainly for pm work synchronization */
1296*4882a593Smuzhiyun 
1297*4882a593Smuzhiyun 	vndr_ie_setbuf_t *ibss_vsie;	/* keep the VSIE for IBSS */
1298*4882a593Smuzhiyun 	int ibss_vsie_len;
1299*4882a593Smuzhiyun #ifdef WLAIBSS
1300*4882a593Smuzhiyun 	u32 aibss_txfail_pid;
1301*4882a593Smuzhiyun 	u32 aibss_txfail_seq;
1302*4882a593Smuzhiyun #endif /* WLAIBSS */
1303*4882a593Smuzhiyun #ifdef WL_RELMCAST
1304*4882a593Smuzhiyun 	u32 rmc_event_pid;
1305*4882a593Smuzhiyun 	u32 rmc_event_seq;
1306*4882a593Smuzhiyun #endif /* WL_RELMCAST */
1307*4882a593Smuzhiyun #ifdef WLAIBSS_MCHAN
1308*4882a593Smuzhiyun 	struct ether_addr ibss_if_addr;
1309*4882a593Smuzhiyun 	bcm_struct_cfgdev *ibss_cfgdev; /* For AIBSS */
1310*4882a593Smuzhiyun #endif /* WLAIBSS_MCHAN */
1311*4882a593Smuzhiyun 	bool bss_pending_op;		/* indicate where there is a pending IF operation */
1312*4882a593Smuzhiyun #ifdef WLFBT
1313*4882a593Smuzhiyun 	uint8 fbt_key[FBT_KEYLEN];
1314*4882a593Smuzhiyun #endif // endif
1315*4882a593Smuzhiyun 	int roam_offload;
1316*4882a593Smuzhiyun #ifdef WL_NAN
1317*4882a593Smuzhiyun 	bool nan_enable;
1318*4882a593Smuzhiyun 	nan_svc_inst_t nan_inst_ctrl[NAN_ID_CTRL_SIZE];
1319*4882a593Smuzhiyun 	struct ether_addr initiator_ndi;
1320*4882a593Smuzhiyun 	uint8 nan_dp_state;
1321*4882a593Smuzhiyun 	bool nan_init_state; /* nan initialization state */
1322*4882a593Smuzhiyun 	wait_queue_head_t ndp_if_change_event;
1323*4882a593Smuzhiyun 	uint8 support_5g;
1324*4882a593Smuzhiyun 	u8 nan_nmi_mac[ETH_ALEN];
1325*4882a593Smuzhiyun 	u8 nan_dp_mask;
1326*4882a593Smuzhiyun 	wl_nancfg_t nancfg;
1327*4882a593Smuzhiyun #ifdef WL_NAN_DISC_CACHE
1328*4882a593Smuzhiyun 	int nan_disc_count;
1329*4882a593Smuzhiyun 	nan_disc_result_cache *nan_disc_cache;
1330*4882a593Smuzhiyun 	nan_svc_info_t svc_info[NAN_MAX_SVC_INST];
1331*4882a593Smuzhiyun 	nan_ranging_inst_t nan_ranging_info[NAN_MAX_RANGING_INST];
1332*4882a593Smuzhiyun #endif /* WL_NAN_DISC_CACHE  */
1333*4882a593Smuzhiyun #ifdef WL_NANP2P
1334*4882a593Smuzhiyun 	uint8 conc_disc;
1335*4882a593Smuzhiyun 	bool nan_p2p_supported;
1336*4882a593Smuzhiyun #endif /* WL_NANP2P */
1337*4882a593Smuzhiyun #endif /* WL_NAN */
1338*4882a593Smuzhiyun #ifdef WL_IFACE_MGMT
1339*4882a593Smuzhiyun 	iface_mgmt_data_t iface_data;
1340*4882a593Smuzhiyun #endif /* WL_IFACE_MGMT */
1341*4882a593Smuzhiyun #ifdef WL_CFG80211_P2P_DEV_IF
1342*4882a593Smuzhiyun 	bool down_disc_if;
1343*4882a593Smuzhiyun #endif /* WL_CFG80211_P2P_DEV_IF */
1344*4882a593Smuzhiyun #ifdef P2PLISTEN_AP_SAMECHN
1345*4882a593Smuzhiyun 	bool p2p_resp_apchn_status;
1346*4882a593Smuzhiyun #endif /* P2PLISTEN_AP_SAMECHN */
1347*4882a593Smuzhiyun 	struct wl_wsec_key wep_key;
1348*4882a593Smuzhiyun #ifdef WLTDLS
1349*4882a593Smuzhiyun 	u8 *tdls_mgmt_frame;
1350*4882a593Smuzhiyun 	u32 tdls_mgmt_frame_len;
1351*4882a593Smuzhiyun 	s32 tdls_mgmt_freq;
1352*4882a593Smuzhiyun #endif /* WLTDLS */
1353*4882a593Smuzhiyun 	bool need_wait_afrx;
1354*4882a593Smuzhiyun #ifdef QOS_MAP_SET
1355*4882a593Smuzhiyun 	uint8	 *up_table;	/* user priority table, size is UP_TABLE_MAX */
1356*4882a593Smuzhiyun #endif /* QOS_MAP_SET */
1357*4882a593Smuzhiyun 	struct ether_addr last_roamed_addr;
1358*4882a593Smuzhiyun 	bool rcc_enabled;	/* flag for Roam channel cache feature */
1359*4882a593Smuzhiyun #if defined(DHD_ENABLE_BIGDATA_LOGGING)
1360*4882a593Smuzhiyun 	char bss_info[GET_BSS_INFO_LEN];
1361*4882a593Smuzhiyun 	wl_event_msg_t event_auth_assoc;
1362*4882a593Smuzhiyun 	u32 assoc_reject_status;
1363*4882a593Smuzhiyun 	u32 roam_count;
1364*4882a593Smuzhiyun #endif /* DHD_ENABLE_BIGDATA_LOGGING */
1365*4882a593Smuzhiyun 	u16 ap_oper_channel;
1366*4882a593Smuzhiyun #if defined(SUPPORT_RANDOM_MAC_SCAN)
1367*4882a593Smuzhiyun 	bool random_mac_enabled;
1368*4882a593Smuzhiyun #endif /* SUPPORT_RANDOM_MAC_SCAN */
1369*4882a593Smuzhiyun #ifdef DHD_LOSSLESS_ROAMING
1370*4882a593Smuzhiyun 	timer_list_compat_t roam_timeout;   /* Timer for catch roam timeout */
1371*4882a593Smuzhiyun #endif // endif
1372*4882a593Smuzhiyun #ifndef DUAL_ESCAN_RESULT_BUFFER
1373*4882a593Smuzhiyun 	uint16 escan_sync_id_cntr;
1374*4882a593Smuzhiyun #endif // endif
1375*4882a593Smuzhiyun #ifdef WLTDLS
1376*4882a593Smuzhiyun 	uint8 tdls_supported;
1377*4882a593Smuzhiyun 	struct mutex tdls_sync;	/* protect tdls config operations */
1378*4882a593Smuzhiyun #endif /* WLTDLS */
1379*4882a593Smuzhiyun #ifdef MFP
1380*4882a593Smuzhiyun 	const uint8 *bip_pos;
1381*4882a593Smuzhiyun 	int mfp_mode;
1382*4882a593Smuzhiyun #endif /* MFP */
1383*4882a593Smuzhiyun #ifdef WES_SUPPORT
1384*4882a593Smuzhiyun #ifdef CUSTOMER_SCAN_TIMEOUT_SETTING
1385*4882a593Smuzhiyun 	int custom_scan_channel_time;
1386*4882a593Smuzhiyun 	int custom_scan_unassoc_time;
1387*4882a593Smuzhiyun 	int custom_scan_passive_time;
1388*4882a593Smuzhiyun 	int custom_scan_home_time;
1389*4882a593Smuzhiyun 	int custom_scan_home_away_time;
1390*4882a593Smuzhiyun #endif /* CUSTOMER_SCAN_TIMEOUT_SETTING */
1391*4882a593Smuzhiyun #endif /* WES_SUPPORT */
1392*4882a593Smuzhiyun 	uint8 vif_count;	/* Virtual Interface count */
1393*4882a593Smuzhiyun #ifdef WBTEXT
1394*4882a593Smuzhiyun 	struct list_head wbtext_bssid_list;
1395*4882a593Smuzhiyun #endif /* WBTEXT */
1396*4882a593Smuzhiyun #ifdef SUPPORT_AP_RADIO_PWRSAVE
1397*4882a593Smuzhiyun 	ap_rps_info_t ap_rps_info;
1398*4882a593Smuzhiyun #endif /* SUPPORT_AP_RADIO_PWRSAVE */
1399*4882a593Smuzhiyun 	u16 vif_macaddr_mask;
1400*4882a593Smuzhiyun 	osl_t *osh;
1401*4882a593Smuzhiyun 	struct list_head vndr_oui_list;
1402*4882a593Smuzhiyun 	spinlock_t vndr_oui_sync;	/* to protect vndr_oui_list */
1403*4882a593Smuzhiyun 	bool rssi_sum_report;
1404*4882a593Smuzhiyun 	int rssi;	/* previous RSSI (backup) of get_station */
1405*4882a593Smuzhiyun 	uint64 scan_enq_time;
1406*4882a593Smuzhiyun 	uint64 scan_deq_time;
1407*4882a593Smuzhiyun 	uint64 scan_hdlr_cmplt_time;
1408*4882a593Smuzhiyun 	uint64 scan_cmplt_time;
1409*4882a593Smuzhiyun 	uint64 wl_evt_deq_time;
1410*4882a593Smuzhiyun 	uint64 wl_evt_hdlr_entry_time;
1411*4882a593Smuzhiyun 	uint64 wl_evt_hdlr_exit_time;
1412*4882a593Smuzhiyun #ifdef WL_WPS_SYNC
1413*4882a593Smuzhiyun 	wl_wps_session_t wps_session[WPS_MAX_SESSIONS];
1414*4882a593Smuzhiyun 	spinlock_t wps_sync;	/* to protect wps states (and others if needed) */
1415*4882a593Smuzhiyun #endif /* WL_WPS_SYNC */
1416*4882a593Smuzhiyun 	struct wl_fils_info fils_info;
1417*4882a593Smuzhiyun #ifdef WL_BAM
1418*4882a593Smuzhiyun 	wl_bad_ap_mngr_t bad_ap_mngr;
1419*4882a593Smuzhiyun #endif  /* WL_BAM */
1420*4882a593Smuzhiyun #ifdef BIGDATA_SOFTAP
1421*4882a593Smuzhiyun 	struct wl_ap_sta_info *ap_sta_info;
1422*4882a593Smuzhiyun #endif /* BIGDATA_SOFTAP */
1423*4882a593Smuzhiyun 	uint8 scanmac_enabled;
1424*4882a593Smuzhiyun #ifdef WL_BCNRECV
1425*4882a593Smuzhiyun 	/* structure used for fake ap detection info */
1426*4882a593Smuzhiyun 	struct mutex bcn_sync;  /* mainly for bcn resume/suspend synchronization */
1427*4882a593Smuzhiyun 	wl_bcnrecv_info_t bcnrecv_info;
1428*4882a593Smuzhiyun #endif /* WL_BCNRECV */
1429*4882a593Smuzhiyun 	struct net_device *static_ndev[DHD_MAX_STATIC_IFS];
1430*4882a593Smuzhiyun 	uint8 static_ndev_state[DHD_MAX_STATIC_IFS];
1431*4882a593Smuzhiyun 	bool hal_started;
1432*4882a593Smuzhiyun 	wl_wlc_version_t wlc_ver;
1433*4882a593Smuzhiyun 	bool scan_params_v2;
1434*4882a593Smuzhiyun #ifdef DHD_BANDSTEER
1435*4882a593Smuzhiyun 	void *dhd_bandsteer_cntx;
1436*4882a593Smuzhiyun 	bool p2p_bs;
1437*4882a593Smuzhiyun 	bool ap_bs;
1438*4882a593Smuzhiyun #endif /* DHD_BANDSTEER */
1439*4882a593Smuzhiyun #ifdef ENABLE_HOGSQS
1440*4882a593Smuzhiyun 	struct delayed_work hogsqs_eventwork;  /* hog detection event work */
1441*4882a593Smuzhiyun #endif // endif
1442*4882a593Smuzhiyun #if !defined(DISABLE_11H) && defined(DHD_NOSCAN_DURING_CSA)
1443*4882a593Smuzhiyun        bool in_csa;
1444*4882a593Smuzhiyun        timer_list_compat_t csa_timeout;   /* Timer for csa timeout */
1445*4882a593Smuzhiyun #endif // endif
1446*4882a593Smuzhiyun };
1447*4882a593Smuzhiyun #define WL_STATIC_IFIDX	(DHD_MAX_IFS + DHD_MAX_STATIC_IFS - 1)
1448*4882a593Smuzhiyun enum static_ndev_states {
1449*4882a593Smuzhiyun 	NDEV_STATE_NONE,
1450*4882a593Smuzhiyun 	NDEV_STATE_OS_IF_CREATED,
1451*4882a593Smuzhiyun 	NDEV_STATE_FW_IF_CREATED,
1452*4882a593Smuzhiyun 	NDEV_STATE_FW_IF_FAILED,
1453*4882a593Smuzhiyun 	NDEV_STATE_FW_IF_DELETED
1454*4882a593Smuzhiyun };
1455*4882a593Smuzhiyun #ifdef WL_IFACE_MGMT
1456*4882a593Smuzhiyun #define IS_CFG80211_STATIC_IF_ACTIVE(cfg) \
1457*4882a593Smuzhiyun 	((cfg && cfg->static_ndev && \
1458*4882a593Smuzhiyun 	(cfg->static_ndev_state & NDEV_STATE_FW_IF_CREATED)) ? true : false)
1459*4882a593Smuzhiyun #endif // endif
1460*4882a593Smuzhiyun #ifdef WL_SAE
1461*4882a593Smuzhiyun typedef struct wl_sae_key_info {
1462*4882a593Smuzhiyun 	uint8 peer_mac[ETHER_ADDR_LEN];
1463*4882a593Smuzhiyun 	uint16 pmk_len;
1464*4882a593Smuzhiyun 	uint16 pmkid_len;
1465*4882a593Smuzhiyun 	const uint8 *pmk;
1466*4882a593Smuzhiyun 	const uint8 *pmkid;
1467*4882a593Smuzhiyun } wl_sae_key_info_t;
1468*4882a593Smuzhiyun #endif /* WL_SAE */
1469*4882a593Smuzhiyun 
1470*4882a593Smuzhiyun typedef enum wl_concurrency_mode {
1471*4882a593Smuzhiyun 	CONCURRENCY_MODE_NONE = 0,
1472*4882a593Smuzhiyun 	CONCURRENCY_SCC_MODE,
1473*4882a593Smuzhiyun 	CONCURRENCY_VSDB_MODE,
1474*4882a593Smuzhiyun 	CONCURRENCY_RSDB_MODE
1475*4882a593Smuzhiyun } wl_concurrency_mode_t;
1476*4882a593Smuzhiyun 
1477*4882a593Smuzhiyun s32 wl_iftype_to_mode(wl_iftype_t iftype);
1478*4882a593Smuzhiyun 
1479*4882a593Smuzhiyun #define BCM_LIST_FOR_EACH_ENTRY_SAFE(pos, next, head, member) \
1480*4882a593Smuzhiyun 	list_for_each_entry_safe((pos), (next), (head), member)
1481*4882a593Smuzhiyun extern int ioctl_version;
1482*4882a593Smuzhiyun 
next_bss(struct wl_scan_results * list,wl_bss_info_t * bss)1483*4882a593Smuzhiyun static inline wl_bss_info_t *next_bss(struct wl_scan_results *list, wl_bss_info_t *bss)
1484*4882a593Smuzhiyun {
1485*4882a593Smuzhiyun 	return bss = bss ?
1486*4882a593Smuzhiyun 		(wl_bss_info_t *)((uintptr) bss + dtoh32(bss->length)) : list->bss_info;
1487*4882a593Smuzhiyun }
1488*4882a593Smuzhiyun 
1489*4882a593Smuzhiyun static inline void
wl_probe_wdev_all(struct bcm_cfg80211 * cfg)1490*4882a593Smuzhiyun wl_probe_wdev_all(struct bcm_cfg80211 *cfg)
1491*4882a593Smuzhiyun {
1492*4882a593Smuzhiyun 	struct net_info *_net_info, *next;
1493*4882a593Smuzhiyun 	unsigned long int flags;
1494*4882a593Smuzhiyun 	int idx = 0;
1495*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
1496*4882a593Smuzhiyun 	GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
1497*4882a593Smuzhiyun 	BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next,
1498*4882a593Smuzhiyun 		&cfg->net_list, list) {
1499*4882a593Smuzhiyun 		GCC_DIAGNOSTIC_POP();
1500*4882a593Smuzhiyun 		WL_INFORM_MEM(("wl_probe_wdev_all: net_list[%d] bssidx: %d\n",
1501*4882a593Smuzhiyun 			idx++, _net_info->bssidx));
1502*4882a593Smuzhiyun 	}
1503*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
1504*4882a593Smuzhiyun 	return;
1505*4882a593Smuzhiyun }
1506*4882a593Smuzhiyun 
1507*4882a593Smuzhiyun static inline struct net_info *
wl_get_netinfo_by_fw_idx(struct bcm_cfg80211 * cfg,s32 bssidx,u8 ifidx)1508*4882a593Smuzhiyun wl_get_netinfo_by_fw_idx(struct bcm_cfg80211 *cfg, s32 bssidx, u8 ifidx)
1509*4882a593Smuzhiyun {
1510*4882a593Smuzhiyun 	struct net_info *_net_info, *next, *info = NULL;
1511*4882a593Smuzhiyun 	unsigned long int flags;
1512*4882a593Smuzhiyun 
1513*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
1514*4882a593Smuzhiyun 	GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
1515*4882a593Smuzhiyun 	BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
1516*4882a593Smuzhiyun 		GCC_DIAGNOSTIC_POP();
1517*4882a593Smuzhiyun 		if ((bssidx >= 0) && (_net_info->bssidx == bssidx) &&
1518*4882a593Smuzhiyun 			(_net_info->ifidx == ifidx)) {
1519*4882a593Smuzhiyun 			info = _net_info;
1520*4882a593Smuzhiyun 			break;
1521*4882a593Smuzhiyun 		}
1522*4882a593Smuzhiyun 	}
1523*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
1524*4882a593Smuzhiyun 	return info;
1525*4882a593Smuzhiyun }
1526*4882a593Smuzhiyun 
1527*4882a593Smuzhiyun static inline void
wl_dealloc_netinfo_by_wdev(struct bcm_cfg80211 * cfg,struct wireless_dev * wdev)1528*4882a593Smuzhiyun wl_dealloc_netinfo_by_wdev(struct bcm_cfg80211 *cfg, struct wireless_dev *wdev)
1529*4882a593Smuzhiyun {
1530*4882a593Smuzhiyun 	struct net_info *_net_info, *next;
1531*4882a593Smuzhiyun 	unsigned long int flags;
1532*4882a593Smuzhiyun 
1533*4882a593Smuzhiyun #ifdef DHD_IFDEBUG
1534*4882a593Smuzhiyun 	WL_INFORM_MEM(("dealloc_netinfo enter wdev=%p \n", OSL_OBFUSCATE_BUF(wdev)));
1535*4882a593Smuzhiyun #endif // endif
1536*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
1537*4882a593Smuzhiyun 	GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
1538*4882a593Smuzhiyun 	BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
1539*4882a593Smuzhiyun 		GCC_DIAGNOSTIC_POP();
1540*4882a593Smuzhiyun 		if (wdev && (_net_info->wdev == wdev)) {
1541*4882a593Smuzhiyun 			wl_cfgbss_t *bss = &_net_info->bss;
1542*4882a593Smuzhiyun 
1543*4882a593Smuzhiyun 			if (bss->wpa_ie) {
1544*4882a593Smuzhiyun 				MFREE(cfg->osh, bss->wpa_ie, bss->wpa_ie[1]
1545*4882a593Smuzhiyun 					+ WPA_RSN_IE_TAG_FIXED_LEN);
1546*4882a593Smuzhiyun 				bss->wpa_ie = NULL;
1547*4882a593Smuzhiyun 			}
1548*4882a593Smuzhiyun 
1549*4882a593Smuzhiyun 			if (bss->rsn_ie) {
1550*4882a593Smuzhiyun 				MFREE(cfg->osh, bss->rsn_ie,
1551*4882a593Smuzhiyun 					bss->rsn_ie[1] + WPA_RSN_IE_TAG_FIXED_LEN);
1552*4882a593Smuzhiyun 				bss->rsn_ie = NULL;
1553*4882a593Smuzhiyun 			}
1554*4882a593Smuzhiyun 
1555*4882a593Smuzhiyun 			if (bss->wps_ie) {
1556*4882a593Smuzhiyun 				MFREE(cfg->osh, bss->wps_ie, bss->wps_ie[1] + 2);
1557*4882a593Smuzhiyun 				bss->wps_ie = NULL;
1558*4882a593Smuzhiyun 			}
1559*4882a593Smuzhiyun 			list_del(&_net_info->list);
1560*4882a593Smuzhiyun 			cfg->iface_cnt--;
1561*4882a593Smuzhiyun 			MFREE(cfg->osh, _net_info, sizeof(struct net_info));
1562*4882a593Smuzhiyun 		}
1563*4882a593Smuzhiyun 	}
1564*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
1565*4882a593Smuzhiyun #ifdef DHD_IFDEBUG
1566*4882a593Smuzhiyun 	WL_INFORM_MEM(("dealloc_netinfo exit iface_cnt=%d \n", cfg->iface_cnt));
1567*4882a593Smuzhiyun #endif // endif
1568*4882a593Smuzhiyun }
1569*4882a593Smuzhiyun 
1570*4882a593Smuzhiyun static inline s32
wl_alloc_netinfo(struct bcm_cfg80211 * cfg,struct net_device * ndev,struct wireless_dev * wdev,wl_iftype_t iftype,bool pm_block,u8 bssidx,u8 ifidx)1571*4882a593Smuzhiyun wl_alloc_netinfo(struct bcm_cfg80211 *cfg, struct net_device *ndev,
1572*4882a593Smuzhiyun 	struct wireless_dev * wdev, wl_iftype_t iftype, bool pm_block, u8 bssidx, u8 ifidx)
1573*4882a593Smuzhiyun {
1574*4882a593Smuzhiyun 	struct net_info *_net_info;
1575*4882a593Smuzhiyun 	s32 err = 0;
1576*4882a593Smuzhiyun 	unsigned long int flags;
1577*4882a593Smuzhiyun #ifdef DHD_IFDEBUG
1578*4882a593Smuzhiyun 	WL_INFORM_MEM(("alloc_netinfo enter bssidx=%d wdev=%p\n",
1579*4882a593Smuzhiyun 		bssidx, OSL_OBFUSCATE_BUF(wdev)));
1580*4882a593Smuzhiyun #endif // endif
1581*4882a593Smuzhiyun 	/* Check whether there is any duplicate entry for the
1582*4882a593Smuzhiyun 	 *  same bssidx && ifidx.
1583*4882a593Smuzhiyun 	 */
1584*4882a593Smuzhiyun 	if ((_net_info = wl_get_netinfo_by_fw_idx(cfg, bssidx, ifidx))) {
1585*4882a593Smuzhiyun 		/* We have a duplicate entry for the same bssidx
1586*4882a593Smuzhiyun 		 * already present which shouldn't have been the case.
1587*4882a593Smuzhiyun 		 * Attempt recovery.
1588*4882a593Smuzhiyun 		 */
1589*4882a593Smuzhiyun 		WL_ERR(("Duplicate entry for bssidx=%d ifidx=%d present."
1590*4882a593Smuzhiyun 			" Can't add new entry\n", bssidx, ifidx));
1591*4882a593Smuzhiyun 		wl_probe_wdev_all(cfg);
1592*4882a593Smuzhiyun #ifdef DHD_DEBUG
1593*4882a593Smuzhiyun 		ASSERT(0);
1594*4882a593Smuzhiyun #endif /* DHD_DEBUG */
1595*4882a593Smuzhiyun 		return -EINVAL;
1596*4882a593Smuzhiyun 	}
1597*4882a593Smuzhiyun 	if (cfg->iface_cnt == IFACE_MAX_CNT)
1598*4882a593Smuzhiyun 		return -ENOMEM;
1599*4882a593Smuzhiyun 	_net_info = (struct net_info *)MALLOCZ(cfg->osh, sizeof(struct net_info));
1600*4882a593Smuzhiyun 	if (!_net_info)
1601*4882a593Smuzhiyun 		err = -ENOMEM;
1602*4882a593Smuzhiyun 	else {
1603*4882a593Smuzhiyun 		_net_info->iftype = iftype;
1604*4882a593Smuzhiyun 		_net_info->ndev = ndev;
1605*4882a593Smuzhiyun 		_net_info->wdev = wdev;
1606*4882a593Smuzhiyun 		_net_info->pm_restore = 0;
1607*4882a593Smuzhiyun 		_net_info->pm = 0;
1608*4882a593Smuzhiyun 		_net_info->pm_block = pm_block;
1609*4882a593Smuzhiyun 		_net_info->roam_off = WL_INVALID;
1610*4882a593Smuzhiyun 		_net_info->bssidx = bssidx;
1611*4882a593Smuzhiyun 		_net_info->ifidx = ifidx;
1612*4882a593Smuzhiyun 		WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
1613*4882a593Smuzhiyun 		cfg->iface_cnt++;
1614*4882a593Smuzhiyun 		list_add(&_net_info->list, &cfg->net_list);
1615*4882a593Smuzhiyun 		WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
1616*4882a593Smuzhiyun #ifdef WL_SAE
1617*4882a593Smuzhiyun 		init_completion(&_net_info->mgmt_tx_cpl);
1618*4882a593Smuzhiyun #endif /* WL_SAE */
1619*4882a593Smuzhiyun 	}
1620*4882a593Smuzhiyun #ifdef DHD_IFDEBUG
1621*4882a593Smuzhiyun 	WL_DBG(("alloc_netinfo exit iface_cnt=%d \n", cfg->iface_cnt));
1622*4882a593Smuzhiyun #endif // endif
1623*4882a593Smuzhiyun 	return err;
1624*4882a593Smuzhiyun }
1625*4882a593Smuzhiyun 
1626*4882a593Smuzhiyun static inline void
wl_delete_all_netinfo(struct bcm_cfg80211 * cfg)1627*4882a593Smuzhiyun wl_delete_all_netinfo(struct bcm_cfg80211 *cfg)
1628*4882a593Smuzhiyun {
1629*4882a593Smuzhiyun 	struct net_info *_net_info, *next;
1630*4882a593Smuzhiyun 	unsigned long int flags;
1631*4882a593Smuzhiyun 
1632*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
1633*4882a593Smuzhiyun 	GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
1634*4882a593Smuzhiyun 	BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
1635*4882a593Smuzhiyun 		wl_cfgbss_t *bss = &_net_info->bss;
1636*4882a593Smuzhiyun 		GCC_DIAGNOSTIC_POP();
1637*4882a593Smuzhiyun 
1638*4882a593Smuzhiyun 		if (bss->wpa_ie) {
1639*4882a593Smuzhiyun 			MFREE(cfg->osh, bss->wpa_ie, bss->wpa_ie[1]
1640*4882a593Smuzhiyun 				+ WPA_RSN_IE_TAG_FIXED_LEN);
1641*4882a593Smuzhiyun 			bss->wpa_ie = NULL;
1642*4882a593Smuzhiyun 		}
1643*4882a593Smuzhiyun 
1644*4882a593Smuzhiyun 		if (bss->rsn_ie) {
1645*4882a593Smuzhiyun 			MFREE(cfg->osh, bss->rsn_ie, bss->rsn_ie[1]
1646*4882a593Smuzhiyun 				+ WPA_RSN_IE_TAG_FIXED_LEN);
1647*4882a593Smuzhiyun 			bss->rsn_ie = NULL;
1648*4882a593Smuzhiyun 		}
1649*4882a593Smuzhiyun 
1650*4882a593Smuzhiyun 		if (bss->wps_ie) {
1651*4882a593Smuzhiyun 			MFREE(cfg->osh, bss->wps_ie, bss->wps_ie[1] + 2);
1652*4882a593Smuzhiyun 			bss->wps_ie = NULL;
1653*4882a593Smuzhiyun 		}
1654*4882a593Smuzhiyun 
1655*4882a593Smuzhiyun 		if (bss->fils_ind_ie) {
1656*4882a593Smuzhiyun 			MFREE(cfg->osh, bss->fils_ind_ie, bss->fils_ind_ie[1]
1657*4882a593Smuzhiyun 				+ FILS_INDICATION_IE_TAG_FIXED_LEN);
1658*4882a593Smuzhiyun 			bss->fils_ind_ie = NULL;
1659*4882a593Smuzhiyun 		}
1660*4882a593Smuzhiyun 		list_del(&_net_info->list);
1661*4882a593Smuzhiyun 		if (_net_info->wdev) {
1662*4882a593Smuzhiyun 			MFREE(cfg->osh, _net_info->wdev, sizeof(struct wireless_dev));
1663*4882a593Smuzhiyun 		}
1664*4882a593Smuzhiyun 		MFREE(cfg->osh, _net_info, sizeof(struct net_info));
1665*4882a593Smuzhiyun 	}
1666*4882a593Smuzhiyun 	cfg->iface_cnt = 0;
1667*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
1668*4882a593Smuzhiyun }
1669*4882a593Smuzhiyun static inline u32
wl_get_status_all(struct bcm_cfg80211 * cfg,s32 status)1670*4882a593Smuzhiyun wl_get_status_all(struct bcm_cfg80211 *cfg, s32 status)
1671*4882a593Smuzhiyun 
1672*4882a593Smuzhiyun {
1673*4882a593Smuzhiyun 	struct net_info *_net_info, *next;
1674*4882a593Smuzhiyun 	u32 cnt = 0;
1675*4882a593Smuzhiyun 	unsigned long int flags;
1676*4882a593Smuzhiyun 
1677*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
1678*4882a593Smuzhiyun 	GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
1679*4882a593Smuzhiyun 	BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
1680*4882a593Smuzhiyun 		GCC_DIAGNOSTIC_POP();
1681*4882a593Smuzhiyun 		if (_net_info->ndev &&
1682*4882a593Smuzhiyun 			test_bit(status, &_net_info->sme_state))
1683*4882a593Smuzhiyun 			cnt++;
1684*4882a593Smuzhiyun 	}
1685*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
1686*4882a593Smuzhiyun 	return cnt;
1687*4882a593Smuzhiyun }
1688*4882a593Smuzhiyun static inline void
wl_set_status_all(struct bcm_cfg80211 * cfg,s32 status,u32 op)1689*4882a593Smuzhiyun wl_set_status_all(struct bcm_cfg80211 *cfg, s32 status, u32 op)
1690*4882a593Smuzhiyun {
1691*4882a593Smuzhiyun 	struct net_info *_net_info, *next;
1692*4882a593Smuzhiyun 	unsigned long int flags;
1693*4882a593Smuzhiyun 
1694*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
1695*4882a593Smuzhiyun 	GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
1696*4882a593Smuzhiyun 	BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
1697*4882a593Smuzhiyun 		GCC_DIAGNOSTIC_POP();
1698*4882a593Smuzhiyun 		switch (op) {
1699*4882a593Smuzhiyun 			case 1:
1700*4882a593Smuzhiyun 				break; /* set all status is not allowed */
1701*4882a593Smuzhiyun 			case 2:
1702*4882a593Smuzhiyun 				/*
1703*4882a593Smuzhiyun 				 * Release the spinlock before calling notifier. Else there
1704*4882a593Smuzhiyun 				 * will be nested calls
1705*4882a593Smuzhiyun 				 */
1706*4882a593Smuzhiyun 				WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
1707*4882a593Smuzhiyun 				clear_bit(status, &_net_info->sme_state);
1708*4882a593Smuzhiyun 				if (cfg->state_notifier &&
1709*4882a593Smuzhiyun 					test_bit(status, &(cfg->interrested_state)))
1710*4882a593Smuzhiyun 					cfg->state_notifier(cfg, _net_info, status, false);
1711*4882a593Smuzhiyun 				return;
1712*4882a593Smuzhiyun 			case 4:
1713*4882a593Smuzhiyun 				break; /* change all status is not allowed */
1714*4882a593Smuzhiyun 			default:
1715*4882a593Smuzhiyun 				break; /* unknown operation */
1716*4882a593Smuzhiyun 		}
1717*4882a593Smuzhiyun 	}
1718*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
1719*4882a593Smuzhiyun }
1720*4882a593Smuzhiyun static inline void
wl_set_status_by_netdev(struct bcm_cfg80211 * cfg,s32 status,struct net_device * ndev,u32 op)1721*4882a593Smuzhiyun wl_set_status_by_netdev(struct bcm_cfg80211 *cfg, s32 status,
1722*4882a593Smuzhiyun 	struct net_device *ndev, u32 op)
1723*4882a593Smuzhiyun {
1724*4882a593Smuzhiyun 
1725*4882a593Smuzhiyun 	struct net_info *_net_info, *next;
1726*4882a593Smuzhiyun 	unsigned long int flags;
1727*4882a593Smuzhiyun 
1728*4882a593Smuzhiyun 	if (status >= BITS_PER_LONG) {
1729*4882a593Smuzhiyun 		/* max value for shift operation is
1730*4882a593Smuzhiyun 		 * (BITS_PER_LONG -1) for unsigned long.
1731*4882a593Smuzhiyun 		 * if status crosses BIT_PER_LONG, the variable
1732*4882a593Smuzhiyun 		 * sme_state should be correspondingly updated.
1733*4882a593Smuzhiyun 		 */
1734*4882a593Smuzhiyun 		ASSERT(0);
1735*4882a593Smuzhiyun 		return;
1736*4882a593Smuzhiyun 	}
1737*4882a593Smuzhiyun 
1738*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
1739*4882a593Smuzhiyun 	GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
1740*4882a593Smuzhiyun 	BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
1741*4882a593Smuzhiyun 		if (ndev && (_net_info->ndev == ndev)) {
1742*4882a593Smuzhiyun 			GCC_DIAGNOSTIC_POP();
1743*4882a593Smuzhiyun 			switch (op) {
1744*4882a593Smuzhiyun 				case 1:
1745*4882a593Smuzhiyun 					/*
1746*4882a593Smuzhiyun 					 * Release the spinlock before calling notifier. Else there
1747*4882a593Smuzhiyun 					 * will be nested calls
1748*4882a593Smuzhiyun 					 */
1749*4882a593Smuzhiyun 					WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
1750*4882a593Smuzhiyun 					set_bit(status, &_net_info->sme_state);
1751*4882a593Smuzhiyun 					if (cfg->state_notifier &&
1752*4882a593Smuzhiyun 						test_bit(status, &(cfg->interrested_state)))
1753*4882a593Smuzhiyun 						cfg->state_notifier(cfg, _net_info, status, true);
1754*4882a593Smuzhiyun 					return;
1755*4882a593Smuzhiyun 				case 2:
1756*4882a593Smuzhiyun 					/*
1757*4882a593Smuzhiyun 					 * Release the spinlock before calling notifier. Else there
1758*4882a593Smuzhiyun 					 * will be nested calls
1759*4882a593Smuzhiyun 					 */
1760*4882a593Smuzhiyun 					WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
1761*4882a593Smuzhiyun 					clear_bit(status, &_net_info->sme_state);
1762*4882a593Smuzhiyun 					if (cfg->state_notifier &&
1763*4882a593Smuzhiyun 						test_bit(status, &(cfg->interrested_state)))
1764*4882a593Smuzhiyun 						cfg->state_notifier(cfg, _net_info, status, false);
1765*4882a593Smuzhiyun 					return;
1766*4882a593Smuzhiyun 				case 4:
1767*4882a593Smuzhiyun 					change_bit(status, &_net_info->sme_state);
1768*4882a593Smuzhiyun 					break;
1769*4882a593Smuzhiyun 			}
1770*4882a593Smuzhiyun 		}
1771*4882a593Smuzhiyun 
1772*4882a593Smuzhiyun 	}
1773*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
1774*4882a593Smuzhiyun 
1775*4882a593Smuzhiyun }
1776*4882a593Smuzhiyun 
1777*4882a593Smuzhiyun static inline wl_cfgbss_t *
wl_get_cfgbss_by_wdev(struct bcm_cfg80211 * cfg,struct wireless_dev * wdev)1778*4882a593Smuzhiyun wl_get_cfgbss_by_wdev(struct bcm_cfg80211 *cfg,
1779*4882a593Smuzhiyun 	struct wireless_dev *wdev)
1780*4882a593Smuzhiyun {
1781*4882a593Smuzhiyun 	struct net_info *_net_info, *next;
1782*4882a593Smuzhiyun 	wl_cfgbss_t *bss = NULL;
1783*4882a593Smuzhiyun 	unsigned long int flags;
1784*4882a593Smuzhiyun 
1785*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
1786*4882a593Smuzhiyun 	GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
1787*4882a593Smuzhiyun 	BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
1788*4882a593Smuzhiyun 		GCC_DIAGNOSTIC_POP();
1789*4882a593Smuzhiyun 		if (wdev && (_net_info->wdev == wdev)) {
1790*4882a593Smuzhiyun 			bss = &_net_info->bss;
1791*4882a593Smuzhiyun 			break;
1792*4882a593Smuzhiyun 		}
1793*4882a593Smuzhiyun 	}
1794*4882a593Smuzhiyun 
1795*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
1796*4882a593Smuzhiyun 	return bss;
1797*4882a593Smuzhiyun }
1798*4882a593Smuzhiyun 
1799*4882a593Smuzhiyun static inline u32
wl_get_status_by_netdev(struct bcm_cfg80211 * cfg,s32 status,struct net_device * ndev)1800*4882a593Smuzhiyun wl_get_status_by_netdev(struct bcm_cfg80211 *cfg, s32 status,
1801*4882a593Smuzhiyun 	struct net_device *ndev)
1802*4882a593Smuzhiyun {
1803*4882a593Smuzhiyun 	struct net_info *_net_info, *next;
1804*4882a593Smuzhiyun 	u32 stat = 0;
1805*4882a593Smuzhiyun 	unsigned long int flags;
1806*4882a593Smuzhiyun 
1807*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
1808*4882a593Smuzhiyun 	GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
1809*4882a593Smuzhiyun 	BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
1810*4882a593Smuzhiyun 		GCC_DIAGNOSTIC_POP();
1811*4882a593Smuzhiyun 		if (ndev && (_net_info->ndev == ndev)) {
1812*4882a593Smuzhiyun 			stat = test_bit(status, &_net_info->sme_state);
1813*4882a593Smuzhiyun 			break;
1814*4882a593Smuzhiyun 		}
1815*4882a593Smuzhiyun 	}
1816*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
1817*4882a593Smuzhiyun 	return stat;
1818*4882a593Smuzhiyun }
1819*4882a593Smuzhiyun 
1820*4882a593Smuzhiyun static inline s32
wl_get_mode_by_netdev(struct bcm_cfg80211 * cfg,struct net_device * ndev)1821*4882a593Smuzhiyun wl_get_mode_by_netdev(struct bcm_cfg80211 *cfg, struct net_device *ndev)
1822*4882a593Smuzhiyun {
1823*4882a593Smuzhiyun 	struct net_info *_net_info, *next;
1824*4882a593Smuzhiyun 	s32 mode = -1;
1825*4882a593Smuzhiyun 	unsigned long int flags;
1826*4882a593Smuzhiyun 
1827*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
1828*4882a593Smuzhiyun 	GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
1829*4882a593Smuzhiyun 	BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
1830*4882a593Smuzhiyun 		GCC_DIAGNOSTIC_POP();
1831*4882a593Smuzhiyun 		if (_net_info->ndev && (_net_info->ndev == ndev)) {
1832*4882a593Smuzhiyun 			mode = wl_iftype_to_mode(_net_info->iftype);
1833*4882a593Smuzhiyun 			break;
1834*4882a593Smuzhiyun 		}
1835*4882a593Smuzhiyun 	}
1836*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
1837*4882a593Smuzhiyun 	return mode;
1838*4882a593Smuzhiyun }
1839*4882a593Smuzhiyun 
1840*4882a593Smuzhiyun static inline s32
wl_get_bssidx_by_wdev(struct bcm_cfg80211 * cfg,struct wireless_dev * wdev)1841*4882a593Smuzhiyun wl_get_bssidx_by_wdev(struct bcm_cfg80211 *cfg, struct wireless_dev *wdev)
1842*4882a593Smuzhiyun {
1843*4882a593Smuzhiyun 	struct net_info *_net_info, *next;
1844*4882a593Smuzhiyun 	s32 bssidx = -1;
1845*4882a593Smuzhiyun 	unsigned long int flags;
1846*4882a593Smuzhiyun 
1847*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
1848*4882a593Smuzhiyun 	GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
1849*4882a593Smuzhiyun 	BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
1850*4882a593Smuzhiyun 		GCC_DIAGNOSTIC_POP();
1851*4882a593Smuzhiyun 		if (_net_info->wdev && (_net_info->wdev == wdev)) {
1852*4882a593Smuzhiyun 			bssidx = _net_info->bssidx;
1853*4882a593Smuzhiyun 			break;
1854*4882a593Smuzhiyun 		}
1855*4882a593Smuzhiyun 	}
1856*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
1857*4882a593Smuzhiyun 	return bssidx;
1858*4882a593Smuzhiyun }
1859*4882a593Smuzhiyun 
1860*4882a593Smuzhiyun static inline struct wireless_dev *
wl_get_wdev_by_fw_idx(struct bcm_cfg80211 * cfg,s32 bssidx,s32 ifidx)1861*4882a593Smuzhiyun wl_get_wdev_by_fw_idx(struct bcm_cfg80211 *cfg, s32 bssidx, s32 ifidx)
1862*4882a593Smuzhiyun {
1863*4882a593Smuzhiyun 	struct net_info *_net_info, *next;
1864*4882a593Smuzhiyun 	struct wireless_dev *wdev = NULL;
1865*4882a593Smuzhiyun 	unsigned long int flags;
1866*4882a593Smuzhiyun 
1867*4882a593Smuzhiyun 	if (bssidx < 0)
1868*4882a593Smuzhiyun 		return NULL;
1869*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
1870*4882a593Smuzhiyun 	GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
1871*4882a593Smuzhiyun 	BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
1872*4882a593Smuzhiyun 		GCC_DIAGNOSTIC_POP();
1873*4882a593Smuzhiyun 		if ((_net_info->bssidx == bssidx) && (_net_info->ifidx == ifidx)) {
1874*4882a593Smuzhiyun 			wdev = _net_info->wdev;
1875*4882a593Smuzhiyun 			break;
1876*4882a593Smuzhiyun 		}
1877*4882a593Smuzhiyun 	}
1878*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
1879*4882a593Smuzhiyun 	return wdev;
1880*4882a593Smuzhiyun }
1881*4882a593Smuzhiyun 
1882*4882a593Smuzhiyun static inline struct wl_profile *
wl_get_profile_by_netdev(struct bcm_cfg80211 * cfg,struct net_device * ndev)1883*4882a593Smuzhiyun wl_get_profile_by_netdev(struct bcm_cfg80211 *cfg, struct net_device *ndev)
1884*4882a593Smuzhiyun {
1885*4882a593Smuzhiyun 	struct net_info *_net_info, *next;
1886*4882a593Smuzhiyun 	struct wl_profile *prof = NULL;
1887*4882a593Smuzhiyun 	unsigned long int flags;
1888*4882a593Smuzhiyun 
1889*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
1890*4882a593Smuzhiyun 	GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
1891*4882a593Smuzhiyun 	BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
1892*4882a593Smuzhiyun 		GCC_DIAGNOSTIC_POP();
1893*4882a593Smuzhiyun 		if (ndev && (_net_info->ndev == ndev)) {
1894*4882a593Smuzhiyun 			prof = &_net_info->profile;
1895*4882a593Smuzhiyun 			break;
1896*4882a593Smuzhiyun 		}
1897*4882a593Smuzhiyun 	}
1898*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
1899*4882a593Smuzhiyun 	return prof;
1900*4882a593Smuzhiyun }
1901*4882a593Smuzhiyun static inline struct net_info *
wl_get_netinfo_by_netdev(struct bcm_cfg80211 * cfg,struct net_device * ndev)1902*4882a593Smuzhiyun wl_get_netinfo_by_netdev(struct bcm_cfg80211 *cfg, struct net_device *ndev)
1903*4882a593Smuzhiyun {
1904*4882a593Smuzhiyun 	struct net_info *_net_info, *next, *info = NULL;
1905*4882a593Smuzhiyun 	unsigned long int flags;
1906*4882a593Smuzhiyun 
1907*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
1908*4882a593Smuzhiyun 	GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
1909*4882a593Smuzhiyun 	BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
1910*4882a593Smuzhiyun 		GCC_DIAGNOSTIC_POP();
1911*4882a593Smuzhiyun 		if (ndev && (_net_info->ndev == ndev)) {
1912*4882a593Smuzhiyun 			info = _net_info;
1913*4882a593Smuzhiyun 			break;
1914*4882a593Smuzhiyun 		}
1915*4882a593Smuzhiyun 	}
1916*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
1917*4882a593Smuzhiyun 	return info;
1918*4882a593Smuzhiyun }
1919*4882a593Smuzhiyun 
1920*4882a593Smuzhiyun static inline struct net_info *
wl_get_netinfo_by_wdev(struct bcm_cfg80211 * cfg,struct wireless_dev * wdev)1921*4882a593Smuzhiyun wl_get_netinfo_by_wdev(struct bcm_cfg80211 *cfg, struct wireless_dev *wdev)
1922*4882a593Smuzhiyun {
1923*4882a593Smuzhiyun 	struct net_info *_net_info, *next, *info = NULL;
1924*4882a593Smuzhiyun 	unsigned long int flags;
1925*4882a593Smuzhiyun 
1926*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
1927*4882a593Smuzhiyun 	GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
1928*4882a593Smuzhiyun 	BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
1929*4882a593Smuzhiyun 		GCC_DIAGNOSTIC_POP();
1930*4882a593Smuzhiyun 		if (wdev && (_net_info->wdev == wdev)) {
1931*4882a593Smuzhiyun 			info = _net_info;
1932*4882a593Smuzhiyun 			break;
1933*4882a593Smuzhiyun 		}
1934*4882a593Smuzhiyun 	}
1935*4882a593Smuzhiyun 	WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
1936*4882a593Smuzhiyun 	return info;
1937*4882a593Smuzhiyun }
1938*4882a593Smuzhiyun 
1939*4882a593Smuzhiyun static inline u32
wl_get_chanwidth_by_netdev(struct bcm_cfg80211 * cfg,struct net_device * ndev)1940*4882a593Smuzhiyun wl_get_chanwidth_by_netdev(struct bcm_cfg80211 *cfg, struct net_device *ndev)
1941*4882a593Smuzhiyun {
1942*4882a593Smuzhiyun 	struct net_info *_net_info, *next;
1943*4882a593Smuzhiyun 	unsigned long int flags;
1944*4882a593Smuzhiyun 	u32 info = 0;
1945*4882a593Smuzhiyun 	spin_lock_irqsave(&cfg->net_list_sync, flags);
1946*4882a593Smuzhiyun 	GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
1947*4882a593Smuzhiyun 	BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
1948*4882a593Smuzhiyun 		GCC_DIAGNOSTIC_POP();
1949*4882a593Smuzhiyun 		if (ndev && (_net_info->ndev == ndev)) {
1950*4882a593Smuzhiyun 			info = _net_info->profile.channel_width;
1951*4882a593Smuzhiyun 			break;
1952*4882a593Smuzhiyun 		}
1953*4882a593Smuzhiyun 	}
1954*4882a593Smuzhiyun 	spin_unlock_irqrestore(&cfg->net_list_sync, flags);
1955*4882a593Smuzhiyun 	return info;
1956*4882a593Smuzhiyun }
1957*4882a593Smuzhiyun 
1958*4882a593Smuzhiyun static inline void
wl_set_chanwidth_by_netdev(struct bcm_cfg80211 * cfg,struct net_device * ndev,u32 chanwidth)1959*4882a593Smuzhiyun wl_set_chanwidth_by_netdev(struct bcm_cfg80211 *cfg, struct net_device *ndev, u32 chanwidth)
1960*4882a593Smuzhiyun {
1961*4882a593Smuzhiyun 	struct net_info *_net_info, *next;
1962*4882a593Smuzhiyun 	unsigned long int flags;
1963*4882a593Smuzhiyun 	spin_lock_irqsave(&cfg->net_list_sync, flags);
1964*4882a593Smuzhiyun 	GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
1965*4882a593Smuzhiyun 	BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
1966*4882a593Smuzhiyun 		GCC_DIAGNOSTIC_POP();
1967*4882a593Smuzhiyun 		if (ndev && (_net_info->ndev == ndev))
1968*4882a593Smuzhiyun 			_net_info->profile.channel_width = chanwidth;
1969*4882a593Smuzhiyun 	}
1970*4882a593Smuzhiyun 	spin_unlock_irqrestore(&cfg->net_list_sync, flags);
1971*4882a593Smuzhiyun }
1972*4882a593Smuzhiyun 
1973*4882a593Smuzhiyun static inline struct wireless_dev *
wl_get_wdev_by_dpp_listen(struct bcm_cfg80211 * cfg)1974*4882a593Smuzhiyun wl_get_wdev_by_dpp_listen(struct bcm_cfg80211 *cfg)
1975*4882a593Smuzhiyun {
1976*4882a593Smuzhiyun 	struct wireless_dev *wdev = NULL;
1977*4882a593Smuzhiyun 	struct net_info *_net_info, *next;
1978*4882a593Smuzhiyun 	unsigned long int flags;
1979*4882a593Smuzhiyun 	spin_lock_irqsave(&cfg->net_list_sync, flags);
1980*4882a593Smuzhiyun 	GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
1981*4882a593Smuzhiyun 	BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
1982*4882a593Smuzhiyun 		GCC_DIAGNOSTIC_POP();
1983*4882a593Smuzhiyun 		if (_net_info->profile.dpp_listen) {
1984*4882a593Smuzhiyun 			wdev = _net_info->wdev;
1985*4882a593Smuzhiyun 			break;
1986*4882a593Smuzhiyun 		}
1987*4882a593Smuzhiyun 	}
1988*4882a593Smuzhiyun 	spin_unlock_irqrestore(&cfg->net_list_sync, flags);
1989*4882a593Smuzhiyun 	return wdev;
1990*4882a593Smuzhiyun }
1991*4882a593Smuzhiyun 
1992*4882a593Smuzhiyun static inline void
wl_set_dpp_listen_by_netdev(struct bcm_cfg80211 * cfg,struct net_device * ndev,bool dpp_listen)1993*4882a593Smuzhiyun wl_set_dpp_listen_by_netdev(struct bcm_cfg80211 *cfg, struct net_device *ndev, bool dpp_listen)
1994*4882a593Smuzhiyun {
1995*4882a593Smuzhiyun 	struct net_info *_net_info, *next;
1996*4882a593Smuzhiyun 	unsigned long int flags;
1997*4882a593Smuzhiyun 	spin_lock_irqsave(&cfg->net_list_sync, flags);
1998*4882a593Smuzhiyun 	GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
1999*4882a593Smuzhiyun 	BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
2000*4882a593Smuzhiyun 		GCC_DIAGNOSTIC_POP();
2001*4882a593Smuzhiyun 		if (ndev && (_net_info->ndev == ndev))
2002*4882a593Smuzhiyun 			_net_info->profile.dpp_listen = dpp_listen;
2003*4882a593Smuzhiyun 	}
2004*4882a593Smuzhiyun 	spin_unlock_irqrestore(&cfg->net_list_sync, flags);
2005*4882a593Smuzhiyun }
2006*4882a593Smuzhiyun 
2007*4882a593Smuzhiyun static inline char *
wl_iftype_to_str(int wl_iftype)2008*4882a593Smuzhiyun wl_iftype_to_str(int wl_iftype)
2009*4882a593Smuzhiyun {
2010*4882a593Smuzhiyun 	switch (wl_iftype) {
2011*4882a593Smuzhiyun 		case (WL_IF_TYPE_STA):
2012*4882a593Smuzhiyun 			return "WL_IF_TYPE_STA";
2013*4882a593Smuzhiyun 		case (WL_IF_TYPE_AP):
2014*4882a593Smuzhiyun 			return "WL_IF_TYPE_AP";
2015*4882a593Smuzhiyun 		case (WL_IF_TYPE_AWDL):
2016*4882a593Smuzhiyun 			return "WL_IF_TYPE_AWDL";
2017*4882a593Smuzhiyun 		case (WL_IF_TYPE_NAN_NMI):
2018*4882a593Smuzhiyun 			return "WL_IF_TYPE_NAN_NMI";
2019*4882a593Smuzhiyun 		case (WL_IF_TYPE_NAN):
2020*4882a593Smuzhiyun 			return "WL_IF_TYPE_NAN";
2021*4882a593Smuzhiyun 		case (WL_IF_TYPE_P2P_GO):
2022*4882a593Smuzhiyun 			return "WL_IF_TYPE_P2P_GO";
2023*4882a593Smuzhiyun 		case (WL_IF_TYPE_P2P_GC):
2024*4882a593Smuzhiyun 			return "WL_IF_TYPE_P2P_GC";
2025*4882a593Smuzhiyun 		case (WL_IF_TYPE_P2P_DISC):
2026*4882a593Smuzhiyun 			return "WL_IF_TYPE_P2P_DISC";
2027*4882a593Smuzhiyun 		case (WL_IF_TYPE_IBSS):
2028*4882a593Smuzhiyun 			return "WL_IF_TYPE_IBSS";
2029*4882a593Smuzhiyun 		case (WL_IF_TYPE_MONITOR):
2030*4882a593Smuzhiyun 			return "WL_IF_TYPE_MONITOR";
2031*4882a593Smuzhiyun 		case (WL_IF_TYPE_AIBSS):
2032*4882a593Smuzhiyun 			return "WL_IF_TYPE_AIBSS";
2033*4882a593Smuzhiyun 		default:
2034*4882a593Smuzhiyun 			return "WL_IF_TYPE_UNKNOWN";
2035*4882a593Smuzhiyun 	}
2036*4882a593Smuzhiyun }
2037*4882a593Smuzhiyun 
2038*4882a593Smuzhiyun #define is_discovery_iface(iface) (((iface == WL_IF_TYPE_P2P_DISC) || \
2039*4882a593Smuzhiyun 	(iface == WL_IF_TYPE_NAN_NMI)) ? 1 : 0)
2040*4882a593Smuzhiyun #define is_p2p_group_iface(wdev) (((wdev->iftype == NL80211_IFTYPE_P2P_GO) || \
2041*4882a593Smuzhiyun 		(wdev->iftype == NL80211_IFTYPE_P2P_CLIENT)) ? 1 : 0)
2042*4882a593Smuzhiyun #define bcmcfg_to_wiphy(cfg) (cfg->wdev->wiphy)
2043*4882a593Smuzhiyun #define bcmcfg_to_prmry_ndev(cfg) (cfg->wdev->netdev)
2044*4882a593Smuzhiyun #define bcmcfg_to_prmry_wdev(cfg) (cfg->wdev)
2045*4882a593Smuzhiyun #define bcmcfg_to_p2p_wdev(cfg) (cfg->p2p_wdev)
2046*4882a593Smuzhiyun #define ndev_to_wl(n) (wdev_to_wl(n->ieee80211_ptr))
2047*4882a593Smuzhiyun #define ndev_to_wdev(ndev) (ndev->ieee80211_ptr)
2048*4882a593Smuzhiyun #define wdev_to_ndev(wdev) (wdev->netdev)
2049*4882a593Smuzhiyun 
2050*4882a593Smuzhiyun #ifdef WL_BLOCK_P2P_SCAN_ON_STA
2051*4882a593Smuzhiyun #define IS_P2P_IFACE(wdev) (wdev && \
2052*4882a593Smuzhiyun 		((wdev->iftype == NL80211_IFTYPE_P2P_DEVICE) || \
2053*4882a593Smuzhiyun 		(wdev->iftype == NL80211_IFTYPE_P2P_GO) || \
2054*4882a593Smuzhiyun 		(wdev->iftype == NL80211_IFTYPE_P2P_CLIENT)))
2055*4882a593Smuzhiyun #endif /* WL_BLOCK_P2P_SCAN_ON_STA */
2056*4882a593Smuzhiyun 
2057*4882a593Smuzhiyun #define IS_STA_IFACE(wdev) (wdev && \
2058*4882a593Smuzhiyun 		(wdev->iftype == NL80211_IFTYPE_STATION))
2059*4882a593Smuzhiyun 
2060*4882a593Smuzhiyun #define IS_AP_IFACE(wdev) (wdev && \
2061*4882a593Smuzhiyun 	(wdev->iftype == NL80211_IFTYPE_AP))
2062*4882a593Smuzhiyun 
2063*4882a593Smuzhiyun #if defined(WL_ENABLE_P2P_IF)
2064*4882a593Smuzhiyun #define ndev_to_wlc_ndev(ndev, cfg)	((ndev == cfg->p2p_net) ? \
2065*4882a593Smuzhiyun 	bcmcfg_to_prmry_ndev(cfg) : ndev)
2066*4882a593Smuzhiyun #else
2067*4882a593Smuzhiyun #define ndev_to_wlc_ndev(ndev, cfg)	(ndev)
2068*4882a593Smuzhiyun #endif /* WL_ENABLE_P2P_IF */
2069*4882a593Smuzhiyun 
2070*4882a593Smuzhiyun #define wdev_to_wlc_ndev(wdev, cfg)	\
2071*4882a593Smuzhiyun 	(wdev_to_ndev(wdev) ? \
2072*4882a593Smuzhiyun 	wdev_to_ndev(wdev) : bcmcfg_to_prmry_ndev(cfg))
2073*4882a593Smuzhiyun #if defined(WL_CFG80211_P2P_DEV_IF)
2074*4882a593Smuzhiyun #define cfgdev_to_wlc_ndev(cfgdev, cfg)	wdev_to_wlc_ndev(cfgdev, cfg)
2075*4882a593Smuzhiyun #define bcmcfg_to_prmry_cfgdev(cfgdev, cfg) bcmcfg_to_prmry_wdev(cfg)
2076*4882a593Smuzhiyun #elif defined(WL_ENABLE_P2P_IF)
2077*4882a593Smuzhiyun #define cfgdev_to_wlc_ndev(cfgdev, cfg)	ndev_to_wlc_ndev(cfgdev, cfg)
2078*4882a593Smuzhiyun #define bcmcfg_to_prmry_cfgdev(cfgdev, cfg) bcmcfg_to_prmry_ndev(cfg)
2079*4882a593Smuzhiyun #else
2080*4882a593Smuzhiyun #define cfgdev_to_wlc_ndev(cfgdev, cfg)	(cfgdev)
2081*4882a593Smuzhiyun #define bcmcfg_to_prmry_cfgdev(cfgdev, cfg) (cfgdev)
2082*4882a593Smuzhiyun #endif /* WL_CFG80211_P2P_DEV_IF */
2083*4882a593Smuzhiyun 
2084*4882a593Smuzhiyun #if defined(WL_CFG80211_P2P_DEV_IF)
2085*4882a593Smuzhiyun #define cfgdev_to_wdev(cfgdev)	(cfgdev)
2086*4882a593Smuzhiyun #define ndev_to_cfgdev(ndev)	ndev_to_wdev(ndev)
2087*4882a593Smuzhiyun #define cfgdev_to_ndev(cfgdev)	(cfgdev ? (cfgdev->netdev) : NULL)
2088*4882a593Smuzhiyun #define wdev_to_cfgdev(cfgdev)	(cfgdev)
2089*4882a593Smuzhiyun #define discover_cfgdev(cfgdev, cfg) (cfgdev->iftype == NL80211_IFTYPE_P2P_DEVICE)
2090*4882a593Smuzhiyun #else
2091*4882a593Smuzhiyun #define cfgdev_to_wdev(cfgdev)	(cfgdev->ieee80211_ptr)
2092*4882a593Smuzhiyun #define wdev_to_cfgdev(cfgdev)	cfgdev ? (cfgdev->netdev) : NULL
2093*4882a593Smuzhiyun #define ndev_to_cfgdev(ndev)	(ndev)
2094*4882a593Smuzhiyun #define cfgdev_to_ndev(cfgdev)	(cfgdev)
2095*4882a593Smuzhiyun #define discover_cfgdev(cfgdev, cfg) (cfgdev == cfg->p2p_net)
2096*4882a593Smuzhiyun #endif /* WL_CFG80211_P2P_DEV_IF */
2097*4882a593Smuzhiyun 
2098*4882a593Smuzhiyun #if defined(WL_CFG80211_P2P_DEV_IF)
2099*4882a593Smuzhiyun #define scan_req_match(cfg)	(((cfg) && (cfg->scan_request) && \
2100*4882a593Smuzhiyun 	(cfg->scan_request->wdev == cfg->p2p_wdev)) ? true : false)
2101*4882a593Smuzhiyun #elif defined(WL_ENABLE_P2P_IF)
2102*4882a593Smuzhiyun #define scan_req_match(cfg)	(((cfg) && (cfg->scan_request) && \
2103*4882a593Smuzhiyun 	(cfg->scan_request->dev == cfg->p2p_net)) ? true : false)
2104*4882a593Smuzhiyun #else
2105*4882a593Smuzhiyun #define scan_req_match(cfg)	(((cfg) && p2p_is_on(cfg) && p2p_scan(cfg)) ? \
2106*4882a593Smuzhiyun 	true : false)
2107*4882a593Smuzhiyun #endif /* WL_CFG80211_P2P_DEV_IF */
2108*4882a593Smuzhiyun 
2109*4882a593Smuzhiyun #define	PRINT_WDEV_INFO(cfgdev)	\
2110*4882a593Smuzhiyun 	{ \
2111*4882a593Smuzhiyun 		struct wireless_dev *wdev = cfgdev_to_wdev(cfgdev); \
2112*4882a593Smuzhiyun 		struct net_device *netdev = wdev ? wdev->netdev : NULL; \
2113*4882a593Smuzhiyun 		WL_DBG(("wdev_ptr:%p ndev_ptr:%p ifname:%s iftype:%d\n", OSL_OBFUSCATE_BUF(wdev), \
2114*4882a593Smuzhiyun 			OSL_OBFUSCATE_BUF(netdev),	\
2115*4882a593Smuzhiyun 			netdev ? netdev->name : "NULL (non-ndev device)",	\
2116*4882a593Smuzhiyun 			wdev ? wdev->iftype : 0xff)); \
2117*4882a593Smuzhiyun 	}
2118*4882a593Smuzhiyun 
2119*4882a593Smuzhiyun #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))
2120*4882a593Smuzhiyun #define scan_req_iftype(req) (req->dev->ieee80211_ptr->iftype)
2121*4882a593Smuzhiyun #else
2122*4882a593Smuzhiyun #define scan_req_iftype(req) (req->wdev->iftype)
2123*4882a593Smuzhiyun #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0) */
2124*4882a593Smuzhiyun 
2125*4882a593Smuzhiyun #define wl_to_sr(w) (w->scan_req_int)
2126*4882a593Smuzhiyun #if defined(STATIC_WL_PRIV_STRUCT)
2127*4882a593Smuzhiyun #define wl_to_ie(w) (w->ie)
2128*4882a593Smuzhiyun #define wl_to_conn(w) (w->conn_info)
2129*4882a593Smuzhiyun #else
2130*4882a593Smuzhiyun #define wl_to_ie(w) (&w->ie)
2131*4882a593Smuzhiyun #define wl_to_conn(w) (&w->conn_info)
2132*4882a593Smuzhiyun #endif // endif
2133*4882a593Smuzhiyun #define wl_to_fils_info(w) (&w->fils_info)
2134*4882a593Smuzhiyun #define wiphy_from_scan(w) (w->escan_info.wiphy)
2135*4882a593Smuzhiyun #define wl_get_drv_status_all(cfg, stat) \
2136*4882a593Smuzhiyun 	(wl_get_status_all(cfg, WL_STATUS_ ## stat))
2137*4882a593Smuzhiyun #define wl_get_drv_status(cfg, stat, ndev)  \
2138*4882a593Smuzhiyun 	(wl_get_status_by_netdev(cfg, WL_STATUS_ ## stat, ndev))
2139*4882a593Smuzhiyun #define wl_set_drv_status(cfg, stat, ndev)  \
2140*4882a593Smuzhiyun 	(wl_set_status_by_netdev(cfg, WL_STATUS_ ## stat, ndev, 1))
2141*4882a593Smuzhiyun #define wl_clr_drv_status(cfg, stat, ndev)  \
2142*4882a593Smuzhiyun 	(wl_set_status_by_netdev(cfg, WL_STATUS_ ## stat, ndev, 2))
2143*4882a593Smuzhiyun #define wl_clr_drv_status_all(cfg, stat)  \
2144*4882a593Smuzhiyun 	(wl_set_status_all(cfg, WL_STATUS_ ## stat, 2))
2145*4882a593Smuzhiyun #define wl_chg_drv_status(cfg, stat, ndev)  \
2146*4882a593Smuzhiyun 	(wl_set_status_by_netdev(cfg, WL_STATUS_ ## stat, ndev, 4))
2147*4882a593Smuzhiyun 
2148*4882a593Smuzhiyun #define for_each_bss(list, bss, __i)	\
2149*4882a593Smuzhiyun 	for (__i = 0; __i < list->count && __i < WL_AP_MAX; __i++, bss = next_bss(list, bss))
2150*4882a593Smuzhiyun 
2151*4882a593Smuzhiyun #define for_each_ndev(cfg, iter, next) \
2152*4882a593Smuzhiyun 	list_for_each_entry_safe(iter, next, &cfg->net_list, list)
2153*4882a593Smuzhiyun 
2154*4882a593Smuzhiyun /* In case of WPS from wpa_supplicant, pairwise siute and group suite is 0.
2155*4882a593Smuzhiyun  * In addtion to that, wpa_version is WPA_VERSION_1
2156*4882a593Smuzhiyun  */
2157*4882a593Smuzhiyun #define is_wps_conn(_sme) \
2158*4882a593Smuzhiyun 	((wl_cfgp2p_find_wpsie(_sme->ie, _sme->ie_len) != NULL) && \
2159*4882a593Smuzhiyun 	 (!_sme->crypto.n_ciphers_pairwise) && \
2160*4882a593Smuzhiyun 	 (!_sme->crypto.cipher_group))
2161*4882a593Smuzhiyun 
2162*4882a593Smuzhiyun #ifdef WLFBT
2163*4882a593Smuzhiyun #if defined(WLAN_AKM_SUITE_FT_8021X) && defined(WLAN_AKM_SUITE_FT_PSK)
2164*4882a593Smuzhiyun #define IS_AKM_SUITE_FT(sec) (sec->wpa_auth == WLAN_AKM_SUITE_FT_8021X || \
2165*4882a593Smuzhiyun 		sec->wpa_auth == WLAN_AKM_SUITE_FT_PSK)
2166*4882a593Smuzhiyun #elif defined(WLAN_AKM_SUITE_FT_8021X)
2167*4882a593Smuzhiyun #define IS_AKM_SUITE_FT(sec) (sec->wpa_auth == WLAN_AKM_SUITE_FT_8021X)
2168*4882a593Smuzhiyun #elif defined(WLAN_AKM_SUITE_FT_PSK)
2169*4882a593Smuzhiyun #define IS_AKM_SUITE_FT(sec) (sec->wpa_auth == WLAN_AKM_SUITE_FT_PSK)
2170*4882a593Smuzhiyun #else
2171*4882a593Smuzhiyun #define IS_AKM_SUITE_FT(sec) ({BCM_REFERENCE(sec); FALSE;})
2172*4882a593Smuzhiyun #endif /* WLAN_AKM_SUITE_FT_8021X && WLAN_AKM_SUITE_FT_PSK */
2173*4882a593Smuzhiyun #else
2174*4882a593Smuzhiyun #define IS_AKM_SUITE_FT(sec) ({BCM_REFERENCE(sec); FALSE;})
2175*4882a593Smuzhiyun #endif /* WLFBT */
2176*4882a593Smuzhiyun 
2177*4882a593Smuzhiyun #define IS_AKM_SUITE_CCKM(sec) ({BCM_REFERENCE(sec); FALSE;})
2178*4882a593Smuzhiyun 
2179*4882a593Smuzhiyun #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0))
2180*4882a593Smuzhiyun #define STA_INFO_BIT(info) (1ul << NL80211_STA_ ## info)
2181*4882a593Smuzhiyun #ifdef strnicmp
2182*4882a593Smuzhiyun #undef strnicmp
2183*4882a593Smuzhiyun #endif /* strnicmp */
2184*4882a593Smuzhiyun #define strnicmp(str1, str2, len) strncasecmp((str1), (str2), (len))
2185*4882a593Smuzhiyun #else
2186*4882a593Smuzhiyun #define STA_INFO_BIT(info) (STATION_ ## info)
2187*4882a593Smuzhiyun #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)) */
2188*4882a593Smuzhiyun 
2189*4882a593Smuzhiyun extern s32 wl_cfg80211_attach(struct net_device *ndev, void *context);
2190*4882a593Smuzhiyun extern void wl_cfg80211_detach(struct bcm_cfg80211 *cfg);
2191*4882a593Smuzhiyun 
2192*4882a593Smuzhiyun extern void wl_cfg80211_event(struct net_device *ndev, const wl_event_msg_t *e,
2193*4882a593Smuzhiyun             void *data);
2194*4882a593Smuzhiyun extern s32 wl_cfg80211_handle_critical_events(struct bcm_cfg80211 *cfg,
2195*4882a593Smuzhiyun 	const wl_event_msg_t * e);
2196*4882a593Smuzhiyun 
2197*4882a593Smuzhiyun void wl_cfg80211_set_parent_dev(void *dev);
2198*4882a593Smuzhiyun struct device *wl_cfg80211_get_parent_dev(void);
2199*4882a593Smuzhiyun struct bcm_cfg80211 *wl_cfg80211_get_bcmcfg(void);
2200*4882a593Smuzhiyun void wl_cfg80211_set_bcmcfg(struct bcm_cfg80211 *cfg);
2201*4882a593Smuzhiyun 
2202*4882a593Smuzhiyun /* clear IEs */
2203*4882a593Smuzhiyun extern s32 wl_cfg80211_clear_mgmt_vndr_ies(struct bcm_cfg80211 *cfg);
2204*4882a593Smuzhiyun extern s32 wl_cfg80211_clear_per_bss_ies(struct bcm_cfg80211 *cfg, struct wireless_dev *wdev);
2205*4882a593Smuzhiyun extern void wl_cfg80211_clear_p2p_disc_ies(struct bcm_cfg80211 *cfg);
2206*4882a593Smuzhiyun #ifdef WL_STATIC_IF
2207*4882a593Smuzhiyun extern int32 wl_cfg80211_update_iflist_info(struct bcm_cfg80211 *cfg, struct net_device *ndev,
2208*4882a593Smuzhiyun 	int ifidx, uint8 *addr, int bssidx, char *name, int if_state);
2209*4882a593Smuzhiyun extern int get_iface_num(const char *name, struct bcm_cfg80211 *cfg);
2210*4882a593Smuzhiyun extern bool is_static_iface(struct bcm_cfg80211 *cfg, struct net_device *net);
2211*4882a593Smuzhiyun extern int static_if_ndev_get_state(struct bcm_cfg80211 *cfg, struct net_device *net);
2212*4882a593Smuzhiyun extern bool is_static_iface_name(const char *name, struct bcm_cfg80211 *cfg);
2213*4882a593Smuzhiyun #endif /* WL_STATIC_IF */
2214*4882a593Smuzhiyun extern s32 wl_cfg80211_up(struct net_device *net);
2215*4882a593Smuzhiyun extern s32 wl_cfg80211_down(struct net_device *net);
2216*4882a593Smuzhiyun extern void wl_cfg80211_sta_ifdown(struct net_device *net);
2217*4882a593Smuzhiyun extern s32 wl_cfg80211_notify_ifadd(struct net_device * dev, int ifidx, char *name, uint8 *mac,
2218*4882a593Smuzhiyun 	uint8 bssidx, uint8 role);
2219*4882a593Smuzhiyun extern s32 wl_cfg80211_notify_ifdel(struct net_device * dev, int ifidx, char *name, uint8 *mac,
2220*4882a593Smuzhiyun 	uint8 bssidx);
2221*4882a593Smuzhiyun extern s32 wl_cfg80211_notify_ifchange(struct net_device * dev, int ifidx, char *name, uint8 *mac,
2222*4882a593Smuzhiyun 	uint8 bssidx);
2223*4882a593Smuzhiyun extern struct net_device* wl_cfg80211_allocate_if(struct bcm_cfg80211 *cfg, int ifidx,
2224*4882a593Smuzhiyun 	const char *name, uint8 *mac, uint8 bssidx, const char *dngl_name);
2225*4882a593Smuzhiyun extern int wl_cfg80211_register_if(struct bcm_cfg80211 *cfg,
2226*4882a593Smuzhiyun 	int ifidx, struct net_device* ndev, bool rtnl_lock_reqd);
2227*4882a593Smuzhiyun extern int wl_cfg80211_remove_if(struct bcm_cfg80211 *cfg,
2228*4882a593Smuzhiyun 	int ifidx, struct net_device* ndev, bool rtnl_lock_reqd);
2229*4882a593Smuzhiyun extern void wl_cfg80211_cleanup_if(struct net_device *dev);
2230*4882a593Smuzhiyun extern bool wl_cfg80211_is_concurrent_mode(struct net_device * dev);
2231*4882a593Smuzhiyun extern void wl_cfg80211_disassoc(struct net_device *ndev, uint32 reason);
2232*4882a593Smuzhiyun extern void wl_cfg80211_del_all_sta(struct net_device *ndev, uint32 reason);
2233*4882a593Smuzhiyun extern void* wl_cfg80211_get_dhdp(struct net_device * dev);
2234*4882a593Smuzhiyun extern bool wl_cfg80211_is_p2p_active(struct net_device * dev);
2235*4882a593Smuzhiyun extern bool wl_cfg80211_is_roam_offload(struct net_device * dev);
2236*4882a593Smuzhiyun extern bool wl_cfg80211_is_event_from_connected_bssid(struct net_device * dev,
2237*4882a593Smuzhiyun 		const wl_event_msg_t *e, int ifidx);
2238*4882a593Smuzhiyun extern void wl_cfg80211_dbg_level(u32 level);
2239*4882a593Smuzhiyun extern s32 wl_cfg80211_get_p2p_dev_addr(struct net_device *net, struct ether_addr *p2pdev_addr);
2240*4882a593Smuzhiyun extern s32 wl_cfg80211_set_p2p_noa(struct net_device *net, char* buf, int len);
2241*4882a593Smuzhiyun extern s32 wl_cfg80211_get_p2p_noa(struct net_device *net, char* buf, int len);
2242*4882a593Smuzhiyun extern s32 wl_cfg80211_set_wps_p2p_ie(struct net_device *net, char *buf, int len,
2243*4882a593Smuzhiyun 	enum wl_management_type type);
2244*4882a593Smuzhiyun extern s32 wl_cfg80211_set_p2p_ps(struct net_device *net, char* buf, int len);
2245*4882a593Smuzhiyun extern s32 wl_cfg80211_set_p2p_ecsa(struct net_device *net, char* buf, int len);
2246*4882a593Smuzhiyun extern s32 wl_cfg80211_increase_p2p_bw(struct net_device *net, char* buf, int len);
2247*4882a593Smuzhiyun extern bool wl_cfg80211_check_vif_in_use(struct net_device *ndev);
2248*4882a593Smuzhiyun #ifdef P2PLISTEN_AP_SAMECHN
2249*4882a593Smuzhiyun extern s32 wl_cfg80211_set_p2p_resp_ap_chn(struct net_device *net, s32 enable);
2250*4882a593Smuzhiyun #endif /* P2PLISTEN_AP_SAMECHN */
2251*4882a593Smuzhiyun 
2252*4882a593Smuzhiyun /* btcoex functions */
2253*4882a593Smuzhiyun void* wl_cfg80211_btcoex_init(struct net_device *ndev);
2254*4882a593Smuzhiyun void wl_cfg80211_btcoex_deinit(void);
2255*4882a593Smuzhiyun 
2256*4882a593Smuzhiyun extern chanspec_t wl_chspec_from_legacy(chanspec_t legacy_chspec);
2257*4882a593Smuzhiyun extern chanspec_t wl_chspec_driver_to_host(chanspec_t chanspec);
2258*4882a593Smuzhiyun 
2259*4882a593Smuzhiyun #ifdef WL_SUPPORT_AUTO_CHANNEL
2260*4882a593Smuzhiyun #define CHANSPEC_BUF_SIZE	1024
2261*4882a593Smuzhiyun #define CHAN_SEL_IOCTL_DELAY	300
2262*4882a593Smuzhiyun #define CHAN_SEL_RETRY_COUNT	15
2263*4882a593Smuzhiyun #define CHANNEL_IS_RADAR(channel)	(((channel & WL_CHAN_RADAR) || \
2264*4882a593Smuzhiyun 	(channel & WL_CHAN_PASSIVE)) ? true : false)
2265*4882a593Smuzhiyun #define CHANNEL_IS_2G(channel)	(((channel >= 1) && (channel <= 14)) ? \
2266*4882a593Smuzhiyun 	true : false)
2267*4882a593Smuzhiyun #define CHANNEL_IS_5G(channel)	(((channel >= 36) && (channel <= 165)) ? \
2268*4882a593Smuzhiyun 	true : false)
2269*4882a593Smuzhiyun extern s32 wl_cfg80211_get_best_channels(struct net_device *dev, char* command,
2270*4882a593Smuzhiyun 	int total_len);
2271*4882a593Smuzhiyun #endif /* WL_SUPPORT_AUTO_CHANNEL */
2272*4882a593Smuzhiyun extern int wl_cfg80211_ether_atoe(const char *a, struct ether_addr *n);
2273*4882a593Smuzhiyun extern int wl_cfg80211_hang(struct net_device *dev, u16 reason);
2274*4882a593Smuzhiyun extern s32 wl_mode_to_nl80211_iftype(s32 mode);
2275*4882a593Smuzhiyun int wl_cfg80211_do_driver_init(struct net_device *net);
2276*4882a593Smuzhiyun void wl_cfg80211_enable_trace(bool set, u32 level);
2277*4882a593Smuzhiyun extern s32 wl_update_wiphybands(struct bcm_cfg80211 *cfg, bool notify);
2278*4882a593Smuzhiyun extern s32 wl_cfg80211_if_is_group_owner(void);
2279*4882a593Smuzhiyun extern chanspec_t wl_chspec_host_to_driver(chanspec_t chanspec);
2280*4882a593Smuzhiyun extern chanspec_t wl_ch_host_to_driver(u16 channel);
2281*4882a593Smuzhiyun extern s32 wl_set_tx_power(struct net_device *dev,
2282*4882a593Smuzhiyun 	enum nl80211_tx_power_setting type, s32 dbm);
2283*4882a593Smuzhiyun extern s32 wl_get_tx_power(struct net_device *dev, s32 *dbm);
2284*4882a593Smuzhiyun extern s32 wl_add_remove_eventmsg(struct net_device *ndev, u16 event, bool add);
2285*4882a593Smuzhiyun extern s32 wl_add_remove_eventextmsg(struct net_device *ndev, u16 event, bool add);
2286*4882a593Smuzhiyun extern void wl_stop_wait_next_action_frame(struct bcm_cfg80211 *cfg, struct net_device *ndev,
2287*4882a593Smuzhiyun 	u8 bsscfgidx);
2288*4882a593Smuzhiyun #ifdef WL_HOST_BAND_MGMT
2289*4882a593Smuzhiyun extern s32 wl_cfg80211_set_band(struct net_device *ndev, int band);
2290*4882a593Smuzhiyun #endif /* WL_HOST_BAND_MGMT */
2291*4882a593Smuzhiyun extern void wl_cfg80211_add_to_eventbuffer(wl_eventmsg_buf_t *ev, u16 event, bool set);
2292*4882a593Smuzhiyun extern s32 wl_cfg80211_apply_eventbuffer(struct net_device *ndev,
2293*4882a593Smuzhiyun 	struct bcm_cfg80211 *cfg, wl_eventmsg_buf_t *ev);
2294*4882a593Smuzhiyun extern void get_primary_mac(struct bcm_cfg80211 *cfg, struct ether_addr *mac);
2295*4882a593Smuzhiyun extern void wl_cfg80211_update_power_mode(struct net_device *dev);
2296*4882a593Smuzhiyun extern void wl_terminate_event_handler(struct net_device *dev);
2297*4882a593Smuzhiyun #if defined(DHD_ENABLE_BIGDATA_LOGGING)
2298*4882a593Smuzhiyun extern s32 wl_cfg80211_get_bss_info(struct net_device *dev, char* cmd, int total_len);
2299*4882a593Smuzhiyun extern s32 wl_cfg80211_get_connect_failed_status(struct net_device *dev, char* cmd, int total_len);
2300*4882a593Smuzhiyun #endif /* DHD_ENABLE_BIGDATA_LOGGING */
2301*4882a593Smuzhiyun extern struct bcm_cfg80211 *wl_get_cfg(struct net_device *ndev);
2302*4882a593Smuzhiyun extern s32 wl_cfg80211_set_if_band(struct net_device *ndev, int band);
2303*4882a593Smuzhiyun extern s32 wl_cfg80211_set_country_code(struct net_device *dev, char *country_code,
2304*4882a593Smuzhiyun         bool notify, bool user_enforced, int revinfo);
2305*4882a593Smuzhiyun extern bool wl_cfg80211_is_hal_started(struct bcm_cfg80211 *cfg);
2306*4882a593Smuzhiyun #ifdef WL_WIPSEVT
2307*4882a593Smuzhiyun extern int wl_cfg80211_wips_event(uint16 misdeauth, char* bssid);
2308*4882a593Smuzhiyun #endif /* WL_WIPSEVT */
2309*4882a593Smuzhiyun 
2310*4882a593Smuzhiyun #define SCAN_BUF_CNT	2
2311*4882a593Smuzhiyun #define SCAN_BUF_NEXT	1
2312*4882a593Smuzhiyun #define WL_SCANTYPE_LEGACY	0x1
2313*4882a593Smuzhiyun #define WL_SCANTYPE_P2P		0x2
2314*4882a593Smuzhiyun #ifdef DUAL_ESCAN_RESULT_BUFFER
2315*4882a593Smuzhiyun #define wl_escan_set_sync_id(a, b) ((a) = (b)->escan_info.cur_sync_id)
2316*4882a593Smuzhiyun #define wl_escan_set_type(a, b) ((a)->escan_info.escan_type\
2317*4882a593Smuzhiyun 		[((a)->escan_info.cur_sync_id)%SCAN_BUF_CNT] = (b))
wl_escan_get_buf(struct bcm_cfg80211 * cfg,bool aborted)2318*4882a593Smuzhiyun static inline wl_scan_results_t *wl_escan_get_buf(struct bcm_cfg80211 *cfg, bool aborted)
2319*4882a593Smuzhiyun {
2320*4882a593Smuzhiyun 	u8 index;
2321*4882a593Smuzhiyun 	if (aborted) {
2322*4882a593Smuzhiyun 		if (cfg->escan_info.escan_type[0] == cfg->escan_info.escan_type[1])
2323*4882a593Smuzhiyun 			index = (cfg->escan_info.cur_sync_id + 1)%SCAN_BUF_CNT;
2324*4882a593Smuzhiyun 		else
2325*4882a593Smuzhiyun 			index = (cfg->escan_info.cur_sync_id)%SCAN_BUF_CNT;
2326*4882a593Smuzhiyun 	}
2327*4882a593Smuzhiyun 	else
2328*4882a593Smuzhiyun 		index = (cfg->escan_info.cur_sync_id)%SCAN_BUF_CNT;
2329*4882a593Smuzhiyun 
2330*4882a593Smuzhiyun 	return (wl_scan_results_t *)cfg->escan_info.escan_buf[index];
2331*4882a593Smuzhiyun }
wl_escan_check_sync_id(s32 status,u16 result_id,u16 wl_id)2332*4882a593Smuzhiyun static inline int wl_escan_check_sync_id(s32 status, u16 result_id, u16 wl_id)
2333*4882a593Smuzhiyun {
2334*4882a593Smuzhiyun 	if (result_id != wl_id) {
2335*4882a593Smuzhiyun 		WL_ERR(("ESCAN sync id mismatch :status :%d "
2336*4882a593Smuzhiyun 			"cur_sync_id:%d coming sync_id:%d\n",
2337*4882a593Smuzhiyun 			status, wl_id, result_id));
2338*4882a593Smuzhiyun 		return -1;
2339*4882a593Smuzhiyun 	}
2340*4882a593Smuzhiyun 	else
2341*4882a593Smuzhiyun 		return 0;
2342*4882a593Smuzhiyun }
wl_escan_print_sync_id(s32 status,u16 result_id,u16 wl_id)2343*4882a593Smuzhiyun static inline void wl_escan_print_sync_id(s32 status, u16 result_id, u16 wl_id)
2344*4882a593Smuzhiyun {
2345*4882a593Smuzhiyun 	if (result_id != wl_id) {
2346*4882a593Smuzhiyun 		WL_ERR(("ESCAN sync id mismatch :status :%d "
2347*4882a593Smuzhiyun 			"cur_sync_id:%d coming sync_id:%d\n",
2348*4882a593Smuzhiyun 			status, wl_id, result_id));
2349*4882a593Smuzhiyun 	}
2350*4882a593Smuzhiyun }
2351*4882a593Smuzhiyun #define wl_escan_increment_sync_id(a, b) ((a)->escan_info.cur_sync_id += b)
2352*4882a593Smuzhiyun #define wl_escan_init_sync_id(a) ((a)->escan_info.cur_sync_id = 0)
2353*4882a593Smuzhiyun #else
2354*4882a593Smuzhiyun #define wl_escan_set_sync_id(a, b) ((a) = htod16((b)->escan_sync_id_cntr++))
2355*4882a593Smuzhiyun #define wl_escan_set_type(a, b)
2356*4882a593Smuzhiyun #define wl_escan_get_buf(a, b) ((wl_scan_results_t *) (a)->escan_info.escan_buf)
2357*4882a593Smuzhiyun #define wl_escan_check_sync_id(a, b, c) 0
2358*4882a593Smuzhiyun #define wl_escan_print_sync_id(a, b, c)
2359*4882a593Smuzhiyun #define wl_escan_increment_sync_id(a, b)
2360*4882a593Smuzhiyun #define wl_escan_init_sync_id(a)
2361*4882a593Smuzhiyun #endif /* DUAL_ESCAN_RESULT_BUFFER */
2362*4882a593Smuzhiyun extern void wl_cfg80211_ibss_vsie_set_buffer(struct net_device *dev, vndr_ie_setbuf_t *ibss_vsie,
2363*4882a593Smuzhiyun 	int ibss_vsie_len);
2364*4882a593Smuzhiyun extern s32 wl_cfg80211_ibss_vsie_delete(struct net_device *dev);
2365*4882a593Smuzhiyun #ifdef WLAIBSS
2366*4882a593Smuzhiyun extern void wl_cfg80211_set_txfail_pid(struct net_device *dev, int pid);
2367*4882a593Smuzhiyun #endif /* WLAIBSS */
2368*4882a593Smuzhiyun #ifdef WL_RELMCAST
2369*4882a593Smuzhiyun extern void wl_cfg80211_set_rmc_pid(struct net_device *dev, int pid);
2370*4882a593Smuzhiyun #endif /* WL_RELMCAST */
2371*4882a593Smuzhiyun extern int wl_cfg80211_set_mgmt_vndr_ies(struct bcm_cfg80211 *cfg,
2372*4882a593Smuzhiyun 	bcm_struct_cfgdev *cfgdev, s32 bssidx, s32 pktflag,
2373*4882a593Smuzhiyun 	const u8 *vndr_ie, u32 vndr_ie_len);
2374*4882a593Smuzhiyun 
2375*4882a593Smuzhiyun #ifdef WLFBT
2376*4882a593Smuzhiyun extern int wl_cfg80211_get_fbt_key(struct net_device *dev, uint8 *key, int total_len);
2377*4882a593Smuzhiyun #endif // endif
2378*4882a593Smuzhiyun 
2379*4882a593Smuzhiyun /* Action frame specific functions */
2380*4882a593Smuzhiyun extern u8 wl_get_action_category(void *frame, u32 frame_len);
2381*4882a593Smuzhiyun extern int wl_get_public_action(void *frame, u32 frame_len, u8 *ret_action);
2382*4882a593Smuzhiyun 
2383*4882a593Smuzhiyun #ifdef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST
2384*4882a593Smuzhiyun struct net_device *wl_cfg80211_get_remain_on_channel_ndev(struct bcm_cfg80211 *cfg);
2385*4882a593Smuzhiyun #endif /* WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */
2386*4882a593Smuzhiyun 
2387*4882a593Smuzhiyun #ifdef WL_SUPPORT_ACS
2388*4882a593Smuzhiyun #define ACS_MSRMNT_DELAY 1000 /* dump_obss delay in ms */
2389*4882a593Smuzhiyun #define IOCTL_RETRY_COUNT 5
2390*4882a593Smuzhiyun #define CHAN_NOISE_DUMMY -80
2391*4882a593Smuzhiyun #define OBSS_TOKEN_IDX 15
2392*4882a593Smuzhiyun #define IBSS_TOKEN_IDX 15
2393*4882a593Smuzhiyun #define TX_TOKEN_IDX 14
2394*4882a593Smuzhiyun #define CTG_TOKEN_IDX 13
2395*4882a593Smuzhiyun #define PKT_TOKEN_IDX 15
2396*4882a593Smuzhiyun #define IDLE_TOKEN_IDX 12
2397*4882a593Smuzhiyun #endif /* WL_SUPPORT_ACS */
2398*4882a593Smuzhiyun 
2399*4882a593Smuzhiyun #ifdef BCMWAPI_WPI
2400*4882a593Smuzhiyun #define is_wapi(cipher) (cipher == WLAN_CIPHER_SUITE_SMS4) ? 1 : 0
2401*4882a593Smuzhiyun #endif /* BCMWAPI_WPI */
2402*4882a593Smuzhiyun 
2403*4882a593Smuzhiyun extern int wl_cfg80211_get_ioctl_version(void);
2404*4882a593Smuzhiyun extern int wl_cfg80211_enable_roam_offload(struct net_device *dev, int enable);
2405*4882a593Smuzhiyun extern s32 wl_cfg80211_dfs_ap_move(struct net_device *ndev, char *data,
2406*4882a593Smuzhiyun 		char *command, int total_len);
2407*4882a593Smuzhiyun #ifdef WBTEXT
2408*4882a593Smuzhiyun extern s32 wl_cfg80211_wbtext_set_default(struct net_device *ndev);
2409*4882a593Smuzhiyun extern s32 wl_cfg80211_wbtext_config(struct net_device *ndev, char *data,
2410*4882a593Smuzhiyun 		char *command, int total_len);
2411*4882a593Smuzhiyun extern int wl_cfg80211_wbtext_weight_config(struct net_device *ndev, char *data,
2412*4882a593Smuzhiyun 		char *command, int total_len);
2413*4882a593Smuzhiyun extern int wl_cfg80211_wbtext_table_config(struct net_device *ndev, char *data,
2414*4882a593Smuzhiyun 		char *command, int total_len);
2415*4882a593Smuzhiyun extern s32 wl_cfg80211_wbtext_delta_config(struct net_device *ndev, char *data,
2416*4882a593Smuzhiyun 		char *command, int total_len);
2417*4882a593Smuzhiyun #endif /* WBTEXT */
2418*4882a593Smuzhiyun extern s32 wl_cfg80211_get_chanspecs_2g(struct net_device *ndev,
2419*4882a593Smuzhiyun 		void *buf, s32 buflen);
2420*4882a593Smuzhiyun extern s32 wl_cfg80211_get_chanspecs_5g(struct net_device *ndev,
2421*4882a593Smuzhiyun 		void *buf, s32 buflen);
2422*4882a593Smuzhiyun 
2423*4882a593Smuzhiyun #if defined(SAVE_CONNECTION_WHEN_CC_UPDATE)
2424*4882a593Smuzhiyun extern bool wl_update_ap_chandef(struct net_device *ndev);
2425*4882a593Smuzhiyun extern bool wl_check_valid_channel_in_country(struct net_device *ndev, char *ccode, int forced);
2426*4882a593Smuzhiyun #endif // endif
2427*4882a593Smuzhiyun 
2428*4882a593Smuzhiyun extern s32 wl_cfg80211_bss_up(struct bcm_cfg80211 *cfg,
2429*4882a593Smuzhiyun 	struct net_device *ndev, s32 bsscfg_idx, s32 up);
2430*4882a593Smuzhiyun extern bool wl_cfg80211_bss_isup(struct net_device *ndev, int bsscfg_idx);
2431*4882a593Smuzhiyun 
2432*4882a593Smuzhiyun struct net_device *wl_cfg80211_post_ifcreate(struct net_device *ndev,
2433*4882a593Smuzhiyun 	wl_if_event_info *event, u8 *addr, const char *name, bool rtnl_lock_reqd);
2434*4882a593Smuzhiyun extern s32 wl_cfg80211_post_ifdel(struct net_device *ndev, bool rtnl_lock_reqd, s32 ifidx);
2435*4882a593Smuzhiyun #if defined(PKT_FILTER_SUPPORT) && defined(APSTA_BLOCK_ARP_DURING_DHCP)
2436*4882a593Smuzhiyun extern void wl_cfg80211_block_arp(struct net_device *dev, int enable);
2437*4882a593Smuzhiyun #endif /* PKT_FILTER_SUPPORT && APSTA_BLOCK_ARP_DURING_DHCP */
2438*4882a593Smuzhiyun 
2439*4882a593Smuzhiyun #ifdef WLTDLS
2440*4882a593Smuzhiyun extern s32 wl_cfg80211_tdls_config(struct bcm_cfg80211 *cfg,
2441*4882a593Smuzhiyun 	enum wl_tdls_config state, bool tdls_mode);
2442*4882a593Smuzhiyun extern s32 wl_tdls_event_handler(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev,
2443*4882a593Smuzhiyun 	const wl_event_msg_t *e, void *data);
2444*4882a593Smuzhiyun #endif /* WLTDLS */
2445*4882a593Smuzhiyun 
2446*4882a593Smuzhiyun #ifdef WL_NAN
2447*4882a593Smuzhiyun extern int wl_cfgvendor_send_nan_event(struct wiphy * wiphy,
2448*4882a593Smuzhiyun 	struct net_device *dev, int event_id,
2449*4882a593Smuzhiyun 	nan_event_data_t *nan_event_data);
2450*4882a593Smuzhiyun extern int wl_cfgnan_init(struct bcm_cfg80211 *cfg);
2451*4882a593Smuzhiyun extern int wl_cfgnan_deinit(struct bcm_cfg80211 *cfg, uint8 busstate);
2452*4882a593Smuzhiyun extern bool wl_cfgnan_check_state(struct bcm_cfg80211 *cfg);
2453*4882a593Smuzhiyun #ifdef RTT_SUPPORT
2454*4882a593Smuzhiyun extern s32 wl_cfgvendor_send_as_rtt_legacy_event(struct wiphy *wiphy,
2455*4882a593Smuzhiyun 	struct net_device *dev, wl_nan_ev_rng_rpt_ind_t *range_res,
2456*4882a593Smuzhiyun 	uint32 status);
2457*4882a593Smuzhiyun #endif /* RTT_SUPPORT */
2458*4882a593Smuzhiyun #ifdef WL_NANP2P
2459*4882a593Smuzhiyun extern int wl_cfg80211_set_iface_conc_disc(struct net_device *ndev,
2460*4882a593Smuzhiyun 	uint8 arg_val);
2461*4882a593Smuzhiyun extern uint8 wl_cfg80211_get_iface_conc_disc(struct net_device *ndev);
2462*4882a593Smuzhiyun #endif /* WL_NANP2P */
2463*4882a593Smuzhiyun #endif /* WL_NAN */
2464*4882a593Smuzhiyun 
2465*4882a593Smuzhiyun #ifdef WL_CFG80211_P2P_DEV_IF
2466*4882a593Smuzhiyun extern void wl_cfg80211_del_p2p_wdev(struct net_device *dev);
2467*4882a593Smuzhiyun #endif /* WL_CFG80211_P2P_DEV_IF */
2468*4882a593Smuzhiyun #if defined(WL_SUPPORT_AUTO_CHANNEL)
2469*4882a593Smuzhiyun extern int wl_cfg80211_set_spect(struct net_device *dev, int spect);
2470*4882a593Smuzhiyun extern int wl_cfg80211_get_sta_channel(struct bcm_cfg80211 *cfg);
2471*4882a593Smuzhiyun #endif /* WL_SUPPORT_AUTO_CHANNEL */
2472*4882a593Smuzhiyun #ifdef WL_CFG80211_SYNC_GON
2473*4882a593Smuzhiyun #define WL_DRV_STATUS_SENDING_AF_FRM_EXT(cfg) \
2474*4882a593Smuzhiyun 	(wl_get_drv_status_all(cfg, SENDING_ACT_FRM) || \
2475*4882a593Smuzhiyun 		wl_get_drv_status_all(cfg, WAITING_NEXT_ACT_FRM_LISTEN))
2476*4882a593Smuzhiyun #else
2477*4882a593Smuzhiyun #define WL_DRV_STATUS_SENDING_AF_FRM_EXT(cfg) wl_get_drv_status_all(cfg, SENDING_ACT_FRM)
2478*4882a593Smuzhiyun #endif /* WL_CFG80211_SYNC_GON */
2479*4882a593Smuzhiyun 
2480*4882a593Smuzhiyun #ifdef P2P_LISTEN_OFFLOADING
2481*4882a593Smuzhiyun extern s32 wl_cfg80211_p2plo_deinit(struct bcm_cfg80211 *cfg);
2482*4882a593Smuzhiyun #endif /* P2P_LISTEN_OFFLOADING */
2483*4882a593Smuzhiyun 
2484*4882a593Smuzhiyun /* Function to flush the FW log buffer content */
2485*4882a593Smuzhiyun extern void wl_flush_fw_log_buffer(struct net_device *dev, uint32 logset_mask);
2486*4882a593Smuzhiyun 
2487*4882a593Smuzhiyun #define RETURN_EIO_IF_NOT_UP(wlpriv)                        \
2488*4882a593Smuzhiyun do {                                    \
2489*4882a593Smuzhiyun 	struct net_device *checkSysUpNDev = bcmcfg_to_prmry_ndev(wlpriv);           \
2490*4882a593Smuzhiyun 	if (unlikely(!wl_get_drv_status(wlpriv, READY, checkSysUpNDev))) {  \
2491*4882a593Smuzhiyun 		WL_INFORM(("device is not ready\n"));           \
2492*4882a593Smuzhiyun 		return -EIO;                        \
2493*4882a593Smuzhiyun 	}                               \
2494*4882a593Smuzhiyun } while (0)
2495*4882a593Smuzhiyun 
2496*4882a593Smuzhiyun #ifdef QOS_MAP_SET
2497*4882a593Smuzhiyun extern uint8 *wl_get_up_table(void);
2498*4882a593Smuzhiyun #endif /* QOS_MAP_SET */
2499*4882a593Smuzhiyun 
2500*4882a593Smuzhiyun #define P2PO_COOKIE     65535
2501*4882a593Smuzhiyun u64 wl_cfg80211_get_new_roc_id(struct bcm_cfg80211 *cfg);
2502*4882a593Smuzhiyun 
2503*4882a593Smuzhiyun #ifdef SUPPORT_AP_HIGHER_BEACONRATE
2504*4882a593Smuzhiyun int wl_set_ap_beacon_rate(struct net_device *dev, int val, char *ifname);
2505*4882a593Smuzhiyun int wl_get_ap_basic_rate(struct net_device *dev, char* command, char *ifname, int total_len);
2506*4882a593Smuzhiyun #endif /* SUPPORT_AP_HIGHER_BEACONRATE */
2507*4882a593Smuzhiyun #ifdef SUPPORT_AP_RADIO_PWRSAVE
2508*4882a593Smuzhiyun int wl_get_ap_rps(struct net_device *dev, char* command, char *ifname, int total_len);
2509*4882a593Smuzhiyun int wl_set_ap_rps(struct net_device *dev, bool enable, char *ifname);
2510*4882a593Smuzhiyun int wl_update_ap_rps_params(struct net_device *dev, ap_rps_info_t* rps, char *ifname);
2511*4882a593Smuzhiyun void wl_cfg80211_init_ap_rps(struct bcm_cfg80211 *cfg);
2512*4882a593Smuzhiyun #endif /* SUPPORT_AP_RADIO_PWRSAVE */
2513*4882a593Smuzhiyun #ifdef SUPPORT_RSSI_SUM_REPORT
2514*4882a593Smuzhiyun int wl_get_rssi_logging(struct net_device *dev, void *param);
2515*4882a593Smuzhiyun int wl_set_rssi_logging(struct net_device *dev, void *param);
2516*4882a593Smuzhiyun int wl_get_rssi_per_ant(struct net_device *dev, char *ifname, char *peer_mac, void *param);
2517*4882a593Smuzhiyun #endif /* SUPPORT_RSSI_SUM_REPORT */
2518*4882a593Smuzhiyun int wl_cfg80211_iface_count(struct net_device *dev);
2519*4882a593Smuzhiyun struct net_device* wl_get_ap_netdev(struct bcm_cfg80211 *cfg, char *ifname);
2520*4882a593Smuzhiyun void wl_cfg80211_cleanup_virtual_ifaces(struct bcm_cfg80211 *cfg, bool rtnl_lock_reqd);
2521*4882a593Smuzhiyun #ifdef WL_IFACE_MGMT
2522*4882a593Smuzhiyun extern int wl_cfg80211_set_iface_policy(struct net_device *ndev, char *arg, int len);
2523*4882a593Smuzhiyun extern uint8 wl_cfg80211_get_iface_policy(struct net_device *ndev);
2524*4882a593Smuzhiyun extern s32 wl_cfg80211_handle_if_role_conflict(struct bcm_cfg80211 *cfg, wl_iftype_t new_wl_iftype);
2525*4882a593Smuzhiyun s32 wl_cfg80211_data_if_mgmt(struct bcm_cfg80211 *cfg, wl_iftype_t new_wl_iftype);
2526*4882a593Smuzhiyun s32 wl_cfg80211_disc_if_mgmt(struct bcm_cfg80211 *cfg, wl_iftype_t new_wl_iftype,
2527*4882a593Smuzhiyun 	bool *disable_nan, bool *disable_p2p);
2528*4882a593Smuzhiyun s32 wl_cfg80211_handle_discovery_config(struct bcm_cfg80211 *cfg, wl_iftype_t new_wl_iftype);
2529*4882a593Smuzhiyun wl_iftype_t wl_cfg80211_get_sec_iface(struct bcm_cfg80211 *cfg);
2530*4882a593Smuzhiyun bool wl_cfg80211_is_associated_discovery(struct bcm_cfg80211 *cfg, wl_iftype_t new_wl_iftype);
2531*4882a593Smuzhiyun #endif /* WL_IFACE_MGMT */
2532*4882a593Smuzhiyun struct wireless_dev * wl_cfg80211_add_if(struct bcm_cfg80211 *cfg, struct net_device *primary_ndev,
2533*4882a593Smuzhiyun 	wl_iftype_t wl_iftype, const char *name, u8 *mac);
2534*4882a593Smuzhiyun extern s32 wl_cfg80211_del_if(struct bcm_cfg80211 *cfg, struct net_device *primary_ndev,
2535*4882a593Smuzhiyun 	struct wireless_dev *wdev, char *name);
2536*4882a593Smuzhiyun s32 _wl_cfg80211_del_if(struct bcm_cfg80211 *cfg, struct net_device *primary_ndev,
2537*4882a593Smuzhiyun 	struct wireless_dev *wdev, char *ifname);
2538*4882a593Smuzhiyun s32 wl_cfg80211_delete_iface(struct bcm_cfg80211 *cfg, wl_iftype_t sec_data_if_type);
2539*4882a593Smuzhiyun s32 wl_cfg80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev, bool enabled, s32 timeout);
2540*4882a593Smuzhiyun 
2541*4882a593Smuzhiyun #ifdef WL_STATIC_IF
2542*4882a593Smuzhiyun extern struct net_device *wl_cfg80211_register_static_if(struct bcm_cfg80211 *cfg,
2543*4882a593Smuzhiyun 	u16 iftype, char *ifname, int ifidx);
2544*4882a593Smuzhiyun extern void wl_cfg80211_unregister_static_if(struct bcm_cfg80211 * cfg);
2545*4882a593Smuzhiyun extern s32 wl_cfg80211_static_if_open(struct net_device *net);
2546*4882a593Smuzhiyun extern s32 wl_cfg80211_static_if_close(struct net_device *net);
2547*4882a593Smuzhiyun extern struct net_device * wl_cfg80211_post_static_ifcreate(struct bcm_cfg80211 *cfg,
2548*4882a593Smuzhiyun 	wl_if_event_info *event, u8 *addr, s32 iface_type, const char *iface_name);
2549*4882a593Smuzhiyun extern s32 wl_cfg80211_post_static_ifdel(struct bcm_cfg80211 *cfg, struct net_device *ndev);
2550*4882a593Smuzhiyun #endif  /* WL_STATIC_IF */
2551*4882a593Smuzhiyun extern struct wireless_dev *wl_cfg80211_get_wdev_from_ifname(struct bcm_cfg80211 *cfg,
2552*4882a593Smuzhiyun 	const char *name);
2553*4882a593Smuzhiyun struct net_device* wl_get_netdev_by_name(struct bcm_cfg80211 *cfg, char *ifname);
2554*4882a593Smuzhiyun extern s32 wl_get_vif_macaddr(struct bcm_cfg80211 *cfg, u16 wl_iftype, u8 *mac_addr);
2555*4882a593Smuzhiyun extern s32 wl_release_vif_macaddr(struct bcm_cfg80211 *cfg, u8 *mac_addr, u16 wl_iftype);
2556*4882a593Smuzhiyun extern int wl_cfg80211_ifstats_counters(struct net_device *dev, wl_if_stats_t *if_stats);
2557*4882a593Smuzhiyun extern s32 wl_cfg80211_set_dbg_verbose(struct net_device *ndev, u32 level);
2558*4882a593Smuzhiyun extern s32 wl_cfg80211_set_transition_mode(struct net_device *ndev, u32 transition_disabled);
2559*4882a593Smuzhiyun extern int wl_cfg80211_deinit_p2p_discovery(struct bcm_cfg80211 * cfg);
2560*4882a593Smuzhiyun extern int wl_cfg80211_set_frameburst(struct bcm_cfg80211 *cfg, bool enable);
2561*4882a593Smuzhiyun extern int wl_cfg80211_determine_p2p_rsdb_mode(struct bcm_cfg80211 *cfg);
2562*4882a593Smuzhiyun extern uint8 wl_cfg80211_get_bus_state(struct bcm_cfg80211 *cfg);
2563*4882a593Smuzhiyun #ifdef WL_WPS_SYNC
2564*4882a593Smuzhiyun void wl_handle_wps_states(struct net_device *ndev, u8 *dump_data, u16 len, bool direction);
2565*4882a593Smuzhiyun #endif /* WL_WPS_SYNC */
2566*4882a593Smuzhiyun extern int wl_features_set(u8 *array, uint8 len, u32 ftidx);
2567*4882a593Smuzhiyun extern void *wl_read_prof(struct bcm_cfg80211 *cfg, struct net_device *ndev, s32 item);
2568*4882a593Smuzhiyun extern s32 wl_cfg80211_sup_event_handler(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev,
2569*4882a593Smuzhiyun         const wl_event_msg_t *event, void *data);
2570*4882a593Smuzhiyun extern s32 wl_inform_bss(struct bcm_cfg80211 *cfg);
2571*4882a593Smuzhiyun extern void wl_cfg80211_cancel_scan(struct bcm_cfg80211 *cfg);
2572*4882a593Smuzhiyun extern s32 wl_notify_escan_complete(struct bcm_cfg80211 *cfg,
2573*4882a593Smuzhiyun 	struct net_device *ndev, bool aborted, bool fw_abort);
2574*4882a593Smuzhiyun #ifdef CUSTOMER_HW4_DEBUG
2575*4882a593Smuzhiyun extern void wl_scan_timeout_dbg_clear(void);
2576*4882a593Smuzhiyun #endif /* CUSTOMER_HW4_DEBUG */
2577*4882a593Smuzhiyun extern s32 cfg80211_to_wl_iftype(uint16 type, uint16 *role, uint16 *mode);
2578*4882a593Smuzhiyun extern s32 wl_cfg80211_net_attach(struct net_device *primary_ndev);
2579*4882a593Smuzhiyun extern void wl_print_verinfo(struct bcm_cfg80211 *cfg);
2580*4882a593Smuzhiyun extern const u8 *wl_find_attribute(const u8 *buf, u16 len, u16 element_id);
2581*4882a593Smuzhiyun extern int wl_cfg80211_get_concurrency_mode(struct bcm_cfg80211 *cfg);
2582*4882a593Smuzhiyun #if defined(WL_DISABLE_HE_SOFTAP) || defined(WL_DISABLE_HE_P2P)
2583*4882a593Smuzhiyun int wl_cfg80211_set_he_mode(struct net_device *dev, struct bcm_cfg80211 *cfg,
2584*4882a593Smuzhiyun 		s32 bssidx, u32 interface_type, bool set);
2585*4882a593Smuzhiyun #define WL_HE_FEATURES_HE_AP		0x8
2586*4882a593Smuzhiyun #define WL_HE_FEATURES_HE_P2P		0x20
2587*4882a593Smuzhiyun #endif /* WL_DISABLE_HE_SOFTAP || WL_DISABLE_HE_P2P */
2588*4882a593Smuzhiyun extern s32 wl_cfg80211_config_suspend_events(struct net_device *ndev, bool enable);
2589*4882a593Smuzhiyun #ifdef WL11U
2590*4882a593Smuzhiyun extern bcm_tlv_t *
2591*4882a593Smuzhiyun wl_cfg80211_find_interworking_ie(const u8 *parse, u32 len);
2592*4882a593Smuzhiyun extern s32
2593*4882a593Smuzhiyun wl_cfg80211_add_iw_ie(struct bcm_cfg80211 *cfg, struct net_device *ndev, s32 bssidx, s32 pktflag,
2594*4882a593Smuzhiyun 		uint8 ie_id, uint8 *data, uint8 data_len);
2595*4882a593Smuzhiyun extern s32
2596*4882a593Smuzhiyun wl_cfg80211_clear_iw_ie(struct bcm_cfg80211 *cfg, struct net_device *ndev, s32 bssidx);
2597*4882a593Smuzhiyun 
2598*4882a593Smuzhiyun static inline void
wl_get_iwdata_by_netdev(struct bcm_cfg80211 * cfg,struct net_device * ndev,u8 * iw_ie,u32 * iw_ie_len)2599*4882a593Smuzhiyun wl_get_iwdata_by_netdev(struct bcm_cfg80211 *cfg, struct net_device *ndev, u8 *iw_ie,
2600*4882a593Smuzhiyun 		u32 *iw_ie_len)
2601*4882a593Smuzhiyun {
2602*4882a593Smuzhiyun 	struct net_info *_net_info, *next;
2603*4882a593Smuzhiyun 	unsigned long int flags;
2604*4882a593Smuzhiyun 
2605*4882a593Smuzhiyun 	spin_lock_irqsave(&cfg->net_list_sync, flags);
2606*4882a593Smuzhiyun 	GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
2607*4882a593Smuzhiyun 	BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
2608*4882a593Smuzhiyun 		GCC_DIAGNOSTIC_POP();
2609*4882a593Smuzhiyun 		if (ndev && (_net_info->ndev == ndev)) {
2610*4882a593Smuzhiyun 			*iw_ie_len = _net_info->profile.iw_ie_len;
2611*4882a593Smuzhiyun 			memcpy(iw_ie, _net_info->profile.iw_ie, _net_info->profile.iw_ie_len);
2612*4882a593Smuzhiyun 			break;
2613*4882a593Smuzhiyun 		}
2614*4882a593Smuzhiyun 	}
2615*4882a593Smuzhiyun 	spin_unlock_irqrestore(&cfg->net_list_sync, flags);
2616*4882a593Smuzhiyun }
2617*4882a593Smuzhiyun 
2618*4882a593Smuzhiyun static inline void
wl_set_iwdata_by_netdev(struct bcm_cfg80211 * cfg,struct net_device * ndev,u8 * iw_ie,u32 iw_ie_len)2619*4882a593Smuzhiyun wl_set_iwdata_by_netdev(struct bcm_cfg80211 *cfg, struct net_device *ndev, u8 *iw_ie, u32 iw_ie_len)
2620*4882a593Smuzhiyun {
2621*4882a593Smuzhiyun 	struct net_info *_net_info, *next;
2622*4882a593Smuzhiyun 	unsigned long int flags;
2623*4882a593Smuzhiyun 
2624*4882a593Smuzhiyun 	spin_lock_irqsave(&cfg->net_list_sync, flags);
2625*4882a593Smuzhiyun 	GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
2626*4882a593Smuzhiyun 	BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
2627*4882a593Smuzhiyun 		GCC_DIAGNOSTIC_POP();
2628*4882a593Smuzhiyun 		if (ndev && (_net_info->ndev == ndev)) {
2629*4882a593Smuzhiyun 			_net_info->profile.iw_ie_len = iw_ie_len;
2630*4882a593Smuzhiyun 			memcpy(_net_info->profile.iw_ie, iw_ie, _net_info->profile.iw_ie_len);
2631*4882a593Smuzhiyun 		}
2632*4882a593Smuzhiyun 	}
2633*4882a593Smuzhiyun 	spin_unlock_irqrestore(&cfg->net_list_sync, flags);
2634*4882a593Smuzhiyun }
2635*4882a593Smuzhiyun 
2636*4882a593Smuzhiyun static inline void
wl_clear_iwdata_by_netdev(struct bcm_cfg80211 * cfg,struct net_device * ndev)2637*4882a593Smuzhiyun wl_clear_iwdata_by_netdev(struct bcm_cfg80211 *cfg, struct net_device *ndev)
2638*4882a593Smuzhiyun {
2639*4882a593Smuzhiyun 	struct net_info *_net_info, *next;
2640*4882a593Smuzhiyun 	unsigned long int flags;
2641*4882a593Smuzhiyun 
2642*4882a593Smuzhiyun 	spin_lock_irqsave(&cfg->net_list_sync, flags);
2643*4882a593Smuzhiyun 	GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
2644*4882a593Smuzhiyun 	BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
2645*4882a593Smuzhiyun 		GCC_DIAGNOSTIC_POP();
2646*4882a593Smuzhiyun 		if (ndev && (_net_info->ndev == ndev)) {
2647*4882a593Smuzhiyun 			_net_info->profile.iw_ie_len = 0;
2648*4882a593Smuzhiyun 			memset(_net_info->profile.iw_ie, 0, IW_IES_MAX_BUF_LEN);
2649*4882a593Smuzhiyun 		}
2650*4882a593Smuzhiyun 	}
2651*4882a593Smuzhiyun 	spin_unlock_irqrestore(&cfg->net_list_sync, flags);
2652*4882a593Smuzhiyun }
2653*4882a593Smuzhiyun 
2654*4882a593Smuzhiyun static inline void
wl_clear_iwdata(struct bcm_cfg80211 * cfg)2655*4882a593Smuzhiyun wl_clear_iwdata(struct bcm_cfg80211 *cfg)
2656*4882a593Smuzhiyun {
2657*4882a593Smuzhiyun 	struct net_info *_net_info, *next;
2658*4882a593Smuzhiyun 	unsigned long int flags;
2659*4882a593Smuzhiyun 	spin_lock_irqsave(&cfg->net_list_sync, flags);
2660*4882a593Smuzhiyun 	GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
2661*4882a593Smuzhiyun 	BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next,
2662*4882a593Smuzhiyun 			&cfg->net_list, list) {
2663*4882a593Smuzhiyun 		GCC_DIAGNOSTIC_POP();
2664*4882a593Smuzhiyun 		if (_net_info->profile.iw_ie_len) {
2665*4882a593Smuzhiyun 			_net_info->profile.iw_ie_len = 0;
2666*4882a593Smuzhiyun 			memset(_net_info->profile.iw_ie, 0, IW_IES_MAX_BUF_LEN);
2667*4882a593Smuzhiyun 		}
2668*4882a593Smuzhiyun 	}
2669*4882a593Smuzhiyun 	spin_unlock_irqrestore(&cfg->net_list_sync, flags);
2670*4882a593Smuzhiyun 	return;
2671*4882a593Smuzhiyun }
2672*4882a593Smuzhiyun #endif /* WL11U */
2673*4882a593Smuzhiyun #endif /* _wl_cfg80211_h_ */
2674