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