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 = ®sty->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