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