linux/drivers/net/wireless/ath/ath10k/mac.c
<<
>>
Prefs
   1// SPDX-License-Identifier: ISC
   2/*
   3 * Copyright (c) 2005-2011 Atheros Communications Inc.
   4 * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
   5 * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
   6 */
   7
   8#include "mac.h"
   9
  10#include <net/cfg80211.h>
  11#include <net/mac80211.h>
  12#include <linux/etherdevice.h>
  13#include <linux/acpi.h>
  14#include <linux/of.h>
  15#include <linux/bitfield.h>
  16
  17#include "hif.h"
  18#include "core.h"
  19#include "debug.h"
  20#include "wmi.h"
  21#include "htt.h"
  22#include "txrx.h"
  23#include "testmode.h"
  24#include "wmi-tlv.h"
  25#include "wmi-ops.h"
  26#include "wow.h"
  27
  28/*********/
  29/* Rates */
  30/*********/
  31
  32static struct ieee80211_rate ath10k_rates[] = {
  33        { .bitrate = 10,
  34          .hw_value = ATH10K_HW_RATE_CCK_LP_1M },
  35        { .bitrate = 20,
  36          .hw_value = ATH10K_HW_RATE_CCK_LP_2M,
  37          .hw_value_short = ATH10K_HW_RATE_CCK_SP_2M,
  38          .flags = IEEE80211_RATE_SHORT_PREAMBLE },
  39        { .bitrate = 55,
  40          .hw_value = ATH10K_HW_RATE_CCK_LP_5_5M,
  41          .hw_value_short = ATH10K_HW_RATE_CCK_SP_5_5M,
  42          .flags = IEEE80211_RATE_SHORT_PREAMBLE },
  43        { .bitrate = 110,
  44          .hw_value = ATH10K_HW_RATE_CCK_LP_11M,
  45          .hw_value_short = ATH10K_HW_RATE_CCK_SP_11M,
  46          .flags = IEEE80211_RATE_SHORT_PREAMBLE },
  47
  48        { .bitrate = 60, .hw_value = ATH10K_HW_RATE_OFDM_6M },
  49        { .bitrate = 90, .hw_value = ATH10K_HW_RATE_OFDM_9M },
  50        { .bitrate = 120, .hw_value = ATH10K_HW_RATE_OFDM_12M },
  51        { .bitrate = 180, .hw_value = ATH10K_HW_RATE_OFDM_18M },
  52        { .bitrate = 240, .hw_value = ATH10K_HW_RATE_OFDM_24M },
  53        { .bitrate = 360, .hw_value = ATH10K_HW_RATE_OFDM_36M },
  54        { .bitrate = 480, .hw_value = ATH10K_HW_RATE_OFDM_48M },
  55        { .bitrate = 540, .hw_value = ATH10K_HW_RATE_OFDM_54M },
  56};
  57
  58static struct ieee80211_rate ath10k_rates_rev2[] = {
  59        { .bitrate = 10,
  60          .hw_value = ATH10K_HW_RATE_REV2_CCK_LP_1M },
  61        { .bitrate = 20,
  62          .hw_value = ATH10K_HW_RATE_REV2_CCK_LP_2M,
  63          .hw_value_short = ATH10K_HW_RATE_REV2_CCK_SP_2M,
  64          .flags = IEEE80211_RATE_SHORT_PREAMBLE },
  65        { .bitrate = 55,
  66          .hw_value = ATH10K_HW_RATE_REV2_CCK_LP_5_5M,
  67          .hw_value_short = ATH10K_HW_RATE_REV2_CCK_SP_5_5M,
  68          .flags = IEEE80211_RATE_SHORT_PREAMBLE },
  69        { .bitrate = 110,
  70          .hw_value = ATH10K_HW_RATE_REV2_CCK_LP_11M,
  71          .hw_value_short = ATH10K_HW_RATE_REV2_CCK_SP_11M,
  72          .flags = IEEE80211_RATE_SHORT_PREAMBLE },
  73
  74        { .bitrate = 60, .hw_value = ATH10K_HW_RATE_OFDM_6M },
  75        { .bitrate = 90, .hw_value = ATH10K_HW_RATE_OFDM_9M },
  76        { .bitrate = 120, .hw_value = ATH10K_HW_RATE_OFDM_12M },
  77        { .bitrate = 180, .hw_value = ATH10K_HW_RATE_OFDM_18M },
  78        { .bitrate = 240, .hw_value = ATH10K_HW_RATE_OFDM_24M },
  79        { .bitrate = 360, .hw_value = ATH10K_HW_RATE_OFDM_36M },
  80        { .bitrate = 480, .hw_value = ATH10K_HW_RATE_OFDM_48M },
  81        { .bitrate = 540, .hw_value = ATH10K_HW_RATE_OFDM_54M },
  82};
  83
  84#define ATH10K_MAC_FIRST_OFDM_RATE_IDX 4
  85
  86#define ath10k_a_rates (ath10k_rates + ATH10K_MAC_FIRST_OFDM_RATE_IDX)
  87#define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - \
  88                             ATH10K_MAC_FIRST_OFDM_RATE_IDX)
  89#define ath10k_g_rates (ath10k_rates + 0)
  90#define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
  91
  92#define ath10k_g_rates_rev2 (ath10k_rates_rev2 + 0)
  93#define ath10k_g_rates_rev2_size (ARRAY_SIZE(ath10k_rates_rev2))
  94
  95#define ath10k_wmi_legacy_rates ath10k_rates
  96
  97static bool ath10k_mac_bitrate_is_cck(int bitrate)
  98{
  99        switch (bitrate) {
 100        case 10:
 101        case 20:
 102        case 55:
 103        case 110:
 104                return true;
 105        }
 106
 107        return false;
 108}
 109
 110static u8 ath10k_mac_bitrate_to_rate(int bitrate)
 111{
 112        return DIV_ROUND_UP(bitrate, 5) |
 113               (ath10k_mac_bitrate_is_cck(bitrate) ? BIT(7) : 0);
 114}
 115
 116u8 ath10k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband,
 117                             u8 hw_rate, bool cck)
 118{
 119        const struct ieee80211_rate *rate;
 120        int i;
 121
 122        for (i = 0; i < sband->n_bitrates; i++) {
 123                rate = &sband->bitrates[i];
 124
 125                if (ath10k_mac_bitrate_is_cck(rate->bitrate) != cck)
 126                        continue;
 127
 128                if (rate->hw_value == hw_rate)
 129                        return i;
 130                else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE &&
 131                         rate->hw_value_short == hw_rate)
 132                        return i;
 133        }
 134
 135        return 0;
 136}
 137
 138u8 ath10k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband,
 139                             u32 bitrate)
 140{
 141        int i;
 142
 143        for (i = 0; i < sband->n_bitrates; i++)
 144                if (sband->bitrates[i].bitrate == bitrate)
 145                        return i;
 146
 147        return 0;
 148}
 149
 150static int ath10k_mac_get_rate_hw_value(int bitrate)
 151{
 152        int i;
 153        u8 hw_value_prefix = 0;
 154
 155        if (ath10k_mac_bitrate_is_cck(bitrate))
 156                hw_value_prefix = WMI_RATE_PREAMBLE_CCK << 6;
 157
 158        for (i = 0; i < ARRAY_SIZE(ath10k_rates); i++) {
 159                if (ath10k_rates[i].bitrate == bitrate)
 160                        return hw_value_prefix | ath10k_rates[i].hw_value;
 161        }
 162
 163        return -EINVAL;
 164}
 165
 166static int ath10k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss)
 167{
 168        switch ((mcs_map >> (2 * nss)) & 0x3) {
 169        case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1;
 170        case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1;
 171        case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1;
 172        }
 173        return 0;
 174}
 175
 176static u32
 177ath10k_mac_max_ht_nss(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
 178{
 179        int nss;
 180
 181        for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--)
 182                if (ht_mcs_mask[nss])
 183                        return nss + 1;
 184
 185        return 1;
 186}
 187
 188static u32
 189ath10k_mac_max_vht_nss(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
 190{
 191        int nss;
 192
 193        for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--)
 194                if (vht_mcs_mask[nss])
 195                        return nss + 1;
 196
 197        return 1;
 198}
 199
 200int ath10k_mac_ext_resource_config(struct ath10k *ar, u32 val)
 201{
 202        enum wmi_host_platform_type platform_type;
 203        int ret;
 204
 205        if (test_bit(WMI_SERVICE_TX_MODE_DYNAMIC, ar->wmi.svc_map))
 206                platform_type = WMI_HOST_PLATFORM_LOW_PERF;
 207        else
 208                platform_type = WMI_HOST_PLATFORM_HIGH_PERF;
 209
 210        ret = ath10k_wmi_ext_resource_config(ar, platform_type, val);
 211
 212        if (ret && ret != -EOPNOTSUPP) {
 213                ath10k_warn(ar, "failed to configure ext resource: %d\n", ret);
 214                return ret;
 215        }
 216
 217        return 0;
 218}
 219
 220/**********/
 221/* Crypto */
 222/**********/
 223
 224static int ath10k_send_key(struct ath10k_vif *arvif,
 225                           struct ieee80211_key_conf *key,
 226                           enum set_key_cmd cmd,
 227                           const u8 *macaddr, u32 flags)
 228{
 229        struct ath10k *ar = arvif->ar;
 230        struct wmi_vdev_install_key_arg arg = {
 231                .vdev_id = arvif->vdev_id,
 232                .key_idx = key->keyidx,
 233                .key_len = key->keylen,
 234                .key_data = key->key,
 235                .key_flags = flags,
 236                .macaddr = macaddr,
 237        };
 238
 239        lockdep_assert_held(&arvif->ar->conf_mutex);
 240
 241        switch (key->cipher) {
 242        case WLAN_CIPHER_SUITE_CCMP:
 243                arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_AES_CCM];
 244                key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
 245                break;
 246        case WLAN_CIPHER_SUITE_TKIP:
 247                arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_TKIP];
 248                arg.key_txmic_len = 8;
 249                arg.key_rxmic_len = 8;
 250                break;
 251        case WLAN_CIPHER_SUITE_WEP40:
 252        case WLAN_CIPHER_SUITE_WEP104:
 253                arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_WEP];
 254                break;
 255        case WLAN_CIPHER_SUITE_CCMP_256:
 256                arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_AES_CCM];
 257                break;
 258        case WLAN_CIPHER_SUITE_GCMP:
 259        case WLAN_CIPHER_SUITE_GCMP_256:
 260                arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_AES_GCM];
 261                key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
 262                break;
 263        case WLAN_CIPHER_SUITE_BIP_GMAC_128:
 264        case WLAN_CIPHER_SUITE_BIP_GMAC_256:
 265        case WLAN_CIPHER_SUITE_BIP_CMAC_256:
 266        case WLAN_CIPHER_SUITE_AES_CMAC:
 267                WARN_ON(1);
 268                return -EINVAL;
 269        default:
 270                ath10k_warn(ar, "cipher %d is not supported\n", key->cipher);
 271                return -EOPNOTSUPP;
 272        }
 273
 274        if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
 275                key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
 276
 277        if (cmd == DISABLE_KEY) {
 278                arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_NONE];
 279                arg.key_data = NULL;
 280        }
 281
 282        return ath10k_wmi_vdev_install_key(arvif->ar, &arg);
 283}
 284
 285static int ath10k_install_key(struct ath10k_vif *arvif,
 286                              struct ieee80211_key_conf *key,
 287                              enum set_key_cmd cmd,
 288                              const u8 *macaddr, u32 flags)
 289{
 290        struct ath10k *ar = arvif->ar;
 291        int ret;
 292        unsigned long time_left;
 293
 294        lockdep_assert_held(&ar->conf_mutex);
 295
 296        reinit_completion(&ar->install_key_done);
 297
 298        if (arvif->nohwcrypt)
 299                return 1;
 300
 301        ret = ath10k_send_key(arvif, key, cmd, macaddr, flags);
 302        if (ret)
 303                return ret;
 304
 305        time_left = wait_for_completion_timeout(&ar->install_key_done, 3 * HZ);
 306        if (time_left == 0)
 307                return -ETIMEDOUT;
 308
 309        return 0;
 310}
 311
 312static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif,
 313                                        const u8 *addr)
 314{
 315        struct ath10k *ar = arvif->ar;
 316        struct ath10k_peer *peer;
 317        int ret;
 318        int i;
 319        u32 flags;
 320
 321        lockdep_assert_held(&ar->conf_mutex);
 322
 323        if (WARN_ON(arvif->vif->type != NL80211_IFTYPE_AP &&
 324                    arvif->vif->type != NL80211_IFTYPE_ADHOC &&
 325                    arvif->vif->type != NL80211_IFTYPE_MESH_POINT))
 326                return -EINVAL;
 327
 328        spin_lock_bh(&ar->data_lock);
 329        peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
 330        spin_unlock_bh(&ar->data_lock);
 331
 332        if (!peer)
 333                return -ENOENT;
 334
 335        for (i = 0; i < ARRAY_SIZE(arvif->wep_keys); i++) {
 336                if (arvif->wep_keys[i] == NULL)
 337                        continue;
 338
 339                switch (arvif->vif->type) {
 340                case NL80211_IFTYPE_AP:
 341                        flags = WMI_KEY_PAIRWISE;
 342
 343                        if (arvif->def_wep_key_idx == i)
 344                                flags |= WMI_KEY_TX_USAGE;
 345
 346                        ret = ath10k_install_key(arvif, arvif->wep_keys[i],
 347                                                 SET_KEY, addr, flags);
 348                        if (ret < 0)
 349                                return ret;
 350                        break;
 351                case NL80211_IFTYPE_ADHOC:
 352                        ret = ath10k_install_key(arvif, arvif->wep_keys[i],
 353                                                 SET_KEY, addr,
 354                                                 WMI_KEY_PAIRWISE);
 355                        if (ret < 0)
 356                                return ret;
 357
 358                        ret = ath10k_install_key(arvif, arvif->wep_keys[i],
 359                                                 SET_KEY, addr, WMI_KEY_GROUP);
 360                        if (ret < 0)
 361                                return ret;
 362                        break;
 363                default:
 364                        WARN_ON(1);
 365                        return -EINVAL;
 366                }
 367
 368                spin_lock_bh(&ar->data_lock);
 369                peer->keys[i] = arvif->wep_keys[i];
 370                spin_unlock_bh(&ar->data_lock);
 371        }
 372
 373        /* In some cases (notably with static WEP IBSS with multiple keys)
 374         * multicast Tx becomes broken. Both pairwise and groupwise keys are
 375         * installed already. Using WMI_KEY_TX_USAGE in different combinations
 376         * didn't seem help. Using def_keyid vdev parameter seems to be
 377         * effective so use that.
 378         *
 379         * FIXME: Revisit. Perhaps this can be done in a less hacky way.
 380         */
 381        if (arvif->vif->type != NL80211_IFTYPE_ADHOC)
 382                return 0;
 383
 384        if (arvif->def_wep_key_idx == -1)
 385                return 0;
 386
 387        ret = ath10k_wmi_vdev_set_param(arvif->ar,
 388                                        arvif->vdev_id,
 389                                        arvif->ar->wmi.vdev_param->def_keyid,
 390                                        arvif->def_wep_key_idx);
 391        if (ret) {
 392                ath10k_warn(ar, "failed to re-set def wpa key idxon vdev %i: %d\n",
 393                            arvif->vdev_id, ret);
 394                return ret;
 395        }
 396
 397        return 0;
 398}
 399
 400static int ath10k_clear_peer_keys(struct ath10k_vif *arvif,
 401                                  const u8 *addr)
 402{
 403        struct ath10k *ar = arvif->ar;
 404        struct ath10k_peer *peer;
 405        int first_errno = 0;
 406        int ret;
 407        int i;
 408        u32 flags = 0;
 409
 410        lockdep_assert_held(&ar->conf_mutex);
 411
 412        spin_lock_bh(&ar->data_lock);
 413        peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
 414        spin_unlock_bh(&ar->data_lock);
 415
 416        if (!peer)
 417                return -ENOENT;
 418
 419        for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
 420                if (peer->keys[i] == NULL)
 421                        continue;
 422
 423                /* key flags are not required to delete the key */
 424                ret = ath10k_install_key(arvif, peer->keys[i],
 425                                         DISABLE_KEY, addr, flags);
 426                if (ret < 0 && first_errno == 0)
 427                        first_errno = ret;
 428
 429                if (ret < 0)
 430                        ath10k_warn(ar, "failed to remove peer wep key %d: %d\n",
 431                                    i, ret);
 432
 433                spin_lock_bh(&ar->data_lock);
 434                peer->keys[i] = NULL;
 435                spin_unlock_bh(&ar->data_lock);
 436        }
 437
 438        return first_errno;
 439}
 440
 441bool ath10k_mac_is_peer_wep_key_set(struct ath10k *ar, const u8 *addr,
 442                                    u8 keyidx)
 443{
 444        struct ath10k_peer *peer;
 445        int i;
 446
 447        lockdep_assert_held(&ar->data_lock);
 448
 449        /* We don't know which vdev this peer belongs to,
 450         * since WMI doesn't give us that information.
 451         *
 452         * FIXME: multi-bss needs to be handled.
 453         */
 454        peer = ath10k_peer_find(ar, 0, addr);
 455        if (!peer)
 456                return false;
 457
 458        for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
 459                if (peer->keys[i] && peer->keys[i]->keyidx == keyidx)
 460                        return true;
 461        }
 462
 463        return false;
 464}
 465
 466static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
 467                                 struct ieee80211_key_conf *key)
 468{
 469        struct ath10k *ar = arvif->ar;
 470        struct ath10k_peer *peer;
 471        u8 addr[ETH_ALEN];
 472        int first_errno = 0;
 473        int ret;
 474        int i;
 475        u32 flags = 0;
 476
 477        lockdep_assert_held(&ar->conf_mutex);
 478
 479        for (;;) {
 480                /* since ath10k_install_key we can't hold data_lock all the
 481                 * time, so we try to remove the keys incrementally
 482                 */
 483                spin_lock_bh(&ar->data_lock);
 484                i = 0;
 485                list_for_each_entry(peer, &ar->peers, list) {
 486                        for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
 487                                if (peer->keys[i] == key) {
 488                                        ether_addr_copy(addr, peer->addr);
 489                                        peer->keys[i] = NULL;
 490                                        break;
 491                                }
 492                        }
 493
 494                        if (i < ARRAY_SIZE(peer->keys))
 495                                break;
 496                }
 497                spin_unlock_bh(&ar->data_lock);
 498
 499                if (i == ARRAY_SIZE(peer->keys))
 500                        break;
 501                /* key flags are not required to delete the key */
 502                ret = ath10k_install_key(arvif, key, DISABLE_KEY, addr, flags);
 503                if (ret < 0 && first_errno == 0)
 504                        first_errno = ret;
 505
 506                if (ret)
 507                        ath10k_warn(ar, "failed to remove key for %pM: %d\n",
 508                                    addr, ret);
 509        }
 510
 511        return first_errno;
 512}
 513
 514static int ath10k_mac_vif_update_wep_key(struct ath10k_vif *arvif,
 515                                         struct ieee80211_key_conf *key)
 516{
 517        struct ath10k *ar = arvif->ar;
 518        struct ath10k_peer *peer;
 519        int ret;
 520
 521        lockdep_assert_held(&ar->conf_mutex);
 522
 523        list_for_each_entry(peer, &ar->peers, list) {
 524                if (ether_addr_equal(peer->addr, arvif->vif->addr))
 525                        continue;
 526
 527                if (ether_addr_equal(peer->addr, arvif->bssid))
 528                        continue;
 529
 530                if (peer->keys[key->keyidx] == key)
 531                        continue;
 532
 533                ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vif vdev %i update key %i needs update\n",
 534                           arvif->vdev_id, key->keyidx);
 535
 536                ret = ath10k_install_peer_wep_keys(arvif, peer->addr);
 537                if (ret) {
 538                        ath10k_warn(ar, "failed to update wep keys on vdev %i for peer %pM: %d\n",
 539                                    arvif->vdev_id, peer->addr, ret);
 540                        return ret;
 541                }
 542        }
 543
 544        return 0;
 545}
 546
 547/*********************/
 548/* General utilities */
 549/*********************/
 550
 551static inline enum wmi_phy_mode
 552chan_to_phymode(const struct cfg80211_chan_def *chandef)
 553{
 554        enum wmi_phy_mode phymode = MODE_UNKNOWN;
 555
 556        switch (chandef->chan->band) {
 557        case NL80211_BAND_2GHZ:
 558                switch (chandef->width) {
 559                case NL80211_CHAN_WIDTH_20_NOHT:
 560                        if (chandef->chan->flags & IEEE80211_CHAN_NO_OFDM)
 561                                phymode = MODE_11B;
 562                        else
 563                                phymode = MODE_11G;
 564                        break;
 565                case NL80211_CHAN_WIDTH_20:
 566                        phymode = MODE_11NG_HT20;
 567                        break;
 568                case NL80211_CHAN_WIDTH_40:
 569                        phymode = MODE_11NG_HT40;
 570                        break;
 571                default:
 572                        phymode = MODE_UNKNOWN;
 573                        break;
 574                }
 575                break;
 576        case NL80211_BAND_5GHZ:
 577                switch (chandef->width) {
 578                case NL80211_CHAN_WIDTH_20_NOHT:
 579                        phymode = MODE_11A;
 580                        break;
 581                case NL80211_CHAN_WIDTH_20:
 582                        phymode = MODE_11NA_HT20;
 583                        break;
 584                case NL80211_CHAN_WIDTH_40:
 585                        phymode = MODE_11NA_HT40;
 586                        break;
 587                case NL80211_CHAN_WIDTH_80:
 588                        phymode = MODE_11AC_VHT80;
 589                        break;
 590                case NL80211_CHAN_WIDTH_160:
 591                        phymode = MODE_11AC_VHT160;
 592                        break;
 593                case NL80211_CHAN_WIDTH_80P80:
 594                        phymode = MODE_11AC_VHT80_80;
 595                        break;
 596                default:
 597                        phymode = MODE_UNKNOWN;
 598                        break;
 599                }
 600                break;
 601        default:
 602                break;
 603        }
 604
 605        WARN_ON(phymode == MODE_UNKNOWN);
 606        return phymode;
 607}
 608
 609static u8 ath10k_parse_mpdudensity(u8 mpdudensity)
 610{
 611/*
 612 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
 613 *   0 for no restriction
 614 *   1 for 1/4 us
 615 *   2 for 1/2 us
 616 *   3 for 1 us
 617 *   4 for 2 us
 618 *   5 for 4 us
 619 *   6 for 8 us
 620 *   7 for 16 us
 621 */
 622        switch (mpdudensity) {
 623        case 0:
 624                return 0;
 625        case 1:
 626        case 2:
 627        case 3:
 628        /* Our lower layer calculations limit our precision to
 629         * 1 microsecond
 630         */
 631                return 1;
 632        case 4:
 633                return 2;
 634        case 5:
 635                return 4;
 636        case 6:
 637                return 8;
 638        case 7:
 639                return 16;
 640        default:
 641                return 0;
 642        }
 643}
 644
 645int ath10k_mac_vif_chan(struct ieee80211_vif *vif,
 646                        struct cfg80211_chan_def *def)
 647{
 648        struct ieee80211_chanctx_conf *conf;
 649
 650        rcu_read_lock();
 651        conf = rcu_dereference(vif->chanctx_conf);
 652        if (!conf) {
 653                rcu_read_unlock();
 654                return -ENOENT;
 655        }
 656
 657        *def = conf->def;
 658        rcu_read_unlock();
 659
 660        return 0;
 661}
 662
 663static void ath10k_mac_num_chanctxs_iter(struct ieee80211_hw *hw,
 664                                         struct ieee80211_chanctx_conf *conf,
 665                                         void *data)
 666{
 667        int *num = data;
 668
 669        (*num)++;
 670}
 671
 672static int ath10k_mac_num_chanctxs(struct ath10k *ar)
 673{
 674        int num = 0;
 675
 676        ieee80211_iter_chan_contexts_atomic(ar->hw,
 677                                            ath10k_mac_num_chanctxs_iter,
 678                                            &num);
 679
 680        return num;
 681}
 682
 683static void
 684ath10k_mac_get_any_chandef_iter(struct ieee80211_hw *hw,
 685                                struct ieee80211_chanctx_conf *conf,
 686                                void *data)
 687{
 688        struct cfg80211_chan_def **def = data;
 689
 690        *def = &conf->def;
 691}
 692
 693static void ath10k_wait_for_peer_delete_done(struct ath10k *ar, u32 vdev_id,
 694                                             const u8 *addr)
 695{
 696        unsigned long time_left;
 697        int ret;
 698
 699        if (test_bit(WMI_SERVICE_SYNC_DELETE_CMDS, ar->wmi.svc_map)) {
 700                ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
 701                if (ret) {
 702                        ath10k_warn(ar, "failed wait for peer deleted");
 703                        return;
 704                }
 705
 706                time_left = wait_for_completion_timeout(&ar->peer_delete_done,
 707                                                        5 * HZ);
 708                if (!time_left)
 709                        ath10k_warn(ar, "Timeout in receiving peer delete response\n");
 710        }
 711}
 712
 713static int ath10k_peer_create(struct ath10k *ar,
 714                              struct ieee80211_vif *vif,
 715                              struct ieee80211_sta *sta,
 716                              u32 vdev_id,
 717                              const u8 *addr,
 718                              enum wmi_peer_type peer_type)
 719{
 720        struct ath10k_vif *arvif;
 721        struct ath10k_peer *peer;
 722        int num_peers = 0;
 723        int ret;
 724
 725        lockdep_assert_held(&ar->conf_mutex);
 726
 727        num_peers = ar->num_peers;
 728
 729        /* Each vdev consumes a peer entry as well */
 730        list_for_each_entry(arvif, &ar->arvifs, list)
 731                num_peers++;
 732
 733        if (num_peers >= ar->max_num_peers)
 734                return -ENOBUFS;
 735
 736        ret = ath10k_wmi_peer_create(ar, vdev_id, addr, peer_type);
 737        if (ret) {
 738                ath10k_warn(ar, "failed to create wmi peer %pM on vdev %i: %i\n",
 739                            addr, vdev_id, ret);
 740                return ret;
 741        }
 742
 743        ret = ath10k_wait_for_peer_created(ar, vdev_id, addr);
 744        if (ret) {
 745                ath10k_warn(ar, "failed to wait for created wmi peer %pM on vdev %i: %i\n",
 746                            addr, vdev_id, ret);
 747                return ret;
 748        }
 749
 750        spin_lock_bh(&ar->data_lock);
 751
 752        peer = ath10k_peer_find(ar, vdev_id, addr);
 753        if (!peer) {
 754                spin_unlock_bh(&ar->data_lock);
 755                ath10k_warn(ar, "failed to find peer %pM on vdev %i after creation\n",
 756                            addr, vdev_id);
 757                ath10k_wait_for_peer_delete_done(ar, vdev_id, addr);
 758                return -ENOENT;
 759        }
 760
 761        peer->vif = vif;
 762        peer->sta = sta;
 763
 764        spin_unlock_bh(&ar->data_lock);
 765
 766        ar->num_peers++;
 767
 768        return 0;
 769}
 770
 771static int ath10k_mac_set_kickout(struct ath10k_vif *arvif)
 772{
 773        struct ath10k *ar = arvif->ar;
 774        u32 param;
 775        int ret;
 776
 777        param = ar->wmi.pdev_param->sta_kickout_th;
 778        ret = ath10k_wmi_pdev_set_param(ar, param,
 779                                        ATH10K_KICKOUT_THRESHOLD);
 780        if (ret) {
 781                ath10k_warn(ar, "failed to set kickout threshold on vdev %i: %d\n",
 782                            arvif->vdev_id, ret);
 783                return ret;
 784        }
 785
 786        param = ar->wmi.vdev_param->ap_keepalive_min_idle_inactive_time_secs;
 787        ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
 788                                        ATH10K_KEEPALIVE_MIN_IDLE);
 789        if (ret) {
 790                ath10k_warn(ar, "failed to set keepalive minimum idle time on vdev %i: %d\n",
 791                            arvif->vdev_id, ret);
 792                return ret;
 793        }
 794
 795        param = ar->wmi.vdev_param->ap_keepalive_max_idle_inactive_time_secs;
 796        ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
 797                                        ATH10K_KEEPALIVE_MAX_IDLE);
 798        if (ret) {
 799                ath10k_warn(ar, "failed to set keepalive maximum idle time on vdev %i: %d\n",
 800                            arvif->vdev_id, ret);
 801                return ret;
 802        }
 803
 804        param = ar->wmi.vdev_param->ap_keepalive_max_unresponsive_time_secs;
 805        ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
 806                                        ATH10K_KEEPALIVE_MAX_UNRESPONSIVE);
 807        if (ret) {
 808                ath10k_warn(ar, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
 809                            arvif->vdev_id, ret);
 810                return ret;
 811        }
 812
 813        return 0;
 814}
 815
 816static int ath10k_mac_set_rts(struct ath10k_vif *arvif, u32 value)
 817{
 818        struct ath10k *ar = arvif->ar;
 819        u32 vdev_param;
 820
 821        vdev_param = ar->wmi.vdev_param->rts_threshold;
 822        return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
 823}
 824
 825static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
 826{
 827        int ret;
 828
 829        lockdep_assert_held(&ar->conf_mutex);
 830
 831        ret = ath10k_wmi_peer_delete(ar, vdev_id, addr);
 832        if (ret)
 833                return ret;
 834
 835        ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
 836        if (ret)
 837                return ret;
 838
 839        if (test_bit(WMI_SERVICE_SYNC_DELETE_CMDS, ar->wmi.svc_map)) {
 840                unsigned long time_left;
 841
 842                time_left = wait_for_completion_timeout
 843                            (&ar->peer_delete_done, 5 * HZ);
 844
 845                if (!time_left) {
 846                        ath10k_warn(ar, "Timeout in receiving peer delete response\n");
 847                        return -ETIMEDOUT;
 848                }
 849        }
 850
 851        ar->num_peers--;
 852
 853        return 0;
 854}
 855
 856static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id)
 857{
 858        struct ath10k_peer *peer, *tmp;
 859        int peer_id;
 860        int i;
 861
 862        lockdep_assert_held(&ar->conf_mutex);
 863
 864        spin_lock_bh(&ar->data_lock);
 865        list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
 866                if (peer->vdev_id != vdev_id)
 867                        continue;
 868
 869                ath10k_warn(ar, "removing stale peer %pM from vdev_id %d\n",
 870                            peer->addr, vdev_id);
 871
 872                for_each_set_bit(peer_id, peer->peer_ids,
 873                                 ATH10K_MAX_NUM_PEER_IDS) {
 874                        ar->peer_map[peer_id] = NULL;
 875                }
 876
 877                /* Double check that peer is properly un-referenced from
 878                 * the peer_map
 879                 */
 880                for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) {
 881                        if (ar->peer_map[i] == peer) {
 882                                ath10k_warn(ar, "removing stale peer_map entry for %pM (ptr %pK idx %d)\n",
 883                                            peer->addr, peer, i);
 884                                ar->peer_map[i] = NULL;
 885                        }
 886                }
 887
 888                list_del(&peer->list);
 889                kfree(peer);
 890                ar->num_peers--;
 891        }
 892        spin_unlock_bh(&ar->data_lock);
 893}
 894
 895static void ath10k_peer_cleanup_all(struct ath10k *ar)
 896{
 897        struct ath10k_peer *peer, *tmp;
 898        int i;
 899
 900        lockdep_assert_held(&ar->conf_mutex);
 901
 902        spin_lock_bh(&ar->data_lock);
 903        list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
 904                list_del(&peer->list);
 905                kfree(peer);
 906        }
 907
 908        for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++)
 909                ar->peer_map[i] = NULL;
 910
 911        spin_unlock_bh(&ar->data_lock);
 912
 913        ar->num_peers = 0;
 914        ar->num_stations = 0;
 915}
 916
 917static int ath10k_mac_tdls_peer_update(struct ath10k *ar, u32 vdev_id,
 918                                       struct ieee80211_sta *sta,
 919                                       enum wmi_tdls_peer_state state)
 920{
 921        int ret;
 922        struct wmi_tdls_peer_update_cmd_arg arg = {};
 923        struct wmi_tdls_peer_capab_arg cap = {};
 924        struct wmi_channel_arg chan_arg = {};
 925
 926        lockdep_assert_held(&ar->conf_mutex);
 927
 928        arg.vdev_id = vdev_id;
 929        arg.peer_state = state;
 930        ether_addr_copy(arg.addr, sta->addr);
 931
 932        cap.peer_max_sp = sta->max_sp;
 933        cap.peer_uapsd_queues = sta->uapsd_queues;
 934
 935        if (state == WMI_TDLS_PEER_STATE_CONNECTED &&
 936            !sta->tdls_initiator)
 937                cap.is_peer_responder = 1;
 938
 939        ret = ath10k_wmi_tdls_peer_update(ar, &arg, &cap, &chan_arg);
 940        if (ret) {
 941                ath10k_warn(ar, "failed to update tdls peer %pM on vdev %i: %i\n",
 942                            arg.addr, vdev_id, ret);
 943                return ret;
 944        }
 945
 946        return 0;
 947}
 948
 949/************************/
 950/* Interface management */
 951/************************/
 952
 953void ath10k_mac_vif_beacon_free(struct ath10k_vif *arvif)
 954{
 955        struct ath10k *ar = arvif->ar;
 956
 957        lockdep_assert_held(&ar->data_lock);
 958
 959        if (!arvif->beacon)
 960                return;
 961
 962        if (!arvif->beacon_buf)
 963                dma_unmap_single(ar->dev, ATH10K_SKB_CB(arvif->beacon)->paddr,
 964                                 arvif->beacon->len, DMA_TO_DEVICE);
 965
 966        if (WARN_ON(arvif->beacon_state != ATH10K_BEACON_SCHEDULED &&
 967                    arvif->beacon_state != ATH10K_BEACON_SENT))
 968                return;
 969
 970        dev_kfree_skb_any(arvif->beacon);
 971
 972        arvif->beacon = NULL;
 973        arvif->beacon_state = ATH10K_BEACON_SCHEDULED;
 974}
 975
 976static void ath10k_mac_vif_beacon_cleanup(struct ath10k_vif *arvif)
 977{
 978        struct ath10k *ar = arvif->ar;
 979
 980        lockdep_assert_held(&ar->data_lock);
 981
 982        ath10k_mac_vif_beacon_free(arvif);
 983
 984        if (arvif->beacon_buf) {
 985                dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
 986                                  arvif->beacon_buf, arvif->beacon_paddr);
 987                arvif->beacon_buf = NULL;
 988        }
 989}
 990
 991static inline int ath10k_vdev_setup_sync(struct ath10k *ar)
 992{
 993        unsigned long time_left;
 994
 995        lockdep_assert_held(&ar->conf_mutex);
 996
 997        if (test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags))
 998                return -ESHUTDOWN;
 999
1000        time_left = wait_for_completion_timeout(&ar->vdev_setup_done,
1001                                                ATH10K_VDEV_SETUP_TIMEOUT_HZ);
1002        if (time_left == 0)
1003                return -ETIMEDOUT;
1004
1005        return ar->last_wmi_vdev_start_status;
1006}
1007
1008static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id)
1009{
1010        struct cfg80211_chan_def *chandef = NULL;
1011        struct ieee80211_channel *channel = NULL;
1012        struct wmi_vdev_start_request_arg arg = {};
1013        int ret = 0;
1014
1015        lockdep_assert_held(&ar->conf_mutex);
1016
1017        ieee80211_iter_chan_contexts_atomic(ar->hw,
1018                                            ath10k_mac_get_any_chandef_iter,
1019                                            &chandef);
1020        if (WARN_ON_ONCE(!chandef))
1021                return -ENOENT;
1022
1023        channel = chandef->chan;
1024
1025        arg.vdev_id = vdev_id;
1026        arg.channel.freq = channel->center_freq;
1027        arg.channel.band_center_freq1 = chandef->center_freq1;
1028        arg.channel.band_center_freq2 = chandef->center_freq2;
1029
1030        /* TODO setup this dynamically, what in case we
1031         * don't have any vifs?
1032         */
1033        arg.channel.mode = chan_to_phymode(chandef);
1034        arg.channel.chan_radar =
1035                        !!(channel->flags & IEEE80211_CHAN_RADAR);
1036
1037        arg.channel.min_power = 0;
1038        arg.channel.max_power = channel->max_power * 2;
1039        arg.channel.max_reg_power = channel->max_reg_power * 2;
1040        arg.channel.max_antenna_gain = channel->max_antenna_gain * 2;
1041
1042        reinit_completion(&ar->vdev_setup_done);
1043        reinit_completion(&ar->vdev_delete_done);
1044
1045        ret = ath10k_wmi_vdev_start(ar, &arg);
1046        if (ret) {
1047                ath10k_warn(ar, "failed to request monitor vdev %i start: %d\n",
1048                            vdev_id, ret);
1049                return ret;
1050        }
1051
1052        ret = ath10k_vdev_setup_sync(ar);
1053        if (ret) {
1054                ath10k_warn(ar, "failed to synchronize setup for monitor vdev %i start: %d\n",
1055                            vdev_id, ret);
1056                return ret;
1057        }
1058
1059        ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
1060        if (ret) {
1061                ath10k_warn(ar, "failed to put up monitor vdev %i: %d\n",
1062                            vdev_id, ret);
1063                goto vdev_stop;
1064        }
1065
1066        ar->monitor_vdev_id = vdev_id;
1067
1068        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i started\n",
1069                   ar->monitor_vdev_id);
1070        return 0;
1071
1072vdev_stop:
1073        ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
1074        if (ret)
1075                ath10k_warn(ar, "failed to stop monitor vdev %i after start failure: %d\n",
1076                            ar->monitor_vdev_id, ret);
1077
1078        return ret;
1079}
1080
1081static int ath10k_monitor_vdev_stop(struct ath10k *ar)
1082{
1083        int ret = 0;
1084
1085        lockdep_assert_held(&ar->conf_mutex);
1086
1087        ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id);
1088        if (ret)
1089                ath10k_warn(ar, "failed to put down monitor vdev %i: %d\n",
1090                            ar->monitor_vdev_id, ret);
1091
1092        reinit_completion(&ar->vdev_setup_done);
1093        reinit_completion(&ar->vdev_delete_done);
1094
1095        ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
1096        if (ret)
1097                ath10k_warn(ar, "failed to request monitor vdev %i stop: %d\n",
1098                            ar->monitor_vdev_id, ret);
1099
1100        ret = ath10k_vdev_setup_sync(ar);
1101        if (ret)
1102                ath10k_warn(ar, "failed to synchronize monitor vdev %i stop: %d\n",
1103                            ar->monitor_vdev_id, ret);
1104
1105        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i stopped\n",
1106                   ar->monitor_vdev_id);
1107        return ret;
1108}
1109
1110static int ath10k_monitor_vdev_create(struct ath10k *ar)
1111{
1112        int bit, ret = 0;
1113
1114        lockdep_assert_held(&ar->conf_mutex);
1115
1116        if (ar->free_vdev_map == 0) {
1117                ath10k_warn(ar, "failed to find free vdev id for monitor vdev\n");
1118                return -ENOMEM;
1119        }
1120
1121        bit = __ffs64(ar->free_vdev_map);
1122
1123        ar->monitor_vdev_id = bit;
1124
1125        ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id,
1126                                     WMI_VDEV_TYPE_MONITOR,
1127                                     0, ar->mac_addr);
1128        if (ret) {
1129                ath10k_warn(ar, "failed to request monitor vdev %i creation: %d\n",
1130                            ar->monitor_vdev_id, ret);
1131                return ret;
1132        }
1133
1134        ar->free_vdev_map &= ~(1LL << ar->monitor_vdev_id);
1135        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d created\n",
1136                   ar->monitor_vdev_id);
1137
1138        return 0;
1139}
1140
1141static int ath10k_monitor_vdev_delete(struct ath10k *ar)
1142{
1143        int ret = 0;
1144
1145        lockdep_assert_held(&ar->conf_mutex);
1146
1147        ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
1148        if (ret) {
1149                ath10k_warn(ar, "failed to request wmi monitor vdev %i removal: %d\n",
1150                            ar->monitor_vdev_id, ret);
1151                return ret;
1152        }
1153
1154        ar->free_vdev_map |= 1LL << ar->monitor_vdev_id;
1155
1156        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n",
1157                   ar->monitor_vdev_id);
1158        return ret;
1159}
1160
1161static int ath10k_monitor_start(struct ath10k *ar)
1162{
1163        int ret;
1164
1165        lockdep_assert_held(&ar->conf_mutex);
1166
1167        ret = ath10k_monitor_vdev_create(ar);
1168        if (ret) {
1169                ath10k_warn(ar, "failed to create monitor vdev: %d\n", ret);
1170                return ret;
1171        }
1172
1173        ret = ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id);
1174        if (ret) {
1175                ath10k_warn(ar, "failed to start monitor vdev: %d\n", ret);
1176                ath10k_monitor_vdev_delete(ar);
1177                return ret;
1178        }
1179
1180        ar->monitor_started = true;
1181        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor started\n");
1182
1183        return 0;
1184}
1185
1186static int ath10k_monitor_stop(struct ath10k *ar)
1187{
1188        int ret;
1189
1190        lockdep_assert_held(&ar->conf_mutex);
1191
1192        ret = ath10k_monitor_vdev_stop(ar);
1193        if (ret) {
1194                ath10k_warn(ar, "failed to stop monitor vdev: %d\n", ret);
1195                return ret;
1196        }
1197
1198        ret = ath10k_monitor_vdev_delete(ar);
1199        if (ret) {
1200                ath10k_warn(ar, "failed to delete monitor vdev: %d\n", ret);
1201                return ret;
1202        }
1203
1204        ar->monitor_started = false;
1205        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopped\n");
1206
1207        return 0;
1208}
1209
1210static bool ath10k_mac_monitor_vdev_is_needed(struct ath10k *ar)
1211{
1212        int num_ctx;
1213
1214        /* At least one chanctx is required to derive a channel to start
1215         * monitor vdev on.
1216         */
1217        num_ctx = ath10k_mac_num_chanctxs(ar);
1218        if (num_ctx == 0)
1219                return false;
1220
1221        /* If there's already an existing special monitor interface then don't
1222         * bother creating another monitor vdev.
1223         */
1224        if (ar->monitor_arvif)
1225                return false;
1226
1227        return ar->monitor ||
1228               (!test_bit(ATH10K_FW_FEATURE_ALLOWS_MESH_BCAST,
1229                          ar->running_fw->fw_file.fw_features) &&
1230                (ar->filter_flags & FIF_OTHER_BSS)) ||
1231               test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1232}
1233
1234static bool ath10k_mac_monitor_vdev_is_allowed(struct ath10k *ar)
1235{
1236        int num_ctx;
1237
1238        num_ctx = ath10k_mac_num_chanctxs(ar);
1239
1240        /* FIXME: Current interface combinations and cfg80211/mac80211 code
1241         * shouldn't allow this but make sure to prevent handling the following
1242         * case anyway since multi-channel DFS hasn't been tested at all.
1243         */
1244        if (test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags) && num_ctx > 1)
1245                return false;
1246
1247        return true;
1248}
1249
1250static int ath10k_monitor_recalc(struct ath10k *ar)
1251{
1252        bool needed;
1253        bool allowed;
1254        int ret;
1255
1256        lockdep_assert_held(&ar->conf_mutex);
1257
1258        needed = ath10k_mac_monitor_vdev_is_needed(ar);
1259        allowed = ath10k_mac_monitor_vdev_is_allowed(ar);
1260
1261        ath10k_dbg(ar, ATH10K_DBG_MAC,
1262                   "mac monitor recalc started? %d needed? %d allowed? %d\n",
1263                   ar->monitor_started, needed, allowed);
1264
1265        if (WARN_ON(needed && !allowed)) {
1266                if (ar->monitor_started) {
1267                        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopping disallowed monitor\n");
1268
1269                        ret = ath10k_monitor_stop(ar);
1270                        if (ret)
1271                                ath10k_warn(ar, "failed to stop disallowed monitor: %d\n",
1272                                            ret);
1273                                /* not serious */
1274                }
1275
1276                return -EPERM;
1277        }
1278
1279        if (needed == ar->monitor_started)
1280                return 0;
1281
1282        if (needed)
1283                return ath10k_monitor_start(ar);
1284        else
1285                return ath10k_monitor_stop(ar);
1286}
1287
1288static bool ath10k_mac_can_set_cts_prot(struct ath10k_vif *arvif)
1289{
1290        struct ath10k *ar = arvif->ar;
1291
1292        lockdep_assert_held(&ar->conf_mutex);
1293
1294        if (!arvif->is_started) {
1295                ath10k_dbg(ar, ATH10K_DBG_MAC, "defer cts setup, vdev is not ready yet\n");
1296                return false;
1297        }
1298
1299        return true;
1300}
1301
1302static int ath10k_mac_set_cts_prot(struct ath10k_vif *arvif)
1303{
1304        struct ath10k *ar = arvif->ar;
1305        u32 vdev_param;
1306
1307        lockdep_assert_held(&ar->conf_mutex);
1308
1309        vdev_param = ar->wmi.vdev_param->protection_mode;
1310
1311        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d cts_protection %d\n",
1312                   arvif->vdev_id, arvif->use_cts_prot);
1313
1314        return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
1315                                         arvif->use_cts_prot ? 1 : 0);
1316}
1317
1318static int ath10k_recalc_rtscts_prot(struct ath10k_vif *arvif)
1319{
1320        struct ath10k *ar = arvif->ar;
1321        u32 vdev_param, rts_cts = 0;
1322
1323        lockdep_assert_held(&ar->conf_mutex);
1324
1325        vdev_param = ar->wmi.vdev_param->enable_rtscts;
1326
1327        rts_cts |= SM(WMI_RTSCTS_ENABLED, WMI_RTSCTS_SET);
1328
1329        if (arvif->num_legacy_stations > 0)
1330                rts_cts |= SM(WMI_RTSCTS_ACROSS_SW_RETRIES,
1331                              WMI_RTSCTS_PROFILE);
1332        else
1333                rts_cts |= SM(WMI_RTSCTS_FOR_SECOND_RATESERIES,
1334                              WMI_RTSCTS_PROFILE);
1335
1336        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d recalc rts/cts prot %d\n",
1337                   arvif->vdev_id, rts_cts);
1338
1339        return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
1340                                         rts_cts);
1341}
1342
1343static int ath10k_start_cac(struct ath10k *ar)
1344{
1345        int ret;
1346
1347        lockdep_assert_held(&ar->conf_mutex);
1348
1349        set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1350
1351        ret = ath10k_monitor_recalc(ar);
1352        if (ret) {
1353                ath10k_warn(ar, "failed to start monitor (cac): %d\n", ret);
1354                clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1355                return ret;
1356        }
1357
1358        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac start monitor vdev %d\n",
1359                   ar->monitor_vdev_id);
1360
1361        return 0;
1362}
1363
1364static int ath10k_stop_cac(struct ath10k *ar)
1365{
1366        lockdep_assert_held(&ar->conf_mutex);
1367
1368        /* CAC is not running - do nothing */
1369        if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags))
1370                return 0;
1371
1372        clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1373        ath10k_monitor_stop(ar);
1374
1375        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac finished\n");
1376
1377        return 0;
1378}
1379
1380static void ath10k_mac_has_radar_iter(struct ieee80211_hw *hw,
1381                                      struct ieee80211_chanctx_conf *conf,
1382                                      void *data)
1383{
1384        bool *ret = data;
1385
1386        if (!*ret && conf->radar_enabled)
1387                *ret = true;
1388}
1389
1390static bool ath10k_mac_has_radar_enabled(struct ath10k *ar)
1391{
1392        bool has_radar = false;
1393
1394        ieee80211_iter_chan_contexts_atomic(ar->hw,
1395                                            ath10k_mac_has_radar_iter,
1396                                            &has_radar);
1397
1398        return has_radar;
1399}
1400
1401static void ath10k_recalc_radar_detection(struct ath10k *ar)
1402{
1403        int ret;
1404
1405        lockdep_assert_held(&ar->conf_mutex);
1406
1407        ath10k_stop_cac(ar);
1408
1409        if (!ath10k_mac_has_radar_enabled(ar))
1410                return;
1411
1412        if (ar->num_started_vdevs > 0)
1413                return;
1414
1415        ret = ath10k_start_cac(ar);
1416        if (ret) {
1417                /*
1418                 * Not possible to start CAC on current channel so starting
1419                 * radiation is not allowed, make this channel DFS_UNAVAILABLE
1420                 * by indicating that radar was detected.
1421                 */
1422                ath10k_warn(ar, "failed to start CAC: %d\n", ret);
1423                ieee80211_radar_detected(ar->hw);
1424        }
1425}
1426
1427static int ath10k_vdev_stop(struct ath10k_vif *arvif)
1428{
1429        struct ath10k *ar = arvif->ar;
1430        int ret;
1431
1432        lockdep_assert_held(&ar->conf_mutex);
1433
1434        reinit_completion(&ar->vdev_setup_done);
1435        reinit_completion(&ar->vdev_delete_done);
1436
1437        ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id);
1438        if (ret) {
1439                ath10k_warn(ar, "failed to stop WMI vdev %i: %d\n",
1440                            arvif->vdev_id, ret);
1441                return ret;
1442        }
1443
1444        ret = ath10k_vdev_setup_sync(ar);
1445        if (ret) {
1446                ath10k_warn(ar, "failed to synchronize setup for vdev %i: %d\n",
1447                            arvif->vdev_id, ret);
1448                return ret;
1449        }
1450
1451        WARN_ON(ar->num_started_vdevs == 0);
1452
1453        if (ar->num_started_vdevs != 0) {
1454                ar->num_started_vdevs--;
1455                ath10k_recalc_radar_detection(ar);
1456        }
1457
1458        return ret;
1459}
1460
1461static int ath10k_vdev_start_restart(struct ath10k_vif *arvif,
1462                                     const struct cfg80211_chan_def *chandef,
1463                                     bool restart)
1464{
1465        struct ath10k *ar = arvif->ar;
1466        struct wmi_vdev_start_request_arg arg = {};
1467        int ret = 0;
1468
1469        lockdep_assert_held(&ar->conf_mutex);
1470
1471        reinit_completion(&ar->vdev_setup_done);
1472        reinit_completion(&ar->vdev_delete_done);
1473
1474        arg.vdev_id = arvif->vdev_id;
1475        arg.dtim_period = arvif->dtim_period;
1476        arg.bcn_intval = arvif->beacon_interval;
1477
1478        arg.channel.freq = chandef->chan->center_freq;
1479        arg.channel.band_center_freq1 = chandef->center_freq1;
1480        arg.channel.band_center_freq2 = chandef->center_freq2;
1481        arg.channel.mode = chan_to_phymode(chandef);
1482
1483        arg.channel.min_power = 0;
1484        arg.channel.max_power = chandef->chan->max_power * 2;
1485        arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
1486        arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain * 2;
1487
1488        if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
1489                arg.ssid = arvif->u.ap.ssid;
1490                arg.ssid_len = arvif->u.ap.ssid_len;
1491                arg.hidden_ssid = arvif->u.ap.hidden_ssid;
1492
1493                /* For now allow DFS for AP mode */
1494                arg.channel.chan_radar =
1495                        !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
1496        } else if (arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
1497                arg.ssid = arvif->vif->bss_conf.ssid;
1498                arg.ssid_len = arvif->vif->bss_conf.ssid_len;
1499        }
1500
1501        ath10k_dbg(ar, ATH10K_DBG_MAC,
1502                   "mac vdev %d start center_freq %d phymode %s\n",
1503                   arg.vdev_id, arg.channel.freq,
1504                   ath10k_wmi_phymode_str(arg.channel.mode));
1505
1506        if (restart)
1507                ret = ath10k_wmi_vdev_restart(ar, &arg);
1508        else
1509                ret = ath10k_wmi_vdev_start(ar, &arg);
1510
1511        if (ret) {
1512                ath10k_warn(ar, "failed to start WMI vdev %i: %d\n",
1513                            arg.vdev_id, ret);
1514                return ret;
1515        }
1516
1517        ret = ath10k_vdev_setup_sync(ar);
1518        if (ret) {
1519                ath10k_warn(ar,
1520                            "failed to synchronize setup for vdev %i restart %d: %d\n",
1521                            arg.vdev_id, restart, ret);
1522                return ret;
1523        }
1524
1525        ar->num_started_vdevs++;
1526        ath10k_recalc_radar_detection(ar);
1527
1528        return ret;
1529}
1530
1531static int ath10k_vdev_start(struct ath10k_vif *arvif,
1532                             const struct cfg80211_chan_def *def)
1533{
1534        return ath10k_vdev_start_restart(arvif, def, false);
1535}
1536
1537static int ath10k_vdev_restart(struct ath10k_vif *arvif,
1538                               const struct cfg80211_chan_def *def)
1539{
1540        return ath10k_vdev_start_restart(arvif, def, true);
1541}
1542
1543static int ath10k_mac_setup_bcn_p2p_ie(struct ath10k_vif *arvif,
1544                                       struct sk_buff *bcn)
1545{
1546        struct ath10k *ar = arvif->ar;
1547        struct ieee80211_mgmt *mgmt;
1548        const u8 *p2p_ie;
1549        int ret;
1550
1551        if (arvif->vif->type != NL80211_IFTYPE_AP || !arvif->vif->p2p)
1552                return 0;
1553
1554        mgmt = (void *)bcn->data;
1555        p2p_ie = cfg80211_find_vendor_ie(WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1556                                         mgmt->u.beacon.variable,
1557                                         bcn->len - (mgmt->u.beacon.variable -
1558                                                     bcn->data));
1559        if (!p2p_ie)
1560                return -ENOENT;
1561
1562        ret = ath10k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie);
1563        if (ret) {
1564                ath10k_warn(ar, "failed to submit p2p go bcn ie for vdev %i: %d\n",
1565                            arvif->vdev_id, ret);
1566                return ret;
1567        }
1568
1569        return 0;
1570}
1571
1572static int ath10k_mac_remove_vendor_ie(struct sk_buff *skb, unsigned int oui,
1573                                       u8 oui_type, size_t ie_offset)
1574{
1575        size_t len;
1576        const u8 *next;
1577        const u8 *end;
1578        u8 *ie;
1579
1580        if (WARN_ON(skb->len < ie_offset))
1581                return -EINVAL;
1582
1583        ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type,
1584                                           skb->data + ie_offset,
1585                                           skb->len - ie_offset);
1586        if (!ie)
1587                return -ENOENT;
1588
1589        len = ie[1] + 2;
1590        end = skb->data + skb->len;
1591        next = ie + len;
1592
1593        if (WARN_ON(next > end))
1594                return -EINVAL;
1595
1596        memmove(ie, next, end - next);
1597        skb_trim(skb, skb->len - len);
1598
1599        return 0;
1600}
1601
1602static int ath10k_mac_setup_bcn_tmpl(struct ath10k_vif *arvif)
1603{
1604        struct ath10k *ar = arvif->ar;
1605        struct ieee80211_hw *hw = ar->hw;
1606        struct ieee80211_vif *vif = arvif->vif;
1607        struct ieee80211_mutable_offsets offs = {};
1608        struct sk_buff *bcn;
1609        int ret;
1610
1611        if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1612                return 0;
1613
1614        if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
1615            arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
1616                return 0;
1617
1618        bcn = ieee80211_beacon_get_template(hw, vif, &offs);
1619        if (!bcn) {
1620                ath10k_warn(ar, "failed to get beacon template from mac80211\n");
1621                return -EPERM;
1622        }
1623
1624        ret = ath10k_mac_setup_bcn_p2p_ie(arvif, bcn);
1625        if (ret) {
1626                ath10k_warn(ar, "failed to setup p2p go bcn ie: %d\n", ret);
1627                kfree_skb(bcn);
1628                return ret;
1629        }
1630
1631        /* P2P IE is inserted by firmware automatically (as configured above)
1632         * so remove it from the base beacon template to avoid duplicate P2P
1633         * IEs in beacon frames.
1634         */
1635        ath10k_mac_remove_vendor_ie(bcn, WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1636                                    offsetof(struct ieee80211_mgmt,
1637                                             u.beacon.variable));
1638
1639        ret = ath10k_wmi_bcn_tmpl(ar, arvif->vdev_id, offs.tim_offset, bcn, 0,
1640                                  0, NULL, 0);
1641        kfree_skb(bcn);
1642
1643        if (ret) {
1644                ath10k_warn(ar, "failed to submit beacon template command: %d\n",
1645                            ret);
1646                return ret;
1647        }
1648
1649        return 0;
1650}
1651
1652static int ath10k_mac_setup_prb_tmpl(struct ath10k_vif *arvif)
1653{
1654        struct ath10k *ar = arvif->ar;
1655        struct ieee80211_hw *hw = ar->hw;
1656        struct ieee80211_vif *vif = arvif->vif;
1657        struct sk_buff *prb;
1658        int ret;
1659
1660        if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1661                return 0;
1662
1663        if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1664                return 0;
1665
1666         /* For mesh, probe response and beacon share the same template */
1667        if (ieee80211_vif_is_mesh(vif))
1668                return 0;
1669
1670        prb = ieee80211_proberesp_get(hw, vif);
1671        if (!prb) {
1672                ath10k_warn(ar, "failed to get probe resp template from mac80211\n");
1673                return -EPERM;
1674        }
1675
1676        ret = ath10k_wmi_prb_tmpl(ar, arvif->vdev_id, prb);
1677        kfree_skb(prb);
1678
1679        if (ret) {
1680                ath10k_warn(ar, "failed to submit probe resp template command: %d\n",
1681                            ret);
1682                return ret;
1683        }
1684
1685        return 0;
1686}
1687
1688static int ath10k_mac_vif_fix_hidden_ssid(struct ath10k_vif *arvif)
1689{
1690        struct ath10k *ar = arvif->ar;
1691        struct cfg80211_chan_def def;
1692        int ret;
1693
1694        /* When originally vdev is started during assign_vif_chanctx() some
1695         * information is missing, notably SSID. Firmware revisions with beacon
1696         * offloading require the SSID to be provided during vdev (re)start to
1697         * handle hidden SSID properly.
1698         *
1699         * Vdev restart must be done after vdev has been both started and
1700         * upped. Otherwise some firmware revisions (at least 10.2) fail to
1701         * deliver vdev restart response event causing timeouts during vdev
1702         * syncing in ath10k.
1703         *
1704         * Note: The vdev down/up and template reinstallation could be skipped
1705         * since only wmi-tlv firmware are known to have beacon offload and
1706         * wmi-tlv doesn't seem to misbehave like 10.2 wrt vdev restart
1707         * response delivery. It's probably more robust to keep it as is.
1708         */
1709        if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1710                return 0;
1711
1712        if (WARN_ON(!arvif->is_started))
1713                return -EINVAL;
1714
1715        if (WARN_ON(!arvif->is_up))
1716                return -EINVAL;
1717
1718        if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def)))
1719                return -EINVAL;
1720
1721        ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1722        if (ret) {
1723                ath10k_warn(ar, "failed to bring down ap vdev %i: %d\n",
1724                            arvif->vdev_id, ret);
1725                return ret;
1726        }
1727
1728        /* Vdev down reset beacon & presp templates. Reinstall them. Otherwise
1729         * firmware will crash upon vdev up.
1730         */
1731
1732        ret = ath10k_mac_setup_bcn_tmpl(arvif);
1733        if (ret) {
1734                ath10k_warn(ar, "failed to update beacon template: %d\n", ret);
1735                return ret;
1736        }
1737
1738        ret = ath10k_mac_setup_prb_tmpl(arvif);
1739        if (ret) {
1740                ath10k_warn(ar, "failed to update presp template: %d\n", ret);
1741                return ret;
1742        }
1743
1744        ret = ath10k_vdev_restart(arvif, &def);
1745        if (ret) {
1746                ath10k_warn(ar, "failed to restart ap vdev %i: %d\n",
1747                            arvif->vdev_id, ret);
1748                return ret;
1749        }
1750
1751        ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1752                                 arvif->bssid);
1753        if (ret) {
1754                ath10k_warn(ar, "failed to bring up ap vdev %i: %d\n",
1755                            arvif->vdev_id, ret);
1756                return ret;
1757        }
1758
1759        return 0;
1760}
1761
1762static void ath10k_control_beaconing(struct ath10k_vif *arvif,
1763                                     struct ieee80211_bss_conf *info)
1764{
1765        struct ath10k *ar = arvif->ar;
1766        int ret = 0;
1767
1768        lockdep_assert_held(&arvif->ar->conf_mutex);
1769
1770        if (!info->enable_beacon) {
1771                ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1772                if (ret)
1773                        ath10k_warn(ar, "failed to down vdev_id %i: %d\n",
1774                                    arvif->vdev_id, ret);
1775
1776                arvif->is_up = false;
1777
1778                spin_lock_bh(&arvif->ar->data_lock);
1779                ath10k_mac_vif_beacon_free(arvif);
1780                spin_unlock_bh(&arvif->ar->data_lock);
1781
1782                return;
1783        }
1784
1785        arvif->tx_seq_no = 0x1000;
1786
1787        arvif->aid = 0;
1788        ether_addr_copy(arvif->bssid, info->bssid);
1789
1790        ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1791                                 arvif->bssid);
1792        if (ret) {
1793                ath10k_warn(ar, "failed to bring up vdev %d: %i\n",
1794                            arvif->vdev_id, ret);
1795                return;
1796        }
1797
1798        arvif->is_up = true;
1799
1800        ret = ath10k_mac_vif_fix_hidden_ssid(arvif);
1801        if (ret) {
1802                ath10k_warn(ar, "failed to fix hidden ssid for vdev %i, expect trouble: %d\n",
1803                            arvif->vdev_id, ret);
1804                return;
1805        }
1806
1807        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
1808}
1809
1810static void ath10k_control_ibss(struct ath10k_vif *arvif,
1811                                struct ieee80211_bss_conf *info,
1812                                const u8 self_peer[ETH_ALEN])
1813{
1814        struct ath10k *ar = arvif->ar;
1815        u32 vdev_param;
1816        int ret = 0;
1817
1818        lockdep_assert_held(&arvif->ar->conf_mutex);
1819
1820        if (!info->ibss_joined) {
1821                if (is_zero_ether_addr(arvif->bssid))
1822                        return;
1823
1824                eth_zero_addr(arvif->bssid);
1825
1826                return;
1827        }
1828
1829        vdev_param = arvif->ar->wmi.vdev_param->atim_window;
1830        ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param,
1831                                        ATH10K_DEFAULT_ATIM);
1832        if (ret)
1833                ath10k_warn(ar, "failed to set IBSS ATIM for vdev %d: %d\n",
1834                            arvif->vdev_id, ret);
1835}
1836
1837static int ath10k_mac_vif_recalc_ps_wake_threshold(struct ath10k_vif *arvif)
1838{
1839        struct ath10k *ar = arvif->ar;
1840        u32 param;
1841        u32 value;
1842        int ret;
1843
1844        lockdep_assert_held(&arvif->ar->conf_mutex);
1845
1846        if (arvif->u.sta.uapsd)
1847                value = WMI_STA_PS_TX_WAKE_THRESHOLD_NEVER;
1848        else
1849                value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
1850
1851        param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
1852        ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, value);
1853        if (ret) {
1854                ath10k_warn(ar, "failed to submit ps wake threshold %u on vdev %i: %d\n",
1855                            value, arvif->vdev_id, ret);
1856                return ret;
1857        }
1858
1859        return 0;
1860}
1861
1862static int ath10k_mac_vif_recalc_ps_poll_count(struct ath10k_vif *arvif)
1863{
1864        struct ath10k *ar = arvif->ar;
1865        u32 param;
1866        u32 value;
1867        int ret;
1868
1869        lockdep_assert_held(&arvif->ar->conf_mutex);
1870
1871        if (arvif->u.sta.uapsd)
1872                value = WMI_STA_PS_PSPOLL_COUNT_UAPSD;
1873        else
1874                value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
1875
1876        param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
1877        ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
1878                                          param, value);
1879        if (ret) {
1880                ath10k_warn(ar, "failed to submit ps poll count %u on vdev %i: %d\n",
1881                            value, arvif->vdev_id, ret);
1882                return ret;
1883        }
1884
1885        return 0;
1886}
1887
1888static int ath10k_mac_num_vifs_started(struct ath10k *ar)
1889{
1890        struct ath10k_vif *arvif;
1891        int num = 0;
1892
1893        lockdep_assert_held(&ar->conf_mutex);
1894
1895        list_for_each_entry(arvif, &ar->arvifs, list)
1896                if (arvif->is_started)
1897                        num++;
1898
1899        return num;
1900}
1901
1902static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif)
1903{
1904        struct ath10k *ar = arvif->ar;
1905        struct ieee80211_vif *vif = arvif->vif;
1906        struct ieee80211_conf *conf = &ar->hw->conf;
1907        enum wmi_sta_powersave_param param;
1908        enum wmi_sta_ps_mode psmode;
1909        int ret;
1910        int ps_timeout;
1911        bool enable_ps;
1912
1913        lockdep_assert_held(&arvif->ar->conf_mutex);
1914
1915        if (arvif->vif->type != NL80211_IFTYPE_STATION)
1916                return 0;
1917
1918        enable_ps = arvif->ps;
1919
1920        if (enable_ps && ath10k_mac_num_vifs_started(ar) > 1 &&
1921            !test_bit(ATH10K_FW_FEATURE_MULTI_VIF_PS_SUPPORT,
1922                      ar->running_fw->fw_file.fw_features)) {
1923                ath10k_warn(ar, "refusing to enable ps on vdev %i: not supported by fw\n",
1924                            arvif->vdev_id);
1925                enable_ps = false;
1926        }
1927
1928        if (!arvif->is_started) {
1929                /* mac80211 can update vif powersave state while disconnected.
1930                 * Firmware doesn't behave nicely and consumes more power than
1931                 * necessary if PS is disabled on a non-started vdev. Hence
1932                 * force-enable PS for non-running vdevs.
1933                 */
1934                psmode = WMI_STA_PS_MODE_ENABLED;
1935        } else if (enable_ps) {
1936                psmode = WMI_STA_PS_MODE_ENABLED;
1937                param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1938
1939                ps_timeout = conf->dynamic_ps_timeout;
1940                if (ps_timeout == 0) {
1941                        /* Firmware doesn't like 0 */
1942                        ps_timeout = ieee80211_tu_to_usec(
1943                                vif->bss_conf.beacon_int) / 1000;
1944                }
1945
1946                ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
1947                                                  ps_timeout);
1948                if (ret) {
1949                        ath10k_warn(ar, "failed to set inactivity time for vdev %d: %i\n",
1950                                    arvif->vdev_id, ret);
1951                        return ret;
1952                }
1953        } else {
1954                psmode = WMI_STA_PS_MODE_DISABLED;
1955        }
1956
1957        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d psmode %s\n",
1958                   arvif->vdev_id, psmode ? "enable" : "disable");
1959
1960        ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode);
1961        if (ret) {
1962                ath10k_warn(ar, "failed to set PS Mode %d for vdev %d: %d\n",
1963                            psmode, arvif->vdev_id, ret);
1964                return ret;
1965        }
1966
1967        return 0;
1968}
1969
1970static int ath10k_mac_vif_disable_keepalive(struct ath10k_vif *arvif)
1971{
1972        struct ath10k *ar = arvif->ar;
1973        struct wmi_sta_keepalive_arg arg = {};
1974        int ret;
1975
1976        lockdep_assert_held(&arvif->ar->conf_mutex);
1977
1978        if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
1979                return 0;
1980
1981        if (!test_bit(WMI_SERVICE_STA_KEEP_ALIVE, ar->wmi.svc_map))
1982                return 0;
1983
1984        /* Some firmware revisions have a bug and ignore the `enabled` field.
1985         * Instead use the interval to disable the keepalive.
1986         */
1987        arg.vdev_id = arvif->vdev_id;
1988        arg.enabled = 1;
1989        arg.method = WMI_STA_KEEPALIVE_METHOD_NULL_FRAME;
1990        arg.interval = WMI_STA_KEEPALIVE_INTERVAL_DISABLE;
1991
1992        ret = ath10k_wmi_sta_keepalive(ar, &arg);
1993        if (ret) {
1994                ath10k_warn(ar, "failed to submit keepalive on vdev %i: %d\n",
1995                            arvif->vdev_id, ret);
1996                return ret;
1997        }
1998
1999        return 0;
2000}
2001
2002static void ath10k_mac_vif_ap_csa_count_down(struct ath10k_vif *arvif)
2003{
2004        struct ath10k *ar = arvif->ar;
2005        struct ieee80211_vif *vif = arvif->vif;
2006        int ret;
2007
2008        lockdep_assert_held(&arvif->ar->conf_mutex);
2009
2010        if (WARN_ON(!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)))
2011                return;
2012
2013        if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
2014                return;
2015
2016        if (!vif->csa_active)
2017                return;
2018
2019        if (!arvif->is_up)
2020                return;
2021
2022        if (!ieee80211_beacon_cntdwn_is_complete(vif)) {
2023                ieee80211_beacon_update_cntdwn(vif);
2024
2025                ret = ath10k_mac_setup_bcn_tmpl(arvif);
2026                if (ret)
2027                        ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n",
2028                                    ret);
2029
2030                ret = ath10k_mac_setup_prb_tmpl(arvif);
2031                if (ret)
2032                        ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n",
2033                                    ret);
2034        } else {
2035                ieee80211_csa_finish(vif);
2036        }
2037}
2038
2039static void ath10k_mac_vif_ap_csa_work(struct work_struct *work)
2040{
2041        struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
2042                                                ap_csa_work);
2043        struct ath10k *ar = arvif->ar;
2044
2045        mutex_lock(&ar->conf_mutex);
2046        ath10k_mac_vif_ap_csa_count_down(arvif);
2047        mutex_unlock(&ar->conf_mutex);
2048}
2049
2050static void ath10k_mac_handle_beacon_iter(void *data, u8 *mac,
2051                                          struct ieee80211_vif *vif)
2052{
2053        struct sk_buff *skb = data;
2054        struct ieee80211_mgmt *mgmt = (void *)skb->data;
2055        struct ath10k_vif *arvif = (void *)vif->drv_priv;
2056
2057        if (vif->type != NL80211_IFTYPE_STATION)
2058                return;
2059
2060        if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid))
2061                return;
2062
2063        cancel_delayed_work(&arvif->connection_loss_work);
2064}
2065
2066void ath10k_mac_handle_beacon(struct ath10k *ar, struct sk_buff *skb)
2067{
2068        ieee80211_iterate_active_interfaces_atomic(ar->hw,
2069                                                   ATH10K_ITER_NORMAL_FLAGS,
2070                                                   ath10k_mac_handle_beacon_iter,
2071                                                   skb);
2072}
2073
2074static void ath10k_mac_handle_beacon_miss_iter(void *data, u8 *mac,
2075                                               struct ieee80211_vif *vif)
2076{
2077        u32 *vdev_id = data;
2078        struct ath10k_vif *arvif = (void *)vif->drv_priv;
2079        struct ath10k *ar = arvif->ar;
2080        struct ieee80211_hw *hw = ar->hw;
2081
2082        if (arvif->vdev_id != *vdev_id)
2083                return;
2084
2085        if (!arvif->is_up)
2086                return;
2087
2088        ieee80211_beacon_loss(vif);
2089
2090        /* Firmware doesn't report beacon loss events repeatedly. If AP probe
2091         * (done by mac80211) succeeds but beacons do not resume then it
2092         * doesn't make sense to continue operation. Queue connection loss work
2093         * which can be cancelled when beacon is received.
2094         */
2095        ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work,
2096                                     ATH10K_CONNECTION_LOSS_HZ);
2097}
2098
2099void ath10k_mac_handle_beacon_miss(struct ath10k *ar, u32 vdev_id)
2100{
2101        ieee80211_iterate_active_interfaces_atomic(ar->hw,
2102                                                   ATH10K_ITER_NORMAL_FLAGS,
2103                                                   ath10k_mac_handle_beacon_miss_iter,
2104                                                   &vdev_id);
2105}
2106
2107static void ath10k_mac_vif_sta_connection_loss_work(struct work_struct *work)
2108{
2109        struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
2110                                                connection_loss_work.work);
2111        struct ieee80211_vif *vif = arvif->vif;
2112
2113        if (!arvif->is_up)
2114                return;
2115
2116        ieee80211_connection_loss(vif);
2117}
2118
2119/**********************/
2120/* Station management */
2121/**********************/
2122
2123static u32 ath10k_peer_assoc_h_listen_intval(struct ath10k *ar,
2124                                             struct ieee80211_vif *vif)
2125{
2126        /* Some firmware revisions have unstable STA powersave when listen
2127         * interval is set too high (e.g. 5). The symptoms are firmware doesn't
2128         * generate NullFunc frames properly even if buffered frames have been
2129         * indicated in Beacon TIM. Firmware would seldom wake up to pull
2130         * buffered frames. Often pinging the device from AP would simply fail.
2131         *
2132         * As a workaround set it to 1.
2133         */
2134        if (vif->type == NL80211_IFTYPE_STATION)
2135                return 1;
2136
2137        return ar->hw->conf.listen_interval;
2138}
2139
2140static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
2141                                      struct ieee80211_vif *vif,
2142                                      struct ieee80211_sta *sta,
2143                                      struct wmi_peer_assoc_complete_arg *arg)
2144{
2145        struct ath10k_vif *arvif = (void *)vif->drv_priv;
2146        u32 aid;
2147
2148        lockdep_assert_held(&ar->conf_mutex);
2149
2150        if (vif->type == NL80211_IFTYPE_STATION)
2151                aid = vif->bss_conf.aid;
2152        else
2153                aid = sta->aid;
2154
2155        ether_addr_copy(arg->addr, sta->addr);
2156        arg->vdev_id = arvif->vdev_id;
2157        arg->peer_aid = aid;
2158        arg->peer_flags |= arvif->ar->wmi.peer_flags->auth;
2159        arg->peer_listen_intval = ath10k_peer_assoc_h_listen_intval(ar, vif);
2160        arg->peer_num_spatial_streams = 1;
2161        arg->peer_caps = vif->bss_conf.assoc_capability;
2162}
2163
2164static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
2165                                       struct ieee80211_vif *vif,
2166                                       struct ieee80211_sta *sta,
2167                                       struct wmi_peer_assoc_complete_arg *arg)
2168{
2169        struct ieee80211_bss_conf *info = &vif->bss_conf;
2170        struct cfg80211_chan_def def;
2171        struct cfg80211_bss *bss;
2172        const u8 *rsnie = NULL;
2173        const u8 *wpaie = NULL;
2174
2175        lockdep_assert_held(&ar->conf_mutex);
2176
2177        if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2178                return;
2179
2180        bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0,
2181                               IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
2182        if (bss) {
2183                const struct cfg80211_bss_ies *ies;
2184
2185                rcu_read_lock();
2186                rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
2187
2188                ies = rcu_dereference(bss->ies);
2189
2190                wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
2191                                                WLAN_OUI_TYPE_MICROSOFT_WPA,
2192                                                ies->data,
2193                                                ies->len);
2194                rcu_read_unlock();
2195                cfg80211_put_bss(ar->hw->wiphy, bss);
2196        }
2197
2198        /* FIXME: base on RSN IE/WPA IE is a correct idea? */
2199        if (rsnie || wpaie) {
2200                ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__);
2201                arg->peer_flags |= ar->wmi.peer_flags->need_ptk_4_way;
2202        }
2203
2204        if (wpaie) {
2205                ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__);
2206                arg->peer_flags |= ar->wmi.peer_flags->need_gtk_2_way;
2207        }
2208
2209        if (sta->mfp &&
2210            test_bit(ATH10K_FW_FEATURE_MFP_SUPPORT,
2211                     ar->running_fw->fw_file.fw_features)) {
2212                arg->peer_flags |= ar->wmi.peer_flags->pmf;
2213        }
2214}
2215
2216static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
2217                                      struct ieee80211_vif *vif,
2218                                      struct ieee80211_sta *sta,
2219                                      struct wmi_peer_assoc_complete_arg *arg)
2220{
2221        struct ath10k_vif *arvif = (void *)vif->drv_priv;
2222        struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
2223        struct cfg80211_chan_def def;
2224        const struct ieee80211_supported_band *sband;
2225        const struct ieee80211_rate *rates;
2226        enum nl80211_band band;
2227        u32 ratemask;
2228        u8 rate;
2229        int i;
2230
2231        lockdep_assert_held(&ar->conf_mutex);
2232
2233        if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2234                return;
2235
2236        band = def.chan->band;
2237        sband = ar->hw->wiphy->bands[band];
2238        ratemask = sta->supp_rates[band];
2239        ratemask &= arvif->bitrate_mask.control[band].legacy;
2240        rates = sband->bitrates;
2241
2242        rateset->num_rates = 0;
2243
2244        for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
2245                if (!(ratemask & 1))
2246                        continue;
2247
2248                rate = ath10k_mac_bitrate_to_rate(rates->bitrate);
2249                rateset->rates[rateset->num_rates] = rate;
2250                rateset->num_rates++;
2251        }
2252}
2253
2254static bool
2255ath10k_peer_assoc_h_ht_masked(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
2256{
2257        int nss;
2258
2259        for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++)
2260                if (ht_mcs_mask[nss])
2261                        return false;
2262
2263        return true;
2264}
2265
2266static bool
2267ath10k_peer_assoc_h_vht_masked(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
2268{
2269        int nss;
2270
2271        for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++)
2272                if (vht_mcs_mask[nss])
2273                        return false;
2274
2275        return true;
2276}
2277
2278static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
2279                                   struct ieee80211_vif *vif,
2280                                   struct ieee80211_sta *sta,
2281                                   struct wmi_peer_assoc_complete_arg *arg)
2282{
2283        const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
2284        struct ath10k_vif *arvif = (void *)vif->drv_priv;
2285        struct cfg80211_chan_def def;
2286        enum nl80211_band band;
2287        const u8 *ht_mcs_mask;
2288        const u16 *vht_mcs_mask;
2289        int i, n;
2290        u8 max_nss;
2291        u32 stbc;
2292
2293        lockdep_assert_held(&ar->conf_mutex);
2294
2295        if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2296                return;
2297
2298        if (!ht_cap->ht_supported)
2299                return;
2300
2301        band = def.chan->band;
2302        ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2303        vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2304
2305        if (ath10k_peer_assoc_h_ht_masked(ht_mcs_mask) &&
2306            ath10k_peer_assoc_h_vht_masked(vht_mcs_mask))
2307                return;
2308
2309        arg->peer_flags |= ar->wmi.peer_flags->ht;
2310        arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2311                                    ht_cap->ampdu_factor)) - 1;
2312
2313        arg->peer_mpdu_density =
2314                ath10k_parse_mpdudensity(ht_cap->ampdu_density);
2315
2316        arg->peer_ht_caps = ht_cap->cap;
2317        arg->peer_rate_caps |= WMI_RC_HT_FLAG;
2318
2319        if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
2320                arg->peer_flags |= ar->wmi.peer_flags->ldbc;
2321
2322        if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
2323                arg->peer_flags |= ar->wmi.peer_flags->bw40;
2324                arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
2325        }
2326
2327        if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) {
2328                if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20)
2329                        arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
2330
2331                if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40)
2332                        arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
2333        }
2334
2335        if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
2336                arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG;
2337                arg->peer_flags |= ar->wmi.peer_flags->stbc;
2338        }
2339
2340        if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
2341                stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
2342                stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
2343                stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
2344                arg->peer_rate_caps |= stbc;
2345                arg->peer_flags |= ar->wmi.peer_flags->stbc;
2346        }
2347
2348        if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
2349                arg->peer_rate_caps |= WMI_RC_TS_FLAG;
2350        else if (ht_cap->mcs.rx_mask[1])
2351                arg->peer_rate_caps |= WMI_RC_DS_FLAG;
2352
2353        for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
2354                if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
2355                    (ht_mcs_mask[i / 8] & BIT(i % 8))) {
2356                        max_nss = (i / 8) + 1;
2357                        arg->peer_ht_rates.rates[n++] = i;
2358                }
2359
2360        /*
2361         * This is a workaround for HT-enabled STAs which break the spec
2362         * and have no HT capabilities RX mask (no HT RX MCS map).
2363         *
2364         * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
2365         * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
2366         *
2367         * Firmware asserts if such situation occurs.
2368         */
2369        if (n == 0) {
2370                arg->peer_ht_rates.num_rates = 8;
2371                for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
2372                        arg->peer_ht_rates.rates[i] = i;
2373        } else {
2374                arg->peer_ht_rates.num_rates = n;
2375                arg->peer_num_spatial_streams = min(sta->rx_nss, max_nss);
2376        }
2377
2378        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
2379                   arg->addr,
2380                   arg->peer_ht_rates.num_rates,
2381                   arg->peer_num_spatial_streams);
2382}
2383
2384static int ath10k_peer_assoc_qos_ap(struct ath10k *ar,
2385                                    struct ath10k_vif *arvif,
2386                                    struct ieee80211_sta *sta)
2387{
2388        u32 uapsd = 0;
2389        u32 max_sp = 0;
2390        int ret = 0;
2391
2392        lockdep_assert_held(&ar->conf_mutex);
2393
2394        if (sta->wme && sta->uapsd_queues) {
2395                ath10k_dbg(ar, ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
2396                           sta->uapsd_queues, sta->max_sp);
2397
2398                if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
2399                        uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
2400                                 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
2401                if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
2402                        uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
2403                                 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
2404                if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
2405                        uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
2406                                 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
2407                if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
2408                        uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
2409                                 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
2410
2411                if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
2412                        max_sp = sta->max_sp;
2413
2414                ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
2415                                                 sta->addr,
2416                                                 WMI_AP_PS_PEER_PARAM_UAPSD,
2417                                                 uapsd);
2418                if (ret) {
2419                        ath10k_warn(ar, "failed to set ap ps peer param uapsd for vdev %i: %d\n",
2420                                    arvif->vdev_id, ret);
2421                        return ret;
2422                }
2423
2424                ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
2425                                                 sta->addr,
2426                                                 WMI_AP_PS_PEER_PARAM_MAX_SP,
2427                                                 max_sp);
2428                if (ret) {
2429                        ath10k_warn(ar, "failed to set ap ps peer param max sp for vdev %i: %d\n",
2430                                    arvif->vdev_id, ret);
2431                        return ret;
2432                }
2433
2434                /* TODO setup this based on STA listen interval and
2435                 * beacon interval. Currently we don't know
2436                 * sta->listen_interval - mac80211 patch required.
2437                 * Currently use 10 seconds
2438                 */
2439                ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr,
2440                                                 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME,
2441                                                 10);
2442                if (ret) {
2443                        ath10k_warn(ar, "failed to set ap ps peer param ageout time for vdev %i: %d\n",
2444                                    arvif->vdev_id, ret);
2445                        return ret;
2446                }
2447        }
2448
2449        return 0;
2450}
2451
2452static u16
2453ath10k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
2454                              const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
2455{
2456        int idx_limit;
2457        int nss;
2458        u16 mcs_map;
2459        u16 mcs;
2460
2461        for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
2462                mcs_map = ath10k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
2463                          vht_mcs_limit[nss];
2464
2465                if (mcs_map)
2466                        idx_limit = fls(mcs_map) - 1;
2467                else
2468                        idx_limit = -1;
2469
2470                switch (idx_limit) {
2471                case 0:
2472                case 1:
2473                case 2:
2474                case 3:
2475                case 4:
2476                case 5:
2477                case 6:
2478                default:
2479                        /* see ath10k_mac_can_set_bitrate_mask() */
2480                        WARN_ON(1);
2481                        fallthrough;
2482                case -1:
2483                        mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
2484                        break;
2485                case 7:
2486                        mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
2487                        break;
2488                case 8:
2489                        mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
2490                        break;
2491                case 9:
2492                        mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
2493                        break;
2494                }
2495
2496                tx_mcs_set &= ~(0x3 << (nss * 2));
2497                tx_mcs_set |= mcs << (nss * 2);
2498        }
2499
2500        return tx_mcs_set;
2501}
2502
2503static u32 get_160mhz_nss_from_maxrate(int rate)
2504{
2505        u32 nss;
2506
2507        switch (rate) {
2508        case 780:
2509                nss = 1;
2510                break;
2511        case 1560:
2512                nss = 2;
2513                break;
2514        case 2106:
2515                nss = 3; /* not support MCS9 from spec*/
2516                break;
2517        case 3120:
2518                nss = 4;
2519                break;
2520        default:
2521                 nss = 1;
2522        }
2523
2524        return nss;
2525}
2526
2527static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
2528                                    struct ieee80211_vif *vif,
2529                                    struct ieee80211_sta *sta,
2530                                    struct wmi_peer_assoc_complete_arg *arg)
2531{
2532        const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
2533        struct ath10k_vif *arvif = (void *)vif->drv_priv;
2534        struct ath10k_hw_params *hw = &ar->hw_params;
2535        struct cfg80211_chan_def def;
2536        enum nl80211_band band;
2537        const u16 *vht_mcs_mask;
2538        u8 ampdu_factor;
2539        u8 max_nss, vht_mcs;
2540        int i;
2541
2542        if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2543                return;
2544
2545        if (!vht_cap->vht_supported)
2546                return;
2547
2548        band = def.chan->band;
2549        vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2550
2551        if (ath10k_peer_assoc_h_vht_masked(vht_mcs_mask))
2552                return;
2553
2554        arg->peer_flags |= ar->wmi.peer_flags->vht;
2555
2556        if (def.chan->band == NL80211_BAND_2GHZ)
2557                arg->peer_flags |= ar->wmi.peer_flags->vht_2g;
2558
2559        arg->peer_vht_caps = vht_cap->cap;
2560
2561        ampdu_factor = (vht_cap->cap &
2562                        IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
2563                       IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
2564
2565        /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
2566         * zero in VHT IE. Using it would result in degraded throughput.
2567         * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
2568         * it if VHT max_mpdu is smaller.
2569         */
2570        arg->peer_max_mpdu = max(arg->peer_max_mpdu,
2571                                 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2572                                        ampdu_factor)) - 1);
2573
2574        if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2575                arg->peer_flags |= ar->wmi.peer_flags->bw80;
2576
2577        if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
2578                arg->peer_flags |= ar->wmi.peer_flags->bw160;
2579
2580        /* Calculate peer NSS capability from VHT capabilities if STA
2581         * supports VHT.
2582         */
2583        for (i = 0, max_nss = 0, vht_mcs = 0; i < NL80211_VHT_NSS_MAX; i++) {
2584                vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >>
2585                          (2 * i) & 3;
2586
2587                if ((vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED) &&
2588                    vht_mcs_mask[i])
2589                        max_nss = i + 1;
2590        }
2591        arg->peer_num_spatial_streams = min(sta->rx_nss, max_nss);
2592        arg->peer_vht_rates.rx_max_rate =
2593                __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
2594        arg->peer_vht_rates.rx_mcs_set =
2595                __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
2596        arg->peer_vht_rates.tx_max_rate =
2597                __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
2598        arg->peer_vht_rates.tx_mcs_set = ath10k_peer_assoc_h_vht_limit(
2599                __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map), vht_mcs_mask);
2600
2601        /* Configure bandwidth-NSS mapping to FW
2602         * for the chip's tx chains setting on 160Mhz bw
2603         */
2604        if (arg->peer_phymode == MODE_11AC_VHT160 ||
2605            arg->peer_phymode == MODE_11AC_VHT80_80) {
2606                u32 rx_nss;
2607                u32 max_rate;
2608
2609                max_rate = arg->peer_vht_rates.rx_max_rate;
2610                rx_nss = get_160mhz_nss_from_maxrate(max_rate);
2611
2612                if (rx_nss == 0)
2613                        rx_nss = arg->peer_num_spatial_streams;
2614                else
2615                        rx_nss = min(arg->peer_num_spatial_streams, rx_nss);
2616
2617                max_rate = hw->vht160_mcs_tx_highest;
2618                rx_nss = min(rx_nss, get_160mhz_nss_from_maxrate(max_rate));
2619
2620                arg->peer_bw_rxnss_override =
2621                        FIELD_PREP(WMI_PEER_NSS_MAP_ENABLE, 1) |
2622                        FIELD_PREP(WMI_PEER_NSS_160MHZ_MASK, (rx_nss - 1));
2623
2624                if (arg->peer_phymode == MODE_11AC_VHT80_80) {
2625                        arg->peer_bw_rxnss_override |=
2626                        FIELD_PREP(WMI_PEER_NSS_80_80MHZ_MASK, (rx_nss - 1));
2627                }
2628        }
2629        ath10k_dbg(ar, ATH10K_DBG_MAC,
2630                   "mac vht peer %pM max_mpdu %d flags 0x%x peer_rx_nss_override 0x%x\n",
2631                   sta->addr, arg->peer_max_mpdu,
2632                   arg->peer_flags, arg->peer_bw_rxnss_override);
2633}
2634
2635static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
2636                                    struct ieee80211_vif *vif,
2637                                    struct ieee80211_sta *sta,
2638                                    struct wmi_peer_assoc_complete_arg *arg)
2639{
2640        struct ath10k_vif *arvif = (void *)vif->drv_priv;
2641
2642        switch (arvif->vdev_type) {
2643        case WMI_VDEV_TYPE_AP:
2644                if (sta->wme)
2645                        arg->peer_flags |= arvif->ar->wmi.peer_flags->qos;
2646
2647                if (sta->wme && sta->uapsd_queues) {
2648                        arg->peer_flags |= arvif->ar->wmi.peer_flags->apsd;
2649                        arg->peer_rate_caps |= WMI_RC_UAPSD_FLAG;
2650                }
2651                break;
2652        case WMI_VDEV_TYPE_STA:
2653                if (sta->wme)
2654                        arg->peer_flags |= arvif->ar->wmi.peer_flags->qos;
2655                break;
2656        case WMI_VDEV_TYPE_IBSS:
2657                if (sta->wme)
2658                        arg->peer_flags |= arvif->ar->wmi.peer_flags->qos;
2659                break;
2660        default:
2661                break;
2662        }
2663
2664        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM qos %d\n",
2665                   sta->addr, !!(arg->peer_flags &
2666                   arvif->ar->wmi.peer_flags->qos));
2667}
2668
2669static bool ath10k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
2670{
2671        return sta->supp_rates[NL80211_BAND_2GHZ] >>
2672               ATH10K_MAC_FIRST_OFDM_RATE_IDX;
2673}
2674
2675static enum wmi_phy_mode ath10k_mac_get_phymode_vht(struct ath10k *ar,
2676                                                    struct ieee80211_sta *sta)
2677{
2678        if (sta->bandwidth == IEEE80211_STA_RX_BW_160) {
2679                switch (sta->vht_cap.cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
2680                case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ:
2681                        return MODE_11AC_VHT160;
2682                case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ:
2683                        return MODE_11AC_VHT80_80;
2684                default:
2685                        /* not sure if this is a valid case? */
2686                        return MODE_11AC_VHT160;
2687                }
2688        }
2689
2690        if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2691                return MODE_11AC_VHT80;
2692
2693        if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2694                return MODE_11AC_VHT40;
2695
2696        if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
2697                return MODE_11AC_VHT20;
2698
2699        return MODE_UNKNOWN;
2700}
2701
2702static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
2703                                        struct ieee80211_vif *vif,
2704                                        struct ieee80211_sta *sta,
2705                                        struct wmi_peer_assoc_complete_arg *arg)
2706{
2707        struct ath10k_vif *arvif = (void *)vif->drv_priv;
2708        struct cfg80211_chan_def def;
2709        enum nl80211_band band;
2710        const u8 *ht_mcs_mask;
2711        const u16 *vht_mcs_mask;
2712        enum wmi_phy_mode phymode = MODE_UNKNOWN;
2713
2714        if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2715                return;
2716
2717        band = def.chan->band;
2718        ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2719        vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2720
2721        switch (band) {
2722        case NL80211_BAND_2GHZ:
2723                if (sta->vht_cap.vht_supported &&
2724                    !ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2725                        if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2726                                phymode = MODE_11AC_VHT40;
2727                        else
2728                                phymode = MODE_11AC_VHT20;
2729                } else if (sta->ht_cap.ht_supported &&
2730                           !ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2731                        if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2732                                phymode = MODE_11NG_HT40;
2733                        else
2734                                phymode = MODE_11NG_HT20;
2735                } else if (ath10k_mac_sta_has_ofdm_only(sta)) {
2736                        phymode = MODE_11G;
2737                } else {
2738                        phymode = MODE_11B;
2739                }
2740
2741                break;
2742        case NL80211_BAND_5GHZ:
2743                /*
2744                 * Check VHT first.
2745                 */
2746                if (sta->vht_cap.vht_supported &&
2747                    !ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2748                        phymode = ath10k_mac_get_phymode_vht(ar, sta);
2749                } else if (sta->ht_cap.ht_supported &&
2750                           !ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2751                        if (sta->bandwidth >= IEEE80211_STA_RX_BW_40)
2752                                phymode = MODE_11NA_HT40;
2753                        else
2754                                phymode = MODE_11NA_HT20;
2755                } else {
2756                        phymode = MODE_11A;
2757                }
2758
2759                break;
2760        default:
2761                break;
2762        }
2763
2764        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM phymode %s\n",
2765                   sta->addr, ath10k_wmi_phymode_str(phymode));
2766
2767        arg->peer_phymode = phymode;
2768        WARN_ON(phymode == MODE_UNKNOWN);
2769}
2770
2771static int ath10k_peer_assoc_prepare(struct ath10k *ar,
2772                                     struct ieee80211_vif *vif,
2773                                     struct ieee80211_sta *sta,
2774                                     struct wmi_peer_assoc_complete_arg *arg)
2775{
2776        lockdep_assert_held(&ar->conf_mutex);
2777
2778        memset(arg, 0, sizeof(*arg));
2779
2780        ath10k_peer_assoc_h_basic(ar, vif, sta, arg);
2781        ath10k_peer_assoc_h_crypto(ar, vif, sta, arg);
2782        ath10k_peer_assoc_h_rates(ar, vif, sta, arg);
2783        ath10k_peer_assoc_h_ht(ar, vif, sta, arg);
2784        ath10k_peer_assoc_h_phymode(ar, vif, sta, arg);
2785        ath10k_peer_assoc_h_vht(ar, vif, sta, arg);
2786        ath10k_peer_assoc_h_qos(ar, vif, sta, arg);
2787
2788        return 0;
2789}
2790
2791static const u32 ath10k_smps_map[] = {
2792        [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
2793        [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
2794        [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
2795        [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
2796};
2797
2798static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif,
2799                                  const u8 *addr,
2800                                  const struct ieee80211_sta_ht_cap *ht_cap)
2801{
2802        int smps;
2803
2804        if (!ht_cap->ht_supported)
2805                return 0;
2806
2807        smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2808        smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2809
2810        if (smps >= ARRAY_SIZE(ath10k_smps_map))
2811                return -EINVAL;
2812
2813        return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr,
2814                                         ar->wmi.peer_param->smps_state,
2815                                         ath10k_smps_map[smps]);
2816}
2817
2818static int ath10k_mac_vif_recalc_txbf(struct ath10k *ar,
2819                                      struct ieee80211_vif *vif,
2820                                      struct ieee80211_sta_vht_cap vht_cap)
2821{
2822        struct ath10k_vif *arvif = (void *)vif->drv_priv;
2823        int ret;
2824        u32 param;
2825        u32 value;
2826
2827        if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_AFTER_ASSOC)
2828                return 0;
2829
2830        if (!(ar->vht_cap_info &
2831              (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
2832               IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE |
2833               IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
2834               IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)))
2835                return 0;
2836
2837        param = ar->wmi.vdev_param->txbf;
2838        value = 0;
2839
2840        if (WARN_ON(param == WMI_VDEV_PARAM_UNSUPPORTED))
2841                return 0;
2842
2843        /* The following logic is correct. If a remote STA advertises support
2844         * for being a beamformer then we should enable us being a beamformee.
2845         */
2846
2847        if (ar->vht_cap_info &
2848            (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
2849             IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
2850                if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)
2851                        value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
2852
2853                if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)
2854                        value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
2855        }
2856
2857        if (ar->vht_cap_info &
2858            (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
2859             IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
2860                if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)
2861                        value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
2862
2863                if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)
2864                        value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
2865        }
2866
2867        if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFEE)
2868                value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
2869
2870        if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFER)
2871                value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
2872
2873        ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, value);
2874        if (ret) {
2875                ath10k_warn(ar, "failed to submit vdev param txbf 0x%x: %d\n",
2876                            value, ret);
2877                return ret;
2878        }
2879
2880        return 0;
2881}
2882
2883/* can be called only in mac80211 callbacks due to `key_count` usage */
2884static void ath10k_bss_assoc(struct ieee80211_hw *hw,
2885                             struct ieee80211_vif *vif,
2886                             struct ieee80211_bss_conf *bss_conf)
2887{
2888        struct ath10k *ar = hw->priv;
2889        struct ath10k_vif *arvif = (void *)vif->drv_priv;
2890        struct ieee80211_sta_ht_cap ht_cap;
2891        struct ieee80211_sta_vht_cap vht_cap;
2892        struct wmi_peer_assoc_complete_arg peer_arg;
2893        struct ieee80211_sta *ap_sta;
2894        int ret;
2895
2896        lockdep_assert_held(&ar->conf_mutex);
2897
2898        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n",
2899                   arvif->vdev_id, arvif->bssid, arvif->aid);
2900
2901        rcu_read_lock();
2902
2903        ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
2904        if (!ap_sta) {
2905                ath10k_warn(ar, "failed to find station entry for bss %pM vdev %i\n",
2906                            bss_conf->bssid, arvif->vdev_id);
2907                rcu_read_unlock();
2908                return;
2909        }
2910
2911        /* ap_sta must be accessed only within rcu section which must be left
2912         * before calling ath10k_setup_peer_smps() which might sleep.
2913         */
2914        ht_cap = ap_sta->ht_cap;
2915        vht_cap = ap_sta->vht_cap;
2916
2917        ret = ath10k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg);
2918        if (ret) {
2919                ath10k_warn(ar, "failed to prepare peer assoc for %pM vdev %i: %d\n",
2920                            bss_conf->bssid, arvif->vdev_id, ret);
2921                rcu_read_unlock();
2922                return;
2923        }
2924
2925        rcu_read_unlock();
2926
2927        ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
2928        if (ret) {
2929                ath10k_warn(ar, "failed to run peer assoc for %pM vdev %i: %d\n",
2930                            bss_conf->bssid, arvif->vdev_id, ret);
2931                return;
2932        }
2933
2934        ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap);
2935        if (ret) {
2936                ath10k_warn(ar, "failed to setup peer SMPS for vdev %i: %d\n",
2937                            arvif->vdev_id, ret);
2938                return;
2939        }
2940
2941        ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
2942        if (ret) {
2943                ath10k_warn(ar, "failed to recalc txbf for vdev %i on bss %pM: %d\n",
2944                            arvif->vdev_id, bss_conf->bssid, ret);
2945                return;
2946        }
2947
2948        ath10k_dbg(ar, ATH10K_DBG_MAC,
2949                   "mac vdev %d up (associated) bssid %pM aid %d\n",
2950                   arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
2951
2952        WARN_ON(arvif->is_up);
2953
2954        arvif->aid = bss_conf->aid;
2955        ether_addr_copy(arvif->bssid, bss_conf->bssid);
2956
2957        ret = ath10k_wmi_pdev_set_param(ar,
2958                                        ar->wmi.pdev_param->peer_stats_info_enable, 1);
2959        if (ret)
2960                ath10k_warn(ar, "failed to enable peer stats info: %d\n", ret);
2961
2962        ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
2963        if (ret) {
2964                ath10k_warn(ar, "failed to set vdev %d up: %d\n",
2965                            arvif->vdev_id, ret);
2966                return;
2967        }
2968
2969        arvif->is_up = true;
2970
2971        /* Workaround: Some firmware revisions (tested with qca6174
2972         * WLAN.RM.2.0-00073) have buggy powersave state machine and must be
2973         * poked with peer param command.
2974         */
2975        ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, arvif->bssid,
2976                                        ar->wmi.peer_param->dummy_var, 1);
2977        if (ret) {
2978                ath10k_warn(ar, "failed to poke peer %pM param for ps workaround on vdev %i: %d\n",
2979                            arvif->bssid, arvif->vdev_id, ret);
2980                return;
2981        }
2982}
2983
2984static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
2985                                struct ieee80211_vif *vif)
2986{
2987        struct ath10k *ar = hw->priv;
2988        struct ath10k_vif *arvif = (void *)vif->drv_priv;
2989        struct ieee80211_sta_vht_cap vht_cap = {};
2990        int ret;
2991
2992        lockdep_assert_held(&ar->conf_mutex);
2993
2994        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
2995                   arvif->vdev_id, arvif->bssid);
2996
2997        ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
2998        if (ret)
2999                ath10k_warn(ar, "failed to down vdev %i: %d\n",
3000                            arvif->vdev_id, ret);
3001
3002        arvif->def_wep_key_idx = -1;
3003
3004        ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
3005        if (ret) {
3006                ath10k_warn(ar, "failed to recalc txbf for vdev %i: %d\n",
3007                            arvif->vdev_id, ret);
3008                return;
3009        }
3010
3011        arvif->is_up = false;
3012
3013        cancel_delayed_work_sync(&arvif->connection_loss_work);
3014}
3015
3016static int ath10k_new_peer_tid_config(struct ath10k *ar,
3017                                      struct ieee80211_sta *sta,
3018                                      struct ath10k_vif *arvif)
3019{
3020        struct wmi_per_peer_per_tid_cfg_arg arg = {};
3021        struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
3022        bool config_apply;
3023        int ret, i;
3024
3025        for (i = 0; i < ATH10K_TID_MAX; i++) {
3026                config_apply = false;
3027                if (arvif->retry_long[i] || arvif->ampdu[i] ||
3028                    arvif->rate_ctrl[i] || arvif->rtscts[i]) {
3029                        config_apply = true;
3030                        arg.tid = i;
3031                        arg.vdev_id = arvif->vdev_id;
3032                        arg.retry_count = arvif->retry_long[i];
3033                        arg.aggr_control = arvif->ampdu[i];
3034                        arg.rate_ctrl = arvif->rate_ctrl[i];
3035                        arg.rcode_flags = arvif->rate_code[i];
3036
3037                        if (arvif->rtscts[i])
3038                                arg.ext_tid_cfg_bitmap =
3039                                        WMI_EXT_TID_RTS_CTS_CONFIG;
3040                        else
3041                                arg.ext_tid_cfg_bitmap = 0;
3042
3043                        arg.rtscts_ctrl = arvif->rtscts[i];
3044                }
3045
3046                if (arvif->noack[i]) {
3047                        arg.ack_policy = arvif->noack[i];
3048                        arg.rate_ctrl = WMI_TID_CONFIG_RATE_CONTROL_DEFAULT_LOWEST_RATE;
3049                        arg.aggr_control = WMI_TID_CONFIG_AGGR_CONTROL_DISABLE;
3050                        config_apply = true;
3051                }
3052
3053                /* Assign default value(-1) to newly connected station.
3054                 * This is to identify station specific tid configuration not
3055                 * configured for the station.
3056                 */
3057                arsta->retry_long[i] = -1;
3058                arsta->noack[i] = -1;
3059                arsta->ampdu[i] = -1;
3060
3061                if (!config_apply)
3062                        continue;
3063
3064                ether_addr_copy(arg.peer_macaddr.addr, sta->addr);
3065
3066                ret = ath10k_wmi_set_per_peer_per_tid_cfg(ar, &arg);
3067                if (ret) {
3068                        ath10k_warn(ar, "failed to set per tid retry/aggr config for sta %pM: %d\n",
3069                                    sta->addr, ret);
3070                        return ret;
3071                }
3072
3073                memset(&arg, 0, sizeof(arg));
3074        }
3075
3076        return 0;
3077}
3078
3079static int ath10k_station_assoc(struct ath10k *ar,
3080                                struct ieee80211_vif *vif,
3081                                struct ieee80211_sta *sta,
3082                                bool reassoc)
3083{
3084        struct ath10k_vif *arvif = (void *)vif->drv_priv;
3085        struct wmi_peer_assoc_complete_arg peer_arg;
3086        int ret = 0;
3087
3088        lockdep_assert_held(&ar->conf_mutex);
3089
3090        ret = ath10k_peer_assoc_prepare(ar, vif, sta, &peer_arg);
3091        if (ret) {
3092                ath10k_warn(ar, "failed to prepare WMI peer assoc for %pM vdev %i: %i\n",
3093                            sta->addr, arvif->vdev_id, ret);
3094                return ret;
3095        }
3096
3097        ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
3098        if (ret) {
3099                ath10k_warn(ar, "failed to run peer assoc for STA %pM vdev %i: %d\n",
3100                            sta->addr, arvif->vdev_id, ret);
3101                return ret;
3102        }
3103
3104        /* Re-assoc is run only to update supported rates for given station. It
3105         * doesn't make much sense to reconfigure the peer completely.
3106         */
3107        if (!reassoc) {
3108                ret = ath10k_setup_peer_smps(ar, arvif, sta->addr,
3109                                             &sta->ht_cap);
3110                if (ret) {
3111                        ath10k_warn(ar, "failed to setup peer SMPS for vdev %d: %d\n",
3112                                    arvif->vdev_id, ret);
3113                        return ret;
3114                }
3115
3116                ret = ath10k_peer_assoc_qos_ap(ar, arvif, sta);
3117                if (ret) {
3118                        ath10k_warn(ar, "failed to set qos params for STA %pM for vdev %i: %d\n",
3119                                    sta->addr, arvif->vdev_id, ret);
3120                        return ret;
3121                }
3122
3123                if (!sta->wme) {
3124                        arvif->num_legacy_stations++;
3125                        ret  = ath10k_recalc_rtscts_prot(arvif);
3126                        if (ret) {
3127                                ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
3128                                            arvif->vdev_id, ret);
3129                                return ret;
3130                        }
3131                }
3132
3133                /* Plumb cached keys only for static WEP */
3134                if ((arvif->def_wep_key_idx != -1) && (!sta->tdls)) {
3135                        ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
3136                        if (ret) {
3137                                ath10k_warn(ar, "failed to install peer wep keys for vdev %i: %d\n",
3138                                            arvif->vdev_id, ret);
3139                                return ret;
3140                        }
3141                }
3142        }
3143
3144        if (!test_bit(WMI_SERVICE_PEER_TID_CONFIGS_SUPPORT, ar->wmi.svc_map))
3145                return ret;
3146
3147        return ath10k_new_peer_tid_config(ar, sta, arvif);
3148}
3149
3150static int ath10k_station_disassoc(struct ath10k *ar,
3151                                   struct ieee80211_vif *vif,
3152                                   struct ieee80211_sta *sta)
3153{
3154        struct ath10k_vif *arvif = (void *)vif->drv_priv;
3155        int ret = 0;
3156
3157        lockdep_assert_held(&ar->conf_mutex);
3158
3159        if (!sta->wme) {
3160                arvif->num_legacy_stations--;
3161                ret = ath10k_recalc_rtscts_prot(arvif);
3162                if (ret) {
3163                        ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
3164                                    arvif->vdev_id, ret);
3165                        return ret;
3166                }
3167        }
3168
3169        ret = ath10k_clear_peer_keys(arvif, sta->addr);
3170        if (ret) {
3171                ath10k_warn(ar, "failed to clear all peer wep keys for vdev %i: %d\n",
3172                            arvif->vdev_id, ret);
3173                return ret;
3174        }
3175
3176        return ret;
3177}
3178
3179/**************/
3180/* Regulatory */
3181/**************/
3182
3183static int ath10k_update_channel_list(struct ath10k *ar)
3184{
3185        struct ieee80211_hw *hw = ar->hw;
3186        struct ieee80211_supported_band **bands;
3187        enum nl80211_band band;
3188        struct ieee80211_channel *channel;
3189        struct wmi_scan_chan_list_arg arg = {0};
3190        struct wmi_channel_arg *ch;
3191        bool passive;
3192        int len;
3193        int ret;
3194        int i;
3195
3196        lockdep_assert_held(&ar->conf_mutex);
3197
3198        bands = hw->wiphy->bands;
3199        for (band = 0; band < NUM_NL80211_BANDS; band++) {
3200                if (!bands[band])
3201                        continue;
3202
3203                for (i = 0; i < bands[band]->n_channels; i++) {
3204                        if (bands[band]->channels[i].flags &
3205                            IEEE80211_CHAN_DISABLED)
3206                                continue;
3207
3208                        arg.n_channels++;
3209                }
3210        }
3211
3212        len = sizeof(struct wmi_channel_arg) * arg.n_channels;
3213        arg.channels = kzalloc(len, GFP_KERNEL);
3214        if (!arg.channels)
3215                return -ENOMEM;
3216
3217        ch = arg.channels;
3218        for (band = 0; band < NUM_NL80211_BANDS; band++) {
3219                if (!bands[band])
3220                        continue;
3221
3222                for (i = 0; i < bands[band]->n_channels; i++) {
3223                        channel = &bands[band]->channels[i];
3224
3225                        if (channel->flags & IEEE80211_CHAN_DISABLED)
3226                                continue;
3227
3228                        ch->allow_ht = true;
3229
3230                        /* FIXME: when should we really allow VHT? */
3231                        ch->allow_vht = true;
3232
3233                        ch->allow_ibss =
3234                                !(channel->flags & IEEE80211_CHAN_NO_IR);
3235
3236                        ch->ht40plus =
3237                                !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
3238
3239                        ch->chan_radar =
3240                                !!(channel->flags & IEEE80211_CHAN_RADAR);
3241
3242                        passive = channel->flags & IEEE80211_CHAN_NO_IR;
3243                        ch->passive = passive;
3244
3245                        /* the firmware is ignoring the "radar" flag of the
3246                         * channel and is scanning actively using Probe Requests
3247                         * on "Radar detection"/DFS channels which are not
3248                         * marked as "available"
3249                         */
3250                        ch->passive |= ch->chan_radar;
3251
3252                        ch->freq = channel->center_freq;
3253                        ch->band_center_freq1 = channel->center_freq;
3254                        ch->min_power = 0;
3255                        ch->max_power = channel->max_power * 2;
3256                        ch->max_reg_power = channel->max_reg_power * 2;
3257                        ch->max_antenna_gain = channel->max_antenna_gain * 2;
3258                        ch->reg_class_id = 0; /* FIXME */
3259
3260                        /* FIXME: why use only legacy modes, why not any
3261                         * HT/VHT modes? Would that even make any
3262                         * difference?
3263                         */
3264                        if (channel->band == NL80211_BAND_2GHZ)
3265                                ch->mode = MODE_11G;
3266                        else
3267                                ch->mode = MODE_11A;
3268
3269                        if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
3270                                continue;
3271
3272                        ath10k_dbg(ar, ATH10K_DBG_WMI,
3273                                   "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
3274                                    ch - arg.channels, arg.n_channels,
3275                                   ch->freq, ch->max_power, ch->max_reg_power,
3276                                   ch->max_antenna_gain, ch->mode);
3277
3278                        ch++;
3279                }
3280        }
3281
3282        ret = ath10k_wmi_scan_chan_list(ar, &arg);
3283        kfree(arg.channels);
3284
3285        return ret;
3286}
3287
3288static enum wmi_dfs_region
3289ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region)
3290{
3291        switch (dfs_region) {
3292        case NL80211_DFS_UNSET:
3293                return WMI_UNINIT_DFS_DOMAIN;
3294        case NL80211_DFS_FCC:
3295                return WMI_FCC_DFS_DOMAIN;
3296        case NL80211_DFS_ETSI:
3297                return WMI_ETSI_DFS_DOMAIN;
3298        case NL80211_DFS_JP:
3299                return WMI_MKK4_DFS_DOMAIN;
3300        }
3301        return WMI_UNINIT_DFS_DOMAIN;
3302}
3303
3304static void ath10k_regd_update(struct ath10k *ar)
3305{
3306        struct reg_dmn_pair_mapping *regpair;
3307        int ret;
3308        enum wmi_dfs_region wmi_dfs_reg;
3309        enum nl80211_dfs_regions nl_dfs_reg;
3310
3311        lockdep_assert_held(&ar->conf_mutex);
3312
3313        ret = ath10k_update_channel_list(ar);
3314        if (ret)
3315                ath10k_warn(ar, "failed to update channel list: %d\n", ret);
3316
3317        regpair = ar->ath_common.regulatory.regpair;
3318
3319        if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
3320                nl_dfs_reg = ar->dfs_detector->region;
3321                wmi_dfs_reg = ath10k_mac_get_dfs_region(nl_dfs_reg);
3322        } else {
3323                wmi_dfs_reg = WMI_UNINIT_DFS_DOMAIN;
3324        }
3325
3326        /* Target allows setting up per-band regdomain but ath_common provides
3327         * a combined one only
3328         */
3329        ret = ath10k_wmi_pdev_set_regdomain(ar,
3330                                            regpair->reg_domain,
3331                                            regpair->reg_domain, /* 2ghz */
3332                                            regpair->reg_domain, /* 5ghz */
3333                                            regpair->reg_2ghz_ctl,
3334                                            regpair->reg_5ghz_ctl,
3335                                            wmi_dfs_reg);
3336        if (ret)
3337                ath10k_warn(ar, "failed to set pdev regdomain: %d\n", ret);
3338}
3339
3340static void ath10k_mac_update_channel_list(struct ath10k *ar,
3341                                           struct ieee80211_supported_band *band)
3342{
3343        int i;
3344
3345        if (ar->low_5ghz_chan && ar->high_5ghz_chan) {
3346                for (i = 0; i < band->n_channels; i++) {
3347                        if (band->channels[i].center_freq < ar->low_5ghz_chan ||
3348                            band->channels[i].center_freq > ar->high_5ghz_chan)
3349                                band->channels[i].flags |=
3350                                        IEEE80211_CHAN_DISABLED;
3351                }
3352        }
3353}
3354
3355static void ath10k_reg_notifier(struct wiphy *wiphy,
3356                                struct regulatory_request *request)
3357{
3358        struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
3359        struct ath10k *ar = hw->priv;
3360        bool result;
3361
3362        ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
3363
3364        if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
3365                ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs region 0x%x\n",
3366                           request->dfs_region);
3367                result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector,
3368                                                          request->dfs_region);
3369                if (!result)
3370                        ath10k_warn(ar, "DFS region 0x%X not supported, will trigger radar for every pulse\n",
3371                                    request->dfs_region);
3372        }
3373
3374        mutex_lock(&ar->conf_mutex);
3375        if (ar->state == ATH10K_STATE_ON)
3376                ath10k_regd_update(ar);
3377        mutex_unlock(&ar->conf_mutex);
3378
3379        if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY)
3380                ath10k_mac_update_channel_list(ar,
3381                                               ar->hw->wiphy->bands[NL80211_BAND_5GHZ]);
3382}
3383
3384static void ath10k_stop_radar_confirmation(struct ath10k *ar)
3385{
3386        spin_lock_bh(&ar->data_lock);
3387        ar->radar_conf_state = ATH10K_RADAR_CONFIRMATION_STOPPED;
3388        spin_unlock_bh(&ar->data_lock);
3389
3390        cancel_work_sync(&ar->radar_confirmation_work);
3391}
3392
3393/***************/
3394/* TX handlers */
3395/***************/
3396
3397enum ath10k_mac_tx_path {
3398        ATH10K_MAC_TX_HTT,
3399        ATH10K_MAC_TX_HTT_MGMT,
3400        ATH10K_MAC_TX_WMI_MGMT,
3401        ATH10K_MAC_TX_UNKNOWN,
3402};
3403
3404void ath10k_mac_tx_lock(struct ath10k *ar, int reason)
3405{
3406        lockdep_assert_held(&ar->htt.tx_lock);
3407
3408        WARN_ON(reason >= ATH10K_TX_PAUSE_MAX);
3409        ar->tx_paused |= BIT(reason);
3410        ieee80211_stop_queues(ar->hw);
3411}
3412
3413static void ath10k_mac_tx_unlock_iter(void *data, u8 *mac,
3414                                      struct ieee80211_vif *vif)
3415{
3416        struct ath10k *ar = data;
3417        struct ath10k_vif *arvif = (void *)vif->drv_priv;
3418
3419        if (arvif->tx_paused)
3420                return;
3421
3422        ieee80211_wake_queue(ar->hw, arvif->vdev_id);
3423}
3424
3425void ath10k_mac_tx_unlock(struct ath10k *ar, int reason)
3426{
3427        lockdep_assert_held(&ar->htt.tx_lock);
3428
3429        WARN_ON(reason >= ATH10K_TX_PAUSE_MAX);
3430        ar->tx_paused &= ~BIT(reason);
3431
3432        if (ar->tx_paused)
3433                return;
3434
3435        ieee80211_iterate_active_interfaces_atomic(ar->hw,
3436                                                   ATH10K_ITER_RESUME_FLAGS,
3437                                                   ath10k_mac_tx_unlock_iter,
3438                                                   ar);
3439
3440        ieee80211_wake_queue(ar->hw, ar->hw->offchannel_tx_hw_queue);
3441}
3442
3443void ath10k_mac_vif_tx_lock(struct ath10k_vif *arvif, int reason)
3444{
3445        struct ath10k *ar = arvif->ar;
3446
3447        lockdep_assert_held(&ar->htt.tx_lock);
3448
3449        WARN_ON(reason >= BITS_PER_LONG);
3450        arvif->tx_paused |= BIT(reason);
3451        ieee80211_stop_queue(ar->hw, arvif->vdev_id);
3452}
3453
3454void ath10k_mac_vif_tx_unlock(struct ath10k_vif *arvif, int reason)
3455{
3456        struct ath10k *ar = arvif->ar;
3457
3458        lockdep_assert_held(&ar->htt.tx_lock);
3459
3460        WARN_ON(reason >= BITS_PER_LONG);
3461        arvif->tx_paused &= ~BIT(reason);
3462
3463        if (ar->tx_paused)
3464                return;
3465
3466        if (arvif->tx_paused)
3467                return;
3468
3469        ieee80211_wake_queue(ar->hw, arvif->vdev_id);
3470}
3471
3472static void ath10k_mac_vif_handle_tx_pause(struct ath10k_vif *arvif,
3473                                           enum wmi_tlv_tx_pause_id pause_id,
3474                                           enum wmi_tlv_tx_pause_action action)
3475{
3476        struct ath10k *ar = arvif->ar;
3477
3478        lockdep_assert_held(&ar->htt.tx_lock);
3479
3480        switch (action) {
3481        case WMI_TLV_TX_PAUSE_ACTION_STOP:
3482                ath10k_mac_vif_tx_lock(arvif, pause_id);
3483                break;
3484        case WMI_TLV_TX_PAUSE_ACTION_WAKE:
3485                ath10k_mac_vif_tx_unlock(arvif, pause_id);
3486                break;
3487        default:
3488                ath10k_dbg(ar, ATH10K_DBG_BOOT,
3489                           "received unknown tx pause action %d on vdev %i, ignoring\n",
3490                            action, arvif->vdev_id);
3491                break;
3492        }
3493}
3494
3495struct ath10k_mac_tx_pause {
3496        u32 vdev_id;
3497        enum wmi_tlv_tx_pause_id pause_id;
3498        enum wmi_tlv_tx_pause_action action;
3499};
3500
3501static void ath10k_mac_handle_tx_pause_iter(void *data, u8 *mac,
3502                                            struct ieee80211_vif *vif)
3503{
3504        struct ath10k_vif *arvif = (void *)vif->drv_priv;
3505        struct ath10k_mac_tx_pause *arg = data;
3506
3507        if (arvif->vdev_id != arg->vdev_id)
3508                return;
3509
3510        ath10k_mac_vif_handle_tx_pause(arvif, arg->pause_id, arg->action);
3511}
3512
3513void ath10k_mac_handle_tx_pause_vdev(struct ath10k *ar, u32 vdev_id,
3514                                     enum wmi_tlv_tx_pause_id pause_id,
3515                                     enum wmi_tlv_tx_pause_action action)
3516{
3517        struct ath10k_mac_tx_pause arg = {
3518                .vdev_id = vdev_id,
3519                .pause_id = pause_id,
3520                .action = action,
3521        };
3522
3523        spin_lock_bh(&ar->htt.tx_lock);
3524        ieee80211_iterate_active_interfaces_atomic(ar->hw,
3525                                                   ATH10K_ITER_RESUME_FLAGS,
3526                                                   ath10k_mac_handle_tx_pause_iter,
3527                                                   &arg);
3528        spin_unlock_bh(&ar->htt.tx_lock);
3529}
3530
3531static enum ath10k_hw_txrx_mode
3532ath10k_mac_tx_h_get_txmode(struct ath10k *ar,
3533                           struct ieee80211_vif *vif,
3534                           struct ieee80211_sta *sta,
3535                           struct sk_buff *skb)
3536{
3537        const struct ieee80211_hdr *hdr = (void *)skb->data;
3538        const struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb);
3539        __le16 fc = hdr->frame_control;
3540
3541        if (!vif || vif->type == NL80211_IFTYPE_MONITOR)
3542                return ATH10K_HW_TXRX_RAW;
3543
3544        if (ieee80211_is_mgmt(fc))
3545                return ATH10K_HW_TXRX_MGMT;
3546
3547        /* Workaround:
3548         *
3549         * NullFunc frames are mostly used to ping if a client or AP are still
3550         * reachable and responsive. This implies tx status reports must be
3551         * accurate - otherwise either mac80211 or userspace (e.g. hostapd) can
3552         * come to a conclusion that the other end disappeared and tear down
3553         * BSS connection or it can never disconnect from BSS/client (which is
3554         * the case).
3555         *
3556         * Firmware with HTT older than 3.0 delivers incorrect tx status for
3557         * NullFunc frames to driver. However there's a HTT Mgmt Tx command
3558         * which seems to deliver correct tx reports for NullFunc frames. The
3559         * downside of using it is it ignores client powersave state so it can
3560         * end up disconnecting sleeping clients in AP mode. It should fix STA
3561         * mode though because AP don't sleep.
3562         */
3563        if (ar->htt.target_version_major < 3 &&
3564            (ieee80211_is_nullfunc(fc) || ieee80211_is_qos_nullfunc(fc)) &&
3565            !test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
3566                      ar->running_fw->fw_file.fw_features))
3567                return ATH10K_HW_TXRX_MGMT;
3568
3569        /* Workaround:
3570         *
3571         * Some wmi-tlv firmwares for qca6174 have broken Tx key selection for
3572         * NativeWifi txmode - it selects AP key instead of peer key. It seems
3573         * to work with Ethernet txmode so use it.
3574         *
3575         * FIXME: Check if raw mode works with TDLS.
3576         */
3577        if (ieee80211_is_data_present(fc) && sta && sta->tdls)
3578                return ATH10K_HW_TXRX_ETHERNET;
3579
3580        if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags) ||
3581            skb_cb->flags & ATH10K_SKB_F_RAW_TX)
3582                return ATH10K_HW_TXRX_RAW;
3583
3584        return ATH10K_HW_TXRX_NATIVE_WIFI;
3585}
3586
3587static bool ath10k_tx_h_use_hwcrypto(struct ieee80211_vif *vif,
3588                                     struct sk_buff *skb)
3589{
3590        const struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
3591        const struct ieee80211_hdr *hdr = (void *)skb->data;
3592        const u32 mask = IEEE80211_TX_INTFL_DONT_ENCRYPT |
3593                         IEEE80211_TX_CTL_INJECTED;
3594
3595        if (!ieee80211_has_protected(hdr->frame_control))
3596                return false;
3597
3598        if ((info->flags & mask) == mask)
3599                return false;
3600
3601        if (vif)
3602                return !((struct ath10k_vif *)vif->drv_priv)->nohwcrypt;
3603
3604        return true;
3605}
3606
3607/* HTT Tx uses Native Wifi tx mode which expects 802.11 frames without QoS
3608 * Control in the header.
3609 */
3610static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb)
3611{
3612        struct ieee80211_hdr *hdr = (void *)skb->data;
3613        struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
3614        u8 *qos_ctl;
3615
3616        if (!ieee80211_is_data_qos(hdr->frame_control))
3617                return;
3618
3619        qos_ctl = ieee80211_get_qos_ctl(hdr);
3620        memmove(skb->data + IEEE80211_QOS_CTL_LEN,
3621                skb->data, (void *)qos_ctl - (void *)skb->data);
3622        skb_pull(skb, IEEE80211_QOS_CTL_LEN);
3623
3624        /* Some firmware revisions don't handle sending QoS NullFunc well.
3625         * These frames are mainly used for CQM purposes so it doesn't really
3626         * matter whether QoS NullFunc or NullFunc are sent.
3627         */
3628        hdr = (void *)skb->data;
3629        if (ieee80211_is_qos_nullfunc(hdr->frame_control))
3630                cb->flags &= ~ATH10K_SKB_F_QOS;
3631
3632        hdr->frame_control &= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
3633}
3634
3635static void ath10k_tx_h_8023(struct sk_buff *skb)
3636{
3637        struct ieee80211_hdr *hdr;
3638        struct rfc1042_hdr *rfc1042;
3639        struct ethhdr *eth;
3640        size_t hdrlen;
3641        u8 da[ETH_ALEN];
3642        u8 sa[ETH_ALEN];
3643        __be16 type;
3644
3645        hdr = (void *)skb->data;
3646        hdrlen = ieee80211_hdrlen(hdr->frame_control);
3647        rfc1042 = (void *)skb->data + hdrlen;
3648
3649        ether_addr_copy(da, ieee80211_get_DA(hdr));
3650        ether_addr_copy(sa, ieee80211_get_SA(hdr));
3651        type = rfc1042->snap_type;
3652
3653        skb_pull(skb, hdrlen + sizeof(*rfc1042));
3654        skb_push(skb, sizeof(*eth));
3655
3656        eth = (void *)skb->data;
3657        ether_addr_copy(eth->h_dest, da);
3658        ether_addr_copy(eth->h_source, sa);
3659        eth->h_proto = type;
3660}
3661
3662static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar,
3663                                       struct ieee80211_vif *vif,
3664                                       struct sk_buff *skb)
3665{
3666        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
3667        struct ath10k_vif *arvif = (void *)vif->drv_priv;
3668
3669        /* This is case only for P2P_GO */
3670        if (vif->type != NL80211_IFTYPE_AP || !vif->p2p)
3671                return;
3672
3673        if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
3674                spin_lock_bh(&ar->data_lock);
3675                if (arvif->u.ap.noa_data)
3676                        if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
3677                                              GFP_ATOMIC))
3678                                skb_put_data(skb, arvif->u.ap.noa_data,
3679                                             arvif->u.ap.noa_len);
3680                spin_unlock_bh(&ar->data_lock);
3681        }
3682}
3683
3684static void ath10k_mac_tx_h_fill_cb(struct ath10k *ar,
3685                                    struct ieee80211_vif *vif,
3686                                    struct ieee80211_txq *txq,
3687                                    struct ieee80211_sta *sta,
3688                                    struct sk_buff *skb, u16 airtime)
3689{
3690        struct ieee80211_hdr *hdr = (void *)skb->data;
3691        struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
3692        const struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
3693        bool is_data = ieee80211_is_data(hdr->frame_control) ||
3694                        ieee80211_is_data_qos(hdr->frame_control);
3695        struct ath10k_vif *arvif = (void *)vif->drv_priv;
3696        struct ath10k_sta *arsta;
3697        u8 tid, *qos_ctl;
3698        bool noack = false;
3699
3700        cb->flags = 0;
3701        if (!ath10k_tx_h_use_hwcrypto(vif, skb))
3702                cb->flags |= ATH10K_SKB_F_NO_HWCRYPT;
3703
3704        if (ieee80211_is_mgmt(hdr->frame_control))
3705                cb->flags |= ATH10K_SKB_F_MGMT;
3706
3707        if (ieee80211_is_data_qos(hdr->frame_control)) {
3708                cb->flags |= ATH10K_SKB_F_QOS;
3709                qos_ctl = ieee80211_get_qos_ctl(hdr);
3710                tid = (*qos_ctl) & IEEE80211_QOS_CTL_TID_MASK;
3711
3712                if (arvif->noack[tid] == WMI_PEER_TID_CONFIG_NOACK)
3713                        noack = true;
3714
3715                if (sta) {
3716                        arsta = (struct ath10k_sta *)sta->drv_priv;
3717
3718                        if (arsta->noack[tid] == WMI_PEER_TID_CONFIG_NOACK)
3719                                noack = true;
3720
3721                        if (arsta->noack[tid] == WMI_PEER_TID_CONFIG_ACK)
3722                                noack = false;
3723                }
3724
3725                if (noack)
3726                        cb->flags |= ATH10K_SKB_F_NOACK_TID;
3727        }
3728
3729        /* Data frames encrypted in software will be posted to firmware
3730         * with tx encap mode set to RAW. Ex: Multicast traffic generated
3731         * for a specific VLAN group will always be encrypted in software.
3732         */
3733        if (is_data && ieee80211_has_protected(hdr->frame_control) &&
3734            !info->control.hw_key) {
3735                cb->flags |= ATH10K_SKB_F_NO_HWCRYPT;
3736                cb->flags |= ATH10K_SKB_F_RAW_TX;
3737        }
3738
3739        cb->vif = vif;
3740        cb->txq = txq;
3741        cb->airtime_est = airtime;
3742        if (sta) {
3743                arsta = (struct ath10k_sta *)sta->drv_priv;
3744                spin_lock_bh(&ar->data_lock);
3745                cb->ucast_cipher = arsta->ucast_cipher;
3746                spin_unlock_bh(&ar->data_lock);
3747        }
3748}
3749
3750bool ath10k_mac_tx_frm_has_freq(struct ath10k *ar)
3751{
3752        /* FIXME: Not really sure since when the behaviour changed. At some
3753         * point new firmware stopped requiring creation of peer entries for
3754         * offchannel tx (and actually creating them causes issues with wmi-htc
3755         * tx credit replenishment and reliability). Assuming it's at least 3.4
3756         * because that's when the `freq` was introduced to TX_FRM HTT command.
3757         */
3758        return (ar->htt.target_version_major >= 3 &&
3759                ar->htt.target_version_minor >= 4 &&
3760                ar->running_fw->fw_file.htt_op_version == ATH10K_FW_HTT_OP_VERSION_TLV);
3761}
3762
3763static int ath10k_mac_tx_wmi_mgmt(struct ath10k *ar, struct sk_buff *skb)
3764{
3765        struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
3766        int ret = 0;
3767
3768        spin_lock_bh(&ar->data_lock);
3769
3770        if (skb_queue_len(q) == ATH10K_MAX_NUM_MGMT_PENDING) {
3771                ath10k_warn(ar, "wmi mgmt tx queue is full\n");
3772                ret = -ENOSPC;
3773                goto unlock;
3774        }
3775
3776        __skb_queue_tail(q, skb);
3777        ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
3778
3779unlock:
3780        spin_unlock_bh(&ar->data_lock);
3781
3782        return ret;
3783}
3784
3785static enum ath10k_mac_tx_path
3786ath10k_mac_tx_h_get_txpath(struct ath10k *ar,
3787                           struct sk_buff *skb,
3788                           enum ath10k_hw_txrx_mode txmode)
3789{
3790        switch (txmode) {
3791        case ATH10K_HW_TXRX_RAW:
3792        case ATH10K_HW_TXRX_NATIVE_WIFI:
3793        case ATH10K_HW_TXRX_ETHERNET:
3794                return ATH10K_MAC_TX_HTT;
3795        case ATH10K_HW_TXRX_MGMT:
3796                if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
3797                             ar->running_fw->fw_file.fw_features) ||
3798                             test_bit(WMI_SERVICE_MGMT_TX_WMI,
3799                                      ar->wmi.svc_map))
3800                        return ATH10K_MAC_TX_WMI_MGMT;
3801                else if (ar->htt.target_version_major >= 3)
3802                        return ATH10K_MAC_TX_HTT;
3803                else
3804                        return ATH10K_MAC_TX_HTT_MGMT;
3805        }
3806
3807        return ATH10K_MAC_TX_UNKNOWN;
3808}
3809
3810static int ath10k_mac_tx_submit(struct ath10k *ar,
3811                                enum ath10k_hw_txrx_mode txmode,
3812                                enum ath10k_mac_tx_path txpath,
3813                                struct sk_buff *skb)
3814{
3815        struct ath10k_htt *htt = &ar->htt;
3816        int ret = -EINVAL;
3817
3818        switch (txpath) {
3819        case ATH10K_MAC_TX_HTT:
3820                ret = ath10k_htt_tx(htt, txmode, skb);
3821                break;
3822        case ATH10K_MAC_TX_HTT_MGMT:
3823                ret = ath10k_htt_mgmt_tx(htt, skb);
3824                break;
3825        case ATH10K_MAC_TX_WMI_MGMT:
3826                ret = ath10k_mac_tx_wmi_mgmt(ar, skb);
3827                break;
3828        case ATH10K_MAC_TX_UNKNOWN:
3829                WARN_ON_ONCE(1);
3830                ret = -EINVAL;
3831                break;
3832        }
3833
3834        if (ret) {
3835                ath10k_warn(ar, "failed to transmit packet, dropping: %d\n",
3836                            ret);
3837                ieee80211_free_txskb(ar->hw, skb);
3838        }
3839
3840        return ret;
3841}
3842
3843/* This function consumes the sk_buff regardless of return value as far as
3844 * caller is concerned so no freeing is necessary afterwards.
3845 */
3846static int ath10k_mac_tx(struct ath10k *ar,
3847                         struct ieee80211_vif *vif,
3848                         enum ath10k_hw_txrx_mode txmode,
3849                         enum ath10k_mac_tx_path txpath,
3850                         struct sk_buff *skb, bool noque_offchan)
3851{
3852        struct ieee80211_hw *hw = ar->hw;
3853        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
3854        const struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb);
3855        int ret;
3856
3857        /* We should disable CCK RATE due to P2P */
3858        if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
3859                ath10k_dbg(ar, ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
3860
3861        switch (txmode) {
3862        case ATH10K_HW_TXRX_MGMT:
3863        case ATH10K_HW_TXRX_NATIVE_WIFI:
3864                ath10k_tx_h_nwifi(hw, skb);
3865                ath10k_tx_h_add_p2p_noa_ie(ar, vif, skb);
3866                ath10k_tx_h_seq_no(vif, skb);
3867                break;
3868        case ATH10K_HW_TXRX_ETHERNET:
3869                ath10k_tx_h_8023(skb);
3870                break;
3871        case ATH10K_HW_TXRX_RAW:
3872                if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags) &&
3873                    !(skb_cb->flags & ATH10K_SKB_F_RAW_TX)) {
3874                        WARN_ON_ONCE(1);
3875                        ieee80211_free_txskb(hw, skb);
3876                        return -ENOTSUPP;
3877                }
3878        }
3879
3880        if (!noque_offchan && info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
3881                if (!ath10k_mac_tx_frm_has_freq(ar)) {
3882                        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac queued offchannel skb %pK len %d\n",
3883                                   skb, skb->len);
3884
3885                        skb_queue_tail(&ar->offchan_tx_queue, skb);
3886                        ieee80211_queue_work(hw, &ar->offchan_tx_work);
3887                        return 0;
3888                }
3889        }
3890
3891        ret = ath10k_mac_tx_submit(ar, txmode, txpath, skb);
3892        if (ret) {
3893                ath10k_warn(ar, "failed to submit frame: %d\n", ret);
3894                return ret;
3895        }
3896
3897        return 0;
3898}
3899
3900void ath10k_offchan_tx_purge(struct ath10k *ar)
3901{
3902        struct sk_buff *skb;
3903
3904        for (;;) {
3905                skb = skb_dequeue(&ar->offchan_tx_queue);
3906                if (!skb)
3907                        break;
3908
3909                ieee80211_free_txskb(ar->hw, skb);
3910        }
3911}
3912
3913void ath10k_offchan_tx_work(struct work_struct *work)
3914{
3915        struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
3916        struct ath10k_peer *peer;
3917        struct ath10k_vif *arvif;
3918        enum ath10k_hw_txrx_mode txmode;
3919        enum ath10k_mac_tx_path txpath;
3920        struct ieee80211_hdr *hdr;
3921        struct ieee80211_vif *vif;
3922        struct ieee80211_sta *sta;
3923        struct sk_buff *skb;
3924        const u8 *peer_addr;
3925        int vdev_id;
3926        int ret;
3927        unsigned long time_left;
3928        bool tmp_peer_created = false;
3929
3930        /* FW requirement: We must create a peer before FW will send out
3931         * an offchannel frame. Otherwise the frame will be stuck and
3932         * never transmitted. We delete the peer upon tx completion.
3933         * It is unlikely that a peer for offchannel tx will already be
3934         * present. However it may be in some rare cases so account for that.
3935         * Otherwise we might remove a legitimate peer and break stuff.
3936         */
3937
3938        for (;;) {
3939                skb = skb_dequeue(&ar->offchan_tx_queue);
3940                if (!skb)
3941                        break;
3942
3943                mutex_lock(&ar->conf_mutex);
3944
3945                ath10k_dbg(ar, ATH10K_DBG_MAC, "mac offchannel skb %pK len %d\n",
3946                           skb, skb->len);
3947
3948                hdr = (struct ieee80211_hdr *)skb->data;
3949                peer_addr = ieee80211_get_DA(hdr);
3950
3951                spin_lock_bh(&ar->data_lock);
3952                vdev_id = ar->scan.vdev_id;
3953                peer = ath10k_peer_find(ar, vdev_id, peer_addr);
3954                spin_unlock_bh(&ar->data_lock);
3955
3956                if (peer)
3957                        /* FIXME: should this use ath10k_warn()? */
3958                        ath10k_dbg(ar, ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n",
3959                                   peer_addr, vdev_id);
3960
3961                if (!peer) {
3962                        ret = ath10k_peer_create(ar, NULL, NULL, vdev_id,
3963                                                 peer_addr,
3964                                                 WMI_PEER_TYPE_DEFAULT);
3965                        if (ret)
3966                                ath10k_warn(ar, "failed to create peer %pM on vdev %d: %d\n",
3967                                            peer_addr, vdev_id, ret);
3968                        tmp_peer_created = (ret == 0);
3969                }
3970
3971                spin_lock_bh(&ar->data_lock);
3972                reinit_completion(&ar->offchan_tx_completed);
3973                ar->offchan_tx_skb = skb;
3974                spin_unlock_bh(&ar->data_lock);
3975
3976                /* It's safe to access vif and sta - conf_mutex guarantees that
3977                 * sta_state() and remove_interface() are locked exclusively
3978                 * out wrt to this offchannel worker.
3979                 */
3980                arvif = ath10k_get_arvif(ar, vdev_id);
3981                if (arvif) {
3982                        vif = arvif->vif;
3983                        sta = ieee80211_find_sta(vif, peer_addr);
3984                } else {
3985                        vif = NULL;
3986                        sta = NULL;
3987                }
3988
3989                txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb);
3990                txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode);
3991
3992                ret = ath10k_mac_tx(ar, vif, txmode, txpath, skb, true);
3993                if (ret) {
3994                        ath10k_warn(ar, "failed to transmit offchannel frame: %d\n",
3995                                    ret);
3996                        /* not serious */
3997                }
3998
3999                time_left =
4000                wait_for_completion_timeout(&ar->offchan_tx_completed, 3 * HZ);
4001                if (time_left == 0)
4002                        ath10k_warn(ar, "timed out waiting for offchannel skb %pK, len: %d\n",
4003                                    skb, skb->len);
4004
4005                if (!peer && tmp_peer_created) {
4006                        ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
4007                        if (ret)
4008                                ath10k_warn(ar, "failed to delete peer %pM on vdev %d: %d\n",
4009                                            peer_addr, vdev_id, ret);
4010                }
4011
4012                mutex_unlock(&ar->conf_mutex);
4013        }
4014}
4015
4016void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar)
4017{
4018        struct sk_buff *skb;
4019
4020        for (;;) {
4021                skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
4022                if (!skb)
4023                        break;
4024
4025                ieee80211_free_txskb(ar->hw, skb);
4026        }
4027}
4028
4029void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work)
4030{
4031        struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work);
4032        struct sk_buff *skb;
4033        dma_addr_t paddr;
4034        int ret;
4035
4036        for (;;) {
4037                skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
4038                if (!skb)
4039                        break;
4040
4041                if (test_bit(ATH10K_FW_FEATURE_MGMT_TX_BY_REF,
4042                             ar->running_fw->fw_file.fw_features)) {
4043                        paddr = dma_map_single(ar->dev, skb->data,
4044                                               skb->len, DMA_TO_DEVICE);
4045                        if (dma_mapping_error(ar->dev, paddr)) {
4046                                ieee80211_free_txskb(ar->hw, skb);
4047                                continue;
4048                        }
4049                        ret = ath10k_wmi_mgmt_tx_send(ar, skb, paddr);
4050                        if (ret) {
4051                                ath10k_warn(ar, "failed to transmit management frame by ref via WMI: %d\n",
4052                                            ret);
4053                                /* remove this msdu from idr tracking */
4054                                ath10k_wmi_cleanup_mgmt_tx_send(ar, skb);
4055
4056                                dma_unmap_single(ar->dev, paddr, skb->len,
4057                                                 DMA_TO_DEVICE);
4058                                ieee80211_free_txskb(ar->hw, skb);
4059                        }
4060                } else {
4061                        ret = ath10k_wmi_mgmt_tx(ar, skb);
4062                        if (ret) {
4063                                ath10k_warn(ar, "failed to transmit management frame via WMI: %d\n",
4064                                            ret);
4065                                ieee80211_free_txskb(ar->hw, skb);
4066                        }
4067                }
4068        }
4069}
4070
4071static void ath10k_mac_txq_init(struct ieee80211_txq *txq)
4072{
4073        struct ath10k_txq *artxq;
4074
4075        if (!txq)
4076                return;
4077
4078        artxq = (void *)txq->drv_priv;
4079        INIT_LIST_HEAD(&artxq->list);
4080}
4081
4082static void ath10k_mac_txq_unref(struct ath10k *ar, struct ieee80211_txq *txq)
4083{
4084        struct ath10k_skb_cb *cb;
4085        struct sk_buff *msdu;
4086        int msdu_id;
4087
4088        if (!txq)
4089                return;
4090
4091        spin_lock_bh(&ar->htt.tx_lock);
4092        idr_for_each_entry(&ar->htt.pending_tx, msdu, msdu_id) {
4093                cb = ATH10K_SKB_CB(msdu);
4094                if (cb->txq == txq)
4095                        cb->txq = NULL;
4096        }
4097        spin_unlock_bh(&ar->htt.tx_lock);
4098}
4099
4100struct ieee80211_txq *ath10k_mac_txq_lookup(struct ath10k *ar,
4101                                            u16 peer_id,
4102                                            u8 tid)
4103{
4104        struct ath10k_peer *peer;
4105
4106        lockdep_assert_held(&ar->data_lock);
4107
4108        peer = ar->peer_map[peer_id];
4109        if (!peer)
4110                return NULL;
4111
4112        if (peer->removed)
4113                return NULL;
4114
4115        if (peer->sta)
4116                return peer->sta->txq[tid];
4117        else if (peer->vif)
4118                return peer->vif->txq;
4119        else
4120                return NULL;
4121}
4122
4123static bool ath10k_mac_tx_can_push(struct ieee80211_hw *hw,
4124                                   struct ieee80211_txq *txq)
4125{
4126        struct ath10k *ar = hw->priv;
4127        struct ath10k_txq *artxq = (void *)txq->drv_priv;
4128
4129        /* No need to get locks */
4130        if (ar->htt.tx_q_state.mode == HTT_TX_MODE_SWITCH_PUSH)
4131                return true;
4132
4133        if (ar->htt.num_pending_tx < ar->htt.tx_q_state.num_push_allowed)
4134                return true;
4135
4136        if (artxq->num_fw_queued < artxq->num_push_allowed)
4137                return true;
4138
4139        return false;
4140}
4141
4142/* Return estimated airtime in microsecond, which is calculated using last
4143 * reported TX rate. This is just a rough estimation because host driver has no
4144 * knowledge of the actual transmit rate, retries or aggregation. If actual
4145 * airtime can be reported by firmware, then delta between estimated and actual
4146 * airtime can be adjusted from deficit.
4147 */
4148#define IEEE80211_ATF_OVERHEAD          100     /* IFS + some slot time */
4149#define IEEE80211_ATF_OVERHEAD_IFS      16      /* IFS only */
4150static u16 ath10k_mac_update_airtime(struct ath10k *ar,
4151                                     struct ieee80211_txq *txq,
4152                                     struct sk_buff *skb)
4153{
4154        struct ath10k_sta *arsta;
4155        u32 pktlen;
4156        u16 airtime = 0;
4157
4158        if (!txq || !txq->sta)
4159                return airtime;
4160
4161        if (test_bit(WMI_SERVICE_REPORT_AIRTIME, ar->wmi.svc_map))
4162                return airtime;
4163
4164        spin_lock_bh(&ar->data_lock);
4165        arsta = (struct ath10k_sta *)txq->sta->drv_priv;
4166
4167        pktlen = skb->len + 38; /* Assume MAC header 30, SNAP 8 for most case */
4168        if (arsta->last_tx_bitrate) {
4169                /* airtime in us, last_tx_bitrate in 100kbps */
4170                airtime = (pktlen * 8 * (1000 / 100))
4171                                / arsta->last_tx_bitrate;
4172                /* overhead for media access time and IFS */
4173                airtime += IEEE80211_ATF_OVERHEAD_IFS;
4174        } else {
4175                /* This is mostly for throttle excessive BC/MC frames, and the
4176                 * airtime/rate doesn't need be exact. Airtime of BC/MC frames
4177                 * in 2G get some discount, which helps prevent very low rate
4178                 * frames from being blocked for too long.
4179                 */
4180                airtime = (pktlen * 8 * (1000 / 100)) / 60; /* 6M */
4181                airtime += IEEE80211_ATF_OVERHEAD;
4182        }
4183        spin_unlock_bh(&ar->data_lock);
4184
4185        return airtime;
4186}
4187
4188int ath10k_mac_tx_push_txq(struct ieee80211_hw *hw,
4189                           struct ieee80211_txq *txq)
4190{
4191        struct ath10k *ar = hw->priv;
4192        struct ath10k_htt *htt = &ar->htt;
4193        struct ath10k_txq *artxq = (void *)txq->drv_priv;
4194        struct ieee80211_vif *vif = txq->vif;
4195        struct ieee80211_sta *sta = txq->sta;
4196        enum ath10k_hw_txrx_mode txmode;
4197        enum ath10k_mac_tx_path txpath;
4198        struct sk_buff *skb;
4199        struct ieee80211_hdr *hdr;
4200        size_t skb_len;
4201        bool is_mgmt, is_presp;
4202        int ret;
4203        u16 airtime;
4204
4205        spin_lock_bh(&ar->htt.tx_lock);
4206        ret = ath10k_htt_tx_inc_pending(htt);
4207        spin_unlock_bh(&ar->htt.tx_lock);
4208
4209        if (ret)
4210                return ret;
4211
4212        skb = ieee80211_tx_dequeue_ni(hw, txq);
4213        if (!skb) {
4214                spin_lock_bh(&ar->htt.tx_lock);
4215                ath10k_htt_tx_dec_pending(htt);
4216                spin_unlock_bh(&ar->htt.tx_lock);
4217
4218                return -ENOENT;
4219        }
4220
4221        airtime = ath10k_mac_update_airtime(ar, txq, skb);
4222        ath10k_mac_tx_h_fill_cb(ar, vif, txq, sta, skb, airtime);
4223
4224        skb_len = skb->len;
4225        txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb);
4226        txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode);
4227        is_mgmt = (txpath == ATH10K_MAC_TX_HTT_MGMT);
4228
4229        if (is_mgmt) {
4230                hdr = (struct ieee80211_hdr *)skb->data;
4231                is_presp = ieee80211_is_probe_resp(hdr->frame_control);
4232
4233                spin_lock_bh(&ar->htt.tx_lock);
4234                ret = ath10k_htt_tx_mgmt_inc_pending(htt, is_mgmt, is_presp);
4235
4236                if (ret) {
4237                        ath10k_htt_tx_dec_pending(htt);
4238                        spin_unlock_bh(&ar->htt.tx_lock);
4239                        return ret;
4240                }
4241                spin_unlock_bh(&ar->htt.tx_lock);
4242        }
4243
4244        ret = ath10k_mac_tx(ar, vif, txmode, txpath, skb, false);
4245        if (unlikely(ret)) {
4246                ath10k_warn(ar, "failed to push frame: %d\n", ret);
4247
4248                spin_lock_bh(&ar->htt.tx_lock);
4249                ath10k_htt_tx_dec_pending(htt);
4250                if (is_mgmt)
4251                        ath10k_htt_tx_mgmt_dec_pending(htt);
4252                spin_unlock_bh(&ar->htt.tx_lock);
4253
4254                return ret;
4255        }
4256
4257        spin_lock_bh(&ar->htt.tx_lock);
4258        artxq->num_fw_queued++;
4259        spin_unlock_bh(&ar->htt.tx_lock);
4260
4261        return skb_len;
4262}
4263
4264static int ath10k_mac_schedule_txq(struct ieee80211_hw *hw, u32 ac)
4265{
4266        struct ieee80211_txq *txq;
4267        int ret = 0;
4268
4269        ieee80211_txq_schedule_start(hw, ac);
4270        while ((txq = ieee80211_next_txq(hw, ac))) {
4271                while (ath10k_mac_tx_can_push(hw, txq)) {
4272                        ret = ath10k_mac_tx_push_txq(hw, txq);
4273                        if (ret < 0)
4274                                break;
4275                }
4276                ieee80211_return_txq(hw, txq, false);
4277                ath10k_htt_tx_txq_update(hw, txq);
4278                if (ret == -EBUSY)
4279                        break;
4280        }
4281        ieee80211_txq_schedule_end(hw, ac);
4282
4283        return ret;
4284}
4285
4286void ath10k_mac_tx_push_pending(struct ath10k *ar)
4287{
4288        struct ieee80211_hw *hw = ar->hw;
4289        u32 ac;
4290
4291        if (ar->htt.tx_q_state.mode != HTT_TX_MODE_SWITCH_PUSH)
4292                return;
4293
4294        if (ar->htt.num_pending_tx >= (ar->htt.max_num_pending_tx / 2))
4295                return;
4296
4297        rcu_read_lock();
4298        for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
4299                if (ath10k_mac_schedule_txq(hw, ac) == -EBUSY)
4300                        break;
4301        }
4302        rcu_read_unlock();
4303}
4304EXPORT_SYMBOL(ath10k_mac_tx_push_pending);
4305
4306/************/
4307/* Scanning */
4308/************/
4309
4310void __ath10k_scan_finish(struct ath10k *ar)
4311{
4312        lockdep_assert_held(&ar->data_lock);
4313
4314        switch (ar->scan.state) {
4315        case ATH10K_SCAN_IDLE:
4316                break;
4317        case ATH10K_SCAN_RUNNING:
4318        case ATH10K_SCAN_ABORTING:
4319                if (!ar->scan.is_roc) {
4320                        struct cfg80211_scan_info info = {
4321                                .aborted = (ar->scan.state ==
4322                                            ATH10K_SCAN_ABORTING),
4323                        };
4324
4325                        ieee80211_scan_completed(ar->hw, &info);
4326                } else if (ar->scan.roc_notify) {
4327                        ieee80211_remain_on_channel_expired(ar->hw);
4328                }
4329                fallthrough;
4330        case ATH10K_SCAN_STARTING:
4331                ar->scan.state = ATH10K_SCAN_IDLE;
4332                ar->scan_channel = NULL;
4333                ar->scan.roc_freq = 0;
4334                ath10k_offchan_tx_purge(ar);
4335                cancel_delayed_work(&ar->scan.timeout);
4336                complete(&ar->scan.completed);
4337                break;
4338        }
4339}
4340
4341void ath10k_scan_finish(struct ath10k *ar)
4342{
4343        spin_lock_bh(&ar->data_lock);
4344        __ath10k_scan_finish(ar);
4345        spin_unlock_bh(&ar->data_lock);
4346}
4347
4348static int ath10k_scan_stop(struct ath10k *ar)
4349{
4350        struct wmi_stop_scan_arg arg = {
4351                .req_id = 1, /* FIXME */
4352                .req_type = WMI_SCAN_STOP_ONE,
4353                .u.scan_id = ATH10K_SCAN_ID,
4354        };
4355        int ret;
4356
4357        lockdep_assert_held(&ar->conf_mutex);
4358
4359        ret = ath10k_wmi_stop_scan(ar, &arg);
4360        if (ret) {
4361                ath10k_warn(ar, "failed to stop wmi scan: %d\n", ret);
4362                goto out;
4363        }
4364
4365        ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ);
4366        if (ret == 0) {
4367                ath10k_warn(ar, "failed to receive scan abortion completion: timed out\n");
4368                ret = -ETIMEDOUT;
4369        } else if (ret > 0) {
4370                ret = 0;
4371        }
4372
4373out:
4374        /* Scan state should be updated upon scan completion but in case
4375         * firmware fails to deliver the event (for whatever reason) it is
4376         * desired to clean up scan state anyway. Firmware may have just
4377         * dropped the scan completion event delivery due to transport pipe
4378         * being overflown with data and/or it can recover on its own before
4379         * next scan request is submitted.
4380         */
4381        spin_lock_bh(&ar->data_lock);
4382        if (ar->scan.state != ATH10K_SCAN_IDLE)
4383                __ath10k_scan_finish(ar);
4384        spin_unlock_bh(&ar->data_lock);
4385
4386        return ret;
4387}
4388
4389static void ath10k_scan_abort(struct ath10k *ar)
4390{
4391        int ret;
4392
4393        lockdep_assert_held(&ar->conf_mutex);
4394
4395        spin_lock_bh(&ar->data_lock);
4396
4397        switch (ar->scan.state) {
4398        case ATH10K_SCAN_IDLE:
4399                /* This can happen if timeout worker kicked in and called
4400                 * abortion while scan completion was being processed.
4401                 */
4402                break;
4403        case ATH10K_SCAN_STARTING:
4404        case ATH10K_SCAN_ABORTING:
4405                ath10k_warn(ar, "refusing scan abortion due to invalid scan state: %s (%d)\n",
4406                            ath10k_scan_state_str(ar->scan.state),
4407                            ar->scan.state);
4408                break;
4409        case ATH10K_SCAN_RUNNING:
4410                ar->scan.state = ATH10K_SCAN_ABORTING;
4411                spin_unlock_bh(&ar->data_lock);
4412
4413                ret = ath10k_scan_stop(ar);
4414                if (ret)
4415                        ath10k_warn(ar, "failed to abort scan: %d\n", ret);
4416
4417                spin_lock_bh(&ar->data_lock);
4418                break;
4419        }
4420
4421        spin_unlock_bh(&ar->data_lock);
4422}
4423
4424void ath10k_scan_timeout_work(struct work_struct *work)
4425{
4426        struct ath10k *ar = container_of(work, struct ath10k,
4427                                         scan.timeout.work);
4428
4429        mutex_lock(&ar->conf_mutex);
4430        ath10k_scan_abort(ar);
4431        mutex_unlock(&ar->conf_mutex);
4432}
4433
4434static int ath10k_start_scan(struct ath10k *ar,
4435                             const struct wmi_start_scan_arg *arg)
4436{
4437        int ret;
4438
4439        lockdep_assert_held(&ar->conf_mutex);
4440
4441        ret = ath10k_wmi_start_scan(ar, arg);
4442        if (ret)
4443                return ret;
4444
4445        ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ);
4446        if (ret == 0) {
4447                ret = ath10k_scan_stop(ar);
4448                if (ret)
4449                        ath10k_warn(ar, "failed to stop scan: %d\n", ret);
4450
4451                return -ETIMEDOUT;
4452        }
4453
4454        /* If we failed to start the scan, return error code at
4455         * this point.  This is probably due to some issue in the
4456         * firmware, but no need to wedge the driver due to that...
4457         */
4458        spin_lock_bh(&ar->data_lock);
4459        if (ar->scan.state == ATH10K_SCAN_IDLE) {
4460                spin_unlock_bh(&ar->data_lock);
4461                return -EINVAL;
4462        }
4463        spin_unlock_bh(&ar->data_lock);
4464
4465        return 0;
4466}
4467
4468/**********************/
4469/* mac80211 callbacks */
4470/**********************/
4471
4472static void ath10k_mac_op_tx(struct ieee80211_hw *hw,
4473                             struct ieee80211_tx_control *control,
4474                             struct sk_buff *skb)
4475{
4476        struct ath10k *ar = hw->priv;
4477        struct ath10k_htt *htt = &ar->htt;
4478        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
4479        struct ieee80211_vif *vif = info->control.vif;
4480        struct ieee80211_sta *sta = control->sta;
4481        struct ieee80211_txq *txq = NULL;
4482        struct ieee80211_hdr *hdr = (void *)skb->data;
4483        enum ath10k_hw_txrx_mode txmode;
4484        enum ath10k_mac_tx_path txpath;
4485        bool is_htt;
4486        bool is_mgmt;
4487        bool is_presp;
4488        int ret;
4489        u16 airtime;
4490
4491        airtime = ath10k_mac_update_airtime(ar, txq, skb);
4492        ath10k_mac_tx_h_fill_cb(ar, vif, txq, sta, skb, airtime);
4493
4494        txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb);
4495        txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode);
4496        is_htt = (txpath == ATH10K_MAC_TX_HTT ||
4497                  txpath == ATH10K_MAC_TX_HTT_MGMT);
4498        is_mgmt = (txpath == ATH10K_MAC_TX_HTT_MGMT);
4499
4500        if (is_htt) {
4501                spin_lock_bh(&ar->htt.tx_lock);
4502                is_presp = ieee80211_is_probe_resp(hdr->frame_control);
4503
4504                ret = ath10k_htt_tx_inc_pending(htt);
4505                if (ret) {
4506                        ath10k_warn(ar, "failed to increase tx pending count: %d, dropping\n",
4507                                    ret);
4508                        spin_unlock_bh(&ar->htt.tx_lock);
4509                        ieee80211_free_txskb(ar->hw, skb);
4510                        return;
4511                }
4512
4513                ret = ath10k_htt_tx_mgmt_inc_pending(htt, is_mgmt, is_presp);
4514                if (ret) {
4515                        ath10k_dbg(ar, ATH10K_DBG_MAC, "failed to increase tx mgmt pending count: %d, dropping\n",
4516                                   ret);
4517                        ath10k_htt_tx_dec_pending(htt);
4518                        spin_unlock_bh(&ar->htt.tx_lock);
4519                        ieee80211_free_txskb(ar->hw, skb);
4520                        return;
4521                }
4522                spin_unlock_bh(&ar->htt.tx_lock);
4523        }
4524
4525        ret = ath10k_mac_tx(ar, vif, txmode, txpath, skb, false);
4526        if (ret) {
4527                ath10k_warn(ar, "failed to transmit frame: %d\n", ret);
4528                if (is_htt) {
4529                        spin_lock_bh(&ar->htt.tx_lock);
4530                        ath10k_htt_tx_dec_pending(htt);
4531                        if (is_mgmt)
4532                                ath10k_htt_tx_mgmt_dec_pending(htt);
4533                        spin_unlock_bh(&ar->htt.tx_lock);
4534                }
4535                return;
4536        }
4537}
4538
4539static void ath10k_mac_op_wake_tx_queue(struct ieee80211_hw *hw,
4540                                        struct ieee80211_txq *txq)
4541{
4542        struct ath10k *ar = hw->priv;
4543        int ret;
4544        u8 ac;
4545
4546        ath10k_htt_tx_txq_update(hw, txq);
4547        if (ar->htt.tx_q_state.mode != HTT_TX_MODE_SWITCH_PUSH)
4548                return;
4549
4550        ac = txq->ac;
4551        ieee80211_txq_schedule_start(hw, ac);
4552        txq = ieee80211_next_txq(hw, ac);
4553        if (!txq)
4554                goto out;
4555
4556        while (ath10k_mac_tx_can_push(hw, txq)) {
4557                ret = ath10k_mac_tx_push_txq(hw, txq);
4558                if (ret < 0)
4559                        break;
4560        }
4561        ieee80211_return_txq(hw, txq, false);
4562        ath10k_htt_tx_txq_update(hw, txq);
4563out:
4564        ieee80211_txq_schedule_end(hw, ac);
4565}
4566
4567/* Must not be called with conf_mutex held as workers can use that also. */
4568void ath10k_drain_tx(struct ath10k *ar)
4569{
4570        /* make sure rcu-protected mac80211 tx path itself is drained */
4571        synchronize_net();
4572
4573        ath10k_offchan_tx_purge(ar);
4574        ath10k_mgmt_over_wmi_tx_purge(ar);
4575
4576        cancel_work_sync(&ar->offchan_tx_work);
4577        cancel_work_sync(&ar->wmi_mgmt_tx_work);
4578}
4579
4580void ath10k_halt(struct ath10k *ar)
4581{
4582        struct ath10k_vif *arvif;
4583
4584        lockdep_assert_held(&ar->conf_mutex);
4585
4586        clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
4587        ar->filter_flags = 0;
4588        ar->monitor = false;
4589        ar->monitor_arvif = NULL;
4590
4591        if (ar->monitor_started)
4592                ath10k_monitor_stop(ar);
4593
4594        ar->monitor_started = false;
4595        ar->tx_paused = 0;
4596
4597        ath10k_scan_finish(ar);
4598        ath10k_peer_cleanup_all(ar);
4599        ath10k_stop_radar_confirmation(ar);
4600        ath10k_core_stop(ar);
4601        ath10k_hif_power_down(ar);
4602
4603        spin_lock_bh(&ar->data_lock);
4604        list_for_each_entry(arvif, &ar->arvifs, list)
4605                ath10k_mac_vif_beacon_cleanup(arvif);
4606        spin_unlock_bh(&ar->data_lock);
4607}
4608
4609static int ath10k_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
4610{
4611        struct ath10k *ar = hw->priv;
4612
4613        mutex_lock(&ar->conf_mutex);
4614
4615        *tx_ant = ar->cfg_tx_chainmask;
4616        *rx_ant = ar->cfg_rx_chainmask;
4617
4618        mutex_unlock(&ar->conf_mutex);
4619
4620        return 0;
4621}
4622
4623static bool ath10k_check_chain_mask(struct ath10k *ar, u32 cm, const char *dbg)
4624{
4625        /* It is not clear that allowing gaps in chainmask
4626         * is helpful.  Probably it will not do what user
4627         * is hoping for, so warn in that case.
4628         */
4629        if (cm == 15 || cm == 7 || cm == 3 || cm == 1 || cm == 0)
4630                return true;
4631
4632        ath10k_warn(ar, "mac %s antenna chainmask is invalid: 0x%x.  Suggested values: 15, 7, 3, 1 or 0.\n",
4633                    dbg, cm);
4634        return false;
4635}
4636
4637static int ath10k_mac_get_vht_cap_bf_sts(struct ath10k *ar)
4638{
4639        int nsts = ar->vht_cap_info;
4640
4641        nsts &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
4642        nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
4643
4644        /* If firmware does not deliver to host number of space-time
4645         * streams supported, assume it support up to 4 BF STS and return
4646         * the value for VHT CAP: nsts-1)
4647         */
4648        if (nsts == 0)
4649                return 3;
4650
4651        return nsts;
4652}
4653
4654static int ath10k_mac_get_vht_cap_bf_sound_dim(struct ath10k *ar)
4655{
4656        int sound_dim = ar->vht_cap_info;
4657
4658        sound_dim &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
4659        sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
4660
4661        /* If the sounding dimension is not advertised by the firmware,
4662         * let's use a default value of 1
4663         */
4664        if (sound_dim == 0)
4665                return 1;
4666
4667        return sound_dim;
4668}
4669
4670static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
4671{
4672        struct ieee80211_sta_vht_cap vht_cap = {0};
4673        struct ath10k_hw_params *hw = &ar->hw_params;
4674        u16 mcs_map;
4675        u32 val;
4676        int i;
4677
4678        vht_cap.vht_supported = 1;
4679        vht_cap.cap = ar->vht_cap_info;
4680
4681        if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
4682                                IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
4683                val = ath10k_mac_get_vht_cap_bf_sts(ar);
4684                val <<= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
4685                val &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
4686
4687                vht_cap.cap |= val;
4688        }
4689
4690        if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
4691                                IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
4692                val = ath10k_mac_get_vht_cap_bf_sound_dim(ar);
4693                val <<= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
4694                val &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
4695
4696                vht_cap.cap |= val;
4697        }
4698
4699        mcs_map = 0;
4700        for (i = 0; i < 8; i++) {
4701                if ((i < ar->num_rf_chains) && (ar->cfg_tx_chainmask & BIT(i)))
4702                        mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
4703                else
4704                        mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
4705        }
4706
4707        if (ar->cfg_tx_chainmask <= 1)
4708                vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC;
4709
4710        vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
4711        vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
4712
4713        /* If we are supporting 160Mhz or 80+80, then the NIC may be able to do
4714         * a restricted NSS for 160 or 80+80 vs what it can do for 80Mhz.  Give
4715         * user-space a clue if that is the case.
4716         */
4717        if ((vht_cap.cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) &&
4718            (hw->vht160_mcs_rx_highest != 0 ||
4719             hw->vht160_mcs_tx_highest != 0)) {
4720                vht_cap.vht_mcs.rx_highest = cpu_to_le16(hw->vht160_mcs_rx_highest);
4721                vht_cap.vht_mcs.tx_highest = cpu_to_le16(hw->vht160_mcs_tx_highest);
4722        }
4723
4724        return vht_cap;
4725}
4726
4727static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
4728{
4729        int i;
4730        struct ieee80211_sta_ht_cap ht_cap = {0};
4731
4732        if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
4733                return ht_cap;
4734
4735        ht_cap.ht_supported = 1;
4736        ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
4737        ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
4738        ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
4739        ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
4740        ht_cap.cap |=
4741                WLAN_HT_CAP_SM_PS_DISABLED << IEEE80211_HT_CAP_SM_PS_SHIFT;
4742
4743        if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
4744                ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
4745
4746        if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
4747                ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
4748
4749        if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
4750                u32 smps;
4751
4752                smps   = WLAN_HT_CAP_SM_PS_DYNAMIC;
4753                smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
4754
4755                ht_cap.cap |= smps;
4756        }
4757
4758        if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC && (ar->cfg_tx_chainmask > 1))
4759                ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
4760
4761        if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
4762                u32 stbc;
4763
4764                stbc   = ar->ht_cap_info;
4765                stbc  &= WMI_HT_CAP_RX_STBC;
4766                stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
4767                stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
4768                stbc  &= IEEE80211_HT_CAP_RX_STBC;
4769
4770                ht_cap.cap |= stbc;
4771        }
4772
4773        if (ar->ht_cap_info & WMI_HT_CAP_LDPC || (ar->ht_cap_info &
4774            WMI_HT_CAP_RX_LDPC && (ar->ht_cap_info & WMI_HT_CAP_TX_LDPC)))
4775                ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
4776
4777        if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
4778                ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
4779
4780        /* max AMSDU is implicitly taken from vht_cap_info */
4781        if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
4782                ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
4783
4784        for (i = 0; i < ar->num_rf_chains; i++) {
4785                if (ar->cfg_rx_chainmask & BIT(i))
4786                        ht_cap.mcs.rx_mask[i] = 0xFF;
4787        }
4788
4789        ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
4790
4791        return ht_cap;
4792}
4793
4794static void ath10k_mac_setup_ht_vht_cap(struct ath10k *ar)
4795{
4796        struct ieee80211_supported_band *band;
4797        struct ieee80211_sta_vht_cap vht_cap;
4798        struct ieee80211_sta_ht_cap ht_cap;
4799
4800        ht_cap = ath10k_get_ht_cap(ar);
4801        vht_cap = ath10k_create_vht_cap(ar);
4802
4803        if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
4804                band = &ar->mac.sbands[NL80211_BAND_2GHZ];
4805                band->ht_cap = ht_cap;
4806        }
4807        if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
4808                band = &ar->mac.sbands[NL80211_BAND_5GHZ];
4809                band->ht_cap = ht_cap;
4810                band->vht_cap = vht_cap;
4811        }
4812}
4813
4814static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant)
4815{
4816        int ret;
4817        bool is_valid_tx_chain_mask, is_valid_rx_chain_mask;
4818
4819        lockdep_assert_held(&ar->conf_mutex);
4820
4821        is_valid_tx_chain_mask = ath10k_check_chain_mask(ar, tx_ant, "tx");
4822        is_valid_rx_chain_mask = ath10k_check_chain_mask(ar, rx_ant, "rx");
4823
4824        if (!is_valid_tx_chain_mask || !is_valid_rx_chain_mask)
4825                return -EINVAL;
4826
4827        ar->cfg_tx_chainmask = tx_ant;
4828        ar->cfg_rx_chainmask = rx_ant;
4829
4830        if ((ar->state != ATH10K_STATE_ON) &&
4831            (ar->state != ATH10K_STATE_RESTARTED))
4832                return 0;
4833
4834        ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask,
4835                                        tx_ant);
4836        if (ret) {
4837                ath10k_warn(ar, "failed to set tx-chainmask: %d, req 0x%x\n",
4838                            ret, tx_ant);
4839                return ret;
4840        }
4841
4842        ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask,
4843                                        rx_ant);
4844        if (ret) {
4845                ath10k_warn(ar, "failed to set rx-chainmask: %d, req 0x%x\n",
4846                            ret, rx_ant);
4847                return ret;
4848        }
4849
4850        /* Reload HT/VHT capability */
4851        ath10k_mac_setup_ht_vht_cap(ar);
4852
4853        return 0;
4854}
4855
4856static int ath10k_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
4857{
4858        struct ath10k *ar = hw->priv;
4859        int ret;
4860
4861        mutex_lock(&ar->conf_mutex);
4862        ret = __ath10k_set_antenna(ar, tx_ant, rx_ant);
4863        mutex_unlock(&ar->conf_mutex);
4864        return ret;
4865}
4866
4867static int __ath10k_fetch_bb_timing_dt(struct ath10k *ar,
4868                                       struct wmi_bb_timing_cfg_arg *bb_timing)
4869{
4870        struct device_node *node;
4871        const char *fem_name;
4872        int ret;
4873
4874        node = ar->dev->of_node;
4875        if (!node)
4876                return -ENOENT;
4877
4878        ret = of_property_read_string_index(node, "ext-fem-name", 0, &fem_name);
4879        if (ret)
4880                return -ENOENT;
4881
4882        /*
4883         * If external Front End module used in hardware, then default base band timing
4884         * parameter cannot be used since they were fine tuned for reference hardware,
4885         * so choosing different value suitable for that external FEM.
4886         */
4887        if (!strcmp("microsemi-lx5586", fem_name)) {
4888                bb_timing->bb_tx_timing = 0x00;
4889                bb_timing->bb_xpa_timing = 0x0101;
4890        } else {
4891                return -ENOENT;
4892        }
4893
4894        ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot bb_tx_timing 0x%x bb_xpa_timing 0x%x\n",
4895                   bb_timing->bb_tx_timing, bb_timing->bb_xpa_timing);
4896        return 0;
4897}
4898
4899static int ath10k_mac_rfkill_config(struct ath10k *ar)
4900{
4901        u32 param;
4902        int ret;
4903
4904        if (ar->hw_values->rfkill_pin == 0) {
4905                ath10k_warn(ar, "ath10k does not support hardware rfkill with this device\n");
4906                return -EOPNOTSUPP;
4907        }
4908
4909        ath10k_dbg(ar, ATH10K_DBG_MAC,
4910                   "mac rfkill_pin %d rfkill_cfg %d rfkill_on_level %d",
4911                   ar->hw_values->rfkill_pin, ar->hw_values->rfkill_cfg,
4912                   ar->hw_values->rfkill_on_level);
4913
4914        param = FIELD_PREP(WMI_TLV_RFKILL_CFG_RADIO_LEVEL,
4915                           ar->hw_values->rfkill_on_level) |
4916                FIELD_PREP(WMI_TLV_RFKILL_CFG_GPIO_PIN_NUM,
4917                           ar->hw_values->rfkill_pin) |
4918                FIELD_PREP(WMI_TLV_RFKILL_CFG_PIN_AS_GPIO,
4919                           ar->hw_values->rfkill_cfg);
4920
4921        ret = ath10k_wmi_pdev_set_param(ar,
4922                                        ar->wmi.pdev_param->rfkill_config,
4923                                        param);
4924        if (ret) {
4925                ath10k_warn(ar,
4926                            "failed to set rfkill config 0x%x: %d\n",
4927                            param, ret);
4928                return ret;
4929        }
4930        return 0;
4931}
4932
4933int ath10k_mac_rfkill_enable_radio(struct ath10k *ar, bool enable)
4934{
4935        enum wmi_tlv_rfkill_enable_radio param;
4936        int ret;
4937
4938        if (enable)
4939                param = WMI_TLV_RFKILL_ENABLE_RADIO_ON;
4940        else
4941                param = WMI_TLV_RFKILL_ENABLE_RADIO_OFF;
4942
4943        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac rfkill enable %d", param);
4944
4945        ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rfkill_enable,
4946                                        param);
4947        if (ret) {
4948                ath10k_warn(ar, "failed to set rfkill enable param %d: %d\n",
4949                            param, ret);
4950                return ret;
4951        }
4952
4953        return 0;
4954}
4955
4956static int ath10k_start(struct ieee80211_hw *hw)
4957{
4958        struct ath10k *ar = hw->priv;
4959        u32 param;
4960        int ret = 0;
4961        struct wmi_bb_timing_cfg_arg bb_timing = {0};
4962
4963        /*
4964         * This makes sense only when restarting hw. It is harmless to call
4965         * unconditionally. This is necessary to make sure no HTT/WMI tx
4966         * commands will be submitted while restarting.
4967         */
4968        ath10k_drain_tx(ar);
4969
4970        mutex_lock(&ar->conf_mutex);
4971
4972        switch (ar->state) {
4973        case ATH10K_STATE_OFF:
4974                ar->state = ATH10K_STATE_ON;
4975                break;
4976        case ATH10K_STATE_RESTARTING:
4977                ar->state = ATH10K_STATE_RESTARTED;
4978                break;
4979        case ATH10K_STATE_ON:
4980        case ATH10K_STATE_RESTARTED:
4981        case ATH10K_STATE_WEDGED:
4982                WARN_ON(1);
4983                ret = -EINVAL;
4984                goto err;
4985        case ATH10K_STATE_UTF:
4986                ret = -EBUSY;
4987                goto err;
4988        }
4989
4990        spin_lock_bh(&ar->data_lock);
4991
4992        if (ar->hw_rfkill_on) {
4993                ar->hw_rfkill_on = false;
4994                spin_unlock_bh(&ar->data_lock);
4995                goto err;
4996        }
4997
4998        spin_unlock_bh(&ar->data_lock);
4999
5000        ret = ath10k_hif_power_up(ar, ATH10K_FIRMWARE_MODE_NORMAL);
5001        if (ret) {
5002                ath10k_err(ar, "Could not init hif: %d\n", ret);
5003                goto err_off;
5004        }
5005
5006        ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_NORMAL,
5007                                &ar->normal_mode_fw);
5008        if (ret) {
5009                ath10k_err(ar, "Could not init core: %d\n", ret);
5010                goto err_power_down;
5011        }
5012
5013        if (ar->sys_cap_info & WMI_TLV_SYS_CAP_INFO_RFKILL) {
5014                ret = ath10k_mac_rfkill_config(ar);
5015                if (ret && ret != -EOPNOTSUPP) {
5016                        ath10k_warn(ar, "failed to configure rfkill: %d", ret);
5017                        goto err_core_stop;
5018                }
5019        }
5020
5021        param = ar->wmi.pdev_param->pmf_qos;
5022        ret = ath10k_wmi_pdev_set_param(ar, param, 1);
5023        if (ret) {
5024                ath10k_warn(ar, "failed to enable PMF QOS: %d\n", ret);
5025                goto err_core_stop;
5026        }
5027
5028        param = ar->wmi.pdev_param->dynamic_bw;
5029        ret = ath10k_wmi_pdev_set_param(ar, param, 1);
5030        if (ret) {
5031                ath10k_warn(ar, "failed to enable dynamic BW: %d\n", ret);
5032                goto err_core_stop;
5033        }
5034
5035        if (test_bit(WMI_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi.svc_map)) {
5036                ret = ath10k_wmi_scan_prob_req_oui(ar, ar->mac_addr);
5037                if (ret) {
5038                        ath10k_err(ar, "failed to set prob req oui: %i\n", ret);
5039                        goto err_core_stop;
5040                }
5041        }
5042
5043        if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) {
5044                ret = ath10k_wmi_adaptive_qcs(ar, true);
5045                if (ret) {
5046                        ath10k_warn(ar, "failed to enable adaptive qcs: %d\n",
5047                                    ret);
5048                        goto err_core_stop;
5049                }
5050        }
5051
5052        if (test_bit(WMI_SERVICE_BURST, ar->wmi.svc_map)) {
5053                param = ar->wmi.pdev_param->burst_enable;
5054                ret = ath10k_wmi_pdev_set_param(ar, param, 0);
5055                if (ret) {
5056                        ath10k_warn(ar, "failed to disable burst: %d\n", ret);
5057                        goto err_core_stop;
5058                }
5059        }
5060
5061        param = ar->wmi.pdev_param->idle_ps_config;
5062        ret = ath10k_wmi_pdev_set_param(ar, param, 1);
5063        if (ret && ret != -EOPNOTSUPP) {
5064                ath10k_warn(ar, "failed to enable idle_ps_config: %d\n", ret);
5065                goto err_core_stop;
5066        }
5067
5068        __ath10k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask);
5069
5070        /*
5071         * By default FW set ARP frames ac to voice (6). In that case ARP
5072         * exchange is not working properly for UAPSD enabled AP. ARP requests
5073         * which arrives with access category 0 are processed by network stack
5074         * and send back with access category 0, but FW changes access category
5075         * to 6. Set ARP frames access category to best effort (0) solves
5076         * this problem.
5077         */
5078
5079        param = ar->wmi.pdev_param->arp_ac_override;
5080        ret = ath10k_wmi_pdev_set_param(ar, param, 0);
5081        if (ret) {
5082                ath10k_warn(ar, "failed to set arp ac override parameter: %d\n",
5083                            ret);
5084                goto err_core_stop;
5085        }
5086
5087        if (test_bit(ATH10K_FW_FEATURE_SUPPORTS_ADAPTIVE_CCA,
5088                     ar->running_fw->fw_file.fw_features)) {
5089                ret = ath10k_wmi_pdev_enable_adaptive_cca(ar, 1,
5090                                                          WMI_CCA_DETECT_LEVEL_AUTO,
5091                                                          WMI_CCA_DETECT_MARGIN_AUTO);
5092                if (ret) {
5093                        ath10k_warn(ar, "failed to enable adaptive cca: %d\n",
5094                                    ret);
5095                        goto err_core_stop;
5096                }
5097        }
5098
5099        param = ar->wmi.pdev_param->ani_enable;
5100        ret = ath10k_wmi_pdev_set_param(ar, param, 1);
5101        if (ret) {
5102                ath10k_warn(ar, "failed to enable ani by default: %d\n",
5103                            ret);
5104                goto err_core_stop;
5105        }
5106
5107        ar->ani_enabled = true;
5108
5109        if (ath10k_peer_stats_enabled(ar)) {
5110                param = ar->wmi.pdev_param->peer_stats_update_period;
5111                ret = ath10k_wmi_pdev_set_param(ar, param,
5112                                                PEER_DEFAULT_STATS_UPDATE_PERIOD);
5113                if (ret) {
5114                        ath10k_warn(ar,
5115                                    "failed to set peer stats period : %d\n",
5116                                    ret);
5117                        goto err_core_stop;
5118                }
5119        }
5120
5121        param = ar->wmi.pdev_param->enable_btcoex;
5122        if (test_bit(WMI_SERVICE_COEX_GPIO, ar->wmi.svc_map) &&
5123            test_bit(ATH10K_FW_FEATURE_BTCOEX_PARAM,
5124                     ar->running_fw->fw_file.fw_features) &&
5125            ar->coex_support) {
5126                ret = ath10k_wmi_pdev_set_param(ar, param, 0);
5127                if (ret) {
5128                        ath10k_warn(ar,
5129                                    "failed to set btcoex param: %d\n", ret);
5130                        goto err_core_stop;
5131                }
5132                clear_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags);
5133        }
5134
5135        if (test_bit(WMI_SERVICE_BB_TIMING_CONFIG_SUPPORT, ar->wmi.svc_map)) {
5136                ret = __ath10k_fetch_bb_timing_dt(ar, &bb_timing);
5137                if (!ret) {
5138                        ret = ath10k_wmi_pdev_bb_timing(ar, &bb_timing);
5139                        if (ret) {
5140                                ath10k_warn(ar,
5141                                            "failed to set bb timings: %d\n",
5142                                            ret);
5143                                goto err_core_stop;
5144                        }
5145                }
5146        }
5147
5148        ar->num_started_vdevs = 0;
5149        ath10k_regd_update(ar);
5150
5151        ath10k_spectral_start(ar);
5152        ath10k_thermal_set_throttling(ar);
5153
5154        ar->radar_conf_state = ATH10K_RADAR_CONFIRMATION_IDLE;
5155
5156        mutex_unlock(&ar->conf_mutex);
5157        return 0;
5158
5159err_core_stop:
5160        ath10k_core_stop(ar);
5161
5162err_power_down:
5163        ath10k_hif_power_down(ar);
5164
5165err_off:
5166        ar->state = ATH10K_STATE_OFF;
5167
5168err:
5169        mutex_unlock(&ar->conf_mutex);
5170        return ret;
5171}
5172
5173static void ath10k_stop(struct ieee80211_hw *hw)
5174{
5175        struct ath10k *ar = hw->priv;
5176
5177        ath10k_drain_tx(ar);
5178
5179        mutex_lock(&ar->conf_mutex);
5180        if (ar->state != ATH10K_STATE_OFF) {
5181                if (!ar->hw_rfkill_on)
5182                        ath10k_halt(ar);
5183                ar->state = ATH10K_STATE_OFF;
5184        }
5185        mutex_unlock(&ar->conf_mutex);
5186
5187        cancel_work_sync(&ar->set_coverage_class_work);
5188        cancel_delayed_work_sync(&ar->scan.timeout);
5189        cancel_work_sync(&ar->restart_work);
5190}
5191
5192static int ath10k_config_ps(struct ath10k *ar)
5193{
5194        struct ath10k_vif *arvif;
5195        int ret = 0;
5196
5197        lockdep_assert_held(&ar->conf_mutex);
5198
5199        list_for_each_entry(arvif, &ar->arvifs, list) {
5200                ret = ath10k_mac_vif_setup_ps(arvif);
5201                if (ret) {
5202                        ath10k_warn(ar, "failed to setup powersave: %d\n", ret);
5203                        break;
5204                }
5205        }
5206
5207        return ret;
5208}
5209
5210static int ath10k_mac_txpower_setup(struct ath10k *ar, int txpower)
5211{
5212        int ret;
5213        u32 param;
5214
5215        lockdep_assert_held(&ar->conf_mutex);
5216
5217        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac txpower %d\n", txpower);
5218
5219        param = ar->wmi.pdev_param->txpower_limit2g;
5220        ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
5221        if (ret) {
5222                ath10k_warn(ar, "failed to set 2g txpower %d: %d\n",
5223                            txpower, ret);
5224                return ret;
5225        }
5226
5227        param = ar->wmi.pdev_param->txpower_limit5g;
5228        ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
5229        if (ret) {
5230                ath10k_warn(ar, "failed to set 5g txpower %d: %d\n",
5231                            txpower, ret);
5232                return ret;
5233        }
5234
5235        return 0;
5236}
5237
5238static int ath10k_mac_txpower_recalc(struct ath10k *ar)
5239{
5240        struct ath10k_vif *arvif;
5241        int ret, txpower = -1;
5242
5243        lockdep_assert_held(&ar->conf_mutex);
5244
5245        list_for_each_entry(arvif, &ar->arvifs, list) {
5246                /* txpower not initialized yet? */
5247                if (arvif->txpower == INT_MIN)
5248                        continue;
5249
5250                if (txpower == -1)
5251                        txpower = arvif->txpower;
5252                else
5253                        txpower = min(txpower, arvif->txpower);
5254        }
5255
5256        if (txpower == -1)
5257                return 0;
5258
5259        ret = ath10k_mac_txpower_setup(ar, txpower);
5260        if (ret) {
5261                ath10k_warn(ar, "failed to setup tx power %d: %d\n",
5262                            txpower, ret);
5263                return ret;
5264        }
5265
5266        return 0;
5267}
5268
5269static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
5270{
5271        struct ath10k *ar = hw->priv;
5272        struct ieee80211_conf *conf = &hw->conf;
5273        int ret = 0;
5274
5275        mutex_lock(&ar->conf_mutex);
5276
5277        if (changed & IEEE80211_CONF_CHANGE_PS)
5278                ath10k_config_ps(ar);
5279
5280        if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
5281                ar->monitor = conf->flags & IEEE80211_CONF_MONITOR;
5282                ret = ath10k_monitor_recalc(ar);
5283                if (ret)
5284                        ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
5285        }
5286
5287        mutex_unlock(&ar->conf_mutex);
5288        return ret;
5289}
5290
5291static u32 get_nss_from_chainmask(u16 chain_mask)
5292{
5293        if ((chain_mask & 0xf) == 0xf)
5294                return 4;
5295        else if ((chain_mask & 0x7) == 0x7)
5296                return 3;
5297        else if ((chain_mask & 0x3) == 0x3)
5298                return 2;
5299        return 1;
5300}
5301
5302static int ath10k_mac_set_txbf_conf(struct ath10k_vif *arvif)
5303{
5304        u32 value = 0;
5305        struct ath10k *ar = arvif->ar;
5306        int nsts;
5307        int sound_dim;
5308
5309        if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_BEFORE_ASSOC)
5310                return 0;
5311
5312        nsts = ath10k_mac_get_vht_cap_bf_sts(ar);
5313        if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
5314                                IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE))
5315                value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
5316
5317        sound_dim = ath10k_mac_get_vht_cap_bf_sound_dim(ar);
5318        if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
5319                                IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE))
5320                value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET);
5321
5322        if (!value)
5323                return 0;
5324
5325        if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)
5326                value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
5327
5328        if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)
5329                value |= (WMI_VDEV_PARAM_TXBF_MU_TX_BFER |
5330                          WMI_VDEV_PARAM_TXBF_SU_TX_BFER);
5331
5332        if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)
5333                value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
5334
5335        if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)
5336                value |= (WMI_VDEV_PARAM_TXBF_MU_TX_BFEE |
5337                          WMI_VDEV_PARAM_TXBF_SU_TX_BFEE);
5338
5339        return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
5340                                         ar->wmi.vdev_param->txbf, value);
5341}
5342
5343/*
5344 * TODO:
5345 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
5346 * because we will send mgmt frames without CCK. This requirement
5347 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
5348 * in the TX packet.
5349 */
5350static int ath10k_add_interface(struct ieee80211_hw *hw,
5351                                struct ieee80211_vif *vif)
5352{
5353        struct ath10k *ar = hw->priv;
5354        struct ath10k_vif *arvif = (void *)vif->drv_priv;
5355        struct ath10k_peer *peer;
5356        enum wmi_sta_powersave_param param;
5357        int ret = 0;
5358        u32 value;
5359        int bit;
5360        int i;
5361        u32 vdev_param;
5362
5363        vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
5364
5365        mutex_lock(&ar->conf_mutex);
5366
5367        memset(arvif, 0, sizeof(*arvif));
5368        ath10k_mac_txq_init(vif->txq);
5369
5370        arvif->ar = ar;
5371        arvif->vif = vif;
5372
5373        INIT_LIST_HEAD(&arvif->list);
5374        INIT_WORK(&arvif->ap_csa_work, ath10k_mac_vif_ap_csa_work);
5375        INIT_DELAYED_WORK(&arvif->connection_loss_work,
5376                          ath10k_mac_vif_sta_connection_loss_work);
5377
5378        for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
5379                arvif->bitrate_mask.control[i].legacy = 0xffffffff;
5380                memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
5381                       sizeof(arvif->bitrate_mask.control[i].ht_mcs));
5382                memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
5383                       sizeof(arvif->bitrate_mask.control[i].vht_mcs));
5384        }
5385
5386        if (ar->num_peers >= ar->max_num_peers) {
5387                ath10k_warn(ar, "refusing vdev creation due to insufficient peer entry resources in firmware\n");
5388                ret = -ENOBUFS;
5389                goto err;
5390        }
5391
5392        if (ar->free_vdev_map == 0) {
5393                ath10k_warn(ar, "Free vdev map is empty, no more interfaces allowed.\n");
5394                ret = -EBUSY;
5395                goto err;
5396        }
5397        bit = __ffs64(ar->free_vdev_map);
5398
5399        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac create vdev %i map %llx\n",
5400                   bit, ar->free_vdev_map);
5401
5402        arvif->vdev_id = bit;
5403        arvif->vdev_subtype =
5404                ath10k_wmi_get_vdev_subtype(ar, WMI_VDEV_SUBTYPE_NONE);
5405
5406        switch (vif->type) {
5407        case NL80211_IFTYPE_P2P_DEVICE:
5408                arvif->vdev_type = WMI_VDEV_TYPE_STA;
5409                arvif->vdev_subtype = ath10k_wmi_get_vdev_subtype
5410                                        (ar, WMI_VDEV_SUBTYPE_P2P_DEVICE);
5411                break;
5412        case NL80211_IFTYPE_UNSPECIFIED:
5413        case NL80211_IFTYPE_STATION:
5414                arvif->vdev_type = WMI_VDEV_TYPE_STA;
5415                if (vif->p2p)
5416                        arvif->vdev_subtype = ath10k_wmi_get_vdev_subtype
5417                                        (ar, WMI_VDEV_SUBTYPE_P2P_CLIENT);
5418                break;
5419        case NL80211_IFTYPE_ADHOC:
5420                arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
5421                break;
5422        case NL80211_IFTYPE_MESH_POINT:
5423                if (test_bit(WMI_SERVICE_MESH_11S, ar->wmi.svc_map)) {
5424                        arvif->vdev_subtype = ath10k_wmi_get_vdev_subtype
5425                                                (ar, WMI_VDEV_SUBTYPE_MESH_11S);
5426                } else if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
5427                        ret = -EINVAL;
5428                        ath10k_warn(ar, "must load driver with rawmode=1 to add mesh interfaces\n");
5429                        goto err;
5430                }
5431                arvif->vdev_type = WMI_VDEV_TYPE_AP;
5432                break;
5433        case NL80211_IFTYPE_AP:
5434                arvif->vdev_type = WMI_VDEV_TYPE_AP;
5435
5436                if (vif->p2p)
5437                        arvif->vdev_subtype = ath10k_wmi_get_vdev_subtype
5438                                                (ar, WMI_VDEV_SUBTYPE_P2P_GO);
5439                break;
5440        case NL80211_IFTYPE_MONITOR:
5441                arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
5442                break;
5443        default:
5444                WARN_ON(1);
5445                break;
5446        }
5447
5448        /* Using vdev_id as queue number will make it very easy to do per-vif
5449         * tx queue locking. This shouldn't wrap due to interface combinations
5450         * but do a modulo for correctness sake and prevent using offchannel tx
5451         * queues for regular vif tx.
5452         */
5453        vif->cab_queue = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1);
5454        for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
5455                vif->hw_queue[i] = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1);
5456
5457        /* Some firmware revisions don't wait for beacon tx completion before
5458         * sending another SWBA event. This could lead to hardware using old
5459         * (freed) beacon data in some cases, e.g. tx credit starvation
5460         * combined with missed TBTT. This is very rare.
5461         *
5462         * On non-IOMMU-enabled hosts this could be a possible security issue
5463         * because hw could beacon some random data on the air.  On
5464         * IOMMU-enabled hosts DMAR faults would occur in most cases and target
5465         * device would crash.
5466         *
5467         * Since there are no beacon tx completions (implicit nor explicit)
5468         * propagated to host the only workaround for this is to allocate a
5469         * DMA-coherent buffer for a lifetime of a vif and use it for all
5470         * beacon tx commands. Worst case for this approach is some beacons may
5471         * become corrupted, e.g. have garbled IEs or out-of-date TIM bitmap.
5472         */
5473        if (vif->type == NL80211_IFTYPE_ADHOC ||
5474            vif->type == NL80211_IFTYPE_MESH_POINT ||
5475            vif->type == NL80211_IFTYPE_AP) {
5476                arvif->beacon_buf = dma_alloc_coherent(ar->dev,
5477                                                       IEEE80211_MAX_FRAME_LEN,
5478                                                       &arvif->beacon_paddr,
5479                                                       GFP_ATOMIC);
5480                if (!arvif->beacon_buf) {
5481                        ret = -ENOMEM;
5482                        ath10k_warn(ar, "failed to allocate beacon buffer: %d\n",
5483                                    ret);
5484                        goto err;
5485                }
5486        }
5487        if (test_bit(ATH10K_FLAG_HW_CRYPTO_DISABLED, &ar->dev_flags))
5488                arvif->nohwcrypt = true;
5489
5490        if (arvif->nohwcrypt &&
5491            !test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
5492                ath10k_warn(ar, "cryptmode module param needed for sw crypto\n");
5493                goto err;
5494        }
5495
5496        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d bcnmode %s\n",
5497                   arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
5498                   arvif->beacon_buf ? "single-buf" : "per-skb");
5499
5500        ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
5501                                     arvif->vdev_subtype, vif->addr);
5502        if (ret) {
5503                ath10k_warn(ar, "failed to create WMI vdev %i: %d\n",
5504                            arvif->vdev_id, ret);
5505                goto err;
5506        }
5507
5508        if (test_bit(WMI_SERVICE_VDEV_DISABLE_4_ADDR_SRC_LRN_SUPPORT,
5509                     ar->wmi.svc_map)) {
5510                vdev_param = ar->wmi.vdev_param->disable_4addr_src_lrn;
5511                ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5512                                                WMI_VDEV_DISABLE_4_ADDR_SRC_LRN);
5513                if (ret && ret != -EOPNOTSUPP) {
5514                        ath10k_warn(ar, "failed to disable 4addr src lrn vdev %i: %d\n",
5515                                    arvif->vdev_id, ret);
5516                }
5517        }
5518
5519        ar->free_vdev_map &= ~(1LL << arvif->vdev_id);
5520        spin_lock_bh(&ar->data_lock);
5521        list_add(&arvif->list, &ar->arvifs);
5522        spin_unlock_bh(&ar->data_lock);
5523
5524        /* It makes no sense to have firmware do keepalives. mac80211 already
5525         * takes care of this with idle connection polling.
5526         */
5527        ret = ath10k_mac_vif_disable_keepalive(arvif);
5528        if (ret) {
5529                ath10k_warn(ar, "failed to disable keepalive on vdev %i: %d\n",
5530                            arvif->vdev_id, ret);
5531                goto err_vdev_delete;
5532        }
5533
5534        arvif->def_wep_key_idx = -1;
5535
5536        vdev_param = ar->wmi.vdev_param->tx_encap_type;
5537        ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5538                                        ATH10K_HW_TXRX_NATIVE_WIFI);
5539        /* 10.X firmware does not support this VDEV parameter. Do not warn */
5540        if (ret && ret != -EOPNOTSUPP) {
5541                ath10k_warn(ar, "failed to set vdev %i TX encapsulation: %d\n",
5542                            arvif->vdev_id, ret);
5543                goto err_vdev_delete;
5544        }
5545
5546        /* Configuring number of spatial stream for monitor interface is causing
5547         * target assert in qca9888 and qca6174.
5548         */
5549        if (ar->cfg_tx_chainmask && (vif->type != NL80211_IFTYPE_MONITOR)) {
5550                u16 nss = get_nss_from_chainmask(ar->cfg_tx_chainmask);
5551
5552                vdev_param = ar->wmi.vdev_param->nss;
5553                ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5554                                                nss);
5555                if (ret) {
5556                        ath10k_warn(ar, "failed to set vdev %i chainmask 0x%x, nss %i: %d\n",
5557                                    arvif->vdev_id, ar->cfg_tx_chainmask, nss,
5558                                    ret);
5559                        goto err_vdev_delete;
5560                }
5561        }
5562
5563        if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
5564            arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
5565                ret = ath10k_peer_create(ar, vif, NULL, arvif->vdev_id,
5566                                         vif->addr, WMI_PEER_TYPE_DEFAULT);
5567                if (ret) {
5568                        ath10k_warn(ar, "failed to create vdev %i peer for AP/IBSS: %d\n",
5569                                    arvif->vdev_id, ret);
5570                        goto err_vdev_delete;
5571                }
5572
5573                spin_lock_bh(&ar->data_lock);
5574
5575                peer = ath10k_peer_find(ar, arvif->vdev_id, vif->addr);
5576                if (!peer) {
5577                        ath10k_warn(ar, "failed to lookup peer %pM on vdev %i\n",
5578                                    vif->addr, arvif->vdev_id);
5579                        spin_unlock_bh(&ar->data_lock);
5580                        ret = -ENOENT;
5581                        goto err_peer_delete;
5582                }
5583
5584                arvif->peer_id = find_first_bit(peer->peer_ids,
5585                                                ATH10K_MAX_NUM_PEER_IDS);
5586
5587                spin_unlock_bh(&ar->data_lock);
5588        } else {
5589                arvif->peer_id = HTT_INVALID_PEERID;
5590        }
5591
5592        if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
5593                ret = ath10k_mac_set_kickout(arvif);
5594                if (ret) {
5595                        ath10k_warn(ar, "failed to set vdev %i kickout parameters: %d\n",
5596                                    arvif->vdev_id, ret);
5597                        goto err_peer_delete;
5598                }
5599        }
5600
5601        if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
5602                param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
5603                value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
5604                ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5605                                                  param, value);
5606                if (ret) {
5607                        ath10k_warn(ar, "failed to set vdev %i RX wake policy: %d\n",
5608                                    arvif->vdev_id, ret);
5609                        goto err_peer_delete;
5610                }
5611
5612                ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
5613                if (ret) {
5614                        ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
5615                                    arvif->vdev_id, ret);
5616                        goto err_peer_delete;
5617                }
5618
5619                ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
5620                if (ret) {
5621                        ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
5622                                    arvif->vdev_id, ret);
5623                        goto err_peer_delete;
5624                }
5625        }
5626
5627        ret = ath10k_mac_set_txbf_conf(arvif);
5628        if (ret) {
5629                ath10k_warn(ar, "failed to set txbf for vdev %d: %d\n",
5630                            arvif->vdev_id, ret);
5631                goto err_peer_delete;
5632        }
5633
5634        ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
5635        if (ret) {
5636                ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
5637                            arvif->vdev_id, ret);
5638                goto err_peer_delete;
5639        }
5640
5641        arvif->txpower = vif->bss_conf.txpower;
5642        ret = ath10k_mac_txpower_recalc(ar);
5643        if (ret) {
5644                ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
5645                goto err_peer_delete;
5646        }
5647
5648        if (test_bit(WMI_SERVICE_RTT_RESPONDER_ROLE, ar->wmi.svc_map)) {
5649                vdev_param = ar->wmi.vdev_param->rtt_responder_role;
5650                ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5651                                                arvif->ftm_responder);
5652
5653                /* It is harmless to not set FTM role. Do not warn */
5654                if (ret && ret != -EOPNOTSUPP)
5655                        ath10k_warn(ar, "failed to set vdev %i FTM Responder: %d\n",
5656                                    arvif->vdev_id, ret);
5657        }
5658
5659        if (vif->type == NL80211_IFTYPE_MONITOR) {
5660                ar->monitor_arvif = arvif;
5661                ret = ath10k_monitor_recalc(ar);
5662                if (ret) {
5663                        ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
5664                        goto err_peer_delete;
5665                }
5666        }
5667
5668        spin_lock_bh(&ar->htt.tx_lock);
5669        if (!ar->tx_paused)
5670                ieee80211_wake_queue(ar->hw, arvif->vdev_id);
5671        spin_unlock_bh(&ar->htt.tx_lock);
5672
5673        mutex_unlock(&ar->conf_mutex);
5674        return 0;
5675
5676err_peer_delete:
5677        if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
5678            arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
5679                ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr);
5680                ath10k_wait_for_peer_delete_done(ar, arvif->vdev_id,
5681                                                 vif->addr);
5682        }
5683
5684err_vdev_delete:
5685        ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
5686        ar->free_vdev_map |= 1LL << arvif->vdev_id;
5687        spin_lock_bh(&ar->data_lock);
5688        list_del(&arvif->list);
5689        spin_unlock_bh(&ar->data_lock);
5690
5691err:
5692        if (arvif->beacon_buf) {
5693                dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
5694                                  arvif->beacon_buf, arvif->beacon_paddr);
5695                arvif->beacon_buf = NULL;
5696        }
5697
5698        mutex_unlock(&ar->conf_mutex);
5699
5700        return ret;
5701}
5702
5703static void ath10k_mac_vif_tx_unlock_all(struct ath10k_vif *arvif)
5704{
5705        int i;
5706
5707        for (i = 0; i < BITS_PER_LONG; i++)
5708                ath10k_mac_vif_tx_unlock(arvif, i);
5709}
5710
5711static void ath10k_remove_interface(struct ieee80211_hw *hw,
5712                                    struct ieee80211_vif *vif)
5713{
5714        struct ath10k *ar = hw->priv;
5715        struct ath10k_vif *arvif = (void *)vif->drv_priv;
5716        struct ath10k_peer *peer;
5717        unsigned long time_left;
5718        int ret;
5719        int i;
5720
5721        cancel_work_sync(&arvif->ap_csa_work);
5722        cancel_delayed_work_sync(&arvif->connection_loss_work);
5723
5724        mutex_lock(&ar->conf_mutex);
5725
5726        ret = ath10k_spectral_vif_stop(arvif);
5727        if (ret)
5728                ath10k_warn(ar, "failed to stop spectral for vdev %i: %d\n",
5729                            arvif->vdev_id, ret);
5730
5731        ar->free_vdev_map |= 1LL << arvif->vdev_id;
5732        spin_lock_bh(&ar->data_lock);
5733        list_del(&arvif->list);
5734        spin_unlock_bh(&ar->data_lock);
5735
5736        if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
5737            arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
5738                ret = ath10k_wmi_peer_delete(arvif->ar, arvif->vdev_id,
5739                                             vif->addr);
5740                if (ret)
5741                        ath10k_warn(ar, "failed to submit AP/IBSS self-peer removal on vdev %i: %d\n",
5742                                    arvif->vdev_id, ret);
5743
5744                ath10k_wait_for_peer_delete_done(ar, arvif->vdev_id,
5745                                                 vif->addr);
5746                kfree(arvif->u.ap.noa_data);
5747        }
5748
5749        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i delete (remove interface)\n",
5750                   arvif->vdev_id);
5751
5752        ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
5753        if (ret)
5754                ath10k_warn(ar, "failed to delete WMI vdev %i: %d\n",
5755                            arvif->vdev_id, ret);
5756
5757        if (test_bit(WMI_SERVICE_SYNC_DELETE_CMDS, ar->wmi.svc_map)) {
5758                time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
5759                                                        ATH10K_VDEV_DELETE_TIMEOUT_HZ);
5760                if (time_left == 0) {
5761                        ath10k_warn(ar, "Timeout in receiving vdev delete response\n");
5762                        goto out;
5763                }
5764        }
5765
5766        /* Some firmware revisions don't notify host about self-peer removal
5767         * until after associated vdev is deleted.
5768         */
5769        if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
5770            arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
5771                ret = ath10k_wait_for_peer_deleted(ar, arvif->vdev_id,
5772                                                   vif->addr);
5773                if (ret)
5774                        ath10k_warn(ar, "failed to remove AP self-peer on vdev %i: %d\n",
5775                                    arvif->vdev_id, ret);
5776
5777                spin_lock_bh(&ar->data_lock);
5778                ar->num_peers--;
5779                spin_unlock_bh(&ar->data_lock);
5780        }
5781
5782        spin_lock_bh(&ar->data_lock);
5783        for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) {
5784                peer = ar->peer_map[i];
5785                if (!peer)
5786                        continue;
5787
5788                if (peer->vif == vif) {
5789                        ath10k_warn(ar, "found vif peer %pM entry on vdev %i after it was supposedly removed\n",
5790                                    vif->addr, arvif->vdev_id);
5791                        peer->vif = NULL;
5792                }
5793        }
5794
5795        /* Clean this up late, less opportunity for firmware to access
5796         * DMA memory we have deleted.
5797         */
5798        ath10k_mac_vif_beacon_cleanup(arvif);
5799        spin_unlock_bh(&ar->data_lock);
5800
5801        ath10k_peer_cleanup(ar, arvif->vdev_id);
5802        ath10k_mac_txq_unref(ar, vif->txq);
5803
5804        if (vif->type == NL80211_IFTYPE_MONITOR) {
5805                ar->monitor_arvif = NULL;
5806                ret = ath10k_monitor_recalc(ar);
5807                if (ret)
5808                        ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
5809        }
5810
5811        ret = ath10k_mac_txpower_recalc(ar);
5812        if (ret)
5813                ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
5814
5815        spin_lock_bh(&ar->htt.tx_lock);
5816        ath10k_mac_vif_tx_unlock_all(arvif);
5817        spin_unlock_bh(&ar->htt.tx_lock);
5818
5819        ath10k_mac_txq_unref(ar, vif->txq);
5820
5821out:
5822        mutex_unlock(&ar->conf_mutex);
5823}
5824
5825/*
5826 * FIXME: Has to be verified.
5827 */
5828#define SUPPORTED_FILTERS                       \
5829        (FIF_ALLMULTI |                         \
5830        FIF_CONTROL |                           \
5831        FIF_PSPOLL |                            \
5832        FIF_OTHER_BSS |                         \
5833        FIF_BCN_PRBRESP_PROMISC |               \
5834        FIF_PROBE_REQ |                         \
5835        FIF_FCSFAIL)
5836
5837static void ath10k_configure_filter(struct ieee80211_hw *hw,
5838                                    unsigned int changed_flags,
5839                                    unsigned int *total_flags,
5840                                    u64 multicast)
5841{
5842        struct ath10k *ar = hw->priv;
5843        int ret;
5844
5845        mutex_lock(&ar->conf_mutex);
5846
5847        changed_flags &= SUPPORTED_FILTERS;
5848        *total_flags &= SUPPORTED_FILTERS;
5849        ar->filter_flags = *total_flags;
5850
5851        ret = ath10k_monitor_recalc(ar);
5852        if (ret)
5853                ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
5854
5855        mutex_unlock(&ar->conf_mutex);
5856}
5857
5858static void ath10k_recalculate_mgmt_rate(struct ath10k *ar,
5859                                         struct ieee80211_vif *vif,
5860                                         struct cfg80211_chan_def *def)
5861{
5862        struct ath10k_vif *arvif = (void *)vif->drv_priv;
5863        const struct ieee80211_supported_band *sband;
5864        u8 basic_rate_idx;
5865        int hw_rate_code;
5866        u32 vdev_param;
5867        u16 bitrate;
5868        int ret;
5869
5870        lockdep_assert_held(&ar->conf_mutex);
5871
5872        sband = ar->hw->wiphy->bands[def->chan->band];
5873        basic_rate_idx = ffs(vif->bss_conf.basic_rates) - 1;
5874        bitrate = sband->bitrates[basic_rate_idx].bitrate;
5875
5876        hw_rate_code = ath10k_mac_get_rate_hw_value(bitrate);
5877        if (hw_rate_code < 0) {
5878                ath10k_warn(ar, "bitrate not supported %d\n", bitrate);
5879                return;
5880        }
5881
5882        vdev_param = ar->wmi.vdev_param->mgmt_rate;
5883        ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5884                                        hw_rate_code);
5885        if (ret)
5886                ath10k_warn(ar, "failed to set mgmt tx rate %d\n", ret);
5887}
5888
5889static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
5890                                    struct ieee80211_vif *vif,
5891                                    struct ieee80211_bss_conf *info,
5892                                    u32 changed)
5893{
5894        struct ath10k *ar = hw->priv;
5895        struct ath10k_vif *arvif = (void *)vif->drv_priv;
5896        struct cfg80211_chan_def def;
5897        u32 vdev_param, pdev_param, slottime, preamble;
5898        u16 bitrate, hw_value;
5899        u8 rate, rateidx;
5900        int ret = 0, mcast_rate;
5901        enum nl80211_band band;
5902
5903        mutex_lock(&ar->conf_mutex);
5904
5905        if (changed & BSS_CHANGED_IBSS)
5906                ath10k_control_ibss(arvif, info, vif->addr);
5907
5908        if (changed & BSS_CHANGED_BEACON_INT) {
5909                arvif->beacon_interval = info->beacon_int;
5910                vdev_param = ar->wmi.vdev_param->beacon_interval;
5911                ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5912                                                arvif->beacon_interval);
5913                ath10k_dbg(ar, ATH10K_DBG_MAC,
5914                           "mac vdev %d beacon_interval %d\n",
5915                           arvif->vdev_id, arvif->beacon_interval);
5916
5917                if (ret)
5918                        ath10k_warn(ar, "failed to set beacon interval for vdev %d: %i\n",
5919                                    arvif->vdev_id, ret);
5920        }
5921
5922        if (changed & BSS_CHANGED_BEACON) {
5923                ath10k_dbg(ar, ATH10K_DBG_MAC,
5924                           "vdev %d set beacon tx mode to staggered\n",
5925                           arvif->vdev_id);
5926
5927                pdev_param = ar->wmi.pdev_param->beacon_tx_mode;
5928                ret = ath10k_wmi_pdev_set_param(ar, pdev_param,
5929                                                WMI_BEACON_STAGGERED_MODE);
5930                if (ret)
5931                        ath10k_warn(ar, "failed to set beacon mode for vdev %d: %i\n",
5932                                    arvif->vdev_id, ret);
5933
5934                ret = ath10k_mac_setup_bcn_tmpl(arvif);
5935                if (ret)
5936                        ath10k_warn(ar, "failed to update beacon template: %d\n",
5937                                    ret);
5938
5939                if (ieee80211_vif_is_mesh(vif)) {
5940                        /* mesh doesn't use SSID but firmware needs it */
5941                        strncpy(arvif->u.ap.ssid, "mesh",
5942                                sizeof(arvif->u.ap.ssid));
5943                        arvif->u.ap.ssid_len = 4;
5944                }
5945        }
5946
5947        if (changed & BSS_CHANGED_AP_PROBE_RESP) {
5948                ret = ath10k_mac_setup_prb_tmpl(arvif);
5949                if (ret)
5950                        ath10k_warn(ar, "failed to setup probe resp template on vdev %i: %d\n",
5951                                    arvif->vdev_id, ret);
5952        }
5953
5954        if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
5955                arvif->dtim_period = info->dtim_period;
5956
5957                ath10k_dbg(ar, ATH10K_DBG_MAC,
5958                           "mac vdev %d dtim_period %d\n",
5959                           arvif->vdev_id, arvif->dtim_period);
5960
5961                vdev_param = ar->wmi.vdev_param->dtim_period;
5962                ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5963                                                arvif->dtim_period);
5964                if (ret)
5965                        ath10k_warn(ar, "failed to set dtim period for vdev %d: %i\n",
5966                                    arvif->vdev_id, ret);
5967        }
5968
5969        if (changed & BSS_CHANGED_SSID &&
5970            vif->type == NL80211_IFTYPE_AP) {
5971                arvif->u.ap.ssid_len = info->ssid_len;
5972                if (info->ssid_len)
5973                        memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
5974                arvif->u.ap.hidden_ssid = info->hidden_ssid;
5975        }
5976
5977        if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
5978                ether_addr_copy(arvif->bssid, info->bssid);
5979
5980        if (changed & BSS_CHANGED_FTM_RESPONDER &&
5981            arvif->ftm_responder != info->ftm_responder &&
5982            test_bit(WMI_SERVICE_RTT_RESPONDER_ROLE, ar->wmi.svc_map)) {
5983                arvif->ftm_responder = info->ftm_responder;
5984
5985                vdev_param = ar->wmi.vdev_param->rtt_responder_role;
5986                ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5987                                                arvif->ftm_responder);
5988
5989                ath10k_dbg(ar, ATH10K_DBG_MAC,
5990                           "mac vdev %d ftm_responder %d:ret %d\n",
5991                           arvif->vdev_id, arvif->ftm_responder, ret);
5992        }
5993
5994        if (changed & BSS_CHANGED_BEACON_ENABLED)
5995                ath10k_control_beaconing(arvif, info);
5996
5997        if (changed & BSS_CHANGED_ERP_CTS_PROT) {
5998                arvif->use_cts_prot = info->use_cts_prot;
5999
6000                ret = ath10k_recalc_rtscts_prot(arvif);
6001                if (ret)
6002                        ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
6003                                    arvif->vdev_id, ret);
6004
6005                if (ath10k_mac_can_set_cts_prot(arvif)) {
6006                        ret = ath10k_mac_set_cts_prot(arvif);
6007                        if (ret)
6008                                ath10k_warn(ar, "failed to set cts protection for vdev %d: %d\n",
6009                                            arvif->vdev_id, ret);
6010                }
6011        }
6012
6013        if (changed & BSS_CHANGED_ERP_SLOT) {
6014                if (info->use_short_slot)
6015                        slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
6016
6017                else
6018                        slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
6019
6020                ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n",
6021                           arvif->vdev_id, slottime);
6022
6023                vdev_param = ar->wmi.vdev_param->slot_time;
6024                ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
6025                                                slottime);
6026                if (ret)
6027                        ath10k_warn(ar, "failed to set erp slot for vdev %d: %i\n",
6028                                    arvif->vdev_id, ret);
6029        }
6030
6031        if (changed & BSS_CHANGED_ERP_PREAMBLE) {
6032                if (info->use_short_preamble)
6033                        preamble = WMI_VDEV_PREAMBLE_SHORT;
6034                else
6035                        preamble = WMI_VDEV_PREAMBLE_LONG;
6036
6037                ath10k_dbg(ar, ATH10K_DBG_MAC,
6038                           "mac vdev %d preamble %dn",
6039                           arvif->vdev_id, preamble);
6040
6041                vdev_param = ar->wmi.vdev_param->preamble;
6042                ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
6043                                                preamble);
6044                if (ret)
6045                        ath10k_warn(ar, "failed to set preamble for vdev %d: %i\n",
6046                                    arvif->vdev_id, ret);
6047        }
6048
6049        if (changed & BSS_CHANGED_ASSOC) {
6050                if (info->assoc) {
6051                        /* Workaround: Make sure monitor vdev is not running
6052                         * when associating to prevent some firmware revisions
6053                         * (e.g. 10.1 and 10.2) from crashing.
6054                         */
6055                        if (ar->monitor_started)
6056                                ath10k_monitor_stop(ar);
6057                        ath10k_bss_assoc(hw, vif, info);
6058                        ath10k_monitor_recalc(ar);
6059                } else {
6060                        ath10k_bss_disassoc(hw, vif);
6061                }
6062        }
6063
6064        if (changed & BSS_CHANGED_TXPOWER) {
6065                ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev_id %i txpower %d\n",
6066                           arvif->vdev_id, info->txpower);
6067
6068                arvif->txpower = info->txpower;
6069                ret = ath10k_mac_txpower_recalc(ar);
6070                if (ret)
6071                        ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
6072        }
6073
6074        if (changed & BSS_CHANGED_PS) {
6075                arvif->ps = vif->bss_conf.ps;
6076
6077                ret = ath10k_config_ps(ar);
6078                if (ret)
6079                        ath10k_warn(ar, "failed to setup ps on vdev %i: %d\n",
6080                                    arvif->vdev_id, ret);
6081        }
6082
6083        if (changed & BSS_CHANGED_MCAST_RATE &&
6084            !ath10k_mac_vif_chan(arvif->vif, &def)) {
6085                band = def.chan->band;
6086                mcast_rate = vif->bss_conf.mcast_rate[band];
6087                if (mcast_rate > 0)
6088                        rateidx = mcast_rate - 1;
6089                else
6090                        rateidx = ffs(vif->bss_conf.basic_rates) - 1;
6091
6092                if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY)
6093                        rateidx += ATH10K_MAC_FIRST_OFDM_RATE_IDX;
6094
6095                bitrate = ath10k_wmi_legacy_rates[rateidx].bitrate;
6096                hw_value = ath10k_wmi_legacy_rates[rateidx].hw_value;
6097                if (ath10k_mac_bitrate_is_cck(bitrate))
6098                        preamble = WMI_RATE_PREAMBLE_CCK;
6099                else
6100                        preamble = WMI_RATE_PREAMBLE_OFDM;
6101
6102                rate = ATH10K_HW_RATECODE(hw_value, 0, preamble);
6103
6104                ath10k_dbg(ar, ATH10K_DBG_MAC,
6105                           "mac vdev %d mcast_rate %x\n",
6106                           arvif->vdev_id, rate);
6107
6108                vdev_param = ar->wmi.vdev_param->mcast_data_rate;
6109                ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
6110                                                vdev_param, rate);
6111                if (ret)
6112                        ath10k_warn(ar,
6113                                    "failed to set mcast rate on vdev %i: %d\n",
6114                                    arvif->vdev_id,  ret);
6115
6116                vdev_param = ar->wmi.vdev_param->bcast_data_rate;
6117                ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
6118                                                vdev_param, rate);
6119                if (ret)
6120                        ath10k_warn(ar,
6121                                    "failed to set bcast rate on vdev %i: %d\n",
6122                                    arvif->vdev_id,  ret);
6123        }
6124
6125        if (changed & BSS_CHANGED_BASIC_RATES &&
6126            !ath10k_mac_vif_chan(arvif->vif, &def))
6127                ath10k_recalculate_mgmt_rate(ar, vif, &def);
6128
6129        mutex_unlock(&ar->conf_mutex);
6130}
6131
6132static void ath10k_mac_op_set_coverage_class(struct ieee80211_hw *hw, s16 value)
6133{
6134        struct ath10k *ar = hw->priv;
6135
6136        /* This function should never be called if setting the coverage class
6137         * is not supported on this hardware.
6138         */
6139        if (!ar->hw_params.hw_ops->set_coverage_class) {
6140                WARN_ON_ONCE(1);
6141                return;
6142        }
6143        ar->hw_params.hw_ops->set_coverage_class(ar, value);
6144}
6145
6146struct ath10k_mac_tdls_iter_data {
6147        u32 num_tdls_stations;
6148        struct ieee80211_vif *curr_vif;
6149};
6150
6151static void ath10k_mac_tdls_vif_stations_count_iter(void *data,
6152                                                    struct ieee80211_sta *sta)
6153{
6154        struct ath10k_mac_tdls_iter_data *iter_data = data;
6155        struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
6156        struct ieee80211_vif *sta_vif = arsta->arvif->vif;
6157
6158        if (sta->tdls && sta_vif == iter_data->curr_vif)
6159                iter_data->num_tdls_stations++;
6160}
6161
6162static int ath10k_mac_tdls_vif_stations_count(struct ieee80211_hw *hw,
6163                                              struct ieee80211_vif *vif)
6164{
6165        struct ath10k_mac_tdls_iter_data data = {};
6166
6167        data.curr_vif = vif;
6168
6169        ieee80211_iterate_stations_atomic(hw,
6170                                          ath10k_mac_tdls_vif_stations_count_iter,
6171                                          &data);
6172        return data.num_tdls_stations;
6173}
6174
6175static int ath10k_hw_scan(struct ieee80211_hw *hw,
6176                          struct ieee80211_vif *vif,
6177                          struct ieee80211_scan_request *hw_req)
6178{
6179        struct ath10k *ar = hw->priv;
6180        struct ath10k_vif *arvif = (void *)vif->drv_priv;
6181        struct cfg80211_scan_request *req = &hw_req->req;
6182        struct wmi_start_scan_arg arg;
6183        int ret = 0;
6184        int i;
6185        u32 scan_timeout;
6186
6187        mutex_lock(&ar->conf_mutex);
6188
6189        if (ath10k_mac_tdls_vif_stations_count(hw, vif) > 0) {
6190                ret = -EBUSY;
6191                goto exit;
6192        }
6193
6194        spin_lock_bh(&ar->data_lock);
6195        switch (ar->scan.state) {
6196        case ATH10K_SCAN_IDLE:
6197                reinit_completion(&ar->scan.started);
6198                reinit_completion(&ar->scan.completed);
6199                ar->scan.state = ATH10K_SCAN_STARTING;
6200                ar->scan.is_roc = false;
6201                ar->scan.vdev_id = arvif->vdev_id;
6202                ret = 0;
6203                break;
6204        case ATH10K_SCAN_STARTING:
6205        case ATH10K_SCAN_RUNNING:
6206        case ATH10K_SCAN_ABORTING:
6207                ret = -EBUSY;
6208                break;
6209        }
6210        spin_unlock_bh(&ar->data_lock);
6211
6212        if (ret)
6213                goto exit;
6214
6215        memset(&arg, 0, sizeof(arg));
6216        ath10k_wmi_start_scan_init(ar, &arg);
6217        arg.vdev_id = arvif->vdev_id;
6218        arg.scan_id = ATH10K_SCAN_ID;
6219
6220        if (req->ie_len) {
6221                arg.ie_len = req->ie_len;
6222                memcpy(arg.ie, req->ie, arg.ie_len);
6223        }
6224
6225        if (req->n_ssids) {
6226                arg.n_ssids = req->n_ssids;
6227                for (i = 0; i < arg.n_ssids; i++) {
6228                        arg.ssids[i].len  = req->ssids[i].ssid_len;
6229                        arg.ssids[i].ssid = req->ssids[i].ssid;
6230                }
6231        } else {
6232                arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
6233        }
6234
6235        if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
6236                arg.scan_ctrl_flags |=  WMI_SCAN_ADD_SPOOFED_MAC_IN_PROBE_REQ;
6237                ether_addr_copy(arg.mac_addr.addr, req->mac_addr);
6238                ether_addr_copy(arg.mac_mask.addr, req->mac_addr_mask);
6239        }
6240
6241        if (req->n_channels) {
6242                arg.n_channels = req->n_channels;
6243                for (i = 0; i < arg.n_channels; i++)
6244                        arg.channels[i] = req->channels[i]->center_freq;
6245        }
6246
6247        /* if duration is set, default dwell times will be overwritten */
6248        if (req->duration) {
6249                arg.dwell_time_active = req->duration;
6250                arg.dwell_time_passive = req->duration;
6251                arg.burst_duration_ms = req->duration;
6252
6253                scan_timeout = min_t(u32, arg.max_rest_time *
6254                                (arg.n_channels - 1) + (req->duration +
6255                                ATH10K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD) *
6256                                arg.n_channels, arg.max_scan_time + 200);
6257
6258        } else {
6259                /* Add a 200ms margin to account for event/command processing */
6260                scan_timeout = arg.max_scan_time + 200;
6261        }
6262
6263        ret = ath10k_start_scan(ar, &arg);
6264        if (ret) {
6265                ath10k_warn(ar, "failed to start hw scan: %d\n", ret);
6266                spin_lock_bh(&ar->data_lock);
6267                ar->scan.state = ATH10K_SCAN_IDLE;
6268                spin_unlock_bh(&ar->data_lock);
6269        }
6270
6271        ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
6272                                     msecs_to_jiffies(scan_timeout));
6273
6274exit:
6275        mutex_unlock(&ar->conf_mutex);
6276        return ret;
6277}
6278
6279static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
6280                                  struct ieee80211_vif *vif)
6281{
6282        struct ath10k *ar = hw->priv;
6283
6284        mutex_lock(&ar->conf_mutex);
6285        ath10k_scan_abort(ar);
6286        mutex_unlock(&ar->conf_mutex);
6287
6288        cancel_delayed_work_sync(&ar->scan.timeout);
6289}
6290
6291static void ath10k_set_key_h_def_keyidx(struct ath10k *ar,
6292                                        struct ath10k_vif *arvif,
6293                                        enum set_key_cmd cmd,
6294                                        struct ieee80211_key_conf *key)
6295{
6296        u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid;
6297        int ret;
6298
6299        /* 10.1 firmware branch requires default key index to be set to group
6300         * key index after installing it. Otherwise FW/HW Txes corrupted
6301         * frames with multi-vif APs. This is not required for main firmware
6302         * branch (e.g. 636).
6303         *
6304         * This is also needed for 636 fw for IBSS-RSN to work more reliably.
6305         *
6306         * FIXME: It remains unknown if this is required for multi-vif STA
6307         * interfaces on 10.1.
6308         */
6309
6310        if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
6311            arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
6312                return;
6313
6314        if (key->cipher == WLAN_CIPHER_SUITE_WEP40)
6315                return;
6316
6317        if (key->cipher == WLAN_CIPHER_SUITE_WEP104)
6318                return;
6319
6320        if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
6321                return;
6322
6323        if (cmd != SET_KEY)
6324                return;
6325
6326        ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
6327                                        key->keyidx);
6328        if (ret)
6329                ath10k_warn(ar, "failed to set vdev %i group key as default key: %d\n",
6330                            arvif->vdev_id, ret);
6331}
6332
6333static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
6334                          struct ieee80211_vif *vif, struct ieee80211_sta *sta,
6335                          struct ieee80211_key_conf *key)
6336{
6337        struct ath10k *ar = hw->priv;
6338        struct ath10k_vif *arvif = (void *)vif->drv_priv;
6339        struct ath10k_sta *arsta;
6340        struct ath10k_peer *peer;
6341        const u8 *peer_addr;
6342        bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
6343                      key->cipher == WLAN_CIPHER_SUITE_WEP104;
6344        int ret = 0;
6345        int ret2;
6346        u32 flags = 0;
6347        u32 flags2;
6348
6349        /* this one needs to be done in software */
6350        if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC ||
6351            key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 ||
6352            key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 ||
6353            key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256)
6354                return 1;
6355
6356        if (arvif->nohwcrypt)
6357                return 1;
6358
6359        if (key->keyidx > WMI_MAX_KEY_INDEX)
6360                return -ENOSPC;
6361
6362        mutex_lock(&ar->conf_mutex);
6363
6364        if (sta) {
6365                arsta = (struct ath10k_sta *)sta->drv_priv;
6366                peer_addr = sta->addr;
6367                spin_lock_bh(&ar->data_lock);
6368                arsta->ucast_cipher = key->cipher;
6369                spin_unlock_bh(&ar->data_lock);
6370        } else if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
6371                peer_addr = vif->bss_conf.bssid;
6372        } else {
6373                peer_addr = vif->addr;
6374        }
6375
6376        key->hw_key_idx = key->keyidx;
6377
6378        if (is_wep) {
6379                if (cmd == SET_KEY)
6380                        arvif->wep_keys[key->keyidx] = key;
6381                else
6382                        arvif->wep_keys[key->keyidx] = NULL;
6383        }
6384
6385        /* the peer should not disappear in mid-way (unless FW goes awry) since
6386         * we already hold conf_mutex. we just make sure its there now.
6387         */
6388        spin_lock_bh(&ar->data_lock);
6389        peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
6390        spin_unlock_bh(&ar->data_lock);
6391
6392        if (!peer) {
6393                if (cmd == SET_KEY) {
6394                        ath10k_warn(ar, "failed to install key for non-existent peer %pM\n",
6395                                    peer_addr);
6396                        ret = -EOPNOTSUPP;
6397                        goto exit;
6398                } else {
6399                        /* if the peer doesn't exist there is no key to disable anymore */
6400                        goto exit;
6401                }
6402        }
6403
6404        if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
6405                flags |= WMI_KEY_PAIRWISE;
6406        else
6407                flags |= WMI_KEY_GROUP;
6408
6409        if (is_wep) {
6410                if (cmd == DISABLE_KEY)
6411                        ath10k_clear_vdev_key(arvif, key);
6412
6413                /* When WEP keys are uploaded it's possible that there are
6414                 * stations associated already (e.g. when merging) without any
6415                 * keys. Static WEP needs an explicit per-peer key upload.
6416                 */
6417                if (vif->type == NL80211_IFTYPE_ADHOC &&
6418                    cmd == SET_KEY)
6419                        ath10k_mac_vif_update_wep_key(arvif, key);
6420
6421                /* 802.1x never sets the def_wep_key_idx so each set_key()
6422                 * call changes default tx key.
6423                 *
6424                 * Static WEP sets def_wep_key_idx via .set_default_unicast_key
6425                 * after first set_key().
6426                 */
6427                if (cmd == SET_KEY && arvif->def_wep_key_idx == -1)
6428                        flags |= WMI_KEY_TX_USAGE;
6429        }
6430
6431        ret = ath10k_install_key(arvif, key, cmd, peer_addr, flags);
6432        if (ret) {
6433                WARN_ON(ret > 0);
6434                ath10k_warn(ar, "failed to install key for vdev %i peer %pM: %d\n",
6435                            arvif->vdev_id, peer_addr, ret);
6436                goto exit;
6437        }
6438
6439        /* mac80211 sets static WEP keys as groupwise while firmware requires
6440         * them to be installed twice as both pairwise and groupwise.
6441         */
6442        if (is_wep && !sta && vif->type == NL80211_IFTYPE_STATION) {
6443                flags2 = flags;
6444                flags2 &= ~WMI_KEY_GROUP;
6445                flags2 |= WMI_KEY_PAIRWISE;
6446
6447                ret = ath10k_install_key(arvif, key, cmd, peer_addr, flags2);
6448                if (ret) {
6449                        WARN_ON(ret > 0);
6450                        ath10k_warn(ar, "failed to install (ucast) key for vdev %i peer %pM: %d\n",
6451                                    arvif->vdev_id, peer_addr, ret);
6452                        ret2 = ath10k_install_key(arvif, key, DISABLE_KEY,
6453                                                  peer_addr, flags);
6454                        if (ret2) {
6455                                WARN_ON(ret2 > 0);
6456                                ath10k_warn(ar, "failed to disable (mcast) key for vdev %i peer %pM: %d\n",
6457                                            arvif->vdev_id, peer_addr, ret2);
6458                        }
6459                        goto exit;
6460                }
6461        }
6462
6463        ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key);
6464
6465        spin_lock_bh(&ar->data_lock);
6466        peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
6467        if (peer && cmd == SET_KEY)
6468                peer->keys[key->keyidx] = key;
6469        else if (peer && cmd == DISABLE_KEY)
6470                peer->keys[key->keyidx] = NULL;
6471        else if (peer == NULL)
6472                /* impossible unless FW goes crazy */
6473                ath10k_warn(ar, "Peer %pM disappeared!\n", peer_addr);
6474        spin_unlock_bh(&ar->data_lock);
6475
6476        if (sta && sta->tdls)
6477                ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
6478                                          ar->wmi.peer_param->authorize, 1);
6479        else if (sta && cmd == SET_KEY && (key->flags & IEEE80211_KEY_FLAG_PAIRWISE))
6480                ath10k_wmi_peer_set_param(ar, arvif->vdev_id, peer_addr,
6481                                          ar->wmi.peer_param->authorize, 1);
6482
6483exit:
6484        mutex_unlock(&ar->conf_mutex);
6485        return ret;
6486}
6487
6488static void ath10k_set_default_unicast_key(struct ieee80211_hw *hw,
6489                                           struct ieee80211_vif *vif,
6490                                           int keyidx)
6491{
6492        struct ath10k *ar = hw->priv;
6493        struct ath10k_vif *arvif = (void *)vif->drv_priv;
6494        int ret;
6495
6496        mutex_lock(&arvif->ar->conf_mutex);
6497
6498        if (arvif->ar->state != ATH10K_STATE_ON)
6499                goto unlock;
6500
6501        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
6502                   arvif->vdev_id, keyidx);
6503
6504        ret = ath10k_wmi_vdev_set_param(arvif->ar,
6505                                        arvif->vdev_id,
6506                                        arvif->ar->wmi.vdev_param->def_keyid,
6507                                        keyidx);
6508
6509        if (ret) {
6510                ath10k_warn(ar, "failed to update wep key index for vdev %d: %d\n",
6511                            arvif->vdev_id,
6512                            ret);
6513                goto unlock;
6514        }
6515
6516        arvif->def_wep_key_idx = keyidx;
6517
6518unlock:
6519        mutex_unlock(&arvif->ar->conf_mutex);
6520}
6521
6522static void ath10k_sta_rc_update_wk(struct work_struct *wk)
6523{
6524        struct ath10k *ar;
6525        struct ath10k_vif *arvif;
6526        struct ath10k_sta *arsta;
6527        struct ieee80211_sta *sta;
6528        struct cfg80211_chan_def def;
6529        enum nl80211_band band;
6530        const u8 *ht_mcs_mask;
6531        const u16 *vht_mcs_mask;
6532        u32 changed, bw, nss, smps;
6533        int err;
6534
6535        arsta = container_of(wk, struct ath10k_sta, update_wk);
6536        sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
6537        arvif = arsta->arvif;
6538        ar = arvif->ar;
6539
6540        if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def)))
6541                return;
6542
6543        band = def.chan->band;
6544        ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
6545        vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
6546
6547        spin_lock_bh(&ar->data_lock);
6548
6549        changed = arsta->changed;
6550        arsta->changed = 0;
6551
6552        bw = arsta->bw;
6553        nss = arsta->nss;
6554        smps = arsta->smps;
6555
6556        spin_unlock_bh(&ar->data_lock);
6557
6558        mutex_lock(&ar->conf_mutex);
6559
6560        nss = max_t(u32, 1, nss);
6561        nss = min(nss, max(ath10k_mac_max_ht_nss(ht_mcs_mask),
6562                           ath10k_mac_max_vht_nss(vht_mcs_mask)));
6563
6564        if (changed & IEEE80211_RC_BW_CHANGED) {
6565                enum wmi_phy_mode mode;
6566
6567                mode = chan_to_phymode(&def);
6568                ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM peer bw %d phymode %d\n",
6569                           sta->addr, bw, mode);
6570
6571                err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
6572                                                ar->wmi.peer_param->phymode, mode);
6573                if (err) {
6574                        ath10k_warn(ar, "failed to update STA %pM peer phymode %d: %d\n",
6575                                    sta->addr, mode, err);
6576                        goto exit;
6577                }
6578
6579                err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
6580                                                ar->wmi.peer_param->chan_width, bw);
6581                if (err)
6582                        ath10k_warn(ar, "failed to update STA %pM peer bw %d: %d\n",
6583                                    sta->addr, bw, err);
6584        }
6585
6586        if (changed & IEEE80211_RC_NSS_CHANGED) {
6587                ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM nss %d\n",
6588                           sta->addr, nss);
6589
6590                err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
6591                                                ar->wmi.peer_param->nss, nss);
6592                if (err)
6593                        ath10k_warn(ar, "failed to update STA %pM nss %d: %d\n",
6594                                    sta->addr, nss, err);
6595        }
6596
6597        if (changed & IEEE80211_RC_SMPS_CHANGED) {
6598                ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM smps %d\n",
6599                           sta->addr, smps);
6600
6601                err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
6602                                                ar->wmi.peer_param->smps_state, smps);
6603                if (err)
6604                        ath10k_warn(ar, "failed to update STA %pM smps %d: %d\n",
6605                                    sta->addr, smps, err);
6606        }
6607
6608        if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
6609                ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM supp rates\n",
6610                           sta->addr);
6611
6612                err = ath10k_station_assoc(ar, arvif->vif, sta, true);
6613                if (err)
6614                        ath10k_warn(ar, "failed to reassociate station: %pM\n",
6615                                    sta->addr);
6616        }
6617
6618exit:
6619        mutex_unlock(&ar->conf_mutex);
6620}
6621
6622static int ath10k_mac_inc_num_stations(struct ath10k_vif *arvif,
6623                                       struct ieee80211_sta *sta)
6624{
6625        struct ath10k *ar = arvif->ar;
6626
6627        lockdep_assert_held(&ar->conf_mutex);
6628
6629        if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
6630                return 0;
6631
6632        if (ar->num_stations >= ar->max_num_stations)
6633                return -ENOBUFS;
6634
6635        ar->num_stations++;
6636
6637        return 0;
6638}
6639
6640static void ath10k_mac_dec_num_stations(struct ath10k_vif *arvif,
6641                                        struct ieee80211_sta *sta)
6642{
6643        struct ath10k *ar = arvif->ar;
6644
6645        lockdep_assert_held(&ar->conf_mutex);
6646
6647        if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
6648                return;
6649
6650        ar->num_stations--;
6651}
6652
6653static int ath10k_sta_set_txpwr(struct ieee80211_hw *hw,
6654                                struct ieee80211_vif *vif,
6655                                struct ieee80211_sta *sta)
6656{
6657        struct ath10k *ar = hw->priv;
6658        struct ath10k_vif *arvif = (void *)vif->drv_priv;
6659        int ret = 0;
6660        s16 txpwr;
6661
6662        if (sta->txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
6663                txpwr = 0;
6664        } else {
6665                txpwr = sta->txpwr.power;
6666                if (!txpwr)
6667                        return -EINVAL;
6668        }
6669
6670        if (txpwr > ATH10K_TX_POWER_MAX_VAL || txpwr < ATH10K_TX_POWER_MIN_VAL)
6671                return -EINVAL;
6672
6673        mutex_lock(&ar->conf_mutex);
6674
6675        ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
6676                                        ar->wmi.peer_param->use_fixed_power, txpwr);
6677        if (ret) {
6678                ath10k_warn(ar, "failed to set tx power for station ret: %d\n",
6679                            ret);
6680                goto out;
6681        }
6682
6683out:
6684        mutex_unlock(&ar->conf_mutex);
6685        return ret;
6686}
6687
6688struct ath10k_mac_iter_tid_conf_data {
6689        struct ieee80211_vif *curr_vif;
6690        struct ath10k *ar;
6691        bool reset_config;
6692};
6693
6694static bool
6695ath10k_mac_bitrate_mask_has_single_rate(struct ath10k *ar,
6696                                        enum nl80211_band band,
6697                                        const struct cfg80211_bitrate_mask *mask,
6698                                        int *vht_num_rates)
6699{
6700        int num_rates = 0;
6701        int i, tmp;
6702
6703        num_rates += hweight32(mask->control[band].legacy);
6704
6705        for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
6706                num_rates += hweight8(mask->control[band].ht_mcs[i]);
6707
6708        *vht_num_rates = 0;
6709        for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
6710                tmp = hweight16(mask->control[band].vht_mcs[i]);
6711                num_rates += tmp;
6712                *vht_num_rates += tmp;
6713        }
6714
6715        return num_rates == 1;
6716}
6717
6718static int
6719ath10k_mac_bitrate_mask_get_single_rate(struct ath10k *ar,
6720                                        enum nl80211_band band,
6721                                        const struct cfg80211_bitrate_mask *mask,
6722                                        u8 *rate, u8 *nss, bool vht_only)
6723{
6724        int rate_idx;
6725        int i;
6726        u16 bitrate;
6727        u8 preamble;
6728        u8 hw_rate;
6729
6730        if (vht_only)
6731                goto next;
6732
6733        if (hweight32(mask->control[band].legacy) == 1) {
6734                rate_idx = ffs(mask->control[band].legacy) - 1;
6735
6736                if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY)
6737                        rate_idx += ATH10K_MAC_FIRST_OFDM_RATE_IDX;
6738
6739                hw_rate = ath10k_wmi_legacy_rates[rate_idx].hw_value;
6740                bitrate = ath10k_wmi_legacy_rates[rate_idx].bitrate;
6741
6742                if (ath10k_mac_bitrate_is_cck(bitrate))
6743                        preamble = WMI_RATE_PREAMBLE_CCK;
6744                else
6745                        preamble = WMI_RATE_PREAMBLE_OFDM;
6746
6747                *nss = 1;
6748                *rate = preamble << 6 |
6749                        (*nss - 1) << 4 |
6750                        hw_rate << 0;
6751
6752                return 0;
6753        }
6754
6755        for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
6756                if (hweight8(mask->control[band].ht_mcs[i]) == 1) {
6757                        *nss = i + 1;
6758                        *rate = WMI_RATE_PREAMBLE_HT << 6 |
6759                                (*nss - 1) << 4 |
6760                                (ffs(mask->control[band].ht_mcs[i]) - 1);
6761
6762                        return 0;
6763                }
6764        }
6765
6766next:
6767        for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
6768                if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
6769                        *nss = i + 1;
6770                        *rate = WMI_RATE_PREAMBLE_VHT << 6 |
6771                                (*nss - 1) << 4 |
6772                                (ffs(mask->control[band].vht_mcs[i]) - 1);
6773
6774                        return 0;
6775                }
6776        }
6777
6778        return -EINVAL;
6779}
6780
6781static int ath10k_mac_validate_rate_mask(struct ath10k *ar,
6782                                         struct ieee80211_sta *sta,
6783                                         u32 rate_ctrl_flag, u8 nss)
6784{
6785        if (nss > sta->rx_nss) {
6786                ath10k_warn(ar, "Invalid nss field, configured %u limit %u\n",
6787                            nss, sta->rx_nss);
6788                return -EINVAL;
6789        }
6790
6791        if (ATH10K_HW_PREAMBLE(rate_ctrl_flag) == WMI_RATE_PREAMBLE_VHT) {
6792                if (!sta->vht_cap.vht_supported) {
6793                        ath10k_warn(ar, "Invalid VHT rate for sta %pM\n",
6794                                    sta->addr);
6795                        return -EINVAL;
6796                }
6797        } else if (ATH10K_HW_PREAMBLE(rate_ctrl_flag) == WMI_RATE_PREAMBLE_HT) {
6798                if (!sta->ht_cap.ht_supported || sta->vht_cap.vht_supported) {
6799                        ath10k_warn(ar, "Invalid HT rate for sta %pM\n",
6800                                    sta->addr);
6801                        return -EINVAL;
6802                }
6803        } else {
6804                if (sta->ht_cap.ht_supported || sta->vht_cap.vht_supported)
6805                        return -EINVAL;
6806        }
6807
6808        return 0;
6809}
6810
6811static int
6812ath10k_mac_tid_bitrate_config(struct ath10k *ar,
6813                              struct ieee80211_vif *vif,
6814                              struct ieee80211_sta *sta,
6815                              u32 *rate_ctrl_flag, u8 *rate_ctrl,
6816                              enum nl80211_tx_rate_setting txrate_type,
6817                              const struct cfg80211_bitrate_mask *mask)
6818{
6819        struct cfg80211_chan_def def;
6820        enum nl80211_band band;
6821        u8 nss, rate;
6822        int vht_num_rates, ret;
6823
6824        if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
6825                return -EINVAL;
6826
6827        if (txrate_type == NL80211_TX_RATE_AUTOMATIC) {
6828                *rate_ctrl = WMI_TID_CONFIG_RATE_CONTROL_AUTO;
6829                *rate_ctrl_flag = 0;
6830                return 0;
6831        }
6832
6833        band = def.chan->band;
6834
6835        if (!ath10k_mac_bitrate_mask_has_single_rate(ar, band, mask,
6836                                                     &vht_num_rates)) {
6837                return -EINVAL;
6838        }
6839
6840        ret = ath10k_mac_bitrate_mask_get_single_rate(ar, band, mask,
6841                                                      &rate, &nss, false);
6842        if (ret) {
6843                ath10k_warn(ar, "failed to get single rate: %d\n",
6844                            ret);
6845                return ret;
6846        }
6847
6848        *rate_ctrl_flag = rate;
6849
6850        if (sta && ath10k_mac_validate_rate_mask(ar, sta, *rate_ctrl_flag, nss))
6851                return -EINVAL;
6852
6853        if (txrate_type == NL80211_TX_RATE_FIXED)
6854                *rate_ctrl = WMI_TID_CONFIG_RATE_CONTROL_FIXED_RATE;
6855        else if (txrate_type == NL80211_TX_RATE_LIMITED &&
6856                 (test_bit(WMI_SERVICE_EXT_PEER_TID_CONFIGS_SUPPORT,
6857                           ar->wmi.svc_map)))
6858                *rate_ctrl = WMI_PEER_TID_CONFIG_RATE_UPPER_CAP;
6859        else
6860                return -EOPNOTSUPP;
6861
6862        return 0;
6863}
6864
6865static int ath10k_mac_set_tid_config(struct ath10k *ar, struct ieee80211_sta *sta,
6866                                     struct ieee80211_vif *vif, u32 changed,
6867                                     struct wmi_per_peer_per_tid_cfg_arg *arg)
6868{
6869        struct ath10k_vif *arvif = (void *)vif->drv_priv;
6870        struct ath10k_sta *arsta;
6871        int ret;
6872
6873        if (sta) {
6874                if (!sta->wme)
6875                        return -ENOTSUPP;
6876
6877                arsta = (struct ath10k_sta *)sta->drv_priv;
6878
6879                if (changed & BIT(NL80211_TID_CONFIG_ATTR_NOACK)) {
6880                        if ((arsta->retry_long[arg->tid] > 0 ||
6881                             arsta->rate_code[arg->tid] > 0 ||
6882                             arsta->ampdu[arg->tid] ==
6883                                        WMI_TID_CONFIG_AGGR_CONTROL_ENABLE) &&
6884                             arg->ack_policy == WMI_PEER_TID_CONFIG_NOACK) {
6885                                changed &= ~BIT(NL80211_TID_CONFIG_ATTR_NOACK);
6886                                arg->ack_policy = 0;
6887                                arg->aggr_control = 0;
6888                                arg->rate_ctrl = 0;
6889                                arg->rcode_flags = 0;
6890                        }
6891                }
6892
6893                if (changed & BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL)) {
6894                        if (arsta->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK ||
6895                            arvif->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK) {
6896                                arg->aggr_control = 0;
6897                                changed &= ~BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG);
6898                        }
6899                }
6900
6901                if (changed & (BIT(NL80211_TID_CONFIG_ATTR_TX_RATE) |
6902                    BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE))) {
6903                        if (arsta->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK ||
6904                            arvif->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK) {
6905                                arg->rate_ctrl = 0;
6906                                arg->rcode_flags = 0;
6907                        }
6908                }
6909
6910                ether_addr_copy(arg->peer_macaddr.addr, sta->addr);
6911
6912                ret = ath10k_wmi_set_per_peer_per_tid_cfg(ar, arg);
6913                if (ret)
6914                        return ret;
6915
6916                /* Store the configured parameters in success case */
6917                if (changed & BIT(NL80211_TID_CONFIG_ATTR_NOACK)) {
6918                        arsta->noack[arg->tid] = arg->ack_policy;
6919                        arg->ack_policy = 0;
6920                        arg->aggr_control = 0;
6921                        arg->rate_ctrl = 0;
6922                        arg->rcode_flags = 0;
6923                }
6924
6925                if (changed & BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG)) {
6926                        arsta->retry_long[arg->tid] = arg->retry_count;
6927                        arg->retry_count = 0;
6928                }
6929
6930                if (changed & BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL)) {
6931                        arsta->ampdu[arg->tid] = arg->aggr_control;
6932                        arg->aggr_control = 0;
6933                }
6934
6935                if (changed & (BIT(NL80211_TID_CONFIG_ATTR_TX_RATE) |
6936                    BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE))) {
6937                        arsta->rate_ctrl[arg->tid] = arg->rate_ctrl;
6938                        arg->rate_ctrl = 0;
6939                        arg->rcode_flags = 0;
6940                }
6941
6942                if (changed & BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL)) {
6943                        arsta->rtscts[arg->tid] = arg->rtscts_ctrl;
6944                        arg->ext_tid_cfg_bitmap = 0;
6945                }
6946        } else {
6947                if (changed & BIT(NL80211_TID_CONFIG_ATTR_NOACK)) {
6948                        if ((arvif->retry_long[arg->tid] ||
6949                             arvif->rate_code[arg->tid] ||
6950                             arvif->ampdu[arg->tid] ==
6951                                        WMI_TID_CONFIG_AGGR_CONTROL_ENABLE) &&
6952                             arg->ack_policy == WMI_PEER_TID_CONFIG_NOACK) {
6953                                changed &= ~BIT(NL80211_TID_CONFIG_ATTR_NOACK);
6954                        } else {
6955                                arvif->noack[arg->tid] = arg->ack_policy;
6956                                arvif->ampdu[arg->tid] = arg->aggr_control;
6957                                arvif->rate_ctrl[arg->tid] = arg->rate_ctrl;
6958                        }
6959                }
6960
6961                if (changed & BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG)) {
6962                        if (arvif->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK)
6963                                changed &= ~BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG);
6964                        else
6965                                arvif->retry_long[arg->tid] = arg->retry_count;
6966                }
6967
6968                if (changed & BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL)) {
6969                        if (arvif->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK)
6970                                changed &= ~BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL);
6971                        else
6972                                arvif->ampdu[arg->tid] = arg->aggr_control;
6973                }
6974
6975                if (changed & (BIT(NL80211_TID_CONFIG_ATTR_TX_RATE) |
6976                    BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE))) {
6977                        if (arvif->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK) {
6978                                changed &= ~(BIT(NL80211_TID_CONFIG_ATTR_TX_RATE) |
6979                                             BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE));
6980                        } else {
6981                                arvif->rate_ctrl[arg->tid] = arg->rate_ctrl;
6982                                arvif->rate_code[arg->tid] = arg->rcode_flags;
6983                        }
6984                }
6985
6986                if (changed & BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL)) {
6987                        arvif->rtscts[arg->tid] = arg->rtscts_ctrl;
6988                        arg->ext_tid_cfg_bitmap = 0;
6989                }
6990
6991                if (changed)
6992                        arvif->tid_conf_changed[arg->tid] |= changed;
6993        }
6994
6995        return 0;
6996}
6997
6998static int
6999ath10k_mac_parse_tid_config(struct ath10k *ar,
7000                            struct ieee80211_sta *sta,
7001                            struct ieee80211_vif *vif,
7002                            struct cfg80211_tid_cfg *tid_conf,
7003                            struct wmi_per_peer_per_tid_cfg_arg *arg)
7004{
7005        u32 changed = tid_conf->mask;
7006        int ret = 0, i = 0;
7007
7008        if (!changed)
7009                return -EINVAL;
7010
7011        while (i < ATH10K_TID_MAX) {
7012                if (!(tid_conf->tids & BIT(i))) {
7013                        i++;
7014                        continue;
7015                }
7016
7017                arg->tid = i;
7018
7019                if (changed & BIT(NL80211_TID_CONFIG_ATTR_NOACK)) {
7020                        if (tid_conf->noack == NL80211_TID_CONFIG_ENABLE) {
7021                                arg->ack_policy = WMI_PEER_TID_CONFIG_NOACK;
7022                                arg->rate_ctrl =
7023                                WMI_TID_CONFIG_RATE_CONTROL_DEFAULT_LOWEST_RATE;
7024                                arg->aggr_control =
7025                                        WMI_TID_CONFIG_AGGR_CONTROL_DISABLE;
7026                        } else {
7027                                arg->ack_policy =
7028                                        WMI_PEER_TID_CONFIG_ACK;
7029                                arg->rate_ctrl =
7030                                        WMI_TID_CONFIG_RATE_CONTROL_AUTO;
7031                                arg->aggr_control =
7032                                        WMI_TID_CONFIG_AGGR_CONTROL_ENABLE;
7033                        }
7034                }
7035
7036                if (changed & BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG))
7037                        arg->retry_count = tid_conf->retry_long;
7038
7039                if (changed & BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL)) {
7040                        if (tid_conf->noack == NL80211_TID_CONFIG_ENABLE)
7041                                arg->aggr_control = WMI_TID_CONFIG_AGGR_CONTROL_ENABLE;
7042                        else
7043                                arg->aggr_control = WMI_TID_CONFIG_AGGR_CONTROL_DISABLE;
7044                }
7045
7046                if (changed & (BIT(NL80211_TID_CONFIG_ATTR_TX_RATE) |
7047                    BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE))) {
7048                        ret = ath10k_mac_tid_bitrate_config(ar, vif, sta,
7049                                                            &arg->rcode_flags,
7050                                                            &arg->rate_ctrl,
7051                                                            tid_conf->txrate_type,
7052                                                        &tid_conf->txrate_mask);
7053                        if (ret) {
7054                                ath10k_warn(ar, "failed to configure bitrate mask %d\n",
7055                                            ret);
7056                                arg->rcode_flags = 0;
7057                                arg->rate_ctrl = 0;
7058                        }
7059                }
7060
7061                if (changed & BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL)) {
7062                        if (tid_conf->rtscts)
7063                                arg->rtscts_ctrl = tid_conf->rtscts;
7064
7065                        arg->ext_tid_cfg_bitmap = WMI_EXT_TID_RTS_CTS_CONFIG;
7066                }
7067
7068                ret = ath10k_mac_set_tid_config(ar, sta, vif, changed, arg);
7069                if (ret)
7070                        return ret;
7071                i++;
7072        }
7073
7074        return ret;
7075}
7076
7077static int ath10k_mac_reset_tid_config(struct ath10k *ar,
7078                                       struct ieee80211_sta *sta,
7079                                       struct ath10k_vif *arvif,
7080                                       u8 tids)
7081{
7082        struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
7083        struct wmi_per_peer_per_tid_cfg_arg arg;
7084        int ret = 0, i = 0;
7085
7086        arg.vdev_id = arvif->vdev_id;
7087        while (i < ATH10K_TID_MAX) {
7088                if (!(tids & BIT(i))) {
7089                        i++;
7090                        continue;
7091                }
7092
7093                arg.tid = i;
7094                arg.ack_policy = WMI_PEER_TID_CONFIG_ACK;
7095                arg.retry_count = ATH10K_MAX_RETRY_COUNT;
7096                arg.rate_ctrl = WMI_TID_CONFIG_RATE_CONTROL_AUTO;
7097                arg.aggr_control = WMI_TID_CONFIG_AGGR_CONTROL_ENABLE;
7098                arg.rtscts_ctrl = WMI_TID_CONFIG_RTSCTS_CONTROL_ENABLE;
7099                arg.ext_tid_cfg_bitmap = WMI_EXT_TID_RTS_CTS_CONFIG;
7100
7101                ether_addr_copy(arg.peer_macaddr.addr, sta->addr);
7102
7103                ret = ath10k_wmi_set_per_peer_per_tid_cfg(ar, &arg);
7104                if (ret)
7105                        return ret;
7106
7107                if (!arvif->tids_rst) {
7108                        arsta->retry_long[i] = -1;
7109                        arsta->noack[i] = -1;
7110                        arsta->ampdu[i] = -1;
7111                        arsta->rate_code[i] = -1;
7112                        arsta->rate_ctrl[i] = 0;
7113                        arsta->rtscts[i] = -1;
7114                } else {
7115                        arvif->retry_long[i] = 0;
7116                        arvif->noack[i] = 0;
7117                        arvif->ampdu[i] = 0;
7118                        arvif->rate_code[i] = 0;
7119                        arvif->rate_ctrl[i] = 0;
7120                        arvif->rtscts[i] = 0;
7121                }
7122
7123                i++;
7124        }
7125
7126        return ret;
7127}
7128
7129static void ath10k_sta_tid_cfg_wk(struct work_struct *wk)
7130{
7131        struct wmi_per_peer_per_tid_cfg_arg arg = {};
7132        struct ieee80211_sta *sta;
7133        struct ath10k_sta *arsta;
7134        struct ath10k_vif *arvif;
7135        struct ath10k *ar;
7136        bool config_apply;
7137        int ret, i;
7138        u32 changed;
7139        u8 nss;
7140
7141        arsta = container_of(wk, struct ath10k_sta, tid_config_wk);
7142        sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
7143        arvif = arsta->arvif;
7144        ar = arvif->ar;
7145
7146        mutex_lock(&ar->conf_mutex);
7147
7148        if (arvif->tids_rst) {
7149                ret = ath10k_mac_reset_tid_config(ar, sta, arvif,
7150                                                  arvif->tids_rst);
7151                goto exit;
7152        }
7153
7154        ether_addr_copy(arg.peer_macaddr.addr, sta->addr);
7155
7156        for (i = 0; i < ATH10K_TID_MAX; i++) {
7157                config_apply = false;
7158                changed = arvif->tid_conf_changed[i];
7159
7160                if (changed & BIT(NL80211_TID_CONFIG_ATTR_NOACK)) {
7161                        if (arsta->noack[i] != -1) {
7162                                arg.ack_policy  = 0;
7163                        } else {
7164                                config_apply = true;
7165                                arg.ack_policy = arvif->noack[i];
7166                                arg.aggr_control = arvif->ampdu[i];
7167                                arg.rate_ctrl = arvif->rate_ctrl[i];
7168                        }
7169                }
7170
7171                if (changed & BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG)) {
7172                        if (arsta->retry_long[i] != -1 ||
7173                            arsta->noack[i] == WMI_PEER_TID_CONFIG_NOACK ||
7174                            arvif->noack[i] == WMI_PEER_TID_CONFIG_NOACK) {
7175                                arg.retry_count = 0;
7176                        } else {
7177                                arg.retry_count = arvif->retry_long[i];
7178                                config_apply = true;
7179                        }
7180                }
7181
7182                if (changed & BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL)) {
7183                        if (arsta->ampdu[i] != -1 ||
7184                            arsta->noack[i] == WMI_PEER_TID_CONFIG_NOACK ||
7185                            arvif->noack[i] == WMI_PEER_TID_CONFIG_NOACK) {
7186                                arg.aggr_control = 0;
7187                        } else {
7188                                arg.aggr_control = arvif->ampdu[i];
7189                                config_apply = true;
7190                        }
7191                }
7192
7193                if (changed & (BIT(NL80211_TID_CONFIG_ATTR_TX_RATE) |
7194                    BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE))) {
7195                        nss = ATH10K_HW_NSS(arvif->rate_code[i]);
7196                        ret = ath10k_mac_validate_rate_mask(ar, sta,
7197                                                            arvif->rate_code[i],
7198                                                            nss);
7199                        if (ret &&
7200                            arvif->rate_ctrl[i] > WMI_TID_CONFIG_RATE_CONTROL_AUTO) {
7201                                arg.rate_ctrl = 0;
7202                                arg.rcode_flags = 0;
7203                        }
7204
7205                        if (arsta->rate_ctrl[i] >
7206                            WMI_TID_CONFIG_RATE_CONTROL_AUTO ||
7207                            arsta->noack[i] == WMI_PEER_TID_CONFIG_NOACK ||
7208                            arvif->noack[i] == WMI_PEER_TID_CONFIG_NOACK) {
7209                                arg.rate_ctrl = 0;
7210                                arg.rcode_flags = 0;
7211                        } else {
7212                                arg.rate_ctrl = arvif->rate_ctrl[i];
7213                                arg.rcode_flags = arvif->rate_code[i];
7214                                config_apply = true;
7215                        }
7216                }
7217
7218                if (changed & BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL)) {
7219                        if (arsta->rtscts[i]) {
7220                                arg.rtscts_ctrl = 0;
7221                                arg.ext_tid_cfg_bitmap = 0;
7222                        } else {
7223                                arg.rtscts_ctrl = arvif->rtscts[i] - 1;
7224                                arg.ext_tid_cfg_bitmap =
7225                                        WMI_EXT_TID_RTS_CTS_CONFIG;
7226                                config_apply = true;
7227                        }
7228                }
7229
7230                arg.tid = i;
7231
7232                if (config_apply) {
7233                        ret = ath10k_wmi_set_per_peer_per_tid_cfg(ar, &arg);
7234                        if (ret)
7235                                ath10k_warn(ar, "failed to set per tid config for sta %pM: %d\n",
7236                                            sta->addr, ret);
7237                }
7238
7239                arg.ack_policy  = 0;
7240                arg.retry_count  = 0;
7241                arg.aggr_control  = 0;
7242                arg.rate_ctrl = 0;
7243                arg.rcode_flags = 0;
7244        }
7245
7246exit:
7247        mutex_unlock(&ar->conf_mutex);
7248}
7249
7250static void ath10k_mac_vif_stations_tid_conf(void *data,
7251                                             struct ieee80211_sta *sta)
7252{
7253        struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
7254        struct ath10k_mac_iter_tid_conf_data *iter_data = data;
7255        struct ieee80211_vif *sta_vif = arsta->arvif->vif;
7256
7257        if (sta_vif != iter_data->curr_vif || !sta->wme)
7258                return;
7259
7260        ieee80211_queue_work(iter_data->ar->hw, &arsta->tid_config_wk);
7261}
7262
7263static int ath10k_sta_state(struct ieee80211_hw *hw,
7264                            struct ieee80211_vif *vif,
7265                            struct ieee80211_sta *sta,
7266                            enum ieee80211_sta_state old_state,
7267                            enum ieee80211_sta_state new_state)
7268{
7269        struct ath10k *ar = hw->priv;
7270        struct ath10k_vif *arvif = (void *)vif->drv_priv;
7271        struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
7272        struct ath10k_peer *peer;
7273        int ret = 0;
7274        int i;
7275
7276        if (old_state == IEEE80211_STA_NOTEXIST &&
7277            new_state == IEEE80211_STA_NONE) {
7278                memset(arsta, 0, sizeof(*arsta));
7279                arsta->arvif = arvif;
7280                arsta->peer_ps_state = WMI_PEER_PS_STATE_DISABLED;
7281                INIT_WORK(&arsta->update_wk, ath10k_sta_rc_update_wk);
7282                INIT_WORK(&arsta->tid_config_wk, ath10k_sta_tid_cfg_wk);
7283
7284                for (i = 0; i < ARRAY_SIZE(sta->txq); i++)
7285                        ath10k_mac_txq_init(sta->txq[i]);
7286        }
7287
7288        /* cancel must be done outside the mutex to avoid deadlock */
7289        if ((old_state == IEEE80211_STA_NONE &&
7290             new_state == IEEE80211_STA_NOTEXIST)) {
7291                cancel_work_sync(&arsta->update_wk);
7292                cancel_work_sync(&arsta->tid_config_wk);
7293        }
7294
7295        mutex_lock(&ar->conf_mutex);
7296
7297        if (old_state == IEEE80211_STA_NOTEXIST &&
7298            new_state == IEEE80211_STA_NONE) {
7299                /*
7300                 * New station addition.
7301                 */
7302                enum wmi_peer_type peer_type = WMI_PEER_TYPE_DEFAULT;
7303                u32 num_tdls_stations;
7304
7305                ath10k_dbg(ar, ATH10K_DBG_MAC,
7306                           "mac vdev %d peer create %pM (new sta) sta %d / %d peer %d / %d\n",
7307                           arvif->vdev_id, sta->addr,
7308                           ar->num_stations + 1, ar->max_num_stations,
7309                           ar->num_peers + 1, ar->max_num_peers);
7310
7311                num_tdls_stations = ath10k_mac_tdls_vif_stations_count(hw, vif);
7312
7313                if (sta->tdls) {
7314                        if (num_tdls_stations >= ar->max_num_tdls_vdevs) {
7315                                ath10k_warn(ar, "vdev %i exceeded maximum number of tdls vdevs %i\n",
7316                                            arvif->vdev_id,
7317                                            ar->max_num_tdls_vdevs);
7318                                ret = -ELNRNG;
7319                                goto exit;
7320                        }
7321                        peer_type = WMI_PEER_TYPE_TDLS;
7322                }
7323
7324                ret = ath10k_mac_inc_num_stations(arvif, sta);
7325                if (ret) {
7326                        ath10k_warn(ar, "refusing to associate station: too many connected already (%d)\n",
7327                                    ar->max_num_stations);
7328                        goto exit;
7329                }
7330
7331                if (ath10k_debug_is_extd_tx_stats_enabled(ar)) {
7332                        arsta->tx_stats = kzalloc(sizeof(*arsta->tx_stats),
7333                                                  GFP_KERNEL);
7334                        if (!arsta->tx_stats) {
7335                                ath10k_mac_dec_num_stations(arvif, sta);
7336                                ret = -ENOMEM;
7337                                goto exit;
7338                        }
7339                }
7340
7341                ret = ath10k_peer_create(ar, vif, sta, arvif->vdev_id,
7342                                         sta->addr, peer_type);
7343                if (ret) {
7344                        ath10k_warn(ar, "failed to add peer %pM for vdev %d when adding a new sta: %i\n",
7345                                    sta->addr, arvif->vdev_id, ret);
7346                        ath10k_mac_dec_num_stations(arvif, sta);
7347                        kfree(arsta->tx_stats);
7348                        goto exit;
7349                }
7350
7351                spin_lock_bh(&ar->data_lock);
7352
7353                peer = ath10k_peer_find(ar, arvif->vdev_id, sta->addr);
7354                if (!peer) {
7355                        ath10k_warn(ar, "failed to lookup peer %pM on vdev %i\n",
7356                                    vif->addr, arvif->vdev_id);
7357                        spin_unlock_bh(&ar->data_lock);
7358                        ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
7359                        ath10k_mac_dec_num_stations(arvif, sta);
7360                        kfree(arsta->tx_stats);
7361                        ret = -ENOENT;
7362                        goto exit;
7363                }
7364
7365                arsta->peer_id = find_first_bit(peer->peer_ids,
7366                                                ATH10K_MAX_NUM_PEER_IDS);
7367
7368                spin_unlock_bh(&ar->data_lock);
7369
7370                if (!sta->tdls)
7371                        goto exit;
7372
7373                ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
7374                                                      WMI_TDLS_ENABLE_ACTIVE);
7375                if (ret) {
7376                        ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n",
7377                                    arvif->vdev_id, ret);
7378                        ath10k_peer_delete(ar, arvif->vdev_id,
7379                                           sta->addr);
7380                        ath10k_mac_dec_num_stations(arvif, sta);
7381                        kfree(arsta->tx_stats);
7382                        goto exit;
7383                }
7384
7385                ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta,
7386                                                  WMI_TDLS_PEER_STATE_PEERING);
7387                if (ret) {
7388                        ath10k_warn(ar,
7389                                    "failed to update tdls peer %pM for vdev %d when adding a new sta: %i\n",
7390                                    sta->addr, arvif->vdev_id, ret);
7391                        ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
7392                        ath10k_mac_dec_num_stations(arvif, sta);
7393                        kfree(arsta->tx_stats);
7394
7395                        if (num_tdls_stations != 0)
7396                                goto exit;
7397                        ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
7398                                                        WMI_TDLS_DISABLE);
7399                }
7400        } else if ((old_state == IEEE80211_STA_NONE &&
7401                    new_state == IEEE80211_STA_NOTEXIST)) {
7402                /*
7403                 * Existing station deletion.
7404                 */
7405                ath10k_dbg(ar, ATH10K_DBG_MAC,
7406                           "mac vdev %d peer delete %pM sta %pK (sta gone)\n",
7407                           arvif->vdev_id, sta->addr, sta);
7408
7409                if (sta->tdls) {
7410                        ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id,
7411                                                          sta,
7412                                                          WMI_TDLS_PEER_STATE_TEARDOWN);
7413                        if (ret)
7414                                ath10k_warn(ar, "failed to update tdls peer state for %pM state %d: %i\n",
7415                                            sta->addr,
7416                                            WMI_TDLS_PEER_STATE_TEARDOWN, ret);
7417                }
7418
7419                ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
7420                if (ret)
7421                        ath10k_warn(ar, "failed to delete peer %pM for vdev %d: %i\n",
7422                                    sta->addr, arvif->vdev_id, ret);
7423
7424                ath10k_mac_dec_num_stations(arvif, sta);
7425
7426                spin_lock_bh(&ar->data_lock);
7427                for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) {
7428                        peer = ar->peer_map[i];
7429                        if (!peer)
7430                                continue;
7431
7432                        if (peer->sta == sta) {
7433                                ath10k_warn(ar, "found sta peer %pM (ptr %pK id %d) entry on vdev %i after it was supposedly removed\n",
7434                                            sta->addr, peer, i, arvif->vdev_id);
7435                                peer->sta = NULL;
7436
7437                                /* Clean up the peer object as well since we
7438                                 * must have failed to do this above.
7439                                 */
7440                                list_del(&peer->list);
7441                                ar->peer_map[i] = NULL;
7442                                kfree(peer);
7443                                ar->num_peers--;
7444                        }
7445                }
7446                spin_unlock_bh(&ar->data_lock);
7447
7448                if (ath10k_debug_is_extd_tx_stats_enabled(ar)) {
7449                        kfree(arsta->tx_stats);
7450                        arsta->tx_stats = NULL;
7451                }
7452
7453                for (i = 0; i < ARRAY_SIZE(sta->txq); i++)
7454                        ath10k_mac_txq_unref(ar, sta->txq[i]);
7455
7456                if (!sta->tdls)
7457                        goto exit;
7458
7459                if (ath10k_mac_tdls_vif_stations_count(hw, vif))
7460                        goto exit;
7461
7462                /* This was the last tdls peer in current vif */
7463                ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
7464                                                      WMI_TDLS_DISABLE);
7465                if (ret) {
7466                        ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n",
7467                                    arvif->vdev_id, ret);
7468                }
7469        } else if (old_state == IEEE80211_STA_AUTH &&
7470                   new_state == IEEE80211_STA_ASSOC &&
7471                   (vif->type == NL80211_IFTYPE_AP ||
7472                    vif->type == NL80211_IFTYPE_MESH_POINT ||
7473                    vif->type == NL80211_IFTYPE_ADHOC)) {
7474                /*
7475                 * New association.
7476                 */
7477                ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM associated\n",
7478                           sta->addr);
7479
7480                ret = ath10k_station_assoc(ar, vif, sta, false);
7481                if (ret)
7482                        ath10k_warn(ar, "failed to associate station %pM for vdev %i: %i\n",
7483                                    sta->addr, arvif->vdev_id, ret);
7484        } else if (old_state == IEEE80211_STA_ASSOC &&
7485                   new_state == IEEE80211_STA_AUTHORIZED &&
7486                   sta->tdls) {
7487                /*
7488                 * Tdls station authorized.
7489                 */
7490                ath10k_dbg(ar, ATH10K_DBG_MAC, "mac tdls sta %pM authorized\n",
7491                           sta->addr);
7492
7493                ret = ath10k_station_assoc(ar, vif, sta, false);
7494                if (ret) {
7495                        ath10k_warn(ar, "failed to associate tdls station %pM for vdev %i: %i\n",
7496                                    sta->addr, arvif->vdev_id, ret);
7497                        goto exit;
7498                }
7499
7500                ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta,
7501                                                  WMI_TDLS_PEER_STATE_CONNECTED);
7502                if (ret)
7503                        ath10k_warn(ar, "failed to update tdls peer %pM for vdev %i: %i\n",
7504                                    sta->addr, arvif->vdev_id, ret);
7505        } else if (old_state == IEEE80211_STA_ASSOC &&
7506                    new_state == IEEE80211_STA_AUTH &&
7507                    (vif->type == NL80211_IFTYPE_AP ||
7508                     vif->type == NL80211_IFTYPE_MESH_POINT ||
7509                     vif->type == NL80211_IFTYPE_ADHOC)) {
7510                /*
7511                 * Disassociation.
7512                 */
7513                ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM disassociated\n",
7514                           sta->addr);
7515
7516                ret = ath10k_station_disassoc(ar, vif, sta);
7517                if (ret)
7518                        ath10k_warn(ar, "failed to disassociate station: %pM vdev %i: %i\n",
7519                                    sta->addr, arvif->vdev_id, ret);
7520        }
7521exit:
7522        mutex_unlock(&ar->conf_mutex);
7523        return ret;
7524}
7525
7526static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
7527                                u16 ac, bool enable)
7528{
7529        struct ath10k_vif *arvif = (void *)vif->drv_priv;
7530        struct wmi_sta_uapsd_auto_trig_arg arg = {};
7531        u32 prio = 0, acc = 0;
7532        u32 value = 0;
7533        int ret = 0;
7534
7535        lockdep_assert_held(&ar->conf_mutex);
7536
7537        if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
7538                return 0;
7539
7540        switch (ac) {
7541        case IEEE80211_AC_VO:
7542                value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
7543                        WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
7544                prio = 7;
7545                acc = 3;
7546                break;
7547        case IEEE80211_AC_VI:
7548                value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
7549                        WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
7550                prio = 5;
7551                acc = 2;
7552                break;
7553        case IEEE80211_AC_BE:
7554                value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
7555                        WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
7556                prio = 2;
7557                acc = 1;
7558                break;
7559        case IEEE80211_AC_BK:
7560                value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
7561                        WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
7562                prio = 0;
7563                acc = 0;
7564                break;
7565        }
7566
7567        if (enable)
7568                arvif->u.sta.uapsd |= value;
7569        else
7570                arvif->u.sta.uapsd &= ~value;
7571
7572        ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
7573                                          WMI_STA_PS_PARAM_UAPSD,
7574                                          arvif->u.sta.uapsd);
7575        if (ret) {
7576                ath10k_warn(ar, "failed to set uapsd params: %d\n", ret);
7577                goto exit;
7578        }
7579
7580        if (arvif->u.sta.uapsd)
7581                value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
7582        else
7583                value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
7584
7585        ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
7586                                          WMI_STA_PS_PARAM_RX_WAKE_POLICY,
7587                                          value);
7588        if (ret)
7589                ath10k_warn(ar, "failed to set rx wake param: %d\n", ret);
7590
7591        ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
7592        if (ret) {
7593                ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
7594                            arvif->vdev_id, ret);
7595                return ret;
7596        }
7597
7598        ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
7599        if (ret) {
7600                ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
7601                            arvif->vdev_id, ret);
7602                return ret;
7603        }
7604
7605        if (test_bit(WMI_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG, ar->wmi.svc_map) ||
7606            test_bit(WMI_SERVICE_STA_UAPSD_VAR_AUTO_TRIG, ar->wmi.svc_map)) {
7607                /* Only userspace can make an educated decision when to send
7608                 * trigger frame. The following effectively disables u-UAPSD
7609                 * autotrigger in firmware (which is enabled by default
7610                 * provided the autotrigger service is available).
7611                 */
7612
7613                arg.wmm_ac = acc;
7614                arg.user_priority = prio;
7615                arg.service_interval = 0;
7616                arg.suspend_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
7617                arg.delay_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
7618
7619                ret = ath10k_wmi_vdev_sta_uapsd(ar, arvif->vdev_id,
7620                                                arvif->bssid, &arg, 1);
7621                if (ret) {
7622                        ath10k_warn(ar, "failed to set uapsd auto trigger %d\n",
7623                                    ret);
7624                        return ret;
7625                }
7626        }
7627
7628exit:
7629        return ret;
7630}
7631
7632static int ath10k_conf_tx(struct ieee80211_hw *hw,
7633                          struct ieee80211_vif *vif, u16 ac,
7634                          const struct ieee80211_tx_queue_params *params)
7635{
7636        struct ath10k *ar = hw->priv;
7637        struct ath10k_vif *arvif = (void *)vif->drv_priv;
7638        struct wmi_wmm_params_arg *p = NULL;
7639        int ret;
7640
7641        mutex_lock(&ar->conf_mutex);
7642
7643        switch (ac) {
7644        case IEEE80211_AC_VO:
7645                p = &arvif->wmm_params.ac_vo;
7646                break;
7647        case IEEE80211_AC_VI:
7648                p = &arvif->wmm_params.ac_vi;
7649                break;
7650        case IEEE80211_AC_BE:
7651                p = &arvif->wmm_params.ac_be;
7652                break;
7653        case IEEE80211_AC_BK:
7654                p = &arvif->wmm_params.ac_bk;
7655                break;
7656        }
7657
7658        if (WARN_ON(!p)) {
7659                ret = -EINVAL;
7660                goto exit;
7661        }
7662
7663        p->cwmin = params->cw_min;
7664        p->cwmax = params->cw_max;
7665        p->aifs = params->aifs;
7666
7667        /*
7668         * The channel time duration programmed in the HW is in absolute
7669         * microseconds, while mac80211 gives the txop in units of
7670         * 32 microseconds.
7671         */
7672        p->txop = params->txop * 32;
7673
7674        if (ar->wmi.ops->gen_vdev_wmm_conf) {
7675                ret = ath10k_wmi_vdev_wmm_conf(ar, arvif->vdev_id,
7676                                               &arvif->wmm_params);
7677                if (ret) {
7678                        ath10k_warn(ar, "failed to set vdev wmm params on vdev %i: %d\n",
7679                                    arvif->vdev_id, ret);
7680                        goto exit;
7681                }
7682        } else {
7683                /* This won't work well with multi-interface cases but it's
7684                 * better than nothing.
7685                 */
7686                ret = ath10k_wmi_pdev_set_wmm_params(ar, &arvif->wmm_params);
7687                if (ret) {
7688                        ath10k_warn(ar, "failed to set wmm params: %d\n", ret);
7689                        goto exit;
7690                }
7691        }
7692
7693        ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
7694        if (ret)
7695                ath10k_warn(ar, "failed to set sta uapsd: %d\n", ret);
7696
7697exit:
7698        mutex_unlock(&ar->conf_mutex);
7699        return ret;
7700}
7701
7702static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
7703                                    struct ieee80211_vif *vif,
7704                                    struct ieee80211_channel *chan,
7705                                    int duration,
7706                                    enum ieee80211_roc_type type)
7707{
7708        struct ath10k *ar = hw->priv;
7709        struct ath10k_vif *arvif = (void *)vif->drv_priv;
7710        struct wmi_start_scan_arg arg;
7711        int ret = 0;
7712        u32 scan_time_msec;
7713
7714        mutex_lock(&ar->conf_mutex);
7715
7716        if (ath10k_mac_tdls_vif_stations_count(hw, vif) > 0) {
7717                ret = -EBUSY;
7718                goto exit;
7719        }
7720
7721        spin_lock_bh(&ar->data_lock);
7722        switch (ar->scan.state) {
7723        case ATH10K_SCAN_IDLE:
7724                reinit_completion(&ar->scan.started);
7725                reinit_completion(&ar->scan.completed);
7726                reinit_completion(&ar->scan.on_channel);
7727                ar->scan.state = ATH10K_SCAN_STARTING;
7728                ar->scan.is_roc = true;
7729                ar->scan.vdev_id = arvif->vdev_id;
7730                ar->scan.roc_freq = chan->center_freq;
7731                ar->scan.roc_notify = true;
7732                ret = 0;
7733                break;
7734        case ATH10K_SCAN_STARTING:
7735        case ATH10K_SCAN_RUNNING:
7736        case ATH10K_SCAN_ABORTING:
7737                ret = -EBUSY;
7738                break;
7739        }
7740        spin_unlock_bh(&ar->data_lock);
7741
7742        if (ret)
7743                goto exit;
7744
7745        scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2;
7746
7747        memset(&arg, 0, sizeof(arg));
7748        ath10k_wmi_start_scan_init(ar, &arg);
7749        arg.vdev_id = arvif->vdev_id;
7750        arg.scan_id = ATH10K_SCAN_ID;
7751        arg.n_channels = 1;
7752        arg.channels[0] = chan->center_freq;
7753        arg.dwell_time_active = scan_time_msec;
7754        arg.dwell_time_passive = scan_time_msec;
7755        arg.max_scan_time = scan_time_msec;
7756        arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
7757        arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
7758        arg.burst_duration_ms = duration;
7759
7760        ret = ath10k_start_scan(ar, &arg);
7761        if (ret) {
7762                ath10k_warn(ar, "failed to start roc scan: %d\n", ret);
7763                spin_lock_bh(&ar->data_lock);
7764                ar->scan.state = ATH10K_SCAN_IDLE;
7765                spin_unlock_bh(&ar->data_lock);
7766                goto exit;
7767        }
7768
7769        ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ);
7770        if (ret == 0) {
7771                ath10k_warn(ar, "failed to switch to channel for roc scan\n");
7772
7773                ret = ath10k_scan_stop(ar);
7774                if (ret)
7775                        ath10k_warn(ar, "failed to stop scan: %d\n", ret);
7776
7777                ret = -ETIMEDOUT;
7778                goto exit;
7779        }
7780
7781        ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
7782                                     msecs_to_jiffies(duration));
7783
7784        ret = 0;
7785exit:
7786        mutex_unlock(&ar->conf_mutex);
7787        return ret;
7788}
7789
7790static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw,
7791                                           struct ieee80211_vif *vif)
7792{
7793        struct ath10k *ar = hw->priv;
7794
7795        mutex_lock(&ar->conf_mutex);
7796
7797        spin_lock_bh(&ar->data_lock);
7798        ar->scan.roc_notify = false;
7799        spin_unlock_bh(&ar->data_lock);
7800
7801        ath10k_scan_abort(ar);
7802
7803        mutex_unlock(&ar->conf_mutex);
7804
7805        cancel_delayed_work_sync(&ar->scan.timeout);
7806
7807        return 0;
7808}
7809
7810/*
7811 * Both RTS and Fragmentation threshold are interface-specific
7812 * in ath10k, but device-specific in mac80211.
7813 */
7814
7815static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
7816{
7817        struct ath10k *ar = hw->priv;
7818        struct ath10k_vif *arvif;
7819        int ret = 0;
7820
7821        mutex_lock(&ar->conf_mutex);
7822        list_for_each_entry(arvif, &ar->arvifs, list) {
7823                ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n",
7824                           arvif->vdev_id, value);
7825
7826                ret = ath10k_mac_set_rts(arvif, value);
7827                if (ret) {
7828                        ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
7829                                    arvif->vdev_id, ret);
7830                        break;
7831                }
7832        }
7833        mutex_unlock(&ar->conf_mutex);
7834
7835        return ret;
7836}
7837
7838static int ath10k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
7839{
7840        /* Even though there's a WMI enum for fragmentation threshold no known
7841         * firmware actually implements it. Moreover it is not possible to rely
7842         * frame fragmentation to mac80211 because firmware clears the "more
7843         * fragments" bit in frame control making it impossible for remote
7844         * devices to reassemble frames.
7845         *
7846         * Hence implement a dummy callback just to say fragmentation isn't
7847         * supported. This effectively prevents mac80211 from doing frame
7848         * fragmentation in software.
7849         */
7850        return -EOPNOTSUPP;
7851}
7852
7853void ath10k_mac_wait_tx_complete(struct ath10k *ar)
7854{
7855        bool skip;
7856        long time_left;
7857
7858        /* mac80211 doesn't care if we really xmit queued frames or not
7859         * we'll collect those frames either way if we stop/delete vdevs
7860         */
7861
7862        if (ar->state == ATH10K_STATE_WEDGED)
7863                return;
7864
7865        time_left = wait_event_timeout(ar->htt.empty_tx_wq, ({
7866                        bool empty;
7867
7868                        spin_lock_bh(&ar->htt.tx_lock);
7869                        empty = (ar->htt.num_pending_tx == 0);
7870                        spin_unlock_bh(&ar->htt.tx_lock);
7871
7872                        skip = (ar->state == ATH10K_STATE_WEDGED) ||
7873                               test_bit(ATH10K_FLAG_CRASH_FLUSH,
7874                                        &ar->dev_flags);
7875
7876                        (empty || skip);
7877                }), ATH10K_FLUSH_TIMEOUT_HZ);
7878
7879        if (time_left == 0 || skip)
7880                ath10k_warn(ar, "failed to flush transmit queue (skip %i ar-state %i): %ld\n",
7881                            skip, ar->state, time_left);
7882}
7883
7884static void ath10k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
7885                         u32 queues, bool drop)
7886{
7887        struct ath10k *ar = hw->priv;
7888        struct ath10k_vif *arvif;
7889        u32 bitmap;
7890
7891        if (drop) {
7892                if (vif && vif->type == NL80211_IFTYPE_STATION) {
7893                        bitmap = ~(1 << WMI_MGMT_TID);
7894                        list_for_each_entry(arvif, &ar->arvifs, list) {
7895                                if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
7896                                        ath10k_wmi_peer_flush(ar, arvif->vdev_id,
7897                                                              arvif->bssid, bitmap);
7898                        }
7899                        ath10k_htt_flush_tx(&ar->htt);
7900                }
7901                return;
7902        }
7903
7904        mutex_lock(&ar->conf_mutex);
7905        ath10k_mac_wait_tx_complete(ar);
7906        mutex_unlock(&ar->conf_mutex);
7907}
7908
7909/* TODO: Implement this function properly
7910 * For now it is needed to reply to Probe Requests in IBSS mode.
7911 * Propably we need this information from FW.
7912 */
7913static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
7914{
7915        return 1;
7916}
7917
7918static void ath10k_reconfig_complete(struct ieee80211_hw *hw,
7919                                     enum ieee80211_reconfig_type reconfig_type)
7920{
7921        struct ath10k *ar = hw->priv;
7922
7923        if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
7924                return;
7925
7926        mutex_lock(&ar->conf_mutex);
7927
7928        /* If device failed to restart it will be in a different state, e.g.
7929         * ATH10K_STATE_WEDGED
7930         */
7931        if (ar->state == ATH10K_STATE_RESTARTED) {
7932                ath10k_info(ar, "device successfully recovered\n");
7933                ar->state = ATH10K_STATE_ON;
7934                ieee80211_wake_queues(ar->hw);
7935                clear_bit(ATH10K_FLAG_RESTARTING, &ar->dev_flags);
7936        }
7937
7938        mutex_unlock(&ar->conf_mutex);
7939}
7940
7941static void
7942ath10k_mac_update_bss_chan_survey(struct ath10k *ar,
7943                                  struct ieee80211_channel *channel)
7944{
7945        int ret;
7946        enum wmi_bss_survey_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ;
7947
7948        lockdep_assert_held(&ar->conf_mutex);
7949
7950        if (!test_bit(WMI_SERVICE_BSS_CHANNEL_INFO_64, ar->wmi.svc_map) ||
7951            (ar->rx_channel != channel))
7952                return;
7953
7954        if (ar->scan.state != ATH10K_SCAN_IDLE) {
7955                ath10k_dbg(ar, ATH10K_DBG_MAC, "ignoring bss chan info request while scanning..\n");
7956                return;
7957        }
7958
7959        reinit_completion(&ar->bss_survey_done);
7960
7961        ret = ath10k_wmi_pdev_bss_chan_info_request(ar, type);
7962        if (ret) {
7963                ath10k_warn(ar, "failed to send pdev bss chan info request\n");
7964                return;
7965        }
7966
7967        ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ);
7968        if (!ret) {
7969                ath10k_warn(ar, "bss channel survey timed out\n");
7970                return;
7971        }
7972}
7973
7974static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
7975                             struct survey_info *survey)
7976{
7977        struct ath10k *ar = hw->priv;
7978        struct ieee80211_supported_band *sband;
7979        struct survey_info *ar_survey = &ar->survey[idx];
7980        int ret = 0;
7981
7982        mutex_lock(&ar->conf_mutex);
7983
7984        sband = hw->wiphy->bands[NL80211_BAND_2GHZ];
7985        if (sband && idx >= sband->n_channels) {
7986                idx -= sband->n_channels;
7987                sband = NULL;
7988        }
7989
7990        if (!sband)
7991                sband = hw->wiphy->bands[NL80211_BAND_5GHZ];
7992
7993        if (!sband || idx >= sband->n_channels) {
7994                ret = -ENOENT;
7995                goto exit;
7996        }
7997
7998        ath10k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);
7999
8000        spin_lock_bh(&ar->data_lock);
8001        memcpy(survey, ar_survey, sizeof(*survey));
8002        spin_unlock_bh(&ar->data_lock);
8003
8004        survey->channel = &sband->channels[idx];
8005
8006        if (ar->rx_channel == survey->channel)
8007                survey->filled |= SURVEY_INFO_IN_USE;
8008
8009exit:
8010        mutex_unlock(&ar->conf_mutex);
8011        return ret;
8012}
8013
8014static bool
8015ath10k_mac_bitrate_mask_get_single_nss(struct ath10k *ar,
8016                                       enum nl80211_band band,
8017                                       const struct cfg80211_bitrate_mask *mask,
8018                                       int *nss)
8019{
8020        struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
8021        u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
8022        u8 ht_nss_mask = 0;
8023        u8 vht_nss_mask = 0;
8024        int i;
8025
8026        if (mask->control[band].legacy)
8027                return false;
8028
8029        for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
8030                if (mask->control[band].ht_mcs[i] == 0)
8031                        continue;
8032                else if (mask->control[band].ht_mcs[i] ==
8033                         sband->ht_cap.mcs.rx_mask[i])
8034                        ht_nss_mask |= BIT(i);
8035                else
8036                        return false;
8037        }
8038
8039        for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
8040                if (mask->control[band].vht_mcs[i] == 0)
8041                        continue;
8042                else if (mask->control[band].vht_mcs[i] ==
8043                         ath10k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
8044                        vht_nss_mask |= BIT(i);
8045                else
8046                        return false;
8047        }
8048
8049        if (ht_nss_mask != vht_nss_mask)
8050                return false;
8051
8052        if (ht_nss_mask == 0)
8053                return false;
8054
8055        if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
8056                return false;
8057
8058        *nss = fls(ht_nss_mask);
8059
8060        return true;
8061}
8062
8063static int ath10k_mac_set_fixed_rate_params(struct ath10k_vif *arvif,
8064                                            u8 rate, u8 nss, u8 sgi, u8 ldpc)
8065{
8066        struct ath10k *ar = arvif->ar;
8067        u32 vdev_param;
8068        int ret;
8069
8070        lockdep_assert_held(&ar->conf_mutex);
8071
8072        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac set fixed rate params vdev %i rate 0x%02hhx nss %hhu sgi %hhu\n",
8073                   arvif->vdev_id, rate, nss, sgi);
8074
8075        vdev_param = ar->wmi.vdev_param->fixed_rate;
8076        ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, rate);
8077        if (ret) {
8078                ath10k_warn(ar, "failed to set fixed rate param 0x%02x: %d\n",
8079                            rate, ret);
8080                return ret;
8081        }
8082
8083        vdev_param = ar->wmi.vdev_param->nss;
8084        ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, nss);
8085        if (ret) {
8086                ath10k_warn(ar, "failed to set nss param %d: %d\n", nss, ret);
8087                return ret;
8088        }
8089
8090        vdev_param = ar->wmi.vdev_param->sgi;
8091        ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, sgi);
8092        if (ret) {
8093                ath10k_warn(ar, "failed to set sgi param %d: %d\n", sgi, ret);
8094                return ret;
8095        }
8096
8097        vdev_param = ar->wmi.vdev_param->ldpc;
8098        ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, ldpc);
8099        if (ret) {
8100                ath10k_warn(ar, "failed to set ldpc param %d: %d\n", ldpc, ret);
8101                return ret;
8102        }
8103
8104        return 0;
8105}
8106
8107static bool
8108ath10k_mac_can_set_bitrate_mask(struct ath10k *ar,
8109                                enum nl80211_band band,
8110                                const struct cfg80211_bitrate_mask *mask,
8111                                bool allow_pfr)
8112{
8113        int i;
8114        u16 vht_mcs;
8115
8116        /* Due to firmware limitation in WMI_PEER_ASSOC_CMDID it is impossible
8117         * to express all VHT MCS rate masks. Effectively only the following
8118         * ranges can be used: none, 0-7, 0-8 and 0-9.
8119         */
8120        for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
8121                vht_mcs = mask->control[band].vht_mcs[i];
8122
8123                switch (vht_mcs) {
8124                case 0:
8125                case BIT(8) - 1:
8126                case BIT(9) - 1:
8127                case BIT(10) - 1:
8128                        break;
8129                default:
8130                        if (!allow_pfr)
8131                                ath10k_warn(ar, "refusing bitrate mask with missing 0-7 VHT MCS rates\n");
8132                        return false;
8133                }
8134        }
8135
8136        return true;
8137}
8138
8139static bool ath10k_mac_set_vht_bitrate_mask_fixup(struct ath10k *ar,
8140                                                  struct ath10k_vif *arvif,
8141                                                  struct ieee80211_sta *sta)
8142{
8143        int err;
8144        u8 rate = arvif->vht_pfr;
8145
8146        /* skip non vht and multiple rate peers */
8147        if (!sta->vht_cap.vht_supported || arvif->vht_num_rates != 1)
8148                return false;
8149
8150        err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
8151                                        WMI_PEER_PARAM_FIXED_RATE, rate);
8152        if (err)
8153                ath10k_warn(ar, "failed to enable STA %pM peer fixed rate: %d\n",
8154                            sta->addr, err);
8155
8156        return true;
8157}
8158
8159static void ath10k_mac_set_bitrate_mask_iter(void *data,
8160                                             struct ieee80211_sta *sta)
8161{
8162        struct ath10k_vif *arvif = data;
8163        struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
8164        struct ath10k *ar = arvif->ar;
8165
8166        if (arsta->arvif != arvif)
8167                return;
8168
8169        if (ath10k_mac_set_vht_bitrate_mask_fixup(ar, arvif, sta))
8170                return;
8171
8172        spin_lock_bh(&ar->data_lock);
8173        arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
8174        spin_unlock_bh(&ar->data_lock);
8175
8176        ieee80211_queue_work(ar->hw, &arsta->update_wk);
8177}
8178
8179static void ath10k_mac_clr_bitrate_mask_iter(void *data,
8180                                             struct ieee80211_sta *sta)
8181{
8182        struct ath10k_vif *arvif = data;
8183        struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
8184        struct ath10k *ar = arvif->ar;
8185        int err;
8186
8187        /* clear vht peers only */
8188        if (arsta->arvif != arvif || !sta->vht_cap.vht_supported)
8189                return;
8190
8191        err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
8192                                        WMI_PEER_PARAM_FIXED_RATE,
8193                                        WMI_FIXED_RATE_NONE);
8194        if (err)
8195                ath10k_warn(ar, "failed to clear STA %pM peer fixed rate: %d\n",
8196                            sta->addr, err);
8197}
8198
8199static int ath10k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
8200                                          struct ieee80211_vif *vif,
8201                                          const struct cfg80211_bitrate_mask *mask)
8202{
8203        struct ath10k_vif *arvif = (void *)vif->drv_priv;
8204        struct cfg80211_chan_def def;
8205        struct ath10k *ar = arvif->ar;
8206        enum nl80211_band band;
8207        const u8 *ht_mcs_mask;
8208        const u16 *vht_mcs_mask;
8209        u8 rate;
8210        u8 nss;
8211        u8 sgi;
8212        u8 ldpc;
8213        int single_nss;
8214        int ret;
8215        int vht_num_rates, allow_pfr;
8216        u8 vht_pfr;
8217        bool update_bitrate_mask = true;
8218
8219        if (ath10k_mac_vif_chan(vif, &def))
8220                return -EPERM;
8221
8222        band = def.chan->band;
8223        ht_mcs_mask = mask->control[band].ht_mcs;
8224        vht_mcs_mask = mask->control[band].vht_mcs;
8225        ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC);
8226
8227        sgi = mask->control[band].gi;
8228        if (sgi == NL80211_TXRATE_FORCE_LGI)
8229                return -EINVAL;
8230
8231        allow_pfr = test_bit(ATH10K_FW_FEATURE_PEER_FIXED_RATE,
8232                             ar->normal_mode_fw.fw_file.fw_features);
8233        if (allow_pfr) {
8234                mutex_lock(&ar->conf_mutex);
8235                ieee80211_iterate_stations_atomic(ar->hw,
8236                                                  ath10k_mac_clr_bitrate_mask_iter,
8237                                                  arvif);
8238                mutex_unlock(&ar->conf_mutex);
8239        }
8240
8241        if (ath10k_mac_bitrate_mask_has_single_rate(ar, band, mask,
8242                                                    &vht_num_rates)) {
8243                ret = ath10k_mac_bitrate_mask_get_single_rate(ar, band, mask,
8244                                                              &rate, &nss,
8245                                                              false);
8246                if (ret) {
8247                        ath10k_warn(ar, "failed to get single rate for vdev %i: %d\n",
8248                                    arvif->vdev_id, ret);
8249                        return ret;
8250                }
8251        } else if (ath10k_mac_bitrate_mask_get_single_nss(ar, band, mask,
8252                                                          &single_nss)) {
8253                rate = WMI_FIXED_RATE_NONE;
8254                nss = single_nss;
8255        } else {
8256                rate = WMI_FIXED_RATE_NONE;
8257                nss = min(ar->num_rf_chains,
8258                          max(ath10k_mac_max_ht_nss(ht_mcs_mask),
8259                              ath10k_mac_max_vht_nss(vht_mcs_mask)));
8260
8261                if (!ath10k_mac_can_set_bitrate_mask(ar, band, mask,
8262                                                     allow_pfr)) {
8263                        u8 vht_nss;
8264
8265                        if (!allow_pfr || vht_num_rates != 1)
8266                                return -EINVAL;
8267
8268                        /* Reach here, firmware supports peer fixed rate and has
8269                         * single vht rate, and don't update vif birate_mask, as
8270                         * the rate only for specific peer.
8271                         */
8272                        ath10k_mac_bitrate_mask_get_single_rate(ar, band, mask,
8273                                                                &vht_pfr,
8274                                                                &vht_nss,
8275                                                                true);
8276                        update_bitrate_mask = false;
8277                } else {
8278                        vht_pfr = 0;
8279                }
8280
8281                mutex_lock(&ar->conf_mutex);
8282
8283                if (update_bitrate_mask)
8284                        arvif->bitrate_mask = *mask;
8285                arvif->vht_num_rates = vht_num_rates;
8286                arvif->vht_pfr = vht_pfr;
8287                ieee80211_iterate_stations_atomic(ar->hw,
8288                                                  ath10k_mac_set_bitrate_mask_iter,
8289                                                  arvif);
8290
8291                mutex_unlock(&ar->conf_mutex);
8292        }
8293
8294        mutex_lock(&ar->conf_mutex);
8295
8296        ret = ath10k_mac_set_fixed_rate_params(arvif, rate, nss, sgi, ldpc);
8297        if (ret) {
8298                ath10k_warn(ar, "failed to set fixed rate params on vdev %i: %d\n",
8299                            arvif->vdev_id, ret);
8300                goto exit;
8301        }
8302
8303exit:
8304        mutex_unlock(&ar->conf_mutex);
8305
8306        return ret;
8307}
8308
8309static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
8310                                 struct ieee80211_vif *vif,
8311                                 struct ieee80211_sta *sta,
8312                                 u32 changed)
8313{
8314        struct ath10k *ar = hw->priv;
8315        struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
8316        struct ath10k_vif *arvif = (void *)vif->drv_priv;
8317        struct ath10k_peer *peer;
8318        u32 bw, smps;
8319
8320        spin_lock_bh(&ar->data_lock);
8321
8322        peer = ath10k_peer_find(ar, arvif->vdev_id, sta->addr);
8323        if (!peer) {
8324                spin_unlock_bh(&ar->data_lock);
8325                ath10k_warn(ar, "mac sta rc update failed to find peer %pM on vdev %i\n",
8326                            sta->addr, arvif->vdev_id);
8327                return;
8328        }
8329
8330        ath10k_dbg(ar, ATH10K_DBG_MAC,
8331                   "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
8332                   sta->addr, changed, sta->bandwidth, sta->rx_nss,
8333                   sta->smps_mode);
8334
8335        if (changed & IEEE80211_RC_BW_CHANGED) {
8336                bw = WMI_PEER_CHWIDTH_20MHZ;
8337
8338                switch (sta->bandwidth) {
8339                case IEEE80211_STA_RX_BW_20:
8340                        bw = WMI_PEER_CHWIDTH_20MHZ;
8341                        break;
8342                case IEEE80211_STA_RX_BW_40:
8343                        bw = WMI_PEER_CHWIDTH_40MHZ;
8344                        break;
8345                case IEEE80211_STA_RX_BW_80:
8346                        bw = WMI_PEER_CHWIDTH_80MHZ;
8347                        break;
8348                case IEEE80211_STA_RX_BW_160:
8349                        bw = WMI_PEER_CHWIDTH_160MHZ;
8350                        break;
8351                default:
8352                        ath10k_warn(ar, "Invalid bandwidth %d in rc update for %pM\n",
8353                                    sta->bandwidth, sta->addr);
8354                        bw = WMI_PEER_CHWIDTH_20MHZ;
8355                        break;
8356                }
8357
8358                arsta->bw = bw;
8359        }
8360
8361        if (changed & IEEE80211_RC_NSS_CHANGED)
8362                arsta->nss = sta->rx_nss;
8363
8364        if (changed & IEEE80211_RC_SMPS_CHANGED) {
8365                smps = WMI_PEER_SMPS_PS_NONE;
8366
8367                switch (sta->smps_mode) {
8368                case IEEE80211_SMPS_AUTOMATIC:
8369                case IEEE80211_SMPS_OFF:
8370                        smps = WMI_PEER_SMPS_PS_NONE;
8371                        break;
8372                case IEEE80211_SMPS_STATIC:
8373                        smps = WMI_PEER_SMPS_STATIC;
8374                        break;
8375                case IEEE80211_SMPS_DYNAMIC:
8376                        smps = WMI_PEER_SMPS_DYNAMIC;
8377                        break;
8378                case IEEE80211_SMPS_NUM_MODES:
8379                        ath10k_warn(ar, "Invalid smps %d in sta rc update for %pM\n",
8380                                    sta->smps_mode, sta->addr);
8381                        smps = WMI_PEER_SMPS_PS_NONE;
8382                        break;
8383                }
8384
8385                arsta->smps = smps;
8386        }
8387
8388        arsta->changed |= changed;
8389
8390        spin_unlock_bh(&ar->data_lock);
8391
8392        ieee80211_queue_work(hw, &arsta->update_wk);
8393}
8394
8395static void ath10k_offset_tsf(struct ieee80211_hw *hw,
8396                              struct ieee80211_vif *vif, s64 tsf_offset)
8397{
8398        struct ath10k *ar = hw->priv;
8399        struct ath10k_vif *arvif = (void *)vif->drv_priv;
8400        u32 offset, vdev_param;
8401        int ret;
8402
8403        if (tsf_offset < 0) {
8404                vdev_param = ar->wmi.vdev_param->dec_tsf;
8405                offset = -tsf_offset;
8406        } else {
8407                vdev_param = ar->wmi.vdev_param->inc_tsf;
8408                offset = tsf_offset;
8409        }
8410
8411        ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
8412                                        vdev_param, offset);
8413
8414        if (ret && ret != -EOPNOTSUPP)
8415                ath10k_warn(ar, "failed to set tsf offset %d cmd %d: %d\n",
8416                            offset, vdev_param, ret);
8417}
8418
8419static int ath10k_ampdu_action(struct ieee80211_hw *hw,
8420                               struct ieee80211_vif *vif,
8421                               struct ieee80211_ampdu_params *params)
8422{
8423        struct ath10k *ar = hw->priv;
8424        struct ath10k_vif *arvif = (void *)vif->drv_priv;
8425        struct ieee80211_sta *sta = params->sta;
8426        enum ieee80211_ampdu_mlme_action action = params->action;
8427        u16 tid = params->tid;
8428
8429        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ampdu vdev_id %i sta %pM tid %hu action %d\n",
8430                   arvif->vdev_id, sta->addr, tid, action);
8431
8432        switch (action) {
8433        case IEEE80211_AMPDU_RX_START:
8434        case IEEE80211_AMPDU_RX_STOP:
8435                /* HTT AddBa/DelBa events trigger mac80211 Rx BA session
8436                 * creation/removal. Do we need to verify this?
8437                 */
8438                return 0;
8439        case IEEE80211_AMPDU_TX_START:
8440        case IEEE80211_AMPDU_TX_STOP_CONT:
8441        case IEEE80211_AMPDU_TX_STOP_FLUSH:
8442        case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
8443        case IEEE80211_AMPDU_TX_OPERATIONAL:
8444                /* Firmware offloads Tx aggregation entirely so deny mac80211
8445                 * Tx aggregation requests.
8446                 */
8447                return -EOPNOTSUPP;
8448        }
8449
8450        return -EINVAL;
8451}
8452
8453static void
8454ath10k_mac_update_rx_channel(struct ath10k *ar,
8455                             struct ieee80211_chanctx_conf *ctx,
8456                             struct ieee80211_vif_chanctx_switch *vifs,
8457                             int n_vifs)
8458{
8459        struct cfg80211_chan_def *def = NULL;
8460
8461        /* Both locks are required because ar->rx_channel is modified. This
8462         * allows readers to hold either lock.
8463         */
8464        lockdep_assert_held(&ar->conf_mutex);
8465        lockdep_assert_held(&ar->data_lock);
8466
8467        WARN_ON(ctx && vifs);
8468        WARN_ON(vifs && !n_vifs);
8469
8470        /* FIXME: Sort of an optimization and a workaround. Peers and vifs are
8471         * on a linked list now. Doing a lookup peer -> vif -> chanctx for each
8472         * ppdu on Rx may reduce performance on low-end systems. It should be
8473         * possible to make tables/hashmaps to speed the lookup up (be vary of
8474         * cpu data cache lines though regarding sizes) but to keep the initial
8475         * implementation simple and less intrusive fallback to the slow lookup
8476         * only for multi-channel cases. Single-channel cases will remain to
8477         * use the old channel derival and thus performance should not be
8478         * affected much.
8479         */
8480        rcu_read_lock();
8481        if (!ctx && ath10k_mac_num_chanctxs(ar) == 1) {
8482                ieee80211_iter_chan_contexts_atomic(ar->hw,
8483                                                    ath10k_mac_get_any_chandef_iter,
8484                                                    &def);
8485
8486                if (vifs)
8487                        def = &vifs[0].new_ctx->def;
8488
8489                ar->rx_channel = def->chan;
8490        } else if ((ctx && ath10k_mac_num_chanctxs(ar) == 0) ||
8491                   (ctx && (ar->state == ATH10K_STATE_RESTARTED))) {
8492                /* During driver restart due to firmware assert, since mac80211
8493                 * already has valid channel context for given radio, channel
8494                 * context iteration return num_chanctx > 0. So fix rx_channel
8495                 * when restart is in progress.
8496                 */
8497                ar->rx_channel = ctx->def.chan;
8498        } else {
8499                ar->rx_channel = NULL;
8500        }
8501        rcu_read_unlock();
8502}
8503
8504static void
8505ath10k_mac_update_vif_chan(struct ath10k *ar,
8506                           struct ieee80211_vif_chanctx_switch *vifs,
8507                           int n_vifs)
8508{
8509        struct ath10k_vif *arvif;
8510        int ret;
8511        int i;
8512
8513        lockdep_assert_held(&ar->conf_mutex);
8514
8515        /* First stop monitor interface. Some FW versions crash if there's a
8516         * lone monitor interface.
8517         */
8518        if (ar->monitor_started)
8519                ath10k_monitor_stop(ar);
8520
8521        for (i = 0; i < n_vifs; i++) {
8522                arvif = (void *)vifs[i].vif->drv_priv;
8523
8524                ath10k_dbg(ar, ATH10K_DBG_MAC,
8525                           "mac chanctx switch vdev_id %i freq %hu->%hu width %d->%d\n",
8526                           arvif->vdev_id,
8527                           vifs[i].old_ctx->def.chan->center_freq,
8528                           vifs[i].new_ctx->def.chan->center_freq,
8529                           vifs[i].old_ctx->def.width,
8530                           vifs[i].new_ctx->def.width);
8531
8532                if (WARN_ON(!arvif->is_started))
8533                        continue;
8534
8535                if (WARN_ON(!arvif->is_up))
8536                        continue;
8537
8538                ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
8539                if (ret) {
8540                        ath10k_warn(ar, "failed to down vdev %d: %d\n",
8541                                    arvif->vdev_id, ret);
8542                        continue;
8543                }
8544        }
8545
8546        /* All relevant vdevs are downed and associated channel resources
8547         * should be available for the channel switch now.
8548         */
8549
8550        spin_lock_bh(&ar->data_lock);
8551        ath10k_mac_update_rx_channel(ar, NULL, vifs, n_vifs);
8552        spin_unlock_bh(&ar->data_lock);
8553
8554        for (i = 0; i < n_vifs; i++) {
8555                arvif = (void *)vifs[i].vif->drv_priv;
8556
8557                if (WARN_ON(!arvif->is_started))
8558                        continue;
8559
8560                if (WARN_ON(!arvif->is_up))
8561                        continue;
8562
8563                ret = ath10k_mac_setup_bcn_tmpl(arvif);
8564                if (ret)
8565                        ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n",
8566                                    ret);
8567
8568                ret = ath10k_mac_setup_prb_tmpl(arvif);
8569                if (ret)
8570                        ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n",
8571                                    ret);
8572
8573                ret = ath10k_vdev_restart(arvif, &vifs[i].new_ctx->def);
8574                if (ret) {
8575                        ath10k_warn(ar, "failed to restart vdev %d: %d\n",
8576                                    arvif->vdev_id, ret);
8577                        continue;
8578                }
8579
8580                ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
8581                                         arvif->bssid);
8582                if (ret) {
8583                        ath10k_warn(ar, "failed to bring vdev up %d: %d\n",
8584                                    arvif->vdev_id, ret);
8585                        continue;
8586                }
8587        }
8588
8589        ath10k_monitor_recalc(ar);
8590}
8591
8592static int
8593ath10k_mac_op_add_chanctx(struct ieee80211_hw *hw,
8594                          struct ieee80211_chanctx_conf *ctx)
8595{
8596        struct ath10k *ar = hw->priv;
8597
8598        ath10k_dbg(ar, ATH10K_DBG_MAC,
8599                   "mac chanctx add freq %hu width %d ptr %pK\n",
8600                   ctx->def.chan->center_freq, ctx->def.width, ctx);
8601
8602        mutex_lock(&ar->conf_mutex);
8603
8604        spin_lock_bh(&ar->data_lock);
8605        ath10k_mac_update_rx_channel(ar, ctx, NULL, 0);
8606        spin_unlock_bh(&ar->data_lock);
8607
8608        ath10k_recalc_radar_detection(ar);
8609        ath10k_monitor_recalc(ar);
8610
8611        mutex_unlock(&ar->conf_mutex);
8612
8613        return 0;
8614}
8615
8616static void
8617ath10k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
8618                             struct ieee80211_chanctx_conf *ctx)
8619{
8620        struct ath10k *ar = hw->priv;
8621
8622        ath10k_dbg(ar, ATH10K_DBG_MAC,
8623                   "mac chanctx remove freq %hu width %d ptr %pK\n",
8624                   ctx->def.chan->center_freq, ctx->def.width, ctx);
8625
8626        mutex_lock(&ar->conf_mutex);
8627
8628        spin_lock_bh(&ar->data_lock);
8629        ath10k_mac_update_rx_channel(ar, NULL, NULL, 0);
8630        spin_unlock_bh(&ar->data_lock);
8631
8632        ath10k_recalc_radar_detection(ar);
8633        ath10k_monitor_recalc(ar);
8634
8635        mutex_unlock(&ar->conf_mutex);
8636}
8637
8638struct ath10k_mac_change_chanctx_arg {
8639        struct ieee80211_chanctx_conf *ctx;
8640        struct ieee80211_vif_chanctx_switch *vifs;
8641        int n_vifs;
8642        int next_vif;
8643};
8644
8645static void
8646ath10k_mac_change_chanctx_cnt_iter(void *data, u8 *mac,
8647                                   struct ieee80211_vif *vif)
8648{
8649        struct ath10k_mac_change_chanctx_arg *arg = data;
8650
8651        if (rcu_access_pointer(vif->chanctx_conf) != arg->ctx)
8652                return;
8653
8654        arg->n_vifs++;
8655}
8656
8657static void
8658ath10k_mac_change_chanctx_fill_iter(void *data, u8 *mac,
8659                                    struct ieee80211_vif *vif)
8660{
8661        struct ath10k_mac_change_chanctx_arg *arg = data;
8662        struct ieee80211_chanctx_conf *ctx;
8663
8664        ctx = rcu_access_pointer(vif->chanctx_conf);
8665        if (ctx != arg->ctx)
8666                return;
8667
8668        if (WARN_ON(arg->next_vif == arg->n_vifs))
8669                return;
8670
8671        arg->vifs[arg->next_vif].vif = vif;
8672        arg->vifs[arg->next_vif].old_ctx = ctx;
8673        arg->vifs[arg->next_vif].new_ctx = ctx;
8674        arg->next_vif++;
8675}
8676
8677static void
8678ath10k_mac_op_change_chanctx(struct ieee80211_hw *hw,
8679                             struct ieee80211_chanctx_conf *ctx,
8680                             u32 changed)
8681{
8682        struct ath10k *ar = hw->priv;
8683        struct ath10k_mac_change_chanctx_arg arg = { .ctx = ctx };
8684
8685        mutex_lock(&ar->conf_mutex);
8686
8687        ath10k_dbg(ar, ATH10K_DBG_MAC,
8688                   "mac chanctx change freq %hu width %d ptr %pK changed %x\n",
8689                   ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
8690
8691        /* This shouldn't really happen because channel switching should use
8692         * switch_vif_chanctx().
8693         */
8694        if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
8695                goto unlock;
8696
8697        if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH) {
8698                ieee80211_iterate_active_interfaces_atomic(
8699                                        hw,
8700                                        ATH10K_ITER_NORMAL_FLAGS,
8701                                        ath10k_mac_change_chanctx_cnt_iter,
8702                                        &arg);
8703                if (arg.n_vifs == 0)
8704                        goto radar;
8705
8706                arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]),
8707                                   GFP_KERNEL);
8708                if (!arg.vifs)
8709                        goto radar;
8710
8711                ieee80211_iterate_active_interfaces_atomic(
8712                                        hw,
8713                                        ATH10K_ITER_NORMAL_FLAGS,
8714                                        ath10k_mac_change_chanctx_fill_iter,
8715                                        &arg);
8716                ath10k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs);
8717                kfree(arg.vifs);
8718        }
8719
8720radar:
8721        ath10k_recalc_radar_detection(ar);
8722
8723        /* FIXME: How to configure Rx chains properly? */
8724
8725        /* No other actions are actually necessary. Firmware maintains channel
8726         * definitions per vdev internally and there's no host-side channel
8727         * context abstraction to configure, e.g. channel width.
8728         */
8729
8730unlock:
8731        mutex_unlock(&ar->conf_mutex);
8732}
8733
8734static int
8735ath10k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
8736                                 struct ieee80211_vif *vif,
8737                                 struct ieee80211_chanctx_conf *ctx)
8738{
8739        struct ath10k *ar = hw->priv;
8740        struct ath10k_vif *arvif = (void *)vif->drv_priv;
8741        int ret;
8742
8743        mutex_lock(&ar->conf_mutex);
8744
8745        ath10k_dbg(ar, ATH10K_DBG_MAC,
8746                   "mac chanctx assign ptr %pK vdev_id %i\n",
8747                   ctx, arvif->vdev_id);
8748
8749        if (WARN_ON(arvif->is_started)) {
8750                mutex_unlock(&ar->conf_mutex);
8751                return -EBUSY;
8752        }
8753
8754        ret = ath10k_vdev_start(arvif, &ctx->def);
8755        if (ret) {
8756                ath10k_warn(ar, "failed to start vdev %i addr %pM on freq %d: %d\n",
8757                            arvif->vdev_id, vif->addr,
8758                            ctx->def.chan->center_freq, ret);
8759                goto err;
8760        }
8761
8762        arvif->is_started = true;
8763
8764        ret = ath10k_mac_vif_setup_ps(arvif);
8765        if (ret) {
8766                ath10k_warn(ar, "failed to update vdev %i ps: %d\n",
8767                            arvif->vdev_id, ret);
8768                goto err_stop;
8769        }
8770
8771        if (vif->type == NL80211_IFTYPE_MONITOR) {
8772                ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, 0, vif->addr);
8773                if (ret) {
8774                        ath10k_warn(ar, "failed to up monitor vdev %i: %d\n",
8775                                    arvif->vdev_id, ret);
8776                        goto err_stop;
8777                }
8778
8779                arvif->is_up = true;
8780        }
8781
8782        if (ath10k_mac_can_set_cts_prot(arvif)) {
8783                ret = ath10k_mac_set_cts_prot(arvif);
8784                if (ret)
8785                        ath10k_warn(ar, "failed to set cts protection for vdev %d: %d\n",
8786                                    arvif->vdev_id, ret);
8787        }
8788
8789        if (ath10k_peer_stats_enabled(ar) &&
8790            ar->hw_params.tx_stats_over_pktlog) {
8791                ar->pktlog_filter |= ATH10K_PKTLOG_PEER_STATS;
8792                ret = ath10k_wmi_pdev_pktlog_enable(ar,
8793                                                    ar->pktlog_filter);
8794                if (ret) {
8795                        ath10k_warn(ar, "failed to enable pktlog %d\n", ret);
8796                        goto err_stop;
8797                }
8798        }
8799
8800        mutex_unlock(&ar->conf_mutex);
8801        return 0;
8802
8803err_stop:
8804        ath10k_vdev_stop(arvif);
8805        arvif->is_started = false;
8806        ath10k_mac_vif_setup_ps(arvif);
8807
8808err:
8809        mutex_unlock(&ar->conf_mutex);
8810        return ret;
8811}
8812
8813static void
8814ath10k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
8815                                   struct ieee80211_vif *vif,
8816                                   struct ieee80211_chanctx_conf *ctx)
8817{
8818        struct ath10k *ar = hw->priv;
8819        struct ath10k_vif *arvif = (void *)vif->drv_priv;
8820        int ret;
8821
8822        mutex_lock(&ar->conf_mutex);
8823
8824        ath10k_dbg(ar, ATH10K_DBG_MAC,
8825                   "mac chanctx unassign ptr %pK vdev_id %i\n",
8826                   ctx, arvif->vdev_id);
8827
8828        WARN_ON(!arvif->is_started);
8829
8830        if (vif->type == NL80211_IFTYPE_MONITOR) {
8831                WARN_ON(!arvif->is_up);
8832
8833                ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
8834                if (ret)
8835                        ath10k_warn(ar, "failed to down monitor vdev %i: %d\n",
8836                                    arvif->vdev_id, ret);
8837
8838                arvif->is_up = false;
8839        }
8840
8841        ret = ath10k_vdev_stop(arvif);
8842        if (ret)
8843                ath10k_warn(ar, "failed to stop vdev %i: %d\n",
8844                            arvif->vdev_id, ret);
8845
8846        arvif->is_started = false;
8847
8848        mutex_unlock(&ar->conf_mutex);
8849}
8850
8851static int
8852ath10k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
8853                                 struct ieee80211_vif_chanctx_switch *vifs,
8854                                 int n_vifs,
8855                                 enum ieee80211_chanctx_switch_mode mode)
8856{
8857        struct ath10k *ar = hw->priv;
8858
8859        mutex_lock(&ar->conf_mutex);
8860
8861        ath10k_dbg(ar, ATH10K_DBG_MAC,
8862                   "mac chanctx switch n_vifs %d mode %d\n",
8863                   n_vifs, mode);
8864        ath10k_mac_update_vif_chan(ar, vifs, n_vifs);
8865
8866        mutex_unlock(&ar->conf_mutex);
8867        return 0;
8868}
8869
8870static void ath10k_mac_op_sta_pre_rcu_remove(struct ieee80211_hw *hw,
8871                                             struct ieee80211_vif *vif,
8872                                             struct ieee80211_sta *sta)
8873{
8874        struct ath10k *ar;
8875        struct ath10k_peer *peer;
8876
8877        ar = hw->priv;
8878
8879        list_for_each_entry(peer, &ar->peers, list)
8880                if (peer->sta == sta)
8881                        peer->removed = true;
8882}
8883
8884/* HT MCS parameters with Nss = 1 */
8885static const struct ath10k_index_ht_data_rate_type supported_ht_mcs_rate_nss1[] = {
8886        /* MCS  L20   L40   S20  S40 */
8887        {0,  { 65,  135,  72,  150} },
8888        {1,  { 130, 270,  144, 300} },
8889        {2,  { 195, 405,  217, 450} },
8890        {3,  { 260, 540,  289, 600} },
8891        {4,  { 390, 810,  433, 900} },
8892        {5,  { 520, 1080, 578, 1200} },
8893        {6,  { 585, 1215, 650, 1350} },
8894        {7,  { 650, 1350, 722, 1500} }
8895};
8896
8897/* HT MCS parameters with Nss = 2 */
8898static const struct ath10k_index_ht_data_rate_type supported_ht_mcs_rate_nss2[] = {
8899        /* MCS  L20    L40   S20   S40 */
8900        {0,  {130,  270,  144,  300} },
8901        {1,  {260,  540,  289,  600} },
8902        {2,  {390,  810,  433,  900} },
8903        {3,  {520,  1080, 578,  1200} },
8904        {4,  {780,  1620, 867,  1800} },
8905        {5,  {1040, 2160, 1156, 2400} },
8906        {6,  {1170, 2430, 1300, 2700} },
8907        {7,  {1300, 2700, 1444, 3000} }
8908};
8909
8910/* MCS parameters with Nss = 1 */
8911static const struct ath10k_index_vht_data_rate_type supported_vht_mcs_rate_nss1[] = {
8912        /* MCS  L80    S80     L40   S40    L20   S20 */
8913        {0,  {293,  325},  {135,  150},  {65,   72} },
8914        {1,  {585,  650},  {270,  300},  {130,  144} },
8915        {2,  {878,  975},  {405,  450},  {195,  217} },
8916        {3,  {1170, 1300}, {540,  600},  {260,  289} },
8917        {4,  {1755, 1950}, {810,  900},  {390,  433} },
8918        {5,  {2340, 2600}, {1080, 1200}, {520,  578} },
8919        {6,  {2633, 2925}, {1215, 1350}, {585,  650} },
8920        {7,  {2925, 3250}, {1350, 1500}, {650,  722} },
8921        {8,  {3510, 3900}, {1620, 1800}, {780,  867} },
8922        {9,  {3900, 4333}, {1800, 2000}, {780,  867} }
8923};
8924
8925/*MCS parameters with Nss = 2 */
8926static const struct ath10k_index_vht_data_rate_type supported_vht_mcs_rate_nss2[] = {
8927        /* MCS  L80    S80     L40   S40    L20   S20 */
8928        {0,  {585,  650},  {270,  300},  {130,  144} },
8929        {1,  {1170, 1300}, {540,  600},  {260,  289} },
8930        {2,  {1755, 1950}, {810,  900},  {390,  433} },
8931        {3,  {2340, 2600}, {1080, 1200}, {520,  578} },
8932        {4,  {3510, 3900}, {1620, 1800}, {780,  867} },
8933        {5,  {4680, 5200}, {2160, 2400}, {1040, 1156} },
8934        {6,  {5265, 5850}, {2430, 2700}, {1170, 1300} },
8935        {7,  {5850, 6500}, {2700, 3000}, {1300, 1444} },
8936        {8,  {7020, 7800}, {3240, 3600}, {1560, 1733} },
8937        {9,  {7800, 8667}, {3600, 4000}, {1560, 1733} }
8938};
8939
8940static void ath10k_mac_get_rate_flags_ht(struct ath10k *ar, u32 rate, u8 nss, u8 mcs,
8941                                         u8 *flags, u8 *bw)
8942{
8943        struct ath10k_index_ht_data_rate_type *mcs_rate;
8944        u8 index;
8945        size_t len_nss1 = ARRAY_SIZE(supported_ht_mcs_rate_nss1);
8946        size_t len_nss2 = ARRAY_SIZE(supported_ht_mcs_rate_nss2);
8947
8948        if (mcs >= (len_nss1 + len_nss2)) {
8949                ath10k_warn(ar, "not supported mcs %d in current rate table", mcs);
8950                return;
8951        }
8952
8953        mcs_rate = (struct ath10k_index_ht_data_rate_type *)
8954                   ((nss == 1) ? &supported_ht_mcs_rate_nss1 :
8955                   &supported_ht_mcs_rate_nss2);
8956
8957        if (mcs >= len_nss1)
8958                index = mcs - len_nss1;
8959        else
8960                index = mcs;
8961
8962        if (rate == mcs_rate[index].supported_rate[0]) {
8963                *bw = RATE_INFO_BW_20;
8964        } else if (rate == mcs_rate[index].supported_rate[1]) {
8965                *bw |= RATE_INFO_BW_40;
8966        } else if (rate == mcs_rate[index].supported_rate[2]) {
8967                *bw |= RATE_INFO_BW_20;
8968                *flags |= RATE_INFO_FLAGS_SHORT_GI;
8969        } else if (rate == mcs_rate[index].supported_rate[3]) {
8970                *bw |= RATE_INFO_BW_40;
8971                *flags |= RATE_INFO_FLAGS_SHORT_GI;
8972        } else {
8973                ath10k_warn(ar, "invalid ht params rate %d 100kbps nss %d mcs %d",
8974                            rate, nss, mcs);
8975        }
8976}
8977
8978static void ath10k_mac_get_rate_flags_vht(struct ath10k *ar, u32 rate, u8 nss, u8 mcs,
8979                                          u8 *flags, u8 *bw)
8980{
8981        struct ath10k_index_vht_data_rate_type *mcs_rate;
8982
8983        mcs_rate = (struct ath10k_index_vht_data_rate_type *)
8984                   ((nss == 1) ? &supported_vht_mcs_rate_nss1 :
8985                   &supported_vht_mcs_rate_nss2);
8986
8987        if (rate == mcs_rate[mcs].supported_VHT80_rate[0]) {
8988                *bw = RATE_INFO_BW_80;
8989        } else if (rate == mcs_rate[mcs].supported_VHT80_rate[1]) {
8990                *bw = RATE_INFO_BW_80;
8991                *flags |= RATE_INFO_FLAGS_SHORT_GI;
8992        } else if (rate == mcs_rate[mcs].supported_VHT40_rate[0]) {
8993                *bw = RATE_INFO_BW_40;
8994        } else if (rate == mcs_rate[mcs].supported_VHT40_rate[1]) {
8995                *bw = RATE_INFO_BW_40;
8996                *flags |= RATE_INFO_FLAGS_SHORT_GI;
8997        } else if (rate == mcs_rate[mcs].supported_VHT20_rate[0]) {
8998                *bw = RATE_INFO_BW_20;
8999        } else if (rate == mcs_rate[mcs].supported_VHT20_rate[1]) {
9000                *bw = RATE_INFO_BW_20;
9001                *flags |= RATE_INFO_FLAGS_SHORT_GI;
9002        } else {
9003                ath10k_warn(ar, "invalid vht params rate %d 100kbps nss %d mcs %d",
9004                            rate, nss, mcs);
9005        }
9006}
9007
9008static void ath10k_mac_get_rate_flags(struct ath10k *ar, u32 rate,
9009                                      enum ath10k_phy_mode mode, u8 nss, u8 mcs,
9010                                      u8 *flags, u8 *bw)
9011{
9012        if (mode == ATH10K_PHY_MODE_HT) {
9013                *flags = RATE_INFO_FLAGS_MCS;
9014                ath10k_mac_get_rate_flags_ht(ar, rate, nss, mcs, flags, bw);
9015        } else if (mode == ATH10K_PHY_MODE_VHT) {
9016                *flags = RATE_INFO_FLAGS_VHT_MCS;
9017                ath10k_mac_get_rate_flags_vht(ar, rate, nss, mcs, flags, bw);
9018        }
9019}
9020
9021static void ath10k_mac_parse_bitrate(struct ath10k *ar, u32 rate_code,
9022                                     u32 bitrate_kbps, struct rate_info *rate)
9023{
9024        enum ath10k_phy_mode mode = ATH10K_PHY_MODE_LEGACY;
9025        enum wmi_rate_preamble preamble = WMI_TLV_GET_HW_RC_PREAM_V1(rate_code);
9026        u8 nss = WMI_TLV_GET_HW_RC_NSS_V1(rate_code) + 1;
9027        u8 mcs = WMI_TLV_GET_HW_RC_RATE_V1(rate_code);
9028        u8 flags = 0, bw = 0;
9029
9030        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac parse rate code 0x%x bitrate %d kbps\n",
9031                   rate_code, bitrate_kbps);
9032
9033        if (preamble == WMI_RATE_PREAMBLE_HT)
9034                mode = ATH10K_PHY_MODE_HT;
9035        else if (preamble == WMI_RATE_PREAMBLE_VHT)
9036                mode = ATH10K_PHY_MODE_VHT;
9037
9038        ath10k_mac_get_rate_flags(ar, bitrate_kbps / 100, mode, nss, mcs, &flags, &bw);
9039
9040        ath10k_dbg(ar, ATH10K_DBG_MAC,
9041                   "mac parse bitrate preamble %d mode %d nss %d mcs %d flags %x bw %d\n",
9042                   preamble, mode, nss, mcs, flags, bw);
9043
9044        rate->flags = flags;
9045        rate->bw = bw;
9046        rate->legacy = bitrate_kbps / 100;
9047        rate->nss = nss;
9048        rate->mcs = mcs;
9049}
9050
9051static void ath10k_mac_sta_get_peer_stats_info(struct ath10k *ar,
9052                                               struct ieee80211_sta *sta,
9053                                               struct station_info *sinfo)
9054{
9055        struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
9056        struct ath10k_peer *peer;
9057        unsigned long time_left;
9058        int ret;
9059
9060        if (!(ar->hw_params.supports_peer_stats_info &&
9061              arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA))
9062                return;
9063
9064        spin_lock_bh(&ar->data_lock);
9065        peer = ath10k_peer_find(ar, arsta->arvif->vdev_id, sta->addr);
9066        spin_unlock_bh(&ar->data_lock);
9067        if (!peer)
9068                return;
9069
9070        reinit_completion(&ar->peer_stats_info_complete);
9071
9072        ret = ath10k_wmi_request_peer_stats_info(ar,
9073                                                 arsta->arvif->vdev_id,
9074                                                 WMI_REQUEST_ONE_PEER_STATS_INFO,
9075                                                 arsta->arvif->bssid,
9076                                                 0);
9077        if (ret && ret != -EOPNOTSUPP) {
9078                ath10k_warn(ar, "could not request peer stats info: %d\n", ret);
9079                return;
9080        }
9081
9082        time_left = wait_for_completion_timeout(&ar->peer_stats_info_complete, 3 * HZ);
9083        if (time_left == 0) {
9084                ath10k_warn(ar, "timed out waiting peer stats info\n");
9085                return;
9086        }
9087
9088        if (arsta->rx_rate_code != 0 && arsta->rx_bitrate_kbps != 0) {
9089                ath10k_mac_parse_bitrate(ar, arsta->rx_rate_code,
9090                                         arsta->rx_bitrate_kbps,
9091                                         &sinfo->rxrate);
9092
9093                sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BITRATE);
9094                arsta->rx_rate_code = 0;
9095                arsta->rx_bitrate_kbps = 0;
9096        }
9097
9098        if (arsta->tx_rate_code != 0 && arsta->tx_bitrate_kbps != 0) {
9099                ath10k_mac_parse_bitrate(ar, arsta->tx_rate_code,
9100                                         arsta->tx_bitrate_kbps,
9101                                         &sinfo->txrate);
9102
9103                sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
9104                arsta->tx_rate_code = 0;
9105                arsta->tx_bitrate_kbps = 0;
9106        }
9107}
9108
9109static void ath10k_sta_statistics(struct ieee80211_hw *hw,
9110                                  struct ieee80211_vif *vif,
9111                                  struct ieee80211_sta *sta,
9112                                  struct station_info *sinfo)
9113{
9114        struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
9115        struct ath10k *ar = arsta->arvif->ar;
9116
9117        if (!ath10k_peer_stats_enabled(ar))
9118                return;
9119
9120        ath10k_debug_fw_stats_request(ar);
9121
9122        sinfo->rx_duration = arsta->rx_duration;
9123        sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
9124
9125        if (arsta->txrate.legacy || arsta->txrate.nss) {
9126                if (arsta->txrate.legacy) {
9127                        sinfo->txrate.legacy = arsta->txrate.legacy;
9128                } else {
9129                        sinfo->txrate.mcs = arsta->txrate.mcs;
9130                        sinfo->txrate.nss = arsta->txrate.nss;
9131                        sinfo->txrate.bw = arsta->txrate.bw;
9132                }
9133                sinfo->txrate.flags = arsta->txrate.flags;
9134                sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
9135        }
9136
9137        if (ar->htt.disable_tx_comp) {
9138                sinfo->tx_failed = arsta->tx_failed;
9139                sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED);
9140        }
9141
9142        sinfo->tx_retries = arsta->tx_retries;
9143        sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES);
9144
9145        ath10k_mac_sta_get_peer_stats_info(ar, sta, sinfo);
9146}
9147
9148static int ath10k_mac_op_set_tid_config(struct ieee80211_hw *hw,
9149                                        struct ieee80211_vif *vif,
9150                                        struct ieee80211_sta *sta,
9151                                        struct cfg80211_tid_config *tid_config)
9152{
9153        struct ath10k *ar = hw->priv;
9154        struct ath10k_vif *arvif = (void *)vif->drv_priv;
9155        struct ath10k_mac_iter_tid_conf_data data = {};
9156        struct wmi_per_peer_per_tid_cfg_arg arg = {};
9157        int ret, i;
9158
9159        mutex_lock(&ar->conf_mutex);
9160        arg.vdev_id = arvif->vdev_id;
9161
9162        arvif->tids_rst = 0;
9163        memset(arvif->tid_conf_changed, 0, sizeof(arvif->tid_conf_changed));
9164
9165        for (i = 0; i < tid_config->n_tid_conf; i++) {
9166                ret = ath10k_mac_parse_tid_config(ar, sta, vif,
9167                                                  &tid_config->tid_conf[i],
9168                                                  &arg);
9169                if (ret)
9170                        goto exit;
9171        }
9172
9173        ret = 0;
9174
9175        if (sta)
9176                goto exit;
9177
9178        arvif->tids_rst = 0;
9179        data.curr_vif = vif;
9180        data.ar = ar;
9181
9182        ieee80211_iterate_stations_atomic(hw, ath10k_mac_vif_stations_tid_conf,
9183                                          &data);
9184
9185exit:
9186        mutex_unlock(&ar->conf_mutex);
9187        return ret;
9188}
9189
9190static int ath10k_mac_op_reset_tid_config(struct ieee80211_hw *hw,
9191                                          struct ieee80211_vif *vif,
9192                                          struct ieee80211_sta *sta,
9193                                          u8 tids)
9194{
9195        struct ath10k_vif *arvif = (void *)vif->drv_priv;
9196        struct ath10k_mac_iter_tid_conf_data data = {};
9197        struct ath10k *ar = hw->priv;
9198        int ret = 0;
9199
9200        mutex_lock(&ar->conf_mutex);
9201
9202        if (sta) {
9203                arvif->tids_rst = 0;
9204                ret = ath10k_mac_reset_tid_config(ar, sta, arvif, tids);
9205                goto exit;
9206        }
9207
9208        arvif->tids_rst = tids;
9209        data.curr_vif = vif;
9210        data.ar = ar;
9211        ieee80211_iterate_stations_atomic(hw, ath10k_mac_vif_stations_tid_conf,
9212                                          &data);
9213
9214exit:
9215        mutex_unlock(&ar->conf_mutex);
9216        return ret;
9217}
9218
9219static const struct ieee80211_ops ath10k_ops = {
9220        .tx                             = ath10k_mac_op_tx,
9221        .wake_tx_queue                  = ath10k_mac_op_wake_tx_queue,
9222        .start                          = ath10k_start,
9223        .stop                           = ath10k_stop,
9224        .config                         = ath10k_config,
9225        .add_interface                  = ath10k_add_interface,
9226        .remove_interface               = ath10k_remove_interface,
9227        .configure_filter               = ath10k_configure_filter,
9228        .bss_info_changed               = ath10k_bss_info_changed,
9229        .set_coverage_class             = ath10k_mac_op_set_coverage_class,
9230        .hw_scan                        = ath10k_hw_scan,
9231        .cancel_hw_scan                 = ath10k_cancel_hw_scan,
9232        .set_key                        = ath10k_set_key,
9233        .set_default_unicast_key        = ath10k_set_default_unicast_key,
9234        .sta_state                      = ath10k_sta_state,
9235        .sta_set_txpwr                  = ath10k_sta_set_txpwr,
9236        .conf_tx                        = ath10k_conf_tx,
9237        .remain_on_channel              = ath10k_remain_on_channel,
9238        .cancel_remain_on_channel       = ath10k_cancel_remain_on_channel,
9239        .set_rts_threshold              = ath10k_set_rts_threshold,
9240        .set_frag_threshold             = ath10k_mac_op_set_frag_threshold,
9241        .flush                          = ath10k_flush,
9242        .tx_last_beacon                 = ath10k_tx_last_beacon,
9243        .set_antenna                    = ath10k_set_antenna,
9244        .get_antenna                    = ath10k_get_antenna,
9245        .reconfig_complete              = ath10k_reconfig_complete,
9246        .get_survey                     = ath10k_get_survey,
9247        .set_bitrate_mask               = ath10k_mac_op_set_bitrate_mask,
9248        .sta_rc_update                  = ath10k_sta_rc_update,
9249        .offset_tsf                     = ath10k_offset_tsf,
9250        .ampdu_action                   = ath10k_ampdu_action,
9251        .get_et_sset_count              = ath10k_debug_get_et_sset_count,
9252        .get_et_stats                   = ath10k_debug_get_et_stats,
9253        .get_et_strings                 = ath10k_debug_get_et_strings,
9254        .add_chanctx                    = ath10k_mac_op_add_chanctx,
9255        .remove_chanctx                 = ath10k_mac_op_remove_chanctx,
9256        .change_chanctx                 = ath10k_mac_op_change_chanctx,
9257        .assign_vif_chanctx             = ath10k_mac_op_assign_vif_chanctx,
9258        .unassign_vif_chanctx           = ath10k_mac_op_unassign_vif_chanctx,
9259        .switch_vif_chanctx             = ath10k_mac_op_switch_vif_chanctx,
9260        .sta_pre_rcu_remove             = ath10k_mac_op_sta_pre_rcu_remove,
9261        .sta_statistics                 = ath10k_sta_statistics,
9262        .set_tid_config                 = ath10k_mac_op_set_tid_config,
9263        .reset_tid_config               = ath10k_mac_op_reset_tid_config,
9264
9265        CFG80211_TESTMODE_CMD(ath10k_tm_cmd)
9266
9267#ifdef CONFIG_PM
9268        .suspend                        = ath10k_wow_op_suspend,
9269        .resume                         = ath10k_wow_op_resume,
9270        .set_wakeup                     = ath10k_wow_op_set_wakeup,
9271#endif
9272#ifdef CONFIG_MAC80211_DEBUGFS
9273        .sta_add_debugfs                = ath10k_sta_add_debugfs,
9274#endif
9275};
9276
9277#define CHAN2G(_channel, _freq, _flags) { \
9278        .band                   = NL80211_BAND_2GHZ, \
9279        .hw_value               = (_channel), \
9280        .center_freq            = (_freq), \
9281        .flags                  = (_flags), \
9282        .max_antenna_gain       = 0, \
9283        .max_power              = 30, \
9284}
9285
9286#define CHAN5G(_channel, _freq, _flags) { \
9287        .band                   = NL80211_BAND_5GHZ, \
9288        .hw_value               = (_channel), \
9289        .center_freq            = (_freq), \
9290        .flags                  = (_flags), \
9291        .max_antenna_gain       = 0, \
9292        .max_power              = 30, \
9293}
9294
9295static const struct ieee80211_channel ath10k_2ghz_channels[] = {
9296        CHAN2G(1, 2412, 0),
9297        CHAN2G(2, 2417, 0),
9298        CHAN2G(3, 2422, 0),
9299        CHAN2G(4, 2427, 0),
9300        CHAN2G(5, 2432, 0),
9301        CHAN2G(6, 2437, 0),
9302        CHAN2G(7, 2442, 0),
9303        CHAN2G(8, 2447, 0),
9304        CHAN2G(9, 2452, 0),
9305        CHAN2G(10, 2457, 0),
9306        CHAN2G(11, 2462, 0),
9307        CHAN2G(12, 2467, 0),
9308        CHAN2G(13, 2472, 0),
9309        CHAN2G(14, 2484, 0),
9310};
9311
9312static const struct ieee80211_channel ath10k_5ghz_channels[] = {
9313        CHAN5G(36, 5180, 0),
9314        CHAN5G(40, 5200, 0),
9315        CHAN5G(44, 5220, 0),
9316        CHAN5G(48, 5240, 0),
9317        CHAN5G(52, 5260, 0),
9318        CHAN5G(56, 5280, 0),
9319        CHAN5G(60, 5300, 0),
9320        CHAN5G(64, 5320, 0),
9321        CHAN5G(100, 5500, 0),
9322        CHAN5G(104, 5520, 0),
9323        CHAN5G(108, 5540, 0),
9324        CHAN5G(112, 5560, 0),
9325        CHAN5G(116, 5580, 0),
9326        CHAN5G(120, 5600, 0),
9327        CHAN5G(124, 5620, 0),
9328        CHAN5G(128, 5640, 0),
9329        CHAN5G(132, 5660, 0),
9330        CHAN5G(136, 5680, 0),
9331        CHAN5G(140, 5700, 0),
9332        CHAN5G(144, 5720, 0),
9333        CHAN5G(149, 5745, 0),
9334        CHAN5G(153, 5765, 0),
9335        CHAN5G(157, 5785, 0),
9336        CHAN5G(161, 5805, 0),
9337        CHAN5G(165, 5825, 0),
9338        CHAN5G(169, 5845, 0),
9339        CHAN5G(173, 5865, 0),
9340        /* If you add more, you may need to change ATH10K_MAX_5G_CHAN */
9341        /* And you will definitely need to change ATH10K_NUM_CHANS in core.h */
9342};
9343
9344struct ath10k *ath10k_mac_create(size_t priv_size)
9345{
9346        struct ieee80211_hw *hw;
9347        struct ieee80211_ops *ops;
9348        struct ath10k *ar;
9349
9350        ops = kmemdup(&ath10k_ops, sizeof(ath10k_ops), GFP_KERNEL);
9351        if (!ops)
9352                return NULL;
9353
9354        hw = ieee80211_alloc_hw(sizeof(struct ath10k) + priv_size, ops);
9355        if (!hw) {
9356                kfree(ops);
9357                return NULL;
9358        }
9359
9360        ar = hw->priv;
9361        ar->hw = hw;
9362        ar->ops = ops;
9363
9364        return ar;
9365}
9366
9367void ath10k_mac_destroy(struct ath10k *ar)
9368{
9369        struct ieee80211_ops *ops = ar->ops;
9370
9371        ieee80211_free_hw(ar->hw);
9372        kfree(ops);
9373}
9374
9375static const struct ieee80211_iface_limit ath10k_if_limits[] = {
9376        {
9377                .max    = 8,
9378                .types  = BIT(NL80211_IFTYPE_STATION)
9379                        | BIT(NL80211_IFTYPE_P2P_CLIENT)
9380        },
9381        {
9382                .max    = 3,
9383                .types  = BIT(NL80211_IFTYPE_P2P_GO)
9384        },
9385        {
9386                .max    = 1,
9387                .types  = BIT(NL80211_IFTYPE_P2P_DEVICE)
9388        },
9389        {
9390                .max    = 7,
9391                .types  = BIT(NL80211_IFTYPE_AP)
9392#ifdef CONFIG_MAC80211_MESH
9393                        | BIT(NL80211_IFTYPE_MESH_POINT)
9394#endif
9395        },
9396};
9397
9398static const struct ieee80211_iface_limit ath10k_10x_if_limits[] = {
9399        {
9400                .max    = 8,
9401                .types  = BIT(NL80211_IFTYPE_AP)
9402#ifdef CONFIG_MAC80211_MESH
9403                        | BIT(NL80211_IFTYPE_MESH_POINT)
9404#endif
9405        },
9406        {
9407                .max    = 1,
9408                .types  = BIT(NL80211_IFTYPE_STATION)
9409        },
9410};
9411
9412static const struct ieee80211_iface_combination ath10k_if_comb[] = {
9413        {
9414                .limits = ath10k_if_limits,
9415                .n_limits = ARRAY_SIZE(ath10k_if_limits),
9416                .max_interfaces = 8,
9417                .num_different_channels = 1,
9418                .beacon_int_infra_match = true,
9419        },
9420};
9421
9422static const struct ieee80211_iface_combination ath10k_10x_if_comb[] = {
9423        {
9424                .limits = ath10k_10x_if_limits,
9425                .n_limits = ARRAY_SIZE(ath10k_10x_if_limits),
9426                .max_interfaces = 8,
9427                .num_different_channels = 1,
9428                .beacon_int_infra_match = true,
9429                .beacon_int_min_gcd = 1,
9430#ifdef CONFIG_ATH10K_DFS_CERTIFIED
9431                .radar_detect_widths =  BIT(NL80211_CHAN_WIDTH_20_NOHT) |
9432                                        BIT(NL80211_CHAN_WIDTH_20) |
9433                                        BIT(NL80211_CHAN_WIDTH_40) |
9434                                        BIT(NL80211_CHAN_WIDTH_80),
9435#endif
9436        },
9437};
9438
9439static const struct ieee80211_iface_limit ath10k_tlv_if_limit[] = {
9440        {
9441                .max = 2,
9442                .types = BIT(NL80211_IFTYPE_STATION),
9443        },
9444        {
9445                .max = 2,
9446                .types = BIT(NL80211_IFTYPE_AP) |
9447#ifdef CONFIG_MAC80211_MESH
9448                         BIT(NL80211_IFTYPE_MESH_POINT) |
9449#endif
9450                         BIT(NL80211_IFTYPE_P2P_CLIENT) |
9451                         BIT(NL80211_IFTYPE_P2P_GO),
9452        },
9453        {
9454                .max = 1,
9455                .types = BIT(NL80211_IFTYPE_P2P_DEVICE),
9456        },
9457};
9458
9459static const struct ieee80211_iface_limit ath10k_tlv_qcs_if_limit[] = {
9460        {
9461                .max = 2,
9462                .types = BIT(NL80211_IFTYPE_STATION),
9463        },
9464        {
9465                .max = 2,
9466                .types = BIT(NL80211_IFTYPE_P2P_CLIENT),
9467        },
9468        {
9469                .max = 1,
9470                .types = BIT(NL80211_IFTYPE_AP) |
9471#ifdef CONFIG_MAC80211_MESH
9472                         BIT(NL80211_IFTYPE_MESH_POINT) |
9473#endif
9474                         BIT(NL80211_IFTYPE_P2P_GO),
9475        },
9476        {
9477                .max = 1,
9478                .types = BIT(NL80211_IFTYPE_P2P_DEVICE),
9479        },
9480};
9481
9482static const struct ieee80211_iface_limit ath10k_tlv_if_limit_ibss[] = {
9483        {
9484                .max = 1,
9485                .types = BIT(NL80211_IFTYPE_STATION),
9486        },
9487        {
9488                .max = 1,
9489                .types = BIT(NL80211_IFTYPE_ADHOC),
9490        },
9491};
9492
9493/* FIXME: This is not thouroughly tested. These combinations may over- or
9494 * underestimate hw/fw capabilities.
9495 */
9496static struct ieee80211_iface_combination ath10k_tlv_if_comb[] = {
9497        {
9498                .limits = ath10k_tlv_if_limit,
9499                .num_different_channels = 1,
9500                .max_interfaces = 4,
9501                .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit),
9502        },
9503        {
9504                .limits = ath10k_tlv_if_limit_ibss,
9505                .num_different_channels = 1,
9506                .max_interfaces = 2,
9507                .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit_ibss),
9508        },
9509};
9510
9511static struct ieee80211_iface_combination ath10k_tlv_qcs_if_comb[] = {
9512        {
9513                .limits = ath10k_tlv_if_limit,
9514                .num_different_channels = 1,
9515                .max_interfaces = 4,
9516                .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit),
9517        },
9518        {
9519                .limits = ath10k_tlv_qcs_if_limit,
9520                .num_different_channels = 2,
9521                .max_interfaces = 4,
9522                .n_limits = ARRAY_SIZE(ath10k_tlv_qcs_if_limit),
9523        },
9524        {
9525                .limits = ath10k_tlv_if_limit_ibss,
9526                .num_different_channels = 1,
9527                .max_interfaces = 2,
9528                .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit_ibss),
9529        },
9530};
9531
9532static const struct ieee80211_iface_limit ath10k_10_4_if_limits[] = {
9533        {
9534                .max = 1,
9535                .types = BIT(NL80211_IFTYPE_STATION),
9536        },
9537        {
9538                .max    = 16,
9539                .types  = BIT(NL80211_IFTYPE_AP)
9540#ifdef CONFIG_MAC80211_MESH
9541                        | BIT(NL80211_IFTYPE_MESH_POINT)
9542#endif
9543        },
9544};
9545
9546static const struct ieee80211_iface_combination ath10k_10_4_if_comb[] = {
9547        {
9548                .limits = ath10k_10_4_if_limits,
9549                .n_limits = ARRAY_SIZE(ath10k_10_4_if_limits),
9550                .max_interfaces = 16,
9551                .num_different_channels = 1,
9552                .beacon_int_infra_match = true,
9553                .beacon_int_min_gcd = 1,
9554#ifdef CONFIG_ATH10K_DFS_CERTIFIED
9555                .radar_detect_widths =  BIT(NL80211_CHAN_WIDTH_20_NOHT) |
9556                                        BIT(NL80211_CHAN_WIDTH_20) |
9557                                        BIT(NL80211_CHAN_WIDTH_40) |
9558                                        BIT(NL80211_CHAN_WIDTH_80) |
9559                                        BIT(NL80211_CHAN_WIDTH_80P80) |
9560                                        BIT(NL80211_CHAN_WIDTH_160),
9561#endif
9562        },
9563};
9564
9565static const struct
9566ieee80211_iface_combination ath10k_10_4_bcn_int_if_comb[] = {
9567        {
9568                .limits = ath10k_10_4_if_limits,
9569                .n_limits = ARRAY_SIZE(ath10k_10_4_if_limits),
9570                .max_interfaces = 16,
9571                .num_different_channels = 1,
9572                .beacon_int_infra_match = true,
9573                .beacon_int_min_gcd = 100,
9574#ifdef CONFIG_ATH10K_DFS_CERTIFIED
9575                .radar_detect_widths =  BIT(NL80211_CHAN_WIDTH_20_NOHT) |
9576                                        BIT(NL80211_CHAN_WIDTH_20) |
9577                                        BIT(NL80211_CHAN_WIDTH_40) |
9578                                        BIT(NL80211_CHAN_WIDTH_80) |
9579                                        BIT(NL80211_CHAN_WIDTH_80P80) |
9580                                        BIT(NL80211_CHAN_WIDTH_160),
9581#endif
9582        },
9583};
9584
9585static void ath10k_get_arvif_iter(void *data, u8 *mac,
9586                                  struct ieee80211_vif *vif)
9587{
9588        struct ath10k_vif_iter *arvif_iter = data;
9589        struct ath10k_vif *arvif = (void *)vif->drv_priv;
9590
9591        if (arvif->vdev_id == arvif_iter->vdev_id)
9592                arvif_iter->arvif = arvif;
9593}
9594
9595struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
9596{
9597        struct ath10k_vif_iter arvif_iter;
9598
9599        memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
9600        arvif_iter.vdev_id = vdev_id;
9601
9602        ieee80211_iterate_active_interfaces_atomic(ar->hw,
9603                                                   ATH10K_ITER_RESUME_FLAGS,
9604                                                   ath10k_get_arvif_iter,
9605                                                   &arvif_iter);
9606        if (!arvif_iter.arvif) {
9607                ath10k_warn(ar, "No VIF found for vdev %d\n", vdev_id);
9608                return NULL;
9609        }
9610
9611        return arvif_iter.arvif;
9612}
9613
9614#define WRD_METHOD "WRDD"
9615#define WRDD_WIFI  (0x07)
9616
9617static u32 ath10k_mac_wrdd_get_mcc(struct ath10k *ar, union acpi_object *wrdd)
9618{
9619        union acpi_object *mcc_pkg;
9620        union acpi_object *domain_type;
9621        union acpi_object *mcc_value;
9622        u32 i;
9623
9624        if (wrdd->type != ACPI_TYPE_PACKAGE ||
9625            wrdd->package.count < 2 ||
9626            wrdd->package.elements[0].type != ACPI_TYPE_INTEGER ||
9627            wrdd->package.elements[0].integer.value != 0) {
9628                ath10k_warn(ar, "ignoring malformed/unsupported wrdd structure\n");
9629                return 0;
9630        }
9631
9632        for (i = 1; i < wrdd->package.count; ++i) {
9633                mcc_pkg = &wrdd->package.elements[i];
9634
9635                if (mcc_pkg->type != ACPI_TYPE_PACKAGE)
9636                        continue;
9637                if (mcc_pkg->package.count < 2)
9638                        continue;
9639                if (mcc_pkg->package.elements[0].type != ACPI_TYPE_INTEGER ||
9640                    mcc_pkg->package.elements[1].type != ACPI_TYPE_INTEGER)
9641                        continue;
9642
9643                domain_type = &mcc_pkg->package.elements[0];
9644                if (domain_type->integer.value != WRDD_WIFI)
9645                        continue;
9646
9647                mcc_value = &mcc_pkg->package.elements[1];
9648                return mcc_value->integer.value;
9649        }
9650        return 0;
9651}
9652
9653static int ath10k_mac_get_wrdd_regulatory(struct ath10k *ar, u16 *rd)
9654{
9655        acpi_handle root_handle;
9656        acpi_handle handle;
9657        struct acpi_buffer wrdd = {ACPI_ALLOCATE_BUFFER, NULL};
9658        acpi_status status;
9659        u32 alpha2_code;
9660        char alpha2[3];
9661
9662        root_handle = ACPI_HANDLE(ar->dev);
9663        if (!root_handle)
9664                return -EOPNOTSUPP;
9665
9666        status = acpi_get_handle(root_handle, (acpi_string)WRD_METHOD, &handle);
9667        if (ACPI_FAILURE(status)) {
9668                ath10k_dbg(ar, ATH10K_DBG_BOOT,
9669                           "failed to get wrd method %d\n", status);
9670                return -EIO;
9671        }
9672
9673        status = acpi_evaluate_object(handle, NULL, NULL, &wrdd);
9674        if (ACPI_FAILURE(status)) {
9675                ath10k_dbg(ar, ATH10K_DBG_BOOT,
9676                           "failed to call wrdc %d\n", status);
9677                return -EIO;
9678        }
9679
9680        alpha2_code = ath10k_mac_wrdd_get_mcc(ar, wrdd.pointer);
9681        kfree(wrdd.pointer);
9682        if (!alpha2_code)
9683                return -EIO;
9684
9685        alpha2[0] = (alpha2_code >> 8) & 0xff;
9686        alpha2[1] = (alpha2_code >> 0) & 0xff;
9687        alpha2[2] = '\0';
9688
9689        ath10k_dbg(ar, ATH10K_DBG_BOOT,
9690                   "regulatory hint from WRDD (alpha2-code): %s\n", alpha2);
9691
9692        *rd = ath_regd_find_country_by_name(alpha2);
9693        if (*rd == 0xffff)
9694                return -EIO;
9695
9696        *rd |= COUNTRY_ERD_FLAG;
9697        return 0;
9698}
9699
9700static int ath10k_mac_init_rd(struct ath10k *ar)
9701{
9702        int ret;
9703        u16 rd;
9704
9705        ret = ath10k_mac_get_wrdd_regulatory(ar, &rd);
9706        if (ret) {
9707                ath10k_dbg(ar, ATH10K_DBG_BOOT,
9708                           "fallback to eeprom programmed regulatory settings\n");
9709                rd = ar->hw_eeprom_rd;
9710        }
9711
9712        ar->ath_common.regulatory.current_rd = rd;
9713        return 0;
9714}
9715
9716int ath10k_mac_register(struct ath10k *ar)
9717{
9718        static const u32 cipher_suites[] = {
9719                WLAN_CIPHER_SUITE_WEP40,
9720                WLAN_CIPHER_SUITE_WEP104,
9721                WLAN_CIPHER_SUITE_TKIP,
9722                WLAN_CIPHER_SUITE_CCMP,
9723
9724                /* Do not add hardware supported ciphers before this line.
9725                 * Allow software encryption for all chips. Don't forget to
9726                 * update n_cipher_suites below.
9727                 */
9728                WLAN_CIPHER_SUITE_AES_CMAC,
9729                WLAN_CIPHER_SUITE_BIP_CMAC_256,
9730                WLAN_CIPHER_SUITE_BIP_GMAC_128,
9731                WLAN_CIPHER_SUITE_BIP_GMAC_256,
9732
9733                /* Only QCA99x0 and QCA4019 varients support GCMP-128, GCMP-256
9734                 * and CCMP-256 in hardware.
9735                 */
9736                WLAN_CIPHER_SUITE_GCMP,
9737                WLAN_CIPHER_SUITE_GCMP_256,
9738                WLAN_CIPHER_SUITE_CCMP_256,
9739        };
9740        struct ieee80211_supported_band *band;
9741        void *channels;
9742        int ret;
9743
9744        if (!is_valid_ether_addr(ar->mac_addr)) {
9745                ath10k_warn(ar, "invalid MAC address; choosing random\n");
9746                eth_random_addr(ar->mac_addr);
9747        }
9748        SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
9749
9750        SET_IEEE80211_DEV(ar->hw, ar->dev);
9751
9752        BUILD_BUG_ON((ARRAY_SIZE(ath10k_2ghz_channels) +
9753                      ARRAY_SIZE(ath10k_5ghz_channels)) !=
9754                     ATH10K_NUM_CHANS);
9755
9756        if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
9757                channels = kmemdup(ath10k_2ghz_channels,
9758                                   sizeof(ath10k_2ghz_channels),
9759                                   GFP_KERNEL);
9760                if (!channels) {
9761                        ret = -ENOMEM;
9762                        goto err_free;
9763                }
9764
9765                band = &ar->mac.sbands[NL80211_BAND_2GHZ];
9766                band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
9767                band->channels = channels;
9768
9769                if (ar->hw_params.cck_rate_map_rev2) {
9770                        band->n_bitrates = ath10k_g_rates_rev2_size;
9771                        band->bitrates = ath10k_g_rates_rev2;
9772                } else {
9773                        band->n_bitrates = ath10k_g_rates_size;
9774                        band->bitrates = ath10k_g_rates;
9775                }
9776
9777                ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = band;
9778        }
9779
9780        if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
9781                channels = kmemdup(ath10k_5ghz_channels,
9782                                   sizeof(ath10k_5ghz_channels),
9783                                   GFP_KERNEL);
9784                if (!channels) {
9785                        ret = -ENOMEM;
9786                        goto err_free;
9787                }
9788
9789                band = &ar->mac.sbands[NL80211_BAND_5GHZ];
9790                band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
9791                band->channels = channels;
9792                band->n_bitrates = ath10k_a_rates_size;
9793                band->bitrates = ath10k_a_rates;
9794                ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band;
9795        }
9796
9797        wiphy_read_of_freq_limits(ar->hw->wiphy);
9798        ath10k_mac_setup_ht_vht_cap(ar);
9799
9800        ar->hw->wiphy->interface_modes =
9801                BIT(NL80211_IFTYPE_STATION) |
9802                BIT(NL80211_IFTYPE_AP) |
9803                BIT(NL80211_IFTYPE_MESH_POINT);
9804
9805        ar->hw->wiphy->available_antennas_rx = ar->cfg_rx_chainmask;
9806        ar->hw->wiphy->available_antennas_tx = ar->cfg_tx_chainmask;
9807
9808        if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->normal_mode_fw.fw_file.fw_features))
9809                ar->hw->wiphy->interface_modes |=
9810                        BIT(NL80211_IFTYPE_P2P_DEVICE) |
9811                        BIT(NL80211_IFTYPE_P2P_CLIENT) |
9812                        BIT(NL80211_IFTYPE_P2P_GO);
9813
9814        ieee80211_hw_set(ar->hw, SIGNAL_DBM);
9815
9816        if (!test_bit(ATH10K_FW_FEATURE_NO_PS,
9817                      ar->running_fw->fw_file.fw_features)) {
9818                ieee80211_hw_set(ar->hw, SUPPORTS_PS);
9819                ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS);
9820        }
9821
9822        ieee80211_hw_set(ar->hw, MFP_CAPABLE);
9823        ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS);
9824        ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL);
9825        ieee80211_hw_set(ar->hw, AP_LINK_PS);
9826        ieee80211_hw_set(ar->hw, SPECTRUM_MGMT);
9827        ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT);
9828        ieee80211_hw_set(ar->hw, CONNECTION_MONITOR);
9829        ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK);
9830        ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF);
9831        ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA);
9832        ieee80211_hw_set(ar->hw, QUEUE_CONTROL);
9833        ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG);
9834        ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK);
9835
9836        if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
9837                ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL);
9838
9839        ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
9840        ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
9841
9842        if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
9843                ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
9844
9845        if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
9846                ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION);
9847                ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW);
9848        }
9849
9850        ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
9851        ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
9852
9853        if (test_bit(WMI_SERVICE_NLO, ar->wmi.svc_map)) {
9854                ar->hw->wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS;
9855                ar->hw->wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS;
9856                ar->hw->wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH;
9857                ar->hw->wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS;
9858                ar->hw->wiphy->max_sched_scan_plan_interval =
9859                        WMI_PNO_MAX_SCHED_SCAN_PLAN_INT;
9860                ar->hw->wiphy->max_sched_scan_plan_iterations =
9861                        WMI_PNO_MAX_SCHED_SCAN_PLAN_ITRNS;
9862                ar->hw->wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR;
9863        }
9864
9865        ar->hw->vif_data_size = sizeof(struct ath10k_vif);
9866        ar->hw->sta_data_size = sizeof(struct ath10k_sta);
9867        ar->hw->txq_data_size = sizeof(struct ath10k_txq);
9868
9869        ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
9870
9871        if (test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) {
9872                ar->hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
9873
9874                /* Firmware delivers WPS/P2P Probe Requests frames to driver so
9875                 * that userspace (e.g. wpa_supplicant/hostapd) can generate
9876                 * correct Probe Responses. This is more of a hack advert..
9877                 */
9878                ar->hw->wiphy->probe_resp_offload |=
9879                        NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS |
9880                        NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 |
9881                        NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P;
9882        }
9883
9884        if (test_bit(WMI_SERVICE_TDLS, ar->wmi.svc_map) ||
9885            test_bit(WMI_SERVICE_TDLS_EXPLICIT_MODE_ONLY, ar->wmi.svc_map)) {
9886                ar->hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS;
9887                if (test_bit(WMI_SERVICE_TDLS_WIDER_BANDWIDTH, ar->wmi.svc_map))
9888                        ieee80211_hw_set(ar->hw, TDLS_WIDER_BW);
9889        }
9890
9891        if (test_bit(WMI_SERVICE_TDLS_UAPSD_BUFFER_STA, ar->wmi.svc_map))
9892                ieee80211_hw_set(ar->hw, SUPPORTS_TDLS_BUFFER_STA);
9893
9894        ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
9895        ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
9896        ar->hw->wiphy->max_remain_on_channel_duration = 5000;
9897
9898        ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
9899        ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
9900                                   NL80211_FEATURE_AP_SCAN;
9901
9902        ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations;
9903
9904        ret = ath10k_wow_init(ar);
9905        if (ret) {
9906                ath10k_warn(ar, "failed to init wow: %d\n", ret);
9907                goto err_free;
9908        }
9909
9910        wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_VHT_IBSS);
9911        wiphy_ext_feature_set(ar->hw->wiphy,
9912                              NL80211_EXT_FEATURE_SET_SCAN_DWELL);
9913        wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_AQL);
9914
9915        if (test_bit(WMI_SERVICE_TX_DATA_ACK_RSSI, ar->wmi.svc_map) ||
9916            test_bit(WMI_SERVICE_HTT_MGMT_TX_COMP_VALID_FLAGS, ar->wmi.svc_map))
9917                wiphy_ext_feature_set(ar->hw->wiphy,
9918                                      NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT);
9919
9920        if (ath10k_peer_stats_enabled(ar) ||
9921            test_bit(WMI_SERVICE_REPORT_AIRTIME, ar->wmi.svc_map))
9922                wiphy_ext_feature_set(ar->hw->wiphy,
9923                                      NL80211_EXT_FEATURE_AIRTIME_FAIRNESS);
9924
9925        if (test_bit(WMI_SERVICE_RTT_RESPONDER_ROLE, ar->wmi.svc_map))
9926                wiphy_ext_feature_set(ar->hw->wiphy,
9927                                      NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER);
9928
9929        if (test_bit(WMI_SERVICE_TX_PWR_PER_PEER, ar->wmi.svc_map))
9930                wiphy_ext_feature_set(ar->hw->wiphy,
9931                                      NL80211_EXT_FEATURE_STA_TX_PWR);
9932
9933        if (test_bit(WMI_SERVICE_PEER_TID_CONFIGS_SUPPORT, ar->wmi.svc_map)) {
9934                ar->hw->wiphy->tid_config_support.vif |=
9935                                BIT(NL80211_TID_CONFIG_ATTR_NOACK) |
9936                                BIT(NL80211_TID_CONFIG_ATTR_RETRY_SHORT) |
9937                                BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG) |
9938                                BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL) |
9939                                BIT(NL80211_TID_CONFIG_ATTR_TX_RATE) |
9940                                BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE);
9941
9942                if (test_bit(WMI_SERVICE_EXT_PEER_TID_CONFIGS_SUPPORT,
9943                             ar->wmi.svc_map)) {
9944                        ar->hw->wiphy->tid_config_support.vif |=
9945                                BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL);
9946                }
9947
9948                ar->hw->wiphy->tid_config_support.peer =
9949                                ar->hw->wiphy->tid_config_support.vif;
9950                ar->hw->wiphy->max_data_retry_count = ATH10K_MAX_RETRY_COUNT;
9951        } else {
9952                ar->ops->set_tid_config = NULL;
9953        }
9954        /*
9955         * on LL hardware queues are managed entirely by the FW
9956         * so we only advertise to mac we can do the queues thing
9957         */
9958        ar->hw->queues = IEEE80211_MAX_QUEUES;
9959
9960        /* vdev_ids are used as hw queue numbers. Make sure offchan tx queue is
9961         * something that vdev_ids can't reach so that we don't stop the queue
9962         * accidentally.
9963         */
9964        ar->hw->offchannel_tx_hw_queue = IEEE80211_MAX_QUEUES - 1;
9965
9966        switch (ar->running_fw->fw_file.wmi_op_version) {
9967        case ATH10K_FW_WMI_OP_VERSION_MAIN:
9968                ar->hw->wiphy->iface_combinations = ath10k_if_comb;
9969                ar->hw->wiphy->n_iface_combinations =
9970                        ARRAY_SIZE(ath10k_if_comb);
9971                ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
9972                break;
9973        case ATH10K_FW_WMI_OP_VERSION_TLV:
9974                if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) {
9975                        ar->hw->wiphy->iface_combinations =
9976                                ath10k_tlv_qcs_if_comb;
9977                        ar->hw->wiphy->n_iface_combinations =
9978                                ARRAY_SIZE(ath10k_tlv_qcs_if_comb);
9979                } else {
9980                        ar->hw->wiphy->iface_combinations = ath10k_tlv_if_comb;
9981                        ar->hw->wiphy->n_iface_combinations =
9982                                ARRAY_SIZE(ath10k_tlv_if_comb);
9983                }
9984                ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
9985                break;
9986        case ATH10K_FW_WMI_OP_VERSION_10_1:
9987        case ATH10K_FW_WMI_OP_VERSION_10_2:
9988        case ATH10K_FW_WMI_OP_VERSION_10_2_4:
9989                ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb;
9990                ar->hw->wiphy->n_iface_combinations =
9991                        ARRAY_SIZE(ath10k_10x_if_comb);
9992                break;
9993        case ATH10K_FW_WMI_OP_VERSION_10_4:
9994                ar->hw->wiphy->iface_combinations = ath10k_10_4_if_comb;
9995                ar->hw->wiphy->n_iface_combinations =
9996                        ARRAY_SIZE(ath10k_10_4_if_comb);
9997                if (test_bit(WMI_SERVICE_VDEV_DIFFERENT_BEACON_INTERVAL_SUPPORT,
9998                             ar->wmi.svc_map)) {
9999                        ar->hw->wiphy->iface_combinations =
10000                                ath10k_10_4_bcn_int_if_comb;
10001                        ar->hw->wiphy->n_iface_combinations =
10002                                ARRAY_SIZE(ath10k_10_4_bcn_int_if_comb);
10003                }
10004                break;
10005        case ATH10K_FW_WMI_OP_VERSION_UNSET:
10006        case ATH10K_FW_WMI_OP_VERSION_MAX:
10007                WARN_ON(1);
10008                ret = -EINVAL;
10009                goto err_free;
10010        }
10011
10012        if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
10013                ar->hw->netdev_features = NETIF_F_HW_CSUM;
10014
10015        if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED)) {
10016                /* Init ath dfs pattern detector */
10017                ar->ath_common.debug_mask = ATH_DBG_DFS;
10018                ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common,
10019                                                             NL80211_DFS_UNSET);
10020
10021                if (!ar->dfs_detector)
10022                        ath10k_warn(ar, "failed to initialise DFS pattern detector\n");
10023        }
10024
10025        ret = ath10k_mac_init_rd(ar);
10026        if (ret) {
10027                ath10k_err(ar, "failed to derive regdom: %d\n", ret);
10028                goto err_dfs_detector_exit;
10029        }
10030
10031        /* Disable set_coverage_class for chipsets that do not support it. */
10032        if (!ar->hw_params.hw_ops->set_coverage_class)
10033                ar->ops->set_coverage_class = NULL;
10034
10035        ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
10036                            ath10k_reg_notifier);
10037        if (ret) {
10038                ath10k_err(ar, "failed to initialise regulatory: %i\n", ret);
10039                goto err_dfs_detector_exit;
10040        }
10041
10042        if (test_bit(WMI_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi.svc_map)) {
10043                ar->hw->wiphy->features |=
10044                        NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
10045        }
10046
10047        ar->hw->wiphy->cipher_suites = cipher_suites;
10048
10049        /* QCA988x and QCA6174 family chips do not support CCMP-256, GCMP-128
10050         * and GCMP-256 ciphers in hardware. Fetch number of ciphers supported
10051         * from chip specific hw_param table.
10052         */
10053        if (!ar->hw_params.n_cipher_suites ||
10054            ar->hw_params.n_cipher_suites > ARRAY_SIZE(cipher_suites)) {
10055                ath10k_err(ar, "invalid hw_params.n_cipher_suites %d\n",
10056                           ar->hw_params.n_cipher_suites);
10057                ar->hw_params.n_cipher_suites = 8;
10058        }
10059        ar->hw->wiphy->n_cipher_suites = ar->hw_params.n_cipher_suites;
10060
10061        wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
10062
10063        ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER;
10064
10065        ret = ieee80211_register_hw(ar->hw);
10066        if (ret) {
10067                ath10k_err(ar, "failed to register ieee80211: %d\n", ret);
10068                goto err_dfs_detector_exit;
10069        }
10070
10071        if (test_bit(WMI_SERVICE_PER_PACKET_SW_ENCRYPT, ar->wmi.svc_map)) {
10072                ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_AP_VLAN);
10073                ar->hw->wiphy->software_iftypes |= BIT(NL80211_IFTYPE_AP_VLAN);
10074        }
10075
10076        if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
10077                ret = regulatory_hint(ar->hw->wiphy,
10078                                      ar->ath_common.regulatory.alpha2);
10079                if (ret)
10080                        goto err_unregister;
10081        }
10082
10083        return 0;
10084
10085err_unregister:
10086        ieee80211_unregister_hw(ar->hw);
10087
10088err_dfs_detector_exit:
10089        if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
10090                ar->dfs_detector->exit(ar->dfs_detector);
10091
10092err_free:
10093        kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
10094        kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
10095
10096        SET_IEEE80211_DEV(ar->hw, NULL);
10097        return ret;
10098}
10099
10100void ath10k_mac_unregister(struct ath10k *ar)
10101{
10102        ieee80211_unregister_hw(ar->hw);
10103
10104        if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
10105                ar->dfs_detector->exit(ar->dfs_detector);
10106
10107        kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
10108        kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
10109
10110        SET_IEEE80211_DEV(ar->hw, NULL);
10111}
10112