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 enum htc_phymode mode; 28 29 mode = -EINVAL; 30 31 switch (ichan->chanmode) { 32 case CHANNEL_G: 33 case CHANNEL_G_HT20: 34 case CHANNEL_G_HT40PLUS: 35 case CHANNEL_G_HT40MINUS: 36 mode = HTC_MODE_11NG; 37 break; 38 case CHANNEL_A: 39 case CHANNEL_A_HT20: 40 case CHANNEL_A_HT40PLUS: 41 case CHANNEL_A_HT40MINUS: 42 mode = HTC_MODE_11NA; 43 break; 44 default: 45 break; 46 } 47 48 WARN_ON(mode < 0); 49 50 return mode; 51 } 52 53 bool ath9k_htc_setpower(struct ath9k_htc_priv *priv, 54 enum ath9k_power_mode mode) 55 { 56 bool ret; 57 58 mutex_lock(&priv->htc_pm_lock); 59 ret = ath9k_hw_setpower(priv->ah, mode); 60 mutex_unlock(&priv->htc_pm_lock); 61 62 return ret; 63 } 64 65 void ath9k_htc_ps_wakeup(struct ath9k_htc_priv *priv) 66 { 67 mutex_lock(&priv->htc_pm_lock); 68 if (++priv->ps_usecount != 1) 69 goto unlock; 70 ath9k_hw_setpower(priv->ah, ATH9K_PM_AWAKE); 71 72 unlock: 73 mutex_unlock(&priv->htc_pm_lock); 74 } 75 76 void ath9k_htc_ps_restore(struct ath9k_htc_priv *priv) 77 { 78 mutex_lock(&priv->htc_pm_lock); 79 if (--priv->ps_usecount != 0) 80 goto unlock; 81 82 if (priv->ps_idle) 83 ath9k_hw_setpower(priv->ah, ATH9K_PM_FULL_SLEEP); 84 else if (priv->ps_enabled) 85 ath9k_hw_setpower(priv->ah, ATH9K_PM_NETWORK_SLEEP); 86 87 unlock: 88 mutex_unlock(&priv->htc_pm_lock); 89 } 90 91 void ath9k_ps_work(struct work_struct *work) 92 { 93 struct ath9k_htc_priv *priv = 94 container_of(work, struct ath9k_htc_priv, 95 ps_work); 96 ath9k_htc_setpower(priv, ATH9K_PM_AWAKE); 97 98 /* The chip wakes up after receiving the first beacon 99 while network sleep is enabled. For the driver to 100 be in sync with the hw, set the chip to awake and 101 only then set it to sleep. 102 */ 103 ath9k_htc_setpower(priv, ATH9K_PM_NETWORK_SLEEP); 104 } 105 106 static void ath9k_htc_vif_iter(void *data, u8 *mac, struct ieee80211_vif *vif) 107 { 108 struct ath9k_htc_priv *priv = data; 109 struct ieee80211_bss_conf *bss_conf = &vif->bss_conf; 110 111 if ((vif->type == NL80211_IFTYPE_AP) && bss_conf->enable_beacon) 112 priv->reconfig_beacon = true; 113 114 if (bss_conf->assoc) { 115 priv->rearm_ani = true; 116 priv->reconfig_beacon = true; 117 } 118 } 119 120 static void ath9k_htc_vif_reconfig(struct ath9k_htc_priv *priv) 121 { 122 priv->rearm_ani = false; 123 priv->reconfig_beacon = false; 124 125 ieee80211_iterate_active_interfaces_atomic(priv->hw, 126 ath9k_htc_vif_iter, priv); 127 if (priv->rearm_ani) 128 ath9k_htc_start_ani(priv); 129 130 if (priv->reconfig_beacon) { 131 ath9k_htc_ps_wakeup(priv); 132 ath9k_htc_beacon_reconfig(priv); 133 ath9k_htc_ps_restore(priv); 134 } 135 } 136 137 static void ath9k_htc_bssid_iter(void *data, u8 *mac, struct ieee80211_vif *vif) 138 { 139 struct ath9k_vif_iter_data *iter_data = data; 140 int i; 141 142 for (i = 0; i < ETH_ALEN; i++) 143 iter_data->mask[i] &= ~(iter_data->hw_macaddr[i] ^ mac[i]); 144 } 145 146 static void ath9k_htc_set_bssid_mask(struct ath9k_htc_priv *priv, 147 struct ieee80211_vif *vif) 148 { 149 struct ath_common *common = ath9k_hw_common(priv->ah); 150 struct ath9k_vif_iter_data iter_data; 151 152 /* 153 * Use the hardware MAC address as reference, the hardware uses it 154 * together with the BSSID mask when matching addresses. 155 */ 156 iter_data.hw_macaddr = common->macaddr; 157 memset(&iter_data.mask, 0xff, ETH_ALEN); 158 159 if (vif) 160 ath9k_htc_bssid_iter(&iter_data, vif->addr, vif); 161 162 /* Get list of all active MAC addresses */ 163 ieee80211_iterate_active_interfaces_atomic(priv->hw, ath9k_htc_bssid_iter, 164 &iter_data); 165 166 memcpy(common->bssidmask, iter_data.mask, ETH_ALEN); 167 ath_hw_setbssidmask(common); 168 } 169 170 static void ath9k_htc_set_opmode(struct ath9k_htc_priv *priv) 171 { 172 if (priv->num_ibss_vif) 173 priv->ah->opmode = NL80211_IFTYPE_ADHOC; 174 else if (priv->num_ap_vif) 175 priv->ah->opmode = NL80211_IFTYPE_AP; 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.channel; 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.channel; 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 (priv->op_flags & OP_INVALID) 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, ATH_DBG_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 (!(priv->op_flags & OP_SCANNING) && 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, ATH_DBG_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, ATH_DBG_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, ATH_DBG_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 tsta.is_vif_sta = 0; 488 ista->index = sta_idx; 489 } else { 490 memcpy(&tsta.macaddr, vif->addr, ETH_ALEN); 491 tsta.is_vif_sta = 1; 492 } 493 494 tsta.sta_index = sta_idx; 495 tsta.vif_index = avp->index; 496 497 if (!sta) { 498 tsta.maxampdu = cpu_to_be16(0xffff); 499 } else { 500 maxampdu = 1 << (IEEE80211_HT_MAX_AMPDU_FACTOR + 501 sta->ht_cap.ampdu_factor); 502 tsta.maxampdu = cpu_to_be16(maxampdu); 503 } 504 505 WMI_CMD_BUF(WMI_NODE_CREATE_CMDID, &tsta); 506 if (ret) { 507 if (sta) 508 ath_err(common, 509 "Unable to add station entry for: %pM\n", 510 sta->addr); 511 return ret; 512 } 513 514 if (sta) { 515 ath_dbg(common, ATH_DBG_CONFIG, 516 "Added a station entry for: %pM (idx: %d)\n", 517 sta->addr, tsta.sta_index); 518 } else { 519 ath_dbg(common, ATH_DBG_CONFIG, 520 "Added a station entry for VIF %d (idx: %d)\n", 521 avp->index, tsta.sta_index); 522 } 523 524 priv->sta_slot |= (1 << sta_idx); 525 priv->nstations++; 526 if (!sta) 527 priv->vif_sta_pos[avp->index] = sta_idx; 528 529 return 0; 530 } 531 532 static int ath9k_htc_remove_station(struct ath9k_htc_priv *priv, 533 struct ieee80211_vif *vif, 534 struct ieee80211_sta *sta) 535 { 536 struct ath_common *common = ath9k_hw_common(priv->ah); 537 struct ath9k_htc_vif *avp = (struct ath9k_htc_vif *) vif->drv_priv; 538 struct ath9k_htc_sta *ista; 539 int ret; 540 u8 cmd_rsp, sta_idx; 541 542 if (sta) { 543 ista = (struct ath9k_htc_sta *) sta->drv_priv; 544 sta_idx = ista->index; 545 } else { 546 sta_idx = priv->vif_sta_pos[avp->index]; 547 } 548 549 WMI_CMD_BUF(WMI_NODE_REMOVE_CMDID, &sta_idx); 550 if (ret) { 551 if (sta) 552 ath_err(common, 553 "Unable to remove station entry for: %pM\n", 554 sta->addr); 555 return ret; 556 } 557 558 if (sta) { 559 ath_dbg(common, ATH_DBG_CONFIG, 560 "Removed a station entry for: %pM (idx: %d)\n", 561 sta->addr, sta_idx); 562 } else { 563 ath_dbg(common, ATH_DBG_CONFIG, 564 "Removed a station entry for VIF %d (idx: %d)\n", 565 avp->index, sta_idx); 566 } 567 568 priv->sta_slot &= ~(1 << sta_idx); 569 priv->nstations--; 570 571 return 0; 572 } 573 574 int ath9k_htc_update_cap_target(struct ath9k_htc_priv *priv, 575 u8 enable_coex) 576 { 577 struct ath9k_htc_cap_target tcap; 578 int ret; 579 u8 cmd_rsp; 580 581 memset(&tcap, 0, sizeof(struct ath9k_htc_cap_target)); 582 583 tcap.ampdu_limit = cpu_to_be32(0xffff); 584 tcap.ampdu_subframes = 0xff; 585 tcap.enable_coex = enable_coex; 586 tcap.tx_chainmask = priv->ah->caps.tx_chainmask; 587 588 WMI_CMD_BUF(WMI_TARGET_IC_UPDATE_CMDID, &tcap); 589 590 return ret; 591 } 592 593 static void ath9k_htc_setup_rate(struct ath9k_htc_priv *priv, 594 struct ieee80211_sta *sta, 595 struct ath9k_htc_target_rate *trate) 596 { 597 struct ath9k_htc_sta *ista = (struct ath9k_htc_sta *) sta->drv_priv; 598 struct ieee80211_supported_band *sband; 599 u32 caps = 0; 600 int i, j; 601 602 sband = priv->hw->wiphy->bands[priv->hw->conf.channel->band]; 603 604 for (i = 0, j = 0; i < sband->n_bitrates; i++) { 605 if (sta->supp_rates[sband->band] & BIT(i)) { 606 trate->rates.legacy_rates.rs_rates[j] 607 = (sband->bitrates[i].bitrate * 2) / 10; 608 j++; 609 } 610 } 611 trate->rates.legacy_rates.rs_nrates = j; 612 613 if (sta->ht_cap.ht_supported) { 614 for (i = 0, j = 0; i < 77; i++) { 615 if (sta->ht_cap.mcs.rx_mask[i/8] & (1<<(i%8))) 616 trate->rates.ht_rates.rs_rates[j++] = i; 617 if (j == ATH_HTC_RATE_MAX) 618 break; 619 } 620 trate->rates.ht_rates.rs_nrates = j; 621 622 caps = WLAN_RC_HT_FLAG; 623 if (sta->ht_cap.mcs.rx_mask[1]) 624 caps |= WLAN_RC_DS_FLAG; 625 if ((sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) && 626 (conf_is_ht40(&priv->hw->conf))) 627 caps |= WLAN_RC_40_FLAG; 628 if (conf_is_ht40(&priv->hw->conf) && 629 (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40)) 630 caps |= WLAN_RC_SGI_FLAG; 631 else if (conf_is_ht20(&priv->hw->conf) && 632 (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20)) 633 caps |= WLAN_RC_SGI_FLAG; 634 } 635 636 trate->sta_index = ista->index; 637 trate->isnew = 1; 638 trate->capflags = cpu_to_be32(caps); 639 } 640 641 static int ath9k_htc_send_rate_cmd(struct ath9k_htc_priv *priv, 642 struct ath9k_htc_target_rate *trate) 643 { 644 struct ath_common *common = ath9k_hw_common(priv->ah); 645 int ret; 646 u8 cmd_rsp; 647 648 WMI_CMD_BUF(WMI_RC_RATE_UPDATE_CMDID, trate); 649 if (ret) { 650 ath_err(common, 651 "Unable to initialize Rate information on target\n"); 652 } 653 654 return ret; 655 } 656 657 static void ath9k_htc_init_rate(struct ath9k_htc_priv *priv, 658 struct ieee80211_sta *sta) 659 { 660 struct ath_common *common = ath9k_hw_common(priv->ah); 661 struct ath9k_htc_target_rate trate; 662 int ret; 663 664 memset(&trate, 0, sizeof(struct ath9k_htc_target_rate)); 665 ath9k_htc_setup_rate(priv, sta, &trate); 666 ret = ath9k_htc_send_rate_cmd(priv, &trate); 667 if (!ret) 668 ath_dbg(common, ATH_DBG_CONFIG, 669 "Updated target sta: %pM, rate caps: 0x%X\n", 670 sta->addr, be32_to_cpu(trate.capflags)); 671 } 672 673 static void ath9k_htc_update_rate(struct ath9k_htc_priv *priv, 674 struct ieee80211_vif *vif, 675 struct ieee80211_bss_conf *bss_conf) 676 { 677 struct ath_common *common = ath9k_hw_common(priv->ah); 678 struct ath9k_htc_target_rate trate; 679 struct ieee80211_sta *sta; 680 int ret; 681 682 memset(&trate, 0, sizeof(struct ath9k_htc_target_rate)); 683 684 rcu_read_lock(); 685 sta = ieee80211_find_sta(vif, bss_conf->bssid); 686 if (!sta) { 687 rcu_read_unlock(); 688 return; 689 } 690 ath9k_htc_setup_rate(priv, sta, &trate); 691 rcu_read_unlock(); 692 693 ret = ath9k_htc_send_rate_cmd(priv, &trate); 694 if (!ret) 695 ath_dbg(common, ATH_DBG_CONFIG, 696 "Updated target sta: %pM, rate caps: 0x%X\n", 697 bss_conf->bssid, be32_to_cpu(trate.capflags)); 698 } 699 700 static int ath9k_htc_tx_aggr_oper(struct ath9k_htc_priv *priv, 701 struct ieee80211_vif *vif, 702 struct ieee80211_sta *sta, 703 enum ieee80211_ampdu_mlme_action action, 704 u16 tid) 705 { 706 struct ath_common *common = ath9k_hw_common(priv->ah); 707 struct ath9k_htc_target_aggr aggr; 708 struct ath9k_htc_sta *ista; 709 int ret = 0; 710 u8 cmd_rsp; 711 712 if (tid >= ATH9K_HTC_MAX_TID) 713 return -EINVAL; 714 715 memset(&aggr, 0, sizeof(struct ath9k_htc_target_aggr)); 716 ista = (struct ath9k_htc_sta *) sta->drv_priv; 717 718 aggr.sta_index = ista->index; 719 aggr.tidno = tid & 0xf; 720 aggr.aggr_enable = (action == IEEE80211_AMPDU_TX_START) ? true : false; 721 722 WMI_CMD_BUF(WMI_TX_AGGR_ENABLE_CMDID, &aggr); 723 if (ret) 724 ath_dbg(common, ATH_DBG_CONFIG, 725 "Unable to %s TX aggregation for (%pM, %d)\n", 726 (aggr.aggr_enable) ? "start" : "stop", sta->addr, tid); 727 else 728 ath_dbg(common, ATH_DBG_CONFIG, 729 "%s TX aggregation for (%pM, %d)\n", 730 (aggr.aggr_enable) ? "Starting" : "Stopping", 731 sta->addr, tid); 732 733 spin_lock_bh(&priv->tx.tx_lock); 734 ista->tid_state[tid] = (aggr.aggr_enable && !ret) ? AGGR_START : AGGR_STOP; 735 spin_unlock_bh(&priv->tx.tx_lock); 736 737 return ret; 738 } 739 740 /*******/ 741 /* ANI */ 742 /*******/ 743 744 void ath9k_htc_start_ani(struct ath9k_htc_priv *priv) 745 { 746 struct ath_common *common = ath9k_hw_common(priv->ah); 747 unsigned long timestamp = jiffies_to_msecs(jiffies); 748 749 common->ani.longcal_timer = timestamp; 750 common->ani.shortcal_timer = timestamp; 751 common->ani.checkani_timer = timestamp; 752 753 priv->op_flags |= OP_ANI_RUNNING; 754 755 ieee80211_queue_delayed_work(common->hw, &priv->ani_work, 756 msecs_to_jiffies(ATH_ANI_POLLINTERVAL)); 757 } 758 759 void ath9k_htc_stop_ani(struct ath9k_htc_priv *priv) 760 { 761 cancel_delayed_work_sync(&priv->ani_work); 762 priv->op_flags &= ~OP_ANI_RUNNING; 763 } 764 765 void ath9k_htc_ani_work(struct work_struct *work) 766 { 767 struct ath9k_htc_priv *priv = 768 container_of(work, struct ath9k_htc_priv, ani_work.work); 769 struct ath_hw *ah = priv->ah; 770 struct ath_common *common = ath9k_hw_common(ah); 771 bool longcal = false; 772 bool shortcal = false; 773 bool aniflag = false; 774 unsigned int timestamp = jiffies_to_msecs(jiffies); 775 u32 cal_interval, short_cal_interval; 776 777 short_cal_interval = (ah->opmode == NL80211_IFTYPE_AP) ? 778 ATH_AP_SHORT_CALINTERVAL : ATH_STA_SHORT_CALINTERVAL; 779 780 /* Only calibrate if awake */ 781 if (ah->power_mode != ATH9K_PM_AWAKE) 782 goto set_timer; 783 784 /* Long calibration runs independently of short calibration. */ 785 if ((timestamp - common->ani.longcal_timer) >= ATH_LONG_CALINTERVAL) { 786 longcal = true; 787 ath_dbg(common, ATH_DBG_ANI, "longcal @%lu\n", jiffies); 788 common->ani.longcal_timer = timestamp; 789 } 790 791 /* Short calibration applies only while caldone is false */ 792 if (!common->ani.caldone) { 793 if ((timestamp - common->ani.shortcal_timer) >= 794 short_cal_interval) { 795 shortcal = true; 796 ath_dbg(common, ATH_DBG_ANI, 797 "shortcal @%lu\n", jiffies); 798 common->ani.shortcal_timer = timestamp; 799 common->ani.resetcal_timer = timestamp; 800 } 801 } else { 802 if ((timestamp - common->ani.resetcal_timer) >= 803 ATH_RESTART_CALINTERVAL) { 804 common->ani.caldone = ath9k_hw_reset_calvalid(ah); 805 if (common->ani.caldone) 806 common->ani.resetcal_timer = timestamp; 807 } 808 } 809 810 /* Verify whether we must check ANI */ 811 if ((timestamp - common->ani.checkani_timer) >= ATH_ANI_POLLINTERVAL) { 812 aniflag = true; 813 common->ani.checkani_timer = timestamp; 814 } 815 816 /* Skip all processing if there's nothing to do. */ 817 if (longcal || shortcal || aniflag) { 818 819 ath9k_htc_ps_wakeup(priv); 820 821 /* Call ANI routine if necessary */ 822 if (aniflag) 823 ath9k_hw_ani_monitor(ah, ah->curchan); 824 825 /* Perform calibration if necessary */ 826 if (longcal || shortcal) 827 common->ani.caldone = 828 ath9k_hw_calibrate(ah, ah->curchan, 829 ah->rxchainmask, longcal); 830 831 ath9k_htc_ps_restore(priv); 832 } 833 834 set_timer: 835 /* 836 * Set timer interval based on previous results. 837 * The interval must be the shortest necessary to satisfy ANI, 838 * short calibration and long calibration. 839 */ 840 cal_interval = ATH_LONG_CALINTERVAL; 841 if (priv->ah->config.enable_ani) 842 cal_interval = min(cal_interval, (u32)ATH_ANI_POLLINTERVAL); 843 if (!common->ani.caldone) 844 cal_interval = min(cal_interval, (u32)short_cal_interval); 845 846 ieee80211_queue_delayed_work(common->hw, &priv->ani_work, 847 msecs_to_jiffies(cal_interval)); 848 } 849 850 /**********************/ 851 /* mac80211 Callbacks */ 852 /**********************/ 853 854 static void ath9k_htc_tx(struct ieee80211_hw *hw, struct sk_buff *skb) 855 { 856 struct ieee80211_hdr *hdr; 857 struct ath9k_htc_priv *priv = hw->priv; 858 struct ath_common *common = ath9k_hw_common(priv->ah); 859 int padpos, padsize, ret, slot; 860 861 hdr = (struct ieee80211_hdr *) skb->data; 862 863 /* Add the padding after the header if this is not already done */ 864 padpos = ath9k_cmn_padpos(hdr->frame_control); 865 padsize = padpos & 3; 866 if (padsize && skb->len > padpos) { 867 if (skb_headroom(skb) < padsize) { 868 ath_dbg(common, ATH_DBG_XMIT, "No room for padding\n"); 869 goto fail_tx; 870 } 871 skb_push(skb, padsize); 872 memmove(skb->data, skb->data + padsize, padpos); 873 } 874 875 slot = ath9k_htc_tx_get_slot(priv); 876 if (slot < 0) { 877 ath_dbg(common, ATH_DBG_XMIT, "No free TX slot\n"); 878 goto fail_tx; 879 } 880 881 ret = ath9k_htc_tx_start(priv, skb, slot, false); 882 if (ret != 0) { 883 ath_dbg(common, ATH_DBG_XMIT, "Tx failed\n"); 884 goto clear_slot; 885 } 886 887 ath9k_htc_check_stop_queues(priv); 888 889 return; 890 891 clear_slot: 892 ath9k_htc_tx_clear_slot(priv, slot); 893 fail_tx: 894 dev_kfree_skb_any(skb); 895 } 896 897 static int ath9k_htc_start(struct ieee80211_hw *hw) 898 { 899 struct ath9k_htc_priv *priv = hw->priv; 900 struct ath_hw *ah = priv->ah; 901 struct ath_common *common = ath9k_hw_common(ah); 902 struct ieee80211_channel *curchan = hw->conf.channel; 903 struct ath9k_channel *init_channel; 904 int ret = 0; 905 enum htc_phymode mode; 906 __be16 htc_mode; 907 u8 cmd_rsp; 908 909 mutex_lock(&priv->mutex); 910 911 ath_dbg(common, ATH_DBG_CONFIG, 912 "Starting driver with initial channel: %d MHz\n", 913 curchan->center_freq); 914 915 /* Ensure that HW is awake before flushing RX */ 916 ath9k_htc_setpower(priv, ATH9K_PM_AWAKE); 917 WMI_CMD(WMI_FLUSH_RECV_CMDID); 918 919 /* setup initial channel */ 920 init_channel = ath9k_cmn_get_curchannel(hw, ah); 921 922 ath9k_hw_htc_resetinit(ah); 923 ret = ath9k_hw_reset(ah, init_channel, ah->caldata, false); 924 if (ret) { 925 ath_err(common, 926 "Unable to reset hardware; reset status %d (freq %u MHz)\n", 927 ret, curchan->center_freq); 928 mutex_unlock(&priv->mutex); 929 return ret; 930 } 931 932 ath9k_cmn_update_txpow(ah, priv->curtxpow, priv->txpowlimit, 933 &priv->curtxpow); 934 935 mode = ath9k_htc_get_curmode(priv, init_channel); 936 htc_mode = cpu_to_be16(mode); 937 WMI_CMD_BUF(WMI_SET_MODE_CMDID, &htc_mode); 938 WMI_CMD(WMI_ATH_INIT_CMDID); 939 WMI_CMD(WMI_START_RECV_CMDID); 940 941 ath9k_host_rx_init(priv); 942 943 ret = ath9k_htc_update_cap_target(priv, 0); 944 if (ret) 945 ath_dbg(common, ATH_DBG_CONFIG, 946 "Failed to update capability in target\n"); 947 948 priv->op_flags &= ~OP_INVALID; 949 htc_start(priv->htc); 950 951 spin_lock_bh(&priv->tx.tx_lock); 952 priv->tx.flags &= ~ATH9K_HTC_OP_TX_QUEUES_STOP; 953 spin_unlock_bh(&priv->tx.tx_lock); 954 955 ieee80211_wake_queues(hw); 956 957 mod_timer(&priv->tx.cleanup_timer, 958 jiffies + msecs_to_jiffies(ATH9K_HTC_TX_CLEANUP_INTERVAL)); 959 960 if (ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE) { 961 ath9k_hw_btcoex_set_weight(ah, AR_BT_COEX_WGHT, 962 AR_STOMP_LOW_WLAN_WGHT); 963 ath9k_hw_btcoex_enable(ah); 964 ath_htc_resume_btcoex_work(priv); 965 } 966 mutex_unlock(&priv->mutex); 967 968 return ret; 969 } 970 971 static void ath9k_htc_stop(struct ieee80211_hw *hw) 972 { 973 struct ath9k_htc_priv *priv = hw->priv; 974 struct ath_hw *ah = priv->ah; 975 struct ath_common *common = ath9k_hw_common(ah); 976 int ret __attribute__ ((unused)); 977 u8 cmd_rsp; 978 979 mutex_lock(&priv->mutex); 980 981 if (priv->op_flags & OP_INVALID) { 982 ath_dbg(common, ATH_DBG_ANY, "Device not present\n"); 983 mutex_unlock(&priv->mutex); 984 return; 985 } 986 987 ath9k_htc_ps_wakeup(priv); 988 989 WMI_CMD(WMI_DISABLE_INTR_CMDID); 990 WMI_CMD(WMI_DRAIN_TXQ_ALL_CMDID); 991 WMI_CMD(WMI_STOP_RECV_CMDID); 992 993 tasklet_kill(&priv->rx_tasklet); 994 995 del_timer_sync(&priv->tx.cleanup_timer); 996 ath9k_htc_tx_drain(priv); 997 ath9k_wmi_event_drain(priv); 998 999 mutex_unlock(&priv->mutex); 1000 1001 /* Cancel all the running timers/work .. */ 1002 cancel_work_sync(&priv->fatal_work); 1003 cancel_work_sync(&priv->ps_work); 1004 1005 #ifdef CONFIG_MAC80211_LEDS 1006 cancel_work_sync(&priv->led_work); 1007 #endif 1008 ath9k_htc_stop_ani(priv); 1009 1010 mutex_lock(&priv->mutex); 1011 1012 if (ah->btcoex_hw.enabled) { 1013 ath9k_hw_btcoex_disable(ah); 1014 if (ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE) 1015 ath_htc_cancel_btcoex_work(priv); 1016 } 1017 1018 /* Remove a monitor interface if it's present. */ 1019 if (priv->ah->is_monitoring) 1020 ath9k_htc_remove_monitor_interface(priv); 1021 1022 ath9k_hw_phy_disable(ah); 1023 ath9k_hw_disable(ah); 1024 ath9k_htc_ps_restore(priv); 1025 ath9k_htc_setpower(priv, ATH9K_PM_FULL_SLEEP); 1026 1027 priv->op_flags |= OP_INVALID; 1028 1029 ath_dbg(common, ATH_DBG_CONFIG, "Driver halt\n"); 1030 mutex_unlock(&priv->mutex); 1031 } 1032 1033 static int ath9k_htc_add_interface(struct ieee80211_hw *hw, 1034 struct ieee80211_vif *vif) 1035 { 1036 struct ath9k_htc_priv *priv = hw->priv; 1037 struct ath9k_htc_vif *avp = (void *)vif->drv_priv; 1038 struct ath_common *common = ath9k_hw_common(priv->ah); 1039 struct ath9k_htc_target_vif hvif; 1040 int ret = 0; 1041 u8 cmd_rsp; 1042 1043 mutex_lock(&priv->mutex); 1044 1045 if (priv->nvifs >= ATH9K_HTC_MAX_VIF) { 1046 mutex_unlock(&priv->mutex); 1047 return -ENOBUFS; 1048 } 1049 1050 if (priv->num_ibss_vif || 1051 (priv->nvifs && vif->type == NL80211_IFTYPE_ADHOC)) { 1052 ath_err(common, "IBSS coexistence with other modes is not allowed\n"); 1053 mutex_unlock(&priv->mutex); 1054 return -ENOBUFS; 1055 } 1056 1057 if (((vif->type == NL80211_IFTYPE_AP) || 1058 (vif->type == NL80211_IFTYPE_ADHOC)) && 1059 ((priv->num_ap_vif + priv->num_ibss_vif) >= ATH9K_HTC_MAX_BCN_VIF)) { 1060 ath_err(common, "Max. number of beaconing interfaces reached\n"); 1061 mutex_unlock(&priv->mutex); 1062 return -ENOBUFS; 1063 } 1064 1065 ath9k_htc_ps_wakeup(priv); 1066 memset(&hvif, 0, sizeof(struct ath9k_htc_target_vif)); 1067 memcpy(&hvif.myaddr, vif->addr, ETH_ALEN); 1068 1069 switch (vif->type) { 1070 case NL80211_IFTYPE_STATION: 1071 hvif.opmode = HTC_M_STA; 1072 break; 1073 case NL80211_IFTYPE_ADHOC: 1074 hvif.opmode = HTC_M_IBSS; 1075 break; 1076 case NL80211_IFTYPE_AP: 1077 hvif.opmode = HTC_M_HOSTAP; 1078 break; 1079 default: 1080 ath_err(common, 1081 "Interface type %d not yet supported\n", vif->type); 1082 ret = -EOPNOTSUPP; 1083 goto out; 1084 } 1085 1086 /* Index starts from zero on the target */ 1087 avp->index = hvif.index = ffz(priv->vif_slot); 1088 hvif.rtsthreshold = cpu_to_be16(2304); 1089 WMI_CMD_BUF(WMI_VAP_CREATE_CMDID, &hvif); 1090 if (ret) 1091 goto out; 1092 1093 /* 1094 * We need a node in target to tx mgmt frames 1095 * before association. 1096 */ 1097 ret = ath9k_htc_add_station(priv, vif, NULL); 1098 if (ret) { 1099 WMI_CMD_BUF(WMI_VAP_REMOVE_CMDID, &hvif); 1100 goto out; 1101 } 1102 1103 ath9k_htc_set_bssid_mask(priv, vif); 1104 1105 priv->vif_slot |= (1 << avp->index); 1106 priv->nvifs++; 1107 1108 INC_VIF(priv, vif->type); 1109 1110 if ((vif->type == NL80211_IFTYPE_AP) || 1111 (vif->type == NL80211_IFTYPE_ADHOC)) 1112 ath9k_htc_assign_bslot(priv, vif); 1113 1114 ath9k_htc_set_opmode(priv); 1115 1116 if ((priv->ah->opmode == NL80211_IFTYPE_AP) && 1117 !(priv->op_flags & OP_ANI_RUNNING)) { 1118 ath9k_hw_set_tsfadjust(priv->ah, 1); 1119 ath9k_htc_start_ani(priv); 1120 } 1121 1122 ath_dbg(common, ATH_DBG_CONFIG, 1123 "Attach a VIF of type: %d at idx: %d\n", vif->type, avp->index); 1124 1125 out: 1126 ath9k_htc_ps_restore(priv); 1127 mutex_unlock(&priv->mutex); 1128 1129 return ret; 1130 } 1131 1132 static void ath9k_htc_remove_interface(struct ieee80211_hw *hw, 1133 struct ieee80211_vif *vif) 1134 { 1135 struct ath9k_htc_priv *priv = hw->priv; 1136 struct ath_common *common = ath9k_hw_common(priv->ah); 1137 struct ath9k_htc_vif *avp = (void *)vif->drv_priv; 1138 struct ath9k_htc_target_vif hvif; 1139 int ret = 0; 1140 u8 cmd_rsp; 1141 1142 mutex_lock(&priv->mutex); 1143 ath9k_htc_ps_wakeup(priv); 1144 1145 memset(&hvif, 0, sizeof(struct ath9k_htc_target_vif)); 1146 memcpy(&hvif.myaddr, vif->addr, ETH_ALEN); 1147 hvif.index = avp->index; 1148 WMI_CMD_BUF(WMI_VAP_REMOVE_CMDID, &hvif); 1149 if (ret) { 1150 ath_err(common, "Unable to remove interface at idx: %d\n", 1151 avp->index); 1152 } 1153 priv->nvifs--; 1154 priv->vif_slot &= ~(1 << avp->index); 1155 1156 ath9k_htc_remove_station(priv, vif, NULL); 1157 1158 DEC_VIF(priv, vif->type); 1159 1160 if ((vif->type == NL80211_IFTYPE_AP) || 1161 (vif->type == NL80211_IFTYPE_ADHOC)) 1162 ath9k_htc_remove_bslot(priv, vif); 1163 1164 ath9k_htc_set_opmode(priv); 1165 1166 ath9k_htc_set_bssid_mask(priv, vif); 1167 1168 /* 1169 * Stop ANI only if there are no associated station interfaces. 1170 */ 1171 if ((vif->type == NL80211_IFTYPE_AP) && (priv->num_ap_vif == 0)) { 1172 priv->rearm_ani = false; 1173 ieee80211_iterate_active_interfaces_atomic(priv->hw, 1174 ath9k_htc_vif_iter, priv); 1175 if (!priv->rearm_ani) 1176 ath9k_htc_stop_ani(priv); 1177 } 1178 1179 ath_dbg(common, ATH_DBG_CONFIG, "Detach Interface at idx: %d\n", avp->index); 1180 1181 ath9k_htc_ps_restore(priv); 1182 mutex_unlock(&priv->mutex); 1183 } 1184 1185 static int ath9k_htc_config(struct ieee80211_hw *hw, u32 changed) 1186 { 1187 struct ath9k_htc_priv *priv = hw->priv; 1188 struct ath_common *common = ath9k_hw_common(priv->ah); 1189 struct ieee80211_conf *conf = &hw->conf; 1190 1191 mutex_lock(&priv->mutex); 1192 1193 if (changed & IEEE80211_CONF_CHANGE_IDLE) { 1194 bool enable_radio = false; 1195 bool idle = !!(conf->flags & IEEE80211_CONF_IDLE); 1196 1197 mutex_lock(&priv->htc_pm_lock); 1198 if (!idle && priv->ps_idle) 1199 enable_radio = true; 1200 priv->ps_idle = idle; 1201 mutex_unlock(&priv->htc_pm_lock); 1202 1203 if (enable_radio) { 1204 ath_dbg(common, ATH_DBG_CONFIG, 1205 "not-idle: enabling radio\n"); 1206 ath9k_htc_setpower(priv, ATH9K_PM_AWAKE); 1207 ath9k_htc_radio_enable(hw); 1208 } 1209 } 1210 1211 /* 1212 * Monitor interface should be added before 1213 * IEEE80211_CONF_CHANGE_CHANNEL is handled. 1214 */ 1215 if (changed & IEEE80211_CONF_CHANGE_MONITOR) { 1216 if ((conf->flags & IEEE80211_CONF_MONITOR) && 1217 !priv->ah->is_monitoring) 1218 ath9k_htc_add_monitor_interface(priv); 1219 else if (priv->ah->is_monitoring) 1220 ath9k_htc_remove_monitor_interface(priv); 1221 } 1222 1223 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) { 1224 struct ieee80211_channel *curchan = hw->conf.channel; 1225 int pos = curchan->hw_value; 1226 1227 ath_dbg(common, ATH_DBG_CONFIG, "Set channel: %d MHz\n", 1228 curchan->center_freq); 1229 1230 ath9k_cmn_update_ichannel(&priv->ah->channels[pos], 1231 hw->conf.channel, 1232 hw->conf.channel_type); 1233 1234 if (ath9k_htc_set_channel(priv, hw, &priv->ah->channels[pos]) < 0) { 1235 ath_err(common, "Unable to set channel\n"); 1236 mutex_unlock(&priv->mutex); 1237 return -EINVAL; 1238 } 1239 1240 } 1241 1242 if (changed & IEEE80211_CONF_CHANGE_PS) { 1243 if (conf->flags & IEEE80211_CONF_PS) { 1244 ath9k_htc_setpower(priv, ATH9K_PM_NETWORK_SLEEP); 1245 priv->ps_enabled = true; 1246 } else { 1247 priv->ps_enabled = false; 1248 cancel_work_sync(&priv->ps_work); 1249 ath9k_htc_setpower(priv, ATH9K_PM_AWAKE); 1250 } 1251 } 1252 1253 if (changed & IEEE80211_CONF_CHANGE_POWER) { 1254 priv->txpowlimit = 2 * conf->power_level; 1255 ath9k_cmn_update_txpow(priv->ah, priv->curtxpow, 1256 priv->txpowlimit, &priv->curtxpow); 1257 } 1258 1259 if (changed & IEEE80211_CONF_CHANGE_IDLE) { 1260 mutex_lock(&priv->htc_pm_lock); 1261 if (!priv->ps_idle) { 1262 mutex_unlock(&priv->htc_pm_lock); 1263 goto out; 1264 } 1265 mutex_unlock(&priv->htc_pm_lock); 1266 1267 ath_dbg(common, ATH_DBG_CONFIG, 1268 "idle: disabling radio\n"); 1269 ath9k_htc_radio_disable(hw); 1270 } 1271 1272 out: 1273 mutex_unlock(&priv->mutex); 1274 return 0; 1275 } 1276 1277 #define SUPPORTED_FILTERS \ 1278 (FIF_PROMISC_IN_BSS | \ 1279 FIF_ALLMULTI | \ 1280 FIF_CONTROL | \ 1281 FIF_PSPOLL | \ 1282 FIF_OTHER_BSS | \ 1283 FIF_BCN_PRBRESP_PROMISC | \ 1284 FIF_PROBE_REQ | \ 1285 FIF_FCSFAIL) 1286 1287 static void ath9k_htc_configure_filter(struct ieee80211_hw *hw, 1288 unsigned int changed_flags, 1289 unsigned int *total_flags, 1290 u64 multicast) 1291 { 1292 struct ath9k_htc_priv *priv = hw->priv; 1293 u32 rfilt; 1294 1295 mutex_lock(&priv->mutex); 1296 changed_flags &= SUPPORTED_FILTERS; 1297 *total_flags &= SUPPORTED_FILTERS; 1298 1299 if (priv->op_flags & OP_INVALID) { 1300 ath_dbg(ath9k_hw_common(priv->ah), ATH_DBG_ANY, 1301 "Unable to configure filter on invalid state\n"); 1302 mutex_unlock(&priv->mutex); 1303 return; 1304 } 1305 ath9k_htc_ps_wakeup(priv); 1306 1307 priv->rxfilter = *total_flags; 1308 rfilt = ath9k_htc_calcrxfilter(priv); 1309 ath9k_hw_setrxfilter(priv->ah, rfilt); 1310 1311 ath_dbg(ath9k_hw_common(priv->ah), ATH_DBG_CONFIG, 1312 "Set HW RX filter: 0x%x\n", rfilt); 1313 1314 ath9k_htc_ps_restore(priv); 1315 mutex_unlock(&priv->mutex); 1316 } 1317 1318 static int ath9k_htc_sta_add(struct ieee80211_hw *hw, 1319 struct ieee80211_vif *vif, 1320 struct ieee80211_sta *sta) 1321 { 1322 struct ath9k_htc_priv *priv = hw->priv; 1323 int ret; 1324 1325 mutex_lock(&priv->mutex); 1326 ath9k_htc_ps_wakeup(priv); 1327 ret = ath9k_htc_add_station(priv, vif, sta); 1328 if (!ret) 1329 ath9k_htc_init_rate(priv, sta); 1330 ath9k_htc_ps_restore(priv); 1331 mutex_unlock(&priv->mutex); 1332 1333 return ret; 1334 } 1335 1336 static int ath9k_htc_sta_remove(struct ieee80211_hw *hw, 1337 struct ieee80211_vif *vif, 1338 struct ieee80211_sta *sta) 1339 { 1340 struct ath9k_htc_priv *priv = hw->priv; 1341 struct ath9k_htc_sta *ista; 1342 int ret; 1343 1344 mutex_lock(&priv->mutex); 1345 ath9k_htc_ps_wakeup(priv); 1346 ista = (struct ath9k_htc_sta *) sta->drv_priv; 1347 htc_sta_drain(priv->htc, ista->index); 1348 ret = ath9k_htc_remove_station(priv, vif, sta); 1349 ath9k_htc_ps_restore(priv); 1350 mutex_unlock(&priv->mutex); 1351 1352 return ret; 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 >= WME_NUM_AC) 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; 1376 1377 qnum = get_hw_qnum(queue, priv->hwq_map); 1378 1379 ath_dbg(common, ATH_DBG_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[WME_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 mutex_lock(&priv->mutex); 1414 ath_dbg(common, ATH_DBG_CONFIG, "Set HW Key\n"); 1415 ath9k_htc_ps_wakeup(priv); 1416 1417 switch (cmd) { 1418 case SET_KEY: 1419 ret = ath_key_config(common, vif, sta, key); 1420 if (ret >= 0) { 1421 key->hw_key_idx = ret; 1422 /* push IV and Michael MIC generation to stack */ 1423 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV; 1424 if (key->cipher == WLAN_CIPHER_SUITE_TKIP) 1425 key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC; 1426 if (priv->ah->sw_mgmt_crypto && 1427 key->cipher == WLAN_CIPHER_SUITE_CCMP) 1428 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT; 1429 ret = 0; 1430 } 1431 break; 1432 case DISABLE_KEY: 1433 ath_key_delete(common, key); 1434 break; 1435 default: 1436 ret = -EINVAL; 1437 } 1438 1439 ath9k_htc_ps_restore(priv); 1440 mutex_unlock(&priv->mutex); 1441 1442 return ret; 1443 } 1444 1445 static void ath9k_htc_set_bssid(struct ath9k_htc_priv *priv) 1446 { 1447 struct ath_common *common = ath9k_hw_common(priv->ah); 1448 1449 ath9k_hw_write_associd(priv->ah); 1450 ath_dbg(common, ATH_DBG_CONFIG, 1451 "BSSID: %pM aid: 0x%x\n", 1452 common->curbssid, common->curaid); 1453 } 1454 1455 static void ath9k_htc_bss_iter(void *data, u8 *mac, struct ieee80211_vif *vif) 1456 { 1457 struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *)data; 1458 struct ath_common *common = ath9k_hw_common(priv->ah); 1459 struct ieee80211_bss_conf *bss_conf = &vif->bss_conf; 1460 1461 if ((vif->type == NL80211_IFTYPE_STATION) && bss_conf->assoc) { 1462 common->curaid = bss_conf->aid; 1463 memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN); 1464 } 1465 } 1466 1467 static void ath9k_htc_choose_set_bssid(struct ath9k_htc_priv *priv) 1468 { 1469 if (priv->num_sta_assoc_vif == 1) { 1470 ieee80211_iterate_active_interfaces_atomic(priv->hw, 1471 ath9k_htc_bss_iter, priv); 1472 ath9k_htc_set_bssid(priv); 1473 } 1474 } 1475 1476 static void ath9k_htc_bss_info_changed(struct ieee80211_hw *hw, 1477 struct ieee80211_vif *vif, 1478 struct ieee80211_bss_conf *bss_conf, 1479 u32 changed) 1480 { 1481 struct ath9k_htc_priv *priv = hw->priv; 1482 struct ath_hw *ah = priv->ah; 1483 struct ath_common *common = ath9k_hw_common(ah); 1484 1485 mutex_lock(&priv->mutex); 1486 ath9k_htc_ps_wakeup(priv); 1487 1488 if (changed & BSS_CHANGED_ASSOC) { 1489 ath_dbg(common, ATH_DBG_CONFIG, "BSS Changed ASSOC %d\n", 1490 bss_conf->assoc); 1491 1492 bss_conf->assoc ? 1493 priv->num_sta_assoc_vif++ : priv->num_sta_assoc_vif--; 1494 1495 if (priv->ah->opmode == NL80211_IFTYPE_STATION) { 1496 if (bss_conf->assoc && (priv->num_sta_assoc_vif == 1)) 1497 ath9k_htc_start_ani(priv); 1498 else if (priv->num_sta_assoc_vif == 0) 1499 ath9k_htc_stop_ani(priv); 1500 } 1501 } 1502 1503 if (changed & BSS_CHANGED_BSSID) { 1504 if (priv->ah->opmode == NL80211_IFTYPE_ADHOC) { 1505 common->curaid = bss_conf->aid; 1506 memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN); 1507 ath9k_htc_set_bssid(priv); 1508 } else if (priv->ah->opmode == NL80211_IFTYPE_STATION) { 1509 ath9k_htc_choose_set_bssid(priv); 1510 } 1511 } 1512 1513 if ((changed & BSS_CHANGED_BEACON_ENABLED) && bss_conf->enable_beacon) { 1514 ath_dbg(common, ATH_DBG_CONFIG, 1515 "Beacon enabled for BSS: %pM\n", bss_conf->bssid); 1516 ath9k_htc_set_tsfadjust(priv, vif); 1517 priv->op_flags |= OP_ENABLE_BEACON; 1518 ath9k_htc_beacon_config(priv, vif); 1519 } 1520 1521 if ((changed & BSS_CHANGED_BEACON_ENABLED) && !bss_conf->enable_beacon) { 1522 /* 1523 * Disable SWBA interrupt only if there are no 1524 * AP/IBSS interfaces. 1525 */ 1526 if ((priv->num_ap_vif <= 1) || priv->num_ibss_vif) { 1527 ath_dbg(common, ATH_DBG_CONFIG, 1528 "Beacon disabled for BSS: %pM\n", 1529 bss_conf->bssid); 1530 priv->op_flags &= ~OP_ENABLE_BEACON; 1531 ath9k_htc_beacon_config(priv, vif); 1532 } 1533 } 1534 1535 if (changed & BSS_CHANGED_BEACON_INT) { 1536 /* 1537 * Reset the HW TSF for the first AP interface. 1538 */ 1539 if ((priv->ah->opmode == NL80211_IFTYPE_AP) && 1540 (priv->nvifs == 1) && 1541 (priv->num_ap_vif == 1) && 1542 (vif->type == NL80211_IFTYPE_AP)) { 1543 priv->op_flags |= OP_TSF_RESET; 1544 } 1545 ath_dbg(common, ATH_DBG_CONFIG, 1546 "Beacon interval changed for BSS: %pM\n", 1547 bss_conf->bssid); 1548 ath9k_htc_beacon_config(priv, vif); 1549 } 1550 1551 if (changed & BSS_CHANGED_ERP_SLOT) { 1552 if (bss_conf->use_short_slot) 1553 ah->slottime = 9; 1554 else 1555 ah->slottime = 20; 1556 1557 ath9k_hw_init_global_settings(ah); 1558 } 1559 1560 if (changed & BSS_CHANGED_HT) 1561 ath9k_htc_update_rate(priv, vif, bss_conf); 1562 1563 ath9k_htc_ps_restore(priv); 1564 mutex_unlock(&priv->mutex); 1565 } 1566 1567 static u64 ath9k_htc_get_tsf(struct ieee80211_hw *hw, 1568 struct ieee80211_vif *vif) 1569 { 1570 struct ath9k_htc_priv *priv = hw->priv; 1571 u64 tsf; 1572 1573 mutex_lock(&priv->mutex); 1574 ath9k_htc_ps_wakeup(priv); 1575 tsf = ath9k_hw_gettsf64(priv->ah); 1576 ath9k_htc_ps_restore(priv); 1577 mutex_unlock(&priv->mutex); 1578 1579 return tsf; 1580 } 1581 1582 static void ath9k_htc_set_tsf(struct ieee80211_hw *hw, 1583 struct ieee80211_vif *vif, u64 tsf) 1584 { 1585 struct ath9k_htc_priv *priv = hw->priv; 1586 1587 mutex_lock(&priv->mutex); 1588 ath9k_htc_ps_wakeup(priv); 1589 ath9k_hw_settsf64(priv->ah, tsf); 1590 ath9k_htc_ps_restore(priv); 1591 mutex_unlock(&priv->mutex); 1592 } 1593 1594 static void ath9k_htc_reset_tsf(struct ieee80211_hw *hw, 1595 struct ieee80211_vif *vif) 1596 { 1597 struct ath9k_htc_priv *priv = hw->priv; 1598 1599 mutex_lock(&priv->mutex); 1600 ath9k_htc_ps_wakeup(priv); 1601 ath9k_hw_reset_tsf(priv->ah); 1602 ath9k_htc_ps_restore(priv); 1603 mutex_unlock(&priv->mutex); 1604 } 1605 1606 static int ath9k_htc_ampdu_action(struct ieee80211_hw *hw, 1607 struct ieee80211_vif *vif, 1608 enum ieee80211_ampdu_mlme_action action, 1609 struct ieee80211_sta *sta, 1610 u16 tid, u16 *ssn, u8 buf_size) 1611 { 1612 struct ath9k_htc_priv *priv = hw->priv; 1613 struct ath9k_htc_sta *ista; 1614 int ret = 0; 1615 1616 mutex_lock(&priv->mutex); 1617 ath9k_htc_ps_wakeup(priv); 1618 1619 switch (action) { 1620 case IEEE80211_AMPDU_RX_START: 1621 break; 1622 case IEEE80211_AMPDU_RX_STOP: 1623 break; 1624 case IEEE80211_AMPDU_TX_START: 1625 ret = ath9k_htc_tx_aggr_oper(priv, vif, sta, action, tid); 1626 if (!ret) 1627 ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid); 1628 break; 1629 case IEEE80211_AMPDU_TX_STOP: 1630 ath9k_htc_tx_aggr_oper(priv, vif, sta, action, tid); 1631 ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid); 1632 break; 1633 case IEEE80211_AMPDU_TX_OPERATIONAL: 1634 ista = (struct ath9k_htc_sta *) sta->drv_priv; 1635 spin_lock_bh(&priv->tx.tx_lock); 1636 ista->tid_state[tid] = AGGR_OPERATIONAL; 1637 spin_unlock_bh(&priv->tx.tx_lock); 1638 break; 1639 default: 1640 ath_err(ath9k_hw_common(priv->ah), "Unknown AMPDU action\n"); 1641 } 1642 1643 ath9k_htc_ps_restore(priv); 1644 mutex_unlock(&priv->mutex); 1645 1646 return ret; 1647 } 1648 1649 static void ath9k_htc_sw_scan_start(struct ieee80211_hw *hw) 1650 { 1651 struct ath9k_htc_priv *priv = hw->priv; 1652 1653 mutex_lock(&priv->mutex); 1654 spin_lock_bh(&priv->beacon_lock); 1655 priv->op_flags |= OP_SCANNING; 1656 spin_unlock_bh(&priv->beacon_lock); 1657 cancel_work_sync(&priv->ps_work); 1658 ath9k_htc_stop_ani(priv); 1659 mutex_unlock(&priv->mutex); 1660 } 1661 1662 static void ath9k_htc_sw_scan_complete(struct ieee80211_hw *hw) 1663 { 1664 struct ath9k_htc_priv *priv = hw->priv; 1665 1666 mutex_lock(&priv->mutex); 1667 spin_lock_bh(&priv->beacon_lock); 1668 priv->op_flags &= ~OP_SCANNING; 1669 spin_unlock_bh(&priv->beacon_lock); 1670 ath9k_htc_ps_wakeup(priv); 1671 ath9k_htc_vif_reconfig(priv); 1672 ath9k_htc_ps_restore(priv); 1673 mutex_unlock(&priv->mutex); 1674 } 1675 1676 static int ath9k_htc_set_rts_threshold(struct ieee80211_hw *hw, u32 value) 1677 { 1678 return 0; 1679 } 1680 1681 static void ath9k_htc_set_coverage_class(struct ieee80211_hw *hw, 1682 u8 coverage_class) 1683 { 1684 struct ath9k_htc_priv *priv = hw->priv; 1685 1686 mutex_lock(&priv->mutex); 1687 ath9k_htc_ps_wakeup(priv); 1688 priv->ah->coverage_class = coverage_class; 1689 ath9k_hw_init_global_settings(priv->ah); 1690 ath9k_htc_ps_restore(priv); 1691 mutex_unlock(&priv->mutex); 1692 } 1693 1694 /* 1695 * Currently, this is used only for selecting the minimum rate 1696 * for management frames, rate selection for data frames remain 1697 * unaffected. 1698 */ 1699 static int ath9k_htc_set_bitrate_mask(struct ieee80211_hw *hw, 1700 struct ieee80211_vif *vif, 1701 const struct cfg80211_bitrate_mask *mask) 1702 { 1703 struct ath9k_htc_priv *priv = hw->priv; 1704 struct ath_common *common = ath9k_hw_common(priv->ah); 1705 struct ath9k_htc_target_rate_mask tmask; 1706 struct ath9k_htc_vif *avp = (void *)vif->drv_priv; 1707 int ret = 0; 1708 u8 cmd_rsp; 1709 1710 memset(&tmask, 0, sizeof(struct ath9k_htc_target_rate_mask)); 1711 1712 tmask.vif_index = avp->index; 1713 tmask.band = IEEE80211_BAND_2GHZ; 1714 tmask.mask = cpu_to_be32(mask->control[IEEE80211_BAND_2GHZ].legacy); 1715 1716 WMI_CMD_BUF(WMI_BITRATE_MASK_CMDID, &tmask); 1717 if (ret) { 1718 ath_err(common, 1719 "Unable to set 2G rate mask for " 1720 "interface at idx: %d\n", avp->index); 1721 goto out; 1722 } 1723 1724 tmask.band = IEEE80211_BAND_5GHZ; 1725 tmask.mask = cpu_to_be32(mask->control[IEEE80211_BAND_5GHZ].legacy); 1726 1727 WMI_CMD_BUF(WMI_BITRATE_MASK_CMDID, &tmask); 1728 if (ret) { 1729 ath_err(common, 1730 "Unable to set 5G rate mask for " 1731 "interface at idx: %d\n", avp->index); 1732 goto out; 1733 } 1734 1735 ath_dbg(common, ATH_DBG_CONFIG, 1736 "Set bitrate masks: 0x%x, 0x%x\n", 1737 mask->control[IEEE80211_BAND_2GHZ].legacy, 1738 mask->control[IEEE80211_BAND_5GHZ].legacy); 1739 out: 1740 return ret; 1741 } 1742 1743 1744 static int ath9k_htc_get_stats(struct ieee80211_hw *hw, 1745 struct ieee80211_low_level_stats *stats) 1746 { 1747 struct ath9k_htc_priv *priv = hw->priv; 1748 struct ath_hw *ah = priv->ah; 1749 struct ath9k_mib_stats *mib_stats = &ah->ah_mibStats; 1750 1751 stats->dot11ACKFailureCount = mib_stats->ackrcv_bad; 1752 stats->dot11RTSFailureCount = mib_stats->rts_bad; 1753 stats->dot11FCSErrorCount = mib_stats->fcs_bad; 1754 stats->dot11RTSSuccessCount = mib_stats->rts_good; 1755 1756 return 0; 1757 } 1758 1759 struct ieee80211_ops ath9k_htc_ops = { 1760 .tx = ath9k_htc_tx, 1761 .start = ath9k_htc_start, 1762 .stop = ath9k_htc_stop, 1763 .add_interface = ath9k_htc_add_interface, 1764 .remove_interface = ath9k_htc_remove_interface, 1765 .config = ath9k_htc_config, 1766 .configure_filter = ath9k_htc_configure_filter, 1767 .sta_add = ath9k_htc_sta_add, 1768 .sta_remove = ath9k_htc_sta_remove, 1769 .conf_tx = ath9k_htc_conf_tx, 1770 .bss_info_changed = ath9k_htc_bss_info_changed, 1771 .set_key = ath9k_htc_set_key, 1772 .get_tsf = ath9k_htc_get_tsf, 1773 .set_tsf = ath9k_htc_set_tsf, 1774 .reset_tsf = ath9k_htc_reset_tsf, 1775 .ampdu_action = ath9k_htc_ampdu_action, 1776 .sw_scan_start = ath9k_htc_sw_scan_start, 1777 .sw_scan_complete = ath9k_htc_sw_scan_complete, 1778 .set_rts_threshold = ath9k_htc_set_rts_threshold, 1779 .rfkill_poll = ath9k_htc_rfkill_poll_state, 1780 .set_coverage_class = ath9k_htc_set_coverage_class, 1781 .set_bitrate_mask = ath9k_htc_set_bitrate_mask, 1782 .get_stats = ath9k_htc_get_stats, 1783 }; 1784