linux/drivers/net/wireless/realtek/rtlwifi/base.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/* Copyright(c) 2009-2012  Realtek Corporation.*/
   3
   4#include "wifi.h"
   5#include "rc.h"
   6#include "base.h"
   7#include "efuse.h"
   8#include "cam.h"
   9#include "ps.h"
  10#include "regd.h"
  11#include "pci.h"
  12#include <linux/ip.h>
  13#include <linux/module.h>
  14#include <linux/udp.h>
  15
  16/*
  17 *NOTICE!!!: This file will be very big, we should
  18 *keep it clear under following roles:
  19 *
  20 *This file include following parts, so, if you add new
  21 *functions into this file, please check which part it
  22 *should includes. or check if you should add new part
  23 *for this file:
  24 *
  25 *1) mac80211 init functions
  26 *2) tx information functions
  27 *3) functions called by core.c
  28 *4) wq & timer callback functions
  29 *5) frame process functions
  30 *6) IOT functions
  31 *7) sysfs functions
  32 *8) vif functions
  33 *9) ...
  34 */
  35
  36/*********************************************************
  37 *
  38 * mac80211 init functions
  39 *
  40 *********************************************************/
  41static struct ieee80211_channel rtl_channeltable_2g[] = {
  42        {.center_freq = 2412, .hw_value = 1,},
  43        {.center_freq = 2417, .hw_value = 2,},
  44        {.center_freq = 2422, .hw_value = 3,},
  45        {.center_freq = 2427, .hw_value = 4,},
  46        {.center_freq = 2432, .hw_value = 5,},
  47        {.center_freq = 2437, .hw_value = 6,},
  48        {.center_freq = 2442, .hw_value = 7,},
  49        {.center_freq = 2447, .hw_value = 8,},
  50        {.center_freq = 2452, .hw_value = 9,},
  51        {.center_freq = 2457, .hw_value = 10,},
  52        {.center_freq = 2462, .hw_value = 11,},
  53        {.center_freq = 2467, .hw_value = 12,},
  54        {.center_freq = 2472, .hw_value = 13,},
  55        {.center_freq = 2484, .hw_value = 14,},
  56};
  57
  58static struct ieee80211_channel rtl_channeltable_5g[] = {
  59        {.center_freq = 5180, .hw_value = 36,},
  60        {.center_freq = 5200, .hw_value = 40,},
  61        {.center_freq = 5220, .hw_value = 44,},
  62        {.center_freq = 5240, .hw_value = 48,},
  63        {.center_freq = 5260, .hw_value = 52,},
  64        {.center_freq = 5280, .hw_value = 56,},
  65        {.center_freq = 5300, .hw_value = 60,},
  66        {.center_freq = 5320, .hw_value = 64,},
  67        {.center_freq = 5500, .hw_value = 100,},
  68        {.center_freq = 5520, .hw_value = 104,},
  69        {.center_freq = 5540, .hw_value = 108,},
  70        {.center_freq = 5560, .hw_value = 112,},
  71        {.center_freq = 5580, .hw_value = 116,},
  72        {.center_freq = 5600, .hw_value = 120,},
  73        {.center_freq = 5620, .hw_value = 124,},
  74        {.center_freq = 5640, .hw_value = 128,},
  75        {.center_freq = 5660, .hw_value = 132,},
  76        {.center_freq = 5680, .hw_value = 136,},
  77        {.center_freq = 5700, .hw_value = 140,},
  78        {.center_freq = 5745, .hw_value = 149,},
  79        {.center_freq = 5765, .hw_value = 153,},
  80        {.center_freq = 5785, .hw_value = 157,},
  81        {.center_freq = 5805, .hw_value = 161,},
  82        {.center_freq = 5825, .hw_value = 165,},
  83};
  84
  85static struct ieee80211_rate rtl_ratetable_2g[] = {
  86        {.bitrate = 10, .hw_value = 0x00,},
  87        {.bitrate = 20, .hw_value = 0x01,},
  88        {.bitrate = 55, .hw_value = 0x02,},
  89        {.bitrate = 110, .hw_value = 0x03,},
  90        {.bitrate = 60, .hw_value = 0x04,},
  91        {.bitrate = 90, .hw_value = 0x05,},
  92        {.bitrate = 120, .hw_value = 0x06,},
  93        {.bitrate = 180, .hw_value = 0x07,},
  94        {.bitrate = 240, .hw_value = 0x08,},
  95        {.bitrate = 360, .hw_value = 0x09,},
  96        {.bitrate = 480, .hw_value = 0x0a,},
  97        {.bitrate = 540, .hw_value = 0x0b,},
  98};
  99
 100static struct ieee80211_rate rtl_ratetable_5g[] = {
 101        {.bitrate = 60, .hw_value = 0x04,},
 102        {.bitrate = 90, .hw_value = 0x05,},
 103        {.bitrate = 120, .hw_value = 0x06,},
 104        {.bitrate = 180, .hw_value = 0x07,},
 105        {.bitrate = 240, .hw_value = 0x08,},
 106        {.bitrate = 360, .hw_value = 0x09,},
 107        {.bitrate = 480, .hw_value = 0x0a,},
 108        {.bitrate = 540, .hw_value = 0x0b,},
 109};
 110
 111static const struct ieee80211_supported_band rtl_band_2ghz = {
 112        .band = NL80211_BAND_2GHZ,
 113
 114        .channels = rtl_channeltable_2g,
 115        .n_channels = ARRAY_SIZE(rtl_channeltable_2g),
 116
 117        .bitrates = rtl_ratetable_2g,
 118        .n_bitrates = ARRAY_SIZE(rtl_ratetable_2g),
 119
 120        .ht_cap = {0},
 121};
 122
 123static struct ieee80211_supported_band rtl_band_5ghz = {
 124        .band = NL80211_BAND_5GHZ,
 125
 126        .channels = rtl_channeltable_5g,
 127        .n_channels = ARRAY_SIZE(rtl_channeltable_5g),
 128
 129        .bitrates = rtl_ratetable_5g,
 130        .n_bitrates = ARRAY_SIZE(rtl_ratetable_5g),
 131
 132        .ht_cap = {0},
 133};
 134
 135static const u8 tid_to_ac[] = {
 136        2, /* IEEE80211_AC_BE */
 137        3, /* IEEE80211_AC_BK */
 138        3, /* IEEE80211_AC_BK */
 139        2, /* IEEE80211_AC_BE */
 140        1, /* IEEE80211_AC_VI */
 141        1, /* IEEE80211_AC_VI */
 142        0, /* IEEE80211_AC_VO */
 143        0, /* IEEE80211_AC_VO */
 144};
 145
 146u8 rtl_tid_to_ac(u8 tid)
 147{
 148        return tid_to_ac[tid];
 149}
 150EXPORT_SYMBOL_GPL(rtl_tid_to_ac);
 151
 152static void _rtl_init_hw_ht_capab(struct ieee80211_hw *hw,
 153                                  struct ieee80211_sta_ht_cap *ht_cap)
 154{
 155        struct rtl_priv *rtlpriv = rtl_priv(hw);
 156        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 157
 158        ht_cap->ht_supported = true;
 159        ht_cap->cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
 160            IEEE80211_HT_CAP_SGI_40 |
 161            IEEE80211_HT_CAP_SGI_20 |
 162            IEEE80211_HT_CAP_DSSSCCK40 | IEEE80211_HT_CAP_MAX_AMSDU;
 163
 164        if (rtlpriv->rtlhal.disable_amsdu_8k)
 165                ht_cap->cap &= ~IEEE80211_HT_CAP_MAX_AMSDU;
 166
 167        /*
 168         *Maximum length of AMPDU that the STA can receive.
 169         *Length = 2 ^ (13 + max_ampdu_length_exp) - 1 (octets)
 170         */
 171        ht_cap->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
 172
 173        /*Minimum MPDU start spacing , */
 174        ht_cap->ampdu_density = IEEE80211_HT_MPDU_DENSITY_16;
 175
 176        ht_cap->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
 177
 178        /*hw->wiphy->bands[NL80211_BAND_2GHZ]
 179         *base on ant_num
 180         *rx_mask: RX mask
 181         *if rx_ant = 1 rx_mask[0]= 0xff;==>MCS0-MCS7
 182         *if rx_ant = 2 rx_mask[1]= 0xff;==>MCS8-MCS15
 183         *if rx_ant >= 3 rx_mask[2]= 0xff;
 184         *if BW_40 rx_mask[4]= 0x01;
 185         *highest supported RX rate
 186         */
 187        if (rtlpriv->dm.supp_phymode_switch) {
 188                pr_info("Support phy mode switch\n");
 189
 190                ht_cap->mcs.rx_mask[0] = 0xFF;
 191                ht_cap->mcs.rx_mask[1] = 0xFF;
 192                ht_cap->mcs.rx_mask[4] = 0x01;
 193
 194                ht_cap->mcs.rx_highest = cpu_to_le16(MAX_BIT_RATE_40MHZ_MCS15);
 195        } else {
 196                if (get_rf_type(rtlphy) == RF_1T2R ||
 197                    get_rf_type(rtlphy) == RF_2T2R) {
 198                        rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG,
 199                                "1T2R or 2T2R\n");
 200                        ht_cap->mcs.rx_mask[0] = 0xFF;
 201                        ht_cap->mcs.rx_mask[1] = 0xFF;
 202                        ht_cap->mcs.rx_mask[4] = 0x01;
 203
 204                        ht_cap->mcs.rx_highest =
 205                                 cpu_to_le16(MAX_BIT_RATE_40MHZ_MCS15);
 206                } else if (get_rf_type(rtlphy) == RF_1T1R) {
 207                        rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG, "1T1R\n");
 208
 209                        ht_cap->mcs.rx_mask[0] = 0xFF;
 210                        ht_cap->mcs.rx_mask[1] = 0x00;
 211                        ht_cap->mcs.rx_mask[4] = 0x01;
 212
 213                        ht_cap->mcs.rx_highest =
 214                                 cpu_to_le16(MAX_BIT_RATE_40MHZ_MCS7);
 215                }
 216        }
 217}
 218
 219static void _rtl_init_hw_vht_capab(struct ieee80211_hw *hw,
 220                                   struct ieee80211_sta_vht_cap *vht_cap)
 221{
 222        struct rtl_priv *rtlpriv = rtl_priv(hw);
 223        struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
 224
 225        if (!(rtlpriv->cfg->spec_ver & RTL_SPEC_SUPPORT_VHT))
 226                return;
 227
 228        if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE ||
 229            rtlhal->hw_type == HARDWARE_TYPE_RTL8822BE) {
 230                u16 mcs_map;
 231
 232                vht_cap->vht_supported = true;
 233                vht_cap->cap =
 234                        IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454 |
 235                        IEEE80211_VHT_CAP_SHORT_GI_80 |
 236                        IEEE80211_VHT_CAP_TXSTBC |
 237                        IEEE80211_VHT_CAP_RXSTBC_1 |
 238                        IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
 239                        IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
 240                        IEEE80211_VHT_CAP_HTC_VHT |
 241                        IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK |
 242                        IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN |
 243                        IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN |
 244                        0;
 245
 246                mcs_map = IEEE80211_VHT_MCS_SUPPORT_0_9 << 0 |
 247                        IEEE80211_VHT_MCS_SUPPORT_0_9 << 2 |
 248                        IEEE80211_VHT_MCS_NOT_SUPPORTED << 4 |
 249                        IEEE80211_VHT_MCS_NOT_SUPPORTED << 6 |
 250                        IEEE80211_VHT_MCS_NOT_SUPPORTED << 8 |
 251                        IEEE80211_VHT_MCS_NOT_SUPPORTED << 10 |
 252                        IEEE80211_VHT_MCS_NOT_SUPPORTED << 12 |
 253                        IEEE80211_VHT_MCS_NOT_SUPPORTED << 14;
 254
 255                vht_cap->vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
 256                vht_cap->vht_mcs.rx_highest =
 257                        cpu_to_le16(MAX_BIT_RATE_SHORT_GI_2NSS_80MHZ_MCS9);
 258                vht_cap->vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
 259                vht_cap->vht_mcs.tx_highest =
 260                        cpu_to_le16(MAX_BIT_RATE_SHORT_GI_2NSS_80MHZ_MCS9);
 261        } else if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
 262                u16 mcs_map;
 263
 264                vht_cap->vht_supported = true;
 265                vht_cap->cap =
 266                        IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454 |
 267                        IEEE80211_VHT_CAP_SHORT_GI_80 |
 268                        IEEE80211_VHT_CAP_TXSTBC |
 269                        IEEE80211_VHT_CAP_RXSTBC_1 |
 270                        IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
 271                        IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
 272                        IEEE80211_VHT_CAP_HTC_VHT |
 273                        IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK |
 274                        IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN |
 275                        IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN |
 276                        0;
 277
 278                mcs_map = IEEE80211_VHT_MCS_SUPPORT_0_9 << 0 |
 279                        IEEE80211_VHT_MCS_NOT_SUPPORTED << 2 |
 280                        IEEE80211_VHT_MCS_NOT_SUPPORTED << 4 |
 281                        IEEE80211_VHT_MCS_NOT_SUPPORTED << 6 |
 282                        IEEE80211_VHT_MCS_NOT_SUPPORTED << 8 |
 283                        IEEE80211_VHT_MCS_NOT_SUPPORTED << 10 |
 284                        IEEE80211_VHT_MCS_NOT_SUPPORTED << 12 |
 285                        IEEE80211_VHT_MCS_NOT_SUPPORTED << 14;
 286
 287                vht_cap->vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
 288                vht_cap->vht_mcs.rx_highest =
 289                        cpu_to_le16(MAX_BIT_RATE_SHORT_GI_1NSS_80MHZ_MCS9);
 290                vht_cap->vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
 291                vht_cap->vht_mcs.tx_highest =
 292                        cpu_to_le16(MAX_BIT_RATE_SHORT_GI_1NSS_80MHZ_MCS9);
 293        }
 294}
 295
 296static void _rtl_init_mac80211(struct ieee80211_hw *hw)
 297{
 298        struct rtl_priv *rtlpriv = rtl_priv(hw);
 299        struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
 300        struct rtl_mac *rtlmac = rtl_mac(rtl_priv(hw));
 301        struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
 302        struct ieee80211_supported_band *sband;
 303
 304        if (rtlhal->macphymode == SINGLEMAC_SINGLEPHY &&
 305            rtlhal->bandset == BAND_ON_BOTH) {
 306                /* 1: 2.4 G bands */
 307                /* <1> use  mac->bands as mem for hw->wiphy->bands */
 308                sband = &(rtlmac->bands[NL80211_BAND_2GHZ]);
 309
 310                /* <2> set hw->wiphy->bands[NL80211_BAND_2GHZ]
 311                 * to default value(1T1R) */
 312                memcpy(&(rtlmac->bands[NL80211_BAND_2GHZ]), &rtl_band_2ghz,
 313                                sizeof(struct ieee80211_supported_band));
 314
 315                /* <3> init ht cap base on ant_num */
 316                _rtl_init_hw_ht_capab(hw, &sband->ht_cap);
 317
 318                /* <4> set mac->sband to wiphy->sband */
 319                hw->wiphy->bands[NL80211_BAND_2GHZ] = sband;
 320
 321                /* 2: 5 G bands */
 322                /* <1> use  mac->bands as mem for hw->wiphy->bands */
 323                sband = &(rtlmac->bands[NL80211_BAND_5GHZ]);
 324
 325                /* <2> set hw->wiphy->bands[NL80211_BAND_5GHZ]
 326                 * to default value(1T1R) */
 327                memcpy(&(rtlmac->bands[NL80211_BAND_5GHZ]), &rtl_band_5ghz,
 328                                sizeof(struct ieee80211_supported_band));
 329
 330                /* <3> init ht cap base on ant_num */
 331                _rtl_init_hw_ht_capab(hw, &sband->ht_cap);
 332
 333                _rtl_init_hw_vht_capab(hw, &sband->vht_cap);
 334                /* <4> set mac->sband to wiphy->sband */
 335                hw->wiphy->bands[NL80211_BAND_5GHZ] = sband;
 336        } else {
 337                if (rtlhal->current_bandtype == BAND_ON_2_4G) {
 338                        /* <1> use  mac->bands as mem for hw->wiphy->bands */
 339                        sband = &(rtlmac->bands[NL80211_BAND_2GHZ]);
 340
 341                        /* <2> set hw->wiphy->bands[NL80211_BAND_2GHZ]
 342                         * to default value(1T1R) */
 343                        memcpy(&(rtlmac->bands[NL80211_BAND_2GHZ]),
 344                               &rtl_band_2ghz,
 345                               sizeof(struct ieee80211_supported_band));
 346
 347                        /* <3> init ht cap base on ant_num */
 348                        _rtl_init_hw_ht_capab(hw, &sband->ht_cap);
 349
 350                        /* <4> set mac->sband to wiphy->sband */
 351                        hw->wiphy->bands[NL80211_BAND_2GHZ] = sband;
 352                } else if (rtlhal->current_bandtype == BAND_ON_5G) {
 353                        /* <1> use  mac->bands as mem for hw->wiphy->bands */
 354                        sband = &(rtlmac->bands[NL80211_BAND_5GHZ]);
 355
 356                        /* <2> set hw->wiphy->bands[NL80211_BAND_5GHZ]
 357                         * to default value(1T1R) */
 358                        memcpy(&(rtlmac->bands[NL80211_BAND_5GHZ]),
 359                               &rtl_band_5ghz,
 360                               sizeof(struct ieee80211_supported_band));
 361
 362                        /* <3> init ht cap base on ant_num */
 363                        _rtl_init_hw_ht_capab(hw, &sband->ht_cap);
 364
 365                        _rtl_init_hw_vht_capab(hw, &sband->vht_cap);
 366                        /* <4> set mac->sband to wiphy->sband */
 367                        hw->wiphy->bands[NL80211_BAND_5GHZ] = sband;
 368                } else {
 369                        pr_err("Err BAND %d\n",
 370                               rtlhal->current_bandtype);
 371                }
 372        }
 373        /* <5> set hw caps */
 374        ieee80211_hw_set(hw, SIGNAL_DBM);
 375        ieee80211_hw_set(hw, RX_INCLUDES_FCS);
 376        ieee80211_hw_set(hw, AMPDU_AGGREGATION);
 377        ieee80211_hw_set(hw, MFP_CAPABLE);
 378        ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS);
 379        ieee80211_hw_set(hw, SUPPORTS_AMSDU_IN_AMPDU);
 380        ieee80211_hw_set(hw, SUPPORT_FAST_XMIT);
 381
 382        /* swlps or hwlps has been set in diff chip in init_sw_vars */
 383        if (rtlpriv->psc.swctrl_lps) {
 384                ieee80211_hw_set(hw, SUPPORTS_PS);
 385                ieee80211_hw_set(hw, PS_NULLFUNC_STACK);
 386        }
 387        if (rtlpriv->psc.fwctrl_lps) {
 388                ieee80211_hw_set(hw, SUPPORTS_PS);
 389                ieee80211_hw_set(hw, SUPPORTS_DYNAMIC_PS);
 390        }
 391        hw->wiphy->interface_modes =
 392            BIT(NL80211_IFTYPE_AP) |
 393            BIT(NL80211_IFTYPE_STATION) |
 394            BIT(NL80211_IFTYPE_ADHOC) |
 395            BIT(NL80211_IFTYPE_MESH_POINT) |
 396            BIT(NL80211_IFTYPE_P2P_CLIENT) |
 397            BIT(NL80211_IFTYPE_P2P_GO);
 398        hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
 399
 400        hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
 401
 402        hw->wiphy->rts_threshold = 2347;
 403
 404        hw->queues = AC_MAX;
 405        hw->extra_tx_headroom = RTL_TX_HEADER_SIZE;
 406
 407        /* TODO: Correct this value for our hw */
 408        hw->max_listen_interval = MAX_LISTEN_INTERVAL;
 409        hw->max_rate_tries = MAX_RATE_TRIES;
 410        /* hw->max_rates = 1; */
 411        hw->sta_data_size = sizeof(struct rtl_sta_info);
 412
 413/* wowlan is not supported by kernel if CONFIG_PM is not defined */
 414#ifdef CONFIG_PM
 415        if (rtlpriv->psc.wo_wlan_mode) {
 416                if (rtlpriv->psc.wo_wlan_mode & WAKE_ON_MAGIC_PACKET)
 417                        rtlpriv->wowlan.flags = WIPHY_WOWLAN_MAGIC_PKT;
 418                if (rtlpriv->psc.wo_wlan_mode & WAKE_ON_PATTERN_MATCH) {
 419                        rtlpriv->wowlan.n_patterns =
 420                                MAX_SUPPORT_WOL_PATTERN_NUM;
 421                        rtlpriv->wowlan.pattern_min_len = MIN_WOL_PATTERN_SIZE;
 422                        rtlpriv->wowlan.pattern_max_len = MAX_WOL_PATTERN_SIZE;
 423                }
 424                hw->wiphy->wowlan = &rtlpriv->wowlan;
 425        }
 426#endif
 427
 428        /* <6> mac address */
 429        if (is_valid_ether_addr(rtlefuse->dev_addr)) {
 430                SET_IEEE80211_PERM_ADDR(hw, rtlefuse->dev_addr);
 431        } else {
 432                u8 rtlmac1[] = { 0x00, 0xe0, 0x4c, 0x81, 0x92, 0x00 };
 433
 434                get_random_bytes((rtlmac1 + (ETH_ALEN - 1)), 1);
 435                SET_IEEE80211_PERM_ADDR(hw, rtlmac1);
 436        }
 437}
 438
 439static void rtl_watchdog_wq_callback(struct work_struct *work);
 440static void rtl_fwevt_wq_callback(struct work_struct *work);
 441static void rtl_c2hcmd_wq_callback(struct work_struct *work);
 442
 443static int _rtl_init_deferred_work(struct ieee80211_hw *hw)
 444{
 445        struct rtl_priv *rtlpriv = rtl_priv(hw);
 446        struct workqueue_struct *wq;
 447
 448        wq = alloc_workqueue("%s", 0, 0, rtlpriv->cfg->name);
 449        if (!wq)
 450                return -ENOMEM;
 451
 452        /* <1> timer */
 453        timer_setup(&rtlpriv->works.watchdog_timer,
 454                    rtl_watch_dog_timer_callback, 0);
 455        timer_setup(&rtlpriv->works.dualmac_easyconcurrent_retrytimer,
 456                    rtl_easy_concurrent_retrytimer_callback, 0);
 457        /* <2> work queue */
 458        rtlpriv->works.hw = hw;
 459        rtlpriv->works.rtl_wq = wq;
 460
 461        INIT_DELAYED_WORK(&rtlpriv->works.watchdog_wq,
 462                          rtl_watchdog_wq_callback);
 463        INIT_DELAYED_WORK(&rtlpriv->works.ips_nic_off_wq,
 464                          rtl_ips_nic_off_wq_callback);
 465        INIT_DELAYED_WORK(&rtlpriv->works.ps_work, rtl_swlps_wq_callback);
 466        INIT_DELAYED_WORK(&rtlpriv->works.ps_rfon_wq,
 467                          rtl_swlps_rfon_wq_callback);
 468        INIT_DELAYED_WORK(&rtlpriv->works.fwevt_wq, rtl_fwevt_wq_callback);
 469        INIT_DELAYED_WORK(&rtlpriv->works.c2hcmd_wq, rtl_c2hcmd_wq_callback);
 470        return 0;
 471}
 472
 473void rtl_deinit_deferred_work(struct ieee80211_hw *hw, bool ips_wq)
 474{
 475        struct rtl_priv *rtlpriv = rtl_priv(hw);
 476
 477        del_timer_sync(&rtlpriv->works.watchdog_timer);
 478
 479        cancel_delayed_work_sync(&rtlpriv->works.watchdog_wq);
 480        if (ips_wq)
 481                cancel_delayed_work(&rtlpriv->works.ips_nic_off_wq);
 482        else
 483                cancel_delayed_work_sync(&rtlpriv->works.ips_nic_off_wq);
 484        cancel_delayed_work_sync(&rtlpriv->works.ps_work);
 485        cancel_delayed_work_sync(&rtlpriv->works.ps_rfon_wq);
 486        cancel_delayed_work_sync(&rtlpriv->works.fwevt_wq);
 487        cancel_delayed_work_sync(&rtlpriv->works.c2hcmd_wq);
 488}
 489EXPORT_SYMBOL_GPL(rtl_deinit_deferred_work);
 490
 491void rtl_init_rfkill(struct ieee80211_hw *hw)
 492{
 493        struct rtl_priv *rtlpriv = rtl_priv(hw);
 494
 495        bool radio_state;
 496        bool blocked;
 497        u8 valid = 0;
 498
 499        /*set init state to on */
 500        rtlpriv->rfkill.rfkill_state = true;
 501        wiphy_rfkill_set_hw_state(hw->wiphy, 0);
 502
 503        radio_state = rtlpriv->cfg->ops->radio_onoff_checking(hw, &valid);
 504
 505        if (valid) {
 506                pr_info("rtlwifi: wireless switch is %s\n",
 507                        rtlpriv->rfkill.rfkill_state ? "on" : "off");
 508
 509                rtlpriv->rfkill.rfkill_state = radio_state;
 510
 511                blocked = rtlpriv->rfkill.rfkill_state != 1;
 512                wiphy_rfkill_set_hw_state(hw->wiphy, blocked);
 513        }
 514
 515        wiphy_rfkill_start_polling(hw->wiphy);
 516}
 517EXPORT_SYMBOL(rtl_init_rfkill);
 518
 519void rtl_deinit_rfkill(struct ieee80211_hw *hw)
 520{
 521        wiphy_rfkill_stop_polling(hw->wiphy);
 522}
 523EXPORT_SYMBOL_GPL(rtl_deinit_rfkill);
 524
 525int rtl_init_core(struct ieee80211_hw *hw)
 526{
 527        struct rtl_priv *rtlpriv = rtl_priv(hw);
 528        struct rtl_mac *rtlmac = rtl_mac(rtl_priv(hw));
 529
 530        /* <1> init mac80211 */
 531        _rtl_init_mac80211(hw);
 532        rtlmac->hw = hw;
 533
 534        /* <2> rate control register */
 535        hw->rate_control_algorithm = "rtl_rc";
 536
 537        /*
 538         * <3> init CRDA must come after init
 539         * mac80211 hw  in _rtl_init_mac80211.
 540         */
 541        if (rtl_regd_init(hw, rtl_reg_notifier)) {
 542                pr_err("REGD init failed\n");
 543                return 1;
 544        }
 545
 546        /* <4> locks */
 547        mutex_init(&rtlpriv->locks.conf_mutex);
 548        mutex_init(&rtlpriv->locks.ips_mutex);
 549        mutex_init(&rtlpriv->locks.lps_mutex);
 550        spin_lock_init(&rtlpriv->locks.irq_th_lock);
 551        spin_lock_init(&rtlpriv->locks.h2c_lock);
 552        spin_lock_init(&rtlpriv->locks.rf_ps_lock);
 553        spin_lock_init(&rtlpriv->locks.rf_lock);
 554        spin_lock_init(&rtlpriv->locks.waitq_lock);
 555        spin_lock_init(&rtlpriv->locks.entry_list_lock);
 556        spin_lock_init(&rtlpriv->locks.scan_list_lock);
 557        spin_lock_init(&rtlpriv->locks.cck_and_rw_pagea_lock);
 558        spin_lock_init(&rtlpriv->locks.fw_ps_lock);
 559        spin_lock_init(&rtlpriv->locks.iqk_lock);
 560        /* <5> init list */
 561        INIT_LIST_HEAD(&rtlpriv->entry_list);
 562        INIT_LIST_HEAD(&rtlpriv->scan_list.list);
 563        skb_queue_head_init(&rtlpriv->tx_report.queue);
 564        skb_queue_head_init(&rtlpriv->c2hcmd_queue);
 565
 566        rtlmac->link_state = MAC80211_NOLINK;
 567
 568        /* <6> init deferred work */
 569        return _rtl_init_deferred_work(hw);
 570}
 571EXPORT_SYMBOL_GPL(rtl_init_core);
 572
 573static void rtl_free_entries_from_scan_list(struct ieee80211_hw *hw);
 574static void rtl_free_entries_from_ack_queue(struct ieee80211_hw *hw,
 575                                            bool timeout);
 576
 577void rtl_deinit_core(struct ieee80211_hw *hw)
 578{
 579        rtl_c2hcmd_launcher(hw, 0);
 580        rtl_free_entries_from_scan_list(hw);
 581        rtl_free_entries_from_ack_queue(hw, false);
 582}
 583EXPORT_SYMBOL_GPL(rtl_deinit_core);
 584
 585void rtl_init_rx_config(struct ieee80211_hw *hw)
 586{
 587        struct rtl_priv *rtlpriv = rtl_priv(hw);
 588        struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
 589
 590        rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RCR, (u8 *) (&mac->rx_conf));
 591}
 592EXPORT_SYMBOL_GPL(rtl_init_rx_config);
 593
 594/*********************************************************
 595 *
 596 * tx information functions
 597 *
 598 *********************************************************/
 599static void _rtl_qurey_shortpreamble_mode(struct ieee80211_hw *hw,
 600                                          struct rtl_tcb_desc *tcb_desc,
 601                                          struct ieee80211_tx_info *info)
 602{
 603        struct rtl_priv *rtlpriv = rtl_priv(hw);
 604        u8 rate_flag = info->control.rates[0].flags;
 605
 606        tcb_desc->use_shortpreamble = false;
 607
 608        /* 1M can only use Long Preamble. 11B spec */
 609        if (tcb_desc->hw_rate == rtlpriv->cfg->maps[RTL_RC_CCK_RATE1M])
 610                return;
 611        else if (rate_flag & IEEE80211_TX_RC_USE_SHORT_PREAMBLE)
 612                tcb_desc->use_shortpreamble = true;
 613
 614        return;
 615}
 616
 617static void _rtl_query_shortgi(struct ieee80211_hw *hw,
 618                               struct ieee80211_sta *sta,
 619                               struct rtl_tcb_desc *tcb_desc,
 620                               struct ieee80211_tx_info *info)
 621{
 622        struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
 623        u8 rate_flag = info->control.rates[0].flags;
 624        u8 sgi_40 = 0, sgi_20 = 0, bw_40 = 0;
 625        u8 sgi_80 = 0, bw_80 = 0;
 626
 627        tcb_desc->use_shortgi = false;
 628
 629        if (sta == NULL)
 630                return;
 631
 632        sgi_40 = sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40;
 633        sgi_20 = sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20;
 634        sgi_80 = sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80;
 635
 636        if (!sta->deflink.ht_cap.ht_supported &&
 637            !sta->deflink.vht_cap.vht_supported)
 638                return;
 639
 640        if (!sgi_40 && !sgi_20)
 641                return;
 642
 643        if (mac->opmode == NL80211_IFTYPE_STATION) {
 644                bw_40 = mac->bw_40;
 645                bw_80 = mac->bw_80;
 646        } else if (mac->opmode == NL80211_IFTYPE_AP ||
 647                 mac->opmode == NL80211_IFTYPE_ADHOC ||
 648                 mac->opmode == NL80211_IFTYPE_MESH_POINT) {
 649                bw_40 = sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40;
 650                bw_80 = sta->deflink.vht_cap.vht_supported;
 651        }
 652
 653        if (bw_80) {
 654                if (sgi_80)
 655                        tcb_desc->use_shortgi = true;
 656                else
 657                        tcb_desc->use_shortgi = false;
 658        } else {
 659                if (bw_40 && sgi_40)
 660                        tcb_desc->use_shortgi = true;
 661                else if (!bw_40 && sgi_20)
 662                        tcb_desc->use_shortgi = true;
 663        }
 664
 665        if (!(rate_flag & IEEE80211_TX_RC_SHORT_GI))
 666                tcb_desc->use_shortgi = false;
 667}
 668
 669static void _rtl_query_protection_mode(struct ieee80211_hw *hw,
 670                                       struct rtl_tcb_desc *tcb_desc,
 671                                       struct ieee80211_tx_info *info)
 672{
 673        struct rtl_priv *rtlpriv = rtl_priv(hw);
 674        u8 rate_flag = info->control.rates[0].flags;
 675
 676        /* Common Settings */
 677        tcb_desc->rts_stbc = false;
 678        tcb_desc->cts_enable = false;
 679        tcb_desc->rts_sc = 0;
 680        tcb_desc->rts_bw = false;
 681        tcb_desc->rts_use_shortpreamble = false;
 682        tcb_desc->rts_use_shortgi = false;
 683
 684        if (rate_flag & IEEE80211_TX_RC_USE_CTS_PROTECT) {
 685                /* Use CTS-to-SELF in protection mode. */
 686                tcb_desc->rts_enable = true;
 687                tcb_desc->cts_enable = true;
 688                tcb_desc->rts_rate = rtlpriv->cfg->maps[RTL_RC_OFDM_RATE24M];
 689        } else if (rate_flag & IEEE80211_TX_RC_USE_RTS_CTS) {
 690                /* Use RTS-CTS in protection mode. */
 691                tcb_desc->rts_enable = true;
 692                tcb_desc->rts_rate = rtlpriv->cfg->maps[RTL_RC_OFDM_RATE24M];
 693        }
 694}
 695
 696u8 rtl_mrate_idx_to_arfr_id(struct ieee80211_hw *hw, u8 rate_index,
 697                            enum wireless_mode wirelessmode)
 698{
 699        struct rtl_priv *rtlpriv = rtl_priv(hw);
 700        struct rtl_phy *rtlphy = &rtlpriv->phy;
 701        u8 ret = 0;
 702
 703        switch (rate_index) {
 704        case RATR_INX_WIRELESS_NGB:
 705                if (rtlphy->rf_type == RF_1T1R)
 706                        ret = RATEID_IDX_BGN_40M_1SS;
 707                else
 708                        ret = RATEID_IDX_BGN_40M_2SS;
 709                ; break;
 710        case RATR_INX_WIRELESS_N:
 711        case RATR_INX_WIRELESS_NG:
 712                if (rtlphy->rf_type == RF_1T1R)
 713                        ret = RATEID_IDX_GN_N1SS;
 714                else
 715                        ret = RATEID_IDX_GN_N2SS;
 716                ; break;
 717        case RATR_INX_WIRELESS_NB:
 718                if (rtlphy->rf_type == RF_1T1R)
 719                        ret = RATEID_IDX_BGN_20M_1SS_BN;
 720                else
 721                        ret = RATEID_IDX_BGN_20M_2SS_BN;
 722                ; break;
 723        case RATR_INX_WIRELESS_GB:
 724                ret = RATEID_IDX_BG;
 725                break;
 726        case RATR_INX_WIRELESS_G:
 727                ret = RATEID_IDX_G;
 728                break;
 729        case RATR_INX_WIRELESS_B:
 730                ret = RATEID_IDX_B;
 731                break;
 732        case RATR_INX_WIRELESS_MC:
 733                if (wirelessmode == WIRELESS_MODE_B ||
 734                    wirelessmode == WIRELESS_MODE_G ||
 735                    wirelessmode == WIRELESS_MODE_N_24G ||
 736                    wirelessmode == WIRELESS_MODE_AC_24G)
 737                        ret = RATEID_IDX_BG;
 738                else
 739                        ret = RATEID_IDX_G;
 740                break;
 741        case RATR_INX_WIRELESS_AC_5N:
 742                if (rtlphy->rf_type == RF_1T1R)
 743                        ret = RATEID_IDX_VHT_1SS;
 744                else
 745                        ret = RATEID_IDX_VHT_2SS;
 746                break;
 747        case RATR_INX_WIRELESS_AC_24N:
 748                if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80) {
 749                        if (rtlphy->rf_type == RF_1T1R)
 750                                ret = RATEID_IDX_VHT_1SS;
 751                        else
 752                                ret = RATEID_IDX_VHT_2SS;
 753                } else {
 754                        if (rtlphy->rf_type == RF_1T1R)
 755                                ret = RATEID_IDX_MIX1;
 756                        else
 757                                ret = RATEID_IDX_MIX2;
 758                }
 759                break;
 760        default:
 761                ret = RATEID_IDX_BGN_40M_2SS;
 762                break;
 763        }
 764        return ret;
 765}
 766EXPORT_SYMBOL(rtl_mrate_idx_to_arfr_id);
 767
 768static void _rtl_txrate_selectmode(struct ieee80211_hw *hw,
 769                                   struct ieee80211_sta *sta,
 770                                   struct rtl_tcb_desc *tcb_desc)
 771{
 772#define SET_RATE_ID(rate_id)                                    \
 773        ({typeof(rate_id) _id = rate_id;                        \
 774          ((rtlpriv->cfg->spec_ver & RTL_SPEC_NEW_RATEID) ?     \
 775                rtl_mrate_idx_to_arfr_id(hw, _id,               \
 776                        (sta_entry ? sta_entry->wireless_mode : \
 777                         WIRELESS_MODE_G)) :                    \
 778                _id); })
 779
 780        struct rtl_priv *rtlpriv = rtl_priv(hw);
 781        struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
 782        struct rtl_sta_info *sta_entry = NULL;
 783        u8 ratr_index = SET_RATE_ID(RATR_INX_WIRELESS_MC);
 784
 785        if (sta) {
 786                sta_entry = (struct rtl_sta_info *) sta->drv_priv;
 787                ratr_index = sta_entry->ratr_index;
 788        }
 789        if (!tcb_desc->disable_ratefallback || !tcb_desc->use_driver_rate) {
 790                if (mac->opmode == NL80211_IFTYPE_STATION) {
 791                        tcb_desc->ratr_index = 0;
 792                } else if (mac->opmode == NL80211_IFTYPE_ADHOC ||
 793                                mac->opmode == NL80211_IFTYPE_MESH_POINT) {
 794                        if (tcb_desc->multicast || tcb_desc->broadcast) {
 795                                tcb_desc->hw_rate =
 796                                    rtlpriv->cfg->maps[RTL_RC_CCK_RATE2M];
 797                                tcb_desc->use_driver_rate = 1;
 798                                tcb_desc->ratr_index =
 799                                        SET_RATE_ID(RATR_INX_WIRELESS_MC);
 800                        } else {
 801                                tcb_desc->ratr_index = ratr_index;
 802                        }
 803                } else if (mac->opmode == NL80211_IFTYPE_AP) {
 804                        tcb_desc->ratr_index = ratr_index;
 805                }
 806        }
 807
 808        if (rtlpriv->dm.useramask) {
 809                tcb_desc->ratr_index = ratr_index;
 810                /* TODO we will differentiate adhoc and station future  */
 811                if (mac->opmode == NL80211_IFTYPE_STATION ||
 812                    mac->opmode == NL80211_IFTYPE_MESH_POINT) {
 813                        tcb_desc->mac_id = 0;
 814
 815                        if (sta &&
 816                            (rtlpriv->cfg->spec_ver & RTL_SPEC_NEW_RATEID))
 817                                ;       /* use sta_entry->ratr_index */
 818                        else if (mac->mode == WIRELESS_MODE_AC_5G)
 819                                tcb_desc->ratr_index =
 820                                        SET_RATE_ID(RATR_INX_WIRELESS_AC_5N);
 821                        else if (mac->mode == WIRELESS_MODE_AC_24G)
 822                                tcb_desc->ratr_index =
 823                                        SET_RATE_ID(RATR_INX_WIRELESS_AC_24N);
 824                        else if (mac->mode == WIRELESS_MODE_N_24G)
 825                                tcb_desc->ratr_index =
 826                                        SET_RATE_ID(RATR_INX_WIRELESS_NGB);
 827                        else if (mac->mode == WIRELESS_MODE_N_5G)
 828                                tcb_desc->ratr_index =
 829                                        SET_RATE_ID(RATR_INX_WIRELESS_NG);
 830                        else if (mac->mode & WIRELESS_MODE_G)
 831                                tcb_desc->ratr_index =
 832                                        SET_RATE_ID(RATR_INX_WIRELESS_GB);
 833                        else if (mac->mode & WIRELESS_MODE_B)
 834                                tcb_desc->ratr_index =
 835                                        SET_RATE_ID(RATR_INX_WIRELESS_B);
 836                        else if (mac->mode & WIRELESS_MODE_A)
 837                                tcb_desc->ratr_index =
 838                                        SET_RATE_ID(RATR_INX_WIRELESS_G);
 839
 840                } else if (mac->opmode == NL80211_IFTYPE_AP ||
 841                        mac->opmode == NL80211_IFTYPE_ADHOC) {
 842                        if (NULL != sta) {
 843                                if (sta->aid > 0)
 844                                        tcb_desc->mac_id = sta->aid + 1;
 845                                else
 846                                        tcb_desc->mac_id = 1;
 847                        } else {
 848                                tcb_desc->mac_id = 0;
 849                        }
 850                }
 851        }
 852#undef SET_RATE_ID
 853}
 854
 855static void _rtl_query_bandwidth_mode(struct ieee80211_hw *hw,
 856                                      struct ieee80211_sta *sta,
 857                                      struct rtl_tcb_desc *tcb_desc)
 858{
 859        struct rtl_priv *rtlpriv = rtl_priv(hw);
 860        struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
 861
 862        tcb_desc->packet_bw = false;
 863        if (!sta)
 864                return;
 865        if (mac->opmode == NL80211_IFTYPE_AP ||
 866            mac->opmode == NL80211_IFTYPE_ADHOC ||
 867            mac->opmode == NL80211_IFTYPE_MESH_POINT) {
 868                if (!(sta->deflink.ht_cap.ht_supported) ||
 869                    !(sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40))
 870                        return;
 871        } else if (mac->opmode == NL80211_IFTYPE_STATION) {
 872                if (!mac->bw_40 || !(sta->deflink.ht_cap.ht_supported))
 873                        return;
 874        }
 875        if (tcb_desc->multicast || tcb_desc->broadcast)
 876                return;
 877
 878        /*use legency rate, shall use 20MHz */
 879        if (tcb_desc->hw_rate <= rtlpriv->cfg->maps[RTL_RC_OFDM_RATE54M])
 880                return;
 881
 882        tcb_desc->packet_bw = HT_CHANNEL_WIDTH_20_40;
 883
 884        if (rtlpriv->cfg->spec_ver & RTL_SPEC_SUPPORT_VHT) {
 885                if (mac->opmode == NL80211_IFTYPE_AP ||
 886                    mac->opmode == NL80211_IFTYPE_ADHOC ||
 887                    mac->opmode == NL80211_IFTYPE_MESH_POINT) {
 888                        if (!(sta->deflink.vht_cap.vht_supported))
 889                                return;
 890                } else if (mac->opmode == NL80211_IFTYPE_STATION) {
 891                        if (!mac->bw_80 ||
 892                            !(sta->deflink.vht_cap.vht_supported))
 893                                return;
 894                }
 895                if (tcb_desc->hw_rate <=
 896                        rtlpriv->cfg->maps[RTL_RC_HT_RATEMCS15])
 897                        return;
 898                tcb_desc->packet_bw = HT_CHANNEL_WIDTH_80;
 899        }
 900}
 901
 902static u8 _rtl_get_vht_highest_n_rate(struct ieee80211_hw *hw,
 903                                      struct ieee80211_sta *sta)
 904{
 905        struct rtl_priv *rtlpriv = rtl_priv(hw);
 906        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 907        u8 hw_rate;
 908        u16 tx_mcs_map = le16_to_cpu(sta->deflink.vht_cap.vht_mcs.tx_mcs_map);
 909
 910        if ((get_rf_type(rtlphy) == RF_2T2R) &&
 911            (tx_mcs_map & 0x000c) != 0x000c) {
 912                if ((tx_mcs_map & 0x000c) >> 2 ==
 913                        IEEE80211_VHT_MCS_SUPPORT_0_7)
 914                        hw_rate =
 915                        rtlpriv->cfg->maps[RTL_RC_VHT_RATE_2SS_MCS7];
 916                else if ((tx_mcs_map  & 0x000c) >> 2 ==
 917                        IEEE80211_VHT_MCS_SUPPORT_0_8)
 918                        hw_rate =
 919                        rtlpriv->cfg->maps[RTL_RC_VHT_RATE_2SS_MCS8];
 920                else
 921                        hw_rate =
 922                        rtlpriv->cfg->maps[RTL_RC_VHT_RATE_2SS_MCS9];
 923        } else {
 924                if ((tx_mcs_map  & 0x0003) ==
 925                        IEEE80211_VHT_MCS_SUPPORT_0_7)
 926                        hw_rate =
 927                        rtlpriv->cfg->maps[RTL_RC_VHT_RATE_1SS_MCS7];
 928                else if ((tx_mcs_map  & 0x0003) ==
 929                        IEEE80211_VHT_MCS_SUPPORT_0_8)
 930                        hw_rate =
 931                        rtlpriv->cfg->maps[RTL_RC_VHT_RATE_1SS_MCS8];
 932                else
 933                        hw_rate =
 934                        rtlpriv->cfg->maps[RTL_RC_VHT_RATE_1SS_MCS9];
 935        }
 936
 937        return hw_rate;
 938}
 939
 940static u8 _rtl_get_highest_n_rate(struct ieee80211_hw *hw,
 941                                  struct ieee80211_sta *sta)
 942{
 943        struct rtl_priv *rtlpriv = rtl_priv(hw);
 944        struct rtl_phy *rtlphy = &rtlpriv->phy;
 945        u8 hw_rate;
 946
 947        if (get_rf_type(rtlphy) == RF_2T2R &&
 948            sta->deflink.ht_cap.mcs.rx_mask[1] != 0)
 949                hw_rate = rtlpriv->cfg->maps[RTL_RC_HT_RATEMCS15];
 950        else
 951                hw_rate = rtlpriv->cfg->maps[RTL_RC_HT_RATEMCS7];
 952
 953        return hw_rate;
 954}
 955
 956/* mac80211's rate_idx is like this:
 957 *
 958 * 2.4G band:rx_status->band == NL80211_BAND_2GHZ
 959 *
 960 * B/G rate:
 961 * (rx_status->flag & RX_FLAG_HT) = 0,
 962 * DESC_RATE1M-->DESC_RATE54M ==> idx is 0-->11,
 963 *
 964 * N rate:
 965 * (rx_status->flag & RX_FLAG_HT) = 1,
 966 * DESC_RATEMCS0-->DESC_RATEMCS15 ==> idx is 0-->15
 967 *
 968 * 5G band:rx_status->band == NL80211_BAND_5GHZ
 969 * A rate:
 970 * (rx_status->flag & RX_FLAG_HT) = 0,
 971 * DESC_RATE6M-->DESC_RATE54M ==> idx is 0-->7,
 972 *
 973 * N rate:
 974 * (rx_status->flag & RX_FLAG_HT) = 1,
 975 * DESC_RATEMCS0-->DESC_RATEMCS15 ==> idx is 0-->15
 976 *
 977 * VHT rates:
 978 * DESC_RATEVHT1SS_MCS0-->DESC_RATEVHT1SS_MCS9 ==> idx is 0-->9
 979 * DESC_RATEVHT2SS_MCS0-->DESC_RATEVHT2SS_MCS9 ==> idx is 0-->9
 980 */
 981int rtlwifi_rate_mapping(struct ieee80211_hw *hw, bool isht, bool isvht,
 982                         u8 desc_rate)
 983{
 984        int rate_idx;
 985
 986        if (isvht) {
 987                switch (desc_rate) {
 988                case DESC_RATEVHT1SS_MCS0:
 989                        rate_idx = 0;
 990                        break;
 991                case DESC_RATEVHT1SS_MCS1:
 992                        rate_idx = 1;
 993                        break;
 994                case DESC_RATEVHT1SS_MCS2:
 995                        rate_idx = 2;
 996                        break;
 997                case DESC_RATEVHT1SS_MCS3:
 998                        rate_idx = 3;
 999                        break;
1000                case DESC_RATEVHT1SS_MCS4:
1001                        rate_idx = 4;
1002                        break;
1003                case DESC_RATEVHT1SS_MCS5:
1004                        rate_idx = 5;
1005                        break;
1006                case DESC_RATEVHT1SS_MCS6:
1007                        rate_idx = 6;
1008                        break;
1009                case DESC_RATEVHT1SS_MCS7:
1010                        rate_idx = 7;
1011                        break;
1012                case DESC_RATEVHT1SS_MCS8:
1013                        rate_idx = 8;
1014                        break;
1015                case DESC_RATEVHT1SS_MCS9:
1016                        rate_idx = 9;
1017                        break;
1018                case DESC_RATEVHT2SS_MCS0:
1019                        rate_idx = 0;
1020                        break;
1021                case DESC_RATEVHT2SS_MCS1:
1022                        rate_idx = 1;
1023                        break;
1024                case DESC_RATEVHT2SS_MCS2:
1025                        rate_idx = 2;
1026                        break;
1027                case DESC_RATEVHT2SS_MCS3:
1028                        rate_idx = 3;
1029                        break;
1030                case DESC_RATEVHT2SS_MCS4:
1031                        rate_idx = 4;
1032                        break;
1033                case DESC_RATEVHT2SS_MCS5:
1034                        rate_idx = 5;
1035                        break;
1036                case DESC_RATEVHT2SS_MCS6:
1037                        rate_idx = 6;
1038                        break;
1039                case DESC_RATEVHT2SS_MCS7:
1040                        rate_idx = 7;
1041                        break;
1042                case DESC_RATEVHT2SS_MCS8:
1043                        rate_idx = 8;
1044                        break;
1045                case DESC_RATEVHT2SS_MCS9:
1046                        rate_idx = 9;
1047                        break;
1048                default:
1049                        rate_idx = 0;
1050                        break;
1051                }
1052                return rate_idx;
1053        }
1054        if (false == isht) {
1055                if (NL80211_BAND_2GHZ == hw->conf.chandef.chan->band) {
1056                        switch (desc_rate) {
1057                        case DESC_RATE1M:
1058                                rate_idx = 0;
1059                                break;
1060                        case DESC_RATE2M:
1061                                rate_idx = 1;
1062                                break;
1063                        case DESC_RATE5_5M:
1064                                rate_idx = 2;
1065                                break;
1066                        case DESC_RATE11M:
1067                                rate_idx = 3;
1068                                break;
1069                        case DESC_RATE6M:
1070                                rate_idx = 4;
1071                                break;
1072                        case DESC_RATE9M:
1073                                rate_idx = 5;
1074                                break;
1075                        case DESC_RATE12M:
1076                                rate_idx = 6;
1077                                break;
1078                        case DESC_RATE18M:
1079                                rate_idx = 7;
1080                                break;
1081                        case DESC_RATE24M:
1082                                rate_idx = 8;
1083                                break;
1084                        case DESC_RATE36M:
1085                                rate_idx = 9;
1086                                break;
1087                        case DESC_RATE48M:
1088                                rate_idx = 10;
1089                                break;
1090                        case DESC_RATE54M:
1091                                rate_idx = 11;
1092                                break;
1093                        default:
1094                                rate_idx = 0;
1095                                break;
1096                        }
1097                } else {
1098                        switch (desc_rate) {
1099                        case DESC_RATE6M:
1100                                rate_idx = 0;
1101                                break;
1102                        case DESC_RATE9M:
1103                                rate_idx = 1;
1104                                break;
1105                        case DESC_RATE12M:
1106                                rate_idx = 2;
1107                                break;
1108                        case DESC_RATE18M:
1109                                rate_idx = 3;
1110                                break;
1111                        case DESC_RATE24M:
1112                                rate_idx = 4;
1113                                break;
1114                        case DESC_RATE36M:
1115                                rate_idx = 5;
1116                                break;
1117                        case DESC_RATE48M:
1118                                rate_idx = 6;
1119                                break;
1120                        case DESC_RATE54M:
1121                                rate_idx = 7;
1122                                break;
1123                        default:
1124                                rate_idx = 0;
1125                                break;
1126                        }
1127                }
1128        } else {
1129                switch (desc_rate) {
1130                case DESC_RATEMCS0:
1131                        rate_idx = 0;
1132                        break;
1133                case DESC_RATEMCS1:
1134                        rate_idx = 1;
1135                        break;
1136                case DESC_RATEMCS2:
1137                        rate_idx = 2;
1138                        break;
1139                case DESC_RATEMCS3:
1140                        rate_idx = 3;
1141                        break;
1142                case DESC_RATEMCS4:
1143                        rate_idx = 4;
1144                        break;
1145                case DESC_RATEMCS5:
1146                        rate_idx = 5;
1147                        break;
1148                case DESC_RATEMCS6:
1149                        rate_idx = 6;
1150                        break;
1151                case DESC_RATEMCS7:
1152                        rate_idx = 7;
1153                        break;
1154                case DESC_RATEMCS8:
1155                        rate_idx = 8;
1156                        break;
1157                case DESC_RATEMCS9:
1158                        rate_idx = 9;
1159                        break;
1160                case DESC_RATEMCS10:
1161                        rate_idx = 10;
1162                        break;
1163                case DESC_RATEMCS11:
1164                        rate_idx = 11;
1165                        break;
1166                case DESC_RATEMCS12:
1167                        rate_idx = 12;
1168                        break;
1169                case DESC_RATEMCS13:
1170                        rate_idx = 13;
1171                        break;
1172                case DESC_RATEMCS14:
1173                        rate_idx = 14;
1174                        break;
1175                case DESC_RATEMCS15:
1176                        rate_idx = 15;
1177                        break;
1178                default:
1179                        rate_idx = 0;
1180                        break;
1181                }
1182        }
1183        return rate_idx;
1184}
1185EXPORT_SYMBOL(rtlwifi_rate_mapping);
1186
1187static u8 _rtl_get_tx_hw_rate(struct ieee80211_hw *hw,
1188                              struct ieee80211_tx_info *info)
1189{
1190        struct rtl_priv *rtlpriv = rtl_priv(hw);
1191        struct ieee80211_tx_rate *r = &info->status.rates[0];
1192        struct ieee80211_rate *txrate;
1193        u8 hw_value = 0x0;
1194
1195        if (r->flags & IEEE80211_TX_RC_MCS) {
1196                /* HT MCS0-15 */
1197                hw_value = rtlpriv->cfg->maps[RTL_RC_HT_RATEMCS15] - 15 +
1198                           r->idx;
1199        } else if (r->flags & IEEE80211_TX_RC_VHT_MCS) {
1200                /* VHT MCS0-9, NSS */
1201                if (ieee80211_rate_get_vht_nss(r) == 2)
1202                        hw_value = rtlpriv->cfg->maps[RTL_RC_VHT_RATE_2SS_MCS9];
1203                else
1204                        hw_value = rtlpriv->cfg->maps[RTL_RC_VHT_RATE_1SS_MCS9];
1205
1206                hw_value = hw_value - 9 + ieee80211_rate_get_vht_mcs(r);
1207        } else {
1208                /* legacy */
1209                txrate = ieee80211_get_tx_rate(hw, info);
1210
1211                if (txrate)
1212                        hw_value = txrate->hw_value;
1213        }
1214
1215        /* check 5G band */
1216        if (rtlpriv->rtlhal.current_bandtype == BAND_ON_5G &&
1217            hw_value < rtlpriv->cfg->maps[RTL_RC_OFDM_RATE6M])
1218                hw_value = rtlpriv->cfg->maps[RTL_RC_OFDM_RATE6M];
1219
1220        return hw_value;
1221}
1222
1223void rtl_get_tcb_desc(struct ieee80211_hw *hw,
1224                      struct ieee80211_tx_info *info,
1225                      struct ieee80211_sta *sta,
1226                      struct sk_buff *skb, struct rtl_tcb_desc *tcb_desc)
1227{
1228#define SET_RATE_ID(rate_id)                                    \
1229        ({typeof(rate_id) _id = rate_id;                        \
1230          ((rtlpriv->cfg->spec_ver & RTL_SPEC_NEW_RATEID) ?     \
1231                rtl_mrate_idx_to_arfr_id(hw, _id,               \
1232                        (sta_entry ? sta_entry->wireless_mode : \
1233                         WIRELESS_MODE_G)) :                    \
1234                _id); })
1235
1236        struct rtl_priv *rtlpriv = rtl_priv(hw);
1237        struct rtl_mac *rtlmac = rtl_mac(rtl_priv(hw));
1238        struct ieee80211_hdr *hdr = rtl_get_hdr(skb);
1239        struct rtl_sta_info *sta_entry =
1240                (sta ? (struct rtl_sta_info *)sta->drv_priv : NULL);
1241
1242        __le16 fc = rtl_get_fc(skb);
1243
1244        tcb_desc->hw_rate = _rtl_get_tx_hw_rate(hw, info);
1245
1246        if (rtl_is_tx_report_skb(hw, skb))
1247                tcb_desc->use_spe_rpt = 1;
1248
1249        if (ieee80211_is_data(fc)) {
1250                /*
1251                 *we set data rate INX 0
1252                 *in rtl_rc.c   if skb is special data or
1253                 *mgt which need low data rate.
1254                 */
1255
1256                /*
1257                 *So tcb_desc->hw_rate is just used for
1258                 *special data and mgt frames
1259                 */
1260                if (info->control.rates[0].idx == 0 ||
1261                                ieee80211_is_nullfunc(fc)) {
1262                        tcb_desc->use_driver_rate = true;
1263                        tcb_desc->ratr_index =
1264                                        SET_RATE_ID(RATR_INX_WIRELESS_MC);
1265
1266                        tcb_desc->disable_ratefallback = 1;
1267                } else {
1268                        /*
1269                         *because hw will nerver use hw_rate
1270                         *when tcb_desc->use_driver_rate = false
1271                         *so we never set highest N rate here,
1272                         *and N rate will all be controlled by FW
1273                         *when tcb_desc->use_driver_rate = false
1274                         */
1275                        if (sta && sta->deflink.vht_cap.vht_supported) {
1276                                tcb_desc->hw_rate =
1277                                _rtl_get_vht_highest_n_rate(hw, sta);
1278                        } else {
1279                                if (sta && sta->deflink.ht_cap.ht_supported) {
1280                                        tcb_desc->hw_rate =
1281                                                _rtl_get_highest_n_rate(hw, sta);
1282                                } else {
1283                                        if (rtlmac->mode == WIRELESS_MODE_B) {
1284                                                tcb_desc->hw_rate =
1285                                                    rtlpriv->cfg->maps[RTL_RC_CCK_RATE11M];
1286                                        } else {
1287                                                tcb_desc->hw_rate =
1288                                                    rtlpriv->cfg->maps[RTL_RC_OFDM_RATE54M];
1289                                        }
1290                                }
1291                        }
1292                }
1293
1294                if (is_multicast_ether_addr(hdr->addr1))
1295                        tcb_desc->multicast = 1;
1296                else if (is_broadcast_ether_addr(hdr->addr1))
1297                        tcb_desc->broadcast = 1;
1298
1299                _rtl_txrate_selectmode(hw, sta, tcb_desc);
1300                _rtl_query_bandwidth_mode(hw, sta, tcb_desc);
1301                _rtl_qurey_shortpreamble_mode(hw, tcb_desc, info);
1302                _rtl_query_shortgi(hw, sta, tcb_desc, info);
1303                _rtl_query_protection_mode(hw, tcb_desc, info);
1304        } else {
1305                tcb_desc->use_driver_rate = true;
1306                tcb_desc->ratr_index = SET_RATE_ID(RATR_INX_WIRELESS_MC);
1307                tcb_desc->disable_ratefallback = 1;
1308                tcb_desc->mac_id = 0;
1309                tcb_desc->packet_bw = false;
1310        }
1311#undef SET_RATE_ID
1312}
1313EXPORT_SYMBOL(rtl_get_tcb_desc);
1314
1315bool rtl_tx_mgmt_proc(struct ieee80211_hw *hw, struct sk_buff *skb)
1316{
1317        struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1318        struct rtl_priv *rtlpriv = rtl_priv(hw);
1319        __le16 fc = rtl_get_fc(skb);
1320
1321        if (rtlpriv->dm.supp_phymode_switch &&
1322            mac->link_state < MAC80211_LINKED &&
1323            (ieee80211_is_auth(fc) || ieee80211_is_probe_req(fc))) {
1324                if (rtlpriv->cfg->ops->chk_switch_dmdp)
1325                        rtlpriv->cfg->ops->chk_switch_dmdp(hw);
1326        }
1327        if (ieee80211_is_auth(fc)) {
1328                rtl_dbg(rtlpriv, COMP_SEND, DBG_DMESG, "MAC80211_LINKING\n");
1329
1330                mac->link_state = MAC80211_LINKING;
1331                /* Dul mac */
1332                rtlpriv->phy.need_iqk = true;
1333
1334        }
1335
1336        return true;
1337}
1338EXPORT_SYMBOL_GPL(rtl_tx_mgmt_proc);
1339
1340struct sk_buff *rtl_make_del_ba(struct ieee80211_hw *hw, u8 *sa,
1341                                u8 *bssid, u16 tid);
1342
1343static void process_agg_start(struct ieee80211_hw *hw,
1344                              struct ieee80211_hdr *hdr, u16 tid)
1345{
1346        struct rtl_priv *rtlpriv = rtl_priv(hw);
1347        struct ieee80211_rx_status rx_status = { 0 };
1348        struct sk_buff *skb_delba = NULL;
1349
1350        skb_delba = rtl_make_del_ba(hw, hdr->addr2, hdr->addr3, tid);
1351        if (skb_delba) {
1352                rx_status.freq = hw->conf.chandef.chan->center_freq;
1353                rx_status.band = hw->conf.chandef.chan->band;
1354                rx_status.flag |= RX_FLAG_DECRYPTED;
1355                rx_status.flag |= RX_FLAG_MACTIME_START;
1356                rx_status.rate_idx = 0;
1357                rx_status.signal = 50 + 10;
1358                memcpy(IEEE80211_SKB_RXCB(skb_delba),
1359                       &rx_status, sizeof(rx_status));
1360                RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG,
1361                              "fake del\n",
1362                              skb_delba->data,
1363                              skb_delba->len);
1364                ieee80211_rx_irqsafe(hw, skb_delba);
1365        }
1366}
1367
1368bool rtl_action_proc(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
1369{
1370        struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1371        struct ieee80211_hdr *hdr = rtl_get_hdr(skb);
1372        struct rtl_priv *rtlpriv = rtl_priv(hw);
1373        __le16 fc = rtl_get_fc(skb);
1374        u8 *act = (u8 *)(((u8 *)skb->data + MAC80211_3ADDR_LEN));
1375        u8 category;
1376
1377        if (!ieee80211_is_action(fc))
1378                return true;
1379
1380        category = *act;
1381        act++;
1382        switch (category) {
1383        case ACT_CAT_BA:
1384                switch (*act) {
1385                case ACT_ADDBAREQ:
1386                        if (mac->act_scanning)
1387                                return false;
1388
1389                        rtl_dbg(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
1390                                "%s ACT_ADDBAREQ From :%pM\n",
1391                                is_tx ? "Tx" : "Rx", hdr->addr2);
1392                        RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, "req\n",
1393                                skb->data, skb->len);
1394                        if (!is_tx) {
1395                                struct ieee80211_sta *sta = NULL;
1396                                struct rtl_sta_info *sta_entry = NULL;
1397                                struct rtl_tid_data *tid_data;
1398                                struct ieee80211_mgmt *mgmt = (void *)skb->data;
1399                                u16 capab = 0, tid = 0;
1400
1401                                rcu_read_lock();
1402                                sta = rtl_find_sta(hw, hdr->addr3);
1403                                if (sta == NULL) {
1404                                        rtl_dbg(rtlpriv, COMP_SEND | COMP_RECV,
1405                                                DBG_DMESG, "sta is NULL\n");
1406                                        rcu_read_unlock();
1407                                        return true;
1408                                }
1409
1410                                sta_entry =
1411                                        (struct rtl_sta_info *)sta->drv_priv;
1412                                if (!sta_entry) {
1413                                        rcu_read_unlock();
1414                                        return true;
1415                                }
1416                                capab =
1417                                  le16_to_cpu(mgmt->u.action.u.addba_req.capab);
1418                                tid = (capab &
1419                                       IEEE80211_ADDBA_PARAM_TID_MASK) >> 2;
1420                                if (tid >= MAX_TID_COUNT) {
1421                                        rcu_read_unlock();
1422                                        return true;
1423                                }
1424                                tid_data = &sta_entry->tids[tid];
1425                                if (tid_data->agg.rx_agg_state ==
1426                                    RTL_RX_AGG_START)
1427                                        process_agg_start(hw, hdr, tid);
1428                                rcu_read_unlock();
1429                        }
1430                        break;
1431                case ACT_ADDBARSP:
1432                        rtl_dbg(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
1433                                "%s ACT_ADDBARSP From :%pM\n",
1434                                is_tx ? "Tx" : "Rx", hdr->addr2);
1435                        break;
1436                case ACT_DELBA:
1437                        rtl_dbg(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
1438                                "ACT_ADDBADEL From :%pM\n", hdr->addr2);
1439                        break;
1440                }
1441                break;
1442        default:
1443                break;
1444        }
1445
1446        return true;
1447}
1448EXPORT_SYMBOL_GPL(rtl_action_proc);
1449
1450static void setup_special_tx(struct rtl_priv *rtlpriv, struct rtl_ps_ctl *ppsc,
1451                             int type)
1452{
1453        struct ieee80211_hw *hw = rtlpriv->hw;
1454
1455        rtlpriv->ra.is_special_data = true;
1456        if (rtlpriv->cfg->ops->get_btc_status())
1457                rtlpriv->btcoexist.btc_ops->btc_special_packet_notify(
1458                                        rtlpriv, type);
1459        rtl_lps_leave(hw, false);
1460        ppsc->last_delaylps_stamp_jiffies = jiffies;
1461}
1462
1463static const u8 *rtl_skb_ether_type_ptr(struct ieee80211_hw *hw,
1464                                        struct sk_buff *skb, bool is_enc)
1465{
1466        struct rtl_priv *rtlpriv = rtl_priv(hw);
1467        u8 mac_hdr_len = ieee80211_get_hdrlen_from_skb(skb);
1468        u8 encrypt_header_len = 0;
1469        u8 offset;
1470
1471        switch (rtlpriv->sec.pairwise_enc_algorithm) {
1472        case WEP40_ENCRYPTION:
1473        case WEP104_ENCRYPTION:
1474                encrypt_header_len = 4;/*WEP_IV_LEN*/
1475                break;
1476        case TKIP_ENCRYPTION:
1477                encrypt_header_len = 8;/*TKIP_IV_LEN*/
1478                break;
1479        case AESCCMP_ENCRYPTION:
1480                encrypt_header_len = 8;/*CCMP_HDR_LEN;*/
1481                break;
1482        default:
1483                break;
1484        }
1485
1486        offset = mac_hdr_len + SNAP_SIZE;
1487        if (is_enc)
1488                offset += encrypt_header_len;
1489
1490        return skb->data + offset;
1491}
1492
1493/*should call before software enc*/
1494u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx,
1495                       bool is_enc)
1496{
1497        struct rtl_priv *rtlpriv = rtl_priv(hw);
1498        struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
1499        __le16 fc = rtl_get_fc(skb);
1500        u16 ether_type;
1501        const u8 *ether_type_ptr;
1502        const struct iphdr *ip;
1503
1504        if (!ieee80211_is_data(fc))
1505                goto end;
1506
1507        ether_type_ptr = rtl_skb_ether_type_ptr(hw, skb, is_enc);
1508        ether_type = be16_to_cpup((__be16 *)ether_type_ptr);
1509
1510        if (ETH_P_IP == ether_type) {
1511                ip = (struct iphdr *)((u8 *)ether_type_ptr +
1512                     PROTOC_TYPE_SIZE);
1513                if (IPPROTO_UDP == ip->protocol) {
1514                        struct udphdr *udp = (struct udphdr *)((u8 *)ip +
1515                                                               (ip->ihl << 2));
1516                        if (((((u8 *)udp)[1] == 68) &&
1517                             (((u8 *)udp)[3] == 67)) ||
1518                            ((((u8 *)udp)[1] == 67) &&
1519                             (((u8 *)udp)[3] == 68))) {
1520                                /* 68 : UDP BOOTP client
1521                                 * 67 : UDP BOOTP server
1522                                 */
1523                                rtl_dbg(rtlpriv, (COMP_SEND | COMP_RECV),
1524                                        DBG_DMESG, "dhcp %s !!\n",
1525                                        (is_tx) ? "Tx" : "Rx");
1526
1527                                if (is_tx)
1528                                        setup_special_tx(rtlpriv, ppsc,
1529                                                         PACKET_DHCP);
1530
1531                                return true;
1532                        }
1533                }
1534        } else if (ETH_P_ARP == ether_type) {
1535                if (is_tx)
1536                        setup_special_tx(rtlpriv, ppsc, PACKET_ARP);
1537
1538                return true;
1539        } else if (ETH_P_PAE == ether_type) {
1540                /* EAPOL is seens as in-4way */
1541                rtlpriv->btcoexist.btc_info.in_4way = true;
1542                rtlpriv->btcoexist.btc_info.in_4way_ts = jiffies;
1543
1544                rtl_dbg(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
1545                        "802.1X %s EAPOL pkt!!\n", (is_tx) ? "Tx" : "Rx");
1546
1547                if (is_tx) {
1548                        rtlpriv->ra.is_special_data = true;
1549                        rtl_lps_leave(hw, false);
1550                        ppsc->last_delaylps_stamp_jiffies = jiffies;
1551
1552                        setup_special_tx(rtlpriv, ppsc, PACKET_EAPOL);
1553                }
1554
1555                return true;
1556        } else if (ETH_P_IPV6 == ether_type) {
1557                /* TODO: Handle any IPv6 cases that need special handling.
1558                 * For now, always return false
1559                 */
1560                goto end;
1561        }
1562
1563end:
1564        rtlpriv->ra.is_special_data = false;
1565        return false;
1566}
1567EXPORT_SYMBOL_GPL(rtl_is_special_data);
1568
1569void rtl_tx_ackqueue(struct ieee80211_hw *hw, struct sk_buff *skb)
1570{
1571        struct rtl_priv *rtlpriv = rtl_priv(hw);
1572        struct rtl_tx_report *tx_report = &rtlpriv->tx_report;
1573
1574        __skb_queue_tail(&tx_report->queue, skb);
1575}
1576EXPORT_SYMBOL_GPL(rtl_tx_ackqueue);
1577
1578static void rtl_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb,
1579                          bool ack)
1580{
1581        struct rtl_priv *rtlpriv = rtl_priv(hw);
1582        struct ieee80211_tx_info *info;
1583
1584        info = IEEE80211_SKB_CB(skb);
1585        ieee80211_tx_info_clear_status(info);
1586        if (ack) {
1587                rtl_dbg(rtlpriv, COMP_TX_REPORT, DBG_LOUD,
1588                        "tx report: ack\n");
1589                info->flags |= IEEE80211_TX_STAT_ACK;
1590        } else {
1591                rtl_dbg(rtlpriv, COMP_TX_REPORT, DBG_LOUD,
1592                        "tx report: not ack\n");
1593                info->flags &= ~IEEE80211_TX_STAT_ACK;
1594        }
1595        ieee80211_tx_status_irqsafe(hw, skb);
1596}
1597
1598bool rtl_is_tx_report_skb(struct ieee80211_hw *hw, struct sk_buff *skb)
1599{
1600        u16 ether_type;
1601        const u8 *ether_type_ptr;
1602        __le16 fc = rtl_get_fc(skb);
1603
1604        ether_type_ptr = rtl_skb_ether_type_ptr(hw, skb, true);
1605        ether_type = be16_to_cpup((__be16 *)ether_type_ptr);
1606
1607        if (ether_type == ETH_P_PAE || ieee80211_is_nullfunc(fc))
1608                return true;
1609
1610        return false;
1611}
1612
1613static u16 rtl_get_tx_report_sn(struct ieee80211_hw *hw,
1614                                struct rtlwifi_tx_info *tx_info)
1615{
1616        struct rtl_priv *rtlpriv = rtl_priv(hw);
1617        struct rtl_tx_report *tx_report = &rtlpriv->tx_report;
1618        u16 sn;
1619
1620        /* SW_DEFINE[11:8] are reserved (driver fills zeros)
1621         * SW_DEFINE[7:2] are used by driver
1622         * SW_DEFINE[1:0] are reserved for firmware (driver fills zeros)
1623         */
1624        sn = (atomic_inc_return(&tx_report->sn) & 0x003F) << 2;
1625
1626        tx_report->last_sent_sn = sn;
1627        tx_report->last_sent_time = jiffies;
1628        tx_info->sn = sn;
1629        tx_info->send_time = tx_report->last_sent_time;
1630        rtl_dbg(rtlpriv, COMP_TX_REPORT, DBG_DMESG,
1631                "Send TX-Report sn=0x%X\n", sn);
1632
1633        return sn;
1634}
1635
1636void rtl_set_tx_report(struct rtl_tcb_desc *ptcb_desc, u8 *pdesc,
1637                       struct ieee80211_hw *hw, struct rtlwifi_tx_info *tx_info)
1638{
1639        if (ptcb_desc->use_spe_rpt) {
1640                u16 sn = rtl_get_tx_report_sn(hw, tx_info);
1641
1642                SET_TX_DESC_SPE_RPT(pdesc, 1);
1643                SET_TX_DESC_SW_DEFINE(pdesc, sn);
1644        }
1645}
1646EXPORT_SYMBOL_GPL(rtl_set_tx_report);
1647
1648void rtl_tx_report_handler(struct ieee80211_hw *hw, u8 *tmp_buf, u8 c2h_cmd_len)
1649{
1650        struct rtl_priv *rtlpriv = rtl_priv(hw);
1651        struct rtl_tx_report *tx_report = &rtlpriv->tx_report;
1652        struct rtlwifi_tx_info *tx_info;
1653        struct sk_buff_head *queue = &tx_report->queue;
1654        struct sk_buff *skb;
1655        u16 sn;
1656        u8 st, retry;
1657
1658        if (rtlpriv->cfg->spec_ver & RTL_SPEC_EXT_C2H) {
1659                sn = GET_TX_REPORT_SN_V2(tmp_buf);
1660                st = GET_TX_REPORT_ST_V2(tmp_buf);
1661                retry = GET_TX_REPORT_RETRY_V2(tmp_buf);
1662        } else {
1663                sn = GET_TX_REPORT_SN_V1(tmp_buf);
1664                st = GET_TX_REPORT_ST_V1(tmp_buf);
1665                retry = GET_TX_REPORT_RETRY_V1(tmp_buf);
1666        }
1667
1668        tx_report->last_recv_sn = sn;
1669
1670        skb_queue_walk(queue, skb) {
1671                tx_info = rtl_tx_skb_cb_info(skb);
1672                if (tx_info->sn == sn) {
1673                        skb_unlink(skb, queue);
1674                        rtl_tx_status(hw, skb, st == 0);
1675                        break;
1676                }
1677        }
1678        rtl_dbg(rtlpriv, COMP_TX_REPORT, DBG_DMESG,
1679                "Recv TX-Report st=0x%02X sn=0x%X retry=0x%X\n",
1680                st, sn, retry);
1681}
1682EXPORT_SYMBOL_GPL(rtl_tx_report_handler);
1683
1684bool rtl_check_tx_report_acked(struct ieee80211_hw *hw)
1685{
1686        struct rtl_priv *rtlpriv = rtl_priv(hw);
1687        struct rtl_tx_report *tx_report = &rtlpriv->tx_report;
1688
1689        if (tx_report->last_sent_sn == tx_report->last_recv_sn)
1690                return true;
1691
1692        if (time_before(tx_report->last_sent_time + 3 * HZ, jiffies)) {
1693                rtl_dbg(rtlpriv, COMP_TX_REPORT, DBG_WARNING,
1694                        "Check TX-Report timeout!! s_sn=0x%X r_sn=0x%X\n",
1695                        tx_report->last_sent_sn, tx_report->last_recv_sn);
1696                return true;    /* 3 sec. (timeout) seen as acked */
1697        }
1698
1699        return false;
1700}
1701
1702void rtl_wait_tx_report_acked(struct ieee80211_hw *hw, u32 wait_ms)
1703{
1704        struct rtl_priv *rtlpriv = rtl_priv(hw);
1705        int i;
1706
1707        for (i = 0; i < wait_ms; i++) {
1708                if (rtl_check_tx_report_acked(hw))
1709                        break;
1710                usleep_range(1000, 2000);
1711                rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
1712                        "Wait 1ms (%d/%d) to disable key.\n", i, wait_ms);
1713        }
1714}
1715
1716u32 rtl_get_hal_edca_param(struct ieee80211_hw *hw,
1717                           struct ieee80211_vif *vif,
1718                           enum wireless_mode wirelessmode,
1719                           struct ieee80211_tx_queue_params *param)
1720{
1721        u32 reg = 0;
1722        u8 sifstime = 10;
1723        u8 slottime = 20;
1724
1725        /* AIFS = AIFSN * slot time + SIFS */
1726        switch (wirelessmode) {
1727        case WIRELESS_MODE_A:
1728        case WIRELESS_MODE_N_24G:
1729        case WIRELESS_MODE_N_5G:
1730        case WIRELESS_MODE_AC_5G:
1731        case WIRELESS_MODE_AC_24G:
1732                sifstime = 16;
1733                slottime = 9;
1734                break;
1735        case WIRELESS_MODE_G:
1736                slottime = (vif->bss_conf.use_short_slot ? 9 : 20);
1737                break;
1738        default:
1739                break;
1740        }
1741
1742        reg |= (param->txop & 0x7FF) << 16;
1743        reg |= (fls(param->cw_max) & 0xF) << 12;
1744        reg |= (fls(param->cw_min) & 0xF) << 8;
1745        reg |= (param->aifs & 0x0F) * slottime + sifstime;
1746
1747        return reg;
1748}
1749EXPORT_SYMBOL_GPL(rtl_get_hal_edca_param);
1750
1751/*********************************************************
1752 *
1753 * functions called by core.c
1754 *
1755 *********************************************************/
1756int rtl_tx_agg_start(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1757                     struct ieee80211_sta *sta, u16 tid, u16 *ssn)
1758{
1759        struct rtl_priv *rtlpriv = rtl_priv(hw);
1760        struct rtl_tid_data *tid_data;
1761        struct rtl_sta_info *sta_entry = NULL;
1762
1763        if (sta == NULL)
1764                return -EINVAL;
1765
1766        if (unlikely(tid >= MAX_TID_COUNT))
1767                return -EINVAL;
1768
1769        sta_entry = (struct rtl_sta_info *)sta->drv_priv;
1770        if (!sta_entry)
1771                return -ENXIO;
1772        tid_data = &sta_entry->tids[tid];
1773
1774        rtl_dbg(rtlpriv, COMP_SEND, DBG_DMESG,
1775                "on ra = %pM tid = %d seq:%d\n", sta->addr, tid,
1776                *ssn);
1777
1778        tid_data->agg.agg_state = RTL_AGG_START;
1779
1780        return IEEE80211_AMPDU_TX_START_IMMEDIATE;
1781}
1782
1783int rtl_tx_agg_stop(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1784                    struct ieee80211_sta *sta, u16 tid)
1785{
1786        struct rtl_priv *rtlpriv = rtl_priv(hw);
1787        struct rtl_sta_info *sta_entry = NULL;
1788
1789        if (sta == NULL)
1790                return -EINVAL;
1791
1792        rtl_dbg(rtlpriv, COMP_SEND, DBG_DMESG,
1793                "on ra = %pM tid = %d\n", sta->addr, tid);
1794
1795        if (unlikely(tid >= MAX_TID_COUNT))
1796                return -EINVAL;
1797
1798        sta_entry = (struct rtl_sta_info *)sta->drv_priv;
1799        sta_entry->tids[tid].agg.agg_state = RTL_AGG_STOP;
1800
1801        ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
1802        return 0;
1803}
1804
1805int rtl_rx_agg_start(struct ieee80211_hw *hw,
1806                     struct ieee80211_sta *sta, u16 tid)
1807{
1808        struct rtl_priv *rtlpriv = rtl_priv(hw);
1809        struct rtl_tid_data *tid_data;
1810        struct rtl_sta_info *sta_entry = NULL;
1811        u8 reject_agg;
1812
1813        if (sta == NULL)
1814                return -EINVAL;
1815
1816        if (unlikely(tid >= MAX_TID_COUNT))
1817                return -EINVAL;
1818
1819        if (rtlpriv->cfg->ops->get_btc_status()) {
1820                rtlpriv->btcoexist.btc_ops->btc_get_ampdu_cfg(rtlpriv,
1821                                                              &reject_agg,
1822                                                              NULL, NULL);
1823                if (reject_agg)
1824                        return -EINVAL;
1825        }
1826
1827        sta_entry = (struct rtl_sta_info *)sta->drv_priv;
1828        if (!sta_entry)
1829                return -ENXIO;
1830        tid_data = &sta_entry->tids[tid];
1831
1832        rtl_dbg(rtlpriv, COMP_RECV, DBG_DMESG,
1833                "on ra = %pM tid = %d\n", sta->addr, tid);
1834
1835        tid_data->agg.rx_agg_state = RTL_RX_AGG_START;
1836        return 0;
1837}
1838
1839int rtl_rx_agg_stop(struct ieee80211_hw *hw,
1840                    struct ieee80211_sta *sta, u16 tid)
1841{
1842        struct rtl_priv *rtlpriv = rtl_priv(hw);
1843        struct rtl_sta_info *sta_entry = NULL;
1844
1845        if (sta == NULL)
1846                return -EINVAL;
1847
1848        rtl_dbg(rtlpriv, COMP_SEND, DBG_DMESG,
1849                "on ra = %pM tid = %d\n", sta->addr, tid);
1850
1851        if (unlikely(tid >= MAX_TID_COUNT))
1852                return -EINVAL;
1853
1854        sta_entry = (struct rtl_sta_info *)sta->drv_priv;
1855        sta_entry->tids[tid].agg.rx_agg_state = RTL_RX_AGG_STOP;
1856
1857        return 0;
1858}
1859
1860int rtl_tx_agg_oper(struct ieee80211_hw *hw,
1861                struct ieee80211_sta *sta, u16 tid)
1862{
1863        struct rtl_priv *rtlpriv = rtl_priv(hw);
1864        struct rtl_sta_info *sta_entry = NULL;
1865
1866        if (sta == NULL)
1867                return -EINVAL;
1868
1869        rtl_dbg(rtlpriv, COMP_SEND, DBG_DMESG,
1870                "on ra = %pM tid = %d\n", sta->addr, tid);
1871
1872        if (unlikely(tid >= MAX_TID_COUNT))
1873                return -EINVAL;
1874
1875        sta_entry = (struct rtl_sta_info *)sta->drv_priv;
1876        sta_entry->tids[tid].agg.agg_state = RTL_AGG_OPERATIONAL;
1877
1878        return 0;
1879}
1880
1881void rtl_rx_ampdu_apply(struct rtl_priv *rtlpriv)
1882{
1883        struct rtl_btc_ops *btc_ops = rtlpriv->btcoexist.btc_ops;
1884        u8 reject_agg = 0, ctrl_agg_size = 0, agg_size = 0;
1885
1886        if (rtlpriv->cfg->ops->get_btc_status())
1887                btc_ops->btc_get_ampdu_cfg(rtlpriv, &reject_agg,
1888                                           &ctrl_agg_size, &agg_size);
1889
1890        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1891                "Set RX AMPDU: coex - reject=%d, ctrl_agg_size=%d, size=%d",
1892                reject_agg, ctrl_agg_size, agg_size);
1893
1894        rtlpriv->hw->max_rx_aggregation_subframes =
1895                (ctrl_agg_size ? agg_size : IEEE80211_MAX_AMPDU_BUF_HT);
1896}
1897EXPORT_SYMBOL(rtl_rx_ampdu_apply);
1898
1899/*********************************************************
1900 *
1901 * wq & timer callback functions
1902 *
1903 *********************************************************/
1904/* this function is used for roaming */
1905void rtl_beacon_statistic(struct ieee80211_hw *hw, struct sk_buff *skb)
1906{
1907        struct rtl_priv *rtlpriv = rtl_priv(hw);
1908        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1909
1910        if (rtlpriv->mac80211.opmode != NL80211_IFTYPE_STATION)
1911                return;
1912
1913        if (rtlpriv->mac80211.link_state < MAC80211_LINKED)
1914                return;
1915
1916        /* check if this really is a beacon */
1917        if (!ieee80211_is_beacon(hdr->frame_control) &&
1918            !ieee80211_is_probe_resp(hdr->frame_control))
1919                return;
1920
1921        /* min. beacon length + FCS_LEN */
1922        if (skb->len <= 40 + FCS_LEN)
1923                return;
1924
1925        /* and only beacons from the associated BSSID, please */
1926        if (!ether_addr_equal(hdr->addr3, rtlpriv->mac80211.bssid))
1927                return;
1928
1929        rtlpriv->link_info.bcn_rx_inperiod++;
1930}
1931EXPORT_SYMBOL_GPL(rtl_beacon_statistic);
1932
1933static void rtl_free_entries_from_scan_list(struct ieee80211_hw *hw)
1934{
1935        struct rtl_priv *rtlpriv = rtl_priv(hw);
1936        struct rtl_bssid_entry *entry, *next;
1937
1938        list_for_each_entry_safe(entry, next, &rtlpriv->scan_list.list, list) {
1939                list_del(&entry->list);
1940                kfree(entry);
1941                rtlpriv->scan_list.num--;
1942        }
1943}
1944
1945static void rtl_free_entries_from_ack_queue(struct ieee80211_hw *hw,
1946                                            bool chk_timeout)
1947{
1948        struct rtl_priv *rtlpriv = rtl_priv(hw);
1949        struct rtl_tx_report *tx_report = &rtlpriv->tx_report;
1950        struct sk_buff_head *queue = &tx_report->queue;
1951        struct sk_buff *skb, *tmp;
1952        struct rtlwifi_tx_info *tx_info;
1953
1954        skb_queue_walk_safe(queue, skb, tmp) {
1955                tx_info = rtl_tx_skb_cb_info(skb);
1956                if (chk_timeout &&
1957                    time_after(tx_info->send_time + HZ, jiffies))
1958                        continue;
1959                skb_unlink(skb, queue);
1960                rtl_tx_status(hw, skb, false);
1961        }
1962}
1963
1964void rtl_scan_list_expire(struct ieee80211_hw *hw)
1965{
1966        struct rtl_priv *rtlpriv = rtl_priv(hw);
1967        struct rtl_bssid_entry *entry, *next;
1968        unsigned long flags;
1969
1970        spin_lock_irqsave(&rtlpriv->locks.scan_list_lock, flags);
1971
1972        list_for_each_entry_safe(entry, next, &rtlpriv->scan_list.list, list) {
1973                /* 180 seconds */
1974                if (jiffies_to_msecs(jiffies - entry->age) < 180000)
1975                        continue;
1976
1977                list_del(&entry->list);
1978                rtlpriv->scan_list.num--;
1979
1980                rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD,
1981                        "BSSID=%pM is expire in scan list (total=%d)\n",
1982                        entry->bssid, rtlpriv->scan_list.num);
1983                kfree(entry);
1984        }
1985
1986        spin_unlock_irqrestore(&rtlpriv->locks.scan_list_lock, flags);
1987
1988        rtlpriv->btcoexist.btc_info.ap_num = rtlpriv->scan_list.num;
1989}
1990
1991void rtl_collect_scan_list(struct ieee80211_hw *hw, struct sk_buff *skb)
1992{
1993        struct rtl_priv *rtlpriv = rtl_priv(hw);
1994        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1995        struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1996        unsigned long flags;
1997
1998        struct rtl_bssid_entry *entry = NULL, *iter;
1999
2000        /* check if it is scanning */
2001        if (!mac->act_scanning)
2002                return;
2003
2004        /* check if this really is a beacon */
2005        if (!ieee80211_is_beacon(hdr->frame_control) &&
2006            !ieee80211_is_probe_resp(hdr->frame_control))
2007                return;
2008
2009        spin_lock_irqsave(&rtlpriv->locks.scan_list_lock, flags);
2010
2011        list_for_each_entry(iter, &rtlpriv->scan_list.list, list) {
2012                if (memcmp(iter->bssid, hdr->addr3, ETH_ALEN) == 0) {
2013                        list_del_init(&iter->list);
2014                        entry = iter;
2015                        rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD,
2016                                "Update BSSID=%pM to scan list (total=%d)\n",
2017                                hdr->addr3, rtlpriv->scan_list.num);
2018                        break;
2019                }
2020        }
2021
2022        if (!entry) {
2023                entry = kmalloc(sizeof(*entry), GFP_ATOMIC);
2024
2025                if (!entry)
2026                        goto label_err;
2027
2028                memcpy(entry->bssid, hdr->addr3, ETH_ALEN);
2029                rtlpriv->scan_list.num++;
2030
2031                rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD,
2032                        "Add BSSID=%pM to scan list (total=%d)\n",
2033                        hdr->addr3, rtlpriv->scan_list.num);
2034        }
2035
2036        entry->age = jiffies;
2037
2038        list_add_tail(&entry->list, &rtlpriv->scan_list.list);
2039
2040label_err:
2041        spin_unlock_irqrestore(&rtlpriv->locks.scan_list_lock, flags);
2042}
2043EXPORT_SYMBOL(rtl_collect_scan_list);
2044
2045static void rtl_watchdog_wq_callback(struct work_struct *work)
2046{
2047        struct rtl_works *rtlworks = container_of(work, struct rtl_works,
2048                                                  watchdog_wq.work);
2049        struct ieee80211_hw *hw = rtlworks->hw;
2050        struct rtl_priv *rtlpriv = rtl_priv(hw);
2051        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2052        struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2053        bool busytraffic = false;
2054        bool tx_busy_traffic = false;
2055        bool rx_busy_traffic = false;
2056        bool higher_busytraffic = false;
2057        bool higher_busyrxtraffic = false;
2058        u8 idx, tid;
2059        u32 rx_cnt_inp4eriod = 0;
2060        u32 tx_cnt_inp4eriod = 0;
2061        u32 aver_rx_cnt_inperiod = 0;
2062        u32 aver_tx_cnt_inperiod = 0;
2063        u32 aver_tidtx_inperiod[MAX_TID_COUNT] = {0};
2064        u32 tidtx_inp4eriod[MAX_TID_COUNT] = {0};
2065
2066        if (is_hal_stop(rtlhal))
2067                return;
2068
2069        /* <1> Determine if action frame is allowed */
2070        if (mac->link_state > MAC80211_NOLINK) {
2071                if (mac->cnt_after_linked < 20)
2072                        mac->cnt_after_linked++;
2073        } else {
2074                mac->cnt_after_linked = 0;
2075        }
2076
2077        /* <2> to check if traffic busy, if
2078         * busytraffic we don't change channel
2079         */
2080        if (mac->link_state >= MAC80211_LINKED) {
2081                /* (1) get aver_rx_cnt_inperiod & aver_tx_cnt_inperiod */
2082                for (idx = 0; idx <= 2; idx++) {
2083                        rtlpriv->link_info.num_rx_in4period[idx] =
2084                            rtlpriv->link_info.num_rx_in4period[idx + 1];
2085                        rtlpriv->link_info.num_tx_in4period[idx] =
2086                            rtlpriv->link_info.num_tx_in4period[idx + 1];
2087                }
2088                rtlpriv->link_info.num_rx_in4period[3] =
2089                    rtlpriv->link_info.num_rx_inperiod;
2090                rtlpriv->link_info.num_tx_in4period[3] =
2091                    rtlpriv->link_info.num_tx_inperiod;
2092                for (idx = 0; idx <= 3; idx++) {
2093                        rx_cnt_inp4eriod +=
2094                            rtlpriv->link_info.num_rx_in4period[idx];
2095                        tx_cnt_inp4eriod +=
2096                            rtlpriv->link_info.num_tx_in4period[idx];
2097                }
2098                aver_rx_cnt_inperiod = rx_cnt_inp4eriod / 4;
2099                aver_tx_cnt_inperiod = tx_cnt_inp4eriod / 4;
2100
2101                /* (2) check traffic busy */
2102                if (aver_rx_cnt_inperiod > 100 || aver_tx_cnt_inperiod > 100) {
2103                        busytraffic = true;
2104                        if (aver_rx_cnt_inperiod > aver_tx_cnt_inperiod)
2105                                rx_busy_traffic = true;
2106                        else
2107                                tx_busy_traffic = false;
2108                }
2109
2110                /* Higher Tx/Rx data. */
2111                if (aver_rx_cnt_inperiod > 4000 ||
2112                    aver_tx_cnt_inperiod > 4000) {
2113                        higher_busytraffic = true;
2114
2115                        /* Extremely high Rx data. */
2116                        if (aver_rx_cnt_inperiod > 5000)
2117                                higher_busyrxtraffic = true;
2118                }
2119
2120                /* check every tid's tx traffic */
2121                for (tid = 0; tid <= 7; tid++) {
2122                        for (idx = 0; idx <= 2; idx++)
2123                                rtlpriv->link_info.tidtx_in4period[tid][idx] =
2124                                        rtlpriv->link_info.tidtx_in4period[tid]
2125                                        [idx + 1];
2126                        rtlpriv->link_info.tidtx_in4period[tid][3] =
2127                                rtlpriv->link_info.tidtx_inperiod[tid];
2128
2129                        for (idx = 0; idx <= 3; idx++)
2130                                tidtx_inp4eriod[tid] +=
2131                                   rtlpriv->link_info.tidtx_in4period[tid][idx];
2132                        aver_tidtx_inperiod[tid] = tidtx_inp4eriod[tid] / 4;
2133                        if (aver_tidtx_inperiod[tid] > 5000)
2134                                rtlpriv->link_info.higher_busytxtraffic[tid] =
2135                                                                        true;
2136                        else
2137                                rtlpriv->link_info.higher_busytxtraffic[tid] =
2138                                                                        false;
2139                }
2140
2141                /* PS is controlled by coex. */
2142                if (rtlpriv->cfg->ops->get_btc_status() &&
2143                    rtlpriv->btcoexist.btc_ops->btc_is_bt_ctrl_lps(rtlpriv))
2144                        goto label_lps_done;
2145
2146                if (rtlpriv->link_info.num_rx_inperiod +
2147                      rtlpriv->link_info.num_tx_inperiod > 8 ||
2148                    rtlpriv->link_info.num_rx_inperiod > 2)
2149                        rtl_lps_leave(hw, true);
2150                else
2151                        rtl_lps_enter(hw, true);
2152
2153label_lps_done:
2154                ;
2155        }
2156
2157        for (tid = 0; tid <= 7; tid++)
2158                rtlpriv->link_info.tidtx_inperiod[tid] = 0;
2159
2160        rtlpriv->link_info.busytraffic = busytraffic;
2161        rtlpriv->link_info.higher_busytraffic = higher_busytraffic;
2162        rtlpriv->link_info.rx_busy_traffic = rx_busy_traffic;
2163        rtlpriv->link_info.tx_busy_traffic = tx_busy_traffic;
2164        rtlpriv->link_info.higher_busyrxtraffic = higher_busyrxtraffic;
2165
2166        rtlpriv->stats.txbytesunicast_inperiod =
2167                rtlpriv->stats.txbytesunicast -
2168                rtlpriv->stats.txbytesunicast_last;
2169        rtlpriv->stats.rxbytesunicast_inperiod =
2170                rtlpriv->stats.rxbytesunicast -
2171                rtlpriv->stats.rxbytesunicast_last;
2172        rtlpriv->stats.txbytesunicast_last = rtlpriv->stats.txbytesunicast;
2173        rtlpriv->stats.rxbytesunicast_last = rtlpriv->stats.rxbytesunicast;
2174
2175        rtlpriv->stats.txbytesunicast_inperiod_tp =
2176                (u32)(rtlpriv->stats.txbytesunicast_inperiod * 8 / 2 /
2177                1024 / 1024);
2178        rtlpriv->stats.rxbytesunicast_inperiod_tp =
2179                (u32)(rtlpriv->stats.rxbytesunicast_inperiod * 8 / 2 /
2180                1024 / 1024);
2181
2182        /* <3> DM */
2183        if (!rtlpriv->cfg->mod_params->disable_watchdog)
2184                rtlpriv->cfg->ops->dm_watchdog(hw);
2185
2186        /* <4> roaming */
2187        if (mac->link_state == MAC80211_LINKED &&
2188            mac->opmode == NL80211_IFTYPE_STATION) {
2189                if ((rtlpriv->link_info.bcn_rx_inperiod +
2190                    rtlpriv->link_info.num_rx_inperiod) == 0) {
2191                        rtlpriv->link_info.roam_times++;
2192                        rtl_dbg(rtlpriv, COMP_ERR, DBG_DMESG,
2193                                "AP off for %d s\n",
2194                                (rtlpriv->link_info.roam_times * 2));
2195
2196                        /* if we can't recv beacon for 10s,
2197                         * we should reconnect this AP
2198                         */
2199                        if (rtlpriv->link_info.roam_times >= 5) {
2200                                pr_err("AP off, try to reconnect now\n");
2201                                rtlpriv->link_info.roam_times = 0;
2202                                ieee80211_connection_loss(
2203                                        rtlpriv->mac80211.vif);
2204                        }
2205                } else {
2206                        rtlpriv->link_info.roam_times = 0;
2207                }
2208        }
2209
2210        if (rtlpriv->cfg->ops->get_btc_status())
2211                rtlpriv->btcoexist.btc_ops->btc_periodical(rtlpriv);
2212
2213        if (rtlpriv->btcoexist.btc_info.in_4way) {
2214                if (time_after(jiffies, rtlpriv->btcoexist.btc_info.in_4way_ts +
2215                               msecs_to_jiffies(IN_4WAY_TIMEOUT_TIME)))
2216                        rtlpriv->btcoexist.btc_info.in_4way = false;
2217        }
2218
2219        rtlpriv->link_info.num_rx_inperiod = 0;
2220        rtlpriv->link_info.num_tx_inperiod = 0;
2221        rtlpriv->link_info.bcn_rx_inperiod = 0;
2222
2223        /* <6> scan list */
2224        rtl_scan_list_expire(hw);
2225
2226        /* <7> check ack queue */
2227        rtl_free_entries_from_ack_queue(hw, true);
2228}
2229
2230void rtl_watch_dog_timer_callback(struct timer_list *t)
2231{
2232        struct rtl_priv *rtlpriv = from_timer(rtlpriv, t, works.watchdog_timer);
2233
2234        queue_delayed_work(rtlpriv->works.rtl_wq,
2235                           &rtlpriv->works.watchdog_wq, 0);
2236
2237        mod_timer(&rtlpriv->works.watchdog_timer,
2238                  jiffies + MSECS(RTL_WATCH_DOG_TIME));
2239}
2240
2241static void rtl_fwevt_wq_callback(struct work_struct *work)
2242{
2243        struct rtl_works *rtlworks = container_of(work, struct rtl_works,
2244                                                  fwevt_wq.work);
2245        struct ieee80211_hw *hw = rtlworks->hw;
2246        struct rtl_priv *rtlpriv = rtl_priv(hw);
2247
2248        rtlpriv->cfg->ops->c2h_command_handle(hw);
2249}
2250
2251static void rtl_c2h_content_parsing(struct ieee80211_hw *hw,
2252                                    struct sk_buff *skb);
2253
2254static bool rtl_c2h_fast_cmd(struct ieee80211_hw *hw, struct sk_buff *skb)
2255{
2256        u8 cmd_id = GET_C2H_CMD_ID(skb->data);
2257
2258        switch (cmd_id) {
2259        case C2H_BT_MP:
2260                return true;
2261        default:
2262                break;
2263        }
2264
2265        return false;
2266}
2267
2268void rtl_c2hcmd_enqueue(struct ieee80211_hw *hw, struct sk_buff *skb)
2269{
2270        struct rtl_priv *rtlpriv = rtl_priv(hw);
2271
2272        if (rtl_c2h_fast_cmd(hw, skb)) {
2273                rtl_c2h_content_parsing(hw, skb);
2274                kfree_skb(skb);
2275                return;
2276        }
2277
2278        /* enqueue */
2279        skb_queue_tail(&rtlpriv->c2hcmd_queue, skb);
2280
2281        /* wake up wq */
2282        queue_delayed_work(rtlpriv->works.rtl_wq, &rtlpriv->works.c2hcmd_wq, 0);
2283}
2284EXPORT_SYMBOL(rtl_c2hcmd_enqueue);
2285
2286static void rtl_c2h_content_parsing(struct ieee80211_hw *hw,
2287                                    struct sk_buff *skb)
2288{
2289        struct rtl_priv *rtlpriv = rtl_priv(hw);
2290        struct rtl_hal_ops *hal_ops = rtlpriv->cfg->ops;
2291        const struct rtl_btc_ops *btc_ops = rtlpriv->btcoexist.btc_ops;
2292        u8 cmd_id, cmd_len;
2293        u8 *cmd_buf = NULL;
2294
2295        cmd_id = GET_C2H_CMD_ID(skb->data);
2296        cmd_len = skb->len - C2H_DATA_OFFSET;
2297        cmd_buf = GET_C2H_DATA_PTR(skb->data);
2298
2299        switch (cmd_id) {
2300        case C2H_DBG:
2301                rtl_dbg(rtlpriv, COMP_FW, DBG_LOUD, "[C2H], C2H_DBG!!\n");
2302                break;
2303        case C2H_TXBF:
2304                rtl_dbg(rtlpriv, COMP_FW, DBG_TRACE,
2305                        "[C2H], C2H_TXBF!!\n");
2306                break;
2307        case C2H_TX_REPORT:
2308                rtl_tx_report_handler(hw, cmd_buf, cmd_len);
2309                break;
2310        case C2H_RA_RPT:
2311                if (hal_ops->c2h_ra_report_handler)
2312                        hal_ops->c2h_ra_report_handler(hw, cmd_buf, cmd_len);
2313                break;
2314        case C2H_BT_INFO:
2315                rtl_dbg(rtlpriv, COMP_FW, DBG_TRACE,
2316                        "[C2H], C2H_BT_INFO!!\n");
2317                if (rtlpriv->cfg->ops->get_btc_status())
2318                        btc_ops->btc_btinfo_notify(rtlpriv, cmd_buf, cmd_len);
2319                break;
2320        case C2H_BT_MP:
2321                rtl_dbg(rtlpriv, COMP_FW, DBG_TRACE,
2322                        "[C2H], C2H_BT_MP!!\n");
2323                if (rtlpriv->cfg->ops->get_btc_status())
2324                        btc_ops->btc_btmpinfo_notify(rtlpriv, cmd_buf, cmd_len);
2325                break;
2326        default:
2327                rtl_dbg(rtlpriv, COMP_FW, DBG_TRACE,
2328                        "[C2H], Unknown packet!! cmd_id(%#X)!\n", cmd_id);
2329                break;
2330        }
2331}
2332
2333void rtl_c2hcmd_launcher(struct ieee80211_hw *hw, int exec)
2334{
2335        struct rtl_priv *rtlpriv = rtl_priv(hw);
2336        struct sk_buff *skb;
2337        int i;
2338
2339        for (i = 0; i < 200; i++) {
2340                /* dequeue a task */
2341                skb = skb_dequeue(&rtlpriv->c2hcmd_queue);
2342
2343                /* do it */
2344                if (!skb)
2345                        break;
2346
2347                rtl_dbg(rtlpriv, COMP_FW, DBG_DMESG, "C2H rx_desc_shift=%d\n",
2348                        *((u8 *)skb->cb));
2349                RT_PRINT_DATA(rtlpriv, COMP_FW, DBG_DMESG,
2350                              "C2H data: ", skb->data, skb->len);
2351
2352                if (exec)
2353                        rtl_c2h_content_parsing(hw, skb);
2354
2355                /* free */
2356                dev_kfree_skb_any(skb);
2357        }
2358}
2359
2360static void rtl_c2hcmd_wq_callback(struct work_struct *work)
2361{
2362        struct rtl_works *rtlworks = container_of(work, struct rtl_works,
2363                                                  c2hcmd_wq.work);
2364        struct ieee80211_hw *hw = rtlworks->hw;
2365
2366        rtl_c2hcmd_launcher(hw, 1);
2367}
2368
2369void rtl_easy_concurrent_retrytimer_callback(struct timer_list *t)
2370{
2371        struct rtl_priv *rtlpriv =
2372                from_timer(rtlpriv, t, works.dualmac_easyconcurrent_retrytimer);
2373        struct ieee80211_hw *hw = rtlpriv->hw;
2374        struct rtl_priv *buddy_priv = rtlpriv->buddy_priv;
2375
2376        if (buddy_priv == NULL)
2377                return;
2378
2379        rtlpriv->cfg->ops->dualmac_easy_concurrent(hw);
2380}
2381
2382/*********************************************************
2383 *
2384 * frame process functions
2385 *
2386 *********************************************************/
2387u8 *rtl_find_ie(u8 *data, unsigned int len, u8 ie)
2388{
2389        struct ieee80211_mgmt *mgmt = (void *)data;
2390        u8 *pos, *end;
2391
2392        pos = (u8 *)mgmt->u.beacon.variable;
2393        end = data + len;
2394        while (pos < end) {
2395                if (pos + 2 + pos[1] > end)
2396                        return NULL;
2397
2398                if (pos[0] == ie)
2399                        return pos;
2400
2401                pos += 2 + pos[1];
2402        }
2403        return NULL;
2404}
2405
2406/* when we use 2 rx ants we send IEEE80211_SMPS_OFF */
2407/* when we use 1 rx ant we send IEEE80211_SMPS_STATIC */
2408static struct sk_buff *rtl_make_smps_action(struct ieee80211_hw *hw,
2409                                     enum ieee80211_smps_mode smps,
2410                                     u8 *da, u8 *bssid)
2411{
2412        struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2413        struct sk_buff *skb;
2414        struct ieee80211_mgmt *action_frame;
2415
2416        /* 27 = header + category + action + smps mode */
2417        skb = dev_alloc_skb(27 + hw->extra_tx_headroom);
2418        if (!skb)
2419                return NULL;
2420
2421        skb_reserve(skb, hw->extra_tx_headroom);
2422        action_frame = skb_put_zero(skb, 27);
2423        memcpy(action_frame->da, da, ETH_ALEN);
2424        memcpy(action_frame->sa, rtlefuse->dev_addr, ETH_ALEN);
2425        memcpy(action_frame->bssid, bssid, ETH_ALEN);
2426        action_frame->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
2427                                                  IEEE80211_STYPE_ACTION);
2428        action_frame->u.action.category = WLAN_CATEGORY_HT;
2429        action_frame->u.action.u.ht_smps.action = WLAN_HT_ACTION_SMPS;
2430        switch (smps) {
2431        case IEEE80211_SMPS_AUTOMATIC:/* 0 */
2432        case IEEE80211_SMPS_NUM_MODES:/* 4 */
2433                WARN_ON(1);
2434                fallthrough;
2435        case IEEE80211_SMPS_OFF:/* 1 */ /*MIMO_PS_NOLIMIT*/
2436                action_frame->u.action.u.ht_smps.smps_control =
2437                                WLAN_HT_SMPS_CONTROL_DISABLED;/* 0 */
2438                break;
2439        case IEEE80211_SMPS_STATIC:/* 2 */ /*MIMO_PS_STATIC*/
2440                action_frame->u.action.u.ht_smps.smps_control =
2441                                WLAN_HT_SMPS_CONTROL_STATIC;/* 1 */
2442                break;
2443        case IEEE80211_SMPS_DYNAMIC:/* 3 */ /*MIMO_PS_DYNAMIC*/
2444                action_frame->u.action.u.ht_smps.smps_control =
2445                                WLAN_HT_SMPS_CONTROL_DYNAMIC;/* 3 */
2446                break;
2447        }
2448
2449        return skb;
2450}
2451
2452int rtl_send_smps_action(struct ieee80211_hw *hw,
2453                         struct ieee80211_sta *sta,
2454                         enum ieee80211_smps_mode smps)
2455{
2456        struct rtl_priv *rtlpriv = rtl_priv(hw);
2457        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2458        struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
2459        struct sk_buff *skb = NULL;
2460        struct rtl_tcb_desc tcb_desc;
2461        u8 bssid[ETH_ALEN] = {0};
2462
2463        memset(&tcb_desc, 0, sizeof(struct rtl_tcb_desc));
2464
2465        if (rtlpriv->mac80211.act_scanning)
2466                goto err_free;
2467
2468        if (!sta)
2469                goto err_free;
2470
2471        if (unlikely(is_hal_stop(rtlhal) || ppsc->rfpwr_state != ERFON))
2472                goto err_free;
2473
2474        if (!test_bit(RTL_STATUS_INTERFACE_START, &rtlpriv->status))
2475                goto err_free;
2476
2477        if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_AP)
2478                memcpy(bssid, rtlpriv->efuse.dev_addr, ETH_ALEN);
2479        else
2480                memcpy(bssid, rtlpriv->mac80211.bssid, ETH_ALEN);
2481
2482        skb = rtl_make_smps_action(hw, smps, sta->addr, bssid);
2483        /* this is a type = mgmt * stype = action frame */
2484        if (skb) {
2485                struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
2486                struct rtl_sta_info *sta_entry =
2487                        (struct rtl_sta_info *) sta->drv_priv;
2488                sta_entry->mimo_ps = smps;
2489                /* rtlpriv->cfg->ops->update_rate_tbl(hw, sta, 0, true); */
2490
2491                info->control.rates[0].idx = 0;
2492                info->band = hw->conf.chandef.chan->band;
2493                rtlpriv->intf_ops->adapter_tx(hw, sta, skb, &tcb_desc);
2494        }
2495        return 1;
2496
2497err_free:
2498        return 0;
2499}
2500EXPORT_SYMBOL(rtl_send_smps_action);
2501
2502void rtl_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation)
2503{
2504        struct rtl_priv *rtlpriv = rtl_priv(hw);
2505        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2506        enum io_type iotype;
2507
2508        if (!is_hal_stop(rtlhal)) {
2509                switch (operation) {
2510                case SCAN_OPT_BACKUP:
2511                        iotype = IO_CMD_PAUSE_DM_BY_SCAN;
2512                        rtlpriv->cfg->ops->set_hw_reg(hw,
2513                                                      HW_VAR_IO_CMD,
2514                                                      (u8 *)&iotype);
2515                        break;
2516                case SCAN_OPT_RESTORE:
2517                        iotype = IO_CMD_RESUME_DM_BY_SCAN;
2518                        rtlpriv->cfg->ops->set_hw_reg(hw,
2519                                                      HW_VAR_IO_CMD,
2520                                                      (u8 *)&iotype);
2521                        break;
2522                default:
2523                        pr_err("Unknown Scan Backup operation.\n");
2524                        break;
2525                }
2526        }
2527}
2528EXPORT_SYMBOL(rtl_phy_scan_operation_backup);
2529
2530/* because mac80211 have issues when can receive del ba
2531 * so here we just make a fake del_ba if we receive a ba_req
2532 * but rx_agg was opened to let mac80211 release some ba
2533 * related resources, so please this del_ba for tx
2534 */
2535struct sk_buff *rtl_make_del_ba(struct ieee80211_hw *hw,
2536                                u8 *sa, u8 *bssid, u16 tid)
2537{
2538        struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2539        struct sk_buff *skb;
2540        struct ieee80211_mgmt *action_frame;
2541        u16 params;
2542
2543        /* 27 = header + category + action + smps mode */
2544        skb = dev_alloc_skb(34 + hw->extra_tx_headroom);
2545        if (!skb)
2546                return NULL;
2547
2548        skb_reserve(skb, hw->extra_tx_headroom);
2549        action_frame = skb_put_zero(skb, 34);
2550        memcpy(action_frame->sa, sa, ETH_ALEN);
2551        memcpy(action_frame->da, rtlefuse->dev_addr, ETH_ALEN);
2552        memcpy(action_frame->bssid, bssid, ETH_ALEN);
2553        action_frame->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
2554                                                  IEEE80211_STYPE_ACTION);
2555        action_frame->u.action.category = WLAN_CATEGORY_BACK;
2556        action_frame->u.action.u.delba.action_code = WLAN_ACTION_DELBA;
2557        params = (u16)(1 << 11);        /* bit 11 initiator */
2558        params |= (u16)(tid << 12);     /* bit 15:12 TID number */
2559
2560        action_frame->u.action.u.delba.params = cpu_to_le16(params);
2561        action_frame->u.action.u.delba.reason_code =
2562                cpu_to_le16(WLAN_REASON_QSTA_TIMEOUT);
2563
2564        return skb;
2565}
2566
2567/*********************************************************
2568 *
2569 * IOT functions
2570 *
2571 *********************************************************/
2572static bool rtl_chk_vendor_ouisub(struct ieee80211_hw *hw,
2573                                  struct octet_string vendor_ie)
2574{
2575        struct rtl_priv *rtlpriv = rtl_priv(hw);
2576        bool matched = false;
2577        static u8 athcap_1[] = { 0x00, 0x03, 0x7F };
2578        static u8 athcap_2[] = { 0x00, 0x13, 0x74 };
2579        static u8 broadcap_1[] = { 0x00, 0x10, 0x18 };
2580        static u8 broadcap_2[] = { 0x00, 0x0a, 0xf7 };
2581        static u8 broadcap_3[] = { 0x00, 0x05, 0xb5 };
2582        static u8 racap[] = { 0x00, 0x0c, 0x43 };
2583        static u8 ciscocap[] = { 0x00, 0x40, 0x96 };
2584        static u8 marvcap[] = { 0x00, 0x50, 0x43 };
2585
2586        if (memcmp(vendor_ie.octet, athcap_1, 3) == 0 ||
2587                memcmp(vendor_ie.octet, athcap_2, 3) == 0) {
2588                rtlpriv->mac80211.vendor = PEER_ATH;
2589                matched = true;
2590        } else if (memcmp(vendor_ie.octet, broadcap_1, 3) == 0 ||
2591                memcmp(vendor_ie.octet, broadcap_2, 3) == 0 ||
2592                memcmp(vendor_ie.octet, broadcap_3, 3) == 0) {
2593                rtlpriv->mac80211.vendor = PEER_BROAD;
2594                matched = true;
2595        } else if (memcmp(vendor_ie.octet, racap, 3) == 0) {
2596                rtlpriv->mac80211.vendor = PEER_RAL;
2597                matched = true;
2598        } else if (memcmp(vendor_ie.octet, ciscocap, 3) == 0) {
2599                rtlpriv->mac80211.vendor = PEER_CISCO;
2600                matched = true;
2601        } else if (memcmp(vendor_ie.octet, marvcap, 3) == 0) {
2602                rtlpriv->mac80211.vendor = PEER_MARV;
2603                matched = true;
2604        }
2605
2606        return matched;
2607}
2608
2609static bool rtl_find_221_ie(struct ieee80211_hw *hw, u8 *data,
2610                unsigned int len)
2611{
2612        struct ieee80211_mgmt *mgmt = (void *)data;
2613        struct octet_string vendor_ie;
2614        u8 *pos, *end;
2615
2616        pos = (u8 *)mgmt->u.beacon.variable;
2617        end = data + len;
2618        while (pos < end) {
2619                if (pos[0] == 221) {
2620                        vendor_ie.length = pos[1];
2621                        vendor_ie.octet = &pos[2];
2622                        if (rtl_chk_vendor_ouisub(hw, vendor_ie))
2623                                return true;
2624                }
2625
2626                if (pos + 2 + pos[1] > end)
2627                        return false;
2628
2629                pos += 2 + pos[1];
2630        }
2631        return false;
2632}
2633
2634void rtl_recognize_peer(struct ieee80211_hw *hw, u8 *data, unsigned int len)
2635{
2636        struct rtl_priv *rtlpriv = rtl_priv(hw);
2637        struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2638        struct ieee80211_hdr *hdr = (void *)data;
2639        u32 vendor = PEER_UNKNOWN;
2640
2641        static u8 ap3_1[3] = { 0x00, 0x14, 0xbf };
2642        static u8 ap3_2[3] = { 0x00, 0x1a, 0x70 };
2643        static u8 ap3_3[3] = { 0x00, 0x1d, 0x7e };
2644        static u8 ap4_1[3] = { 0x00, 0x90, 0xcc };
2645        static u8 ap4_2[3] = { 0x00, 0x0e, 0x2e };
2646        static u8 ap4_3[3] = { 0x00, 0x18, 0x02 };
2647        static u8 ap4_4[3] = { 0x00, 0x17, 0x3f };
2648        static u8 ap4_5[3] = { 0x00, 0x1c, 0xdf };
2649        static u8 ap5_1[3] = { 0x00, 0x1c, 0xf0 };
2650        static u8 ap5_2[3] = { 0x00, 0x21, 0x91 };
2651        static u8 ap5_3[3] = { 0x00, 0x24, 0x01 };
2652        static u8 ap5_4[3] = { 0x00, 0x15, 0xe9 };
2653        static u8 ap5_5[3] = { 0x00, 0x17, 0x9A };
2654        static u8 ap5_6[3] = { 0x00, 0x18, 0xE7 };
2655        static u8 ap6_1[3] = { 0x00, 0x17, 0x94 };
2656        static u8 ap7_1[3] = { 0x00, 0x14, 0xa4 };
2657
2658        if (mac->opmode != NL80211_IFTYPE_STATION)
2659                return;
2660
2661        if (mac->link_state == MAC80211_NOLINK) {
2662                mac->vendor = PEER_UNKNOWN;
2663                return;
2664        }
2665
2666        if (mac->cnt_after_linked > 2)
2667                return;
2668
2669        /* check if this really is a beacon */
2670        if (!ieee80211_is_beacon(hdr->frame_control))
2671                return;
2672
2673        /* min. beacon length + FCS_LEN */
2674        if (len <= 40 + FCS_LEN)
2675                return;
2676
2677        /* and only beacons from the associated BSSID, please */
2678        if (!ether_addr_equal_64bits(hdr->addr3, rtlpriv->mac80211.bssid))
2679                return;
2680
2681        if (rtl_find_221_ie(hw, data, len))
2682                vendor = mac->vendor;
2683
2684        if ((memcmp(mac->bssid, ap5_1, 3) == 0) ||
2685                (memcmp(mac->bssid, ap5_2, 3) == 0) ||
2686                (memcmp(mac->bssid, ap5_3, 3) == 0) ||
2687                (memcmp(mac->bssid, ap5_4, 3) == 0) ||
2688                (memcmp(mac->bssid, ap5_5, 3) == 0) ||
2689                (memcmp(mac->bssid, ap5_6, 3) == 0) ||
2690                vendor == PEER_ATH) {
2691                vendor = PEER_ATH;
2692                rtl_dbg(rtlpriv, COMP_MAC80211, DBG_LOUD, "=>ath find\n");
2693        } else if ((memcmp(mac->bssid, ap4_4, 3) == 0) ||
2694                (memcmp(mac->bssid, ap4_5, 3) == 0) ||
2695                (memcmp(mac->bssid, ap4_1, 3) == 0) ||
2696                (memcmp(mac->bssid, ap4_2, 3) == 0) ||
2697                (memcmp(mac->bssid, ap4_3, 3) == 0) ||
2698                vendor == PEER_RAL) {
2699                rtl_dbg(rtlpriv, COMP_MAC80211, DBG_LOUD, "=>ral find\n");
2700                vendor = PEER_RAL;
2701        } else if (memcmp(mac->bssid, ap6_1, 3) == 0 ||
2702                vendor == PEER_CISCO) {
2703                vendor = PEER_CISCO;
2704                rtl_dbg(rtlpriv, COMP_MAC80211, DBG_LOUD, "=>cisco find\n");
2705        } else if ((memcmp(mac->bssid, ap3_1, 3) == 0) ||
2706                (memcmp(mac->bssid, ap3_2, 3) == 0) ||
2707                (memcmp(mac->bssid, ap3_3, 3) == 0) ||
2708                vendor == PEER_BROAD) {
2709                rtl_dbg(rtlpriv, COMP_MAC80211, DBG_LOUD, "=>broad find\n");
2710                vendor = PEER_BROAD;
2711        } else if (memcmp(mac->bssid, ap7_1, 3) == 0 ||
2712                vendor == PEER_MARV) {
2713                vendor = PEER_MARV;
2714                rtl_dbg(rtlpriv, COMP_MAC80211, DBG_LOUD, "=>marv find\n");
2715        }
2716
2717        mac->vendor = vendor;
2718}
2719EXPORT_SYMBOL_GPL(rtl_recognize_peer);
2720
2721MODULE_AUTHOR("lizhaoming       <chaoming_li@realsil.com.cn>");
2722MODULE_AUTHOR("Realtek WlanFAE  <wlanfae@realtek.com>");
2723MODULE_AUTHOR("Larry Finger     <Larry.FInger@lwfinger.net>");
2724MODULE_LICENSE("GPL");
2725MODULE_DESCRIPTION("Realtek 802.11n PCI wireless core");
2726
2727struct rtl_global_var rtl_global_var = {};
2728EXPORT_SYMBOL_GPL(rtl_global_var);
2729
2730static int __init rtl_core_module_init(void)
2731{
2732        BUILD_BUG_ON(TX_PWR_BY_RATE_NUM_RATE < TX_PWR_BY_RATE_NUM_SECTION);
2733        BUILD_BUG_ON(MAX_RATE_SECTION_NUM != MAX_RATE_SECTION);
2734        BUILD_BUG_ON(MAX_BASE_NUM_IN_PHY_REG_PG_24G != MAX_RATE_SECTION);
2735        BUILD_BUG_ON(MAX_BASE_NUM_IN_PHY_REG_PG_5G != (MAX_RATE_SECTION - 1));
2736
2737        if (rtl_rate_control_register())
2738                pr_err("rtl: Unable to register rtl_rc, use default RC !!\n");
2739
2740        /* add debugfs */
2741        rtl_debugfs_add_topdir();
2742
2743        /* init some global vars */
2744        INIT_LIST_HEAD(&rtl_global_var.glb_priv_list);
2745        spin_lock_init(&rtl_global_var.glb_list_lock);
2746
2747        return 0;
2748}
2749
2750static void __exit rtl_core_module_exit(void)
2751{
2752        /*RC*/
2753        rtl_rate_control_unregister();
2754
2755        /* remove debugfs */
2756        rtl_debugfs_remove_topdir();
2757}
2758
2759module_init(rtl_core_module_init);
2760module_exit(rtl_core_module_exit);
2761