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