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