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