• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  * Copyright(c) 2009-2012  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  * You should have received a copy of the GNU General Public License along with
15  * this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17  *
18  * The full GNU General Public License is included in this distribution in the
19  * file called LICENSE.
20  *
21  * Contact Information:
22  * wlanfae <wlanfae@realtek.com>
23  * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
24  * Hsinchu 300, Taiwan.
25  *
26  * Larry Finger <Larry.Finger@lwfinger.net>
27  *
28  *****************************************************************************/
29 
30 #include "wifi.h"
31 #include "rc.h"
32 #include "base.h"
33 #include "efuse.h"
34 #include "cam.h"
35 #include "ps.h"
36 #include "regd.h"
37 
38 #include <linux/ip.h>
39 #include <linux/module.h>
40 
41 /*
42  *NOTICE!!!: This file will be very big, we should
43  *keep it clear under following roles:
44  *
45  *This file include following parts, so, if you add new
46  *functions into this file, please check which part it
47  *should includes. or check if you should add new part
48  *for this file:
49  *
50  *1) mac80211 init functions
51  *2) tx information functions
52  *3) functions called by core.c
53  *4) wq & timer callback functions
54  *5) frame process functions
55  *6) IOT functions
56  *7) sysfs functions
57  *8) ...
58  */
59 
60 /*********************************************************
61  *
62  * mac80211 init functions
63  *
64  *********************************************************/
65 static struct ieee80211_channel rtl_channeltable_2g[] = {
66 	{.center_freq = 2412, .hw_value = 1,},
67 	{.center_freq = 2417, .hw_value = 2,},
68 	{.center_freq = 2422, .hw_value = 3,},
69 	{.center_freq = 2427, .hw_value = 4,},
70 	{.center_freq = 2432, .hw_value = 5,},
71 	{.center_freq = 2437, .hw_value = 6,},
72 	{.center_freq = 2442, .hw_value = 7,},
73 	{.center_freq = 2447, .hw_value = 8,},
74 	{.center_freq = 2452, .hw_value = 9,},
75 	{.center_freq = 2457, .hw_value = 10,},
76 	{.center_freq = 2462, .hw_value = 11,},
77 	{.center_freq = 2467, .hw_value = 12,},
78 	{.center_freq = 2472, .hw_value = 13,},
79 	{.center_freq = 2484, .hw_value = 14,},
80 };
81 
82 static struct ieee80211_channel rtl_channeltable_5g[] = {
83 	{.center_freq = 5180, .hw_value = 36,},
84 	{.center_freq = 5200, .hw_value = 40,},
85 	{.center_freq = 5220, .hw_value = 44,},
86 	{.center_freq = 5240, .hw_value = 48,},
87 	{.center_freq = 5260, .hw_value = 52,},
88 	{.center_freq = 5280, .hw_value = 56,},
89 	{.center_freq = 5300, .hw_value = 60,},
90 	{.center_freq = 5320, .hw_value = 64,},
91 	{.center_freq = 5500, .hw_value = 100,},
92 	{.center_freq = 5520, .hw_value = 104,},
93 	{.center_freq = 5540, .hw_value = 108,},
94 	{.center_freq = 5560, .hw_value = 112,},
95 	{.center_freq = 5580, .hw_value = 116,},
96 	{.center_freq = 5600, .hw_value = 120,},
97 	{.center_freq = 5620, .hw_value = 124,},
98 	{.center_freq = 5640, .hw_value = 128,},
99 	{.center_freq = 5660, .hw_value = 132,},
100 	{.center_freq = 5680, .hw_value = 136,},
101 	{.center_freq = 5700, .hw_value = 140,},
102 	{.center_freq = 5745, .hw_value = 149,},
103 	{.center_freq = 5765, .hw_value = 153,},
104 	{.center_freq = 5785, .hw_value = 157,},
105 	{.center_freq = 5805, .hw_value = 161,},
106 	{.center_freq = 5825, .hw_value = 165,},
107 };
108 
109 static struct ieee80211_rate rtl_ratetable_2g[] = {
110 	{.bitrate = 10, .hw_value = 0x00,},
111 	{.bitrate = 20, .hw_value = 0x01,},
112 	{.bitrate = 55, .hw_value = 0x02,},
113 	{.bitrate = 110, .hw_value = 0x03,},
114 	{.bitrate = 60, .hw_value = 0x04,},
115 	{.bitrate = 90, .hw_value = 0x05,},
116 	{.bitrate = 120, .hw_value = 0x06,},
117 	{.bitrate = 180, .hw_value = 0x07,},
118 	{.bitrate = 240, .hw_value = 0x08,},
119 	{.bitrate = 360, .hw_value = 0x09,},
120 	{.bitrate = 480, .hw_value = 0x0a,},
121 	{.bitrate = 540, .hw_value = 0x0b,},
122 };
123 
124 static struct ieee80211_rate rtl_ratetable_5g[] = {
125 	{.bitrate = 60, .hw_value = 0x04,},
126 	{.bitrate = 90, .hw_value = 0x05,},
127 	{.bitrate = 120, .hw_value = 0x06,},
128 	{.bitrate = 180, .hw_value = 0x07,},
129 	{.bitrate = 240, .hw_value = 0x08,},
130 	{.bitrate = 360, .hw_value = 0x09,},
131 	{.bitrate = 480, .hw_value = 0x0a,},
132 	{.bitrate = 540, .hw_value = 0x0b,},
133 };
134 
135 static const struct ieee80211_supported_band rtl_band_2ghz = {
136 	.band = IEEE80211_BAND_2GHZ,
137 
138 	.channels = rtl_channeltable_2g,
139 	.n_channels = ARRAY_SIZE(rtl_channeltable_2g),
140 
141 	.bitrates = rtl_ratetable_2g,
142 	.n_bitrates = ARRAY_SIZE(rtl_ratetable_2g),
143 
144 	.ht_cap = {0},
145 };
146 
147 static struct ieee80211_supported_band rtl_band_5ghz = {
148 	.band = IEEE80211_BAND_5GHZ,
149 
150 	.channels = rtl_channeltable_5g,
151 	.n_channels = ARRAY_SIZE(rtl_channeltable_5g),
152 
153 	.bitrates = rtl_ratetable_5g,
154 	.n_bitrates = ARRAY_SIZE(rtl_ratetable_5g),
155 
156 	.ht_cap = {0},
157 };
158 
159 static const u8 tid_to_ac[] = {
160 	2, /* IEEE80211_AC_BE */
161 	3, /* IEEE80211_AC_BK */
162 	3, /* IEEE80211_AC_BK */
163 	2, /* IEEE80211_AC_BE */
164 	1, /* IEEE80211_AC_VI */
165 	1, /* IEEE80211_AC_VI */
166 	0, /* IEEE80211_AC_VO */
167 	0, /* IEEE80211_AC_VO */
168 };
169 
rtl_tid_to_ac(struct ieee80211_hw * hw,u8 tid)170 u8 rtl_tid_to_ac(struct ieee80211_hw *hw, u8 tid)
171 {
172 	return tid_to_ac[tid];
173 }
174 
_rtl_init_hw_ht_capab(struct ieee80211_hw * hw,struct ieee80211_sta_ht_cap * ht_cap)175 static void _rtl_init_hw_ht_capab(struct ieee80211_hw *hw,
176 				  struct ieee80211_sta_ht_cap *ht_cap)
177 {
178 	struct rtl_priv *rtlpriv = rtl_priv(hw);
179 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
180 
181 	ht_cap->ht_supported = true;
182 	ht_cap->cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
183 	    IEEE80211_HT_CAP_SGI_40 |
184 	    IEEE80211_HT_CAP_SGI_20 |
185 	    IEEE80211_HT_CAP_DSSSCCK40 | IEEE80211_HT_CAP_MAX_AMSDU;
186 
187 	if (rtlpriv->rtlhal.disable_amsdu_8k)
188 		ht_cap->cap &= ~IEEE80211_HT_CAP_MAX_AMSDU;
189 
190 	/*
191 	 *Maximum length of AMPDU that the STA can receive.
192 	 *Length = 2 ^ (13 + max_ampdu_length_exp) - 1 (octets)
193 	 */
194 	ht_cap->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
195 
196 	/*Minimum MPDU start spacing , */
197 	ht_cap->ampdu_density = IEEE80211_HT_MPDU_DENSITY_16;
198 
199 	ht_cap->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
200 
201 	/*
202 	 *hw->wiphy->bands[IEEE80211_BAND_2GHZ]
203 	 *base on ant_num
204 	 *rx_mask: RX mask
205 	 *if rx_ant =1 rx_mask[0]=0xff;==>MCS0-MCS7
206 	 *if rx_ant =2 rx_mask[1]=0xff;==>MCS8-MCS15
207 	 *if rx_ant >=3 rx_mask[2]=0xff;
208 	 *if BW_40 rx_mask[4]=0x01;
209 	 *highest supported RX rate
210 	 */
211 	if (get_rf_type(rtlphy) == RF_1T2R || get_rf_type(rtlphy) == RF_2T2R) {
212 
213 		RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "1T2R or 2T2R\n");
214 
215 		ht_cap->mcs.rx_mask[0] = 0xFF;
216 		ht_cap->mcs.rx_mask[1] = 0xFF;
217 		ht_cap->mcs.rx_mask[4] = 0x01;
218 
219 		ht_cap->mcs.rx_highest = cpu_to_le16(MAX_BIT_RATE_40MHZ_MCS15);
220 	} else if (get_rf_type(rtlphy) == RF_1T1R) {
221 
222 		RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "1T1R\n");
223 
224 		ht_cap->mcs.rx_mask[0] = 0xFF;
225 		ht_cap->mcs.rx_mask[1] = 0x00;
226 		ht_cap->mcs.rx_mask[4] = 0x01;
227 
228 		ht_cap->mcs.rx_highest = cpu_to_le16(MAX_BIT_RATE_40MHZ_MCS7);
229 	}
230 }
231 
_rtl_init_mac80211(struct ieee80211_hw * hw)232 static void _rtl_init_mac80211(struct ieee80211_hw *hw)
233 {
234 	struct rtl_priv *rtlpriv = rtl_priv(hw);
235 	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
236 	struct rtl_mac *rtlmac = rtl_mac(rtl_priv(hw));
237 	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
238 	struct ieee80211_supported_band *sband;
239 
240 
241 	if (rtlhal->macphymode == SINGLEMAC_SINGLEPHY && rtlhal->bandset ==
242 	    BAND_ON_BOTH) {
243 		/* 1: 2.4 G bands */
244 		/* <1> use  mac->bands as mem for hw->wiphy->bands */
245 		sband = &(rtlmac->bands[IEEE80211_BAND_2GHZ]);
246 
247 		/* <2> set hw->wiphy->bands[IEEE80211_BAND_2GHZ]
248 		 * to default value(1T1R) */
249 		memcpy(&(rtlmac->bands[IEEE80211_BAND_2GHZ]), &rtl_band_2ghz,
250 				sizeof(struct ieee80211_supported_band));
251 
252 		/* <3> init ht cap base on ant_num */
253 		_rtl_init_hw_ht_capab(hw, &sband->ht_cap);
254 
255 		/* <4> set mac->sband to wiphy->sband */
256 		hw->wiphy->bands[IEEE80211_BAND_2GHZ] = sband;
257 
258 		/* 2: 5 G bands */
259 		/* <1> use  mac->bands as mem for hw->wiphy->bands */
260 		sband = &(rtlmac->bands[IEEE80211_BAND_5GHZ]);
261 
262 		/* <2> set hw->wiphy->bands[IEEE80211_BAND_5GHZ]
263 		 * to default value(1T1R) */
264 		memcpy(&(rtlmac->bands[IEEE80211_BAND_5GHZ]), &rtl_band_5ghz,
265 				sizeof(struct ieee80211_supported_band));
266 
267 		/* <3> init ht cap base on ant_num */
268 		_rtl_init_hw_ht_capab(hw, &sband->ht_cap);
269 
270 		/* <4> set mac->sband to wiphy->sband */
271 		hw->wiphy->bands[IEEE80211_BAND_5GHZ] = sband;
272 	} else {
273 		if (rtlhal->current_bandtype == BAND_ON_2_4G) {
274 			/* <1> use  mac->bands as mem for hw->wiphy->bands */
275 			sband = &(rtlmac->bands[IEEE80211_BAND_2GHZ]);
276 
277 			/* <2> set hw->wiphy->bands[IEEE80211_BAND_2GHZ]
278 			 * to default value(1T1R) */
279 			memcpy(&(rtlmac->bands[IEEE80211_BAND_2GHZ]),
280 				 &rtl_band_2ghz,
281 				 sizeof(struct ieee80211_supported_band));
282 
283 			/* <3> init ht cap base on ant_num */
284 			_rtl_init_hw_ht_capab(hw, &sband->ht_cap);
285 
286 			/* <4> set mac->sband to wiphy->sband */
287 			hw->wiphy->bands[IEEE80211_BAND_2GHZ] = sband;
288 		} else if (rtlhal->current_bandtype == BAND_ON_5G) {
289 			/* <1> use  mac->bands as mem for hw->wiphy->bands */
290 			sband = &(rtlmac->bands[IEEE80211_BAND_5GHZ]);
291 
292 			/* <2> set hw->wiphy->bands[IEEE80211_BAND_5GHZ]
293 			 * to default value(1T1R) */
294 			memcpy(&(rtlmac->bands[IEEE80211_BAND_5GHZ]),
295 				 &rtl_band_5ghz,
296 				 sizeof(struct ieee80211_supported_band));
297 
298 			/* <3> init ht cap base on ant_num */
299 			_rtl_init_hw_ht_capab(hw, &sband->ht_cap);
300 
301 			/* <4> set mac->sband to wiphy->sband */
302 			hw->wiphy->bands[IEEE80211_BAND_5GHZ] = sband;
303 		} else {
304 			RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG, "Err BAND %d\n",
305 				 rtlhal->current_bandtype);
306 		}
307 	}
308 	/* <5> set hw caps */
309 	hw->flags = IEEE80211_HW_SIGNAL_DBM |
310 	    IEEE80211_HW_RX_INCLUDES_FCS |
311 	    IEEE80211_HW_AMPDU_AGGREGATION |
312 	    IEEE80211_HW_CONNECTION_MONITOR |
313 	    /* IEEE80211_HW_SUPPORTS_CQM_RSSI | */
314 	    IEEE80211_HW_REPORTS_TX_ACK_STATUS | 0;
315 
316 	/* swlps or hwlps has been set in diff chip in init_sw_vars */
317 	if (rtlpriv->psc.swctrl_lps)
318 		hw->flags |= IEEE80211_HW_SUPPORTS_PS |
319 			IEEE80211_HW_PS_NULLFUNC_STACK |
320 			/* IEEE80211_HW_SUPPORTS_DYNAMIC_PS | */
321 			0;
322 
323 	hw->wiphy->interface_modes =
324 	    BIT(NL80211_IFTYPE_AP) |
325 	    BIT(NL80211_IFTYPE_STATION) |
326 	    BIT(NL80211_IFTYPE_ADHOC);
327 
328 	hw->wiphy->rts_threshold = 2347;
329 
330 	hw->queues = AC_MAX;
331 	hw->extra_tx_headroom = RTL_TX_HEADER_SIZE;
332 
333 	/* TODO: Correct this value for our hw */
334 	/* TODO: define these hard code value */
335 	hw->channel_change_time = 100;
336 	hw->max_listen_interval = 10;
337 	hw->max_rate_tries = 4;
338 	/* hw->max_rates = 1; */
339 	hw->sta_data_size = sizeof(struct rtl_sta_info);
340 
341 	/* <6> mac address */
342 	if (is_valid_ether_addr(rtlefuse->dev_addr)) {
343 		SET_IEEE80211_PERM_ADDR(hw, rtlefuse->dev_addr);
344 	} else {
345 		u8 rtlmac1[] = { 0x00, 0xe0, 0x4c, 0x81, 0x92, 0x00 };
346 		get_random_bytes((rtlmac1 + (ETH_ALEN - 1)), 1);
347 		SET_IEEE80211_PERM_ADDR(hw, rtlmac1);
348 	}
349 
350 }
351 
_rtl_init_deferred_work(struct ieee80211_hw * hw)352 static void _rtl_init_deferred_work(struct ieee80211_hw *hw)
353 {
354 	struct rtl_priv *rtlpriv = rtl_priv(hw);
355 
356 	/* <1> timer */
357 	init_timer(&rtlpriv->works.watchdog_timer);
358 	setup_timer(&rtlpriv->works.watchdog_timer,
359 		    rtl_watch_dog_timer_callback, (unsigned long)hw);
360 
361 	/* <2> work queue */
362 	rtlpriv->works.hw = hw;
363 	rtlpriv->works.rtl_wq = alloc_workqueue(rtlpriv->cfg->name, 0, 0);
364 	INIT_DELAYED_WORK(&rtlpriv->works.watchdog_wq,
365 			  (void *)rtl_watchdog_wq_callback);
366 	INIT_DELAYED_WORK(&rtlpriv->works.ips_nic_off_wq,
367 			  (void *)rtl_ips_nic_off_wq_callback);
368 	INIT_DELAYED_WORK(&rtlpriv->works.ps_work,
369 			  (void *)rtl_swlps_wq_callback);
370 	INIT_DELAYED_WORK(&rtlpriv->works.ps_rfon_wq,
371 			  (void *)rtl_swlps_rfon_wq_callback);
372 
373 }
374 
rtl_deinit_deferred_work(struct ieee80211_hw * hw)375 void rtl_deinit_deferred_work(struct ieee80211_hw *hw)
376 {
377 	struct rtl_priv *rtlpriv = rtl_priv(hw);
378 
379 	del_timer_sync(&rtlpriv->works.watchdog_timer);
380 
381 	cancel_delayed_work(&rtlpriv->works.watchdog_wq);
382 	cancel_delayed_work(&rtlpriv->works.ips_nic_off_wq);
383 	cancel_delayed_work(&rtlpriv->works.ps_work);
384 	cancel_delayed_work(&rtlpriv->works.ps_rfon_wq);
385 }
386 
rtl_init_rfkill(struct ieee80211_hw * hw)387 void rtl_init_rfkill(struct ieee80211_hw *hw)
388 {
389 	struct rtl_priv *rtlpriv = rtl_priv(hw);
390 
391 	bool radio_state;
392 	bool blocked;
393 	u8 valid = 0;
394 
395 	/*set init state to on */
396 	rtlpriv->rfkill.rfkill_state = true;
397 	wiphy_rfkill_set_hw_state(hw->wiphy, 0);
398 
399 	radio_state = rtlpriv->cfg->ops->radio_onoff_checking(hw, &valid);
400 
401 	if (valid) {
402 		pr_info("wireless switch is %s\n",
403 			rtlpriv->rfkill.rfkill_state ? "on" : "off");
404 
405 		rtlpriv->rfkill.rfkill_state = radio_state;
406 
407 		blocked = (rtlpriv->rfkill.rfkill_state == 1) ? 0 : 1;
408 		wiphy_rfkill_set_hw_state(hw->wiphy, blocked);
409 	}
410 
411 	wiphy_rfkill_start_polling(hw->wiphy);
412 }
413 EXPORT_SYMBOL(rtl_init_rfkill);
414 
rtl_deinit_rfkill(struct ieee80211_hw * hw)415 void rtl_deinit_rfkill(struct ieee80211_hw *hw)
416 {
417 	wiphy_rfkill_stop_polling(hw->wiphy);
418 }
419 
rtl_init_core(struct ieee80211_hw * hw)420 int rtl_init_core(struct ieee80211_hw *hw)
421 {
422 	struct rtl_priv *rtlpriv = rtl_priv(hw);
423 	struct rtl_mac *rtlmac = rtl_mac(rtl_priv(hw));
424 
425 	/* <1> init mac80211 */
426 	_rtl_init_mac80211(hw);
427 	rtlmac->hw = hw;
428 
429 	/* <2> rate control register */
430 	hw->rate_control_algorithm = "rtl_rc";
431 
432 	/*
433 	 * <3> init CRDA must come after init
434 	 * mac80211 hw  in _rtl_init_mac80211.
435 	 */
436 	if (rtl_regd_init(hw, rtl_reg_notifier)) {
437 		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "REGD init failed\n");
438 		return 1;
439 	} else {
440 		/* CRDA regd hint must after init CRDA */
441 		if (regulatory_hint(hw->wiphy, rtlpriv->regd.alpha2)) {
442 			RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
443 				 "regulatory_hint fail\n");
444 		}
445 	}
446 
447 	/* <4> locks */
448 	mutex_init(&rtlpriv->locks.conf_mutex);
449 	mutex_init(&rtlpriv->locks.ps_mutex);
450 	spin_lock_init(&rtlpriv->locks.ips_lock);
451 	spin_lock_init(&rtlpriv->locks.irq_th_lock);
452 	spin_lock_init(&rtlpriv->locks.h2c_lock);
453 	spin_lock_init(&rtlpriv->locks.rf_ps_lock);
454 	spin_lock_init(&rtlpriv->locks.rf_lock);
455 	spin_lock_init(&rtlpriv->locks.waitq_lock);
456 	spin_lock_init(&rtlpriv->locks.cck_and_rw_pagea_lock);
457 
458 	rtlmac->link_state = MAC80211_NOLINK;
459 
460 	/* <5> init deferred work */
461 	_rtl_init_deferred_work(hw);
462 
463 	return 0;
464 }
465 
rtl_deinit_core(struct ieee80211_hw * hw)466 void rtl_deinit_core(struct ieee80211_hw *hw)
467 {
468 }
469 
rtl_init_rx_config(struct ieee80211_hw * hw)470 void rtl_init_rx_config(struct ieee80211_hw *hw)
471 {
472 	struct rtl_priv *rtlpriv = rtl_priv(hw);
473 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
474 
475 	rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RCR, (u8 *) (&mac->rx_conf));
476 }
477 
478 /*********************************************************
479  *
480  * tx information functions
481  *
482  *********************************************************/
_rtl_qurey_shortpreamble_mode(struct ieee80211_hw * hw,struct rtl_tcb_desc * tcb_desc,struct ieee80211_tx_info * info)483 static void _rtl_qurey_shortpreamble_mode(struct ieee80211_hw *hw,
484 					  struct rtl_tcb_desc *tcb_desc,
485 					  struct ieee80211_tx_info *info)
486 {
487 	struct rtl_priv *rtlpriv = rtl_priv(hw);
488 	u8 rate_flag = info->control.rates[0].flags;
489 
490 	tcb_desc->use_shortpreamble = false;
491 
492 	/* 1M can only use Long Preamble. 11B spec */
493 	if (tcb_desc->hw_rate == rtlpriv->cfg->maps[RTL_RC_CCK_RATE1M])
494 		return;
495 	else if (rate_flag & IEEE80211_TX_RC_USE_SHORT_PREAMBLE)
496 		tcb_desc->use_shortpreamble = true;
497 
498 	return;
499 }
500 
_rtl_query_shortgi(struct ieee80211_hw * hw,struct ieee80211_sta * sta,struct rtl_tcb_desc * tcb_desc,struct ieee80211_tx_info * info)501 static void _rtl_query_shortgi(struct ieee80211_hw *hw,
502 			       struct ieee80211_sta *sta,
503 			       struct rtl_tcb_desc *tcb_desc,
504 			       struct ieee80211_tx_info *info)
505 {
506 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
507 	u8 rate_flag = info->control.rates[0].flags;
508 	u8 sgi_40 = 0, sgi_20 = 0, bw_40 = 0;
509 	tcb_desc->use_shortgi = false;
510 
511 	if (sta == NULL)
512 		return;
513 
514 	sgi_40 = sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40;
515 	sgi_20 = sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20;
516 
517 	if (!(sta->ht_cap.ht_supported))
518 		return;
519 
520 	if (!sgi_40 && !sgi_20)
521 		return;
522 
523 	if (mac->opmode == NL80211_IFTYPE_STATION)
524 		bw_40 = mac->bw_40;
525 	else if (mac->opmode == NL80211_IFTYPE_AP ||
526 		mac->opmode == NL80211_IFTYPE_ADHOC)
527 		bw_40 = sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40;
528 
529 	if (bw_40 && sgi_40)
530 		tcb_desc->use_shortgi = true;
531 	else if ((bw_40 == false) && sgi_20)
532 		tcb_desc->use_shortgi = true;
533 
534 	if (!(rate_flag & IEEE80211_TX_RC_SHORT_GI))
535 		tcb_desc->use_shortgi = false;
536 }
537 
_rtl_query_protection_mode(struct ieee80211_hw * hw,struct rtl_tcb_desc * tcb_desc,struct ieee80211_tx_info * info)538 static void _rtl_query_protection_mode(struct ieee80211_hw *hw,
539 				       struct rtl_tcb_desc *tcb_desc,
540 				       struct ieee80211_tx_info *info)
541 {
542 	struct rtl_priv *rtlpriv = rtl_priv(hw);
543 	u8 rate_flag = info->control.rates[0].flags;
544 
545 	/* Common Settings */
546 	tcb_desc->rts_stbc = false;
547 	tcb_desc->cts_enable = false;
548 	tcb_desc->rts_sc = 0;
549 	tcb_desc->rts_bw = false;
550 	tcb_desc->rts_use_shortpreamble = false;
551 	tcb_desc->rts_use_shortgi = false;
552 
553 	if (rate_flag & IEEE80211_TX_RC_USE_CTS_PROTECT) {
554 		/* Use CTS-to-SELF in protection mode. */
555 		tcb_desc->rts_enable = true;
556 		tcb_desc->cts_enable = true;
557 		tcb_desc->rts_rate = rtlpriv->cfg->maps[RTL_RC_OFDM_RATE24M];
558 	} else if (rate_flag & IEEE80211_TX_RC_USE_RTS_CTS) {
559 		/* Use RTS-CTS in protection mode. */
560 		tcb_desc->rts_enable = true;
561 		tcb_desc->rts_rate = rtlpriv->cfg->maps[RTL_RC_OFDM_RATE24M];
562 	}
563 }
564 
_rtl_txrate_selectmode(struct ieee80211_hw * hw,struct ieee80211_sta * sta,struct rtl_tcb_desc * tcb_desc)565 static void _rtl_txrate_selectmode(struct ieee80211_hw *hw,
566 				   struct ieee80211_sta *sta,
567 				   struct rtl_tcb_desc *tcb_desc)
568 {
569 	struct rtl_priv *rtlpriv = rtl_priv(hw);
570 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
571 	struct rtl_sta_info *sta_entry = NULL;
572 	u8 ratr_index = 7;
573 
574 	if (sta) {
575 		sta_entry = (struct rtl_sta_info *) sta->drv_priv;
576 		ratr_index = sta_entry->ratr_index;
577 	}
578 	if (!tcb_desc->disable_ratefallback || !tcb_desc->use_driver_rate) {
579 		if (mac->opmode == NL80211_IFTYPE_STATION) {
580 			tcb_desc->ratr_index = 0;
581 		} else if (mac->opmode == NL80211_IFTYPE_ADHOC) {
582 			if (tcb_desc->multicast || tcb_desc->broadcast) {
583 				tcb_desc->hw_rate =
584 				    rtlpriv->cfg->maps[RTL_RC_CCK_RATE2M];
585 				tcb_desc->use_driver_rate = 1;
586 			} else {
587 				/* TODO */
588 			}
589 			tcb_desc->ratr_index = ratr_index;
590 		} else if (mac->opmode == NL80211_IFTYPE_AP) {
591 			tcb_desc->ratr_index = ratr_index;
592 		}
593 	}
594 
595 	if (rtlpriv->dm.useramask) {
596 		/* TODO we will differentiate adhoc and station futrue  */
597 		if (mac->opmode == NL80211_IFTYPE_STATION) {
598 			tcb_desc->mac_id = 0;
599 
600 			if (mac->mode == WIRELESS_MODE_N_24G)
601 				tcb_desc->ratr_index = RATR_INX_WIRELESS_NGB;
602 			else if (mac->mode == WIRELESS_MODE_N_5G)
603 				tcb_desc->ratr_index = RATR_INX_WIRELESS_NG;
604 			else if (mac->mode & WIRELESS_MODE_G)
605 				tcb_desc->ratr_index = RATR_INX_WIRELESS_GB;
606 			else if (mac->mode & WIRELESS_MODE_B)
607 				tcb_desc->ratr_index = RATR_INX_WIRELESS_B;
608 			else if (mac->mode & WIRELESS_MODE_A)
609 				tcb_desc->ratr_index = RATR_INX_WIRELESS_G;
610 		} else if (mac->opmode == NL80211_IFTYPE_AP ||
611 			mac->opmode == NL80211_IFTYPE_ADHOC) {
612 			if (NULL != sta) {
613 				if (sta->aid > 0)
614 					tcb_desc->mac_id = sta->aid + 1;
615 				else
616 					tcb_desc->mac_id = 1;
617 			} else {
618 				tcb_desc->mac_id = 0;
619 			}
620 		}
621 	}
622 
623 }
624 
_rtl_query_bandwidth_mode(struct ieee80211_hw * hw,struct ieee80211_sta * sta,struct rtl_tcb_desc * tcb_desc)625 static void _rtl_query_bandwidth_mode(struct ieee80211_hw *hw,
626 				      struct ieee80211_sta *sta,
627 				      struct rtl_tcb_desc *tcb_desc)
628 {
629 	struct rtl_priv *rtlpriv = rtl_priv(hw);
630 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
631 
632 	tcb_desc->packet_bw = false;
633 	if (!sta)
634 		return;
635 	if (mac->opmode == NL80211_IFTYPE_AP ||
636 	    mac->opmode == NL80211_IFTYPE_ADHOC) {
637 		if (!(sta->ht_cap.ht_supported) ||
638 		    !(sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40))
639 			return;
640 	} else if (mac->opmode == NL80211_IFTYPE_STATION) {
641 		if (!mac->bw_40 || !(sta->ht_cap.ht_supported))
642 			return;
643 	}
644 	if (tcb_desc->multicast || tcb_desc->broadcast)
645 		return;
646 
647 	/*use legency rate, shall use 20MHz */
648 	if (tcb_desc->hw_rate <= rtlpriv->cfg->maps[RTL_RC_OFDM_RATE54M])
649 		return;
650 
651 	tcb_desc->packet_bw = true;
652 }
653 
_rtl_get_highest_n_rate(struct ieee80211_hw * hw)654 static u8 _rtl_get_highest_n_rate(struct ieee80211_hw *hw)
655 {
656 	struct rtl_priv *rtlpriv = rtl_priv(hw);
657 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
658 	u8 hw_rate;
659 
660 	if (get_rf_type(rtlphy) == RF_2T2R)
661 		hw_rate = rtlpriv->cfg->maps[RTL_RC_HT_RATEMCS15];
662 	else
663 		hw_rate = rtlpriv->cfg->maps[RTL_RC_HT_RATEMCS7];
664 
665 	return hw_rate;
666 }
667 
668 /* mac80211's rate_idx is like this:
669  *
670  * 2.4G band:rx_status->band == IEEE80211_BAND_2GHZ
671  *
672  * B/G rate:
673  * (rx_status->flag & RX_FLAG_HT) = 0,
674  * DESC92_RATE1M-->DESC92_RATE54M ==> idx is 0-->11,
675  *
676  * N rate:
677  * (rx_status->flag & RX_FLAG_HT) = 1,
678  * DESC92_RATEMCS0-->DESC92_RATEMCS15 ==> idx is 0-->15
679  *
680  * 5G band:rx_status->band == IEEE80211_BAND_5GHZ
681  * A rate:
682  * (rx_status->flag & RX_FLAG_HT) = 0,
683  * DESC92_RATE6M-->DESC92_RATE54M ==> idx is 0-->7,
684  *
685  * N rate:
686  * (rx_status->flag & RX_FLAG_HT) = 1,
687  * DESC92_RATEMCS0-->DESC92_RATEMCS15 ==> idx is 0-->15
688  */
rtlwifi_rate_mapping(struct ieee80211_hw * hw,bool isht,u8 desc_rate,bool first_ampdu)689 int rtlwifi_rate_mapping(struct ieee80211_hw *hw,
690 			 bool isht, u8 desc_rate, bool first_ampdu)
691 {
692 	int rate_idx;
693 
694 	if (false == isht) {
695 		if (IEEE80211_BAND_2GHZ == hw->conf.channel->band) {
696 			switch (desc_rate) {
697 			case DESC92_RATE1M:
698 				rate_idx = 0;
699 				break;
700 			case DESC92_RATE2M:
701 				rate_idx = 1;
702 				break;
703 			case DESC92_RATE5_5M:
704 				rate_idx = 2;
705 				break;
706 			case DESC92_RATE11M:
707 				rate_idx = 3;
708 				break;
709 			case DESC92_RATE6M:
710 				rate_idx = 4;
711 				break;
712 			case DESC92_RATE9M:
713 				rate_idx = 5;
714 				break;
715 			case DESC92_RATE12M:
716 				rate_idx = 6;
717 				break;
718 			case DESC92_RATE18M:
719 				rate_idx = 7;
720 				break;
721 			case DESC92_RATE24M:
722 				rate_idx = 8;
723 				break;
724 			case DESC92_RATE36M:
725 				rate_idx = 9;
726 				break;
727 			case DESC92_RATE48M:
728 				rate_idx = 10;
729 				break;
730 			case DESC92_RATE54M:
731 				rate_idx = 11;
732 				break;
733 			default:
734 				rate_idx = 0;
735 				break;
736 			}
737 		} else {
738 			switch (desc_rate) {
739 			case DESC92_RATE6M:
740 				rate_idx = 0;
741 				break;
742 			case DESC92_RATE9M:
743 				rate_idx = 1;
744 				break;
745 			case DESC92_RATE12M:
746 				rate_idx = 2;
747 				break;
748 			case DESC92_RATE18M:
749 				rate_idx = 3;
750 				break;
751 			case DESC92_RATE24M:
752 				rate_idx = 4;
753 				break;
754 			case DESC92_RATE36M:
755 				rate_idx = 5;
756 				break;
757 			case DESC92_RATE48M:
758 				rate_idx = 6;
759 				break;
760 			case DESC92_RATE54M:
761 				rate_idx = 7;
762 				break;
763 			default:
764 				rate_idx = 0;
765 				break;
766 			}
767 		}
768 
769 	} else {
770 
771 		switch (desc_rate) {
772 		case DESC92_RATEMCS0:
773 			rate_idx = 0;
774 			break;
775 		case DESC92_RATEMCS1:
776 			rate_idx = 1;
777 			break;
778 		case DESC92_RATEMCS2:
779 			rate_idx = 2;
780 			break;
781 		case DESC92_RATEMCS3:
782 			rate_idx = 3;
783 			break;
784 		case DESC92_RATEMCS4:
785 			rate_idx = 4;
786 			break;
787 		case DESC92_RATEMCS5:
788 			rate_idx = 5;
789 			break;
790 		case DESC92_RATEMCS6:
791 			rate_idx = 6;
792 			break;
793 		case DESC92_RATEMCS7:
794 			rate_idx = 7;
795 			break;
796 		case DESC92_RATEMCS8:
797 			rate_idx = 8;
798 			break;
799 		case DESC92_RATEMCS9:
800 			rate_idx = 9;
801 			break;
802 		case DESC92_RATEMCS10:
803 			rate_idx = 10;
804 			break;
805 		case DESC92_RATEMCS11:
806 			rate_idx = 11;
807 			break;
808 		case DESC92_RATEMCS12:
809 			rate_idx = 12;
810 			break;
811 		case DESC92_RATEMCS13:
812 			rate_idx = 13;
813 			break;
814 		case DESC92_RATEMCS14:
815 			rate_idx = 14;
816 			break;
817 		case DESC92_RATEMCS15:
818 			rate_idx = 15;
819 			break;
820 		default:
821 			rate_idx = 0;
822 			break;
823 		}
824 	}
825 	return rate_idx;
826 }
827 EXPORT_SYMBOL(rtlwifi_rate_mapping);
828 
rtl_get_tcb_desc(struct ieee80211_hw * hw,struct ieee80211_tx_info * info,struct ieee80211_sta * sta,struct sk_buff * skb,struct rtl_tcb_desc * tcb_desc)829 void rtl_get_tcb_desc(struct ieee80211_hw *hw,
830 		      struct ieee80211_tx_info *info,
831 		      struct ieee80211_sta *sta,
832 		      struct sk_buff *skb, struct rtl_tcb_desc *tcb_desc)
833 {
834 	struct rtl_priv *rtlpriv = rtl_priv(hw);
835 	struct rtl_mac *rtlmac = rtl_mac(rtl_priv(hw));
836 	struct ieee80211_hdr *hdr = rtl_get_hdr(skb);
837 	struct ieee80211_rate *txrate;
838 	__le16 fc = hdr->frame_control;
839 
840 	txrate = ieee80211_get_tx_rate(hw, info);
841 	if (txrate)
842 		tcb_desc->hw_rate = txrate->hw_value;
843 	else
844 		tcb_desc->hw_rate = 0;
845 
846 	if (ieee80211_is_data(fc)) {
847 		/*
848 		 *we set data rate INX 0
849 		 *in rtl_rc.c   if skb is special data or
850 		 *mgt which need low data rate.
851 		 */
852 
853 		/*
854 		 *So tcb_desc->hw_rate is just used for
855 		 *special data and mgt frames
856 		 */
857 		if (info->control.rates[0].idx == 0 ||
858 				ieee80211_is_nullfunc(fc)) {
859 			tcb_desc->use_driver_rate = true;
860 			tcb_desc->ratr_index = RATR_INX_WIRELESS_MC;
861 
862 			tcb_desc->disable_ratefallback = 1;
863 		} else {
864 			/*
865 			 *because hw will nerver use hw_rate
866 			 *when tcb_desc->use_driver_rate = false
867 			 *so we never set highest N rate here,
868 			 *and N rate will all be controlled by FW
869 			 *when tcb_desc->use_driver_rate = false
870 			 */
871 			if (sta && (sta->ht_cap.ht_supported)) {
872 				tcb_desc->hw_rate = _rtl_get_highest_n_rate(hw);
873 			} else {
874 				if (rtlmac->mode == WIRELESS_MODE_B) {
875 					tcb_desc->hw_rate =
876 					   rtlpriv->cfg->maps[RTL_RC_CCK_RATE11M];
877 				} else {
878 					tcb_desc->hw_rate =
879 					   rtlpriv->cfg->maps[RTL_RC_OFDM_RATE54M];
880 				}
881 			}
882 		}
883 
884 		if (is_multicast_ether_addr(ieee80211_get_DA(hdr)))
885 			tcb_desc->multicast = 1;
886 		else if (is_broadcast_ether_addr(ieee80211_get_DA(hdr)))
887 			tcb_desc->broadcast = 1;
888 
889 		_rtl_txrate_selectmode(hw, sta, tcb_desc);
890 		_rtl_query_bandwidth_mode(hw, sta, tcb_desc);
891 		_rtl_qurey_shortpreamble_mode(hw, tcb_desc, info);
892 		_rtl_query_shortgi(hw, sta, tcb_desc, info);
893 		_rtl_query_protection_mode(hw, tcb_desc, info);
894 	} else {
895 		tcb_desc->use_driver_rate = true;
896 		tcb_desc->ratr_index = RATR_INX_WIRELESS_MC;
897 		tcb_desc->disable_ratefallback = 1;
898 		tcb_desc->mac_id = 0;
899 		tcb_desc->packet_bw = false;
900 	}
901 }
902 EXPORT_SYMBOL(rtl_get_tcb_desc);
903 
rtl_action_proc(struct ieee80211_hw * hw,struct sk_buff * skb,u8 is_tx)904 bool rtl_action_proc(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
905 {
906 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
907 	struct ieee80211_hdr *hdr = rtl_get_hdr(skb);
908 	struct rtl_priv *rtlpriv = rtl_priv(hw);
909 	__le16 fc = hdr->frame_control;
910 	u8 *act = (u8 *) (((u8 *) skb->data + MAC80211_3ADDR_LEN));
911 	u8 category;
912 
913 	if (!ieee80211_is_action(fc))
914 		return true;
915 
916 	category = *act;
917 	act++;
918 	switch (category) {
919 	case ACT_CAT_BA:
920 		switch (*act) {
921 		case ACT_ADDBAREQ:
922 			if (mac->act_scanning)
923 				return false;
924 
925 			RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
926 				 "%s ACT_ADDBAREQ From :%pM\n",
927 				 is_tx ? "Tx" : "Rx", hdr->addr2);
928 			break;
929 		case ACT_ADDBARSP:
930 			RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
931 				 "%s ACT_ADDBARSP From :%pM\n",
932 				 is_tx ? "Tx" : "Rx", hdr->addr2);
933 			break;
934 		case ACT_DELBA:
935 			RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
936 				 "ACT_ADDBADEL From :%pM\n", hdr->addr2);
937 			break;
938 		}
939 		break;
940 	default:
941 		break;
942 	}
943 
944 	return true;
945 }
946 
947 /*should call before software enc*/
rtl_is_special_data(struct ieee80211_hw * hw,struct sk_buff * skb,u8 is_tx)948 u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
949 {
950 	struct rtl_priv *rtlpriv = rtl_priv(hw);
951 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
952 	__le16 fc = rtl_get_fc(skb);
953 	u16 ether_type;
954 	u8 mac_hdr_len = ieee80211_get_hdrlen_from_skb(skb);
955 	const struct iphdr *ip;
956 
957 	if (!ieee80211_is_data(fc))
958 		return false;
959 
960 
961 	ip = (struct iphdr *)((u8 *) skb->data + mac_hdr_len +
962 			      SNAP_SIZE + PROTOC_TYPE_SIZE);
963 	ether_type = *(u16 *) ((u8 *) skb->data + mac_hdr_len + SNAP_SIZE);
964 	/*	ether_type = ntohs(ether_type); */
965 
966 	if (ETH_P_IP == ether_type) {
967 		if (IPPROTO_UDP == ip->protocol) {
968 			struct udphdr *udp = (struct udphdr *)((u8 *) ip +
969 							       (ip->ihl << 2));
970 			if (((((u8 *) udp)[1] == 68) &&
971 			     (((u8 *) udp)[3] == 67)) ||
972 			    ((((u8 *) udp)[1] == 67) &&
973 			     (((u8 *) udp)[3] == 68))) {
974 				/*
975 				 * 68 : UDP BOOTP client
976 				 * 67 : UDP BOOTP server
977 				 */
978 				RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV),
979 					 DBG_DMESG, "dhcp %s !!\n",
980 					 is_tx ? "Tx" : "Rx");
981 
982 				if (is_tx) {
983 					schedule_work(&rtlpriv->
984 						      works.lps_leave_work);
985 					ppsc->last_delaylps_stamp_jiffies =
986 					    jiffies;
987 				}
988 
989 				return true;
990 			}
991 		}
992 	} else if (ETH_P_ARP == ether_type) {
993 		if (is_tx) {
994 			schedule_work(&rtlpriv->works.lps_leave_work);
995 			ppsc->last_delaylps_stamp_jiffies = jiffies;
996 		}
997 
998 		return true;
999 	} else if (ETH_P_PAE == ether_type) {
1000 		RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
1001 			 "802.1X %s EAPOL pkt!!\n", is_tx ? "Tx" : "Rx");
1002 
1003 		if (is_tx) {
1004 			schedule_work(&rtlpriv->works.lps_leave_work);
1005 			ppsc->last_delaylps_stamp_jiffies = jiffies;
1006 		}
1007 
1008 		return true;
1009 	} else if (ETH_P_IPV6 == ether_type) {
1010 		/* IPv6 */
1011 		return true;
1012 	}
1013 
1014 	return false;
1015 }
1016 
1017 /*********************************************************
1018  *
1019  * functions called by core.c
1020  *
1021  *********************************************************/
rtl_tx_agg_start(struct ieee80211_hw * hw,struct ieee80211_sta * sta,u16 tid,u16 * ssn)1022 int rtl_tx_agg_start(struct ieee80211_hw *hw,
1023 		struct ieee80211_sta *sta, u16 tid, u16 *ssn)
1024 {
1025 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1026 	struct rtl_tid_data *tid_data;
1027 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1028 	struct rtl_sta_info *sta_entry = NULL;
1029 
1030 	if (sta == NULL)
1031 		return -EINVAL;
1032 
1033 	if (unlikely(tid >= MAX_TID_COUNT))
1034 		return -EINVAL;
1035 
1036 	sta_entry = (struct rtl_sta_info *)sta->drv_priv;
1037 	if (!sta_entry)
1038 		return -ENXIO;
1039 	tid_data = &sta_entry->tids[tid];
1040 
1041 	RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG, "on ra = %pM tid = %d seq:%d\n",
1042 		 sta->addr, tid, tid_data->seq_number);
1043 
1044 	*ssn = tid_data->seq_number;
1045 	tid_data->agg.agg_state = RTL_AGG_START;
1046 
1047 	ieee80211_start_tx_ba_cb_irqsafe(mac->vif, sta->addr, tid);
1048 
1049 	return 0;
1050 }
1051 
rtl_tx_agg_stop(struct ieee80211_hw * hw,struct ieee80211_sta * sta,u16 tid)1052 int rtl_tx_agg_stop(struct ieee80211_hw *hw,
1053 		struct ieee80211_sta *sta, u16 tid)
1054 {
1055 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1056 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1057 	struct rtl_sta_info *sta_entry = NULL;
1058 
1059 	if (sta == NULL)
1060 		return -EINVAL;
1061 
1062 	if (!sta->addr) {
1063 		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "ra = NULL\n");
1064 		return -EINVAL;
1065 	}
1066 
1067 	RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG, "on ra = %pM tid = %d\n",
1068 		 sta->addr, tid);
1069 
1070 	if (unlikely(tid >= MAX_TID_COUNT))
1071 		return -EINVAL;
1072 
1073 	sta_entry = (struct rtl_sta_info *)sta->drv_priv;
1074 	sta_entry->tids[tid].agg.agg_state = RTL_AGG_STOP;
1075 
1076 	ieee80211_stop_tx_ba_cb_irqsafe(mac->vif, sta->addr, tid);
1077 
1078 	return 0;
1079 }
1080 
rtl_tx_agg_oper(struct ieee80211_hw * hw,struct ieee80211_sta * sta,u16 tid)1081 int rtl_tx_agg_oper(struct ieee80211_hw *hw,
1082 		struct ieee80211_sta *sta, u16 tid)
1083 {
1084 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1085 	struct rtl_sta_info *sta_entry = NULL;
1086 
1087 	if (sta == NULL)
1088 		return -EINVAL;
1089 
1090 	if (!sta->addr) {
1091 		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "ra = NULL\n");
1092 		return -EINVAL;
1093 	}
1094 
1095 	RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG, "on ra = %pM tid = %d\n",
1096 		 sta->addr, tid);
1097 
1098 	if (unlikely(tid >= MAX_TID_COUNT))
1099 		return -EINVAL;
1100 
1101 	sta_entry = (struct rtl_sta_info *)sta->drv_priv;
1102 	sta_entry->tids[tid].agg.agg_state = RTL_AGG_OPERATIONAL;
1103 
1104 	return 0;
1105 }
1106 
1107 /*********************************************************
1108  *
1109  * wq & timer callback functions
1110  *
1111  *********************************************************/
rtl_watchdog_wq_callback(void * data)1112 void rtl_watchdog_wq_callback(void *data)
1113 {
1114 	struct rtl_works *rtlworks = container_of_dwork_rtl(data,
1115 							    struct rtl_works,
1116 							    watchdog_wq);
1117 	struct ieee80211_hw *hw = rtlworks->hw;
1118 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1119 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1120 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1121 	bool busytraffic = false;
1122 	bool higher_busytraffic = false;
1123 	bool higher_busyrxtraffic = false;
1124 	u8 idx, tid;
1125 	u32 rx_cnt_inp4eriod = 0;
1126 	u32 tx_cnt_inp4eriod = 0;
1127 	u32 aver_rx_cnt_inperiod = 0;
1128 	u32 aver_tx_cnt_inperiod = 0;
1129 	u32 aver_tidtx_inperiod[MAX_TID_COUNT] = {0};
1130 	u32 tidtx_inp4eriod[MAX_TID_COUNT] = {0};
1131 	bool enter_ps = false;
1132 
1133 	if (is_hal_stop(rtlhal))
1134 		return;
1135 
1136 	/* <1> Determine if action frame is allowed */
1137 	if (mac->link_state > MAC80211_NOLINK) {
1138 		if (mac->cnt_after_linked < 20)
1139 			mac->cnt_after_linked++;
1140 	} else {
1141 		mac->cnt_after_linked = 0;
1142 	}
1143 
1144 	/*
1145 	 *<2> to check if traffic busy, if
1146 	 * busytraffic we don't change channel
1147 	 */
1148 	if (mac->link_state >= MAC80211_LINKED) {
1149 
1150 		/* (1) get aver_rx_cnt_inperiod & aver_tx_cnt_inperiod */
1151 		for (idx = 0; idx <= 2; idx++) {
1152 			rtlpriv->link_info.num_rx_in4period[idx] =
1153 			    rtlpriv->link_info.num_rx_in4period[idx + 1];
1154 			rtlpriv->link_info.num_tx_in4period[idx] =
1155 			    rtlpriv->link_info.num_tx_in4period[idx + 1];
1156 		}
1157 		rtlpriv->link_info.num_rx_in4period[3] =
1158 		    rtlpriv->link_info.num_rx_inperiod;
1159 		rtlpriv->link_info.num_tx_in4period[3] =
1160 		    rtlpriv->link_info.num_tx_inperiod;
1161 		for (idx = 0; idx <= 3; idx++) {
1162 			rx_cnt_inp4eriod +=
1163 			    rtlpriv->link_info.num_rx_in4period[idx];
1164 			tx_cnt_inp4eriod +=
1165 			    rtlpriv->link_info.num_tx_in4period[idx];
1166 		}
1167 		aver_rx_cnt_inperiod = rx_cnt_inp4eriod / 4;
1168 		aver_tx_cnt_inperiod = tx_cnt_inp4eriod / 4;
1169 
1170 		/* (2) check traffic busy */
1171 		if (aver_rx_cnt_inperiod > 100 || aver_tx_cnt_inperiod > 100)
1172 			busytraffic = true;
1173 
1174 		/* Higher Tx/Rx data. */
1175 		if (aver_rx_cnt_inperiod > 4000 ||
1176 		    aver_tx_cnt_inperiod > 4000) {
1177 			higher_busytraffic = true;
1178 
1179 			/* Extremely high Rx data. */
1180 			if (aver_rx_cnt_inperiod > 5000)
1181 				higher_busyrxtraffic = true;
1182 		}
1183 
1184 		/* check every tid's tx traffic */
1185 		for (tid = 0; tid <= 7; tid++) {
1186 			for (idx = 0; idx <= 2; idx++)
1187 				rtlpriv->link_info.tidtx_in4period[tid][idx] =
1188 				  rtlpriv->link_info.tidtx_in4period[tid]
1189 				  [idx + 1];
1190 			rtlpriv->link_info.tidtx_in4period[tid][3] =
1191 				rtlpriv->link_info.tidtx_inperiod[tid];
1192 
1193 			for (idx = 0; idx <= 3; idx++)
1194 				tidtx_inp4eriod[tid] +=
1195 				  rtlpriv->link_info.tidtx_in4period[tid][idx];
1196 			aver_tidtx_inperiod[tid] = tidtx_inp4eriod[tid] / 4;
1197 			if (aver_tidtx_inperiod[tid] > 5000)
1198 				rtlpriv->link_info.higher_busytxtraffic[tid] =
1199 						   true;
1200 			else
1201 				rtlpriv->link_info.higher_busytxtraffic[tid] =
1202 						   false;
1203 		}
1204 
1205 		if (((rtlpriv->link_info.num_rx_inperiod +
1206 		      rtlpriv->link_info.num_tx_inperiod) > 8) ||
1207 		    (rtlpriv->link_info.num_rx_inperiod > 2))
1208 			enter_ps = false;
1209 		else
1210 			enter_ps = true;
1211 
1212 		/* LeisurePS only work in infra mode. */
1213 		if (enter_ps)
1214 			rtl_lps_enter(hw);
1215 		else
1216 			rtl_lps_leave(hw);
1217 	}
1218 
1219 	rtlpriv->link_info.num_rx_inperiod = 0;
1220 	rtlpriv->link_info.num_tx_inperiod = 0;
1221 	for (tid = 0; tid <= 7; tid++)
1222 		rtlpriv->link_info.tidtx_inperiod[tid] = 0;
1223 
1224 	rtlpriv->link_info.busytraffic = busytraffic;
1225 	rtlpriv->link_info.higher_busytraffic = higher_busytraffic;
1226 	rtlpriv->link_info.higher_busyrxtraffic = higher_busyrxtraffic;
1227 
1228 	/* <3> DM */
1229 	rtlpriv->cfg->ops->dm_watchdog(hw);
1230 }
1231 
rtl_watch_dog_timer_callback(unsigned long data)1232 void rtl_watch_dog_timer_callback(unsigned long data)
1233 {
1234 	struct ieee80211_hw *hw = (struct ieee80211_hw *)data;
1235 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1236 
1237 	queue_delayed_work(rtlpriv->works.rtl_wq,
1238 			   &rtlpriv->works.watchdog_wq, 0);
1239 
1240 	mod_timer(&rtlpriv->works.watchdog_timer,
1241 		  jiffies + MSECS(RTL_WATCH_DOG_TIME));
1242 }
1243 
1244 /*********************************************************
1245  *
1246  * frame process functions
1247  *
1248  *********************************************************/
rtl_find_ie(u8 * data,unsigned int len,u8 ie)1249 u8 *rtl_find_ie(u8 *data, unsigned int len, u8 ie)
1250 {
1251 	struct ieee80211_mgmt *mgmt = (void *)data;
1252 	u8 *pos, *end;
1253 
1254 	pos = (u8 *)mgmt->u.beacon.variable;
1255 	end = data + len;
1256 	while (pos < end) {
1257 		if (pos + 2 + pos[1] > end)
1258 			return NULL;
1259 
1260 		if (pos[0] == ie)
1261 			return pos;
1262 
1263 		pos += 2 + pos[1];
1264 	}
1265 	return NULL;
1266 }
1267 
1268 /* when we use 2 rx ants we send IEEE80211_SMPS_OFF */
1269 /* when we use 1 rx ant we send IEEE80211_SMPS_STATIC */
rtl_make_smps_action(struct ieee80211_hw * hw,enum ieee80211_smps_mode smps,u8 * da,u8 * bssid)1270 static struct sk_buff *rtl_make_smps_action(struct ieee80211_hw *hw,
1271 		enum ieee80211_smps_mode smps, u8 *da, u8 *bssid)
1272 {
1273 	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1274 	struct sk_buff *skb;
1275 	struct ieee80211_mgmt *action_frame;
1276 
1277 	/* 27 = header + category + action + smps mode */
1278 	skb = dev_alloc_skb(27 + hw->extra_tx_headroom);
1279 	if (!skb)
1280 		return NULL;
1281 
1282 	skb_reserve(skb, hw->extra_tx_headroom);
1283 	action_frame = (void *)skb_put(skb, 27);
1284 	memset(action_frame, 0, 27);
1285 	memcpy(action_frame->da, da, ETH_ALEN);
1286 	memcpy(action_frame->sa, rtlefuse->dev_addr, ETH_ALEN);
1287 	memcpy(action_frame->bssid, bssid, ETH_ALEN);
1288 	action_frame->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
1289 						  IEEE80211_STYPE_ACTION);
1290 	action_frame->u.action.category = WLAN_CATEGORY_HT;
1291 	action_frame->u.action.u.ht_smps.action = WLAN_HT_ACTION_SMPS;
1292 	switch (smps) {
1293 	case IEEE80211_SMPS_AUTOMATIC:/* 0 */
1294 	case IEEE80211_SMPS_NUM_MODES:/* 4 */
1295 		WARN_ON(1);
1296 	case IEEE80211_SMPS_OFF:/* 1 */ /*MIMO_PS_NOLIMIT*/
1297 		action_frame->u.action.u.ht_smps.smps_control =
1298 				WLAN_HT_SMPS_CONTROL_DISABLED;/* 0 */
1299 		break;
1300 	case IEEE80211_SMPS_STATIC:/* 2 */ /*MIMO_PS_STATIC*/
1301 		action_frame->u.action.u.ht_smps.smps_control =
1302 				WLAN_HT_SMPS_CONTROL_STATIC;/* 1 */
1303 		break;
1304 	case IEEE80211_SMPS_DYNAMIC:/* 3 */ /*MIMO_PS_DYNAMIC*/
1305 		action_frame->u.action.u.ht_smps.smps_control =
1306 				WLAN_HT_SMPS_CONTROL_DYNAMIC;/* 3 */
1307 		break;
1308 	}
1309 
1310 	return skb;
1311 }
1312 
rtl_send_smps_action(struct ieee80211_hw * hw,struct ieee80211_sta * sta,u8 * da,u8 * bssid,enum ieee80211_smps_mode smps)1313 int rtl_send_smps_action(struct ieee80211_hw *hw,
1314 		struct ieee80211_sta *sta, u8 *da, u8 *bssid,
1315 		enum ieee80211_smps_mode smps)
1316 {
1317 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1318 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1319 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
1320 	struct sk_buff *skb = rtl_make_smps_action(hw, smps, da, bssid);
1321 	struct rtl_tcb_desc tcb_desc;
1322 	memset(&tcb_desc, 0, sizeof(struct rtl_tcb_desc));
1323 
1324 	if (rtlpriv->mac80211.act_scanning)
1325 		goto err_free;
1326 
1327 	if (!sta)
1328 		goto err_free;
1329 
1330 	if (unlikely(is_hal_stop(rtlhal) || ppsc->rfpwr_state != ERFON))
1331 		goto err_free;
1332 
1333 	if (!test_bit(RTL_STATUS_INTERFACE_START, &rtlpriv->status))
1334 		goto err_free;
1335 
1336 	/* this is a type = mgmt * stype = action frame */
1337 	if (skb) {
1338 		struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1339 		struct rtl_sta_info *sta_entry =
1340 			(struct rtl_sta_info *) sta->drv_priv;
1341 		sta_entry->mimo_ps = smps;
1342 		rtlpriv->cfg->ops->update_rate_tbl(hw, sta, 0);
1343 
1344 		info->control.rates[0].idx = 0;
1345 		info->control.sta = sta;
1346 		info->band = hw->conf.channel->band;
1347 		rtlpriv->intf_ops->adapter_tx(hw, skb, &tcb_desc);
1348 	}
1349 err_free:
1350 	return 0;
1351 }
1352 
1353 /*********************************************************
1354  *
1355  * IOT functions
1356  *
1357  *********************************************************/
rtl_chk_vendor_ouisub(struct ieee80211_hw * hw,struct octet_string vendor_ie)1358 static bool rtl_chk_vendor_ouisub(struct ieee80211_hw *hw,
1359 		struct octet_string vendor_ie)
1360 {
1361 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1362 	bool matched = false;
1363 	static u8 athcap_1[] = { 0x00, 0x03, 0x7F };
1364 	static u8 athcap_2[] = { 0x00, 0x13, 0x74 };
1365 	static u8 broadcap_1[] = { 0x00, 0x10, 0x18 };
1366 	static u8 broadcap_2[] = { 0x00, 0x0a, 0xf7 };
1367 	static u8 broadcap_3[] = { 0x00, 0x05, 0xb5 };
1368 	static u8 racap[] = { 0x00, 0x0c, 0x43 };
1369 	static u8 ciscocap[] = { 0x00, 0x40, 0x96 };
1370 	static u8 marvcap[] = { 0x00, 0x50, 0x43 };
1371 
1372 	if (memcmp(vendor_ie.octet, athcap_1, 3) == 0 ||
1373 		memcmp(vendor_ie.octet, athcap_2, 3) == 0) {
1374 		rtlpriv->mac80211.vendor = PEER_ATH;
1375 		matched = true;
1376 	} else if (memcmp(vendor_ie.octet, broadcap_1, 3) == 0 ||
1377 		memcmp(vendor_ie.octet, broadcap_2, 3) == 0 ||
1378 		memcmp(vendor_ie.octet, broadcap_3, 3) == 0) {
1379 		rtlpriv->mac80211.vendor = PEER_BROAD;
1380 		matched = true;
1381 	} else if (memcmp(vendor_ie.octet, racap, 3) == 0) {
1382 		rtlpriv->mac80211.vendor = PEER_RAL;
1383 		matched = true;
1384 	} else if (memcmp(vendor_ie.octet, ciscocap, 3) == 0) {
1385 		rtlpriv->mac80211.vendor = PEER_CISCO;
1386 		matched = true;
1387 	} else if (memcmp(vendor_ie.octet, marvcap, 3) == 0) {
1388 		rtlpriv->mac80211.vendor = PEER_MARV;
1389 		matched = true;
1390 	}
1391 
1392 	return matched;
1393 }
1394 
rtl_find_221_ie(struct ieee80211_hw * hw,u8 * data,unsigned int len)1395 static bool rtl_find_221_ie(struct ieee80211_hw *hw, u8 *data,
1396 		unsigned int len)
1397 {
1398 	struct ieee80211_mgmt *mgmt = (void *)data;
1399 	struct octet_string vendor_ie;
1400 	u8 *pos, *end;
1401 
1402 	pos = (u8 *)mgmt->u.beacon.variable;
1403 	end = data + len;
1404 	while (pos < end) {
1405 		if (pos[0] == 221) {
1406 			vendor_ie.length = pos[1];
1407 			vendor_ie.octet = &pos[2];
1408 			if (rtl_chk_vendor_ouisub(hw, vendor_ie))
1409 				return true;
1410 		}
1411 
1412 		if (pos + 2 + pos[1] > end)
1413 			return false;
1414 
1415 		pos += 2 + pos[1];
1416 	}
1417 	return false;
1418 }
1419 
rtl_recognize_peer(struct ieee80211_hw * hw,u8 * data,unsigned int len)1420 void rtl_recognize_peer(struct ieee80211_hw *hw, u8 *data, unsigned int len)
1421 {
1422 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1423 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1424 	struct ieee80211_hdr *hdr = (void *)data;
1425 	u32 vendor = PEER_UNKNOWN;
1426 
1427 	static u8 ap3_1[3] = { 0x00, 0x14, 0xbf };
1428 	static u8 ap3_2[3] = { 0x00, 0x1a, 0x70 };
1429 	static u8 ap3_3[3] = { 0x00, 0x1d, 0x7e };
1430 	static u8 ap4_1[3] = { 0x00, 0x90, 0xcc };
1431 	static u8 ap4_2[3] = { 0x00, 0x0e, 0x2e };
1432 	static u8 ap4_3[3] = { 0x00, 0x18, 0x02 };
1433 	static u8 ap4_4[3] = { 0x00, 0x17, 0x3f };
1434 	static u8 ap4_5[3] = { 0x00, 0x1c, 0xdf };
1435 	static u8 ap5_1[3] = { 0x00, 0x1c, 0xf0 };
1436 	static u8 ap5_2[3] = { 0x00, 0x21, 0x91 };
1437 	static u8 ap5_3[3] = { 0x00, 0x24, 0x01 };
1438 	static u8 ap5_4[3] = { 0x00, 0x15, 0xe9 };
1439 	static u8 ap5_5[3] = { 0x00, 0x17, 0x9A };
1440 	static u8 ap5_6[3] = { 0x00, 0x18, 0xE7 };
1441 	static u8 ap6_1[3] = { 0x00, 0x17, 0x94 };
1442 	static u8 ap7_1[3] = { 0x00, 0x14, 0xa4 };
1443 
1444 	if (mac->opmode != NL80211_IFTYPE_STATION)
1445 		return;
1446 
1447 	if (mac->link_state == MAC80211_NOLINK) {
1448 		mac->vendor = PEER_UNKNOWN;
1449 		return;
1450 	}
1451 
1452 	if (mac->cnt_after_linked > 2)
1453 		return;
1454 
1455 	/* check if this really is a beacon */
1456 	if (!ieee80211_is_beacon(hdr->frame_control))
1457 		return;
1458 
1459 	/* min. beacon length + FCS_LEN */
1460 	if (len <= 40 + FCS_LEN)
1461 		return;
1462 
1463 	/* and only beacons from the associated BSSID, please */
1464 	if (compare_ether_addr(hdr->addr3, rtlpriv->mac80211.bssid))
1465 		return;
1466 
1467 	if (rtl_find_221_ie(hw, data, len))
1468 		vendor = mac->vendor;
1469 
1470 	if ((memcmp(mac->bssid, ap5_1, 3) == 0) ||
1471 		(memcmp(mac->bssid, ap5_2, 3) == 0) ||
1472 		(memcmp(mac->bssid, ap5_3, 3) == 0) ||
1473 		(memcmp(mac->bssid, ap5_4, 3) == 0) ||
1474 		(memcmp(mac->bssid, ap5_5, 3) == 0) ||
1475 		(memcmp(mac->bssid, ap5_6, 3) == 0) ||
1476 		vendor == PEER_ATH) {
1477 		vendor = PEER_ATH;
1478 		RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, "=>ath find\n");
1479 	} else if ((memcmp(mac->bssid, ap4_4, 3) == 0) ||
1480 		(memcmp(mac->bssid, ap4_5, 3) == 0) ||
1481 		(memcmp(mac->bssid, ap4_1, 3) == 0) ||
1482 		(memcmp(mac->bssid, ap4_2, 3) == 0) ||
1483 		(memcmp(mac->bssid, ap4_3, 3) == 0) ||
1484 		vendor == PEER_RAL) {
1485 		RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, "=>ral find\n");
1486 		vendor = PEER_RAL;
1487 	} else if (memcmp(mac->bssid, ap6_1, 3) == 0 ||
1488 		vendor == PEER_CISCO) {
1489 		vendor = PEER_CISCO;
1490 		RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, "=>cisco find\n");
1491 	} else if ((memcmp(mac->bssid, ap3_1, 3) == 0) ||
1492 		(memcmp(mac->bssid, ap3_2, 3) == 0) ||
1493 		(memcmp(mac->bssid, ap3_3, 3) == 0) ||
1494 		vendor == PEER_BROAD) {
1495 		RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, "=>broad find\n");
1496 		vendor = PEER_BROAD;
1497 	} else if (memcmp(mac->bssid, ap7_1, 3) == 0 ||
1498 		vendor == PEER_MARV) {
1499 		vendor = PEER_MARV;
1500 		RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, "=>marv find\n");
1501 	}
1502 
1503 	mac->vendor = vendor;
1504 }
1505 
1506 /*********************************************************
1507  *
1508  * sysfs functions
1509  *
1510  *********************************************************/
rtl_show_debug_level(struct device * d,struct device_attribute * attr,char * buf)1511 static ssize_t rtl_show_debug_level(struct device *d,
1512 				    struct device_attribute *attr, char *buf)
1513 {
1514 	struct ieee80211_hw *hw = dev_get_drvdata(d);
1515 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1516 
1517 	return sprintf(buf, "0x%08X\n", rtlpriv->dbg.global_debuglevel);
1518 }
1519 
rtl_store_debug_level(struct device * d,struct device_attribute * attr,const char * buf,size_t count)1520 static ssize_t rtl_store_debug_level(struct device *d,
1521 				     struct device_attribute *attr,
1522 				     const char *buf, size_t count)
1523 {
1524 	struct ieee80211_hw *hw = dev_get_drvdata(d);
1525 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1526 	unsigned long val;
1527 	int ret;
1528 
1529 	ret = strict_strtoul(buf, 0, &val);
1530 	if (ret) {
1531 		printk(KERN_DEBUG "%s is not in hex or decimal form.\n", buf);
1532 	} else {
1533 		rtlpriv->dbg.global_debuglevel = val;
1534 		printk(KERN_DEBUG "debuglevel:%x\n",
1535 		       rtlpriv->dbg.global_debuglevel);
1536 	}
1537 
1538 	return strnlen(buf, count);
1539 }
1540 
1541 static DEVICE_ATTR(debug_level, S_IWUSR | S_IRUGO,
1542 		   rtl_show_debug_level, rtl_store_debug_level);
1543 
1544 static struct attribute *rtl_sysfs_entries[] = {
1545 
1546 	&dev_attr_debug_level.attr,
1547 
1548 	NULL
1549 };
1550 
1551 /*
1552  * "name" is folder name witch will be
1553  * put in device directory like :
1554  * sys/devices/pci0000:00/0000:00:1c.4/
1555  * 0000:06:00.0/rtl_sysfs
1556  */
1557 struct attribute_group rtl_attribute_group = {
1558 	.name = "rtlsysfs",
1559 	.attrs = rtl_sysfs_entries,
1560 };
1561 
1562 MODULE_AUTHOR("lizhaoming	<chaoming_li@realsil.com.cn>");
1563 MODULE_AUTHOR("Realtek WlanFAE	<wlanfae@realtek.com>");
1564 MODULE_AUTHOR("Larry Finger	<Larry.FInger@lwfinger.net>");
1565 MODULE_LICENSE("GPL");
1566 MODULE_DESCRIPTION("Realtek 802.11n PCI wireless core");
1567 
rtl_core_module_init(void)1568 static int __init rtl_core_module_init(void)
1569 {
1570 	if (rtl_rate_control_register())
1571 		pr_err("Unable to register rtl_rc, use default RC !!\n");
1572 
1573 	return 0;
1574 }
1575 
rtl_core_module_exit(void)1576 static void __exit rtl_core_module_exit(void)
1577 {
1578 	/*RC*/
1579 	rtl_rate_control_unregister();
1580 }
1581 
1582 module_init(rtl_core_module_init);
1583 module_exit(rtl_core_module_exit);
1584