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