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