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