• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2019 Realtek Corporation.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  *****************************************************************************/
15 #define _OS_INTFS_C_
16 
17 #include <drv_types.h>
18 #include <hal_data.h>
19 #ifdef CONFIG_RTL8822CS_WIFI_HDF
20 #include "net_device.h"
21 extern struct NetDevice* get_rtl_netdev(void);
22 #endif
23 
24 MODULE_LICENSE("GPL");
25 MODULE_DESCRIPTION("Realtek Wireless Lan Driver");
26 MODULE_AUTHOR("Realtek Semiconductor Corp.");
27 MODULE_VERSION(DRIVERVERSION);
28 
29 /* module param defaults */
30 int rtw_chip_version = 0x00;
31 int rtw_rfintfs = HWPI;
32 int rtw_lbkmode = 0;/* RTL8712_AIR_TRX; */
33 #ifdef DBG_LA_MODE
34 int rtw_la_mode_en=0;
35 module_param(rtw_la_mode_en, int, 0644);
36 #endif
37 int rtw_network_mode = Ndis802_11IBSS;/* Ndis802_11Infrastructure; */ /* infra, ad-hoc, auto */
38 /* NDIS_802_11_SSID	ssid; */
39 int rtw_channel = 1;/* ad-hoc support requirement */
40 int rtw_wireless_mode = WIRELESS_MODE_MAX;
41 module_param(rtw_wireless_mode, int, 0644);
42 int rtw_vrtl_carrier_sense = AUTO_VCS;
43 int rtw_vcs_type = RTS_CTS;
44 int rtw_rts_thresh = 2347;
45 int rtw_frag_thresh = 2346;
46 int rtw_preamble = PREAMBLE_LONG;/* long, short, auto */
47 int rtw_scan_mode = 1;/* active, passive */
48 /* int smart_ps = 1; */
49 #ifdef CONFIG_POWER_SAVING
50 	/* IPS configuration */
51 	int rtw_ips_mode = RTW_IPS_MODE;
52 
53 	/* LPS configuration */
54 /* RTW_LPS_MODE=0:disable, 1:LPS , 2:LPS with clock gating, 3: power gating */
55 #if (RTW_LPS_MODE > 0)
56 	int rtw_power_mgnt = PS_MODE_MAX;
57 
58 	#ifdef CONFIG_USB_HCI
59 		int rtw_lps_level = LPS_NORMAL; /*USB default LPS level*/
60 	#else /*SDIO,PCIE*/
61 		int rtw_lps_level = (RTW_LPS_MODE - 1);
62 	#endif/*CONFIG_USB_HCI*/
63 #else
64 	int rtw_power_mgnt = PS_MODE_ACTIVE;
65 	int rtw_lps_level = LPS_NORMAL;
66 #endif
67 
68 	int rtw_lps_chk_by_tp = 1;
69 
70 	/* WOW LPS configuration */
71 #ifdef CONFIG_WOWLAN
72 /* RTW_WOW_LPS_MODE=0:disable, 1:LPS , 2:LPS with clock gating, 3: power gating */
73 #if (RTW_WOW_LPS_MODE > 0)
74 	int rtw_wow_power_mgnt = PS_MODE_MAX;
75 	int rtw_wow_lps_level = (RTW_WOW_LPS_MODE - 1);
76 #else
77 	int rtw_wow_power_mgnt = PS_MODE_ACTIVE;
78 	int rtw_wow_lps_level = LPS_NORMAL;
79 #endif
80 #endif /* CONFIG_WOWLAN */
81 
82 #else /* !CONFIG_POWER_SAVING */
83 	int rtw_ips_mode = IPS_NONE;
84 	int rtw_power_mgnt = PS_MODE_ACTIVE;
85 	int rtw_lps_level = LPS_NORMAL;
86 	int rtw_lps_chk_by_tp = 0;
87 #ifdef CONFIG_WOWLAN
88 	int rtw_wow_power_mgnt = PS_MODE_ACTIVE;
89 	int rtw_wow_lps_level = LPS_NORMAL;
90 #endif /* CONFIG_WOWLAN */
91 #endif /* CONFIG_POWER_SAVING */
92 
93 #ifdef CONFIG_NARROWBAND_SUPPORTING
94 int rtw_nb_config = CONFIG_NB_VALUE;
95 module_param(rtw_nb_config, int, 0644);
96 MODULE_PARM_DESC(rtw_nb_config, "5M/10M/Normal bandwidth configuration");
97 #endif
98 
99 module_param(rtw_ips_mode, int, 0644);
100 MODULE_PARM_DESC(rtw_ips_mode, "The default IPS mode");
101 
102 module_param(rtw_lps_level, int, 0644);
103 MODULE_PARM_DESC(rtw_lps_level, "The default LPS level");
104 
105 #ifdef CONFIG_LPS_1T1R
106 int rtw_lps_1t1r = RTW_LPS_1T1R;
107 module_param(rtw_lps_1t1r, int, 0644);
108 MODULE_PARM_DESC(rtw_lps_1t1r, "The default LPS 1T1R setting");
109 #endif
110 
111 module_param(rtw_lps_chk_by_tp, int, 0644);
112 
113 #ifdef CONFIG_WOWLAN
114 module_param(rtw_wow_power_mgnt, int, 0644);
115 MODULE_PARM_DESC(rtw_wow_power_mgnt, "The default WOW LPS mode");
116 module_param(rtw_wow_lps_level, int, 0644);
117 MODULE_PARM_DESC(rtw_wow_lps_level, "The default WOW LPS level");
118 #ifdef CONFIG_LPS_1T1R
119 int rtw_wow_lps_1t1r = RTW_WOW_LPS_1T1R;
120 module_param(rtw_wow_lps_1t1r, int, 0644);
121 MODULE_PARM_DESC(rtw_wow_lps_1t1r, "The default WOW LPS 1T1R setting");
122 #endif
123 #endif /* CONFIG_WOWLAN */
124 
125 /* LPS:
126  * rtw_smart_ps = 0 => TX: pwr bit = 1, RX: PS_Poll
127  * rtw_smart_ps = 1 => TX: pwr bit = 0, RX: PS_Poll
128  * rtw_smart_ps = 2 => TX: pwr bit = 0, RX: NullData with pwr bit = 0
129 */
130 int rtw_smart_ps = 2;
131 
132 int rtw_max_bss_cnt = 0;
133 module_param(rtw_max_bss_cnt, int, 0644);
134 #ifdef CONFIG_WMMPS_STA
135 /* WMMPS:
136  * rtw_smart_ps = 0 => Only for fw test
137  * rtw_smart_ps = 1 => Refer to Beacon's TIM Bitmap
138  * rtw_smart_ps = 2 => Don't refer to Beacon's TIM Bitmap
139 */
140 int rtw_wmm_smart_ps = 2;
141 #endif /* CONFIG_WMMPS_STA */
142 
143 int rtw_check_fw_ps = 1;
144 
145 #ifdef CONFIG_TX_EARLY_MODE
146 int rtw_early_mode = 1;
147 #endif
148 
149 int rtw_usb_rxagg_mode = 2;/* RX_AGG_DMA=1, RX_AGG_USB=2 */
150 module_param(rtw_usb_rxagg_mode, int, 0644);
151 
152 int rtw_dynamic_agg_enable = 1;
153 module_param(rtw_dynamic_agg_enable, int, 0644);
154 
155 /* set log level when inserting driver module, default log level is _DRV_INFO_ = 4,
156 * please refer to "How_to_set_driver_debug_log_level.doc" to set the available level.
157 */
158 #ifdef CONFIG_RTW_DEBUG
159 #ifdef RTW_LOG_LEVEL
160 	uint rtw_drv_log_level = (uint)RTW_LOG_LEVEL; /* from Makefile */
161 #else
162 	uint rtw_drv_log_level = _DRV_INFO_;
163 #endif
164 module_param(rtw_drv_log_level, uint, 0644);
165 MODULE_PARM_DESC(rtw_drv_log_level, "set log level when insert driver module, default log level is _DRV_INFO_ = 4");
166 #endif
167 int rtw_radio_enable = 1;
168 int rtw_long_retry_lmt = 7;
169 int rtw_short_retry_lmt = 7;
170 int rtw_busy_thresh = 40;
171 /* int qos_enable = 0; */ /* * */
172 int rtw_ack_policy = NORMAL_ACK;
173 
174 int rtw_mp_mode = 0;
175 
176 #if defined(CONFIG_MP_INCLUDED) && defined(CONFIG_RTW_CUSTOMER_STR)
177 uint rtw_mp_customer_str = 0;
178 module_param(rtw_mp_customer_str, uint, 0644);
179 MODULE_PARM_DESC(rtw_mp_customer_str, "Whether or not to enable customer str support on MP mode");
180 #endif
181 
182 int rtw_software_encrypt = 0;
183 int rtw_software_decrypt = 0;
184 
185 int rtw_acm_method = 0;/* 0:By SW 1:By HW. */
186 
187 int rtw_wmm_enable = 1;/* default is set to enable the wmm. */
188 
189 #ifdef CONFIG_WMMPS_STA
190 /* uapsd (unscheduled automatic power-save delivery) = a kind of wmmps */
191 /* 0: NO_LIMIT, 1: TWO_MSDU, 2: FOUR_MSDU, 3: SIX_MSDU */
192 int rtw_uapsd_max_sp = NO_LIMIT;
193 /* BIT0: AC_VO UAPSD, BIT1: AC_VI UAPSD, BIT2: AC_BK UAPSD, BIT3: AC_BE UAPSD */
194 int rtw_uapsd_ac_enable = 0x0;
195 #endif /* CONFIG_WMMPS_STA */
196 
197 #if defined(CONFIG_RTL8814A)
198 	int rtw_pwrtrim_enable = 2; /* disable kfree , rename to power trim disable */
199 #elif defined(CONFIG_RTL8821C) || defined(CONFIG_RTL8822B) || defined(CONFIG_RTL8822C) \
200 		|| defined(CONFIG_RTL8723F)
201 	/*PHYDM API, must enable by default*/
202 	int rtw_pwrtrim_enable = 1;
203 #else
204 	int rtw_pwrtrim_enable = 0; /* Default Enalbe  power trim by efuse config */
205 #endif
206 
207 #if CONFIG_TX_AC_LIFETIME
208 uint rtw_tx_aclt_flags = CONFIG_TX_ACLT_FLAGS;
209 module_param(rtw_tx_aclt_flags, uint, 0644);
210 MODULE_PARM_DESC(rtw_tx_aclt_flags, "device TX AC queue packet lifetime control flags");
211 
212 static uint rtw_tx_aclt_conf_default[3] = CONFIG_TX_ACLT_CONF_DEFAULT;
213 static uint rtw_tx_aclt_conf_default_num = 0;
214 module_param_array(rtw_tx_aclt_conf_default, uint, &rtw_tx_aclt_conf_default_num, 0644);
215 MODULE_PARM_DESC(rtw_tx_aclt_conf_default, "device TX AC queue lifetime config for default status");
216 
217 #ifdef CONFIG_AP_MODE
218 #if CONFIG_RTW_AP_DATA_BMC_TO_UC
219 static uint rtw_tx_aclt_conf_ap_m2u[3] = CONFIG_TX_ACLT_CONF_AP_M2U;
220 static uint rtw_tx_aclt_conf_ap_m2u_num = 0;
221 module_param_array(rtw_tx_aclt_conf_ap_m2u, uint, &rtw_tx_aclt_conf_ap_m2u_num, 0644);
222 MODULE_PARM_DESC(rtw_tx_aclt_conf_ap_m2u, "device TX AC queue lifetime config for AP mode M2U status");
223 #endif
224 #endif /* CONFIG_AP_MODE */
225 
226 #ifdef CONFIG_RTW_MESH
227 static uint rtw_tx_aclt_conf_mesh[3] = CONFIG_TX_ACLT_CONF_MESH;
228 static uint rtw_tx_aclt_conf_mesh_num = 0;
229 module_param_array(rtw_tx_aclt_conf_mesh, uint, &rtw_tx_aclt_conf_mesh_num, 0644);
230 MODULE_PARM_DESC(rtw_tx_aclt_conf_mesh, "device TX AC queue lifetime config for MESH status");
231 #endif
232 #endif /* CONFIG_TX_AC_LIFETIME */
233 
234 uint rtw_tx_bw_mode = 0x21;
235 module_param(rtw_tx_bw_mode, uint, 0644);
236 MODULE_PARM_DESC(rtw_tx_bw_mode, "The max tx bw for 2.4G and 5G. format is the same as rtw_bw_mode");
237 
238 #ifdef CONFIG_FW_HANDLE_TXBCN
239 uint rtw_tbtt_rpt = 0;	/*ROOT AP - BIT0, VAP1 - BIT1, VAP2 - BIT2, VAP3 - VAP3, FW report TBTT INT by C2H*/
240 module_param(rtw_tbtt_rpt, uint, 0644);
241 #endif
242 
243 #ifdef CONFIG_80211N_HT
244 int rtw_ht_enable = 1;
245 /* 0: 20 MHz, 1: 40 MHz, 2: 80 MHz, 3: 160MHz, 4: 80+80MHz
246 * 2.4G use bit 0 ~ 3, 5G use bit 4 ~ 7
247 * 0x21 means enable 2.4G 40MHz & 5G 80MHz */
248 #ifdef CONFIG_RTW_CUSTOMIZE_BWMODE
249 int rtw_bw_mode = CONFIG_RTW_CUSTOMIZE_BWMODE;
250 #else
251 int rtw_bw_mode = 0x21;
252 #endif
253 int rtw_ampdu_enable = 1;/* for enable tx_ampdu , */ /* 0: disable, 0x1:enable */
254 int rtw_rx_stbc = 1;/* 0: disable, bit(0):enable 2.4g, bit(1):enable 5g, default is set to enable 2.4GHZ for IOT issue with bufflao's AP at 5GHZ */
255 #if (defined(CONFIG_RTL8814A) || defined(CONFIG_RTL8814B) || defined(CONFIG_RTL8822B) || defined(CONFIG_RTL8822C)) && defined(CONFIG_PCI_HCI)
256 int rtw_rx_ampdu_amsdu = 2;/* 0: disabled, 1:enabled, 2:auto . There is an IOT issu with DLINK DIR-629 when the flag turn on */
257 #elif ((defined(CONFIG_RTL8822B) || defined(CONFIG_RTL8822C)) && defined(CONFIG_SDIO_HCI))
258 int rtw_rx_ampdu_amsdu = 1;
259 #else
260 int rtw_rx_ampdu_amsdu;/* 0: disabled, 1:enabled, 2:auto . There is an IOT issu with DLINK DIR-629 when the flag turn on */
261 #endif
262 /*
263 * 2: Follow the AMSDU filed in ADDBA Resp. (Deault)
264 * 0: Force the AMSDU filed in ADDBA Resp. to be disabled.
265 * 1: Force the AMSDU filed in ADDBA Resp. to be enabled.
266 */
267 int rtw_tx_ampdu_amsdu = 2;
268 
269 int rtw_quick_addba_req = 0;
270 
271 static uint rtw_rx_ampdu_sz_limit_1ss[4] = CONFIG_RTW_RX_AMPDU_SZ_LIMIT_1SS;
272 static uint rtw_rx_ampdu_sz_limit_1ss_num = 0;
273 module_param_array(rtw_rx_ampdu_sz_limit_1ss, uint, &rtw_rx_ampdu_sz_limit_1ss_num, 0644);
274 MODULE_PARM_DESC(rtw_rx_ampdu_sz_limit_1ss, "RX AMPDU size limit for 1SS link of each BW, 0xFF: no limitation");
275 
276 static uint rtw_rx_ampdu_sz_limit_2ss[4] = CONFIG_RTW_RX_AMPDU_SZ_LIMIT_2SS;
277 static uint rtw_rx_ampdu_sz_limit_2ss_num = 0;
278 module_param_array(rtw_rx_ampdu_sz_limit_2ss, uint, &rtw_rx_ampdu_sz_limit_2ss_num, 0644);
279 MODULE_PARM_DESC(rtw_rx_ampdu_sz_limit_2ss, "RX AMPDU size limit for 2SS link of each BW, 0xFF: no limitation");
280 
281 static uint rtw_rx_ampdu_sz_limit_3ss[4] = CONFIG_RTW_RX_AMPDU_SZ_LIMIT_3SS;
282 static uint rtw_rx_ampdu_sz_limit_3ss_num = 0;
283 module_param_array(rtw_rx_ampdu_sz_limit_3ss, uint, &rtw_rx_ampdu_sz_limit_3ss_num, 0644);
284 MODULE_PARM_DESC(rtw_rx_ampdu_sz_limit_3ss, "RX AMPDU size limit for 3SS link of each BW, 0xFF: no limitation");
285 
286 static uint rtw_rx_ampdu_sz_limit_4ss[4] = CONFIG_RTW_RX_AMPDU_SZ_LIMIT_4SS;
287 static uint rtw_rx_ampdu_sz_limit_4ss_num = 0;
288 module_param_array(rtw_rx_ampdu_sz_limit_4ss, uint, &rtw_rx_ampdu_sz_limit_4ss_num, 0644);
289 MODULE_PARM_DESC(rtw_rx_ampdu_sz_limit_4ss, "RX AMPDU size limit for 4SS link of each BW, 0xFF: no limitation");
290 
291 /* Short GI support Bit Map
292 * BIT0 - 20MHz, 0: non-support, 1: support
293 * BIT1 - 40MHz, 0: non-support, 1: support
294 * BIT2 - 80MHz, 0: non-support, 1: support
295 * BIT3 - 160MHz, 0: non-support, 1: support */
296 int rtw_short_gi = 0xf;
297 /* BIT0: Enable VHT LDPC Rx, BIT1: Enable VHT LDPC Tx, BIT4: Enable HT LDPC Rx, BIT5: Enable HT LDPC Tx */
298 int rtw_ldpc_cap = 0x33;
299 /* BIT0: Enable VHT STBC Rx, BIT1: Enable VHT STBC Tx, BIT4: Enable HT STBC Rx, BIT5: Enable HT STBC Tx */
300 #ifdef CONFIG_RTL8192F
301 int rtw_stbc_cap = 0x30;
302 #else
303 int rtw_stbc_cap = 0x13;
304 #endif
305 module_param(rtw_stbc_cap, int, 0644);
306 /*
307 * BIT0: Enable VHT SU Beamformer
308 * BIT1: Enable VHT SU Beamformee
309 * BIT2: Enable VHT MU Beamformer, depend on VHT SU Beamformer
310 * BIT3: Enable VHT MU Beamformee, depend on VHT SU Beamformee
311 * BIT4: Enable HT Beamformer
312 * BIT5: Enable HT Beamformee
313 */
314 int rtw_beamform_cap = BIT(1) | BIT(3);
315 int rtw_bfer_rf_number = 0; /*BeamformerCapRfNum Rf path number, 0 for auto, others for manual*/
316 int rtw_bfee_rf_number = 0; /*BeamformeeCapRfNum  Rf path number, 0 for auto, others for manual*/
317 
318 #endif /* CONFIG_80211N_HT */
319 
320 #ifdef CONFIG_80211AC_VHT
321 int rtw_vht_enable = 1; /* 0:disable, 1:enable, 2:force auto enable */
322 module_param(rtw_vht_enable, int, 0644);
323 
324 int rtw_vht_24g_enable = 1; /* 0:disable, 1:enable */
325 module_param(rtw_vht_24g_enable, int, 0644);
326 
327 int rtw_ampdu_factor = 7;
328 
329 uint rtw_vht_rx_mcs_map = 0xaaaa;
330 module_param(rtw_vht_rx_mcs_map, uint, 0644);
331 MODULE_PARM_DESC(rtw_vht_rx_mcs_map, "VHT RX MCS map");
332 #endif /* CONFIG_80211AC_VHT */
333 
334 
335 /* 0: not check in watch dog, 1: check in watch dog  */
336 int rtw_check_hw_status = 0;
337 
338 int rtw_low_power = 0;
339 int rtw_wifi_spec = 0;
340 
341 
342 int rtw_trx_path_bmp = 0x00;
343 module_param(rtw_trx_path_bmp, int, 0644); /* [7:4]TX path bmp, [0:3]RX path bmp, 0: not specified */
344 
345 #ifdef CONFIG_SPECIAL_RF_PATH /* configure Nss/xTxR IC to 1ss/1T1R */
346 int rtw_tx_path_lmt = 1;
347 int rtw_rx_path_lmt = 1;
348 int rtw_tx_nss = 1;
349 int rtw_rx_nss = 1;
350 #elif defined(CONFIG_CUSTOMER01_SMART_ANTENNA)
351 int rtw_tx_path_lmt = 2;
352 int rtw_rx_path_lmt = 2;
353 int rtw_tx_nss = 1;
354 int rtw_rx_nss = 1;
355 #else
356 int rtw_tx_path_lmt = 0;
357 int rtw_rx_path_lmt = 0;
358 int rtw_tx_nss = 0;
359 int rtw_rx_nss = 0;
360 #endif
361 module_param(rtw_tx_path_lmt, int, 0644); /* limit of TX path number, 0: not specified */
362 module_param(rtw_rx_path_lmt, int, 0644); /* limit of RX path number, 0: not specified */
363 module_param(rtw_tx_nss, int, 0644);
364 module_param(rtw_rx_nss, int, 0644);
365 
366 #ifdef CONFIG_ACTIVE_TPC_REPORT
367 int rtw_active_tpc_report = CONFIG_RTW_ACTIVE_TPC_REPORT;
368 module_param(rtw_active_tpc_report, int, 0644);
369 MODULE_PARM_DESC(rtw_active_tpc_report, "Active TPC report, 0:incapable, 1:capable, 2:auto enable");
370 #endif
371 
372 #ifdef CONFIG_REGD_SRC_FROM_OS
373 static uint rtw_regd_src = CONFIG_RTW_REGD_SRC;
374 module_param(rtw_regd_src, uint, 0644);
375 MODULE_PARM_DESC(rtw_regd_src, "The default regd source selection, 0:Realtek defined, 1: OS");
376 #endif
377 
378 char rtw_country_unspecified[] = {0xFF, 0xFF, 0x00};
379 char *rtw_country_code = rtw_country_unspecified;
380 module_param(rtw_country_code, charp, 0644);
381 MODULE_PARM_DESC(rtw_country_code, "The default country code (in alpha2)");
382 
383 uint rtw_channel_plan = CONFIG_RTW_CHPLAN;
384 module_param(rtw_channel_plan, uint, 0644);
385 MODULE_PARM_DESC(rtw_channel_plan, "The default chplan ID when rtw_alpha2 is not specified or valid");
386 
387 static uint rtw_excl_chs[MAX_CHANNEL_NUM_2G_5G] = CONFIG_RTW_EXCL_CHS;
388 static int rtw_excl_chs_num = 0;
389 module_param_array(rtw_excl_chs, uint, &rtw_excl_chs_num, 0644);
390 MODULE_PARM_DESC(rtw_excl_chs, "exclusive channel array");
391 
392 #if CONFIG_IEEE80211_BAND_6GHZ
393 uint rtw_channel_plan_6g = CONFIG_RTW_CHPLAN_6G;
394 module_param(rtw_channel_plan_6g, uint, 0644);
395 MODULE_PARM_DESC(rtw_channel_plan_6g, "The default chplan_6g ID when rtw_alpha2 is not specified or valid");
396 
397 static uint rtw_excl_chs_6g[MAX_CHANNEL_NUM_6G] = CONFIG_RTW_EXCL_CHS_6G;
398 static int rtw_excl_chs_6g_num = 0;
399 module_param_array(rtw_excl_chs_6g, uint, &rtw_excl_chs_6g_num, 0644);
400 MODULE_PARM_DESC(rtw_excl_chs_6g, "exclusive channel array");
401 #endif /* CONFIG_IEEE80211_BAND_6GHZ */
402 
403 #ifdef CONFIG_80211D
404 static uint rtw_country_ie_slave_en_role = CONFIG_RTW_COUNTRY_IE_SLAVE_EN_ROLE;
405 module_param(rtw_country_ie_slave_en_role, uint, 0644);
406 MODULE_PARM_DESC(rtw_country_ie_slave_en_role, "802.11d country IE slave enable role: BIT0:pure STA mode, BIT1:P2P group client");
407 
408 static uint rtw_country_ie_slave_en_ifbmp = CONFIG_RTW_COUNTRY_IE_SLAVE_EN_IFBMP;
409 module_param(rtw_country_ie_slave_en_ifbmp, uint, 0644);
410 MODULE_PARM_DESC(rtw_country_ie_slave_en_ifbmp, "802.11d country IE slave enable iface bitmap");
411 #endif
412 
413 /*if concurrent softap + p2p(GO) is needed, this param lets p2p response full channel list.
414 But Softap must be SHUT DOWN once P2P decide to set up connection and become a GO.*/
415 #ifdef CONFIG_FULL_CH_IN_P2P_HANDSHAKE
416 	int rtw_full_ch_in_p2p_handshake = 1; /* reply full channel list*/
417 #else
418 	int rtw_full_ch_in_p2p_handshake = 0; /* reply only softap channel*/
419 #endif
420 
421 #ifdef CONFIG_BT_COEXIST
422 int rtw_btcoex_enable = 2;
423 module_param(rtw_btcoex_enable, int, 0644);
424 MODULE_PARM_DESC(rtw_btcoex_enable, "BT co-existence on/off, 0:off, 1:on, 2:by efuse");
425 
426 int rtw_ant_num = 0;
427 module_param(rtw_ant_num, int, 0644);
428 MODULE_PARM_DESC(rtw_ant_num, "Antenna number setting, 0:by efuse");
429 
430 int rtw_bt_iso = 2;/* 0:Low, 1:High, 2:From Efuse */
431 int rtw_bt_sco = 3;/* 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter, 4.Busy, 5.OtherBusy */
432 int rtw_bt_ampdu = 1 ; /* 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. */
433 #endif /* CONFIG_BT_COEXIST */
434 
435 int rtw_AcceptAddbaReq = _TRUE;/* 0:Reject AP's Add BA req, 1:Accept AP's Add BA req. */
436 
437 int rtw_antdiv_cfg = 2; /* 0:OFF , 1:ON, 2:decide by Efuse config */
438 int rtw_antdiv_type = 0
439 	; /* 0:decide by efuse  1: for 88EE, 1Tx and 1RxCG are diversity.(2 Ant with SPDT), 2:  for 88EE, 1Tx and 2Rx are diversity.( 2 Ant, Tx and RxCG are both on aux port, RxCS is on main port ), 3: for 88EE, 1Tx and 1RxCG are fixed.(1Ant, Tx and RxCG are both on aux port) */
440 
441 int rtw_drv_ant_band_switch = 1; /* 0:OFF , 1:ON, Driver control antenna band switch*/
442 
443 int rtw_single_ant_path; /*0:main ant , 1:aux ant , Fixed single antenna path, default main ant*/
444 
445 /* 0: doesn't switch, 1: switch from usb2.0 to usb 3.0 2: switch from usb3.0 to usb 2.0 */
446 int rtw_switch_usb_mode = 0;
447 
448 #ifdef CONFIG_USB_AUTOSUSPEND
449 int rtw_enusbss = 1;/* 0:disable,1:enable */
450 #else
451 int rtw_enusbss = 0;/* 0:disable,1:enable */
452 #endif
453 
454 int rtw_hwpdn_mode = 2; /* 0:disable,1:enable,2: by EFUSE config */
455 
456 #ifdef CONFIG_HW_PWRP_DETECTION
457 int rtw_hwpwrp_detect = 1;
458 #else
459 int rtw_hwpwrp_detect = 0; /* HW power  ping detect 0:disable , 1:enable */
460 #endif
461 
462 #ifdef CONFIG_USB_HCI
463 int rtw_hw_wps_pbc = 1;
464 #else
465 int rtw_hw_wps_pbc = 0;
466 #endif
467 
468 #ifdef CONFIG_PCI_ASPM
469 /* CLK_REQ:BIT0 L0s:BIT1 ASPM_L1:BIT2 L1Off:BIT3*/
470 int	rtw_pci_aspm_enable = 0x5;
471 #else
472 int	rtw_pci_aspm_enable;
473 #endif
474 
475 /*
476  * BIT [15:12] mask of ps mode
477  * BIT [11:8] val of ps mode
478  * BIT [7:4] mask of perf mode
479  * BIT [3:0] val of perf mode
480  *
481  * L0s:BIT[+0] L1:BIT[+1]
482  *
483  * 0x0030: change value only if perf mode
484  * 0x3300: change value only if ps mode
485  * 0x3330: change value in both perf and ps mode
486  */
487 #ifdef CONFIG_PCI_DYNAMIC_ASPM
488 #ifdef CONFIG_PCI_ASPM
489 int rtw_pci_dynamic_aspm_linkctrl = 0x3330;
490 #else
491 int rtw_pci_dynamic_aspm_linkctrl = 0x0030;
492 #endif
493 #else
494 int rtw_pci_dynamic_aspm_linkctrl = 0x0000;
495 #endif
496 module_param(rtw_pci_dynamic_aspm_linkctrl, int, 0644);
497 
498 #ifdef CONFIG_QOS_OPTIMIZATION
499 int rtw_qos_opt_enable = 1; /* 0: disable,1:enable */
500 #else
501 int rtw_qos_opt_enable = 0; /* 0: disable,1:enable */
502 #endif
503 module_param(rtw_qos_opt_enable, int, 0644);
504 
505 #ifdef CONFIG_RTW_ACS
506 int rtw_acs_auto_scan = 0; /*0:disable, 1:enable*/
507 module_param(rtw_acs_auto_scan, int, 0644);
508 
509 int rtw_acs = 1;
510 module_param(rtw_acs, int, 0644);
511 #endif
512 
513 #ifdef CONFIG_BACKGROUND_NOISE_MONITOR
514 int rtw_nm = 1;/*noise monitor*/
515 module_param(rtw_nm, int, 0644);
516 #endif
517 
518 char *ifname = "wlan%d";
519 module_param(ifname, charp, 0644);
520 MODULE_PARM_DESC(ifname, "The default name to allocate for first interface");
521 
522 char *if2name = "p2p%d";
523 module_param(if2name, charp, 0644);
524 MODULE_PARM_DESC(if2name, "The default name to allocate for second interface");
525 
526 #if defined(CONFIG_PLATFORM_ANDROID) && (CONFIG_IFACE_NUMBER > 2)
527 char *if3name = "ap%d";
528 module_param(if3name, charp, 0644);
529 MODULE_PARM_DESC(if3name, "The default name to allocate for third interface");
530 #endif
531 
532 char *rtw_initmac = 0;  /* temp mac address if users want to use instead of the mac address in Efuse */
533 
534 #ifdef CONFIG_CONCURRENT_MODE
535 
536 	#if (CONFIG_IFACE_NUMBER > 2)
537 		int rtw_virtual_iface_num = CONFIG_IFACE_NUMBER - 1;
538 		module_param(rtw_virtual_iface_num, int, 0644);
539 	#else
540 		int rtw_virtual_iface_num = 1;
541 	#endif
542 
543 #ifdef CONFIG_P2P
544 
545 	#ifdef CONFIG_SEL_P2P_IFACE
546 	int rtw_sel_p2p_iface = CONFIG_SEL_P2P_IFACE;
547 	#else
548 	int rtw_sel_p2p_iface = IFACE_ID1;
549 	#endif
550 
551 	module_param(rtw_sel_p2p_iface, int, 0644);
552 
553 #endif
554 
555 #endif
556 
557 #ifdef CONFIG_AP_MODE
558 u8 rtw_bmc_tx_rate = MGN_UNKNOWN;
559 
560 #if CONFIG_RTW_AP_DATA_BMC_TO_UC
561 int rtw_ap_src_b2u_flags = CONFIG_RTW_AP_SRC_B2U_FLAGS;
562 module_param(rtw_ap_src_b2u_flags, int, 0644);
563 
564 int rtw_ap_fwd_b2u_flags = CONFIG_RTW_AP_FWD_B2U_FLAGS;
565 module_param(rtw_ap_fwd_b2u_flags, int, 0644);
566 #endif /* CONFIG_RTW_AP_DATA_BMC_TO_UC */
567 #endif /* CONFIG_AP_MODE */
568 
569 #ifdef CONFIG_RTW_MESH
570 #if CONFIG_RTW_MESH_DATA_BMC_TO_UC
571 int rtw_msrc_b2u_flags = CONFIG_RTW_MSRC_B2U_FLAGS;
572 module_param(rtw_msrc_b2u_flags, int, 0644);
573 
574 int rtw_mfwd_b2u_flags = CONFIG_RTW_MFWD_B2U_FLAGS;
575 module_param(rtw_mfwd_b2u_flags, int, 0644);
576 #endif /* CONFIG_RTW_MESH_DATA_BMC_TO_UC */
577 #endif /* CONFIG_RTW_MESH */
578 
579 #ifdef RTW_WOW_STA_MIX
580 int rtw_wowlan_sta_mix_mode = 1;
581 #else
582 int rtw_wowlan_sta_mix_mode = 0;
583 #endif
584 module_param(rtw_wowlan_sta_mix_mode, int, 0644);
585 module_param(rtw_pwrtrim_enable, int, 0644);
586 module_param(rtw_initmac, charp, 0644);
587 module_param(rtw_chip_version, int, 0644);
588 module_param(rtw_rfintfs, int, 0644);
589 module_param(rtw_lbkmode, int, 0644);
590 module_param(rtw_network_mode, int, 0644);
591 module_param(rtw_channel, int, 0644);
592 module_param(rtw_mp_mode, int, 0644);
593 module_param(rtw_wmm_enable, int, 0644);
594 #ifdef CONFIG_WMMPS_STA
595 module_param(rtw_uapsd_max_sp, int, 0644);
596 module_param(rtw_uapsd_ac_enable, int, 0644);
597 module_param(rtw_wmm_smart_ps, int, 0644);
598 #endif /* CONFIG_WMMPS_STA */
599 module_param(rtw_vrtl_carrier_sense, int, 0644);
600 module_param(rtw_vcs_type, int, 0644);
601 module_param(rtw_busy_thresh, int, 0644);
602 
603 #ifdef CONFIG_80211N_HT
604 module_param(rtw_ht_enable, int, 0644);
605 module_param(rtw_bw_mode, int, 0644);
606 module_param(rtw_ampdu_enable, int, 0644);
607 module_param(rtw_rx_stbc, int, 0644);
608 module_param(rtw_rx_ampdu_amsdu, int, 0644);
609 module_param(rtw_tx_ampdu_amsdu, int, 0644);
610 module_param(rtw_quick_addba_req, int, 0644);
611 #endif /* CONFIG_80211N_HT */
612 
613 #ifdef CONFIG_BEAMFORMING
614 module_param(rtw_beamform_cap, int, 0644);
615 #endif
616 
617 module_param(rtw_power_mgnt, int, 0644);
618 module_param(rtw_smart_ps, int, 0644);
619 module_param(rtw_low_power, int, 0644);
620 module_param(rtw_wifi_spec, int, 0644);
621 
622 module_param(rtw_full_ch_in_p2p_handshake, int, 0644);
623 module_param(rtw_antdiv_cfg, int, 0644);
624 module_param(rtw_antdiv_type, int, 0644);
625 
626 module_param(rtw_drv_ant_band_switch, int, 0644);
627 module_param(rtw_single_ant_path, int, 0644);
628 
629 module_param(rtw_switch_usb_mode, int, 0644);
630 
631 module_param(rtw_enusbss, int, 0644);
632 module_param(rtw_hwpdn_mode, int, 0644);
633 module_param(rtw_hwpwrp_detect, int, 0644);
634 
635 module_param(rtw_hw_wps_pbc, int, 0644);
636 module_param(rtw_check_hw_status, int, 0644);
637 
638 #ifdef CONFIG_PCI_HCI
639 module_param(rtw_pci_aspm_enable, int, 0644);
640 #endif
641 
642 #ifdef CONFIG_TX_EARLY_MODE
643 module_param(rtw_early_mode, int, 0644);
644 #endif
645 #ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE
646 char *rtw_adaptor_info_caching_file_path = "/data/misc/wifi/rtw_cache";
647 module_param(rtw_adaptor_info_caching_file_path, charp, 0644);
648 MODULE_PARM_DESC(rtw_adaptor_info_caching_file_path, "The path of adapter info cache file");
649 #endif /* CONFIG_ADAPTOR_INFO_CACHING_FILE */
650 
651 #ifdef CONFIG_LAYER2_ROAMING
652 uint rtw_max_roaming_times = 2;
653 module_param(rtw_max_roaming_times, uint, 0644);
654 MODULE_PARM_DESC(rtw_max_roaming_times, "The max roaming times to try");
655 #endif /* CONFIG_LAYER2_ROAMING */
656 
657 #ifdef CONFIG_IOL
658 int rtw_fw_iol = 1;
659 module_param(rtw_fw_iol, int, 0644);
660 MODULE_PARM_DESC(rtw_fw_iol, "FW IOL. 0:Disable, 1:enable, 2:by usb speed");
661 #endif /* CONFIG_IOL */
662 
663 #ifdef CONFIG_FILE_FWIMG
664 char *rtw_fw_file_path = "/system/etc/firmware/rtlwifi/FW_NIC.BIN";
665 module_param(rtw_fw_file_path, charp, 0644);
666 MODULE_PARM_DESC(rtw_fw_file_path, "The path of fw image");
667 
668 char *rtw_fw_wow_file_path = "/system/etc/firmware/rtlwifi/FW_WoWLAN.BIN";
669 module_param(rtw_fw_wow_file_path, charp, 0644);
670 MODULE_PARM_DESC(rtw_fw_wow_file_path, "The path of fw for Wake on Wireless image");
671 
672 #ifdef CONFIG_MP_INCLUDED
673 char *rtw_fw_mp_bt_file_path = "";
674 module_param(rtw_fw_mp_bt_file_path, charp, 0644);
675 MODULE_PARM_DESC(rtw_fw_mp_bt_file_path, "The path of fw for MP-BT image");
676 #endif /* CONFIG_MP_INCLUDED */
677 #endif /* CONFIG_FILE_FWIMG */
678 
679 #ifdef CONFIG_ADVANCE_OTA
680 /*	BIT(0): OTA continuous rotated test within low RSSI,1R CCA in path B
681 	BIT(1) & BIT(2): OTA continuous rotated test with low high RSSI */
682 /* Experimental environment: shielding room with half of absorber and 2~3 rotation per minute */
683 int rtw_advnace_ota;
684 module_param(rtw_advnace_ota, int, 0644);
685 #endif
686 
687 uint rtw_notch_filter = RTW_NOTCH_FILTER;
688 module_param(rtw_notch_filter, uint, 0644);
689 MODULE_PARM_DESC(rtw_notch_filter, "0:Disable, 1:Enable, 2:Enable only for P2P");
690 
691 uint rtw_hiq_filter = CONFIG_RTW_HIQ_FILTER;
692 module_param(rtw_hiq_filter, uint, 0644);
693 MODULE_PARM_DESC(rtw_hiq_filter, "0:allow all, 1:allow special, 2:deny all");
694 
695 uint rtw_adaptivity_en = CONFIG_RTW_ADAPTIVITY_EN;
696 module_param(rtw_adaptivity_en, uint, 0644);
697 MODULE_PARM_DESC(rtw_adaptivity_en, "0:disable, 1:enable, 2:auto");
698 
699 uint rtw_adaptivity_mode = CONFIG_RTW_ADAPTIVITY_MODE;
700 module_param(rtw_adaptivity_mode, uint, 0644);
701 MODULE_PARM_DESC(rtw_adaptivity_mode, "0:normal, 1:carrier sense");
702 
703 int rtw_adaptivity_th_l2h_ini = CONFIG_RTW_ADAPTIVITY_TH_L2H_INI;
704 module_param(rtw_adaptivity_th_l2h_ini, int, 0644);
705 MODULE_PARM_DESC(rtw_adaptivity_th_l2h_ini, "th_l2h_ini for Adaptivity");
706 
707 int rtw_adaptivity_th_edcca_hl_diff = CONFIG_RTW_ADAPTIVITY_TH_EDCCA_HL_DIFF;
708 module_param(rtw_adaptivity_th_edcca_hl_diff, int, 0644);
709 MODULE_PARM_DESC(rtw_adaptivity_th_edcca_hl_diff, "th_edcca_hl_diff for Adaptivity");
710 
711 #ifdef CONFIG_DFS_MASTER
712 uint rtw_dfs_region_domain = CONFIG_RTW_DFS_REGION_DOMAIN;
713 module_param(rtw_dfs_region_domain, uint, 0644);
714 MODULE_PARM_DESC(rtw_dfs_region_domain, "0:NONE, 1:FCC, 2:MKK, 3:ETSI");
715 #endif
716 
717 uint rtw_amsdu_mode = RTW_AMSDU_MODE_NON_SPP;
718 module_param(rtw_amsdu_mode, uint, 0644);
719 MODULE_PARM_DESC(rtw_amsdu_mode, "0:non-spp, 1:spp, 2:all drop");
720 
721 uint rtw_amplifier_type_2g = CONFIG_RTW_AMPLIFIER_TYPE_2G;
722 module_param(rtw_amplifier_type_2g, uint, 0644);
723 MODULE_PARM_DESC(rtw_amplifier_type_2g, "BIT3:2G ext-PA, BIT4:2G ext-LNA");
724 
725 uint rtw_amplifier_type_5g = CONFIG_RTW_AMPLIFIER_TYPE_5G;
726 module_param(rtw_amplifier_type_5g, uint, 0644);
727 MODULE_PARM_DESC(rtw_amplifier_type_5g, "BIT6:5G ext-PA, BIT7:5G ext-LNA");
728 
729 uint rtw_RFE_type = CONFIG_RTW_RFE_TYPE;
730 module_param(rtw_RFE_type, uint, 0644);
731 MODULE_PARM_DESC(rtw_RFE_type, "default init value:64");
732 
733 uint rtw_powertracking_type = 64;
734 module_param(rtw_powertracking_type, uint, 0644);
735 MODULE_PARM_DESC(rtw_powertracking_type, "default init value:64");
736 
737 uint rtw_GLNA_type = CONFIG_RTW_GLNA_TYPE;
738 module_param(rtw_GLNA_type, uint, 0644);
739 MODULE_PARM_DESC(rtw_GLNA_type, "default init value:0");
740 
741 uint rtw_TxBBSwing_2G = 0xFF;
742 module_param(rtw_TxBBSwing_2G, uint, 0644);
743 MODULE_PARM_DESC(rtw_TxBBSwing_2G, "default init value:0xFF");
744 
745 uint rtw_TxBBSwing_5G = 0xFF;
746 module_param(rtw_TxBBSwing_5G, uint, 0644);
747 MODULE_PARM_DESC(rtw_TxBBSwing_5G, "default init value:0xFF");
748 
749 uint rtw_OffEfuseMask = 0;
750 module_param(rtw_OffEfuseMask, uint, 0644);
751 MODULE_PARM_DESC(rtw_OffEfuseMask, "default open Efuse Mask value:0");
752 
753 uint rtw_FileMaskEfuse = 0;
754 module_param(rtw_FileMaskEfuse, uint, 0644);
755 MODULE_PARM_DESC(rtw_FileMaskEfuse, "default drv Mask Efuse value:0");
756 
757 uint rtw_rxgain_offset_2g = 0;
758 module_param(rtw_rxgain_offset_2g, uint, 0644);
759 MODULE_PARM_DESC(rtw_rxgain_offset_2g, "default RF Gain 2G Offset value:0");
760 
761 uint rtw_rxgain_offset_5gl = 0;
762 module_param(rtw_rxgain_offset_5gl, uint, 0644);
763 MODULE_PARM_DESC(rtw_rxgain_offset_5gl, "default RF Gain 5GL Offset value:0");
764 
765 uint rtw_rxgain_offset_5gm = 0;
766 module_param(rtw_rxgain_offset_5gm, uint, 0644);
767 MODULE_PARM_DESC(rtw_rxgain_offset_5gm, "default RF Gain 5GM Offset value:0");
768 
769 uint rtw_rxgain_offset_5gh = 0;
770 module_param(rtw_rxgain_offset_5gh, uint, 0644);
771 MODULE_PARM_DESC(rtw_rxgain_offset_5gm, "default RF Gain 5GL Offset value:0");
772 
773 uint rtw_pll_ref_clk_sel = CONFIG_RTW_PLL_REF_CLK_SEL;
774 module_param(rtw_pll_ref_clk_sel, uint, 0644);
775 MODULE_PARM_DESC(rtw_pll_ref_clk_sel, "force pll_ref_clk_sel, 0xF:use autoload value");
776 
777 int rtw_tx_pwr_by_rate = CONFIG_TXPWR_BY_RATE_EN;
778 module_param(rtw_tx_pwr_by_rate, int, 0644);
779 MODULE_PARM_DESC(rtw_tx_pwr_by_rate, "0:Disable, 1:Enable, 2: Depend on efuse");
780 
781 #if CONFIG_TXPWR_LIMIT
782 int rtw_tx_pwr_lmt_enable = CONFIG_TXPWR_LIMIT_EN;
783 module_param(rtw_tx_pwr_lmt_enable, int, 0644);
784 MODULE_PARM_DESC(rtw_tx_pwr_lmt_enable, "0:Disable, 1:Enable, 2: Depend on efuse");
785 #endif
786 
787 static int rtw_target_tx_pwr_2g_a[RATE_SECTION_NUM] = CONFIG_RTW_TARGET_TX_PWR_2G_A;
788 static int rtw_target_tx_pwr_2g_a_num = 0;
789 module_param_array(rtw_target_tx_pwr_2g_a, int, &rtw_target_tx_pwr_2g_a_num, 0644);
790 MODULE_PARM_DESC(rtw_target_tx_pwr_2g_a, "2.4G target tx power (unit:dBm) of RF path A for each rate section, should match the real calibrate power, -1: undefined");
791 
792 static int rtw_target_tx_pwr_2g_b[RATE_SECTION_NUM] = CONFIG_RTW_TARGET_TX_PWR_2G_B;
793 static int rtw_target_tx_pwr_2g_b_num = 0;
794 module_param_array(rtw_target_tx_pwr_2g_b, int, &rtw_target_tx_pwr_2g_b_num, 0644);
795 MODULE_PARM_DESC(rtw_target_tx_pwr_2g_b, "2.4G target tx power (unit:dBm) of RF path B for each rate section, should match the real calibrate power, -1: undefined");
796 
797 static int rtw_target_tx_pwr_2g_c[RATE_SECTION_NUM] = CONFIG_RTW_TARGET_TX_PWR_2G_C;
798 static int rtw_target_tx_pwr_2g_c_num = 0;
799 module_param_array(rtw_target_tx_pwr_2g_c, int, &rtw_target_tx_pwr_2g_c_num, 0644);
800 MODULE_PARM_DESC(rtw_target_tx_pwr_2g_c, "2.4G target tx power (unit:dBm) of RF path C for each rate section, should match the real calibrate power, -1: undefined");
801 
802 static int rtw_target_tx_pwr_2g_d[RATE_SECTION_NUM] = CONFIG_RTW_TARGET_TX_PWR_2G_D;
803 static int rtw_target_tx_pwr_2g_d_num = 0;
804 module_param_array(rtw_target_tx_pwr_2g_d, int, &rtw_target_tx_pwr_2g_d_num, 0644);
805 MODULE_PARM_DESC(rtw_target_tx_pwr_2g_d, "2.4G target tx power (unit:dBm) of RF path D for each rate section, should match the real calibrate power, -1: undefined");
806 
807 #if CONFIG_IEEE80211_BAND_5GHZ
808 static int rtw_target_tx_pwr_5g_a[RATE_SECTION_NUM - 1] = CONFIG_RTW_TARGET_TX_PWR_5G_A;
809 static int rtw_target_tx_pwr_5g_a_num = 0;
810 module_param_array(rtw_target_tx_pwr_5g_a, int, &rtw_target_tx_pwr_5g_a_num, 0644);
811 MODULE_PARM_DESC(rtw_target_tx_pwr_5g_a, "5G target tx power (unit:dBm) of RF path A for each rate section, should match the real calibrate power, -1: undefined");
812 
813 static int rtw_target_tx_pwr_5g_b[RATE_SECTION_NUM - 1] = CONFIG_RTW_TARGET_TX_PWR_5G_B;
814 static int rtw_target_tx_pwr_5g_b_num = 0;
815 module_param_array(rtw_target_tx_pwr_5g_b, int, &rtw_target_tx_pwr_5g_b_num, 0644);
816 MODULE_PARM_DESC(rtw_target_tx_pwr_5g_b, "5G target tx power (unit:dBm) of RF path B for each rate section, should match the real calibrate power, -1: undefined");
817 
818 static int rtw_target_tx_pwr_5g_c[RATE_SECTION_NUM - 1] = CONFIG_RTW_TARGET_TX_PWR_5G_C;
819 static int rtw_target_tx_pwr_5g_c_num = 0;
820 module_param_array(rtw_target_tx_pwr_5g_c, int, &rtw_target_tx_pwr_5g_c_num, 0644);
821 MODULE_PARM_DESC(rtw_target_tx_pwr_5g_c, "5G target tx power (unit:dBm) of RF path C for each rate section, should match the real calibrate power, -1: undefined");
822 
823 static int rtw_target_tx_pwr_5g_d[RATE_SECTION_NUM - 1] = CONFIG_RTW_TARGET_TX_PWR_5G_D;
824 static int rtw_target_tx_pwr_5g_d_num = 0;
825 module_param_array(rtw_target_tx_pwr_5g_d, int, &rtw_target_tx_pwr_5g_d_num, 0644);
826 MODULE_PARM_DESC(rtw_target_tx_pwr_5g_d, "5G target tx power (unit:dBm) of RF path D for each rate section, should match the real calibrate power, -1: undefined");
827 #endif /* CONFIG_IEEE80211_BAND_5GHZ */
828 
829 int rtw_antenna_gain = CONFIG_RTW_ANTENNA_GAIN;
830 module_param(rtw_antenna_gain, int, 0644);
831 MODULE_PARM_DESC(rtw_antenna_gain, "Antenna gain in mBi. 0x7FFF: unspecifed");
832 
833 #ifdef CONFIG_RTW_TX_NPATH_EN
834 /*0:disable ,1: 2path*/
835 int rtw_tx_npath_enable = 1;
836 module_param(rtw_tx_npath_enable, int, 0644);
837 MODULE_PARM_DESC(rtw_tx_npath_enable, "0:Disable, 1:TX-2PATH");
838 #endif
839 
840 #ifdef CONFIG_RTW_PATH_DIV
841 /*0:disable ,1: path diversity*/
842 int rtw_path_div_enable = 1;
843 module_param(rtw_path_div_enable, int, 0644);
844 MODULE_PARM_DESC(rtw_path_div_enable, "0:Disable, 1:Enable path diversity");
845 #endif
846 
847 
848 int rtw_tsf_update_pause_factor = CONFIG_TSF_UPDATE_PAUSE_FACTOR;
849 module_param(rtw_tsf_update_pause_factor, int, 0644);
850 MODULE_PARM_DESC(rtw_tsf_update_pause_factor, "num of bcn intervals to stay TSF update pause status");
851 
852 int rtw_tsf_update_restore_factor = CONFIG_TSF_UPDATE_RESTORE_FACTOR;
853 module_param(rtw_tsf_update_restore_factor, int, 0644);
854 MODULE_PARM_DESC(rtw_tsf_update_restore_factor, "num of bcn intervals to stay TSF update restore status");
855 
856 
857 #ifdef CONFIG_RTW_NBI
858 static int rtw_nbi_en = 1;
859 #else
860 static int rtw_nbi_en = 0;
861 #endif
862 module_param(rtw_nbi_en, int, 0644);
863 MODULE_PARM_DESC(rtw_nbi_en, "0:Disable, 1:Enable Narrow Band Interference");
864 
865 #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
866 char *rtw_phy_file_path = REALTEK_CONFIG_PATH;
867 module_param(rtw_phy_file_path, charp, 0644);
868 MODULE_PARM_DESC(rtw_phy_file_path, "The path of phy parameter");
869 /* PHY FILE Bit Map
870 * BIT0 - MAC,				0: non-support, 1: support
871 * BIT1 - BB,					0: non-support, 1: support
872 * BIT2 - BB_PG,				0: non-support, 1: support
873 * BIT3 - BB_MP,				0: non-support, 1: support
874 * BIT4 - RF,					0: non-support, 1: support
875 * BIT5 - RF_TXPWR_TRACK,	0: non-support, 1: support
876 * BIT6 - RF_TXPWR_LMT,		0: non-support, 1: support */
877 int rtw_load_phy_file = (BIT2 | BIT6);
878 module_param(rtw_load_phy_file, int, 0644);
879 MODULE_PARM_DESC(rtw_load_phy_file, "PHY File Bit Map");
880 int rtw_decrypt_phy_file = 0;
881 module_param(rtw_decrypt_phy_file, int, 0644);
882 MODULE_PARM_DESC(rtw_decrypt_phy_file, "Enable Decrypt PHY File");
883 #endif
884 
885 uint rtw_recvbuf_nr = NR_RECVBUFF;
886 module_param(rtw_recvbuf_nr, int, 0644);
887 MODULE_PARM_DESC(rtw_recvbuf_nr, "Preallocated number of struct recv_buf");
888 
889 #ifdef CONFIG_SUPPORT_TRX_SHARED
890 #ifdef DFT_TRX_SHARE_MODE
891 int rtw_trx_share_mode = DFT_TRX_SHARE_MODE;
892 #else
893 int rtw_trx_share_mode = 0;
894 #endif
895 module_param(rtw_trx_share_mode, int, 0644);
896 MODULE_PARM_DESC(rtw_trx_share_mode, "TRx FIFO Shared");
897 #endif
898 
899 #ifdef CONFIG_DYNAMIC_SOML
900 uint rtw_dynamic_soml_en = 1;
901 module_param(rtw_dynamic_soml_en, int, 0644);
902 MODULE_PARM_DESC(rtw_dynamic_soml_en, "0: disable, 1: enable with default param, 2: enable with specified param.");
903 
904 uint rtw_dynamic_soml_train_num = 0;
905 module_param(rtw_dynamic_soml_train_num, int, 0644);
906 MODULE_PARM_DESC(rtw_dynamic_soml_train_num, "SOML training number");
907 
908 uint rtw_dynamic_soml_interval = 0;
909 module_param(rtw_dynamic_soml_interval, int, 0644);
910 MODULE_PARM_DESC(rtw_dynamic_soml_interval, "SOML training interval");
911 
912 uint rtw_dynamic_soml_period = 0;
913 module_param(rtw_dynamic_soml_period, int, 0644);
914 MODULE_PARM_DESC(rtw_dynamic_soml_period, "SOML training period");
915 
916 uint rtw_dynamic_soml_delay = 0;
917 module_param(rtw_dynamic_soml_delay, int, 0644);
918 MODULE_PARM_DESC(rtw_dynamic_soml_delay, "SOML training delay");
919 #endif
920 
921 uint rtw_phydm_ability = 0xffffffff;
922 module_param(rtw_phydm_ability, uint, 0644);
923 
924 uint rtw_halrf_ability = 0xffffffff;
925 module_param(rtw_halrf_ability, uint, 0644);
926 
927 #ifdef CONFIG_RTW_MESH
928 uint rtw_peer_alive_based_preq = 1;
929 module_param(rtw_peer_alive_based_preq, uint, 0644);
930 MODULE_PARM_DESC(rtw_peer_alive_based_preq,
931 	"On demand PREQ will reference peer alive status. 0: Off, 1: On");
932 #endif
933 
934 int _netdev_open(struct net_device *pnetdev);
935 int netdev_open(struct net_device *pnetdev);
936 #ifndef CONFIG_RTL8822CS_WIFI_HDF
937 static
938 #endif
939 int netdev_close(struct net_device *pnetdev);
940 #ifdef CONFIG_PLATFORM_INTEL_BYT
941 extern int rtw_sdio_set_power(int on);
942 #endif /* CONFIG_PLATFORM_INTEL_BYT */
943 
944 #ifdef CONFIG_MCC_MODE
945 /* enable MCC mode or not */
946 int rtw_en_mcc = 1;
947 /* can referece following value before insmod driver */
948 int rtw_mcc_ap_bw20_target_tx_tp = MCC_AP_BW20_TARGET_TX_TP;
949 int rtw_mcc_ap_bw40_target_tx_tp = MCC_AP_BW40_TARGET_TX_TP;
950 int rtw_mcc_ap_bw80_target_tx_tp = MCC_AP_BW80_TARGET_TX_TP;
951 int rtw_mcc_sta_bw20_target_tx_tp = MCC_STA_BW20_TARGET_TX_TP;
952 int rtw_mcc_sta_bw40_target_tx_tp = MCC_STA_BW40_TARGET_TX_TP;
953 int rtw_mcc_sta_bw80_target_tx_tp = MCC_STA_BW80_TARGET_TX_TP;
954 int rtw_mcc_single_tx_cri = MCC_SINGLE_TX_CRITERIA;
955 int rtw_mcc_policy_table_idx = 0;
956 int rtw_mcc_duration = 0;
957 int rtw_mcc_enable_runtime_duration = 1;
958 #ifdef CONFIG_MCC_PHYDM_OFFLOAD
959 int rtw_mcc_phydm_offload = 1;
960 #else
961 int rtw_mcc_phydm_offload = 0;
962 #endif
963 module_param(rtw_en_mcc, int, 0644);
964 module_param(rtw_mcc_single_tx_cri, int, 0644);
965 module_param(rtw_mcc_ap_bw20_target_tx_tp, int, 0644);
966 module_param(rtw_mcc_ap_bw40_target_tx_tp, int, 0644);
967 module_param(rtw_mcc_ap_bw80_target_tx_tp, int, 0644);
968 module_param(rtw_mcc_sta_bw20_target_tx_tp, int, 0644);
969 module_param(rtw_mcc_sta_bw40_target_tx_tp, int, 0644);
970 module_param(rtw_mcc_sta_bw80_target_tx_tp, int, 0644);
971 module_param(rtw_mcc_policy_table_idx, int, 0644);
972 module_param(rtw_mcc_duration, int, 0644);
973 module_param(rtw_mcc_phydm_offload, int, 0644);
974 #endif /*CONFIG_MCC_MODE */
975 
976 #ifdef CONFIG_RTW_NAPI
977 /*following setting should define NAPI in Makefile
978 enable napi only = 1, disable napi = 0*/
979 int rtw_en_napi = 1;
980 module_param(rtw_en_napi, int, 0644);
981 #ifdef CONFIG_RTW_NAPI_DYNAMIC
982 int rtw_napi_threshold = 100; /* unit: Mbps */
983 module_param(rtw_napi_threshold, int, 0644);
984 #endif /* CONFIG_RTW_NAPI_DYNAMIC */
985 #ifdef CONFIG_RTW_GRO
986 /*following setting should define GRO in Makefile
987 enable gro = 1, disable gro = 0*/
988 int rtw_en_gro = 1;
989 module_param(rtw_en_gro, int, 0644);
990 #endif /* CONFIG_RTW_GRO */
991 #endif /* CONFIG_RTW_NAPI */
992 
993 #ifdef RTW_IQK_FW_OFFLOAD
994 int rtw_iqk_fw_offload = 1;
995 #else
996 int rtw_iqk_fw_offload;
997 #endif /* RTW_IQK_FW_OFFLOAD */
998 module_param(rtw_iqk_fw_offload, int, 0644);
999 
1000 #ifdef RTW_CHANNEL_SWITCH_OFFLOAD
1001 int rtw_ch_switch_offload = 0;
1002 #else
1003 int rtw_ch_switch_offload;
1004 #endif /* RTW_CHANNEL_SWITCH_OFFLOAD */
1005 module_param(rtw_ch_switch_offload, int, 0644);
1006 
1007 #ifdef CONFIG_TDLS
1008 int rtw_en_tdls = 1;
1009 module_param(rtw_en_tdls, int, 0644);
1010 #endif
1011 
1012 #ifdef CONFIG_FW_OFFLOAD_PARAM_INIT
1013 int rtw_fw_param_init = 1;
1014 module_param(rtw_fw_param_init, int, 0644);
1015 #endif
1016 
1017 #ifdef CONFIG_TDMADIG
1018 int rtw_tdmadig_en = 1;
1019 /*
1020 1:MODE_PERFORMANCE
1021 2:MODE_COVERAGE
1022 */
1023 int rtw_tdmadig_mode = 1;
1024 int rtw_dynamic_tdmadig = 0;
1025 module_param(rtw_tdmadig_en, int, 0644);
1026 module_param(rtw_tdmadig_mode, int, 0644);
1027 module_param(rtw_dynamic_tdmadig, int, 0644);
1028 #endif/*CONFIG_TDMADIG*/
1029 
1030 /*dynamic RRSR default enable*/
1031 int rtw_en_dyn_rrsr = 1;
1032 int rtw_rrsr_value = 0xFFFFFFFF;
1033 module_param(rtw_en_dyn_rrsr, int, 0644);
1034 module_param(rtw_rrsr_value, int, 0644);
1035 
1036 #ifdef CONFIG_WOWLAN
1037 /*
1038  * 0: disable, 1: enable
1039  */
1040 uint rtw_wow_enable = 1;
1041 module_param(rtw_wow_enable, uint, 0644);
1042 /*
1043  * bit[0]: magic packet wake up
1044  * bit[1]: unucast packet(HW/FW unuicast)
1045  * bit[2]: deauth wake up
1046  */
1047 uint rtw_wakeup_event = RTW_WAKEUP_EVENT;
1048 module_param(rtw_wakeup_event, uint, 0644);
1049 /*
1050  * 0: common WOWLAN
1051  * bit[0]: disable BB RF
1052  * bit[1]: For wireless remote controller with or without connection
1053  */
1054 uint rtw_suspend_type = RTW_SUSPEND_TYPE;
1055 module_param(rtw_suspend_type, uint, 0644);
1056 #endif
1057 
1058 #ifdef RTW_BUSY_DENY_SCAN
1059 uint rtw_scan_interval_thr = BUSY_TRAFFIC_SCAN_DENY_PERIOD;
1060 module_param(rtw_scan_interval_thr, uint, 0644);
1061 MODULE_PARM_DESC(rtw_scan_interval_thr, "Threshold used to judge if scan " \
1062 		 "request comes from scan UI, unit is ms.");
1063 #endif /* RTW_BUSY_DENY_SCAN */
1064 
1065 #ifdef CONFIG_RTL8822C_XCAP_NEW_POLICY
1066 uint rtw_8822c_xcap_overwrite = 1;
1067 module_param(rtw_8822c_xcap_overwrite, uint, 0644);
1068 #endif
1069 
1070 #ifdef CONFIG_RTW_MULTI_AP
1071 static int rtw_unassoc_sta_mode_of_stype[UNASOC_STA_SRC_NUM] = CONFIG_RTW_UNASOC_STA_MODE_OF_STYPE;
1072 static int rtw_unassoc_sta_mode_of_stype_num = 0;
1073 module_param_array(rtw_unassoc_sta_mode_of_stype, int, &rtw_unassoc_sta_mode_of_stype_num, 0644);
1074 
1075 uint rtw_max_unassoc_sta_cnt = 0;
1076 module_param(rtw_max_unassoc_sta_cnt, uint, 0644);
1077 #endif
1078 
1079 #if CONFIG_TX_AC_LIFETIME
rtw_regsty_load_tx_ac_lifetime(struct registry_priv * regsty)1080 static void rtw_regsty_load_tx_ac_lifetime(struct registry_priv *regsty)
1081 {
1082 	int i, j;
1083 	struct tx_aclt_conf_t *conf;
1084 	uint *parm;
1085 
1086 	regsty->tx_aclt_flags = (u8)rtw_tx_aclt_flags;
1087 
1088 	for (i = 0; i < TX_ACLT_CONF_NUM; i++) {
1089 		conf = &regsty->tx_aclt_confs[i];
1090 		if (i == TX_ACLT_CONF_DEFAULT)
1091 			parm = rtw_tx_aclt_conf_default;
1092 		#ifdef CONFIG_AP_MODE
1093 		#if CONFIG_RTW_AP_DATA_BMC_TO_UC
1094 		else if (i == TX_ACLT_CONF_AP_M2U)
1095 			parm = rtw_tx_aclt_conf_ap_m2u;
1096 		#endif
1097 		#endif /* CONFIG_AP_MODE */
1098 		#ifdef CONFIG_RTW_MESH
1099 		else if (i == TX_ACLT_CONF_MESH)
1100 			parm = rtw_tx_aclt_conf_mesh;
1101 		#endif
1102 		else
1103 			parm = NULL;
1104 
1105 		if (parm) {
1106 			conf->en = parm[0] & 0xF;
1107 			conf->vo_vi = parm[1];
1108 			conf->be_bk = parm[2];
1109 		}
1110 	}
1111 }
1112 #endif
1113 
rtw_regsty_load_target_tx_power(struct registry_priv * regsty)1114 void rtw_regsty_load_target_tx_power(struct registry_priv *regsty)
1115 {
1116 	int path, rs;
1117 	int *target_tx_pwr;
1118 
1119 	for (path = RF_PATH_A; path < RF_PATH_MAX; path++) {
1120 		if (path == RF_PATH_A)
1121 			target_tx_pwr = rtw_target_tx_pwr_2g_a;
1122 		else if (path == RF_PATH_B)
1123 			target_tx_pwr = rtw_target_tx_pwr_2g_b;
1124 		else if (path == RF_PATH_C)
1125 			target_tx_pwr = rtw_target_tx_pwr_2g_c;
1126 		else if (path == RF_PATH_D)
1127 			target_tx_pwr = rtw_target_tx_pwr_2g_d;
1128 
1129 		for (rs = CCK; rs < RATE_SECTION_NUM; rs++)
1130 			regsty->target_tx_pwr_2g[path][rs] = target_tx_pwr[rs];
1131 	}
1132 
1133 #if CONFIG_IEEE80211_BAND_5GHZ
1134 	for (path = RF_PATH_A; path < RF_PATH_MAX; path++) {
1135 		if (path == RF_PATH_A)
1136 			target_tx_pwr = rtw_target_tx_pwr_5g_a;
1137 		else if (path == RF_PATH_B)
1138 			target_tx_pwr = rtw_target_tx_pwr_5g_b;
1139 		else if (path == RF_PATH_C)
1140 			target_tx_pwr = rtw_target_tx_pwr_5g_c;
1141 		else if (path == RF_PATH_D)
1142 			target_tx_pwr = rtw_target_tx_pwr_5g_d;
1143 
1144 		for (rs = OFDM; rs < RATE_SECTION_NUM; rs++)
1145 			regsty->target_tx_pwr_5g[path][rs - 1] = target_tx_pwr[rs - 1];
1146 	}
1147 #endif /* CONFIG_IEEE80211_BAND_5GHZ */
1148 }
1149 
rtw_regsty_load_chplan(struct registry_priv * regsty)1150 inline void rtw_regsty_load_chplan(struct registry_priv *regsty)
1151 {
1152 	u16 chplan = RTW_CHPLAN_UNSPECIFIED;
1153 	u16 chplan_6g = RTW_CHPLAN_6G_UNSPECIFIED;
1154 
1155 	chplan = rtw_channel_plan;
1156 #if CONFIG_IEEE80211_BAND_6GHZ
1157 	chplan_6g = rtw_channel_plan_6g;
1158 #endif
1159 
1160 	rtw_chplan_ioctl_input_mapping(&chplan, &chplan_6g);
1161 
1162 	regsty->channel_plan = chplan;
1163 #if CONFIG_IEEE80211_BAND_6GHZ
1164 	regsty->channel_plan_6g = chplan_6g;
1165 #endif
1166 }
1167 
rtw_regsty_load_alpha2(struct registry_priv * regsty)1168 inline void rtw_regsty_load_alpha2(struct registry_priv *regsty)
1169 {
1170 	if (strlen(rtw_country_code) != 2
1171 		|| (!IS_ALPHA2_WORLDWIDE(rtw_country_code)
1172 			&& (is_alpha(rtw_country_code[0]) == _FALSE
1173 				|| is_alpha(rtw_country_code[1]) == _FALSE)
1174 			)
1175 	) {
1176 		if (rtw_country_code != rtw_country_unspecified)
1177 			RTW_ERR("%s discard rtw_country_code not in alpha2 or \"%s\"\n", __func__, WORLDWIDE_ALPHA2);
1178 		SET_UNSPEC_ALPHA2(regsty->alpha2);
1179 	} else
1180 		_rtw_memcpy(regsty->alpha2, rtw_country_code, 2);
1181 }
1182 
rtw_regsty_load_excl_chs(struct registry_priv * regsty)1183 inline void rtw_regsty_load_excl_chs(struct registry_priv *regsty)
1184 {
1185 	int i;
1186 	int ch_num = 0;
1187 
1188 	for (i = 0; i < MAX_CHANNEL_NUM_2G_5G; i++)
1189 		if (((u8)rtw_excl_chs[i]) != 0)
1190 			regsty->excl_chs[ch_num++] = (u8)rtw_excl_chs[i];
1191 
1192 	if (ch_num < MAX_CHANNEL_NUM_2G_5G)
1193 		regsty->excl_chs[ch_num] = 0;
1194 
1195 #if CONFIG_IEEE80211_BAND_6GHZ
1196 	ch_num = 0;
1197 	for (i = 0; i < MAX_CHANNEL_NUM_6G; i++)
1198 		if (((u8)rtw_excl_chs_6g[i]) != 0)
1199 			regsty->excl_chs_6g[ch_num++] = (u8)rtw_excl_chs_6g[i];
1200 
1201 	if (ch_num < MAX_CHANNEL_NUM_6G)
1202 		regsty->excl_chs_6g[ch_num] = 0;
1203 #endif
1204 }
1205 
1206 #ifdef CONFIG_80211D
rtw_regsty_load_country_ie_slave_settings(struct registry_priv * regsty)1207 inline void rtw_regsty_load_country_ie_slave_settings(struct registry_priv *regsty)
1208 {
1209 	regsty->country_ie_slave_en_role = rtw_country_ie_slave_en_role;
1210 	regsty->country_ie_slave_en_ifbmp = rtw_country_ie_slave_en_ifbmp;
1211 }
1212 #endif
1213 
1214 #ifdef CONFIG_80211N_HT
rtw_regsty_init_rx_ampdu_sz_limit(struct registry_priv * regsty)1215 inline void rtw_regsty_init_rx_ampdu_sz_limit(struct registry_priv *regsty)
1216 {
1217 	int i, j;
1218 	uint *sz_limit;
1219 
1220 	for (i = 0; i < 4; i++) {
1221 		if (i == 0)
1222 			sz_limit = rtw_rx_ampdu_sz_limit_1ss;
1223 		else if (i == 1)
1224 			sz_limit = rtw_rx_ampdu_sz_limit_2ss;
1225 		else if (i == 2)
1226 			sz_limit = rtw_rx_ampdu_sz_limit_3ss;
1227 		else if (i == 3)
1228 			sz_limit = rtw_rx_ampdu_sz_limit_4ss;
1229 
1230 		for (j = 0; j < 4; j++)
1231 			regsty->rx_ampdu_sz_limit_by_nss_bw[i][j] = sz_limit[j];
1232 	}
1233 }
1234 #endif /* CONFIG_80211N_HT */
1235 
1236 #ifdef CONFIG_RTW_MULTI_AP
rtw_regsty_init_unassoc_sta_param(struct registry_priv * regsty)1237 inline void rtw_regsty_init_unassoc_sta_param(struct registry_priv *regsty)
1238 {
1239 	int i;
1240 
1241 	for (i = 0; i < UNASOC_STA_SRC_NUM; i++)
1242 		regsty->unassoc_sta_mode_of_stype[i] = rtw_unassoc_sta_mode_of_stype[i];
1243 
1244 	regsty->max_unassoc_sta_cnt = (u16) rtw_max_unassoc_sta_cnt;
1245 }
1246 #endif
1247 
loadparam(_adapter * padapter)1248 uint loadparam(_adapter *padapter)
1249 {
1250 	uint status = _SUCCESS;
1251 	struct registry_priv  *registry_par = &padapter->registrypriv;
1252 
1253 
1254 #ifdef CONFIG_RTW_DEBUG
1255 	if (rtw_drv_log_level >= _DRV_MAX_)
1256 		rtw_drv_log_level = _DRV_DEBUG_;
1257 #endif
1258 
1259 	registry_par->chip_version = (u8)rtw_chip_version;
1260 	registry_par->rfintfs = (u8)rtw_rfintfs;
1261 	registry_par->lbkmode = (u8)rtw_lbkmode;
1262 	/* registry_par->hci = (u8)hci; */
1263 	registry_par->network_mode  = (u8)rtw_network_mode;
1264 
1265 	_rtw_memcpy(registry_par->ssid.Ssid, "ANY", 3);
1266 	registry_par->ssid.SsidLength = 3;
1267 
1268 	registry_par->channel = (u8)rtw_channel;
1269 #ifdef CONFIG_NARROWBAND_SUPPORTING
1270 	if (rtw_nb_config != RTW_NB_CONFIG_NONE)
1271 		rtw_wireless_mode &= ~WIRELESS_11B;
1272 #endif
1273 	registry_par->wireless_mode = (u8)rtw_wireless_mode;
1274 
1275 	if (IsSupported24G(registry_par->wireless_mode) && (!is_supported_5g(registry_par->wireless_mode))
1276 	    && (registry_par->channel > 14))
1277 		registry_par->channel = 1;
1278 	else if (is_supported_5g(registry_par->wireless_mode) && (!IsSupported24G(registry_par->wireless_mode))
1279 		 && (registry_par->channel <= 14))
1280 		registry_par->channel = 36;
1281 
1282 	registry_par->vrtl_carrier_sense = (u8)rtw_vrtl_carrier_sense ;
1283 	registry_par->vcs_type = (u8)rtw_vcs_type;
1284 	registry_par->rts_thresh = (u16)rtw_rts_thresh;
1285 	registry_par->frag_thresh = (u16)rtw_frag_thresh;
1286 	registry_par->preamble = (u8)rtw_preamble;
1287 	registry_par->scan_mode = (u8)rtw_scan_mode;
1288 	registry_par->smart_ps = (u8)rtw_smart_ps;
1289 	registry_par->check_fw_ps = (u8)rtw_check_fw_ps;
1290 	#ifdef CONFIG_TDMADIG
1291 		registry_par->tdmadig_en = (u8)rtw_tdmadig_en;
1292 		registry_par->tdmadig_mode = (u8)rtw_tdmadig_mode;
1293 		registry_par->tdmadig_dynamic = (u8) rtw_dynamic_tdmadig;
1294 		registry_par->power_mgnt = PS_MODE_ACTIVE;
1295 		registry_par->ips_mode = IPS_NONE;
1296 	#else
1297 		registry_par->power_mgnt = (u8)rtw_power_mgnt;
1298 		registry_par->ips_mode = (u8)rtw_ips_mode;
1299 	#endif/*CONFIG_TDMADIG*/
1300 	registry_par->lps_level = (u8)rtw_lps_level;
1301 	registry_par->en_dyn_rrsr = (u8)rtw_en_dyn_rrsr;
1302 	registry_par->set_rrsr_value = (u32)rtw_rrsr_value;
1303 #ifdef CONFIG_LPS_1T1R
1304 	registry_par->lps_1t1r = (u8)(rtw_lps_1t1r ? 1 : 0);
1305 #endif
1306 	registry_par->lps_chk_by_tp = (u8)rtw_lps_chk_by_tp;
1307 #ifdef CONFIG_WOWLAN
1308 	registry_par->wow_power_mgnt = (u8)rtw_wow_power_mgnt;
1309 	registry_par->wow_lps_level = (u8)rtw_wow_lps_level;
1310 	#ifdef CONFIG_LPS_1T1R
1311 	registry_par->wow_lps_1t1r = (u8)(rtw_wow_lps_1t1r ? 1 : 0);
1312 	#endif
1313 #endif /* CONFIG_WOWLAN */
1314 	registry_par->radio_enable = (u8)rtw_radio_enable;
1315 	registry_par->long_retry_lmt = (u8)rtw_long_retry_lmt;
1316 	registry_par->short_retry_lmt = (u8)rtw_short_retry_lmt;
1317 	registry_par->busy_thresh = (u16)rtw_busy_thresh;
1318 	registry_par->max_bss_cnt = (u16)rtw_max_bss_cnt;
1319 	/* registry_par->qos_enable = (u8)rtw_qos_enable; */
1320 	registry_par->ack_policy = (u8)rtw_ack_policy;
1321 	registry_par->mp_mode = (u8)rtw_mp_mode;
1322 #if defined(CONFIG_MP_INCLUDED) && defined(CONFIG_RTW_CUSTOMER_STR)
1323 	registry_par->mp_customer_str = (u8)rtw_mp_customer_str;
1324 #endif
1325 	registry_par->software_encrypt = (u8)rtw_software_encrypt;
1326 	registry_par->software_decrypt = (u8)rtw_software_decrypt;
1327 
1328 	registry_par->acm_method = (u8)rtw_acm_method;
1329 	registry_par->usb_rxagg_mode = (u8)rtw_usb_rxagg_mode;
1330 	registry_par->dynamic_agg_enable = (u8)rtw_dynamic_agg_enable;
1331 
1332 	/* WMM */
1333 	registry_par->wmm_enable = (u8)rtw_wmm_enable;
1334 
1335 #ifdef CONFIG_WMMPS_STA
1336 	/* UAPSD */
1337 	registry_par->uapsd_max_sp_len= (u8)rtw_uapsd_max_sp;
1338 	registry_par->uapsd_ac_enable = (u8)rtw_uapsd_ac_enable;
1339 	registry_par->wmm_smart_ps = (u8)rtw_wmm_smart_ps;
1340 #endif /* CONFIG_WMMPS_STA */
1341 
1342 	registry_par->RegPwrTrimEnable = (u8)rtw_pwrtrim_enable;
1343 
1344 #if CONFIG_TX_AC_LIFETIME
1345 	rtw_regsty_load_tx_ac_lifetime(registry_par);
1346 #endif
1347 
1348 	registry_par->tx_bw_mode = (u8)rtw_tx_bw_mode;
1349 
1350 #ifdef CONFIG_80211N_HT
1351 	registry_par->ht_enable = (u8)rtw_ht_enable;
1352 	if (registry_par->ht_enable && is_supported_ht(registry_par->wireless_mode)) {
1353 #ifdef CONFIG_NARROWBAND_SUPPORTING
1354 	if (rtw_nb_config != RTW_NB_CONFIG_NONE)
1355 		rtw_bw_mode = 0;
1356 #endif
1357 		registry_par->bw_mode = (u8)rtw_bw_mode;
1358 		registry_par->ampdu_enable = (u8)rtw_ampdu_enable;
1359 		registry_par->rx_stbc = (u8)rtw_rx_stbc;
1360 		registry_par->rx_ampdu_amsdu = (u8)rtw_rx_ampdu_amsdu;
1361 		registry_par->tx_ampdu_amsdu = (u8)rtw_tx_ampdu_amsdu;
1362 		registry_par->tx_quick_addba_req = (u8)rtw_quick_addba_req;
1363 		registry_par->short_gi = (u8)rtw_short_gi;
1364 		registry_par->ldpc_cap = (u8)rtw_ldpc_cap;
1365 #if defined(CONFIG_CUSTOMER01_SMART_ANTENNA)
1366 		rtw_stbc_cap = 0x0;
1367 #endif
1368 #ifdef CONFIG_RTW_TX_NPATH_EN
1369 		registry_par->tx_npath = (u8)rtw_tx_npath_enable;
1370 #endif
1371 #ifdef CONFIG_RTW_PATH_DIV
1372 		registry_par->path_div = (u8)rtw_path_div_enable;
1373 #endif
1374 		registry_par->stbc_cap = (u8)rtw_stbc_cap;
1375 		registry_par->beamform_cap = (u8)rtw_beamform_cap;
1376 		registry_par->beamformer_rf_num = (u8)rtw_bfer_rf_number;
1377 		registry_par->beamformee_rf_num = (u8)rtw_bfee_rf_number;
1378 		rtw_regsty_init_rx_ampdu_sz_limit(registry_par);
1379 	}
1380 #endif
1381 #ifdef DBG_LA_MODE
1382 	registry_par->la_mode_en = (u8)rtw_la_mode_en;
1383 #endif
1384 #ifdef CONFIG_NARROWBAND_SUPPORTING
1385 	registry_par->rtw_nb_config = (u8)rtw_nb_config;
1386 #endif
1387 
1388 #ifdef CONFIG_80211AC_VHT
1389 	registry_par->vht_enable = (u8)rtw_vht_enable;
1390 	registry_par->vht_24g_enable = (u8)rtw_vht_24g_enable;
1391 	registry_par->ampdu_factor = (u8)rtw_ampdu_factor;
1392 	registry_par->vht_rx_mcs_map[0] = (u8)(rtw_vht_rx_mcs_map & 0xFF);
1393 	registry_par->vht_rx_mcs_map[1] = (u8)((rtw_vht_rx_mcs_map & 0xFF00) >> 8);
1394 #endif
1395 
1396 #ifdef CONFIG_TX_EARLY_MODE
1397 	registry_par->early_mode = (u8)rtw_early_mode;
1398 #endif
1399 	registry_par->trx_path_bmp = (u8)rtw_trx_path_bmp;
1400 	registry_par->tx_path_lmt = (u8)rtw_tx_path_lmt;
1401 	registry_par->rx_path_lmt = (u8)rtw_rx_path_lmt;
1402 	registry_par->tx_nss = (u8)rtw_tx_nss;
1403 	registry_par->rx_nss = (u8)rtw_rx_nss;
1404 	registry_par->low_power = (u8)rtw_low_power;
1405 
1406 	registry_par->check_hw_status = (u8)rtw_check_hw_status;
1407 
1408 	registry_par->wifi_spec = (u8)rtw_wifi_spec;
1409 
1410 #ifdef CONFIG_ACTIVE_TPC_REPORT
1411 	registry_par->active_tpc_report = (u8)rtw_active_tpc_report;
1412 #endif
1413 
1414 #ifdef CONFIG_REGD_SRC_FROM_OS
1415 	if (regd_src_is_valid(rtw_regd_src))
1416 		registry_par->regd_src = (u8)rtw_regd_src;
1417 	else {
1418 		RTW_WARN("%s invalid rtw_regd_src(%u), use REGD_SRC_RTK_PRIV instead\n", __func__, rtw_regd_src);
1419 		registry_par->regd_src = REGD_SRC_RTK_PRIV;
1420 	}
1421 #endif
1422 
1423 	rtw_regsty_load_alpha2(registry_par);
1424 	rtw_regsty_load_chplan(registry_par);
1425 	rtw_regsty_load_excl_chs(registry_par);
1426 #ifdef CONFIG_80211D
1427 	rtw_regsty_load_country_ie_slave_settings(registry_par);
1428 #endif
1429 
1430 	registry_par->full_ch_in_p2p_handshake = (u8)rtw_full_ch_in_p2p_handshake;
1431 #ifdef CONFIG_BT_COEXIST
1432 	registry_par->btcoex = (u8)rtw_btcoex_enable;
1433 	registry_par->bt_iso = (u8)rtw_bt_iso;
1434 	registry_par->bt_sco = (u8)rtw_bt_sco;
1435 	registry_par->bt_ampdu = (u8)rtw_bt_ampdu;
1436 	registry_par->ant_num = (u8)rtw_ant_num;
1437 	registry_par->single_ant_path = (u8) rtw_single_ant_path;
1438 #endif
1439 
1440 	registry_par->bAcceptAddbaReq = (u8)rtw_AcceptAddbaReq;
1441 
1442 	registry_par->antdiv_cfg = (u8)rtw_antdiv_cfg;
1443 	registry_par->antdiv_type = (u8)rtw_antdiv_type;
1444 
1445 	registry_par->drv_ant_band_switch = (u8) rtw_drv_ant_band_switch;
1446 
1447 	registry_par->switch_usb_mode = (u8)rtw_switch_usb_mode;
1448 #ifdef SUPPORT_HW_RFOFF_DETECTED
1449 	registry_par->hwpdn_mode = (u8)rtw_hwpdn_mode;/* 0:disable,1:enable,2:by EFUSE config */
1450 	registry_par->hwpwrp_detect = (u8)rtw_hwpwrp_detect;/* 0:disable,1:enable */
1451 #endif
1452 
1453 	registry_par->hw_wps_pbc = (u8)rtw_hw_wps_pbc;
1454 
1455 #ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE
1456 	snprintf(registry_par->adaptor_info_caching_file_path, PATH_LENGTH_MAX, "%s", rtw_adaptor_info_caching_file_path);
1457 	registry_par->adaptor_info_caching_file_path[PATH_LENGTH_MAX - 1] = 0;
1458 #endif
1459 
1460 #ifdef CONFIG_LAYER2_ROAMING
1461 	registry_par->max_roaming_times = (u8)rtw_max_roaming_times;
1462 #endif
1463 
1464 #ifdef CONFIG_IOL
1465 	registry_par->fw_iol = rtw_fw_iol;
1466 #endif
1467 
1468 	snprintf(registry_par->ifname, 16, "%s", ifname);
1469 	snprintf(registry_par->if2name, 16, "%s", if2name);
1470 #if defined(CONFIG_PLATFORM_ANDROID) && (CONFIG_IFACE_NUMBER > 2)
1471 	snprintf(registry_par->if3name, 16, "%s", if3name);
1472 #endif
1473 	registry_par->notch_filter = (u8)rtw_notch_filter;
1474 
1475 #ifdef CONFIG_CONCURRENT_MODE
1476 	registry_par->virtual_iface_num = (u8)rtw_virtual_iface_num;
1477 #ifdef CONFIG_P2P
1478 	registry_par->sel_p2p_iface = (u8)rtw_sel_p2p_iface;
1479 	RTW_INFO("%s, Select P2P interface: iface_id:%d\n", __func__, registry_par->sel_p2p_iface);
1480 #endif
1481 #endif
1482 	registry_par->pll_ref_clk_sel = (u8)rtw_pll_ref_clk_sel;
1483 
1484 #if CONFIG_TXPWR_LIMIT
1485 	registry_par->RegEnableTxPowerLimit = (u8)rtw_tx_pwr_lmt_enable;
1486 #endif
1487 	registry_par->RegEnableTxPowerByRate = (u8)rtw_tx_pwr_by_rate;
1488 
1489 	rtw_regsty_load_target_tx_power(registry_par);
1490 
1491 	registry_par->antenna_gain = (s16)rtw_antenna_gain;
1492 
1493 	registry_par->tsf_update_pause_factor = (u8)rtw_tsf_update_pause_factor;
1494 	registry_par->tsf_update_restore_factor = (u8)rtw_tsf_update_restore_factor;
1495 
1496 	registry_par->TxBBSwing_2G = (s8)rtw_TxBBSwing_2G;
1497 	registry_par->TxBBSwing_5G = (s8)rtw_TxBBSwing_5G;
1498 	registry_par->bEn_RFE = 1;
1499 	registry_par->RFE_Type = (u8)rtw_RFE_type;
1500 	registry_par->PowerTracking_Type = (u8)rtw_powertracking_type;
1501 	registry_par->AmplifierType_2G = (u8)rtw_amplifier_type_2g;
1502 	registry_par->AmplifierType_5G = (u8)rtw_amplifier_type_5g;
1503 	registry_par->GLNA_Type = (u8)rtw_GLNA_type;
1504 #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
1505 	registry_par->load_phy_file = (u8)rtw_load_phy_file;
1506 	registry_par->RegDecryptCustomFile = (u8)rtw_decrypt_phy_file;
1507 #endif
1508 	registry_par->qos_opt_enable = (u8)rtw_qos_opt_enable;
1509 
1510 	registry_par->hiq_filter = (u8)rtw_hiq_filter;
1511 
1512 	registry_par->adaptivity_en = (u8)rtw_adaptivity_en;
1513 	registry_par->adaptivity_mode = (u8)rtw_adaptivity_mode;
1514 	registry_par->adaptivity_th_l2h_ini = (s8)rtw_adaptivity_th_l2h_ini;
1515 	registry_par->adaptivity_th_edcca_hl_diff = (s8)rtw_adaptivity_th_edcca_hl_diff;
1516 
1517 #ifdef CONFIG_DYNAMIC_SOML
1518 	registry_par->dyn_soml_en = (u8)rtw_dynamic_soml_en;
1519 	registry_par->dyn_soml_train_num = (u8)rtw_dynamic_soml_train_num;
1520 	registry_par->dyn_soml_interval = (u8)rtw_dynamic_soml_interval;
1521 	registry_par->dyn_soml_period = (u8)rtw_dynamic_soml_period;
1522 	registry_par->dyn_soml_delay = (u8)rtw_dynamic_soml_delay;
1523 #endif
1524 
1525 	registry_par->boffefusemask = (u8)rtw_OffEfuseMask;
1526 	registry_par->bFileMaskEfuse = (u8)rtw_FileMaskEfuse;
1527 	registry_par->bBTFileMaskEfuse = (u8)rtw_FileMaskEfuse;
1528 
1529 #ifdef CONFIG_RTW_ACS
1530 	registry_par->acs_mode = (u8)rtw_acs;
1531 	registry_par->acs_auto_scan = (u8)rtw_acs_auto_scan;
1532 #endif
1533 #ifdef CONFIG_BACKGROUND_NOISE_MONITOR
1534 	registry_par->nm_mode = (u8)rtw_nm;
1535 #endif
1536 	registry_par->reg_rxgain_offset_2g = (u32) rtw_rxgain_offset_2g;
1537 	registry_par->reg_rxgain_offset_5gl = (u32) rtw_rxgain_offset_5gl;
1538 	registry_par->reg_rxgain_offset_5gm = (u32) rtw_rxgain_offset_5gm;
1539 	registry_par->reg_rxgain_offset_5gh = (u32) rtw_rxgain_offset_5gh;
1540 
1541 #ifdef CONFIG_DFS_MASTER
1542 	registry_par->dfs_region_domain = (u8)rtw_dfs_region_domain;
1543 	#ifdef CONFIG_REGD_SRC_FROM_OS
1544 	if (rtw_regd_src == REGD_SRC_OS && registry_par->dfs_region_domain != RTW_DFS_REGD_NONE) {
1545 		RTW_WARN("%s force disable radar detection capability when regd_src is OS\n", __func__);
1546 		registry_par->dfs_region_domain = RTW_DFS_REGD_NONE;
1547 	}
1548 	#endif
1549 #endif
1550 
1551 	registry_par->amsdu_mode = (u8)rtw_amsdu_mode;
1552 
1553 #ifdef CONFIG_MCC_MODE
1554 	registry_par->en_mcc = (u8)rtw_en_mcc;
1555 	registry_par->rtw_mcc_ap_bw20_target_tx_tp = (u32)rtw_mcc_ap_bw20_target_tx_tp;
1556 	registry_par->rtw_mcc_ap_bw40_target_tx_tp = (u32)rtw_mcc_ap_bw40_target_tx_tp;
1557 	registry_par->rtw_mcc_ap_bw80_target_tx_tp = (u32)rtw_mcc_ap_bw80_target_tx_tp;
1558 	registry_par->rtw_mcc_sta_bw20_target_tx_tp = (u32)rtw_mcc_sta_bw20_target_tx_tp;
1559 	registry_par->rtw_mcc_sta_bw40_target_tx_tp = (u32)rtw_mcc_sta_bw40_target_tx_tp;
1560 	registry_par->rtw_mcc_sta_bw80_target_tx_tp = (u32)rtw_mcc_sta_bw80_target_tx_tp;
1561 	registry_par->rtw_mcc_single_tx_cri = (u32)rtw_mcc_single_tx_cri;
1562 	registry_par->rtw_mcc_policy_table_idx = rtw_mcc_policy_table_idx;
1563 	registry_par->rtw_mcc_duration = (u8)rtw_mcc_duration;
1564 	registry_par->rtw_mcc_enable_runtime_duration = rtw_mcc_enable_runtime_duration;
1565 	registry_par->rtw_mcc_phydm_offload = rtw_mcc_phydm_offload;
1566 #endif /*CONFIG_MCC_MODE */
1567 
1568 #ifdef CONFIG_WOWLAN
1569 	registry_par->wowlan_enable = rtw_wow_enable;
1570 	registry_par->wakeup_event = rtw_wakeup_event;
1571 	registry_par->suspend_type = rtw_suspend_type;
1572 #endif
1573 
1574 #if defined(CONFIG_SDIO_HCI) && defined(CONFIG_PREALLOC_RX_SKB_BUFFER)
1575 	if (rtw_recvbuf_nr != NR_RECVBUFF) {
1576 		RTW_WARN("CONFIG_PREALLOC_RX_SKB_BUFFER && CONFIG_SDIO_HCI, force recvbuf_nr to NR_RECVBUFF(%d)\n", NR_RECVBUFF);
1577 		rtw_recvbuf_nr = NR_RECVBUFF;
1578 	}
1579 #endif
1580 	registry_par->recvbuf_nr = rtw_recvbuf_nr;
1581 
1582 #ifdef CONFIG_SUPPORT_TRX_SHARED
1583 	registry_par->trx_share_mode = rtw_trx_share_mode;
1584 #endif
1585 	registry_par->wowlan_sta_mix_mode = rtw_wowlan_sta_mix_mode;
1586 
1587 #ifdef CONFIG_PCI_HCI
1588 	registry_par->pci_aspm_config = rtw_pci_aspm_enable;
1589 	registry_par->pci_dynamic_aspm_linkctrl = rtw_pci_dynamic_aspm_linkctrl;
1590 #endif
1591 
1592 #ifdef CONFIG_RTW_NAPI
1593 	registry_par->en_napi = (u8)rtw_en_napi;
1594 #ifdef CONFIG_RTW_NAPI_DYNAMIC
1595 	registry_par->napi_threshold = (u32)rtw_napi_threshold;
1596 #endif /* CONFIG_RTW_NAPI_DYNAMIC */
1597 #ifdef CONFIG_RTW_GRO
1598 	registry_par->en_gro = (u8)rtw_en_gro;
1599 	if (!registry_par->en_napi && registry_par->en_gro) {
1600 		registry_par->en_gro = 0;
1601 		RTW_WARN("Disable GRO because NAPI is not enabled\n");
1602 	}
1603 #endif /* CONFIG_RTW_GRO */
1604 #endif /* CONFIG_RTW_NAPI */
1605 
1606 	registry_par->iqk_fw_offload = (u8)rtw_iqk_fw_offload;
1607 	registry_par->ch_switch_offload = (u8)rtw_ch_switch_offload;
1608 
1609 #ifdef CONFIG_TDLS
1610 	registry_par->en_tdls = rtw_en_tdls;
1611 #endif
1612 
1613 #ifdef CONFIG_ADVANCE_OTA
1614 	registry_par->adv_ota = rtw_advnace_ota;
1615 #endif
1616 #ifdef CONFIG_FW_OFFLOAD_PARAM_INIT
1617 	registry_par->fw_param_init = rtw_fw_param_init;
1618 #endif
1619 #ifdef CONFIG_AP_MODE
1620 	registry_par->bmc_tx_rate = rtw_bmc_tx_rate;
1621 	#if CONFIG_RTW_AP_DATA_BMC_TO_UC
1622 	registry_par->ap_src_b2u_flags = rtw_ap_src_b2u_flags;
1623 	registry_par->ap_fwd_b2u_flags = rtw_ap_fwd_b2u_flags;
1624 	#endif
1625 #endif /* CONFIG_AP_MODE */
1626 
1627 #ifdef CONFIG_RTW_MESH
1628 	#if CONFIG_RTW_MESH_DATA_BMC_TO_UC
1629 	registry_par->msrc_b2u_flags = rtw_msrc_b2u_flags;
1630 	registry_par->mfwd_b2u_flags = rtw_mfwd_b2u_flags;
1631 	#endif
1632 #endif /* CONFIG_RTW_MESH */
1633 
1634 #ifdef CONFIG_FW_HANDLE_TXBCN
1635 	registry_par->fw_tbtt_rpt = rtw_tbtt_rpt;
1636 #endif
1637 	registry_par->phydm_ability = rtw_phydm_ability;
1638 	registry_par->halrf_ability = rtw_halrf_ability;
1639 #ifdef CONFIG_RTW_MESH
1640 	registry_par->peer_alive_based_preq = rtw_peer_alive_based_preq;
1641 #endif
1642 
1643 #ifdef RTW_BUSY_DENY_SCAN
1644 	registry_par->scan_interval_thr = rtw_scan_interval_thr;
1645 #endif
1646 
1647 #ifdef CONFIG_RTL8822C_XCAP_NEW_POLICY
1648 	registry_par->rtw_8822c_xcap_overwrite = (u8)rtw_8822c_xcap_overwrite;
1649 #endif
1650 
1651 #ifdef CONFIG_RTW_MULTI_AP
1652 	rtw_regsty_init_unassoc_sta_param(registry_par);
1653 #endif
1654 
1655 	registry_par->nbi_en = (u8)rtw_nbi_en;
1656 
1657 	return status;
1658 }
1659 
1660 /**
1661  * rtw_net_set_mac_address
1662  * This callback function is used for the Media Access Control address
1663  * of each net_device needs to be changed.
1664  *
1665  * Arguments:
1666  * @pnetdev: net_device pointer.
1667  * @addr: new MAC address.
1668  *
1669  * Return:
1670  * ret = 0: Permit to change net_device's MAC address.
1671  * ret = -1 (Default): Operation not permitted.
1672  *
1673  * Auther: Arvin Liu
1674  * Date: 2015/05/29
1675  */
rtw_net_set_mac_address(struct net_device * pnetdev,void * addr)1676 static int rtw_net_set_mac_address(struct net_device *pnetdev, void *addr)
1677 {
1678 	_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
1679 	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1680 	struct sockaddr *sa = (struct sockaddr *)addr;
1681 	int ret = -1;
1682 
1683 	/* only the net_device is in down state to permit modifying mac addr */
1684 	if ((pnetdev->flags & IFF_UP) == _TRUE) {
1685 		RTW_INFO(FUNC_ADPT_FMT": The net_device's is not in down state\n"
1686 			 , FUNC_ADPT_ARG(padapter));
1687 
1688 		return ret;
1689 	}
1690 
1691 	/* if the net_device is linked, it's not permit to modify mac addr */
1692 	if (check_fwstate(pmlmepriv, WIFI_UNDER_LINKING) ||
1693 	    check_fwstate(pmlmepriv, WIFI_ASOC_STATE) ||
1694 	    check_fwstate(pmlmepriv, WIFI_UNDER_SURVEY)) {
1695 		RTW_INFO(FUNC_ADPT_FMT": The net_device's is not idle currently\n"
1696 			 , FUNC_ADPT_ARG(padapter));
1697 
1698 		return ret;
1699 	}
1700 
1701 	/* check whether the input mac address is valid to permit modifying mac addr */
1702 	if (rtw_check_invalid_mac_address(sa->sa_data, _FALSE) == _TRUE) {
1703 		RTW_INFO(FUNC_ADPT_FMT": Invalid Mac Addr for "MAC_FMT"\n"
1704 			 , FUNC_ADPT_ARG(padapter), MAC_ARG(sa->sa_data));
1705 
1706 		return ret;
1707 	}
1708 
1709 	_rtw_memcpy(adapter_mac_addr(padapter), sa->sa_data, ETH_ALEN); /* set mac addr to adapter */
1710 	_rtw_memcpy(pnetdev->dev_addr, sa->sa_data, ETH_ALEN); /* set mac addr to net_device */
1711 
1712 	rtw_hal_set_hw_macaddr(padapter, sa->sa_data);
1713 
1714 	RTW_INFO(FUNC_ADPT_FMT": Set Mac Addr to "MAC_FMT" Successfully\n"
1715 		 , FUNC_ADPT_ARG(padapter), MAC_ARG(sa->sa_data));
1716 
1717 	ret = 0;
1718 
1719 	return ret;
1720 }
1721 
rtw_net_get_stats(struct net_device * pnetdev)1722 struct net_device_stats *rtw_net_get_stats(struct net_device *pnetdev)
1723 {
1724 	_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
1725 	struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
1726 	struct recv_priv *precvpriv = &(padapter->recvpriv);
1727 
1728 	padapter->stats.tx_packets = pxmitpriv->tx_pkts;/* pxmitpriv->tx_pkts++; */
1729 	padapter->stats.rx_packets = precvpriv->rx_pkts;/* precvpriv->rx_pkts++; */
1730 	padapter->stats.tx_dropped = pxmitpriv->tx_drop;
1731 	padapter->stats.rx_dropped = precvpriv->rx_drop;
1732 	padapter->stats.tx_bytes = pxmitpriv->tx_bytes;
1733 	padapter->stats.rx_bytes = precvpriv->rx_bytes;
1734 
1735 	return &padapter->stats;
1736 }
1737 
1738 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35))
1739 /*
1740  * AC to queue mapping
1741  *
1742  * AC_VO -> queue 0
1743  * AC_VI -> queue 1
1744  * AC_BE -> queue 2
1745  * AC_BK -> queue 3
1746  */
1747 static const u16 rtw_1d_to_queue[8] = { 2, 3, 3, 2, 1, 1, 0, 0 };
1748 
1749 /* Given a data frame determine the 802.1p/1d tag to use. */
rtw_classify8021d(struct sk_buff * skb)1750 unsigned int rtw_classify8021d(struct sk_buff *skb)
1751 {
1752 	unsigned int dscp;
1753 
1754 	/* skb->priority values from 256->263 are magic values to
1755 	 * directly indicate a specific 802.1d priority.  This is used
1756 	 * to allow 802.1d priority to be passed directly in from VLAN
1757 	 * tags, etc.
1758 	 */
1759 	if (skb->priority >= 256 && skb->priority <= 263)
1760 		return skb->priority - 256;
1761 
1762 	switch (skb->protocol) {
1763 	case htons(ETH_P_IP):
1764 		dscp = ip_hdr(skb)->tos & 0xfc;
1765 		break;
1766 	default:
1767 		return 0;
1768 	}
1769 
1770 	return dscp >> 5;
1771 }
1772 
1773 
rtw_select_queue(struct net_device * dev,struct sk_buff * skb,struct net_device * sb_dev,select_queue_fallback_t fallback)1774 static u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb
1775 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0)
1776 	#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)
1777 	, struct net_device *sb_dev
1778 	#else
1779 	, void *accel_priv
1780 	#endif
1781 	#if ((LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(5, 2, 0)))
1782 	, select_queue_fallback_t fallback
1783 	#endif
1784 #endif
1785 )
1786 {
1787 	_adapter	*padapter = rtw_netdev_priv(dev);
1788 	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1789 
1790 	skb->priority = rtw_classify8021d(skb);
1791 
1792 	if (pmlmepriv->acm_mask != 0)
1793 		skb->priority = qos_acm(pmlmepriv->acm_mask, skb->priority);
1794 
1795 	return rtw_1d_to_queue[skb->priority];
1796 }
1797 #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)) */
1798 
rtw_os_recv_select_queue(u8 * msdu,enum rtw_rx_llc_hdl llc_hdl)1799 u16 rtw_os_recv_select_queue(u8 *msdu, enum rtw_rx_llc_hdl llc_hdl)
1800 {
1801 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35))
1802 	u32 priority = 0;
1803 
1804 	if (llc_hdl == RTW_RX_LLC_REMOVE) {
1805 		u16 eth_type = RTW_GET_BE16(msdu + SNAP_SIZE);
1806 
1807 		if (eth_type == ETH_P_IP) {
1808 			struct iphdr *iphdr = (struct iphdr *)(msdu + SNAP_SIZE + 2);
1809 			unsigned int dscp = iphdr->tos & 0xfc;
1810 
1811 			priority = dscp >> 5;
1812 		}
1813 	}
1814 
1815 	return rtw_1d_to_queue[priority];
1816 #else
1817 	return 0;
1818 #endif
1819 }
1820 
is_rtw_ndev(struct net_device * ndev)1821 static u8 is_rtw_ndev(struct net_device *ndev)
1822 {
1823 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29))
1824 	return ndev->netdev_ops
1825 		&& ndev->netdev_ops->ndo_do_ioctl
1826 		&& ndev->netdev_ops->ndo_do_ioctl == rtw_ioctl;
1827 #else
1828 	return ndev->do_ioctl
1829 		&& ndev->do_ioctl == rtw_ioctl;
1830 #endif
1831 }
1832 
rtw_ndev_notifier_call(struct notifier_block * nb,unsigned long state,void * ptr)1833 static int rtw_ndev_notifier_call(struct notifier_block *nb, unsigned long state, void *ptr)
1834 {
1835 	struct net_device *ndev;
1836 
1837 	if (ptr == NULL)
1838 		return NOTIFY_DONE;
1839 
1840 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0))
1841 	ndev = netdev_notifier_info_to_dev(ptr);
1842 #else
1843 	ndev = ptr;
1844 #endif
1845 
1846 	if (ndev == NULL)
1847 		return NOTIFY_DONE;
1848 
1849 	if (!is_rtw_ndev(ndev))
1850 		return NOTIFY_DONE;
1851 
1852 	RTW_INFO(FUNC_NDEV_FMT" state:%lu\n", FUNC_NDEV_ARG(ndev), state);
1853 
1854 	switch (state) {
1855 	case NETDEV_CHANGENAME:
1856 		rtw_adapter_proc_replace(ndev);
1857 		break;
1858 	#ifdef CONFIG_NEW_NETDEV_HDL
1859 	case NETDEV_PRE_UP :
1860 		{
1861 			_adapter *adapter = rtw_netdev_priv(ndev);
1862 
1863 			rtw_pwr_wakeup(adapter);
1864 		}
1865 		break;
1866 	#endif
1867 	}
1868 
1869 	return NOTIFY_DONE;
1870 }
1871 
1872 static struct notifier_block rtw_ndev_notifier = {
1873 	.notifier_call = rtw_ndev_notifier_call,
1874 };
1875 
rtw_ndev_notifier_register(void)1876 int rtw_ndev_notifier_register(void)
1877 {
1878 	return register_netdevice_notifier(&rtw_ndev_notifier);
1879 }
1880 
rtw_ndev_notifier_unregister(void)1881 void rtw_ndev_notifier_unregister(void)
1882 {
1883 	unregister_netdevice_notifier(&rtw_ndev_notifier);
1884 }
1885 
rtw_ndev_init(struct net_device * dev)1886 int rtw_ndev_init(struct net_device *dev)
1887 {
1888 	_adapter *adapter = rtw_netdev_priv(dev);
1889 
1890 	RTW_PRINT(FUNC_ADPT_FMT" if%d mac_addr="MAC_FMT"\n"
1891 		, FUNC_ADPT_ARG(adapter), (adapter->iface_id + 1), MAC_ARG(dev->dev_addr));
1892 	strncpy(adapter->old_ifname, dev->name, IFNAMSIZ);
1893 	adapter->old_ifname[IFNAMSIZ - 1] = '\0';
1894 	rtw_adapter_proc_init(dev);
1895 
1896 	return 0;
1897 }
1898 
rtw_ndev_uninit(struct net_device * dev)1899 void rtw_ndev_uninit(struct net_device *dev)
1900 {
1901 	_adapter *adapter = rtw_netdev_priv(dev);
1902 
1903 	RTW_PRINT(FUNC_ADPT_FMT" if%d\n"
1904 		  , FUNC_ADPT_ARG(adapter), (adapter->iface_id + 1));
1905 	rtw_adapter_proc_deinit(dev);
1906 }
1907 
1908 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29))
1909 const struct net_device_ops rtw_netdev_ops = {
1910 	.ndo_init = rtw_ndev_init,
1911 	.ndo_uninit = rtw_ndev_uninit,
1912 	.ndo_open = netdev_open,
1913 	.ndo_stop = netdev_close,
1914 	.ndo_start_xmit = rtw_xmit_entry,
1915 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35))
1916 	.ndo_select_queue	= rtw_select_queue,
1917 #endif
1918 	.ndo_set_mac_address = rtw_net_set_mac_address,
1919 	.ndo_get_stats = rtw_net_get_stats,
1920 	.ndo_do_ioctl = rtw_ioctl,
1921 };
1922 #endif
1923 #ifdef CONFIG_RTL8822CS_WIFI_HDF
1924 EXPORT_SYMBOL(rtw_netdev_ops);
1925 #endif
1926 
1927 #ifndef CONFIG_RTL8822CS_WIFI_HDF
rtw_init_netdev_name(struct net_device * pnetdev,const char * ifname)1928 int rtw_init_netdev_name(struct net_device *pnetdev, const char *ifname)
1929 {
1930 #ifdef CONFIG_EASY_REPLACEMENT
1931 	_adapter *padapter = rtw_netdev_priv(pnetdev);
1932 	struct net_device	*TargetNetdev = NULL;
1933 	_adapter			*TargetAdapter = NULL;
1934 
1935 	if (padapter->bDongle == 1) {
1936 		TargetNetdev = rtw_get_same_net_ndev_by_name(pnetdev, "wlan0");
1937 		if (TargetNetdev) {
1938 			RTW_INFO("Force onboard module driver disappear !!!\n");
1939 			TargetAdapter = rtw_netdev_priv(TargetNetdev);
1940 			TargetAdapter->DriverState = DRIVER_DISAPPEAR;
1941 
1942 			padapter->pid[0] = TargetAdapter->pid[0];
1943 			padapter->pid[1] = TargetAdapter->pid[1];
1944 			padapter->pid[2] = TargetAdapter->pid[2];
1945 
1946 			dev_put(TargetNetdev);
1947 			unregister_netdev(TargetNetdev);
1948 
1949 			padapter->DriverState = DRIVER_REPLACE_DONGLE;
1950 		}
1951 	}
1952 #endif /* CONFIG_EASY_REPLACEMENT */
1953 
1954 	if (dev_alloc_name(pnetdev, ifname) < 0)
1955 		RTW_ERR("dev_alloc_name, fail!\n");
1956 
1957 	rtw_netif_carrier_off(pnetdev);
1958 	/* rtw_netif_stop_queue(pnetdev); */
1959 
1960 	return 0;
1961 }
1962 #endif
1963 
rtw_hook_if_ops(struct net_device * ndev)1964 void rtw_hook_if_ops(struct net_device *ndev)
1965 {
1966 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29))
1967 	ndev->netdev_ops = &rtw_netdev_ops;
1968 #else
1969 	ndev->init = rtw_ndev_init;
1970 	ndev->uninit = rtw_ndev_uninit;
1971 	ndev->open = netdev_open;
1972 	ndev->stop = netdev_close;
1973 	ndev->hard_start_xmit = rtw_xmit_entry;
1974 	ndev->set_mac_address = rtw_net_set_mac_address;
1975 	ndev->get_stats = rtw_net_get_stats;
1976 	ndev->do_ioctl = rtw_ioctl;
1977 #endif
1978 }
1979 
1980 #ifdef CONFIG_CONCURRENT_MODE
1981 static void rtw_hook_vir_if_ops(struct net_device *ndev);
1982 #endif
rtw_init_netdev(_adapter * old_padapter)1983 struct net_device *rtw_init_netdev(_adapter *old_padapter)
1984 {
1985 	_adapter *padapter;
1986 	struct net_device *pnetdev;
1987 
1988 	if (old_padapter != NULL) {
1989 		rtw_os_ndev_free(old_padapter);
1990 		pnetdev = rtw_alloc_etherdev_with_old_priv(sizeof(_adapter), (void *)old_padapter);
1991 	} else
1992 		pnetdev = rtw_alloc_etherdev(sizeof(_adapter));
1993 
1994 	if (!pnetdev)
1995 		return NULL;
1996 
1997 	padapter = rtw_netdev_priv(pnetdev);
1998 	padapter->pnetdev = pnetdev;
1999 
2000 #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)
2001 	SET_MODULE_OWNER(pnetdev);
2002 #endif
2003 
2004 #ifdef CONFIG_RTL8822CS_WIFI_HDF
2005 	rtw_macaddr_cfg(pnetdev->dev_addr, get_hal_mac_addr(padapter));
2006 #endif
2007 
2008 	rtw_hook_if_ops(pnetdev);
2009 #ifdef CONFIG_CONCURRENT_MODE
2010 	if (!is_primary_adapter(padapter))
2011 		rtw_hook_vir_if_ops(pnetdev);
2012 #endif /* CONFIG_CONCURRENT_MODE */
2013 
2014 
2015 #ifdef CONFIG_TCP_CSUM_OFFLOAD_TX
2016         pnetdev->features |= (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM);
2017 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)
2018         pnetdev->hw_features |= (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM);
2019 #endif
2020 #endif
2021 
2022 #ifdef CONFIG_RTW_NETIF_SG
2023         pnetdev->features |= NETIF_F_SG;
2024 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)
2025         pnetdev->hw_features |= NETIF_F_SG;
2026 #endif
2027 #endif
2028 
2029 	if ((pnetdev->features & NETIF_F_SG) && (pnetdev->features & NETIF_F_IP_CSUM)) {
2030 		pnetdev->features |= (NETIF_F_TSO | NETIF_F_GSO);
2031 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)
2032 		pnetdev->hw_features |= (NETIF_F_TSO | NETIF_F_GSO);
2033 #endif
2034 	}
2035 	/* pnetdev->tx_timeout = NULL; */
2036 	pnetdev->watchdog_timeo = HZ * 3; /* 3 second timeout */
2037 
2038 #ifdef CONFIG_WIRELESS_EXT
2039 	pnetdev->wireless_handlers = (struct iw_handler_def *)&rtw_handlers_def;
2040 #endif
2041 
2042 #ifdef WIRELESS_SPY
2043 	/* priv->wireless_data.spy_data = &priv->spy_data; */
2044 	/* pnetdev->wireless_data = &priv->wireless_data; */
2045 #endif
2046 
2047 	return pnetdev;
2048 }
2049 
rtw_os_ndev_alloc(_adapter * adapter)2050 int rtw_os_ndev_alloc(_adapter *adapter)
2051 {
2052 	int ret = _FAIL;
2053 	struct net_device *ndev = NULL;
2054 
2055 	ndev = rtw_init_netdev(adapter);
2056 	if (ndev == NULL) {
2057 		rtw_warn_on(1);
2058 		goto exit;
2059 	}
2060 #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)
2061 	SET_NETDEV_DEV(ndev, dvobj_to_dev(adapter_to_dvobj(adapter)));
2062 #endif
2063 
2064 #ifdef CONFIG_PCI_HCI
2065 	if (adapter_to_dvobj(adapter)->bdma64)
2066 		ndev->features |= NETIF_F_HIGHDMA;
2067 	ndev->irq = adapter_to_dvobj(adapter)->irq;
2068 #endif
2069 
2070 #if defined(CONFIG_IOCTL_CFG80211)
2071 	if (rtw_cfg80211_ndev_res_alloc(adapter) != _SUCCESS) {
2072 		rtw_warn_on(1);
2073 	} else
2074 #endif
2075 	ret = _SUCCESS;
2076 
2077 	if (ret != _SUCCESS && ndev)
2078 		rtw_free_netdev(ndev);
2079 exit:
2080 	return ret;
2081 }
2082 
rtw_os_ndev_free(_adapter * adapter)2083 void rtw_os_ndev_free(_adapter *adapter)
2084 {
2085 #if defined(CONFIG_IOCTL_CFG80211)
2086 	rtw_cfg80211_ndev_res_free(adapter);
2087 #endif
2088 
2089 	if (adapter->pnetdev) {
2090 		rtw_free_netdev(adapter->pnetdev);
2091 		adapter->pnetdev = NULL;
2092 	}
2093 }
2094 
2095 /* For ethtool +++ */
2096 #ifdef CONFIG_IOCTL_CFG80211
2097 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 8))
rtw_ethtool_get_drvinfo(struct net_device * dev,struct ethtool_drvinfo * info)2098 static void rtw_ethtool_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
2099 {
2100 	struct wireless_dev *wdev = NULL;
2101 	_adapter *padapter = NULL;
2102 	HAL_DATA_TYPE *hal_data = NULL;
2103 
2104 	wdev = dev->ieee80211_ptr;
2105 	if (wdev) {
2106 		strlcpy(info->driver, wiphy_dev(wdev->wiphy)->driver->name,
2107 			sizeof(info->driver));
2108 	} else {
2109 		strlcpy(info->driver, "N/A", sizeof(info->driver));
2110 	}
2111 
2112 	strlcpy(info->version, DRIVERVERSION, sizeof(info->version));
2113 
2114 	padapter = (_adapter *)rtw_netdev_priv(dev);
2115 	if (padapter) {
2116 		hal_data = GET_HAL_DATA(padapter);
2117 	}
2118 
2119 	if (hal_data) {
2120 		scnprintf(info->fw_version, sizeof(info->fw_version), "%d.%d",
2121 			  hal_data->firmware_version, hal_data->firmware_sub_version);
2122 	} else {
2123 		strlcpy(info->fw_version, "N/A", sizeof(info->fw_version));
2124 	}
2125 
2126 	strlcpy(info->bus_info, dev_name(wiphy_dev(wdev->wiphy)),
2127 		sizeof(info->bus_info));
2128 }
2129 
2130 static const char rtw_ethtool_gstrings_sta_stats[][ETH_GSTRING_LEN] = {
2131 	"rx_packets", "rx_bytes", "rx_dropped",
2132 	"tx_packets", "tx_bytes", "tx_dropped",
2133 };
2134 
2135 #define RTW_ETHTOOL_STATS_LEN	ARRAY_SIZE(rtw_ethtool_gstrings_sta_stats)
2136 
rtw_ethtool_get_sset_count(struct net_device * dev,int sset)2137 static int rtw_ethtool_get_sset_count(struct net_device *dev, int sset)
2138 {
2139 	int rv = 0;
2140 
2141 	if (sset == ETH_SS_STATS)
2142 		rv += RTW_ETHTOOL_STATS_LEN;
2143 
2144 	if (rv == 0)
2145 		return -EOPNOTSUPP;
2146 
2147 	return rv;
2148 }
2149 
rtw_ethtool_get_strings(struct net_device * dev,u32 sset,u8 * data)2150 static void rtw_ethtool_get_strings(struct net_device *dev, u32 sset, u8 *data)
2151 {
2152 	int sz_sta_stats = 0;
2153 
2154 	if (sset == ETH_SS_STATS) {
2155 		sz_sta_stats = sizeof(rtw_ethtool_gstrings_sta_stats);
2156 		memcpy(data, rtw_ethtool_gstrings_sta_stats, sz_sta_stats);
2157 	}
2158 }
2159 
rtw_ethtool_get_stats(struct net_device * dev,struct ethtool_stats * stats,u64 * data)2160 static void rtw_ethtool_get_stats(struct net_device *dev,
2161 				  struct ethtool_stats *stats,
2162 				  u64 *data)
2163 {
2164 	int i = 0;
2165 	_adapter *padapter = NULL;
2166 	struct xmit_priv *pxmitpriv = NULL;
2167 	struct recv_priv *precvpriv = NULL;
2168 
2169 	memset(data, 0, sizeof(u64) * RTW_ETHTOOL_STATS_LEN);
2170 
2171 	padapter = (_adapter *)rtw_netdev_priv(dev);
2172 	if (padapter) {
2173 		pxmitpriv = &(padapter->xmitpriv);
2174 		precvpriv = &(padapter->recvpriv);
2175 
2176 		data[i++] = precvpriv->rx_pkts;
2177 		data[i++] = precvpriv->rx_bytes;
2178 		data[i++] = precvpriv->rx_drop;
2179 
2180 		data[i++] = pxmitpriv->tx_pkts;
2181 		data[i++] = pxmitpriv->tx_bytes;
2182 		data[i++] = pxmitpriv->tx_drop;
2183 	} else {
2184 		data[i++] = 0;
2185 		data[i++] = 0;
2186 		data[i++] = 0;
2187 
2188 		data[i++] = 0;
2189 		data[i++] = 0;
2190 		data[i++] = 0;
2191 	}
2192 }
2193 
2194 static const struct ethtool_ops rtw_ethtool_ops = {
2195 	.get_drvinfo = rtw_ethtool_get_drvinfo,
2196 	.get_link = ethtool_op_get_link,
2197 	.get_strings = rtw_ethtool_get_strings,
2198 	.get_ethtool_stats = rtw_ethtool_get_stats,
2199 	.get_sset_count = rtw_ethtool_get_sset_count,
2200 };
2201 #endif // LINUX_VERSION_CODE >= 3.7.8
2202 #endif /* CONFIG_IOCTL_CFG80211 */
2203 /* For ethtool --- */
2204 
rtw_os_ndev_register(_adapter * adapter,const char * name)2205 int rtw_os_ndev_register(_adapter *adapter, const char *name)
2206 {
2207 	struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
2208 	int ret = _SUCCESS;
2209 	struct net_device *ndev = adapter->pnetdev;
2210 	u8 rtnl_lock_needed = rtw_rtnl_lock_needed(dvobj);
2211 
2212 #ifdef CONFIG_RTW_NAPI
2213 	netif_napi_add(ndev, &adapter->napi, rtw_recv_napi_poll, RTL_NAPI_WEIGHT);
2214 #endif /* CONFIG_RTW_NAPI */
2215 
2216 #if defined(CONFIG_IOCTL_CFG80211)
2217 	if (rtw_cfg80211_ndev_res_register(adapter) != _SUCCESS) {
2218 		rtw_warn_on(1);
2219 		ret = _FAIL;
2220 		goto exit;
2221 	}
2222 
2223 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 8))
2224 	netdev_set_default_ethtool_ops(ndev, &rtw_ethtool_ops);
2225 #endif /* LINUX_VERSION_CODE >= 3.7.8 */
2226 #endif
2227 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) && defined(CONFIG_PCI_HCI)
2228 	ndev->gro_flush_timeout = 100000;
2229 #endif
2230 
2231 #ifndef CONFIG_RTL8822CS_WIFI_HDF
2232 	/* alloc netdev name */
2233 	rtw_init_netdev_name(ndev, name);
2234 #endif
2235 
2236 	_rtw_memcpy(ndev->dev_addr, adapter_mac_addr(adapter), ETH_ALEN);
2237 
2238 #ifndef CONFIG_RTL8822CS_WIFI_HDF
2239 	/* Tell the network stack we exist */
2240 
2241 	if (rtnl_lock_needed)
2242 		ret = (register_netdev(ndev) == 0) ? _SUCCESS : _FAIL;
2243 	else
2244 		ret = (register_netdevice(ndev) == 0) ? _SUCCESS : _FAIL;
2245 #endif
2246 
2247 	if (ret == _SUCCESS)
2248 		adapter->registered = 1;
2249 	else
2250 		RTW_INFO(FUNC_NDEV_FMT" if%d Failed!\n", FUNC_NDEV_ARG(ndev), (adapter->iface_id + 1));
2251 
2252 #if defined(CONFIG_IOCTL_CFG80211)
2253 	if (ret != _SUCCESS) {
2254 		rtw_cfg80211_ndev_res_unregister(adapter);
2255 		#if !defined(RTW_SINGLE_WIPHY)
2256 		rtw_wiphy_unregister(adapter_to_wiphy(adapter));
2257 		#endif
2258 	}
2259 #endif
2260 
2261 #if defined(CONFIG_IOCTL_CFG80211)
2262 exit:
2263 #endif
2264 #ifdef CONFIG_RTW_NAPI
2265 	if (ret != _SUCCESS)
2266 		netif_napi_del(&adapter->napi);
2267 #endif /* CONFIG_RTW_NAPI */
2268 
2269 	return ret;
2270 }
2271 
rtw_os_ndev_unregister(_adapter * adapter)2272 void rtw_os_ndev_unregister(_adapter *adapter)
2273 {
2274 	struct net_device *netdev = NULL;
2275 
2276 	if (adapter == NULL || adapter->registered == 0)
2277 		return;
2278 
2279 	adapter->ndev_unregistering = 1;
2280 
2281 	netdev = adapter->pnetdev;
2282 
2283 #if defined(CONFIG_IOCTL_CFG80211)
2284 	rtw_cfg80211_ndev_res_unregister(adapter);
2285 #endif
2286 
2287 #ifndef CONFIG_RTL8822CS_WIFI_HDF
2288 	if ((adapter->DriverState != DRIVER_DISAPPEAR) && netdev) {
2289 		struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
2290 		u8 rtnl_lock_needed = rtw_rtnl_lock_needed(dvobj);
2291 
2292 		if (rtnl_lock_needed)
2293 			unregister_netdev(netdev);
2294 		else
2295 			unregister_netdevice(netdev);
2296 	}
2297 
2298 #if defined(CONFIG_IOCTL_CFG80211) && !defined(RTW_SINGLE_WIPHY)
2299 #ifdef CONFIG_RFKILL_POLL
2300 	rtw_cfg80211_deinit_rfkill(adapter_to_wiphy(adapter));
2301 #endif
2302 	rtw_wiphy_unregister(adapter_to_wiphy(adapter));
2303 #endif
2304 #endif
2305 
2306 #ifdef CONFIG_RTW_NAPI
2307 	if (adapter->napi_state == NAPI_ENABLE) {
2308 		napi_disable(&adapter->napi);
2309 		adapter->napi_state = NAPI_DISABLE;
2310 	}
2311 	netif_napi_del(&adapter->napi);
2312 #endif /* CONFIG_RTW_NAPI */
2313 
2314 	adapter->registered = 0;
2315 	adapter->ndev_unregistering = 0;
2316 }
2317 
2318 /**
2319  * rtw_os_ndev_init - Allocate and register OS layer net device and relating structures for @adapter
2320  * @adapter: the adapter on which this function applies
2321  * @name: the requesting net device name
2322  *
2323  * Returns:
2324  * _SUCCESS or _FAIL
2325  */
rtw_os_ndev_init(_adapter * adapter,const char * name)2326 int rtw_os_ndev_init(_adapter *adapter, const char *name)
2327 {
2328 	int ret = _FAIL;
2329 
2330 	if (rtw_os_ndev_alloc(adapter) != _SUCCESS)
2331 		goto exit;
2332 
2333 	if (rtw_os_ndev_register(adapter, name) != _SUCCESS)
2334 		goto os_ndev_free;
2335 
2336 	ret = _SUCCESS;
2337 
2338 os_ndev_free:
2339 	if (ret != _SUCCESS)
2340 		rtw_os_ndev_free(adapter);
2341 exit:
2342 	return ret;
2343 }
2344 
2345 /**
2346  * rtw_os_ndev_deinit - Unregister and free OS layer net device and relating structures for @adapter
2347  * @adapter: the adapter on which this function applies
2348  */
rtw_os_ndev_deinit(_adapter * adapter)2349 void rtw_os_ndev_deinit(_adapter *adapter)
2350 {
2351 	rtw_os_ndev_unregister(adapter);
2352 	rtw_os_ndev_free(adapter);
2353 }
2354 
rtw_os_ndevs_alloc(struct dvobj_priv * dvobj)2355 int rtw_os_ndevs_alloc(struct dvobj_priv *dvobj)
2356 {
2357 	int i, status = _SUCCESS;
2358 	_adapter *adapter;
2359 
2360 #if defined(CONFIG_IOCTL_CFG80211)
2361 	if (rtw_cfg80211_dev_res_alloc(dvobj) != _SUCCESS) {
2362 		rtw_warn_on(1);
2363 		return _FAIL;
2364 	}
2365 #endif
2366 
2367 	for (i = 0; i < dvobj->iface_nums; i++) {
2368 
2369 		if (i >= CONFIG_IFACE_NUMBER) {
2370 			RTW_ERR("%s %d >= CONFIG_IFACE_NUMBER(%d)\n", __func__, i, CONFIG_IFACE_NUMBER);
2371 			rtw_warn_on(1);
2372 			continue;
2373 		}
2374 
2375 		adapter = dvobj->padapters[i];
2376 		if (adapter && !adapter->pnetdev) {
2377 
2378 			#ifdef CONFIG_RTW_DYNAMIC_NDEV
2379 			if (!is_primary_adapter(adapter))
2380 				continue;
2381 			#endif
2382 
2383 			status = rtw_os_ndev_alloc(adapter);
2384 			if (status != _SUCCESS) {
2385 				rtw_warn_on(1);
2386 				break;
2387 			}
2388 		}
2389 	}
2390 
2391 	if (status != _SUCCESS) {
2392 		for (; i >= 0; i--) {
2393 			adapter = dvobj->padapters[i];
2394 			if (adapter && adapter->pnetdev)
2395 				rtw_os_ndev_free(adapter);
2396 		}
2397 	}
2398 
2399 #if defined(CONFIG_IOCTL_CFG80211)
2400 	if (status != _SUCCESS)
2401 		rtw_cfg80211_dev_res_free(dvobj);
2402 #endif
2403 
2404 	return status;
2405 }
2406 
rtw_os_ndevs_free(struct dvobj_priv * dvobj)2407 void rtw_os_ndevs_free(struct dvobj_priv *dvobj)
2408 {
2409 	int i;
2410 	_adapter *adapter = NULL;
2411 
2412 	for (i = 0; i < dvobj->iface_nums; i++) {
2413 
2414 		if (i >= CONFIG_IFACE_NUMBER) {
2415 			RTW_ERR("%s %d >= CONFIG_IFACE_NUMBER(%d)\n", __func__, i, CONFIG_IFACE_NUMBER);
2416 			rtw_warn_on(1);
2417 			continue;
2418 		}
2419 
2420 		adapter = dvobj->padapters[i];
2421 
2422 		if (adapter == NULL)
2423 			continue;
2424 
2425 		rtw_os_ndev_free(adapter);
2426 	}
2427 
2428 #if defined(CONFIG_IOCTL_CFG80211)
2429 	rtw_cfg80211_dev_res_free(dvobj);
2430 #endif
2431 }
2432 
rtw_start_drv_threads(_adapter * padapter)2433 u32 rtw_start_drv_threads(_adapter *padapter)
2434 {
2435 	u32 _status = _SUCCESS;
2436 
2437 	RTW_INFO(FUNC_ADPT_FMT" enter\n", FUNC_ADPT_ARG(padapter));
2438 
2439 #ifdef CONFIG_XMIT_THREAD_MODE
2440 #if defined(CONFIG_SDIO_HCI)
2441 	if (is_primary_adapter(padapter))
2442 #endif
2443 	{
2444 		if (padapter->xmitThread == NULL) {
2445 			RTW_INFO(FUNC_ADPT_FMT " start RTW_XMIT_THREAD\n", FUNC_ADPT_ARG(padapter));
2446 			padapter->xmitThread = kthread_run(rtw_xmit_thread, padapter, "RTW_XMIT_THREAD");
2447 			if (IS_ERR(padapter->xmitThread)) {
2448 				padapter->xmitThread = NULL;
2449 				_status = _FAIL;
2450 			}
2451 		}
2452 	}
2453 #endif /* #ifdef CONFIG_XMIT_THREAD_MODE */
2454 
2455 #ifdef CONFIG_RECV_THREAD_MODE
2456 	if (is_primary_adapter(padapter)) {
2457 		if (padapter->recvThread == NULL) {
2458 			RTW_INFO(FUNC_ADPT_FMT " start RTW_RECV_THREAD\n", FUNC_ADPT_ARG(padapter));
2459 			padapter->recvThread = kthread_run(rtw_recv_thread, padapter, "RTW_RECV_THREAD");
2460 			if (IS_ERR(padapter->recvThread)) {
2461 				padapter->recvThread = NULL;
2462 				_status = _FAIL;
2463 			}
2464 		}
2465 	}
2466 #endif
2467 
2468 	if (is_primary_adapter(padapter)) {
2469 		if (padapter->cmdThread == NULL) {
2470 			RTW_INFO(FUNC_ADPT_FMT " start RTW_CMD_THREAD\n", FUNC_ADPT_ARG(padapter));
2471 			padapter->cmdThread = kthread_run(rtw_cmd_thread, padapter, "RTW_CMD_THREAD");
2472 			if (IS_ERR(padapter->cmdThread)) {
2473 				padapter->cmdThread = NULL;
2474 				_status = _FAIL;
2475 			}
2476 			else
2477 				_rtw_down_sema(&padapter->cmdpriv.start_cmdthread_sema); /* wait for cmd_thread to run */
2478 		}
2479 	}
2480 
2481 
2482 #ifdef CONFIG_EVENT_THREAD_MODE
2483 	if (padapter->evtThread == NULL) {
2484 		RTW_INFO(FUNC_ADPT_FMT " start RTW_EVENT_THREAD\n", FUNC_ADPT_ARG(padapter));
2485 		padapter->evtThread = kthread_run(event_thread, padapter, "RTW_EVENT_THREAD");
2486 		if (IS_ERR(padapter->evtThread)) {
2487 			padapter->evtThread = NULL;
2488 			_status = _FAIL;
2489 		}
2490 	}
2491 #endif
2492 
2493 	rtw_hal_start_thread(padapter);
2494 	return _status;
2495 
2496 }
2497 
rtw_stop_drv_threads(_adapter * padapter)2498 void rtw_stop_drv_threads(_adapter *padapter)
2499 {
2500 	RTW_INFO(FUNC_ADPT_FMT" enter\n", FUNC_ADPT_ARG(padapter));
2501 	if (is_primary_adapter(padapter))
2502 		rtw_stop_cmd_thread(padapter);
2503 
2504 #ifdef CONFIG_EVENT_THREAD_MODE
2505 	if (padapter->evtThread) {
2506 		_rtw_up_sema(&padapter->evtpriv.evt_notify);
2507 		rtw_thread_stop(padapter->evtThread);
2508 		padapter->evtThread = NULL;
2509 	}
2510 #endif
2511 
2512 #ifdef CONFIG_XMIT_THREAD_MODE
2513 	/* Below is to termindate tx_thread... */
2514 #if defined(CONFIG_SDIO_HCI)
2515 	/* Only wake-up primary adapter */
2516 	if (is_primary_adapter(padapter))
2517 #endif  /*SDIO_HCI */
2518 	{
2519 		if (padapter->xmitThread) {
2520 			_rtw_up_sema(&padapter->xmitpriv.xmit_sema);
2521 			rtw_thread_stop(padapter->xmitThread);
2522 			padapter->xmitThread = NULL;
2523 		}
2524 	}
2525 #endif
2526 
2527 #ifdef CONFIG_RECV_THREAD_MODE
2528 	if (is_primary_adapter(padapter) && padapter->recvThread) {
2529 		/* Below is to termindate rx_thread... */
2530 		_rtw_up_sema(&padapter->recvpriv.recv_sema);
2531 		rtw_thread_stop(padapter->recvThread);
2532 		padapter->recvThread = NULL;
2533 	}
2534 #endif
2535 
2536 	rtw_hal_stop_thread(padapter);
2537 }
2538 
rtw_init_default_value(_adapter * padapter)2539 u8 rtw_init_default_value(_adapter *padapter)
2540 {
2541 	u8 ret  = _SUCCESS;
2542 	struct registry_priv *pregistrypriv = &padapter->registrypriv;
2543 	struct xmit_priv	*pxmitpriv = &padapter->xmitpriv;
2544 	struct security_priv *psecuritypriv = &padapter->securitypriv;
2545 
2546 	/* xmit_priv */
2547 	pxmitpriv->vcs_setting = pregistrypriv->vrtl_carrier_sense;
2548 	pxmitpriv->vcs = pregistrypriv->vcs_type;
2549 	pxmitpriv->vcs_type = pregistrypriv->vcs_type;
2550 	/* pxmitpriv->rts_thresh = pregistrypriv->rts_thresh; */
2551 	pxmitpriv->frag_len = pregistrypriv->frag_thresh;
2552 
2553 	/* security_priv */
2554 	/* rtw_get_encrypt_decrypt_from_registrypriv(padapter); */
2555 	psecuritypriv->binstallGrpkey = _FAIL;
2556 #ifdef CONFIG_GTK_OL
2557 	psecuritypriv->binstallKCK_KEK = _FAIL;
2558 #endif /* CONFIG_GTK_OL */
2559 	psecuritypriv->sw_encrypt = pregistrypriv->software_encrypt;
2560 	psecuritypriv->sw_decrypt = pregistrypriv->software_decrypt;
2561 
2562 	psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; /* open system */
2563 	psecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_;
2564 
2565 	psecuritypriv->dot11PrivacyKeyIndex = 0;
2566 
2567 	psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_;
2568 	psecuritypriv->dot118021XGrpKeyid = 1;
2569 
2570 	psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen;
2571 	psecuritypriv->ndisencryptstatus = Ndis802_11WEPDisabled;
2572 	psecuritypriv->dot118021x_bmc_cam_id = INVALID_SEC_MAC_CAM_ID;
2573 
2574 
2575 	/* pwrctrl_priv */
2576 
2577 
2578 	/* registry_priv */
2579 	rtw_init_registrypriv_dev_network(padapter);
2580 	rtw_update_registrypriv_dev_network(padapter);
2581 
2582 
2583 	/* hal_priv */
2584 	rtw_hal_def_value_init(padapter);
2585 
2586 #ifdef CONFIG_MCC_MODE
2587 	/* MCC parameter */
2588 	rtw_hal_mcc_parameter_init(padapter);
2589 #endif /* CONFIG_MCC_MODE */
2590 
2591 	/* misc. */
2592 	RTW_ENABLE_FUNC(padapter, DF_RX_BIT);
2593 	RTW_ENABLE_FUNC(padapter, DF_TX_BIT);
2594 	padapter->bLinkInfoDump = 0;
2595 	padapter->bNotifyChannelChange = _FALSE;
2596 #ifdef CONFIG_P2P
2597 	padapter->bShowGetP2PState = 1;
2598 #endif
2599 
2600 	/* for debug purpose */
2601 	padapter->fix_rate = 0xFF;
2602 	padapter->data_fb = 0;
2603 	padapter->fix_bw = 0xFF;
2604 	padapter->power_offset = 0;
2605 	padapter->rsvd_page_offset = 0;
2606 	padapter->rsvd_page_num = 0;
2607 #ifdef CONFIG_AP_MODE
2608 	padapter->bmc_tx_rate = pregistrypriv->bmc_tx_rate;
2609 	#if CONFIG_RTW_AP_DATA_BMC_TO_UC
2610 	padapter->b2u_flags_ap_src = pregistrypriv->ap_src_b2u_flags;
2611 	padapter->b2u_flags_ap_fwd = pregistrypriv->ap_fwd_b2u_flags;
2612 	#endif
2613 #endif
2614 	padapter->driver_tx_bw_mode = pregistrypriv->tx_bw_mode;
2615 
2616 	padapter->driver_ampdu_spacing = 0xFF;
2617 	padapter->driver_rx_ampdu_factor =  0xFF;
2618 	padapter->driver_rx_ampdu_spacing = 0xFF;
2619 	padapter->fix_rx_ampdu_accept = RX_AMPDU_ACCEPT_INVALID;
2620 	padapter->fix_rx_ampdu_size = RX_AMPDU_SIZE_INVALID;
2621 #ifdef CONFIG_TX_AMSDU
2622 	padapter->tx_amsdu = 2;
2623 	padapter->tx_amsdu_rate = 400;
2624 #endif
2625 	padapter->driver_tx_max_agg_num = 0xFF;
2626 #ifdef DBG_RX_COUNTER_DUMP
2627 	padapter->dump_rx_cnt_mode = 0;
2628 	padapter->drv_rx_cnt_ok = 0;
2629 	padapter->drv_rx_cnt_crcerror = 0;
2630 	padapter->drv_rx_cnt_drop = 0;
2631 #endif
2632 #ifdef CONFIG_RTW_NAPI
2633 	padapter->napi_state = NAPI_DISABLE;
2634 #endif
2635 
2636 #ifdef CONFIG_RTW_ACS
2637 	if (pregistrypriv->acs_mode)
2638 		rtw_acs_start(padapter);
2639 	else
2640 		rtw_acs_stop(padapter);
2641 #endif
2642 #ifdef CONFIG_BACKGROUND_NOISE_MONITOR
2643 	if (pregistrypriv->nm_mode)
2644 		rtw_nm_enable(padapter);
2645 	else
2646 		rtw_nm_disable(padapter);
2647 #endif
2648 
2649 #ifdef CONFIG_RTW_TOKEN_BASED_XMIT
2650 	ATOMIC_SET(&padapter->tbtx_tx_pause, _FALSE);
2651 	ATOMIC_SET(&padapter->tbtx_remove_tx_pause, _FALSE);
2652 	padapter->tbtx_capability = _TRUE;
2653 #endif
2654 
2655 	return ret;
2656 }
2657 #ifdef CONFIG_CLIENT_PORT_CFG
2658 extern void rtw_clt_port_init(struct clt_port_t  *cltp);
2659 extern void rtw_clt_port_deinit(struct clt_port_t  *cltp);
2660 #endif
2661 
devobj_init(void)2662 struct dvobj_priv *devobj_init(void)
2663 {
2664 	struct dvobj_priv *pdvobj = NULL;
2665 
2666 	rtw_dbg_mem_init();
2667 
2668 	pdvobj = (struct dvobj_priv *)rtw_zmalloc(sizeof(*pdvobj));
2669 	if (pdvobj == NULL)
2670 		return NULL;
2671 
2672 	_rtw_mutex_init(&pdvobj->hw_init_mutex);
2673 	_rtw_mutex_init(&pdvobj->h2c_fwcmd_mutex);
2674 	_rtw_mutex_init(&pdvobj->setch_mutex);
2675 	_rtw_mutex_init(&pdvobj->setbw_mutex);
2676 	_rtw_mutex_init(&pdvobj->rf_read_reg_mutex);
2677 	_rtw_mutex_init(&pdvobj->ioctrl_mutex);
2678 #ifdef CONFIG_SDIO_INDIRECT_ACCESS
2679 	_rtw_mutex_init(&pdvobj->sd_indirect_access_mutex);
2680 #endif
2681 #ifdef CONFIG_SYSON_INDIRECT_ACCESS
2682 	_rtw_mutex_init(&pdvobj->syson_indirect_access_mutex);
2683 #endif
2684 #ifdef CONFIG_RTW_CUSTOMER_STR
2685 	_rtw_mutex_init(&pdvobj->customer_str_mutex);
2686 	_rtw_memset(pdvobj->customer_str, 0xFF, RTW_CUSTOMER_STR_LEN);
2687 #endif
2688 #ifdef CONFIG_PROTSEL_PORT
2689 	_rtw_mutex_init(&pdvobj->protsel_port.mutex);
2690 #endif
2691 #ifdef CONFIG_PROTSEL_ATIMDTIM
2692 	_rtw_mutex_init(&pdvobj->protsel_atimdtim.mutex);
2693 #endif
2694 #ifdef CONFIG_PROTSEL_MACSLEEP
2695 	_rtw_mutex_init(&pdvobj->protsel_macsleep.mutex);
2696 #endif
2697 
2698 	pdvobj->processing_dev_remove = _FALSE;
2699 
2700 	ATOMIC_SET(&pdvobj->disable_func, 0);
2701 
2702 	rtw_macid_ctl_init(&pdvobj->macid_ctl);
2703 #ifdef CONFIG_CLIENT_PORT_CFG
2704 	rtw_clt_port_init(&pdvobj->clt_port);
2705 #endif
2706 	_rtw_spinlock_init(&pdvobj->cam_ctl.lock);
2707 	_rtw_mutex_init(&pdvobj->cam_ctl.sec_cam_access_mutex);
2708 #if defined(CONFIG_PLATFORM_RTK129X) && defined(CONFIG_PCI_HCI)
2709 	_rtw_spinlock_init(&pdvobj->io_reg_lock);
2710 #endif
2711 #ifdef CONFIG_MBSSID_CAM
2712 	rtw_mbid_cam_init(pdvobj);
2713 #endif
2714 
2715 #ifdef CONFIG_AP_MODE
2716 	#ifdef CONFIG_SUPPORT_MULTI_BCN
2717 	pdvobj->nr_ap_if = 0;
2718 	pdvobj->inter_bcn_space = DEFAULT_BCN_INTERVAL; /* default value is equal to the default beacon_interval (100ms) */
2719 	_rtw_init_queue(&pdvobj->ap_if_q);
2720 	pdvobj->vap_map = 0;
2721 	#endif /*CONFIG_SUPPORT_MULTI_BCN*/
2722 	#ifdef CONFIG_SWTIMER_BASED_TXBCN
2723 	rtw_init_timer(&(pdvobj->txbcn_timer), NULL, tx_beacon_timer_handlder, pdvobj);
2724 	#endif
2725 #endif
2726 
2727 	rtw_init_timer(&(pdvobj->dynamic_chk_timer), NULL, rtw_dynamic_check_timer_handlder, pdvobj);
2728 	rtw_init_timer(&(pdvobj->periodic_tsf_update_end_timer), NULL, rtw_hal_periodic_tsf_update_end_timer_hdl, pdvobj);
2729 
2730 #ifdef CONFIG_MCC_MODE
2731 	_rtw_mutex_init(&(pdvobj->mcc_objpriv.mcc_mutex));
2732 	_rtw_mutex_init(&(pdvobj->mcc_objpriv.mcc_tsf_req_mutex));
2733 	_rtw_mutex_init(&(pdvobj->mcc_objpriv.mcc_dbg_reg_mutex));
2734 	_rtw_spinlock_init(&pdvobj->mcc_objpriv.mcc_lock);
2735 #endif /* CONFIG_MCC_MODE */
2736 
2737 #ifdef CONFIG_RTW_NAPI_DYNAMIC
2738 	pdvobj->en_napi_dynamic = 0;
2739 #endif /* CONFIG_RTW_NAPI_DYNAMIC */
2740 
2741 
2742 #ifdef CONFIG_RTW_TPT_MODE
2743 	pdvobj->tpt_mode = 0;
2744 	pdvobj->edca_be_ul = 0x5ea42b;
2745 	pdvobj->edca_be_dl = 0x00a42b;
2746 #endif
2747 	pdvobj->scan_deny = _FALSE;
2748 
2749 	/* wpas type default from w1.fi */
2750 	pdvobj->wpas_type = RTW_WPAS_W1FI;
2751 
2752 	return pdvobj;
2753 
2754 }
2755 
devobj_deinit(struct dvobj_priv * pdvobj)2756 void devobj_deinit(struct dvobj_priv *pdvobj)
2757 {
2758 	if (!pdvobj)
2759 		return;
2760 
2761 	/* TODO: use rtw_os_ndevs_deinit instead at the first stage of driver's dev deinit function */
2762 #if defined(CONFIG_IOCTL_CFG80211)
2763 	rtw_cfg80211_dev_res_free(pdvobj);
2764 #endif
2765 
2766 #ifdef CONFIG_MCC_MODE
2767 	_rtw_mutex_free(&(pdvobj->mcc_objpriv.mcc_mutex));
2768 	_rtw_mutex_free(&(pdvobj->mcc_objpriv.mcc_tsf_req_mutex));
2769 	_rtw_mutex_free(&(pdvobj->mcc_objpriv.mcc_dbg_reg_mutex));
2770 	_rtw_spinlock_free(&pdvobj->mcc_objpriv.mcc_lock);
2771 #endif /* CONFIG_MCC_MODE */
2772 
2773 	_rtw_mutex_free(&pdvobj->hw_init_mutex);
2774 	_rtw_mutex_free(&pdvobj->h2c_fwcmd_mutex);
2775 
2776 #ifdef CONFIG_RTW_CUSTOMER_STR
2777 	_rtw_mutex_free(&pdvobj->customer_str_mutex);
2778 #endif
2779 #ifdef CONFIG_PROTSEL_PORT
2780 	_rtw_mutex_free(&pdvobj->protsel_port.mutex);
2781 #endif
2782 #ifdef CONFIG_PROTSEL_ATIMDTIM
2783 	_rtw_mutex_free(&pdvobj->protsel_atimdtim.mutex);
2784 #endif
2785 #ifdef CONFIG_PROTSEL_MACSLEEP
2786 	_rtw_mutex_free(&pdvobj->protsel_macsleep.mutex);
2787 #endif
2788 
2789 	_rtw_mutex_free(&pdvobj->setch_mutex);
2790 	_rtw_mutex_free(&pdvobj->setbw_mutex);
2791 	_rtw_mutex_free(&pdvobj->rf_read_reg_mutex);
2792 	_rtw_mutex_free(&pdvobj->ioctrl_mutex);
2793 #ifdef CONFIG_SDIO_INDIRECT_ACCESS
2794 	_rtw_mutex_free(&pdvobj->sd_indirect_access_mutex);
2795 #endif
2796 #ifdef CONFIG_SYSON_INDIRECT_ACCESS
2797 	_rtw_mutex_free(&pdvobj->syson_indirect_access_mutex);
2798 #endif
2799 
2800 	rtw_macid_ctl_deinit(&pdvobj->macid_ctl);
2801 #ifdef CONFIG_CLIENT_PORT_CFG
2802 	rtw_clt_port_deinit(&pdvobj->clt_port);
2803 #endif
2804 
2805 	_rtw_spinlock_free(&pdvobj->cam_ctl.lock);
2806 	_rtw_mutex_free(&pdvobj->cam_ctl.sec_cam_access_mutex);
2807 
2808 #if defined(CONFIG_PLATFORM_RTK129X) && defined(CONFIG_PCI_HCI)
2809 	_rtw_spinlock_free(&pdvobj->io_reg_lock);
2810 #endif
2811 #ifdef CONFIG_MBSSID_CAM
2812 	rtw_mbid_cam_deinit(pdvobj);
2813 #endif
2814 #ifdef CONFIG_SUPPORT_MULTI_BCN
2815 	_rtw_spinlock_free(&(pdvobj->ap_if_q.lock));
2816 #endif
2817 	rtw_mfree((u8 *)pdvobj, sizeof(*pdvobj));
2818 
2819 	rtw_dbg_mem_deinit();
2820 }
2821 
rtw_rtnl_lock_needed(struct dvobj_priv * dvobj)2822 inline u8 rtw_rtnl_lock_needed(struct dvobj_priv *dvobj)
2823 {
2824 	if (dvobj->rtnl_lock_holder && dvobj->rtnl_lock_holder == current)
2825 		return 0;
2826 	return 1;
2827 }
2828 
2829 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 26))
rtnl_is_locked(void)2830 static inline int rtnl_is_locked(void)
2831 {
2832 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 17))
2833 	if (unlikely(rtnl_trylock())) {
2834 		rtnl_unlock();
2835 #else
2836 	if (unlikely(down_trylock(&rtnl_sem) == 0)) {
2837 		up(&rtnl_sem);
2838 #endif
2839 		return 0;
2840 	}
2841 	return 1;
2842 }
2843 #endif
2844 
2845 inline void rtw_set_rtnl_lock_holder(struct dvobj_priv *dvobj, _thread_hdl_ thd_hdl)
2846 {
2847 	rtw_warn_on(!rtnl_is_locked());
2848 
2849 	if (!thd_hdl || rtnl_is_locked())
2850 		dvobj->rtnl_lock_holder = thd_hdl;
2851 
2852 	if (dvobj->rtnl_lock_holder && 0)
2853 		RTW_INFO("rtnl_lock_holder: %s:%d\n", current->comm, current->pid);
2854 }
2855 
2856 u8 rtw_reset_drv_sw(_adapter *padapter)
2857 {
2858 	u8	ret8 = _SUCCESS;
2859 	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
2860 	struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);
2861 
2862 	/* hal_priv */
2863 	rtw_hal_def_value_init(padapter);
2864 
2865 	RTW_ENABLE_FUNC(padapter, DF_RX_BIT);
2866 	RTW_ENABLE_FUNC(padapter, DF_TX_BIT);
2867 
2868 	padapter->bLinkInfoDump = 0;
2869 
2870 	padapter->xmitpriv.tx_pkts = 0;
2871 	padapter->recvpriv.rx_pkts = 0;
2872 
2873 	pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE;
2874 
2875 	/* pmlmepriv->LinkDetectInfo.TrafficBusyState = _FALSE; */
2876 	pmlmepriv->LinkDetectInfo.TrafficTransitionCount = 0;
2877 	pmlmepriv->LinkDetectInfo.LowPowerTransitionCount = 0;
2878 
2879 	_clr_fwstate_(pmlmepriv, WIFI_UNDER_SURVEY | WIFI_UNDER_LINKING);
2880 
2881 #ifdef DBG_CONFIG_ERROR_DETECT
2882 	if (is_primary_adapter(padapter))
2883 		rtw_hal_sreset_reset_value(padapter);
2884 #endif
2885 	pwrctrlpriv->pwr_state_check_cnts = 0;
2886 
2887 	/* mlmeextpriv */
2888 	mlmeext_set_scan_state(&padapter->mlmeextpriv, SCAN_DISABLE);
2889 
2890 #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
2891 	rtw_set_signal_stat_timer(&padapter->recvpriv);
2892 #endif
2893 
2894 	return ret8;
2895 }
2896 
2897 
2898 u8 rtw_init_drv_sw(_adapter *padapter)
2899 {
2900 	u8	ret8 = _SUCCESS;
2901 
2902 #ifdef CONFIG_RTW_CFGVENDOR_RANDOM_MAC_OUI
2903 	struct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(padapter);
2904 #endif
2905 
2906 	#if defined(CONFIG_AP_MODE) && defined(CONFIG_SUPPORT_MULTI_BCN)
2907 	_rtw_init_listhead(&padapter->list);
2908 	#ifdef CONFIG_FW_HANDLE_TXBCN
2909 	padapter->vap_id = CONFIG_LIMITED_AP_NUM;
2910 	if (is_primary_adapter(padapter))
2911 		adapter_to_dvobj(padapter)->vap_tbtt_rpt_map = adapter_to_regsty(padapter)->fw_tbtt_rpt;
2912 	#endif
2913 	#endif
2914 
2915 	#ifdef CONFIG_CLIENT_PORT_CFG
2916 	padapter->client_id = MAX_CLIENT_PORT_NUM;
2917 	padapter->client_port = CLT_PORT_INVALID;
2918 	#endif
2919 
2920 	if (is_primary_adapter(padapter)) {
2921 		struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
2922 		struct hal_spec_t *hal_spec = GET_HAL_SPEC(padapter);
2923 
2924 		dvobj->macid_ctl.num = rtw_min(hal_spec->macid_num, MACID_NUM_SW_LIMIT);
2925 		dvobj->macid_ctl.macid_cap = hal_spec->macid_cap;
2926 		dvobj->macid_ctl.macid_txrpt = hal_spec->macid_txrpt;
2927 		dvobj->macid_ctl.macid_txrpt_pgsz = hal_spec->macid_txrpt_pgsz;
2928 		dvobj->cam_ctl.sec_cap = hal_spec->sec_cap;
2929 		dvobj->cam_ctl.num = rtw_min(hal_spec->sec_cam_ent_num, SEC_CAM_ENT_NUM_SW_LIMIT);
2930 
2931 		dvobj->wow_ctl.wow_cap = hal_spec->wow_cap;
2932 
2933 		#ifdef CONFIG_SDIO_TX_ENABLE_AVAL_INT
2934 		dvobj->tx_aval_int_thr_mode = 2; /*setting by max tx length*/
2935 		dvobj->tx_aval_int_thr_value = 0;
2936 		#endif /*CONFIG_SDIO_TX_ENABLE_AVAL_INT*/
2937 
2938 		#if CONFIG_TX_AC_LIFETIME
2939 		{
2940 			struct registry_priv *regsty = adapter_to_regsty(padapter);
2941 			int i;
2942 
2943 			dvobj->tx_aclt_flags = regsty->tx_aclt_flags;
2944 			for (i = 0; i < TX_ACLT_CONF_NUM; i++) {
2945 				dvobj->tx_aclt_confs[i].en = regsty->tx_aclt_confs[i].en;
2946 				dvobj->tx_aclt_confs[i].vo_vi
2947 					= regsty->tx_aclt_confs[i].vo_vi / (hal_spec->tx_aclt_unit_factor * 32);
2948 				if (dvobj->tx_aclt_confs[i].vo_vi > 0xFFFF)
2949 					dvobj->tx_aclt_confs[i].vo_vi = 0xFFFF;
2950 				dvobj->tx_aclt_confs[i].be_bk
2951 					= regsty->tx_aclt_confs[i].be_bk / (hal_spec->tx_aclt_unit_factor * 32);
2952 				if (dvobj->tx_aclt_confs[i].be_bk > 0xFFFF)
2953 					dvobj->tx_aclt_confs[i].be_bk = 0xFFFF;
2954 			}
2955 
2956 			dvobj->tx_aclt_force_val.en = 0xFF;
2957 		}
2958 		#endif
2959 		#if defined (CONFIG_CONCURRENT_MODE)  && defined (CONFIG_TSF_SYNC)
2960 		dvobj->sync_tsfr_counter = 0x0;
2961 		#endif
2962 	}
2963 
2964 	ret8 = rtw_init_default_value(padapter);
2965 
2966 	if ((rtw_init_cmd_priv(&padapter->cmdpriv)) == _FAIL) {
2967 		ret8 = _FAIL;
2968 		goto exit;
2969 	}
2970 
2971 	padapter->cmdpriv.padapter = padapter;
2972 
2973 	if ((rtw_init_evt_priv(&padapter->evtpriv)) == _FAIL) {
2974 		ret8 = _FAIL;
2975 		goto exit;
2976 	}
2977 
2978 	if (is_primary_adapter(padapter)) {
2979 		if (rtw_hal_rfpath_init(padapter) == _FAIL) {
2980 			ret8 = _FAIL;
2981 			goto exit;
2982 		}
2983 		if (rtw_hal_trxnss_init(padapter) == _FAIL) {
2984 			ret8 = _FAIL;
2985 			goto exit;
2986 		}
2987 		if (rtw_hal_runtime_trx_path_decision(padapter) == _FAIL) {
2988 			ret8 = _FAIL;
2989 			goto exit;
2990 		}
2991 		if (rtw_rfctl_init(padapter) == _FAIL) {
2992 			ret8 = _FAIL;
2993 			goto exit;
2994 		}
2995 	}
2996 
2997 	if (rtw_init_mlme_priv(padapter) == _FAIL) {
2998 		ret8 = _FAIL;
2999 		goto exit;
3000 	}
3001 
3002 #if (defined(CONFIG_P2P) && defined(CONFIG_CONCURRENT_MODE)) || defined(CONFIG_IOCTL_CFG80211)
3003 	rtw_init_roch_info(padapter);
3004 #endif
3005 
3006 #ifdef CONFIG_P2P
3007 	rtw_init_wifidirect_timers(padapter);
3008 	init_wifidirect_info(padapter, P2P_ROLE_DISABLE);
3009 	reset_global_wifidirect_info(padapter);
3010 #ifdef CONFIG_WFD
3011 	if (rtw_init_wifi_display_info(padapter) == _FAIL)
3012 		RTW_ERR("Can't init init_wifi_display_info\n");
3013 #endif
3014 #endif /* CONFIG_P2P */
3015 
3016 	if (init_mlme_ext_priv(padapter) == _FAIL) {
3017 		ret8 = _FAIL;
3018 		goto exit;
3019 	}
3020 
3021 #ifdef CONFIG_TDLS
3022 	if (rtw_init_tdls_info(padapter) == _FAIL) {
3023 		RTW_INFO("Can't rtw_init_tdls_info\n");
3024 		ret8 = _FAIL;
3025 		goto exit;
3026 	}
3027 #endif /* CONFIG_TDLS */
3028 
3029 #ifdef CONFIG_RTW_MESH
3030 	rtw_mesh_cfg_init(padapter);
3031 #endif
3032 
3033 	if (_rtw_init_xmit_priv(&padapter->xmitpriv, padapter) == _FAIL) {
3034 		RTW_INFO("Can't _rtw_init_xmit_priv\n");
3035 		ret8 = _FAIL;
3036 		goto exit;
3037 	}
3038 
3039 	if (_rtw_init_recv_priv(&padapter->recvpriv, padapter) == _FAIL) {
3040 		RTW_INFO("Can't _rtw_init_recv_priv\n");
3041 		ret8 = _FAIL;
3042 		goto exit;
3043 	}
3044 	/* add for CONFIG_IEEE80211W, none 11w also can use */
3045 	_rtw_spinlock_init(&padapter->security_key_mutex);
3046 
3047 	/* We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc(). */
3048 	/* _rtw_memset((unsigned char *)&padapter->securitypriv, 0, sizeof (struct security_priv)); */
3049 
3050 	if (_rtw_init_sta_priv(&padapter->stapriv) == _FAIL) {
3051 		RTW_INFO("Can't _rtw_init_sta_priv\n");
3052 		ret8 = _FAIL;
3053 		goto exit;
3054 	}
3055 
3056 	padapter->setband = WIFI_FREQUENCY_BAND_AUTO;
3057 	padapter->fix_rate = 0xFF;
3058 	padapter->power_offset = 0;
3059 	padapter->rsvd_page_offset = 0;
3060 	padapter->rsvd_page_num = 0;
3061 
3062 	padapter->data_fb = 0;
3063 	padapter->fix_rx_ampdu_accept = RX_AMPDU_ACCEPT_INVALID;
3064 	padapter->fix_rx_ampdu_size = RX_AMPDU_SIZE_INVALID;
3065 #ifdef DBG_RX_COUNTER_DUMP
3066 	padapter->dump_rx_cnt_mode = 0;
3067 	padapter->drv_rx_cnt_ok = 0;
3068 	padapter->drv_rx_cnt_crcerror = 0;
3069 	padapter->drv_rx_cnt_drop = 0;
3070 #endif
3071 	rtw_init_bcmc_stainfo(padapter);
3072 
3073 	rtw_init_pwrctrl_priv(padapter);
3074 
3075 	/* _rtw_memset((u8 *)&padapter->qospriv, 0, sizeof (struct qos_priv)); */ /* move to mlme_priv */
3076 
3077 #ifdef CONFIG_MP_INCLUDED
3078 	if (init_mp_priv(padapter) == _FAIL)
3079 		RTW_INFO("%s: initialize MP private data Fail!\n", __func__);
3080 #endif
3081 
3082 	if (is_primary_adapter(padapter))
3083 		rtw_edcca_mode_update(adapter_to_dvobj(padapter));
3084 
3085 	rtw_hal_dm_init(padapter);
3086 
3087 	if (is_primary_adapter(padapter))
3088 		rtw_rfctl_chplan_init(padapter);
3089 
3090 #ifdef CONFIG_RTW_SW_LED
3091 	rtw_hal_sw_led_init(padapter);
3092 #endif
3093 #ifdef DBG_CONFIG_ERROR_DETECT
3094 	rtw_hal_sreset_init(padapter);
3095 #endif
3096 
3097 #ifdef CONFIG_WAPI_SUPPORT
3098 	padapter->WapiSupport = true; /* set true temp, will revise according to Efuse or Registry value later. */
3099 	rtw_wapi_init(padapter);
3100 #endif
3101 
3102 #ifdef CONFIG_BR_EXT
3103 	_rtw_spinlock_init(&padapter->br_ext_lock);
3104 #endif /* CONFIG_BR_EXT */
3105 
3106 #ifdef CONFIG_BEAMFORMING
3107 #ifdef RTW_BEAMFORMING_VERSION_2
3108 	rtw_bf_init(padapter);
3109 #endif /* RTW_BEAMFORMING_VERSION_2 */
3110 #endif /* CONFIG_BEAMFORMING */
3111 
3112 #ifdef CONFIG_RTW_REPEATER_SON
3113 	init_rtw_rson_data(adapter_to_dvobj(padapter));
3114 #endif
3115 
3116 #ifdef CONFIG_RTW_80211K
3117 	rtw_init_rm(padapter);
3118 #endif
3119 
3120 #ifdef CONFIG_RTW_CFGVENDOR_RANDOM_MAC_OUI
3121 	memset(pwdev_priv->pno_mac_addr, 0xFF, ETH_ALEN);
3122 #endif
3123 
3124 exit:
3125 
3126 
3127 
3128 	return ret8;
3129 
3130 }
3131 
3132 #ifdef CONFIG_WOWLAN
3133 void rtw_cancel_dynamic_chk_timer(_adapter *padapter)
3134 {
3135 	_cancel_timer_ex(&adapter_to_dvobj(padapter)->dynamic_chk_timer);
3136 }
3137 #endif
3138 
3139 void rtw_cancel_all_timer(_adapter *padapter)
3140 {
3141 
3142 	_cancel_timer_ex(&padapter->mlmepriv.assoc_timer);
3143 
3144 	_cancel_timer_ex(&padapter->mlmepriv.scan_to_timer);
3145 
3146 #ifdef CONFIG_DFS_MASTER
3147 	_cancel_timer_ex(&adapter_to_rfctl(padapter)->radar_detect_timer);
3148 #endif
3149 
3150 	_cancel_timer_ex(&adapter_to_dvobj(padapter)->dynamic_chk_timer);
3151 	_cancel_timer_ex(&adapter_to_dvobj(padapter)->periodic_tsf_update_end_timer);
3152 #ifdef CONFIG_RTW_SW_LED
3153 	/* cancel sw led timer */
3154 	rtw_hal_sw_led_deinit(padapter);
3155 #endif
3156 	_cancel_timer_ex(&(adapter_to_pwrctl(padapter)->pwr_state_check_timer));
3157 
3158 #ifdef CONFIG_TX_AMSDU
3159 	_cancel_timer_ex(&padapter->xmitpriv.amsdu_bk_timer);
3160 	_cancel_timer_ex(&padapter->xmitpriv.amsdu_be_timer);
3161 	_cancel_timer_ex(&padapter->xmitpriv.amsdu_vo_timer);
3162 	_cancel_timer_ex(&padapter->xmitpriv.amsdu_vi_timer);
3163 #endif
3164 
3165 #ifdef CONFIG_IOCTL_CFG80211
3166 	_cancel_timer_ex(&padapter->rochinfo.remain_on_ch_timer);
3167 #endif /* CONFIG_IOCTL_CFG80211 */
3168 
3169 #ifdef CONFIG_SET_SCAN_DENY_TIMER
3170 	_cancel_timer_ex(&padapter->mlmepriv.set_scan_deny_timer);
3171 	rtw_clear_scan_deny(padapter);
3172 #endif
3173 
3174 #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
3175 	_cancel_timer_ex(&padapter->recvpriv.signal_stat_timer);
3176 #endif
3177 
3178 #ifdef CONFIG_LPS_RPWM_TIMER
3179 	_cancel_timer_ex(&(adapter_to_pwrctl(padapter)->pwr_rpwm_timer));
3180 #endif /* CONFIG_LPS_RPWM_TIMER */
3181 
3182 #ifdef CONFIG_RTW_TOKEN_BASED_XMIT
3183 	_cancel_timer_ex(&padapter->mlmeextpriv.tbtx_xmit_timer);
3184 	_cancel_timer_ex(&padapter->mlmeextpriv.tbtx_token_dispatch_timer);
3185 #endif
3186 
3187 	/* cancel dm timer */
3188 	rtw_hal_dm_deinit(padapter);
3189 
3190 #ifdef CONFIG_PLATFORM_FS_MX61
3191 	msleep(50);
3192 #endif
3193 }
3194 
3195 u8 rtw_free_drv_sw(_adapter *padapter)
3196 {
3197 
3198 #ifdef CONFIG_WAPI_SUPPORT
3199 	rtw_wapi_free(padapter);
3200 #endif
3201 
3202 	/* we can call rtw_p2p_enable here, but: */
3203 	/* 1. rtw_p2p_enable may have IO operation */
3204 	/* 2. rtw_p2p_enable is bundled with wext interface */
3205 	#ifdef CONFIG_P2P
3206 	{
3207 		struct wifidirect_info *pwdinfo = &padapter->wdinfo;
3208 		#ifdef CONFIG_CONCURRENT_MODE
3209 		struct roch_info *prochinfo = &padapter->rochinfo;
3210 		#endif
3211 		if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) {
3212 			_cancel_timer_ex(&pwdinfo->find_phase_timer);
3213 			_cancel_timer_ex(&pwdinfo->restore_p2p_state_timer);
3214 			_cancel_timer_ex(&pwdinfo->pre_tx_scan_timer);
3215 			#ifdef CONFIG_CONCURRENT_MODE
3216 			_cancel_timer_ex(&prochinfo->ap_roch_ch_switch_timer);
3217 			#endif /* CONFIG_CONCURRENT_MODE */
3218 			rtw_p2p_set_state(pwdinfo, P2P_STATE_NONE);
3219 		}
3220 	}
3221 	#endif
3222 	/* add for CONFIG_IEEE80211W, none 11w also can use */
3223 	_rtw_spinlock_free(&padapter->security_key_mutex);
3224 
3225 #ifdef CONFIG_BR_EXT
3226 	_rtw_spinlock_free(&padapter->br_ext_lock);
3227 #endif /* CONFIG_BR_EXT */
3228 
3229 	free_mlme_ext_priv(&padapter->mlmeextpriv);
3230 
3231 #ifdef CONFIG_TDLS
3232 	/* rtw_free_tdls_info(&padapter->tdlsinfo); */
3233 #endif /* CONFIG_TDLS */
3234 
3235 #ifdef CONFIG_RTW_80211K
3236 	rtw_free_rm_priv(padapter);
3237 #endif
3238 
3239 	rtw_free_cmd_priv(&padapter->cmdpriv);
3240 
3241 	rtw_free_evt_priv(&padapter->evtpriv);
3242 
3243 	rtw_free_mlme_priv(&padapter->mlmepriv);
3244 
3245 	if (is_primary_adapter(padapter))
3246 		rtw_rfctl_deinit(padapter);
3247 
3248 	/* free_io_queue(padapter); */
3249 
3250 	_rtw_free_xmit_priv(&padapter->xmitpriv);
3251 
3252 	_rtw_free_sta_priv(&padapter->stapriv); /* will free bcmc_stainfo here */
3253 
3254 	_rtw_free_recv_priv(&padapter->recvpriv);
3255 
3256 	rtw_free_pwrctrl_priv(padapter);
3257 
3258 #ifdef CONFIG_PLATFORM_CMAP_INTFS
3259 	if (padapter->cmap_bss_status_evt) {
3260 		cmap_intfs_mfree(padapter->cmap_bss_status_evt, padapter->cmap_bss_status_evt_len);
3261 		padapter->cmap_bss_status_evt = NULL;
3262 	}
3263 #endif
3264 
3265 	/* rtw_mfree((void *)padapter, sizeof (padapter)); */
3266 
3267 	rtw_hal_free_data(padapter);
3268 
3269 	return _SUCCESS;
3270 
3271 }
3272 void rtw_intf_start(_adapter *adapter)
3273 {
3274 	if (adapter->intf_start)
3275 		adapter->intf_start(adapter);
3276 	GET_HAL_DATA(adapter)->intf_start = 1;
3277 }
3278 void rtw_intf_stop(_adapter *adapter)
3279 {
3280 	if (adapter->intf_stop)
3281 		adapter->intf_stop(adapter);
3282 	GET_HAL_DATA(adapter)->intf_start = 0;
3283 }
3284 
3285 #ifdef CONFIG_CONCURRENT_MODE
3286 #ifndef CONFIG_NEW_NETDEV_HDL
3287 int _netdev_vir_if_open(struct net_device *pnetdev)
3288 {
3289 	_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
3290 	_adapter *primary_padapter = GET_PRIMARY_ADAPTER(padapter);
3291 
3292 	RTW_INFO(FUNC_NDEV_FMT" , bup=%d\n", FUNC_NDEV_ARG(pnetdev), padapter->bup);
3293 
3294 	if (!primary_padapter)
3295 		goto _netdev_virtual_iface_open_error;
3296 
3297 #ifdef CONFIG_PLATFORM_INTEL_BYT
3298 	if (padapter->bup == _FALSE) {
3299 		u8 mac[ETH_ALEN];
3300 
3301 		/* get mac address from primary_padapter */
3302 		if (primary_padapter->bup == _FALSE)
3303 			rtw_macaddr_cfg(adapter_mac_addr(primary_padapter), get_hal_mac_addr(primary_padapter));
3304 
3305 		_rtw_memcpy(mac, adapter_mac_addr(primary_padapter), ETH_ALEN);
3306 
3307 		/*
3308 		* If the BIT1 is 0, the address is universally administered.
3309 		* If it is 1, the address is locally administered
3310 		*/
3311 		mac[0] |= BIT(1);
3312 
3313 		_rtw_memcpy(adapter_mac_addr(padapter), mac, ETH_ALEN);
3314 
3315 #ifdef CONFIG_MI_WITH_MBSSID_CAM
3316 		rtw_mbid_camid_alloc(padapter, adapter_mac_addr(padapter));
3317 #endif
3318 		rtw_init_wifidirect_addrs(padapter, adapter_mac_addr(padapter), adapter_mac_addr(padapter));
3319 		_rtw_memcpy(pnetdev->dev_addr, adapter_mac_addr(padapter), ETH_ALEN);
3320 	}
3321 #endif /*CONFIG_PLATFORM_INTEL_BYT*/
3322 
3323 	if (primary_padapter->bup == _FALSE || !rtw_is_hw_init_completed(primary_padapter))
3324 		_netdev_open(primary_padapter->pnetdev);
3325 
3326 	if (padapter->bup == _FALSE && primary_padapter->bup == _TRUE &&
3327 	    rtw_is_hw_init_completed(primary_padapter)) {
3328 #if 0 /*#ifdef CONFIG_MI_WITH_MBSSID_CAM*/
3329 		rtw_hal_set_hwreg(padapter, HW_VAR_MAC_ADDR, adapter_mac_addr(padapter)); /* set mac addr to mac register */
3330 #endif
3331 
3332 	}
3333 
3334 	if (padapter->bup == _FALSE) {
3335 		if (rtw_start_drv_threads(padapter) == _FAIL)
3336 			goto _netdev_virtual_iface_open_error;
3337 	}
3338 
3339 #ifdef CONFIG_RTW_NAPI
3340 	if (padapter->napi_state == NAPI_DISABLE) {
3341 		napi_enable(&padapter->napi);
3342 		padapter->napi_state = NAPI_ENABLE;
3343 	}
3344 #endif
3345 
3346 #ifdef CONFIG_IOCTL_CFG80211
3347 	rtw_cfg80211_init_wdev_data(padapter);
3348 #endif
3349 
3350 	padapter->bup = _TRUE;
3351 
3352 	padapter->net_closed = _FALSE;
3353 
3354 	rtw_netif_wake_queue(pnetdev);
3355 
3356 	RTW_INFO(FUNC_NDEV_FMT" (bup=%d) exit\n", FUNC_NDEV_ARG(pnetdev), padapter->bup);
3357 
3358 	return 0;
3359 
3360 _netdev_virtual_iface_open_error:
3361 
3362 	padapter->bup = _FALSE;
3363 
3364 #ifdef CONFIG_RTW_NAPI
3365 	if(padapter->napi_state == NAPI_ENABLE) {
3366 		napi_disable(&padapter->napi);
3367 		padapter->napi_state = NAPI_DISABLE;
3368 	}
3369 #endif
3370 
3371 	rtw_netif_carrier_off(pnetdev);
3372 	rtw_netif_stop_queue(pnetdev);
3373 
3374 	return -1;
3375 
3376 }
3377 
3378 int netdev_vir_if_open(struct net_device *pnetdev)
3379 {
3380 	int ret;
3381 	_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
3382 
3383 	_enter_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);
3384 	ret = _netdev_vir_if_open(pnetdev);
3385 	_exit_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);
3386 
3387 #ifdef CONFIG_AUTO_AP_MODE
3388 	/* if(padapter->iface_id == 2) */
3389 	/*	rtw_start_auto_ap(padapter); */
3390 #endif
3391 
3392 	return ret;
3393 }
3394 
3395 static int netdev_vir_if_close(struct net_device *pnetdev)
3396 {
3397 	_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
3398 	struct mlme_priv	*pmlmepriv = &padapter->mlmepriv;
3399 
3400 	RTW_INFO(FUNC_NDEV_FMT" , bup=%d\n", FUNC_NDEV_ARG(pnetdev), padapter->bup);
3401 	padapter->net_closed = _TRUE;
3402 	pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE;
3403 
3404 	if (pnetdev)
3405 		rtw_netif_stop_queue(pnetdev);
3406 
3407 #ifdef CONFIG_P2P
3408 	if (!rtw_p2p_chk_role(&padapter->wdinfo, P2P_ROLE_DISABLE))
3409 		rtw_p2p_enable(padapter, P2P_ROLE_DISABLE);
3410 #endif
3411 
3412 #ifdef CONFIG_IOCTL_CFG80211
3413 	rtw_scan_abort(padapter);
3414 	rtw_cfg80211_wait_scan_req_empty(padapter, 200);
3415 	adapter_wdev_data(padapter)->bandroid_scan = _FALSE;
3416 #endif
3417 
3418 	return 0;
3419 }
3420 #endif /*#ifndef CONFIG_NEW_NETDEV_HDL*/
3421 
3422 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29))
3423 static const struct net_device_ops rtw_netdev_vir_if_ops = {
3424 	.ndo_init = rtw_ndev_init,
3425 	.ndo_uninit = rtw_ndev_uninit,
3426 	#ifdef CONFIG_NEW_NETDEV_HDL
3427 	.ndo_open = netdev_open,
3428 	.ndo_stop = netdev_close,
3429 	#else
3430 	.ndo_open = netdev_vir_if_open,
3431 	.ndo_stop = netdev_vir_if_close,
3432 	#endif
3433 	.ndo_start_xmit = rtw_xmit_entry,
3434 	.ndo_set_mac_address = rtw_net_set_mac_address,
3435 	.ndo_get_stats = rtw_net_get_stats,
3436 	.ndo_do_ioctl = rtw_ioctl,
3437 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35))
3438 	.ndo_select_queue	= rtw_select_queue,
3439 #endif
3440 };
3441 #endif
3442 
3443 static void rtw_hook_vir_if_ops(struct net_device *ndev)
3444 {
3445 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29))
3446 	ndev->netdev_ops = &rtw_netdev_vir_if_ops;
3447 #else
3448 	ndev->init = rtw_ndev_init;
3449 	ndev->uninit = rtw_ndev_uninit;
3450 	#ifdef CONFIG_NEW_NETDEV_HDL
3451 	ndev->open = netdev_open;
3452 	ndev->stop = netdev_close;
3453 	#else
3454 	ndev->open = netdev_vir_if_open;
3455 	ndev->stop = netdev_vir_if_close;
3456 	#endif
3457 
3458 	ndev->set_mac_address = rtw_net_set_mac_address;
3459 #endif
3460 }
3461 _adapter *rtw_drv_add_vir_if(_adapter *primary_padapter,
3462 	void (*set_intf_ops)(_adapter *primary_padapter, struct _io_ops *pops))
3463 {
3464 	int res = _FAIL;
3465 	_adapter *padapter = NULL;
3466 	struct dvobj_priv *pdvobjpriv;
3467 	u8 mac[ETH_ALEN];
3468 #ifdef CONFIG_MI_UNIQUE_MACADDR_BIT
3469 	u32 mi_unique_macaddr_bit = 0;
3470 	u8 i;
3471 #endif
3472 
3473 	/****** init adapter ******/
3474 	padapter = (_adapter *)rtw_zvmalloc(sizeof(*padapter));
3475 	if (padapter == NULL)
3476 		goto exit;
3477 
3478 	if (loadparam(padapter) != _SUCCESS)
3479 		goto free_adapter;
3480 
3481 	_rtw_memcpy(padapter, primary_padapter, sizeof(_adapter));
3482 
3483 	/*  */
3484 	padapter->bup = _FALSE;
3485 	padapter->net_closed = _TRUE;
3486 	padapter->dir_dev = NULL;
3487 	padapter->dir_odm = NULL;
3488 
3489 	/*set adapter_type/iface type*/
3490 	padapter->isprimary = _FALSE;
3491 	padapter->adapter_type = VIRTUAL_ADAPTER;
3492 
3493 #ifdef CONFIG_MI_WITH_MBSSID_CAM
3494 	padapter->hw_port = HW_PORT0;
3495 #elif defined(CONFIG_PORT_BASED_TXBCN)
3496 	padapter->hw_port = adapter_to_dvobj(padapter)->iface_nums;
3497 #else
3498 	padapter->hw_port = HW_PORT1;
3499 #endif
3500 
3501 
3502 	/****** hook vir if into dvobj ******/
3503 	pdvobjpriv = adapter_to_dvobj(padapter);
3504 	padapter->iface_id = pdvobjpriv->iface_nums;
3505 	pdvobjpriv->padapters[pdvobjpriv->iface_nums++] = padapter;
3506 
3507 	padapter->intf_start = primary_padapter->intf_start;
3508 	padapter->intf_stop = primary_padapter->intf_stop;
3509 
3510 	/* step init_io_priv */
3511 	if ((rtw_init_io_priv(padapter, set_intf_ops)) == _FAIL) {
3512 		goto free_adapter;
3513 	}
3514 
3515 	/*init drv data*/
3516 	if (rtw_init_drv_sw(padapter) != _SUCCESS)
3517 		goto free_drv_sw;
3518 
3519 
3520 	/*get mac address from primary_padapter*/
3521 	_rtw_memcpy(mac, adapter_mac_addr(primary_padapter), ETH_ALEN);
3522 
3523 #ifdef CONFIG_MI_UNIQUE_MACADDR_BIT
3524 	mi_unique_macaddr_bit = BIT(CONFIG_MI_UNIQUE_MACADDR_BIT) >> 24;
3525 	/* Find out CONFIG_MI_UNIQUE_MACADDR_BIT in which nic specific byte */
3526 	for(i=3;i<6;i++) {
3527 		if((mi_unique_macaddr_bit >> 8) == 0)
3528 			break;
3529 
3530 		mi_unique_macaddr_bit >>= 8;
3531 	}
3532 
3533 	if((mac[i] & (u8)mi_unique_macaddr_bit)== 0) {
3534 		RTW_INFO("%s() "MAC_FMT" : BIT%u is zero\n", __func__, MAC_ARG(mac), CONFIG_MI_UNIQUE_MACADDR_BIT);
3535 		/* IFACE_ID1/IFACE_ID3 : set locally administered bit */
3536 		if(padapter->iface_id & BIT(0))
3537 			mac[0] |= BIT(1);
3538 		/* IFACE_ID2/IFACE_ID3 : set bit(CONFIG_MI_UNIQUE_MACADDR_BIT) */
3539 		if(padapter->iface_id >> 1)
3540 			mac[i] |= (u8)mi_unique_macaddr_bit;
3541 	} else
3542 #endif
3543 	{
3544 	/*
3545 	* If the BIT1 is 0, the address is universally administered.
3546 	* If it is 1, the address is locally administered
3547 	*/
3548 	mac[0] |= BIT(1);
3549 	if (padapter->iface_id > IFACE_ID1)
3550 		mac[0] ^= ((padapter->iface_id)<<2);
3551 	}
3552 
3553 	_rtw_memcpy(adapter_mac_addr(padapter), mac, ETH_ALEN);
3554 	/* update mac-address to mbsid-cam cache*/
3555 #ifdef CONFIG_MI_WITH_MBSSID_CAM
3556 	rtw_mbid_camid_alloc(padapter, adapter_mac_addr(padapter));
3557 #endif
3558 	RTW_INFO("%s if%d mac_addr : "MAC_FMT"\n", __func__, padapter->iface_id + 1, MAC_ARG(adapter_mac_addr(padapter)));
3559 #ifdef CONFIG_P2P
3560 	rtw_init_wifidirect_addrs(padapter, adapter_mac_addr(padapter), adapter_mac_addr(padapter));
3561 #endif
3562 
3563 	rtw_led_set_ctl_en_mask_virtual(padapter);
3564 	rtw_led_set_iface_en(padapter, 1);
3565 
3566 	res = _SUCCESS;
3567 
3568 free_drv_sw:
3569 	if (res != _SUCCESS && padapter)
3570 		rtw_free_drv_sw(padapter);
3571 free_adapter:
3572 	if (res != _SUCCESS && padapter) {
3573 		rtw_vmfree((u8 *)padapter, sizeof(*padapter));
3574 		padapter = NULL;
3575 	}
3576 exit:
3577 	return padapter;
3578 }
3579 
3580 void rtw_drv_stop_vir_if(_adapter *padapter)
3581 {
3582 	struct net_device *pnetdev = NULL;
3583 	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
3584 
3585 	if (padapter == NULL)
3586 		return;
3587 	RTW_INFO(FUNC_ADPT_FMT" enter\n", FUNC_ADPT_ARG(padapter));
3588 
3589 	pnetdev = padapter->pnetdev;
3590 
3591 	if (check_fwstate(pmlmepriv, WIFI_ASOC_STATE))
3592 		rtw_disassoc_cmd(padapter, 0, RTW_CMDF_DIRECTLY);
3593 
3594 #ifdef CONFIG_AP_MODE
3595 	if (MLME_IS_AP(padapter) || MLME_IS_MESH(padapter)) {
3596 		free_mlme_ap_info(padapter);
3597 		#ifdef CONFIG_HOSTAPD_MLME
3598 		hostapd_mode_unload(padapter);
3599 		#endif
3600 	}
3601 #endif
3602 
3603 	if (padapter->bup == _TRUE) {
3604 		#ifdef CONFIG_XMIT_ACK
3605 		if (padapter->xmitpriv.ack_tx)
3606 			rtw_ack_tx_done(&padapter->xmitpriv, RTW_SCTX_DONE_DRV_STOP);
3607 		#endif
3608 
3609 		rtw_intf_stop(padapter);
3610 	#ifndef CONFIG_NEW_NETDEV_HDL
3611 		rtw_stop_drv_threads(padapter);
3612 	#endif
3613 		padapter->bup = _FALSE;
3614 	}
3615 	#ifdef CONFIG_NEW_NETDEV_HDL
3616 	rtw_stop_drv_threads(padapter);
3617 	#endif
3618 	/* cancel timer after thread stop */
3619 	rtw_cancel_all_timer(padapter);
3620 }
3621 
3622 void rtw_drv_free_vir_if(_adapter *padapter)
3623 {
3624 	if (padapter == NULL)
3625 		return;
3626 
3627 	RTW_INFO(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));
3628 	rtw_free_drv_sw(padapter);
3629 
3630 	/* TODO: use rtw_os_ndevs_deinit instead at the first stage of driver's dev deinit function */
3631 	rtw_os_ndev_free(padapter);
3632 
3633 	rtw_vmfree((u8 *)padapter, sizeof(_adapter));
3634 }
3635 
3636 
3637 void rtw_drv_stop_vir_ifaces(struct dvobj_priv *dvobj)
3638 {
3639 	int i;
3640 
3641 	for (i = VIF_START_ID; i < dvobj->iface_nums; i++)
3642 		rtw_drv_stop_vir_if(dvobj->padapters[i]);
3643 }
3644 
3645 void rtw_drv_free_vir_ifaces(struct dvobj_priv *dvobj)
3646 {
3647 	int i;
3648 
3649 	for (i = VIF_START_ID; i < dvobj->iface_nums; i++)
3650 		rtw_drv_free_vir_if(dvobj->padapters[i]);
3651 }
3652 
3653 
3654 #endif /*end of CONFIG_CONCURRENT_MODE*/
3655 
3656 /* IPv4, IPv6 IP addr notifier */
3657 static int rtw_inetaddr_notifier_call(struct notifier_block *nb,
3658 				      unsigned long action, void *data)
3659 {
3660 	struct in_ifaddr *ifa = (struct in_ifaddr *)data;
3661 	struct net_device *ndev;
3662 	struct mlme_ext_priv *pmlmeext = NULL;
3663 	struct mlme_ext_info *pmlmeinfo = NULL;
3664 	_adapter *adapter = NULL;
3665 
3666 	if (!ifa || !ifa->ifa_dev || !ifa->ifa_dev->dev)
3667 		return NOTIFY_DONE;
3668 
3669 	ndev = ifa->ifa_dev->dev;
3670 
3671 	if (!is_rtw_ndev(ndev))
3672 		return NOTIFY_DONE;
3673 
3674 	adapter = (_adapter *)rtw_netdev_priv(ifa->ifa_dev->dev);
3675 
3676 	if (adapter == NULL)
3677 		return NOTIFY_DONE;
3678 
3679 	pmlmeext = &adapter->mlmeextpriv;
3680 	pmlmeinfo = &pmlmeext->mlmext_info;
3681 
3682 	switch (action) {
3683 	case NETDEV_UP:
3684 		_rtw_memcpy(pmlmeinfo->ip_addr, &ifa->ifa_address,
3685 					RTW_IP_ADDR_LEN);
3686 		RTW_DBG("%s[%s]: up IP: %pI4\n", __func__,
3687 					ifa->ifa_label, pmlmeinfo->ip_addr);
3688 	break;
3689 	case NETDEV_DOWN:
3690 		_rtw_memset(pmlmeinfo->ip_addr, 0, RTW_IP_ADDR_LEN);
3691 		RTW_DBG("%s[%s]: down IP: %pI4\n", __func__,
3692 					ifa->ifa_label, pmlmeinfo->ip_addr);
3693 	break;
3694 	default:
3695 		RTW_DBG("%s: default action\n", __func__);
3696 	break;
3697 	}
3698 	return NOTIFY_DONE;
3699 }
3700 
3701 #ifdef CONFIG_IPV6
3702 static int rtw_inet6addr_notifier_call(struct notifier_block *nb,
3703 				       unsigned long action, void *data)
3704 {
3705 	struct inet6_ifaddr *inet6_ifa = data;
3706 	struct net_device *ndev;
3707 	struct pwrctrl_priv *pwrctl = NULL;
3708 	struct mlme_ext_priv *pmlmeext = NULL;
3709 	struct mlme_ext_info *pmlmeinfo = NULL;
3710 	_adapter *adapter = NULL;
3711 
3712 	if (!inet6_ifa || !inet6_ifa->idev || !inet6_ifa->idev->dev)
3713 		return NOTIFY_DONE;
3714 
3715 	ndev = inet6_ifa->idev->dev;
3716 
3717 	if (!is_rtw_ndev(ndev))
3718 		return NOTIFY_DONE;
3719 
3720 	adapter = (_adapter *)rtw_netdev_priv(inet6_ifa->idev->dev);
3721 
3722 	if (adapter == NULL)
3723 		return NOTIFY_DONE;
3724 
3725 	pmlmeext =  &adapter->mlmeextpriv;
3726 	pmlmeinfo = &pmlmeext->mlmext_info;
3727 	pwrctl = adapter_to_pwrctl(adapter);
3728 
3729 	pmlmeext = &adapter->mlmeextpriv;
3730 	pmlmeinfo = &pmlmeext->mlmext_info;
3731 
3732 	switch (action) {
3733 	case NETDEV_UP:
3734 #ifdef CONFIG_WOWLAN
3735 		pwrctl->wowlan_ns_offload_en = _TRUE;
3736 #endif
3737 		_rtw_memcpy(pmlmeinfo->ip6_addr, &inet6_ifa->addr,
3738 					RTW_IPv6_ADDR_LEN);
3739 		RTW_DBG("%s: up IPv6 addrs: %pI6\n", __func__,
3740 					pmlmeinfo->ip6_addr);
3741 			break;
3742 	case NETDEV_DOWN:
3743 #ifdef CONFIG_WOWLAN
3744 		pwrctl->wowlan_ns_offload_en = _FALSE;
3745 #endif
3746 		_rtw_memset(pmlmeinfo->ip6_addr, 0, RTW_IPv6_ADDR_LEN);
3747 		RTW_DBG("%s: down IPv6 addrs: %pI6\n", __func__,
3748 					pmlmeinfo->ip6_addr);
3749 		break;
3750 	default:
3751 		RTW_DBG("%s: default action\n", __func__);
3752 		break;
3753 	}
3754 	return NOTIFY_DONE;
3755 }
3756 #endif
3757 
3758 static struct notifier_block rtw_inetaddr_notifier = {
3759 	.notifier_call = rtw_inetaddr_notifier_call
3760 };
3761 
3762 #ifdef CONFIG_IPV6
3763 static struct notifier_block rtw_inet6addr_notifier = {
3764 	.notifier_call = rtw_inet6addr_notifier_call
3765 };
3766 #endif
3767 
3768 void rtw_inetaddr_notifier_register(void)
3769 {
3770 	RTW_INFO("%s\n", __func__);
3771 	register_inetaddr_notifier(&rtw_inetaddr_notifier);
3772 #ifdef CONFIG_IPV6
3773 	register_inet6addr_notifier(&rtw_inet6addr_notifier);
3774 #endif
3775 }
3776 
3777 void rtw_inetaddr_notifier_unregister(void)
3778 {
3779 	RTW_INFO("%s\n", __func__);
3780 	unregister_inetaddr_notifier(&rtw_inetaddr_notifier);
3781 #ifdef CONFIG_IPV6
3782 	unregister_inet6addr_notifier(&rtw_inet6addr_notifier);
3783 #endif
3784 }
3785 
3786 int rtw_os_ndevs_register(struct dvobj_priv *dvobj)
3787 {
3788 	int i, status = _SUCCESS;
3789 	struct registry_priv *regsty = dvobj_to_regsty(dvobj);
3790 	_adapter *adapter;
3791 
3792 #if defined(CONFIG_IOCTL_CFG80211)
3793 	if (rtw_cfg80211_dev_res_register(dvobj) != _SUCCESS) {
3794 		rtw_warn_on(1);
3795 		return _FAIL;
3796 	}
3797 #endif
3798 
3799 	for (i = 0; i < dvobj->iface_nums; i++) {
3800 
3801 		if (i >= CONFIG_IFACE_NUMBER) {
3802 			RTW_ERR("%s %d >= CONFIG_IFACE_NUMBER(%d)\n", __func__, i, CONFIG_IFACE_NUMBER);
3803 			rtw_warn_on(1);
3804 			continue;
3805 		}
3806 
3807 		adapter = dvobj->padapters[i];
3808 		if (adapter) {
3809 			char *name;
3810 
3811 			#ifdef CONFIG_RTW_DYNAMIC_NDEV
3812 			if (!is_primary_adapter(adapter))
3813 				continue;
3814 			#endif
3815 
3816 			if (adapter->iface_id == IFACE_ID0)
3817 				name = regsty->ifname;
3818 			else if (adapter->iface_id == IFACE_ID1)
3819 				name = regsty->if2name;
3820 #if defined(CONFIG_PLATFORM_ANDROID) && (CONFIG_IFACE_NUMBER > 2)
3821 			else if (adapter->iface_id == IFACE_ID2)
3822 				name = regsty->if3name;
3823 #endif
3824 			else
3825 				name = "wlan%d";
3826 
3827 			status = rtw_os_ndev_register(adapter, name);
3828 
3829 			if (status != _SUCCESS) {
3830 				rtw_warn_on(1);
3831 				break;
3832 			}
3833 		}
3834 	}
3835 
3836 	if (status != _SUCCESS) {
3837 		for (; i >= 0; i--) {
3838 			adapter = dvobj->padapters[i];
3839 			if (adapter)
3840 				rtw_os_ndev_unregister(adapter);
3841 		}
3842 	}
3843 
3844 #if defined(CONFIG_IOCTL_CFG80211)
3845 	if (status != _SUCCESS)
3846 		rtw_cfg80211_dev_res_unregister(dvobj);
3847 #endif
3848 	return status;
3849 }
3850 
3851 void rtw_os_ndevs_unregister(struct dvobj_priv *dvobj)
3852 {
3853 	int i;
3854 	_adapter *adapter = NULL;
3855 
3856 	for (i = 0; i < dvobj->iface_nums; i++) {
3857 		adapter = dvobj->padapters[i];
3858 
3859 		if (adapter == NULL)
3860 			continue;
3861 
3862 		rtw_os_ndev_unregister(adapter);
3863 	}
3864 
3865 #if defined(CONFIG_IOCTL_CFG80211)
3866 	rtw_cfg80211_dev_res_unregister(dvobj);
3867 #endif
3868 }
3869 
3870 /**
3871  * rtw_os_ndevs_init - Allocate and register OS layer net devices and relating structures for @dvobj
3872  * @dvobj: the dvobj on which this function applies
3873  *
3874  * Returns:
3875  * _SUCCESS or _FAIL
3876  */
3877 int rtw_os_ndevs_init(struct dvobj_priv *dvobj)
3878 {
3879 	int ret = _FAIL;
3880 
3881 	if (rtw_os_ndevs_alloc(dvobj) != _SUCCESS)
3882 		goto exit;
3883 
3884 	if (rtw_os_ndevs_register(dvobj) != _SUCCESS)
3885 		goto os_ndevs_free;
3886 
3887 	ret = _SUCCESS;
3888 
3889 os_ndevs_free:
3890 	if (ret != _SUCCESS)
3891 		rtw_os_ndevs_free(dvobj);
3892 exit:
3893 	return ret;
3894 }
3895 
3896 /**
3897  * rtw_os_ndevs_deinit - Unregister and free OS layer net devices and relating structures for @dvobj
3898  * @dvobj: the dvobj on which this function applies
3899  */
3900 void rtw_os_ndevs_deinit(struct dvobj_priv *dvobj)
3901 {
3902 	rtw_os_ndevs_unregister(dvobj);
3903 	rtw_os_ndevs_free(dvobj);
3904 }
3905 
3906 #ifdef CONFIG_BR_EXT
3907 void netdev_br_init(struct net_device *netdev)
3908 {
3909 	_adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);
3910 
3911 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 35))
3912 	rcu_read_lock();
3913 #endif
3914 
3915 	/* if(check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) == _TRUE) */
3916 	{
3917 		/* struct net_bridge	*br = netdev->br_port->br; */ /* ->dev->dev_addr; */
3918 		#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
3919 		if (netdev->br_port)
3920 		#else
3921 		if (rcu_dereference(adapter->pnetdev->rx_handler_data))
3922 		#endif
3923 		{
3924 			struct net_device *br_netdev;
3925 
3926 			br_netdev = rtw_get_bridge_ndev_by_name(CONFIG_BR_EXT_BRNAME);
3927 			if (br_netdev) {
3928 				memcpy(adapter->br_mac, br_netdev->dev_addr, ETH_ALEN);
3929 				dev_put(br_netdev);
3930 				RTW_INFO(FUNC_NDEV_FMT" bind bridge dev "NDEV_FMT"("MAC_FMT")\n"
3931 					, FUNC_NDEV_ARG(netdev), NDEV_ARG(br_netdev), MAC_ARG(br_netdev->dev_addr));
3932 			} else {
3933 				RTW_INFO(FUNC_NDEV_FMT" can't get bridge dev by name \"%s\"\n"
3934 					, FUNC_NDEV_ARG(netdev), CONFIG_BR_EXT_BRNAME);
3935 			}
3936 		}
3937 
3938 		adapter->ethBrExtInfo.addPPPoETag = 1;
3939 	}
3940 
3941 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 35))
3942 	rcu_read_unlock();
3943 #endif
3944 }
3945 #endif /* CONFIG_BR_EXT */
3946 
3947 #ifdef CONFIG_NEW_NETDEV_HDL
3948 int _netdev_open(struct net_device *pnetdev)
3949 {
3950 	uint status;
3951 	_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
3952 	struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);
3953 
3954 	RTW_INFO(FUNC_NDEV_FMT" start\n", FUNC_NDEV_ARG(pnetdev));
3955 
3956 	if (!rtw_is_hw_init_completed(padapter)) { // ips
3957 		rtw_clr_surprise_removed(padapter);
3958 		rtw_clr_drv_stopped(padapter);
3959 		RTW_ENABLE_FUNC(padapter, DF_RX_BIT);
3960 		RTW_ENABLE_FUNC(padapter, DF_TX_BIT);
3961 		status = rtw_hal_init(padapter);
3962 		if (status == _FAIL)
3963 			goto netdev_open_error;
3964 		rtw_led_control(padapter, LED_CTL_NO_LINK);
3965 		#ifndef RTW_HALMAC
3966 		status = rtw_mi_start_drv_threads(padapter);
3967 		if (status == _FAIL) {
3968 			RTW_ERR(FUNC_NDEV_FMT "Initialize driver thread failed!\n", FUNC_NDEV_ARG(pnetdev));
3969 			goto netdev_open_error;
3970 		}
3971 
3972 		rtw_intf_start(GET_PRIMARY_ADAPTER(padapter));
3973 		#endif /* !RTW_HALMAC */
3974 
3975 		{
3976 	#ifdef CONFIG_BT_COEXIST_SOCKET_TRX
3977 			_adapter *prim_adpt = GET_PRIMARY_ADAPTER(padapter);
3978 
3979 			if (prim_adpt && (_TRUE == prim_adpt->EEPROMBluetoothCoexist)) {
3980 				rtw_btcoex_init_socket(prim_adpt);
3981 				prim_adpt->coex_info.BtMgnt.ExtConfig.HCIExtensionVer = 0x04;
3982 				rtw_btcoex_SetHciVersion(prim_adpt, 0x04);
3983 			}
3984 	#endif /* CONFIG_BT_COEXIST_SOCKET_TRX */
3985 
3986 			_set_timer(&adapter_to_dvobj(padapter)->dynamic_chk_timer, 2000);
3987 
3988 	#ifndef CONFIG_IPS_CHECK_IN_WD
3989 			rtw_set_pwr_state_check_timer(pwrctrlpriv);
3990 	#endif /*CONFIG_IPS_CHECK_IN_WD*/
3991 		}
3992 
3993 	}
3994 
3995 	/*if (padapter->bup == _FALSE) */
3996 	{
3997 		rtw_hal_iface_init(padapter);
3998 
3999 		#ifdef CONFIG_RTW_NAPI
4000 		if(padapter->napi_state == NAPI_DISABLE) {
4001 			napi_enable(&padapter->napi);
4002 			padapter->napi_state = NAPI_ENABLE;
4003 		}
4004 		#endif
4005 
4006 		#ifdef CONFIG_IOCTL_CFG80211
4007 		rtw_cfg80211_init_wdev_data(padapter);
4008 		#endif
4009 		/* rtw_netif_carrier_on(pnetdev); */ /* call this func when rtw_joinbss_event_callback return success */
4010 		rtw_netif_wake_queue(pnetdev);
4011 
4012 		#ifdef CONFIG_BR_EXT
4013 		if (is_primary_adapter(padapter))
4014 			netdev_br_init(pnetdev);
4015 		#endif /* CONFIG_BR_EXT */
4016 
4017 
4018 		padapter->bup = _TRUE;
4019 		padapter->net_closed = _FALSE;
4020 		padapter->netif_up = _TRUE;
4021 		pwrctrlpriv->bips_processing = _FALSE;
4022 	}
4023 
4024 	RTW_INFO(FUNC_NDEV_FMT" Success (bup=%d)\n", FUNC_NDEV_ARG(pnetdev), padapter->bup);
4025 	return 0;
4026 
4027 netdev_open_error:
4028 	padapter->bup = _FALSE;
4029 
4030 	#ifdef CONFIG_RTW_NAPI
4031 	if(padapter->napi_state == NAPI_ENABLE) {
4032 		napi_disable(&padapter->napi);
4033 		padapter->napi_state = NAPI_DISABLE;
4034 	}
4035 	#endif
4036 
4037 	rtw_netif_carrier_off(pnetdev);
4038 	rtw_netif_stop_queue(pnetdev);
4039 
4040 	RTW_ERR(FUNC_NDEV_FMT" Failed!! (bup=%d)\n", FUNC_NDEV_ARG(pnetdev), padapter->bup);
4041 
4042 	return -1;
4043 
4044 }
4045 
4046 #else
4047 int _netdev_open(struct net_device *pnetdev)
4048 {
4049 	uint status;
4050 	_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
4051 	struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);
4052 #ifdef CONFIG_BT_COEXIST_SOCKET_TRX
4053 	HAL_DATA_TYPE		*pHalData = GET_HAL_DATA(padapter);
4054 #endif /* CONFIG_BT_COEXIST_SOCKET_TRX */
4055 
4056 
4057 	RTW_INFO(FUNC_NDEV_FMT" , bup=%d\n", FUNC_NDEV_ARG(pnetdev), padapter->bup);
4058 
4059 	padapter->netif_up = _TRUE;
4060 
4061 #ifdef CONFIG_PLATFORM_INTEL_BYT
4062 	rtw_sdio_set_power(1);
4063 #endif /* CONFIG_PLATFORM_INTEL_BYT */
4064 
4065 	if (padapter->bup == _FALSE) {
4066 #ifdef CONFIG_PLATFORM_INTEL_BYT
4067 		rtw_macaddr_cfg(adapter_mac_addr(padapter),  get_hal_mac_addr(padapter));
4068 #ifdef CONFIG_MI_WITH_MBSSID_CAM
4069 		rtw_mbid_camid_alloc(padapter, adapter_mac_addr(padapter));
4070 #endif
4071 		rtw_init_wifidirect_addrs(padapter, adapter_mac_addr(padapter), adapter_mac_addr(padapter));
4072 		_rtw_memcpy(pnetdev->dev_addr, adapter_mac_addr(padapter), ETH_ALEN);
4073 #endif /* CONFIG_PLATFORM_INTEL_BYT */
4074 
4075 		rtw_clr_surprise_removed(padapter);
4076 		rtw_clr_drv_stopped(padapter);
4077 
4078 		status = rtw_hal_init(padapter);
4079 		if (status == _FAIL) {
4080 			goto netdev_open_error;
4081 		}
4082 #if 0/*#ifdef CONFIG_MI_WITH_MBSSID_CAM*/
4083 		rtw_hal_set_hwreg(padapter, HW_VAR_MAC_ADDR, adapter_mac_addr(padapter)); /* set mac addr to mac register */
4084 #endif
4085 
4086 		RTW_INFO("MAC Address = "MAC_FMT"\n", MAC_ARG(pnetdev->dev_addr));
4087 
4088 #ifndef RTW_HALMAC
4089 		status = rtw_start_drv_threads(padapter);
4090 		if (status == _FAIL) {
4091 			RTW_INFO("Initialize driver software resource Failed!\n");
4092 			goto netdev_open_error;
4093 		}
4094 #endif /* !RTW_HALMAC */
4095 
4096 #ifdef CONFIG_RTW_NAPI
4097 		if(padapter->napi_state == NAPI_DISABLE) {
4098 			napi_enable(&padapter->napi);
4099 			padapter->napi_state = NAPI_ENABLE;
4100 		}
4101 #endif
4102 
4103 #ifndef RTW_HALMAC
4104 		rtw_intf_start(padapter);
4105 #endif /* !RTW_HALMAC */
4106 
4107 #ifdef CONFIG_IOCTL_CFG80211
4108 		rtw_cfg80211_init_wdev_data(padapter);
4109 #endif
4110 
4111 		rtw_led_control(padapter, LED_CTL_NO_LINK);
4112 
4113 		padapter->bup = _TRUE;
4114 		pwrctrlpriv->bips_processing = _FALSE;
4115 
4116 #ifdef CONFIG_PLATFORM_INTEL_BYT
4117 #ifdef CONFIG_BT_COEXIST
4118 		rtw_btcoex_IpsNotify(padapter, IPS_NONE);
4119 #endif /* CONFIG_BT_COEXIST */
4120 #endif /* CONFIG_PLATFORM_INTEL_BYT		 */
4121 	}
4122 	padapter->net_closed = _FALSE;
4123 
4124 	_set_timer(&adapter_to_dvobj(padapter)->dynamic_chk_timer, 2000);
4125 
4126 #ifndef CONFIG_IPS_CHECK_IN_WD
4127 	rtw_set_pwr_state_check_timer(pwrctrlpriv);
4128 #endif
4129 
4130 	/* rtw_netif_carrier_on(pnetdev); */ /* call this func when rtw_joinbss_event_callback return success */
4131 	rtw_netif_wake_queue(pnetdev);
4132 
4133 #ifdef CONFIG_BR_EXT
4134 	netdev_br_init(pnetdev);
4135 #endif /* CONFIG_BR_EXT */
4136 
4137 #ifdef CONFIG_BT_COEXIST_SOCKET_TRX
4138 	if (is_primary_adapter(padapter) && (_TRUE == pHalData->EEPROMBluetoothCoexist)) {
4139 		rtw_btcoex_init_socket(padapter);
4140 		padapter->coex_info.BtMgnt.ExtConfig.HCIExtensionVer = 0x04;
4141 		rtw_btcoex_SetHciVersion(padapter, 0x04);
4142 	} else
4143 		RTW_INFO("CONFIG_BT_COEXIST: VIRTUAL_ADAPTER\n");
4144 #endif /* CONFIG_BT_COEXIST_SOCKET_TRX */
4145 
4146 #ifdef CONFIG_CONCURRENT_MODE
4147 	{
4148 		_adapter *sec_adapter = adapter_to_dvobj(padapter)->padapters[IFACE_ID1];
4149 
4150 		#ifndef CONFIG_RTW_DYNAMIC_NDEV
4151 		if (sec_adapter && (sec_adapter->bup == _FALSE))
4152 			_netdev_vir_if_open(sec_adapter->pnetdev);
4153 		#endif
4154 	}
4155 #endif
4156 
4157 #ifdef CONFIG_RTW_CFGVENDOR_LLSTATS
4158 	pwrctrlpriv->radio_on_start_time = rtw_get_current_time();
4159 	pwrctrlpriv->pwr_saving_start_time = rtw_get_current_time();
4160 	pwrctrlpriv->pwr_saving_time = 0;
4161 	pwrctrlpriv->on_time = 0;
4162 	pwrctrlpriv->tx_time = 0;
4163 	pwrctrlpriv->rx_time = 0;
4164 #endif /* CONFIG_RTW_CFGVEDNOR_LLSTATS */
4165 
4166 	RTW_INFO("-871x_drv - drv_open, bup=%d\n", padapter->bup);
4167 
4168 	return 0;
4169 
4170 netdev_open_error:
4171 
4172 	padapter->bup = _FALSE;
4173 
4174 #ifdef CONFIG_RTW_NAPI
4175 	if(padapter->napi_state == NAPI_ENABLE) {
4176 		napi_disable(&padapter->napi);
4177 		padapter->napi_state = NAPI_DISABLE;
4178 	}
4179 #endif
4180 
4181 	rtw_netif_carrier_off(pnetdev);
4182 	rtw_netif_stop_queue(pnetdev);
4183 
4184 	RTW_INFO("-871x_drv - drv_open fail, bup=%d\n", padapter->bup);
4185 
4186 	return -1;
4187 
4188 }
4189 #endif
4190 int netdev_open(struct net_device *pnetdev)
4191 {
4192 	int ret = _FALSE;
4193 	_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
4194 	struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);
4195 
4196 	if (pwrctrlpriv->bInSuspend == _TRUE) {
4197 		RTW_INFO(" [WARN] "ADPT_FMT" %s  failed, bInSuspend=%d\n", ADPT_ARG(padapter), __func__, pwrctrlpriv->bInSuspend);
4198 		return 0;
4199 	}
4200 
4201 	_enter_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);
4202 #ifdef CONFIG_NEW_NETDEV_HDL
4203 	ret = _netdev_open(pnetdev);
4204 #else
4205 	if (is_primary_adapter(padapter))
4206 		ret = _netdev_open(pnetdev);
4207 #ifdef CONFIG_CONCURRENT_MODE
4208 	else
4209 		ret = _netdev_vir_if_open(pnetdev);
4210 #endif
4211 #endif
4212 	_exit_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);
4213 
4214 
4215 #ifdef CONFIG_AUTO_AP_MODE
4216 	if (padapter->iface_id == IFACE_ID2)
4217 		rtw_start_auto_ap(padapter);
4218 #endif
4219 
4220 	return ret;
4221 }
4222 
4223 #ifdef CONFIG_IPS
4224 int  ips_netdrv_open(_adapter *padapter)
4225 {
4226 	int status = _SUCCESS;
4227 	/* struct pwrctrl_priv	*pwrpriv = adapter_to_pwrctl(padapter); */
4228 
4229 	padapter->net_closed = _FALSE;
4230 
4231 	RTW_INFO("===> %s.........\n", __FUNCTION__);
4232 
4233 
4234 	rtw_clr_drv_stopped(padapter);
4235 	/* padapter->bup = _TRUE; */
4236 #ifdef CONFIG_NEW_NETDEV_HDL
4237 	if (!rtw_is_hw_init_completed(padapter)) {
4238 		status = rtw_hal_init(padapter);
4239 		if (status == _FAIL) {
4240 			goto netdev_open_error;
4241 		}
4242 		rtw_mi_hal_iface_init(padapter);
4243 	}
4244 #else
4245 	status = rtw_hal_init(padapter);
4246 	if (status == _FAIL) {
4247 		goto netdev_open_error;
4248 	}
4249 #endif
4250 #if 0
4251 	rtw_mi_set_mac_addr(padapter);
4252 #endif
4253 #ifndef RTW_HALMAC
4254 	rtw_intf_start(padapter);
4255 #endif /* !RTW_HALMAC */
4256 
4257 #ifndef CONFIG_IPS_CHECK_IN_WD
4258 	rtw_set_pwr_state_check_timer(adapter_to_pwrctl(padapter));
4259 #endif
4260 	_set_timer(&adapter_to_dvobj(padapter)->dynamic_chk_timer, 2000);
4261 
4262 	return _SUCCESS;
4263 
4264 netdev_open_error:
4265 	/* padapter->bup = _FALSE; */
4266 	RTW_INFO("-ips_netdrv_open - drv_open failure, bup=%d\n", padapter->bup);
4267 
4268 	return _FAIL;
4269 }
4270 
4271 int rtw_ips_pwr_up(_adapter *padapter)
4272 {
4273 	int result;
4274 #if defined(CONFIG_SWLPS_IN_IPS) || defined(CONFIG_FWLPS_IN_IPS)
4275 #ifdef DBG_CONFIG_ERROR_DETECT
4276 	PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
4277 	struct sreset_priv *psrtpriv = &pHalData->srestpriv;
4278 #endif/* #ifdef DBG_CONFIG_ERROR_DETECT */
4279 #endif /* defined(CONFIG_SWLPS_IN_IPS) || defined(CONFIG_FWLPS_IN_IPS) */
4280 	systime start_time = rtw_get_current_time();
4281 	RTW_INFO("===>  rtw_ips_pwr_up..............\n");
4282 
4283 #if defined(CONFIG_SWLPS_IN_IPS) || defined(CONFIG_FWLPS_IN_IPS)
4284 #ifdef DBG_CONFIG_ERROR_DETECT
4285 	if (psrtpriv->silent_reset_inprogress == _TRUE)
4286 #endif/* #ifdef DBG_CONFIG_ERROR_DETECT */
4287 #endif /* defined(CONFIG_SWLPS_IN_IPS) || defined(CONFIG_FWLPS_IN_IPS) */
4288 		rtw_reset_drv_sw(padapter);
4289 
4290 	result = ips_netdrv_open(padapter);
4291 
4292 	rtw_led_control(padapter, LED_CTL_NO_LINK);
4293 
4294 	RTW_INFO("<===  rtw_ips_pwr_up.............. in %dms\n", rtw_get_passing_time_ms(start_time));
4295 	return result;
4296 
4297 }
4298 
4299 void rtw_ips_pwr_down(_adapter *padapter)
4300 {
4301 	systime start_time = rtw_get_current_time();
4302 	RTW_INFO("===> rtw_ips_pwr_down...................\n");
4303 
4304 	padapter->net_closed = _TRUE;
4305 
4306 	rtw_ips_dev_unload(padapter);
4307 	RTW_INFO("<=== rtw_ips_pwr_down..................... in %dms\n", rtw_get_passing_time_ms(start_time));
4308 }
4309 #endif
4310 void rtw_ips_dev_unload(_adapter *padapter)
4311 {
4312 #if defined(CONFIG_SWLPS_IN_IPS) || defined(CONFIG_FWLPS_IN_IPS)
4313 #ifdef DBG_CONFIG_ERROR_DETECT
4314 	PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
4315 	struct sreset_priv *psrtpriv = &pHalData->srestpriv;
4316 #endif/* #ifdef DBG_CONFIG_ERROR_DETECT */
4317 #endif /* defined(CONFIG_SWLPS_IN_IPS) || defined(CONFIG_FWLPS_IN_IPS) */
4318 	RTW_INFO("====> %s...\n", __FUNCTION__);
4319 
4320 
4321 #if defined(CONFIG_SWLPS_IN_IPS) || defined(CONFIG_FWLPS_IN_IPS)
4322 #ifdef DBG_CONFIG_ERROR_DETECT
4323 	if (psrtpriv->silent_reset_inprogress == _TRUE)
4324 #endif /* #ifdef DBG_CONFIG_ERROR_DETECT */
4325 #endif /* defined(CONFIG_SWLPS_IN_IPS) || defined(CONFIG_FWLPS_IN_IPS) */
4326 	{
4327 		rtw_hal_set_hwreg(padapter, HW_VAR_FIFO_CLEARN_UP, 0);
4328 		rtw_intf_stop(padapter);
4329 	}
4330 
4331 	if (!rtw_is_surprise_removed(padapter))
4332 		rtw_hal_deinit(padapter);
4333 
4334 }
4335 #ifdef CONFIG_NEW_NETDEV_HDL
4336 int _pm_netdev_open(_adapter *padapter)
4337 {
4338 	uint status;
4339 	struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);
4340 	struct net_device *pnetdev = padapter->pnetdev;
4341 
4342 	RTW_INFO(FUNC_NDEV_FMT" start\n", FUNC_NDEV_ARG(pnetdev));
4343 
4344 	if (!rtw_is_hw_init_completed(padapter)) { // ips
4345 		rtw_clr_surprise_removed(padapter);
4346 		rtw_clr_drv_stopped(padapter);
4347 		status = rtw_hal_init(padapter);
4348 		if (status == _FAIL)
4349 			goto netdev_open_error;
4350 		rtw_led_control(padapter, LED_CTL_NO_LINK);
4351 		#ifndef RTW_HALMAC
4352 		status = rtw_mi_start_drv_threads(padapter);
4353 		if (status == _FAIL) {
4354 			RTW_ERR(FUNC_NDEV_FMT "Initialize driver thread failed!\n", FUNC_NDEV_ARG(pnetdev));
4355 			goto netdev_open_error;
4356 		}
4357 
4358 		rtw_intf_start(GET_PRIMARY_ADAPTER(padapter));
4359 		#endif /* !RTW_HALMAC */
4360 
4361 		{
4362 			_set_timer(&adapter_to_dvobj(padapter)->dynamic_chk_timer, 2000);
4363 
4364 	#ifndef CONFIG_IPS_CHECK_IN_WD
4365 			rtw_set_pwr_state_check_timer(pwrctrlpriv);
4366 	#endif /*CONFIG_IPS_CHECK_IN_WD*/
4367 		}
4368 
4369 	}
4370 
4371 	/*if (padapter->bup == _FALSE) */
4372 	{
4373 		rtw_hal_iface_init(padapter);
4374 
4375 		padapter->bup = _TRUE;
4376 		padapter->net_closed = _FALSE;
4377 		padapter->netif_up = _TRUE;
4378 		pwrctrlpriv->bips_processing = _FALSE;
4379 	}
4380 
4381 	RTW_INFO(FUNC_NDEV_FMT" Success (bup=%d)\n", FUNC_NDEV_ARG(pnetdev), padapter->bup);
4382 	return 0;
4383 
4384 netdev_open_error:
4385 	padapter->bup = _FALSE;
4386 
4387 	rtw_netif_carrier_off(pnetdev);
4388 	rtw_netif_stop_queue(pnetdev);
4389 
4390 	RTW_ERR(FUNC_NDEV_FMT" Failed!! (bup=%d)\n", FUNC_NDEV_ARG(pnetdev), padapter->bup);
4391 
4392 	return -1;
4393 
4394 }
4395 int _mi_pm_netdev_open(struct net_device *pnetdev)
4396 {
4397 	int i;
4398 	int status = 0;
4399 	_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
4400 	_adapter *iface;
4401 	struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
4402 
4403 	for (i = 0; i < dvobj->iface_nums; i++) {
4404 		iface = dvobj->padapters[i];
4405 		if (iface->netif_up) {
4406 			status = _pm_netdev_open(iface);
4407 			if (status == -1) {
4408 				RTW_ERR("%s failled\n", __func__);
4409 				break;
4410 			}
4411 		}
4412 	}
4413 
4414 	return status;
4415 }
4416 #endif /*CONFIG_NEW_NETDEV_HDL*/
4417 int pm_netdev_open(struct net_device *pnetdev, u8 bnormal)
4418 {
4419 	int status = 0;
4420 
4421 	_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
4422 
4423 	if (_TRUE == bnormal) {
4424 		_enter_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);
4425 		#ifdef CONFIG_NEW_NETDEV_HDL
4426 		status = _mi_pm_netdev_open(pnetdev);
4427 		#else
4428 		status = _netdev_open(pnetdev);
4429 		#endif
4430 		_exit_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);
4431 	}
4432 #ifdef CONFIG_IPS
4433 	else
4434 		status = (_SUCCESS == ips_netdrv_open(padapter)) ? (0) : (-1);
4435 #endif
4436 
4437 	return status;
4438 }
4439 #ifdef CONFIG_CLIENT_PORT_CFG
4440 extern void rtw_hw_client_port_release(_adapter *adapter);
4441 #endif
4442 #ifndef CONFIG_RTL8822CS_WIFI_HDF
4443 static
4444 #endif
4445 int netdev_close(struct net_device *pnetdev)
4446 {
4447 	_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
4448 	struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);
4449 	struct mlme_priv	*pmlmepriv = &padapter->mlmepriv;
4450 #ifdef CONFIG_BT_COEXIST_SOCKET_TRX
4451 	HAL_DATA_TYPE		*pHalData = GET_HAL_DATA(padapter);
4452 #endif /* CONFIG_BT_COEXIST_SOCKET_TRX */
4453 
4454 	RTW_INFO(FUNC_NDEV_FMT" , bup=%d\n", FUNC_NDEV_ARG(pnetdev), padapter->bup);
4455 #ifndef CONFIG_PLATFORM_INTEL_BYT
4456 	padapter->net_closed = _TRUE;
4457 	padapter->netif_up = _FALSE;
4458 	pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE;
4459 
4460 #ifdef CONFIG_CLIENT_PORT_CFG
4461 	if (MLME_IS_STA(padapter))
4462 		rtw_hw_client_port_release(padapter);
4463 #endif
4464 	/*	if (!rtw_is_hw_init_completed(padapter)) {
4465 			RTW_INFO("(1)871x_drv - drv_close, bup=%d, hw_init_completed=%s\n", padapter->bup, rtw_is_hw_init_completed(padapter)?"_TRUE":"_FALSE");
4466 
4467 			rtw_set_drv_stopped(padapter);
4468 
4469 			rtw_dev_unload(padapter);
4470 		}
4471 		else*/
4472 	if (pwrctl->rf_pwrstate == rf_on) {
4473 		RTW_INFO("(2)871x_drv - drv_close, bup=%d, hw_init_completed=%s\n", padapter->bup, rtw_is_hw_init_completed(padapter) ? "_TRUE" : "_FALSE");
4474 
4475 		/* s1. */
4476 		if (pnetdev)
4477 			rtw_netif_stop_queue(pnetdev);
4478 
4479 #ifndef CONFIG_RTW_ANDROID
4480 		/* s2. */
4481 		LeaveAllPowerSaveMode(padapter);
4482 		rtw_disassoc_cmd(padapter, 500, RTW_CMDF_WAIT_ACK);
4483 		/* s2-2.  indicate disconnect to os */
4484 		rtw_indicate_disconnect(padapter, 0, _FALSE);
4485 		/* s2-3. */
4486 		rtw_free_assoc_resources_cmd(padapter, _TRUE, RTW_CMDF_WAIT_ACK);
4487 		/* s2-4. */
4488 		rtw_free_network_queue(padapter, _TRUE);
4489 #endif
4490 	}
4491 
4492 #ifdef CONFIG_BR_EXT
4493 	/* if (OPMODE & (WIFI_STATION_STATE | WIFI_ADHOC_STATE)) */
4494 	{
4495 		/* void nat25_db_cleanup(_adapter *priv); */
4496 		nat25_db_cleanup(padapter);
4497 	}
4498 #endif /* CONFIG_BR_EXT */
4499 
4500 #ifdef CONFIG_P2P
4501 	if (!rtw_p2p_chk_role(&padapter->wdinfo, P2P_ROLE_DISABLE))
4502 		rtw_p2p_enable(padapter, P2P_ROLE_DISABLE);
4503 #endif /* CONFIG_P2P */
4504 
4505 	rtw_scan_abort(padapter); /* stop scanning process before wifi is going to down */
4506 #ifdef CONFIG_IOCTL_CFG80211
4507 	rtw_cfg80211_wait_scan_req_empty(padapter, 200);
4508 	adapter_wdev_data(padapter)->bandroid_scan = _FALSE;
4509 	/* padapter->rtw_wdev->iftype = NL80211_IFTYPE_MONITOR; */ /* set this at the end */
4510 #endif /* CONFIG_IOCTL_CFG80211 */
4511 
4512 #ifdef CONFIG_WAPI_SUPPORT
4513 	rtw_wapi_disable_tx(padapter);
4514 #endif
4515 #ifdef CONFIG_BT_COEXIST_SOCKET_TRX
4516 	if (is_primary_adapter(padapter) && (_TRUE == pHalData->EEPROMBluetoothCoexist))
4517 		rtw_btcoex_close_socket(padapter);
4518 	else
4519 		RTW_INFO("CONFIG_BT_COEXIST: VIRTUAL_ADAPTER\n");
4520 #endif /* CONFIG_BT_COEXIST_SOCKET_TRX */
4521 #else /* !CONFIG_PLATFORM_INTEL_BYT */
4522 
4523 	if (pwrctl->bInSuspend == _TRUE) {
4524 		RTW_INFO("+871x_drv - drv_close, bInSuspend=%d\n", pwrctl->bInSuspend);
4525 		return 0;
4526 	}
4527 
4528 	rtw_scan_abort(padapter); /* stop scanning process before wifi is going to down */
4529 #ifdef CONFIG_IOCTL_CFG80211
4530 	rtw_cfg80211_wait_scan_req_empty(padapter, 200);
4531 #endif
4532 
4533 	RTW_INFO("netdev_close, bips_processing=%d\n", pwrctl->bips_processing);
4534 	while (pwrctl->bips_processing == _TRUE) /* waiting for ips_processing done before call rtw_dev_unload() */
4535 		rtw_msleep_os(1);
4536 
4537 	rtw_dev_unload(padapter);
4538 	rtw_sdio_set_power(0);
4539 
4540 #endif /* !CONFIG_PLATFORM_INTEL_BYT */
4541 
4542 	RTW_INFO("-871x_drv - drv_close, bup=%d\n", padapter->bup);
4543 
4544 	return 0;
4545 
4546 }
4547 
4548 int pm_netdev_close(struct net_device *pnetdev, u8 bnormal)
4549 {
4550 	int status = 0;
4551 
4552 	status = netdev_close(pnetdev);
4553 
4554 	return status;
4555 }
4556 
4557 void rtw_ndev_destructor(struct net_device *ndev)
4558 {
4559 	RTW_INFO(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
4560 
4561 #ifdef CONFIG_IOCTL_CFG80211
4562 	if (ndev->ieee80211_ptr)
4563 		rtw_mfree((u8 *)ndev->ieee80211_ptr, sizeof(struct wireless_dev));
4564 #endif
4565 	free_netdev(ndev);
4566 }
4567 
4568 #ifdef CONFIG_ARP_KEEP_ALIVE
4569 struct route_info {
4570 	struct in_addr dst_addr;
4571 	struct in_addr src_addr;
4572 	struct in_addr gateway;
4573 	unsigned int dev_index;
4574 };
4575 
4576 static void parse_routes(struct nlmsghdr *nl_hdr, struct route_info *rt_info)
4577 {
4578 	struct rtmsg *rt_msg;
4579 	struct rtattr *rt_attr;
4580 	int rt_len;
4581 
4582 	rt_msg = (struct rtmsg *) NLMSG_DATA(nl_hdr);
4583 	if ((rt_msg->rtm_family != AF_INET) || (rt_msg->rtm_table != RT_TABLE_MAIN))
4584 		return;
4585 
4586 	rt_attr = (struct rtattr *) RTM_RTA(rt_msg);
4587 	rt_len = RTM_PAYLOAD(nl_hdr);
4588 
4589 	for (; RTA_OK(rt_attr, rt_len); rt_attr = RTA_NEXT(rt_attr, rt_len)) {
4590 		switch (rt_attr->rta_type) {
4591 		case RTA_OIF:
4592 			rt_info->dev_index = *(int *) RTA_DATA(rt_attr);
4593 			break;
4594 		case RTA_GATEWAY:
4595 			rt_info->gateway.s_addr = *(u_int *) RTA_DATA(rt_attr);
4596 			break;
4597 		case RTA_PREFSRC:
4598 			rt_info->src_addr.s_addr = *(u_int *) RTA_DATA(rt_attr);
4599 			break;
4600 		case RTA_DST:
4601 			rt_info->dst_addr.s_addr = *(u_int *) RTA_DATA(rt_attr);
4602 			break;
4603 		}
4604 	}
4605 }
4606 
4607 static int route_dump(u32 *gw_addr , int *gw_index)
4608 {
4609 	int err = 0;
4610 	struct socket *sock;
4611 	struct {
4612 		struct nlmsghdr nlh;
4613 		struct rtgenmsg g;
4614 	} req;
4615 	struct msghdr msg;
4616 	struct iovec iov;
4617 	struct sockaddr_nl nladdr;
4618 	mm_segment_t oldfs;
4619 	char *pg;
4620 	int size = 0;
4621 
4622 	err = sock_create(AF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE, &sock);
4623 	if (err) {
4624 		printk(": Could not create a datagram socket, error = %d\n", -ENXIO);
4625 		return err;
4626 	}
4627 
4628 	memset(&nladdr, 0, sizeof(nladdr));
4629 	nladdr.nl_family = AF_NETLINK;
4630 
4631 	req.nlh.nlmsg_len = sizeof(req);
4632 	req.nlh.nlmsg_type = RTM_GETROUTE;
4633 	req.nlh.nlmsg_flags = NLM_F_ROOT | NLM_F_MATCH | NLM_F_REQUEST;
4634 	req.nlh.nlmsg_pid = 0;
4635 	req.g.rtgen_family = AF_INET;
4636 
4637 	iov.iov_base = &req;
4638 	iov.iov_len = sizeof(req);
4639 
4640 	msg.msg_name = &nladdr;
4641 	msg.msg_namelen = sizeof(nladdr);
4642 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0))
4643 	/* referece:sock_xmit in kernel code
4644 	 * WRITE for sock_sendmsg, READ for sock_recvmsg
4645 	 * third parameter for msg_iovlen
4646 	 * last parameter for iov_len
4647 	 */
4648 	iov_iter_init(&msg.msg_iter, WRITE, &iov, 1, sizeof(req));
4649 #else
4650 	msg.msg_iov = &iov;
4651 	msg.msg_iovlen = 1;
4652 #endif
4653 	msg.msg_control = NULL;
4654 	msg.msg_controllen = 0;
4655 	msg.msg_flags = MSG_DONTWAIT;
4656 
4657 	oldfs = get_fs();
4658 	set_fs(KERNEL_DS);
4659 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0))
4660 	err = sock_sendmsg(sock, &msg);
4661 #else
4662 	err = sock_sendmsg(sock, &msg, sizeof(req));
4663 #endif
4664 	set_fs(oldfs);
4665 
4666 	if (err < 0)
4667 		goto out_sock;
4668 
4669 	pg = (char *) __get_free_page(GFP_KERNEL);
4670 	if (pg == NULL) {
4671 		err = -ENOMEM;
4672 		goto out_sock;
4673 	}
4674 
4675 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
4676 restart:
4677 #endif
4678 
4679 	for (;;) {
4680 		struct nlmsghdr *h;
4681 
4682 		iov.iov_base = pg;
4683 		iov.iov_len = PAGE_SIZE;
4684 
4685 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0))
4686 		iov_iter_init(&msg.msg_iter, READ, &iov, 1, PAGE_SIZE);
4687 #endif
4688 
4689 		oldfs = get_fs();
4690 		set_fs(KERNEL_DS);
4691 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0))
4692 		err = sock_recvmsg(sock, &msg, MSG_DONTWAIT);
4693 #else
4694 		err = sock_recvmsg(sock, &msg, PAGE_SIZE, MSG_DONTWAIT);
4695 #endif
4696 		set_fs(oldfs);
4697 
4698 		if (err < 0)
4699 			goto out_sock_pg;
4700 
4701 		if (msg.msg_flags & MSG_TRUNC) {
4702 			err = -ENOBUFS;
4703 			goto out_sock_pg;
4704 		}
4705 
4706 		h = (struct nlmsghdr *) pg;
4707 
4708 		while (NLMSG_OK(h, err)) {
4709 			struct route_info rt_info;
4710 			if (h->nlmsg_type == NLMSG_DONE) {
4711 				err = 0;
4712 				goto done;
4713 			}
4714 
4715 			if (h->nlmsg_type == NLMSG_ERROR) {
4716 				struct nlmsgerr *errm = (struct nlmsgerr *) NLMSG_DATA(h);
4717 				err = errm->error;
4718 				printk("NLMSG error: %d\n", errm->error);
4719 				goto done;
4720 			}
4721 
4722 			if (h->nlmsg_type == RTM_GETROUTE)
4723 				printk("RTM_GETROUTE: NLMSG: %d\n", h->nlmsg_type);
4724 			if (h->nlmsg_type != RTM_NEWROUTE) {
4725 				printk("NLMSG: %d\n", h->nlmsg_type);
4726 				err = -EINVAL;
4727 				goto done;
4728 			}
4729 
4730 			memset(&rt_info, 0, sizeof(struct route_info));
4731 			parse_routes(h, &rt_info);
4732 			if (!rt_info.dst_addr.s_addr && rt_info.gateway.s_addr && rt_info.dev_index) {
4733 				*gw_addr = rt_info.gateway.s_addr;
4734 				*gw_index = rt_info.dev_index;
4735 
4736 			}
4737 			h = NLMSG_NEXT(h, err);
4738 		}
4739 
4740 		if (err) {
4741 			printk("!!!Remnant of size %d %d %d\n", err, h->nlmsg_len, h->nlmsg_type);
4742 			err = -EINVAL;
4743 			break;
4744 		}
4745 	}
4746 
4747 done:
4748 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
4749 	if (!err && req.g.rtgen_family == AF_INET) {
4750 		req.g.rtgen_family = AF_INET6;
4751 
4752 		iov.iov_base = &req;
4753 		iov.iov_len = sizeof(req);
4754 
4755 		msg.msg_name = &nladdr;
4756 		msg.msg_namelen = sizeof(nladdr);
4757 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0))
4758 		iov_iter_init(&msg.msg_iter, WRITE, &iov, 1, sizeof(req));
4759 #else
4760 		msg.msg_iov = &iov;
4761 		msg.msg_iovlen = 1;
4762 #endif
4763 		msg.msg_control = NULL;
4764 		msg.msg_controllen = 0;
4765 		msg.msg_flags = MSG_DONTWAIT;
4766 
4767 		oldfs = get_fs();
4768 		set_fs(KERNEL_DS);
4769 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0))
4770 		err = sock_sendmsg(sock, &msg);
4771 #else
4772 		err = sock_sendmsg(sock, &msg, sizeof(req));
4773 #endif
4774 		set_fs(oldfs);
4775 
4776 		if (err > 0)
4777 			goto restart;
4778 	}
4779 #endif
4780 
4781 out_sock_pg:
4782 	free_page((unsigned long) pg);
4783 
4784 out_sock:
4785 	sock_release(sock);
4786 	return err;
4787 }
4788 
4789 static int arp_query(unsigned char *haddr, u32 paddr,
4790 		     struct net_device *dev)
4791 {
4792 	struct neighbour *neighbor_entry;
4793 	int	ret = 0;
4794 
4795 	neighbor_entry = neigh_lookup(&arp_tbl, &paddr, dev);
4796 
4797 	if (neighbor_entry != NULL) {
4798 		neighbor_entry->used = jiffies;
4799 		if (neighbor_entry->nud_state & NUD_VALID) {
4800 			_rtw_memcpy(haddr, neighbor_entry->ha, dev->addr_len);
4801 			ret = 1;
4802 		}
4803 		neigh_release(neighbor_entry);
4804 	}
4805 	return ret;
4806 }
4807 
4808 static int get_defaultgw(u32 *ip_addr , char mac[])
4809 {
4810 	int gw_index = 0; /* oif device index */
4811 	struct net_device *gw_dev = NULL; /* oif device */
4812 
4813 	route_dump(ip_addr, &gw_index);
4814 
4815 	if (!(*ip_addr) || !gw_index) {
4816 		/* RTW_INFO("No default GW\n"); */
4817 		return -1;
4818 	}
4819 
4820 	gw_dev = dev_get_by_index(&init_net, gw_index);
4821 
4822 	if (gw_dev == NULL) {
4823 		/* RTW_INFO("get Oif Device Fail\n"); */
4824 		return -1;
4825 	}
4826 
4827 	if (!arp_query(mac, *ip_addr, gw_dev)) {
4828 		/* RTW_INFO( "arp query failed\n"); */
4829 		dev_put(gw_dev);
4830 		return -1;
4831 
4832 	}
4833 	dev_put(gw_dev);
4834 
4835 	return 0;
4836 }
4837 
4838 int	rtw_gw_addr_query(_adapter *padapter)
4839 {
4840 	struct mlme_priv	*pmlmepriv = &padapter->mlmepriv;
4841 	struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);
4842 	u32 gw_addr = 0; /* default gw address */
4843 	unsigned char gw_mac[32] = {0}; /* default gw mac */
4844 	int i;
4845 	int res;
4846 
4847 	res = get_defaultgw(&gw_addr, gw_mac);
4848 	if (!res) {
4849 		pmlmepriv->gw_ip[0] = gw_addr & 0xff;
4850 		pmlmepriv->gw_ip[1] = (gw_addr & 0xff00) >> 8;
4851 		pmlmepriv->gw_ip[2] = (gw_addr & 0xff0000) >> 16;
4852 		pmlmepriv->gw_ip[3] = (gw_addr & 0xff000000) >> 24;
4853 		_rtw_memcpy(pmlmepriv->gw_mac_addr, gw_mac, ETH_ALEN);
4854 		RTW_INFO("%s Gateway Mac:\t" MAC_FMT "\n", __FUNCTION__, MAC_ARG(pmlmepriv->gw_mac_addr));
4855 		RTW_INFO("%s Gateway IP:\t" IP_FMT "\n", __FUNCTION__, IP_ARG(pmlmepriv->gw_ip));
4856 	} else
4857 		RTW_INFO("Get Gateway IP/MAC fail!\n");
4858 
4859 	return res;
4860 }
4861 #endif
4862 
4863 void rtw_dev_unload(PADAPTER padapter)
4864 {
4865 	struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);
4866 	struct dvobj_priv *pobjpriv = padapter->dvobj;
4867 	struct debug_priv *pdbgpriv = &pobjpriv->drv_dbg;
4868 	struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
4869 #ifdef CONFIG_WAKE_ON_BT
4870 	u8	disable = 0;
4871 #endif
4872 
4873 	if (padapter->bup == _TRUE) {
4874 		RTW_INFO("==> "FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));
4875 
4876 #ifdef CONFIG_WOWLAN
4877 #ifdef CONFIG_GPIO_WAKEUP
4878 		/*default wake up pin change to BT*/
4879 		RTW_INFO("%s:default wake up pin change to BT\n", __FUNCTION__);
4880 		rtw_hal_switch_gpio_wl_ctrl(padapter, pwrctl->wowlan_gpio_index, _FALSE);
4881 #endif /* CONFIG_GPIO_WAKEUP */
4882 #endif /* CONFIG_WOWLAN */
4883 
4884 #ifdef CONFIG_WAKE_ON_BT
4885 	rtw_hal_set_hwreg(padapter, HW_VAR_WAKE_ON_BT_GPIO_SWITCH, (u8 *)(&disable));
4886 #endif
4887 
4888 		rtw_set_drv_stopped(padapter);
4889 #ifdef CONFIG_XMIT_ACK
4890 		if (padapter->xmitpriv.ack_tx)
4891 			rtw_ack_tx_done(&padapter->xmitpriv, RTW_SCTX_DONE_DRV_STOP);
4892 #endif
4893 
4894 		rtw_intf_stop(padapter);
4895 
4896 		rtw_stop_drv_threads(padapter);
4897 
4898 		if (ATOMIC_READ(&(pcmdpriv->cmdthd_running)) == _TRUE) {
4899 			RTW_ERR("cmd_thread not stop !!\n");
4900 			rtw_warn_on(1);
4901 		}
4902 
4903 		/* check the status of IPS */
4904 		if (rtw_hal_check_ips_status(padapter) == _TRUE || pwrctl->rf_pwrstate == rf_off) { /* check HW status and SW state */
4905 			RTW_PRINT("%s: driver in IPS-FWLPS\n", __func__);
4906 			pdbgpriv->dbg_dev_unload_inIPS_cnt++;
4907 		} else
4908 			RTW_PRINT("%s: driver not in IPS\n", __func__);
4909 
4910 		if (!rtw_is_surprise_removed(padapter)) {
4911 #ifdef CONFIG_BT_COEXIST
4912 			rtw_btcoex_IpsNotify(padapter, pwrctl->ips_mode_req);
4913 #endif
4914 #ifdef CONFIG_WOWLAN
4915 			if (pwrctl->bSupportRemoteWakeup == _TRUE &&
4916 			    pwrctl->wowlan_mode == _TRUE)
4917 				RTW_PRINT("%s bSupportRemoteWakeup==_TRUE  do not run rtw_hal_deinit()\n", __FUNCTION__);
4918 			else
4919 #endif
4920 			{
4921 				/* amy modify 20120221 for power seq is different between driver open and ips */
4922 				rtw_hal_deinit(padapter);
4923 			}
4924 			rtw_set_surprise_removed(padapter);
4925 		}
4926 
4927 		padapter->bup = _FALSE;
4928 
4929 		RTW_INFO("<== "FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));
4930 	} else {
4931 		RTW_INFO("%s: bup==_FALSE\n", __FUNCTION__);
4932 	}
4933 	rtw_cancel_all_timer(padapter);
4934 }
4935 
4936 int rtw_suspend_free_assoc_resource(_adapter *padapter)
4937 {
4938 	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
4939 #ifdef CONFIG_P2P
4940 	struct wifidirect_info	*pwdinfo = &padapter->wdinfo;
4941 #endif /* CONFIG_P2P */
4942 
4943 	RTW_INFO("==> "FUNC_ADPT_FMT" entry....\n", FUNC_ADPT_ARG(padapter));
4944 
4945 	if (rtw_chk_roam_flags(padapter, RTW_ROAM_ON_RESUME)) {
4946 		if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)
4947 			&& check_fwstate(pmlmepriv, WIFI_ASOC_STATE)
4948 			#ifdef CONFIG_P2P
4949 			&& (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)
4950 				#if defined(CONFIG_IOCTL_CFG80211) && RTW_P2P_GROUP_INTERFACE
4951 				|| rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE)
4952 				#endif
4953 				)
4954 			#endif /* CONFIG_P2P */
4955 		) {
4956 			RTW_INFO("%s %s(" MAC_FMT "), length:%d assoc_ssid.length:%d\n", __FUNCTION__,
4957 				pmlmepriv->cur_network.network.Ssid.Ssid,
4958 				MAC_ARG(pmlmepriv->cur_network.network.MacAddress),
4959 				pmlmepriv->cur_network.network.Ssid.SsidLength,
4960 				pmlmepriv->assoc_ssid.SsidLength);
4961 			rtw_set_to_roam(padapter, 1);
4962 		}
4963 	}
4964 
4965 	if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) && check_fwstate(pmlmepriv, WIFI_ASOC_STATE)) {
4966 		rtw_disassoc_cmd(padapter, 0, RTW_CMDF_DIRECTLY);
4967 		/* s2-2.  indicate disconnect to os */
4968 		rtw_indicate_disconnect(padapter, 0, _FALSE);
4969 	}
4970 #ifdef CONFIG_AP_MODE
4971 	else if (MLME_IS_AP(padapter) || MLME_IS_MESH(padapter))
4972 		rtw_sta_flush(padapter, _TRUE);
4973 #endif
4974 
4975 	/* s2-3. */
4976 	rtw_free_assoc_resources(padapter, _TRUE);
4977 
4978 	/* s2-4. */
4979 	rtw_free_network_queue(padapter, _TRUE);
4980 
4981 	if (check_fwstate(pmlmepriv, WIFI_UNDER_SURVEY)) {
4982 		RTW_PRINT("%s: fw_under_survey\n", __func__);
4983 		rtw_indicate_scan_done(padapter, 1);
4984 		clr_fwstate(pmlmepriv, WIFI_UNDER_SURVEY);
4985 	}
4986 
4987 	if (check_fwstate(pmlmepriv, WIFI_UNDER_LINKING) == _TRUE) {
4988 		RTW_PRINT("%s: fw_under_linking\n", __FUNCTION__);
4989 		rtw_indicate_disconnect(padapter, 0, _FALSE);
4990 	}
4991 
4992 	RTW_INFO("<== "FUNC_ADPT_FMT" exit....\n", FUNC_ADPT_ARG(padapter));
4993 	return _SUCCESS;
4994 }
4995 
4996 #ifdef CONFIG_WOWLAN
4997 int rtw_suspend_wow(_adapter *padapter)
4998 {
4999 	u8 ch, bw, offset;
5000 	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
5001 	struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
5002 	struct wowlan_ioctl_param poidparam;
5003 	int ret = _SUCCESS;
5004 	u8 en = _TRUE, i;
5005 	struct registry_priv *registry_par = &padapter->registrypriv;
5006 	struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
5007 	_adapter *iface = NULL;
5008 	struct hal_spec_t *hal_spec = GET_HAL_SPEC(padapter);
5009 #ifdef CONFIG_WAKE_ON_BT
5010 	u8 enable = 1;
5011 #endif
5012 	RTW_INFO("==> "FUNC_ADPT_FMT" entry....\n", FUNC_ADPT_ARG(padapter));
5013 
5014 
5015 	RTW_INFO("wowlan_mode: %d\n", pwrpriv->wowlan_mode);
5016 	RTW_INFO("wowlan_pno_enable: %d\n", pwrpriv->wowlan_pno_enable);
5017 #ifdef CONFIG_P2P_WOWLAN
5018 	RTW_INFO("wowlan_p2p_enable: %d\n", pwrpriv->wowlan_p2p_enable);
5019 #endif
5020 
5021 	rtw_mi_netif_stop_queue(padapter);
5022 	#ifdef CONFIG_CONCURRENT_MODE
5023 	rtw_mi_buddy_netif_carrier_off(padapter);
5024 	#endif
5025 
5026 	/* 0. Power off LED */
5027 	rtw_led_control(padapter, LED_CTL_POWER_OFF);
5028 
5029 #ifdef CONFIG_WAKE_ON_BT
5030 	rtw_hal_set_hwreg(padapter, HW_VAR_WAKE_ON_BT_GPIO_SWITCH, (u8 *)(&enable));
5031 #endif
5032 
5033 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
5034 	/* 2.only for SDIO disable interrupt */
5035 	rtw_intf_stop(padapter);
5036 
5037 	/* 2.1 clean interrupt */
5038 	rtw_hal_clear_interrupt(padapter);
5039 #endif /* CONFIG_SDIO_HCI */
5040 
5041 	/* enable ac lifetime during scan to avoid txfifo not empty. */
5042 	dvobj->lifetime_en = rtw_read8(padapter, 0x426);
5043 	dvobj->pkt_lifetime = rtw_read32(padapter, 0x4c0);
5044 	rtw_write8(padapter, 0x426, rtw_read8(padapter, 0x426) | 0x0f);
5045 	if(hal_spec->tx_aclt_unit_factor == 1) {
5046 		rtw_write16(padapter, 0x4c0, 0x1000);	// unit: 32us. 131ms
5047 		rtw_write16(padapter, 0x4c0 + 2 , 0x1000);	// unit: 32us. 131ms
5048 	} else {
5049 		rtw_write16(padapter, 0x4c0, 0x0200);	// unit: 256us. 131ms
5050 		rtw_write16(padapter, 0x4c0 + 2 , 0x0200);	// unit: 256us. 131ms
5051 	}
5052 	for (i = 0; i < dvobj->iface_nums; i++) {
5053 		iface = dvobj->padapters[i];
5054 		if ((iface) && rtw_is_adapter_up(iface)) {
5055 			rtw_write_port_cancel(iface);
5056 			RTW_INFO(ADPT_FMT " write port cancel\n", ADPT_ARG(iface));
5057 		}
5058 	}
5059 	RTW_INFO("lifetime_en=%x, pkt_lifetime=%x\n", rtw_read8(padapter, 0x426), rtw_read32(padapter, 0x4c0));
5060 	rtw_msleep_os(200);
5061 
5062 	/* 1. stop thread */
5063 	rtw_set_drv_stopped(padapter);	/*for stop thread*/
5064 	rtw_mi_stop_drv_threads(padapter);
5065 
5066 	rtw_clr_drv_stopped(padapter);	/*for 32k command*/
5067 
5068 	/* #ifdef CONFIG_LPS */
5069 	/* rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "WOWLAN"); */
5070 	/* #endif */
5071 
5072 	#if defined(CONFIG_SDIO_HCI) && (CONFIG_RTW_SDIO_RELEASE_IRQ >= 1)
5073 	sdio_free_irq(adapter_to_dvobj(padapter));
5074 	#endif
5075 
5076 #ifdef CONFIG_RUNTIME_PORT_SWITCH
5077 	if (rtw_port_switch_chk(padapter)) {
5078 		RTW_INFO(" ### PORT SWITCH ###\n");
5079 		rtw_hal_set_hwreg(padapter, HW_VAR_PORT_SWITCH, NULL);
5080 	}
5081 #endif
5082 	if(registry_par->suspend_type == FW_IPS_WRC)
5083 		rtw_hal_set_hwreg(padapter, HW_VAR_VENDOR_WOW_MODE, &en);
5084 #ifdef CONFIG_LPS
5085 	if (!pwrpriv->wowlan_pno_enable) {
5086 		if(pwrpriv->wowlan_power_mgmt != PS_MODE_ACTIVE) {
5087 			rtw_wow_lps_level_decide(padapter, _TRUE);
5088 		}
5089 	}
5090 #endif
5091 	poidparam.subcode = WOWLAN_ENABLE;
5092 	rtw_hal_set_hwreg(padapter, HW_VAR_WOWLAN, (u8 *)&poidparam);
5093 	if (rtw_chk_roam_flags(padapter, RTW_ROAM_ON_RESUME)) {
5094 		if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)
5095 		    && check_fwstate(pmlmepriv, WIFI_ASOC_STATE)) {
5096 			RTW_INFO("%s %s(" MAC_FMT "), length:%d assoc_ssid.length:%d\n", __FUNCTION__,
5097 				pmlmepriv->cur_network.network.Ssid.Ssid,
5098 				MAC_ARG(pmlmepriv->cur_network.network.MacAddress),
5099 				pmlmepriv->cur_network.network.Ssid.SsidLength,
5100 				 pmlmepriv->assoc_ssid.SsidLength);
5101 
5102 			rtw_set_to_roam(padapter, 0);
5103 		}
5104 	}
5105 
5106 	RTW_PRINT("%s: wowmode suspending\n", __func__);
5107 
5108 	if (check_fwstate(pmlmepriv, WIFI_UNDER_SURVEY) == _TRUE) {
5109 		RTW_PRINT("%s: fw_under_survey\n", __func__);
5110 		rtw_indicate_scan_done(padapter, 1);
5111 		clr_fwstate(pmlmepriv, WIFI_UNDER_SURVEY);
5112 	}
5113 
5114 	if (rtw_mi_check_status(padapter, MI_LINKED)) {
5115 		ch =  rtw_mi_get_union_chan(padapter);
5116 		bw = rtw_mi_get_union_bw(padapter);
5117 		offset = rtw_mi_get_union_offset(padapter);
5118 		RTW_INFO(FUNC_ADPT_FMT" back to linked/linking union - ch:%u, bw:%u, offset:%u\n",
5119 			 FUNC_ADPT_ARG(padapter), ch, bw, offset);
5120 		set_channel_bwmode(padapter, ch, offset, bw);
5121 	}
5122 
5123 #ifdef CONFIG_CONCURRENT_MODE
5124 	rtw_mi_buddy_suspend_free_assoc_resource(padapter);
5125 #endif
5126 
5127 #ifdef CONFIG_BT_COEXIST
5128 	rtw_btcoex_SuspendNotify(padapter, BTCOEX_SUSPEND_STATE_SUSPEND_KEEP_ANT);
5129 #endif
5130 
5131 	if (pwrpriv->wowlan_pno_enable) {
5132 		RTW_PRINT("%s: pno: %d\n", __func__, pwrpriv->wowlan_pno_enable);
5133 #ifndef RTW_HALMAC
5134 #ifdef CONFIG_FWLPS_IN_IPS
5135 		rtw_set_fw_in_ips_mode(padapter, _TRUE);
5136 #endif
5137 #else /* RTW_HALMAC */
5138 		// TODO(Owen): Controlled by wowlan lps_level
5139 		/* Although ICs with HALMAC can have NLO PS (and LCLK) via H2C 0x8C,
5140 		 * we write RPWM here so that the enter/leave LCLK actions can be
5141 		 * symmetrical.
5142 		 */
5143 #ifdef CONFIG_LPS_LCLK
5144 		rtw_set_lps_lclk(padapter, _TRUE);
5145 #endif
5146 #endif
5147 	}
5148 #ifdef CONFIG_LPS
5149 	else {
5150 		if(pwrpriv->wowlan_power_mgmt != PS_MODE_ACTIVE) {
5151 			rtw_set_ps_mode(padapter, pwrpriv->wowlan_power_mgmt, 0, 0, "WOWLAN");
5152 		}
5153 	}
5154 #endif /* #ifdef CONFIG_LPS */
5155 
5156 	RTW_INFO("<== "FUNC_ADPT_FMT" exit....\n", FUNC_ADPT_ARG(padapter));
5157 	return ret;
5158 }
5159 #endif /* #ifdef CONFIG_WOWLAN */
5160 
5161 #ifdef CONFIG_AP_WOWLAN
5162 int rtw_suspend_ap_wow(_adapter *padapter)
5163 {
5164 	u8 ch, bw, offset;
5165 	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
5166 	struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
5167 	struct wowlan_ioctl_param poidparam;
5168 	int ret = _SUCCESS;
5169 
5170 	RTW_INFO("==> "FUNC_ADPT_FMT" entry....\n", FUNC_ADPT_ARG(padapter));
5171 
5172 	pwrpriv->wowlan_ap_mode = _TRUE;
5173 
5174 	RTW_INFO("wowlan_ap_mode: %d\n", pwrpriv->wowlan_ap_mode);
5175 
5176 	rtw_mi_netif_stop_queue(padapter);
5177 
5178 	/* 0. Power off LED */
5179 	rtw_led_control(padapter, LED_CTL_POWER_OFF);
5180 #ifdef CONFIG_SDIO_HCI
5181 	/* 2.only for SDIO disable interrupt*/
5182 	rtw_intf_stop(padapter);
5183 
5184 	/* 2.1 clean interrupt */
5185 	rtw_hal_clear_interrupt(padapter);
5186 #endif /* CONFIG_SDIO_HCI */
5187 
5188 	/* 1. stop thread */
5189 	rtw_set_drv_stopped(padapter);	/*for stop thread*/
5190 	rtw_mi_stop_drv_threads(padapter);
5191 	rtw_clr_drv_stopped(padapter);	/*for 32k command*/
5192 
5193 	#if defined(CONFIG_SDIO_HCI) && (CONFIG_RTW_SDIO_RELEASE_IRQ >= 1)
5194 	sdio_free_irq(adapter_to_dvobj(padapter));
5195 	#endif
5196 
5197 #ifdef CONFIG_RUNTIME_PORT_SWITCH
5198 	if (rtw_port_switch_chk(padapter)) {
5199 		RTW_INFO(" ### PORT SWITCH ###\n");
5200 		rtw_hal_set_hwreg(padapter, HW_VAR_PORT_SWITCH, NULL);
5201 	}
5202 #endif
5203 #ifdef CONFIG_LPS
5204 	if (!pwrpriv->wowlan_pno_enable) {
5205 		if(pwrpriv->wowlan_power_mgmt != PS_MODE_ACTIVE) {
5206 			rtw_wow_lps_level_decide(padapter, _TRUE);
5207 		}
5208 	}
5209 #endif
5210 	poidparam.subcode = WOWLAN_AP_ENABLE;
5211 	rtw_hal_set_hwreg(padapter, HW_VAR_WOWLAN, (u8 *)&poidparam);
5212 
5213 	RTW_PRINT("%s: wowmode suspending\n", __func__);
5214 
5215 	if (rtw_mi_check_status(padapter, MI_LINKED)) {
5216 		ch =  rtw_mi_get_union_chan(padapter);
5217 		bw = rtw_mi_get_union_bw(padapter);
5218 		offset = rtw_mi_get_union_offset(padapter);
5219 		RTW_INFO("back to linked/linking union - ch:%u, bw:%u, offset:%u\n", ch, bw, offset);
5220 		set_channel_bwmode(padapter, ch, offset, bw);
5221 	}
5222 
5223 	/*FOR ONE AP - TODO :Multi-AP*/
5224 	{
5225 		int i;
5226 		_adapter *iface;
5227 		struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
5228 
5229 		for (i = 0; i < dvobj->iface_nums; i++) {
5230 			iface = dvobj->padapters[i];
5231 			if ((iface) && rtw_is_adapter_up(iface)) {
5232 				if (check_fwstate(&iface->mlmepriv, WIFI_AP_STATE | WIFI_MESH_STATE) == _FALSE)
5233 					rtw_suspend_free_assoc_resource(iface);
5234 			}
5235 		}
5236 
5237 	}
5238 
5239 #ifdef CONFIG_BT_COEXIST
5240 	rtw_btcoex_SuspendNotify(padapter, BTCOEX_SUSPEND_STATE_SUSPEND_KEEP_ANT);
5241 #endif
5242 
5243 #ifdef CONFIG_LPS
5244 	if(pwrpriv->wowlan_power_mgmt != PS_MODE_ACTIVE) {
5245 		rtw_set_ps_mode(padapter, pwrpriv->wowlan_power_mgmt, 0, 0, "AP-WOWLAN");
5246 	}
5247 #endif
5248 
5249 	RTW_INFO("<== "FUNC_ADPT_FMT" exit....\n", FUNC_ADPT_ARG(padapter));
5250 	return ret;
5251 }
5252 #endif /* CONFIG_AP_WOWLAN */
5253 
5254 
5255 int rtw_suspend_normal(_adapter *padapter)
5256 {
5257 	int ret = _SUCCESS;
5258 
5259 	RTW_INFO("==> "FUNC_ADPT_FMT" entry....\n", FUNC_ADPT_ARG(padapter));
5260 
5261 #ifdef CONFIG_BT_COEXIST
5262 	rtw_btcoex_SuspendNotify(padapter, BTCOEX_SUSPEND_STATE_SUSPEND);
5263 #endif
5264 	rtw_mi_netif_caroff_qstop(padapter);
5265 
5266 	rtw_mi_suspend_free_assoc_resource(padapter);
5267 
5268 	rtw_led_control(padapter, LED_CTL_POWER_OFF);
5269 
5270 	if ((rtw_hal_check_ips_status(padapter) == _TRUE)
5271 	    || (adapter_to_pwrctl(padapter)->rf_pwrstate == rf_off))
5272 		RTW_PRINT("%s: ### ERROR #### driver in IPS ####ERROR###!!!\n", __FUNCTION__);
5273 
5274 
5275 #ifdef CONFIG_CONCURRENT_MODE
5276 	rtw_set_drv_stopped(padapter);	/*for stop thread*/
5277 	rtw_stop_cmd_thread(padapter);
5278 	rtw_drv_stop_vir_ifaces(adapter_to_dvobj(padapter));
5279 #endif
5280 	rtw_dev_unload(padapter);
5281 
5282 	#ifdef CONFIG_SDIO_HCI
5283 	sdio_deinit(adapter_to_dvobj(padapter));
5284 
5285 	#if (CONFIG_RTW_SDIO_RELEASE_IRQ >= 1)
5286 	sdio_free_irq(adapter_to_dvobj(padapter));
5287 	#endif
5288 	#endif /*CONFIG_SDIO_HCI*/
5289 
5290 	RTW_INFO("<== "FUNC_ADPT_FMT" exit....\n", FUNC_ADPT_ARG(padapter));
5291 	return ret;
5292 }
5293 
5294 int rtw_suspend_common(_adapter *padapter)
5295 {
5296 	struct dvobj_priv *dvobj = padapter->dvobj;
5297 	struct debug_priv *pdbgpriv = &dvobj->drv_dbg;
5298 	struct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(dvobj);
5299 #ifdef CONFIG_WOWLAN
5300 	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
5301 	struct registry_priv *registry_par = &padapter->registrypriv;
5302 #endif
5303 
5304 	int ret = 0;
5305 	systime start_time = rtw_get_current_time();
5306 
5307 	RTW_PRINT(" suspend start\n");
5308 	RTW_INFO("==> %s (%s:%d)\n", __FUNCTION__, current->comm, current->pid);
5309 
5310 	pdbgpriv->dbg_suspend_cnt++;
5311 
5312 	pwrpriv->bInSuspend = _TRUE;
5313 
5314 	while (pwrpriv->bips_processing == _TRUE)
5315 		rtw_msleep_os(1);
5316 
5317 #ifdef CONFIG_IOL_READ_EFUSE_MAP
5318 	if (!padapter->bup) {
5319 		u8 bMacPwrCtrlOn = _FALSE;
5320 		rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
5321 		if (bMacPwrCtrlOn)
5322 			rtw_hal_power_off(padapter);
5323 	}
5324 #endif
5325 
5326 	if ((!padapter->bup) || RTW_CANNOT_RUN(padapter)) {
5327 		RTW_INFO("%s bup=%d bDriverStopped=%s bSurpriseRemoved = %s\n", __func__
5328 			 , padapter->bup
5329 			 , rtw_is_drv_stopped(padapter) ? "True" : "False"
5330 			, rtw_is_surprise_removed(padapter) ? "True" : "False");
5331 		pdbgpriv->dbg_suspend_error_cnt++;
5332 		goto exit;
5333 	}
5334 	rtw_mi_scan_abort(padapter, _TRUE);
5335 	rtw_ps_deny(padapter, PS_DENY_SUSPEND);
5336 
5337 	rtw_mi_cancel_all_timer(padapter);
5338 	LeaveAllPowerSaveModeDirect(padapter);
5339 
5340 	rtw_ps_deny_cancel(padapter, PS_DENY_SUSPEND);
5341 
5342 	if (rtw_mi_check_status(padapter, MI_AP_MODE) == _FALSE) {
5343 #ifdef CONFIG_WOWLAN
5344 		if (WOWLAN_IS_STA_MIX_MODE(padapter))
5345 			pwrpriv->wowlan_mode = _TRUE;
5346 		else if ( registry_par->wowlan_enable && check_fwstate(pmlmepriv, WIFI_ASOC_STATE))
5347 			pwrpriv->wowlan_mode = _TRUE;
5348 		else if (pwrpriv->wowlan_pno_enable == _TRUE)
5349 			pwrpriv->wowlan_mode |= pwrpriv->wowlan_pno_enable;
5350 
5351 #ifdef CONFIG_P2P_WOWLAN
5352 		if (!rtw_p2p_chk_state(&padapter->wdinfo, P2P_STATE_NONE) || P2P_ROLE_DISABLE != padapter->wdinfo.role)
5353 			pwrpriv->wowlan_p2p_mode = _TRUE;
5354 		if (_TRUE == pwrpriv->wowlan_p2p_mode)
5355 			pwrpriv->wowlan_mode |= pwrpriv->wowlan_p2p_mode;
5356 #endif /* CONFIG_P2P_WOWLAN */
5357 
5358 		if (pwrpriv->wowlan_mode == _TRUE)
5359 			rtw_suspend_wow(padapter);
5360 		else
5361 #endif /* CONFIG_WOWLAN */
5362 			rtw_suspend_normal(padapter);
5363 	} else if (rtw_mi_check_status(padapter, MI_AP_MODE)) {
5364 #ifdef CONFIG_AP_WOWLAN
5365 		rtw_suspend_ap_wow(padapter);
5366 #else
5367 		rtw_suspend_normal(padapter);
5368 #endif /*CONFIG_AP_WOWLAN*/
5369 	}
5370 
5371 
5372 	RTW_PRINT("rtw suspend success in %d ms\n",
5373 		  rtw_get_passing_time_ms(start_time));
5374 
5375 exit:
5376 	RTW_INFO("<===  %s return %d.............. in %dms\n", __FUNCTION__
5377 		 , ret, rtw_get_passing_time_ms(start_time));
5378 
5379 	return ret;
5380 }
5381 
5382 #ifdef CONFIG_WOWLAN
5383 int rtw_resume_process_wow(_adapter *padapter)
5384 {
5385 	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
5386 	struct mlme_ext_priv	*pmlmeext = &padapter->mlmeextpriv;
5387 	struct mlme_ext_info	*pmlmeinfo = &(pmlmeext->mlmext_info);
5388 	struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
5389 	struct dvobj_priv *psdpriv = padapter->dvobj;
5390 	struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
5391 	struct wowlan_ioctl_param poidparam;
5392 	struct sta_info	*psta = NULL;
5393 	struct registry_priv  *registry_par = &padapter->registrypriv;
5394 	int ret = _SUCCESS;
5395 	u8 en = _FALSE;
5396 
5397 	RTW_INFO("==> "FUNC_ADPT_FMT" entry....\n", FUNC_ADPT_ARG(padapter));
5398 
5399 	if (padapter) {
5400 		pwrpriv = adapter_to_pwrctl(padapter);
5401 	} else {
5402 		pdbgpriv->dbg_resume_error_cnt++;
5403 		ret = -1;
5404 		goto exit;
5405 	}
5406 
5407 	if (RTW_CANNOT_RUN(padapter)) {
5408 		RTW_INFO("%s pdapter %p bDriverStopped %s bSurpriseRemoved %s\n"
5409 			 , __func__, padapter
5410 			 , rtw_is_drv_stopped(padapter) ? "True" : "False"
5411 			, rtw_is_surprise_removed(padapter) ? "True" : "False");
5412 		goto exit;
5413 	}
5414 
5415 	pwrpriv->wowlan_in_resume = _TRUE;
5416 
5417 	if (pwrpriv->wowlan_pno_enable) {
5418 		RTW_PRINT("%s: pno: %d\n", __func__, pwrpriv->wowlan_pno_enable);
5419 #ifndef RTW_HALMAC
5420 #ifdef CONFIG_FWLPS_IN_IPS
5421 		rtw_set_fw_in_ips_mode(padapter, _FALSE);
5422 #endif
5423 #else /* RTW_HALMAC */
5424 #ifdef CONFIG_LPS_LCLK
5425 		// TODO(Owen): Controlled by wowlan lps_level
5426 		rtw_set_lps_lclk(padapter, _FALSE);
5427 #endif
5428 #endif
5429 	} else {
5430 #ifdef CONFIG_LPS
5431 		if(pwrpriv->wowlan_power_mgmt != PS_MODE_ACTIVE) {
5432 			rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "WOWLAN");
5433 			rtw_wow_lps_level_decide(padapter, _FALSE);
5434 		}
5435 #endif /* CONFIG_LPS */
5436 	}
5437 
5438 	rtw_write8(padapter, 0x426, psdpriv->lifetime_en);
5439 	rtw_write32(padapter, 0x4c0, psdpriv->pkt_lifetime);
5440 
5441 	pwrpriv->bFwCurrentInPSMode = _FALSE;
5442 
5443 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_PCI_HCI)
5444 	rtw_mi_intf_stop(padapter);
5445 	rtw_hal_clear_interrupt(padapter);
5446 #endif
5447 
5448 	#if defined(CONFIG_SDIO_HCI) && (CONFIG_RTW_SDIO_RELEASE_IRQ >= 1)
5449 	if (sdio_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS) {
5450 		ret = -1;
5451 		goto exit;
5452 	}
5453 	#endif
5454 
5455 	/* Disable WOW, set H2C command */
5456 	poidparam.subcode = WOWLAN_DISABLE;
5457 	rtw_hal_set_hwreg(padapter, HW_VAR_WOWLAN, (u8 *)&poidparam);
5458 
5459 #ifdef CONFIG_CONCURRENT_MODE
5460 	rtw_mi_buddy_reset_drv_sw(padapter);
5461 #endif
5462 
5463 	psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv));
5464 	if (psta)
5465 		set_sta_rate(padapter, psta);
5466 
5467 
5468 	rtw_clr_drv_stopped(padapter);
5469 	RTW_INFO("%s: wowmode resuming, DriverStopped:%s\n", __func__, rtw_is_drv_stopped(padapter) ? "True" : "False");
5470 
5471 	if(registry_par->suspend_type == FW_IPS_WRC)
5472 		rtw_hal_set_hwreg(padapter, HW_VAR_VENDOR_WOW_MODE, &en);
5473 
5474 	rtw_mi_start_drv_threads(padapter);
5475 
5476 	rtw_mi_intf_start(padapter);
5477 
5478 	if(registry_par->suspend_type == FW_IPS_DISABLE_BBRF && !check_fwstate(pmlmepriv, WIFI_ASOC_STATE)) {
5479 		if (!rtw_is_surprise_removed(padapter)) {
5480 			rtw_hal_deinit(padapter);
5481 			rtw_hal_init(padapter);
5482 		}
5483 		RTW_INFO("FW_IPS_DISABLE_BBRF hal deinit, hal init \n");
5484 	}
5485 
5486 #ifdef CONFIG_CONCURRENT_MODE
5487 	rtw_mi_buddy_netif_carrier_on(padapter);
5488 #endif
5489 
5490 	/* start netif queue */
5491 	rtw_mi_netif_wake_queue(padapter);
5492 
5493 	if (padapter->pid[1] != 0) {
5494 		RTW_INFO("pid[1]:%d\n", padapter->pid[1]);
5495 		rtw_signal_process(padapter->pid[1], SIGUSR2);
5496 	}
5497 
5498 	if (rtw_chk_roam_flags(padapter, RTW_ROAM_ON_RESUME)) {
5499 		if (pwrpriv->wowlan_wake_reason == FW_DECISION_DISCONNECT ||
5500 		    pwrpriv->wowlan_wake_reason == RX_DISASSOC||
5501 		    pwrpriv->wowlan_wake_reason == RX_DEAUTH) {
5502 
5503 			RTW_INFO("%s: disconnect reason: %02x\n", __func__,
5504 				 pwrpriv->wowlan_wake_reason);
5505 			rtw_indicate_disconnect(padapter, 0, _FALSE);
5506 
5507 			rtw_sta_media_status_rpt(padapter,
5508 					 rtw_get_stainfo(&padapter->stapriv,
5509 					 get_bssid(&padapter->mlmepriv)), 0);
5510 
5511 			rtw_free_assoc_resources(padapter, _TRUE);
5512 			pmlmeinfo->state = WIFI_FW_NULL_STATE;
5513 
5514 		} else {
5515 			RTW_INFO("%s: do roaming\n", __func__);
5516 			rtw_roaming(padapter, NULL);
5517 		}
5518 	}
5519 
5520 	if (pwrpriv->wowlan_mode == _TRUE) {
5521 		pwrpriv->bips_processing = _FALSE;
5522 		_set_timer(&adapter_to_dvobj(padapter)->dynamic_chk_timer, 2000);
5523 #ifndef CONFIG_IPS_CHECK_IN_WD
5524 		rtw_set_pwr_state_check_timer(pwrpriv);
5525 #endif
5526 	} else
5527 		RTW_PRINT("do not reset timer\n");
5528 
5529 	pwrpriv->wowlan_mode = _FALSE;
5530 
5531 	/* Power On LED */
5532 #ifdef CONFIG_RTW_SW_LED
5533 
5534 	if (pwrpriv->wowlan_wake_reason == RX_DISASSOC||
5535 	    pwrpriv->wowlan_wake_reason == RX_DEAUTH||
5536 	    pwrpriv->wowlan_wake_reason == FW_DECISION_DISCONNECT)
5537 		rtw_led_control(padapter, LED_CTL_NO_LINK);
5538 	else
5539 		rtw_led_control(padapter, LED_CTL_LINK);
5540 #endif
5541 	/* clean driver side wake up reason. */
5542 	pwrpriv->wowlan_last_wake_reason = pwrpriv->wowlan_wake_reason;
5543 	pwrpriv->wowlan_wake_reason = 0;
5544 
5545 #ifdef CONFIG_BT_COEXIST
5546 	rtw_btcoex_SuspendNotify(padapter, BTCOEX_SUSPEND_STATE_RESUME);
5547 #endif /* CONFIG_BT_COEXIST */
5548 
5549 exit:
5550 	RTW_INFO("<== "FUNC_ADPT_FMT" exit....\n", FUNC_ADPT_ARG(padapter));
5551 	return ret;
5552 }
5553 #endif /* #ifdef CONFIG_WOWLAN */
5554 
5555 #ifdef CONFIG_AP_WOWLAN
5556 int rtw_resume_process_ap_wow(_adapter *padapter)
5557 {
5558 	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
5559 	struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
5560 	struct dvobj_priv *psdpriv = padapter->dvobj;
5561 	struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
5562 	struct wowlan_ioctl_param poidparam;
5563 	struct sta_info	*psta = NULL;
5564 	int ret = _SUCCESS;
5565 	u8 ch, bw, offset;
5566 
5567 	RTW_INFO("==> "FUNC_ADPT_FMT" entry....\n", FUNC_ADPT_ARG(padapter));
5568 
5569 	if (padapter) {
5570 		pwrpriv = adapter_to_pwrctl(padapter);
5571 	} else {
5572 		pdbgpriv->dbg_resume_error_cnt++;
5573 		ret = -1;
5574 		goto exit;
5575 	}
5576 
5577 
5578 #ifdef CONFIG_LPS
5579 	if(pwrpriv->wowlan_power_mgmt != PS_MODE_ACTIVE) {
5580 		rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "AP-WOWLAN");
5581 		rtw_wow_lps_level_decide(padapter, _FALSE);
5582 	}
5583 #endif /* CONFIG_LPS */
5584 
5585 	pwrpriv->bFwCurrentInPSMode = _FALSE;
5586 
5587 	rtw_hal_disable_interrupt(padapter);
5588 
5589 	rtw_hal_clear_interrupt(padapter);
5590 
5591 	#if defined(CONFIG_SDIO_HCI) && (CONFIG_RTW_SDIO_RELEASE_IRQ >= 1)
5592 	if (sdio_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS) {
5593 		ret = -1;
5594 		goto exit;
5595 	}
5596 	#endif
5597 
5598 	/* Disable WOW, set H2C command */
5599 	poidparam.subcode = WOWLAN_AP_DISABLE;
5600 	rtw_hal_set_hwreg(padapter, HW_VAR_WOWLAN, (u8 *)&poidparam);
5601 	pwrpriv->wowlan_ap_mode = _FALSE;
5602 
5603 	rtw_clr_drv_stopped(padapter);
5604 	RTW_INFO("%s: wowmode resuming, DriverStopped:%s\n", __func__, rtw_is_drv_stopped(padapter) ? "True" : "False");
5605 
5606 	rtw_mi_start_drv_threads(padapter);
5607 
5608 	if (rtw_mi_check_status(padapter, MI_LINKED)) {
5609 		ch =  rtw_mi_get_union_chan(padapter);
5610 		bw = rtw_mi_get_union_bw(padapter);
5611 		offset = rtw_mi_get_union_offset(padapter);
5612 		RTW_INFO(FUNC_ADPT_FMT" back to linked/linking union - ch:%u, bw:%u, offset:%u\n", FUNC_ADPT_ARG(padapter), ch, bw, offset);
5613 		set_channel_bwmode(padapter, ch, offset, bw);
5614 	}
5615 
5616 	/*FOR ONE AP - TODO :Multi-AP*/
5617 	{
5618 		int i;
5619 		_adapter *iface;
5620 		struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
5621 
5622 		for (i = 0; i < dvobj->iface_nums; i++) {
5623 			iface = dvobj->padapters[i];
5624 			if ((iface) && rtw_is_adapter_up(iface)) {
5625 				if (check_fwstate(&iface->mlmepriv, WIFI_AP_STATE | WIFI_MESH_STATE | WIFI_ASOC_STATE))
5626 					rtw_reset_drv_sw(iface);
5627 			}
5628 		}
5629 
5630 	}
5631 	rtw_mi_intf_start(padapter);
5632 
5633 	/* start netif queue */
5634 	rtw_mi_netif_wake_queue(padapter);
5635 
5636 	if (padapter->pid[1] != 0) {
5637 		RTW_INFO("pid[1]:%d\n", padapter->pid[1]);
5638 		rtw_signal_process(padapter->pid[1], SIGUSR2);
5639 	}
5640 
5641 #ifdef CONFIG_RESUME_IN_WORKQUEUE
5642 	/* rtw_unlock_suspend(); */
5643 #endif /* CONFIG_RESUME_IN_WORKQUEUE */
5644 
5645 	pwrpriv->bips_processing = _FALSE;
5646 	_set_timer(&adapter_to_dvobj(padapter)->dynamic_chk_timer, 2000);
5647 #ifndef CONFIG_IPS_CHECK_IN_WD
5648 	rtw_set_pwr_state_check_timer(pwrpriv);
5649 #endif
5650 	/* clean driver side wake up reason. */
5651 	pwrpriv->wowlan_wake_reason = 0;
5652 
5653 #ifdef CONFIG_BT_COEXIST
5654 	rtw_btcoex_SuspendNotify(padapter, BTCOEX_SUSPEND_STATE_RESUME);
5655 #endif /* CONFIG_BT_COEXIST */
5656 
5657 	/* Power On LED */
5658 #ifdef CONFIG_RTW_SW_LED
5659 
5660 	rtw_led_control(padapter, LED_CTL_LINK);
5661 #endif
5662 exit:
5663 	RTW_INFO("<== "FUNC_ADPT_FMT" exit....\n", FUNC_ADPT_ARG(padapter));
5664 	return ret;
5665 }
5666 #endif /* #ifdef CONFIG_APWOWLAN */
5667 
5668 void rtw_mi_resume_process_normal(_adapter *padapter)
5669 {
5670 	int i;
5671 	_adapter *iface;
5672 	struct mlme_priv *pmlmepriv;
5673 	struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
5674 
5675 	for (i = 0; i < dvobj->iface_nums; i++) {
5676 		iface = dvobj->padapters[i];
5677 		if ((iface) && rtw_is_adapter_up(iface)) {
5678 			pmlmepriv = &iface->mlmepriv;
5679 
5680 			if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
5681 				RTW_INFO(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_STATION_STATE\n", FUNC_ADPT_ARG(iface), get_fwstate(pmlmepriv));
5682 
5683 				if (rtw_chk_roam_flags(iface, RTW_ROAM_ON_RESUME))
5684 					rtw_roaming(iface, NULL);
5685 
5686 			}
5687 #ifdef CONFIG_AP_MODE
5688 			else if (MLME_IS_AP(iface) || MLME_IS_MESH(iface)) {
5689 				RTW_INFO(FUNC_ADPT_FMT" %s\n", FUNC_ADPT_ARG(iface), MLME_IS_AP(iface) ? "AP" : "MESH");
5690 				rtw_ap_restore_network(iface);
5691 			}
5692 #endif
5693 			else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE))
5694 				RTW_INFO(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_ADHOC_STATE\n", FUNC_ADPT_ARG(iface), get_fwstate(pmlmepriv));
5695 			else
5696 				RTW_INFO(FUNC_ADPT_FMT" fwstate:0x%08x - ???\n", FUNC_ADPT_ARG(iface), get_fwstate(pmlmepriv));
5697 		}
5698 	}
5699 }
5700 
5701 int rtw_resume_process_normal(_adapter *padapter)
5702 {
5703 	struct net_device *pnetdev;
5704 	struct pwrctrl_priv *pwrpriv;
5705 	struct dvobj_priv *psdpriv;
5706 	struct debug_priv *pdbgpriv;
5707 
5708 	int ret = _SUCCESS;
5709 
5710 	if (!padapter) {
5711 		ret = -1;
5712 		goto exit;
5713 	}
5714 
5715 	pnetdev = padapter->pnetdev;
5716 	pwrpriv = adapter_to_pwrctl(padapter);
5717 	psdpriv = padapter->dvobj;
5718 	pdbgpriv = &psdpriv->drv_dbg;
5719 
5720 	RTW_INFO("==> "FUNC_ADPT_FMT" entry....\n", FUNC_ADPT_ARG(padapter));
5721 
5722 	#ifdef CONFIG_SDIO_HCI
5723 	/* interface init */
5724 	if (sdio_init(adapter_to_dvobj(padapter)) != _SUCCESS) {
5725 		ret = -1;
5726 		goto exit;
5727 	}
5728 	#endif/*CONFIG_SDIO_HCI*/
5729 
5730 	rtw_clr_surprise_removed(padapter);
5731 	rtw_hal_disable_interrupt(padapter);
5732 
5733 	#if defined(CONFIG_SDIO_HCI) && (CONFIG_RTW_SDIO_RELEASE_IRQ >= 1)
5734 	if (sdio_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS) {
5735 		ret = -1;
5736 		goto exit;
5737 	}
5738 	#endif
5739 
5740 	rtw_mi_reset_drv_sw(padapter);
5741 
5742 	pwrpriv->bkeepfwalive = _FALSE;
5743 
5744 	RTW_INFO("bkeepfwalive(%x)\n", pwrpriv->bkeepfwalive);
5745 	if (pm_netdev_open(pnetdev, _TRUE) != 0) {
5746 		ret = -1;
5747 		pdbgpriv->dbg_resume_error_cnt++;
5748 		goto exit;
5749 	}
5750 
5751 	rtw_mi_netif_caron_qstart(padapter);
5752 
5753 	if (padapter->pid[1] != 0) {
5754 		RTW_INFO("pid[1]:%d\n", padapter->pid[1]);
5755 		rtw_signal_process(padapter->pid[1], SIGUSR2);
5756 	}
5757 
5758 #ifdef CONFIG_BT_COEXIST
5759 	rtw_btcoex_SuspendNotify(padapter, BTCOEX_SUSPEND_STATE_RESUME);
5760 #endif /* CONFIG_BT_COEXIST */
5761 
5762 	rtw_mi_resume_process_normal(padapter);
5763 
5764 #ifdef CONFIG_RESUME_IN_WORKQUEUE
5765 	/* rtw_unlock_suspend(); */
5766 #endif /* CONFIG_RESUME_IN_WORKQUEUE */
5767 	RTW_INFO("<== "FUNC_ADPT_FMT" exit....\n", FUNC_ADPT_ARG(padapter));
5768 
5769 exit:
5770 	return ret;
5771 }
5772 
5773 int rtw_resume_common(_adapter *padapter)
5774 {
5775 	int ret = 0;
5776 	systime start_time = rtw_get_current_time();
5777 	struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
5778 #ifdef CONFIG_WAKE_ON_BT
5779 	u8 disable = 0;
5780 #endif
5781 
5782 	if (pwrpriv == NULL)
5783 		return 0;
5784 
5785 	if (pwrpriv->bInSuspend == _FALSE)
5786 		return 0;
5787 
5788 	RTW_PRINT("resume start\n");
5789 	RTW_INFO("==> %s (%s:%d)\n", __FUNCTION__, current->comm, current->pid);
5790 
5791 	if (rtw_mi_check_status(padapter, MI_AP_MODE) == _FALSE) {
5792 #ifdef CONFIG_WOWLAN
5793 		if (pwrpriv->wowlan_mode == _TRUE)
5794 			rtw_resume_process_wow(padapter);
5795 		else
5796 #endif
5797 			rtw_resume_process_normal(padapter);
5798 
5799 	} else if (rtw_mi_check_status(padapter, MI_AP_MODE)) {
5800 #ifdef CONFIG_AP_WOWLAN
5801 		rtw_resume_process_ap_wow(padapter);
5802 #else
5803 		rtw_resume_process_normal(padapter);
5804 #endif /* CONFIG_AP_WOWLAN */
5805 	}
5806 
5807 #ifdef CONFIG_WAKE_ON_BT
5808 	rtw_hal_set_hwreg(padapter, HW_VAR_WAKE_ON_BT_GPIO_SWITCH, (u8 *)(&disable));
5809 #endif
5810 
5811 	pwrpriv->bInSuspend = _FALSE;
5812 	pwrpriv->wowlan_in_resume = _FALSE;
5813 
5814 	RTW_PRINT("%s:%d in %d ms\n", __FUNCTION__ , ret,
5815 		  rtw_get_passing_time_ms(start_time));
5816 
5817 
5818 	return ret;
5819 }
5820 
5821 #ifdef CONFIG_GPIO_API
5822 u8 rtw_get_gpio(struct net_device *netdev, u8 gpio_num)
5823 {
5824 	_adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);
5825 	return rtw_hal_get_gpio(adapter, gpio_num);
5826 }
5827 EXPORT_SYMBOL(rtw_get_gpio);
5828 
5829 int  rtw_set_gpio_output_value(struct net_device *netdev, u8 gpio_num, bool isHigh)
5830 {
5831 	u8 direction = 0;
5832 	u8 res = -1;
5833 	_adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);
5834 	return rtw_hal_set_gpio_output_value(adapter, gpio_num, isHigh);
5835 }
5836 EXPORT_SYMBOL(rtw_set_gpio_output_value);
5837 
5838 int rtw_config_gpio(struct net_device *netdev, u8 gpio_num, bool isOutput)
5839 {
5840 	_adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);
5841 	return rtw_hal_config_gpio(adapter, gpio_num, isOutput);
5842 }
5843 EXPORT_SYMBOL(rtw_config_gpio);
5844 int rtw_register_gpio_interrupt(struct net_device *netdev, int gpio_num, void(*callback)(u8 level))
5845 {
5846 	_adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);
5847 	return rtw_hal_register_gpio_interrupt(adapter, gpio_num, callback);
5848 }
5849 EXPORT_SYMBOL(rtw_register_gpio_interrupt);
5850 
5851 int rtw_disable_gpio_interrupt(struct net_device *netdev, int gpio_num)
5852 {
5853 	_adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);
5854 	return rtw_hal_disable_gpio_interrupt(adapter, gpio_num);
5855 }
5856 EXPORT_SYMBOL(rtw_disable_gpio_interrupt);
5857 
5858 #endif /* #ifdef CONFIG_GPIO_API */
5859 
5860 #ifdef CONFIG_APPEND_VENDOR_IE_ENABLE
5861 
5862 int rtw_vendor_ie_get_api(struct net_device *dev, int ie_num, char *extra,
5863 		u16 extra_len)
5864 {
5865 	int ret = 0;
5866 
5867 	ret = rtw_vendor_ie_get_raw_data(dev, ie_num, extra, extra_len);
5868 	return ret;
5869 }
5870 EXPORT_SYMBOL(rtw_vendor_ie_get_api);
5871 
5872 int rtw_vendor_ie_set_api(struct net_device *dev, char *extra)
5873 {
5874 	return rtw_vendor_ie_set(dev, NULL, NULL, extra);
5875 }
5876 EXPORT_SYMBOL(rtw_vendor_ie_set_api);
5877 
5878 #endif
5879