linux/drivers/net/wireless/ath/ath10k/mac.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2005-2011 Atheros Communications Inc.
   3 * Copyright (c) 2011-2013 Qualcomm Atheros, Inc.
   4 *
   5 * Permission to use, copy, modify, and/or distribute this software for any
   6 * purpose with or without fee is hereby granted, provided that the above
   7 * copyright notice and this permission notice appear in all copies.
   8 *
   9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  16 */
  17
  18#include "mac.h"
  19
  20#include <net/mac80211.h>
  21#include <linux/etherdevice.h>
  22
  23#include "hif.h"
  24#include "core.h"
  25#include "debug.h"
  26#include "wmi.h"
  27#include "htt.h"
  28#include "txrx.h"
  29#include "testmode.h"
  30#include "wmi.h"
  31#include "wmi-tlv.h"
  32#include "wmi-ops.h"
  33#include "wow.h"
  34
  35/*********/
  36/* Rates */
  37/*********/
  38
  39static struct ieee80211_rate ath10k_rates[] = {
  40        { .bitrate = 10,
  41          .hw_value = ATH10K_HW_RATE_CCK_LP_1M },
  42        { .bitrate = 20,
  43          .hw_value = ATH10K_HW_RATE_CCK_LP_2M,
  44          .hw_value_short = ATH10K_HW_RATE_CCK_SP_2M,
  45          .flags = IEEE80211_RATE_SHORT_PREAMBLE },
  46        { .bitrate = 55,
  47          .hw_value = ATH10K_HW_RATE_CCK_LP_5_5M,
  48          .hw_value_short = ATH10K_HW_RATE_CCK_SP_5_5M,
  49          .flags = IEEE80211_RATE_SHORT_PREAMBLE },
  50        { .bitrate = 110,
  51          .hw_value = ATH10K_HW_RATE_CCK_LP_11M,
  52          .hw_value_short = ATH10K_HW_RATE_CCK_SP_11M,
  53          .flags = IEEE80211_RATE_SHORT_PREAMBLE },
  54
  55        { .bitrate = 60, .hw_value = ATH10K_HW_RATE_OFDM_6M },
  56        { .bitrate = 90, .hw_value = ATH10K_HW_RATE_OFDM_9M },
  57        { .bitrate = 120, .hw_value = ATH10K_HW_RATE_OFDM_12M },
  58        { .bitrate = 180, .hw_value = ATH10K_HW_RATE_OFDM_18M },
  59        { .bitrate = 240, .hw_value = ATH10K_HW_RATE_OFDM_24M },
  60        { .bitrate = 360, .hw_value = ATH10K_HW_RATE_OFDM_36M },
  61        { .bitrate = 480, .hw_value = ATH10K_HW_RATE_OFDM_48M },
  62        { .bitrate = 540, .hw_value = ATH10K_HW_RATE_OFDM_54M },
  63};
  64
  65#define ATH10K_MAC_FIRST_OFDM_RATE_IDX 4
  66
  67#define ath10k_a_rates (ath10k_rates + ATH10K_MAC_FIRST_OFDM_RATE_IDX)
  68#define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - \
  69                             ATH10K_MAC_FIRST_OFDM_RATE_IDX)
  70#define ath10k_g_rates (ath10k_rates + 0)
  71#define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
  72
  73static bool ath10k_mac_bitrate_is_cck(int bitrate)
  74{
  75        switch (bitrate) {
  76        case 10:
  77        case 20:
  78        case 55:
  79        case 110:
  80                return true;
  81        }
  82
  83        return false;
  84}
  85
  86static u8 ath10k_mac_bitrate_to_rate(int bitrate)
  87{
  88        return DIV_ROUND_UP(bitrate, 5) |
  89               (ath10k_mac_bitrate_is_cck(bitrate) ? BIT(7) : 0);
  90}
  91
  92u8 ath10k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband,
  93                             u8 hw_rate)
  94{
  95        const struct ieee80211_rate *rate;
  96        int i;
  97
  98        for (i = 0; i < sband->n_bitrates; i++) {
  99                rate = &sband->bitrates[i];
 100
 101                if (rate->hw_value == hw_rate)
 102                        return i;
 103                else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE &&
 104                         rate->hw_value_short == hw_rate)
 105                        return i;
 106        }
 107
 108        return 0;
 109}
 110
 111u8 ath10k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband,
 112                             u32 bitrate)
 113{
 114        int i;
 115
 116        for (i = 0; i < sband->n_bitrates; i++)
 117                if (sband->bitrates[i].bitrate == bitrate)
 118                        return i;
 119
 120        return 0;
 121}
 122
 123static int ath10k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss)
 124{
 125        switch ((mcs_map >> (2 * nss)) & 0x3) {
 126        case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1;
 127        case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1;
 128        case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1;
 129        }
 130        return 0;
 131}
 132
 133static u32
 134ath10k_mac_max_ht_nss(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
 135{
 136        int nss;
 137
 138        for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--)
 139                if (ht_mcs_mask[nss])
 140                        return nss + 1;
 141
 142        return 1;
 143}
 144
 145static u32
 146ath10k_mac_max_vht_nss(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
 147{
 148        int nss;
 149
 150        for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--)
 151                if (vht_mcs_mask[nss])
 152                        return nss + 1;
 153
 154        return 1;
 155}
 156
 157/**********/
 158/* Crypto */
 159/**********/
 160
 161static int ath10k_send_key(struct ath10k_vif *arvif,
 162                           struct ieee80211_key_conf *key,
 163                           enum set_key_cmd cmd,
 164                           const u8 *macaddr, u32 flags)
 165{
 166        struct ath10k *ar = arvif->ar;
 167        struct wmi_vdev_install_key_arg arg = {
 168                .vdev_id = arvif->vdev_id,
 169                .key_idx = key->keyidx,
 170                .key_len = key->keylen,
 171                .key_data = key->key,
 172                .key_flags = flags,
 173                .macaddr = macaddr,
 174        };
 175
 176        lockdep_assert_held(&arvif->ar->conf_mutex);
 177
 178        switch (key->cipher) {
 179        case WLAN_CIPHER_SUITE_CCMP:
 180                arg.key_cipher = WMI_CIPHER_AES_CCM;
 181                key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
 182                break;
 183        case WLAN_CIPHER_SUITE_TKIP:
 184                arg.key_cipher = WMI_CIPHER_TKIP;
 185                arg.key_txmic_len = 8;
 186                arg.key_rxmic_len = 8;
 187                break;
 188        case WLAN_CIPHER_SUITE_WEP40:
 189        case WLAN_CIPHER_SUITE_WEP104:
 190                arg.key_cipher = WMI_CIPHER_WEP;
 191                break;
 192        case WLAN_CIPHER_SUITE_AES_CMAC:
 193                WARN_ON(1);
 194                return -EINVAL;
 195        default:
 196                ath10k_warn(ar, "cipher %d is not supported\n", key->cipher);
 197                return -EOPNOTSUPP;
 198        }
 199
 200        if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
 201                key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
 202        }
 203
 204        if (cmd == DISABLE_KEY) {
 205                arg.key_cipher = WMI_CIPHER_NONE;
 206                arg.key_data = NULL;
 207        }
 208
 209        return ath10k_wmi_vdev_install_key(arvif->ar, &arg);
 210}
 211
 212static int ath10k_install_key(struct ath10k_vif *arvif,
 213                              struct ieee80211_key_conf *key,
 214                              enum set_key_cmd cmd,
 215                              const u8 *macaddr, u32 flags)
 216{
 217        struct ath10k *ar = arvif->ar;
 218        int ret;
 219        unsigned long time_left;
 220
 221        lockdep_assert_held(&ar->conf_mutex);
 222
 223        reinit_completion(&ar->install_key_done);
 224
 225        if (arvif->nohwcrypt)
 226                return 1;
 227
 228        ret = ath10k_send_key(arvif, key, cmd, macaddr, flags);
 229        if (ret)
 230                return ret;
 231
 232        time_left = wait_for_completion_timeout(&ar->install_key_done, 3 * HZ);
 233        if (time_left == 0)
 234                return -ETIMEDOUT;
 235
 236        return 0;
 237}
 238
 239static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif,
 240                                        const u8 *addr)
 241{
 242        struct ath10k *ar = arvif->ar;
 243        struct ath10k_peer *peer;
 244        int ret;
 245        int i;
 246        u32 flags;
 247
 248        lockdep_assert_held(&ar->conf_mutex);
 249
 250        if (WARN_ON(arvif->vif->type != NL80211_IFTYPE_AP &&
 251                    arvif->vif->type != NL80211_IFTYPE_ADHOC))
 252                return -EINVAL;
 253
 254        spin_lock_bh(&ar->data_lock);
 255        peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
 256        spin_unlock_bh(&ar->data_lock);
 257
 258        if (!peer)
 259                return -ENOENT;
 260
 261        for (i = 0; i < ARRAY_SIZE(arvif->wep_keys); i++) {
 262                if (arvif->wep_keys[i] == NULL)
 263                        continue;
 264
 265                switch (arvif->vif->type) {
 266                case NL80211_IFTYPE_AP:
 267                        flags = WMI_KEY_PAIRWISE;
 268
 269                        if (arvif->def_wep_key_idx == i)
 270                                flags |= WMI_KEY_TX_USAGE;
 271
 272                        ret = ath10k_install_key(arvif, arvif->wep_keys[i],
 273                                                 SET_KEY, addr, flags);
 274                        if (ret < 0)
 275                                return ret;
 276                        break;
 277                case NL80211_IFTYPE_ADHOC:
 278                        ret = ath10k_install_key(arvif, arvif->wep_keys[i],
 279                                                 SET_KEY, addr,
 280                                                 WMI_KEY_PAIRWISE);
 281                        if (ret < 0)
 282                                return ret;
 283
 284                        ret = ath10k_install_key(arvif, arvif->wep_keys[i],
 285                                                 SET_KEY, addr, WMI_KEY_GROUP);
 286                        if (ret < 0)
 287                                return ret;
 288                        break;
 289                default:
 290                        WARN_ON(1);
 291                        return -EINVAL;
 292                }
 293
 294                spin_lock_bh(&ar->data_lock);
 295                peer->keys[i] = arvif->wep_keys[i];
 296                spin_unlock_bh(&ar->data_lock);
 297        }
 298
 299        /* In some cases (notably with static WEP IBSS with multiple keys)
 300         * multicast Tx becomes broken. Both pairwise and groupwise keys are
 301         * installed already. Using WMI_KEY_TX_USAGE in different combinations
 302         * didn't seem help. Using def_keyid vdev parameter seems to be
 303         * effective so use that.
 304         *
 305         * FIXME: Revisit. Perhaps this can be done in a less hacky way.
 306         */
 307        if (arvif->vif->type != NL80211_IFTYPE_ADHOC)
 308                return 0;
 309
 310        if (arvif->def_wep_key_idx == -1)
 311                return 0;
 312
 313        ret = ath10k_wmi_vdev_set_param(arvif->ar,
 314                                        arvif->vdev_id,
 315                                        arvif->ar->wmi.vdev_param->def_keyid,
 316                                        arvif->def_wep_key_idx);
 317        if (ret) {
 318                ath10k_warn(ar, "failed to re-set def wpa key idxon vdev %i: %d\n",
 319                            arvif->vdev_id, ret);
 320                return ret;
 321        }
 322
 323        return 0;
 324}
 325
 326static int ath10k_clear_peer_keys(struct ath10k_vif *arvif,
 327                                  const u8 *addr)
 328{
 329        struct ath10k *ar = arvif->ar;
 330        struct ath10k_peer *peer;
 331        int first_errno = 0;
 332        int ret;
 333        int i;
 334        u32 flags = 0;
 335
 336        lockdep_assert_held(&ar->conf_mutex);
 337
 338        spin_lock_bh(&ar->data_lock);
 339        peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
 340        spin_unlock_bh(&ar->data_lock);
 341
 342        if (!peer)
 343                return -ENOENT;
 344
 345        for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
 346                if (peer->keys[i] == NULL)
 347                        continue;
 348
 349                /* key flags are not required to delete the key */
 350                ret = ath10k_install_key(arvif, peer->keys[i],
 351                                         DISABLE_KEY, addr, flags);
 352                if (ret < 0 && first_errno == 0)
 353                        first_errno = ret;
 354
 355                if (ret < 0)
 356                        ath10k_warn(ar, "failed to remove peer wep key %d: %d\n",
 357                                    i, ret);
 358
 359                spin_lock_bh(&ar->data_lock);
 360                peer->keys[i] = NULL;
 361                spin_unlock_bh(&ar->data_lock);
 362        }
 363
 364        return first_errno;
 365}
 366
 367bool ath10k_mac_is_peer_wep_key_set(struct ath10k *ar, const u8 *addr,
 368                                    u8 keyidx)
 369{
 370        struct ath10k_peer *peer;
 371        int i;
 372
 373        lockdep_assert_held(&ar->data_lock);
 374
 375        /* We don't know which vdev this peer belongs to,
 376         * since WMI doesn't give us that information.
 377         *
 378         * FIXME: multi-bss needs to be handled.
 379         */
 380        peer = ath10k_peer_find(ar, 0, addr);
 381        if (!peer)
 382                return false;
 383
 384        for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
 385                if (peer->keys[i] && peer->keys[i]->keyidx == keyidx)
 386                        return true;
 387        }
 388
 389        return false;
 390}
 391
 392static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
 393                                 struct ieee80211_key_conf *key)
 394{
 395        struct ath10k *ar = arvif->ar;
 396        struct ath10k_peer *peer;
 397        u8 addr[ETH_ALEN];
 398        int first_errno = 0;
 399        int ret;
 400        int i;
 401        u32 flags = 0;
 402
 403        lockdep_assert_held(&ar->conf_mutex);
 404
 405        for (;;) {
 406                /* since ath10k_install_key we can't hold data_lock all the
 407                 * time, so we try to remove the keys incrementally */
 408                spin_lock_bh(&ar->data_lock);
 409                i = 0;
 410                list_for_each_entry(peer, &ar->peers, list) {
 411                        for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
 412                                if (peer->keys[i] == key) {
 413                                        ether_addr_copy(addr, peer->addr);
 414                                        peer->keys[i] = NULL;
 415                                        break;
 416                                }
 417                        }
 418
 419                        if (i < ARRAY_SIZE(peer->keys))
 420                                break;
 421                }
 422                spin_unlock_bh(&ar->data_lock);
 423
 424                if (i == ARRAY_SIZE(peer->keys))
 425                        break;
 426                /* key flags are not required to delete the key */
 427                ret = ath10k_install_key(arvif, key, DISABLE_KEY, addr, flags);
 428                if (ret < 0 && first_errno == 0)
 429                        first_errno = ret;
 430
 431                if (ret)
 432                        ath10k_warn(ar, "failed to remove key for %pM: %d\n",
 433                                    addr, ret);
 434        }
 435
 436        return first_errno;
 437}
 438
 439static int ath10k_mac_vif_update_wep_key(struct ath10k_vif *arvif,
 440                                         struct ieee80211_key_conf *key)
 441{
 442        struct ath10k *ar = arvif->ar;
 443        struct ath10k_peer *peer;
 444        int ret;
 445
 446        lockdep_assert_held(&ar->conf_mutex);
 447
 448        list_for_each_entry(peer, &ar->peers, list) {
 449                if (!memcmp(peer->addr, arvif->vif->addr, ETH_ALEN))
 450                        continue;
 451
 452                if (!memcmp(peer->addr, arvif->bssid, ETH_ALEN))
 453                        continue;
 454
 455                if (peer->keys[key->keyidx] == key)
 456                        continue;
 457
 458                ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vif vdev %i update key %i needs update\n",
 459                           arvif->vdev_id, key->keyidx);
 460
 461                ret = ath10k_install_peer_wep_keys(arvif, peer->addr);
 462                if (ret) {
 463                        ath10k_warn(ar, "failed to update wep keys on vdev %i for peer %pM: %d\n",
 464                                    arvif->vdev_id, peer->addr, ret);
 465                        return ret;
 466                }
 467        }
 468
 469        return 0;
 470}
 471
 472/*********************/
 473/* General utilities */
 474/*********************/
 475
 476static inline enum wmi_phy_mode
 477chan_to_phymode(const struct cfg80211_chan_def *chandef)
 478{
 479        enum wmi_phy_mode phymode = MODE_UNKNOWN;
 480
 481        switch (chandef->chan->band) {
 482        case IEEE80211_BAND_2GHZ:
 483                switch (chandef->width) {
 484                case NL80211_CHAN_WIDTH_20_NOHT:
 485                        if (chandef->chan->flags & IEEE80211_CHAN_NO_OFDM)
 486                                phymode = MODE_11B;
 487                        else
 488                                phymode = MODE_11G;
 489                        break;
 490                case NL80211_CHAN_WIDTH_20:
 491                        phymode = MODE_11NG_HT20;
 492                        break;
 493                case NL80211_CHAN_WIDTH_40:
 494                        phymode = MODE_11NG_HT40;
 495                        break;
 496                case NL80211_CHAN_WIDTH_5:
 497                case NL80211_CHAN_WIDTH_10:
 498                case NL80211_CHAN_WIDTH_80:
 499                case NL80211_CHAN_WIDTH_80P80:
 500                case NL80211_CHAN_WIDTH_160:
 501                        phymode = MODE_UNKNOWN;
 502                        break;
 503                }
 504                break;
 505        case IEEE80211_BAND_5GHZ:
 506                switch (chandef->width) {
 507                case NL80211_CHAN_WIDTH_20_NOHT:
 508                        phymode = MODE_11A;
 509                        break;
 510                case NL80211_CHAN_WIDTH_20:
 511                        phymode = MODE_11NA_HT20;
 512                        break;
 513                case NL80211_CHAN_WIDTH_40:
 514                        phymode = MODE_11NA_HT40;
 515                        break;
 516                case NL80211_CHAN_WIDTH_80:
 517                        phymode = MODE_11AC_VHT80;
 518                        break;
 519                case NL80211_CHAN_WIDTH_5:
 520                case NL80211_CHAN_WIDTH_10:
 521                case NL80211_CHAN_WIDTH_80P80:
 522                case NL80211_CHAN_WIDTH_160:
 523                        phymode = MODE_UNKNOWN;
 524                        break;
 525                }
 526                break;
 527        default:
 528                break;
 529        }
 530
 531        WARN_ON(phymode == MODE_UNKNOWN);
 532        return phymode;
 533}
 534
 535static u8 ath10k_parse_mpdudensity(u8 mpdudensity)
 536{
 537/*
 538 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
 539 *   0 for no restriction
 540 *   1 for 1/4 us
 541 *   2 for 1/2 us
 542 *   3 for 1 us
 543 *   4 for 2 us
 544 *   5 for 4 us
 545 *   6 for 8 us
 546 *   7 for 16 us
 547 */
 548        switch (mpdudensity) {
 549        case 0:
 550                return 0;
 551        case 1:
 552        case 2:
 553        case 3:
 554        /* Our lower layer calculations limit our precision to
 555           1 microsecond */
 556                return 1;
 557        case 4:
 558                return 2;
 559        case 5:
 560                return 4;
 561        case 6:
 562                return 8;
 563        case 7:
 564                return 16;
 565        default:
 566                return 0;
 567        }
 568}
 569
 570int ath10k_mac_vif_chan(struct ieee80211_vif *vif,
 571                        struct cfg80211_chan_def *def)
 572{
 573        struct ieee80211_chanctx_conf *conf;
 574
 575        rcu_read_lock();
 576        conf = rcu_dereference(vif->chanctx_conf);
 577        if (!conf) {
 578                rcu_read_unlock();
 579                return -ENOENT;
 580        }
 581
 582        *def = conf->def;
 583        rcu_read_unlock();
 584
 585        return 0;
 586}
 587
 588static void ath10k_mac_num_chanctxs_iter(struct ieee80211_hw *hw,
 589                                         struct ieee80211_chanctx_conf *conf,
 590                                         void *data)
 591{
 592        int *num = data;
 593
 594        (*num)++;
 595}
 596
 597static int ath10k_mac_num_chanctxs(struct ath10k *ar)
 598{
 599        int num = 0;
 600
 601        ieee80211_iter_chan_contexts_atomic(ar->hw,
 602                                            ath10k_mac_num_chanctxs_iter,
 603                                            &num);
 604
 605        return num;
 606}
 607
 608static void
 609ath10k_mac_get_any_chandef_iter(struct ieee80211_hw *hw,
 610                                struct ieee80211_chanctx_conf *conf,
 611                                void *data)
 612{
 613        struct cfg80211_chan_def **def = data;
 614
 615        *def = &conf->def;
 616}
 617
 618static int ath10k_peer_create(struct ath10k *ar, u32 vdev_id, const u8 *addr,
 619                              enum wmi_peer_type peer_type)
 620{
 621        struct ath10k_vif *arvif;
 622        int num_peers = 0;
 623        int ret;
 624
 625        lockdep_assert_held(&ar->conf_mutex);
 626
 627        num_peers = ar->num_peers;
 628
 629        /* Each vdev consumes a peer entry as well */
 630        list_for_each_entry(arvif, &ar->arvifs, list)
 631                num_peers++;
 632
 633        if (num_peers >= ar->max_num_peers)
 634                return -ENOBUFS;
 635
 636        ret = ath10k_wmi_peer_create(ar, vdev_id, addr, peer_type);
 637        if (ret) {
 638                ath10k_warn(ar, "failed to create wmi peer %pM on vdev %i: %i\n",
 639                            addr, vdev_id, ret);
 640                return ret;
 641        }
 642
 643        ret = ath10k_wait_for_peer_created(ar, vdev_id, addr);
 644        if (ret) {
 645                ath10k_warn(ar, "failed to wait for created wmi peer %pM on vdev %i: %i\n",
 646                            addr, vdev_id, ret);
 647                return ret;
 648        }
 649
 650        ar->num_peers++;
 651
 652        return 0;
 653}
 654
 655static int ath10k_mac_set_kickout(struct ath10k_vif *arvif)
 656{
 657        struct ath10k *ar = arvif->ar;
 658        u32 param;
 659        int ret;
 660
 661        param = ar->wmi.pdev_param->sta_kickout_th;
 662        ret = ath10k_wmi_pdev_set_param(ar, param,
 663                                        ATH10K_KICKOUT_THRESHOLD);
 664        if (ret) {
 665                ath10k_warn(ar, "failed to set kickout threshold on vdev %i: %d\n",
 666                            arvif->vdev_id, ret);
 667                return ret;
 668        }
 669
 670        param = ar->wmi.vdev_param->ap_keepalive_min_idle_inactive_time_secs;
 671        ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
 672                                        ATH10K_KEEPALIVE_MIN_IDLE);
 673        if (ret) {
 674                ath10k_warn(ar, "failed to set keepalive minimum idle time on vdev %i: %d\n",
 675                            arvif->vdev_id, ret);
 676                return ret;
 677        }
 678
 679        param = ar->wmi.vdev_param->ap_keepalive_max_idle_inactive_time_secs;
 680        ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
 681                                        ATH10K_KEEPALIVE_MAX_IDLE);
 682        if (ret) {
 683                ath10k_warn(ar, "failed to set keepalive maximum idle time on vdev %i: %d\n",
 684                            arvif->vdev_id, ret);
 685                return ret;
 686        }
 687
 688        param = ar->wmi.vdev_param->ap_keepalive_max_unresponsive_time_secs;
 689        ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
 690                                        ATH10K_KEEPALIVE_MAX_UNRESPONSIVE);
 691        if (ret) {
 692                ath10k_warn(ar, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
 693                            arvif->vdev_id, ret);
 694                return ret;
 695        }
 696
 697        return 0;
 698}
 699
 700static int ath10k_mac_set_rts(struct ath10k_vif *arvif, u32 value)
 701{
 702        struct ath10k *ar = arvif->ar;
 703        u32 vdev_param;
 704
 705        vdev_param = ar->wmi.vdev_param->rts_threshold;
 706        return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
 707}
 708
 709static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
 710{
 711        int ret;
 712
 713        lockdep_assert_held(&ar->conf_mutex);
 714
 715        ret = ath10k_wmi_peer_delete(ar, vdev_id, addr);
 716        if (ret)
 717                return ret;
 718
 719        ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
 720        if (ret)
 721                return ret;
 722
 723        ar->num_peers--;
 724
 725        return 0;
 726}
 727
 728static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id)
 729{
 730        struct ath10k_peer *peer, *tmp;
 731
 732        lockdep_assert_held(&ar->conf_mutex);
 733
 734        spin_lock_bh(&ar->data_lock);
 735        list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
 736                if (peer->vdev_id != vdev_id)
 737                        continue;
 738
 739                ath10k_warn(ar, "removing stale peer %pM from vdev_id %d\n",
 740                            peer->addr, vdev_id);
 741
 742                list_del(&peer->list);
 743                kfree(peer);
 744                ar->num_peers--;
 745        }
 746        spin_unlock_bh(&ar->data_lock);
 747}
 748
 749static void ath10k_peer_cleanup_all(struct ath10k *ar)
 750{
 751        struct ath10k_peer *peer, *tmp;
 752
 753        lockdep_assert_held(&ar->conf_mutex);
 754
 755        spin_lock_bh(&ar->data_lock);
 756        list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
 757                list_del(&peer->list);
 758                kfree(peer);
 759        }
 760        spin_unlock_bh(&ar->data_lock);
 761
 762        ar->num_peers = 0;
 763        ar->num_stations = 0;
 764}
 765
 766static int ath10k_mac_tdls_peer_update(struct ath10k *ar, u32 vdev_id,
 767                                       struct ieee80211_sta *sta,
 768                                       enum wmi_tdls_peer_state state)
 769{
 770        int ret;
 771        struct wmi_tdls_peer_update_cmd_arg arg = {};
 772        struct wmi_tdls_peer_capab_arg cap = {};
 773        struct wmi_channel_arg chan_arg = {};
 774
 775        lockdep_assert_held(&ar->conf_mutex);
 776
 777        arg.vdev_id = vdev_id;
 778        arg.peer_state = state;
 779        ether_addr_copy(arg.addr, sta->addr);
 780
 781        cap.peer_max_sp = sta->max_sp;
 782        cap.peer_uapsd_queues = sta->uapsd_queues;
 783
 784        if (state == WMI_TDLS_PEER_STATE_CONNECTED &&
 785            !sta->tdls_initiator)
 786                cap.is_peer_responder = 1;
 787
 788        ret = ath10k_wmi_tdls_peer_update(ar, &arg, &cap, &chan_arg);
 789        if (ret) {
 790                ath10k_warn(ar, "failed to update tdls peer %pM on vdev %i: %i\n",
 791                            arg.addr, vdev_id, ret);
 792                return ret;
 793        }
 794
 795        return 0;
 796}
 797
 798/************************/
 799/* Interface management */
 800/************************/
 801
 802void ath10k_mac_vif_beacon_free(struct ath10k_vif *arvif)
 803{
 804        struct ath10k *ar = arvif->ar;
 805
 806        lockdep_assert_held(&ar->data_lock);
 807
 808        if (!arvif->beacon)
 809                return;
 810
 811        if (!arvif->beacon_buf)
 812                dma_unmap_single(ar->dev, ATH10K_SKB_CB(arvif->beacon)->paddr,
 813                                 arvif->beacon->len, DMA_TO_DEVICE);
 814
 815        if (WARN_ON(arvif->beacon_state != ATH10K_BEACON_SCHEDULED &&
 816                    arvif->beacon_state != ATH10K_BEACON_SENT))
 817                return;
 818
 819        dev_kfree_skb_any(arvif->beacon);
 820
 821        arvif->beacon = NULL;
 822        arvif->beacon_state = ATH10K_BEACON_SCHEDULED;
 823}
 824
 825static void ath10k_mac_vif_beacon_cleanup(struct ath10k_vif *arvif)
 826{
 827        struct ath10k *ar = arvif->ar;
 828
 829        lockdep_assert_held(&ar->data_lock);
 830
 831        ath10k_mac_vif_beacon_free(arvif);
 832
 833        if (arvif->beacon_buf) {
 834                dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
 835                                  arvif->beacon_buf, arvif->beacon_paddr);
 836                arvif->beacon_buf = NULL;
 837        }
 838}
 839
 840static inline int ath10k_vdev_setup_sync(struct ath10k *ar)
 841{
 842        unsigned long time_left;
 843
 844        lockdep_assert_held(&ar->conf_mutex);
 845
 846        if (test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags))
 847                return -ESHUTDOWN;
 848
 849        time_left = wait_for_completion_timeout(&ar->vdev_setup_done,
 850                                                ATH10K_VDEV_SETUP_TIMEOUT_HZ);
 851        if (time_left == 0)
 852                return -ETIMEDOUT;
 853
 854        return 0;
 855}
 856
 857static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id)
 858{
 859        struct cfg80211_chan_def *chandef = NULL;
 860        struct ieee80211_channel *channel = NULL;
 861        struct wmi_vdev_start_request_arg arg = {};
 862        int ret = 0;
 863
 864        lockdep_assert_held(&ar->conf_mutex);
 865
 866        ieee80211_iter_chan_contexts_atomic(ar->hw,
 867                                            ath10k_mac_get_any_chandef_iter,
 868                                            &chandef);
 869        if (WARN_ON_ONCE(!chandef))
 870                return -ENOENT;
 871
 872        channel = chandef->chan;
 873
 874        arg.vdev_id = vdev_id;
 875        arg.channel.freq = channel->center_freq;
 876        arg.channel.band_center_freq1 = chandef->center_freq1;
 877
 878        /* TODO setup this dynamically, what in case we
 879           don't have any vifs? */
 880        arg.channel.mode = chan_to_phymode(chandef);
 881        arg.channel.chan_radar =
 882                        !!(channel->flags & IEEE80211_CHAN_RADAR);
 883
 884        arg.channel.min_power = 0;
 885        arg.channel.max_power = channel->max_power * 2;
 886        arg.channel.max_reg_power = channel->max_reg_power * 2;
 887        arg.channel.max_antenna_gain = channel->max_antenna_gain * 2;
 888
 889        reinit_completion(&ar->vdev_setup_done);
 890
 891        ret = ath10k_wmi_vdev_start(ar, &arg);
 892        if (ret) {
 893                ath10k_warn(ar, "failed to request monitor vdev %i start: %d\n",
 894                            vdev_id, ret);
 895                return ret;
 896        }
 897
 898        ret = ath10k_vdev_setup_sync(ar);
 899        if (ret) {
 900                ath10k_warn(ar, "failed to synchronize setup for monitor vdev %i start: %d\n",
 901                            vdev_id, ret);
 902                return ret;
 903        }
 904
 905        ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
 906        if (ret) {
 907                ath10k_warn(ar, "failed to put up monitor vdev %i: %d\n",
 908                            vdev_id, ret);
 909                goto vdev_stop;
 910        }
 911
 912        ar->monitor_vdev_id = vdev_id;
 913
 914        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i started\n",
 915                   ar->monitor_vdev_id);
 916        return 0;
 917
 918vdev_stop:
 919        ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
 920        if (ret)
 921                ath10k_warn(ar, "failed to stop monitor vdev %i after start failure: %d\n",
 922                            ar->monitor_vdev_id, ret);
 923
 924        return ret;
 925}
 926
 927static int ath10k_monitor_vdev_stop(struct ath10k *ar)
 928{
 929        int ret = 0;
 930
 931        lockdep_assert_held(&ar->conf_mutex);
 932
 933        ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id);
 934        if (ret)
 935                ath10k_warn(ar, "failed to put down monitor vdev %i: %d\n",
 936                            ar->monitor_vdev_id, ret);
 937
 938        reinit_completion(&ar->vdev_setup_done);
 939
 940        ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
 941        if (ret)
 942                ath10k_warn(ar, "failed to to request monitor vdev %i stop: %d\n",
 943                            ar->monitor_vdev_id, ret);
 944
 945        ret = ath10k_vdev_setup_sync(ar);
 946        if (ret)
 947                ath10k_warn(ar, "failed to synchronize monitor vdev %i stop: %d\n",
 948                            ar->monitor_vdev_id, ret);
 949
 950        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i stopped\n",
 951                   ar->monitor_vdev_id);
 952        return ret;
 953}
 954
 955static int ath10k_monitor_vdev_create(struct ath10k *ar)
 956{
 957        int bit, ret = 0;
 958
 959        lockdep_assert_held(&ar->conf_mutex);
 960
 961        if (ar->free_vdev_map == 0) {
 962                ath10k_warn(ar, "failed to find free vdev id for monitor vdev\n");
 963                return -ENOMEM;
 964        }
 965
 966        bit = __ffs64(ar->free_vdev_map);
 967
 968        ar->monitor_vdev_id = bit;
 969
 970        ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id,
 971                                     WMI_VDEV_TYPE_MONITOR,
 972                                     0, ar->mac_addr);
 973        if (ret) {
 974                ath10k_warn(ar, "failed to request monitor vdev %i creation: %d\n",
 975                            ar->monitor_vdev_id, ret);
 976                return ret;
 977        }
 978
 979        ar->free_vdev_map &= ~(1LL << ar->monitor_vdev_id);
 980        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d created\n",
 981                   ar->monitor_vdev_id);
 982
 983        return 0;
 984}
 985
 986static int ath10k_monitor_vdev_delete(struct ath10k *ar)
 987{
 988        int ret = 0;
 989
 990        lockdep_assert_held(&ar->conf_mutex);
 991
 992        ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
 993        if (ret) {
 994                ath10k_warn(ar, "failed to request wmi monitor vdev %i removal: %d\n",
 995                            ar->monitor_vdev_id, ret);
 996                return ret;
 997        }
 998
 999        ar->free_vdev_map |= 1LL << ar->monitor_vdev_id;
1000
1001        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n",
1002                   ar->monitor_vdev_id);
1003        return ret;
1004}
1005
1006static int ath10k_monitor_start(struct ath10k *ar)
1007{
1008        int ret;
1009
1010        lockdep_assert_held(&ar->conf_mutex);
1011
1012        ret = ath10k_monitor_vdev_create(ar);
1013        if (ret) {
1014                ath10k_warn(ar, "failed to create monitor vdev: %d\n", ret);
1015                return ret;
1016        }
1017
1018        ret = ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id);
1019        if (ret) {
1020                ath10k_warn(ar, "failed to start monitor vdev: %d\n", ret);
1021                ath10k_monitor_vdev_delete(ar);
1022                return ret;
1023        }
1024
1025        ar->monitor_started = true;
1026        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor started\n");
1027
1028        return 0;
1029}
1030
1031static int ath10k_monitor_stop(struct ath10k *ar)
1032{
1033        int ret;
1034
1035        lockdep_assert_held(&ar->conf_mutex);
1036
1037        ret = ath10k_monitor_vdev_stop(ar);
1038        if (ret) {
1039                ath10k_warn(ar, "failed to stop monitor vdev: %d\n", ret);
1040                return ret;
1041        }
1042
1043        ret = ath10k_monitor_vdev_delete(ar);
1044        if (ret) {
1045                ath10k_warn(ar, "failed to delete monitor vdev: %d\n", ret);
1046                return ret;
1047        }
1048
1049        ar->monitor_started = false;
1050        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopped\n");
1051
1052        return 0;
1053}
1054
1055static bool ath10k_mac_monitor_vdev_is_needed(struct ath10k *ar)
1056{
1057        int num_ctx;
1058
1059        /* At least one chanctx is required to derive a channel to start
1060         * monitor vdev on.
1061         */
1062        num_ctx = ath10k_mac_num_chanctxs(ar);
1063        if (num_ctx == 0)
1064                return false;
1065
1066        /* If there's already an existing special monitor interface then don't
1067         * bother creating another monitor vdev.
1068         */
1069        if (ar->monitor_arvif)
1070                return false;
1071
1072        return ar->monitor ||
1073               test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1074}
1075
1076static bool ath10k_mac_monitor_vdev_is_allowed(struct ath10k *ar)
1077{
1078        int num_ctx;
1079
1080        num_ctx = ath10k_mac_num_chanctxs(ar);
1081
1082        /* FIXME: Current interface combinations and cfg80211/mac80211 code
1083         * shouldn't allow this but make sure to prevent handling the following
1084         * case anyway since multi-channel DFS hasn't been tested at all.
1085         */
1086        if (test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags) && num_ctx > 1)
1087                return false;
1088
1089        return true;
1090}
1091
1092static int ath10k_monitor_recalc(struct ath10k *ar)
1093{
1094        bool needed;
1095        bool allowed;
1096        int ret;
1097
1098        lockdep_assert_held(&ar->conf_mutex);
1099
1100        needed = ath10k_mac_monitor_vdev_is_needed(ar);
1101        allowed = ath10k_mac_monitor_vdev_is_allowed(ar);
1102
1103        ath10k_dbg(ar, ATH10K_DBG_MAC,
1104                   "mac monitor recalc started? %d needed? %d allowed? %d\n",
1105                   ar->monitor_started, needed, allowed);
1106
1107        if (WARN_ON(needed && !allowed)) {
1108                if (ar->monitor_started) {
1109                        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopping disallowed monitor\n");
1110
1111                        ret = ath10k_monitor_stop(ar);
1112                        if (ret)
1113                                ath10k_warn(ar, "failed to stop disallowed monitor: %d\n", ret);
1114                                /* not serious */
1115                }
1116
1117                return -EPERM;
1118        }
1119
1120        if (needed == ar->monitor_started)
1121                return 0;
1122
1123        if (needed)
1124                return ath10k_monitor_start(ar);
1125        else
1126                return ath10k_monitor_stop(ar);
1127}
1128
1129static int ath10k_recalc_rtscts_prot(struct ath10k_vif *arvif)
1130{
1131        struct ath10k *ar = arvif->ar;
1132        u32 vdev_param, rts_cts = 0;
1133
1134        lockdep_assert_held(&ar->conf_mutex);
1135
1136        vdev_param = ar->wmi.vdev_param->enable_rtscts;
1137
1138        rts_cts |= SM(WMI_RTSCTS_ENABLED, WMI_RTSCTS_SET);
1139
1140        if (arvif->num_legacy_stations > 0)
1141                rts_cts |= SM(WMI_RTSCTS_ACROSS_SW_RETRIES,
1142                              WMI_RTSCTS_PROFILE);
1143        else
1144                rts_cts |= SM(WMI_RTSCTS_FOR_SECOND_RATESERIES,
1145                              WMI_RTSCTS_PROFILE);
1146
1147        return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
1148                                         rts_cts);
1149}
1150
1151static int ath10k_start_cac(struct ath10k *ar)
1152{
1153        int ret;
1154
1155        lockdep_assert_held(&ar->conf_mutex);
1156
1157        set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1158
1159        ret = ath10k_monitor_recalc(ar);
1160        if (ret) {
1161                ath10k_warn(ar, "failed to start monitor (cac): %d\n", ret);
1162                clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1163                return ret;
1164        }
1165
1166        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac start monitor vdev %d\n",
1167                   ar->monitor_vdev_id);
1168
1169        return 0;
1170}
1171
1172static int ath10k_stop_cac(struct ath10k *ar)
1173{
1174        lockdep_assert_held(&ar->conf_mutex);
1175
1176        /* CAC is not running - do nothing */
1177        if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags))
1178                return 0;
1179
1180        clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1181        ath10k_monitor_stop(ar);
1182
1183        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac finished\n");
1184
1185        return 0;
1186}
1187
1188static void ath10k_mac_has_radar_iter(struct ieee80211_hw *hw,
1189                                      struct ieee80211_chanctx_conf *conf,
1190                                      void *data)
1191{
1192        bool *ret = data;
1193
1194        if (!*ret && conf->radar_enabled)
1195                *ret = true;
1196}
1197
1198static bool ath10k_mac_has_radar_enabled(struct ath10k *ar)
1199{
1200        bool has_radar = false;
1201
1202        ieee80211_iter_chan_contexts_atomic(ar->hw,
1203                                            ath10k_mac_has_radar_iter,
1204                                            &has_radar);
1205
1206        return has_radar;
1207}
1208
1209static void ath10k_recalc_radar_detection(struct ath10k *ar)
1210{
1211        int ret;
1212
1213        lockdep_assert_held(&ar->conf_mutex);
1214
1215        ath10k_stop_cac(ar);
1216
1217        if (!ath10k_mac_has_radar_enabled(ar))
1218                return;
1219
1220        if (ar->num_started_vdevs > 0)
1221                return;
1222
1223        ret = ath10k_start_cac(ar);
1224        if (ret) {
1225                /*
1226                 * Not possible to start CAC on current channel so starting
1227                 * radiation is not allowed, make this channel DFS_UNAVAILABLE
1228                 * by indicating that radar was detected.
1229                 */
1230                ath10k_warn(ar, "failed to start CAC: %d\n", ret);
1231                ieee80211_radar_detected(ar->hw);
1232        }
1233}
1234
1235static int ath10k_vdev_stop(struct ath10k_vif *arvif)
1236{
1237        struct ath10k *ar = arvif->ar;
1238        int ret;
1239
1240        lockdep_assert_held(&ar->conf_mutex);
1241
1242        reinit_completion(&ar->vdev_setup_done);
1243
1244        ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id);
1245        if (ret) {
1246                ath10k_warn(ar, "failed to stop WMI vdev %i: %d\n",
1247                            arvif->vdev_id, ret);
1248                return ret;
1249        }
1250
1251        ret = ath10k_vdev_setup_sync(ar);
1252        if (ret) {
1253                ath10k_warn(ar, "failed to syncronise setup for vdev %i: %d\n",
1254                            arvif->vdev_id, ret);
1255                return ret;
1256        }
1257
1258        WARN_ON(ar->num_started_vdevs == 0);
1259
1260        if (ar->num_started_vdevs != 0) {
1261                ar->num_started_vdevs--;
1262                ath10k_recalc_radar_detection(ar);
1263        }
1264
1265        return ret;
1266}
1267
1268static int ath10k_vdev_start_restart(struct ath10k_vif *arvif,
1269                                     const struct cfg80211_chan_def *chandef,
1270                                     bool restart)
1271{
1272        struct ath10k *ar = arvif->ar;
1273        struct wmi_vdev_start_request_arg arg = {};
1274        int ret = 0;
1275
1276        lockdep_assert_held(&ar->conf_mutex);
1277
1278        reinit_completion(&ar->vdev_setup_done);
1279
1280        arg.vdev_id = arvif->vdev_id;
1281        arg.dtim_period = arvif->dtim_period;
1282        arg.bcn_intval = arvif->beacon_interval;
1283
1284        arg.channel.freq = chandef->chan->center_freq;
1285        arg.channel.band_center_freq1 = chandef->center_freq1;
1286        arg.channel.mode = chan_to_phymode(chandef);
1287
1288        arg.channel.min_power = 0;
1289        arg.channel.max_power = chandef->chan->max_power * 2;
1290        arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
1291        arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain * 2;
1292
1293        if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
1294                arg.ssid = arvif->u.ap.ssid;
1295                arg.ssid_len = arvif->u.ap.ssid_len;
1296                arg.hidden_ssid = arvif->u.ap.hidden_ssid;
1297
1298                /* For now allow DFS for AP mode */
1299                arg.channel.chan_radar =
1300                        !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
1301        } else if (arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
1302                arg.ssid = arvif->vif->bss_conf.ssid;
1303                arg.ssid_len = arvif->vif->bss_conf.ssid_len;
1304        }
1305
1306        ath10k_dbg(ar, ATH10K_DBG_MAC,
1307                   "mac vdev %d start center_freq %d phymode %s\n",
1308                   arg.vdev_id, arg.channel.freq,
1309                   ath10k_wmi_phymode_str(arg.channel.mode));
1310
1311        if (restart)
1312                ret = ath10k_wmi_vdev_restart(ar, &arg);
1313        else
1314                ret = ath10k_wmi_vdev_start(ar, &arg);
1315
1316        if (ret) {
1317                ath10k_warn(ar, "failed to start WMI vdev %i: %d\n",
1318                            arg.vdev_id, ret);
1319                return ret;
1320        }
1321
1322        ret = ath10k_vdev_setup_sync(ar);
1323        if (ret) {
1324                ath10k_warn(ar,
1325                            "failed to synchronize setup for vdev %i restart %d: %d\n",
1326                            arg.vdev_id, restart, ret);
1327                return ret;
1328        }
1329
1330        ar->num_started_vdevs++;
1331        ath10k_recalc_radar_detection(ar);
1332
1333        return ret;
1334}
1335
1336static int ath10k_vdev_start(struct ath10k_vif *arvif,
1337                             const struct cfg80211_chan_def *def)
1338{
1339        return ath10k_vdev_start_restart(arvif, def, false);
1340}
1341
1342static int ath10k_vdev_restart(struct ath10k_vif *arvif,
1343                               const struct cfg80211_chan_def *def)
1344{
1345        return ath10k_vdev_start_restart(arvif, def, true);
1346}
1347
1348static int ath10k_mac_setup_bcn_p2p_ie(struct ath10k_vif *arvif,
1349                                       struct sk_buff *bcn)
1350{
1351        struct ath10k *ar = arvif->ar;
1352        struct ieee80211_mgmt *mgmt;
1353        const u8 *p2p_ie;
1354        int ret;
1355
1356        if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1357                return 0;
1358
1359        if (arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
1360                return 0;
1361
1362        mgmt = (void *)bcn->data;
1363        p2p_ie = cfg80211_find_vendor_ie(WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1364                                         mgmt->u.beacon.variable,
1365                                         bcn->len - (mgmt->u.beacon.variable -
1366                                                     bcn->data));
1367        if (!p2p_ie)
1368                return -ENOENT;
1369
1370        ret = ath10k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie);
1371        if (ret) {
1372                ath10k_warn(ar, "failed to submit p2p go bcn ie for vdev %i: %d\n",
1373                            arvif->vdev_id, ret);
1374                return ret;
1375        }
1376
1377        return 0;
1378}
1379
1380static int ath10k_mac_remove_vendor_ie(struct sk_buff *skb, unsigned int oui,
1381                                       u8 oui_type, size_t ie_offset)
1382{
1383        size_t len;
1384        const u8 *next;
1385        const u8 *end;
1386        u8 *ie;
1387
1388        if (WARN_ON(skb->len < ie_offset))
1389                return -EINVAL;
1390
1391        ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type,
1392                                           skb->data + ie_offset,
1393                                           skb->len - ie_offset);
1394        if (!ie)
1395                return -ENOENT;
1396
1397        len = ie[1] + 2;
1398        end = skb->data + skb->len;
1399        next = ie + len;
1400
1401        if (WARN_ON(next > end))
1402                return -EINVAL;
1403
1404        memmove(ie, next, end - next);
1405        skb_trim(skb, skb->len - len);
1406
1407        return 0;
1408}
1409
1410static int ath10k_mac_setup_bcn_tmpl(struct ath10k_vif *arvif)
1411{
1412        struct ath10k *ar = arvif->ar;
1413        struct ieee80211_hw *hw = ar->hw;
1414        struct ieee80211_vif *vif = arvif->vif;
1415        struct ieee80211_mutable_offsets offs = {};
1416        struct sk_buff *bcn;
1417        int ret;
1418
1419        if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1420                return 0;
1421
1422        if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
1423            arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
1424                return 0;
1425
1426        bcn = ieee80211_beacon_get_template(hw, vif, &offs);
1427        if (!bcn) {
1428                ath10k_warn(ar, "failed to get beacon template from mac80211\n");
1429                return -EPERM;
1430        }
1431
1432        ret = ath10k_mac_setup_bcn_p2p_ie(arvif, bcn);
1433        if (ret) {
1434                ath10k_warn(ar, "failed to setup p2p go bcn ie: %d\n", ret);
1435                kfree_skb(bcn);
1436                return ret;
1437        }
1438
1439        /* P2P IE is inserted by firmware automatically (as configured above)
1440         * so remove it from the base beacon template to avoid duplicate P2P
1441         * IEs in beacon frames.
1442         */
1443        ath10k_mac_remove_vendor_ie(bcn, WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1444                                    offsetof(struct ieee80211_mgmt,
1445                                             u.beacon.variable));
1446
1447        ret = ath10k_wmi_bcn_tmpl(ar, arvif->vdev_id, offs.tim_offset, bcn, 0,
1448                                  0, NULL, 0);
1449        kfree_skb(bcn);
1450
1451        if (ret) {
1452                ath10k_warn(ar, "failed to submit beacon template command: %d\n",
1453                            ret);
1454                return ret;
1455        }
1456
1457        return 0;
1458}
1459
1460static int ath10k_mac_setup_prb_tmpl(struct ath10k_vif *arvif)
1461{
1462        struct ath10k *ar = arvif->ar;
1463        struct ieee80211_hw *hw = ar->hw;
1464        struct ieee80211_vif *vif = arvif->vif;
1465        struct sk_buff *prb;
1466        int ret;
1467
1468        if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1469                return 0;
1470
1471        if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1472                return 0;
1473
1474        prb = ieee80211_proberesp_get(hw, vif);
1475        if (!prb) {
1476                ath10k_warn(ar, "failed to get probe resp template from mac80211\n");
1477                return -EPERM;
1478        }
1479
1480        ret = ath10k_wmi_prb_tmpl(ar, arvif->vdev_id, prb);
1481        kfree_skb(prb);
1482
1483        if (ret) {
1484                ath10k_warn(ar, "failed to submit probe resp template command: %d\n",
1485                            ret);
1486                return ret;
1487        }
1488
1489        return 0;
1490}
1491
1492static int ath10k_mac_vif_fix_hidden_ssid(struct ath10k_vif *arvif)
1493{
1494        struct ath10k *ar = arvif->ar;
1495        struct cfg80211_chan_def def;
1496        int ret;
1497
1498        /* When originally vdev is started during assign_vif_chanctx() some
1499         * information is missing, notably SSID. Firmware revisions with beacon
1500         * offloading require the SSID to be provided during vdev (re)start to
1501         * handle hidden SSID properly.
1502         *
1503         * Vdev restart must be done after vdev has been both started and
1504         * upped. Otherwise some firmware revisions (at least 10.2) fail to
1505         * deliver vdev restart response event causing timeouts during vdev
1506         * syncing in ath10k.
1507         *
1508         * Note: The vdev down/up and template reinstallation could be skipped
1509         * since only wmi-tlv firmware are known to have beacon offload and
1510         * wmi-tlv doesn't seem to misbehave like 10.2 wrt vdev restart
1511         * response delivery. It's probably more robust to keep it as is.
1512         */
1513        if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1514                return 0;
1515
1516        if (WARN_ON(!arvif->is_started))
1517                return -EINVAL;
1518
1519        if (WARN_ON(!arvif->is_up))
1520                return -EINVAL;
1521
1522        if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def)))
1523                return -EINVAL;
1524
1525        ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1526        if (ret) {
1527                ath10k_warn(ar, "failed to bring down ap vdev %i: %d\n",
1528                            arvif->vdev_id, ret);
1529                return ret;
1530        }
1531
1532        /* Vdev down reset beacon & presp templates. Reinstall them. Otherwise
1533         * firmware will crash upon vdev up.
1534         */
1535
1536        ret = ath10k_mac_setup_bcn_tmpl(arvif);
1537        if (ret) {
1538                ath10k_warn(ar, "failed to update beacon template: %d\n", ret);
1539                return ret;
1540        }
1541
1542        ret = ath10k_mac_setup_prb_tmpl(arvif);
1543        if (ret) {
1544                ath10k_warn(ar, "failed to update presp template: %d\n", ret);
1545                return ret;
1546        }
1547
1548        ret = ath10k_vdev_restart(arvif, &def);
1549        if (ret) {
1550                ath10k_warn(ar, "failed to restart ap vdev %i: %d\n",
1551                            arvif->vdev_id, ret);
1552                return ret;
1553        }
1554
1555        ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1556                                 arvif->bssid);
1557        if (ret) {
1558                ath10k_warn(ar, "failed to bring up ap vdev %i: %d\n",
1559                            arvif->vdev_id, ret);
1560                return ret;
1561        }
1562
1563        return 0;
1564}
1565
1566static void ath10k_control_beaconing(struct ath10k_vif *arvif,
1567                                     struct ieee80211_bss_conf *info)
1568{
1569        struct ath10k *ar = arvif->ar;
1570        int ret = 0;
1571
1572        lockdep_assert_held(&arvif->ar->conf_mutex);
1573
1574        if (!info->enable_beacon) {
1575                ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1576                if (ret)
1577                        ath10k_warn(ar, "failed to down vdev_id %i: %d\n",
1578                                    arvif->vdev_id, ret);
1579
1580                arvif->is_up = false;
1581
1582                spin_lock_bh(&arvif->ar->data_lock);
1583                ath10k_mac_vif_beacon_free(arvif);
1584                spin_unlock_bh(&arvif->ar->data_lock);
1585
1586                return;
1587        }
1588
1589        arvif->tx_seq_no = 0x1000;
1590
1591        arvif->aid = 0;
1592        ether_addr_copy(arvif->bssid, info->bssid);
1593
1594        ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1595                                 arvif->bssid);
1596        if (ret) {
1597                ath10k_warn(ar, "failed to bring up vdev %d: %i\n",
1598                            arvif->vdev_id, ret);
1599                return;
1600        }
1601
1602        arvif->is_up = true;
1603
1604        ret = ath10k_mac_vif_fix_hidden_ssid(arvif);
1605        if (ret) {
1606                ath10k_warn(ar, "failed to fix hidden ssid for vdev %i, expect trouble: %d\n",
1607                            arvif->vdev_id, ret);
1608                return;
1609        }
1610
1611        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
1612}
1613
1614static void ath10k_control_ibss(struct ath10k_vif *arvif,
1615                                struct ieee80211_bss_conf *info,
1616                                const u8 self_peer[ETH_ALEN])
1617{
1618        struct ath10k *ar = arvif->ar;
1619        u32 vdev_param;
1620        int ret = 0;
1621
1622        lockdep_assert_held(&arvif->ar->conf_mutex);
1623
1624        if (!info->ibss_joined) {
1625                if (is_zero_ether_addr(arvif->bssid))
1626                        return;
1627
1628                eth_zero_addr(arvif->bssid);
1629
1630                return;
1631        }
1632
1633        vdev_param = arvif->ar->wmi.vdev_param->atim_window;
1634        ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param,
1635                                        ATH10K_DEFAULT_ATIM);
1636        if (ret)
1637                ath10k_warn(ar, "failed to set IBSS ATIM for vdev %d: %d\n",
1638                            arvif->vdev_id, ret);
1639}
1640
1641static int ath10k_mac_vif_recalc_ps_wake_threshold(struct ath10k_vif *arvif)
1642{
1643        struct ath10k *ar = arvif->ar;
1644        u32 param;
1645        u32 value;
1646        int ret;
1647
1648        lockdep_assert_held(&arvif->ar->conf_mutex);
1649
1650        if (arvif->u.sta.uapsd)
1651                value = WMI_STA_PS_TX_WAKE_THRESHOLD_NEVER;
1652        else
1653                value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
1654
1655        param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
1656        ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, value);
1657        if (ret) {
1658                ath10k_warn(ar, "failed to submit ps wake threshold %u on vdev %i: %d\n",
1659                            value, arvif->vdev_id, ret);
1660                return ret;
1661        }
1662
1663        return 0;
1664}
1665
1666static int ath10k_mac_vif_recalc_ps_poll_count(struct ath10k_vif *arvif)
1667{
1668        struct ath10k *ar = arvif->ar;
1669        u32 param;
1670        u32 value;
1671        int ret;
1672
1673        lockdep_assert_held(&arvif->ar->conf_mutex);
1674
1675        if (arvif->u.sta.uapsd)
1676                value = WMI_STA_PS_PSPOLL_COUNT_UAPSD;
1677        else
1678                value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
1679
1680        param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
1681        ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
1682                                          param, value);
1683        if (ret) {
1684                ath10k_warn(ar, "failed to submit ps poll count %u on vdev %i: %d\n",
1685                            value, arvif->vdev_id, ret);
1686                return ret;
1687        }
1688
1689        return 0;
1690}
1691
1692static int ath10k_mac_num_vifs_started(struct ath10k *ar)
1693{
1694        struct ath10k_vif *arvif;
1695        int num = 0;
1696
1697        lockdep_assert_held(&ar->conf_mutex);
1698
1699        list_for_each_entry(arvif, &ar->arvifs, list)
1700                if (arvif->is_started)
1701                        num++;
1702
1703        return num;
1704}
1705
1706static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif)
1707{
1708        struct ath10k *ar = arvif->ar;
1709        struct ieee80211_vif *vif = arvif->vif;
1710        struct ieee80211_conf *conf = &ar->hw->conf;
1711        enum wmi_sta_powersave_param param;
1712        enum wmi_sta_ps_mode psmode;
1713        int ret;
1714        int ps_timeout;
1715        bool enable_ps;
1716
1717        lockdep_assert_held(&arvif->ar->conf_mutex);
1718
1719        if (arvif->vif->type != NL80211_IFTYPE_STATION)
1720                return 0;
1721
1722        enable_ps = arvif->ps;
1723
1724        if (enable_ps && ath10k_mac_num_vifs_started(ar) > 1 &&
1725            !test_bit(ATH10K_FW_FEATURE_MULTI_VIF_PS_SUPPORT,
1726                      ar->fw_features)) {
1727                ath10k_warn(ar, "refusing to enable ps on vdev %i: not supported by fw\n",
1728                            arvif->vdev_id);
1729                enable_ps = false;
1730        }
1731
1732        if (!arvif->is_started) {
1733                /* mac80211 can update vif powersave state while disconnected.
1734                 * Firmware doesn't behave nicely and consumes more power than
1735                 * necessary if PS is disabled on a non-started vdev. Hence
1736                 * force-enable PS for non-running vdevs.
1737                 */
1738                psmode = WMI_STA_PS_MODE_ENABLED;
1739        } else if (enable_ps) {
1740                psmode = WMI_STA_PS_MODE_ENABLED;
1741                param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1742
1743                ps_timeout = conf->dynamic_ps_timeout;
1744                if (ps_timeout == 0) {
1745                        /* Firmware doesn't like 0 */
1746                        ps_timeout = ieee80211_tu_to_usec(
1747                                vif->bss_conf.beacon_int) / 1000;
1748                }
1749
1750                ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
1751                                                  ps_timeout);
1752                if (ret) {
1753                        ath10k_warn(ar, "failed to set inactivity time for vdev %d: %i\n",
1754                                    arvif->vdev_id, ret);
1755                        return ret;
1756                }
1757        } else {
1758                psmode = WMI_STA_PS_MODE_DISABLED;
1759        }
1760
1761        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d psmode %s\n",
1762                   arvif->vdev_id, psmode ? "enable" : "disable");
1763
1764        ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode);
1765        if (ret) {
1766                ath10k_warn(ar, "failed to set PS Mode %d for vdev %d: %d\n",
1767                            psmode, arvif->vdev_id, ret);
1768                return ret;
1769        }
1770
1771        return 0;
1772}
1773
1774static int ath10k_mac_vif_disable_keepalive(struct ath10k_vif *arvif)
1775{
1776        struct ath10k *ar = arvif->ar;
1777        struct wmi_sta_keepalive_arg arg = {};
1778        int ret;
1779
1780        lockdep_assert_held(&arvif->ar->conf_mutex);
1781
1782        if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
1783                return 0;
1784
1785        if (!test_bit(WMI_SERVICE_STA_KEEP_ALIVE, ar->wmi.svc_map))
1786                return 0;
1787
1788        /* Some firmware revisions have a bug and ignore the `enabled` field.
1789         * Instead use the interval to disable the keepalive.
1790         */
1791        arg.vdev_id = arvif->vdev_id;
1792        arg.enabled = 1;
1793        arg.method = WMI_STA_KEEPALIVE_METHOD_NULL_FRAME;
1794        arg.interval = WMI_STA_KEEPALIVE_INTERVAL_DISABLE;
1795
1796        ret = ath10k_wmi_sta_keepalive(ar, &arg);
1797        if (ret) {
1798                ath10k_warn(ar, "failed to submit keepalive on vdev %i: %d\n",
1799                            arvif->vdev_id, ret);
1800                return ret;
1801        }
1802
1803        return 0;
1804}
1805
1806static void ath10k_mac_vif_ap_csa_count_down(struct ath10k_vif *arvif)
1807{
1808        struct ath10k *ar = arvif->ar;
1809        struct ieee80211_vif *vif = arvif->vif;
1810        int ret;
1811
1812        lockdep_assert_held(&arvif->ar->conf_mutex);
1813
1814        if (WARN_ON(!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)))
1815                return;
1816
1817        if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1818                return;
1819
1820        if (!vif->csa_active)
1821                return;
1822
1823        if (!arvif->is_up)
1824                return;
1825
1826        if (!ieee80211_csa_is_complete(vif)) {
1827                ieee80211_csa_update_counter(vif);
1828
1829                ret = ath10k_mac_setup_bcn_tmpl(arvif);
1830                if (ret)
1831                        ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n",
1832                                    ret);
1833
1834                ret = ath10k_mac_setup_prb_tmpl(arvif);
1835                if (ret)
1836                        ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n",
1837                                    ret);
1838        } else {
1839                ieee80211_csa_finish(vif);
1840        }
1841}
1842
1843static void ath10k_mac_vif_ap_csa_work(struct work_struct *work)
1844{
1845        struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
1846                                                ap_csa_work);
1847        struct ath10k *ar = arvif->ar;
1848
1849        mutex_lock(&ar->conf_mutex);
1850        ath10k_mac_vif_ap_csa_count_down(arvif);
1851        mutex_unlock(&ar->conf_mutex);
1852}
1853
1854static void ath10k_mac_handle_beacon_iter(void *data, u8 *mac,
1855                                          struct ieee80211_vif *vif)
1856{
1857        struct sk_buff *skb = data;
1858        struct ieee80211_mgmt *mgmt = (void *)skb->data;
1859        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1860
1861        if (vif->type != NL80211_IFTYPE_STATION)
1862                return;
1863
1864        if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid))
1865                return;
1866
1867        cancel_delayed_work(&arvif->connection_loss_work);
1868}
1869
1870void ath10k_mac_handle_beacon(struct ath10k *ar, struct sk_buff *skb)
1871{
1872        ieee80211_iterate_active_interfaces_atomic(ar->hw,
1873                                                   IEEE80211_IFACE_ITER_NORMAL,
1874                                                   ath10k_mac_handle_beacon_iter,
1875                                                   skb);
1876}
1877
1878static void ath10k_mac_handle_beacon_miss_iter(void *data, u8 *mac,
1879                                               struct ieee80211_vif *vif)
1880{
1881        u32 *vdev_id = data;
1882        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1883        struct ath10k *ar = arvif->ar;
1884        struct ieee80211_hw *hw = ar->hw;
1885
1886        if (arvif->vdev_id != *vdev_id)
1887                return;
1888
1889        if (!arvif->is_up)
1890                return;
1891
1892        ieee80211_beacon_loss(vif);
1893
1894        /* Firmware doesn't report beacon loss events repeatedly. If AP probe
1895         * (done by mac80211) succeeds but beacons do not resume then it
1896         * doesn't make sense to continue operation. Queue connection loss work
1897         * which can be cancelled when beacon is received.
1898         */
1899        ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work,
1900                                     ATH10K_CONNECTION_LOSS_HZ);
1901}
1902
1903void ath10k_mac_handle_beacon_miss(struct ath10k *ar, u32 vdev_id)
1904{
1905        ieee80211_iterate_active_interfaces_atomic(ar->hw,
1906                                                   IEEE80211_IFACE_ITER_NORMAL,
1907                                                   ath10k_mac_handle_beacon_miss_iter,
1908                                                   &vdev_id);
1909}
1910
1911static void ath10k_mac_vif_sta_connection_loss_work(struct work_struct *work)
1912{
1913        struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
1914                                                connection_loss_work.work);
1915        struct ieee80211_vif *vif = arvif->vif;
1916
1917        if (!arvif->is_up)
1918                return;
1919
1920        ieee80211_connection_loss(vif);
1921}
1922
1923/**********************/
1924/* Station management */
1925/**********************/
1926
1927static u32 ath10k_peer_assoc_h_listen_intval(struct ath10k *ar,
1928                                             struct ieee80211_vif *vif)
1929{
1930        /* Some firmware revisions have unstable STA powersave when listen
1931         * interval is set too high (e.g. 5). The symptoms are firmware doesn't
1932         * generate NullFunc frames properly even if buffered frames have been
1933         * indicated in Beacon TIM. Firmware would seldom wake up to pull
1934         * buffered frames. Often pinging the device from AP would simply fail.
1935         *
1936         * As a workaround set it to 1.
1937         */
1938        if (vif->type == NL80211_IFTYPE_STATION)
1939                return 1;
1940
1941        return ar->hw->conf.listen_interval;
1942}
1943
1944static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
1945                                      struct ieee80211_vif *vif,
1946                                      struct ieee80211_sta *sta,
1947                                      struct wmi_peer_assoc_complete_arg *arg)
1948{
1949        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1950        u32 aid;
1951
1952        lockdep_assert_held(&ar->conf_mutex);
1953
1954        if (vif->type == NL80211_IFTYPE_STATION)
1955                aid = vif->bss_conf.aid;
1956        else
1957                aid = sta->aid;
1958
1959        ether_addr_copy(arg->addr, sta->addr);
1960        arg->vdev_id = arvif->vdev_id;
1961        arg->peer_aid = aid;
1962        arg->peer_flags |= WMI_PEER_AUTH;
1963        arg->peer_listen_intval = ath10k_peer_assoc_h_listen_intval(ar, vif);
1964        arg->peer_num_spatial_streams = 1;
1965        arg->peer_caps = vif->bss_conf.assoc_capability;
1966}
1967
1968static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
1969                                       struct ieee80211_vif *vif,
1970                                       struct wmi_peer_assoc_complete_arg *arg)
1971{
1972        struct ieee80211_bss_conf *info = &vif->bss_conf;
1973        struct cfg80211_chan_def def;
1974        struct cfg80211_bss *bss;
1975        const u8 *rsnie = NULL;
1976        const u8 *wpaie = NULL;
1977
1978        lockdep_assert_held(&ar->conf_mutex);
1979
1980        if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
1981                return;
1982
1983        bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0,
1984                               IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
1985        if (bss) {
1986                const struct cfg80211_bss_ies *ies;
1987
1988                rcu_read_lock();
1989                rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1990
1991                ies = rcu_dereference(bss->ies);
1992
1993                wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1994                                                WLAN_OUI_TYPE_MICROSOFT_WPA,
1995                                                ies->data,
1996                                                ies->len);
1997                rcu_read_unlock();
1998                cfg80211_put_bss(ar->hw->wiphy, bss);
1999        }
2000
2001        /* FIXME: base on RSN IE/WPA IE is a correct idea? */
2002        if (rsnie || wpaie) {
2003                ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__);
2004                arg->peer_flags |= WMI_PEER_NEED_PTK_4_WAY;
2005        }
2006
2007        if (wpaie) {
2008                ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__);
2009                arg->peer_flags |= WMI_PEER_NEED_GTK_2_WAY;
2010        }
2011}
2012
2013static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
2014                                      struct ieee80211_vif *vif,
2015                                      struct ieee80211_sta *sta,
2016                                      struct wmi_peer_assoc_complete_arg *arg)
2017{
2018        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2019        struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
2020        struct cfg80211_chan_def def;
2021        const struct ieee80211_supported_band *sband;
2022        const struct ieee80211_rate *rates;
2023        enum ieee80211_band band;
2024        u32 ratemask;
2025        u8 rate;
2026        int i;
2027
2028        lockdep_assert_held(&ar->conf_mutex);
2029
2030        if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2031                return;
2032
2033        band = def.chan->band;
2034        sband = ar->hw->wiphy->bands[band];
2035        ratemask = sta->supp_rates[band];
2036        ratemask &= arvif->bitrate_mask.control[band].legacy;
2037        rates = sband->bitrates;
2038
2039        rateset->num_rates = 0;
2040
2041        for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
2042                if (!(ratemask & 1))
2043                        continue;
2044
2045                rate = ath10k_mac_bitrate_to_rate(rates->bitrate);
2046                rateset->rates[rateset->num_rates] = rate;
2047                rateset->num_rates++;
2048        }
2049}
2050
2051static bool
2052ath10k_peer_assoc_h_ht_masked(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
2053{
2054        int nss;
2055
2056        for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++)
2057                if (ht_mcs_mask[nss])
2058                        return false;
2059
2060        return true;
2061}
2062
2063static bool
2064ath10k_peer_assoc_h_vht_masked(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
2065{
2066        int nss;
2067
2068        for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++)
2069                if (vht_mcs_mask[nss])
2070                        return false;
2071
2072        return true;
2073}
2074
2075static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
2076                                   struct ieee80211_vif *vif,
2077                                   struct ieee80211_sta *sta,
2078                                   struct wmi_peer_assoc_complete_arg *arg)
2079{
2080        const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
2081        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2082        struct cfg80211_chan_def def;
2083        enum ieee80211_band band;
2084        const u8 *ht_mcs_mask;
2085        const u16 *vht_mcs_mask;
2086        int i, n, max_nss;
2087        u32 stbc;
2088
2089        lockdep_assert_held(&ar->conf_mutex);
2090
2091        if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2092                return;
2093
2094        if (!ht_cap->ht_supported)
2095                return;
2096
2097        band = def.chan->band;
2098        ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2099        vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2100
2101        if (ath10k_peer_assoc_h_ht_masked(ht_mcs_mask) &&
2102            ath10k_peer_assoc_h_vht_masked(vht_mcs_mask))
2103                return;
2104
2105        arg->peer_flags |= WMI_PEER_HT;
2106        arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2107                                    ht_cap->ampdu_factor)) - 1;
2108
2109        arg->peer_mpdu_density =
2110                ath10k_parse_mpdudensity(ht_cap->ampdu_density);
2111
2112        arg->peer_ht_caps = ht_cap->cap;
2113        arg->peer_rate_caps |= WMI_RC_HT_FLAG;
2114
2115        if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
2116                arg->peer_flags |= WMI_PEER_LDPC;
2117
2118        if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
2119                arg->peer_flags |= WMI_PEER_40MHZ;
2120                arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
2121        }
2122
2123        if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) {
2124                if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20)
2125                        arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
2126
2127                if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40)
2128                        arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
2129        }
2130
2131        if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
2132                arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG;
2133                arg->peer_flags |= WMI_PEER_STBC;
2134        }
2135
2136        if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
2137                stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
2138                stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
2139                stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
2140                arg->peer_rate_caps |= stbc;
2141                arg->peer_flags |= WMI_PEER_STBC;
2142        }
2143
2144        if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
2145                arg->peer_rate_caps |= WMI_RC_TS_FLAG;
2146        else if (ht_cap->mcs.rx_mask[1])
2147                arg->peer_rate_caps |= WMI_RC_DS_FLAG;
2148
2149        for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
2150                if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
2151                    (ht_mcs_mask[i / 8] & BIT(i % 8))) {
2152                        max_nss = (i / 8) + 1;
2153                        arg->peer_ht_rates.rates[n++] = i;
2154                }
2155
2156        /*
2157         * This is a workaround for HT-enabled STAs which break the spec
2158         * and have no HT capabilities RX mask (no HT RX MCS map).
2159         *
2160         * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
2161         * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
2162         *
2163         * Firmware asserts if such situation occurs.
2164         */
2165        if (n == 0) {
2166                arg->peer_ht_rates.num_rates = 8;
2167                for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
2168                        arg->peer_ht_rates.rates[i] = i;
2169        } else {
2170                arg->peer_ht_rates.num_rates = n;
2171                arg->peer_num_spatial_streams = max_nss;
2172        }
2173
2174        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
2175                   arg->addr,
2176                   arg->peer_ht_rates.num_rates,
2177                   arg->peer_num_spatial_streams);
2178}
2179
2180static int ath10k_peer_assoc_qos_ap(struct ath10k *ar,
2181                                    struct ath10k_vif *arvif,
2182                                    struct ieee80211_sta *sta)
2183{
2184        u32 uapsd = 0;
2185        u32 max_sp = 0;
2186        int ret = 0;
2187
2188        lockdep_assert_held(&ar->conf_mutex);
2189
2190        if (sta->wme && sta->uapsd_queues) {
2191                ath10k_dbg(ar, ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
2192                           sta->uapsd_queues, sta->max_sp);
2193
2194                if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
2195                        uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
2196                                 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
2197                if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
2198                        uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
2199                                 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
2200                if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
2201                        uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
2202                                 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
2203                if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
2204                        uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
2205                                 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
2206
2207                if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
2208                        max_sp = sta->max_sp;
2209
2210                ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
2211                                                 sta->addr,
2212                                                 WMI_AP_PS_PEER_PARAM_UAPSD,
2213                                                 uapsd);
2214                if (ret) {
2215                        ath10k_warn(ar, "failed to set ap ps peer param uapsd for vdev %i: %d\n",
2216                                    arvif->vdev_id, ret);
2217                        return ret;
2218                }
2219
2220                ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
2221                                                 sta->addr,
2222                                                 WMI_AP_PS_PEER_PARAM_MAX_SP,
2223                                                 max_sp);
2224                if (ret) {
2225                        ath10k_warn(ar, "failed to set ap ps peer param max sp for vdev %i: %d\n",
2226                                    arvif->vdev_id, ret);
2227                        return ret;
2228                }
2229
2230                /* TODO setup this based on STA listen interval and
2231                   beacon interval. Currently we don't know
2232                   sta->listen_interval - mac80211 patch required.
2233                   Currently use 10 seconds */
2234                ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr,
2235                                                 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME,
2236                                                 10);
2237                if (ret) {
2238                        ath10k_warn(ar, "failed to set ap ps peer param ageout time for vdev %i: %d\n",
2239                                    arvif->vdev_id, ret);
2240                        return ret;
2241                }
2242        }
2243
2244        return 0;
2245}
2246
2247static u16
2248ath10k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
2249                              const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
2250{
2251        int idx_limit;
2252        int nss;
2253        u16 mcs_map;
2254        u16 mcs;
2255
2256        for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
2257                mcs_map = ath10k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
2258                          vht_mcs_limit[nss];
2259
2260                if (mcs_map)
2261                        idx_limit = fls(mcs_map) - 1;
2262                else
2263                        idx_limit = -1;
2264
2265                switch (idx_limit) {
2266                case 0: /* fall through */
2267                case 1: /* fall through */
2268                case 2: /* fall through */
2269                case 3: /* fall through */
2270                case 4: /* fall through */
2271                case 5: /* fall through */
2272                case 6: /* fall through */
2273                default:
2274                        /* see ath10k_mac_can_set_bitrate_mask() */
2275                        WARN_ON(1);
2276                        /* fall through */
2277                case -1:
2278                        mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
2279                        break;
2280                case 7:
2281                        mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
2282                        break;
2283                case 8:
2284                        mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
2285                        break;
2286                case 9:
2287                        mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
2288                        break;
2289                }
2290
2291                tx_mcs_set &= ~(0x3 << (nss * 2));
2292                tx_mcs_set |= mcs << (nss * 2);
2293        }
2294
2295        return tx_mcs_set;
2296}
2297
2298static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
2299                                    struct ieee80211_vif *vif,
2300                                    struct ieee80211_sta *sta,
2301                                    struct wmi_peer_assoc_complete_arg *arg)
2302{
2303        const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
2304        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2305        struct cfg80211_chan_def def;
2306        enum ieee80211_band band;
2307        const u16 *vht_mcs_mask;
2308        u8 ampdu_factor;
2309
2310        if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2311                return;
2312
2313        if (!vht_cap->vht_supported)
2314                return;
2315
2316        band = def.chan->band;
2317        vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2318
2319        if (ath10k_peer_assoc_h_vht_masked(vht_mcs_mask))
2320                return;
2321
2322        arg->peer_flags |= WMI_PEER_VHT;
2323
2324        if (def.chan->band == IEEE80211_BAND_2GHZ)
2325                arg->peer_flags |= WMI_PEER_VHT_2G;
2326
2327        arg->peer_vht_caps = vht_cap->cap;
2328
2329        ampdu_factor = (vht_cap->cap &
2330                        IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
2331                       IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
2332
2333        /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
2334         * zero in VHT IE. Using it would result in degraded throughput.
2335         * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
2336         * it if VHT max_mpdu is smaller. */
2337        arg->peer_max_mpdu = max(arg->peer_max_mpdu,
2338                                 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2339                                        ampdu_factor)) - 1);
2340
2341        if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2342                arg->peer_flags |= WMI_PEER_80MHZ;
2343
2344        arg->peer_vht_rates.rx_max_rate =
2345                __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
2346        arg->peer_vht_rates.rx_mcs_set =
2347                __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
2348        arg->peer_vht_rates.tx_max_rate =
2349                __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
2350        arg->peer_vht_rates.tx_mcs_set = ath10k_peer_assoc_h_vht_limit(
2351                __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map), vht_mcs_mask);
2352
2353        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
2354                   sta->addr, arg->peer_max_mpdu, arg->peer_flags);
2355}
2356
2357static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
2358                                    struct ieee80211_vif *vif,
2359                                    struct ieee80211_sta *sta,
2360                                    struct wmi_peer_assoc_complete_arg *arg)
2361{
2362        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2363
2364        switch (arvif->vdev_type) {
2365        case WMI_VDEV_TYPE_AP:
2366                if (sta->wme)
2367                        arg->peer_flags |= WMI_PEER_QOS;
2368
2369                if (sta->wme && sta->uapsd_queues) {
2370                        arg->peer_flags |= WMI_PEER_APSD;
2371                        arg->peer_rate_caps |= WMI_RC_UAPSD_FLAG;
2372                }
2373                break;
2374        case WMI_VDEV_TYPE_STA:
2375                if (vif->bss_conf.qos)
2376                        arg->peer_flags |= WMI_PEER_QOS;
2377                break;
2378        case WMI_VDEV_TYPE_IBSS:
2379                if (sta->wme)
2380                        arg->peer_flags |= WMI_PEER_QOS;
2381                break;
2382        default:
2383                break;
2384        }
2385
2386        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM qos %d\n",
2387                   sta->addr, !!(arg->peer_flags & WMI_PEER_QOS));
2388}
2389
2390static bool ath10k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
2391{
2392        return sta->supp_rates[IEEE80211_BAND_2GHZ] >>
2393               ATH10K_MAC_FIRST_OFDM_RATE_IDX;
2394}
2395
2396static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
2397                                        struct ieee80211_vif *vif,
2398                                        struct ieee80211_sta *sta,
2399                                        struct wmi_peer_assoc_complete_arg *arg)
2400{
2401        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2402        struct cfg80211_chan_def def;
2403        enum ieee80211_band band;
2404        const u8 *ht_mcs_mask;
2405        const u16 *vht_mcs_mask;
2406        enum wmi_phy_mode phymode = MODE_UNKNOWN;
2407
2408        if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2409                return;
2410
2411        band = def.chan->band;
2412        ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2413        vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2414
2415        switch (band) {
2416        case IEEE80211_BAND_2GHZ:
2417                if (sta->vht_cap.vht_supported &&
2418                    !ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2419                        if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2420                                phymode = MODE_11AC_VHT40;
2421                        else
2422                                phymode = MODE_11AC_VHT20;
2423                } else if (sta->ht_cap.ht_supported &&
2424                           !ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2425                        if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2426                                phymode = MODE_11NG_HT40;
2427                        else
2428                                phymode = MODE_11NG_HT20;
2429                } else if (ath10k_mac_sta_has_ofdm_only(sta)) {
2430                        phymode = MODE_11G;
2431                } else {
2432                        phymode = MODE_11B;
2433                }
2434
2435                break;
2436        case IEEE80211_BAND_5GHZ:
2437                /*
2438                 * Check VHT first.
2439                 */
2440                if (sta->vht_cap.vht_supported &&
2441                    !ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2442                        if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2443                                phymode = MODE_11AC_VHT80;
2444                        else if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2445                                phymode = MODE_11AC_VHT40;
2446                        else if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
2447                                phymode = MODE_11AC_VHT20;
2448                } else if (sta->ht_cap.ht_supported &&
2449                           !ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2450                        if (sta->bandwidth >= IEEE80211_STA_RX_BW_40)
2451                                phymode = MODE_11NA_HT40;
2452                        else
2453                                phymode = MODE_11NA_HT20;
2454                } else {
2455                        phymode = MODE_11A;
2456                }
2457
2458                break;
2459        default:
2460                break;
2461        }
2462
2463        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM phymode %s\n",
2464                   sta->addr, ath10k_wmi_phymode_str(phymode));
2465
2466        arg->peer_phymode = phymode;
2467        WARN_ON(phymode == MODE_UNKNOWN);
2468}
2469
2470static int ath10k_peer_assoc_prepare(struct ath10k *ar,
2471                                     struct ieee80211_vif *vif,
2472                                     struct ieee80211_sta *sta,
2473                                     struct wmi_peer_assoc_complete_arg *arg)
2474{
2475        lockdep_assert_held(&ar->conf_mutex);
2476
2477        memset(arg, 0, sizeof(*arg));
2478
2479        ath10k_peer_assoc_h_basic(ar, vif, sta, arg);
2480        ath10k_peer_assoc_h_crypto(ar, vif, arg);
2481        ath10k_peer_assoc_h_rates(ar, vif, sta, arg);
2482        ath10k_peer_assoc_h_ht(ar, vif, sta, arg);
2483        ath10k_peer_assoc_h_vht(ar, vif, sta, arg);
2484        ath10k_peer_assoc_h_qos(ar, vif, sta, arg);
2485        ath10k_peer_assoc_h_phymode(ar, vif, sta, arg);
2486
2487        return 0;
2488}
2489
2490static const u32 ath10k_smps_map[] = {
2491        [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
2492        [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
2493        [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
2494        [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
2495};
2496
2497static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif,
2498                                  const u8 *addr,
2499                                  const struct ieee80211_sta_ht_cap *ht_cap)
2500{
2501        int smps;
2502
2503        if (!ht_cap->ht_supported)
2504                return 0;
2505
2506        smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2507        smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2508
2509        if (smps >= ARRAY_SIZE(ath10k_smps_map))
2510                return -EINVAL;
2511
2512        return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr,
2513                                         WMI_PEER_SMPS_STATE,
2514                                         ath10k_smps_map[smps]);
2515}
2516
2517static int ath10k_mac_vif_recalc_txbf(struct ath10k *ar,
2518                                      struct ieee80211_vif *vif,
2519                                      struct ieee80211_sta_vht_cap vht_cap)
2520{
2521        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2522        int ret;
2523        u32 param;
2524        u32 value;
2525
2526        if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_AFTER_ASSOC)
2527                return 0;
2528
2529        if (!(ar->vht_cap_info &
2530              (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
2531               IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE |
2532               IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
2533               IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)))
2534                return 0;
2535
2536        param = ar->wmi.vdev_param->txbf;
2537        value = 0;
2538
2539        if (WARN_ON(param == WMI_VDEV_PARAM_UNSUPPORTED))
2540                return 0;
2541
2542        /* The following logic is correct. If a remote STA advertises support
2543         * for being a beamformer then we should enable us being a beamformee.
2544         */
2545
2546        if (ar->vht_cap_info &
2547            (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
2548             IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
2549                if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)
2550                        value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
2551
2552                if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)
2553                        value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
2554        }
2555
2556        if (ar->vht_cap_info &
2557            (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
2558             IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
2559                if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)
2560                        value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
2561
2562                if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)
2563                        value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
2564        }
2565
2566        if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFEE)
2567                value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
2568
2569        if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFER)
2570                value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
2571
2572        ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, value);
2573        if (ret) {
2574                ath10k_warn(ar, "failed to submit vdev param txbf 0x%x: %d\n",
2575                            value, ret);
2576                return ret;
2577        }
2578
2579        return 0;
2580}
2581
2582/* can be called only in mac80211 callbacks due to `key_count` usage */
2583static void ath10k_bss_assoc(struct ieee80211_hw *hw,
2584                             struct ieee80211_vif *vif,
2585                             struct ieee80211_bss_conf *bss_conf)
2586{
2587        struct ath10k *ar = hw->priv;
2588        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2589        struct ieee80211_sta_ht_cap ht_cap;
2590        struct ieee80211_sta_vht_cap vht_cap;
2591        struct wmi_peer_assoc_complete_arg peer_arg;
2592        struct ieee80211_sta *ap_sta;
2593        int ret;
2594
2595        lockdep_assert_held(&ar->conf_mutex);
2596
2597        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n",
2598                   arvif->vdev_id, arvif->bssid, arvif->aid);
2599
2600        rcu_read_lock();
2601
2602        ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
2603        if (!ap_sta) {
2604                ath10k_warn(ar, "failed to find station entry for bss %pM vdev %i\n",
2605                            bss_conf->bssid, arvif->vdev_id);
2606                rcu_read_unlock();
2607                return;
2608        }
2609
2610        /* ap_sta must be accessed only within rcu section which must be left
2611         * before calling ath10k_setup_peer_smps() which might sleep. */
2612        ht_cap = ap_sta->ht_cap;
2613        vht_cap = ap_sta->vht_cap;
2614
2615        ret = ath10k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg);
2616        if (ret) {
2617                ath10k_warn(ar, "failed to prepare peer assoc for %pM vdev %i: %d\n",
2618                            bss_conf->bssid, arvif->vdev_id, ret);
2619                rcu_read_unlock();
2620                return;
2621        }
2622
2623        rcu_read_unlock();
2624
2625        ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
2626        if (ret) {
2627                ath10k_warn(ar, "failed to run peer assoc for %pM vdev %i: %d\n",
2628                            bss_conf->bssid, arvif->vdev_id, ret);
2629                return;
2630        }
2631
2632        ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap);
2633        if (ret) {
2634                ath10k_warn(ar, "failed to setup peer SMPS for vdev %i: %d\n",
2635                            arvif->vdev_id, ret);
2636                return;
2637        }
2638
2639        ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
2640        if (ret) {
2641                ath10k_warn(ar, "failed to recalc txbf for vdev %i on bss %pM: %d\n",
2642                            arvif->vdev_id, bss_conf->bssid, ret);
2643                return;
2644        }
2645
2646        ath10k_dbg(ar, ATH10K_DBG_MAC,
2647                   "mac vdev %d up (associated) bssid %pM aid %d\n",
2648                   arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
2649
2650        WARN_ON(arvif->is_up);
2651
2652        arvif->aid = bss_conf->aid;
2653        ether_addr_copy(arvif->bssid, bss_conf->bssid);
2654
2655        ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
2656        if (ret) {
2657                ath10k_warn(ar, "failed to set vdev %d up: %d\n",
2658                            arvif->vdev_id, ret);
2659                return;
2660        }
2661
2662        arvif->is_up = true;
2663
2664        /* Workaround: Some firmware revisions (tested with qca6174
2665         * WLAN.RM.2.0-00073) have buggy powersave state machine and must be
2666         * poked with peer param command.
2667         */
2668        ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, arvif->bssid,
2669                                        WMI_PEER_DUMMY_VAR, 1);
2670        if (ret) {
2671                ath10k_warn(ar, "failed to poke peer %pM param for ps workaround on vdev %i: %d\n",
2672                            arvif->bssid, arvif->vdev_id, ret);
2673                return;
2674        }
2675}
2676
2677static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
2678                                struct ieee80211_vif *vif)
2679{
2680        struct ath10k *ar = hw->priv;
2681        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2682        struct ieee80211_sta_vht_cap vht_cap = {};
2683        int ret;
2684
2685        lockdep_assert_held(&ar->conf_mutex);
2686
2687        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
2688                   arvif->vdev_id, arvif->bssid);
2689
2690        ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
2691        if (ret)
2692                ath10k_warn(ar, "faield to down vdev %i: %d\n",
2693                            arvif->vdev_id, ret);
2694
2695        arvif->def_wep_key_idx = -1;
2696
2697        ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
2698        if (ret) {
2699                ath10k_warn(ar, "failed to recalc txbf for vdev %i: %d\n",
2700                            arvif->vdev_id, ret);
2701                return;
2702        }
2703
2704        arvif->is_up = false;
2705
2706        cancel_delayed_work_sync(&arvif->connection_loss_work);
2707}
2708
2709static int ath10k_station_assoc(struct ath10k *ar,
2710                                struct ieee80211_vif *vif,
2711                                struct ieee80211_sta *sta,
2712                                bool reassoc)
2713{
2714        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2715        struct wmi_peer_assoc_complete_arg peer_arg;
2716        int ret = 0;
2717
2718        lockdep_assert_held(&ar->conf_mutex);
2719
2720        ret = ath10k_peer_assoc_prepare(ar, vif, sta, &peer_arg);
2721        if (ret) {
2722                ath10k_warn(ar, "failed to prepare WMI peer assoc for %pM vdev %i: %i\n",
2723                            sta->addr, arvif->vdev_id, ret);
2724                return ret;
2725        }
2726
2727        ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
2728        if (ret) {
2729                ath10k_warn(ar, "failed to run peer assoc for STA %pM vdev %i: %d\n",
2730                            sta->addr, arvif->vdev_id, ret);
2731                return ret;
2732        }
2733
2734        /* Re-assoc is run only to update supported rates for given station. It
2735         * doesn't make much sense to reconfigure the peer completely.
2736         */
2737        if (!reassoc) {
2738                ret = ath10k_setup_peer_smps(ar, arvif, sta->addr,
2739                                             &sta->ht_cap);
2740                if (ret) {
2741                        ath10k_warn(ar, "failed to setup peer SMPS for vdev %d: %d\n",
2742                                    arvif->vdev_id, ret);
2743                        return ret;
2744                }
2745
2746                ret = ath10k_peer_assoc_qos_ap(ar, arvif, sta);
2747                if (ret) {
2748                        ath10k_warn(ar, "failed to set qos params for STA %pM for vdev %i: %d\n",
2749                                    sta->addr, arvif->vdev_id, ret);
2750                        return ret;
2751                }
2752
2753                if (!sta->wme) {
2754                        arvif->num_legacy_stations++;
2755                        ret  = ath10k_recalc_rtscts_prot(arvif);
2756                        if (ret) {
2757                                ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
2758                                            arvif->vdev_id, ret);
2759                                return ret;
2760                        }
2761                }
2762
2763                /* Plumb cached keys only for static WEP */
2764                if (arvif->def_wep_key_idx != -1) {
2765                        ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
2766                        if (ret) {
2767                                ath10k_warn(ar, "failed to install peer wep keys for vdev %i: %d\n",
2768                                            arvif->vdev_id, ret);
2769                                return ret;
2770                        }
2771                }
2772        }
2773
2774        return ret;
2775}
2776
2777static int ath10k_station_disassoc(struct ath10k *ar,
2778                                   struct ieee80211_vif *vif,
2779                                   struct ieee80211_sta *sta)
2780{
2781        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2782        int ret = 0;
2783
2784        lockdep_assert_held(&ar->conf_mutex);
2785
2786        if (!sta->wme) {
2787                arvif->num_legacy_stations--;
2788                ret = ath10k_recalc_rtscts_prot(arvif);
2789                if (ret) {
2790                        ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
2791                                    arvif->vdev_id, ret);
2792                        return ret;
2793                }
2794        }
2795
2796        ret = ath10k_clear_peer_keys(arvif, sta->addr);
2797        if (ret) {
2798                ath10k_warn(ar, "failed to clear all peer wep keys for vdev %i: %d\n",
2799                            arvif->vdev_id, ret);
2800                return ret;
2801        }
2802
2803        return ret;
2804}
2805
2806/**************/
2807/* Regulatory */
2808/**************/
2809
2810static int ath10k_update_channel_list(struct ath10k *ar)
2811{
2812        struct ieee80211_hw *hw = ar->hw;
2813        struct ieee80211_supported_band **bands;
2814        enum ieee80211_band band;
2815        struct ieee80211_channel *channel;
2816        struct wmi_scan_chan_list_arg arg = {0};
2817        struct wmi_channel_arg *ch;
2818        bool passive;
2819        int len;
2820        int ret;
2821        int i;
2822
2823        lockdep_assert_held(&ar->conf_mutex);
2824
2825        bands = hw->wiphy->bands;
2826        for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
2827                if (!bands[band])
2828                        continue;
2829
2830                for (i = 0; i < bands[band]->n_channels; i++) {
2831                        if (bands[band]->channels[i].flags &
2832                            IEEE80211_CHAN_DISABLED)
2833                                continue;
2834
2835                        arg.n_channels++;
2836                }
2837        }
2838
2839        len = sizeof(struct wmi_channel_arg) * arg.n_channels;
2840        arg.channels = kzalloc(len, GFP_KERNEL);
2841        if (!arg.channels)
2842                return -ENOMEM;
2843
2844        ch = arg.channels;
2845        for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
2846                if (!bands[band])
2847                        continue;
2848
2849                for (i = 0; i < bands[band]->n_channels; i++) {
2850                        channel = &bands[band]->channels[i];
2851
2852                        if (channel->flags & IEEE80211_CHAN_DISABLED)
2853                                continue;
2854
2855                        ch->allow_ht   = true;
2856
2857                        /* FIXME: when should we really allow VHT? */
2858                        ch->allow_vht = true;
2859
2860                        ch->allow_ibss =
2861                                !(channel->flags & IEEE80211_CHAN_NO_IR);
2862
2863                        ch->ht40plus =
2864                                !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
2865
2866                        ch->chan_radar =
2867                                !!(channel->flags & IEEE80211_CHAN_RADAR);
2868
2869                        passive = channel->flags & IEEE80211_CHAN_NO_IR;
2870                        ch->passive = passive;
2871
2872                        ch->freq = channel->center_freq;
2873                        ch->band_center_freq1 = channel->center_freq;
2874                        ch->min_power = 0;
2875                        ch->max_power = channel->max_power * 2;
2876                        ch->max_reg_power = channel->max_reg_power * 2;
2877                        ch->max_antenna_gain = channel->max_antenna_gain * 2;
2878                        ch->reg_class_id = 0; /* FIXME */
2879
2880                        /* FIXME: why use only legacy modes, why not any
2881                         * HT/VHT modes? Would that even make any
2882                         * difference? */
2883                        if (channel->band == IEEE80211_BAND_2GHZ)
2884                                ch->mode = MODE_11G;
2885                        else
2886                                ch->mode = MODE_11A;
2887
2888                        if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
2889                                continue;
2890
2891                        ath10k_dbg(ar, ATH10K_DBG_WMI,
2892                                   "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
2893                                    ch - arg.channels, arg.n_channels,
2894                                   ch->freq, ch->max_power, ch->max_reg_power,
2895                                   ch->max_antenna_gain, ch->mode);
2896
2897                        ch++;
2898                }
2899        }
2900
2901        ret = ath10k_wmi_scan_chan_list(ar, &arg);
2902        kfree(arg.channels);
2903
2904        return ret;
2905}
2906
2907static enum wmi_dfs_region
2908ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region)
2909{
2910        switch (dfs_region) {
2911        case NL80211_DFS_UNSET:
2912                return WMI_UNINIT_DFS_DOMAIN;
2913        case NL80211_DFS_FCC:
2914                return WMI_FCC_DFS_DOMAIN;
2915        case NL80211_DFS_ETSI:
2916                return WMI_ETSI_DFS_DOMAIN;
2917        case NL80211_DFS_JP:
2918                return WMI_MKK4_DFS_DOMAIN;
2919        }
2920        return WMI_UNINIT_DFS_DOMAIN;
2921}
2922
2923static void ath10k_regd_update(struct ath10k *ar)
2924{
2925        struct reg_dmn_pair_mapping *regpair;
2926        int ret;
2927        enum wmi_dfs_region wmi_dfs_reg;
2928        enum nl80211_dfs_regions nl_dfs_reg;
2929
2930        lockdep_assert_held(&ar->conf_mutex);
2931
2932        ret = ath10k_update_channel_list(ar);
2933        if (ret)
2934                ath10k_warn(ar, "failed to update channel list: %d\n", ret);
2935
2936        regpair = ar->ath_common.regulatory.regpair;
2937
2938        if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
2939                nl_dfs_reg = ar->dfs_detector->region;
2940                wmi_dfs_reg = ath10k_mac_get_dfs_region(nl_dfs_reg);
2941        } else {
2942                wmi_dfs_reg = WMI_UNINIT_DFS_DOMAIN;
2943        }
2944
2945        /* Target allows setting up per-band regdomain but ath_common provides
2946         * a combined one only */
2947        ret = ath10k_wmi_pdev_set_regdomain(ar,
2948                                            regpair->reg_domain,
2949                                            regpair->reg_domain, /* 2ghz */
2950                                            regpair->reg_domain, /* 5ghz */
2951                                            regpair->reg_2ghz_ctl,
2952                                            regpair->reg_5ghz_ctl,
2953                                            wmi_dfs_reg);
2954        if (ret)
2955                ath10k_warn(ar, "failed to set pdev regdomain: %d\n", ret);
2956}
2957
2958static void ath10k_reg_notifier(struct wiphy *wiphy,
2959                                struct regulatory_request *request)
2960{
2961        struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
2962        struct ath10k *ar = hw->priv;
2963        bool result;
2964
2965        ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
2966
2967        if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
2968                ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs region 0x%x\n",
2969                           request->dfs_region);
2970                result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector,
2971                                                          request->dfs_region);
2972                if (!result)
2973                        ath10k_warn(ar, "DFS region 0x%X not supported, will trigger radar for every pulse\n",
2974                                    request->dfs_region);
2975        }
2976
2977        mutex_lock(&ar->conf_mutex);
2978        if (ar->state == ATH10K_STATE_ON)
2979                ath10k_regd_update(ar);
2980        mutex_unlock(&ar->conf_mutex);
2981}
2982
2983/***************/
2984/* TX handlers */
2985/***************/
2986
2987void ath10k_mac_tx_lock(struct ath10k *ar, int reason)
2988{
2989        lockdep_assert_held(&ar->htt.tx_lock);
2990
2991        WARN_ON(reason >= ATH10K_TX_PAUSE_MAX);
2992        ar->tx_paused |= BIT(reason);
2993        ieee80211_stop_queues(ar->hw);
2994}
2995
2996static void ath10k_mac_tx_unlock_iter(void *data, u8 *mac,
2997                                      struct ieee80211_vif *vif)
2998{
2999        struct ath10k *ar = data;
3000        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3001
3002        if (arvif->tx_paused)
3003                return;
3004
3005        ieee80211_wake_queue(ar->hw, arvif->vdev_id);
3006}
3007
3008void ath10k_mac_tx_unlock(struct ath10k *ar, int reason)
3009{
3010        lockdep_assert_held(&ar->htt.tx_lock);
3011
3012        WARN_ON(reason >= ATH10K_TX_PAUSE_MAX);
3013        ar->tx_paused &= ~BIT(reason);
3014
3015        if (ar->tx_paused)
3016                return;
3017
3018        ieee80211_iterate_active_interfaces_atomic(ar->hw,
3019                                                   IEEE80211_IFACE_ITER_RESUME_ALL,
3020                                                   ath10k_mac_tx_unlock_iter,
3021                                                   ar);
3022
3023        ieee80211_wake_queue(ar->hw, ar->hw->offchannel_tx_hw_queue);
3024}
3025
3026void ath10k_mac_vif_tx_lock(struct ath10k_vif *arvif, int reason)
3027{
3028        struct ath10k *ar = arvif->ar;
3029
3030        lockdep_assert_held(&ar->htt.tx_lock);
3031
3032        WARN_ON(reason >= BITS_PER_LONG);
3033        arvif->tx_paused |= BIT(reason);
3034        ieee80211_stop_queue(ar->hw, arvif->vdev_id);
3035}
3036
3037void ath10k_mac_vif_tx_unlock(struct ath10k_vif *arvif, int reason)
3038{
3039        struct ath10k *ar = arvif->ar;
3040
3041        lockdep_assert_held(&ar->htt.tx_lock);
3042
3043        WARN_ON(reason >= BITS_PER_LONG);
3044        arvif->tx_paused &= ~BIT(reason);
3045
3046        if (ar->tx_paused)
3047                return;
3048
3049        if (arvif->tx_paused)
3050                return;
3051
3052        ieee80211_wake_queue(ar->hw, arvif->vdev_id);
3053}
3054
3055static void ath10k_mac_vif_handle_tx_pause(struct ath10k_vif *arvif,
3056                                           enum wmi_tlv_tx_pause_id pause_id,
3057                                           enum wmi_tlv_tx_pause_action action)
3058{
3059        struct ath10k *ar = arvif->ar;
3060
3061        lockdep_assert_held(&ar->htt.tx_lock);
3062
3063        switch (action) {
3064        case WMI_TLV_TX_PAUSE_ACTION_STOP:
3065                ath10k_mac_vif_tx_lock(arvif, pause_id);
3066                break;
3067        case WMI_TLV_TX_PAUSE_ACTION_WAKE:
3068                ath10k_mac_vif_tx_unlock(arvif, pause_id);
3069                break;
3070        default:
3071                ath10k_warn(ar, "received unknown tx pause action %d on vdev %i, ignoring\n",
3072                            action, arvif->vdev_id);
3073                break;
3074        }
3075}
3076
3077struct ath10k_mac_tx_pause {
3078        u32 vdev_id;
3079        enum wmi_tlv_tx_pause_id pause_id;
3080        enum wmi_tlv_tx_pause_action action;
3081};
3082
3083static void ath10k_mac_handle_tx_pause_iter(void *data, u8 *mac,
3084                                            struct ieee80211_vif *vif)
3085{
3086        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3087        struct ath10k_mac_tx_pause *arg = data;
3088
3089        if (arvif->vdev_id != arg->vdev_id)
3090                return;
3091
3092        ath10k_mac_vif_handle_tx_pause(arvif, arg->pause_id, arg->action);
3093}
3094
3095void ath10k_mac_handle_tx_pause_vdev(struct ath10k *ar, u32 vdev_id,
3096                                     enum wmi_tlv_tx_pause_id pause_id,
3097                                     enum wmi_tlv_tx_pause_action action)
3098{
3099        struct ath10k_mac_tx_pause arg = {
3100                .vdev_id = vdev_id,
3101                .pause_id = pause_id,
3102                .action = action,
3103        };
3104
3105        spin_lock_bh(&ar->htt.tx_lock);
3106        ieee80211_iterate_active_interfaces_atomic(ar->hw,
3107                                                   IEEE80211_IFACE_ITER_RESUME_ALL,
3108                                                   ath10k_mac_handle_tx_pause_iter,
3109                                                   &arg);
3110        spin_unlock_bh(&ar->htt.tx_lock);
3111}
3112
3113static u8 ath10k_tx_h_get_tid(struct ieee80211_hdr *hdr)
3114{
3115        if (ieee80211_is_mgmt(hdr->frame_control))
3116                return HTT_DATA_TX_EXT_TID_MGMT;
3117
3118        if (!ieee80211_is_data_qos(hdr->frame_control))
3119                return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
3120
3121        if (!is_unicast_ether_addr(ieee80211_get_DA(hdr)))
3122                return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
3123
3124        return ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK;
3125}
3126
3127static u8 ath10k_tx_h_get_vdev_id(struct ath10k *ar, struct ieee80211_vif *vif)
3128{
3129        if (vif)
3130                return ath10k_vif_to_arvif(vif)->vdev_id;
3131
3132        if (ar->monitor_started)
3133                return ar->monitor_vdev_id;
3134
3135        ath10k_warn(ar, "failed to resolve vdev id\n");
3136        return 0;
3137}
3138
3139static enum ath10k_hw_txrx_mode
3140ath10k_tx_h_get_txmode(struct ath10k *ar, struct ieee80211_vif *vif,
3141                       struct ieee80211_sta *sta, struct sk_buff *skb)
3142{
3143        const struct ieee80211_hdr *hdr = (void *)skb->data;
3144        __le16 fc = hdr->frame_control;
3145
3146        if (!vif || vif->type == NL80211_IFTYPE_MONITOR)
3147                return ATH10K_HW_TXRX_RAW;
3148
3149        if (ieee80211_is_mgmt(fc))
3150                return ATH10K_HW_TXRX_MGMT;
3151
3152        /* Workaround:
3153         *
3154         * NullFunc frames are mostly used to ping if a client or AP are still
3155         * reachable and responsive. This implies tx status reports must be
3156         * accurate - otherwise either mac80211 or userspace (e.g. hostapd) can
3157         * come to a conclusion that the other end disappeared and tear down
3158         * BSS connection or it can never disconnect from BSS/client (which is
3159         * the case).
3160         *
3161         * Firmware with HTT older than 3.0 delivers incorrect tx status for
3162         * NullFunc frames to driver. However there's a HTT Mgmt Tx command
3163         * which seems to deliver correct tx reports for NullFunc frames. The
3164         * downside of using it is it ignores client powersave state so it can
3165         * end up disconnecting sleeping clients in AP mode. It should fix STA
3166         * mode though because AP don't sleep.
3167         */
3168        if (ar->htt.target_version_major < 3 &&
3169            (ieee80211_is_nullfunc(fc) || ieee80211_is_qos_nullfunc(fc)) &&
3170            !test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX, ar->fw_features))
3171                return ATH10K_HW_TXRX_MGMT;
3172
3173        /* Workaround:
3174         *
3175         * Some wmi-tlv firmwares for qca6174 have broken Tx key selection for
3176         * NativeWifi txmode - it selects AP key instead of peer key. It seems
3177         * to work with Ethernet txmode so use it.
3178         *
3179         * FIXME: Check if raw mode works with TDLS.
3180         */
3181        if (ieee80211_is_data_present(fc) && sta && sta->tdls)
3182                return ATH10K_HW_TXRX_ETHERNET;
3183
3184        if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
3185                return ATH10K_HW_TXRX_RAW;
3186
3187        return ATH10K_HW_TXRX_NATIVE_WIFI;
3188}
3189
3190static bool ath10k_tx_h_use_hwcrypto(struct ieee80211_vif *vif,
3191                                     struct sk_buff *skb) {
3192        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
3193        const u32 mask = IEEE80211_TX_INTFL_DONT_ENCRYPT |
3194                         IEEE80211_TX_CTL_INJECTED;
3195        if ((info->flags & mask) == mask)
3196                return false;
3197        if (vif)
3198                return !ath10k_vif_to_arvif(vif)->nohwcrypt;
3199        return true;
3200}
3201
3202/* HTT Tx uses Native Wifi tx mode which expects 802.11 frames without QoS
3203 * Control in the header.
3204 */
3205static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb)
3206{
3207        struct ieee80211_hdr *hdr = (void *)skb->data;
3208        struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
3209        u8 *qos_ctl;
3210
3211        if (!ieee80211_is_data_qos(hdr->frame_control))
3212                return;
3213
3214        qos_ctl = ieee80211_get_qos_ctl(hdr);
3215        memmove(skb->data + IEEE80211_QOS_CTL_LEN,
3216                skb->data, (void *)qos_ctl - (void *)skb->data);
3217        skb_pull(skb, IEEE80211_QOS_CTL_LEN);
3218
3219        /* Some firmware revisions don't handle sending QoS NullFunc well.
3220         * These frames are mainly used for CQM purposes so it doesn't really
3221         * matter whether QoS NullFunc or NullFunc are sent.
3222         */
3223        hdr = (void *)skb->data;
3224        if (ieee80211_is_qos_nullfunc(hdr->frame_control))
3225                cb->htt.tid = HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
3226
3227        hdr->frame_control &= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
3228}
3229
3230static void ath10k_tx_h_8023(struct sk_buff *skb)
3231{
3232        struct ieee80211_hdr *hdr;
3233        struct rfc1042_hdr *rfc1042;
3234        struct ethhdr *eth;
3235        size_t hdrlen;
3236        u8 da[ETH_ALEN];
3237        u8 sa[ETH_ALEN];
3238        __be16 type;
3239
3240        hdr = (void *)skb->data;
3241        hdrlen = ieee80211_hdrlen(hdr->frame_control);
3242        rfc1042 = (void *)skb->data + hdrlen;
3243
3244        ether_addr_copy(da, ieee80211_get_DA(hdr));
3245        ether_addr_copy(sa, ieee80211_get_SA(hdr));
3246        type = rfc1042->snap_type;
3247
3248        skb_pull(skb, hdrlen + sizeof(*rfc1042));
3249        skb_push(skb, sizeof(*eth));
3250
3251        eth = (void *)skb->data;
3252        ether_addr_copy(eth->h_dest, da);
3253        ether_addr_copy(eth->h_source, sa);
3254        eth->h_proto = type;
3255}
3256
3257static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar,
3258                                       struct ieee80211_vif *vif,
3259                                       struct sk_buff *skb)
3260{
3261        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
3262        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3263
3264        /* This is case only for P2P_GO */
3265        if (arvif->vdev_type != WMI_VDEV_TYPE_AP ||
3266            arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
3267                return;
3268
3269        if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
3270                spin_lock_bh(&ar->data_lock);
3271                if (arvif->u.ap.noa_data)
3272                        if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
3273                                              GFP_ATOMIC))
3274                                memcpy(skb_put(skb, arvif->u.ap.noa_len),
3275                                       arvif->u.ap.noa_data,
3276                                       arvif->u.ap.noa_len);
3277                spin_unlock_bh(&ar->data_lock);
3278        }
3279}
3280
3281static bool ath10k_mac_need_offchan_tx_work(struct ath10k *ar)
3282{
3283        /* FIXME: Not really sure since when the behaviour changed. At some
3284         * point new firmware stopped requiring creation of peer entries for
3285         * offchannel tx (and actually creating them causes issues with wmi-htc
3286         * tx credit replenishment and reliability). Assuming it's at least 3.4
3287         * because that's when the `freq` was introduced to TX_FRM HTT command.
3288         */
3289        return !(ar->htt.target_version_major >= 3 &&
3290                 ar->htt.target_version_minor >= 4);
3291}
3292
3293static int ath10k_mac_tx_wmi_mgmt(struct ath10k *ar, struct sk_buff *skb)
3294{
3295        struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
3296        int ret = 0;
3297
3298        spin_lock_bh(&ar->data_lock);
3299
3300        if (skb_queue_len(q) == ATH10K_MAX_NUM_MGMT_PENDING) {
3301                ath10k_warn(ar, "wmi mgmt tx queue is full\n");
3302                ret = -ENOSPC;
3303                goto unlock;
3304        }
3305
3306        __skb_queue_tail(q, skb);
3307        ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
3308
3309unlock:
3310        spin_unlock_bh(&ar->data_lock);
3311
3312        return ret;
3313}
3314
3315static void ath10k_mac_tx(struct ath10k *ar, struct sk_buff *skb)
3316{
3317        struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
3318        struct ath10k_htt *htt = &ar->htt;
3319        int ret = 0;
3320
3321        switch (cb->txmode) {
3322        case ATH10K_HW_TXRX_RAW:
3323        case ATH10K_HW_TXRX_NATIVE_WIFI:
3324        case ATH10K_HW_TXRX_ETHERNET:
3325                ret = ath10k_htt_tx(htt, skb);
3326                break;
3327        case ATH10K_HW_TXRX_MGMT:
3328                if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
3329                             ar->fw_features))
3330                        ret = ath10k_mac_tx_wmi_mgmt(ar, skb);
3331                else if (ar->htt.target_version_major >= 3)
3332                        ret = ath10k_htt_tx(htt, skb);
3333                else
3334                        ret = ath10k_htt_mgmt_tx(htt, skb);
3335                break;
3336        }
3337
3338        if (ret) {
3339                ath10k_warn(ar, "failed to transmit packet, dropping: %d\n",
3340                            ret);
3341                ieee80211_free_txskb(ar->hw, skb);
3342        }
3343}
3344
3345void ath10k_offchan_tx_purge(struct ath10k *ar)
3346{
3347        struct sk_buff *skb;
3348
3349        for (;;) {
3350                skb = skb_dequeue(&ar->offchan_tx_queue);
3351                if (!skb)
3352                        break;
3353
3354                ieee80211_free_txskb(ar->hw, skb);
3355        }
3356}
3357
3358void ath10k_offchan_tx_work(struct work_struct *work)
3359{
3360        struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
3361        struct ath10k_peer *peer;
3362        struct ieee80211_hdr *hdr;
3363        struct sk_buff *skb;
3364        const u8 *peer_addr;
3365        int vdev_id;
3366        int ret;
3367        unsigned long time_left;
3368        bool tmp_peer_created = false;
3369
3370        /* FW requirement: We must create a peer before FW will send out
3371         * an offchannel frame. Otherwise the frame will be stuck and
3372         * never transmitted. We delete the peer upon tx completion.
3373         * It is unlikely that a peer for offchannel tx will already be
3374         * present. However it may be in some rare cases so account for that.
3375         * Otherwise we might remove a legitimate peer and break stuff. */
3376
3377        for (;;) {
3378                skb = skb_dequeue(&ar->offchan_tx_queue);
3379                if (!skb)
3380                        break;
3381
3382                mutex_lock(&ar->conf_mutex);
3383
3384                ath10k_dbg(ar, ATH10K_DBG_MAC, "mac offchannel skb %p\n",
3385                           skb);
3386
3387                hdr = (struct ieee80211_hdr *)skb->data;
3388                peer_addr = ieee80211_get_DA(hdr);
3389                vdev_id = ATH10K_SKB_CB(skb)->vdev_id;
3390
3391                spin_lock_bh(&ar->data_lock);
3392                peer = ath10k_peer_find(ar, vdev_id, peer_addr);
3393                spin_unlock_bh(&ar->data_lock);
3394
3395                if (peer)
3396                        /* FIXME: should this use ath10k_warn()? */
3397                        ath10k_dbg(ar, ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n",
3398                                   peer_addr, vdev_id);
3399
3400                if (!peer) {
3401                        ret = ath10k_peer_create(ar, vdev_id, peer_addr,
3402                                                 WMI_PEER_TYPE_DEFAULT);
3403                        if (ret)
3404                                ath10k_warn(ar, "failed to create peer %pM on vdev %d: %d\n",
3405                                            peer_addr, vdev_id, ret);
3406                        tmp_peer_created = (ret == 0);
3407                }
3408
3409                spin_lock_bh(&ar->data_lock);
3410                reinit_completion(&ar->offchan_tx_completed);
3411                ar->offchan_tx_skb = skb;
3412                spin_unlock_bh(&ar->data_lock);
3413
3414                ath10k_mac_tx(ar, skb);
3415
3416                time_left =
3417                wait_for_completion_timeout(&ar->offchan_tx_completed, 3 * HZ);
3418                if (time_left == 0)
3419                        ath10k_warn(ar, "timed out waiting for offchannel skb %p\n",
3420                                    skb);
3421
3422                if (!peer && tmp_peer_created) {
3423                        ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
3424                        if (ret)
3425                                ath10k_warn(ar, "failed to delete peer %pM on vdev %d: %d\n",
3426                                            peer_addr, vdev_id, ret);
3427                }
3428
3429                mutex_unlock(&ar->conf_mutex);
3430        }
3431}
3432
3433void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar)
3434{
3435        struct sk_buff *skb;
3436
3437        for (;;) {
3438                skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
3439                if (!skb)
3440                        break;
3441
3442                ieee80211_free_txskb(ar->hw, skb);
3443        }
3444}
3445
3446void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work)
3447{
3448        struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work);
3449        struct sk_buff *skb;
3450        int ret;
3451
3452        for (;;) {
3453                skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
3454                if (!skb)
3455                        break;
3456
3457                ret = ath10k_wmi_mgmt_tx(ar, skb);
3458                if (ret) {
3459                        ath10k_warn(ar, "failed to transmit management frame via WMI: %d\n",
3460                                    ret);
3461                        ieee80211_free_txskb(ar->hw, skb);
3462                }
3463        }
3464}
3465
3466/************/
3467/* Scanning */
3468/************/
3469
3470void __ath10k_scan_finish(struct ath10k *ar)
3471{
3472        lockdep_assert_held(&ar->data_lock);
3473
3474        switch (ar->scan.state) {
3475        case ATH10K_SCAN_IDLE:
3476                break;
3477        case ATH10K_SCAN_RUNNING:
3478        case ATH10K_SCAN_ABORTING:
3479                if (!ar->scan.is_roc)
3480                        ieee80211_scan_completed(ar->hw,
3481                                                 (ar->scan.state ==
3482                                                  ATH10K_SCAN_ABORTING));
3483                else if (ar->scan.roc_notify)
3484                        ieee80211_remain_on_channel_expired(ar->hw);
3485                /* fall through */
3486        case ATH10K_SCAN_STARTING:
3487                ar->scan.state = ATH10K_SCAN_IDLE;
3488                ar->scan_channel = NULL;
3489                ath10k_offchan_tx_purge(ar);
3490                cancel_delayed_work(&ar->scan.timeout);
3491                complete_all(&ar->scan.completed);
3492                break;
3493        }
3494}
3495
3496void ath10k_scan_finish(struct ath10k *ar)
3497{
3498        spin_lock_bh(&ar->data_lock);
3499        __ath10k_scan_finish(ar);
3500        spin_unlock_bh(&ar->data_lock);
3501}
3502
3503static int ath10k_scan_stop(struct ath10k *ar)
3504{
3505        struct wmi_stop_scan_arg arg = {
3506                .req_id = 1, /* FIXME */
3507                .req_type = WMI_SCAN_STOP_ONE,
3508                .u.scan_id = ATH10K_SCAN_ID,
3509        };
3510        int ret;
3511
3512        lockdep_assert_held(&ar->conf_mutex);
3513
3514        ret = ath10k_wmi_stop_scan(ar, &arg);
3515        if (ret) {
3516                ath10k_warn(ar, "failed to stop wmi scan: %d\n", ret);
3517                goto out;
3518        }
3519
3520        ret = wait_for_completion_timeout(&ar->scan.completed, 3*HZ);
3521        if (ret == 0) {
3522                ath10k_warn(ar, "failed to receive scan abortion completion: timed out\n");
3523                ret = -ETIMEDOUT;
3524        } else if (ret > 0) {
3525                ret = 0;
3526        }
3527
3528out:
3529        /* Scan state should be updated upon scan completion but in case
3530         * firmware fails to deliver the event (for whatever reason) it is
3531         * desired to clean up scan state anyway. Firmware may have just
3532         * dropped the scan completion event delivery due to transport pipe
3533         * being overflown with data and/or it can recover on its own before
3534         * next scan request is submitted.
3535         */
3536        spin_lock_bh(&ar->data_lock);
3537        if (ar->scan.state != ATH10K_SCAN_IDLE)
3538                __ath10k_scan_finish(ar);
3539        spin_unlock_bh(&ar->data_lock);
3540
3541        return ret;
3542}
3543
3544static void ath10k_scan_abort(struct ath10k *ar)
3545{
3546        int ret;
3547
3548        lockdep_assert_held(&ar->conf_mutex);
3549
3550        spin_lock_bh(&ar->data_lock);
3551
3552        switch (ar->scan.state) {
3553        case ATH10K_SCAN_IDLE:
3554                /* This can happen if timeout worker kicked in and called
3555                 * abortion while scan completion was being processed.
3556                 */
3557                break;
3558        case ATH10K_SCAN_STARTING:
3559        case ATH10K_SCAN_ABORTING:
3560                ath10k_warn(ar, "refusing scan abortion due to invalid scan state: %s (%d)\n",
3561                            ath10k_scan_state_str(ar->scan.state),
3562                            ar->scan.state);
3563                break;
3564        case ATH10K_SCAN_RUNNING:
3565                ar->scan.state = ATH10K_SCAN_ABORTING;
3566                spin_unlock_bh(&ar->data_lock);
3567
3568                ret = ath10k_scan_stop(ar);
3569                if (ret)
3570                        ath10k_warn(ar, "failed to abort scan: %d\n", ret);
3571
3572                spin_lock_bh(&ar->data_lock);
3573                break;
3574        }
3575
3576        spin_unlock_bh(&ar->data_lock);
3577}
3578
3579void ath10k_scan_timeout_work(struct work_struct *work)
3580{
3581        struct ath10k *ar = container_of(work, struct ath10k,
3582                                         scan.timeout.work);
3583
3584        mutex_lock(&ar->conf_mutex);
3585        ath10k_scan_abort(ar);
3586        mutex_unlock(&ar->conf_mutex);
3587}
3588
3589static int ath10k_start_scan(struct ath10k *ar,
3590                             const struct wmi_start_scan_arg *arg)
3591{
3592        int ret;
3593
3594        lockdep_assert_held(&ar->conf_mutex);
3595
3596        ret = ath10k_wmi_start_scan(ar, arg);
3597        if (ret)
3598                return ret;
3599
3600        ret = wait_for_completion_timeout(&ar->scan.started, 1*HZ);
3601        if (ret == 0) {
3602                ret = ath10k_scan_stop(ar);
3603                if (ret)
3604                        ath10k_warn(ar, "failed to stop scan: %d\n", ret);
3605
3606                return -ETIMEDOUT;
3607        }
3608
3609        /* If we failed to start the scan, return error code at
3610         * this point.  This is probably due to some issue in the
3611         * firmware, but no need to wedge the driver due to that...
3612         */
3613        spin_lock_bh(&ar->data_lock);
3614        if (ar->scan.state == ATH10K_SCAN_IDLE) {
3615                spin_unlock_bh(&ar->data_lock);
3616                return -EINVAL;
3617        }
3618        spin_unlock_bh(&ar->data_lock);
3619
3620        /* Add a 200ms margin to account for event/command processing */
3621        ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
3622                                     msecs_to_jiffies(arg->max_scan_time+200));
3623        return 0;
3624}
3625
3626/**********************/
3627/* mac80211 callbacks */
3628/**********************/
3629
3630static void ath10k_tx(struct ieee80211_hw *hw,
3631                      struct ieee80211_tx_control *control,
3632                      struct sk_buff *skb)
3633{
3634        struct ath10k *ar = hw->priv;
3635        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
3636        struct ieee80211_vif *vif = info->control.vif;
3637        struct ieee80211_sta *sta = control->sta;
3638        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
3639        __le16 fc = hdr->frame_control;
3640
3641        /* We should disable CCK RATE due to P2P */
3642        if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
3643                ath10k_dbg(ar, ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
3644
3645        ATH10K_SKB_CB(skb)->htt.is_offchan = false;
3646        ATH10K_SKB_CB(skb)->htt.freq = 0;
3647        ATH10K_SKB_CB(skb)->htt.tid = ath10k_tx_h_get_tid(hdr);
3648        ATH10K_SKB_CB(skb)->htt.nohwcrypt = !ath10k_tx_h_use_hwcrypto(vif, skb);
3649        ATH10K_SKB_CB(skb)->vdev_id = ath10k_tx_h_get_vdev_id(ar, vif);
3650        ATH10K_SKB_CB(skb)->txmode = ath10k_tx_h_get_txmode(ar, vif, sta, skb);
3651        ATH10K_SKB_CB(skb)->is_protected = ieee80211_has_protected(fc);
3652
3653        switch (ATH10K_SKB_CB(skb)->txmode) {
3654        case ATH10K_HW_TXRX_MGMT:
3655        case ATH10K_HW_TXRX_NATIVE_WIFI:
3656                ath10k_tx_h_nwifi(hw, skb);
3657                ath10k_tx_h_add_p2p_noa_ie(ar, vif, skb);
3658                ath10k_tx_h_seq_no(vif, skb);
3659                break;
3660        case ATH10K_HW_TXRX_ETHERNET:
3661                ath10k_tx_h_8023(skb);
3662                break;
3663        case ATH10K_HW_TXRX_RAW:
3664                if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
3665                        WARN_ON_ONCE(1);
3666                        ieee80211_free_txskb(hw, skb);
3667                        return;
3668                }
3669        }
3670
3671        if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
3672                spin_lock_bh(&ar->data_lock);
3673                ATH10K_SKB_CB(skb)->htt.freq = ar->scan.roc_freq;
3674                ATH10K_SKB_CB(skb)->vdev_id = ar->scan.vdev_id;
3675                spin_unlock_bh(&ar->data_lock);
3676
3677                if (ath10k_mac_need_offchan_tx_work(ar)) {
3678                        ATH10K_SKB_CB(skb)->htt.freq = 0;
3679                        ATH10K_SKB_CB(skb)->htt.is_offchan = true;
3680
3681                        ath10k_dbg(ar, ATH10K_DBG_MAC, "queued offchannel skb %p\n",
3682                                   skb);
3683
3684                        skb_queue_tail(&ar->offchan_tx_queue, skb);
3685                        ieee80211_queue_work(hw, &ar->offchan_tx_work);
3686                        return;
3687                }
3688        }
3689
3690        ath10k_mac_tx(ar, skb);
3691}
3692
3693/* Must not be called with conf_mutex held as workers can use that also. */
3694void ath10k_drain_tx(struct ath10k *ar)
3695{
3696        /* make sure rcu-protected mac80211 tx path itself is drained */
3697        synchronize_net();
3698
3699        ath10k_offchan_tx_purge(ar);
3700        ath10k_mgmt_over_wmi_tx_purge(ar);
3701
3702        cancel_work_sync(&ar->offchan_tx_work);
3703        cancel_work_sync(&ar->wmi_mgmt_tx_work);
3704}
3705
3706void ath10k_halt(struct ath10k *ar)
3707{
3708        struct ath10k_vif *arvif;
3709
3710        lockdep_assert_held(&ar->conf_mutex);
3711
3712        clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
3713        ar->filter_flags = 0;
3714        ar->monitor = false;
3715        ar->monitor_arvif = NULL;
3716
3717        if (ar->monitor_started)
3718                ath10k_monitor_stop(ar);
3719
3720        ar->monitor_started = false;
3721        ar->tx_paused = 0;
3722
3723        ath10k_scan_finish(ar);
3724        ath10k_peer_cleanup_all(ar);
3725        ath10k_core_stop(ar);
3726        ath10k_hif_power_down(ar);
3727
3728        spin_lock_bh(&ar->data_lock);
3729        list_for_each_entry(arvif, &ar->arvifs, list)
3730                ath10k_mac_vif_beacon_cleanup(arvif);
3731        spin_unlock_bh(&ar->data_lock);
3732}
3733
3734static int ath10k_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
3735{
3736        struct ath10k *ar = hw->priv;
3737
3738        mutex_lock(&ar->conf_mutex);
3739
3740        if (ar->cfg_tx_chainmask) {
3741                *tx_ant = ar->cfg_tx_chainmask;
3742                *rx_ant = ar->cfg_rx_chainmask;
3743        } else {
3744                *tx_ant = ar->supp_tx_chainmask;
3745                *rx_ant = ar->supp_rx_chainmask;
3746        }
3747
3748        mutex_unlock(&ar->conf_mutex);
3749
3750        return 0;
3751}
3752
3753static void ath10k_check_chain_mask(struct ath10k *ar, u32 cm, const char *dbg)
3754{
3755        /* It is not clear that allowing gaps in chainmask
3756         * is helpful.  Probably it will not do what user
3757         * is hoping for, so warn in that case.
3758         */
3759        if (cm == 15 || cm == 7 || cm == 3 || cm == 1 || cm == 0)
3760                return;
3761
3762        ath10k_warn(ar, "mac %s antenna chainmask may be invalid: 0x%x.  Suggested values: 15, 7, 3, 1 or 0.\n",
3763                    dbg, cm);
3764}
3765
3766static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant)
3767{
3768        int ret;
3769
3770        lockdep_assert_held(&ar->conf_mutex);
3771
3772        ath10k_check_chain_mask(ar, tx_ant, "tx");
3773        ath10k_check_chain_mask(ar, rx_ant, "rx");
3774
3775        ar->cfg_tx_chainmask = tx_ant;
3776        ar->cfg_rx_chainmask = rx_ant;
3777
3778        if ((ar->state != ATH10K_STATE_ON) &&
3779            (ar->state != ATH10K_STATE_RESTARTED))
3780                return 0;
3781
3782        ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask,
3783                                        tx_ant);
3784        if (ret) {
3785                ath10k_warn(ar, "failed to set tx-chainmask: %d, req 0x%x\n",
3786                            ret, tx_ant);
3787                return ret;
3788        }
3789
3790        ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask,
3791                                        rx_ant);
3792        if (ret) {
3793                ath10k_warn(ar, "failed to set rx-chainmask: %d, req 0x%x\n",
3794                            ret, rx_ant);
3795                return ret;
3796        }
3797
3798        return 0;
3799}
3800
3801static int ath10k_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
3802{
3803        struct ath10k *ar = hw->priv;
3804        int ret;
3805
3806        mutex_lock(&ar->conf_mutex);
3807        ret = __ath10k_set_antenna(ar, tx_ant, rx_ant);
3808        mutex_unlock(&ar->conf_mutex);
3809        return ret;
3810}
3811
3812static int ath10k_start(struct ieee80211_hw *hw)
3813{
3814        struct ath10k *ar = hw->priv;
3815        u32 burst_enable;
3816        int ret = 0;
3817
3818        /*
3819         * This makes sense only when restarting hw. It is harmless to call
3820         * uncoditionally. This is necessary to make sure no HTT/WMI tx
3821         * commands will be submitted while restarting.
3822         */
3823        ath10k_drain_tx(ar);
3824
3825        mutex_lock(&ar->conf_mutex);
3826
3827        switch (ar->state) {
3828        case ATH10K_STATE_OFF:
3829                ar->state = ATH10K_STATE_ON;
3830                break;
3831        case ATH10K_STATE_RESTARTING:
3832                ath10k_halt(ar);
3833                ar->state = ATH10K_STATE_RESTARTED;
3834                break;
3835        case ATH10K_STATE_ON:
3836        case ATH10K_STATE_RESTARTED:
3837        case ATH10K_STATE_WEDGED:
3838                WARN_ON(1);
3839                ret = -EINVAL;
3840                goto err;
3841        case ATH10K_STATE_UTF:
3842                ret = -EBUSY;
3843                goto err;
3844        }
3845
3846        ret = ath10k_hif_power_up(ar);
3847        if (ret) {
3848                ath10k_err(ar, "Could not init hif: %d\n", ret);
3849                goto err_off;
3850        }
3851
3852        ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_NORMAL);
3853        if (ret) {
3854                ath10k_err(ar, "Could not init core: %d\n", ret);
3855                goto err_power_down;
3856        }
3857
3858        ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->pmf_qos, 1);
3859        if (ret) {
3860                ath10k_warn(ar, "failed to enable PMF QOS: %d\n", ret);
3861                goto err_core_stop;
3862        }
3863
3864        ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->dynamic_bw, 1);
3865        if (ret) {
3866                ath10k_warn(ar, "failed to enable dynamic BW: %d\n", ret);
3867                goto err_core_stop;
3868        }
3869
3870        if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) {
3871                ret = ath10k_wmi_adaptive_qcs(ar, true);
3872                if (ret) {
3873                        ath10k_warn(ar, "failed to enable adaptive qcs: %d\n",
3874                                    ret);
3875                        goto err_core_stop;
3876                }
3877        }
3878
3879        if (test_bit(WMI_SERVICE_BURST, ar->wmi.svc_map)) {
3880                burst_enable = ar->wmi.pdev_param->burst_enable;
3881                ret = ath10k_wmi_pdev_set_param(ar, burst_enable, 0);
3882                if (ret) {
3883                        ath10k_warn(ar, "failed to disable burst: %d\n", ret);
3884                        goto err_core_stop;
3885                }
3886        }
3887
3888        if (ar->cfg_tx_chainmask)
3889                __ath10k_set_antenna(ar, ar->cfg_tx_chainmask,
3890                                     ar->cfg_rx_chainmask);
3891
3892        /*
3893         * By default FW set ARP frames ac to voice (6). In that case ARP
3894         * exchange is not working properly for UAPSD enabled AP. ARP requests
3895         * which arrives with access category 0 are processed by network stack
3896         * and send back with access category 0, but FW changes access category
3897         * to 6. Set ARP frames access category to best effort (0) solves
3898         * this problem.
3899         */
3900
3901        ret = ath10k_wmi_pdev_set_param(ar,
3902                                        ar->wmi.pdev_param->arp_ac_override, 0);
3903        if (ret) {
3904                ath10k_warn(ar, "failed to set arp ac override parameter: %d\n",
3905                            ret);
3906                goto err_core_stop;
3907        }
3908
3909        ret = ath10k_wmi_pdev_set_param(ar,
3910                                        ar->wmi.pdev_param->ani_enable, 1);
3911        if (ret) {
3912                ath10k_warn(ar, "failed to enable ani by default: %d\n",
3913                            ret);
3914                goto err_core_stop;
3915        }
3916
3917        ar->ani_enabled = true;
3918
3919        ar->num_started_vdevs = 0;
3920        ath10k_regd_update(ar);
3921
3922        ath10k_spectral_start(ar);
3923        ath10k_thermal_set_throttling(ar);
3924
3925        mutex_unlock(&ar->conf_mutex);
3926        return 0;
3927
3928err_core_stop:
3929        ath10k_core_stop(ar);
3930
3931err_power_down:
3932        ath10k_hif_power_down(ar);
3933
3934err_off:
3935        ar->state = ATH10K_STATE_OFF;
3936
3937err:
3938        mutex_unlock(&ar->conf_mutex);
3939        return ret;
3940}
3941
3942static void ath10k_stop(struct ieee80211_hw *hw)
3943{
3944        struct ath10k *ar = hw->priv;
3945
3946        ath10k_drain_tx(ar);
3947
3948        mutex_lock(&ar->conf_mutex);
3949        if (ar->state != ATH10K_STATE_OFF) {
3950                ath10k_halt(ar);
3951                ar->state = ATH10K_STATE_OFF;
3952        }
3953        mutex_unlock(&ar->conf_mutex);
3954
3955        cancel_delayed_work_sync(&ar->scan.timeout);
3956        cancel_work_sync(&ar->restart_work);
3957}
3958
3959static int ath10k_config_ps(struct ath10k *ar)
3960{
3961        struct ath10k_vif *arvif;
3962        int ret = 0;
3963
3964        lockdep_assert_held(&ar->conf_mutex);
3965
3966        list_for_each_entry(arvif, &ar->arvifs, list) {
3967                ret = ath10k_mac_vif_setup_ps(arvif);
3968                if (ret) {
3969                        ath10k_warn(ar, "failed to setup powersave: %d\n", ret);
3970                        break;
3971                }
3972        }
3973
3974        return ret;
3975}
3976
3977static int ath10k_mac_txpower_setup(struct ath10k *ar, int txpower)
3978{
3979        int ret;
3980        u32 param;
3981
3982        lockdep_assert_held(&ar->conf_mutex);
3983
3984        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac txpower %d\n", txpower);
3985
3986        param = ar->wmi.pdev_param->txpower_limit2g;
3987        ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
3988        if (ret) {
3989                ath10k_warn(ar, "failed to set 2g txpower %d: %d\n",
3990                            txpower, ret);
3991                return ret;
3992        }
3993
3994        param = ar->wmi.pdev_param->txpower_limit5g;
3995        ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
3996        if (ret) {
3997                ath10k_warn(ar, "failed to set 5g txpower %d: %d\n",
3998                            txpower, ret);
3999                return ret;
4000        }
4001
4002        return 0;
4003}
4004
4005static int ath10k_mac_txpower_recalc(struct ath10k *ar)
4006{
4007        struct ath10k_vif *arvif;
4008        int ret, txpower = -1;
4009
4010        lockdep_assert_held(&ar->conf_mutex);
4011
4012        list_for_each_entry(arvif, &ar->arvifs, list) {
4013                WARN_ON(arvif->txpower < 0);
4014
4015                if (txpower == -1)
4016                        txpower = arvif->txpower;
4017                else
4018                        txpower = min(txpower, arvif->txpower);
4019        }
4020
4021        if (WARN_ON(txpower == -1))
4022                return -EINVAL;
4023
4024        ret = ath10k_mac_txpower_setup(ar, txpower);
4025        if (ret) {
4026                ath10k_warn(ar, "failed to setup tx power %d: %d\n",
4027                            txpower, ret);
4028                return ret;
4029        }
4030
4031        return 0;
4032}
4033
4034static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
4035{
4036        struct ath10k *ar = hw->priv;
4037        struct ieee80211_conf *conf = &hw->conf;
4038        int ret = 0;
4039
4040        mutex_lock(&ar->conf_mutex);
4041
4042        if (changed & IEEE80211_CONF_CHANGE_PS)
4043                ath10k_config_ps(ar);
4044
4045        if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
4046                ar->monitor = conf->flags & IEEE80211_CONF_MONITOR;
4047                ret = ath10k_monitor_recalc(ar);
4048                if (ret)
4049                        ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
4050        }
4051
4052        mutex_unlock(&ar->conf_mutex);
4053        return ret;
4054}
4055
4056static u32 get_nss_from_chainmask(u16 chain_mask)
4057{
4058        if ((chain_mask & 0x15) == 0x15)
4059                return 4;
4060        else if ((chain_mask & 0x7) == 0x7)
4061                return 3;
4062        else if ((chain_mask & 0x3) == 0x3)
4063                return 2;
4064        return 1;
4065}
4066
4067static int ath10k_mac_set_txbf_conf(struct ath10k_vif *arvif)
4068{
4069        u32 value = 0;
4070        struct ath10k *ar = arvif->ar;
4071
4072        if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_BEFORE_ASSOC)
4073                return 0;
4074
4075        if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
4076                                IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE))
4077                value |= SM((ar->num_rf_chains - 1), WMI_TXBF_STS_CAP_OFFSET);
4078
4079        if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
4080                                IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE))
4081                value |= SM((ar->num_rf_chains - 1), WMI_BF_SOUND_DIM_OFFSET);
4082
4083        if (!value)
4084                return 0;
4085
4086        if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)
4087                value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
4088
4089        if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)
4090                value |= (WMI_VDEV_PARAM_TXBF_MU_TX_BFER |
4091                          WMI_VDEV_PARAM_TXBF_SU_TX_BFER);
4092
4093        if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)
4094                value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
4095
4096        if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)
4097                value |= (WMI_VDEV_PARAM_TXBF_MU_TX_BFEE |
4098                          WMI_VDEV_PARAM_TXBF_SU_TX_BFEE);
4099
4100        return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
4101                                         ar->wmi.vdev_param->txbf, value);
4102}
4103
4104/*
4105 * TODO:
4106 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
4107 * because we will send mgmt frames without CCK. This requirement
4108 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
4109 * in the TX packet.
4110 */
4111static int ath10k_add_interface(struct ieee80211_hw *hw,
4112                                struct ieee80211_vif *vif)
4113{
4114        struct ath10k *ar = hw->priv;
4115        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4116        enum wmi_sta_powersave_param param;
4117        int ret = 0;
4118        u32 value;
4119        int bit;
4120        int i;
4121        u32 vdev_param;
4122
4123        vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
4124
4125        mutex_lock(&ar->conf_mutex);
4126
4127        memset(arvif, 0, sizeof(*arvif));
4128
4129        arvif->ar = ar;
4130        arvif->vif = vif;
4131
4132        INIT_LIST_HEAD(&arvif->list);
4133        INIT_WORK(&arvif->ap_csa_work, ath10k_mac_vif_ap_csa_work);
4134        INIT_DELAYED_WORK(&arvif->connection_loss_work,
4135                          ath10k_mac_vif_sta_connection_loss_work);
4136
4137        for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
4138                arvif->bitrate_mask.control[i].legacy = 0xffffffff;
4139                memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
4140                       sizeof(arvif->bitrate_mask.control[i].ht_mcs));
4141                memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
4142                       sizeof(arvif->bitrate_mask.control[i].vht_mcs));
4143        }
4144
4145        if (ar->num_peers >= ar->max_num_peers) {
4146                ath10k_warn(ar, "refusing vdev creation due to insufficient peer entry resources in firmware\n");
4147                ret = -ENOBUFS;
4148                goto err;
4149        }
4150
4151        if (ar->free_vdev_map == 0) {
4152                ath10k_warn(ar, "Free vdev map is empty, no more interfaces allowed.\n");
4153                ret = -EBUSY;
4154                goto err;
4155        }
4156        bit = __ffs64(ar->free_vdev_map);
4157
4158        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac create vdev %i map %llx\n",
4159                   bit, ar->free_vdev_map);
4160
4161        arvif->vdev_id = bit;
4162        arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
4163
4164        switch (vif->type) {
4165        case NL80211_IFTYPE_P2P_DEVICE:
4166                arvif->vdev_type = WMI_VDEV_TYPE_STA;
4167                arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
4168                break;
4169        case NL80211_IFTYPE_UNSPECIFIED:
4170        case NL80211_IFTYPE_STATION:
4171                arvif->vdev_type = WMI_VDEV_TYPE_STA;
4172                if (vif->p2p)
4173                        arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
4174                break;
4175        case NL80211_IFTYPE_ADHOC:
4176                arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
4177                break;
4178        case NL80211_IFTYPE_AP:
4179                arvif->vdev_type = WMI_VDEV_TYPE_AP;
4180
4181                if (vif->p2p)
4182                        arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
4183                break;
4184        case NL80211_IFTYPE_MONITOR:
4185                arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
4186                break;
4187        default:
4188                WARN_ON(1);
4189                break;
4190        }
4191
4192        /* Using vdev_id as queue number will make it very easy to do per-vif
4193         * tx queue locking. This shouldn't wrap due to interface combinations
4194         * but do a modulo for correctness sake and prevent using offchannel tx
4195         * queues for regular vif tx.
4196         */
4197        vif->cab_queue = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1);
4198        for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
4199                vif->hw_queue[i] = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1);
4200
4201        /* Some firmware revisions don't wait for beacon tx completion before
4202         * sending another SWBA event. This could lead to hardware using old
4203         * (freed) beacon data in some cases, e.g. tx credit starvation
4204         * combined with missed TBTT. This is very very rare.
4205         *
4206         * On non-IOMMU-enabled hosts this could be a possible security issue
4207         * because hw could beacon some random data on the air.  On
4208         * IOMMU-enabled hosts DMAR faults would occur in most cases and target
4209         * device would crash.
4210         *
4211         * Since there are no beacon tx completions (implicit nor explicit)
4212         * propagated to host the only workaround for this is to allocate a
4213         * DMA-coherent buffer for a lifetime of a vif and use it for all
4214         * beacon tx commands. Worst case for this approach is some beacons may
4215         * become corrupted, e.g. have garbled IEs or out-of-date TIM bitmap.
4216         */
4217        if (vif->type == NL80211_IFTYPE_ADHOC ||
4218            vif->type == NL80211_IFTYPE_AP) {
4219                arvif->beacon_buf = dma_zalloc_coherent(ar->dev,
4220                                                        IEEE80211_MAX_FRAME_LEN,
4221                                                        &arvif->beacon_paddr,
4222                                                        GFP_ATOMIC);
4223                if (!arvif->beacon_buf) {
4224                        ret = -ENOMEM;
4225                        ath10k_warn(ar, "failed to allocate beacon buffer: %d\n",
4226                                    ret);
4227                        goto err;
4228                }
4229        }
4230        if (test_bit(ATH10K_FLAG_HW_CRYPTO_DISABLED, &ar->dev_flags))
4231                arvif->nohwcrypt = true;
4232
4233        if (arvif->nohwcrypt &&
4234            !test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
4235                ath10k_warn(ar, "cryptmode module param needed for sw crypto\n");
4236                goto err;
4237        }
4238
4239        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d bcnmode %s\n",
4240                   arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
4241                   arvif->beacon_buf ? "single-buf" : "per-skb");
4242
4243        ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
4244                                     arvif->vdev_subtype, vif->addr);
4245        if (ret) {
4246                ath10k_warn(ar, "failed to create WMI vdev %i: %d\n",
4247                            arvif->vdev_id, ret);
4248                goto err;
4249        }
4250
4251        ar->free_vdev_map &= ~(1LL << arvif->vdev_id);
4252        list_add(&arvif->list, &ar->arvifs);
4253
4254        /* It makes no sense to have firmware do keepalives. mac80211 already
4255         * takes care of this with idle connection polling.
4256         */
4257        ret = ath10k_mac_vif_disable_keepalive(arvif);
4258        if (ret) {
4259                ath10k_warn(ar, "failed to disable keepalive on vdev %i: %d\n",
4260                            arvif->vdev_id, ret);
4261                goto err_vdev_delete;
4262        }
4263
4264        arvif->def_wep_key_idx = -1;
4265
4266        vdev_param = ar->wmi.vdev_param->tx_encap_type;
4267        ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4268                                        ATH10K_HW_TXRX_NATIVE_WIFI);
4269        /* 10.X firmware does not support this VDEV parameter. Do not warn */
4270        if (ret && ret != -EOPNOTSUPP) {
4271                ath10k_warn(ar, "failed to set vdev %i TX encapsulation: %d\n",
4272                            arvif->vdev_id, ret);
4273                goto err_vdev_delete;
4274        }
4275
4276        if (ar->cfg_tx_chainmask) {
4277                u16 nss = get_nss_from_chainmask(ar->cfg_tx_chainmask);
4278
4279                vdev_param = ar->wmi.vdev_param->nss;
4280                ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4281                                                nss);
4282                if (ret) {
4283                        ath10k_warn(ar, "failed to set vdev %i chainmask 0x%x, nss %i: %d\n",
4284                                    arvif->vdev_id, ar->cfg_tx_chainmask, nss,
4285                                    ret);
4286                        goto err_vdev_delete;
4287                }
4288        }
4289
4290        if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4291            arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
4292                ret = ath10k_peer_create(ar, arvif->vdev_id, vif->addr,
4293                                         WMI_PEER_TYPE_DEFAULT);
4294                if (ret) {
4295                        ath10k_warn(ar, "failed to create vdev %i peer for AP/IBSS: %d\n",
4296                                    arvif->vdev_id, ret);
4297                        goto err_vdev_delete;
4298                }
4299        }
4300
4301        if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
4302                ret = ath10k_mac_set_kickout(arvif);
4303                if (ret) {
4304                        ath10k_warn(ar, "failed to set vdev %i kickout parameters: %d\n",
4305                                    arvif->vdev_id, ret);
4306                        goto err_peer_delete;
4307                }
4308        }
4309
4310        if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
4311                param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
4312                value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
4313                ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4314                                                  param, value);
4315                if (ret) {
4316                        ath10k_warn(ar, "failed to set vdev %i RX wake policy: %d\n",
4317                                    arvif->vdev_id, ret);
4318                        goto err_peer_delete;
4319                }
4320
4321                ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
4322                if (ret) {
4323                        ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
4324                                    arvif->vdev_id, ret);
4325                        goto err_peer_delete;
4326                }
4327
4328                ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
4329                if (ret) {
4330                        ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
4331                                    arvif->vdev_id, ret);
4332                        goto err_peer_delete;
4333                }
4334        }
4335
4336        ret = ath10k_mac_set_txbf_conf(arvif);
4337        if (ret) {
4338                ath10k_warn(ar, "failed to set txbf for vdev %d: %d\n",
4339                            arvif->vdev_id, ret);
4340                goto err_peer_delete;
4341        }
4342
4343        ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
4344        if (ret) {
4345                ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
4346                            arvif->vdev_id, ret);
4347                goto err_peer_delete;
4348        }
4349
4350        arvif->txpower = vif->bss_conf.txpower;
4351        ret = ath10k_mac_txpower_recalc(ar);
4352        if (ret) {
4353                ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
4354                goto err_peer_delete;
4355        }
4356
4357        if (vif->type == NL80211_IFTYPE_MONITOR) {
4358                ar->monitor_arvif = arvif;
4359                ret = ath10k_monitor_recalc(ar);
4360                if (ret) {
4361                        ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
4362                        goto err_peer_delete;
4363                }
4364        }
4365
4366        spin_lock_bh(&ar->htt.tx_lock);
4367        if (!ar->tx_paused)
4368                ieee80211_wake_queue(ar->hw, arvif->vdev_id);
4369        spin_unlock_bh(&ar->htt.tx_lock);
4370
4371        mutex_unlock(&ar->conf_mutex);
4372        return 0;
4373
4374err_peer_delete:
4375        if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4376            arvif->vdev_type == WMI_VDEV_TYPE_IBSS)
4377                ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr);
4378
4379err_vdev_delete:
4380        ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
4381        ar->free_vdev_map |= 1LL << arvif->vdev_id;
4382        list_del(&arvif->list);
4383
4384err:
4385        if (arvif->beacon_buf) {
4386                dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
4387                                  arvif->beacon_buf, arvif->beacon_paddr);
4388                arvif->beacon_buf = NULL;
4389        }
4390
4391        mutex_unlock(&ar->conf_mutex);
4392
4393        return ret;
4394}
4395
4396static void ath10k_mac_vif_tx_unlock_all(struct ath10k_vif *arvif)
4397{
4398        int i;
4399
4400        for (i = 0; i < BITS_PER_LONG; i++)
4401                ath10k_mac_vif_tx_unlock(arvif, i);
4402}
4403
4404static void ath10k_remove_interface(struct ieee80211_hw *hw,
4405                                    struct ieee80211_vif *vif)
4406{
4407        struct ath10k *ar = hw->priv;
4408        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4409        int ret;
4410
4411        cancel_work_sync(&arvif->ap_csa_work);
4412        cancel_delayed_work_sync(&arvif->connection_loss_work);
4413
4414        mutex_lock(&ar->conf_mutex);
4415
4416        spin_lock_bh(&ar->data_lock);
4417        ath10k_mac_vif_beacon_cleanup(arvif);
4418        spin_unlock_bh(&ar->data_lock);
4419
4420        ret = ath10k_spectral_vif_stop(arvif);
4421        if (ret)
4422                ath10k_warn(ar, "failed to stop spectral for vdev %i: %d\n",
4423                            arvif->vdev_id, ret);
4424
4425        ar->free_vdev_map |= 1LL << arvif->vdev_id;
4426        list_del(&arvif->list);
4427
4428        if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4429            arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
4430                ret = ath10k_wmi_peer_delete(arvif->ar, arvif->vdev_id,
4431                                             vif->addr);
4432                if (ret)
4433                        ath10k_warn(ar, "failed to submit AP/IBSS self-peer removal on vdev %i: %d\n",
4434                                    arvif->vdev_id, ret);
4435
4436                kfree(arvif->u.ap.noa_data);
4437        }
4438
4439        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i delete (remove interface)\n",
4440                   arvif->vdev_id);
4441
4442        ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
4443        if (ret)
4444                ath10k_warn(ar, "failed to delete WMI vdev %i: %d\n",
4445                            arvif->vdev_id, ret);
4446
4447        /* Some firmware revisions don't notify host about self-peer removal
4448         * until after associated vdev is deleted.
4449         */
4450        if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4451            arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
4452                ret = ath10k_wait_for_peer_deleted(ar, arvif->vdev_id,
4453                                                   vif->addr);
4454                if (ret)
4455                        ath10k_warn(ar, "failed to remove AP self-peer on vdev %i: %d\n",
4456                                    arvif->vdev_id, ret);
4457
4458                spin_lock_bh(&ar->data_lock);
4459                ar->num_peers--;
4460                spin_unlock_bh(&ar->data_lock);
4461        }
4462
4463        ath10k_peer_cleanup(ar, arvif->vdev_id);
4464
4465        if (vif->type == NL80211_IFTYPE_MONITOR) {
4466                ar->monitor_arvif = NULL;
4467                ret = ath10k_monitor_recalc(ar);
4468                if (ret)
4469                        ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
4470        }
4471
4472        spin_lock_bh(&ar->htt.tx_lock);
4473        ath10k_mac_vif_tx_unlock_all(arvif);
4474        spin_unlock_bh(&ar->htt.tx_lock);
4475
4476        mutex_unlock(&ar->conf_mutex);
4477}
4478
4479/*
4480 * FIXME: Has to be verified.
4481 */
4482#define SUPPORTED_FILTERS                       \
4483        (FIF_ALLMULTI |                         \
4484        FIF_CONTROL |                           \
4485        FIF_PSPOLL |                            \
4486        FIF_OTHER_BSS |                         \
4487        FIF_BCN_PRBRESP_PROMISC |               \
4488        FIF_PROBE_REQ |                         \
4489        FIF_FCSFAIL)
4490
4491static void ath10k_configure_filter(struct ieee80211_hw *hw,
4492                                    unsigned int changed_flags,
4493                                    unsigned int *total_flags,
4494                                    u64 multicast)
4495{
4496        struct ath10k *ar = hw->priv;
4497        int ret;
4498
4499        mutex_lock(&ar->conf_mutex);
4500
4501        changed_flags &= SUPPORTED_FILTERS;
4502        *total_flags &= SUPPORTED_FILTERS;
4503        ar->filter_flags = *total_flags;
4504
4505        ret = ath10k_monitor_recalc(ar);
4506        if (ret)
4507                ath10k_warn(ar, "failed to recalc montior: %d\n", ret);
4508
4509        mutex_unlock(&ar->conf_mutex);
4510}
4511
4512static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
4513                                    struct ieee80211_vif *vif,
4514                                    struct ieee80211_bss_conf *info,
4515                                    u32 changed)
4516{
4517        struct ath10k *ar = hw->priv;
4518        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4519        int ret = 0;
4520        u32 vdev_param, pdev_param, slottime, preamble;
4521
4522        mutex_lock(&ar->conf_mutex);
4523
4524        if (changed & BSS_CHANGED_IBSS)
4525                ath10k_control_ibss(arvif, info, vif->addr);
4526
4527        if (changed & BSS_CHANGED_BEACON_INT) {
4528                arvif->beacon_interval = info->beacon_int;
4529                vdev_param = ar->wmi.vdev_param->beacon_interval;
4530                ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4531                                                arvif->beacon_interval);
4532                ath10k_dbg(ar, ATH10K_DBG_MAC,
4533                           "mac vdev %d beacon_interval %d\n",
4534                           arvif->vdev_id, arvif->beacon_interval);
4535
4536                if (ret)
4537                        ath10k_warn(ar, "failed to set beacon interval for vdev %d: %i\n",
4538                                    arvif->vdev_id, ret);
4539        }
4540
4541        if (changed & BSS_CHANGED_BEACON) {
4542                ath10k_dbg(ar, ATH10K_DBG_MAC,
4543                           "vdev %d set beacon tx mode to staggered\n",
4544                           arvif->vdev_id);
4545
4546                pdev_param = ar->wmi.pdev_param->beacon_tx_mode;
4547                ret = ath10k_wmi_pdev_set_param(ar, pdev_param,
4548                                                WMI_BEACON_STAGGERED_MODE);
4549                if (ret)
4550                        ath10k_warn(ar, "failed to set beacon mode for vdev %d: %i\n",
4551                                    arvif->vdev_id, ret);
4552
4553                ret = ath10k_mac_setup_bcn_tmpl(arvif);
4554                if (ret)
4555                        ath10k_warn(ar, "failed to update beacon template: %d\n",
4556                                    ret);
4557        }
4558
4559        if (changed & BSS_CHANGED_AP_PROBE_RESP) {
4560                ret = ath10k_mac_setup_prb_tmpl(arvif);
4561                if (ret)
4562                        ath10k_warn(ar, "failed to setup probe resp template on vdev %i: %d\n",
4563                                    arvif->vdev_id, ret);
4564        }
4565
4566        if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
4567                arvif->dtim_period = info->dtim_period;
4568
4569                ath10k_dbg(ar, ATH10K_DBG_MAC,
4570                           "mac vdev %d dtim_period %d\n",
4571                           arvif->vdev_id, arvif->dtim_period);
4572
4573                vdev_param = ar->wmi.vdev_param->dtim_period;
4574                ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4575                                                arvif->dtim_period);
4576                if (ret)
4577                        ath10k_warn(ar, "failed to set dtim period for vdev %d: %i\n",
4578                                    arvif->vdev_id, ret);
4579        }
4580
4581        if (changed & BSS_CHANGED_SSID &&
4582            vif->type == NL80211_IFTYPE_AP) {
4583                arvif->u.ap.ssid_len = info->ssid_len;
4584                if (info->ssid_len)
4585                        memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
4586                arvif->u.ap.hidden_ssid = info->hidden_ssid;
4587        }
4588
4589        if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
4590                ether_addr_copy(arvif->bssid, info->bssid);
4591
4592        if (changed & BSS_CHANGED_BEACON_ENABLED)
4593                ath10k_control_beaconing(arvif, info);
4594
4595        if (changed & BSS_CHANGED_ERP_CTS_PROT) {
4596                arvif->use_cts_prot = info->use_cts_prot;
4597                ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d cts_prot %d\n",
4598                           arvif->vdev_id, info->use_cts_prot);
4599
4600                ret = ath10k_recalc_rtscts_prot(arvif);
4601                if (ret)
4602                        ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
4603                                    arvif->vdev_id, ret);
4604
4605                vdev_param = ar->wmi.vdev_param->protection_mode;
4606                ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4607                                                info->use_cts_prot ? 1 : 0);
4608                if (ret)
4609                        ath10k_warn(ar, "failed to set protection mode %d on vdev %i: %d\n",
4610                                        info->use_cts_prot, arvif->vdev_id, ret);
4611        }
4612
4613        if (changed & BSS_CHANGED_ERP_SLOT) {
4614                if (info->use_short_slot)
4615                        slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
4616
4617                else
4618                        slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
4619
4620                ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n",
4621                           arvif->vdev_id, slottime);
4622
4623                vdev_param = ar->wmi.vdev_param->slot_time;
4624                ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4625                                                slottime);
4626                if (ret)
4627                        ath10k_warn(ar, "failed to set erp slot for vdev %d: %i\n",
4628                                    arvif->vdev_id, ret);
4629        }
4630
4631        if (changed & BSS_CHANGED_ERP_PREAMBLE) {
4632                if (info->use_short_preamble)
4633                        preamble = WMI_VDEV_PREAMBLE_SHORT;
4634                else
4635                        preamble = WMI_VDEV_PREAMBLE_LONG;
4636
4637                ath10k_dbg(ar, ATH10K_DBG_MAC,
4638                           "mac vdev %d preamble %dn",
4639                           arvif->vdev_id, preamble);
4640
4641                vdev_param = ar->wmi.vdev_param->preamble;
4642                ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4643                                                preamble);
4644                if (ret)
4645                        ath10k_warn(ar, "failed to set preamble for vdev %d: %i\n",
4646                                    arvif->vdev_id, ret);
4647        }
4648
4649        if (changed & BSS_CHANGED_ASSOC) {
4650                if (info->assoc) {
4651                        /* Workaround: Make sure monitor vdev is not running
4652                         * when associating to prevent some firmware revisions
4653                         * (e.g. 10.1 and 10.2) from crashing.
4654                         */
4655                        if (ar->monitor_started)
4656                                ath10k_monitor_stop(ar);
4657                        ath10k_bss_assoc(hw, vif, info);
4658                        ath10k_monitor_recalc(ar);
4659                } else {
4660                        ath10k_bss_disassoc(hw, vif);
4661                }
4662        }
4663
4664        if (changed & BSS_CHANGED_TXPOWER) {
4665                ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev_id %i txpower %d\n",
4666                           arvif->vdev_id, info->txpower);
4667
4668                arvif->txpower = info->txpower;
4669                ret = ath10k_mac_txpower_recalc(ar);
4670                if (ret)
4671                        ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
4672        }
4673
4674        if (changed & BSS_CHANGED_PS) {
4675                arvif->ps = vif->bss_conf.ps;
4676
4677                ret = ath10k_config_ps(ar);
4678                if (ret)
4679                        ath10k_warn(ar, "failed to setup ps on vdev %i: %d\n",
4680                                    arvif->vdev_id, ret);
4681        }
4682
4683        mutex_unlock(&ar->conf_mutex);
4684}
4685
4686static int ath10k_hw_scan(struct ieee80211_hw *hw,
4687                          struct ieee80211_vif *vif,
4688                          struct ieee80211_scan_request *hw_req)
4689{
4690        struct ath10k *ar = hw->priv;
4691        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4692        struct cfg80211_scan_request *req = &hw_req->req;
4693        struct wmi_start_scan_arg arg;
4694        int ret = 0;
4695        int i;
4696
4697        mutex_lock(&ar->conf_mutex);
4698
4699        spin_lock_bh(&ar->data_lock);
4700        switch (ar->scan.state) {
4701        case ATH10K_SCAN_IDLE:
4702                reinit_completion(&ar->scan.started);
4703                reinit_completion(&ar->scan.completed);
4704                ar->scan.state = ATH10K_SCAN_STARTING;
4705                ar->scan.is_roc = false;
4706                ar->scan.vdev_id = arvif->vdev_id;
4707                ret = 0;
4708                break;
4709        case ATH10K_SCAN_STARTING:
4710        case ATH10K_SCAN_RUNNING:
4711        case ATH10K_SCAN_ABORTING:
4712                ret = -EBUSY;
4713                break;
4714        }
4715        spin_unlock_bh(&ar->data_lock);
4716
4717        if (ret)
4718                goto exit;
4719
4720        memset(&arg, 0, sizeof(arg));
4721        ath10k_wmi_start_scan_init(ar, &arg);
4722        arg.vdev_id = arvif->vdev_id;
4723        arg.scan_id = ATH10K_SCAN_ID;
4724
4725        if (req->ie_len) {
4726                arg.ie_len = req->ie_len;
4727                memcpy(arg.ie, req->ie, arg.ie_len);
4728        }
4729
4730        if (req->n_ssids) {
4731                arg.n_ssids = req->n_ssids;
4732                for (i = 0; i < arg.n_ssids; i++) {
4733                        arg.ssids[i].len  = req->ssids[i].ssid_len;
4734                        arg.ssids[i].ssid = req->ssids[i].ssid;
4735                }
4736        } else {
4737                arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
4738        }
4739
4740        if (req->n_channels) {
4741                arg.n_channels = req->n_channels;
4742                for (i = 0; i < arg.n_channels; i++)
4743                        arg.channels[i] = req->channels[i]->center_freq;
4744        }
4745
4746        ret = ath10k_start_scan(ar, &arg);
4747        if (ret) {
4748                ath10k_warn(ar, "failed to start hw scan: %d\n", ret);
4749                spin_lock_bh(&ar->data_lock);
4750                ar->scan.state = ATH10K_SCAN_IDLE;
4751                spin_unlock_bh(&ar->data_lock);
4752        }
4753
4754exit:
4755        mutex_unlock(&ar->conf_mutex);
4756        return ret;
4757}
4758
4759static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
4760                                  struct ieee80211_vif *vif)
4761{
4762        struct ath10k *ar = hw->priv;
4763
4764        mutex_lock(&ar->conf_mutex);
4765        ath10k_scan_abort(ar);
4766        mutex_unlock(&ar->conf_mutex);
4767
4768        cancel_delayed_work_sync(&ar->scan.timeout);
4769}
4770
4771static void ath10k_set_key_h_def_keyidx(struct ath10k *ar,
4772                                        struct ath10k_vif *arvif,
4773                                        enum set_key_cmd cmd,
4774                                        struct ieee80211_key_conf *key)
4775{
4776        u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid;
4777        int ret;
4778
4779        /* 10.1 firmware branch requires default key index to be set to group
4780         * key index after installing it. Otherwise FW/HW Txes corrupted
4781         * frames with multi-vif APs. This is not required for main firmware
4782         * branch (e.g. 636).
4783         *
4784         * This is also needed for 636 fw for IBSS-RSN to work more reliably.
4785         *
4786         * FIXME: It remains unknown if this is required for multi-vif STA
4787         * interfaces on 10.1.
4788         */
4789
4790        if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
4791            arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
4792                return;
4793
4794        if (key->cipher == WLAN_CIPHER_SUITE_WEP40)
4795                return;
4796
4797        if (key->cipher == WLAN_CIPHER_SUITE_WEP104)
4798                return;
4799
4800        if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
4801                return;
4802
4803        if (cmd != SET_KEY)
4804                return;
4805
4806        ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4807                                        key->keyidx);
4808        if (ret)
4809                ath10k_warn(ar, "failed to set vdev %i group key as default key: %d\n",
4810                            arvif->vdev_id, ret);
4811}
4812
4813static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
4814                          struct ieee80211_vif *vif, struct ieee80211_sta *sta,
4815                          struct ieee80211_key_conf *key)
4816{
4817        struct ath10k *ar = hw->priv;
4818        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4819        struct ath10k_peer *peer;
4820        const u8 *peer_addr;
4821        bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
4822                      key->cipher == WLAN_CIPHER_SUITE_WEP104;
4823        int ret = 0;
4824        int ret2;
4825        u32 flags = 0;
4826        u32 flags2;
4827
4828        /* this one needs to be done in software */
4829        if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC)
4830                return 1;
4831
4832        if (arvif->nohwcrypt)
4833                return 1;
4834
4835        if (key->keyidx > WMI_MAX_KEY_INDEX)
4836                return -ENOSPC;
4837
4838        mutex_lock(&ar->conf_mutex);
4839
4840        if (sta)
4841                peer_addr = sta->addr;
4842        else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
4843                peer_addr = vif->bss_conf.bssid;
4844        else
4845                peer_addr = vif->addr;
4846
4847        key->hw_key_idx = key->keyidx;
4848
4849        if (is_wep) {
4850                if (cmd == SET_KEY)
4851                        arvif->wep_keys[key->keyidx] = key;
4852                else
4853                        arvif->wep_keys[key->keyidx] = NULL;
4854        }
4855
4856        /* the peer should not disappear in mid-way (unless FW goes awry) since
4857         * we already hold conf_mutex. we just make sure its there now. */
4858        spin_lock_bh(&ar->data_lock);
4859        peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
4860        spin_unlock_bh(&ar->data_lock);
4861
4862        if (!peer) {
4863                if (cmd == SET_KEY) {
4864                        ath10k_warn(ar, "failed to install key for non-existent peer %pM\n",
4865                                    peer_addr);
4866                        ret = -EOPNOTSUPP;
4867                        goto exit;
4868                } else {
4869                        /* if the peer doesn't exist there is no key to disable
4870                         * anymore */
4871                        goto exit;
4872                }
4873        }
4874
4875        if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
4876                flags |= WMI_KEY_PAIRWISE;
4877        else
4878                flags |= WMI_KEY_GROUP;
4879
4880        if (is_wep) {
4881                if (cmd == DISABLE_KEY)
4882                        ath10k_clear_vdev_key(arvif, key);
4883
4884                /* When WEP keys are uploaded it's possible that there are
4885                 * stations associated already (e.g. when merging) without any
4886                 * keys. Static WEP needs an explicit per-peer key upload.
4887                 */
4888                if (vif->type == NL80211_IFTYPE_ADHOC &&
4889                    cmd == SET_KEY)
4890                        ath10k_mac_vif_update_wep_key(arvif, key);
4891
4892                /* 802.1x never sets the def_wep_key_idx so each set_key()
4893                 * call changes default tx key.
4894                 *
4895                 * Static WEP sets def_wep_key_idx via .set_default_unicast_key
4896                 * after first set_key().
4897                 */
4898                if (cmd == SET_KEY && arvif->def_wep_key_idx == -1)
4899                        flags |= WMI_KEY_TX_USAGE;
4900        }
4901
4902        ret = ath10k_install_key(arvif, key, cmd, peer_addr, flags);
4903        if (ret) {
4904                WARN_ON(ret > 0);
4905                ath10k_warn(ar, "failed to install key for vdev %i peer %pM: %d\n",
4906                            arvif->vdev_id, peer_addr, ret);
4907                goto exit;
4908        }
4909
4910        /* mac80211 sets static WEP keys as groupwise while firmware requires
4911         * them to be installed twice as both pairwise and groupwise.
4912         */
4913        if (is_wep && !sta && vif->type == NL80211_IFTYPE_STATION) {
4914                flags2 = flags;
4915                flags2 &= ~WMI_KEY_GROUP;
4916                flags2 |= WMI_KEY_PAIRWISE;
4917
4918                ret = ath10k_install_key(arvif, key, cmd, peer_addr, flags2);
4919                if (ret) {
4920                        WARN_ON(ret > 0);
4921                        ath10k_warn(ar, "failed to install (ucast) key for vdev %i peer %pM: %d\n",
4922                                    arvif->vdev_id, peer_addr, ret);
4923                        ret2 = ath10k_install_key(arvif, key, DISABLE_KEY,
4924                                                  peer_addr, flags);
4925                        if (ret2) {
4926                                WARN_ON(ret2 > 0);
4927                                ath10k_warn(ar, "failed to disable (mcast) key for vdev %i peer %pM: %d\n",
4928                                            arvif->vdev_id, peer_addr, ret2);
4929                        }
4930                        goto exit;
4931                }
4932        }
4933
4934        ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key);
4935
4936        spin_lock_bh(&ar->data_lock);
4937        peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
4938        if (peer && cmd == SET_KEY)
4939                peer->keys[key->keyidx] = key;
4940        else if (peer && cmd == DISABLE_KEY)
4941                peer->keys[key->keyidx] = NULL;
4942        else if (peer == NULL)
4943                /* impossible unless FW goes crazy */
4944                ath10k_warn(ar, "Peer %pM disappeared!\n", peer_addr);
4945        spin_unlock_bh(&ar->data_lock);
4946
4947exit:
4948        mutex_unlock(&ar->conf_mutex);
4949        return ret;
4950}
4951
4952static void ath10k_set_default_unicast_key(struct ieee80211_hw *hw,
4953                                           struct ieee80211_vif *vif,
4954                                           int keyidx)
4955{
4956        struct ath10k *ar = hw->priv;
4957        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4958        int ret;
4959
4960        mutex_lock(&arvif->ar->conf_mutex);
4961
4962        if (arvif->ar->state != ATH10K_STATE_ON)
4963                goto unlock;
4964
4965        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
4966                   arvif->vdev_id, keyidx);
4967
4968        ret = ath10k_wmi_vdev_set_param(arvif->ar,
4969                                        arvif->vdev_id,
4970                                        arvif->ar->wmi.vdev_param->def_keyid,
4971                                        keyidx);
4972
4973        if (ret) {
4974                ath10k_warn(ar, "failed to update wep key index for vdev %d: %d\n",
4975                            arvif->vdev_id,
4976                            ret);
4977                goto unlock;
4978        }
4979
4980        arvif->def_wep_key_idx = keyidx;
4981
4982unlock:
4983        mutex_unlock(&arvif->ar->conf_mutex);
4984}
4985
4986static void ath10k_sta_rc_update_wk(struct work_struct *wk)
4987{
4988        struct ath10k *ar;
4989        struct ath10k_vif *arvif;
4990        struct ath10k_sta *arsta;
4991        struct ieee80211_sta *sta;
4992        struct cfg80211_chan_def def;
4993        enum ieee80211_band band;
4994        const u8 *ht_mcs_mask;
4995        const u16 *vht_mcs_mask;
4996        u32 changed, bw, nss, smps;
4997        int err;
4998
4999        arsta = container_of(wk, struct ath10k_sta, update_wk);
5000        sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
5001        arvif = arsta->arvif;
5002        ar = arvif->ar;
5003
5004        if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def)))
5005                return;
5006
5007        band = def.chan->band;
5008        ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
5009        vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
5010
5011        spin_lock_bh(&ar->data_lock);
5012
5013        changed = arsta->changed;
5014        arsta->changed = 0;
5015
5016        bw = arsta->bw;
5017        nss = arsta->nss;
5018        smps = arsta->smps;
5019
5020        spin_unlock_bh(&ar->data_lock);
5021
5022        mutex_lock(&ar->conf_mutex);
5023
5024        nss = max_t(u32, 1, nss);
5025        nss = min(nss, max(ath10k_mac_max_ht_nss(ht_mcs_mask),
5026                           ath10k_mac_max_vht_nss(vht_mcs_mask)));
5027
5028        if (changed & IEEE80211_RC_BW_CHANGED) {
5029                ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM peer bw %d\n",
5030                           sta->addr, bw);
5031
5032                err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
5033                                                WMI_PEER_CHAN_WIDTH, bw);
5034                if (err)
5035                        ath10k_warn(ar, "failed to update STA %pM peer bw %d: %d\n",
5036                                    sta->addr, bw, err);
5037        }
5038
5039        if (changed & IEEE80211_RC_NSS_CHANGED) {
5040                ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM nss %d\n",
5041                           sta->addr, nss);
5042
5043                err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
5044                                                WMI_PEER_NSS, nss);
5045                if (err)
5046                        ath10k_warn(ar, "failed to update STA %pM nss %d: %d\n",
5047                                    sta->addr, nss, err);
5048        }
5049
5050        if (changed & IEEE80211_RC_SMPS_CHANGED) {
5051                ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM smps %d\n",
5052                           sta->addr, smps);
5053
5054                err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
5055                                                WMI_PEER_SMPS_STATE, smps);
5056                if (err)
5057                        ath10k_warn(ar, "failed to update STA %pM smps %d: %d\n",
5058                                    sta->addr, smps, err);
5059        }
5060
5061        if (changed & IEEE80211_RC_SUPP_RATES_CHANGED ||
5062            changed & IEEE80211_RC_NSS_CHANGED) {
5063                ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM supp rates/nss\n",
5064                           sta->addr);
5065
5066                err = ath10k_station_assoc(ar, arvif->vif, sta, true);
5067                if (err)
5068                        ath10k_warn(ar, "failed to reassociate station: %pM\n",
5069                                    sta->addr);
5070        }
5071
5072        mutex_unlock(&ar->conf_mutex);
5073}
5074
5075static int ath10k_mac_inc_num_stations(struct ath10k_vif *arvif,
5076                                       struct ieee80211_sta *sta)
5077{
5078        struct ath10k *ar = arvif->ar;
5079
5080        lockdep_assert_held(&ar->conf_mutex);
5081
5082        if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
5083                return 0;
5084
5085        if (ar->num_stations >= ar->max_num_stations)
5086                return -ENOBUFS;
5087
5088        ar->num_stations++;
5089
5090        return 0;
5091}
5092
5093static void ath10k_mac_dec_num_stations(struct ath10k_vif *arvif,
5094                                        struct ieee80211_sta *sta)
5095{
5096        struct ath10k *ar = arvif->ar;
5097
5098        lockdep_assert_held(&ar->conf_mutex);
5099
5100        if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
5101                return;
5102
5103        ar->num_stations--;
5104}
5105
5106struct ath10k_mac_tdls_iter_data {
5107        u32 num_tdls_stations;
5108        struct ieee80211_vif *curr_vif;
5109};
5110
5111static void ath10k_mac_tdls_vif_stations_count_iter(void *data,
5112                                                    struct ieee80211_sta *sta)
5113{
5114        struct ath10k_mac_tdls_iter_data *iter_data = data;
5115        struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
5116        struct ieee80211_vif *sta_vif = arsta->arvif->vif;
5117
5118        if (sta->tdls && sta_vif == iter_data->curr_vif)
5119                iter_data->num_tdls_stations++;
5120}
5121
5122static int ath10k_mac_tdls_vif_stations_count(struct ieee80211_hw *hw,
5123                                              struct ieee80211_vif *vif)
5124{
5125        struct ath10k_mac_tdls_iter_data data = {};
5126
5127        data.curr_vif = vif;
5128
5129        ieee80211_iterate_stations_atomic(hw,
5130                                          ath10k_mac_tdls_vif_stations_count_iter,
5131                                          &data);
5132        return data.num_tdls_stations;
5133}
5134
5135static void ath10k_mac_tdls_vifs_count_iter(void *data, u8 *mac,
5136                                            struct ieee80211_vif *vif)
5137{
5138        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5139        int *num_tdls_vifs = data;
5140
5141        if (vif->type != NL80211_IFTYPE_STATION)
5142                return;
5143
5144        if (ath10k_mac_tdls_vif_stations_count(arvif->ar->hw, vif) > 0)
5145                (*num_tdls_vifs)++;
5146}
5147
5148static int ath10k_mac_tdls_vifs_count(struct ieee80211_hw *hw)
5149{
5150        int num_tdls_vifs = 0;
5151
5152        ieee80211_iterate_active_interfaces_atomic(hw,
5153                                                   IEEE80211_IFACE_ITER_NORMAL,
5154                                                   ath10k_mac_tdls_vifs_count_iter,
5155                                                   &num_tdls_vifs);
5156        return num_tdls_vifs;
5157}
5158
5159static int ath10k_sta_state(struct ieee80211_hw *hw,
5160                            struct ieee80211_vif *vif,
5161                            struct ieee80211_sta *sta,
5162                            enum ieee80211_sta_state old_state,
5163                            enum ieee80211_sta_state new_state)
5164{
5165        struct ath10k *ar = hw->priv;
5166        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5167        struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
5168        int ret = 0;
5169
5170        if (old_state == IEEE80211_STA_NOTEXIST &&
5171            new_state == IEEE80211_STA_NONE) {
5172                memset(arsta, 0, sizeof(*arsta));
5173                arsta->arvif = arvif;
5174                INIT_WORK(&arsta->update_wk, ath10k_sta_rc_update_wk);
5175        }
5176
5177        /* cancel must be done outside the mutex to avoid deadlock */
5178        if ((old_state == IEEE80211_STA_NONE &&
5179             new_state == IEEE80211_STA_NOTEXIST))
5180                cancel_work_sync(&arsta->update_wk);
5181
5182        mutex_lock(&ar->conf_mutex);
5183
5184        if (old_state == IEEE80211_STA_NOTEXIST &&
5185            new_state == IEEE80211_STA_NONE) {
5186                /*
5187                 * New station addition.
5188                 */
5189                enum wmi_peer_type peer_type = WMI_PEER_TYPE_DEFAULT;
5190                u32 num_tdls_stations;
5191                u32 num_tdls_vifs;
5192
5193                ath10k_dbg(ar, ATH10K_DBG_MAC,
5194                           "mac vdev %d peer create %pM (new sta) sta %d / %d peer %d / %d\n",
5195                           arvif->vdev_id, sta->addr,
5196                           ar->num_stations + 1, ar->max_num_stations,
5197                           ar->num_peers + 1, ar->max_num_peers);
5198
5199                ret = ath10k_mac_inc_num_stations(arvif, sta);
5200                if (ret) {
5201                        ath10k_warn(ar, "refusing to associate station: too many connected already (%d)\n",
5202                                    ar->max_num_stations);
5203                        goto exit;
5204                }
5205
5206                if (sta->tdls)
5207                        peer_type = WMI_PEER_TYPE_TDLS;
5208
5209                ret = ath10k_peer_create(ar, arvif->vdev_id, sta->addr,
5210                                         peer_type);
5211                if (ret) {
5212                        ath10k_warn(ar, "failed to add peer %pM for vdev %d when adding a new sta: %i\n",
5213                                    sta->addr, arvif->vdev_id, ret);
5214                        ath10k_mac_dec_num_stations(arvif, sta);
5215                        goto exit;
5216                }
5217
5218                if (!sta->tdls)
5219                        goto exit;
5220
5221                num_tdls_stations = ath10k_mac_tdls_vif_stations_count(hw, vif);
5222                num_tdls_vifs = ath10k_mac_tdls_vifs_count(hw);
5223
5224                if (num_tdls_vifs >= ar->max_num_tdls_vdevs &&
5225                    num_tdls_stations == 0) {
5226                        ath10k_warn(ar, "vdev %i exceeded maximum number of tdls vdevs %i\n",
5227                                    arvif->vdev_id, ar->max_num_tdls_vdevs);
5228                        ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
5229                        ath10k_mac_dec_num_stations(arvif, sta);
5230                        ret = -ENOBUFS;
5231                        goto exit;
5232                }
5233
5234                if (num_tdls_stations == 0) {
5235                        /* This is the first tdls peer in current vif */
5236                        enum wmi_tdls_state state = WMI_TDLS_ENABLE_ACTIVE;
5237
5238                        ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
5239                                                              state);
5240                        if (ret) {
5241                                ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n",
5242                                            arvif->vdev_id, ret);
5243                                ath10k_peer_delete(ar, arvif->vdev_id,
5244                                                   sta->addr);
5245                                ath10k_mac_dec_num_stations(arvif, sta);
5246                                goto exit;
5247                        }
5248                }
5249
5250                ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta,
5251                                                  WMI_TDLS_PEER_STATE_PEERING);
5252                if (ret) {
5253                        ath10k_warn(ar,
5254                                    "failed to update tdls peer %pM for vdev %d when adding a new sta: %i\n",
5255                                    sta->addr, arvif->vdev_id, ret);
5256                        ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
5257                        ath10k_mac_dec_num_stations(arvif, sta);
5258
5259                        if (num_tdls_stations != 0)
5260                                goto exit;
5261                        ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
5262                                                        WMI_TDLS_DISABLE);
5263                }
5264        } else if ((old_state == IEEE80211_STA_NONE &&
5265                    new_state == IEEE80211_STA_NOTEXIST)) {
5266                /*
5267                 * Existing station deletion.
5268                 */
5269                ath10k_dbg(ar, ATH10K_DBG_MAC,
5270                           "mac vdev %d peer delete %pM (sta gone)\n",
5271                           arvif->vdev_id, sta->addr);
5272
5273                ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
5274                if (ret)
5275                        ath10k_warn(ar, "failed to delete peer %pM for vdev %d: %i\n",
5276                                    sta->addr, arvif->vdev_id, ret);
5277
5278                ath10k_mac_dec_num_stations(arvif, sta);
5279
5280                if (!sta->tdls)
5281                        goto exit;
5282
5283                if (ath10k_mac_tdls_vif_stations_count(hw, vif))
5284                        goto exit;
5285
5286                /* This was the last tdls peer in current vif */
5287                ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
5288                                                      WMI_TDLS_DISABLE);
5289                if (ret) {
5290                        ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n",
5291                                    arvif->vdev_id, ret);
5292                }
5293        } else if (old_state == IEEE80211_STA_AUTH &&
5294                   new_state == IEEE80211_STA_ASSOC &&
5295                   (vif->type == NL80211_IFTYPE_AP ||
5296                    vif->type == NL80211_IFTYPE_ADHOC)) {
5297                /*
5298                 * New association.
5299                 */
5300                ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM associated\n",
5301                           sta->addr);
5302
5303                ret = ath10k_station_assoc(ar, vif, sta, false);
5304                if (ret)
5305                        ath10k_warn(ar, "failed to associate station %pM for vdev %i: %i\n",
5306                                    sta->addr, arvif->vdev_id, ret);
5307        } else if (old_state == IEEE80211_STA_ASSOC &&
5308                   new_state == IEEE80211_STA_AUTHORIZED &&
5309                   sta->tdls) {
5310                /*
5311                 * Tdls station authorized.
5312                 */
5313                ath10k_dbg(ar, ATH10K_DBG_MAC, "mac tdls sta %pM authorized\n",
5314                           sta->addr);
5315
5316                ret = ath10k_station_assoc(ar, vif, sta, false);
5317                if (ret) {
5318                        ath10k_warn(ar, "failed to associate tdls station %pM for vdev %i: %i\n",
5319                                    sta->addr, arvif->vdev_id, ret);
5320                        goto exit;
5321                }
5322
5323                ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta,
5324                                                  WMI_TDLS_PEER_STATE_CONNECTED);
5325                if (ret)
5326                        ath10k_warn(ar, "failed to update tdls peer %pM for vdev %i: %i\n",
5327                                    sta->addr, arvif->vdev_id, ret);
5328        } else if (old_state == IEEE80211_STA_ASSOC &&
5329                    new_state == IEEE80211_STA_AUTH &&
5330                    (vif->type == NL80211_IFTYPE_AP ||
5331                     vif->type == NL80211_IFTYPE_ADHOC)) {
5332                /*
5333                 * Disassociation.
5334                 */
5335                ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM disassociated\n",
5336                           sta->addr);
5337
5338                ret = ath10k_station_disassoc(ar, vif, sta);
5339                if (ret)
5340                        ath10k_warn(ar, "failed to disassociate station: %pM vdev %i: %i\n",
5341                                    sta->addr, arvif->vdev_id, ret);
5342        }
5343exit:
5344        mutex_unlock(&ar->conf_mutex);
5345        return ret;
5346}
5347
5348static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
5349                                u16 ac, bool enable)
5350{
5351        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5352        struct wmi_sta_uapsd_auto_trig_arg arg = {};
5353        u32 prio = 0, acc = 0;
5354        u32 value = 0;
5355        int ret = 0;
5356
5357        lockdep_assert_held(&ar->conf_mutex);
5358
5359        if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
5360                return 0;
5361
5362        switch (ac) {
5363        case IEEE80211_AC_VO:
5364                value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
5365                        WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
5366                prio = 7;
5367                acc = 3;
5368                break;
5369        case IEEE80211_AC_VI:
5370                value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
5371                        WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
5372                prio = 5;
5373                acc = 2;
5374                break;
5375        case IEEE80211_AC_BE:
5376                value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
5377                        WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
5378                prio = 2;
5379                acc = 1;
5380                break;
5381        case IEEE80211_AC_BK:
5382                value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
5383                        WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
5384                prio = 0;
5385                acc = 0;
5386                break;
5387        }
5388
5389        if (enable)
5390                arvif->u.sta.uapsd |= value;
5391        else
5392                arvif->u.sta.uapsd &= ~value;
5393
5394        ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5395                                          WMI_STA_PS_PARAM_UAPSD,
5396                                          arvif->u.sta.uapsd);
5397        if (ret) {
5398                ath10k_warn(ar, "failed to set uapsd params: %d\n", ret);
5399                goto exit;
5400        }
5401
5402        if (arvif->u.sta.uapsd)
5403                value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
5404        else
5405                value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
5406
5407        ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5408                                          WMI_STA_PS_PARAM_RX_WAKE_POLICY,
5409                                          value);
5410        if (ret)
5411                ath10k_warn(ar, "failed to set rx wake param: %d\n", ret);
5412
5413        ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
5414        if (ret) {
5415                ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
5416                            arvif->vdev_id, ret);
5417                return ret;
5418        }
5419
5420        ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
5421        if (ret) {
5422                ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
5423                            arvif->vdev_id, ret);
5424                return ret;
5425        }
5426
5427        if (test_bit(WMI_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG, ar->wmi.svc_map) ||
5428            test_bit(WMI_SERVICE_STA_UAPSD_VAR_AUTO_TRIG, ar->wmi.svc_map)) {
5429                /* Only userspace can make an educated decision when to send
5430                 * trigger frame. The following effectively disables u-UAPSD
5431                 * autotrigger in firmware (which is enabled by default
5432                 * provided the autotrigger service is available).
5433                 */
5434
5435                arg.wmm_ac = acc;
5436                arg.user_priority = prio;
5437                arg.service_interval = 0;
5438                arg.suspend_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
5439                arg.delay_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
5440
5441                ret = ath10k_wmi_vdev_sta_uapsd(ar, arvif->vdev_id,
5442                                                arvif->bssid, &arg, 1);
5443                if (ret) {
5444                        ath10k_warn(ar, "failed to set uapsd auto trigger %d\n",
5445                                    ret);
5446                        return ret;
5447                }
5448        }
5449
5450exit:
5451        return ret;
5452}
5453
5454static int ath10k_conf_tx(struct ieee80211_hw *hw,
5455                          struct ieee80211_vif *vif, u16 ac,
5456                          const struct ieee80211_tx_queue_params *params)
5457{
5458        struct ath10k *ar = hw->priv;
5459        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5460        struct wmi_wmm_params_arg *p = NULL;
5461        int ret;
5462
5463        mutex_lock(&ar->conf_mutex);
5464
5465        switch (ac) {
5466        case IEEE80211_AC_VO:
5467                p = &arvif->wmm_params.ac_vo;
5468                break;
5469        case IEEE80211_AC_VI:
5470                p = &arvif->wmm_params.ac_vi;
5471                break;
5472        case IEEE80211_AC_BE:
5473                p = &arvif->wmm_params.ac_be;
5474                break;
5475        case IEEE80211_AC_BK:
5476                p = &arvif->wmm_params.ac_bk;
5477                break;
5478        }
5479
5480        if (WARN_ON(!p)) {
5481                ret = -EINVAL;
5482                goto exit;
5483        }
5484
5485        p->cwmin = params->cw_min;
5486        p->cwmax = params->cw_max;
5487        p->aifs = params->aifs;
5488
5489        /*
5490         * The channel time duration programmed in the HW is in absolute
5491         * microseconds, while mac80211 gives the txop in units of
5492         * 32 microseconds.
5493         */
5494        p->txop = params->txop * 32;
5495
5496        if (ar->wmi.ops->gen_vdev_wmm_conf) {
5497                ret = ath10k_wmi_vdev_wmm_conf(ar, arvif->vdev_id,
5498                                               &arvif->wmm_params);
5499                if (ret) {
5500                        ath10k_warn(ar, "failed to set vdev wmm params on vdev %i: %d\n",
5501                                    arvif->vdev_id, ret);
5502                        goto exit;
5503                }
5504        } else {
5505                /* This won't work well with multi-interface cases but it's
5506                 * better than nothing.
5507                 */
5508                ret = ath10k_wmi_pdev_set_wmm_params(ar, &arvif->wmm_params);
5509                if (ret) {
5510                        ath10k_warn(ar, "failed to set wmm params: %d\n", ret);
5511                        goto exit;
5512                }
5513        }
5514
5515        ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
5516        if (ret)
5517                ath10k_warn(ar, "failed to set sta uapsd: %d\n", ret);
5518
5519exit:
5520        mutex_unlock(&ar->conf_mutex);
5521        return ret;
5522}
5523
5524#define ATH10K_ROC_TIMEOUT_HZ (2*HZ)
5525
5526static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
5527                                    struct ieee80211_vif *vif,
5528                                    struct ieee80211_channel *chan,
5529                                    int duration,
5530                                    enum ieee80211_roc_type type)
5531{
5532        struct ath10k *ar = hw->priv;
5533        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5534        struct wmi_start_scan_arg arg;
5535        int ret = 0;
5536        u32 scan_time_msec;
5537
5538        mutex_lock(&ar->conf_mutex);
5539
5540        spin_lock_bh(&ar->data_lock);
5541        switch (ar->scan.state) {
5542        case ATH10K_SCAN_IDLE:
5543                reinit_completion(&ar->scan.started);
5544                reinit_completion(&ar->scan.completed);
5545                reinit_completion(&ar->scan.on_channel);
5546                ar->scan.state = ATH10K_SCAN_STARTING;
5547                ar->scan.is_roc = true;
5548                ar->scan.vdev_id = arvif->vdev_id;
5549                ar->scan.roc_freq = chan->center_freq;
5550                ar->scan.roc_notify = true;
5551                ret = 0;
5552                break;
5553        case ATH10K_SCAN_STARTING:
5554        case ATH10K_SCAN_RUNNING:
5555        case ATH10K_SCAN_ABORTING:
5556                ret = -EBUSY;
5557                break;
5558        }
5559        spin_unlock_bh(&ar->data_lock);
5560
5561        if (ret)
5562                goto exit;
5563
5564        scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2;
5565
5566        memset(&arg, 0, sizeof(arg));
5567        ath10k_wmi_start_scan_init(ar, &arg);
5568        arg.vdev_id = arvif->vdev_id;
5569        arg.scan_id = ATH10K_SCAN_ID;
5570        arg.n_channels = 1;
5571        arg.channels[0] = chan->center_freq;
5572        arg.dwell_time_active = scan_time_msec;
5573        arg.dwell_time_passive = scan_time_msec;
5574        arg.max_scan_time = scan_time_msec;
5575        arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
5576        arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
5577        arg.burst_duration_ms = duration;
5578
5579        ret = ath10k_start_scan(ar, &arg);
5580        if (ret) {
5581                ath10k_warn(ar, "failed to start roc scan: %d\n", ret);
5582                spin_lock_bh(&ar->data_lock);
5583                ar->scan.state = ATH10K_SCAN_IDLE;
5584                spin_unlock_bh(&ar->data_lock);
5585                goto exit;
5586        }
5587
5588        ret = wait_for_completion_timeout(&ar->scan.on_channel, 3*HZ);
5589        if (ret == 0) {
5590                ath10k_warn(ar, "failed to switch to channel for roc scan\n");
5591
5592                ret = ath10k_scan_stop(ar);
5593                if (ret)
5594                        ath10k_warn(ar, "failed to stop scan: %d\n", ret);
5595
5596                ret = -ETIMEDOUT;
5597                goto exit;
5598        }
5599
5600        ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
5601                                     msecs_to_jiffies(duration));
5602
5603        ret = 0;
5604exit:
5605        mutex_unlock(&ar->conf_mutex);
5606        return ret;
5607}
5608
5609static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
5610{
5611        struct ath10k *ar = hw->priv;
5612
5613        mutex_lock(&ar->conf_mutex);
5614
5615        spin_lock_bh(&ar->data_lock);
5616        ar->scan.roc_notify = false;
5617        spin_unlock_bh(&ar->data_lock);
5618
5619        ath10k_scan_abort(ar);
5620
5621        mutex_unlock(&ar->conf_mutex);
5622
5623        cancel_delayed_work_sync(&ar->scan.timeout);
5624
5625        return 0;
5626}
5627
5628/*
5629 * Both RTS and Fragmentation threshold are interface-specific
5630 * in ath10k, but device-specific in mac80211.
5631 */
5632
5633static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
5634{
5635        struct ath10k *ar = hw->priv;
5636        struct ath10k_vif *arvif;
5637        int ret = 0;
5638
5639        mutex_lock(&ar->conf_mutex);
5640        list_for_each_entry(arvif, &ar->arvifs, list) {
5641                ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n",
5642                           arvif->vdev_id, value);
5643
5644                ret = ath10k_mac_set_rts(arvif, value);
5645                if (ret) {
5646                        ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
5647                                    arvif->vdev_id, ret);
5648                        break;
5649                }
5650        }
5651        mutex_unlock(&ar->conf_mutex);
5652
5653        return ret;
5654}
5655
5656static int ath10k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
5657{
5658        /* Even though there's a WMI enum for fragmentation threshold no known
5659         * firmware actually implements it. Moreover it is not possible to rely
5660         * frame fragmentation to mac80211 because firmware clears the "more
5661         * fragments" bit in frame control making it impossible for remote
5662         * devices to reassemble frames.
5663         *
5664         * Hence implement a dummy callback just to say fragmentation isn't
5665         * supported. This effectively prevents mac80211 from doing frame
5666         * fragmentation in software.
5667         */
5668        return -EOPNOTSUPP;
5669}
5670
5671static void ath10k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
5672                         u32 queues, bool drop)
5673{
5674        struct ath10k *ar = hw->priv;
5675        bool skip;
5676        long time_left;
5677
5678        /* mac80211 doesn't care if we really xmit queued frames or not
5679         * we'll collect those frames either way if we stop/delete vdevs */
5680        if (drop)
5681                return;
5682
5683        mutex_lock(&ar->conf_mutex);
5684
5685        if (ar->state == ATH10K_STATE_WEDGED)
5686                goto skip;
5687
5688        time_left = wait_event_timeout(ar->htt.empty_tx_wq, ({
5689                        bool empty;
5690
5691                        spin_lock_bh(&ar->htt.tx_lock);
5692                        empty = (ar->htt.num_pending_tx == 0);
5693                        spin_unlock_bh(&ar->htt.tx_lock);
5694
5695                        skip = (ar->state == ATH10K_STATE_WEDGED) ||
5696                               test_bit(ATH10K_FLAG_CRASH_FLUSH,
5697                                        &ar->dev_flags);
5698
5699                        (empty || skip);
5700                }), ATH10K_FLUSH_TIMEOUT_HZ);
5701
5702        if (time_left == 0 || skip)
5703                ath10k_warn(ar, "failed to flush transmit queue (skip %i ar-state %i): %ld\n",
5704                            skip, ar->state, time_left);
5705
5706skip:
5707        mutex_unlock(&ar->conf_mutex);
5708}
5709
5710/* TODO: Implement this function properly
5711 * For now it is needed to reply to Probe Requests in IBSS mode.
5712 * Propably we need this information from FW.
5713 */
5714static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
5715{
5716        return 1;
5717}
5718
5719static void ath10k_reconfig_complete(struct ieee80211_hw *hw,
5720                                     enum ieee80211_reconfig_type reconfig_type)
5721{
5722        struct ath10k *ar = hw->priv;
5723
5724        if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
5725                return;
5726
5727        mutex_lock(&ar->conf_mutex);
5728
5729        /* If device failed to restart it will be in a different state, e.g.
5730         * ATH10K_STATE_WEDGED */
5731        if (ar->state == ATH10K_STATE_RESTARTED) {
5732                ath10k_info(ar, "device successfully recovered\n");
5733                ar->state = ATH10K_STATE_ON;
5734                ieee80211_wake_queues(ar->hw);
5735        }
5736
5737        mutex_unlock(&ar->conf_mutex);
5738}
5739
5740static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
5741                             struct survey_info *survey)
5742{
5743        struct ath10k *ar = hw->priv;
5744        struct ieee80211_supported_band *sband;
5745        struct survey_info *ar_survey = &ar->survey[idx];
5746        int ret = 0;
5747
5748        mutex_lock(&ar->conf_mutex);
5749
5750        sband = hw->wiphy->bands[IEEE80211_BAND_2GHZ];
5751        if (sband && idx >= sband->n_channels) {
5752                idx -= sband->n_channels;
5753                sband = NULL;
5754        }
5755
5756        if (!sband)
5757                sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
5758
5759        if (!sband || idx >= sband->n_channels) {
5760                ret = -ENOENT;
5761                goto exit;
5762        }
5763
5764        spin_lock_bh(&ar->data_lock);
5765        memcpy(survey, ar_survey, sizeof(*survey));
5766        spin_unlock_bh(&ar->data_lock);
5767
5768        survey->channel = &sband->channels[idx];
5769
5770        if (ar->rx_channel == survey->channel)
5771                survey->filled |= SURVEY_INFO_IN_USE;
5772
5773exit:
5774        mutex_unlock(&ar->conf_mutex);
5775        return ret;
5776}
5777
5778static bool
5779ath10k_mac_bitrate_mask_has_single_rate(struct ath10k *ar,
5780                                        enum ieee80211_band band,
5781                                        const struct cfg80211_bitrate_mask *mask)
5782{
5783        int num_rates = 0;
5784        int i;
5785
5786        num_rates += hweight32(mask->control[band].legacy);
5787
5788        for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
5789                num_rates += hweight8(mask->control[band].ht_mcs[i]);
5790
5791        for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
5792                num_rates += hweight16(mask->control[band].vht_mcs[i]);
5793
5794        return num_rates == 1;
5795}
5796
5797static bool
5798ath10k_mac_bitrate_mask_get_single_nss(struct ath10k *ar,
5799                                       enum ieee80211_band band,
5800                                       const struct cfg80211_bitrate_mask *mask,
5801                                       int *nss)
5802{
5803        struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
5804        u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
5805        u8 ht_nss_mask = 0;
5806        u8 vht_nss_mask = 0;
5807        int i;
5808
5809        if (mask->control[band].legacy)
5810                return false;
5811
5812        for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
5813                if (mask->control[band].ht_mcs[i] == 0)
5814                        continue;
5815                else if (mask->control[band].ht_mcs[i] ==
5816                         sband->ht_cap.mcs.rx_mask[i])
5817                        ht_nss_mask |= BIT(i);
5818                else
5819                        return false;
5820        }
5821
5822        for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
5823                if (mask->control[band].vht_mcs[i] == 0)
5824                        continue;
5825                else if (mask->control[band].vht_mcs[i] ==
5826                         ath10k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
5827                        vht_nss_mask |= BIT(i);
5828                else
5829                        return false;
5830        }
5831
5832        if (ht_nss_mask != vht_nss_mask)
5833                return false;
5834
5835        if (ht_nss_mask == 0)
5836                return false;
5837
5838        if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
5839                return false;
5840
5841        *nss = fls(ht_nss_mask);
5842
5843        return true;
5844}
5845
5846static int
5847ath10k_mac_bitrate_mask_get_single_rate(struct ath10k *ar,
5848                                        enum ieee80211_band band,
5849                                        const struct cfg80211_bitrate_mask *mask,
5850                                        u8 *rate, u8 *nss)
5851{
5852        struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
5853        int rate_idx;
5854        int i;
5855        u16 bitrate;
5856        u8 preamble;
5857        u8 hw_rate;
5858
5859        if (hweight32(mask->control[band].legacy) == 1) {
5860                rate_idx = ffs(mask->control[band].legacy) - 1;
5861
5862                hw_rate = sband->bitrates[rate_idx].hw_value;
5863                bitrate = sband->bitrates[rate_idx].bitrate;
5864
5865                if (ath10k_mac_bitrate_is_cck(bitrate))
5866                        preamble = WMI_RATE_PREAMBLE_CCK;
5867                else
5868                        preamble = WMI_RATE_PREAMBLE_OFDM;
5869
5870                *nss = 1;
5871                *rate = preamble << 6 |
5872                        (*nss - 1) << 4 |
5873                        hw_rate << 0;
5874
5875                return 0;
5876        }
5877
5878        for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
5879                if (hweight8(mask->control[band].ht_mcs[i]) == 1) {
5880                        *nss = i + 1;
5881                        *rate = WMI_RATE_PREAMBLE_HT << 6 |
5882                                (*nss - 1) << 4 |
5883                                (ffs(mask->control[band].ht_mcs[i]) - 1);
5884
5885                        return 0;
5886                }
5887        }
5888
5889        for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
5890                if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
5891                        *nss = i + 1;
5892                        *rate = WMI_RATE_PREAMBLE_VHT << 6 |
5893                                (*nss - 1) << 4 |
5894                                (ffs(mask->control[band].vht_mcs[i]) - 1);
5895
5896                        return 0;
5897                }
5898        }
5899
5900        return -EINVAL;
5901}
5902
5903static int ath10k_mac_set_fixed_rate_params(struct ath10k_vif *arvif,
5904                                            u8 rate, u8 nss, u8 sgi)
5905{
5906        struct ath10k *ar = arvif->ar;
5907        u32 vdev_param;
5908        int ret;
5909
5910        lockdep_assert_held(&ar->conf_mutex);
5911
5912        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac set fixed rate params vdev %i rate 0x%02hhx nss %hhu sgi %hhu\n",
5913                   arvif->vdev_id, rate, nss, sgi);
5914
5915        vdev_param = ar->wmi.vdev_param->fixed_rate;
5916        ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, rate);
5917        if (ret) {
5918                ath10k_warn(ar, "failed to set fixed rate param 0x%02x: %d\n",
5919                            rate, ret);
5920                return ret;
5921        }
5922
5923        vdev_param = ar->wmi.vdev_param->nss;
5924        ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, nss);
5925        if (ret) {
5926                ath10k_warn(ar, "failed to set nss param %d: %d\n", nss, ret);
5927                return ret;
5928        }
5929
5930        vdev_param = ar->wmi.vdev_param->sgi;
5931        ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, sgi);
5932        if (ret) {
5933                ath10k_warn(ar, "failed to set sgi param %d: %d\n", sgi, ret);
5934                return ret;
5935        }
5936
5937        return 0;
5938}
5939
5940static bool
5941ath10k_mac_can_set_bitrate_mask(struct ath10k *ar,
5942                                enum ieee80211_band band,
5943                                const struct cfg80211_bitrate_mask *mask)
5944{
5945        int i;
5946        u16 vht_mcs;
5947
5948        /* Due to firmware limitation in WMI_PEER_ASSOC_CMDID it is impossible
5949         * to express all VHT MCS rate masks. Effectively only the following
5950         * ranges can be used: none, 0-7, 0-8 and 0-9.
5951         */
5952        for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
5953                vht_mcs = mask->control[band].vht_mcs[i];
5954
5955                switch (vht_mcs) {
5956                case 0:
5957                case BIT(8) - 1:
5958                case BIT(9) - 1:
5959                case BIT(10) - 1:
5960                        break;
5961                default:
5962                        ath10k_warn(ar, "refusing bitrate mask with missing 0-7 VHT MCS rates\n");
5963                        return false;
5964                }
5965        }
5966
5967        return true;
5968}
5969
5970static void ath10k_mac_set_bitrate_mask_iter(void *data,
5971                                             struct ieee80211_sta *sta)
5972{
5973        struct ath10k_vif *arvif = data;
5974        struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
5975        struct ath10k *ar = arvif->ar;
5976
5977        if (arsta->arvif != arvif)
5978                return;
5979
5980        spin_lock_bh(&ar->data_lock);
5981        arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
5982        spin_unlock_bh(&ar->data_lock);
5983
5984        ieee80211_queue_work(ar->hw, &arsta->update_wk);
5985}
5986
5987static int ath10k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
5988                                          struct ieee80211_vif *vif,
5989                                          const struct cfg80211_bitrate_mask *mask)
5990{
5991        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5992        struct cfg80211_chan_def def;
5993        struct ath10k *ar = arvif->ar;
5994        enum ieee80211_band band;
5995        const u8 *ht_mcs_mask;
5996        const u16 *vht_mcs_mask;
5997        u8 rate;
5998        u8 nss;
5999        u8 sgi;
6000        int single_nss;
6001        int ret;
6002
6003        if (ath10k_mac_vif_chan(vif, &def))
6004                return -EPERM;
6005
6006        band = def.chan->band;
6007        ht_mcs_mask = mask->control[band].ht_mcs;
6008        vht_mcs_mask = mask->control[band].vht_mcs;
6009
6010        sgi = mask->control[band].gi;
6011        if (sgi == NL80211_TXRATE_FORCE_LGI)
6012                return -EINVAL;
6013
6014        if (ath10k_mac_bitrate_mask_has_single_rate(ar, band, mask)) {
6015                ret = ath10k_mac_bitrate_mask_get_single_rate(ar, band, mask,
6016                                                              &rate, &nss);
6017                if (ret) {
6018                        ath10k_warn(ar, "failed to get single rate for vdev %i: %d\n",
6019                                    arvif->vdev_id, ret);
6020                        return ret;
6021                }
6022        } else if (ath10k_mac_bitrate_mask_get_single_nss(ar, band, mask,
6023                                                          &single_nss)) {
6024                rate = WMI_FIXED_RATE_NONE;
6025                nss = single_nss;
6026        } else {
6027                rate = WMI_FIXED_RATE_NONE;
6028                nss = min(ar->num_rf_chains,
6029                          max(ath10k_mac_max_ht_nss(ht_mcs_mask),
6030                              ath10k_mac_max_vht_nss(vht_mcs_mask)));
6031
6032                if (!ath10k_mac_can_set_bitrate_mask(ar, band, mask))
6033                        return -EINVAL;
6034
6035                mutex_lock(&ar->conf_mutex);
6036
6037                arvif->bitrate_mask = *mask;
6038                ieee80211_iterate_stations_atomic(ar->hw,
6039                                                  ath10k_mac_set_bitrate_mask_iter,
6040                                                  arvif);
6041
6042                mutex_unlock(&ar->conf_mutex);
6043        }
6044
6045        mutex_lock(&ar->conf_mutex);
6046
6047        ret = ath10k_mac_set_fixed_rate_params(arvif, rate, nss, sgi);
6048        if (ret) {
6049                ath10k_warn(ar, "failed to set fixed rate params on vdev %i: %d\n",
6050                            arvif->vdev_id, ret);
6051                goto exit;
6052        }
6053
6054exit:
6055        mutex_unlock(&ar->conf_mutex);
6056
6057        return ret;
6058}
6059
6060static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
6061                                 struct ieee80211_vif *vif,
6062                                 struct ieee80211_sta *sta,
6063                                 u32 changed)
6064{
6065        struct ath10k *ar = hw->priv;
6066        struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
6067        u32 bw, smps;
6068
6069        spin_lock_bh(&ar->data_lock);
6070
6071        ath10k_dbg(ar, ATH10K_DBG_MAC,
6072                   "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
6073                   sta->addr, changed, sta->bandwidth, sta->rx_nss,
6074                   sta->smps_mode);
6075
6076        if (changed & IEEE80211_RC_BW_CHANGED) {
6077                bw = WMI_PEER_CHWIDTH_20MHZ;
6078
6079                switch (sta->bandwidth) {
6080                case IEEE80211_STA_RX_BW_20:
6081                        bw = WMI_PEER_CHWIDTH_20MHZ;
6082                        break;
6083                case IEEE80211_STA_RX_BW_40:
6084                        bw = WMI_PEER_CHWIDTH_40MHZ;
6085                        break;
6086                case IEEE80211_STA_RX_BW_80:
6087                        bw = WMI_PEER_CHWIDTH_80MHZ;
6088                        break;
6089                case IEEE80211_STA_RX_BW_160:
6090                        ath10k_warn(ar, "Invalid bandwidth %d in rc update for %pM\n",
6091                                    sta->bandwidth, sta->addr);
6092                        bw = WMI_PEER_CHWIDTH_20MHZ;
6093                        break;
6094                }
6095
6096                arsta->bw = bw;
6097        }
6098
6099        if (changed & IEEE80211_RC_NSS_CHANGED)
6100                arsta->nss = sta->rx_nss;
6101
6102        if (changed & IEEE80211_RC_SMPS_CHANGED) {
6103                smps = WMI_PEER_SMPS_PS_NONE;
6104
6105                switch (sta->smps_mode) {
6106                case IEEE80211_SMPS_AUTOMATIC:
6107                case IEEE80211_SMPS_OFF:
6108                        smps = WMI_PEER_SMPS_PS_NONE;
6109                        break;
6110                case IEEE80211_SMPS_STATIC:
6111                        smps = WMI_PEER_SMPS_STATIC;
6112                        break;
6113                case IEEE80211_SMPS_DYNAMIC:
6114                        smps = WMI_PEER_SMPS_DYNAMIC;
6115                        break;
6116                case IEEE80211_SMPS_NUM_MODES:
6117                        ath10k_warn(ar, "Invalid smps %d in sta rc update for %pM\n",
6118                                    sta->smps_mode, sta->addr);
6119                        smps = WMI_PEER_SMPS_PS_NONE;
6120                        break;
6121                }
6122
6123                arsta->smps = smps;
6124        }
6125
6126        arsta->changed |= changed;
6127
6128        spin_unlock_bh(&ar->data_lock);
6129
6130        ieee80211_queue_work(hw, &arsta->update_wk);
6131}
6132
6133static u64 ath10k_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
6134{
6135        /*
6136         * FIXME: Return 0 for time being. Need to figure out whether FW
6137         * has the API to fetch 64-bit local TSF
6138         */
6139
6140        return 0;
6141}
6142
6143static int ath10k_ampdu_action(struct ieee80211_hw *hw,
6144                               struct ieee80211_vif *vif,
6145                               enum ieee80211_ampdu_mlme_action action,
6146                               struct ieee80211_sta *sta, u16 tid, u16 *ssn,
6147                               u8 buf_size)
6148{
6149        struct ath10k *ar = hw->priv;
6150        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
6151
6152        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ampdu vdev_id %i sta %pM tid %hu action %d\n",
6153                   arvif->vdev_id, sta->addr, tid, action);
6154
6155        switch (action) {
6156        case IEEE80211_AMPDU_RX_START:
6157        case IEEE80211_AMPDU_RX_STOP:
6158                /* HTT AddBa/DelBa events trigger mac80211 Rx BA session
6159                 * creation/removal. Do we need to verify this?
6160                 */
6161                return 0;
6162        case IEEE80211_AMPDU_TX_START:
6163        case IEEE80211_AMPDU_TX_STOP_CONT:
6164        case IEEE80211_AMPDU_TX_STOP_FLUSH:
6165        case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
6166        case IEEE80211_AMPDU_TX_OPERATIONAL:
6167                /* Firmware offloads Tx aggregation entirely so deny mac80211
6168                 * Tx aggregation requests.
6169                 */
6170                return -EOPNOTSUPP;
6171        }
6172
6173        return -EINVAL;
6174}
6175
6176static void
6177ath10k_mac_update_rx_channel(struct ath10k *ar,
6178                             struct ieee80211_chanctx_conf *ctx,
6179                             struct ieee80211_vif_chanctx_switch *vifs,
6180                             int n_vifs)
6181{
6182        struct cfg80211_chan_def *def = NULL;
6183
6184        /* Both locks are required because ar->rx_channel is modified. This
6185         * allows readers to hold either lock.
6186         */
6187        lockdep_assert_held(&ar->conf_mutex);
6188        lockdep_assert_held(&ar->data_lock);
6189
6190        WARN_ON(ctx && vifs);
6191        WARN_ON(vifs && n_vifs != 1);
6192
6193        /* FIXME: Sort of an optimization and a workaround. Peers and vifs are
6194         * on a linked list now. Doing a lookup peer -> vif -> chanctx for each
6195         * ppdu on Rx may reduce performance on low-end systems. It should be
6196         * possible to make tables/hashmaps to speed the lookup up (be vary of
6197         * cpu data cache lines though regarding sizes) but to keep the initial
6198         * implementation simple and less intrusive fallback to the slow lookup
6199         * only for multi-channel cases. Single-channel cases will remain to
6200         * use the old channel derival and thus performance should not be
6201         * affected much.
6202         */
6203        rcu_read_lock();
6204        if (!ctx && ath10k_mac_num_chanctxs(ar) == 1) {
6205                ieee80211_iter_chan_contexts_atomic(ar->hw,
6206                                        ath10k_mac_get_any_chandef_iter,
6207                                        &def);
6208
6209                if (vifs)
6210                        def = &vifs[0].new_ctx->def;
6211
6212                ar->rx_channel = def->chan;
6213        } else if (ctx && ath10k_mac_num_chanctxs(ar) == 0) {
6214                ar->rx_channel = ctx->def.chan;
6215        } else {
6216                ar->rx_channel = NULL;
6217        }
6218        rcu_read_unlock();
6219}
6220
6221static int
6222ath10k_mac_op_add_chanctx(struct ieee80211_hw *hw,
6223                          struct ieee80211_chanctx_conf *ctx)
6224{
6225        struct ath10k *ar = hw->priv;
6226
6227        ath10k_dbg(ar, ATH10K_DBG_MAC,
6228                   "mac chanctx add freq %hu width %d ptr %p\n",
6229                   ctx->def.chan->center_freq, ctx->def.width, ctx);
6230
6231        mutex_lock(&ar->conf_mutex);
6232
6233        spin_lock_bh(&ar->data_lock);
6234        ath10k_mac_update_rx_channel(ar, ctx, NULL, 0);
6235        spin_unlock_bh(&ar->data_lock);
6236
6237        ath10k_recalc_radar_detection(ar);
6238        ath10k_monitor_recalc(ar);
6239
6240        mutex_unlock(&ar->conf_mutex);
6241
6242        return 0;
6243}
6244
6245static void
6246ath10k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
6247                             struct ieee80211_chanctx_conf *ctx)
6248{
6249        struct ath10k *ar = hw->priv;
6250
6251        ath10k_dbg(ar, ATH10K_DBG_MAC,
6252                   "mac chanctx remove freq %hu width %d ptr %p\n",
6253                   ctx->def.chan->center_freq, ctx->def.width, ctx);
6254
6255        mutex_lock(&ar->conf_mutex);
6256
6257        spin_lock_bh(&ar->data_lock);
6258        ath10k_mac_update_rx_channel(ar, NULL, NULL, 0);
6259        spin_unlock_bh(&ar->data_lock);
6260
6261        ath10k_recalc_radar_detection(ar);
6262        ath10k_monitor_recalc(ar);
6263
6264        mutex_unlock(&ar->conf_mutex);
6265}
6266
6267static void
6268ath10k_mac_op_change_chanctx(struct ieee80211_hw *hw,
6269                             struct ieee80211_chanctx_conf *ctx,
6270                             u32 changed)
6271{
6272        struct ath10k *ar = hw->priv;
6273
6274        mutex_lock(&ar->conf_mutex);
6275
6276        ath10k_dbg(ar, ATH10K_DBG_MAC,
6277                   "mac chanctx change freq %hu width %d ptr %p changed %x\n",
6278                   ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
6279
6280        /* This shouldn't really happen because channel switching should use
6281         * switch_vif_chanctx().
6282         */
6283        if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
6284                goto unlock;
6285
6286        ath10k_recalc_radar_detection(ar);
6287
6288        /* FIXME: How to configure Rx chains properly? */
6289
6290        /* No other actions are actually necessary. Firmware maintains channel
6291         * definitions per vdev internally and there's no host-side channel
6292         * context abstraction to configure, e.g. channel width.
6293         */
6294
6295unlock:
6296        mutex_unlock(&ar->conf_mutex);
6297}
6298
6299static int
6300ath10k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
6301                                 struct ieee80211_vif *vif,
6302                                 struct ieee80211_chanctx_conf *ctx)
6303{
6304        struct ath10k *ar = hw->priv;
6305        struct ath10k_vif *arvif = (void *)vif->drv_priv;
6306        int ret;
6307
6308        mutex_lock(&ar->conf_mutex);
6309
6310        ath10k_dbg(ar, ATH10K_DBG_MAC,
6311                   "mac chanctx assign ptr %p vdev_id %i\n",
6312                   ctx, arvif->vdev_id);
6313
6314        if (WARN_ON(arvif->is_started)) {
6315                mutex_unlock(&ar->conf_mutex);
6316                return -EBUSY;
6317        }
6318
6319        ret = ath10k_vdev_start(arvif, &ctx->def);
6320        if (ret) {
6321                ath10k_warn(ar, "failed to start vdev %i addr %pM on freq %d: %d\n",
6322                            arvif->vdev_id, vif->addr,
6323                            ctx->def.chan->center_freq, ret);
6324                goto err;
6325        }
6326
6327        arvif->is_started = true;
6328
6329        ret = ath10k_mac_vif_setup_ps(arvif);
6330        if (ret) {
6331                ath10k_warn(ar, "failed to update vdev %i ps: %d\n",
6332                            arvif->vdev_id, ret);
6333                goto err_stop;
6334        }
6335
6336        if (vif->type == NL80211_IFTYPE_MONITOR) {
6337                ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, 0, vif->addr);
6338                if (ret) {
6339                        ath10k_warn(ar, "failed to up monitor vdev %i: %d\n",
6340                                    arvif->vdev_id, ret);
6341                        goto err_stop;
6342                }
6343
6344                arvif->is_up = true;
6345        }
6346
6347        mutex_unlock(&ar->conf_mutex);
6348        return 0;
6349
6350err_stop:
6351        ath10k_vdev_stop(arvif);
6352        arvif->is_started = false;
6353        ath10k_mac_vif_setup_ps(arvif);
6354
6355err:
6356        mutex_unlock(&ar->conf_mutex);
6357        return ret;
6358}
6359
6360static void
6361ath10k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
6362                                   struct ieee80211_vif *vif,
6363                                   struct ieee80211_chanctx_conf *ctx)
6364{
6365        struct ath10k *ar = hw->priv;
6366        struct ath10k_vif *arvif = (void *)vif->drv_priv;
6367        int ret;
6368
6369        mutex_lock(&ar->conf_mutex);
6370
6371        ath10k_dbg(ar, ATH10K_DBG_MAC,
6372                   "mac chanctx unassign ptr %p vdev_id %i\n",
6373                   ctx, arvif->vdev_id);
6374
6375        WARN_ON(!arvif->is_started);
6376
6377        if (vif->type == NL80211_IFTYPE_MONITOR) {
6378                WARN_ON(!arvif->is_up);
6379
6380                ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
6381                if (ret)
6382                        ath10k_warn(ar, "failed to down monitor vdev %i: %d\n",
6383                                    arvif->vdev_id, ret);
6384
6385                arvif->is_up = false;
6386        }
6387
6388        ret = ath10k_vdev_stop(arvif);
6389        if (ret)
6390                ath10k_warn(ar, "failed to stop vdev %i: %d\n",
6391                            arvif->vdev_id, ret);
6392
6393        arvif->is_started = false;
6394
6395        mutex_unlock(&ar->conf_mutex);
6396}
6397
6398static int
6399ath10k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
6400                                 struct ieee80211_vif_chanctx_switch *vifs,
6401                                 int n_vifs,
6402                                 enum ieee80211_chanctx_switch_mode mode)
6403{
6404        struct ath10k *ar = hw->priv;
6405        struct ath10k_vif *arvif;
6406        int ret;
6407        int i;
6408
6409        mutex_lock(&ar->conf_mutex);
6410
6411        ath10k_dbg(ar, ATH10K_DBG_MAC,
6412                   "mac chanctx switch n_vifs %d mode %d\n",
6413                   n_vifs, mode);
6414
6415        /* First stop monitor interface. Some FW versions crash if there's a
6416         * lone monitor interface.
6417         */
6418        if (ar->monitor_started)
6419                ath10k_monitor_stop(ar);
6420
6421        for (i = 0; i < n_vifs; i++) {
6422                arvif = ath10k_vif_to_arvif(vifs[i].vif);
6423
6424                ath10k_dbg(ar, ATH10K_DBG_MAC,
6425                           "mac chanctx switch vdev_id %i freq %hu->%hu width %d->%d\n",
6426                           arvif->vdev_id,
6427                           vifs[i].old_ctx->def.chan->center_freq,
6428                           vifs[i].new_ctx->def.chan->center_freq,
6429                           vifs[i].old_ctx->def.width,
6430                           vifs[i].new_ctx->def.width);
6431
6432                if (WARN_ON(!arvif->is_started))
6433                        continue;
6434
6435                if (WARN_ON(!arvif->is_up))
6436                        continue;
6437
6438                ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
6439                if (ret) {
6440                        ath10k_warn(ar, "failed to down vdev %d: %d\n",
6441                                    arvif->vdev_id, ret);
6442                        continue;
6443                }
6444        }
6445
6446        /* All relevant vdevs are downed and associated channel resources
6447         * should be available for the channel switch now.
6448         */
6449
6450        spin_lock_bh(&ar->data_lock);
6451        ath10k_mac_update_rx_channel(ar, NULL, vifs, n_vifs);
6452        spin_unlock_bh(&ar->data_lock);
6453
6454        for (i = 0; i < n_vifs; i++) {
6455                arvif = ath10k_vif_to_arvif(vifs[i].vif);
6456
6457                if (WARN_ON(!arvif->is_started))
6458                        continue;
6459
6460                if (WARN_ON(!arvif->is_up))
6461                        continue;
6462
6463                ret = ath10k_mac_setup_bcn_tmpl(arvif);
6464                if (ret)
6465                        ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n",
6466                                    ret);
6467
6468                ret = ath10k_mac_setup_prb_tmpl(arvif);
6469                if (ret)
6470                        ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n",
6471                                    ret);
6472
6473                ret = ath10k_vdev_restart(arvif, &vifs[i].new_ctx->def);
6474                if (ret) {
6475                        ath10k_warn(ar, "failed to restart vdev %d: %d\n",
6476                                    arvif->vdev_id, ret);
6477                        continue;
6478                }
6479
6480                ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
6481                                         arvif->bssid);
6482                if (ret) {
6483                        ath10k_warn(ar, "failed to bring vdev up %d: %d\n",
6484                                    arvif->vdev_id, ret);
6485                        continue;
6486                }
6487        }
6488
6489        ath10k_monitor_recalc(ar);
6490
6491        mutex_unlock(&ar->conf_mutex);
6492        return 0;
6493}
6494
6495static const struct ieee80211_ops ath10k_ops = {
6496        .tx                             = ath10k_tx,
6497        .start                          = ath10k_start,
6498        .stop                           = ath10k_stop,
6499        .config                         = ath10k_config,
6500        .add_interface                  = ath10k_add_interface,
6501        .remove_interface               = ath10k_remove_interface,
6502        .configure_filter               = ath10k_configure_filter,
6503        .bss_info_changed               = ath10k_bss_info_changed,
6504        .hw_scan                        = ath10k_hw_scan,
6505        .cancel_hw_scan                 = ath10k_cancel_hw_scan,
6506        .set_key                        = ath10k_set_key,
6507        .set_default_unicast_key        = ath10k_set_default_unicast_key,
6508        .sta_state                      = ath10k_sta_state,
6509        .conf_tx                        = ath10k_conf_tx,
6510        .remain_on_channel              = ath10k_remain_on_channel,
6511        .cancel_remain_on_channel       = ath10k_cancel_remain_on_channel,
6512        .set_rts_threshold              = ath10k_set_rts_threshold,
6513        .set_frag_threshold             = ath10k_mac_op_set_frag_threshold,
6514        .flush                          = ath10k_flush,
6515        .tx_last_beacon                 = ath10k_tx_last_beacon,
6516        .set_antenna                    = ath10k_set_antenna,
6517        .get_antenna                    = ath10k_get_antenna,
6518        .reconfig_complete              = ath10k_reconfig_complete,
6519        .get_survey                     = ath10k_get_survey,
6520        .set_bitrate_mask               = ath10k_mac_op_set_bitrate_mask,
6521        .sta_rc_update                  = ath10k_sta_rc_update,
6522        .get_tsf                        = ath10k_get_tsf,
6523        .ampdu_action                   = ath10k_ampdu_action,
6524        .get_et_sset_count              = ath10k_debug_get_et_sset_count,
6525        .get_et_stats                   = ath10k_debug_get_et_stats,
6526        .get_et_strings                 = ath10k_debug_get_et_strings,
6527        .add_chanctx                    = ath10k_mac_op_add_chanctx,
6528        .remove_chanctx                 = ath10k_mac_op_remove_chanctx,
6529        .change_chanctx                 = ath10k_mac_op_change_chanctx,
6530        .assign_vif_chanctx             = ath10k_mac_op_assign_vif_chanctx,
6531        .unassign_vif_chanctx           = ath10k_mac_op_unassign_vif_chanctx,
6532        .switch_vif_chanctx             = ath10k_mac_op_switch_vif_chanctx,
6533
6534        CFG80211_TESTMODE_CMD(ath10k_tm_cmd)
6535
6536#ifdef CONFIG_PM
6537        .suspend                        = ath10k_wow_op_suspend,
6538        .resume                         = ath10k_wow_op_resume,
6539#endif
6540#ifdef CONFIG_MAC80211_DEBUGFS
6541        .sta_add_debugfs                = ath10k_sta_add_debugfs,
6542#endif
6543};
6544
6545#define CHAN2G(_channel, _freq, _flags) { \
6546        .band                   = IEEE80211_BAND_2GHZ, \
6547        .hw_value               = (_channel), \
6548        .center_freq            = (_freq), \
6549        .flags                  = (_flags), \
6550        .max_antenna_gain       = 0, \
6551        .max_power              = 30, \
6552}
6553
6554#define CHAN5G(_channel, _freq, _flags) { \
6555        .band                   = IEEE80211_BAND_5GHZ, \
6556        .hw_value               = (_channel), \
6557        .center_freq            = (_freq), \
6558        .flags                  = (_flags), \
6559        .max_antenna_gain       = 0, \
6560        .max_power              = 30, \
6561}
6562
6563static const struct ieee80211_channel ath10k_2ghz_channels[] = {
6564        CHAN2G(1, 2412, 0),
6565        CHAN2G(2, 2417, 0),
6566        CHAN2G(3, 2422, 0),
6567        CHAN2G(4, 2427, 0),
6568        CHAN2G(5, 2432, 0),
6569        CHAN2G(6, 2437, 0),
6570        CHAN2G(7, 2442, 0),
6571        CHAN2G(8, 2447, 0),
6572        CHAN2G(9, 2452, 0),
6573        CHAN2G(10, 2457, 0),
6574        CHAN2G(11, 2462, 0),
6575        CHAN2G(12, 2467, 0),
6576        CHAN2G(13, 2472, 0),
6577        CHAN2G(14, 2484, 0),
6578};
6579
6580static const struct ieee80211_channel ath10k_5ghz_channels[] = {
6581        CHAN5G(36, 5180, 0),
6582        CHAN5G(40, 5200, 0),
6583        CHAN5G(44, 5220, 0),
6584        CHAN5G(48, 5240, 0),
6585        CHAN5G(52, 5260, 0),
6586        CHAN5G(56, 5280, 0),
6587        CHAN5G(60, 5300, 0),
6588        CHAN5G(64, 5320, 0),
6589        CHAN5G(100, 5500, 0),
6590        CHAN5G(104, 5520, 0),
6591        CHAN5G(108, 5540, 0),
6592        CHAN5G(112, 5560, 0),
6593        CHAN5G(116, 5580, 0),
6594        CHAN5G(120, 5600, 0),
6595        CHAN5G(124, 5620, 0),
6596        CHAN5G(128, 5640, 0),
6597        CHAN5G(132, 5660, 0),
6598        CHAN5G(136, 5680, 0),
6599        CHAN5G(140, 5700, 0),
6600        CHAN5G(144, 5720, 0),
6601        CHAN5G(149, 5745, 0),
6602        CHAN5G(153, 5765, 0),
6603        CHAN5G(157, 5785, 0),
6604        CHAN5G(161, 5805, 0),
6605        CHAN5G(165, 5825, 0),
6606};
6607
6608struct ath10k *ath10k_mac_create(size_t priv_size)
6609{
6610        struct ieee80211_hw *hw;
6611        struct ath10k *ar;
6612
6613        hw = ieee80211_alloc_hw(sizeof(struct ath10k) + priv_size, &ath10k_ops);
6614        if (!hw)
6615                return NULL;
6616
6617        ar = hw->priv;
6618        ar->hw = hw;
6619
6620        return ar;
6621}
6622
6623void ath10k_mac_destroy(struct ath10k *ar)
6624{
6625        ieee80211_free_hw(ar->hw);
6626}
6627
6628static const struct ieee80211_iface_limit ath10k_if_limits[] = {
6629        {
6630        .max    = 8,
6631        .types  = BIT(NL80211_IFTYPE_STATION)
6632                | BIT(NL80211_IFTYPE_P2P_CLIENT)
6633        },
6634        {
6635        .max    = 3,
6636        .types  = BIT(NL80211_IFTYPE_P2P_GO)
6637        },
6638        {
6639        .max    = 1,
6640        .types  = BIT(NL80211_IFTYPE_P2P_DEVICE)
6641        },
6642        {
6643        .max    = 7,
6644        .types  = BIT(NL80211_IFTYPE_AP)
6645        },
6646};
6647
6648static const struct ieee80211_iface_limit ath10k_10x_if_limits[] = {
6649        {
6650        .max    = 8,
6651        .types  = BIT(NL80211_IFTYPE_AP)
6652        },
6653};
6654
6655static const struct ieee80211_iface_combination ath10k_if_comb[] = {
6656        {
6657                .limits = ath10k_if_limits,
6658                .n_limits = ARRAY_SIZE(ath10k_if_limits),
6659                .max_interfaces = 8,
6660                .num_different_channels = 1,
6661                .beacon_int_infra_match = true,
6662        },
6663};
6664
6665static const struct ieee80211_iface_combination ath10k_10x_if_comb[] = {
6666        {
6667                .limits = ath10k_10x_if_limits,
6668                .n_limits = ARRAY_SIZE(ath10k_10x_if_limits),
6669                .max_interfaces = 8,
6670                .num_different_channels = 1,
6671                .beacon_int_infra_match = true,
6672#ifdef CONFIG_ATH10K_DFS_CERTIFIED
6673                .radar_detect_widths =  BIT(NL80211_CHAN_WIDTH_20_NOHT) |
6674                                        BIT(NL80211_CHAN_WIDTH_20) |
6675                                        BIT(NL80211_CHAN_WIDTH_40) |
6676                                        BIT(NL80211_CHAN_WIDTH_80),
6677#endif
6678        },
6679};
6680
6681static const struct ieee80211_iface_limit ath10k_tlv_if_limit[] = {
6682        {
6683                .max = 2,
6684                .types = BIT(NL80211_IFTYPE_STATION),
6685        },
6686        {
6687                .max = 2,
6688                .types = BIT(NL80211_IFTYPE_AP) |
6689                         BIT(NL80211_IFTYPE_P2P_CLIENT) |
6690                         BIT(NL80211_IFTYPE_P2P_GO),
6691        },
6692        {
6693                .max = 1,
6694                .types = BIT(NL80211_IFTYPE_P2P_DEVICE),
6695        },
6696};
6697
6698static const struct ieee80211_iface_limit ath10k_tlv_qcs_if_limit[] = {
6699        {
6700                .max = 2,
6701                .types = BIT(NL80211_IFTYPE_STATION),
6702        },
6703        {
6704                .max = 2,
6705                .types = BIT(NL80211_IFTYPE_P2P_CLIENT),
6706        },
6707        {
6708                .max = 1,
6709                .types = BIT(NL80211_IFTYPE_AP) |
6710                         BIT(NL80211_IFTYPE_P2P_GO),
6711        },
6712        {
6713                .max = 1,
6714                .types = BIT(NL80211_IFTYPE_P2P_DEVICE),
6715        },
6716};
6717
6718static const struct ieee80211_iface_limit ath10k_tlv_if_limit_ibss[] = {
6719        {
6720                .max = 1,
6721                .types = BIT(NL80211_IFTYPE_STATION),
6722        },
6723        {
6724                .max = 1,
6725                .types = BIT(NL80211_IFTYPE_ADHOC),
6726        },
6727};
6728
6729/* FIXME: This is not thouroughly tested. These combinations may over- or
6730 * underestimate hw/fw capabilities.
6731 */
6732static struct ieee80211_iface_combination ath10k_tlv_if_comb[] = {
6733        {
6734                .limits = ath10k_tlv_if_limit,
6735                .num_different_channels = 1,
6736                .max_interfaces = 4,
6737                .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit),
6738        },
6739        {
6740                .limits = ath10k_tlv_if_limit_ibss,
6741                .num_different_channels = 1,
6742                .max_interfaces = 2,
6743                .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit_ibss),
6744        },
6745};
6746
6747static struct ieee80211_iface_combination ath10k_tlv_qcs_if_comb[] = {
6748        {
6749                .limits = ath10k_tlv_if_limit,
6750                .num_different_channels = 1,
6751                .max_interfaces = 4,
6752                .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit),
6753        },
6754        {
6755                .limits = ath10k_tlv_qcs_if_limit,
6756                .num_different_channels = 2,
6757                .max_interfaces = 4,
6758                .n_limits = ARRAY_SIZE(ath10k_tlv_qcs_if_limit),
6759        },
6760        {
6761                .limits = ath10k_tlv_if_limit_ibss,
6762                .num_different_channels = 1,
6763                .max_interfaces = 2,
6764                .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit_ibss),
6765        },
6766};
6767
6768static const struct ieee80211_iface_limit ath10k_10_4_if_limits[] = {
6769        {
6770                .max = 1,
6771                .types = BIT(NL80211_IFTYPE_STATION),
6772        },
6773        {
6774                .max    = 16,
6775                .types  = BIT(NL80211_IFTYPE_AP)
6776        },
6777};
6778
6779static const struct ieee80211_iface_combination ath10k_10_4_if_comb[] = {
6780        {
6781                .limits = ath10k_10_4_if_limits,
6782                .n_limits = ARRAY_SIZE(ath10k_10_4_if_limits),
6783                .max_interfaces = 16,
6784                .num_different_channels = 1,
6785                .beacon_int_infra_match = true,
6786#ifdef CONFIG_ATH10K_DFS_CERTIFIED
6787                .radar_detect_widths =  BIT(NL80211_CHAN_WIDTH_20_NOHT) |
6788                                        BIT(NL80211_CHAN_WIDTH_20) |
6789                                        BIT(NL80211_CHAN_WIDTH_40) |
6790                                        BIT(NL80211_CHAN_WIDTH_80),
6791#endif
6792        },
6793};
6794
6795static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
6796{
6797        struct ieee80211_sta_vht_cap vht_cap = {0};
6798        u16 mcs_map;
6799        u32 val;
6800        int i;
6801
6802        vht_cap.vht_supported = 1;
6803        vht_cap.cap = ar->vht_cap_info;
6804
6805        if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
6806                                IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
6807                val = ar->num_rf_chains - 1;
6808                val <<= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
6809                val &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
6810
6811                vht_cap.cap |= val;
6812        }
6813
6814        if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
6815                                IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
6816                val = ar->num_rf_chains - 1;
6817                val <<= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
6818                val &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
6819
6820                vht_cap.cap |= val;
6821        }
6822
6823        mcs_map = 0;
6824        for (i = 0; i < 8; i++) {
6825                if (i < ar->num_rf_chains)
6826                        mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i*2);
6827                else
6828                        mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i*2);
6829        }
6830
6831        vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
6832        vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
6833
6834        return vht_cap;
6835}
6836
6837static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
6838{
6839        int i;
6840        struct ieee80211_sta_ht_cap ht_cap = {0};
6841
6842        if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
6843                return ht_cap;
6844
6845        ht_cap.ht_supported = 1;
6846        ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
6847        ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
6848        ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
6849        ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
6850        ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
6851
6852        if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
6853                ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
6854
6855        if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
6856                ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
6857
6858        if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
6859                u32 smps;
6860
6861                smps   = WLAN_HT_CAP_SM_PS_DYNAMIC;
6862                smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
6863
6864                ht_cap.cap |= smps;
6865        }
6866
6867        if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC)
6868                ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
6869
6870        if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
6871                u32 stbc;
6872
6873                stbc   = ar->ht_cap_info;
6874                stbc  &= WMI_HT_CAP_RX_STBC;
6875                stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
6876                stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
6877                stbc  &= IEEE80211_HT_CAP_RX_STBC;
6878
6879                ht_cap.cap |= stbc;
6880        }
6881
6882        if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
6883                ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
6884
6885        if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
6886                ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
6887
6888        /* max AMSDU is implicitly taken from vht_cap_info */
6889        if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
6890                ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
6891
6892        for (i = 0; i < ar->num_rf_chains; i++)
6893                ht_cap.mcs.rx_mask[i] = 0xFF;
6894
6895        ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
6896
6897        return ht_cap;
6898}
6899
6900static void ath10k_get_arvif_iter(void *data, u8 *mac,
6901                                  struct ieee80211_vif *vif)
6902{
6903        struct ath10k_vif_iter *arvif_iter = data;
6904        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
6905
6906        if (arvif->vdev_id == arvif_iter->vdev_id)
6907                arvif_iter->arvif = arvif;
6908}
6909
6910struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
6911{
6912        struct ath10k_vif_iter arvif_iter;
6913        u32 flags;
6914
6915        memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
6916        arvif_iter.vdev_id = vdev_id;
6917
6918        flags = IEEE80211_IFACE_ITER_RESUME_ALL;
6919        ieee80211_iterate_active_interfaces_atomic(ar->hw,
6920                                                   flags,
6921                                                   ath10k_get_arvif_iter,
6922                                                   &arvif_iter);
6923        if (!arvif_iter.arvif) {
6924                ath10k_warn(ar, "No VIF found for vdev %d\n", vdev_id);
6925                return NULL;
6926        }
6927
6928        return arvif_iter.arvif;
6929}
6930
6931int ath10k_mac_register(struct ath10k *ar)
6932{
6933        static const u32 cipher_suites[] = {
6934                WLAN_CIPHER_SUITE_WEP40,
6935                WLAN_CIPHER_SUITE_WEP104,
6936                WLAN_CIPHER_SUITE_TKIP,
6937                WLAN_CIPHER_SUITE_CCMP,
6938                WLAN_CIPHER_SUITE_AES_CMAC,
6939        };
6940        struct ieee80211_supported_band *band;
6941        struct ieee80211_sta_vht_cap vht_cap;
6942        struct ieee80211_sta_ht_cap ht_cap;
6943        void *channels;
6944        int ret;
6945
6946        SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
6947
6948        SET_IEEE80211_DEV(ar->hw, ar->dev);
6949
6950        ht_cap = ath10k_get_ht_cap(ar);
6951        vht_cap = ath10k_create_vht_cap(ar);
6952
6953        BUILD_BUG_ON((ARRAY_SIZE(ath10k_2ghz_channels) +
6954                      ARRAY_SIZE(ath10k_5ghz_channels)) !=
6955                     ATH10K_NUM_CHANS);
6956
6957        if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
6958                channels = kmemdup(ath10k_2ghz_channels,
6959                                   sizeof(ath10k_2ghz_channels),
6960                                   GFP_KERNEL);
6961                if (!channels) {
6962                        ret = -ENOMEM;
6963                        goto err_free;
6964                }
6965
6966                band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
6967                band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
6968                band->channels = channels;
6969                band->n_bitrates = ath10k_g_rates_size;
6970                band->bitrates = ath10k_g_rates;
6971                band->ht_cap = ht_cap;
6972
6973                /* Enable the VHT support at 2.4 GHz */
6974                band->vht_cap = vht_cap;
6975
6976                ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band;
6977        }
6978
6979        if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
6980                channels = kmemdup(ath10k_5ghz_channels,
6981                                   sizeof(ath10k_5ghz_channels),
6982                                   GFP_KERNEL);
6983                if (!channels) {
6984                        ret = -ENOMEM;
6985                        goto err_free;
6986                }
6987
6988                band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
6989                band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
6990                band->channels = channels;
6991                band->n_bitrates = ath10k_a_rates_size;
6992                band->bitrates = ath10k_a_rates;
6993                band->ht_cap = ht_cap;
6994                band->vht_cap = vht_cap;
6995                ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band;
6996        }
6997
6998        ar->hw->wiphy->interface_modes =
6999                BIT(NL80211_IFTYPE_STATION) |
7000                BIT(NL80211_IFTYPE_AP);
7001
7002        ar->hw->wiphy->available_antennas_rx = ar->supp_rx_chainmask;
7003        ar->hw->wiphy->available_antennas_tx = ar->supp_tx_chainmask;
7004
7005        if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->fw_features))
7006                ar->hw->wiphy->interface_modes |=
7007                        BIT(NL80211_IFTYPE_P2P_DEVICE) |
7008                        BIT(NL80211_IFTYPE_P2P_CLIENT) |
7009                        BIT(NL80211_IFTYPE_P2P_GO);
7010
7011        ieee80211_hw_set(ar->hw, SIGNAL_DBM);
7012        ieee80211_hw_set(ar->hw, SUPPORTS_PS);
7013        ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS);
7014        ieee80211_hw_set(ar->hw, MFP_CAPABLE);
7015        ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS);
7016        ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL);
7017        ieee80211_hw_set(ar->hw, AP_LINK_PS);
7018        ieee80211_hw_set(ar->hw, SPECTRUM_MGMT);
7019        ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT);
7020        ieee80211_hw_set(ar->hw, CONNECTION_MONITOR);
7021        ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK);
7022        ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF);
7023        ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA);
7024        ieee80211_hw_set(ar->hw, QUEUE_CONTROL);
7025
7026        if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
7027                ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL);
7028
7029        ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
7030        ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
7031
7032        if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
7033                ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
7034
7035        if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
7036                ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION);
7037                ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW);
7038        }
7039
7040        ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
7041        ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
7042
7043        ar->hw->vif_data_size = sizeof(struct ath10k_vif);
7044        ar->hw->sta_data_size = sizeof(struct ath10k_sta);
7045
7046        ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
7047
7048        if (test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) {
7049                ar->hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
7050
7051                /* Firmware delivers WPS/P2P Probe Requests frames to driver so
7052                 * that userspace (e.g. wpa_supplicant/hostapd) can generate
7053                 * correct Probe Responses. This is more of a hack advert..
7054                 */
7055                ar->hw->wiphy->probe_resp_offload |=
7056                        NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS |
7057                        NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 |
7058                        NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P;
7059        }
7060
7061        if (test_bit(WMI_SERVICE_TDLS, ar->wmi.svc_map))
7062                ar->hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS;
7063
7064        ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
7065        ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
7066        ar->hw->wiphy->max_remain_on_channel_duration = 5000;
7067
7068        ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
7069        ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE;
7070
7071        ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations;
7072
7073        ret = ath10k_wow_init(ar);
7074        if (ret) {
7075                ath10k_warn(ar, "failed to init wow: %d\n", ret);
7076                goto err_free;
7077        }
7078
7079        wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_VHT_IBSS);
7080
7081        /*
7082         * on LL hardware queues are managed entirely by the FW
7083         * so we only advertise to mac we can do the queues thing
7084         */
7085        ar->hw->queues = IEEE80211_MAX_QUEUES;
7086
7087        /* vdev_ids are used as hw queue numbers. Make sure offchan tx queue is
7088         * something that vdev_ids can't reach so that we don't stop the queue
7089         * accidentally.
7090         */
7091        ar->hw->offchannel_tx_hw_queue = IEEE80211_MAX_QUEUES - 1;
7092
7093        switch (ar->wmi.op_version) {
7094        case ATH10K_FW_WMI_OP_VERSION_MAIN:
7095                ar->hw->wiphy->iface_combinations = ath10k_if_comb;
7096                ar->hw->wiphy->n_iface_combinations =
7097                        ARRAY_SIZE(ath10k_if_comb);
7098                ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
7099                break;
7100        case ATH10K_FW_WMI_OP_VERSION_TLV:
7101                if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) {
7102                        ar->hw->wiphy->iface_combinations =
7103                                ath10k_tlv_qcs_if_comb;
7104                        ar->hw->wiphy->n_iface_combinations =
7105                                ARRAY_SIZE(ath10k_tlv_qcs_if_comb);
7106                } else {
7107                        ar->hw->wiphy->iface_combinations = ath10k_tlv_if_comb;
7108                        ar->hw->wiphy->n_iface_combinations =
7109                                ARRAY_SIZE(ath10k_tlv_if_comb);
7110                }
7111                ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
7112                break;
7113        case ATH10K_FW_WMI_OP_VERSION_10_1:
7114        case ATH10K_FW_WMI_OP_VERSION_10_2:
7115        case ATH10K_FW_WMI_OP_VERSION_10_2_4:
7116                ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb;
7117                ar->hw->wiphy->n_iface_combinations =
7118                        ARRAY_SIZE(ath10k_10x_if_comb);
7119                break;
7120        case ATH10K_FW_WMI_OP_VERSION_10_4:
7121                ar->hw->wiphy->iface_combinations = ath10k_10_4_if_comb;
7122                ar->hw->wiphy->n_iface_combinations =
7123                        ARRAY_SIZE(ath10k_10_4_if_comb);
7124                break;
7125        case ATH10K_FW_WMI_OP_VERSION_UNSET:
7126        case ATH10K_FW_WMI_OP_VERSION_MAX:
7127                WARN_ON(1);
7128                ret = -EINVAL;
7129                goto err_free;
7130        }
7131
7132        if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
7133                ar->hw->netdev_features = NETIF_F_HW_CSUM;
7134
7135        if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)) {
7136                /* Init ath dfs pattern detector */
7137                ar->ath_common.debug_mask = ATH_DBG_DFS;
7138                ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common,
7139                                                             NL80211_DFS_UNSET);
7140
7141                if (!ar->dfs_detector)
7142                        ath10k_warn(ar, "failed to initialise DFS pattern detector\n");
7143        }
7144
7145        ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
7146                            ath10k_reg_notifier);
7147        if (ret) {
7148                ath10k_err(ar, "failed to initialise regulatory: %i\n", ret);
7149                goto err_free;
7150        }
7151
7152        ar->hw->wiphy->cipher_suites = cipher_suites;
7153        ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
7154
7155        ret = ieee80211_register_hw(ar->hw);
7156        if (ret) {
7157                ath10k_err(ar, "failed to register ieee80211: %d\n", ret);
7158                goto err_free;
7159        }
7160
7161        if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
7162                ret = regulatory_hint(ar->hw->wiphy,
7163                                      ar->ath_common.regulatory.alpha2);
7164                if (ret)
7165                        goto err_unregister;
7166        }
7167
7168        return 0;
7169
7170err_unregister:
7171        ieee80211_unregister_hw(ar->hw);
7172err_free:
7173        kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
7174        kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
7175
7176        return ret;
7177}
7178
7179void ath10k_mac_unregister(struct ath10k *ar)
7180{
7181        ieee80211_unregister_hw(ar->hw);
7182
7183        if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
7184                ar->dfs_detector->exit(ar->dfs_detector);
7185
7186        kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
7187        kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
7188
7189        SET_IEEE80211_DEV(ar->hw, NULL);
7190}
7191