1 /* 2 * Copyright (c) 2010-2011 Atheros Communications Inc. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 #include "htc.h" 18 19 /*************/ 20 /* Utilities */ 21 /*************/ 22 23 /* HACK Alert: Use 11NG for 2.4, use 11NA for 5 */ 24 static enum htc_phymode ath9k_htc_get_curmode(struct ath9k_htc_priv *priv, 25 struct ath9k_channel *ichan) 26 { 27 if (IS_CHAN_5GHZ(ichan)) 28 return HTC_MODE_11NA; 29 30 return HTC_MODE_11NG; 31 } 32 33 bool ath9k_htc_setpower(struct ath9k_htc_priv *priv, 34 enum ath9k_power_mode mode) 35 { 36 bool ret; 37 38 mutex_lock(&priv->htc_pm_lock); 39 ret = ath9k_hw_setpower(priv->ah, mode); 40 mutex_unlock(&priv->htc_pm_lock); 41 42 return ret; 43 } 44 45 void ath9k_htc_ps_wakeup(struct ath9k_htc_priv *priv) 46 { 47 mutex_lock(&priv->htc_pm_lock); 48 if (++priv->ps_usecount != 1) 49 goto unlock; 50 ath9k_hw_setpower(priv->ah, ATH9K_PM_AWAKE); 51 52 unlock: 53 mutex_unlock(&priv->htc_pm_lock); 54 } 55 56 void ath9k_htc_ps_restore(struct ath9k_htc_priv *priv) 57 { 58 bool reset; 59 60 mutex_lock(&priv->htc_pm_lock); 61 if (--priv->ps_usecount != 0) 62 goto unlock; 63 64 if (priv->ps_idle) { 65 ath9k_hw_setrxabort(priv->ah, true); 66 ath9k_hw_stopdmarecv(priv->ah, &reset); 67 ath9k_hw_setpower(priv->ah, ATH9K_PM_FULL_SLEEP); 68 } else if (priv->ps_enabled) { 69 ath9k_hw_setpower(priv->ah, ATH9K_PM_NETWORK_SLEEP); 70 } 71 72 unlock: 73 mutex_unlock(&priv->htc_pm_lock); 74 } 75 76 void ath9k_ps_work(struct work_struct *work) 77 { 78 struct ath9k_htc_priv *priv = 79 container_of(work, struct ath9k_htc_priv, 80 ps_work); 81 ath9k_htc_setpower(priv, ATH9K_PM_AWAKE); 82 83 /* The chip wakes up after receiving the first beacon 84 while network sleep is enabled. For the driver to 85 be in sync with the hw, set the chip to awake and 86 only then set it to sleep. 87 */ 88 ath9k_htc_setpower(priv, ATH9K_PM_NETWORK_SLEEP); 89 } 90 91 static void ath9k_htc_vif_iter(void *data, u8 *mac, struct ieee80211_vif *vif) 92 { 93 struct ath9k_htc_priv *priv = data; 94 struct ieee80211_bss_conf *bss_conf = &vif->bss_conf; 95 96 if ((vif->type == NL80211_IFTYPE_AP || 97 vif->type == NL80211_IFTYPE_MESH_POINT) && 98 bss_conf->enable_beacon) 99 priv->reconfig_beacon = true; 100 101 if (bss_conf->assoc) { 102 priv->rearm_ani = true; 103 priv->reconfig_beacon = true; 104 } 105 } 106 107 static void ath9k_htc_vif_reconfig(struct ath9k_htc_priv *priv) 108 { 109 priv->rearm_ani = false; 110 priv->reconfig_beacon = false; 111 112 ieee80211_iterate_active_interfaces_atomic( 113 priv->hw, IEEE80211_IFACE_ITER_RESUME_ALL, 114 ath9k_htc_vif_iter, priv); 115 if (priv->rearm_ani) 116 ath9k_htc_start_ani(priv); 117 118 if (priv->reconfig_beacon) { 119 ath9k_htc_ps_wakeup(priv); 120 ath9k_htc_beacon_reconfig(priv); 121 ath9k_htc_ps_restore(priv); 122 } 123 } 124 125 static void ath9k_htc_bssid_iter(void *data, u8 *mac, struct ieee80211_vif *vif) 126 { 127 struct ath9k_vif_iter_data *iter_data = data; 128 int i; 129 130 if (iter_data->hw_macaddr != NULL) { 131 for (i = 0; i < ETH_ALEN; i++) 132 iter_data->mask[i] &= ~(iter_data->hw_macaddr[i] ^ mac[i]); 133 } else { 134 iter_data->hw_macaddr = mac; 135 } 136 } 137 138 static void ath9k_htc_set_mac_bssid_mask(struct ath9k_htc_priv *priv, 139 struct ieee80211_vif *vif) 140 { 141 struct ath_common *common = ath9k_hw_common(priv->ah); 142 struct ath9k_vif_iter_data iter_data; 143 144 /* 145 * Pick the MAC address of the first interface as the new hardware 146 * MAC address. The hardware will use it together with the BSSID mask 147 * when matching addresses. 148 */ 149 iter_data.hw_macaddr = NULL; 150 memset(&iter_data.mask, 0xff, ETH_ALEN); 151 152 if (vif) 153 ath9k_htc_bssid_iter(&iter_data, vif->addr, vif); 154 155 /* Get list of all active MAC addresses */ 156 ieee80211_iterate_active_interfaces_atomic( 157 priv->hw, IEEE80211_IFACE_ITER_RESUME_ALL, 158 ath9k_htc_bssid_iter, &iter_data); 159 160 memcpy(common->bssidmask, iter_data.mask, ETH_ALEN); 161 162 if (iter_data.hw_macaddr) 163 memcpy(common->macaddr, iter_data.hw_macaddr, ETH_ALEN); 164 165 ath_hw_setbssidmask(common); 166 } 167 168 static void ath9k_htc_set_opmode(struct ath9k_htc_priv *priv) 169 { 170 if (priv->num_ibss_vif) 171 priv->ah->opmode = NL80211_IFTYPE_ADHOC; 172 else if (priv->num_ap_vif) 173 priv->ah->opmode = NL80211_IFTYPE_AP; 174 else if (priv->num_mbss_vif) 175 priv->ah->opmode = NL80211_IFTYPE_MESH_POINT; 176 else 177 priv->ah->opmode = NL80211_IFTYPE_STATION; 178 179 ath9k_hw_setopmode(priv->ah); 180 } 181 182 void ath9k_htc_reset(struct ath9k_htc_priv *priv) 183 { 184 struct ath_hw *ah = priv->ah; 185 struct ath_common *common = ath9k_hw_common(ah); 186 struct ieee80211_channel *channel = priv->hw->conf.chandef.chan; 187 struct ath9k_hw_cal_data *caldata = NULL; 188 enum htc_phymode mode; 189 __be16 htc_mode; 190 u8 cmd_rsp; 191 int ret; 192 193 mutex_lock(&priv->mutex); 194 ath9k_htc_ps_wakeup(priv); 195 196 ath9k_htc_stop_ani(priv); 197 ieee80211_stop_queues(priv->hw); 198 199 del_timer_sync(&priv->tx.cleanup_timer); 200 ath9k_htc_tx_drain(priv); 201 202 WMI_CMD(WMI_DISABLE_INTR_CMDID); 203 WMI_CMD(WMI_DRAIN_TXQ_ALL_CMDID); 204 WMI_CMD(WMI_STOP_RECV_CMDID); 205 206 ath9k_wmi_event_drain(priv); 207 208 caldata = &priv->caldata; 209 ret = ath9k_hw_reset(ah, ah->curchan, caldata, false); 210 if (ret) { 211 ath_err(common, 212 "Unable to reset device (%u Mhz) reset status %d\n", 213 channel->center_freq, ret); 214 } 215 216 ath9k_cmn_update_txpow(ah, priv->curtxpow, priv->txpowlimit, 217 &priv->curtxpow); 218 219 WMI_CMD(WMI_START_RECV_CMDID); 220 ath9k_host_rx_init(priv); 221 222 mode = ath9k_htc_get_curmode(priv, ah->curchan); 223 htc_mode = cpu_to_be16(mode); 224 WMI_CMD_BUF(WMI_SET_MODE_CMDID, &htc_mode); 225 226 WMI_CMD(WMI_ENABLE_INTR_CMDID); 227 htc_start(priv->htc); 228 ath9k_htc_vif_reconfig(priv); 229 ieee80211_wake_queues(priv->hw); 230 231 mod_timer(&priv->tx.cleanup_timer, 232 jiffies + msecs_to_jiffies(ATH9K_HTC_TX_CLEANUP_INTERVAL)); 233 234 ath9k_htc_ps_restore(priv); 235 mutex_unlock(&priv->mutex); 236 } 237 238 static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv, 239 struct ieee80211_hw *hw, 240 struct ath9k_channel *hchan) 241 { 242 struct ath_hw *ah = priv->ah; 243 struct ath_common *common = ath9k_hw_common(ah); 244 struct ieee80211_conf *conf = &common->hw->conf; 245 bool fastcc; 246 struct ieee80211_channel *channel = hw->conf.chandef.chan; 247 struct ath9k_hw_cal_data *caldata = NULL; 248 enum htc_phymode mode; 249 __be16 htc_mode; 250 u8 cmd_rsp; 251 int ret; 252 253 if (test_bit(OP_INVALID, &priv->op_flags)) 254 return -EIO; 255 256 fastcc = !!(hw->conf.flags & IEEE80211_CONF_OFFCHANNEL); 257 258 ath9k_htc_ps_wakeup(priv); 259 260 del_timer_sync(&priv->tx.cleanup_timer); 261 ath9k_htc_tx_drain(priv); 262 263 WMI_CMD(WMI_DISABLE_INTR_CMDID); 264 WMI_CMD(WMI_DRAIN_TXQ_ALL_CMDID); 265 WMI_CMD(WMI_STOP_RECV_CMDID); 266 267 ath9k_wmi_event_drain(priv); 268 269 ath_dbg(common, CONFIG, 270 "(%u MHz) -> (%u MHz), HT: %d, HT40: %d fastcc: %d\n", 271 priv->ah->curchan->channel, 272 channel->center_freq, conf_is_ht(conf), conf_is_ht40(conf), 273 fastcc); 274 275 if (!fastcc) 276 caldata = &priv->caldata; 277 278 ret = ath9k_hw_reset(ah, hchan, caldata, fastcc); 279 if (ret) { 280 ath_err(common, 281 "Unable to reset channel (%u Mhz) reset status %d\n", 282 channel->center_freq, ret); 283 goto err; 284 } 285 286 ath9k_cmn_update_txpow(ah, priv->curtxpow, priv->txpowlimit, 287 &priv->curtxpow); 288 289 WMI_CMD(WMI_START_RECV_CMDID); 290 if (ret) 291 goto err; 292 293 ath9k_host_rx_init(priv); 294 295 mode = ath9k_htc_get_curmode(priv, hchan); 296 htc_mode = cpu_to_be16(mode); 297 WMI_CMD_BUF(WMI_SET_MODE_CMDID, &htc_mode); 298 if (ret) 299 goto err; 300 301 WMI_CMD(WMI_ENABLE_INTR_CMDID); 302 if (ret) 303 goto err; 304 305 htc_start(priv->htc); 306 307 if (!test_bit(OP_SCANNING, &priv->op_flags) && 308 !(hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)) 309 ath9k_htc_vif_reconfig(priv); 310 311 mod_timer(&priv->tx.cleanup_timer, 312 jiffies + msecs_to_jiffies(ATH9K_HTC_TX_CLEANUP_INTERVAL)); 313 314 err: 315 ath9k_htc_ps_restore(priv); 316 return ret; 317 } 318 319 /* 320 * Monitor mode handling is a tad complicated because the firmware requires 321 * an interface to be created exclusively, while mac80211 doesn't associate 322 * an interface with the mode. 323 * 324 * So, for now, only one monitor interface can be configured. 325 */ 326 static void __ath9k_htc_remove_monitor_interface(struct ath9k_htc_priv *priv) 327 { 328 struct ath_common *common = ath9k_hw_common(priv->ah); 329 struct ath9k_htc_target_vif hvif; 330 int ret = 0; 331 u8 cmd_rsp; 332 333 memset(&hvif, 0, sizeof(struct ath9k_htc_target_vif)); 334 memcpy(&hvif.myaddr, common->macaddr, ETH_ALEN); 335 hvif.index = priv->mon_vif_idx; 336 WMI_CMD_BUF(WMI_VAP_REMOVE_CMDID, &hvif); 337 if (ret) { 338 ath_err(common, "Unable to remove monitor interface at idx: %d\n", 339 priv->mon_vif_idx); 340 } 341 342 priv->nvifs--; 343 priv->vif_slot &= ~(1 << priv->mon_vif_idx); 344 } 345 346 static int ath9k_htc_add_monitor_interface(struct ath9k_htc_priv *priv) 347 { 348 struct ath_common *common = ath9k_hw_common(priv->ah); 349 struct ath9k_htc_target_vif hvif; 350 struct ath9k_htc_target_sta tsta; 351 int ret = 0, sta_idx; 352 u8 cmd_rsp; 353 354 if ((priv->nvifs >= ATH9K_HTC_MAX_VIF) || 355 (priv->nstations >= ATH9K_HTC_MAX_STA)) { 356 ret = -ENOBUFS; 357 goto err_vif; 358 } 359 360 sta_idx = ffz(priv->sta_slot); 361 if ((sta_idx < 0) || (sta_idx > ATH9K_HTC_MAX_STA)) { 362 ret = -ENOBUFS; 363 goto err_vif; 364 } 365 366 /* 367 * Add an interface. 368 */ 369 memset(&hvif, 0, sizeof(struct ath9k_htc_target_vif)); 370 memcpy(&hvif.myaddr, common->macaddr, ETH_ALEN); 371 372 hvif.opmode = HTC_M_MONITOR; 373 hvif.index = ffz(priv->vif_slot); 374 375 WMI_CMD_BUF(WMI_VAP_CREATE_CMDID, &hvif); 376 if (ret) 377 goto err_vif; 378 379 /* 380 * Assign the monitor interface index as a special case here. 381 * This is needed when the interface is brought down. 382 */ 383 priv->mon_vif_idx = hvif.index; 384 priv->vif_slot |= (1 << hvif.index); 385 386 /* 387 * Set the hardware mode to monitor only if there are no 388 * other interfaces. 389 */ 390 if (!priv->nvifs) 391 priv->ah->opmode = NL80211_IFTYPE_MONITOR; 392 393 priv->nvifs++; 394 395 /* 396 * Associate a station with the interface for packet injection. 397 */ 398 memset(&tsta, 0, sizeof(struct ath9k_htc_target_sta)); 399 400 memcpy(&tsta.macaddr, common->macaddr, ETH_ALEN); 401 402 tsta.is_vif_sta = 1; 403 tsta.sta_index = sta_idx; 404 tsta.vif_index = hvif.index; 405 tsta.maxampdu = cpu_to_be16(0xffff); 406 407 WMI_CMD_BUF(WMI_NODE_CREATE_CMDID, &tsta); 408 if (ret) { 409 ath_err(common, "Unable to add station entry for monitor mode\n"); 410 goto err_sta; 411 } 412 413 priv->sta_slot |= (1 << sta_idx); 414 priv->nstations++; 415 priv->vif_sta_pos[priv->mon_vif_idx] = sta_idx; 416 priv->ah->is_monitoring = true; 417 418 ath_dbg(common, CONFIG, 419 "Attached a monitor interface at idx: %d, sta idx: %d\n", 420 priv->mon_vif_idx, sta_idx); 421 422 return 0; 423 424 err_sta: 425 /* 426 * Remove the interface from the target. 427 */ 428 __ath9k_htc_remove_monitor_interface(priv); 429 err_vif: 430 ath_dbg(common, FATAL, "Unable to attach a monitor interface\n"); 431 432 return ret; 433 } 434 435 static int ath9k_htc_remove_monitor_interface(struct ath9k_htc_priv *priv) 436 { 437 struct ath_common *common = ath9k_hw_common(priv->ah); 438 int ret = 0; 439 u8 cmd_rsp, sta_idx; 440 441 __ath9k_htc_remove_monitor_interface(priv); 442 443 sta_idx = priv->vif_sta_pos[priv->mon_vif_idx]; 444 445 WMI_CMD_BUF(WMI_NODE_REMOVE_CMDID, &sta_idx); 446 if (ret) { 447 ath_err(common, "Unable to remove station entry for monitor mode\n"); 448 return ret; 449 } 450 451 priv->sta_slot &= ~(1 << sta_idx); 452 priv->nstations--; 453 priv->ah->is_monitoring = false; 454 455 ath_dbg(common, CONFIG, 456 "Removed a monitor interface at idx: %d, sta idx: %d\n", 457 priv->mon_vif_idx, sta_idx); 458 459 return 0; 460 } 461 462 static int ath9k_htc_add_station(struct ath9k_htc_priv *priv, 463 struct ieee80211_vif *vif, 464 struct ieee80211_sta *sta) 465 { 466 struct ath_common *common = ath9k_hw_common(priv->ah); 467 struct ath9k_htc_target_sta tsta; 468 struct ath9k_htc_vif *avp = (struct ath9k_htc_vif *) vif->drv_priv; 469 struct ath9k_htc_sta *ista; 470 int ret, sta_idx; 471 u8 cmd_rsp; 472 u16 maxampdu; 473 474 if (priv->nstations >= ATH9K_HTC_MAX_STA) 475 return -ENOBUFS; 476 477 sta_idx = ffz(priv->sta_slot); 478 if ((sta_idx < 0) || (sta_idx > ATH9K_HTC_MAX_STA)) 479 return -ENOBUFS; 480 481 memset(&tsta, 0, sizeof(struct ath9k_htc_target_sta)); 482 483 if (sta) { 484 ista = (struct ath9k_htc_sta *) sta->drv_priv; 485 memcpy(&tsta.macaddr, sta->addr, ETH_ALEN); 486 memcpy(&tsta.bssid, common->curbssid, ETH_ALEN); 487 ista->index = sta_idx; 488 tsta.is_vif_sta = 0; 489 maxampdu = 1 << (IEEE80211_HT_MAX_AMPDU_FACTOR + 490 sta->ht_cap.ampdu_factor); 491 tsta.maxampdu = cpu_to_be16(maxampdu); 492 } else { 493 memcpy(&tsta.macaddr, vif->addr, ETH_ALEN); 494 tsta.is_vif_sta = 1; 495 tsta.maxampdu = cpu_to_be16(0xffff); 496 } 497 498 tsta.sta_index = sta_idx; 499 tsta.vif_index = avp->index; 500 501 WMI_CMD_BUF(WMI_NODE_CREATE_CMDID, &tsta); 502 if (ret) { 503 if (sta) 504 ath_err(common, 505 "Unable to add station entry for: %pM\n", 506 sta->addr); 507 return ret; 508 } 509 510 if (sta) { 511 ath_dbg(common, CONFIG, 512 "Added a station entry for: %pM (idx: %d)\n", 513 sta->addr, tsta.sta_index); 514 } else { 515 ath_dbg(common, CONFIG, 516 "Added a station entry for VIF %d (idx: %d)\n", 517 avp->index, tsta.sta_index); 518 } 519 520 priv->sta_slot |= (1 << sta_idx); 521 priv->nstations++; 522 if (!sta) 523 priv->vif_sta_pos[avp->index] = sta_idx; 524 525 return 0; 526 } 527 528 static int ath9k_htc_remove_station(struct ath9k_htc_priv *priv, 529 struct ieee80211_vif *vif, 530 struct ieee80211_sta *sta) 531 { 532 struct ath_common *common = ath9k_hw_common(priv->ah); 533 struct ath9k_htc_vif *avp = (struct ath9k_htc_vif *) vif->drv_priv; 534 struct ath9k_htc_sta *ista; 535 int ret; 536 u8 cmd_rsp, sta_idx; 537 538 if (sta) { 539 ista = (struct ath9k_htc_sta *) sta->drv_priv; 540 sta_idx = ista->index; 541 } else { 542 sta_idx = priv->vif_sta_pos[avp->index]; 543 } 544 545 WMI_CMD_BUF(WMI_NODE_REMOVE_CMDID, &sta_idx); 546 if (ret) { 547 if (sta) 548 ath_err(common, 549 "Unable to remove station entry for: %pM\n", 550 sta->addr); 551 return ret; 552 } 553 554 if (sta) { 555 ath_dbg(common, CONFIG, 556 "Removed a station entry for: %pM (idx: %d)\n", 557 sta->addr, sta_idx); 558 } else { 559 ath_dbg(common, CONFIG, 560 "Removed a station entry for VIF %d (idx: %d)\n", 561 avp->index, sta_idx); 562 } 563 564 priv->sta_slot &= ~(1 << sta_idx); 565 priv->nstations--; 566 567 return 0; 568 } 569 570 int ath9k_htc_update_cap_target(struct ath9k_htc_priv *priv, 571 u8 enable_coex) 572 { 573 struct ath9k_htc_cap_target tcap; 574 int ret; 575 u8 cmd_rsp; 576 577 memset(&tcap, 0, sizeof(struct ath9k_htc_cap_target)); 578 579 tcap.ampdu_limit = cpu_to_be32(0xffff); 580 tcap.ampdu_subframes = 0xff; 581 tcap.enable_coex = enable_coex; 582 tcap.tx_chainmask = priv->ah->caps.tx_chainmask; 583 584 WMI_CMD_BUF(WMI_TARGET_IC_UPDATE_CMDID, &tcap); 585 586 return ret; 587 } 588 589 static void ath9k_htc_setup_rate(struct ath9k_htc_priv *priv, 590 struct ieee80211_sta *sta, 591 struct ath9k_htc_target_rate *trate) 592 { 593 struct ath9k_htc_sta *ista = (struct ath9k_htc_sta *) sta->drv_priv; 594 struct ieee80211_supported_band *sband; 595 u32 caps = 0; 596 int i, j; 597 598 sband = priv->hw->wiphy->bands[priv->hw->conf.chandef.chan->band]; 599 600 for (i = 0, j = 0; i < sband->n_bitrates; i++) { 601 if (sta->supp_rates[sband->band] & BIT(i)) { 602 trate->rates.legacy_rates.rs_rates[j] 603 = (sband->bitrates[i].bitrate * 2) / 10; 604 j++; 605 } 606 } 607 trate->rates.legacy_rates.rs_nrates = j; 608 609 if (sta->ht_cap.ht_supported) { 610 for (i = 0, j = 0; i < 77; i++) { 611 if (sta->ht_cap.mcs.rx_mask[i/8] & (1<<(i%8))) 612 trate->rates.ht_rates.rs_rates[j++] = i; 613 if (j == ATH_HTC_RATE_MAX) 614 break; 615 } 616 trate->rates.ht_rates.rs_nrates = j; 617 618 caps = WLAN_RC_HT_FLAG; 619 if (sta->ht_cap.cap & IEEE80211_HT_CAP_RX_STBC) 620 caps |= ATH_RC_TX_STBC_FLAG; 621 if (sta->ht_cap.mcs.rx_mask[1]) 622 caps |= WLAN_RC_DS_FLAG; 623 if ((sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) && 624 (conf_is_ht40(&priv->hw->conf))) 625 caps |= WLAN_RC_40_FLAG; 626 if (conf_is_ht40(&priv->hw->conf) && 627 (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40)) 628 caps |= WLAN_RC_SGI_FLAG; 629 else if (conf_is_ht20(&priv->hw->conf) && 630 (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20)) 631 caps |= WLAN_RC_SGI_FLAG; 632 } 633 634 trate->sta_index = ista->index; 635 trate->isnew = 1; 636 trate->capflags = cpu_to_be32(caps); 637 } 638 639 static int ath9k_htc_send_rate_cmd(struct ath9k_htc_priv *priv, 640 struct ath9k_htc_target_rate *trate) 641 { 642 struct ath_common *common = ath9k_hw_common(priv->ah); 643 int ret; 644 u8 cmd_rsp; 645 646 WMI_CMD_BUF(WMI_RC_RATE_UPDATE_CMDID, trate); 647 if (ret) { 648 ath_err(common, 649 "Unable to initialize Rate information on target\n"); 650 } 651 652 return ret; 653 } 654 655 static void ath9k_htc_init_rate(struct ath9k_htc_priv *priv, 656 struct ieee80211_sta *sta) 657 { 658 struct ath_common *common = ath9k_hw_common(priv->ah); 659 struct ath9k_htc_target_rate trate; 660 int ret; 661 662 memset(&trate, 0, sizeof(struct ath9k_htc_target_rate)); 663 ath9k_htc_setup_rate(priv, sta, &trate); 664 ret = ath9k_htc_send_rate_cmd(priv, &trate); 665 if (!ret) 666 ath_dbg(common, CONFIG, 667 "Updated target sta: %pM, rate caps: 0x%X\n", 668 sta->addr, be32_to_cpu(trate.capflags)); 669 } 670 671 static void ath9k_htc_update_rate(struct ath9k_htc_priv *priv, 672 struct ieee80211_vif *vif, 673 struct ieee80211_bss_conf *bss_conf) 674 { 675 struct ath_common *common = ath9k_hw_common(priv->ah); 676 struct ath9k_htc_target_rate trate; 677 struct ieee80211_sta *sta; 678 int ret; 679 680 memset(&trate, 0, sizeof(struct ath9k_htc_target_rate)); 681 682 rcu_read_lock(); 683 sta = ieee80211_find_sta(vif, bss_conf->bssid); 684 if (!sta) { 685 rcu_read_unlock(); 686 return; 687 } 688 ath9k_htc_setup_rate(priv, sta, &trate); 689 rcu_read_unlock(); 690 691 ret = ath9k_htc_send_rate_cmd(priv, &trate); 692 if (!ret) 693 ath_dbg(common, CONFIG, 694 "Updated target sta: %pM, rate caps: 0x%X\n", 695 bss_conf->bssid, be32_to_cpu(trate.capflags)); 696 } 697 698 static int ath9k_htc_tx_aggr_oper(struct ath9k_htc_priv *priv, 699 struct ieee80211_vif *vif, 700 struct ieee80211_sta *sta, 701 enum ieee80211_ampdu_mlme_action action, 702 u16 tid) 703 { 704 struct ath_common *common = ath9k_hw_common(priv->ah); 705 struct ath9k_htc_target_aggr aggr; 706 struct ath9k_htc_sta *ista; 707 int ret = 0; 708 u8 cmd_rsp; 709 710 if (tid >= ATH9K_HTC_MAX_TID) 711 return -EINVAL; 712 713 memset(&aggr, 0, sizeof(struct ath9k_htc_target_aggr)); 714 ista = (struct ath9k_htc_sta *) sta->drv_priv; 715 716 aggr.sta_index = ista->index; 717 aggr.tidno = tid & 0xf; 718 aggr.aggr_enable = (action == IEEE80211_AMPDU_TX_START) ? true : false; 719 720 WMI_CMD_BUF(WMI_TX_AGGR_ENABLE_CMDID, &aggr); 721 if (ret) 722 ath_dbg(common, CONFIG, 723 "Unable to %s TX aggregation for (%pM, %d)\n", 724 (aggr.aggr_enable) ? "start" : "stop", sta->addr, tid); 725 else 726 ath_dbg(common, CONFIG, 727 "%s TX aggregation for (%pM, %d)\n", 728 (aggr.aggr_enable) ? "Starting" : "Stopping", 729 sta->addr, tid); 730 731 spin_lock_bh(&priv->tx.tx_lock); 732 ista->tid_state[tid] = (aggr.aggr_enable && !ret) ? AGGR_START : AGGR_STOP; 733 spin_unlock_bh(&priv->tx.tx_lock); 734 735 return ret; 736 } 737 738 /*******/ 739 /* ANI */ 740 /*******/ 741 742 void ath9k_htc_start_ani(struct ath9k_htc_priv *priv) 743 { 744 struct ath_common *common = ath9k_hw_common(priv->ah); 745 unsigned long timestamp = jiffies_to_msecs(jiffies); 746 747 common->ani.longcal_timer = timestamp; 748 common->ani.shortcal_timer = timestamp; 749 common->ani.checkani_timer = timestamp; 750 751 set_bit(OP_ANI_RUNNING, &priv->op_flags); 752 753 ieee80211_queue_delayed_work(common->hw, &priv->ani_work, 754 msecs_to_jiffies(ATH_ANI_POLLINTERVAL)); 755 } 756 757 void ath9k_htc_stop_ani(struct ath9k_htc_priv *priv) 758 { 759 cancel_delayed_work_sync(&priv->ani_work); 760 clear_bit(OP_ANI_RUNNING, &priv->op_flags); 761 } 762 763 void ath9k_htc_ani_work(struct work_struct *work) 764 { 765 struct ath9k_htc_priv *priv = 766 container_of(work, struct ath9k_htc_priv, ani_work.work); 767 struct ath_hw *ah = priv->ah; 768 struct ath_common *common = ath9k_hw_common(ah); 769 bool longcal = false; 770 bool shortcal = false; 771 bool aniflag = false; 772 unsigned int timestamp = jiffies_to_msecs(jiffies); 773 u32 cal_interval, short_cal_interval; 774 775 short_cal_interval = (ah->opmode == NL80211_IFTYPE_AP) ? 776 ATH_AP_SHORT_CALINTERVAL : ATH_STA_SHORT_CALINTERVAL; 777 778 /* Only calibrate if awake */ 779 if (ah->power_mode != ATH9K_PM_AWAKE) 780 goto set_timer; 781 782 /* Long calibration runs independently of short calibration. */ 783 if ((timestamp - common->ani.longcal_timer) >= ATH_LONG_CALINTERVAL) { 784 longcal = true; 785 ath_dbg(common, ANI, "longcal @%lu\n", jiffies); 786 common->ani.longcal_timer = timestamp; 787 } 788 789 /* Short calibration applies only while caldone is false */ 790 if (!common->ani.caldone) { 791 if ((timestamp - common->ani.shortcal_timer) >= 792 short_cal_interval) { 793 shortcal = true; 794 ath_dbg(common, ANI, "shortcal @%lu\n", jiffies); 795 common->ani.shortcal_timer = timestamp; 796 common->ani.resetcal_timer = timestamp; 797 } 798 } else { 799 if ((timestamp - common->ani.resetcal_timer) >= 800 ATH_RESTART_CALINTERVAL) { 801 common->ani.caldone = ath9k_hw_reset_calvalid(ah); 802 if (common->ani.caldone) 803 common->ani.resetcal_timer = timestamp; 804 } 805 } 806 807 /* Verify whether we must check ANI */ 808 if ((timestamp - common->ani.checkani_timer) >= ATH_ANI_POLLINTERVAL) { 809 aniflag = true; 810 common->ani.checkani_timer = timestamp; 811 } 812 813 /* Skip all processing if there's nothing to do. */ 814 if (longcal || shortcal || aniflag) { 815 816 ath9k_htc_ps_wakeup(priv); 817 818 /* Call ANI routine if necessary */ 819 if (aniflag) 820 ath9k_hw_ani_monitor(ah, ah->curchan); 821 822 /* Perform calibration if necessary */ 823 if (longcal || shortcal) 824 common->ani.caldone = 825 ath9k_hw_calibrate(ah, ah->curchan, 826 ah->rxchainmask, longcal); 827 828 ath9k_htc_ps_restore(priv); 829 } 830 831 set_timer: 832 /* 833 * Set timer interval based on previous results. 834 * The interval must be the shortest necessary to satisfy ANI, 835 * short calibration and long calibration. 836 */ 837 cal_interval = ATH_LONG_CALINTERVAL; 838 cal_interval = min(cal_interval, (u32)ATH_ANI_POLLINTERVAL); 839 if (!common->ani.caldone) 840 cal_interval = min(cal_interval, (u32)short_cal_interval); 841 842 ieee80211_queue_delayed_work(common->hw, &priv->ani_work, 843 msecs_to_jiffies(cal_interval)); 844 } 845 846 /**********************/ 847 /* mac80211 Callbacks */ 848 /**********************/ 849 850 static void ath9k_htc_tx(struct ieee80211_hw *hw, 851 struct ieee80211_tx_control *control, 852 struct sk_buff *skb) 853 { 854 struct ieee80211_hdr *hdr; 855 struct ath9k_htc_priv *priv = hw->priv; 856 struct ath_common *common = ath9k_hw_common(priv->ah); 857 int padpos, padsize, ret, slot; 858 859 hdr = (struct ieee80211_hdr *) skb->data; 860 861 /* Add the padding after the header if this is not already done */ 862 padpos = ieee80211_hdrlen(hdr->frame_control); 863 padsize = padpos & 3; 864 if (padsize && skb->len > padpos) { 865 if (skb_headroom(skb) < padsize) { 866 ath_dbg(common, XMIT, "No room for padding\n"); 867 goto fail_tx; 868 } 869 skb_push(skb, padsize); 870 memmove(skb->data, skb->data + padsize, padpos); 871 } 872 873 slot = ath9k_htc_tx_get_slot(priv); 874 if (slot < 0) { 875 ath_dbg(common, XMIT, "No free TX slot\n"); 876 goto fail_tx; 877 } 878 879 ret = ath9k_htc_tx_start(priv, control->sta, skb, slot, false); 880 if (ret != 0) { 881 ath_dbg(common, XMIT, "Tx failed\n"); 882 goto clear_slot; 883 } 884 885 ath9k_htc_check_stop_queues(priv); 886 887 return; 888 889 clear_slot: 890 ath9k_htc_tx_clear_slot(priv, slot); 891 fail_tx: 892 dev_kfree_skb_any(skb); 893 } 894 895 static int ath9k_htc_start(struct ieee80211_hw *hw) 896 { 897 struct ath9k_htc_priv *priv = hw->priv; 898 struct ath_hw *ah = priv->ah; 899 struct ath_common *common = ath9k_hw_common(ah); 900 struct ieee80211_channel *curchan = hw->conf.chandef.chan; 901 struct ath9k_channel *init_channel; 902 int ret = 0; 903 enum htc_phymode mode; 904 __be16 htc_mode; 905 u8 cmd_rsp; 906 907 mutex_lock(&priv->mutex); 908 909 ath_dbg(common, CONFIG, 910 "Starting driver with initial channel: %d MHz\n", 911 curchan->center_freq); 912 913 /* Ensure that HW is awake before flushing RX */ 914 ath9k_htc_setpower(priv, ATH9K_PM_AWAKE); 915 WMI_CMD(WMI_FLUSH_RECV_CMDID); 916 917 /* setup initial channel */ 918 init_channel = ath9k_cmn_get_channel(hw, ah, &hw->conf.chandef); 919 920 ret = ath9k_hw_reset(ah, init_channel, ah->caldata, false); 921 if (ret) { 922 ath_err(common, 923 "Unable to reset hardware; reset status %d (freq %u MHz)\n", 924 ret, curchan->center_freq); 925 mutex_unlock(&priv->mutex); 926 return ret; 927 } 928 929 ath9k_cmn_update_txpow(ah, priv->curtxpow, priv->txpowlimit, 930 &priv->curtxpow); 931 932 mode = ath9k_htc_get_curmode(priv, init_channel); 933 htc_mode = cpu_to_be16(mode); 934 WMI_CMD_BUF(WMI_SET_MODE_CMDID, &htc_mode); 935 WMI_CMD(WMI_ATH_INIT_CMDID); 936 WMI_CMD(WMI_START_RECV_CMDID); 937 938 ath9k_host_rx_init(priv); 939 940 ret = ath9k_htc_update_cap_target(priv, 0); 941 if (ret) 942 ath_dbg(common, CONFIG, 943 "Failed to update capability in target\n"); 944 945 clear_bit(OP_INVALID, &priv->op_flags); 946 htc_start(priv->htc); 947 948 spin_lock_bh(&priv->tx.tx_lock); 949 priv->tx.flags &= ~ATH9K_HTC_OP_TX_QUEUES_STOP; 950 spin_unlock_bh(&priv->tx.tx_lock); 951 952 ieee80211_wake_queues(hw); 953 954 mod_timer(&priv->tx.cleanup_timer, 955 jiffies + msecs_to_jiffies(ATH9K_HTC_TX_CLEANUP_INTERVAL)); 956 957 ath9k_htc_start_btcoex(priv); 958 959 mutex_unlock(&priv->mutex); 960 961 return ret; 962 } 963 964 static void ath9k_htc_stop(struct ieee80211_hw *hw) 965 { 966 struct ath9k_htc_priv *priv = hw->priv; 967 struct ath_hw *ah = priv->ah; 968 struct ath_common *common = ath9k_hw_common(ah); 969 int ret __attribute__ ((unused)); 970 u8 cmd_rsp; 971 972 mutex_lock(&priv->mutex); 973 974 if (test_bit(OP_INVALID, &priv->op_flags)) { 975 ath_dbg(common, ANY, "Device not present\n"); 976 mutex_unlock(&priv->mutex); 977 return; 978 } 979 980 ath9k_htc_ps_wakeup(priv); 981 982 WMI_CMD(WMI_DISABLE_INTR_CMDID); 983 WMI_CMD(WMI_DRAIN_TXQ_ALL_CMDID); 984 WMI_CMD(WMI_STOP_RECV_CMDID); 985 986 tasklet_kill(&priv->rx_tasklet); 987 988 del_timer_sync(&priv->tx.cleanup_timer); 989 ath9k_htc_tx_drain(priv); 990 ath9k_wmi_event_drain(priv); 991 992 mutex_unlock(&priv->mutex); 993 994 /* Cancel all the running timers/work .. */ 995 cancel_work_sync(&priv->fatal_work); 996 cancel_work_sync(&priv->ps_work); 997 998 #ifdef CONFIG_MAC80211_LEDS 999 cancel_work_sync(&priv->led_work); 1000 #endif 1001 ath9k_htc_stop_ani(priv); 1002 1003 mutex_lock(&priv->mutex); 1004 1005 ath9k_htc_stop_btcoex(priv); 1006 1007 /* Remove a monitor interface if it's present. */ 1008 if (priv->ah->is_monitoring) 1009 ath9k_htc_remove_monitor_interface(priv); 1010 1011 ath9k_hw_phy_disable(ah); 1012 ath9k_hw_disable(ah); 1013 ath9k_htc_ps_restore(priv); 1014 ath9k_htc_setpower(priv, ATH9K_PM_FULL_SLEEP); 1015 1016 set_bit(OP_INVALID, &priv->op_flags); 1017 1018 ath_dbg(common, CONFIG, "Driver halt\n"); 1019 mutex_unlock(&priv->mutex); 1020 } 1021 1022 static int ath9k_htc_add_interface(struct ieee80211_hw *hw, 1023 struct ieee80211_vif *vif) 1024 { 1025 struct ath9k_htc_priv *priv = hw->priv; 1026 struct ath9k_htc_vif *avp = (void *)vif->drv_priv; 1027 struct ath_common *common = ath9k_hw_common(priv->ah); 1028 struct ath9k_htc_target_vif hvif; 1029 int ret = 0; 1030 u8 cmd_rsp; 1031 1032 mutex_lock(&priv->mutex); 1033 1034 ath9k_htc_ps_wakeup(priv); 1035 memset(&hvif, 0, sizeof(struct ath9k_htc_target_vif)); 1036 memcpy(&hvif.myaddr, vif->addr, ETH_ALEN); 1037 1038 switch (vif->type) { 1039 case NL80211_IFTYPE_STATION: 1040 hvif.opmode = HTC_M_STA; 1041 break; 1042 case NL80211_IFTYPE_ADHOC: 1043 hvif.opmode = HTC_M_IBSS; 1044 break; 1045 case NL80211_IFTYPE_AP: 1046 hvif.opmode = HTC_M_HOSTAP; 1047 break; 1048 case NL80211_IFTYPE_MESH_POINT: 1049 hvif.opmode = HTC_M_WDS; /* close enough */ 1050 break; 1051 default: 1052 ath_err(common, 1053 "Interface type %d not yet supported\n", vif->type); 1054 ret = -EOPNOTSUPP; 1055 goto out; 1056 } 1057 1058 /* Index starts from zero on the target */ 1059 avp->index = hvif.index = ffz(priv->vif_slot); 1060 hvif.rtsthreshold = cpu_to_be16(2304); 1061 WMI_CMD_BUF(WMI_VAP_CREATE_CMDID, &hvif); 1062 if (ret) 1063 goto out; 1064 1065 /* 1066 * We need a node in target to tx mgmt frames 1067 * before association. 1068 */ 1069 ret = ath9k_htc_add_station(priv, vif, NULL); 1070 if (ret) { 1071 WMI_CMD_BUF(WMI_VAP_REMOVE_CMDID, &hvif); 1072 goto out; 1073 } 1074 1075 ath9k_htc_set_mac_bssid_mask(priv, vif); 1076 1077 priv->vif_slot |= (1 << avp->index); 1078 priv->nvifs++; 1079 1080 INC_VIF(priv, vif->type); 1081 1082 if ((vif->type == NL80211_IFTYPE_AP) || 1083 (vif->type == NL80211_IFTYPE_MESH_POINT) || 1084 (vif->type == NL80211_IFTYPE_ADHOC)) 1085 ath9k_htc_assign_bslot(priv, vif); 1086 1087 ath9k_htc_set_opmode(priv); 1088 1089 if ((priv->ah->opmode == NL80211_IFTYPE_AP) && 1090 !test_bit(OP_ANI_RUNNING, &priv->op_flags)) { 1091 ath9k_hw_set_tsfadjust(priv->ah, true); 1092 ath9k_htc_start_ani(priv); 1093 } 1094 1095 ath_dbg(common, CONFIG, "Attach a VIF of type: %d at idx: %d\n", 1096 vif->type, avp->index); 1097 1098 out: 1099 ath9k_htc_ps_restore(priv); 1100 mutex_unlock(&priv->mutex); 1101 1102 return ret; 1103 } 1104 1105 static void ath9k_htc_remove_interface(struct ieee80211_hw *hw, 1106 struct ieee80211_vif *vif) 1107 { 1108 struct ath9k_htc_priv *priv = hw->priv; 1109 struct ath_common *common = ath9k_hw_common(priv->ah); 1110 struct ath9k_htc_vif *avp = (void *)vif->drv_priv; 1111 struct ath9k_htc_target_vif hvif; 1112 int ret = 0; 1113 u8 cmd_rsp; 1114 1115 mutex_lock(&priv->mutex); 1116 ath9k_htc_ps_wakeup(priv); 1117 1118 memset(&hvif, 0, sizeof(struct ath9k_htc_target_vif)); 1119 memcpy(&hvif.myaddr, vif->addr, ETH_ALEN); 1120 hvif.index = avp->index; 1121 WMI_CMD_BUF(WMI_VAP_REMOVE_CMDID, &hvif); 1122 if (ret) { 1123 ath_err(common, "Unable to remove interface at idx: %d\n", 1124 avp->index); 1125 } 1126 priv->nvifs--; 1127 priv->vif_slot &= ~(1 << avp->index); 1128 1129 ath9k_htc_remove_station(priv, vif, NULL); 1130 1131 DEC_VIF(priv, vif->type); 1132 1133 if ((vif->type == NL80211_IFTYPE_AP) || 1134 vif->type == NL80211_IFTYPE_MESH_POINT || 1135 (vif->type == NL80211_IFTYPE_ADHOC)) 1136 ath9k_htc_remove_bslot(priv, vif); 1137 1138 ath9k_htc_set_opmode(priv); 1139 1140 ath9k_htc_set_mac_bssid_mask(priv, vif); 1141 1142 /* 1143 * Stop ANI only if there are no associated station interfaces. 1144 */ 1145 if ((vif->type == NL80211_IFTYPE_AP) && (priv->num_ap_vif == 0)) { 1146 priv->rearm_ani = false; 1147 ieee80211_iterate_active_interfaces_atomic( 1148 priv->hw, IEEE80211_IFACE_ITER_RESUME_ALL, 1149 ath9k_htc_vif_iter, priv); 1150 if (!priv->rearm_ani) 1151 ath9k_htc_stop_ani(priv); 1152 } 1153 1154 ath_dbg(common, CONFIG, "Detach Interface at idx: %d\n", avp->index); 1155 1156 ath9k_htc_ps_restore(priv); 1157 mutex_unlock(&priv->mutex); 1158 } 1159 1160 static int ath9k_htc_config(struct ieee80211_hw *hw, u32 changed) 1161 { 1162 struct ath9k_htc_priv *priv = hw->priv; 1163 struct ath_common *common = ath9k_hw_common(priv->ah); 1164 struct ieee80211_conf *conf = &hw->conf; 1165 bool chip_reset = false; 1166 int ret = 0; 1167 1168 mutex_lock(&priv->mutex); 1169 ath9k_htc_ps_wakeup(priv); 1170 1171 if (changed & IEEE80211_CONF_CHANGE_IDLE) { 1172 mutex_lock(&priv->htc_pm_lock); 1173 1174 priv->ps_idle = !!(conf->flags & IEEE80211_CONF_IDLE); 1175 if (!priv->ps_idle) 1176 chip_reset = true; 1177 1178 mutex_unlock(&priv->htc_pm_lock); 1179 } 1180 1181 /* 1182 * Monitor interface should be added before 1183 * IEEE80211_CONF_CHANGE_CHANNEL is handled. 1184 */ 1185 if (changed & IEEE80211_CONF_CHANGE_MONITOR) { 1186 if ((conf->flags & IEEE80211_CONF_MONITOR) && 1187 !priv->ah->is_monitoring) 1188 ath9k_htc_add_monitor_interface(priv); 1189 else if (priv->ah->is_monitoring) 1190 ath9k_htc_remove_monitor_interface(priv); 1191 } 1192 1193 if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) || chip_reset) { 1194 struct ieee80211_channel *curchan = hw->conf.chandef.chan; 1195 int pos = curchan->hw_value; 1196 1197 ath_dbg(common, CONFIG, "Set channel: %d MHz\n", 1198 curchan->center_freq); 1199 1200 ath9k_cmn_get_channel(hw, priv->ah, &hw->conf.chandef); 1201 if (ath9k_htc_set_channel(priv, hw, &priv->ah->channels[pos]) < 0) { 1202 ath_err(common, "Unable to set channel\n"); 1203 ret = -EINVAL; 1204 goto out; 1205 } 1206 1207 } 1208 1209 if (changed & IEEE80211_CONF_CHANGE_PS) { 1210 if (conf->flags & IEEE80211_CONF_PS) { 1211 ath9k_htc_setpower(priv, ATH9K_PM_NETWORK_SLEEP); 1212 priv->ps_enabled = true; 1213 } else { 1214 priv->ps_enabled = false; 1215 cancel_work_sync(&priv->ps_work); 1216 ath9k_htc_setpower(priv, ATH9K_PM_AWAKE); 1217 } 1218 } 1219 1220 if (changed & IEEE80211_CONF_CHANGE_POWER) { 1221 priv->txpowlimit = 2 * conf->power_level; 1222 ath9k_cmn_update_txpow(priv->ah, priv->curtxpow, 1223 priv->txpowlimit, &priv->curtxpow); 1224 } 1225 1226 out: 1227 ath9k_htc_ps_restore(priv); 1228 mutex_unlock(&priv->mutex); 1229 return ret; 1230 } 1231 1232 #define SUPPORTED_FILTERS \ 1233 (FIF_PROMISC_IN_BSS | \ 1234 FIF_ALLMULTI | \ 1235 FIF_CONTROL | \ 1236 FIF_PSPOLL | \ 1237 FIF_OTHER_BSS | \ 1238 FIF_BCN_PRBRESP_PROMISC | \ 1239 FIF_PROBE_REQ | \ 1240 FIF_FCSFAIL) 1241 1242 static void ath9k_htc_configure_filter(struct ieee80211_hw *hw, 1243 unsigned int changed_flags, 1244 unsigned int *total_flags, 1245 u64 multicast) 1246 { 1247 struct ath9k_htc_priv *priv = hw->priv; 1248 u32 rfilt; 1249 1250 mutex_lock(&priv->mutex); 1251 changed_flags &= SUPPORTED_FILTERS; 1252 *total_flags &= SUPPORTED_FILTERS; 1253 1254 if (test_bit(OP_INVALID, &priv->op_flags)) { 1255 ath_dbg(ath9k_hw_common(priv->ah), ANY, 1256 "Unable to configure filter on invalid state\n"); 1257 mutex_unlock(&priv->mutex); 1258 return; 1259 } 1260 ath9k_htc_ps_wakeup(priv); 1261 1262 priv->rxfilter = *total_flags; 1263 rfilt = ath9k_htc_calcrxfilter(priv); 1264 ath9k_hw_setrxfilter(priv->ah, rfilt); 1265 1266 ath_dbg(ath9k_hw_common(priv->ah), CONFIG, "Set HW RX filter: 0x%x\n", 1267 rfilt); 1268 1269 ath9k_htc_ps_restore(priv); 1270 mutex_unlock(&priv->mutex); 1271 } 1272 1273 static void ath9k_htc_sta_rc_update_work(struct work_struct *work) 1274 { 1275 struct ath9k_htc_sta *ista = 1276 container_of(work, struct ath9k_htc_sta, rc_update_work); 1277 struct ieee80211_sta *sta = 1278 container_of((void *)ista, struct ieee80211_sta, drv_priv); 1279 struct ath9k_htc_priv *priv = ista->htc_priv; 1280 struct ath_common *common = ath9k_hw_common(priv->ah); 1281 struct ath9k_htc_target_rate trate; 1282 1283 mutex_lock(&priv->mutex); 1284 ath9k_htc_ps_wakeup(priv); 1285 1286 memset(&trate, 0, sizeof(struct ath9k_htc_target_rate)); 1287 ath9k_htc_setup_rate(priv, sta, &trate); 1288 if (!ath9k_htc_send_rate_cmd(priv, &trate)) 1289 ath_dbg(common, CONFIG, 1290 "Supported rates for sta: %pM updated, rate caps: 0x%X\n", 1291 sta->addr, be32_to_cpu(trate.capflags)); 1292 else 1293 ath_dbg(common, CONFIG, 1294 "Unable to update supported rates for sta: %pM\n", 1295 sta->addr); 1296 1297 ath9k_htc_ps_restore(priv); 1298 mutex_unlock(&priv->mutex); 1299 } 1300 1301 static int ath9k_htc_sta_add(struct ieee80211_hw *hw, 1302 struct ieee80211_vif *vif, 1303 struct ieee80211_sta *sta) 1304 { 1305 struct ath9k_htc_priv *priv = hw->priv; 1306 struct ath9k_htc_sta *ista = (struct ath9k_htc_sta *) sta->drv_priv; 1307 int ret; 1308 1309 mutex_lock(&priv->mutex); 1310 ath9k_htc_ps_wakeup(priv); 1311 ret = ath9k_htc_add_station(priv, vif, sta); 1312 if (!ret) { 1313 INIT_WORK(&ista->rc_update_work, ath9k_htc_sta_rc_update_work); 1314 ista->htc_priv = priv; 1315 ath9k_htc_init_rate(priv, sta); 1316 } 1317 ath9k_htc_ps_restore(priv); 1318 mutex_unlock(&priv->mutex); 1319 1320 return ret; 1321 } 1322 1323 static int ath9k_htc_sta_remove(struct ieee80211_hw *hw, 1324 struct ieee80211_vif *vif, 1325 struct ieee80211_sta *sta) 1326 { 1327 struct ath9k_htc_priv *priv = hw->priv; 1328 struct ath9k_htc_sta *ista = (struct ath9k_htc_sta *) sta->drv_priv; 1329 int ret; 1330 1331 cancel_work_sync(&ista->rc_update_work); 1332 1333 mutex_lock(&priv->mutex); 1334 ath9k_htc_ps_wakeup(priv); 1335 htc_sta_drain(priv->htc, ista->index); 1336 ret = ath9k_htc_remove_station(priv, vif, sta); 1337 ath9k_htc_ps_restore(priv); 1338 mutex_unlock(&priv->mutex); 1339 1340 return ret; 1341 } 1342 1343 static void ath9k_htc_sta_rc_update(struct ieee80211_hw *hw, 1344 struct ieee80211_vif *vif, 1345 struct ieee80211_sta *sta, u32 changed) 1346 { 1347 struct ath9k_htc_sta *ista = (struct ath9k_htc_sta *) sta->drv_priv; 1348 1349 if (!(changed & IEEE80211_RC_SUPP_RATES_CHANGED)) 1350 return; 1351 1352 schedule_work(&ista->rc_update_work); 1353 } 1354 1355 static int ath9k_htc_conf_tx(struct ieee80211_hw *hw, 1356 struct ieee80211_vif *vif, u16 queue, 1357 const struct ieee80211_tx_queue_params *params) 1358 { 1359 struct ath9k_htc_priv *priv = hw->priv; 1360 struct ath_common *common = ath9k_hw_common(priv->ah); 1361 struct ath9k_tx_queue_info qi; 1362 int ret = 0, qnum; 1363 1364 if (queue >= IEEE80211_NUM_ACS) 1365 return 0; 1366 1367 mutex_lock(&priv->mutex); 1368 ath9k_htc_ps_wakeup(priv); 1369 1370 memset(&qi, 0, sizeof(struct ath9k_tx_queue_info)); 1371 1372 qi.tqi_aifs = params->aifs; 1373 qi.tqi_cwmin = params->cw_min; 1374 qi.tqi_cwmax = params->cw_max; 1375 qi.tqi_burstTime = params->txop * 32; 1376 1377 qnum = get_hw_qnum(queue, priv->hwq_map); 1378 1379 ath_dbg(common, CONFIG, 1380 "Configure tx [queue/hwq] [%d/%d], aifs: %d, cw_min: %d, cw_max: %d, txop: %d\n", 1381 queue, qnum, params->aifs, params->cw_min, 1382 params->cw_max, params->txop); 1383 1384 ret = ath_htc_txq_update(priv, qnum, &qi); 1385 if (ret) { 1386 ath_err(common, "TXQ Update failed\n"); 1387 goto out; 1388 } 1389 1390 if ((priv->ah->opmode == NL80211_IFTYPE_ADHOC) && 1391 (qnum == priv->hwq_map[IEEE80211_AC_BE])) 1392 ath9k_htc_beaconq_config(priv); 1393 out: 1394 ath9k_htc_ps_restore(priv); 1395 mutex_unlock(&priv->mutex); 1396 1397 return ret; 1398 } 1399 1400 static int ath9k_htc_set_key(struct ieee80211_hw *hw, 1401 enum set_key_cmd cmd, 1402 struct ieee80211_vif *vif, 1403 struct ieee80211_sta *sta, 1404 struct ieee80211_key_conf *key) 1405 { 1406 struct ath9k_htc_priv *priv = hw->priv; 1407 struct ath_common *common = ath9k_hw_common(priv->ah); 1408 int ret = 0; 1409 1410 if (htc_modparam_nohwcrypt) 1411 return -ENOSPC; 1412 1413 if ((vif->type == NL80211_IFTYPE_ADHOC || 1414 vif->type == NL80211_IFTYPE_MESH_POINT) && 1415 (key->cipher == WLAN_CIPHER_SUITE_TKIP || 1416 key->cipher == WLAN_CIPHER_SUITE_CCMP) && 1417 !(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) { 1418 /* 1419 * For now, disable hw crypto for the RSN IBSS group keys. This 1420 * could be optimized in the future to use a modified key cache 1421 * design to support per-STA RX GTK, but until that gets 1422 * implemented, use of software crypto for group addressed 1423 * frames is a acceptable to allow RSN IBSS to be used. 1424 */ 1425 return -EOPNOTSUPP; 1426 } 1427 1428 mutex_lock(&priv->mutex); 1429 ath_dbg(common, CONFIG, "Set HW Key\n"); 1430 ath9k_htc_ps_wakeup(priv); 1431 1432 switch (cmd) { 1433 case SET_KEY: 1434 ret = ath_key_config(common, vif, sta, key); 1435 if (ret >= 0) { 1436 key->hw_key_idx = ret; 1437 /* push IV and Michael MIC generation to stack */ 1438 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV; 1439 if (key->cipher == WLAN_CIPHER_SUITE_TKIP) 1440 key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC; 1441 if (priv->ah->sw_mgmt_crypto && 1442 key->cipher == WLAN_CIPHER_SUITE_CCMP) 1443 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX; 1444 ret = 0; 1445 } 1446 break; 1447 case DISABLE_KEY: 1448 ath_key_delete(common, key); 1449 break; 1450 default: 1451 ret = -EINVAL; 1452 } 1453 1454 ath9k_htc_ps_restore(priv); 1455 mutex_unlock(&priv->mutex); 1456 1457 return ret; 1458 } 1459 1460 static void ath9k_htc_set_bssid(struct ath9k_htc_priv *priv) 1461 { 1462 struct ath_common *common = ath9k_hw_common(priv->ah); 1463 1464 ath9k_hw_write_associd(priv->ah); 1465 ath_dbg(common, CONFIG, "BSSID: %pM aid: 0x%x\n", 1466 common->curbssid, common->curaid); 1467 } 1468 1469 static void ath9k_htc_bss_iter(void *data, u8 *mac, struct ieee80211_vif *vif) 1470 { 1471 struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *)data; 1472 struct ath_common *common = ath9k_hw_common(priv->ah); 1473 struct ieee80211_bss_conf *bss_conf = &vif->bss_conf; 1474 1475 if ((vif->type == NL80211_IFTYPE_STATION) && bss_conf->assoc) { 1476 common->curaid = bss_conf->aid; 1477 memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN); 1478 } 1479 } 1480 1481 static void ath9k_htc_choose_set_bssid(struct ath9k_htc_priv *priv) 1482 { 1483 if (priv->num_sta_assoc_vif == 1) { 1484 ieee80211_iterate_active_interfaces_atomic( 1485 priv->hw, IEEE80211_IFACE_ITER_RESUME_ALL, 1486 ath9k_htc_bss_iter, priv); 1487 ath9k_htc_set_bssid(priv); 1488 } 1489 } 1490 1491 static void ath9k_htc_bss_info_changed(struct ieee80211_hw *hw, 1492 struct ieee80211_vif *vif, 1493 struct ieee80211_bss_conf *bss_conf, 1494 u32 changed) 1495 { 1496 struct ath9k_htc_priv *priv = hw->priv; 1497 struct ath_hw *ah = priv->ah; 1498 struct ath_common *common = ath9k_hw_common(ah); 1499 1500 mutex_lock(&priv->mutex); 1501 ath9k_htc_ps_wakeup(priv); 1502 1503 if (changed & BSS_CHANGED_ASSOC) { 1504 ath_dbg(common, CONFIG, "BSS Changed ASSOC %d\n", 1505 bss_conf->assoc); 1506 1507 bss_conf->assoc ? 1508 priv->num_sta_assoc_vif++ : priv->num_sta_assoc_vif--; 1509 1510 if (priv->ah->opmode == NL80211_IFTYPE_STATION) { 1511 ath9k_htc_choose_set_bssid(priv); 1512 if (bss_conf->assoc && (priv->num_sta_assoc_vif == 1)) 1513 ath9k_htc_start_ani(priv); 1514 else if (priv->num_sta_assoc_vif == 0) 1515 ath9k_htc_stop_ani(priv); 1516 } 1517 } 1518 1519 if (changed & BSS_CHANGED_IBSS) { 1520 if (priv->ah->opmode == NL80211_IFTYPE_ADHOC) { 1521 common->curaid = bss_conf->aid; 1522 memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN); 1523 ath9k_htc_set_bssid(priv); 1524 } 1525 } 1526 1527 if ((changed & BSS_CHANGED_BEACON_ENABLED) && bss_conf->enable_beacon) { 1528 ath_dbg(common, CONFIG, "Beacon enabled for BSS: %pM\n", 1529 bss_conf->bssid); 1530 ath9k_htc_set_tsfadjust(priv, vif); 1531 set_bit(OP_ENABLE_BEACON, &priv->op_flags); 1532 ath9k_htc_beacon_config(priv, vif); 1533 } 1534 1535 if ((changed & BSS_CHANGED_BEACON_ENABLED) && !bss_conf->enable_beacon) { 1536 /* 1537 * Disable SWBA interrupt only if there are no 1538 * concurrent AP/mesh or IBSS interfaces. 1539 */ 1540 if ((priv->num_ap_vif + priv->num_mbss_vif <= 1) || 1541 priv->num_ibss_vif) { 1542 ath_dbg(common, CONFIG, 1543 "Beacon disabled for BSS: %pM\n", 1544 bss_conf->bssid); 1545 clear_bit(OP_ENABLE_BEACON, &priv->op_flags); 1546 ath9k_htc_beacon_config(priv, vif); 1547 } 1548 } 1549 1550 if (changed & BSS_CHANGED_BEACON_INT) { 1551 /* 1552 * Reset the HW TSF for the first AP or mesh interface. 1553 */ 1554 if (priv->nvifs == 1 && 1555 ((priv->ah->opmode == NL80211_IFTYPE_AP && 1556 vif->type == NL80211_IFTYPE_AP && 1557 priv->num_ap_vif == 1) || 1558 (priv->ah->opmode == NL80211_IFTYPE_MESH_POINT && 1559 vif->type == NL80211_IFTYPE_MESH_POINT && 1560 priv->num_mbss_vif == 1))) { 1561 set_bit(OP_TSF_RESET, &priv->op_flags); 1562 } 1563 ath_dbg(common, CONFIG, 1564 "Beacon interval changed for BSS: %pM\n", 1565 bss_conf->bssid); 1566 ath9k_htc_beacon_config(priv, vif); 1567 } 1568 1569 if (changed & BSS_CHANGED_ERP_SLOT) { 1570 if (bss_conf->use_short_slot) 1571 ah->slottime = 9; 1572 else 1573 ah->slottime = 20; 1574 1575 ath9k_hw_init_global_settings(ah); 1576 } 1577 1578 if (changed & BSS_CHANGED_HT) 1579 ath9k_htc_update_rate(priv, vif, bss_conf); 1580 1581 ath9k_htc_ps_restore(priv); 1582 mutex_unlock(&priv->mutex); 1583 } 1584 1585 static u64 ath9k_htc_get_tsf(struct ieee80211_hw *hw, 1586 struct ieee80211_vif *vif) 1587 { 1588 struct ath9k_htc_priv *priv = hw->priv; 1589 u64 tsf; 1590 1591 mutex_lock(&priv->mutex); 1592 ath9k_htc_ps_wakeup(priv); 1593 tsf = ath9k_hw_gettsf64(priv->ah); 1594 ath9k_htc_ps_restore(priv); 1595 mutex_unlock(&priv->mutex); 1596 1597 return tsf; 1598 } 1599 1600 static void ath9k_htc_set_tsf(struct ieee80211_hw *hw, 1601 struct ieee80211_vif *vif, u64 tsf) 1602 { 1603 struct ath9k_htc_priv *priv = hw->priv; 1604 1605 mutex_lock(&priv->mutex); 1606 ath9k_htc_ps_wakeup(priv); 1607 ath9k_hw_settsf64(priv->ah, tsf); 1608 ath9k_htc_ps_restore(priv); 1609 mutex_unlock(&priv->mutex); 1610 } 1611 1612 static void ath9k_htc_reset_tsf(struct ieee80211_hw *hw, 1613 struct ieee80211_vif *vif) 1614 { 1615 struct ath9k_htc_priv *priv = hw->priv; 1616 1617 mutex_lock(&priv->mutex); 1618 ath9k_htc_ps_wakeup(priv); 1619 ath9k_hw_reset_tsf(priv->ah); 1620 ath9k_htc_ps_restore(priv); 1621 mutex_unlock(&priv->mutex); 1622 } 1623 1624 static int ath9k_htc_ampdu_action(struct ieee80211_hw *hw, 1625 struct ieee80211_vif *vif, 1626 enum ieee80211_ampdu_mlme_action action, 1627 struct ieee80211_sta *sta, 1628 u16 tid, u16 *ssn, u8 buf_size) 1629 { 1630 struct ath9k_htc_priv *priv = hw->priv; 1631 struct ath9k_htc_sta *ista; 1632 int ret = 0; 1633 1634 mutex_lock(&priv->mutex); 1635 ath9k_htc_ps_wakeup(priv); 1636 1637 switch (action) { 1638 case IEEE80211_AMPDU_RX_START: 1639 break; 1640 case IEEE80211_AMPDU_RX_STOP: 1641 break; 1642 case IEEE80211_AMPDU_TX_START: 1643 ret = ath9k_htc_tx_aggr_oper(priv, vif, sta, action, tid); 1644 if (!ret) 1645 ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid); 1646 break; 1647 case IEEE80211_AMPDU_TX_STOP_CONT: 1648 case IEEE80211_AMPDU_TX_STOP_FLUSH: 1649 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT: 1650 ath9k_htc_tx_aggr_oper(priv, vif, sta, action, tid); 1651 ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid); 1652 break; 1653 case IEEE80211_AMPDU_TX_OPERATIONAL: 1654 ista = (struct ath9k_htc_sta *) sta->drv_priv; 1655 spin_lock_bh(&priv->tx.tx_lock); 1656 ista->tid_state[tid] = AGGR_OPERATIONAL; 1657 spin_unlock_bh(&priv->tx.tx_lock); 1658 break; 1659 default: 1660 ath_err(ath9k_hw_common(priv->ah), "Unknown AMPDU action\n"); 1661 } 1662 1663 ath9k_htc_ps_restore(priv); 1664 mutex_unlock(&priv->mutex); 1665 1666 return ret; 1667 } 1668 1669 static void ath9k_htc_sw_scan_start(struct ieee80211_hw *hw) 1670 { 1671 struct ath9k_htc_priv *priv = hw->priv; 1672 1673 mutex_lock(&priv->mutex); 1674 spin_lock_bh(&priv->beacon_lock); 1675 set_bit(OP_SCANNING, &priv->op_flags); 1676 spin_unlock_bh(&priv->beacon_lock); 1677 cancel_work_sync(&priv->ps_work); 1678 ath9k_htc_stop_ani(priv); 1679 mutex_unlock(&priv->mutex); 1680 } 1681 1682 static void ath9k_htc_sw_scan_complete(struct ieee80211_hw *hw) 1683 { 1684 struct ath9k_htc_priv *priv = hw->priv; 1685 1686 mutex_lock(&priv->mutex); 1687 spin_lock_bh(&priv->beacon_lock); 1688 clear_bit(OP_SCANNING, &priv->op_flags); 1689 spin_unlock_bh(&priv->beacon_lock); 1690 ath9k_htc_ps_wakeup(priv); 1691 ath9k_htc_vif_reconfig(priv); 1692 ath9k_htc_ps_restore(priv); 1693 mutex_unlock(&priv->mutex); 1694 } 1695 1696 static int ath9k_htc_set_rts_threshold(struct ieee80211_hw *hw, u32 value) 1697 { 1698 return 0; 1699 } 1700 1701 static void ath9k_htc_set_coverage_class(struct ieee80211_hw *hw, 1702 u8 coverage_class) 1703 { 1704 struct ath9k_htc_priv *priv = hw->priv; 1705 1706 mutex_lock(&priv->mutex); 1707 ath9k_htc_ps_wakeup(priv); 1708 priv->ah->coverage_class = coverage_class; 1709 ath9k_hw_init_global_settings(priv->ah); 1710 ath9k_htc_ps_restore(priv); 1711 mutex_unlock(&priv->mutex); 1712 } 1713 1714 /* 1715 * Currently, this is used only for selecting the minimum rate 1716 * for management frames, rate selection for data frames remain 1717 * unaffected. 1718 */ 1719 static int ath9k_htc_set_bitrate_mask(struct ieee80211_hw *hw, 1720 struct ieee80211_vif *vif, 1721 const struct cfg80211_bitrate_mask *mask) 1722 { 1723 struct ath9k_htc_priv *priv = hw->priv; 1724 struct ath_common *common = ath9k_hw_common(priv->ah); 1725 struct ath9k_htc_target_rate_mask tmask; 1726 struct ath9k_htc_vif *avp = (void *)vif->drv_priv; 1727 int ret = 0; 1728 u8 cmd_rsp; 1729 1730 memset(&tmask, 0, sizeof(struct ath9k_htc_target_rate_mask)); 1731 1732 tmask.vif_index = avp->index; 1733 tmask.band = IEEE80211_BAND_2GHZ; 1734 tmask.mask = cpu_to_be32(mask->control[IEEE80211_BAND_2GHZ].legacy); 1735 1736 WMI_CMD_BUF(WMI_BITRATE_MASK_CMDID, &tmask); 1737 if (ret) { 1738 ath_err(common, 1739 "Unable to set 2G rate mask for " 1740 "interface at idx: %d\n", avp->index); 1741 goto out; 1742 } 1743 1744 tmask.band = IEEE80211_BAND_5GHZ; 1745 tmask.mask = cpu_to_be32(mask->control[IEEE80211_BAND_5GHZ].legacy); 1746 1747 WMI_CMD_BUF(WMI_BITRATE_MASK_CMDID, &tmask); 1748 if (ret) { 1749 ath_err(common, 1750 "Unable to set 5G rate mask for " 1751 "interface at idx: %d\n", avp->index); 1752 goto out; 1753 } 1754 1755 ath_dbg(common, CONFIG, "Set bitrate masks: 0x%x, 0x%x\n", 1756 mask->control[IEEE80211_BAND_2GHZ].legacy, 1757 mask->control[IEEE80211_BAND_5GHZ].legacy); 1758 out: 1759 return ret; 1760 } 1761 1762 1763 static int ath9k_htc_get_stats(struct ieee80211_hw *hw, 1764 struct ieee80211_low_level_stats *stats) 1765 { 1766 struct ath9k_htc_priv *priv = hw->priv; 1767 struct ath_hw *ah = priv->ah; 1768 struct ath9k_mib_stats *mib_stats = &ah->ah_mibStats; 1769 1770 stats->dot11ACKFailureCount = mib_stats->ackrcv_bad; 1771 stats->dot11RTSFailureCount = mib_stats->rts_bad; 1772 stats->dot11FCSErrorCount = mib_stats->fcs_bad; 1773 stats->dot11RTSSuccessCount = mib_stats->rts_good; 1774 1775 return 0; 1776 } 1777 1778 struct base_eep_header *ath9k_htc_get_eeprom_base(struct ath9k_htc_priv *priv) 1779 { 1780 struct base_eep_header *pBase = NULL; 1781 /* 1782 * This can be done since all the 3 EEPROM families have the 1783 * same base header upto a certain point, and we are interested in 1784 * the data only upto that point. 1785 */ 1786 1787 if (AR_SREV_9271(priv->ah)) 1788 pBase = (struct base_eep_header *) 1789 &priv->ah->eeprom.map4k.baseEepHeader; 1790 else if (priv->ah->hw_version.usbdev == AR9280_USB) 1791 pBase = (struct base_eep_header *) 1792 &priv->ah->eeprom.def.baseEepHeader; 1793 else if (priv->ah->hw_version.usbdev == AR9287_USB) 1794 pBase = (struct base_eep_header *) 1795 &priv->ah->eeprom.map9287.baseEepHeader; 1796 return pBase; 1797 } 1798 1799 1800 static int ath9k_htc_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, 1801 u32 *rx_ant) 1802 { 1803 struct ath9k_htc_priv *priv = hw->priv; 1804 struct base_eep_header *pBase = ath9k_htc_get_eeprom_base(priv); 1805 if (pBase) { 1806 *tx_ant = pBase->txMask; 1807 *rx_ant = pBase->rxMask; 1808 } else { 1809 *tx_ant = 0; 1810 *rx_ant = 0; 1811 } 1812 return 0; 1813 } 1814 1815 struct ieee80211_ops ath9k_htc_ops = { 1816 .tx = ath9k_htc_tx, 1817 .start = ath9k_htc_start, 1818 .stop = ath9k_htc_stop, 1819 .add_interface = ath9k_htc_add_interface, 1820 .remove_interface = ath9k_htc_remove_interface, 1821 .config = ath9k_htc_config, 1822 .configure_filter = ath9k_htc_configure_filter, 1823 .sta_add = ath9k_htc_sta_add, 1824 .sta_remove = ath9k_htc_sta_remove, 1825 .conf_tx = ath9k_htc_conf_tx, 1826 .sta_rc_update = ath9k_htc_sta_rc_update, 1827 .bss_info_changed = ath9k_htc_bss_info_changed, 1828 .set_key = ath9k_htc_set_key, 1829 .get_tsf = ath9k_htc_get_tsf, 1830 .set_tsf = ath9k_htc_set_tsf, 1831 .reset_tsf = ath9k_htc_reset_tsf, 1832 .ampdu_action = ath9k_htc_ampdu_action, 1833 .sw_scan_start = ath9k_htc_sw_scan_start, 1834 .sw_scan_complete = ath9k_htc_sw_scan_complete, 1835 .set_rts_threshold = ath9k_htc_set_rts_threshold, 1836 .rfkill_poll = ath9k_htc_rfkill_poll_state, 1837 .set_coverage_class = ath9k_htc_set_coverage_class, 1838 .set_bitrate_mask = ath9k_htc_set_bitrate_mask, 1839 .get_stats = ath9k_htc_get_stats, 1840 .get_antenna = ath9k_htc_get_antenna, 1841 1842 #ifdef CONFIG_ATH9K_HTC_DEBUGFS 1843 .get_et_sset_count = ath9k_htc_get_et_sset_count, 1844 .get_et_stats = ath9k_htc_get_et_stats, 1845 .get_et_strings = ath9k_htc_get_et_strings, 1846 #endif 1847 }; 1848