1 /******************************************************************************
2  *
3  * Copyright(c) 2009-2010  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 <linux/ip.h>
31 #include "wifi.h"
32 #include "rc.h"
33 #include "base.h"
34 #include "efuse.h"
35 #include "cam.h"
36 #include "ps.h"
37 #include "regd.h"
38 
39 /*
40  *NOTICE!!!: This file will be very big, we hsould
41  *keep it clear under follwing roles:
42  *
43  *This file include follwing part, so, if you add new
44  *functions into this file, please check which part it
45  *should includes. or check if you should add new part
46  *for this file:
47  *
48  *1) mac80211 init functions
49  *2) tx information functions
50  *3) functions called by core.c
51  *4) wq & timer callback functions
52  *5) frame process functions
53  *6) sysfs functions
54  *7) ...
55  */
56 
57 /*********************************************************
58  *
59  * mac80211 init functions
60  *
61  *********************************************************/
62 static struct ieee80211_channel rtl_channeltable[] = {
63 	{.center_freq = 2412, .hw_value = 1,},
64 	{.center_freq = 2417, .hw_value = 2,},
65 	{.center_freq = 2422, .hw_value = 3,},
66 	{.center_freq = 2427, .hw_value = 4,},
67 	{.center_freq = 2432, .hw_value = 5,},
68 	{.center_freq = 2437, .hw_value = 6,},
69 	{.center_freq = 2442, .hw_value = 7,},
70 	{.center_freq = 2447, .hw_value = 8,},
71 	{.center_freq = 2452, .hw_value = 9,},
72 	{.center_freq = 2457, .hw_value = 10,},
73 	{.center_freq = 2462, .hw_value = 11,},
74 	{.center_freq = 2467, .hw_value = 12,},
75 	{.center_freq = 2472, .hw_value = 13,},
76 	{.center_freq = 2484, .hw_value = 14,},
77 };
78 
79 static struct ieee80211_rate rtl_ratetable[] = {
80 	{.bitrate = 10, .hw_value = 0x00,},
81 	{.bitrate = 20, .hw_value = 0x01,},
82 	{.bitrate = 55, .hw_value = 0x02,},
83 	{.bitrate = 110, .hw_value = 0x03,},
84 	{.bitrate = 60, .hw_value = 0x04,},
85 	{.bitrate = 90, .hw_value = 0x05,},
86 	{.bitrate = 120, .hw_value = 0x06,},
87 	{.bitrate = 180, .hw_value = 0x07,},
88 	{.bitrate = 240, .hw_value = 0x08,},
89 	{.bitrate = 360, .hw_value = 0x09,},
90 	{.bitrate = 480, .hw_value = 0x0a,},
91 	{.bitrate = 540, .hw_value = 0x0b,},
92 };
93 
94 static const struct ieee80211_supported_band rtl_band_2ghz = {
95 	.band = IEEE80211_BAND_2GHZ,
96 
97 	.channels = rtl_channeltable,
98 	.n_channels = ARRAY_SIZE(rtl_channeltable),
99 
100 	.bitrates = rtl_ratetable,
101 	.n_bitrates = ARRAY_SIZE(rtl_ratetable),
102 
103 	.ht_cap = {0},
104 };
105 
_rtl_init_hw_ht_capab(struct ieee80211_hw * hw,struct ieee80211_sta_ht_cap * ht_cap)106 static void _rtl_init_hw_ht_capab(struct ieee80211_hw *hw,
107 				  struct ieee80211_sta_ht_cap *ht_cap)
108 {
109 	struct rtl_priv *rtlpriv = rtl_priv(hw);
110 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
111 
112 	ht_cap->ht_supported = true;
113 	ht_cap->cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
114 	    IEEE80211_HT_CAP_SGI_40 |
115 	    IEEE80211_HT_CAP_SGI_20 |
116 	    IEEE80211_HT_CAP_DSSSCCK40 | IEEE80211_HT_CAP_MAX_AMSDU;
117 
118 	/*
119 	 *Maximum length of AMPDU that the STA can receive.
120 	 *Length = 2 ^ (13 + max_ampdu_length_exp) - 1 (octets)
121 	 */
122 	ht_cap->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
123 
124 	/*Minimum MPDU start spacing , */
125 	ht_cap->ampdu_density = IEEE80211_HT_MPDU_DENSITY_16;
126 
127 	ht_cap->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
128 
129 	/*
130 	 *hw->wiphy->bands[IEEE80211_BAND_2GHZ]
131 	 *base on ant_num
132 	 *rx_mask: RX mask
133 	 *if rx_ant =1 rx_mask[0]=0xff;==>MCS0-MCS7
134 	 *if rx_ant =2 rx_mask[1]=0xff;==>MCS8-MCS15
135 	 *if rx_ant >=3 rx_mask[2]=0xff;
136 	 *if BW_40 rx_mask[4]=0x01;
137 	 *highest supported RX rate
138 	 */
139 	if (get_rf_type(rtlphy) == RF_1T2R || get_rf_type(rtlphy) == RF_2T2R) {
140 
141 		RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, ("1T2R or 2T2R\n"));
142 
143 		ht_cap->mcs.rx_mask[0] = 0xFF;
144 		ht_cap->mcs.rx_mask[1] = 0xFF;
145 		ht_cap->mcs.rx_mask[4] = 0x01;
146 
147 		ht_cap->mcs.rx_highest = cpu_to_le16(MAX_BIT_RATE_40MHZ_MCS15);
148 	} else if (get_rf_type(rtlphy) == RF_1T1R) {
149 
150 		RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, ("1T1R\n"));
151 
152 		ht_cap->mcs.rx_mask[0] = 0xFF;
153 		ht_cap->mcs.rx_mask[1] = 0x00;
154 		ht_cap->mcs.rx_mask[4] = 0x01;
155 
156 		ht_cap->mcs.rx_highest = cpu_to_le16(MAX_BIT_RATE_40MHZ_MCS7);
157 	}
158 }
159 
_rtl_init_mac80211(struct ieee80211_hw * hw)160 static void _rtl_init_mac80211(struct ieee80211_hw *hw)
161 {
162 	struct rtl_mac *rtlmac = rtl_mac(rtl_priv(hw));
163 	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
164 	struct ieee80211_supported_band *sband;
165 
166 	/* <1> use  mac->bands as mem for hw->wiphy->bands */
167 	sband = &(rtlmac->bands[IEEE80211_BAND_2GHZ]);
168 
169 	/*
170 	 * <2> set hw->wiphy->bands[IEEE80211_BAND_2GHZ]
171 	 * to default value(1T1R)
172 	 */
173 	memcpy(&(rtlmac->bands[IEEE80211_BAND_2GHZ]), &rtl_band_2ghz,
174 	       sizeof(struct ieee80211_supported_band));
175 
176 	/* <3> init ht cap base on ant_num */
177 	_rtl_init_hw_ht_capab(hw, &sband->ht_cap);
178 
179 	/* <4> set mac->sband to wiphy->sband */
180 	hw->wiphy->bands[IEEE80211_BAND_2GHZ] = sband;
181 
182 	/* <5> set hw caps */
183 	hw->flags = IEEE80211_HW_SIGNAL_DBM |
184 	    IEEE80211_HW_RX_INCLUDES_FCS |
185 	    IEEE80211_HW_BEACON_FILTER | IEEE80211_HW_AMPDU_AGGREGATION | /*PS*/
186 	    /*IEEE80211_HW_SUPPORTS_PS | */
187 	    /*IEEE80211_HW_PS_NULLFUNC_STACK | */
188 	    /*IEEE80211_HW_SUPPORTS_DYNAMIC_PS | */
189 	    IEEE80211_HW_REPORTS_TX_ACK_STATUS | 0;
190 
191 	hw->wiphy->interface_modes =
192 	    BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_ADHOC);
193 
194 	hw->wiphy->rts_threshold = 2347;
195 
196 	hw->queues = AC_MAX;
197 	hw->extra_tx_headroom = RTL_TX_HEADER_SIZE;
198 
199 	/* TODO: Correct this value for our hw */
200 	/* TODO: define these hard code value */
201 	hw->channel_change_time = 100;
202 	hw->max_listen_interval = 5;
203 	hw->max_rate_tries = 4;
204 	/* hw->max_rates = 1; */
205 
206 	/* <6> mac address */
207 	if (is_valid_ether_addr(rtlefuse->dev_addr)) {
208 		SET_IEEE80211_PERM_ADDR(hw, rtlefuse->dev_addr);
209 	} else {
210 		u8 rtlmac[] = { 0x00, 0xe0, 0x4c, 0x81, 0x92, 0x00 };
211 		get_random_bytes((rtlmac + (ETH_ALEN - 1)), 1);
212 		SET_IEEE80211_PERM_ADDR(hw, rtlmac);
213 	}
214 
215 }
216 
_rtl_init_deferred_work(struct ieee80211_hw * hw)217 static void _rtl_init_deferred_work(struct ieee80211_hw *hw)
218 {
219 	struct rtl_priv *rtlpriv = rtl_priv(hw);
220 
221 	/* <1> timer */
222 	init_timer(&rtlpriv->works.watchdog_timer);
223 	setup_timer(&rtlpriv->works.watchdog_timer,
224 		    rtl_watch_dog_timer_callback, (unsigned long)hw);
225 
226 	/* <2> work queue */
227 	rtlpriv->works.hw = hw;
228 	rtlpriv->works.rtl_wq = alloc_workqueue(rtlpriv->cfg->name, 0, 0);
229 	INIT_DELAYED_WORK(&rtlpriv->works.watchdog_wq,
230 			  (void *)rtl_watchdog_wq_callback);
231 	INIT_DELAYED_WORK(&rtlpriv->works.ips_nic_off_wq,
232 			  (void *)rtl_ips_nic_off_wq_callback);
233 
234 }
235 
rtl_deinit_deferred_work(struct ieee80211_hw * hw)236 void rtl_deinit_deferred_work(struct ieee80211_hw *hw)
237 {
238 	struct rtl_priv *rtlpriv = rtl_priv(hw);
239 
240 	del_timer_sync(&rtlpriv->works.watchdog_timer);
241 
242 	cancel_delayed_work(&rtlpriv->works.watchdog_wq);
243 	cancel_delayed_work(&rtlpriv->works.ips_nic_off_wq);
244 }
245 
rtl_init_rfkill(struct ieee80211_hw * hw)246 void rtl_init_rfkill(struct ieee80211_hw *hw)
247 {
248 	struct rtl_priv *rtlpriv = rtl_priv(hw);
249 
250 	bool radio_state;
251 	bool blocked;
252 	u8 valid = 0;
253 
254 	radio_state = rtlpriv->cfg->ops->radio_onoff_checking(hw, &valid);
255 
256 	/*set init state to that of switch */
257 	rtlpriv->rfkill.rfkill_state = radio_state;
258 	printk(KERN_INFO "rtlwifi: wireless switch is %s\n",
259 	       rtlpriv->rfkill.rfkill_state ? "on" : "off");
260 
261 	if (valid) {
262 		rtlpriv->rfkill.rfkill_state = radio_state;
263 
264 		blocked = (rtlpriv->rfkill.rfkill_state == 1) ? 0 : 1;
265 		wiphy_rfkill_set_hw_state(hw->wiphy, blocked);
266 	}
267 
268 	wiphy_rfkill_start_polling(hw->wiphy);
269 }
270 
rtl_deinit_rfkill(struct ieee80211_hw * hw)271 void rtl_deinit_rfkill(struct ieee80211_hw *hw)
272 {
273 	wiphy_rfkill_stop_polling(hw->wiphy);
274 }
275 
rtl_init_core(struct ieee80211_hw * hw)276 int rtl_init_core(struct ieee80211_hw *hw)
277 {
278 	struct rtl_priv *rtlpriv = rtl_priv(hw);
279 	struct rtl_mac *rtlmac = rtl_mac(rtl_priv(hw));
280 
281 	/* <1> init mac80211 */
282 	_rtl_init_mac80211(hw);
283 	rtlmac->hw = hw;
284 
285 	/* <2> rate control register */
286 	hw->rate_control_algorithm = "rtl_rc";
287 
288 	/*
289 	 * <3> init CRDA must come after init
290 	 * mac80211 hw  in _rtl_init_mac80211.
291 	 */
292 	if (rtl_regd_init(hw, rtl_reg_notifier)) {
293 		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("REGD init failed\n"));
294 		return 1;
295 	} else {
296 		/* CRDA regd hint must after init CRDA */
297 		if (regulatory_hint(hw->wiphy, rtlpriv->regd.alpha2)) {
298 			RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
299 				 ("regulatory_hint fail\n"));
300 		}
301 	}
302 
303 	/* <4> locks */
304 	mutex_init(&rtlpriv->locks.conf_mutex);
305 	spin_lock_init(&rtlpriv->locks.ips_lock);
306 	spin_lock_init(&rtlpriv->locks.irq_th_lock);
307 	spin_lock_init(&rtlpriv->locks.h2c_lock);
308 	spin_lock_init(&rtlpriv->locks.rf_ps_lock);
309 	spin_lock_init(&rtlpriv->locks.rf_lock);
310 	spin_lock_init(&rtlpriv->locks.lps_lock);
311 
312 	rtlmac->link_state = MAC80211_NOLINK;
313 
314 	/* <5> init deferred work */
315 	_rtl_init_deferred_work(hw);
316 
317 	return 0;
318 }
319 
rtl_deinit_core(struct ieee80211_hw * hw)320 void rtl_deinit_core(struct ieee80211_hw *hw)
321 {
322 }
323 
rtl_init_rx_config(struct ieee80211_hw * hw)324 void rtl_init_rx_config(struct ieee80211_hw *hw)
325 {
326 	struct rtl_priv *rtlpriv = rtl_priv(hw);
327 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
328 
329 	rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RCR, (u8 *) (&mac->rx_conf));
330 	rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_MGT_FILTER,
331 				      (u8 *) (&mac->rx_mgt_filter));
332 	rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_CTRL_FILTER,
333 				      (u8 *) (&mac->rx_ctrl_filter));
334 	rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_DATA_FILTER,
335 				      (u8 *) (&mac->rx_data_filter));
336 }
337 
338 /*********************************************************
339  *
340  * tx information functions
341  *
342  *********************************************************/
_rtl_qurey_shortpreamble_mode(struct ieee80211_hw * hw,struct rtl_tcb_desc * tcb_desc,struct ieee80211_tx_info * info)343 static void _rtl_qurey_shortpreamble_mode(struct ieee80211_hw *hw,
344 					  struct rtl_tcb_desc *tcb_desc,
345 					  struct ieee80211_tx_info *info)
346 {
347 	struct rtl_priv *rtlpriv = rtl_priv(hw);
348 	u8 rate_flag = info->control.rates[0].flags;
349 
350 	tcb_desc->use_shortpreamble = false;
351 
352 	/* 1M can only use Long Preamble. 11B spec */
353 	if (tcb_desc->hw_rate == rtlpriv->cfg->maps[RTL_RC_CCK_RATE1M])
354 		return;
355 	else if (rate_flag & IEEE80211_TX_RC_USE_SHORT_PREAMBLE)
356 		tcb_desc->use_shortpreamble = true;
357 
358 	return;
359 }
360 
_rtl_query_shortgi(struct ieee80211_hw * hw,struct rtl_tcb_desc * tcb_desc,struct ieee80211_tx_info * info)361 static void _rtl_query_shortgi(struct ieee80211_hw *hw,
362 			       struct rtl_tcb_desc *tcb_desc,
363 			       struct ieee80211_tx_info *info)
364 {
365 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
366 	u8 rate_flag = info->control.rates[0].flags;
367 
368 	tcb_desc->use_shortgi = false;
369 
370 	if (!mac->ht_enable)
371 		return;
372 
373 	if (!mac->sgi_40 && !mac->sgi_20)
374 		return;
375 
376 	if ((mac->bw_40 == true) && mac->sgi_40)
377 		tcb_desc->use_shortgi = true;
378 	else if ((mac->bw_40 == false) && mac->sgi_20)
379 		tcb_desc->use_shortgi = true;
380 
381 	if (!(rate_flag & IEEE80211_TX_RC_SHORT_GI))
382 		tcb_desc->use_shortgi = false;
383 
384 }
385 
_rtl_query_protection_mode(struct ieee80211_hw * hw,struct rtl_tcb_desc * tcb_desc,struct ieee80211_tx_info * info)386 static void _rtl_query_protection_mode(struct ieee80211_hw *hw,
387 				       struct rtl_tcb_desc *tcb_desc,
388 				       struct ieee80211_tx_info *info)
389 {
390 	struct rtl_priv *rtlpriv = rtl_priv(hw);
391 	u8 rate_flag = info->control.rates[0].flags;
392 
393 	/* Common Settings */
394 	tcb_desc->rts_stbc = false;
395 	tcb_desc->cts_enable = false;
396 	tcb_desc->rts_sc = 0;
397 	tcb_desc->rts_bw = false;
398 	tcb_desc->rts_use_shortpreamble = false;
399 	tcb_desc->rts_use_shortgi = false;
400 
401 	if (rate_flag & IEEE80211_TX_RC_USE_CTS_PROTECT) {
402 		/* Use CTS-to-SELF in protection mode. */
403 		tcb_desc->rts_enable = true;
404 		tcb_desc->cts_enable = true;
405 		tcb_desc->rts_rate = rtlpriv->cfg->maps[RTL_RC_OFDM_RATE24M];
406 	} else if (rate_flag & IEEE80211_TX_RC_USE_RTS_CTS) {
407 		/* Use RTS-CTS in protection mode. */
408 		tcb_desc->rts_enable = true;
409 		tcb_desc->rts_rate = rtlpriv->cfg->maps[RTL_RC_OFDM_RATE24M];
410 	}
411 
412 }
413 
_rtl_txrate_selectmode(struct ieee80211_hw * hw,struct rtl_tcb_desc * tcb_desc)414 static void _rtl_txrate_selectmode(struct ieee80211_hw *hw,
415 				   struct rtl_tcb_desc *tcb_desc)
416 {
417 	struct rtl_priv *rtlpriv = rtl_priv(hw);
418 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
419 
420 	if (!tcb_desc->disable_ratefallback || !tcb_desc->use_driver_rate) {
421 		if (mac->opmode == NL80211_IFTYPE_STATION)
422 			tcb_desc->ratr_index = 0;
423 		else if (mac->opmode == NL80211_IFTYPE_ADHOC) {
424 			if (tcb_desc->multicast || tcb_desc->broadcast) {
425 				tcb_desc->hw_rate =
426 				    rtlpriv->cfg->maps[RTL_RC_CCK_RATE2M];
427 				tcb_desc->use_driver_rate = 1;
428 			} else {
429 				/* TODO */
430 			}
431 		}
432 	}
433 
434 	if (rtlpriv->dm.useramask) {
435 		/* TODO we will differentiate adhoc and station futrue  */
436 		tcb_desc->mac_id = 0;
437 
438 		if ((mac->mode == WIRELESS_MODE_N_24G) ||
439 		    (mac->mode == WIRELESS_MODE_N_5G)) {
440 			tcb_desc->ratr_index = RATR_INX_WIRELESS_NGB;
441 		} else if (mac->mode & WIRELESS_MODE_G) {
442 			tcb_desc->ratr_index = RATR_INX_WIRELESS_GB;
443 		} else if (mac->mode & WIRELESS_MODE_B) {
444 			tcb_desc->ratr_index = RATR_INX_WIRELESS_B;
445 		}
446 	}
447 
448 }
449 
_rtl_query_bandwidth_mode(struct ieee80211_hw * hw,struct rtl_tcb_desc * tcb_desc)450 static void _rtl_query_bandwidth_mode(struct ieee80211_hw *hw,
451 				      struct rtl_tcb_desc *tcb_desc)
452 {
453 	struct rtl_priv *rtlpriv = rtl_priv(hw);
454 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
455 
456 	tcb_desc->packet_bw = false;
457 
458 	if (!mac->bw_40 || !mac->ht_enable)
459 		return;
460 
461 	if (tcb_desc->multicast || tcb_desc->broadcast)
462 		return;
463 
464 	/*use legency rate, shall use 20MHz */
465 	if (tcb_desc->hw_rate <= rtlpriv->cfg->maps[RTL_RC_OFDM_RATE54M])
466 		return;
467 
468 	tcb_desc->packet_bw = true;
469 }
470 
_rtl_get_highest_n_rate(struct ieee80211_hw * hw)471 static u8 _rtl_get_highest_n_rate(struct ieee80211_hw *hw)
472 {
473 	struct rtl_priv *rtlpriv = rtl_priv(hw);
474 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
475 	u8 hw_rate;
476 
477 	if (get_rf_type(rtlphy) == RF_2T2R)
478 		hw_rate = rtlpriv->cfg->maps[RTL_RC_HT_RATEMCS15];
479 	else
480 		hw_rate = rtlpriv->cfg->maps[RTL_RC_HT_RATEMCS7];
481 
482 	return hw_rate;
483 }
484 
rtl_get_tcb_desc(struct ieee80211_hw * hw,struct ieee80211_tx_info * info,struct sk_buff * skb,struct rtl_tcb_desc * tcb_desc)485 void rtl_get_tcb_desc(struct ieee80211_hw *hw,
486 		      struct ieee80211_tx_info *info,
487 		      struct sk_buff *skb, struct rtl_tcb_desc *tcb_desc)
488 {
489 	struct rtl_priv *rtlpriv = rtl_priv(hw);
490 	struct rtl_mac *rtlmac = rtl_mac(rtl_priv(hw));
491 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)(skb->data);
492 	struct ieee80211_rate *txrate;
493 	__le16 fc = hdr->frame_control;
494 
495 	memset(tcb_desc, 0, sizeof(struct rtl_tcb_desc));
496 
497 	if (ieee80211_is_data(fc)) {
498 		txrate = ieee80211_get_tx_rate(hw, info);
499 		tcb_desc->hw_rate = txrate->hw_value;
500 
501 		/*
502 		 *we set data rate RTL_RC_CCK_RATE1M
503 		 *in rtl_rc.c   if skb is special data or
504 		 *mgt which need low data rate.
505 		 */
506 
507 		/*
508 		 *So tcb_desc->hw_rate is just used for
509 		 *special data and mgt frames
510 		 */
511 		if (tcb_desc->hw_rate < rtlpriv->cfg->maps[RTL_RC_CCK_RATE11M]) {
512 			tcb_desc->use_driver_rate = true;
513 			tcb_desc->ratr_index = 7;
514 
515 			tcb_desc->hw_rate =
516 			    rtlpriv->cfg->maps[RTL_RC_CCK_RATE1M];
517 			tcb_desc->disable_ratefallback = 1;
518 		} else {
519 			/*
520 			 *because hw will nerver use hw_rate
521 			 *when tcb_desc->use_driver_rate = false
522 			 *so we never set highest N rate here,
523 			 *and N rate will all be controlled by FW
524 			 *when tcb_desc->use_driver_rate = false
525 			 */
526 			if (rtlmac->ht_enable) {
527 				tcb_desc->hw_rate = _rtl_get_highest_n_rate(hw);
528 			} else {
529 				if (rtlmac->mode == WIRELESS_MODE_B) {
530 					tcb_desc->hw_rate =
531 					   rtlpriv->cfg->maps[RTL_RC_CCK_RATE11M];
532 				} else {
533 					tcb_desc->hw_rate =
534 					   rtlpriv->cfg->maps[RTL_RC_OFDM_RATE54M];
535 				}
536 			}
537 		}
538 
539 		if (is_multicast_ether_addr(ieee80211_get_DA(hdr)))
540 			tcb_desc->multicast = 1;
541 		else if (is_broadcast_ether_addr(ieee80211_get_DA(hdr)))
542 			tcb_desc->broadcast = 1;
543 
544 		_rtl_txrate_selectmode(hw, tcb_desc);
545 		_rtl_query_bandwidth_mode(hw, tcb_desc);
546 		_rtl_qurey_shortpreamble_mode(hw, tcb_desc, info);
547 		_rtl_query_shortgi(hw, tcb_desc, info);
548 		_rtl_query_protection_mode(hw, tcb_desc, info);
549 	} else {
550 		tcb_desc->use_driver_rate = true;
551 		tcb_desc->ratr_index = 7;
552 		tcb_desc->disable_ratefallback = 1;
553 		tcb_desc->mac_id = 0;
554 
555 		tcb_desc->hw_rate = rtlpriv->cfg->maps[RTL_RC_CCK_RATE1M];
556 	}
557 }
558 EXPORT_SYMBOL(rtl_get_tcb_desc);
559 
rtl_tx_mgmt_proc(struct ieee80211_hw * hw,struct sk_buff * skb)560 bool rtl_tx_mgmt_proc(struct ieee80211_hw *hw, struct sk_buff *skb)
561 {
562 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
563 	struct rtl_priv *rtlpriv = rtl_priv(hw);
564 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)(skb->data);
565 	__le16 fc = hdr->frame_control;
566 
567 	if (ieee80211_is_auth(fc)) {
568 		RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG, ("MAC80211_LINKING\n"));
569 		rtl_ips_nic_on(hw);
570 
571 		mac->link_state = MAC80211_LINKING;
572 	}
573 
574 	return true;
575 }
576 
rtl_action_proc(struct ieee80211_hw * hw,struct sk_buff * skb,u8 is_tx)577 bool rtl_action_proc(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
578 {
579 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
580 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)(skb->data);
581 	struct rtl_priv *rtlpriv = rtl_priv(hw);
582 	__le16 fc = hdr->frame_control;
583 	u8 *act = (u8 *) (((u8 *) skb->data + MAC80211_3ADDR_LEN));
584 	u8 category;
585 
586 	if (!ieee80211_is_action(fc))
587 		return true;
588 
589 	category = *act;
590 	act++;
591 	switch (category) {
592 	case ACT_CAT_BA:
593 		switch (*act) {
594 		case ACT_ADDBAREQ:
595 			if (mac->act_scanning)
596 				return false;
597 
598 			RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
599 				 ("%s ACT_ADDBAREQ From :" MAC_FMT "\n",
600 				  is_tx ? "Tx" : "Rx", MAC_ARG(hdr->addr2)));
601 			break;
602 		case ACT_ADDBARSP:
603 			RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
604 				 ("%s ACT_ADDBARSP From :" MAC_FMT "\n",
605 				  is_tx ? "Tx" : "Rx", MAC_ARG(hdr->addr2)));
606 			break;
607 		case ACT_DELBA:
608 			RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
609 				 ("ACT_ADDBADEL From :" MAC_FMT "\n",
610 				  MAC_ARG(hdr->addr2)));
611 			break;
612 		}
613 		break;
614 	default:
615 		break;
616 	}
617 
618 	return true;
619 }
620 
621 /*should call before software enc*/
rtl_is_special_data(struct ieee80211_hw * hw,struct sk_buff * skb,u8 is_tx)622 u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
623 {
624 	struct rtl_priv *rtlpriv = rtl_priv(hw);
625 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)(skb->data);
626 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
627 	__le16 fc = hdr->frame_control;
628 	u16 ether_type;
629 	u8 mac_hdr_len = ieee80211_get_hdrlen_from_skb(skb);
630 	const struct iphdr *ip;
631 
632 	if (!ieee80211_is_data(fc))
633 		goto end;
634 
635 	if (ieee80211_is_nullfunc(fc))
636 		return true;
637 
638 	ip = (struct iphdr *)((u8 *) skb->data + mac_hdr_len +
639 			      SNAP_SIZE + PROTOC_TYPE_SIZE);
640 	ether_type = *(u16 *) ((u8 *) skb->data + mac_hdr_len + SNAP_SIZE);
641 
642 	if (ETH_P_IP == ether_type) {
643 		if (IPPROTO_UDP == ip->protocol) {
644 			struct udphdr *udp = (struct udphdr *)((u8 *) ip +
645 							       (ip->ihl << 2));
646 			if (((((u8 *) udp)[1] == 68) &&
647 			     (((u8 *) udp)[3] == 67)) ||
648 			    ((((u8 *) udp)[1] == 67) &&
649 			     (((u8 *) udp)[3] == 68))) {
650 				/*
651 				 * 68 : UDP BOOTP client
652 				 * 67 : UDP BOOTP server
653 				 */
654 				RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV),
655 					 DBG_DMESG, ("dhcp %s !!\n",
656 						     (is_tx) ? "Tx" : "Rx"));
657 
658 				if (is_tx) {
659 					rtl_lps_leave(hw);
660 					ppsc->last_delaylps_stamp_jiffies =
661 					    jiffies;
662 				}
663 
664 				return true;
665 			}
666 		}
667 	} else if (ETH_P_ARP == ether_type) {
668 		if (is_tx) {
669 			rtl_lps_leave(hw);
670 			ppsc->last_delaylps_stamp_jiffies = jiffies;
671 		}
672 
673 		return true;
674 	} else if (ETH_P_PAE == ether_type) {
675 		RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
676 			 ("802.1X %s EAPOL pkt!!\n", (is_tx) ? "Tx" : "Rx"));
677 
678 		if (is_tx) {
679 			rtl_lps_leave(hw);
680 			ppsc->last_delaylps_stamp_jiffies = jiffies;
681 		}
682 
683 		return true;
684 	} else if (ETH_P_IPV6 == ether_type) {
685 		/* IPv6 */
686 		return true;
687 	}
688 
689 end:
690 	return false;
691 }
692 
693 /*********************************************************
694  *
695  * functions called by core.c
696  *
697  *********************************************************/
rtl_tx_agg_start(struct ieee80211_hw * hw,const u8 * ra,u16 tid,u16 * ssn)698 int rtl_tx_agg_start(struct ieee80211_hw *hw, const u8 *ra, u16 tid, u16 *ssn)
699 {
700 	struct rtl_priv *rtlpriv = rtl_priv(hw);
701 	struct rtl_tid_data *tid_data;
702 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
703 
704 	RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG,
705 		 ("on ra = %pM tid = %d\n", ra, tid));
706 
707 	if (unlikely(tid >= MAX_TID_COUNT))
708 		return -EINVAL;
709 
710 	if (mac->tids[tid].agg.agg_state != RTL_AGG_OFF) {
711 		RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
712 			 ("Start AGG when state is not RTL_AGG_OFF !\n"));
713 		return -ENXIO;
714 	}
715 
716 	tid_data = &mac->tids[tid];
717 	*ssn = SEQ_TO_SN(tid_data->seq_number);
718 
719 	RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG,
720 		 ("HW queue is empty tid:%d\n", tid));
721 	tid_data->agg.agg_state = RTL_AGG_ON;
722 
723 	ieee80211_start_tx_ba_cb_irqsafe(mac->vif, ra, tid);
724 
725 	return 0;
726 }
727 
rtl_tx_agg_stop(struct ieee80211_hw * hw,const u8 * ra,u16 tid)728 int rtl_tx_agg_stop(struct ieee80211_hw *hw, const u8 * ra, u16 tid)
729 {
730 	int ssn = -1;
731 	struct rtl_priv *rtlpriv = rtl_priv(hw);
732 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
733 	struct rtl_tid_data *tid_data;
734 
735 	if (!ra) {
736 		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("ra = NULL\n"));
737 		return -EINVAL;
738 	}
739 
740 	if (unlikely(tid >= MAX_TID_COUNT))
741 		return -EINVAL;
742 
743 	if (mac->tids[tid].agg.agg_state != RTL_AGG_ON)
744 		RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
745 			 ("Stopping AGG while state not ON or starting\n"));
746 
747 	tid_data = &mac->tids[tid];
748 	ssn = (tid_data->seq_number & IEEE80211_SCTL_SEQ) >> 4;
749 
750 	mac->tids[tid].agg.agg_state = RTL_AGG_OFF;
751 
752 	ieee80211_stop_tx_ba_cb_irqsafe(mac->vif, ra, tid);
753 
754 	return 0;
755 }
756 
757 /*********************************************************
758  *
759  * wq & timer callback functions
760  *
761  *********************************************************/
rtl_watchdog_wq_callback(void * data)762 void rtl_watchdog_wq_callback(void *data)
763 {
764 	struct rtl_works *rtlworks = container_of_dwork_rtl(data,
765 							    struct rtl_works,
766 							    watchdog_wq);
767 	struct ieee80211_hw *hw = rtlworks->hw;
768 	struct rtl_priv *rtlpriv = rtl_priv(hw);
769 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
770 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
771 
772 	bool busytraffic = false;
773 	bool higher_busytraffic = false;
774 	bool higher_busyrxtraffic = false;
775 	bool higher_busytxtraffic = false;
776 
777 	u8 idx = 0;
778 	u32 rx_cnt_inp4eriod = 0;
779 	u32 tx_cnt_inp4eriod = 0;
780 	u32 aver_rx_cnt_inperiod = 0;
781 	u32 aver_tx_cnt_inperiod = 0;
782 
783 	bool enter_ps = false;
784 
785 	if (is_hal_stop(rtlhal))
786 		return;
787 
788 	/* <1> Determine if action frame is allowed */
789 	if (mac->link_state > MAC80211_NOLINK) {
790 		if (mac->cnt_after_linked < 20)
791 			mac->cnt_after_linked++;
792 	} else {
793 		mac->cnt_after_linked = 0;
794 	}
795 
796 	/* <2> DM */
797 	rtlpriv->cfg->ops->dm_watchdog(hw);
798 
799 	/*
800 	 *<3> to check if traffic busy, if
801 	 * busytraffic we don't change channel
802 	 */
803 	if (mac->link_state >= MAC80211_LINKED) {
804 
805 		/* (1) get aver_rx_cnt_inperiod & aver_tx_cnt_inperiod */
806 		for (idx = 0; idx <= 2; idx++) {
807 			rtlpriv->link_info.num_rx_in4period[idx] =
808 			    rtlpriv->link_info.num_rx_in4period[idx + 1];
809 			rtlpriv->link_info.num_tx_in4period[idx] =
810 			    rtlpriv->link_info.num_tx_in4period[idx + 1];
811 		}
812 		rtlpriv->link_info.num_rx_in4period[3] =
813 		    rtlpriv->link_info.num_rx_inperiod;
814 		rtlpriv->link_info.num_tx_in4period[3] =
815 		    rtlpriv->link_info.num_tx_inperiod;
816 		for (idx = 0; idx <= 3; idx++) {
817 			rx_cnt_inp4eriod +=
818 			    rtlpriv->link_info.num_rx_in4period[idx];
819 			tx_cnt_inp4eriod +=
820 			    rtlpriv->link_info.num_tx_in4period[idx];
821 		}
822 		aver_rx_cnt_inperiod = rx_cnt_inp4eriod / 4;
823 		aver_tx_cnt_inperiod = tx_cnt_inp4eriod / 4;
824 
825 		/* (2) check traffic busy */
826 		if (aver_rx_cnt_inperiod > 100 || aver_tx_cnt_inperiod > 100)
827 			busytraffic = true;
828 
829 		/* Higher Tx/Rx data. */
830 		if (aver_rx_cnt_inperiod > 4000 ||
831 		    aver_tx_cnt_inperiod > 4000) {
832 			higher_busytraffic = true;
833 
834 			/* Extremely high Rx data. */
835 			if (aver_rx_cnt_inperiod > 5000)
836 				higher_busyrxtraffic = true;
837 			else
838 				higher_busytxtraffic = false;
839 		}
840 
841 		if (((rtlpriv->link_info.num_rx_inperiod +
842 		      rtlpriv->link_info.num_tx_inperiod) > 8) ||
843 		    (rtlpriv->link_info.num_rx_inperiod > 2))
844 			enter_ps = false;
845 		else
846 			enter_ps = true;
847 
848 		/* LeisurePS only work in infra mode. */
849 		if (enter_ps)
850 			rtl_lps_enter(hw);
851 		else
852 			rtl_lps_leave(hw);
853 	}
854 
855 	rtlpriv->link_info.num_rx_inperiod = 0;
856 	rtlpriv->link_info.num_tx_inperiod = 0;
857 
858 	rtlpriv->link_info.busytraffic = busytraffic;
859 	rtlpriv->link_info.higher_busytraffic = higher_busytraffic;
860 	rtlpriv->link_info.higher_busyrxtraffic = higher_busyrxtraffic;
861 
862 }
863 
rtl_watch_dog_timer_callback(unsigned long data)864 void rtl_watch_dog_timer_callback(unsigned long data)
865 {
866 	struct ieee80211_hw *hw = (struct ieee80211_hw *)data;
867 	struct rtl_priv *rtlpriv = rtl_priv(hw);
868 
869 	queue_delayed_work(rtlpriv->works.rtl_wq,
870 			   &rtlpriv->works.watchdog_wq, 0);
871 
872 	mod_timer(&rtlpriv->works.watchdog_timer,
873 		  jiffies + MSECS(RTL_WATCH_DOG_TIME));
874 }
875 
876 /*********************************************************
877  *
878  * sysfs functions
879  *
880  *********************************************************/
rtl_show_debug_level(struct device * d,struct device_attribute * attr,char * buf)881 static ssize_t rtl_show_debug_level(struct device *d,
882 				    struct device_attribute *attr, char *buf)
883 {
884 	struct ieee80211_hw *hw = dev_get_drvdata(d);
885 	struct rtl_priv *rtlpriv = rtl_priv(hw);
886 
887 	return sprintf(buf, "0x%08X\n", rtlpriv->dbg.global_debuglevel);
888 }
889 
rtl_store_debug_level(struct device * d,struct device_attribute * attr,const char * buf,size_t count)890 static ssize_t rtl_store_debug_level(struct device *d,
891 				     struct device_attribute *attr,
892 				     const char *buf, size_t count)
893 {
894 	struct ieee80211_hw *hw = dev_get_drvdata(d);
895 	struct rtl_priv *rtlpriv = rtl_priv(hw);
896 	unsigned long val;
897 	int ret;
898 
899 	ret = strict_strtoul(buf, 0, &val);
900 	if (ret) {
901 		printk(KERN_DEBUG "%s is not in hex or decimal form.\n", buf);
902 	} else {
903 		rtlpriv->dbg.global_debuglevel = val;
904 		printk(KERN_DEBUG "debuglevel:%x\n",
905 		       rtlpriv->dbg.global_debuglevel);
906 	}
907 
908 	return strnlen(buf, count);
909 }
910 
911 static DEVICE_ATTR(debug_level, S_IWUSR | S_IRUGO,
912 		   rtl_show_debug_level, rtl_store_debug_level);
913 
914 static struct attribute *rtl_sysfs_entries[] = {
915 
916 	&dev_attr_debug_level.attr,
917 
918 	NULL
919 };
920 
921 /*
922  * "name" is folder name witch will be
923  * put in device directory like :
924  * sys/devices/pci0000:00/0000:00:1c.4/
925  * 0000:06:00.0/rtl_sysfs
926  */
927 struct attribute_group rtl_attribute_group = {
928 	.name = "rtlsysfs",
929 	.attrs = rtl_sysfs_entries,
930 };
931 
932 MODULE_AUTHOR("lizhaoming	<chaoming_li@realsil.com.cn>");
933 MODULE_AUTHOR("Realtek WlanFAE	<wlanfae@realtek.com>");
934 MODULE_AUTHOR("Larry Finger	<Larry.FInger@lwfinger.net>");
935 MODULE_LICENSE("GPL");
936 MODULE_DESCRIPTION("Realtek 802.11n PCI wireless core");
937 
rtl_core_module_init(void)938 static int __init rtl_core_module_init(void)
939 {
940 	if (rtl_rate_control_register())
941 		printk(KERN_ERR "rtlwifi: Unable to register rtl_rc,"
942 		       "use default RC !!\n");
943 	return 0;
944 }
945 
rtl_core_module_exit(void)946 static void __exit rtl_core_module_exit(void)
947 {
948 	 /*RC*/
949 	rtl_rate_control_unregister();
950 }
951 
952 module_init(rtl_core_module_init);
953 module_exit(rtl_core_module_exit);
954