1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Linux cfg80211 driver
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Copyright (C) 2020, Broadcom.
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * Unless you and Broadcom execute a separate written software license
7*4882a593Smuzhiyun * agreement governing use of this software, this software is licensed to you
8*4882a593Smuzhiyun * under the terms of the GNU General Public License version 2 (the "GPL"),
9*4882a593Smuzhiyun * available at http://www.broadcom.com/licenses/GPLv2.php, with the
10*4882a593Smuzhiyun * following added to such license:
11*4882a593Smuzhiyun *
12*4882a593Smuzhiyun * As a special exception, the copyright holders of this software give you
13*4882a593Smuzhiyun * permission to link this software with independent modules, and to copy and
14*4882a593Smuzhiyun * distribute the resulting executable under terms of your choice, provided that
15*4882a593Smuzhiyun * you also meet, for each linked independent module, the terms and conditions of
16*4882a593Smuzhiyun * the license of that module. An independent module is a module which is not
17*4882a593Smuzhiyun * derived from this software. The special exception does not apply to any
18*4882a593Smuzhiyun * modifications of the software.
19*4882a593Smuzhiyun *
20*4882a593Smuzhiyun *
21*4882a593Smuzhiyun * <<Broadcom-WL-IPTag/Dual:>>
22*4882a593Smuzhiyun */
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun /**
25*4882a593Smuzhiyun * Older Linux versions support the 'iw' interface, more recent ones the 'cfg80211' interface.
26*4882a593Smuzhiyun */
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun #ifndef _wl_cfg80211_h_
29*4882a593Smuzhiyun #define _wl_cfg80211_h_
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun #include <linux/wireless.h>
32*4882a593Smuzhiyun #include <typedefs.h>
33*4882a593Smuzhiyun #include <ethernet.h>
34*4882a593Smuzhiyun #include <wlioctl.h>
35*4882a593Smuzhiyun #include <linux/wireless.h>
36*4882a593Smuzhiyun #include <net/cfg80211.h>
37*4882a593Smuzhiyun #include <linux/rfkill.h>
38*4882a593Smuzhiyun #include <osl.h>
39*4882a593Smuzhiyun #if defined(BCMDONGLEHOST)
40*4882a593Smuzhiyun #include <dngl_stats.h>
41*4882a593Smuzhiyun #include <dhd.h>
42*4882a593Smuzhiyun #endif /* BCMDONGLEHOST */
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun #define WL_CFG_DRV_LOCK(lock, flags) (flags) = osl_spin_lock(lock)
45*4882a593Smuzhiyun #define WL_CFG_DRV_UNLOCK(lock, flags) osl_spin_unlock((lock), (flags))
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun #define WL_CFG_WPS_SYNC_LOCK(lock, flags) (flags) = osl_spin_lock(lock)
48*4882a593Smuzhiyun #define WL_CFG_WPS_SYNC_UNLOCK(lock, flags) osl_spin_unlock((lock), (flags))
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun #define WL_CFG_NET_LIST_SYNC_LOCK(lock, flags) (flags) = osl_spin_lock(lock)
51*4882a593Smuzhiyun #define WL_CFG_NET_LIST_SYNC_UNLOCK(lock, flags) osl_spin_unlock((lock), (flags))
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun #define WL_CFG_EQ_LOCK(lock, flags) (flags) = osl_spin_lock(lock)
54*4882a593Smuzhiyun #define WL_CFG_EQ_UNLOCK(lock, flags) osl_spin_unlock((lock), (flags))
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun #define WL_CFG_BAM_LOCK(lock, flags) (flags) = osl_spin_lock(lock)
57*4882a593Smuzhiyun #define WL_CFG_BAM_UNLOCK(lock, flags) osl_spin_unlock((lock), (flags))
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun #define WL_CFG_VNDR_OUI_SYNC_LOCK(lock, flags) (flags) = osl_spin_lock(lock)
60*4882a593Smuzhiyun #define WL_CFG_VNDR_OUI_SYNC_UNLOCK(lock, flags) osl_spin_unlock((lock), (flags))
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun #include <wl_cfgp2p.h>
63*4882a593Smuzhiyun #include <wl_android.h>
64*4882a593Smuzhiyun #ifdef WL_NAN
65*4882a593Smuzhiyun #include <wl_cfgnan.h>
66*4882a593Smuzhiyun #endif /* WL_NAN */
67*4882a593Smuzhiyun #ifdef WL_BAM
68*4882a593Smuzhiyun #include <wl_bam.h>
69*4882a593Smuzhiyun #endif /* WL_BAM */
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun #ifdef BIGDATA_SOFTAP
72*4882a593Smuzhiyun #include <wl_bigdata.h>
73*4882a593Smuzhiyun #endif /* BIGDATA_SOFTAP */
74*4882a593Smuzhiyun #include <dhd_dbg.h>
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun struct wl_conf;
77*4882a593Smuzhiyun struct wl_iface;
78*4882a593Smuzhiyun struct bcm_cfg80211;
79*4882a593Smuzhiyun struct wl_security;
80*4882a593Smuzhiyun struct wl_ibss;
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun /* Enable by default */
83*4882a593Smuzhiyun #define WL_WTC
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun /*
86*4882a593Smuzhiyun * Common feature. If this becomes customer specific,
87*4882a593Smuzhiyun * move it to customer specific makefile when required
88*4882a593Smuzhiyun */
89*4882a593Smuzhiyun #define WL_5G_SOFTAP_ONLY_ON_DEF_CHAN
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun #if !defined(WL_CLIENT_SAE) && (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 17, 0))
92*4882a593Smuzhiyun #define WL_CLIENT_SAE
93*4882a593Smuzhiyun #endif
94*4882a593Smuzhiyun #if defined(WL_SAE) && (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0))
95*4882a593Smuzhiyun #error "Can not support WL_SAE befor kernel 3.14"
96*4882a593Smuzhiyun #endif
97*4882a593Smuzhiyun #if defined(WL_CLIENT_SAE) && (LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0))
98*4882a593Smuzhiyun #error "Can not support WL_CLIENT_SAE before kernel 3.10"
99*4882a593Smuzhiyun #endif
100*4882a593Smuzhiyun #if defined(WL_CLIENT_SAE) && defined(WL_SAE)
101*4882a593Smuzhiyun #error "WL_SAE is for dongle-offload and WL_CLIENT_SAE is for wpa_supplicant. Please choose one."
102*4882a593Smuzhiyun #endif
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 17, 0) && !defined(WL_SCAN_TYPE))
105*4882a593Smuzhiyun #define WL_SCAN_TYPE
106*4882a593Smuzhiyun #endif /* WL_SCAN_TYPE */
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)) && !defined(WL_FILS)
109*4882a593Smuzhiyun #define WL_FILS
110*4882a593Smuzhiyun #endif /* WL_FILS */
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0)) && !defined(WL_FILS_ROAM_OFFLD)
113*4882a593Smuzhiyun #define WL_FILS_ROAM_OFFLD
114*4882a593Smuzhiyun #endif
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0))
117*4882a593Smuzhiyun /* Use driver managed regd */
118*4882a593Smuzhiyun #define WL_SELF_MANAGED_REGDOM
119*4882a593Smuzhiyun #endif /* KERNEL >= 4.0 */
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun #define CH_TO_CHSPC(band, _channel) \
122*4882a593Smuzhiyun ((_channel | band) | WL_CHANSPEC_BW_20 | WL_CHANSPEC_CTL_SB_NONE)
123*4882a593Smuzhiyun #define CHAN2G(_channel, _freq, _flags) { \
124*4882a593Smuzhiyun .band = IEEE80211_BAND_2GHZ, \
125*4882a593Smuzhiyun .center_freq = (_freq), \
126*4882a593Smuzhiyun .hw_value = CH_TO_CHSPC(WL_CHANSPEC_BAND_2G, _channel), \
127*4882a593Smuzhiyun .flags = (_flags), \
128*4882a593Smuzhiyun .max_antenna_gain = 0, \
129*4882a593Smuzhiyun .max_power = 30, \
130*4882a593Smuzhiyun }
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun #define CHAN5G(_channel, _flags) { \
133*4882a593Smuzhiyun .band = IEEE80211_BAND_5GHZ, \
134*4882a593Smuzhiyun .center_freq = 5000 + (5 * (_channel)), \
135*4882a593Smuzhiyun .hw_value = CH_TO_CHSPC(WL_CHANSPEC_BAND_5G, _channel), \
136*4882a593Smuzhiyun .flags = (_flags), \
137*4882a593Smuzhiyun .max_antenna_gain = 0, \
138*4882a593Smuzhiyun .max_power = 30, \
139*4882a593Smuzhiyun }
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun #ifdef CFG80211_6G_SUPPORT
142*4882a593Smuzhiyun #define CHAN6G(_channel, _flags) { \
143*4882a593Smuzhiyun .band = IEEE80211_BAND_6GHZ, \
144*4882a593Smuzhiyun .center_freq = 5950 + (5 * (_channel)), \
145*4882a593Smuzhiyun .hw_value = CH_TO_CHSPC(WL_CHANSPEC_BAND_6G, _channel), \
146*4882a593Smuzhiyun .flags = (_flags), \
147*4882a593Smuzhiyun .max_antenna_gain = 0, \
148*4882a593Smuzhiyun .max_power = 30, \
149*4882a593Smuzhiyun }
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun #define CHAN6G_CHAN2(_flags) { \
152*4882a593Smuzhiyun .band = IEEE80211_BAND_6GHZ, \
153*4882a593Smuzhiyun .center_freq = 5935, \
154*4882a593Smuzhiyun .hw_value = 0x5002, \
155*4882a593Smuzhiyun .flags = (_flags), \
156*4882a593Smuzhiyun .max_antenna_gain = 0, \
157*4882a593Smuzhiyun .max_power = 30, \
158*4882a593Smuzhiyun }
159*4882a593Smuzhiyun #else
160*4882a593Smuzhiyun #define CHAN6G(_channel, _flags) { \
161*4882a593Smuzhiyun .band = IEEE80211_BAND_5GHZ, \
162*4882a593Smuzhiyun .center_freq = 5950 + (5 * (_channel)), \
163*4882a593Smuzhiyun .hw_value = CH_TO_CHSPC(WL_CHANSPEC_BAND_6G, _channel), \
164*4882a593Smuzhiyun .flags = (_flags), \
165*4882a593Smuzhiyun .max_antenna_gain = 0, \
166*4882a593Smuzhiyun .max_power = 30, \
167*4882a593Smuzhiyun }
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun #define CHAN6G_CHAN2(_flags) { \
170*4882a593Smuzhiyun .band = IEEE80211_BAND_5GHZ, \
171*4882a593Smuzhiyun .center_freq = 5935, \
172*4882a593Smuzhiyun .hw_value = 0x5002, \
173*4882a593Smuzhiyun .flags = (_flags), \
174*4882a593Smuzhiyun .max_antenna_gain = 0, \
175*4882a593Smuzhiyun .max_power = 30, \
176*4882a593Smuzhiyun }
177*4882a593Smuzhiyun #endif /* CFG80211_6G_SUPPORT */
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun #ifdef WL_SAE
180*4882a593Smuzhiyun #define IS_AKM_SAE(akm) (akm == WLAN_AKM_SUITE_SAE)
181*4882a593Smuzhiyun #else
182*4882a593Smuzhiyun #define IS_AKM_SAE(akm) FALSE
183*4882a593Smuzhiyun #endif
184*4882a593Smuzhiyun #ifdef WL_OWE
185*4882a593Smuzhiyun #define IS_AKM_OWE(akm) (akm == WLAN_AKM_SUITE_OWE)
186*4882a593Smuzhiyun #else
187*4882a593Smuzhiyun #define IS_AKM_OWE(akm) FALSE
188*4882a593Smuzhiyun #endif
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun #if defined(IL_BIGENDIAN)
191*4882a593Smuzhiyun #include <bcmendian.h>
192*4882a593Smuzhiyun #define htod32(i) (bcmswap32(i))
193*4882a593Smuzhiyun #define htod16(i) (bcmswap16(i))
194*4882a593Smuzhiyun #define dtoh64(i) (bcmswap64(i))
195*4882a593Smuzhiyun #define dtoh32(i) (bcmswap32(i))
196*4882a593Smuzhiyun #define dtoh16(i) (bcmswap16(i))
197*4882a593Smuzhiyun #define htodchanspec(i) htod16(i)
198*4882a593Smuzhiyun #define dtohchanspec(i) dtoh16(i)
199*4882a593Smuzhiyun #else
200*4882a593Smuzhiyun #define htod32(i) (i)
201*4882a593Smuzhiyun #define htod16(i) (i)
202*4882a593Smuzhiyun #define dtoh64(i) (i)
203*4882a593Smuzhiyun #define dtoh32(i) (i)
204*4882a593Smuzhiyun #define dtoh16(i) (i)
205*4882a593Smuzhiyun #define htodchanspec(i) (i)
206*4882a593Smuzhiyun #define dtohchanspec(i) (i)
207*4882a593Smuzhiyun #endif /* IL_BIGENDIAN */
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun #define WL_DBG_NONE 0
210*4882a593Smuzhiyun #define WL_DBG_P2P_ACTION (1 << 5)
211*4882a593Smuzhiyun #define WL_DBG_TRACE (1 << 4)
212*4882a593Smuzhiyun #define WL_DBG_SCAN (1 << 3)
213*4882a593Smuzhiyun #define WL_DBG_DBG (1 << 2)
214*4882a593Smuzhiyun #define WL_DBG_INFO (1 << 1)
215*4882a593Smuzhiyun #define WL_DBG_ERR (1 << 0)
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun #ifndef WAIT_FOR_DISCONNECT_MAX
218*4882a593Smuzhiyun #define WAIT_FOR_DISCONNECT_MAX 10
219*4882a593Smuzhiyun #endif /* WAIT_FOR_DISCONNECT_MAX */
220*4882a593Smuzhiyun #define WAIT_FOR_DISCONNECT_STATE_SYNC 10
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun #if defined(CONFIG_6GHZ_BKPORT) || (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0))
223*4882a593Smuzhiyun /* Native 6GHz band supported available. For Backported
224*4882a593Smuzhiyun * kernels, kernels/customer makefiles should explicitly
225*4882a593Smuzhiyun * define CONFIG_6GHZ_BKPORT
226*4882a593Smuzhiyun */
227*4882a593Smuzhiyun #if defined(WL_6G_BAND)
228*4882a593Smuzhiyun #define CFG80211_6G_SUPPORT
229*4882a593Smuzhiyun #endif
230*4882a593Smuzhiyun #endif /* CONFIG_6GHZ_BKPORT || LINUX_VER >= 5.4 */
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0))
233*4882a593Smuzhiyun /* Newer kernels use defines from nl80211.h */
234*4882a593Smuzhiyun #define IEEE80211_BAND_2GHZ NL80211_BAND_2GHZ
235*4882a593Smuzhiyun #define IEEE80211_BAND_5GHZ NL80211_BAND_5GHZ
236*4882a593Smuzhiyun #define IEEE80211_BAND_60GHZ NL80211_BAND_60GHZ
237*4882a593Smuzhiyun #ifdef CFG80211_6G_SUPPORT
238*4882a593Smuzhiyun #define IEEE80211_BAND_6GHZ NL80211_BAND_6GHZ
239*4882a593Smuzhiyun #endif /* CFG80211_6G_SUPPORT */
240*4882a593Smuzhiyun #define IEEE80211_NUM_BANDS NUM_NL80211_BANDS
241*4882a593Smuzhiyun #endif /* LINUX_VER >= 4.7 */
242*4882a593Smuzhiyun
243*4882a593Smuzhiyun /* Max BAND support */
244*4882a593Smuzhiyun #define WL_MAX_BAND_SUPPORT 3
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun #ifdef DHD_LOG_DUMP
247*4882a593Smuzhiyun extern void dhd_log_dump_write(int type, char *binary_data,
248*4882a593Smuzhiyun int binary_len, const char *fmt, ...);
249*4882a593Smuzhiyun extern char *dhd_log_dump_get_timestamp(void);
250*4882a593Smuzhiyun extern char *dhd_dbg_get_system_timestamp(void);
251*4882a593Smuzhiyun #ifndef _DHD_LOG_DUMP_DEFINITIONS_
252*4882a593Smuzhiyun #define DHD_LOG_DUMP_WRITE(fmt, ...) \
253*4882a593Smuzhiyun dhd_log_dump_write(DLD_BUF_TYPE_GENERAL, NULL, 0, fmt, ##__VA_ARGS__)
254*4882a593Smuzhiyun #define DHD_LOG_DUMP_WRITE_EX(fmt, ...) \
255*4882a593Smuzhiyun dhd_log_dump_write(DLD_BUF_TYPE_SPECIAL, NULL, 0, fmt, ##__VA_ARGS__)
256*4882a593Smuzhiyun #define DHD_LOG_DUMP_WRITE_PRSRV(fmt, ...) \
257*4882a593Smuzhiyun dhd_log_dump_write(DLD_BUF_TYPE_PRESERVE, NULL, 0, fmt, ##__VA_ARGS__)
258*4882a593Smuzhiyun #endif /* !_DHD_LOG_DUMP_DEFINITIONS_ */
259*4882a593Smuzhiyun
260*4882a593Smuzhiyun #ifndef DHD_LOG_DUMP_RING_DEFINITIONS
261*4882a593Smuzhiyun #define DHD_PREFIX_TS "[%s]: ", dhd_log_dump_get_timestamp()
262*4882a593Smuzhiyun #define DHD_PREFIX_TS_FN "[%s] %s: ", dhd_log_dump_get_timestamp(), __func__
263*4882a593Smuzhiyun
264*4882a593Smuzhiyun #define DHD_LOG_DUMP_WRITE_TS DHD_LOG_DUMP_WRITE(DHD_PREFIX_TS)
265*4882a593Smuzhiyun #define DHD_LOG_DUMP_WRITE_TS_FN DHD_LOG_DUMP_WRITE(DHD_PREFIX_TS_FN)
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun #define DHD_LOG_DUMP_WRITE_EX_TS DHD_LOG_DUMP_WRITE_EX(DHD_PREFIX_TS)
268*4882a593Smuzhiyun #define DHD_LOG_DUMP_WRITE_EX_TS_FN DHD_LOG_DUMP_WRITE_EX(DHD_PREFIX_TS_FN)
269*4882a593Smuzhiyun
270*4882a593Smuzhiyun #define DHD_LOG_DUMP_WRITE_PRSRV_TS DHD_LOG_DUMP_WRITE_PRSRV(DHD_PREFIX_TS)
271*4882a593Smuzhiyun #define DHD_LOG_DUMP_WRITE_PRSRV_TS_FN DHD_LOG_DUMP_WRITE_PRSRV(DHD_PREFIX_TS_FN)
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun #define DHD_LOG_DUMP_WRITE_ROAM_TS DHD_LOG_DUMP_WRITE(DHD_PREFIX_TS)
274*4882a593Smuzhiyun #define DHD_LOG_DUMP_WRITE_ROAM_TS_FN DHD_LOG_DUMP_WRITE(DHD_PREFIX_TS_FN)
275*4882a593Smuzhiyun #endif /* DHD_LOG_DUMP_RING_DEFINITIONS */
276*4882a593Smuzhiyun #endif /* DHD_LOG_DUMP */
277*4882a593Smuzhiyun
278*4882a593Smuzhiyun /* Data Element Definitions */
279*4882a593Smuzhiyun #define WPS_ID_CONFIG_METHODS 0x1008
280*4882a593Smuzhiyun #define WPS_ID_REQ_TYPE 0x103A
281*4882a593Smuzhiyun #define WPS_ID_DEVICE_NAME 0x1011
282*4882a593Smuzhiyun #define WPS_ID_VERSION 0x104A
283*4882a593Smuzhiyun #define WPS_ID_DEVICE_PWD_ID 0x1012
284*4882a593Smuzhiyun #define WPS_ID_REQ_DEV_TYPE 0x106A
285*4882a593Smuzhiyun #define WPS_ID_SELECTED_REGISTRAR_CONFIG_METHODS 0x1053
286*4882a593Smuzhiyun #define WPS_ID_PRIM_DEV_TYPE 0x1054
287*4882a593Smuzhiyun
288*4882a593Smuzhiyun /* Device Password ID */
289*4882a593Smuzhiyun #define DEV_PW_DEFAULT 0x0000
290*4882a593Smuzhiyun #define DEV_PW_USER_SPECIFIED 0x0001,
291*4882a593Smuzhiyun #define DEV_PW_MACHINE_SPECIFIED 0x0002
292*4882a593Smuzhiyun #define DEV_PW_REKEY 0x0003
293*4882a593Smuzhiyun #define DEV_PW_PUSHBUTTON 0x0004
294*4882a593Smuzhiyun #define DEV_PW_REGISTRAR_SPECIFIED 0x0005
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun /* Config Methods */
297*4882a593Smuzhiyun #define WPS_CONFIG_USBA 0x0001
298*4882a593Smuzhiyun #define WPS_CONFIG_ETHERNET 0x0002
299*4882a593Smuzhiyun #define WPS_CONFIG_LABEL 0x0004
300*4882a593Smuzhiyun #define WPS_CONFIG_DISPLAY 0x0008
301*4882a593Smuzhiyun #define WPS_CONFIG_EXT_NFC_TOKEN 0x0010
302*4882a593Smuzhiyun #define WPS_CONFIG_INT_NFC_TOKEN 0x0020
303*4882a593Smuzhiyun #define WPS_CONFIG_NFC_INTERFACE 0x0040
304*4882a593Smuzhiyun #define WPS_CONFIG_PUSHBUTTON 0x0080
305*4882a593Smuzhiyun #define WPS_CONFIG_KEYPAD 0x0100
306*4882a593Smuzhiyun #define WPS_CONFIG_VIRT_PUSHBUTTON 0x0280
307*4882a593Smuzhiyun #define WPS_CONFIG_PHY_PUSHBUTTON 0x0480
308*4882a593Smuzhiyun #define WPS_CONFIG_VIRT_DISPLAY 0x2008
309*4882a593Smuzhiyun #define WPS_CONFIG_PHY_DISPLAY 0x4008
310*4882a593Smuzhiyun
311*4882a593Smuzhiyun #define PM_BLOCK 1
312*4882a593Smuzhiyun #define PM_ENABLE 0
313*4882a593Smuzhiyun
314*4882a593Smuzhiyun #ifdef SUPPORT_AP_RADIO_PWRSAVE
315*4882a593Smuzhiyun #define RADIO_PWRSAVE_PPS 10
316*4882a593Smuzhiyun #define RADIO_PWRSAVE_QUIET_TIME 10
317*4882a593Smuzhiyun #define RADIO_PWRSAVE_LEVEL 3
318*4882a593Smuzhiyun #define RADIO_PWRSAVE_STAS_ASSOC_CHECK 0
319*4882a593Smuzhiyun
320*4882a593Smuzhiyun #define RADIO_PWRSAVE_LEVEL_MIN 1
321*4882a593Smuzhiyun #define RADIO_PWRSAVE_LEVEL_MAX 9
322*4882a593Smuzhiyun #define RADIO_PWRSAVE_PPS_MIN 1
323*4882a593Smuzhiyun #define RADIO_PWRSAVE_QUIETTIME_MIN 1
324*4882a593Smuzhiyun #define RADIO_PWRSAVE_ASSOCCHECK_MIN 0
325*4882a593Smuzhiyun #define RADIO_PWRSAVE_ASSOCCHECK_MAX 1
326*4882a593Smuzhiyun
327*4882a593Smuzhiyun #define RADIO_PWRSAVE_MAJOR_VER 1
328*4882a593Smuzhiyun #define RADIO_PWRSAVE_MINOR_VER 1
329*4882a593Smuzhiyun #define RADIO_PWRSAVE_MAJOR_VER_SHIFT 8
330*4882a593Smuzhiyun #define RADIO_PWRSAVE_VERSION \
331*4882a593Smuzhiyun ((RADIO_PWRSAVE_MAJOR_VER << RADIO_PWRSAVE_MAJOR_VER_SHIFT)| RADIO_PWRSAVE_MINOR_VER)
332*4882a593Smuzhiyun #endif /* SUPPORT_AP_RADIO_PWRSAVE */
333*4882a593Smuzhiyun
334*4882a593Smuzhiyun #ifdef BCMWAPI_WPI
335*4882a593Smuzhiyun #ifdef CFG80211_WAPI_BKPORT
336*4882a593Smuzhiyun #define IS_WAPI_VER(version) (version == NL80211_WAPI_VERSION_1)
337*4882a593Smuzhiyun #undef WLAN_AKM_SUITE_WAPI_PSK
338*4882a593Smuzhiyun #define WLAN_AKM_SUITE_WAPI_PSK 0x000FAC13
339*4882a593Smuzhiyun #undef WLAN_AKM_SUITE_WAPI_CERT
340*4882a593Smuzhiyun #define WLAN_AKM_SUITE_WAPI_CERT 0x000FAC14
341*4882a593Smuzhiyun #else
342*4882a593Smuzhiyun #ifdef OEM_ANDROID
343*4882a593Smuzhiyun #undef NL80211_WAPI_VERSION_1
344*4882a593Smuzhiyun #define NL80211_WAPI_VERSION_1 0
345*4882a593Smuzhiyun
346*4882a593Smuzhiyun #undef WLAN_AKM_SUITE_WAPI_PSK
347*4882a593Smuzhiyun #define WLAN_AKM_SUITE_WAPI_PSK 0x000FACFE /* WAPI */
348*4882a593Smuzhiyun
349*4882a593Smuzhiyun #undef WLAN_AKM_SUITE_WAPI_CERT
350*4882a593Smuzhiyun #define WLAN_AKM_SUITE_WAPI_CERT 0x000FACFF /* WAPI */
351*4882a593Smuzhiyun
352*4882a593Smuzhiyun #define IS_WAPI_VER(version) (version == NL80211_WAPI_VERSION_1)
353*4882a593Smuzhiyun #else
354*4882a593Smuzhiyun #undef WLAN_AKM_SUITE_WAPI_PSK
355*4882a593Smuzhiyun #define WLAN_AKM_SUITE_WAPI_PSK 0x000FAC04
356*4882a593Smuzhiyun
357*4882a593Smuzhiyun #undef WLAN_AKM_SUITE_WAPI_CERT
358*4882a593Smuzhiyun #define WLAN_AKM_SUITE_WAPI_CERT 0x000FAC12
359*4882a593Smuzhiyun
360*4882a593Smuzhiyun #undef NL80211_WAPI_VERSION_1
361*4882a593Smuzhiyun #define NL80211_WAPI_VERSION_1 1 << 2
362*4882a593Smuzhiyun #define IS_WAPI_VER(version) (version & NL80211_WAPI_VERSION_1)
363*4882a593Smuzhiyun #endif /* OEM_ANDROID */
364*4882a593Smuzhiyun #endif /* CFG80211_WAPI_BKPORT */
365*4882a593Smuzhiyun #endif /* BCMWAPI_WPI */
366*4882a593Smuzhiyun
367*4882a593Smuzhiyun #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0))
368*4882a593Smuzhiyun #define IS_REGDOM_SELF_MANAGED(wiphy) \
369*4882a593Smuzhiyun (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED)
370*4882a593Smuzhiyun #else
371*4882a593Smuzhiyun #define IS_REGDOM_SELF_MANAGED(wiphy) (false)
372*4882a593Smuzhiyun #endif /* KERNEL >= 4.0 */
373*4882a593Smuzhiyun
374*4882a593Smuzhiyun #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)) && \
375*4882a593Smuzhiyun defined(WL_SELF_MANAGED_REGDOM)
376*4882a593Smuzhiyun #define WL_UPDATE_CUSTOM_REGULATORY(wiphy) \
377*4882a593Smuzhiyun wiphy->regulatory_flags |= REGULATORY_WIPHY_SELF_MANAGED;
378*4882a593Smuzhiyun #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0))
379*4882a593Smuzhiyun #define WL_UPDATE_CUSTOM_REGULATORY(wiphy) \
380*4882a593Smuzhiyun wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG;
381*4882a593Smuzhiyun #else /* kernel > 4.0 && WL_SELF_MANAGED_REGDOM */
382*4882a593Smuzhiyun /* Kernels < 3.14 */
383*4882a593Smuzhiyun #define WL_UPDATE_CUSTOM_REGULATORY(wiphy) \
384*4882a593Smuzhiyun wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY;
385*4882a593Smuzhiyun #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) */
386*4882a593Smuzhiyun
387*4882a593Smuzhiyun /* GCMP crypto supported above kernel v4.0 */
388*4882a593Smuzhiyun #if (LINUX_VERSION_CODE > KERNEL_VERSION(4, 0, 0)) && defined(WL_GCMP_SUPPORT)
389*4882a593Smuzhiyun /* Check for minimal kernel version before enabling WL_GCMP */
390*4882a593Smuzhiyun #define WL_GCMP
391*4882a593Smuzhiyun #endif /* (LINUX_VERSION > KERNEL_VERSION(4, 0, 0) && WL_GCMP_SUPPORT */
392*4882a593Smuzhiyun
393*4882a593Smuzhiyun #ifndef IBSS_COALESCE_ALLOWED
394*4882a593Smuzhiyun #define IBSS_COALESCE_ALLOWED IBSS_COALESCE_DEFAULT
395*4882a593Smuzhiyun #endif
396*4882a593Smuzhiyun
397*4882a593Smuzhiyun #ifndef IBSS_INITIAL_SCAN_ALLOWED
398*4882a593Smuzhiyun #define IBSS_INITIAL_SCAN_ALLOWED IBSS_INITIAL_SCAN_ALLOWED_DEFAULT
399*4882a593Smuzhiyun #endif
400*4882a593Smuzhiyun
401*4882a593Smuzhiyun #define CUSTOM_RETRY_MASK 0xff000000 /* Mask for retry counter of custom dwell time */
402*4882a593Smuzhiyun
403*4882a593Smuzhiyun /* On some MSM platform, it uses different version
404*4882a593Smuzhiyun * of linux kernel and cfg code as not synced.
405*4882a593Smuzhiyun * MSM defined CFG80211_DISCONNECTED_V2 as the flag
406*4882a593Smuzhiyun * when they uses different kernel/cfg version.
407*4882a593Smuzhiyun */
408*4882a593Smuzhiyun #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)) || \
409*4882a593Smuzhiyun (defined(CONFIG_ARCH_MSM) && defined(CFG80211_DISCONNECTED_V2))
410*4882a593Smuzhiyun #define CFG80211_DISCONNECTED(dev, reason, ie, len, loc_gen, gfp) \
411*4882a593Smuzhiyun cfg80211_disconnected(dev, reason, ie, len, loc_gen, gfp);
412*4882a593Smuzhiyun #elif (LINUX_VERSION_CODE < KERNEL_VERSION(4, 2, 0))
413*4882a593Smuzhiyun #define CFG80211_DISCONNECTED(dev, reason, ie, len, loc_gen, gfp) \
414*4882a593Smuzhiyun BCM_REFERENCE(loc_gen); \
415*4882a593Smuzhiyun cfg80211_disconnected(dev, reason, ie, len, gfp);
416*4882a593Smuzhiyun #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)) */
417*4882a593Smuzhiyun
418*4882a593Smuzhiyun /* 0 invalidates all debug messages. default is 1 */
419*4882a593Smuzhiyun #define WL_DBG_LEVEL 0xFF
420*4882a593Smuzhiyun
421*4882a593Smuzhiyun #if defined(CUSTOMER_DBG_SYSTEM_TIME) && defined(DHD_DEBUGABILITY_LOG_DUMP_RING)
422*4882a593Smuzhiyun #define WL_DBG_PRINT_SYSTEM_TIME \
423*4882a593Smuzhiyun pr_cont("[%s]", dhd_dbg_get_system_timestamp())
424*4882a593Smuzhiyun #else
425*4882a593Smuzhiyun #define WL_DBG_PRINT_SYSTEM_TIME
426*4882a593Smuzhiyun #endif /* defined(CUSTOMER_DBG_SYSTEM_TIME) && defined(DHD_DEBUGABILITY_LOG_DUMP_RING) */
427*4882a593Smuzhiyun
428*4882a593Smuzhiyun #if defined(CUSTOMER_DBG_PREFIX_ENABLE)
429*4882a593Smuzhiyun #define USER_PREFIX_CFG80211 "[cfg80211][wlan] "
430*4882a593Smuzhiyun #define CFG80211_INFO_TEXT USER_PREFIX_CFG80211
431*4882a593Smuzhiyun #define CFG80211_ERROR_TEXT USER_PREFIX_CFG80211
432*4882a593Smuzhiyun #define CFG80211_SCAN_TEXT USER_PREFIX_CFG80211
433*4882a593Smuzhiyun #define CFG80211_TRACE_TEXT USER_PREFIX_CFG80211
434*4882a593Smuzhiyun #define CFG80211_DEBUG_TEXT USER_PREFIX_CFG80211
435*4882a593Smuzhiyun #else
436*4882a593Smuzhiyun #define CFG80211_INFO_TEXT "CFG80211-INFO) "
437*4882a593Smuzhiyun /* Samsung want to print INFO2 instead of ERROR
438*4882a593Smuzhiyun * because most of case, ERROR message is not a real ERROR.
439*4882a593Smuzhiyun * but it can be regarded as real error case for Tester
440*4882a593Smuzhiyun */
441*4882a593Smuzhiyun #ifdef CUSTOMER_HW4_DEBUG
442*4882a593Smuzhiyun #define CFG80211_ERROR_TEXT "CFG80211-INFO2) "
443*4882a593Smuzhiyun #else
444*4882a593Smuzhiyun #define CFG80211_ERROR_TEXT "CFG80211-ERROR) "
445*4882a593Smuzhiyun #endif /* CUSTOMER_HW4_DEBUG */
446*4882a593Smuzhiyun #define CFG80211_SCAN_TEXT "CFG80211-SCAN) "
447*4882a593Smuzhiyun #define CFG80211_TRACE_TEXT "CFG80211-TRACE) "
448*4882a593Smuzhiyun #define CFG80211_DEBUG_TEXT "CFG80211-DEBUG) "
449*4882a593Smuzhiyun #endif /* defined(CUSTOMER_DBG_PREFIX_ENABLE) */
450*4882a593Smuzhiyun
451*4882a593Smuzhiyun #ifdef DHD_DEBUG
452*4882a593Smuzhiyun #ifdef DHD_LOG_DUMP
453*4882a593Smuzhiyun #define WL_ERR_MSG(x, args...) \
454*4882a593Smuzhiyun do { \
455*4882a593Smuzhiyun if (wl_dbg_level & WL_DBG_ERR) { \
456*4882a593Smuzhiyun printf(CFG80211_ERROR_TEXT "%s : " x, __func__, ## args); \
457*4882a593Smuzhiyun DHD_LOG_DUMP_WRITE_TS_FN; \
458*4882a593Smuzhiyun DHD_LOG_DUMP_WRITE(x, ## args); \
459*4882a593Smuzhiyun } \
460*4882a593Smuzhiyun } while (0)
461*4882a593Smuzhiyun #define WL_ERR(x) WL_ERR_MSG x
462*4882a593Smuzhiyun #define WL_ERR_KERN_MSG(x, args...) \
463*4882a593Smuzhiyun do { \
464*4882a593Smuzhiyun if (wl_dbg_level & WL_DBG_ERR) { \
465*4882a593Smuzhiyun printf(CFG80211_ERROR_TEXT "%s : " x, __func__, ## args); \
466*4882a593Smuzhiyun } \
467*4882a593Smuzhiyun } while (0)
468*4882a593Smuzhiyun #define WL_ERR_KERN(x) WL_ERR_KERN_MSG x
469*4882a593Smuzhiyun #define WL_ERR_MEM_MSG(x, args...) \
470*4882a593Smuzhiyun do { \
471*4882a593Smuzhiyun if (wl_dbg_level & WL_DBG_ERR) { \
472*4882a593Smuzhiyun DHD_LOG_DUMP_WRITE_TS_FN; \
473*4882a593Smuzhiyun DHD_LOG_DUMP_WRITE(x, ## args); \
474*4882a593Smuzhiyun } \
475*4882a593Smuzhiyun } while (0)
476*4882a593Smuzhiyun /* Prints to debug ring by default. If dbg level is enabled, prints on to
477*4882a593Smuzhiyun * console as well
478*4882a593Smuzhiyun */
479*4882a593Smuzhiyun #define WL_DBG_MEM_MSG(x, args...) \
480*4882a593Smuzhiyun do { \
481*4882a593Smuzhiyun if (wl_dbg_level & WL_DBG_DBG) { \
482*4882a593Smuzhiyun printf(CFG80211_INFO_TEXT "%s : " x, __func__, ## args); \
483*4882a593Smuzhiyun } \
484*4882a593Smuzhiyun DHD_LOG_DUMP_WRITE_TS_FN; \
485*4882a593Smuzhiyun DHD_LOG_DUMP_WRITE(x, ## args); \
486*4882a593Smuzhiyun } while (0)
487*4882a593Smuzhiyun #define WL_DBG_MEM(x) WL_DBG_MEM_MSG x
488*4882a593Smuzhiyun #define WL_ERR_MEM(x) WL_ERR_MEM_MSG x
489*4882a593Smuzhiyun #define WL_INFORM_MEM_MSG(x, args...) \
490*4882a593Smuzhiyun do { \
491*4882a593Smuzhiyun if (wl_dbg_level & WL_DBG_INFO) { \
492*4882a593Smuzhiyun printf(CFG80211_INFO_TEXT "%s : " x, __func__, ## args); \
493*4882a593Smuzhiyun DHD_LOG_DUMP_WRITE_TS_FN; \
494*4882a593Smuzhiyun DHD_LOG_DUMP_WRITE(x, ## args); \
495*4882a593Smuzhiyun } \
496*4882a593Smuzhiyun } while (0)
497*4882a593Smuzhiyun #define WL_INFORM_MEM(x) WL_INFORM_MEM_MSG x
498*4882a593Smuzhiyun #define WL_ERR_EX_MSG(x, args...) \
499*4882a593Smuzhiyun do { \
500*4882a593Smuzhiyun if (wl_dbg_level & WL_DBG_ERR) { \
501*4882a593Smuzhiyun printf(CFG80211_ERROR_TEXT "%s : " x, __func__, ## args); \
502*4882a593Smuzhiyun DHD_LOG_DUMP_WRITE_EX_TS_FN; \
503*4882a593Smuzhiyun DHD_LOG_DUMP_WRITE_EX(x, ## args); \
504*4882a593Smuzhiyun } \
505*4882a593Smuzhiyun } while (0)
506*4882a593Smuzhiyun #define WL_ERR_EX(x) WL_ERR_EX_MSG x
507*4882a593Smuzhiyun #define WL_MEM(args) \
508*4882a593Smuzhiyun do { \
509*4882a593Smuzhiyun DHD_LOG_DUMP_WRITE_TS_FN; \
510*4882a593Smuzhiyun DHD_LOG_DUMP_WRITE args; \
511*4882a593Smuzhiyun } while (0)
512*4882a593Smuzhiyun #else
513*4882a593Smuzhiyun #define WL_ERR_MSG(x, args...) \
514*4882a593Smuzhiyun do { \
515*4882a593Smuzhiyun if (wl_dbg_level & WL_DBG_ERR) { \
516*4882a593Smuzhiyun printf(CFG80211_ERROR_TEXT "%s : " x, __func__, ## args); \
517*4882a593Smuzhiyun } \
518*4882a593Smuzhiyun } while (0)
519*4882a593Smuzhiyun #define WL_ERR(x) WL_ERR_MSG x
520*4882a593Smuzhiyun #define WL_ERR_KERN(args) WL_ERR(args)
521*4882a593Smuzhiyun #define WL_ERR_MEM(args) WL_ERR(args)
522*4882a593Smuzhiyun #define WL_INFORM_MEM(args) WL_INFORM(args)
523*4882a593Smuzhiyun #define WL_DBG_MEM(args) WL_DBG(args)
524*4882a593Smuzhiyun #define WL_ERR_EX(args) WL_ERR(args)
525*4882a593Smuzhiyun #define WL_MEM(args) WL_DBG(args)
526*4882a593Smuzhiyun #endif /* DHD_LOG_DUMP */
527*4882a593Smuzhiyun #else /* defined(DHD_DEBUG) */
528*4882a593Smuzhiyun #define WL_ERR_MSG(x, args...) \
529*4882a593Smuzhiyun do { \
530*4882a593Smuzhiyun if ((wl_dbg_level & WL_DBG_ERR) && net_ratelimit()) { \
531*4882a593Smuzhiyun printf(CFG80211_ERROR_TEXT "%s : " x, __func__, ## args); \
532*4882a593Smuzhiyun } \
533*4882a593Smuzhiyun } while (0)
534*4882a593Smuzhiyun #define WL_ERR(x) WL_ERR_MSG x
535*4882a593Smuzhiyun #define WL_ERR_KERN(args) WL_ERR(args)
536*4882a593Smuzhiyun #define WL_ERR_MEM(args) WL_ERR(args)
537*4882a593Smuzhiyun #define WL_INFORM_MEM(args) WL_INFORM(args)
538*4882a593Smuzhiyun #define WL_DBG_MEM(args) WL_DBG(args)
539*4882a593Smuzhiyun #define WL_ERR_EX(args) WL_ERR(args)
540*4882a593Smuzhiyun #define WL_MEM(args) WL_DBG(args)
541*4882a593Smuzhiyun #endif /* defined(DHD_DEBUG) */
542*4882a593Smuzhiyun
543*4882a593Smuzhiyun #if defined(__linux__) && !defined(DHD_EFI)
544*4882a593Smuzhiyun #define WL_PRINT_RATE_LIMIT_PERIOD 4000000000u /* 4s in units of ns */
545*4882a593Smuzhiyun #endif
546*4882a593Smuzhiyun #if defined(__linux__) && !defined(DHD_EFI)
547*4882a593Smuzhiyun #define WL_ERR_RLMT(args) \
548*4882a593Smuzhiyun do { \
549*4882a593Smuzhiyun if (wl_dbg_level & WL_DBG_ERR) { \
550*4882a593Smuzhiyun static uint64 __err_ts = 0; \
551*4882a593Smuzhiyun static uint32 __err_cnt = 0; \
552*4882a593Smuzhiyun uint64 __cur_ts = 0; \
553*4882a593Smuzhiyun __cur_ts = local_clock(); \
554*4882a593Smuzhiyun if (__err_ts == 0 || (__cur_ts > __err_ts && \
555*4882a593Smuzhiyun (__cur_ts - __err_ts > WL_PRINT_RATE_LIMIT_PERIOD))) { \
556*4882a593Smuzhiyun __err_ts = __cur_ts; \
557*4882a593Smuzhiyun WL_ERR(args); \
558*4882a593Smuzhiyun WL_ERR(("[Repeats %u times]\n", __err_cnt)); \
559*4882a593Smuzhiyun __err_cnt = 0; \
560*4882a593Smuzhiyun } else { \
561*4882a593Smuzhiyun ++__err_cnt; \
562*4882a593Smuzhiyun } \
563*4882a593Smuzhiyun } \
564*4882a593Smuzhiyun } while (0)
565*4882a593Smuzhiyun #else /* defined(__linux__) && !defined(DHD_EFI) */
566*4882a593Smuzhiyun #define WL_ERR_RLMT(args) WL_ERR(args)
567*4882a593Smuzhiyun #endif /* defined(__linux__) && !defined(DHD_EFI) */
568*4882a593Smuzhiyun
569*4882a593Smuzhiyun #ifdef WL_INFORM
570*4882a593Smuzhiyun #undef WL_INFORM
571*4882a593Smuzhiyun #endif
572*4882a593Smuzhiyun
573*4882a593Smuzhiyun #define WL_INFORM_MSG(x, args...) \
574*4882a593Smuzhiyun do { \
575*4882a593Smuzhiyun if (wl_dbg_level & WL_DBG_INFO) { \
576*4882a593Smuzhiyun printf(CFG80211_INFO_TEXT "%s : " x, __func__, ## args); \
577*4882a593Smuzhiyun } \
578*4882a593Smuzhiyun } while (0)
579*4882a593Smuzhiyun #define WL_INFORM(x) WL_INFORM_MSG x
580*4882a593Smuzhiyun
581*4882a593Smuzhiyun #ifdef WL_SCAN
582*4882a593Smuzhiyun #undef WL_SCAN
583*4882a593Smuzhiyun #endif
584*4882a593Smuzhiyun #define WL_SCAN_MSG(x, args...) \
585*4882a593Smuzhiyun do { \
586*4882a593Smuzhiyun if (wl_dbg_level & WL_DBG_SCAN) { \
587*4882a593Smuzhiyun printf(CFG80211_SCAN_TEXT "%s : " x, __func__, ## args); \
588*4882a593Smuzhiyun } \
589*4882a593Smuzhiyun } while (0)
590*4882a593Smuzhiyun #define WL_SCAN(x) WL_SCAN_MSG x
591*4882a593Smuzhiyun #ifdef WL_TRACE
592*4882a593Smuzhiyun #undef WL_TRACE
593*4882a593Smuzhiyun #endif
594*4882a593Smuzhiyun #define WL_TRACE_MSG(x, args...) \
595*4882a593Smuzhiyun do { \
596*4882a593Smuzhiyun if (wl_dbg_level & WL_DBG_TRACE) { \
597*4882a593Smuzhiyun printf(CFG80211_TRACE_TEXT "%s : " x, __func__, ## args); \
598*4882a593Smuzhiyun } \
599*4882a593Smuzhiyun } while (0)
600*4882a593Smuzhiyun #define WL_TRACE(x) WL_TRACE_MSG x
601*4882a593Smuzhiyun #ifdef WL_TRACE_HW4
602*4882a593Smuzhiyun #undef WL_TRACE_HW4
603*4882a593Smuzhiyun #endif
604*4882a593Smuzhiyun #ifdef CUSTOMER_HW4_DEBUG
605*4882a593Smuzhiyun #define WL_TRACE_HW4_MSG(x, args...) \
606*4882a593Smuzhiyun do { \
607*4882a593Smuzhiyun if (wl_dbg_level & WL_DBG_ERR) { \
608*4882a593Smuzhiyun printf(CFG80211_TRACE_TEXT "%s : " x, __func__, ## args); \
609*4882a593Smuzhiyun } \
610*4882a593Smuzhiyun } while (0)
611*4882a593Smuzhiyun #define WL_TRACE_HW4(x) WL_TRACE_HW4_MSG x
612*4882a593Smuzhiyun #else
613*4882a593Smuzhiyun #define WL_TRACE_HW4 WL_TRACE
614*4882a593Smuzhiyun #endif /* CUSTOMER_HW4_DEBUG */
615*4882a593Smuzhiyun #if (WL_DBG_LEVEL > 0)
616*4882a593Smuzhiyun #define WL_DBG_MSG(x, args...) \
617*4882a593Smuzhiyun do { \
618*4882a593Smuzhiyun if (wl_dbg_level & WL_DBG_DBG) { \
619*4882a593Smuzhiyun printf(CFG80211_DEBUG_TEXT "%s : " x, __func__, ## args); \
620*4882a593Smuzhiyun } \
621*4882a593Smuzhiyun } while (0)
622*4882a593Smuzhiyun #define WL_DBG(x) WL_DBG_MSG x
623*4882a593Smuzhiyun #else /* !(WL_DBG_LEVEL > 0) */
624*4882a593Smuzhiyun #define WL_DBG(args)
625*4882a593Smuzhiyun #endif /* (WL_DBG_LEVEL > 0) */
626*4882a593Smuzhiyun #define WL_PNO(x)
627*4882a593Smuzhiyun #define WL_SD(x)
628*4882a593Smuzhiyun
629*4882a593Smuzhiyun #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0))
630*4882a593Smuzhiyun #define ieee80211_band nl80211_band
631*4882a593Smuzhiyun #define IEEE80211_BAND_2GHZ NL80211_BAND_2GHZ
632*4882a593Smuzhiyun #define IEEE80211_BAND_5GHZ NL80211_BAND_5GHZ
633*4882a593Smuzhiyun #define IEEE80211_NUM_BANDS NUM_NL80211_BANDS
634*4882a593Smuzhiyun #endif
635*4882a593Smuzhiyun
636*4882a593Smuzhiyun #define WL_SCAN_RETRY_MAX 3
637*4882a593Smuzhiyun #define WL_NUM_PMKIDS_MAX MAXPMKID
638*4882a593Smuzhiyun #define WL_SCAN_BUF_MAX (1024 * 8)
639*4882a593Smuzhiyun #define WL_TLV_INFO_MAX 1500
640*4882a593Smuzhiyun #define WL_SCAN_IE_LEN_MAX 2048
641*4882a593Smuzhiyun #define WL_BSS_INFO_MAX 2048
642*4882a593Smuzhiyun #define WL_ASSOC_INFO_MAX 512
643*4882a593Smuzhiyun /* the length of pmkid_info iovar is 1416
644*4882a593Smuzhiyun * It exceed the original 1024 limitation
645*4882a593Smuzhiyun * so change WL_EXTRA_LEN_MAX to 2048
646*4882a593Smuzhiyun */
647*4882a593Smuzhiyun #define WL_IOCTL_LEN_MAX 2048
648*4882a593Smuzhiyun #define WL_EXTRA_BUF_MAX 2048
649*4882a593Smuzhiyun #define WL_SCAN_ERSULTS_LAST (WL_SCAN_RESULTS_NO_MEM+1)
650*4882a593Smuzhiyun #define WL_AP_MAX 256
651*4882a593Smuzhiyun #define WL_FILE_NAME_MAX 256
652*4882a593Smuzhiyun #define WL_DEFAULT_DWELL_TIME 200
653*4882a593Smuzhiyun #define WL_MED_DWELL_TIME 400
654*4882a593Smuzhiyun #define WL_MIN_DWELL_TIME 100
655*4882a593Smuzhiyun #define WL_LONG_DWELL_TIME 1000
656*4882a593Smuzhiyun #define IFACE_MAX_CNT 5
657*4882a593Smuzhiyun #define WL_SCAN_CONNECT_DWELL_TIME_MS 200
658*4882a593Smuzhiyun #define WL_SCAN_JOIN_PROBE_INTERVAL_MS 20
659*4882a593Smuzhiyun #define WL_SCAN_JOIN_ACTIVE_DWELL_TIME_MS 320
660*4882a593Smuzhiyun #define WL_BCAST_SCAN_JOIN_ACTIVE_DWELL_TIME_MS 80
661*4882a593Smuzhiyun #define WL_SCAN_JOIN_PASSIVE_DWELL_TIME_MS 400
662*4882a593Smuzhiyun #define WL_AF_TX_MAX_RETRY 5
663*4882a593Smuzhiyun #define WL_AF_TX_MIN_RETRY 3
664*4882a593Smuzhiyun
665*4882a593Smuzhiyun #define WL_AF_SEARCH_TIME_MAX 450
666*4882a593Smuzhiyun #define WL_AF_TX_EXTRA_TIME_MAX 200
667*4882a593Smuzhiyun
668*4882a593Smuzhiyun #define WL_SCAN_TIMER_INTERVAL_MS 10000 /* Scan timeout */
669*4882a593Smuzhiyun #ifdef WL_NAN
670*4882a593Smuzhiyun #define WL_SCAN_TIMER_INTERVAL_MS_NAN 15000 /* Scan timeout */
671*4882a593Smuzhiyun #endif /* WL_NAN */
672*4882a593Smuzhiyun #ifdef WL_6G_BAND
673*4882a593Smuzhiyun /* additional scan timeout for 6GHz, 6000msec */
674*4882a593Smuzhiyun #define WL_SCAN_TIMER_INTERVAL_MS_6G 6000
675*4882a593Smuzhiyun #endif /* WL_6G_BAND */
676*4882a593Smuzhiyun #define CHSPEC_IS_6G_PSC(chspec) (CHSPEC_IS6G(chspec) && ((CHSPEC_CHANNEL(chspec) % 16) == 5))
677*4882a593Smuzhiyun #define WL_CHANNEL_SYNC_RETRY 5
678*4882a593Smuzhiyun #define WL_INVALID -1
679*4882a593Smuzhiyun
680*4882a593Smuzhiyun #ifdef DHD_LOSSLESS_ROAMING
681*4882a593Smuzhiyun #define WL_ROAM_TIMEOUT_MS 1000 /* Roam timeout */
682*4882a593Smuzhiyun #endif
683*4882a593Smuzhiyun /* Bring down SCB Timeout to 20secs from 60secs default */
684*4882a593Smuzhiyun #ifndef WL_SCB_TIMEOUT
685*4882a593Smuzhiyun #define WL_SCB_TIMEOUT 20
686*4882a593Smuzhiyun #endif
687*4882a593Smuzhiyun
688*4882a593Smuzhiyun #if defined(ROAM_ENABLE) || defined(ROAM_CHANNEL_CACHE)
689*4882a593Smuzhiyun #define ESCAN_CHANNEL_CACHE
690*4882a593Smuzhiyun #endif
691*4882a593Smuzhiyun
692*4882a593Smuzhiyun #ifndef WL_SCB_ACTIVITY_TIME
693*4882a593Smuzhiyun #define WL_SCB_ACTIVITY_TIME 5
694*4882a593Smuzhiyun #endif
695*4882a593Smuzhiyun
696*4882a593Smuzhiyun #ifndef WL_SCB_MAX_PROBE
697*4882a593Smuzhiyun #define WL_SCB_MAX_PROBE 3
698*4882a593Smuzhiyun #endif
699*4882a593Smuzhiyun
700*4882a593Smuzhiyun #ifndef WL_PSPRETEND_RETRY_LIMIT
701*4882a593Smuzhiyun #define WL_PSPRETEND_RETRY_LIMIT 1
702*4882a593Smuzhiyun #endif
703*4882a593Smuzhiyun
704*4882a593Smuzhiyun #ifndef WL_MIN_PSPRETEND_THRESHOLD
705*4882a593Smuzhiyun #define WL_MIN_PSPRETEND_THRESHOLD 2
706*4882a593Smuzhiyun #endif
707*4882a593Smuzhiyun
708*4882a593Smuzhiyun /* Cipher suites */
709*4882a593Smuzhiyun #ifndef WLAN_CIPHER_SUITE_PMK
710*4882a593Smuzhiyun #define WLAN_CIPHER_SUITE_PMK 0x00904C00
711*4882a593Smuzhiyun #endif /* WLAN_CIPHER_SUITE_PMK */
712*4882a593Smuzhiyun
713*4882a593Smuzhiyun #ifndef WLAN_AKM_SUITE_FT_8021X
714*4882a593Smuzhiyun #define WLAN_AKM_SUITE_FT_8021X 0x000FAC03
715*4882a593Smuzhiyun #endif /* WLAN_AKM_SUITE_FT_8021X */
716*4882a593Smuzhiyun
717*4882a593Smuzhiyun #ifndef WLAN_AKM_SUITE_FT_PSK
718*4882a593Smuzhiyun #define WLAN_AKM_SUITE_FT_PSK 0x000FAC04
719*4882a593Smuzhiyun #endif /* WLAN_AKM_SUITE_FT_PSK */
720*4882a593Smuzhiyun
721*4882a593Smuzhiyun #ifndef WLAN_AKM_SUITE_8021X_SUITE_B
722*4882a593Smuzhiyun #define WLAN_AKM_SUITE_8021X_SUITE_B 0x000FAC0B
723*4882a593Smuzhiyun #define WLAN_AKM_SUITE_8021X_SUITE_B_192 0x000FAC0C
724*4882a593Smuzhiyun #endif /* WLAN_AKM_SUITE_8021X_SUITE_B */
725*4882a593Smuzhiyun
726*4882a593Smuzhiyun /* TODO: even in upstream linux(v5.0), FT-1X-SHA384 isn't defined and supported yet.
727*4882a593Smuzhiyun * need to revisit here to sync correct name later.
728*4882a593Smuzhiyun */
729*4882a593Smuzhiyun #ifndef WLAN_AKM_SUITE_FT_8021X_SHA384
730*4882a593Smuzhiyun #define WLAN_AKM_SUITE_FT_8021X_SHA384 0x000FAC0D
731*4882a593Smuzhiyun #endif /* WLAN_AKM_SUITE_FT_8021X_SHA384 */
732*4882a593Smuzhiyun
733*4882a593Smuzhiyun #define WL_AKM_SUITE_SHA256_1X 0x000FAC05
734*4882a593Smuzhiyun #define WL_AKM_SUITE_SHA256_PSK 0x000FAC06
735*4882a593Smuzhiyun
736*4882a593Smuzhiyun #define WLAN_AKM_SUITE_SAE_SHA256 0x000FAC08
737*4882a593Smuzhiyun
738*4882a593Smuzhiyun #ifndef WLAN_AKM_SUITE_FILS_SHA256
739*4882a593Smuzhiyun #define WLAN_AKM_SUITE_FILS_SHA256 0x000FAC0E
740*4882a593Smuzhiyun #define WLAN_AKM_SUITE_FILS_SHA384 0x000FAC0F
741*4882a593Smuzhiyun #define WLAN_AKM_SUITE_FT_FILS_SHA256 0x000FAC10
742*4882a593Smuzhiyun #define WLAN_AKM_SUITE_FT_FILS_SHA384 0x000FAC11
743*4882a593Smuzhiyun #endif /* WLAN_AKM_SUITE_FILS_SHA256 */
744*4882a593Smuzhiyun
745*4882a593Smuzhiyun #define MIN_VENDOR_EXTN_IE_LEN 2
746*4882a593Smuzhiyun #ifdef WL_OWE
747*4882a593Smuzhiyun #ifndef WLAN_AKM_SUITE_OWE
748*4882a593Smuzhiyun #define WLAN_AKM_SUITE_OWE 0X000FAC12
749*4882a593Smuzhiyun #endif /* WPA_KEY_MGMT_OWE */
750*4882a593Smuzhiyun #endif /* WL_OWE */
751*4882a593Smuzhiyun #define WLAN_AKM_SUITE_DPP 0X506F9A02
752*4882a593Smuzhiyun
753*4882a593Smuzhiyun /*
754*4882a593Smuzhiyun * BRCM local.
755*4882a593Smuzhiyun * Use a high number that's unlikely to clash with linux upstream for a while until we can
756*4882a593Smuzhiyun * submit these changes to the community.
757*4882a593Smuzhiyun */
758*4882a593Smuzhiyun #define NL80211_FEATURE_FW_4WAY_HANDSHAKE (1<<31)
759*4882a593Smuzhiyun
760*4882a593Smuzhiyun /* SCAN_SUPPRESS timer values in ms */
761*4882a593Smuzhiyun #define WL_SCAN_SUPPRESS_TIMEOUT 31000 /* default Framwork DHCP timeout is 30 sec */
762*4882a593Smuzhiyun #define WL_SCAN_SUPPRESS_RETRY 3000
763*4882a593Smuzhiyun
764*4882a593Smuzhiyun #define WL_PM_ENABLE_TIMEOUT 10000
765*4882a593Smuzhiyun
766*4882a593Smuzhiyun /* cfg80211 wowlan definitions */
767*4882a593Smuzhiyun #define WL_WOWLAN_MAX_PATTERNS 8
768*4882a593Smuzhiyun #define WL_WOWLAN_MIN_PATTERN_LEN 1
769*4882a593Smuzhiyun #define WL_WOWLAN_MAX_PATTERN_LEN 255
770*4882a593Smuzhiyun #define WL_WOWLAN_PKT_FILTER_ID_FIRST 201
771*4882a593Smuzhiyun #define WL_WOWLAN_PKT_FILTER_ID_LAST (WL_WOWLAN_PKT_FILTER_ID_FIRST + \
772*4882a593Smuzhiyun WL_WOWLAN_MAX_PATTERNS - 1)
773*4882a593Smuzhiyun #ifdef WLAIBSS
774*4882a593Smuzhiyun #define IBSS_COALESCE_DEFAULT 0
775*4882a593Smuzhiyun #define IBSS_INITIAL_SCAN_ALLOWED_DEFAULT 0
776*4882a593Smuzhiyun #else /* WLAIBSS */
777*4882a593Smuzhiyun #define IBSS_COALESCE_DEFAULT 1
778*4882a593Smuzhiyun #define IBSS_INITIAL_SCAN_ALLOWED_DEFAULT 1
779*4882a593Smuzhiyun #endif /* WLAIBSS */
780*4882a593Smuzhiyun
781*4882a593Smuzhiyun #ifdef WLTDLS
782*4882a593Smuzhiyun #define TDLS_TUNNELED_PRB_REQ "\x7f\x50\x6f\x9a\04"
783*4882a593Smuzhiyun #define TDLS_TUNNELED_PRB_RESP "\x7f\x50\x6f\x9a\05"
784*4882a593Smuzhiyun #define TDLS_MAX_IFACE_FOR_ENABLE 1
785*4882a593Smuzhiyun #endif /* WLTDLS */
786*4882a593Smuzhiyun
787*4882a593Smuzhiyun #ifdef WLAIBSS
788*4882a593Smuzhiyun /* Custom AIBSS beacon parameters */
789*4882a593Smuzhiyun #define AIBSS_INITIAL_MIN_BCN_DUR 500
790*4882a593Smuzhiyun #define AIBSS_MIN_BCN_DUR 5000
791*4882a593Smuzhiyun #define AIBSS_BCN_FLOOD_DUR 5000
792*4882a593Smuzhiyun #define AIBSS_PEER_FREE 3
793*4882a593Smuzhiyun #endif /* WLAIBSS */
794*4882a593Smuzhiyun
795*4882a593Smuzhiyun #ifndef FILS_INDICATION_IE_TAG_FIXED_LEN
796*4882a593Smuzhiyun #define FILS_INDICATION_IE_TAG_FIXED_LEN 2
797*4882a593Smuzhiyun #endif
798*4882a593Smuzhiyun
799*4882a593Smuzhiyun #if defined(STRICT_GCC_WARNINGS) && defined(__GNUC__) &&\
800*4882a593Smuzhiyun (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
801*4882a593Smuzhiyun #define BCM_SET_LIST_FIRST_ENTRY(entry, ptr, type, member) \
802*4882a593Smuzhiyun GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST(); \
803*4882a593Smuzhiyun (entry) = list_first_entry((ptr), type, member); \
804*4882a593Smuzhiyun GCC_DIAGNOSTIC_POP(); \
805*4882a593Smuzhiyun
806*4882a593Smuzhiyun #define BCM_SET_CONTAINER_OF(entry, ptr, type, member) \
807*4882a593Smuzhiyun GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST(); \
808*4882a593Smuzhiyun entry = container_of((ptr), type, member); \
809*4882a593Smuzhiyun GCC_DIAGNOSTIC_POP(); \
810*4882a593Smuzhiyun
811*4882a593Smuzhiyun #else
812*4882a593Smuzhiyun #define BCM_SET_LIST_FIRST_ENTRY(entry, ptr, type, member) \
813*4882a593Smuzhiyun (entry) = list_first_entry((ptr), type, member); \
814*4882a593Smuzhiyun
815*4882a593Smuzhiyun #define BCM_SET_CONTAINER_OF(entry, ptr, type, member) \
816*4882a593Smuzhiyun entry = container_of((ptr), type, member); \
817*4882a593Smuzhiyun
818*4882a593Smuzhiyun #endif /* STRICT_GCC_WARNINGS */
819*4882a593Smuzhiyun
820*4882a593Smuzhiyun /* DPP Public Action Frame types */
821*4882a593Smuzhiyun enum wl_dpp_ftype {
822*4882a593Smuzhiyun DPP_AUTH_REQ = 0,
823*4882a593Smuzhiyun DPP_AUTH_RESP = 1,
824*4882a593Smuzhiyun DPP_AUTH_CONF = 2,
825*4882a593Smuzhiyun DPP_PEER_DISC_REQ = 5,
826*4882a593Smuzhiyun DPP_PEER_DISC_RESP = 6,
827*4882a593Smuzhiyun DPP_PKEX_EX_REQ = 7,
828*4882a593Smuzhiyun DPP_PKEX_EX_RESP = 8,
829*4882a593Smuzhiyun DPP_PKEX_COMMIT_REVEAL_REQ = 9,
830*4882a593Smuzhiyun DPP_PKEX_COMMIT_REVEAL_RESP = 10,
831*4882a593Smuzhiyun DPP_CONFIGURATION_RESULT = 11
832*4882a593Smuzhiyun };
833*4882a593Smuzhiyun
834*4882a593Smuzhiyun /* DPP Public Action Frame */
835*4882a593Smuzhiyun struct wl_dpp_pub_act_frame {
836*4882a593Smuzhiyun uint8 category; /* PUB_AF_CATEGORY */
837*4882a593Smuzhiyun uint8 action; /* PUB_AF_ACTION */
838*4882a593Smuzhiyun uint8 oui[3]; /* OUI */
839*4882a593Smuzhiyun uint8 oui_type; /* OUI type */
840*4882a593Smuzhiyun uint8 crypto_suite; /* OUI subtype */
841*4882a593Smuzhiyun uint8 ftype; /* nonzero, identifies req/rsp transaction */
842*4882a593Smuzhiyun uint8 elts[1]; /* Variable length information elements. */
843*4882a593Smuzhiyun } __attribute__ ((packed));
844*4882a593Smuzhiyun typedef struct wl_dpp_pub_act_frame wl_dpp_pa_frame_t;
845*4882a593Smuzhiyun
846*4882a593Smuzhiyun #define WL_PUB_AF_CATEGORY 0x04
847*4882a593Smuzhiyun #define WL_PUB_AF_ACTION 0x09 /* Vendor specific */
848*4882a593Smuzhiyun #define WL_PUB_AF_WFA_STYPE_DPP 0x1A /* WFA Subtype DPP */
849*4882a593Smuzhiyun #define WL_PUB_AF_STYPE_INVALID 255
850*4882a593Smuzhiyun #define WL_GAS_MIN_LEN 8
851*4882a593Smuzhiyun #define WL_GAS_WFA_OFFSET 3
852*4882a593Smuzhiyun #define WL_GAS_RESP_OFFSET 4
853*4882a593Smuzhiyun #define WL_GAS_STYPE_OFFSET 6
854*4882a593Smuzhiyun #define WL_GAS_WFA_STYPE_DPP 0x1A
855*4882a593Smuzhiyun #define WL_GAS_DPP_ADV_ID 0x7ddd
856*4882a593Smuzhiyun
857*4882a593Smuzhiyun /* Action value for GAS Initial Request AF */
858*4882a593Smuzhiyun #define WL_PUB_AF_GAS_IREQ 0x0a
859*4882a593Smuzhiyun /* Action value for GAS Initial Response AF */
860*4882a593Smuzhiyun #define WL_PUB_AF_GAS_IRESP 0x0b
861*4882a593Smuzhiyun /* Action value for GAS Comeback Request AF */
862*4882a593Smuzhiyun #define WL_PUB_AF_GAS_CREQ 0x0c
863*4882a593Smuzhiyun /* Action value for GAS Comeback Response AF */
864*4882a593Smuzhiyun #define WL_PUB_AF_GAS_CRESP 0x0d
865*4882a593Smuzhiyun /* Advertisement Protocol IE ID */
866*4882a593Smuzhiyun #define WL_PUB_AF_GAS_AD_EID 0x6c
867*4882a593Smuzhiyun
868*4882a593Smuzhiyun typedef wifi_p2psd_gas_pub_act_frame_t wl_dpp_gas_af_t;
869*4882a593Smuzhiyun
870*4882a593Smuzhiyun /* driver status */
871*4882a593Smuzhiyun enum wl_status {
872*4882a593Smuzhiyun WL_STATUS_READY = 0,
873*4882a593Smuzhiyun WL_STATUS_SCANNING,
874*4882a593Smuzhiyun WL_STATUS_SCAN_ABORTING,
875*4882a593Smuzhiyun WL_STATUS_CONNECTING,
876*4882a593Smuzhiyun WL_STATUS_CONNECTED,
877*4882a593Smuzhiyun WL_STATUS_DISCONNECTING,
878*4882a593Smuzhiyun WL_STATUS_AP_CREATING,
879*4882a593Smuzhiyun WL_STATUS_AP_CREATED,
880*4882a593Smuzhiyun /* whole sending action frame procedure:
881*4882a593Smuzhiyun * includes a) 'finding common channel' for public action request frame
882*4882a593Smuzhiyun * and b) 'sending af via 'actframe' iovar'
883*4882a593Smuzhiyun */
884*4882a593Smuzhiyun WL_STATUS_SENDING_ACT_FRM,
885*4882a593Smuzhiyun /* find a peer to go to a common channel before sending public action req frame */
886*4882a593Smuzhiyun WL_STATUS_FINDING_COMMON_CHANNEL,
887*4882a593Smuzhiyun /* waiting for next af to sync time of supplicant.
888*4882a593Smuzhiyun * it includes SENDING_ACT_FRM and WAITING_NEXT_ACT_FRM_LISTEN
889*4882a593Smuzhiyun */
890*4882a593Smuzhiyun WL_STATUS_WAITING_NEXT_ACT_FRM,
891*4882a593Smuzhiyun #ifdef WL_CFG80211_SYNC_GON
892*4882a593Smuzhiyun /* go to listen state to wait for next af after SENDING_ACT_FRM */
893*4882a593Smuzhiyun WL_STATUS_WAITING_NEXT_ACT_FRM_LISTEN,
894*4882a593Smuzhiyun #endif /* WL_CFG80211_SYNC_GON */
895*4882a593Smuzhiyun /* it will be set when upper layer requests listen and succeed in setting listen mode.
896*4882a593Smuzhiyun * if set, other scan request can abort current listen state
897*4882a593Smuzhiyun */
898*4882a593Smuzhiyun WL_STATUS_REMAINING_ON_CHANNEL,
899*4882a593Smuzhiyun #ifdef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST
900*4882a593Smuzhiyun /* it's fake listen state to keep current scan state.
901*4882a593Smuzhiyun * it will be set when upper layer requests listen but scan is running. then just run
902*4882a593Smuzhiyun * a expire timer without actual listen state.
903*4882a593Smuzhiyun * if set, other scan request does not need to abort scan.
904*4882a593Smuzhiyun */
905*4882a593Smuzhiyun WL_STATUS_FAKE_REMAINING_ON_CHANNEL,
906*4882a593Smuzhiyun #endif /* WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */
907*4882a593Smuzhiyun WL_STATUS_NESTED_CONNECT,
908*4882a593Smuzhiyun WL_STATUS_CFG80211_CONNECT,
909*4882a593Smuzhiyun WL_STATUS_AUTHORIZED
910*4882a593Smuzhiyun };
911*4882a593Smuzhiyun
912*4882a593Smuzhiyun typedef enum wl_iftype {
913*4882a593Smuzhiyun WL_IF_TYPE_STA = 0,
914*4882a593Smuzhiyun WL_IF_TYPE_AP = 1,
915*4882a593Smuzhiyun #ifdef WLMESH_CFG80211
916*4882a593Smuzhiyun WL_IF_TYPE_MESH = 2,
917*4882a593Smuzhiyun #endif /* WLMESH_CFG80211 */
918*4882a593Smuzhiyun
919*4882a593Smuzhiyun #ifdef WLAWDL
920*4882a593Smuzhiyun WL_IF_TYPE_AWDL = 2,
921*4882a593Smuzhiyun #endif /* WLAWDL */
922*4882a593Smuzhiyun
923*4882a593Smuzhiyun WL_IF_TYPE_NAN_NMI = 3,
924*4882a593Smuzhiyun WL_IF_TYPE_NAN = 4,
925*4882a593Smuzhiyun WL_IF_TYPE_P2P_GO = 5,
926*4882a593Smuzhiyun WL_IF_TYPE_P2P_GC = 6,
927*4882a593Smuzhiyun WL_IF_TYPE_P2P_DISC = 7,
928*4882a593Smuzhiyun WL_IF_TYPE_IBSS = 8,
929*4882a593Smuzhiyun WL_IF_TYPE_MONITOR = 9,
930*4882a593Smuzhiyun WL_IF_TYPE_AIBSS = 10,
931*4882a593Smuzhiyun WL_IF_TYPE_MAX
932*4882a593Smuzhiyun } wl_iftype_t;
933*4882a593Smuzhiyun
934*4882a593Smuzhiyun typedef enum wl_interface_state {
935*4882a593Smuzhiyun WL_IF_CREATE_REQ,
936*4882a593Smuzhiyun WL_IF_CREATE_DONE,
937*4882a593Smuzhiyun WL_IF_DELETE_REQ,
938*4882a593Smuzhiyun WL_IF_DELETE_DONE,
939*4882a593Smuzhiyun WL_IF_CHANGE_REQ,
940*4882a593Smuzhiyun WL_IF_CHANGE_DONE,
941*4882a593Smuzhiyun WL_IF_STATE_MAX, /* Retain as last one */
942*4882a593Smuzhiyun } wl_interface_state_t;
943*4882a593Smuzhiyun
944*4882a593Smuzhiyun /* wi-fi mode */
945*4882a593Smuzhiyun enum wl_mode {
946*4882a593Smuzhiyun WL_MODE_BSS = 0,
947*4882a593Smuzhiyun WL_MODE_IBSS = 1,
948*4882a593Smuzhiyun WL_MODE_AP = 2,
949*4882a593Smuzhiyun
950*4882a593Smuzhiyun #ifdef WLAWDL
951*4882a593Smuzhiyun WL_MODE_AWDL = 3,
952*4882a593Smuzhiyun #endif /* WLAWDL */
953*4882a593Smuzhiyun
954*4882a593Smuzhiyun WL_MODE_NAN = 4,
955*4882a593Smuzhiyun #ifdef WLMESH_CFG80211
956*4882a593Smuzhiyun WL_MODE_MESH = 5,
957*4882a593Smuzhiyun #endif /* WLMESH_CFG80211 */
958*4882a593Smuzhiyun WL_MODE_MAX
959*4882a593Smuzhiyun };
960*4882a593Smuzhiyun
961*4882a593Smuzhiyun /* driver profile list */
962*4882a593Smuzhiyun enum wl_prof_list {
963*4882a593Smuzhiyun WL_PROF_MODE,
964*4882a593Smuzhiyun WL_PROF_SSID,
965*4882a593Smuzhiyun WL_PROF_SEC,
966*4882a593Smuzhiyun WL_PROF_IBSS,
967*4882a593Smuzhiyun WL_PROF_BAND,
968*4882a593Smuzhiyun WL_PROF_CHAN,
969*4882a593Smuzhiyun WL_PROF_BSSID,
970*4882a593Smuzhiyun WL_PROF_ACT,
971*4882a593Smuzhiyun WL_PROF_BEACONINT,
972*4882a593Smuzhiyun WL_PROF_DTIMPERIOD,
973*4882a593Smuzhiyun WL_PROF_LATEST_BSSID
974*4882a593Smuzhiyun };
975*4882a593Smuzhiyun
976*4882a593Smuzhiyun /* donlge escan state */
977*4882a593Smuzhiyun enum wl_escan_state {
978*4882a593Smuzhiyun WL_ESCAN_STATE_IDLE,
979*4882a593Smuzhiyun WL_ESCAN_STATE_SCANING
980*4882a593Smuzhiyun };
981*4882a593Smuzhiyun /* fw downloading status */
982*4882a593Smuzhiyun enum wl_fw_status {
983*4882a593Smuzhiyun WL_FW_LOADING_DONE,
984*4882a593Smuzhiyun WL_NVRAM_LOADING_DONE
985*4882a593Smuzhiyun };
986*4882a593Smuzhiyun
987*4882a593Smuzhiyun enum wl_management_type {
988*4882a593Smuzhiyun WL_BEACON = 0x1,
989*4882a593Smuzhiyun WL_PROBE_RESP = 0x2,
990*4882a593Smuzhiyun WL_ASSOC_RESP = 0x4
991*4882a593Smuzhiyun };
992*4882a593Smuzhiyun
993*4882a593Smuzhiyun enum wl_pm_workq_act_type {
994*4882a593Smuzhiyun WL_PM_WORKQ_SHORT,
995*4882a593Smuzhiyun WL_PM_WORKQ_LONG,
996*4882a593Smuzhiyun WL_PM_WORKQ_DEL
997*4882a593Smuzhiyun };
998*4882a593Smuzhiyun
999*4882a593Smuzhiyun enum wl_tdls_config {
1000*4882a593Smuzhiyun TDLS_STATE_AP_CREATE,
1001*4882a593Smuzhiyun TDLS_STATE_AP_DELETE,
1002*4882a593Smuzhiyun TDLS_STATE_CONNECT,
1003*4882a593Smuzhiyun TDLS_STATE_DISCONNECT,
1004*4882a593Smuzhiyun TDLS_STATE_SETUP,
1005*4882a593Smuzhiyun TDLS_STATE_TEARDOWN,
1006*4882a593Smuzhiyun TDLS_STATE_IF_CREATE,
1007*4882a593Smuzhiyun TDLS_STATE_IF_DELETE,
1008*4882a593Smuzhiyun TDLS_STATE_NMI_CREATE
1009*4882a593Smuzhiyun };
1010*4882a593Smuzhiyun
1011*4882a593Smuzhiyun typedef enum wl_assoc_state {
1012*4882a593Smuzhiyun WL_STATE_ASSOC_IDLE,
1013*4882a593Smuzhiyun WL_STATE_ASSOCIATING,
1014*4882a593Smuzhiyun WL_STATE_ASSOCIATED
1015*4882a593Smuzhiyun } wl_assoc_state_t;
1016*4882a593Smuzhiyun
1017*4882a593Smuzhiyun typedef enum wl_link_action {
1018*4882a593Smuzhiyun WL_LINK_NONE,
1019*4882a593Smuzhiyun WL_LINK_ASSOC_FAIL,
1020*4882a593Smuzhiyun WL_LINK_ASSOC_DONE,
1021*4882a593Smuzhiyun WL_LINK_DOWN,
1022*4882a593Smuzhiyun WL_LINK_ROAM_DONE,
1023*4882a593Smuzhiyun WL_LINK_FORCE_DEAUTH
1024*4882a593Smuzhiyun } wl_link_action_t;
1025*4882a593Smuzhiyun
1026*4882a593Smuzhiyun typedef struct wl_assoc_status {
1027*4882a593Smuzhiyun u16 flags;
1028*4882a593Smuzhiyun u16 assoc_state;
1029*4882a593Smuzhiyun u32 event_type;
1030*4882a593Smuzhiyun u32 status;
1031*4882a593Smuzhiyun u32 reason;
1032*4882a593Smuzhiyun wl_link_action_t link_action;
1033*4882a593Smuzhiyun u8 curbssid[ETH_ALEN];
1034*4882a593Smuzhiyun u8 addr[ETH_ALEN];
1035*4882a593Smuzhiyun u16 data_len;
1036*4882a593Smuzhiyun void *data;
1037*4882a593Smuzhiyun struct net_device *ndev;
1038*4882a593Smuzhiyun const wl_event_msg_t *event_msg;
1039*4882a593Smuzhiyun } wl_assoc_status_t;
1040*4882a593Smuzhiyun
1041*4882a593Smuzhiyun /* beacon / probe_response */
1042*4882a593Smuzhiyun struct beacon_proberesp {
1043*4882a593Smuzhiyun __le64 timestamp;
1044*4882a593Smuzhiyun __le16 beacon_int;
1045*4882a593Smuzhiyun __le16 capab_info;
1046*4882a593Smuzhiyun u8 variable[0];
1047*4882a593Smuzhiyun } __attribute__ ((packed));
1048*4882a593Smuzhiyun
1049*4882a593Smuzhiyun /* driver configuration */
1050*4882a593Smuzhiyun struct wl_conf {
1051*4882a593Smuzhiyun u32 frag_threshold;
1052*4882a593Smuzhiyun u32 rts_threshold;
1053*4882a593Smuzhiyun u32 retry_short;
1054*4882a593Smuzhiyun u32 retry_long;
1055*4882a593Smuzhiyun s32 tx_power;
1056*4882a593Smuzhiyun struct ieee80211_channel channel;
1057*4882a593Smuzhiyun };
1058*4882a593Smuzhiyun
1059*4882a593Smuzhiyun typedef s32(*EVENT_HANDLER) (struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev,
1060*4882a593Smuzhiyun const wl_event_msg_t *e, void *data);
1061*4882a593Smuzhiyun
1062*4882a593Smuzhiyun /* bss inform structure for cfg80211 interface */
1063*4882a593Smuzhiyun struct wl_cfg80211_bss_info {
1064*4882a593Smuzhiyun u16 band;
1065*4882a593Smuzhiyun u16 channel;
1066*4882a593Smuzhiyun s16 rssi;
1067*4882a593Smuzhiyun u16 frame_len;
1068*4882a593Smuzhiyun u8 frame_buf[1];
1069*4882a593Smuzhiyun };
1070*4882a593Smuzhiyun
1071*4882a593Smuzhiyun /* basic structure of scan request */
1072*4882a593Smuzhiyun struct wl_scan_req {
1073*4882a593Smuzhiyun struct wlc_ssid ssid;
1074*4882a593Smuzhiyun };
1075*4882a593Smuzhiyun
1076*4882a593Smuzhiyun /* basic structure of information element */
1077*4882a593Smuzhiyun struct wl_ie {
1078*4882a593Smuzhiyun u16 offset;
1079*4882a593Smuzhiyun u8 buf[WL_TLV_INFO_MAX];
1080*4882a593Smuzhiyun };
1081*4882a593Smuzhiyun
1082*4882a593Smuzhiyun /* event queue for cfg80211 main event */
1083*4882a593Smuzhiyun struct wl_event_q {
1084*4882a593Smuzhiyun struct list_head eq_list;
1085*4882a593Smuzhiyun u32 etype;
1086*4882a593Smuzhiyun u32 id; /* counter to track events */
1087*4882a593Smuzhiyun wl_event_msg_t emsg;
1088*4882a593Smuzhiyun u32 datalen;
1089*4882a593Smuzhiyun s8 edata[1];
1090*4882a593Smuzhiyun };
1091*4882a593Smuzhiyun
1092*4882a593Smuzhiyun /* security information with currently associated ap */
1093*4882a593Smuzhiyun struct wl_security {
1094*4882a593Smuzhiyun u32 wpa_versions;
1095*4882a593Smuzhiyun u32 auth_type;
1096*4882a593Smuzhiyun u32 cipher_pairwise;
1097*4882a593Smuzhiyun u32 cipher_group;
1098*4882a593Smuzhiyun u32 wpa_auth;
1099*4882a593Smuzhiyun u32 auth_assoc_res_status;
1100*4882a593Smuzhiyun u32 fw_wpa_auth;
1101*4882a593Smuzhiyun u32 fw_auth;
1102*4882a593Smuzhiyun u32 fw_wsec;
1103*4882a593Smuzhiyun u32 fw_mfp;
1104*4882a593Smuzhiyun };
1105*4882a593Smuzhiyun
1106*4882a593Smuzhiyun /* ibss information for currently joined ibss network */
1107*4882a593Smuzhiyun struct wl_ibss {
1108*4882a593Smuzhiyun u8 beacon_interval; /* in millisecond */
1109*4882a593Smuzhiyun u8 atim; /* in millisecond */
1110*4882a593Smuzhiyun s8 join_only;
1111*4882a593Smuzhiyun u8 band;
1112*4882a593Smuzhiyun u8 channel;
1113*4882a593Smuzhiyun };
1114*4882a593Smuzhiyun
1115*4882a593Smuzhiyun typedef struct wl_bss_vndr_ies {
1116*4882a593Smuzhiyun u8 probe_req_ie[VNDR_IES_BUF_LEN];
1117*4882a593Smuzhiyun u8 probe_res_ie[VNDR_IES_MAX_BUF_LEN];
1118*4882a593Smuzhiyun u8 assoc_req_ie[VNDR_IES_BUF_LEN];
1119*4882a593Smuzhiyun u8 assoc_res_ie[VNDR_IES_BUF_LEN];
1120*4882a593Smuzhiyun u8 beacon_ie[VNDR_IES_MAX_BUF_LEN];
1121*4882a593Smuzhiyun u8 disassoc_ie[VNDR_IES_BUF_LEN];
1122*4882a593Smuzhiyun u32 probe_req_ie_len;
1123*4882a593Smuzhiyun u32 probe_res_ie_len;
1124*4882a593Smuzhiyun u32 assoc_req_ie_len;
1125*4882a593Smuzhiyun u32 assoc_res_ie_len;
1126*4882a593Smuzhiyun u32 beacon_ie_len;
1127*4882a593Smuzhiyun u32 disassoc_ie_len;
1128*4882a593Smuzhiyun } wl_bss_vndr_ies_t;
1129*4882a593Smuzhiyun
1130*4882a593Smuzhiyun typedef struct wl_cfgbss {
1131*4882a593Smuzhiyun u8 *wpa_ie;
1132*4882a593Smuzhiyun u8 *rsn_ie;
1133*4882a593Smuzhiyun u8 *wps_ie;
1134*4882a593Smuzhiyun u8 *fils_ind_ie;
1135*4882a593Smuzhiyun bool security_mode;
1136*4882a593Smuzhiyun struct wl_bss_vndr_ies ies; /* Common for STA, P2P GC, GO, AP, P2P Disc Interface */
1137*4882a593Smuzhiyun } wl_cfgbss_t;
1138*4882a593Smuzhiyun
1139*4882a593Smuzhiyun /* cfg driver profile */
1140*4882a593Smuzhiyun struct wl_profile {
1141*4882a593Smuzhiyun u32 mode;
1142*4882a593Smuzhiyun s32 band;
1143*4882a593Smuzhiyun u32 channel;
1144*4882a593Smuzhiyun struct wlc_ssid ssid;
1145*4882a593Smuzhiyun struct wl_security sec;
1146*4882a593Smuzhiyun struct wl_ibss ibss;
1147*4882a593Smuzhiyun u8 bssid[ETHER_ADDR_LEN];
1148*4882a593Smuzhiyun u16 beacon_interval;
1149*4882a593Smuzhiyun u8 dtim_period;
1150*4882a593Smuzhiyun bool active;
1151*4882a593Smuzhiyun u8 latest_bssid[ETHER_ADDR_LEN];
1152*4882a593Smuzhiyun };
1153*4882a593Smuzhiyun
1154*4882a593Smuzhiyun struct wl_wps_ie {
1155*4882a593Smuzhiyun uint8 id; /* IE ID: 0xDD */
1156*4882a593Smuzhiyun uint8 len; /* IE length */
1157*4882a593Smuzhiyun uint8 OUI[3]; /* WiFi WPS specific OUI */
1158*4882a593Smuzhiyun uint8 oui_type; /* Vendor specific OUI Type */
1159*4882a593Smuzhiyun uint8 attrib[1]; /* variable length attributes */
1160*4882a593Smuzhiyun } __attribute__ ((packed));
1161*4882a593Smuzhiyun typedef struct wl_wps_ie wl_wps_ie_t;
1162*4882a593Smuzhiyun
1163*4882a593Smuzhiyun struct wl_eap_msg {
1164*4882a593Smuzhiyun uint16 attrib;
1165*4882a593Smuzhiyun uint16 len;
1166*4882a593Smuzhiyun uint8 type;
1167*4882a593Smuzhiyun } __attribute__ ((packed));
1168*4882a593Smuzhiyun typedef struct wl_eap_msg wl_eap_msg_t;
1169*4882a593Smuzhiyun
1170*4882a593Smuzhiyun struct wl_eap_exp {
1171*4882a593Smuzhiyun uint8 OUI[3];
1172*4882a593Smuzhiyun uint32 oui_type;
1173*4882a593Smuzhiyun uint8 opcode;
1174*4882a593Smuzhiyun u8 flags;
1175*4882a593Smuzhiyun u8 data[1];
1176*4882a593Smuzhiyun } __attribute__ ((packed));
1177*4882a593Smuzhiyun typedef struct wl_eap_exp wl_eap_exp_t;
1178*4882a593Smuzhiyun
1179*4882a593Smuzhiyun struct net_info {
1180*4882a593Smuzhiyun struct net_device *ndev;
1181*4882a593Smuzhiyun struct wireless_dev *wdev;
1182*4882a593Smuzhiyun struct wl_profile profile;
1183*4882a593Smuzhiyun wl_iftype_t iftype;
1184*4882a593Smuzhiyun s32 roam_off;
1185*4882a593Smuzhiyun unsigned long sme_state;
1186*4882a593Smuzhiyun bool pm_restore;
1187*4882a593Smuzhiyun bool pm_block;
1188*4882a593Smuzhiyun s32 pm;
1189*4882a593Smuzhiyun s32 bssidx;
1190*4882a593Smuzhiyun wl_cfgbss_t bss;
1191*4882a593Smuzhiyun u8 ifidx;
1192*4882a593Smuzhiyun struct list_head list; /* list of all net_info structure */
1193*4882a593Smuzhiyun };
1194*4882a593Smuzhiyun
1195*4882a593Smuzhiyun #ifdef WL_BCNRECV
1196*4882a593Smuzhiyun /* PERIODIC Beacon receive for detecting FakeAPs */
1197*4882a593Smuzhiyun typedef struct wl_bcnrecv_result {
1198*4882a593Smuzhiyun uint8 SSID[DOT11_MAX_SSID_LEN]; /**< SSID String */
1199*4882a593Smuzhiyun struct ether_addr BSSID; /**< Network BSSID */
1200*4882a593Smuzhiyun uint8 channel; /**< Channel */
1201*4882a593Smuzhiyun uint16 beacon_interval;
1202*4882a593Smuzhiyun uint32 timestamp[2]; /**< Beacon Timestamp */
1203*4882a593Smuzhiyun uint64 system_time;
1204*4882a593Smuzhiyun } wl_bcnrecv_result_t;
1205*4882a593Smuzhiyun
1206*4882a593Smuzhiyun typedef struct wl_bcnrecv_info {
1207*4882a593Smuzhiyun uint bcnrecv_state; /* TO know the fakeap state */
1208*4882a593Smuzhiyun } wl_bcnrecv_info_t;
1209*4882a593Smuzhiyun
1210*4882a593Smuzhiyun typedef enum wl_bcnrecv_state {
1211*4882a593Smuzhiyun BEACON_RECV_IDLE = 0,
1212*4882a593Smuzhiyun BEACON_RECV_STARTED,
1213*4882a593Smuzhiyun BEACON_RECV_STOPPED,
1214*4882a593Smuzhiyun BEACON_RECV_SUSPENDED
1215*4882a593Smuzhiyun } wl_bcnrecv_state_t;
1216*4882a593Smuzhiyun
1217*4882a593Smuzhiyun typedef enum wl_bcnrecv_reason {
1218*4882a593Smuzhiyun WL_BCNRECV_INVALID = 0,
1219*4882a593Smuzhiyun WL_BCNRECV_USER_TRIGGER,
1220*4882a593Smuzhiyun WL_BCNRECV_SUSPEND,
1221*4882a593Smuzhiyun WL_BCNRECV_SCANBUSY,
1222*4882a593Smuzhiyun WL_BCNRECV_CONCURRENCY,
1223*4882a593Smuzhiyun WL_BCNRECV_LISTENBUSY,
1224*4882a593Smuzhiyun WL_BCNRECV_ROAMABORT,
1225*4882a593Smuzhiyun WL_BCNRECV_HANG
1226*4882a593Smuzhiyun } wl_bcnrecv_reason_t;
1227*4882a593Smuzhiyun
1228*4882a593Smuzhiyun typedef enum wl_bcnrecv_status {
1229*4882a593Smuzhiyun WL_BCNRECV_STARTED = 0,
1230*4882a593Smuzhiyun WL_BCNRECV_STOPPED,
1231*4882a593Smuzhiyun WL_BCNRECV_ABORTED,
1232*4882a593Smuzhiyun WL_BCNRECV_SUSPENDED,
1233*4882a593Smuzhiyun WL_BCNRECV_MAX
1234*4882a593Smuzhiyun } wl_bcnrecv_status_t;
1235*4882a593Smuzhiyun
1236*4882a593Smuzhiyun typedef enum wl_bcnrecv_attr_type {
1237*4882a593Smuzhiyun BCNRECV_ATTR_STATUS = 1,
1238*4882a593Smuzhiyun BCNRECV_ATTR_REASON,
1239*4882a593Smuzhiyun BCNRECV_ATTR_BCNINFO
1240*4882a593Smuzhiyun } wl_bcnrecv_attr_type_t;
1241*4882a593Smuzhiyun #endif /* WL_BCNRECV */
1242*4882a593Smuzhiyun #ifdef WL_CHAN_UTIL
1243*4882a593Smuzhiyun #define CU_ATTR_PERCENTAGE 1
1244*4882a593Smuzhiyun #define CU_ATTR_HDR_LEN 30
1245*4882a593Smuzhiyun #endif /* WL_CHAN_UTIL */
1246*4882a593Smuzhiyun
1247*4882a593Smuzhiyun /* association inform */
1248*4882a593Smuzhiyun #define MAX_REQ_LINE 1024u
1249*4882a593Smuzhiyun struct wl_connect_info {
1250*4882a593Smuzhiyun u8 req_ie[MAX_REQ_LINE];
1251*4882a593Smuzhiyun u32 req_ie_len;
1252*4882a593Smuzhiyun u8 resp_ie[MAX_REQ_LINE];
1253*4882a593Smuzhiyun u32 resp_ie_len;
1254*4882a593Smuzhiyun };
1255*4882a593Smuzhiyun #define WL_MAX_FILS_KEY_LEN 64
1256*4882a593Smuzhiyun
1257*4882a593Smuzhiyun struct wl_fils_info {
1258*4882a593Smuzhiyun u8 fils_kek[WL_MAX_FILS_KEY_LEN];
1259*4882a593Smuzhiyun u32 fils_kek_len;
1260*4882a593Smuzhiyun u8 fils_pmk[WL_MAX_FILS_KEY_LEN];
1261*4882a593Smuzhiyun u32 fils_pmk_len;
1262*4882a593Smuzhiyun u8 fils_pmkid[WL_MAX_FILS_KEY_LEN];
1263*4882a593Smuzhiyun u16 fils_erp_next_seq_num;
1264*4882a593Smuzhiyun bool fils_roam_disabled;
1265*4882a593Smuzhiyun u32 fils_bcn_timeout_cache;
1266*4882a593Smuzhiyun };
1267*4882a593Smuzhiyun
1268*4882a593Smuzhiyun /* firmware /nvram downloading controller */
1269*4882a593Smuzhiyun struct wl_fw_ctrl {
1270*4882a593Smuzhiyun const struct firmware *fw_entry;
1271*4882a593Smuzhiyun unsigned long status;
1272*4882a593Smuzhiyun u32 ptr;
1273*4882a593Smuzhiyun s8 fw_name[WL_FILE_NAME_MAX];
1274*4882a593Smuzhiyun s8 nvram_name[WL_FILE_NAME_MAX];
1275*4882a593Smuzhiyun };
1276*4882a593Smuzhiyun
1277*4882a593Smuzhiyun /* assoc ie length */
1278*4882a593Smuzhiyun struct wl_assoc_ielen {
1279*4882a593Smuzhiyun u32 req_len;
1280*4882a593Smuzhiyun u32 resp_len;
1281*4882a593Smuzhiyun };
1282*4882a593Smuzhiyun
1283*4882a593Smuzhiyun #define WL_EXTJOIN_VERSION_V1 1
1284*4882a593Smuzhiyun /* MIN branch version supporting join iovar versioning */
1285*4882a593Smuzhiyun #define MIN_JOINEXT_V1_FW_MAJOR 17u
1286*4882a593Smuzhiyun /* Branch/es supporting join iovar versioning prior to
1287*4882a593Smuzhiyun * MIN_JOINEXT_V1_FW_MAJOR
1288*4882a593Smuzhiyun */
1289*4882a593Smuzhiyun #define MIN_JOINEXT_V1_BR2_FW_MAJOR 16u
1290*4882a593Smuzhiyun #define MIN_JOINEXT_V1_BR2_FW_MINOR 1u
1291*4882a593Smuzhiyun
1292*4882a593Smuzhiyun #define MIN_JOINEXT_V1_BR1_FW_MAJOR 14u
1293*4882a593Smuzhiyun #define MIN_JOINEXT_V1_BR1_FW_MINOR 2u
1294*4882a593Smuzhiyun
1295*4882a593Smuzhiyun #define PMKDB_WLC_VER 14
1296*4882a593Smuzhiyun #define MIN_PMKID_LIST_V3_FW_MAJOR 13
1297*4882a593Smuzhiyun #define MIN_PMKID_LIST_V3_FW_MINOR 0
1298*4882a593Smuzhiyun
1299*4882a593Smuzhiyun #define MIN_PMKID_LIST_V2_FW_MAJOR 12
1300*4882a593Smuzhiyun #define MIN_PMKID_LIST_V2_FW_MINOR 0
1301*4882a593Smuzhiyun
1302*4882a593Smuzhiyun /* wpa2 pmk list */
1303*4882a593Smuzhiyun struct wl_pmk_list {
1304*4882a593Smuzhiyun pmkid_list_v3_t pmkids;
1305*4882a593Smuzhiyun pmkid_v3_t foo[MAXPMKID];
1306*4882a593Smuzhiyun };
1307*4882a593Smuzhiyun
1308*4882a593Smuzhiyun #define KEY_PERM_PMK 0xFFFFFFFF
1309*4882a593Smuzhiyun
1310*4882a593Smuzhiyun #ifdef DHD_MAX_IFS
1311*4882a593Smuzhiyun #define WL_MAX_IFS DHD_MAX_IFS
1312*4882a593Smuzhiyun #else
1313*4882a593Smuzhiyun #define WL_MAX_IFS 16
1314*4882a593Smuzhiyun #endif
1315*4882a593Smuzhiyun
1316*4882a593Smuzhiyun #define MAC_RAND_BYTES 3
1317*4882a593Smuzhiyun #define ESCAN_BUF_SIZE (64 * 1024)
1318*4882a593Smuzhiyun
1319*4882a593Smuzhiyun struct escan_info {
1320*4882a593Smuzhiyun u32 escan_state;
1321*4882a593Smuzhiyun #ifdef STATIC_WL_PRIV_STRUCT
1322*4882a593Smuzhiyun #ifndef CONFIG_DHD_USE_STATIC_BUF
1323*4882a593Smuzhiyun #error STATIC_WL_PRIV_STRUCT should be used with CONFIG_DHD_USE_STATIC_BUF
1324*4882a593Smuzhiyun #endif /* CONFIG_DHD_USE_STATIC_BUF */
1325*4882a593Smuzhiyun #ifdef DUAL_ESCAN_RESULT_BUFFER
1326*4882a593Smuzhiyun u8 *escan_buf[2];
1327*4882a593Smuzhiyun #else
1328*4882a593Smuzhiyun u8 *escan_buf;
1329*4882a593Smuzhiyun #endif /* DUAL_ESCAN_RESULT_BUFFER */
1330*4882a593Smuzhiyun #else
1331*4882a593Smuzhiyun #ifdef DUAL_ESCAN_RESULT_BUFFER
1332*4882a593Smuzhiyun u8 escan_buf[2][ESCAN_BUF_SIZE];
1333*4882a593Smuzhiyun #else
1334*4882a593Smuzhiyun u8 escan_buf[ESCAN_BUF_SIZE];
1335*4882a593Smuzhiyun #endif /* DUAL_ESCAN_RESULT_BUFFER */
1336*4882a593Smuzhiyun #endif /* STATIC_WL_PRIV_STRUCT */
1337*4882a593Smuzhiyun #ifdef DUAL_ESCAN_RESULT_BUFFER
1338*4882a593Smuzhiyun u8 cur_sync_id;
1339*4882a593Smuzhiyun u8 escan_type[2];
1340*4882a593Smuzhiyun #endif /* DUAL_ESCAN_RESULT_BUFFER */
1341*4882a593Smuzhiyun struct wiphy *wiphy;
1342*4882a593Smuzhiyun struct net_device *ndev;
1343*4882a593Smuzhiyun #ifdef DHD_SEND_HANG_ESCAN_SYNCID_MISMATCH
1344*4882a593Smuzhiyun bool prev_escan_aborted;
1345*4882a593Smuzhiyun #endif /* DHD_SEND_HANG_ESCAN_SYNCID_MISMATCH */
1346*4882a593Smuzhiyun };
1347*4882a593Smuzhiyun
1348*4882a593Smuzhiyun #ifdef ESCAN_BUF_OVERFLOW_MGMT
1349*4882a593Smuzhiyun #define BUF_OVERFLOW_MGMT_COUNT 3
1350*4882a593Smuzhiyun typedef struct {
1351*4882a593Smuzhiyun int RSSI;
1352*4882a593Smuzhiyun int length;
1353*4882a593Smuzhiyun struct ether_addr BSSID;
1354*4882a593Smuzhiyun } removal_element_t;
1355*4882a593Smuzhiyun #endif /* ESCAN_BUF_OVERFLOW_MGMT */
1356*4882a593Smuzhiyun
1357*4882a593Smuzhiyun struct afx_hdl {
1358*4882a593Smuzhiyun wl_af_params_t *pending_tx_act_frm;
1359*4882a593Smuzhiyun struct ether_addr tx_dst_addr;
1360*4882a593Smuzhiyun struct net_device *dev;
1361*4882a593Smuzhiyun struct work_struct work;
1362*4882a593Smuzhiyun s32 bssidx;
1363*4882a593Smuzhiyun u32 retry;
1364*4882a593Smuzhiyun s32 peer_chan;
1365*4882a593Smuzhiyun s32 peer_listen_chan; /* search channel: configured by upper layer */
1366*4882a593Smuzhiyun s32 my_listen_chan; /* listen chanel: extract it from prb req or gon req */
1367*4882a593Smuzhiyun bool is_listen;
1368*4882a593Smuzhiyun bool ack_recv;
1369*4882a593Smuzhiyun bool is_active;
1370*4882a593Smuzhiyun };
1371*4882a593Smuzhiyun
1372*4882a593Smuzhiyun struct parsed_ies {
1373*4882a593Smuzhiyun const wpa_ie_fixed_t *wps_ie;
1374*4882a593Smuzhiyun u32 wps_ie_len;
1375*4882a593Smuzhiyun const wpa_ie_fixed_t *wpa_ie;
1376*4882a593Smuzhiyun u32 wpa_ie_len;
1377*4882a593Smuzhiyun const bcm_tlv_t *wpa2_ie;
1378*4882a593Smuzhiyun u32 wpa2_ie_len;
1379*4882a593Smuzhiyun const bcm_tlv_t *fils_ind_ie;
1380*4882a593Smuzhiyun u32 fils_ind_ie_len;
1381*4882a593Smuzhiyun };
1382*4882a593Smuzhiyun
1383*4882a593Smuzhiyun #ifdef WL_SDO
1384*4882a593Smuzhiyun /* Service discovery */
1385*4882a593Smuzhiyun typedef struct {
1386*4882a593Smuzhiyun uint8 transaction_id; /* Transaction ID */
1387*4882a593Smuzhiyun uint8 protocol; /* Service protocol type */
1388*4882a593Smuzhiyun uint16 query_len; /* Length of query */
1389*4882a593Smuzhiyun uint16 response_len; /* Length of response */
1390*4882a593Smuzhiyun uint8 qrbuf[1];
1391*4882a593Smuzhiyun } wl_sd_qr_t;
1392*4882a593Smuzhiyun
1393*4882a593Smuzhiyun typedef struct {
1394*4882a593Smuzhiyun uint16 period; /* extended listen period */
1395*4882a593Smuzhiyun uint16 interval; /* extended listen interval */
1396*4882a593Smuzhiyun } wl_sd_listen_t;
1397*4882a593Smuzhiyun
1398*4882a593Smuzhiyun #define WL_SD_STATE_IDLE 0x0000
1399*4882a593Smuzhiyun #define WL_SD_SEARCH_SVC 0x0001
1400*4882a593Smuzhiyun #define WL_SD_ADV_SVC 0x0002
1401*4882a593Smuzhiyun
1402*4882a593Smuzhiyun enum wl_dd_state {
1403*4882a593Smuzhiyun WL_DD_STATE_IDLE,
1404*4882a593Smuzhiyun WL_DD_STATE_SEARCH,
1405*4882a593Smuzhiyun WL_DD_STATE_LISTEN
1406*4882a593Smuzhiyun };
1407*4882a593Smuzhiyun
1408*4882a593Smuzhiyun #define MAX_SDO_PROTO_STR_LEN 20
1409*4882a593Smuzhiyun typedef struct wl_sdo_proto {
1410*4882a593Smuzhiyun char str[MAX_SDO_PROTO_STR_LEN];
1411*4882a593Smuzhiyun u32 val;
1412*4882a593Smuzhiyun } wl_sdo_proto_t;
1413*4882a593Smuzhiyun
1414*4882a593Smuzhiyun typedef struct sd_offload {
1415*4882a593Smuzhiyun u32 sd_state;
1416*4882a593Smuzhiyun enum wl_dd_state dd_state;
1417*4882a593Smuzhiyun wl_sd_listen_t sd_listen;
1418*4882a593Smuzhiyun } sd_offload_t;
1419*4882a593Smuzhiyun
1420*4882a593Smuzhiyun typedef struct sdo_event {
1421*4882a593Smuzhiyun u8 addr[ETH_ALEN];
1422*4882a593Smuzhiyun uint16 freq; /* channel Freq */
1423*4882a593Smuzhiyun uint8 count; /* Tlv count */
1424*4882a593Smuzhiyun uint16 update_ind;
1425*4882a593Smuzhiyun } sdo_event_t;
1426*4882a593Smuzhiyun #endif /* WL_SDO */
1427*4882a593Smuzhiyun
1428*4882a593Smuzhiyun #ifdef P2P_LISTEN_OFFLOADING
1429*4882a593Smuzhiyun typedef struct {
1430*4882a593Smuzhiyun uint16 period; /* listen offload period */
1431*4882a593Smuzhiyun uint16 interval; /* listen offload interval */
1432*4882a593Smuzhiyun uint16 count; /* listen offload count */
1433*4882a593Smuzhiyun uint16 pad; /* pad for 32bit align */
1434*4882a593Smuzhiyun } wl_p2plo_listen_t;
1435*4882a593Smuzhiyun #endif /* P2P_LISTEN_OFFLOADING */
1436*4882a593Smuzhiyun
1437*4882a593Smuzhiyun #ifdef WL11U
1438*4882a593Smuzhiyun /* Max length of Interworking element */
1439*4882a593Smuzhiyun #define IW_IES_MAX_BUF_LEN 8
1440*4882a593Smuzhiyun #endif
1441*4882a593Smuzhiyun #ifdef WLFBT
1442*4882a593Smuzhiyun #define FBT_KEYLEN 32
1443*4882a593Smuzhiyun #endif
1444*4882a593Smuzhiyun #define MAX_EVENT_BUF_NUM 16
1445*4882a593Smuzhiyun typedef struct wl_eventmsg_buf {
1446*4882a593Smuzhiyun u16 num;
1447*4882a593Smuzhiyun struct {
1448*4882a593Smuzhiyun u16 type;
1449*4882a593Smuzhiyun bool set;
1450*4882a593Smuzhiyun } event [MAX_EVENT_BUF_NUM];
1451*4882a593Smuzhiyun } wl_eventmsg_buf_t;
1452*4882a593Smuzhiyun
1453*4882a593Smuzhiyun typedef struct wl_if_event_info {
1454*4882a593Smuzhiyun bool valid;
1455*4882a593Smuzhiyun int ifidx;
1456*4882a593Smuzhiyun int bssidx;
1457*4882a593Smuzhiyun uint8 mac[ETHER_ADDR_LEN];
1458*4882a593Smuzhiyun char name[IFNAMSIZ+1];
1459*4882a593Smuzhiyun uint8 role;
1460*4882a593Smuzhiyun } wl_if_event_info;
1461*4882a593Smuzhiyun
1462*4882a593Smuzhiyun #ifdef SUPPORT_AP_RADIO_PWRSAVE
1463*4882a593Smuzhiyun typedef struct ap_rps_info {
1464*4882a593Smuzhiyun bool enable;
1465*4882a593Smuzhiyun int sta_assoc_check;
1466*4882a593Smuzhiyun int pps;
1467*4882a593Smuzhiyun int quiet_time;
1468*4882a593Smuzhiyun int level;
1469*4882a593Smuzhiyun } ap_rps_info_t;
1470*4882a593Smuzhiyun #endif /* SUPPORT_AP_RADIO_PWRSAVE */
1471*4882a593Smuzhiyun
1472*4882a593Smuzhiyun #ifdef SUPPORT_RSSI_SUM_REPORT
1473*4882a593Smuzhiyun #define RSSILOG_FLAG_FEATURE_SW 0x1
1474*4882a593Smuzhiyun #define RSSILOG_FLAG_REPORT_READY 0x2
1475*4882a593Smuzhiyun typedef struct rssilog_set_param {
1476*4882a593Smuzhiyun uint8 enable;
1477*4882a593Smuzhiyun uint8 rssi_threshold;
1478*4882a593Smuzhiyun uint8 time_threshold;
1479*4882a593Smuzhiyun uint8 pad;
1480*4882a593Smuzhiyun } rssilog_set_param_t;
1481*4882a593Smuzhiyun
1482*4882a593Smuzhiyun typedef struct rssilog_get_param {
1483*4882a593Smuzhiyun uint8 report_count;
1484*4882a593Smuzhiyun uint8 enable;
1485*4882a593Smuzhiyun uint8 rssi_threshold;
1486*4882a593Smuzhiyun uint8 time_threshold;
1487*4882a593Smuzhiyun } rssilog_get_param_t;
1488*4882a593Smuzhiyun
1489*4882a593Smuzhiyun typedef struct rssi_ant_param {
1490*4882a593Smuzhiyun struct ether_addr ea;
1491*4882a593Smuzhiyun chanspec_t chanspec;
1492*4882a593Smuzhiyun } rssi_ant_param_t;
1493*4882a593Smuzhiyun
1494*4882a593Smuzhiyun typedef struct wl_rssi_ant_mimo {
1495*4882a593Smuzhiyun uint32 version;
1496*4882a593Smuzhiyun uint32 count;
1497*4882a593Smuzhiyun int8 rssi_ant[WL_RSSI_ANT_MAX];
1498*4882a593Smuzhiyun int8 rssi_sum;
1499*4882a593Smuzhiyun int8 PAD[3];
1500*4882a593Smuzhiyun } wl_rssi_ant_mimo_t;
1501*4882a593Smuzhiyun #endif /* SUPPORT_RSSI_SUM_REPORT */
1502*4882a593Smuzhiyun
1503*4882a593Smuzhiyun /* MBO-OCE prune event reason codes */
1504*4882a593Smuzhiyun #if defined(WL_MBO) || defined(WL_OCE)
1505*4882a593Smuzhiyun typedef enum wl_prune_evt_reason {
1506*4882a593Smuzhiyun WIFI_PRUNE_UNSPECIFIED = 0, /* Unspecified event reason code */
1507*4882a593Smuzhiyun WIFI_PRUNE_ASSOC_RETRY_DELAY = 1, /* MBO assoc retry delay */
1508*4882a593Smuzhiyun WIFI_PRUNE_RSSI_ASSOC_REJ = 2 /* OCE RSSI-based assoc rejection */
1509*4882a593Smuzhiyun } wl_prune_evt_reason_t;
1510*4882a593Smuzhiyun #endif /* WL_MBO || WL_OCE */
1511*4882a593Smuzhiyun
1512*4882a593Smuzhiyun #if defined(DHD_ENABLE_BIGDATA_LOGGING)
1513*4882a593Smuzhiyun #define GET_BSS_INFO_LEN 90
1514*4882a593Smuzhiyun #endif /* DHD_ENABLE_BIGDATA_LOGGING */
1515*4882a593Smuzhiyun
1516*4882a593Smuzhiyun #ifdef WL_MBO
1517*4882a593Smuzhiyun typedef struct wl_event_mbo wl_event_mbo_t;
1518*4882a593Smuzhiyun typedef struct wl_event_mbo_cell_nw_switch wl_event_mbo_cell_nw_switch_t;
1519*4882a593Smuzhiyun typedef struct wl_btm_event_type_data wl_btm_event_type_data_t;
1520*4882a593Smuzhiyun #endif /* WL_MBO */
1521*4882a593Smuzhiyun
1522*4882a593Smuzhiyun #if defined(WL_MBO) || defined(WL_OCE)
1523*4882a593Smuzhiyun typedef struct wl_bssid_prune_evt_info wl_bssid_pruned_evt_info_t;
1524*4882a593Smuzhiyun #endif /* WL_MBO || WL_OCE */
1525*4882a593Smuzhiyun
1526*4882a593Smuzhiyun #define WL_CCODE_LEN 2
1527*4882a593Smuzhiyun
1528*4882a593Smuzhiyun #ifdef WL_NAN
1529*4882a593Smuzhiyun #ifdef WL_NANP2P
1530*4882a593Smuzhiyun #define WL_CFG_P2P_DISC_BIT 0x1u
1531*4882a593Smuzhiyun #define WL_CFG_NAN_DISC_BIT 0x2u
1532*4882a593Smuzhiyun #define WL_NANP2P_CONC_SUPPORT (WL_CFG_P2P_DISC_BIT | WL_CFG_NAN_DISC_BIT)
1533*4882a593Smuzhiyun #endif /* WL_NAN2P */
1534*4882a593Smuzhiyun #endif /* WL_NAN */
1535*4882a593Smuzhiyun
1536*4882a593Smuzhiyun #ifdef WL_IFACE_MGMT
1537*4882a593Smuzhiyun #define WL_IFACE_NOT_PRESENT -1
1538*4882a593Smuzhiyun
1539*4882a593Smuzhiyun typedef enum iface_conc_policy {
1540*4882a593Smuzhiyun WL_IF_POLICY_DEFAULT = 0,
1541*4882a593Smuzhiyun WL_IF_POLICY_FCFS = 1,
1542*4882a593Smuzhiyun WL_IF_POLICY_LP = 2,
1543*4882a593Smuzhiyun WL_IF_POLICY_ROLE_PRIORITY = 3,
1544*4882a593Smuzhiyun WL_IF_POLICY_CUSTOM = 4,
1545*4882a593Smuzhiyun WL_IF_POLICY_INVALID
1546*4882a593Smuzhiyun } iface_conc_policy_t;
1547*4882a593Smuzhiyun
1548*4882a593Smuzhiyun typedef struct iface_mgmt_data {
1549*4882a593Smuzhiyun uint8 policy;
1550*4882a593Smuzhiyun uint8 priority[WL_IF_TYPE_MAX];
1551*4882a593Smuzhiyun } iface_mgmt_data_t;
1552*4882a593Smuzhiyun #endif /* WL_IFACE_MGMT */
1553*4882a593Smuzhiyun
1554*4882a593Smuzhiyun #ifdef WL_WPS_SYNC
1555*4882a593Smuzhiyun #define EAP_PACKET 0
1556*4882a593Smuzhiyun #define EAP_EXPANDED_TYPE 254
1557*4882a593Smuzhiyun #define EAP_EXP_OPCODE_OFFSET 7
1558*4882a593Smuzhiyun #define EAP_EXP_FRAGMENT_LEN_OFFSET 2
1559*4882a593Smuzhiyun #define EAP_EXP_FLAGS_FRAGMENTED_DATA 2
1560*4882a593Smuzhiyun #define EAP_EXP_FLAGS_MORE_DATA 1
1561*4882a593Smuzhiyun #define EAPOL_EAP_HDR_LEN 5
1562*4882a593Smuzhiyun #define EAP_EXP_HDR_MIN_LENGTH (EAPOL_EAP_HDR_LEN + EAP_EXP_OPCODE_OFFSET)
1563*4882a593Smuzhiyun #define EAP_ATTRIB_MSGTYPE 0x1022
1564*4882a593Smuzhiyun #define EAP_WSC_UPNP 0
1565*4882a593Smuzhiyun #define EAP_WSC_START 1
1566*4882a593Smuzhiyun #define EAP_WSC_ACK 2
1567*4882a593Smuzhiyun #define EAP_WSC_NACK 3
1568*4882a593Smuzhiyun #define EAP_WSC_MSG 4
1569*4882a593Smuzhiyun #define EAP_WSC_DONE 5
1570*4882a593Smuzhiyun #define EAP_WSC_MSG_M8 12
1571*4882a593Smuzhiyun #define EAP_CODE_FAILURE 4
1572*4882a593Smuzhiyun #define WL_WPS_REAUTH_TIMEOUT 10000
1573*4882a593Smuzhiyun
1574*4882a593Smuzhiyun struct wl_eap_header {
1575*4882a593Smuzhiyun unsigned char code; /* EAP code */
1576*4882a593Smuzhiyun unsigned char id; /* Current request ID */
1577*4882a593Smuzhiyun unsigned short length; /* Length including header */
1578*4882a593Smuzhiyun unsigned char type; /* EAP type (optional) */
1579*4882a593Smuzhiyun unsigned char data[1]; /* Type data (optional) */
1580*4882a593Smuzhiyun } __attribute__ ((packed));
1581*4882a593Smuzhiyun typedef struct wl_eap_header wl_eap_header_t;
1582*4882a593Smuzhiyun
1583*4882a593Smuzhiyun typedef enum wl_wps_state {
1584*4882a593Smuzhiyun WPS_STATE_IDLE = 0,
1585*4882a593Smuzhiyun WPS_STATE_STARTED,
1586*4882a593Smuzhiyun WPS_STATE_M8_SENT,
1587*4882a593Smuzhiyun WPS_STATE_M8_RECVD,
1588*4882a593Smuzhiyun WPS_STATE_EAP_FAIL,
1589*4882a593Smuzhiyun WPS_STATE_REAUTH_WAIT,
1590*4882a593Smuzhiyun WPS_STATE_LINKUP,
1591*4882a593Smuzhiyun WPS_STATE_LINKDOWN,
1592*4882a593Smuzhiyun WPS_STATE_DISCONNECT,
1593*4882a593Smuzhiyun WPS_STATE_DISCONNECT_CLIENT,
1594*4882a593Smuzhiyun WPS_STATE_CONNECT_FAIL,
1595*4882a593Smuzhiyun WPS_STATE_AUTHORIZE,
1596*4882a593Smuzhiyun WPS_STATE_DONE,
1597*4882a593Smuzhiyun WPS_STATE_INVALID
1598*4882a593Smuzhiyun } wl_wps_state_t;
1599*4882a593Smuzhiyun
1600*4882a593Smuzhiyun #define WPS_MAX_SESSIONS 2
1601*4882a593Smuzhiyun typedef struct wl_wps_session {
1602*4882a593Smuzhiyun bool in_use;
1603*4882a593Smuzhiyun timer_list_compat_t timer;
1604*4882a593Smuzhiyun struct net_device *ndev;
1605*4882a593Smuzhiyun wl_wps_state_t state;
1606*4882a593Smuzhiyun u16 mode;
1607*4882a593Smuzhiyun u8 peer_mac[ETHER_ADDR_LEN];
1608*4882a593Smuzhiyun } wl_wps_session_t;
1609*4882a593Smuzhiyun #endif /* WL_WPS_SYNC */
1610*4882a593Smuzhiyun
1611*4882a593Smuzhiyun #ifndef WL_STATIC_IFNAME_PREFIX
1612*4882a593Smuzhiyun #define WL_STATIC_IFNAME_PREFIX "wlan%d"
1613*4882a593Smuzhiyun #endif /* WL_STATIC_IFNAME */
1614*4882a593Smuzhiyun
1615*4882a593Smuzhiyun typedef struct buf_data {
1616*4882a593Smuzhiyun u32 ver; /* version of struct */
1617*4882a593Smuzhiyun u32 len; /* Total len */
1618*4882a593Smuzhiyun /* size of each buffer in case of split buffers (0 - single buffer). */
1619*4882a593Smuzhiyun u32 buf_threshold;
1620*4882a593Smuzhiyun const void *data_buf[1]; /* array of user space buffer pointers. */
1621*4882a593Smuzhiyun } buf_data_t;
1622*4882a593Smuzhiyun
1623*4882a593Smuzhiyun typedef struct wl_loc_info {
1624*4882a593Smuzhiyun bool in_progress; /* for tracking listen in progress */
1625*4882a593Smuzhiyun struct delayed_work work; /* for taking care of listen timeout */
1626*4882a593Smuzhiyun struct wireless_dev *wdev; /* interface on which listen is requested */
1627*4882a593Smuzhiyun } wl_loc_info_t;
1628*4882a593Smuzhiyun
1629*4882a593Smuzhiyun typedef enum wl_sar_modes {
1630*4882a593Smuzhiyun HEAD_SAR_BACKOFF_DISABLE = -1,
1631*4882a593Smuzhiyun HEAD_SAR_BACKOFF_ENABLE = 0,
1632*4882a593Smuzhiyun GRIP_SAR_BACKOFF_DISABLE,
1633*4882a593Smuzhiyun GRIP_SAR_BACKOFF_ENABLE,
1634*4882a593Smuzhiyun NR_mmWave_SAR_BACKOFF_DISABLE,
1635*4882a593Smuzhiyun NR_mmWave_SAR_BACKOFF_ENABLE,
1636*4882a593Smuzhiyun NR_Sub6_SAR_BACKOFF_DISABLE,
1637*4882a593Smuzhiyun NR_Sub6_SAR_BACKOFF_ENABLE,
1638*4882a593Smuzhiyun SAR_BACKOFF_DISABLE_ALL
1639*4882a593Smuzhiyun } wl_sar_modes_t;
1640*4882a593Smuzhiyun
1641*4882a593Smuzhiyun /* Pre selected Power scenarios to be applied from BDF file */
1642*4882a593Smuzhiyun typedef enum {
1643*4882a593Smuzhiyun WIFI_POWER_SCENARIO_INVALID = -2,
1644*4882a593Smuzhiyun WIFI_POWER_SCENARIO_DEFAULT = -1,
1645*4882a593Smuzhiyun WIFI_POWER_SCENARIO_VOICE_CALL = 0,
1646*4882a593Smuzhiyun WIFI_POWER_SCENARIO_ON_HEAD_CELL_OFF = 1,
1647*4882a593Smuzhiyun WIFI_POWER_SCENARIO_ON_HEAD_CELL_ON = 2,
1648*4882a593Smuzhiyun WIFI_POWER_SCENARIO_ON_BODY_CELL_OFF = 3,
1649*4882a593Smuzhiyun WIFI_POWER_SCENARIO_ON_BODY_CELL_ON = 4,
1650*4882a593Smuzhiyun WIFI_POWER_SCENARIO_ON_BODY_BT = 5
1651*4882a593Smuzhiyun } wifi_power_scenario;
1652*4882a593Smuzhiyun
1653*4882a593Smuzhiyun /* Log timestamp */
1654*4882a593Smuzhiyun #define LOG_TS(cfg, ts) cfg->tsinfo.ts = OSL_LOCALTIME_NS();
1655*4882a593Smuzhiyun #define CLR_TS(cfg, ts) cfg->tsinfo.ts = 0;
1656*4882a593Smuzhiyun #define GET_TS(cfg, ts) cfg->tsinfo.ts;
1657*4882a593Smuzhiyun typedef struct wl_ctx_tsinfo {
1658*4882a593Smuzhiyun uint64 scan_start;
1659*4882a593Smuzhiyun uint64 scan_enq; /* scan event enqueue time */
1660*4882a593Smuzhiyun uint64 scan_deq;
1661*4882a593Smuzhiyun uint64 scan_hdlr_cmplt;
1662*4882a593Smuzhiyun uint64 scan_cmplt; /* scan event handler completion */
1663*4882a593Smuzhiyun uint64 conn_start;
1664*4882a593Smuzhiyun uint64 conn_cmplt;
1665*4882a593Smuzhiyun uint64 wl_evt_deq;
1666*4882a593Smuzhiyun uint64 authorize_start;
1667*4882a593Smuzhiyun uint64 authorize_cmplt;
1668*4882a593Smuzhiyun uint64 wl_evt_hdlr_entry;
1669*4882a593Smuzhiyun uint64 wl_evt_hdlr_exit;
1670*4882a593Smuzhiyun } wl_ctx_tsinfo_t;
1671*4882a593Smuzhiyun
1672*4882a593Smuzhiyun typedef struct wlcfg_assoc_info {
1673*4882a593Smuzhiyun bool targeted_join; /* Unicast bssid. Host selected bssid for join */
1674*4882a593Smuzhiyun bool reassoc;
1675*4882a593Smuzhiyun bool bssid_hint;
1676*4882a593Smuzhiyun u8 bssid[ETH_ALEN];
1677*4882a593Smuzhiyun u16 ssid_len;
1678*4882a593Smuzhiyun u8 ssid[DOT11_MAX_SSID_LEN];
1679*4882a593Smuzhiyun s32 bssidx;
1680*4882a593Smuzhiyun u32 chan_cnt;
1681*4882a593Smuzhiyun chanspec_t chanspecs[MAX_ROAM_CHANNEL];
1682*4882a593Smuzhiyun } wlcfg_assoc_info_t;
1683*4882a593Smuzhiyun
1684*4882a593Smuzhiyun #define MAX_NUM_OF_ASSOCIATED_DEV 64
1685*4882a593Smuzhiyun struct bcm_assoclist {
1686*4882a593Smuzhiyun u32 count;
1687*4882a593Smuzhiyun u8 mac[MAX_NUM_OF_ASSOCIATED_DEV][ETH_ALEN];
1688*4882a593Smuzhiyun };
1689*4882a593Smuzhiyun
1690*4882a593Smuzhiyun typedef struct wl_event_idx {
1691*4882a593Smuzhiyun u32 enqd;
1692*4882a593Smuzhiyun u32 in_progress;
1693*4882a593Smuzhiyun u32 event_type;
1694*4882a593Smuzhiyun u32 min_connect_idx;
1695*4882a593Smuzhiyun } wl_event_idx_t;
1696*4882a593Smuzhiyun
1697*4882a593Smuzhiyun /* private data of cfg80211 interface */
1698*4882a593Smuzhiyun struct bcm_cfg80211 {
1699*4882a593Smuzhiyun struct wireless_dev *wdev; /* representing cfg cfg80211 device */
1700*4882a593Smuzhiyun
1701*4882a593Smuzhiyun struct wireless_dev *p2p_wdev; /* representing cfg cfg80211 device for P2P */
1702*4882a593Smuzhiyun struct net_device *p2p_net; /* reference to p2p0 interface */
1703*4882a593Smuzhiyun
1704*4882a593Smuzhiyun struct wl_conf *conf;
1705*4882a593Smuzhiyun struct cfg80211_scan_request *scan_request; /* scan request object */
1706*4882a593Smuzhiyun EVENT_HANDLER evt_handler[WLC_E_LAST];
1707*4882a593Smuzhiyun struct list_head eq_list; /* used for event queue */
1708*4882a593Smuzhiyun struct list_head net_list; /* used for struct net_info */
1709*4882a593Smuzhiyun spinlock_t net_list_sync; /* to protect scan status (and others if needed) */
1710*4882a593Smuzhiyun spinlock_t eq_lock; /* for event queue synchronization */
1711*4882a593Smuzhiyun spinlock_t cfgdrv_lock; /* to protect scan status (and others if needed) */
1712*4882a593Smuzhiyun struct completion act_frm_scan;
1713*4882a593Smuzhiyun struct completion iface_disable;
1714*4882a593Smuzhiyun struct completion wait_next_af;
1715*4882a593Smuzhiyun struct mutex usr_sync; /* maily for up/down synchronization */
1716*4882a593Smuzhiyun struct mutex if_sync; /* maily for iface op synchronization */
1717*4882a593Smuzhiyun struct mutex scan_sync; /* scan sync from different scan contexts */
1718*4882a593Smuzhiyun wl_scan_results_t *bss_list;
1719*4882a593Smuzhiyun wl_scan_results_t *scan_results;
1720*4882a593Smuzhiyun
1721*4882a593Smuzhiyun /* scan request object for internal purpose */
1722*4882a593Smuzhiyun struct wl_scan_req *scan_req_int;
1723*4882a593Smuzhiyun /* information element object for internal purpose */
1724*4882a593Smuzhiyun #if defined(STATIC_WL_PRIV_STRUCT)
1725*4882a593Smuzhiyun struct wl_ie *ie;
1726*4882a593Smuzhiyun #else
1727*4882a593Smuzhiyun struct wl_ie ie;
1728*4882a593Smuzhiyun #endif
1729*4882a593Smuzhiyun
1730*4882a593Smuzhiyun /* association information container */
1731*4882a593Smuzhiyun #if defined(STATIC_WL_PRIV_STRUCT)
1732*4882a593Smuzhiyun struct wl_connect_info *conn_info;
1733*4882a593Smuzhiyun #else
1734*4882a593Smuzhiyun struct wl_connect_info conn_info;
1735*4882a593Smuzhiyun #endif
1736*4882a593Smuzhiyun struct wl_pmk_list *pmk_list; /* wpa2 pmk list */
1737*4882a593Smuzhiyun tsk_ctl_t event_tsk; /* task of main event handler thread */
1738*4882a593Smuzhiyun dhd_pub_t *pub;
1739*4882a593Smuzhiyun u32 iface_cnt;
1740*4882a593Smuzhiyun u32 channel; /* current channel */
1741*4882a593Smuzhiyun u32 af_sent_channel; /* channel action frame is sent */
1742*4882a593Smuzhiyun /* next af subtype to cancel the remained dwell time in rx process */
1743*4882a593Smuzhiyun u8 next_af_subtype;
1744*4882a593Smuzhiyun #ifdef WL_CFG80211_SYNC_GON
1745*4882a593Smuzhiyun ulong af_tx_sent_jiffies;
1746*4882a593Smuzhiyun #endif /* WL_CFG80211_SYNC_GON */
1747*4882a593Smuzhiyun struct escan_info escan_info; /* escan information */
1748*4882a593Smuzhiyun bool active_scan; /* current scan mode */
1749*4882a593Smuzhiyun bool ibss_starter; /* indicates this sta is ibss starter */
1750*4882a593Smuzhiyun bool link_up; /* link/connection up flag */
1751*4882a593Smuzhiyun
1752*4882a593Smuzhiyun /* indicate whether chip to support power save mode */
1753*4882a593Smuzhiyun bool pwr_save;
1754*4882a593Smuzhiyun bool roam_on; /* on/off switch for self-roaming */
1755*4882a593Smuzhiyun bool scan_tried; /* indicates if first scan attempted */
1756*4882a593Smuzhiyun #if defined(BCMSDIO) || defined(BCMDBUS)
1757*4882a593Smuzhiyun bool wlfc_on;
1758*4882a593Smuzhiyun #endif
1759*4882a593Smuzhiyun bool vsdb_mode;
1760*4882a593Smuzhiyun #define WL_ROAM_OFF_ON_CONCURRENT 0x0001
1761*4882a593Smuzhiyun #define WL_ROAM_REVERT_STATUS 0x0002
1762*4882a593Smuzhiyun u32 roam_flags;
1763*4882a593Smuzhiyun u8 *ioctl_buf; /* ioctl buffer */
1764*4882a593Smuzhiyun struct mutex ioctl_buf_sync;
1765*4882a593Smuzhiyun u8 *escan_ioctl_buf;
1766*4882a593Smuzhiyun u8 *extra_buf; /* maily to grab assoc information */
1767*4882a593Smuzhiyun struct dentry *debugfsdir;
1768*4882a593Smuzhiyun struct rfkill *rfkill;
1769*4882a593Smuzhiyun bool rf_blocked;
1770*4882a593Smuzhiyun struct ieee80211_channel remain_on_chan;
1771*4882a593Smuzhiyun enum nl80211_channel_type remain_on_chan_type;
1772*4882a593Smuzhiyun u64 send_action_id;
1773*4882a593Smuzhiyun u64 last_roc_id;
1774*4882a593Smuzhiyun wait_queue_head_t netif_change_event;
1775*4882a593Smuzhiyun wl_if_event_info if_event_info;
1776*4882a593Smuzhiyun struct completion send_af_done;
1777*4882a593Smuzhiyun struct afx_hdl *afx_hdl;
1778*4882a593Smuzhiyun struct p2p_info *p2p;
1779*4882a593Smuzhiyun bool p2p_supported;
1780*4882a593Smuzhiyun void *btcoex_info;
1781*4882a593Smuzhiyun timer_list_compat_t scan_timeout; /* Timer for catch scan event timeout */
1782*4882a593Smuzhiyun #ifdef WL_CFG80211_GON_COLLISION
1783*4882a593Smuzhiyun u8 block_gon_req_tx_count;
1784*4882a593Smuzhiyun u8 block_gon_req_rx_count;
1785*4882a593Smuzhiyun #endif /* WL_CFG80211_GON_COLLISION */
1786*4882a593Smuzhiyun #if defined(P2P_IE_MISSING_FIX)
1787*4882a593Smuzhiyun bool p2p_prb_noti;
1788*4882a593Smuzhiyun #endif
1789*4882a593Smuzhiyun s32(*state_notifier) (struct bcm_cfg80211 *cfg,
1790*4882a593Smuzhiyun struct net_info *_net_info, enum wl_status state, bool set);
1791*4882a593Smuzhiyun unsigned long interrested_state;
1792*4882a593Smuzhiyun wlc_ssid_t hostapd_ssid;
1793*4882a593Smuzhiyun #ifdef WL_SDO
1794*4882a593Smuzhiyun sd_offload_t *sdo;
1795*4882a593Smuzhiyun #endif
1796*4882a593Smuzhiyun #ifdef WL11U
1797*4882a593Smuzhiyun bool wl11u;
1798*4882a593Smuzhiyun #endif /* WL11U */
1799*4882a593Smuzhiyun bool sched_scan_running; /* scheduled scan req status */
1800*4882a593Smuzhiyun struct cfg80211_sched_scan_request *sched_scan_req; /* scheduled scan req */
1801*4882a593Smuzhiyun #ifdef WL_HOST_BAND_MGMT
1802*4882a593Smuzhiyun u8 curr_band;
1803*4882a593Smuzhiyun #endif /* WL_HOST_BAND_MGMT */
1804*4882a593Smuzhiyun bool scan_suppressed;
1805*4882a593Smuzhiyun
1806*4882a593Smuzhiyun #ifdef OEM_ANDROID
1807*4882a593Smuzhiyun timer_list_compat_t scan_supp_timer;
1808*4882a593Smuzhiyun struct work_struct wlan_work;
1809*4882a593Smuzhiyun #endif /* OEM_ANDROID */
1810*4882a593Smuzhiyun
1811*4882a593Smuzhiyun struct mutex event_sync; /* maily for up/down synchronization */
1812*4882a593Smuzhiyun bool disable_roam_event;
1813*4882a593Smuzhiyun struct delayed_work pm_enable_work;
1814*4882a593Smuzhiyun
1815*4882a593Smuzhiyun #ifdef OEM_ANDROID
1816*4882a593Smuzhiyun struct workqueue_struct *event_workq; /* workqueue for event */
1817*4882a593Smuzhiyun #endif /* OEM_ANDROID */
1818*4882a593Smuzhiyun
1819*4882a593Smuzhiyun #ifndef OEM_ANDROID
1820*4882a593Smuzhiyun bool event_workq_init;
1821*4882a593Smuzhiyun #endif /* OEM_ANDROID */
1822*4882a593Smuzhiyun struct work_struct event_work; /* work item for event */
1823*4882a593Smuzhiyun struct mutex pm_sync; /* mainly for pm work synchronization */
1824*4882a593Smuzhiyun
1825*4882a593Smuzhiyun vndr_ie_setbuf_t *ibss_vsie; /* keep the VSIE for IBSS */
1826*4882a593Smuzhiyun int ibss_vsie_len;
1827*4882a593Smuzhiyun #ifdef WLAIBSS
1828*4882a593Smuzhiyun u32 aibss_txfail_pid;
1829*4882a593Smuzhiyun u32 aibss_txfail_seq;
1830*4882a593Smuzhiyun #endif /* WLAIBSS */
1831*4882a593Smuzhiyun #ifdef WL_RELMCAST
1832*4882a593Smuzhiyun u32 rmc_event_pid;
1833*4882a593Smuzhiyun u32 rmc_event_seq;
1834*4882a593Smuzhiyun #endif /* WL_RELMCAST */
1835*4882a593Smuzhiyun #ifdef WLAIBSS_MCHAN
1836*4882a593Smuzhiyun struct ether_addr ibss_if_addr;
1837*4882a593Smuzhiyun bcm_struct_cfgdev *ibss_cfgdev; /* For AIBSS */
1838*4882a593Smuzhiyun #endif /* WLAIBSS_MCHAN */
1839*4882a593Smuzhiyun bool bss_pending_op; /* indicate where there is a pending IF operation */
1840*4882a593Smuzhiyun #ifdef WLFBT
1841*4882a593Smuzhiyun uint8 fbt_key[FBT_KEYLEN];
1842*4882a593Smuzhiyun #endif
1843*4882a593Smuzhiyun int roam_offload;
1844*4882a593Smuzhiyun #ifdef WL_NAN
1845*4882a593Smuzhiyun wl_nancfg_t *nancfg;
1846*4882a593Smuzhiyun #ifdef WL_NANP2P
1847*4882a593Smuzhiyun uint8 conc_disc;
1848*4882a593Smuzhiyun bool nan_p2p_supported;
1849*4882a593Smuzhiyun #endif /* WL_NANP2P */
1850*4882a593Smuzhiyun #endif /* WL_NAN */
1851*4882a593Smuzhiyun #ifdef WL_IFACE_MGMT
1852*4882a593Smuzhiyun iface_mgmt_data_t iface_data;
1853*4882a593Smuzhiyun #endif /* WL_IFACE_MGMT */
1854*4882a593Smuzhiyun #ifdef P2PLISTEN_AP_SAMECHN
1855*4882a593Smuzhiyun bool p2p_resp_apchn_status;
1856*4882a593Smuzhiyun #endif /* P2PLISTEN_AP_SAMECHN */
1857*4882a593Smuzhiyun struct wl_wsec_key wep_key;
1858*4882a593Smuzhiyun #ifdef WLTDLS
1859*4882a593Smuzhiyun u8 *tdls_mgmt_frame;
1860*4882a593Smuzhiyun u32 tdls_mgmt_frame_len;
1861*4882a593Smuzhiyun s32 tdls_mgmt_freq;
1862*4882a593Smuzhiyun #endif /* WLTDLS */
1863*4882a593Smuzhiyun bool need_wait_afrx;
1864*4882a593Smuzhiyun #ifdef QOS_MAP_SET
1865*4882a593Smuzhiyun uint8 *up_table; /* user priority table, size is UP_TABLE_MAX */
1866*4882a593Smuzhiyun #endif /* QOS_MAP_SET */
1867*4882a593Smuzhiyun struct ether_addr last_roamed_addr;
1868*4882a593Smuzhiyun bool rcc_enabled; /* flag for Roam channel cache feature */
1869*4882a593Smuzhiyun #if defined(DHD_ENABLE_BIGDATA_LOGGING)
1870*4882a593Smuzhiyun char bss_info[GET_BSS_INFO_LEN];
1871*4882a593Smuzhiyun wl_event_msg_t event_auth_assoc;
1872*4882a593Smuzhiyun u32 assoc_reject_status;
1873*4882a593Smuzhiyun u32 roam_count;
1874*4882a593Smuzhiyun #endif /* DHD_ENABLE_BIGDATA_LOGGING */
1875*4882a593Smuzhiyun u16 ap_oper_channel;
1876*4882a593Smuzhiyun #if defined(SUPPORT_RANDOM_MAC_SCAN)
1877*4882a593Smuzhiyun bool random_mac_enabled;
1878*4882a593Smuzhiyun #endif /* SUPPORT_RANDOM_MAC_SCAN */
1879*4882a593Smuzhiyun #ifdef DHD_LOSSLESS_ROAMING
1880*4882a593Smuzhiyun timer_list_compat_t roam_timeout; /* Timer for catch roam timeout */
1881*4882a593Smuzhiyun #endif
1882*4882a593Smuzhiyun #ifndef DUAL_ESCAN_RESULT_BUFFER
1883*4882a593Smuzhiyun uint16 escan_sync_id_cntr;
1884*4882a593Smuzhiyun #endif
1885*4882a593Smuzhiyun #ifdef WLTDLS
1886*4882a593Smuzhiyun uint8 tdls_supported;
1887*4882a593Smuzhiyun struct mutex tdls_sync; /* protect tdls config operations */
1888*4882a593Smuzhiyun #endif /* WLTDLS */
1889*4882a593Smuzhiyun #ifdef MFP
1890*4882a593Smuzhiyun const uint8 *bip_pos;
1891*4882a593Smuzhiyun int mfp_mode;
1892*4882a593Smuzhiyun #endif /* MFP */
1893*4882a593Smuzhiyun #ifdef WES_SUPPORT
1894*4882a593Smuzhiyun #ifdef CUSTOMER_SCAN_TIMEOUT_SETTING
1895*4882a593Smuzhiyun int custom_scan_channel_time;
1896*4882a593Smuzhiyun int custom_scan_unassoc_time;
1897*4882a593Smuzhiyun int custom_scan_passive_time;
1898*4882a593Smuzhiyun int custom_scan_home_time;
1899*4882a593Smuzhiyun int custom_scan_home_away_time;
1900*4882a593Smuzhiyun #endif /* CUSTOMER_SCAN_TIMEOUT_SETTING */
1901*4882a593Smuzhiyun #endif /* WES_SUPPORT */
1902*4882a593Smuzhiyun uint8 vif_count; /* Virtual Interface count */
1903*4882a593Smuzhiyun #ifdef WBTEXT
1904*4882a593Smuzhiyun struct list_head wbtext_bssid_list;
1905*4882a593Smuzhiyun #endif /* WBTEXT */
1906*4882a593Smuzhiyun #ifdef SUPPORT_AP_RADIO_PWRSAVE
1907*4882a593Smuzhiyun ap_rps_info_t ap_rps_info;
1908*4882a593Smuzhiyun #endif /* SUPPORT_AP_RADIO_PWRSAVE */
1909*4882a593Smuzhiyun u16 vif_macaddr_mask;
1910*4882a593Smuzhiyun osl_t *osh;
1911*4882a593Smuzhiyun struct list_head vndr_oui_list;
1912*4882a593Smuzhiyun spinlock_t vndr_oui_sync; /* to protect vndr_oui_list */
1913*4882a593Smuzhiyun bool rssi_sum_report;
1914*4882a593Smuzhiyun int rssi; /* previous RSSI (backup) of get_station */
1915*4882a593Smuzhiyun #ifdef WL_WPS_SYNC
1916*4882a593Smuzhiyun wl_wps_session_t wps_session[WPS_MAX_SESSIONS];
1917*4882a593Smuzhiyun spinlock_t wps_sync; /* to protect wps states (and others if needed) */
1918*4882a593Smuzhiyun #endif /* WL_WPS_SYNC */
1919*4882a593Smuzhiyun struct wl_fils_info fils_info;
1920*4882a593Smuzhiyun #ifdef WL_BAM
1921*4882a593Smuzhiyun wl_bad_ap_mngr_t bad_ap_mngr;
1922*4882a593Smuzhiyun #endif /* WL_BAM */
1923*4882a593Smuzhiyun
1924*4882a593Smuzhiyun #ifdef BIGDATA_SOFTAP
1925*4882a593Smuzhiyun struct wl_ap_sta_info *ap_sta_info;
1926*4882a593Smuzhiyun #endif /* BIGDATA_SOFTAP */
1927*4882a593Smuzhiyun
1928*4882a593Smuzhiyun uint8 scanmac_enabled;
1929*4882a593Smuzhiyun bool scanmac_config;
1930*4882a593Smuzhiyun #ifdef WL_BCNRECV
1931*4882a593Smuzhiyun /* structure used for fake ap detection info */
1932*4882a593Smuzhiyun struct mutex bcn_sync; /* mainly for bcn resume/suspend synchronization */
1933*4882a593Smuzhiyun wl_bcnrecv_info_t bcnrecv_info;
1934*4882a593Smuzhiyun #endif /* WL_BCNRECV */
1935*4882a593Smuzhiyun struct net_device *static_ndev[DHD_MAX_STATIC_IFS];
1936*4882a593Smuzhiyun uint8 static_ndev_state[DHD_MAX_STATIC_IFS];
1937*4882a593Smuzhiyun bool hal_started;
1938*4882a593Smuzhiyun wl_wlc_version_t wlc_ver;
1939*4882a593Smuzhiyun bool scan_params_v2;
1940*4882a593Smuzhiyun #ifdef SUPPORT_AP_BWCTRL
1941*4882a593Smuzhiyun u32 bw_cap_5g;
1942*4882a593Smuzhiyun #endif /* SUPPORT_AP_BWCTRL */
1943*4882a593Smuzhiyun #ifdef WL_6G_BAND
1944*4882a593Smuzhiyun bool band_6g_supported;
1945*4882a593Smuzhiyun #endif /* WL_6G_BAND */
1946*4882a593Smuzhiyun wl_loc_info_t loc; /* listen on channel state info */
1947*4882a593Smuzhiyun int roamscan_mode;
1948*4882a593Smuzhiyun int wes_mode;
1949*4882a593Smuzhiyun int ncho_mode;
1950*4882a593Smuzhiyun int ncho_band;
1951*4882a593Smuzhiyun #ifdef WL_SAR_TX_POWER
1952*4882a593Smuzhiyun wifi_power_scenario wifi_tx_power_mode;
1953*4882a593Smuzhiyun #endif /* WL_SAR_TX_POWER */
1954*4882a593Smuzhiyun struct mutex connect_sync; /* For assoc/resssoc state sync */
1955*4882a593Smuzhiyun wl_ctx_tsinfo_t tsinfo;
1956*4882a593Smuzhiyun struct wl_pmk_list *spmk_info_list; /* single pmk info list */
1957*4882a593Smuzhiyun struct bcm_assoclist assoclist;
1958*4882a593Smuzhiyun chanspec_t acs_chspec; /* Selected chanspec in case of ACS */
1959*4882a593Smuzhiyun u32 join_iovar_ver;
1960*4882a593Smuzhiyun struct delayed_work ap_work; /* AP linkup timeout handler */
1961*4882a593Smuzhiyun wl_event_idx_t eidx; /* event state tracker */
1962*4882a593Smuzhiyun #ifdef WL_P2P_6G
1963*4882a593Smuzhiyun bool p2p_6g_enabled; /* P2P 6G support enabled */
1964*4882a593Smuzhiyun #endif /* WL_P2P_6G */
1965*4882a593Smuzhiyun u32 halpid;
1966*4882a593Smuzhiyun u8 country[WLC_CNTRY_BUF_SZ];
1967*4882a593Smuzhiyun #ifdef BCMDBUS
1968*4882a593Smuzhiyun bool bus_resuming;
1969*4882a593Smuzhiyun #endif /* BCMDBUS */
1970*4882a593Smuzhiyun #ifdef WL_ROAM_WAR
1971*4882a593Smuzhiyun struct ether_addr roaming_bssid;
1972*4882a593Smuzhiyun #endif /* WL_ROAM_WAR */
1973*4882a593Smuzhiyun #if defined(RSSIAVG)
1974*4882a593Smuzhiyun wl_rssi_cache_ctrl_t g_rssi_cache_ctrl;
1975*4882a593Smuzhiyun wl_rssi_cache_ctrl_t g_connected_rssi_cache_ctrl;
1976*4882a593Smuzhiyun #endif
1977*4882a593Smuzhiyun #if defined(BSSCACHE)
1978*4882a593Smuzhiyun wl_bss_cache_ctrl_t g_bss_cache_ctrl;
1979*4882a593Smuzhiyun #endif
1980*4882a593Smuzhiyun int autochannel;
1981*4882a593Smuzhiyun int best_2g_ch;
1982*4882a593Smuzhiyun int best_5g_ch;
1983*4882a593Smuzhiyun int best_6g_ch;
1984*4882a593Smuzhiyun };
1985*4882a593Smuzhiyun
1986*4882a593Smuzhiyun /* Max auth timeout allowed in case of EAP is 70sec, additional 5 sec for
1987*4882a593Smuzhiyun * inter-layer overheads
1988*4882a593Smuzhiyun */
1989*4882a593Smuzhiyun #define WL_DS_SKIP_THRESHOLD_USECS (75000L * 1000L)
1990*4882a593Smuzhiyun
1991*4882a593Smuzhiyun enum wl_state_type {
1992*4882a593Smuzhiyun WL_STATE_IDLE,
1993*4882a593Smuzhiyun WL_STATE_SCANNING,
1994*4882a593Smuzhiyun WL_STATE_CONNECTING,
1995*4882a593Smuzhiyun WL_STATE_LISTEN,
1996*4882a593Smuzhiyun WL_STATE_AUTHORIZING /* Assocated to authorized */
1997*4882a593Smuzhiyun };
1998*4882a593Smuzhiyun
1999*4882a593Smuzhiyun #define WL_STATIC_IFIDX (DHD_MAX_IFS)
2000*4882a593Smuzhiyun enum static_ndev_states {
2001*4882a593Smuzhiyun NDEV_STATE_NONE,
2002*4882a593Smuzhiyun NDEV_STATE_OS_IF_CREATED,
2003*4882a593Smuzhiyun NDEV_STATE_FW_IF_CREATED,
2004*4882a593Smuzhiyun NDEV_STATE_FW_IF_FAILED,
2005*4882a593Smuzhiyun NDEV_STATE_FW_IF_DELETED
2006*4882a593Smuzhiyun };
2007*4882a593Smuzhiyun #ifdef WL_STATIC_IF
2008*4882a593Smuzhiyun bool wl_cfg80211_static_if(struct bcm_cfg80211 *cfg, struct net_device *ndev);
2009*4882a593Smuzhiyun int wl_cfg80211_static_ifidx(struct bcm_cfg80211 *cfg, struct net_device *ndev);
2010*4882a593Smuzhiyun struct net_device *wl_cfg80211_static_if_active(struct bcm_cfg80211 *cfg);
2011*4882a593Smuzhiyun int wl_cfg80211_static_if_name(struct bcm_cfg80211 *cfg, const char *name);
2012*4882a593Smuzhiyun void wl_cfg80211_static_if_dev_close(struct net_device *dev);
2013*4882a593Smuzhiyun #endif /* WL_STATIC_IF */
2014*4882a593Smuzhiyun
2015*4882a593Smuzhiyun #ifdef WL_SAE
2016*4882a593Smuzhiyun typedef struct wl_sae_key_info {
2017*4882a593Smuzhiyun uint8 peer_mac[ETHER_ADDR_LEN];
2018*4882a593Smuzhiyun uint16 pmk_len;
2019*4882a593Smuzhiyun uint16 pmkid_len;
2020*4882a593Smuzhiyun const uint8 *pmk;
2021*4882a593Smuzhiyun const uint8 *pmkid;
2022*4882a593Smuzhiyun } wl_sae_key_info_t;
2023*4882a593Smuzhiyun #endif /* WL_SAE */
2024*4882a593Smuzhiyun
2025*4882a593Smuzhiyun typedef enum wl_concurrency_mode {
2026*4882a593Smuzhiyun CONCURRENCY_MODE_NONE = 0,
2027*4882a593Smuzhiyun CONCURRENCY_SCC_MODE,
2028*4882a593Smuzhiyun CONCURRENCY_VSDB_MODE,
2029*4882a593Smuzhiyun CONCURRENCY_RSDB_MODE
2030*4882a593Smuzhiyun } wl_concurrency_mode_t;
2031*4882a593Smuzhiyun
2032*4882a593Smuzhiyun typedef struct wl_wips_event_info {
2033*4882a593Smuzhiyun uint32 timestamp;
2034*4882a593Smuzhiyun struct ether_addr bssid;
2035*4882a593Smuzhiyun uint16 misdeauth;
2036*4882a593Smuzhiyun int16 current_RSSI;
2037*4882a593Smuzhiyun int16 deauth_RSSI;
2038*4882a593Smuzhiyun } wl_wips_event_info_t;
2039*4882a593Smuzhiyun
2040*4882a593Smuzhiyun s32 wl_iftype_to_mode(wl_iftype_t iftype);
2041*4882a593Smuzhiyun
2042*4882a593Smuzhiyun #define BCM_LIST_FOR_EACH_ENTRY_SAFE(pos, next, head, member) \
2043*4882a593Smuzhiyun list_for_each_entry_safe((pos), (next), (head), member)
2044*4882a593Smuzhiyun extern int ioctl_version;
2045*4882a593Smuzhiyun
2046*4882a593Smuzhiyun static inline wl_bss_info_t
next_bss(wl_scan_results_t * list,wl_bss_info_t * bss)2047*4882a593Smuzhiyun *next_bss(wl_scan_results_t *list, wl_bss_info_t *bss)
2048*4882a593Smuzhiyun {
2049*4882a593Smuzhiyun return bss = bss ?
2050*4882a593Smuzhiyun (wl_bss_info_t *)((uintptr) bss + dtoh32(bss->length)) : list->bss_info;
2051*4882a593Smuzhiyun }
2052*4882a593Smuzhiyun
2053*4882a593Smuzhiyun static inline void
wl_probe_wdev_all(struct bcm_cfg80211 * cfg)2054*4882a593Smuzhiyun wl_probe_wdev_all(struct bcm_cfg80211 *cfg)
2055*4882a593Smuzhiyun {
2056*4882a593Smuzhiyun struct net_info *_net_info, *next;
2057*4882a593Smuzhiyun unsigned long int flags;
2058*4882a593Smuzhiyun int idx = 0;
2059*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
2060*4882a593Smuzhiyun GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
2061*4882a593Smuzhiyun BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next,
2062*4882a593Smuzhiyun &cfg->net_list, list) {
2063*4882a593Smuzhiyun GCC_DIAGNOSTIC_POP();
2064*4882a593Smuzhiyun WL_INFORM_MEM(("wl_probe_wdev_all: net_list[%d] bssidx: %d\n",
2065*4882a593Smuzhiyun idx++, _net_info->bssidx));
2066*4882a593Smuzhiyun }
2067*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
2068*4882a593Smuzhiyun return;
2069*4882a593Smuzhiyun }
2070*4882a593Smuzhiyun
2071*4882a593Smuzhiyun static inline struct net_info *
wl_get_netinfo_by_fw_idx(struct bcm_cfg80211 * cfg,s32 bssidx,u8 ifidx)2072*4882a593Smuzhiyun wl_get_netinfo_by_fw_idx(struct bcm_cfg80211 *cfg, s32 bssidx, u8 ifidx)
2073*4882a593Smuzhiyun {
2074*4882a593Smuzhiyun struct net_info *_net_info, *next, *info = NULL;
2075*4882a593Smuzhiyun unsigned long int flags;
2076*4882a593Smuzhiyun
2077*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
2078*4882a593Smuzhiyun GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
2079*4882a593Smuzhiyun BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
2080*4882a593Smuzhiyun GCC_DIAGNOSTIC_POP();
2081*4882a593Smuzhiyun if ((bssidx >= 0) && (_net_info->bssidx == bssidx) &&
2082*4882a593Smuzhiyun (_net_info->ifidx == ifidx)) {
2083*4882a593Smuzhiyun info = _net_info;
2084*4882a593Smuzhiyun break;
2085*4882a593Smuzhiyun }
2086*4882a593Smuzhiyun }
2087*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
2088*4882a593Smuzhiyun return info;
2089*4882a593Smuzhiyun }
2090*4882a593Smuzhiyun
2091*4882a593Smuzhiyun static inline void
wl_dealloc_netinfo_by_wdev(struct bcm_cfg80211 * cfg,struct wireless_dev * wdev)2092*4882a593Smuzhiyun wl_dealloc_netinfo_by_wdev(struct bcm_cfg80211 *cfg, struct wireless_dev *wdev)
2093*4882a593Smuzhiyun {
2094*4882a593Smuzhiyun struct net_info *_net_info, *next;
2095*4882a593Smuzhiyun unsigned long int flags;
2096*4882a593Smuzhiyun
2097*4882a593Smuzhiyun #ifdef DHD_IFDEBUG
2098*4882a593Smuzhiyun WL_INFORM_MEM(("dealloc_netinfo enter wdev=%p \n", OSL_OBFUSCATE_BUF(wdev)));
2099*4882a593Smuzhiyun #endif
2100*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
2101*4882a593Smuzhiyun GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
2102*4882a593Smuzhiyun BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
2103*4882a593Smuzhiyun GCC_DIAGNOSTIC_POP();
2104*4882a593Smuzhiyun if (wdev && (_net_info->wdev == wdev)) {
2105*4882a593Smuzhiyun wl_cfgbss_t *bss = &_net_info->bss;
2106*4882a593Smuzhiyun
2107*4882a593Smuzhiyun if (bss->wpa_ie) {
2108*4882a593Smuzhiyun MFREE(cfg->osh, bss->wpa_ie, bss->wpa_ie[1]
2109*4882a593Smuzhiyun + WPA_RSN_IE_TAG_FIXED_LEN);
2110*4882a593Smuzhiyun bss->wpa_ie = NULL;
2111*4882a593Smuzhiyun }
2112*4882a593Smuzhiyun
2113*4882a593Smuzhiyun if (bss->rsn_ie) {
2114*4882a593Smuzhiyun MFREE(cfg->osh, bss->rsn_ie,
2115*4882a593Smuzhiyun bss->rsn_ie[1] + WPA_RSN_IE_TAG_FIXED_LEN);
2116*4882a593Smuzhiyun bss->rsn_ie = NULL;
2117*4882a593Smuzhiyun }
2118*4882a593Smuzhiyun
2119*4882a593Smuzhiyun if (bss->wps_ie) {
2120*4882a593Smuzhiyun MFREE(cfg->osh, bss->wps_ie, bss->wps_ie[1] + 2);
2121*4882a593Smuzhiyun bss->wps_ie = NULL;
2122*4882a593Smuzhiyun }
2123*4882a593Smuzhiyun list_del(&_net_info->list);
2124*4882a593Smuzhiyun cfg->iface_cnt--;
2125*4882a593Smuzhiyun MFREE(cfg->osh, _net_info, sizeof(struct net_info));
2126*4882a593Smuzhiyun }
2127*4882a593Smuzhiyun }
2128*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
2129*4882a593Smuzhiyun #ifdef DHD_IFDEBUG
2130*4882a593Smuzhiyun WL_INFORM_MEM(("dealloc_netinfo exit iface_cnt=%d \n", cfg->iface_cnt));
2131*4882a593Smuzhiyun #endif
2132*4882a593Smuzhiyun }
2133*4882a593Smuzhiyun
2134*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)2135*4882a593Smuzhiyun wl_alloc_netinfo(struct bcm_cfg80211 *cfg, struct net_device *ndev,
2136*4882a593Smuzhiyun struct wireless_dev * wdev, wl_iftype_t iftype, bool pm_block, u8 bssidx, u8 ifidx)
2137*4882a593Smuzhiyun {
2138*4882a593Smuzhiyun struct net_info *_net_info;
2139*4882a593Smuzhiyun s32 err = 0;
2140*4882a593Smuzhiyun unsigned long int flags;
2141*4882a593Smuzhiyun #ifdef DHD_IFDEBUG
2142*4882a593Smuzhiyun WL_INFORM_MEM(("alloc_netinfo enter bssidx=%d wdev=%p\n",
2143*4882a593Smuzhiyun bssidx, OSL_OBFUSCATE_BUF(wdev)));
2144*4882a593Smuzhiyun #endif
2145*4882a593Smuzhiyun /* Check whether there is any duplicate entry for the
2146*4882a593Smuzhiyun * same bssidx && ifidx.
2147*4882a593Smuzhiyun */
2148*4882a593Smuzhiyun if ((_net_info = wl_get_netinfo_by_fw_idx(cfg, bssidx, ifidx))) {
2149*4882a593Smuzhiyun /* We have a duplicate entry for the same bssidx
2150*4882a593Smuzhiyun * already present which shouldn't have been the case.
2151*4882a593Smuzhiyun * Attempt recovery.
2152*4882a593Smuzhiyun */
2153*4882a593Smuzhiyun WL_ERR(("Duplicate entry for bssidx=%d ifidx=%d present."
2154*4882a593Smuzhiyun " Can't add new entry\n", bssidx, ifidx));
2155*4882a593Smuzhiyun wl_probe_wdev_all(cfg);
2156*4882a593Smuzhiyun #ifdef DHD_DEBUG
2157*4882a593Smuzhiyun ASSERT(0);
2158*4882a593Smuzhiyun #endif /* DHD_DEBUG */
2159*4882a593Smuzhiyun return -EINVAL;
2160*4882a593Smuzhiyun }
2161*4882a593Smuzhiyun if (cfg->iface_cnt == IFACE_MAX_CNT)
2162*4882a593Smuzhiyun return -ENOMEM;
2163*4882a593Smuzhiyun _net_info = (struct net_info *)MALLOCZ(cfg->osh, sizeof(struct net_info));
2164*4882a593Smuzhiyun if (!_net_info)
2165*4882a593Smuzhiyun err = -ENOMEM;
2166*4882a593Smuzhiyun else {
2167*4882a593Smuzhiyun _net_info->iftype = iftype;
2168*4882a593Smuzhiyun _net_info->ndev = ndev;
2169*4882a593Smuzhiyun _net_info->wdev = wdev;
2170*4882a593Smuzhiyun _net_info->pm_restore = 0;
2171*4882a593Smuzhiyun _net_info->pm = 0;
2172*4882a593Smuzhiyun _net_info->pm_block = pm_block;
2173*4882a593Smuzhiyun _net_info->roam_off = WL_INVALID;
2174*4882a593Smuzhiyun _net_info->bssidx = bssidx;
2175*4882a593Smuzhiyun _net_info->ifidx = ifidx;
2176*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
2177*4882a593Smuzhiyun cfg->iface_cnt++;
2178*4882a593Smuzhiyun list_add(&_net_info->list, &cfg->net_list);
2179*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
2180*4882a593Smuzhiyun }
2181*4882a593Smuzhiyun #ifdef DHD_IFDEBUG
2182*4882a593Smuzhiyun WL_DBG(("alloc_netinfo exit iface_cnt=%d \n", cfg->iface_cnt));
2183*4882a593Smuzhiyun #endif
2184*4882a593Smuzhiyun return err;
2185*4882a593Smuzhiyun }
2186*4882a593Smuzhiyun
2187*4882a593Smuzhiyun static inline void
wl_delete_all_netinfo(struct bcm_cfg80211 * cfg)2188*4882a593Smuzhiyun wl_delete_all_netinfo(struct bcm_cfg80211 *cfg)
2189*4882a593Smuzhiyun {
2190*4882a593Smuzhiyun struct net_info *_net_info, *next;
2191*4882a593Smuzhiyun unsigned long int flags;
2192*4882a593Smuzhiyun
2193*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
2194*4882a593Smuzhiyun GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
2195*4882a593Smuzhiyun BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
2196*4882a593Smuzhiyun wl_cfgbss_t *bss = &_net_info->bss;
2197*4882a593Smuzhiyun GCC_DIAGNOSTIC_POP();
2198*4882a593Smuzhiyun
2199*4882a593Smuzhiyun if (bss->wpa_ie) {
2200*4882a593Smuzhiyun MFREE(cfg->osh, bss->wpa_ie, bss->wpa_ie[1]
2201*4882a593Smuzhiyun + WPA_RSN_IE_TAG_FIXED_LEN);
2202*4882a593Smuzhiyun bss->wpa_ie = NULL;
2203*4882a593Smuzhiyun }
2204*4882a593Smuzhiyun
2205*4882a593Smuzhiyun if (bss->rsn_ie) {
2206*4882a593Smuzhiyun MFREE(cfg->osh, bss->rsn_ie, bss->rsn_ie[1]
2207*4882a593Smuzhiyun + WPA_RSN_IE_TAG_FIXED_LEN);
2208*4882a593Smuzhiyun bss->rsn_ie = NULL;
2209*4882a593Smuzhiyun }
2210*4882a593Smuzhiyun
2211*4882a593Smuzhiyun if (bss->wps_ie) {
2212*4882a593Smuzhiyun MFREE(cfg->osh, bss->wps_ie, bss->wps_ie[1] + 2);
2213*4882a593Smuzhiyun bss->wps_ie = NULL;
2214*4882a593Smuzhiyun }
2215*4882a593Smuzhiyun
2216*4882a593Smuzhiyun if (bss->fils_ind_ie) {
2217*4882a593Smuzhiyun MFREE(cfg->osh, bss->fils_ind_ie, bss->fils_ind_ie[1]
2218*4882a593Smuzhiyun + FILS_INDICATION_IE_TAG_FIXED_LEN);
2219*4882a593Smuzhiyun bss->fils_ind_ie = NULL;
2220*4882a593Smuzhiyun }
2221*4882a593Smuzhiyun list_del(&_net_info->list);
2222*4882a593Smuzhiyun if (_net_info->wdev) {
2223*4882a593Smuzhiyun MFREE(cfg->osh, _net_info->wdev, sizeof(struct wireless_dev));
2224*4882a593Smuzhiyun }
2225*4882a593Smuzhiyun MFREE(cfg->osh, _net_info, sizeof(struct net_info));
2226*4882a593Smuzhiyun }
2227*4882a593Smuzhiyun cfg->iface_cnt = 0;
2228*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
2229*4882a593Smuzhiyun }
2230*4882a593Smuzhiyun static inline u32
wl_get_status_all(struct bcm_cfg80211 * cfg,s32 status)2231*4882a593Smuzhiyun wl_get_status_all(struct bcm_cfg80211 *cfg, s32 status)
2232*4882a593Smuzhiyun
2233*4882a593Smuzhiyun {
2234*4882a593Smuzhiyun struct net_info *_net_info, *next;
2235*4882a593Smuzhiyun u32 cnt = 0;
2236*4882a593Smuzhiyun unsigned long int flags;
2237*4882a593Smuzhiyun
2238*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
2239*4882a593Smuzhiyun GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
2240*4882a593Smuzhiyun BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
2241*4882a593Smuzhiyun GCC_DIAGNOSTIC_POP();
2242*4882a593Smuzhiyun if (_net_info->ndev &&
2243*4882a593Smuzhiyun test_bit(status, &_net_info->sme_state))
2244*4882a593Smuzhiyun cnt++;
2245*4882a593Smuzhiyun }
2246*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
2247*4882a593Smuzhiyun return cnt;
2248*4882a593Smuzhiyun }
2249*4882a593Smuzhiyun static inline void
wl_set_status_all(struct bcm_cfg80211 * cfg,s32 status,u32 op)2250*4882a593Smuzhiyun wl_set_status_all(struct bcm_cfg80211 *cfg, s32 status, u32 op)
2251*4882a593Smuzhiyun {
2252*4882a593Smuzhiyun struct net_info *_net_info, *next;
2253*4882a593Smuzhiyun unsigned long int flags;
2254*4882a593Smuzhiyun
2255*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
2256*4882a593Smuzhiyun GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
2257*4882a593Smuzhiyun BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
2258*4882a593Smuzhiyun GCC_DIAGNOSTIC_POP();
2259*4882a593Smuzhiyun switch (op) {
2260*4882a593Smuzhiyun case 1:
2261*4882a593Smuzhiyun break; /* set all status is not allowed */
2262*4882a593Smuzhiyun case 2:
2263*4882a593Smuzhiyun /*
2264*4882a593Smuzhiyun * Release the spinlock before calling notifier. Else there
2265*4882a593Smuzhiyun * will be nested calls
2266*4882a593Smuzhiyun */
2267*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
2268*4882a593Smuzhiyun clear_bit(status, &_net_info->sme_state);
2269*4882a593Smuzhiyun if (cfg->state_notifier &&
2270*4882a593Smuzhiyun test_bit(status, &(cfg->interrested_state)))
2271*4882a593Smuzhiyun cfg->state_notifier(cfg, _net_info, status, false);
2272*4882a593Smuzhiyun return;
2273*4882a593Smuzhiyun case 4:
2274*4882a593Smuzhiyun break; /* change all status is not allowed */
2275*4882a593Smuzhiyun default:
2276*4882a593Smuzhiyun break; /* unknown operation */
2277*4882a593Smuzhiyun }
2278*4882a593Smuzhiyun }
2279*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
2280*4882a593Smuzhiyun }
2281*4882a593Smuzhiyun static inline void
wl_set_status_by_netdev(struct bcm_cfg80211 * cfg,s32 status,struct net_device * ndev,u32 op)2282*4882a593Smuzhiyun wl_set_status_by_netdev(struct bcm_cfg80211 *cfg, s32 status,
2283*4882a593Smuzhiyun struct net_device *ndev, u32 op)
2284*4882a593Smuzhiyun {
2285*4882a593Smuzhiyun
2286*4882a593Smuzhiyun struct net_info *_net_info, *next;
2287*4882a593Smuzhiyun unsigned long int flags;
2288*4882a593Smuzhiyun
2289*4882a593Smuzhiyun if (status >= BITS_PER_LONG) {
2290*4882a593Smuzhiyun /* max value for shift operation is
2291*4882a593Smuzhiyun * (BITS_PER_LONG -1) for unsigned long.
2292*4882a593Smuzhiyun * if status crosses BIT_PER_LONG, the variable
2293*4882a593Smuzhiyun * sme_state should be correspondingly updated.
2294*4882a593Smuzhiyun */
2295*4882a593Smuzhiyun ASSERT(0);
2296*4882a593Smuzhiyun return;
2297*4882a593Smuzhiyun }
2298*4882a593Smuzhiyun
2299*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
2300*4882a593Smuzhiyun GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
2301*4882a593Smuzhiyun BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
2302*4882a593Smuzhiyun if (ndev && (_net_info->ndev == ndev)) {
2303*4882a593Smuzhiyun GCC_DIAGNOSTIC_POP();
2304*4882a593Smuzhiyun switch (op) {
2305*4882a593Smuzhiyun case 1:
2306*4882a593Smuzhiyun /*
2307*4882a593Smuzhiyun * Release the spinlock before calling notifier. Else there
2308*4882a593Smuzhiyun * will be nested calls
2309*4882a593Smuzhiyun */
2310*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
2311*4882a593Smuzhiyun set_bit(status, &_net_info->sme_state);
2312*4882a593Smuzhiyun if (cfg->state_notifier &&
2313*4882a593Smuzhiyun test_bit(status, &(cfg->interrested_state)))
2314*4882a593Smuzhiyun cfg->state_notifier(cfg, _net_info, status, true);
2315*4882a593Smuzhiyun return;
2316*4882a593Smuzhiyun case 2:
2317*4882a593Smuzhiyun /*
2318*4882a593Smuzhiyun * Release the spinlock before calling notifier. Else there
2319*4882a593Smuzhiyun * will be nested calls
2320*4882a593Smuzhiyun */
2321*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
2322*4882a593Smuzhiyun clear_bit(status, &_net_info->sme_state);
2323*4882a593Smuzhiyun if (cfg->state_notifier &&
2324*4882a593Smuzhiyun test_bit(status, &(cfg->interrested_state)))
2325*4882a593Smuzhiyun cfg->state_notifier(cfg, _net_info, status, false);
2326*4882a593Smuzhiyun return;
2327*4882a593Smuzhiyun case 4:
2328*4882a593Smuzhiyun change_bit(status, &_net_info->sme_state);
2329*4882a593Smuzhiyun break;
2330*4882a593Smuzhiyun }
2331*4882a593Smuzhiyun }
2332*4882a593Smuzhiyun
2333*4882a593Smuzhiyun }
2334*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
2335*4882a593Smuzhiyun
2336*4882a593Smuzhiyun }
2337*4882a593Smuzhiyun
2338*4882a593Smuzhiyun static inline wl_cfgbss_t *
wl_get_cfgbss_by_wdev(struct bcm_cfg80211 * cfg,struct wireless_dev * wdev)2339*4882a593Smuzhiyun wl_get_cfgbss_by_wdev(struct bcm_cfg80211 *cfg,
2340*4882a593Smuzhiyun struct wireless_dev *wdev)
2341*4882a593Smuzhiyun {
2342*4882a593Smuzhiyun struct net_info *_net_info, *next;
2343*4882a593Smuzhiyun wl_cfgbss_t *bss = NULL;
2344*4882a593Smuzhiyun unsigned long int flags;
2345*4882a593Smuzhiyun
2346*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
2347*4882a593Smuzhiyun GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
2348*4882a593Smuzhiyun BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
2349*4882a593Smuzhiyun GCC_DIAGNOSTIC_POP();
2350*4882a593Smuzhiyun if (wdev && (_net_info->wdev == wdev)) {
2351*4882a593Smuzhiyun bss = &_net_info->bss;
2352*4882a593Smuzhiyun break;
2353*4882a593Smuzhiyun }
2354*4882a593Smuzhiyun }
2355*4882a593Smuzhiyun
2356*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
2357*4882a593Smuzhiyun return bss;
2358*4882a593Smuzhiyun }
2359*4882a593Smuzhiyun
2360*4882a593Smuzhiyun static inline u32
wl_get_status_by_netdev(struct bcm_cfg80211 * cfg,s32 status,struct net_device * ndev)2361*4882a593Smuzhiyun wl_get_status_by_netdev(struct bcm_cfg80211 *cfg, s32 status,
2362*4882a593Smuzhiyun struct net_device *ndev)
2363*4882a593Smuzhiyun {
2364*4882a593Smuzhiyun struct net_info *_net_info, *next;
2365*4882a593Smuzhiyun u32 stat = 0;
2366*4882a593Smuzhiyun unsigned long int flags;
2367*4882a593Smuzhiyun
2368*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
2369*4882a593Smuzhiyun GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
2370*4882a593Smuzhiyun BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
2371*4882a593Smuzhiyun GCC_DIAGNOSTIC_POP();
2372*4882a593Smuzhiyun if (ndev && (_net_info->ndev == ndev)) {
2373*4882a593Smuzhiyun stat = test_bit(status, &_net_info->sme_state);
2374*4882a593Smuzhiyun break;
2375*4882a593Smuzhiyun }
2376*4882a593Smuzhiyun }
2377*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
2378*4882a593Smuzhiyun return stat;
2379*4882a593Smuzhiyun }
2380*4882a593Smuzhiyun
2381*4882a593Smuzhiyun static inline s32
wl_get_mode_by_netdev(struct bcm_cfg80211 * cfg,struct net_device * ndev)2382*4882a593Smuzhiyun wl_get_mode_by_netdev(struct bcm_cfg80211 *cfg, struct net_device *ndev)
2383*4882a593Smuzhiyun {
2384*4882a593Smuzhiyun struct net_info *_net_info, *next;
2385*4882a593Smuzhiyun s32 mode = -1;
2386*4882a593Smuzhiyun unsigned long int flags;
2387*4882a593Smuzhiyun
2388*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
2389*4882a593Smuzhiyun GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
2390*4882a593Smuzhiyun BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
2391*4882a593Smuzhiyun GCC_DIAGNOSTIC_POP();
2392*4882a593Smuzhiyun if (_net_info->ndev && (_net_info->ndev == ndev)) {
2393*4882a593Smuzhiyun mode = wl_iftype_to_mode(_net_info->iftype);
2394*4882a593Smuzhiyun break;
2395*4882a593Smuzhiyun }
2396*4882a593Smuzhiyun }
2397*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
2398*4882a593Smuzhiyun return mode;
2399*4882a593Smuzhiyun }
2400*4882a593Smuzhiyun
2401*4882a593Smuzhiyun static inline s32
wl_get_bssidx_by_wdev(struct bcm_cfg80211 * cfg,struct wireless_dev * wdev)2402*4882a593Smuzhiyun wl_get_bssidx_by_wdev(struct bcm_cfg80211 *cfg, struct wireless_dev *wdev)
2403*4882a593Smuzhiyun {
2404*4882a593Smuzhiyun struct net_info *_net_info, *next;
2405*4882a593Smuzhiyun s32 bssidx = -1;
2406*4882a593Smuzhiyun unsigned long int flags;
2407*4882a593Smuzhiyun
2408*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
2409*4882a593Smuzhiyun GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
2410*4882a593Smuzhiyun BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
2411*4882a593Smuzhiyun GCC_DIAGNOSTIC_POP();
2412*4882a593Smuzhiyun if (_net_info->wdev && (_net_info->wdev == wdev)) {
2413*4882a593Smuzhiyun bssidx = _net_info->bssidx;
2414*4882a593Smuzhiyun break;
2415*4882a593Smuzhiyun }
2416*4882a593Smuzhiyun }
2417*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
2418*4882a593Smuzhiyun return bssidx;
2419*4882a593Smuzhiyun }
2420*4882a593Smuzhiyun
2421*4882a593Smuzhiyun static inline struct wireless_dev *
wl_get_wdev_by_fw_idx(struct bcm_cfg80211 * cfg,s32 bssidx,s32 ifidx)2422*4882a593Smuzhiyun wl_get_wdev_by_fw_idx(struct bcm_cfg80211 *cfg, s32 bssidx, s32 ifidx)
2423*4882a593Smuzhiyun {
2424*4882a593Smuzhiyun struct net_info *_net_info, *next;
2425*4882a593Smuzhiyun struct wireless_dev *wdev = NULL;
2426*4882a593Smuzhiyun unsigned long int flags;
2427*4882a593Smuzhiyun
2428*4882a593Smuzhiyun if (bssidx < 0)
2429*4882a593Smuzhiyun return NULL;
2430*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
2431*4882a593Smuzhiyun GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
2432*4882a593Smuzhiyun BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
2433*4882a593Smuzhiyun GCC_DIAGNOSTIC_POP();
2434*4882a593Smuzhiyun if ((_net_info->bssidx == bssidx) && (_net_info->ifidx == ifidx)) {
2435*4882a593Smuzhiyun wdev = _net_info->wdev;
2436*4882a593Smuzhiyun break;
2437*4882a593Smuzhiyun }
2438*4882a593Smuzhiyun }
2439*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
2440*4882a593Smuzhiyun return wdev;
2441*4882a593Smuzhiyun }
2442*4882a593Smuzhiyun
2443*4882a593Smuzhiyun static inline struct wl_profile *
wl_get_profile_by_netdev(struct bcm_cfg80211 * cfg,struct net_device * ndev)2444*4882a593Smuzhiyun wl_get_profile_by_netdev(struct bcm_cfg80211 *cfg, struct net_device *ndev)
2445*4882a593Smuzhiyun {
2446*4882a593Smuzhiyun struct net_info *_net_info, *next;
2447*4882a593Smuzhiyun struct wl_profile *prof = NULL;
2448*4882a593Smuzhiyun unsigned long int flags;
2449*4882a593Smuzhiyun
2450*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
2451*4882a593Smuzhiyun GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
2452*4882a593Smuzhiyun BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
2453*4882a593Smuzhiyun GCC_DIAGNOSTIC_POP();
2454*4882a593Smuzhiyun if (ndev && (_net_info->ndev == ndev)) {
2455*4882a593Smuzhiyun prof = &_net_info->profile;
2456*4882a593Smuzhiyun break;
2457*4882a593Smuzhiyun }
2458*4882a593Smuzhiyun }
2459*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
2460*4882a593Smuzhiyun return prof;
2461*4882a593Smuzhiyun }
2462*4882a593Smuzhiyun static inline struct net_info *
wl_get_netinfo_by_netdev(struct bcm_cfg80211 * cfg,struct net_device * ndev)2463*4882a593Smuzhiyun wl_get_netinfo_by_netdev(struct bcm_cfg80211 *cfg, struct net_device *ndev)
2464*4882a593Smuzhiyun {
2465*4882a593Smuzhiyun struct net_info *_net_info, *next, *info = NULL;
2466*4882a593Smuzhiyun unsigned long int flags;
2467*4882a593Smuzhiyun
2468*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
2469*4882a593Smuzhiyun GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
2470*4882a593Smuzhiyun BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
2471*4882a593Smuzhiyun GCC_DIAGNOSTIC_POP();
2472*4882a593Smuzhiyun if (ndev && (_net_info->ndev == ndev)) {
2473*4882a593Smuzhiyun info = _net_info;
2474*4882a593Smuzhiyun break;
2475*4882a593Smuzhiyun }
2476*4882a593Smuzhiyun }
2477*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
2478*4882a593Smuzhiyun return info;
2479*4882a593Smuzhiyun }
2480*4882a593Smuzhiyun
2481*4882a593Smuzhiyun static inline struct net_info *
wl_get_netinfo_by_wdev(struct bcm_cfg80211 * cfg,struct wireless_dev * wdev)2482*4882a593Smuzhiyun wl_get_netinfo_by_wdev(struct bcm_cfg80211 *cfg, struct wireless_dev *wdev)
2483*4882a593Smuzhiyun {
2484*4882a593Smuzhiyun struct net_info *_net_info, *next, *info = NULL;
2485*4882a593Smuzhiyun unsigned long int flags;
2486*4882a593Smuzhiyun
2487*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_LOCK(&cfg->net_list_sync, flags);
2488*4882a593Smuzhiyun GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
2489*4882a593Smuzhiyun BCM_LIST_FOR_EACH_ENTRY_SAFE(_net_info, next, &cfg->net_list, list) {
2490*4882a593Smuzhiyun GCC_DIAGNOSTIC_POP();
2491*4882a593Smuzhiyun if (wdev && (_net_info->wdev == wdev)) {
2492*4882a593Smuzhiyun info = _net_info;
2493*4882a593Smuzhiyun break;
2494*4882a593Smuzhiyun }
2495*4882a593Smuzhiyun }
2496*4882a593Smuzhiyun WL_CFG_NET_LIST_SYNC_UNLOCK(&cfg->net_list_sync, flags);
2497*4882a593Smuzhiyun return info;
2498*4882a593Smuzhiyun }
2499*4882a593Smuzhiyun
2500*4882a593Smuzhiyun static inline char *
wl_iftype_to_str(int wl_iftype)2501*4882a593Smuzhiyun wl_iftype_to_str(int wl_iftype)
2502*4882a593Smuzhiyun {
2503*4882a593Smuzhiyun switch (wl_iftype) {
2504*4882a593Smuzhiyun case (WL_IF_TYPE_STA):
2505*4882a593Smuzhiyun return "WL_IF_TYPE_STA";
2506*4882a593Smuzhiyun case (WL_IF_TYPE_AP):
2507*4882a593Smuzhiyun return "WL_IF_TYPE_AP";
2508*4882a593Smuzhiyun
2509*4882a593Smuzhiyun #ifdef WLAWDL
2510*4882a593Smuzhiyun case (WL_IF_TYPE_AWDL):
2511*4882a593Smuzhiyun return "WL_IF_TYPE_AWDL";
2512*4882a593Smuzhiyun #endif /* WLAWDL */
2513*4882a593Smuzhiyun
2514*4882a593Smuzhiyun case (WL_IF_TYPE_NAN_NMI):
2515*4882a593Smuzhiyun return "WL_IF_TYPE_NAN_NMI";
2516*4882a593Smuzhiyun case (WL_IF_TYPE_NAN):
2517*4882a593Smuzhiyun return "WL_IF_TYPE_NAN";
2518*4882a593Smuzhiyun case (WL_IF_TYPE_P2P_GO):
2519*4882a593Smuzhiyun return "WL_IF_TYPE_P2P_GO";
2520*4882a593Smuzhiyun case (WL_IF_TYPE_P2P_GC):
2521*4882a593Smuzhiyun return "WL_IF_TYPE_P2P_GC";
2522*4882a593Smuzhiyun case (WL_IF_TYPE_P2P_DISC):
2523*4882a593Smuzhiyun return "WL_IF_TYPE_P2P_DISC";
2524*4882a593Smuzhiyun case (WL_IF_TYPE_IBSS):
2525*4882a593Smuzhiyun return "WL_IF_TYPE_IBSS";
2526*4882a593Smuzhiyun case (WL_IF_TYPE_MONITOR):
2527*4882a593Smuzhiyun return "WL_IF_TYPE_MONITOR";
2528*4882a593Smuzhiyun case (WL_IF_TYPE_AIBSS):
2529*4882a593Smuzhiyun return "WL_IF_TYPE_AIBSS";
2530*4882a593Smuzhiyun default:
2531*4882a593Smuzhiyun return "WL_IF_TYPE_UNKNOWN";
2532*4882a593Smuzhiyun }
2533*4882a593Smuzhiyun }
2534*4882a593Smuzhiyun
2535*4882a593Smuzhiyun #define is_discovery_iface(iface) (((iface == WL_IF_TYPE_P2P_DISC) || \
2536*4882a593Smuzhiyun (iface == WL_IF_TYPE_NAN_NMI)) ? 1 : 0)
2537*4882a593Smuzhiyun #define IS_P2P_GC(wdev) \
2538*4882a593Smuzhiyun ((wdev->iftype == NL80211_IFTYPE_P2P_CLIENT) ? 1 : 0)
2539*4882a593Smuzhiyun #define IS_P2P_GO(wdev) \
2540*4882a593Smuzhiyun ((wdev->iftype == NL80211_IFTYPE_P2P_GO) ? 1 : 0)
2541*4882a593Smuzhiyun #define is_p2p_group_iface(wdev) (((wdev->iftype == NL80211_IFTYPE_P2P_GO) || \
2542*4882a593Smuzhiyun (wdev->iftype == NL80211_IFTYPE_P2P_CLIENT)) ? 1 : 0)
2543*4882a593Smuzhiyun #define bcmcfg_to_wiphy(cfg) (cfg->wdev->wiphy)
2544*4882a593Smuzhiyun #define bcmcfg_to_prmry_ndev(cfg) (cfg->wdev->netdev)
2545*4882a593Smuzhiyun #define bcmcfg_to_prmry_wdev(cfg) (cfg->wdev)
2546*4882a593Smuzhiyun #define bcmcfg_to_p2p_wdev(cfg) (cfg->p2p_wdev)
2547*4882a593Smuzhiyun #define ndev_to_wl(n) (wdev_to_wl(n->ieee80211_ptr))
2548*4882a593Smuzhiyun #define ndev_to_wdev(ndev) (ndev->ieee80211_ptr)
2549*4882a593Smuzhiyun #define wdev_to_ndev(wdev) (wdev->netdev)
2550*4882a593Smuzhiyun
2551*4882a593Smuzhiyun #ifdef WL_BLOCK_P2P_SCAN_ON_STA
2552*4882a593Smuzhiyun #define IS_P2P_IFACE(wdev) (wdev && \
2553*4882a593Smuzhiyun ((wdev->iftype == NL80211_IFTYPE_P2P_DEVICE) || \
2554*4882a593Smuzhiyun (wdev->iftype == NL80211_IFTYPE_P2P_GO) || \
2555*4882a593Smuzhiyun (wdev->iftype == NL80211_IFTYPE_P2P_CLIENT)))
2556*4882a593Smuzhiyun #endif /* WL_BLOCK_P2P_SCAN_ON_STA */
2557*4882a593Smuzhiyun
2558*4882a593Smuzhiyun #define IS_PRIMARY_NDEV(cfg, ndev) (ndev == bcmcfg_to_prmry_ndev(cfg))
2559*4882a593Smuzhiyun #define IS_STA_IFACE(wdev) (wdev && \
2560*4882a593Smuzhiyun (wdev->iftype == NL80211_IFTYPE_STATION))
2561*4882a593Smuzhiyun
2562*4882a593Smuzhiyun #define IS_AP_IFACE(wdev) (wdev && \
2563*4882a593Smuzhiyun (wdev->iftype == NL80211_IFTYPE_AP))
2564*4882a593Smuzhiyun
2565*4882a593Smuzhiyun #if defined(WL_ENABLE_P2P_IF)
2566*4882a593Smuzhiyun #define ndev_to_wlc_ndev(ndev, cfg) ((ndev == cfg->p2p_net) ? \
2567*4882a593Smuzhiyun bcmcfg_to_prmry_ndev(cfg) : ndev)
2568*4882a593Smuzhiyun #else
2569*4882a593Smuzhiyun #define ndev_to_wlc_ndev(ndev, cfg) (ndev)
2570*4882a593Smuzhiyun #endif /* WL_ENABLE_P2P_IF */
2571*4882a593Smuzhiyun
2572*4882a593Smuzhiyun #define wdev_to_wlc_ndev(wdev, cfg) \
2573*4882a593Smuzhiyun (wdev_to_ndev(wdev) ? \
2574*4882a593Smuzhiyun wdev_to_ndev(wdev) : bcmcfg_to_prmry_ndev(cfg))
2575*4882a593Smuzhiyun #if defined(WL_CFG80211_P2P_DEV_IF)
2576*4882a593Smuzhiyun #define cfgdev_to_wlc_ndev(cfgdev, cfg) wdev_to_wlc_ndev(cfgdev, cfg)
2577*4882a593Smuzhiyun #define bcmcfg_to_prmry_cfgdev(cfgdev, cfg) bcmcfg_to_prmry_wdev(cfg)
2578*4882a593Smuzhiyun #elif defined(WL_ENABLE_P2P_IF)
2579*4882a593Smuzhiyun #define cfgdev_to_wlc_ndev(cfgdev, cfg) ndev_to_wlc_ndev(cfgdev, cfg)
2580*4882a593Smuzhiyun #define bcmcfg_to_prmry_cfgdev(cfgdev, cfg) bcmcfg_to_prmry_ndev(cfg)
2581*4882a593Smuzhiyun #else
2582*4882a593Smuzhiyun #define cfgdev_to_wlc_ndev(cfgdev, cfg) (cfgdev)
2583*4882a593Smuzhiyun #define bcmcfg_to_prmry_cfgdev(cfgdev, cfg) (cfgdev)
2584*4882a593Smuzhiyun #endif /* WL_CFG80211_P2P_DEV_IF */
2585*4882a593Smuzhiyun
2586*4882a593Smuzhiyun #if defined(WL_CFG80211_P2P_DEV_IF)
2587*4882a593Smuzhiyun #define cfgdev_to_wdev(cfgdev) (cfgdev)
2588*4882a593Smuzhiyun #define ndev_to_cfgdev(ndev) ndev_to_wdev(ndev)
2589*4882a593Smuzhiyun #define cfgdev_to_ndev(cfgdev) (cfgdev ? (cfgdev->netdev) : NULL)
2590*4882a593Smuzhiyun #define wdev_to_cfgdev(cfgdev) (cfgdev)
2591*4882a593Smuzhiyun #define discover_cfgdev(cfgdev, cfg) (cfgdev->iftype == NL80211_IFTYPE_P2P_DEVICE)
2592*4882a593Smuzhiyun #else
2593*4882a593Smuzhiyun #define cfgdev_to_wdev(cfgdev) (cfgdev->ieee80211_ptr)
2594*4882a593Smuzhiyun #define wdev_to_cfgdev(cfgdev) cfgdev ? (cfgdev->netdev) : NULL
2595*4882a593Smuzhiyun #define ndev_to_cfgdev(ndev) (ndev)
2596*4882a593Smuzhiyun #define cfgdev_to_ndev(cfgdev) (cfgdev)
2597*4882a593Smuzhiyun #define discover_cfgdev(cfgdev, cfg) (cfgdev == cfg->p2p_net)
2598*4882a593Smuzhiyun #endif /* WL_CFG80211_P2P_DEV_IF */
2599*4882a593Smuzhiyun
2600*4882a593Smuzhiyun #if defined(WL_CFG80211_P2P_DEV_IF)
2601*4882a593Smuzhiyun #define scan_req_match(cfg) (((cfg) && (cfg->scan_request) && \
2602*4882a593Smuzhiyun (cfg->scan_request->wdev == cfg->p2p_wdev)) ? true : false)
2603*4882a593Smuzhiyun #elif defined(WL_ENABLE_P2P_IF)
2604*4882a593Smuzhiyun #define scan_req_match(cfg) (((cfg) && (cfg->scan_request) && \
2605*4882a593Smuzhiyun (cfg->scan_request->dev == cfg->p2p_net)) ? true : false)
2606*4882a593Smuzhiyun #else
2607*4882a593Smuzhiyun #define scan_req_match(cfg) (((cfg) && p2p_is_on(cfg) && p2p_scan(cfg)) ? \
2608*4882a593Smuzhiyun true : false)
2609*4882a593Smuzhiyun #endif /* WL_CFG80211_P2P_DEV_IF */
2610*4882a593Smuzhiyun
2611*4882a593Smuzhiyun #define PRINT_WDEV_INFO(cfgdev) \
2612*4882a593Smuzhiyun { \
2613*4882a593Smuzhiyun struct wireless_dev *wdev = cfgdev_to_wdev(cfgdev); \
2614*4882a593Smuzhiyun struct net_device *netdev = wdev ? wdev->netdev : NULL; \
2615*4882a593Smuzhiyun WL_DBG(("wdev_ptr:%p ndev_ptr:%p ifname:%s iftype:%d\n", OSL_OBFUSCATE_BUF(wdev), \
2616*4882a593Smuzhiyun OSL_OBFUSCATE_BUF(netdev), \
2617*4882a593Smuzhiyun netdev ? netdev->name : "NULL (non-ndev device)", \
2618*4882a593Smuzhiyun wdev ? wdev->iftype : 0xff)); \
2619*4882a593Smuzhiyun }
2620*4882a593Smuzhiyun
2621*4882a593Smuzhiyun #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))
2622*4882a593Smuzhiyun #define scan_req_iftype(req) (req->dev->ieee80211_ptr->iftype)
2623*4882a593Smuzhiyun #else
2624*4882a593Smuzhiyun #define scan_req_iftype(req) (req->wdev->iftype)
2625*4882a593Smuzhiyun #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0) */
2626*4882a593Smuzhiyun
2627*4882a593Smuzhiyun #define wl_to_sr(w) (w->scan_req_int)
2628*4882a593Smuzhiyun #if defined(STATIC_WL_PRIV_STRUCT)
2629*4882a593Smuzhiyun #define wl_to_ie(w) (w->ie)
2630*4882a593Smuzhiyun #define wl_to_conn(w) (w->conn_info)
2631*4882a593Smuzhiyun #else
2632*4882a593Smuzhiyun #define wl_to_ie(w) (&w->ie)
2633*4882a593Smuzhiyun #define wl_to_conn(w) (&w->conn_info)
2634*4882a593Smuzhiyun #endif
2635*4882a593Smuzhiyun #define wl_to_fils_info(w) (&w->fils_info)
2636*4882a593Smuzhiyun #define wiphy_from_scan(w) (w->escan_info.wiphy)
2637*4882a593Smuzhiyun #define wl_get_drv_status_all(cfg, stat) \
2638*4882a593Smuzhiyun (wl_get_status_all(cfg, WL_STATUS_ ## stat))
2639*4882a593Smuzhiyun #define wl_get_drv_status(cfg, stat, ndev) \
2640*4882a593Smuzhiyun (wl_get_status_by_netdev(cfg, WL_STATUS_ ## stat, ndev))
2641*4882a593Smuzhiyun #define wl_set_drv_status(cfg, stat, ndev) \
2642*4882a593Smuzhiyun (wl_set_status_by_netdev(cfg, WL_STATUS_ ## stat, ndev, 1))
2643*4882a593Smuzhiyun #define wl_clr_drv_status(cfg, stat, ndev) \
2644*4882a593Smuzhiyun (wl_set_status_by_netdev(cfg, WL_STATUS_ ## stat, ndev, 2))
2645*4882a593Smuzhiyun #define wl_clr_drv_status_all(cfg, stat) \
2646*4882a593Smuzhiyun (wl_set_status_all(cfg, WL_STATUS_ ## stat, 2))
2647*4882a593Smuzhiyun #define wl_chg_drv_status(cfg, stat, ndev) \
2648*4882a593Smuzhiyun (wl_set_status_by_netdev(cfg, WL_STATUS_ ## stat, ndev, 4))
2649*4882a593Smuzhiyun
2650*4882a593Smuzhiyun #define for_each_bss(list, bss, __i) \
2651*4882a593Smuzhiyun for (__i = 0; __i < list->count && __i < WL_AP_MAX; __i++, bss = next_bss(list, bss))
2652*4882a593Smuzhiyun
2653*4882a593Smuzhiyun #define for_each_ndev(cfg, iter, next) \
2654*4882a593Smuzhiyun list_for_each_entry_safe(iter, next, &cfg->net_list, list)
2655*4882a593Smuzhiyun
2656*4882a593Smuzhiyun /* In case of WPS from wpa_supplicant, pairwise siute and group suite is 0.
2657*4882a593Smuzhiyun * In addtion to that, wpa_version is WPA_VERSION_1
2658*4882a593Smuzhiyun */
2659*4882a593Smuzhiyun #define is_wps_conn(_sme) \
2660*4882a593Smuzhiyun ((wl_cfgp2p_find_wpsie(_sme->ie, _sme->ie_len) != NULL) && \
2661*4882a593Smuzhiyun (!_sme->crypto.n_ciphers_pairwise) && \
2662*4882a593Smuzhiyun (!_sme->crypto.cipher_group))
2663*4882a593Smuzhiyun
2664*4882a593Smuzhiyun #ifdef WLFBT
2665*4882a593Smuzhiyun #if defined(WLAN_AKM_SUITE_FT_8021X) && defined(WLAN_AKM_SUITE_FT_PSK)
2666*4882a593Smuzhiyun #define IS_AKM_SUITE_FT(sec) (sec->wpa_auth == WLAN_AKM_SUITE_FT_8021X || \
2667*4882a593Smuzhiyun sec->wpa_auth == WLAN_AKM_SUITE_FT_PSK)
2668*4882a593Smuzhiyun #elif defined(WLAN_AKM_SUITE_FT_8021X)
2669*4882a593Smuzhiyun #define IS_AKM_SUITE_FT(sec) (sec->wpa_auth == WLAN_AKM_SUITE_FT_8021X)
2670*4882a593Smuzhiyun #elif defined(WLAN_AKM_SUITE_FT_PSK)
2671*4882a593Smuzhiyun #define IS_AKM_SUITE_FT(sec) (sec->wpa_auth == WLAN_AKM_SUITE_FT_PSK)
2672*4882a593Smuzhiyun #else
2673*4882a593Smuzhiyun #define IS_AKM_SUITE_FT(sec) ({BCM_REFERENCE(sec); FALSE;})
2674*4882a593Smuzhiyun #endif /* WLAN_AKM_SUITE_FT_8021X && WLAN_AKM_SUITE_FT_PSK */
2675*4882a593Smuzhiyun #else
2676*4882a593Smuzhiyun #define IS_AKM_SUITE_FT(sec) ({BCM_REFERENCE(sec); FALSE;})
2677*4882a593Smuzhiyun #endif /* WLFBT */
2678*4882a593Smuzhiyun
2679*4882a593Smuzhiyun #define IS_AKM_SUITE_CCKM(sec) ({BCM_REFERENCE(sec); FALSE;})
2680*4882a593Smuzhiyun
2681*4882a593Smuzhiyun #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0))
2682*4882a593Smuzhiyun #define STA_INFO_BIT(info) (1ul << NL80211_STA_ ## info)
2683*4882a593Smuzhiyun #ifdef strnicmp
2684*4882a593Smuzhiyun #undef strnicmp
2685*4882a593Smuzhiyun #endif /* strnicmp */
2686*4882a593Smuzhiyun #define strnicmp(str1, str2, len) strncasecmp((str1), (str2), (len))
2687*4882a593Smuzhiyun #else
2688*4882a593Smuzhiyun #define STA_INFO_BIT(info) (STATION_ ## info)
2689*4882a593Smuzhiyun #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)) */
2690*4882a593Smuzhiyun
2691*4882a593Smuzhiyun extern s32 wl_cfg80211_attach(struct net_device *ndev, void *context);
2692*4882a593Smuzhiyun extern void wl_cfg80211_detach(struct bcm_cfg80211 *cfg);
2693*4882a593Smuzhiyun
2694*4882a593Smuzhiyun extern void wl_cfg80211_event(struct net_device *ndev, const wl_event_msg_t *e,
2695*4882a593Smuzhiyun void *data);
2696*4882a593Smuzhiyun extern s32 wl_cfg80211_handle_critical_events(struct bcm_cfg80211 *cfg,
2697*4882a593Smuzhiyun struct wireless_dev *wdev, const wl_event_msg_t * e);
2698*4882a593Smuzhiyun
2699*4882a593Smuzhiyun void wl_cfg80211_set_parent_dev(void *dev);
2700*4882a593Smuzhiyun struct device *wl_cfg80211_get_parent_dev(void);
2701*4882a593Smuzhiyun struct bcm_cfg80211 *wl_cfg80211_get_bcmcfg(void);
2702*4882a593Smuzhiyun void wl_cfg80211_set_bcmcfg(struct bcm_cfg80211 *cfg);
2703*4882a593Smuzhiyun
2704*4882a593Smuzhiyun /* clear IEs */
2705*4882a593Smuzhiyun extern s32 wl_cfg80211_clear_mgmt_vndr_ies(struct bcm_cfg80211 *cfg);
2706*4882a593Smuzhiyun extern s32 wl_cfg80211_clear_per_bss_ies(struct bcm_cfg80211 *cfg, struct wireless_dev *wdev);
2707*4882a593Smuzhiyun extern void wl_cfg80211_clear_p2p_disc_ies(struct bcm_cfg80211 *cfg);
2708*4882a593Smuzhiyun #ifdef WL_STATIC_IF
2709*4882a593Smuzhiyun extern int32 wl_cfg80211_update_iflist_info(struct bcm_cfg80211 *cfg, struct net_device *ndev,
2710*4882a593Smuzhiyun int ifidx, uint8 *addr, int bssidx, char *name, int if_state);
2711*4882a593Smuzhiyun #endif /* WL_STATIC_IF */
2712*4882a593Smuzhiyun extern s32 wl_cfg80211_up(struct net_device *net);
2713*4882a593Smuzhiyun extern s32 wl_cfg80211_down(struct net_device *net);
2714*4882a593Smuzhiyun extern void wl_cfg80211_sta_ifdown(struct net_device *net);
2715*4882a593Smuzhiyun extern s32 wl_cfg80211_notify_ifadd(struct net_device * dev, int ifidx, char *name, uint8 *mac,
2716*4882a593Smuzhiyun uint8 bssidx, uint8 role);
2717*4882a593Smuzhiyun extern s32 wl_cfg80211_notify_ifdel(struct net_device * dev, int ifidx, char *name, uint8 *mac,
2718*4882a593Smuzhiyun uint8 bssidx);
2719*4882a593Smuzhiyun extern s32 wl_cfg80211_notify_ifchange(struct net_device * dev, int ifidx, char *name, uint8 *mac,
2720*4882a593Smuzhiyun uint8 bssidx);
2721*4882a593Smuzhiyun extern struct net_device* wl_cfg80211_allocate_if(struct bcm_cfg80211 *cfg, int ifidx,
2722*4882a593Smuzhiyun const char *name, uint8 *mac, uint8 bssidx, const char *dngl_name);
2723*4882a593Smuzhiyun extern int wl_cfg80211_register_if(struct bcm_cfg80211 *cfg,
2724*4882a593Smuzhiyun int ifidx, struct net_device* ndev, bool rtnl_lock_reqd);
2725*4882a593Smuzhiyun extern int wl_cfg80211_remove_if(struct bcm_cfg80211 *cfg,
2726*4882a593Smuzhiyun int ifidx, struct net_device* ndev, bool rtnl_lock_reqd);
2727*4882a593Smuzhiyun extern void wl_cfg80211_cleanup_if(struct net_device *dev);
2728*4882a593Smuzhiyun extern bool wl_cfg80211_is_concurrent_mode(struct net_device * dev);
2729*4882a593Smuzhiyun extern void wl_cfg80211_disassoc(struct net_device *ndev, uint32 reason);
2730*4882a593Smuzhiyun extern void wl_cfg80211_del_all_sta(struct net_device *ndev, uint32 reason);
2731*4882a593Smuzhiyun extern void* wl_cfg80211_get_dhdp(struct net_device * dev);
2732*4882a593Smuzhiyun extern bool wl_cfg80211_is_p2p_active(struct net_device * dev);
2733*4882a593Smuzhiyun extern bool wl_cfg80211_is_roam_offload(struct net_device * dev);
2734*4882a593Smuzhiyun extern bool wl_cfg80211_is_event_from_connected_bssid(struct net_device * dev,
2735*4882a593Smuzhiyun const wl_event_msg_t *e, int ifidx);
2736*4882a593Smuzhiyun extern void wl_cfg80211_dbg_level(u32 level);
2737*4882a593Smuzhiyun extern s32 wl_cfg80211_get_p2p_dev_addr(struct net_device *net, struct ether_addr *p2pdev_addr);
2738*4882a593Smuzhiyun extern s32 wl_cfg80211_set_p2p_noa(struct net_device *net, char* buf, int len);
2739*4882a593Smuzhiyun extern s32 wl_cfg80211_get_p2p_noa(struct net_device *net, char* buf, int len);
2740*4882a593Smuzhiyun extern s32 wl_cfg80211_set_wps_p2p_ie(struct net_device *net, char *buf, int len,
2741*4882a593Smuzhiyun enum wl_management_type type);
2742*4882a593Smuzhiyun extern s32 wl_cfg80211_set_p2p_ps(struct net_device *net, char* buf, int len);
2743*4882a593Smuzhiyun extern s32 wl_cfg80211_set_p2p_ecsa(struct net_device *net, char* buf, int len);
2744*4882a593Smuzhiyun extern s32 wl_cfg80211_increase_p2p_bw(struct net_device *net, char* buf, int len);
2745*4882a593Smuzhiyun #ifdef P2PLISTEN_AP_SAMECHN
2746*4882a593Smuzhiyun extern s32 wl_cfg80211_set_p2p_resp_ap_chn(struct net_device *net, s32 enable);
2747*4882a593Smuzhiyun #endif /* P2PLISTEN_AP_SAMECHN */
2748*4882a593Smuzhiyun
2749*4882a593Smuzhiyun /* btcoex functions */
2750*4882a593Smuzhiyun void* wl_cfg80211_btcoex_init(struct net_device *ndev);
2751*4882a593Smuzhiyun void wl_cfg80211_btcoex_deinit(void);
2752*4882a593Smuzhiyun
2753*4882a593Smuzhiyun extern chanspec_t wl_chspec_from_legacy(chanspec_t legacy_chspec);
2754*4882a593Smuzhiyun extern chanspec_t wl_chspec_driver_to_host(chanspec_t chanspec);
2755*4882a593Smuzhiyun
2756*4882a593Smuzhiyun #ifdef WL_SDO
2757*4882a593Smuzhiyun extern s32 wl_cfg80211_sdo_init(struct bcm_cfg80211 *cfg);
2758*4882a593Smuzhiyun extern s32 wl_cfg80211_sdo_deinit(struct bcm_cfg80211 *cfg);
2759*4882a593Smuzhiyun extern s32 wl_cfg80211_sd_offload(struct net_device *net, char *cmd, char* buf, int len);
2760*4882a593Smuzhiyun extern s32 wl_cfg80211_pause_sdo(struct net_device *dev, struct bcm_cfg80211 *cfg);
2761*4882a593Smuzhiyun extern s32 wl_cfg80211_resume_sdo(struct net_device *dev, struct bcm_cfg80211 *cfg);
2762*4882a593Smuzhiyun
2763*4882a593Smuzhiyun #endif
2764*4882a593Smuzhiyun #ifdef WL_SUPPORT_AUTO_CHANNEL
2765*4882a593Smuzhiyun #define CHANSPEC_BUF_SIZE 2048
2766*4882a593Smuzhiyun #define CHANINFO_LIST_BUF_SIZE (1024 * 4)
2767*4882a593Smuzhiyun #define CHAN_SEL_IOCTL_DELAY 300
2768*4882a593Smuzhiyun #define CHAN_SEL_RETRY_COUNT 15
2769*4882a593Smuzhiyun #define CHANNEL_IS_RADAR(channel) (((channel & WL_CHAN_RADAR) || \
2770*4882a593Smuzhiyun (channel & WL_CHAN_PASSIVE)) ? true : false)
2771*4882a593Smuzhiyun #define CHANNEL_IS_2G(channel) (((channel >= 1) && (channel <= 14)) ? \
2772*4882a593Smuzhiyun true : false)
2773*4882a593Smuzhiyun #define CHANNEL_IS_5G(channel) (((channel >= 36) && (channel <= 165)) ? \
2774*4882a593Smuzhiyun true : false)
2775*4882a593Smuzhiyun extern s32 wl_cfg80211_get_best_channels(struct net_device *dev, char* command,
2776*4882a593Smuzhiyun int total_len);
2777*4882a593Smuzhiyun #endif /* WL_SUPPORT_AUTO_CHANNEL */
2778*4882a593Smuzhiyun extern int wl_cfg80211_ether_atoe(const char *a, struct ether_addr *n);
2779*4882a593Smuzhiyun extern int wl_cfg80211_hang(struct net_device *dev, u16 reason);
2780*4882a593Smuzhiyun extern bool wl_cfg80211_macaddr_sync_reqd(struct net_device *dev);
2781*4882a593Smuzhiyun void wl_cfg80211_generate_mac_addr(struct ether_addr *ea_addr);
2782*4882a593Smuzhiyun extern s32 wl_mode_to_nl80211_iftype(s32 mode);
2783*4882a593Smuzhiyun int wl_cfg80211_do_driver_init(struct net_device *net);
2784*4882a593Smuzhiyun void wl_cfg80211_enable_trace(u32 level);
2785*4882a593Smuzhiyun extern s32 wl_update_wiphybands(struct bcm_cfg80211 *cfg, bool notify);
2786*4882a593Smuzhiyun extern s32 wl_cfg80211_if_is_group_owner(void);
2787*4882a593Smuzhiyun extern chanspec_t wl_chspec_host_to_driver(chanspec_t chanspec);
2788*4882a593Smuzhiyun extern chanspec_t wl_ch_host_to_driver(u16 channel);
2789*4882a593Smuzhiyun extern s32 wl_set_tx_power(struct net_device *dev,
2790*4882a593Smuzhiyun enum nl80211_tx_power_setting type, s32 dbm);
2791*4882a593Smuzhiyun extern s32 wl_get_tx_power(struct net_device *dev, s32 *dbm);
2792*4882a593Smuzhiyun extern s32 wl_add_remove_eventmsg(struct net_device *ndev, u16 event, bool add);
2793*4882a593Smuzhiyun extern void wl_stop_wait_next_action_frame(struct bcm_cfg80211 *cfg, struct net_device *ndev,
2794*4882a593Smuzhiyun u8 bsscfgidx);
2795*4882a593Smuzhiyun #ifdef WL_HOST_BAND_MGMT
2796*4882a593Smuzhiyun extern s32 wl_cfg80211_set_band(struct net_device *ndev, int band);
2797*4882a593Smuzhiyun #endif /* WL_HOST_BAND_MGMT */
2798*4882a593Smuzhiyun
2799*4882a593Smuzhiyun #if defined(OEM_ANDROID) && defined(DHCP_SCAN_SUPPRESS)
2800*4882a593Smuzhiyun extern int wl_cfg80211_scan_suppress(struct net_device *dev, int suppress);
2801*4882a593Smuzhiyun #endif /* OEM_ANDROID */
2802*4882a593Smuzhiyun
2803*4882a593Smuzhiyun extern void wl_cfg80211_add_to_eventbuffer(wl_eventmsg_buf_t *ev, u16 event, bool set);
2804*4882a593Smuzhiyun extern s32 wl_cfg80211_apply_eventbuffer(struct net_device *ndev,
2805*4882a593Smuzhiyun struct bcm_cfg80211 *cfg, wl_eventmsg_buf_t *ev);
2806*4882a593Smuzhiyun extern void get_primary_mac(struct bcm_cfg80211 *cfg, struct ether_addr *mac);
2807*4882a593Smuzhiyun extern void wl_cfg80211_update_power_mode(struct net_device *dev);
2808*4882a593Smuzhiyun extern void wl_terminate_event_handler(struct net_device *dev);
2809*4882a593Smuzhiyun #if defined(DHD_ENABLE_BIGDATA_LOGGING)
2810*4882a593Smuzhiyun extern s32 wl_cfg80211_get_bss_info(struct net_device *dev, char* cmd, int total_len);
2811*4882a593Smuzhiyun extern s32 wl_cfg80211_get_connect_failed_status(struct net_device *dev, char* cmd, int total_len);
2812*4882a593Smuzhiyun #endif /* DHD_ENABLE_BIGDATA_LOGGING */
2813*4882a593Smuzhiyun extern struct bcm_cfg80211 *wl_get_cfg(struct net_device *ndev);
2814*4882a593Smuzhiyun extern s32 wl_cfg80211_set_if_band(struct net_device *ndev, int band);
2815*4882a593Smuzhiyun extern s32 wl_cfg80211_set_country_code(struct net_device *dev, char *country_code,
2816*4882a593Smuzhiyun bool notify, bool user_enforced, int revinfo);
2817*4882a593Smuzhiyun extern bool wl_cfg80211_is_hal_started(struct bcm_cfg80211 *cfg);
2818*4882a593Smuzhiyun #ifdef WL_WIPSEVT
2819*4882a593Smuzhiyun extern int wl_cfg80211_wips_event(uint16 misdeauth, char* bssid);
2820*4882a593Smuzhiyun extern int wl_cfg80211_wips_event_ext(wl_wips_event_info_t *wips_event);
2821*4882a593Smuzhiyun #endif /* WL_WIPSEVT */
2822*4882a593Smuzhiyun
2823*4882a593Smuzhiyun #define SCAN_BUF_CNT 2
2824*4882a593Smuzhiyun #define SCAN_BUF_NEXT 1
2825*4882a593Smuzhiyun #define WL_SCANTYPE_LEGACY 0x1
2826*4882a593Smuzhiyun #define WL_SCANTYPE_P2P 0x2
2827*4882a593Smuzhiyun extern void wl_cfg80211_ibss_vsie_set_buffer(struct net_device *dev, vndr_ie_setbuf_t *ibss_vsie,
2828*4882a593Smuzhiyun int ibss_vsie_len);
2829*4882a593Smuzhiyun extern s32 wl_cfg80211_ibss_vsie_delete(struct net_device *dev);
2830*4882a593Smuzhiyun #ifdef WLAIBSS
2831*4882a593Smuzhiyun extern void wl_cfg80211_set_txfail_pid(struct net_device *dev, int pid);
2832*4882a593Smuzhiyun #endif /* WLAIBSS */
2833*4882a593Smuzhiyun #ifdef WL_RELMCAST
2834*4882a593Smuzhiyun extern void wl_cfg80211_set_rmc_pid(struct net_device *dev, int pid);
2835*4882a593Smuzhiyun #endif /* WL_RELMCAST */
2836*4882a593Smuzhiyun extern int wl_cfg80211_set_mgmt_vndr_ies(struct bcm_cfg80211 *cfg,
2837*4882a593Smuzhiyun bcm_struct_cfgdev *cfgdev, s32 bssidx, s32 pktflag,
2838*4882a593Smuzhiyun const u8 *vndr_ie, u32 vndr_ie_len);
2839*4882a593Smuzhiyun
2840*4882a593Smuzhiyun #ifdef WLFBT
2841*4882a593Smuzhiyun extern int wl_cfg80211_get_fbt_key(struct net_device *dev, uint8 *key, int total_len);
2842*4882a593Smuzhiyun #endif
2843*4882a593Smuzhiyun
2844*4882a593Smuzhiyun /* Action frame specific functions */
2845*4882a593Smuzhiyun extern u8 wl_get_action_category(void *frame, u32 frame_len);
2846*4882a593Smuzhiyun extern int wl_get_public_action(void *frame, u32 frame_len, u8 *ret_action);
2847*4882a593Smuzhiyun
2848*4882a593Smuzhiyun #ifdef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST
2849*4882a593Smuzhiyun struct net_device *wl_cfg80211_get_remain_on_channel_ndev(struct bcm_cfg80211 *cfg);
2850*4882a593Smuzhiyun #endif /* WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */
2851*4882a593Smuzhiyun
2852*4882a593Smuzhiyun #ifdef WL_SUPPORT_ACS
2853*4882a593Smuzhiyun #define ACS_MSRMNT_DELAY 1000 /* dump_obss delay in ms */
2854*4882a593Smuzhiyun #define IOCTL_RETRY_COUNT 5
2855*4882a593Smuzhiyun #define CHAN_NOISE_DUMMY -80
2856*4882a593Smuzhiyun #define OBSS_TOKEN_IDX 15
2857*4882a593Smuzhiyun #define IBSS_TOKEN_IDX 15
2858*4882a593Smuzhiyun #define TX_TOKEN_IDX 14
2859*4882a593Smuzhiyun #define CTG_TOKEN_IDX 13
2860*4882a593Smuzhiyun #define PKT_TOKEN_IDX 15
2861*4882a593Smuzhiyun #define IDLE_TOKEN_IDX 12
2862*4882a593Smuzhiyun #endif /* WL_SUPPORT_ACS */
2863*4882a593Smuzhiyun
2864*4882a593Smuzhiyun #ifdef BCMWAPI_WPI
2865*4882a593Smuzhiyun #define is_wapi(cipher) (cipher == WLAN_CIPHER_SUITE_SMS4) ? 1 : 0
2866*4882a593Smuzhiyun #endif /* BCMWAPI_WPI */
2867*4882a593Smuzhiyun
2868*4882a593Smuzhiyun extern int wl_cfg80211_get_ioctl_version(void);
2869*4882a593Smuzhiyun extern int wl_cfg80211_enable_roam_offload(struct net_device *dev, int enable);
2870*4882a593Smuzhiyun #ifdef WBTEXT
2871*4882a593Smuzhiyun extern s32 wl_cfg80211_wbtext_set_default(struct net_device *ndev);
2872*4882a593Smuzhiyun extern s32 wl_cfg80211_wbtext_config(struct net_device *ndev, char *data,
2873*4882a593Smuzhiyun char *command, int total_len);
2874*4882a593Smuzhiyun extern int wl_cfg80211_wbtext_weight_config(struct net_device *ndev, char *data,
2875*4882a593Smuzhiyun char *command, int total_len);
2876*4882a593Smuzhiyun extern int wl_cfg80211_wbtext_table_config(struct net_device *ndev, char *data,
2877*4882a593Smuzhiyun char *command, int total_len);
2878*4882a593Smuzhiyun extern s32 wl_cfg80211_wbtext_delta_config(struct net_device *ndev, char *data,
2879*4882a593Smuzhiyun char *command, int total_len);
2880*4882a593Smuzhiyun #endif /* WBTEXT */
2881*4882a593Smuzhiyun extern s32 wl_cfg80211_get_band_chanspecs(struct net_device *ndev,
2882*4882a593Smuzhiyun void *buf, s32 buflen, chanspec_band_t band, bool acs_req);
2883*4882a593Smuzhiyun
2884*4882a593Smuzhiyun extern s32 wl_cfg80211_bss_up(struct bcm_cfg80211 *cfg,
2885*4882a593Smuzhiyun struct net_device *ndev, s32 bsscfg_idx, s32 up);
2886*4882a593Smuzhiyun extern bool wl_cfg80211_bss_isup(struct net_device *ndev, int bsscfg_idx);
2887*4882a593Smuzhiyun
2888*4882a593Smuzhiyun struct net_device *wl_cfg80211_post_ifcreate(struct net_device *ndev,
2889*4882a593Smuzhiyun wl_if_event_info *event, u8 *addr, const char *name, bool rtnl_lock_reqd);
2890*4882a593Smuzhiyun extern s32 wl_cfg80211_post_ifdel(struct net_device *ndev, bool rtnl_lock_reqd, s32 ifidx);
2891*4882a593Smuzhiyun #if defined(PKT_FILTER_SUPPORT) && defined(APSTA_BLOCK_ARP_DURING_DHCP)
2892*4882a593Smuzhiyun extern void wl_cfg80211_block_arp(struct net_device *dev, int enable);
2893*4882a593Smuzhiyun #endif /* PKT_FILTER_SUPPORT && APSTA_BLOCK_ARP_DURING_DHCP */
2894*4882a593Smuzhiyun
2895*4882a593Smuzhiyun #ifdef WLTDLS
2896*4882a593Smuzhiyun extern s32 wl_cfg80211_tdls_config(struct bcm_cfg80211 *cfg,
2897*4882a593Smuzhiyun enum wl_tdls_config state, bool tdls_mode);
2898*4882a593Smuzhiyun extern s32 wl_tdls_event_handler(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev,
2899*4882a593Smuzhiyun const wl_event_msg_t *e, void *data);
2900*4882a593Smuzhiyun #endif /* WLTDLS */
2901*4882a593Smuzhiyun
2902*4882a593Smuzhiyun #ifdef WL_NAN
2903*4882a593Smuzhiyun extern int wl_cfgvendor_send_nan_event(struct wiphy * wiphy,
2904*4882a593Smuzhiyun struct net_device *dev, int event_id,
2905*4882a593Smuzhiyun nan_event_data_t *nan_event_data);
2906*4882a593Smuzhiyun #ifdef RTT_SUPPORT
2907*4882a593Smuzhiyun extern s32 wl_cfgvendor_send_as_rtt_legacy_event(struct wiphy *wiphy,
2908*4882a593Smuzhiyun struct net_device *dev, wl_nan_ev_rng_rpt_ind_t *range_res,
2909*4882a593Smuzhiyun uint32 status);
2910*4882a593Smuzhiyun #endif /* RTT_SUPPORT */
2911*4882a593Smuzhiyun #ifdef WL_NANP2P
2912*4882a593Smuzhiyun extern int wl_cfg80211_set_iface_conc_disc(struct net_device *ndev,
2913*4882a593Smuzhiyun uint8 arg_val);
2914*4882a593Smuzhiyun extern uint8 wl_cfg80211_get_iface_conc_disc(struct net_device *ndev);
2915*4882a593Smuzhiyun #endif /* WL_NANP2P */
2916*4882a593Smuzhiyun #endif /* WL_NAN */
2917*4882a593Smuzhiyun
2918*4882a593Smuzhiyun #ifdef WL_CFG80211_P2P_DEV_IF
2919*4882a593Smuzhiyun extern void wl_cfg80211_del_p2p_wdev(struct net_device *dev);
2920*4882a593Smuzhiyun #endif /* WL_CFG80211_P2P_DEV_IF */
2921*4882a593Smuzhiyun #ifdef WL_CFG80211_SYNC_GON
2922*4882a593Smuzhiyun #define WL_DRV_STATUS_SENDING_AF_FRM_EXT(cfg) \
2923*4882a593Smuzhiyun (wl_get_drv_status_all(cfg, SENDING_ACT_FRM) || \
2924*4882a593Smuzhiyun wl_get_drv_status_all(cfg, WAITING_NEXT_ACT_FRM_LISTEN))
2925*4882a593Smuzhiyun #else
2926*4882a593Smuzhiyun #define WL_DRV_STATUS_SENDING_AF_FRM_EXT(cfg) wl_get_drv_status_all(cfg, SENDING_ACT_FRM)
2927*4882a593Smuzhiyun #endif /* WL_CFG80211_SYNC_GON */
2928*4882a593Smuzhiyun
2929*4882a593Smuzhiyun #ifdef P2P_LISTEN_OFFLOADING
2930*4882a593Smuzhiyun extern s32 wl_cfg80211_p2plo_deinit(struct bcm_cfg80211 *cfg);
2931*4882a593Smuzhiyun #endif /* P2P_LISTEN_OFFLOADING */
2932*4882a593Smuzhiyun
2933*4882a593Smuzhiyun /* Function to flush the FW log buffer content */
2934*4882a593Smuzhiyun extern void wl_flush_fw_log_buffer(struct net_device *dev, uint32 logset_mask);
2935*4882a593Smuzhiyun
2936*4882a593Smuzhiyun #define RETURN_EIO_IF_NOT_UP(wlpriv) \
2937*4882a593Smuzhiyun do { \
2938*4882a593Smuzhiyun struct net_device *checkSysUpNDev = bcmcfg_to_prmry_ndev(wlpriv); \
2939*4882a593Smuzhiyun if (unlikely(!wl_get_drv_status(wlpriv, READY, checkSysUpNDev))) { \
2940*4882a593Smuzhiyun WL_INFORM(("device is not ready\n")); \
2941*4882a593Smuzhiyun return -EIO; \
2942*4882a593Smuzhiyun } \
2943*4882a593Smuzhiyun } while (0)
2944*4882a593Smuzhiyun
2945*4882a593Smuzhiyun #ifdef QOS_MAP_SET
2946*4882a593Smuzhiyun extern uint8 *wl_get_up_table(dhd_pub_t * dhdp, int idx);
2947*4882a593Smuzhiyun #endif /* QOS_MAP_SET */
2948*4882a593Smuzhiyun
2949*4882a593Smuzhiyun #define P2PO_COOKIE 65535
2950*4882a593Smuzhiyun u64 wl_cfg80211_get_new_roc_id(struct bcm_cfg80211 *cfg);
2951*4882a593Smuzhiyun
2952*4882a593Smuzhiyun #define ROAMSCAN_MODE_NORMAL 0
2953*4882a593Smuzhiyun #define ROAMSCAN_MODE_WES 1
2954*4882a593Smuzhiyun
2955*4882a593Smuzhiyun #ifdef SUPPORT_RSSI_SUM_REPORT
2956*4882a593Smuzhiyun int wl_get_rssi_logging(struct net_device *dev, void *param);
2957*4882a593Smuzhiyun int wl_set_rssi_logging(struct net_device *dev, void *param);
2958*4882a593Smuzhiyun int wl_get_rssi_per_ant(struct net_device *dev, char *ifname, char *peer_mac, void *param);
2959*4882a593Smuzhiyun #endif /* SUPPORT_RSSI_SUM_REPORT */
2960*4882a593Smuzhiyun struct wireless_dev * wl_cfg80211_add_if(struct bcm_cfg80211 *cfg, struct net_device *primary_ndev,
2961*4882a593Smuzhiyun wl_iftype_t wl_iftype, const char *name, u8 *mac);
2962*4882a593Smuzhiyun extern s32 wl_cfg80211_del_if(struct bcm_cfg80211 *cfg, struct net_device *primary_ndev,
2963*4882a593Smuzhiyun struct wireless_dev *wdev, char *name);
2964*4882a593Smuzhiyun s32 _wl_cfg80211_del_if(struct bcm_cfg80211 *cfg, struct net_device *primary_ndev,
2965*4882a593Smuzhiyun struct wireless_dev *wdev, char *ifname);
2966*4882a593Smuzhiyun s32 wl_cfg80211_delete_iface(struct bcm_cfg80211 *cfg, wl_iftype_t sec_data_if_type);
2967*4882a593Smuzhiyun
2968*4882a593Smuzhiyun #ifdef WL_STATIC_IF
2969*4882a593Smuzhiyun extern struct net_device *wl_cfg80211_register_static_if(struct bcm_cfg80211 *cfg,
2970*4882a593Smuzhiyun u16 iftype, char *ifname, int static_ifidx);
2971*4882a593Smuzhiyun extern void wl_cfg80211_unregister_static_if(struct bcm_cfg80211 * cfg);
2972*4882a593Smuzhiyun extern s32 wl_cfg80211_static_if_open(struct net_device *net);
2973*4882a593Smuzhiyun extern s32 wl_cfg80211_static_if_close(struct net_device *net);
2974*4882a593Smuzhiyun extern struct net_device * wl_cfg80211_post_static_ifcreate(struct bcm_cfg80211 *cfg,
2975*4882a593Smuzhiyun wl_if_event_info *event, u8 *addr, s32 iface_type, int static_ifidx);
2976*4882a593Smuzhiyun extern s32 wl_cfg80211_post_static_ifdel(struct bcm_cfg80211 *cfg, struct net_device *ndev);
2977*4882a593Smuzhiyun #endif /* WL_STATIC_IF */
2978*4882a593Smuzhiyun extern struct wireless_dev *wl_cfg80211_get_wdev_from_ifname(struct bcm_cfg80211 *cfg,
2979*4882a593Smuzhiyun const char *name);
2980*4882a593Smuzhiyun struct net_device* wl_get_netdev_by_name(struct bcm_cfg80211 *cfg, char *ifname);
2981*4882a593Smuzhiyun extern int wl_cfg80211_ifstats_counters(struct net_device *dev, wl_if_stats_t *if_stats);
2982*4882a593Smuzhiyun extern s32 wl_cfg80211_set_dbg_verbose(struct net_device *ndev, u32 level);
2983*4882a593Smuzhiyun extern int wl_cfg80211_deinit_p2p_discovery(struct bcm_cfg80211 * cfg);
2984*4882a593Smuzhiyun extern int wl_cfg80211_set_frameburst(struct bcm_cfg80211 *cfg, bool enable);
2985*4882a593Smuzhiyun extern int wl_cfg80211_determine_p2p_rsdb_scc_mode(struct bcm_cfg80211 *cfg);
2986*4882a593Smuzhiyun extern uint8 wl_cfg80211_get_bus_state(struct bcm_cfg80211 *cfg);
2987*4882a593Smuzhiyun #ifdef WL_WPS_SYNC
2988*4882a593Smuzhiyun void wl_handle_wps_states(struct net_device *ndev, u8 *dump_data, u16 len, bool direction);
2989*4882a593Smuzhiyun #endif /* WL_WPS_SYNC */
2990*4882a593Smuzhiyun extern int wl_features_set(u8 *array, uint8 len, u32 ftidx);
2991*4882a593Smuzhiyun extern void *wl_read_prof(struct bcm_cfg80211 *cfg, struct net_device *ndev, s32 item);
2992*4882a593Smuzhiyun extern s32 wl_cfg80211_sup_event_handler(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev,
2993*4882a593Smuzhiyun const wl_event_msg_t *event, void *data);
2994*4882a593Smuzhiyun #ifdef CUSTOMER_HW4_DEBUG
2995*4882a593Smuzhiyun extern void wl_scan_timeout_dbg_clear(void);
2996*4882a593Smuzhiyun #endif /* CUSTOMER_HW4_DEBUG */
2997*4882a593Smuzhiyun extern s32 cfg80211_to_wl_iftype(uint16 type, uint16 *role, uint16 *mode);
2998*4882a593Smuzhiyun extern s32 wl_cfg80211_net_attach(struct net_device *primary_ndev);
2999*4882a593Smuzhiyun extern void wl_print_verinfo(struct bcm_cfg80211 *cfg);
3000*4882a593Smuzhiyun extern const u8 *wl_find_attribute(const u8 *buf, u16 len, u16 element_id);
3001*4882a593Smuzhiyun extern int wl_cfg80211_get_concurrency_mode(struct bcm_cfg80211 *cfg);
3002*4882a593Smuzhiyun extern s32 wl_cfg80211_config_suspend_events(struct net_device *ndev, bool enable);
3003*4882a593Smuzhiyun #ifdef PCIE_INB_DW
3004*4882a593Smuzhiyun bool wl_cfg80211_check_in_progress(struct net_device *dev);
3005*4882a593Smuzhiyun #endif
3006*4882a593Smuzhiyun #ifdef WES_SUPPORT
3007*4882a593Smuzhiyun extern int wl_android_set_ncho_mode(struct net_device *dev, int mode);
3008*4882a593Smuzhiyun #endif /* WES_SUPPORT */
3009*4882a593Smuzhiyun #ifdef KEEP_ALIVE
3010*4882a593Smuzhiyun extern int wl_cfg80211_start_mkeep_alive(struct bcm_cfg80211 *cfg, uint8 mkeep_alive_id,
3011*4882a593Smuzhiyun uint16 ether_type, uint8 *ip_pkt, uint16 ip_pkt_len, uint8* src_mac_addr,
3012*4882a593Smuzhiyun uint8* dst_mac_addr, uint32 period_msec);
3013*4882a593Smuzhiyun extern int wl_cfg80211_stop_mkeep_alive(struct bcm_cfg80211 *cfg, uint8 mkeep_alive_id);
3014*4882a593Smuzhiyun #endif /* KEEP_ALIVE */
3015*4882a593Smuzhiyun
3016*4882a593Smuzhiyun extern s32 wl_cfg80211_handle_macaddr_change(struct net_device *dev, u8 *macaddr);
3017*4882a593Smuzhiyun extern int wl_cfg80211_handle_hang_event(struct net_device *ndev,
3018*4882a593Smuzhiyun uint16 hang_reason, uint32 memdump_type);
3019*4882a593Smuzhiyun #ifndef OEM_ANDROID
3020*4882a593Smuzhiyun extern s32 wl_cfg80211_resume(struct bcm_cfg80211 *cfg);
3021*4882a593Smuzhiyun extern s32 wl_cfg80211_suspend(struct bcm_cfg80211 *cfg);
3022*4882a593Smuzhiyun #endif /* !OEM_ANDROID */
3023*4882a593Smuzhiyun bool wl_cfg80211_is_dpp_frame(void *frame, u32 frame_len);
3024*4882a593Smuzhiyun const char *get_dpp_pa_ftype(enum wl_dpp_ftype ftype);
3025*4882a593Smuzhiyun bool wl_cfg80211_is_dpp_gas_action(void *frame, u32 frame_len);
3026*4882a593Smuzhiyun extern bool wl_cfg80211_find_gas_subtype(u8 subtype, u16 adv_id, u8* data, u32 len);
3027*4882a593Smuzhiyun #ifdef ESCAN_CHANNEL_CACHE
3028*4882a593Smuzhiyun extern void update_roam_cache(struct bcm_cfg80211 *cfg, int ioctl_ver);
3029*4882a593Smuzhiyun #endif /* ESCAN_CHANNEL_CACHE */
3030*4882a593Smuzhiyun
3031*4882a593Smuzhiyun #ifdef WL_NAN
3032*4882a593Smuzhiyun extern int wl_cfgnan_get_stats(struct bcm_cfg80211 *cfg);
3033*4882a593Smuzhiyun #endif /* WL_NAN */
3034*4882a593Smuzhiyun
3035*4882a593Smuzhiyun #ifdef WL_SAE
3036*4882a593Smuzhiyun extern s32 wl_cfg80211_set_wsec_info(struct net_device *dev, uint32 *data,
3037*4882a593Smuzhiyun uint16 data_len, int tag);
3038*4882a593Smuzhiyun #endif /* WL_SAE */
3039*4882a593Smuzhiyun #define WL_CHANNEL_ARRAY_INIT(band_chan_arr) \
3040*4882a593Smuzhiyun do { \
3041*4882a593Smuzhiyun u32 arr_size, k; \
3042*4882a593Smuzhiyun arr_size = ARRAYSIZE(band_chan_arr); \
3043*4882a593Smuzhiyun for (k = 0; k < arr_size; k++) { \
3044*4882a593Smuzhiyun band_chan_arr[k].flags = IEEE80211_CHAN_DISABLED; \
3045*4882a593Smuzhiyun } \
3046*4882a593Smuzhiyun } while (0)
3047*4882a593Smuzhiyun
3048*4882a593Smuzhiyun #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0))
3049*4882a593Smuzhiyun #define CFG80211_PUT_BSS(wiphy, bss) cfg80211_put_bss(wiphy, bss);
3050*4882a593Smuzhiyun #else
3051*4882a593Smuzhiyun #define CFG80211_PUT_BSS(wiphy, bss) cfg80211_put_bss(bss);
3052*4882a593Smuzhiyun #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0) */
3053*4882a593Smuzhiyun
3054*4882a593Smuzhiyun #ifdef RSSI_OFFSET
wl_rssi_offset(s32 rssi)3055*4882a593Smuzhiyun static inline s32 wl_rssi_offset(s32 rssi)
3056*4882a593Smuzhiyun {
3057*4882a593Smuzhiyun rssi += RSSI_OFFSET;
3058*4882a593Smuzhiyun if (rssi > 0)
3059*4882a593Smuzhiyun rssi = 0;
3060*4882a593Smuzhiyun return rssi;
3061*4882a593Smuzhiyun }
3062*4882a593Smuzhiyun #else
3063*4882a593Smuzhiyun #define wl_rssi_offset(x) x
3064*4882a593Smuzhiyun #endif
3065*4882a593Smuzhiyun extern int wl_channel_to_frequency(u32 chan, chanspec_band_t band);
3066*4882a593Smuzhiyun extern int wl_cfg80211_config_rsnxe_ie(struct bcm_cfg80211 *cfg, struct net_device *dev,
3067*4882a593Smuzhiyun const u8 *parse, u32 len);
3068*4882a593Smuzhiyun extern bool dhd_force_country_change(struct net_device *dev);
3069*4882a593Smuzhiyun extern u32 wl_dbg_level;
3070*4882a593Smuzhiyun extern u32 wl_cfg80211_debug_data_dump(struct net_device *dev, u8 *buf, u32 buf_len);
3071*4882a593Smuzhiyun extern void wl_cfg80211_concurrent_roam(struct bcm_cfg80211 *cfg, int enable);
3072*4882a593Smuzhiyun
3073*4882a593Smuzhiyun extern void wl_cfg80211_iface_state_ops(struct wireless_dev *wdev, wl_interface_state_t state,
3074*4882a593Smuzhiyun wl_iftype_t wl_iftype, u16 wl_mode);
3075*4882a593Smuzhiyun extern chanspec_t wl_cfg80211_get_shared_freq(struct wiphy *wiphy);
3076*4882a593Smuzhiyun #ifdef SUPPORT_SET_CAC
3077*4882a593Smuzhiyun extern void wl_cfg80211_set_cac(struct bcm_cfg80211 *cfg, int enable);
3078*4882a593Smuzhiyun #endif /* SUPPORT_SET_CAC */
3079*4882a593Smuzhiyun extern s32 wl_cfg80211_add_del_bss(struct bcm_cfg80211 *cfg,
3080*4882a593Smuzhiyun struct net_device *ndev, s32 bsscfg_idx,
3081*4882a593Smuzhiyun wl_iftype_t brcm_iftype, s32 del, u8 *addr);
3082*4882a593Smuzhiyun extern s32 wl_bss_handle_sae_auth(struct bcm_cfg80211 *cfg, struct net_device *ndev,
3083*4882a593Smuzhiyun const wl_event_msg_t *event, void *data);
3084*4882a593Smuzhiyun #ifdef WL_WPS_SYNC
3085*4882a593Smuzhiyun extern s32 wl_wps_session_update(struct net_device *ndev, u16 state, const u8 *peer_mac);
3086*4882a593Smuzhiyun #endif /* WL_WPS_SYNC */
3087*4882a593Smuzhiyun extern s32 wl_update_prof(struct bcm_cfg80211 *cfg, struct net_device *ndev,
3088*4882a593Smuzhiyun const wl_event_msg_t *e, const void *data, s32 item);
3089*4882a593Smuzhiyun #ifdef WL_CLIENT_SAE
3090*4882a593Smuzhiyun extern s32 wl_handle_auth_event(struct bcm_cfg80211 *cfg, struct net_device *ndev,
3091*4882a593Smuzhiyun const wl_event_msg_t *e, void *data);
3092*4882a593Smuzhiyun #endif /* WL_CLIENT_SAE */
3093*4882a593Smuzhiyun #ifdef CUSTOMER_HW6
3094*4882a593Smuzhiyun extern bool wl_customer6_legacy_chip_check(struct bcm_cfg80211 *cfg,
3095*4882a593Smuzhiyun struct net_device *ndev);
3096*4882a593Smuzhiyun #endif /* CUSTOMER_HW6 */
3097*4882a593Smuzhiyun #if !defined(WL_TWT) && defined(WL_TWT_HAL_IF)
3098*4882a593Smuzhiyun extern s32 wl_cfgvendor_notify_twt_event(struct bcm_cfg80211 *cfg,
3099*4882a593Smuzhiyun bcm_struct_cfgdev *cfgdev, const wl_event_msg_t *e, void *data);
3100*4882a593Smuzhiyun #endif /* !WL_TWT && WL_TWT_HAL_IF */
3101*4882a593Smuzhiyun #ifdef BCMDBUS
3102*4882a593Smuzhiyun s32
3103*4882a593Smuzhiyun __wl_cfg80211_up_resume(dhd_pub_t *dhd);
3104*4882a593Smuzhiyun #endif /* BCMDBUS */
3105*4882a593Smuzhiyun void wl_wlfc_enable(struct bcm_cfg80211 *cfg, bool enable);
3106*4882a593Smuzhiyun s32 wl_handle_join(struct bcm_cfg80211 *cfg, struct net_device *dev,
3107*4882a593Smuzhiyun wlcfg_assoc_info_t *assoc_info);
3108*4882a593Smuzhiyun s32 wl_handle_reassoc(struct bcm_cfg80211 *cfg, struct net_device *dev,
3109*4882a593Smuzhiyun wlcfg_assoc_info_t *info);
3110*4882a593Smuzhiyun s32 wl_cfg80211_autochannel(struct net_device *dev, char* command, int total_len);
3111*4882a593Smuzhiyun #endif /* _wl_cfg80211_h_ */
3112