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