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