linux/drivers/net/wireless/ath/ath10k/mac.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2005-2011 Atheros Communications Inc.
   3 * Copyright (c) 2011-2013 Qualcomm Atheros, Inc.
   4 *
   5 * Permission to use, copy, modify, and/or distribute this software for any
   6 * purpose with or without fee is hereby granted, provided that the above
   7 * copyright notice and this permission notice appear in all copies.
   8 *
   9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  16 */
  17
  18#include "mac.h"
  19
  20#include <net/mac80211.h>
  21#include <linux/etherdevice.h>
  22
  23#include "hif.h"
  24#include "core.h"
  25#include "debug.h"
  26#include "wmi.h"
  27#include "htt.h"
  28#include "txrx.h"
  29
  30/**********/
  31/* Crypto */
  32/**********/
  33
  34static int ath10k_send_key(struct ath10k_vif *arvif,
  35                           struct ieee80211_key_conf *key,
  36                           enum set_key_cmd cmd,
  37                           const u8 *macaddr)
  38{
  39        struct wmi_vdev_install_key_arg arg = {
  40                .vdev_id = arvif->vdev_id,
  41                .key_idx = key->keyidx,
  42                .key_len = key->keylen,
  43                .key_data = key->key,
  44                .macaddr = macaddr,
  45        };
  46
  47        lockdep_assert_held(&arvif->ar->conf_mutex);
  48
  49        if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
  50                arg.key_flags = WMI_KEY_PAIRWISE;
  51        else
  52                arg.key_flags = WMI_KEY_GROUP;
  53
  54        switch (key->cipher) {
  55        case WLAN_CIPHER_SUITE_CCMP:
  56                arg.key_cipher = WMI_CIPHER_AES_CCM;
  57                key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
  58                break;
  59        case WLAN_CIPHER_SUITE_TKIP:
  60                arg.key_cipher = WMI_CIPHER_TKIP;
  61                arg.key_txmic_len = 8;
  62                arg.key_rxmic_len = 8;
  63                break;
  64        case WLAN_CIPHER_SUITE_WEP40:
  65        case WLAN_CIPHER_SUITE_WEP104:
  66                arg.key_cipher = WMI_CIPHER_WEP;
  67                /* AP/IBSS mode requires self-key to be groupwise
  68                 * Otherwise pairwise key must be set */
  69                if (memcmp(macaddr, arvif->vif->addr, ETH_ALEN))
  70                        arg.key_flags = WMI_KEY_PAIRWISE;
  71                break;
  72        default:
  73                ath10k_warn("cipher %d is not supported\n", key->cipher);
  74                return -EOPNOTSUPP;
  75        }
  76
  77        if (cmd == DISABLE_KEY) {
  78                arg.key_cipher = WMI_CIPHER_NONE;
  79                arg.key_data = NULL;
  80        }
  81
  82        return ath10k_wmi_vdev_install_key(arvif->ar, &arg);
  83}
  84
  85static int ath10k_install_key(struct ath10k_vif *arvif,
  86                              struct ieee80211_key_conf *key,
  87                              enum set_key_cmd cmd,
  88                              const u8 *macaddr)
  89{
  90        struct ath10k *ar = arvif->ar;
  91        int ret;
  92
  93        lockdep_assert_held(&ar->conf_mutex);
  94
  95        reinit_completion(&ar->install_key_done);
  96
  97        ret = ath10k_send_key(arvif, key, cmd, macaddr);
  98        if (ret)
  99                return ret;
 100
 101        ret = wait_for_completion_timeout(&ar->install_key_done, 3*HZ);
 102        if (ret == 0)
 103                return -ETIMEDOUT;
 104
 105        return 0;
 106}
 107
 108static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif,
 109                                        const u8 *addr)
 110{
 111        struct ath10k *ar = arvif->ar;
 112        struct ath10k_peer *peer;
 113        int ret;
 114        int i;
 115
 116        lockdep_assert_held(&ar->conf_mutex);
 117
 118        spin_lock_bh(&ar->data_lock);
 119        peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
 120        spin_unlock_bh(&ar->data_lock);
 121
 122        if (!peer)
 123                return -ENOENT;
 124
 125        for (i = 0; i < ARRAY_SIZE(arvif->wep_keys); i++) {
 126                if (arvif->wep_keys[i] == NULL)
 127                        continue;
 128
 129                ret = ath10k_install_key(arvif, arvif->wep_keys[i], SET_KEY,
 130                                         addr);
 131                if (ret)
 132                        return ret;
 133
 134                peer->keys[i] = arvif->wep_keys[i];
 135        }
 136
 137        return 0;
 138}
 139
 140static int ath10k_clear_peer_keys(struct ath10k_vif *arvif,
 141                                  const u8 *addr)
 142{
 143        struct ath10k *ar = arvif->ar;
 144        struct ath10k_peer *peer;
 145        int first_errno = 0;
 146        int ret;
 147        int i;
 148
 149        lockdep_assert_held(&ar->conf_mutex);
 150
 151        spin_lock_bh(&ar->data_lock);
 152        peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
 153        spin_unlock_bh(&ar->data_lock);
 154
 155        if (!peer)
 156                return -ENOENT;
 157
 158        for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
 159                if (peer->keys[i] == NULL)
 160                        continue;
 161
 162                ret = ath10k_install_key(arvif, peer->keys[i],
 163                                         DISABLE_KEY, addr);
 164                if (ret && first_errno == 0)
 165                        first_errno = ret;
 166
 167                if (ret)
 168                        ath10k_warn("could not remove peer wep key %d (%d)\n",
 169                                    i, ret);
 170
 171                peer->keys[i] = NULL;
 172        }
 173
 174        return first_errno;
 175}
 176
 177static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
 178                                 struct ieee80211_key_conf *key)
 179{
 180        struct ath10k *ar = arvif->ar;
 181        struct ath10k_peer *peer;
 182        u8 addr[ETH_ALEN];
 183        int first_errno = 0;
 184        int ret;
 185        int i;
 186
 187        lockdep_assert_held(&ar->conf_mutex);
 188
 189        for (;;) {
 190                /* since ath10k_install_key we can't hold data_lock all the
 191                 * time, so we try to remove the keys incrementally */
 192                spin_lock_bh(&ar->data_lock);
 193                i = 0;
 194                list_for_each_entry(peer, &ar->peers, list) {
 195                        for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
 196                                if (peer->keys[i] == key) {
 197                                        memcpy(addr, peer->addr, ETH_ALEN);
 198                                        peer->keys[i] = NULL;
 199                                        break;
 200                                }
 201                        }
 202
 203                        if (i < ARRAY_SIZE(peer->keys))
 204                                break;
 205                }
 206                spin_unlock_bh(&ar->data_lock);
 207
 208                if (i == ARRAY_SIZE(peer->keys))
 209                        break;
 210
 211                ret = ath10k_install_key(arvif, key, DISABLE_KEY, addr);
 212                if (ret && first_errno == 0)
 213                        first_errno = ret;
 214
 215                if (ret)
 216                        ath10k_warn("could not remove key for %pM\n", addr);
 217        }
 218
 219        return first_errno;
 220}
 221
 222
 223/*********************/
 224/* General utilities */
 225/*********************/
 226
 227static inline enum wmi_phy_mode
 228chan_to_phymode(const struct cfg80211_chan_def *chandef)
 229{
 230        enum wmi_phy_mode phymode = MODE_UNKNOWN;
 231
 232        switch (chandef->chan->band) {
 233        case IEEE80211_BAND_2GHZ:
 234                switch (chandef->width) {
 235                case NL80211_CHAN_WIDTH_20_NOHT:
 236                        phymode = MODE_11G;
 237                        break;
 238                case NL80211_CHAN_WIDTH_20:
 239                        phymode = MODE_11NG_HT20;
 240                        break;
 241                case NL80211_CHAN_WIDTH_40:
 242                        phymode = MODE_11NG_HT40;
 243                        break;
 244                case NL80211_CHAN_WIDTH_5:
 245                case NL80211_CHAN_WIDTH_10:
 246                case NL80211_CHAN_WIDTH_80:
 247                case NL80211_CHAN_WIDTH_80P80:
 248                case NL80211_CHAN_WIDTH_160:
 249                        phymode = MODE_UNKNOWN;
 250                        break;
 251                }
 252                break;
 253        case IEEE80211_BAND_5GHZ:
 254                switch (chandef->width) {
 255                case NL80211_CHAN_WIDTH_20_NOHT:
 256                        phymode = MODE_11A;
 257                        break;
 258                case NL80211_CHAN_WIDTH_20:
 259                        phymode = MODE_11NA_HT20;
 260                        break;
 261                case NL80211_CHAN_WIDTH_40:
 262                        phymode = MODE_11NA_HT40;
 263                        break;
 264                case NL80211_CHAN_WIDTH_80:
 265                        phymode = MODE_11AC_VHT80;
 266                        break;
 267                case NL80211_CHAN_WIDTH_5:
 268                case NL80211_CHAN_WIDTH_10:
 269                case NL80211_CHAN_WIDTH_80P80:
 270                case NL80211_CHAN_WIDTH_160:
 271                        phymode = MODE_UNKNOWN;
 272                        break;
 273                }
 274                break;
 275        default:
 276                break;
 277        }
 278
 279        WARN_ON(phymode == MODE_UNKNOWN);
 280        return phymode;
 281}
 282
 283static u8 ath10k_parse_mpdudensity(u8 mpdudensity)
 284{
 285/*
 286 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
 287 *   0 for no restriction
 288 *   1 for 1/4 us
 289 *   2 for 1/2 us
 290 *   3 for 1 us
 291 *   4 for 2 us
 292 *   5 for 4 us
 293 *   6 for 8 us
 294 *   7 for 16 us
 295 */
 296        switch (mpdudensity) {
 297        case 0:
 298                return 0;
 299        case 1:
 300        case 2:
 301        case 3:
 302        /* Our lower layer calculations limit our precision to
 303           1 microsecond */
 304                return 1;
 305        case 4:
 306                return 2;
 307        case 5:
 308                return 4;
 309        case 6:
 310                return 8;
 311        case 7:
 312                return 16;
 313        default:
 314                return 0;
 315        }
 316}
 317
 318static int ath10k_peer_create(struct ath10k *ar, u32 vdev_id, const u8 *addr)
 319{
 320        int ret;
 321
 322        lockdep_assert_held(&ar->conf_mutex);
 323
 324        ret = ath10k_wmi_peer_create(ar, vdev_id, addr);
 325        if (ret) {
 326                ath10k_warn("Failed to create wmi peer: %i\n", ret);
 327                return ret;
 328        }
 329
 330        ret = ath10k_wait_for_peer_created(ar, vdev_id, addr);
 331        if (ret) {
 332                ath10k_warn("Failed to wait for created wmi peer: %i\n", ret);
 333                return ret;
 334        }
 335        spin_lock_bh(&ar->data_lock);
 336        ar->num_peers++;
 337        spin_unlock_bh(&ar->data_lock);
 338
 339        return 0;
 340}
 341
 342static int  ath10k_mac_set_rts(struct ath10k_vif *arvif, u32 value)
 343{
 344        struct ath10k *ar = arvif->ar;
 345        u32 vdev_param;
 346
 347        if (value != 0xFFFFFFFF)
 348                value = min_t(u32, arvif->ar->hw->wiphy->rts_threshold,
 349                              ATH10K_RTS_MAX);
 350
 351        vdev_param = ar->wmi.vdev_param->rts_threshold;
 352        return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
 353}
 354
 355static int ath10k_mac_set_frag(struct ath10k_vif *arvif, u32 value)
 356{
 357        struct ath10k *ar = arvif->ar;
 358        u32 vdev_param;
 359
 360        if (value != 0xFFFFFFFF)
 361                value = clamp_t(u32, arvif->ar->hw->wiphy->frag_threshold,
 362                                ATH10K_FRAGMT_THRESHOLD_MIN,
 363                                ATH10K_FRAGMT_THRESHOLD_MAX);
 364
 365        vdev_param = ar->wmi.vdev_param->fragmentation_threshold;
 366        return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
 367}
 368
 369static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
 370{
 371        int ret;
 372
 373        lockdep_assert_held(&ar->conf_mutex);
 374
 375        ret = ath10k_wmi_peer_delete(ar, vdev_id, addr);
 376        if (ret)
 377                return ret;
 378
 379        ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
 380        if (ret)
 381                return ret;
 382
 383        spin_lock_bh(&ar->data_lock);
 384        ar->num_peers--;
 385        spin_unlock_bh(&ar->data_lock);
 386
 387        return 0;
 388}
 389
 390static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id)
 391{
 392        struct ath10k_peer *peer, *tmp;
 393
 394        lockdep_assert_held(&ar->conf_mutex);
 395
 396        spin_lock_bh(&ar->data_lock);
 397        list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
 398                if (peer->vdev_id != vdev_id)
 399                        continue;
 400
 401                ath10k_warn("removing stale peer %pM from vdev_id %d\n",
 402                            peer->addr, vdev_id);
 403
 404                list_del(&peer->list);
 405                kfree(peer);
 406                ar->num_peers--;
 407        }
 408        spin_unlock_bh(&ar->data_lock);
 409}
 410
 411static void ath10k_peer_cleanup_all(struct ath10k *ar)
 412{
 413        struct ath10k_peer *peer, *tmp;
 414
 415        lockdep_assert_held(&ar->conf_mutex);
 416
 417        spin_lock_bh(&ar->data_lock);
 418        list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
 419                list_del(&peer->list);
 420                kfree(peer);
 421        }
 422        ar->num_peers = 0;
 423        spin_unlock_bh(&ar->data_lock);
 424}
 425
 426/************************/
 427/* Interface management */
 428/************************/
 429
 430static inline int ath10k_vdev_setup_sync(struct ath10k *ar)
 431{
 432        int ret;
 433
 434        lockdep_assert_held(&ar->conf_mutex);
 435
 436        ret = wait_for_completion_timeout(&ar->vdev_setup_done,
 437                                          ATH10K_VDEV_SETUP_TIMEOUT_HZ);
 438        if (ret == 0)
 439                return -ETIMEDOUT;
 440
 441        return 0;
 442}
 443
 444static int ath10k_vdev_start(struct ath10k_vif *arvif)
 445{
 446        struct ath10k *ar = arvif->ar;
 447        struct ieee80211_conf *conf = &ar->hw->conf;
 448        struct ieee80211_channel *channel = conf->chandef.chan;
 449        struct wmi_vdev_start_request_arg arg = {};
 450        int ret = 0;
 451
 452        lockdep_assert_held(&ar->conf_mutex);
 453
 454        reinit_completion(&ar->vdev_setup_done);
 455
 456        arg.vdev_id = arvif->vdev_id;
 457        arg.dtim_period = arvif->dtim_period;
 458        arg.bcn_intval = arvif->beacon_interval;
 459
 460        arg.channel.freq = channel->center_freq;
 461
 462        arg.channel.band_center_freq1 = conf->chandef.center_freq1;
 463
 464        arg.channel.mode = chan_to_phymode(&conf->chandef);
 465
 466        arg.channel.min_power = 0;
 467        arg.channel.max_power = channel->max_power * 2;
 468        arg.channel.max_reg_power = channel->max_reg_power * 2;
 469        arg.channel.max_antenna_gain = channel->max_antenna_gain * 2;
 470
 471        if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
 472                arg.ssid = arvif->u.ap.ssid;
 473                arg.ssid_len = arvif->u.ap.ssid_len;
 474                arg.hidden_ssid = arvif->u.ap.hidden_ssid;
 475
 476                /* For now allow DFS for AP mode */
 477                arg.channel.chan_radar =
 478                        !!(channel->flags & IEEE80211_CHAN_RADAR);
 479        } else if (arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
 480                arg.ssid = arvif->vif->bss_conf.ssid;
 481                arg.ssid_len = arvif->vif->bss_conf.ssid_len;
 482        }
 483
 484        ath10k_dbg(ATH10K_DBG_MAC,
 485                   "mac vdev %d start center_freq %d phymode %s\n",
 486                   arg.vdev_id, arg.channel.freq,
 487                   ath10k_wmi_phymode_str(arg.channel.mode));
 488
 489        ret = ath10k_wmi_vdev_start(ar, &arg);
 490        if (ret) {
 491                ath10k_warn("WMI vdev start failed: ret %d\n", ret);
 492                return ret;
 493        }
 494
 495        ret = ath10k_vdev_setup_sync(ar);
 496        if (ret) {
 497                ath10k_warn("vdev setup failed %d\n", ret);
 498                return ret;
 499        }
 500
 501        return ret;
 502}
 503
 504static int ath10k_vdev_stop(struct ath10k_vif *arvif)
 505{
 506        struct ath10k *ar = arvif->ar;
 507        int ret;
 508
 509        lockdep_assert_held(&ar->conf_mutex);
 510
 511        reinit_completion(&ar->vdev_setup_done);
 512
 513        ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id);
 514        if (ret) {
 515                ath10k_warn("WMI vdev stop failed: ret %d\n", ret);
 516                return ret;
 517        }
 518
 519        ret = ath10k_vdev_setup_sync(ar);
 520        if (ret) {
 521                ath10k_warn("vdev setup failed %d\n", ret);
 522                return ret;
 523        }
 524
 525        return ret;
 526}
 527
 528static int ath10k_monitor_start(struct ath10k *ar, int vdev_id)
 529{
 530        struct ieee80211_channel *channel = ar->hw->conf.chandef.chan;
 531        struct wmi_vdev_start_request_arg arg = {};
 532        int ret = 0;
 533
 534        lockdep_assert_held(&ar->conf_mutex);
 535
 536        if (!ar->monitor_present) {
 537                ath10k_warn("mac montor stop -- monitor is not present\n");
 538                return -EINVAL;
 539        }
 540
 541        arg.vdev_id = vdev_id;
 542        arg.channel.freq = channel->center_freq;
 543        arg.channel.band_center_freq1 = ar->hw->conf.chandef.center_freq1;
 544
 545        /* TODO setup this dynamically, what in case we
 546           don't have any vifs? */
 547        arg.channel.mode = chan_to_phymode(&ar->hw->conf.chandef);
 548        arg.channel.chan_radar =
 549                        !!(channel->flags & IEEE80211_CHAN_RADAR);
 550
 551        arg.channel.min_power = 0;
 552        arg.channel.max_power = channel->max_power * 2;
 553        arg.channel.max_reg_power = channel->max_reg_power * 2;
 554        arg.channel.max_antenna_gain = channel->max_antenna_gain * 2;
 555
 556        ret = ath10k_wmi_vdev_start(ar, &arg);
 557        if (ret) {
 558                ath10k_warn("Monitor vdev start failed: ret %d\n", ret);
 559                return ret;
 560        }
 561
 562        ret = ath10k_vdev_setup_sync(ar);
 563        if (ret) {
 564                ath10k_warn("Monitor vdev setup failed %d\n", ret);
 565                return ret;
 566        }
 567
 568        ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
 569        if (ret) {
 570                ath10k_warn("Monitor vdev up failed: %d\n", ret);
 571                goto vdev_stop;
 572        }
 573
 574        ar->monitor_vdev_id = vdev_id;
 575        ar->monitor_enabled = true;
 576
 577        return 0;
 578
 579vdev_stop:
 580        ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
 581        if (ret)
 582                ath10k_warn("Monitor vdev stop failed: %d\n", ret);
 583
 584        return ret;
 585}
 586
 587static int ath10k_monitor_stop(struct ath10k *ar)
 588{
 589        int ret = 0;
 590
 591        lockdep_assert_held(&ar->conf_mutex);
 592
 593        if (!ar->monitor_present) {
 594                ath10k_warn("mac montor stop -- monitor is not present\n");
 595                return -EINVAL;
 596        }
 597
 598        if (!ar->monitor_enabled) {
 599                ath10k_warn("mac montor stop -- monitor is not enabled\n");
 600                return -EINVAL;
 601        }
 602
 603        ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id);
 604        if (ret)
 605                ath10k_warn("Monitor vdev down failed: %d\n", ret);
 606
 607        ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
 608        if (ret)
 609                ath10k_warn("Monitor vdev stop failed: %d\n", ret);
 610
 611        ret = ath10k_vdev_setup_sync(ar);
 612        if (ret)
 613                ath10k_warn("Monitor_down sync failed: %d\n", ret);
 614
 615        ar->monitor_enabled = false;
 616        return ret;
 617}
 618
 619static int ath10k_monitor_create(struct ath10k *ar)
 620{
 621        int bit, ret = 0;
 622
 623        lockdep_assert_held(&ar->conf_mutex);
 624
 625        if (ar->monitor_present) {
 626                ath10k_warn("Monitor mode already enabled\n");
 627                return 0;
 628        }
 629
 630        bit = ffs(ar->free_vdev_map);
 631        if (bit == 0) {
 632                ath10k_warn("No free VDEV slots\n");
 633                return -ENOMEM;
 634        }
 635
 636        ar->monitor_vdev_id = bit - 1;
 637        ar->free_vdev_map &= ~(1 << ar->monitor_vdev_id);
 638
 639        ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id,
 640                                     WMI_VDEV_TYPE_MONITOR,
 641                                     0, ar->mac_addr);
 642        if (ret) {
 643                ath10k_warn("WMI vdev monitor create failed: ret %d\n", ret);
 644                goto vdev_fail;
 645        }
 646
 647        ath10k_dbg(ATH10K_DBG_MAC, "mac monitor vdev %d created\n",
 648                   ar->monitor_vdev_id);
 649
 650        ar->monitor_present = true;
 651        return 0;
 652
 653vdev_fail:
 654        /*
 655         * Restore the ID to the global map.
 656         */
 657        ar->free_vdev_map |= 1 << (ar->monitor_vdev_id);
 658        return ret;
 659}
 660
 661static int ath10k_monitor_destroy(struct ath10k *ar)
 662{
 663        int ret = 0;
 664
 665        lockdep_assert_held(&ar->conf_mutex);
 666
 667        if (!ar->monitor_present)
 668                return 0;
 669
 670        ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
 671        if (ret) {
 672                ath10k_warn("WMI vdev monitor delete failed: %d\n", ret);
 673                return ret;
 674        }
 675
 676        ar->free_vdev_map |= 1 << (ar->monitor_vdev_id);
 677        ar->monitor_present = false;
 678
 679        ath10k_dbg(ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n",
 680                   ar->monitor_vdev_id);
 681        return ret;
 682}
 683
 684static int ath10k_start_cac(struct ath10k *ar)
 685{
 686        int ret;
 687
 688        lockdep_assert_held(&ar->conf_mutex);
 689
 690        set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
 691
 692        ret = ath10k_monitor_create(ar);
 693        if (ret) {
 694                clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
 695                return ret;
 696        }
 697
 698        ret = ath10k_monitor_start(ar, ar->monitor_vdev_id);
 699        if (ret) {
 700                clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
 701                ath10k_monitor_destroy(ar);
 702                return ret;
 703        }
 704
 705        ath10k_dbg(ATH10K_DBG_MAC, "mac cac start monitor vdev %d\n",
 706                   ar->monitor_vdev_id);
 707
 708        return 0;
 709}
 710
 711static int ath10k_stop_cac(struct ath10k *ar)
 712{
 713        lockdep_assert_held(&ar->conf_mutex);
 714
 715        /* CAC is not running - do nothing */
 716        if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags))
 717                return 0;
 718
 719        ath10k_monitor_stop(ar);
 720        ath10k_monitor_destroy(ar);
 721        clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
 722
 723        ath10k_dbg(ATH10K_DBG_MAC, "mac cac finished\n");
 724
 725        return 0;
 726}
 727
 728static const char *ath10k_dfs_state(enum nl80211_dfs_state dfs_state)
 729{
 730        switch (dfs_state) {
 731        case NL80211_DFS_USABLE:
 732                return "USABLE";
 733        case NL80211_DFS_UNAVAILABLE:
 734                return "UNAVAILABLE";
 735        case NL80211_DFS_AVAILABLE:
 736                return "AVAILABLE";
 737        default:
 738                WARN_ON(1);
 739                return "bug";
 740        }
 741}
 742
 743static void ath10k_config_radar_detection(struct ath10k *ar)
 744{
 745        struct ieee80211_channel *chan = ar->hw->conf.chandef.chan;
 746        bool radar = ar->hw->conf.radar_enabled;
 747        bool chan_radar = !!(chan->flags & IEEE80211_CHAN_RADAR);
 748        enum nl80211_dfs_state dfs_state = chan->dfs_state;
 749        int ret;
 750
 751        lockdep_assert_held(&ar->conf_mutex);
 752
 753        ath10k_dbg(ATH10K_DBG_MAC,
 754                   "mac radar config update: chan %dMHz radar %d chan radar %d chan state %s\n",
 755                   chan->center_freq, radar, chan_radar,
 756                   ath10k_dfs_state(dfs_state));
 757
 758        /*
 759         * It's safe to call it even if CAC is not started.
 760         * This call here guarantees changing channel, etc. will stop CAC.
 761         */
 762        ath10k_stop_cac(ar);
 763
 764        if (!radar)
 765                return;
 766
 767        if (!chan_radar)
 768                return;
 769
 770        if (dfs_state != NL80211_DFS_USABLE)
 771                return;
 772
 773        ret = ath10k_start_cac(ar);
 774        if (ret) {
 775                /*
 776                 * Not possible to start CAC on current channel so starting
 777                 * radiation is not allowed, make this channel DFS_UNAVAILABLE
 778                 * by indicating that radar was detected.
 779                 */
 780                ath10k_warn("failed to start CAC (%d)\n", ret);
 781                ieee80211_radar_detected(ar->hw);
 782        }
 783}
 784
 785static void ath10k_control_beaconing(struct ath10k_vif *arvif,
 786                                struct ieee80211_bss_conf *info)
 787{
 788        int ret = 0;
 789
 790        lockdep_assert_held(&arvif->ar->conf_mutex);
 791
 792        if (!info->enable_beacon) {
 793                ath10k_vdev_stop(arvif);
 794                return;
 795        }
 796
 797        arvif->tx_seq_no = 0x1000;
 798
 799        ret = ath10k_vdev_start(arvif);
 800        if (ret)
 801                return;
 802
 803        ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, 0, info->bssid);
 804        if (ret) {
 805                ath10k_warn("Failed to bring up VDEV: %d\n",
 806                            arvif->vdev_id);
 807                return;
 808        }
 809        ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
 810}
 811
 812static void ath10k_control_ibss(struct ath10k_vif *arvif,
 813                                struct ieee80211_bss_conf *info,
 814                                const u8 self_peer[ETH_ALEN])
 815{
 816        u32 vdev_param;
 817        int ret = 0;
 818
 819        lockdep_assert_held(&arvif->ar->conf_mutex);
 820
 821        if (!info->ibss_joined) {
 822                ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, self_peer);
 823                if (ret)
 824                        ath10k_warn("Failed to delete IBSS self peer:%pM for VDEV:%d ret:%d\n",
 825                                    self_peer, arvif->vdev_id, ret);
 826
 827                if (is_zero_ether_addr(arvif->u.ibss.bssid))
 828                        return;
 829
 830                ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id,
 831                                         arvif->u.ibss.bssid);
 832                if (ret) {
 833                        ath10k_warn("Failed to delete IBSS BSSID peer:%pM for VDEV:%d ret:%d\n",
 834                                    arvif->u.ibss.bssid, arvif->vdev_id, ret);
 835                        return;
 836                }
 837
 838                memset(arvif->u.ibss.bssid, 0, ETH_ALEN);
 839
 840                return;
 841        }
 842
 843        ret = ath10k_peer_create(arvif->ar, arvif->vdev_id, self_peer);
 844        if (ret) {
 845                ath10k_warn("Failed to create IBSS self peer:%pM for VDEV:%d ret:%d\n",
 846                            self_peer, arvif->vdev_id, ret);
 847                return;
 848        }
 849
 850        vdev_param = arvif->ar->wmi.vdev_param->atim_window;
 851        ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param,
 852                                        ATH10K_DEFAULT_ATIM);
 853        if (ret)
 854                ath10k_warn("Failed to set IBSS ATIM for VDEV:%d ret:%d\n",
 855                            arvif->vdev_id, ret);
 856}
 857
 858/*
 859 * Review this when mac80211 gains per-interface powersave support.
 860 */
 861static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif)
 862{
 863        struct ath10k *ar = arvif->ar;
 864        struct ieee80211_conf *conf = &ar->hw->conf;
 865        enum wmi_sta_powersave_param param;
 866        enum wmi_sta_ps_mode psmode;
 867        int ret;
 868
 869        lockdep_assert_held(&arvif->ar->conf_mutex);
 870
 871        if (arvif->vif->type != NL80211_IFTYPE_STATION)
 872                return 0;
 873
 874        if (conf->flags & IEEE80211_CONF_PS) {
 875                psmode = WMI_STA_PS_MODE_ENABLED;
 876                param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
 877
 878                ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
 879                                                  conf->dynamic_ps_timeout);
 880                if (ret) {
 881                        ath10k_warn("Failed to set inactivity time for VDEV: %d\n",
 882                                    arvif->vdev_id);
 883                        return ret;
 884                }
 885        } else {
 886                psmode = WMI_STA_PS_MODE_DISABLED;
 887        }
 888
 889        ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d psmode %s\n",
 890                   arvif->vdev_id, psmode ? "enable" : "disable");
 891
 892        ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode);
 893        if (ret) {
 894                ath10k_warn("Failed to set PS Mode: %d for VDEV: %d\n",
 895                            psmode, arvif->vdev_id);
 896                return ret;
 897        }
 898
 899        return 0;
 900}
 901
 902/**********************/
 903/* Station management */
 904/**********************/
 905
 906static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
 907                                      struct ath10k_vif *arvif,
 908                                      struct ieee80211_sta *sta,
 909                                      struct ieee80211_bss_conf *bss_conf,
 910                                      struct wmi_peer_assoc_complete_arg *arg)
 911{
 912        lockdep_assert_held(&ar->conf_mutex);
 913
 914        memcpy(arg->addr, sta->addr, ETH_ALEN);
 915        arg->vdev_id = arvif->vdev_id;
 916        arg->peer_aid = sta->aid;
 917        arg->peer_flags |= WMI_PEER_AUTH;
 918
 919        if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
 920                /*
 921                 * Seems FW have problems with Power Save in STA
 922                 * mode when we setup this parameter to high (eg. 5).
 923                 * Often we see that FW don't send NULL (with clean P flags)
 924                 * frame even there is info about buffered frames in beacons.
 925                 * Sometimes we have to wait more than 10 seconds before FW
 926                 * will wakeup. Often sending one ping from AP to our device
 927                 * just fail (more than 50%).
 928                 *
 929                 * Seems setting this FW parameter to 1 couse FW
 930                 * will check every beacon and will wakup immediately
 931                 * after detection buffered data.
 932                 */
 933                arg->peer_listen_intval = 1;
 934        else
 935                arg->peer_listen_intval = ar->hw->conf.listen_interval;
 936
 937        arg->peer_num_spatial_streams = 1;
 938
 939        /*
 940         * The assoc capabilities are available only in managed mode.
 941         */
 942        if (arvif->vdev_type == WMI_VDEV_TYPE_STA && bss_conf)
 943                arg->peer_caps = bss_conf->assoc_capability;
 944}
 945
 946static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
 947                                       struct ath10k_vif *arvif,
 948                                       struct wmi_peer_assoc_complete_arg *arg)
 949{
 950        struct ieee80211_vif *vif = arvif->vif;
 951        struct ieee80211_bss_conf *info = &vif->bss_conf;
 952        struct cfg80211_bss *bss;
 953        const u8 *rsnie = NULL;
 954        const u8 *wpaie = NULL;
 955
 956        lockdep_assert_held(&ar->conf_mutex);
 957
 958        bss = cfg80211_get_bss(ar->hw->wiphy, ar->hw->conf.chandef.chan,
 959                               info->bssid, NULL, 0, 0, 0);
 960        if (bss) {
 961                const struct cfg80211_bss_ies *ies;
 962
 963                rcu_read_lock();
 964                rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
 965
 966                ies = rcu_dereference(bss->ies);
 967
 968                wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
 969                                WLAN_OUI_TYPE_MICROSOFT_WPA,
 970                                ies->data,
 971                                ies->len);
 972                rcu_read_unlock();
 973                cfg80211_put_bss(ar->hw->wiphy, bss);
 974        }
 975
 976        /* FIXME: base on RSN IE/WPA IE is a correct idea? */
 977        if (rsnie || wpaie) {
 978                ath10k_dbg(ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__);
 979                arg->peer_flags |= WMI_PEER_NEED_PTK_4_WAY;
 980        }
 981
 982        if (wpaie) {
 983                ath10k_dbg(ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__);
 984                arg->peer_flags |= WMI_PEER_NEED_GTK_2_WAY;
 985        }
 986}
 987
 988static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
 989                                      struct ieee80211_sta *sta,
 990                                      struct wmi_peer_assoc_complete_arg *arg)
 991{
 992        struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
 993        const struct ieee80211_supported_band *sband;
 994        const struct ieee80211_rate *rates;
 995        u32 ratemask;
 996        int i;
 997
 998        lockdep_assert_held(&ar->conf_mutex);
 999
1000        sband = ar->hw->wiphy->bands[ar->hw->conf.chandef.chan->band];
1001        ratemask = sta->supp_rates[ar->hw->conf.chandef.chan->band];
1002        rates = sband->bitrates;
1003
1004        rateset->num_rates = 0;
1005
1006        for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
1007                if (!(ratemask & 1))
1008                        continue;
1009
1010                rateset->rates[rateset->num_rates] = rates->hw_value;
1011                rateset->num_rates++;
1012        }
1013}
1014
1015static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
1016                                   struct ieee80211_sta *sta,
1017                                   struct wmi_peer_assoc_complete_arg *arg)
1018{
1019        const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
1020        int smps;
1021        int i, n;
1022
1023        lockdep_assert_held(&ar->conf_mutex);
1024
1025        if (!ht_cap->ht_supported)
1026                return;
1027
1028        arg->peer_flags |= WMI_PEER_HT;
1029        arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1030                                    ht_cap->ampdu_factor)) - 1;
1031
1032        arg->peer_mpdu_density =
1033                ath10k_parse_mpdudensity(ht_cap->ampdu_density);
1034
1035        arg->peer_ht_caps = ht_cap->cap;
1036        arg->peer_rate_caps |= WMI_RC_HT_FLAG;
1037
1038        if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
1039                arg->peer_flags |= WMI_PEER_LDPC;
1040
1041        if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
1042                arg->peer_flags |= WMI_PEER_40MHZ;
1043                arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
1044        }
1045
1046        if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20)
1047                arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
1048
1049        if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40)
1050                arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
1051
1052        if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
1053                arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG;
1054                arg->peer_flags |= WMI_PEER_STBC;
1055        }
1056
1057        if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
1058                u32 stbc;
1059                stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
1060                stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
1061                stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
1062                arg->peer_rate_caps |= stbc;
1063                arg->peer_flags |= WMI_PEER_STBC;
1064        }
1065
1066        smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
1067        smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
1068
1069        if (smps == WLAN_HT_CAP_SM_PS_STATIC) {
1070                arg->peer_flags |= WMI_PEER_SPATIAL_MUX;
1071                arg->peer_flags |= WMI_PEER_STATIC_MIMOPS;
1072        } else if (smps == WLAN_HT_CAP_SM_PS_DYNAMIC) {
1073                arg->peer_flags |= WMI_PEER_SPATIAL_MUX;
1074                arg->peer_flags |= WMI_PEER_DYN_MIMOPS;
1075        }
1076
1077        if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
1078                arg->peer_rate_caps |= WMI_RC_TS_FLAG;
1079        else if (ht_cap->mcs.rx_mask[1])
1080                arg->peer_rate_caps |= WMI_RC_DS_FLAG;
1081
1082        for (i = 0, n = 0; i < IEEE80211_HT_MCS_MASK_LEN*8; i++)
1083                if (ht_cap->mcs.rx_mask[i/8] & (1 << i%8))
1084                        arg->peer_ht_rates.rates[n++] = i;
1085
1086        arg->peer_ht_rates.num_rates = n;
1087        arg->peer_num_spatial_streams = max((n+7) / 8, 1);
1088
1089        ath10k_dbg(ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
1090                   arg->addr,
1091                   arg->peer_ht_rates.num_rates,
1092                   arg->peer_num_spatial_streams);
1093}
1094
1095static void ath10k_peer_assoc_h_qos_ap(struct ath10k *ar,
1096                                       struct ath10k_vif *arvif,
1097                                       struct ieee80211_sta *sta,
1098                                       struct ieee80211_bss_conf *bss_conf,
1099                                       struct wmi_peer_assoc_complete_arg *arg)
1100{
1101        u32 uapsd = 0;
1102        u32 max_sp = 0;
1103
1104        lockdep_assert_held(&ar->conf_mutex);
1105
1106        if (sta->wme)
1107                arg->peer_flags |= WMI_PEER_QOS;
1108
1109        if (sta->wme && sta->uapsd_queues) {
1110                ath10k_dbg(ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
1111                           sta->uapsd_queues, sta->max_sp);
1112
1113                arg->peer_flags |= WMI_PEER_APSD;
1114                arg->peer_rate_caps |= WMI_RC_UAPSD_FLAG;
1115
1116                if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
1117                        uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
1118                                 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
1119                if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
1120                        uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
1121                                 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
1122                if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
1123                        uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
1124                                 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
1125                if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
1126                        uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
1127                                 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
1128
1129
1130                if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
1131                        max_sp = sta->max_sp;
1132
1133                ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1134                                           sta->addr,
1135                                           WMI_AP_PS_PEER_PARAM_UAPSD,
1136                                           uapsd);
1137
1138                ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1139                                           sta->addr,
1140                                           WMI_AP_PS_PEER_PARAM_MAX_SP,
1141                                           max_sp);
1142
1143                /* TODO setup this based on STA listen interval and
1144                   beacon interval. Currently we don't know
1145                   sta->listen_interval - mac80211 patch required.
1146                   Currently use 10 seconds */
1147                ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1148                                           sta->addr,
1149                                           WMI_AP_PS_PEER_PARAM_AGEOUT_TIME,
1150                                           10);
1151        }
1152}
1153
1154static void ath10k_peer_assoc_h_qos_sta(struct ath10k *ar,
1155                                        struct ath10k_vif *arvif,
1156                                        struct ieee80211_sta *sta,
1157                                        struct ieee80211_bss_conf *bss_conf,
1158                                        struct wmi_peer_assoc_complete_arg *arg)
1159{
1160        if (bss_conf->qos)
1161                arg->peer_flags |= WMI_PEER_QOS;
1162}
1163
1164static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
1165                                    struct ieee80211_sta *sta,
1166                                    struct wmi_peer_assoc_complete_arg *arg)
1167{
1168        const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
1169        u8 ampdu_factor;
1170
1171        if (!vht_cap->vht_supported)
1172                return;
1173
1174        arg->peer_flags |= WMI_PEER_VHT;
1175        arg->peer_vht_caps = vht_cap->cap;
1176
1177
1178        ampdu_factor = (vht_cap->cap &
1179                        IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
1180                       IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
1181
1182        /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
1183         * zero in VHT IE. Using it would result in degraded throughput.
1184         * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
1185         * it if VHT max_mpdu is smaller. */
1186        arg->peer_max_mpdu = max(arg->peer_max_mpdu,
1187                                 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1188                                        ampdu_factor)) - 1);
1189
1190        if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1191                arg->peer_flags |= WMI_PEER_80MHZ;
1192
1193        arg->peer_vht_rates.rx_max_rate =
1194                __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
1195        arg->peer_vht_rates.rx_mcs_set =
1196                __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
1197        arg->peer_vht_rates.tx_max_rate =
1198                __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
1199        arg->peer_vht_rates.tx_mcs_set =
1200                __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map);
1201
1202        ath10k_dbg(ATH10K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
1203                   sta->addr, arg->peer_max_mpdu, arg->peer_flags);
1204}
1205
1206static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
1207                                    struct ath10k_vif *arvif,
1208                                    struct ieee80211_sta *sta,
1209                                    struct ieee80211_bss_conf *bss_conf,
1210                                    struct wmi_peer_assoc_complete_arg *arg)
1211{
1212        switch (arvif->vdev_type) {
1213        case WMI_VDEV_TYPE_AP:
1214                ath10k_peer_assoc_h_qos_ap(ar, arvif, sta, bss_conf, arg);
1215                break;
1216        case WMI_VDEV_TYPE_STA:
1217                ath10k_peer_assoc_h_qos_sta(ar, arvif, sta, bss_conf, arg);
1218                break;
1219        default:
1220                break;
1221        }
1222}
1223
1224static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
1225                                        struct ath10k_vif *arvif,
1226                                        struct ieee80211_sta *sta,
1227                                        struct wmi_peer_assoc_complete_arg *arg)
1228{
1229        enum wmi_phy_mode phymode = MODE_UNKNOWN;
1230
1231        switch (ar->hw->conf.chandef.chan->band) {
1232        case IEEE80211_BAND_2GHZ:
1233                if (sta->ht_cap.ht_supported) {
1234                        if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1235                                phymode = MODE_11NG_HT40;
1236                        else
1237                                phymode = MODE_11NG_HT20;
1238                } else {
1239                        phymode = MODE_11G;
1240                }
1241
1242                break;
1243        case IEEE80211_BAND_5GHZ:
1244                /*
1245                 * Check VHT first.
1246                 */
1247                if (sta->vht_cap.vht_supported) {
1248                        if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1249                                phymode = MODE_11AC_VHT80;
1250                        else if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1251                                phymode = MODE_11AC_VHT40;
1252                        else if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
1253                                phymode = MODE_11AC_VHT20;
1254                } else if (sta->ht_cap.ht_supported) {
1255                        if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1256                                phymode = MODE_11NA_HT40;
1257                        else
1258                                phymode = MODE_11NA_HT20;
1259                } else {
1260                        phymode = MODE_11A;
1261                }
1262
1263                break;
1264        default:
1265                break;
1266        }
1267
1268        ath10k_dbg(ATH10K_DBG_MAC, "mac peer %pM phymode %s\n",
1269                   sta->addr, ath10k_wmi_phymode_str(phymode));
1270
1271        arg->peer_phymode = phymode;
1272        WARN_ON(phymode == MODE_UNKNOWN);
1273}
1274
1275static int ath10k_peer_assoc_prepare(struct ath10k *ar,
1276                                     struct ath10k_vif *arvif,
1277                                     struct ieee80211_sta *sta,
1278                                     struct ieee80211_bss_conf *bss_conf,
1279                                     struct wmi_peer_assoc_complete_arg *arg)
1280{
1281        lockdep_assert_held(&ar->conf_mutex);
1282
1283        memset(arg, 0, sizeof(*arg));
1284
1285        ath10k_peer_assoc_h_basic(ar, arvif, sta, bss_conf, arg);
1286        ath10k_peer_assoc_h_crypto(ar, arvif, arg);
1287        ath10k_peer_assoc_h_rates(ar, sta, arg);
1288        ath10k_peer_assoc_h_ht(ar, sta, arg);
1289        ath10k_peer_assoc_h_vht(ar, sta, arg);
1290        ath10k_peer_assoc_h_qos(ar, arvif, sta, bss_conf, arg);
1291        ath10k_peer_assoc_h_phymode(ar, arvif, sta, arg);
1292
1293        return 0;
1294}
1295
1296/* can be called only in mac80211 callbacks due to `key_count` usage */
1297static void ath10k_bss_assoc(struct ieee80211_hw *hw,
1298                             struct ieee80211_vif *vif,
1299                             struct ieee80211_bss_conf *bss_conf)
1300{
1301        struct ath10k *ar = hw->priv;
1302        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1303        struct wmi_peer_assoc_complete_arg peer_arg;
1304        struct ieee80211_sta *ap_sta;
1305        int ret;
1306
1307        lockdep_assert_held(&ar->conf_mutex);
1308
1309        rcu_read_lock();
1310
1311        ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
1312        if (!ap_sta) {
1313                ath10k_warn("Failed to find station entry for %pM\n",
1314                            bss_conf->bssid);
1315                rcu_read_unlock();
1316                return;
1317        }
1318
1319        ret = ath10k_peer_assoc_prepare(ar, arvif, ap_sta,
1320                                        bss_conf, &peer_arg);
1321        if (ret) {
1322                ath10k_warn("Peer assoc prepare failed for %pM\n: %d",
1323                            bss_conf->bssid, ret);
1324                rcu_read_unlock();
1325                return;
1326        }
1327
1328        rcu_read_unlock();
1329
1330        ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
1331        if (ret) {
1332                ath10k_warn("Peer assoc failed for %pM\n: %d",
1333                            bss_conf->bssid, ret);
1334                return;
1335        }
1336
1337        ath10k_dbg(ATH10K_DBG_MAC,
1338                   "mac vdev %d up (associated) bssid %pM aid %d\n",
1339                   arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
1340
1341        ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, bss_conf->aid,
1342                                 bss_conf->bssid);
1343        if (ret)
1344                ath10k_warn("VDEV: %d up failed: ret %d\n",
1345                            arvif->vdev_id, ret);
1346}
1347
1348/*
1349 * FIXME: flush TIDs
1350 */
1351static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
1352                                struct ieee80211_vif *vif)
1353{
1354        struct ath10k *ar = hw->priv;
1355        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1356        int ret;
1357
1358        lockdep_assert_held(&ar->conf_mutex);
1359
1360        /*
1361         * For some reason, calling VDEV-DOWN before VDEV-STOP
1362         * makes the FW to send frames via HTT after disassociation.
1363         * No idea why this happens, even though VDEV-DOWN is supposed
1364         * to be analogous to link down, so just stop the VDEV.
1365         */
1366        ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d stop (disassociated\n",
1367                   arvif->vdev_id);
1368
1369        /* FIXME: check return value */
1370        ret = ath10k_vdev_stop(arvif);
1371
1372        /*
1373         * If we don't call VDEV-DOWN after VDEV-STOP FW will remain active and
1374         * report beacons from previously associated network through HTT.
1375         * This in turn would spam mac80211 WARN_ON if we bring down all
1376         * interfaces as it expects there is no rx when no interface is
1377         * running.
1378         */
1379        ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d down\n", arvif->vdev_id);
1380
1381        /* FIXME: why don't we print error if wmi call fails? */
1382        ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1383
1384        arvif->def_wep_key_idx = 0;
1385}
1386
1387static int ath10k_station_assoc(struct ath10k *ar, struct ath10k_vif *arvif,
1388                                struct ieee80211_sta *sta)
1389{
1390        struct wmi_peer_assoc_complete_arg peer_arg;
1391        int ret = 0;
1392
1393        lockdep_assert_held(&ar->conf_mutex);
1394
1395        ret = ath10k_peer_assoc_prepare(ar, arvif, sta, NULL, &peer_arg);
1396        if (ret) {
1397                ath10k_warn("WMI peer assoc prepare failed for %pM\n",
1398                            sta->addr);
1399                return ret;
1400        }
1401
1402        ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
1403        if (ret) {
1404                ath10k_warn("Peer assoc failed for STA %pM\n: %d",
1405                            sta->addr, ret);
1406                return ret;
1407        }
1408
1409        ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
1410        if (ret) {
1411                ath10k_warn("could not install peer wep keys (%d)\n", ret);
1412                return ret;
1413        }
1414
1415        return ret;
1416}
1417
1418static int ath10k_station_disassoc(struct ath10k *ar, struct ath10k_vif *arvif,
1419                                   struct ieee80211_sta *sta)
1420{
1421        int ret = 0;
1422
1423        lockdep_assert_held(&ar->conf_mutex);
1424
1425        ret = ath10k_clear_peer_keys(arvif, sta->addr);
1426        if (ret) {
1427                ath10k_warn("could not clear all peer wep keys (%d)\n", ret);
1428                return ret;
1429        }
1430
1431        return ret;
1432}
1433
1434/**************/
1435/* Regulatory */
1436/**************/
1437
1438static int ath10k_update_channel_list(struct ath10k *ar)
1439{
1440        struct ieee80211_hw *hw = ar->hw;
1441        struct ieee80211_supported_band **bands;
1442        enum ieee80211_band band;
1443        struct ieee80211_channel *channel;
1444        struct wmi_scan_chan_list_arg arg = {0};
1445        struct wmi_channel_arg *ch;
1446        bool passive;
1447        int len;
1448        int ret;
1449        int i;
1450
1451        lockdep_assert_held(&ar->conf_mutex);
1452
1453        bands = hw->wiphy->bands;
1454        for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1455                if (!bands[band])
1456                        continue;
1457
1458                for (i = 0; i < bands[band]->n_channels; i++) {
1459                        if (bands[band]->channels[i].flags &
1460                            IEEE80211_CHAN_DISABLED)
1461                                continue;
1462
1463                        arg.n_channels++;
1464                }
1465        }
1466
1467        len = sizeof(struct wmi_channel_arg) * arg.n_channels;
1468        arg.channels = kzalloc(len, GFP_KERNEL);
1469        if (!arg.channels)
1470                return -ENOMEM;
1471
1472        ch = arg.channels;
1473        for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1474                if (!bands[band])
1475                        continue;
1476
1477                for (i = 0; i < bands[band]->n_channels; i++) {
1478                        channel = &bands[band]->channels[i];
1479
1480                        if (channel->flags & IEEE80211_CHAN_DISABLED)
1481                                continue;
1482
1483                        ch->allow_ht   = true;
1484
1485                        /* FIXME: when should we really allow VHT? */
1486                        ch->allow_vht = true;
1487
1488                        ch->allow_ibss =
1489                                !(channel->flags & IEEE80211_CHAN_NO_IR);
1490
1491                        ch->ht40plus =
1492                                !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
1493
1494                        ch->chan_radar =
1495                                !!(channel->flags & IEEE80211_CHAN_RADAR);
1496
1497                        passive = channel->flags & IEEE80211_CHAN_NO_IR;
1498                        ch->passive = passive;
1499
1500                        ch->freq = channel->center_freq;
1501                        ch->min_power = 0;
1502                        ch->max_power = channel->max_power * 2;
1503                        ch->max_reg_power = channel->max_reg_power * 2;
1504                        ch->max_antenna_gain = channel->max_antenna_gain * 2;
1505                        ch->reg_class_id = 0; /* FIXME */
1506
1507                        /* FIXME: why use only legacy modes, why not any
1508                         * HT/VHT modes? Would that even make any
1509                         * difference? */
1510                        if (channel->band == IEEE80211_BAND_2GHZ)
1511                                ch->mode = MODE_11G;
1512                        else
1513                                ch->mode = MODE_11A;
1514
1515                        if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
1516                                continue;
1517
1518                        ath10k_dbg(ATH10K_DBG_WMI,
1519                                   "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
1520                                    ch - arg.channels, arg.n_channels,
1521                                   ch->freq, ch->max_power, ch->max_reg_power,
1522                                   ch->max_antenna_gain, ch->mode);
1523
1524                        ch++;
1525                }
1526        }
1527
1528        ret = ath10k_wmi_scan_chan_list(ar, &arg);
1529        kfree(arg.channels);
1530
1531        return ret;
1532}
1533
1534static void ath10k_regd_update(struct ath10k *ar)
1535{
1536        struct reg_dmn_pair_mapping *regpair;
1537        int ret;
1538
1539        lockdep_assert_held(&ar->conf_mutex);
1540
1541        ret = ath10k_update_channel_list(ar);
1542        if (ret)
1543                ath10k_warn("could not update channel list (%d)\n", ret);
1544
1545        regpair = ar->ath_common.regulatory.regpair;
1546
1547        /* Target allows setting up per-band regdomain but ath_common provides
1548         * a combined one only */
1549        ret = ath10k_wmi_pdev_set_regdomain(ar,
1550                                            regpair->regDmnEnum,
1551                                            regpair->regDmnEnum, /* 2ghz */
1552                                            regpair->regDmnEnum, /* 5ghz */
1553                                            regpair->reg_2ghz_ctl,
1554                                            regpair->reg_5ghz_ctl);
1555        if (ret)
1556                ath10k_warn("could not set pdev regdomain (%d)\n", ret);
1557}
1558
1559static void ath10k_reg_notifier(struct wiphy *wiphy,
1560                                struct regulatory_request *request)
1561{
1562        struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
1563        struct ath10k *ar = hw->priv;
1564        bool result;
1565
1566        ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
1567
1568        if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
1569                ath10k_dbg(ATH10K_DBG_REGULATORY, "dfs region 0x%x\n",
1570                           request->dfs_region);
1571                result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector,
1572                                                          request->dfs_region);
1573                if (!result)
1574                        ath10k_warn("dfs region 0x%X not supported, will trigger radar for every pulse\n",
1575                                    request->dfs_region);
1576        }
1577
1578        mutex_lock(&ar->conf_mutex);
1579        if (ar->state == ATH10K_STATE_ON)
1580                ath10k_regd_update(ar);
1581        mutex_unlock(&ar->conf_mutex);
1582}
1583
1584/***************/
1585/* TX handlers */
1586/***************/
1587
1588static u8 ath10k_tx_h_get_tid(struct ieee80211_hdr *hdr)
1589{
1590        if (ieee80211_is_mgmt(hdr->frame_control))
1591                return HTT_DATA_TX_EXT_TID_MGMT;
1592
1593        if (!ieee80211_is_data_qos(hdr->frame_control))
1594                return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1595
1596        if (!is_unicast_ether_addr(ieee80211_get_DA(hdr)))
1597                return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1598
1599        return ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK;
1600}
1601
1602static u8 ath10k_tx_h_get_vdev_id(struct ath10k *ar,
1603                                  struct ieee80211_tx_info *info)
1604{
1605        if (info->control.vif)
1606                return ath10k_vif_to_arvif(info->control.vif)->vdev_id;
1607
1608        if (ar->monitor_enabled)
1609                return ar->monitor_vdev_id;
1610
1611        ath10k_warn("could not resolve vdev id\n");
1612        return 0;
1613}
1614
1615/*
1616 * Frames sent to the FW have to be in "Native Wifi" format.
1617 * Strip the QoS field from the 802.11 header.
1618 */
1619static void ath10k_tx_h_qos_workaround(struct ieee80211_hw *hw,
1620                                       struct ieee80211_tx_control *control,
1621                                       struct sk_buff *skb)
1622{
1623        struct ieee80211_hdr *hdr = (void *)skb->data;
1624        u8 *qos_ctl;
1625
1626        if (!ieee80211_is_data_qos(hdr->frame_control))
1627                return;
1628
1629        qos_ctl = ieee80211_get_qos_ctl(hdr);
1630        memmove(skb->data + IEEE80211_QOS_CTL_LEN,
1631                skb->data, (void *)qos_ctl - (void *)skb->data);
1632        skb_pull(skb, IEEE80211_QOS_CTL_LEN);
1633}
1634
1635static void ath10k_tx_wep_key_work(struct work_struct *work)
1636{
1637        struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
1638                                                wep_key_work);
1639        int ret, keyidx = arvif->def_wep_key_newidx;
1640
1641        if (arvif->def_wep_key_idx == keyidx)
1642                return;
1643
1644        ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
1645                   arvif->vdev_id, keyidx);
1646
1647        ret = ath10k_wmi_vdev_set_param(arvif->ar,
1648                                        arvif->vdev_id,
1649                                        arvif->ar->wmi.vdev_param->def_keyid,
1650                                        keyidx);
1651        if (ret) {
1652                ath10k_warn("could not update wep keyidx (%d)\n", ret);
1653                return;
1654        }
1655
1656        arvif->def_wep_key_idx = keyidx;
1657}
1658
1659static void ath10k_tx_h_update_wep_key(struct sk_buff *skb)
1660{
1661        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1662        struct ieee80211_vif *vif = info->control.vif;
1663        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1664        struct ath10k *ar = arvif->ar;
1665        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1666        struct ieee80211_key_conf *key = info->control.hw_key;
1667
1668        if (!ieee80211_has_protected(hdr->frame_control))
1669                return;
1670
1671        if (!key)
1672                return;
1673
1674        if (key->cipher != WLAN_CIPHER_SUITE_WEP40 &&
1675            key->cipher != WLAN_CIPHER_SUITE_WEP104)
1676                return;
1677
1678        if (key->keyidx == arvif->def_wep_key_idx)
1679                return;
1680
1681        /* FIXME: Most likely a few frames will be TXed with an old key. Simply
1682         * queueing frames until key index is updated is not an option because
1683         * sk_buff may need more processing to be done, e.g. offchannel */
1684        arvif->def_wep_key_newidx = key->keyidx;
1685        ieee80211_queue_work(ar->hw, &arvif->wep_key_work);
1686}
1687
1688static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar, struct sk_buff *skb)
1689{
1690        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1691        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1692        struct ieee80211_vif *vif = info->control.vif;
1693        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1694
1695        /* This is case only for P2P_GO */
1696        if (arvif->vdev_type != WMI_VDEV_TYPE_AP ||
1697            arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
1698                return;
1699
1700        if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
1701                spin_lock_bh(&ar->data_lock);
1702                if (arvif->u.ap.noa_data)
1703                        if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
1704                                              GFP_ATOMIC))
1705                                memcpy(skb_put(skb, arvif->u.ap.noa_len),
1706                                       arvif->u.ap.noa_data,
1707                                       arvif->u.ap.noa_len);
1708                spin_unlock_bh(&ar->data_lock);
1709        }
1710}
1711
1712static void ath10k_tx_htt(struct ath10k *ar, struct sk_buff *skb)
1713{
1714        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1715        int ret = 0;
1716
1717        if (ar->htt.target_version_major >= 3) {
1718                /* Since HTT 3.0 there is no separate mgmt tx command */
1719                ret = ath10k_htt_tx(&ar->htt, skb);
1720                goto exit;
1721        }
1722
1723        if (ieee80211_is_mgmt(hdr->frame_control)) {
1724                if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
1725                             ar->fw_features)) {
1726                        if (skb_queue_len(&ar->wmi_mgmt_tx_queue) >=
1727                            ATH10K_MAX_NUM_MGMT_PENDING) {
1728                                ath10k_warn("wmi mgmt_tx queue limit reached\n");
1729                                ret = -EBUSY;
1730                                goto exit;
1731                        }
1732
1733                        skb_queue_tail(&ar->wmi_mgmt_tx_queue, skb);
1734                        ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
1735                } else {
1736                        ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
1737                }
1738        } else if (!test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
1739                             ar->fw_features) &&
1740                   ieee80211_is_nullfunc(hdr->frame_control)) {
1741                /* FW does not report tx status properly for NullFunc frames
1742                 * unless they are sent through mgmt tx path. mac80211 sends
1743                 * those frames when it detects link/beacon loss and depends
1744                 * on the tx status to be correct. */
1745                ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
1746        } else {
1747                ret = ath10k_htt_tx(&ar->htt, skb);
1748        }
1749
1750exit:
1751        if (ret) {
1752                ath10k_warn("tx failed (%d). dropping packet.\n", ret);
1753                ieee80211_free_txskb(ar->hw, skb);
1754        }
1755}
1756
1757void ath10k_offchan_tx_purge(struct ath10k *ar)
1758{
1759        struct sk_buff *skb;
1760
1761        for (;;) {
1762                skb = skb_dequeue(&ar->offchan_tx_queue);
1763                if (!skb)
1764                        break;
1765
1766                ieee80211_free_txskb(ar->hw, skb);
1767        }
1768}
1769
1770void ath10k_offchan_tx_work(struct work_struct *work)
1771{
1772        struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
1773        struct ath10k_peer *peer;
1774        struct ieee80211_hdr *hdr;
1775        struct sk_buff *skb;
1776        const u8 *peer_addr;
1777        int vdev_id;
1778        int ret;
1779
1780        /* FW requirement: We must create a peer before FW will send out
1781         * an offchannel frame. Otherwise the frame will be stuck and
1782         * never transmitted. We delete the peer upon tx completion.
1783         * It is unlikely that a peer for offchannel tx will already be
1784         * present. However it may be in some rare cases so account for that.
1785         * Otherwise we might remove a legitimate peer and break stuff. */
1786
1787        for (;;) {
1788                skb = skb_dequeue(&ar->offchan_tx_queue);
1789                if (!skb)
1790                        break;
1791
1792                mutex_lock(&ar->conf_mutex);
1793
1794                ath10k_dbg(ATH10K_DBG_MAC, "mac offchannel skb %p\n",
1795                           skb);
1796
1797                hdr = (struct ieee80211_hdr *)skb->data;
1798                peer_addr = ieee80211_get_DA(hdr);
1799                vdev_id = ATH10K_SKB_CB(skb)->vdev_id;
1800
1801                spin_lock_bh(&ar->data_lock);
1802                peer = ath10k_peer_find(ar, vdev_id, peer_addr);
1803                spin_unlock_bh(&ar->data_lock);
1804
1805                if (peer)
1806                        /* FIXME: should this use ath10k_warn()? */
1807                        ath10k_dbg(ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n",
1808                                   peer_addr, vdev_id);
1809
1810                if (!peer) {
1811                        ret = ath10k_peer_create(ar, vdev_id, peer_addr);
1812                        if (ret)
1813                                ath10k_warn("peer %pM on vdev %d not created (%d)\n",
1814                                            peer_addr, vdev_id, ret);
1815                }
1816
1817                spin_lock_bh(&ar->data_lock);
1818                reinit_completion(&ar->offchan_tx_completed);
1819                ar->offchan_tx_skb = skb;
1820                spin_unlock_bh(&ar->data_lock);
1821
1822                ath10k_tx_htt(ar, skb);
1823
1824                ret = wait_for_completion_timeout(&ar->offchan_tx_completed,
1825                                                  3 * HZ);
1826                if (ret <= 0)
1827                        ath10k_warn("timed out waiting for offchannel skb %p\n",
1828                                    skb);
1829
1830                if (!peer) {
1831                        ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
1832                        if (ret)
1833                                ath10k_warn("peer %pM on vdev %d not deleted (%d)\n",
1834                                            peer_addr, vdev_id, ret);
1835                }
1836
1837                mutex_unlock(&ar->conf_mutex);
1838        }
1839}
1840
1841void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar)
1842{
1843        struct sk_buff *skb;
1844
1845        for (;;) {
1846                skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
1847                if (!skb)
1848                        break;
1849
1850                ieee80211_free_txskb(ar->hw, skb);
1851        }
1852}
1853
1854void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work)
1855{
1856        struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work);
1857        struct sk_buff *skb;
1858        int ret;
1859
1860        for (;;) {
1861                skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
1862                if (!skb)
1863                        break;
1864
1865                ret = ath10k_wmi_mgmt_tx(ar, skb);
1866                if (ret) {
1867                        ath10k_warn("wmi mgmt_tx failed (%d)\n", ret);
1868                        ieee80211_free_txskb(ar->hw, skb);
1869                }
1870        }
1871}
1872
1873/************/
1874/* Scanning */
1875/************/
1876
1877/*
1878 * This gets called if we dont get a heart-beat during scan.
1879 * This may indicate the FW has hung and we need to abort the
1880 * scan manually to prevent cancel_hw_scan() from deadlocking
1881 */
1882void ath10k_reset_scan(unsigned long ptr)
1883{
1884        struct ath10k *ar = (struct ath10k *)ptr;
1885
1886        spin_lock_bh(&ar->data_lock);
1887        if (!ar->scan.in_progress) {
1888                spin_unlock_bh(&ar->data_lock);
1889                return;
1890        }
1891
1892        ath10k_warn("scan timeout. resetting. fw issue?\n");
1893
1894        if (ar->scan.is_roc)
1895                ieee80211_remain_on_channel_expired(ar->hw);
1896        else
1897                ieee80211_scan_completed(ar->hw, 1 /* aborted */);
1898
1899        ar->scan.in_progress = false;
1900        complete_all(&ar->scan.completed);
1901        spin_unlock_bh(&ar->data_lock);
1902}
1903
1904static int ath10k_abort_scan(struct ath10k *ar)
1905{
1906        struct wmi_stop_scan_arg arg = {
1907                .req_id = 1, /* FIXME */
1908                .req_type = WMI_SCAN_STOP_ONE,
1909                .u.scan_id = ATH10K_SCAN_ID,
1910        };
1911        int ret;
1912
1913        lockdep_assert_held(&ar->conf_mutex);
1914
1915        del_timer_sync(&ar->scan.timeout);
1916
1917        spin_lock_bh(&ar->data_lock);
1918        if (!ar->scan.in_progress) {
1919                spin_unlock_bh(&ar->data_lock);
1920                return 0;
1921        }
1922
1923        ar->scan.aborting = true;
1924        spin_unlock_bh(&ar->data_lock);
1925
1926        ret = ath10k_wmi_stop_scan(ar, &arg);
1927        if (ret) {
1928                ath10k_warn("could not submit wmi stop scan (%d)\n", ret);
1929                spin_lock_bh(&ar->data_lock);
1930                ar->scan.in_progress = false;
1931                ath10k_offchan_tx_purge(ar);
1932                spin_unlock_bh(&ar->data_lock);
1933                return -EIO;
1934        }
1935
1936        ret = wait_for_completion_timeout(&ar->scan.completed, 3*HZ);
1937        if (ret == 0)
1938                ath10k_warn("timed out while waiting for scan to stop\n");
1939
1940        /* scan completion may be done right after we timeout here, so let's
1941         * check the in_progress and tell mac80211 scan is completed. if we
1942         * don't do that and FW fails to send us scan completion indication
1943         * then userspace won't be able to scan anymore */
1944        ret = 0;
1945
1946        spin_lock_bh(&ar->data_lock);
1947        if (ar->scan.in_progress) {
1948                ath10k_warn("could not stop scan. its still in progress\n");
1949                ar->scan.in_progress = false;
1950                ath10k_offchan_tx_purge(ar);
1951                ret = -ETIMEDOUT;
1952        }
1953        spin_unlock_bh(&ar->data_lock);
1954
1955        return ret;
1956}
1957
1958static int ath10k_start_scan(struct ath10k *ar,
1959                             const struct wmi_start_scan_arg *arg)
1960{
1961        int ret;
1962
1963        lockdep_assert_held(&ar->conf_mutex);
1964
1965        ret = ath10k_wmi_start_scan(ar, arg);
1966        if (ret)
1967                return ret;
1968
1969        ret = wait_for_completion_timeout(&ar->scan.started, 1*HZ);
1970        if (ret == 0) {
1971                ath10k_abort_scan(ar);
1972                return ret;
1973        }
1974
1975        /* the scan can complete earlier, before we even
1976         * start the timer. in that case the timer handler
1977         * checks ar->scan.in_progress and bails out if its
1978         * false. Add a 200ms margin to account event/command
1979         * processing. */
1980        mod_timer(&ar->scan.timeout, jiffies +
1981                  msecs_to_jiffies(arg->max_scan_time+200));
1982        return 0;
1983}
1984
1985/**********************/
1986/* mac80211 callbacks */
1987/**********************/
1988
1989static void ath10k_tx(struct ieee80211_hw *hw,
1990                      struct ieee80211_tx_control *control,
1991                      struct sk_buff *skb)
1992{
1993        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1994        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1995        struct ath10k *ar = hw->priv;
1996        u8 tid, vdev_id;
1997
1998        /* We should disable CCK RATE due to P2P */
1999        if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
2000                ath10k_dbg(ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
2001
2002        /* we must calculate tid before we apply qos workaround
2003         * as we'd lose the qos control field */
2004        tid = ath10k_tx_h_get_tid(hdr);
2005        vdev_id = ath10k_tx_h_get_vdev_id(ar, info);
2006
2007        /* it makes no sense to process injected frames like that */
2008        if (info->control.vif &&
2009            info->control.vif->type != NL80211_IFTYPE_MONITOR) {
2010                ath10k_tx_h_qos_workaround(hw, control, skb);
2011                ath10k_tx_h_update_wep_key(skb);
2012                ath10k_tx_h_add_p2p_noa_ie(ar, skb);
2013                ath10k_tx_h_seq_no(skb);
2014        }
2015
2016        ATH10K_SKB_CB(skb)->vdev_id = vdev_id;
2017        ATH10K_SKB_CB(skb)->htt.is_offchan = false;
2018        ATH10K_SKB_CB(skb)->htt.tid = tid;
2019
2020        if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
2021                spin_lock_bh(&ar->data_lock);
2022                ATH10K_SKB_CB(skb)->htt.is_offchan = true;
2023                ATH10K_SKB_CB(skb)->vdev_id = ar->scan.vdev_id;
2024                spin_unlock_bh(&ar->data_lock);
2025
2026                ath10k_dbg(ATH10K_DBG_MAC, "queued offchannel skb %p\n", skb);
2027
2028                skb_queue_tail(&ar->offchan_tx_queue, skb);
2029                ieee80211_queue_work(hw, &ar->offchan_tx_work);
2030                return;
2031        }
2032
2033        ath10k_tx_htt(ar, skb);
2034}
2035
2036/*
2037 * Initialize various parameters with default vaules.
2038 */
2039void ath10k_halt(struct ath10k *ar)
2040{
2041        lockdep_assert_held(&ar->conf_mutex);
2042
2043        ath10k_stop_cac(ar);
2044        del_timer_sync(&ar->scan.timeout);
2045        ath10k_offchan_tx_purge(ar);
2046        ath10k_mgmt_over_wmi_tx_purge(ar);
2047        ath10k_peer_cleanup_all(ar);
2048        ath10k_core_stop(ar);
2049        ath10k_hif_power_down(ar);
2050
2051        spin_lock_bh(&ar->data_lock);
2052        if (ar->scan.in_progress) {
2053                del_timer(&ar->scan.timeout);
2054                ar->scan.in_progress = false;
2055                ieee80211_scan_completed(ar->hw, true);
2056        }
2057        spin_unlock_bh(&ar->data_lock);
2058}
2059
2060static int ath10k_start(struct ieee80211_hw *hw)
2061{
2062        struct ath10k *ar = hw->priv;
2063        int ret = 0;
2064
2065        mutex_lock(&ar->conf_mutex);
2066
2067        if (ar->state != ATH10K_STATE_OFF &&
2068            ar->state != ATH10K_STATE_RESTARTING) {
2069                ret = -EINVAL;
2070                goto exit;
2071        }
2072
2073        ret = ath10k_hif_power_up(ar);
2074        if (ret) {
2075                ath10k_err("could not init hif (%d)\n", ret);
2076                ar->state = ATH10K_STATE_OFF;
2077                goto exit;
2078        }
2079
2080        ret = ath10k_core_start(ar);
2081        if (ret) {
2082                ath10k_err("could not init core (%d)\n", ret);
2083                ath10k_hif_power_down(ar);
2084                ar->state = ATH10K_STATE_OFF;
2085                goto exit;
2086        }
2087
2088        if (ar->state == ATH10K_STATE_OFF)
2089                ar->state = ATH10K_STATE_ON;
2090        else if (ar->state == ATH10K_STATE_RESTARTING)
2091                ar->state = ATH10K_STATE_RESTARTED;
2092
2093        ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->pmf_qos, 1);
2094        if (ret)
2095                ath10k_warn("could not enable WMI_PDEV_PARAM_PMF_QOS (%d)\n",
2096                            ret);
2097
2098        ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->dynamic_bw, 1);
2099        if (ret)
2100                ath10k_warn("could not init WMI_PDEV_PARAM_DYNAMIC_BW (%d)\n",
2101                            ret);
2102
2103        ath10k_regd_update(ar);
2104
2105exit:
2106        mutex_unlock(&ar->conf_mutex);
2107        return 0;
2108}
2109
2110static void ath10k_stop(struct ieee80211_hw *hw)
2111{
2112        struct ath10k *ar = hw->priv;
2113
2114        mutex_lock(&ar->conf_mutex);
2115        if (ar->state == ATH10K_STATE_ON ||
2116            ar->state == ATH10K_STATE_RESTARTED ||
2117            ar->state == ATH10K_STATE_WEDGED)
2118                ath10k_halt(ar);
2119
2120        ar->state = ATH10K_STATE_OFF;
2121        mutex_unlock(&ar->conf_mutex);
2122
2123        ath10k_mgmt_over_wmi_tx_purge(ar);
2124
2125        cancel_work_sync(&ar->offchan_tx_work);
2126        cancel_work_sync(&ar->wmi_mgmt_tx_work);
2127        cancel_work_sync(&ar->restart_work);
2128}
2129
2130static int ath10k_config_ps(struct ath10k *ar)
2131{
2132        struct ath10k_vif *arvif;
2133        int ret = 0;
2134
2135        lockdep_assert_held(&ar->conf_mutex);
2136
2137        list_for_each_entry(arvif, &ar->arvifs, list) {
2138                ret = ath10k_mac_vif_setup_ps(arvif);
2139                if (ret) {
2140                        ath10k_warn("could not setup powersave (%d)\n", ret);
2141                        break;
2142                }
2143        }
2144
2145        return ret;
2146}
2147
2148static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
2149{
2150        struct ath10k *ar = hw->priv;
2151        struct ieee80211_conf *conf = &hw->conf;
2152        int ret = 0;
2153        u32 param;
2154
2155        mutex_lock(&ar->conf_mutex);
2156
2157        if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
2158                ath10k_dbg(ATH10K_DBG_MAC,
2159                           "mac config channel %d mhz flags 0x%x\n",
2160                           conf->chandef.chan->center_freq,
2161                           conf->chandef.chan->flags);
2162
2163                spin_lock_bh(&ar->data_lock);
2164                ar->rx_channel = conf->chandef.chan;
2165                spin_unlock_bh(&ar->data_lock);
2166
2167                ath10k_config_radar_detection(ar);
2168        }
2169
2170        if (changed & IEEE80211_CONF_CHANGE_POWER) {
2171                ath10k_dbg(ATH10K_DBG_MAC, "mac config power %d\n",
2172                           hw->conf.power_level);
2173
2174                param = ar->wmi.pdev_param->txpower_limit2g;
2175                ret = ath10k_wmi_pdev_set_param(ar, param,
2176                                                hw->conf.power_level * 2);
2177                if (ret)
2178                        ath10k_warn("mac failed to set 2g txpower %d (%d)\n",
2179                                    hw->conf.power_level, ret);
2180
2181                param = ar->wmi.pdev_param->txpower_limit5g;
2182                ret = ath10k_wmi_pdev_set_param(ar, param,
2183                                                hw->conf.power_level * 2);
2184                if (ret)
2185                        ath10k_warn("mac failed to set 5g txpower %d (%d)\n",
2186                                    hw->conf.power_level, ret);
2187        }
2188
2189        if (changed & IEEE80211_CONF_CHANGE_PS)
2190                ath10k_config_ps(ar);
2191
2192        if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
2193                if (conf->flags & IEEE80211_CONF_MONITOR)
2194                        ret = ath10k_monitor_create(ar);
2195                else
2196                        ret = ath10k_monitor_destroy(ar);
2197        }
2198
2199        mutex_unlock(&ar->conf_mutex);
2200        return ret;
2201}
2202
2203/*
2204 * TODO:
2205 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
2206 * because we will send mgmt frames without CCK. This requirement
2207 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
2208 * in the TX packet.
2209 */
2210static int ath10k_add_interface(struct ieee80211_hw *hw,
2211                                struct ieee80211_vif *vif)
2212{
2213        struct ath10k *ar = hw->priv;
2214        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2215        enum wmi_sta_powersave_param param;
2216        int ret = 0;
2217        u32 value, param_id;
2218        int bit;
2219        u32 vdev_param;
2220
2221        mutex_lock(&ar->conf_mutex);
2222
2223        memset(arvif, 0, sizeof(*arvif));
2224
2225        arvif->ar = ar;
2226        arvif->vif = vif;
2227
2228        INIT_WORK(&arvif->wep_key_work, ath10k_tx_wep_key_work);
2229        INIT_LIST_HEAD(&arvif->list);
2230
2231        if ((vif->type == NL80211_IFTYPE_MONITOR) && ar->monitor_present) {
2232                ath10k_warn("Only one monitor interface allowed\n");
2233                ret = -EBUSY;
2234                goto err;
2235        }
2236
2237        bit = ffs(ar->free_vdev_map);
2238        if (bit == 0) {
2239                ret = -EBUSY;
2240                goto err;
2241        }
2242
2243        arvif->vdev_id = bit - 1;
2244        arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
2245
2246        if (ar->p2p)
2247                arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
2248
2249        switch (vif->type) {
2250        case NL80211_IFTYPE_UNSPECIFIED:
2251        case NL80211_IFTYPE_STATION:
2252                arvif->vdev_type = WMI_VDEV_TYPE_STA;
2253                if (vif->p2p)
2254                        arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
2255                break;
2256        case NL80211_IFTYPE_ADHOC:
2257                arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
2258                break;
2259        case NL80211_IFTYPE_AP:
2260                arvif->vdev_type = WMI_VDEV_TYPE_AP;
2261
2262                if (vif->p2p)
2263                        arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
2264                break;
2265        case NL80211_IFTYPE_MONITOR:
2266                arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
2267                break;
2268        default:
2269                WARN_ON(1);
2270                break;
2271        }
2272
2273        ath10k_dbg(ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d\n",
2274                   arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype);
2275
2276        ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
2277                                     arvif->vdev_subtype, vif->addr);
2278        if (ret) {
2279                ath10k_warn("WMI vdev create failed: ret %d\n", ret);
2280                goto err;
2281        }
2282
2283        ar->free_vdev_map &= ~BIT(arvif->vdev_id);
2284        list_add(&arvif->list, &ar->arvifs);
2285
2286        vdev_param = ar->wmi.vdev_param->def_keyid;
2287        ret = ath10k_wmi_vdev_set_param(ar, 0, vdev_param,
2288                                        arvif->def_wep_key_idx);
2289        if (ret) {
2290                ath10k_warn("Failed to set default keyid: %d\n", ret);
2291                goto err_vdev_delete;
2292        }
2293
2294        vdev_param = ar->wmi.vdev_param->tx_encap_type;
2295        ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
2296                                        ATH10K_HW_TXRX_NATIVE_WIFI);
2297        /* 10.X firmware does not support this VDEV parameter. Do not warn */
2298        if (ret && ret != -EOPNOTSUPP) {
2299                ath10k_warn("Failed to set TX encap: %d\n", ret);
2300                goto err_vdev_delete;
2301        }
2302
2303        if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
2304                ret = ath10k_peer_create(ar, arvif->vdev_id, vif->addr);
2305                if (ret) {
2306                        ath10k_warn("Failed to create peer for AP: %d\n", ret);
2307                        goto err_vdev_delete;
2308                }
2309
2310                param_id = ar->wmi.pdev_param->sta_kickout_th;
2311
2312                /* Disable STA KICKOUT functionality in FW */
2313                ret = ath10k_wmi_pdev_set_param(ar, param_id, 0);
2314                if (ret)
2315                        ath10k_warn("Failed to disable STA KICKOUT\n");
2316        }
2317
2318        if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
2319                param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
2320                value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
2321                ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2322                                                  param, value);
2323                if (ret) {
2324                        ath10k_warn("Failed to set RX wake policy: %d\n", ret);
2325                        goto err_peer_delete;
2326                }
2327
2328                param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
2329                value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
2330                ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2331                                                  param, value);
2332                if (ret) {
2333                        ath10k_warn("Failed to set TX wake thresh: %d\n", ret);
2334                        goto err_peer_delete;
2335                }
2336
2337                param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
2338                value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
2339                ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2340                                                  param, value);
2341                if (ret) {
2342                        ath10k_warn("Failed to set PSPOLL count: %d\n", ret);
2343                        goto err_peer_delete;
2344                }
2345        }
2346
2347        ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
2348        if (ret) {
2349                ath10k_warn("failed to set rts threshold for vdev %d (%d)\n",
2350                            arvif->vdev_id, ret);
2351                goto err_peer_delete;
2352        }
2353
2354        ret = ath10k_mac_set_frag(arvif, ar->hw->wiphy->frag_threshold);
2355        if (ret) {
2356                ath10k_warn("failed to set frag threshold for vdev %d (%d)\n",
2357                            arvif->vdev_id, ret);
2358                goto err_peer_delete;
2359        }
2360
2361        if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2362                ar->monitor_present = true;
2363
2364        mutex_unlock(&ar->conf_mutex);
2365        return 0;
2366
2367err_peer_delete:
2368        if (arvif->vdev_type == WMI_VDEV_TYPE_AP)
2369                ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr);
2370
2371err_vdev_delete:
2372        ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
2373        ar->free_vdev_map &= ~BIT(arvif->vdev_id);
2374        list_del(&arvif->list);
2375
2376err:
2377        mutex_unlock(&ar->conf_mutex);
2378
2379        return ret;
2380}
2381
2382static void ath10k_remove_interface(struct ieee80211_hw *hw,
2383                                    struct ieee80211_vif *vif)
2384{
2385        struct ath10k *ar = hw->priv;
2386        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2387        int ret;
2388
2389        mutex_lock(&ar->conf_mutex);
2390
2391        cancel_work_sync(&arvif->wep_key_work);
2392
2393        spin_lock_bh(&ar->data_lock);
2394        if (arvif->beacon) {
2395                dev_kfree_skb_any(arvif->beacon);
2396                arvif->beacon = NULL;
2397        }
2398        spin_unlock_bh(&ar->data_lock);
2399
2400        ar->free_vdev_map |= 1 << (arvif->vdev_id);
2401        list_del(&arvif->list);
2402
2403        if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
2404                ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, vif->addr);
2405                if (ret)
2406                        ath10k_warn("Failed to remove peer for AP: %d\n", ret);
2407
2408                kfree(arvif->u.ap.noa_data);
2409        }
2410
2411        ath10k_dbg(ATH10K_DBG_MAC, "mac vdev delete %d (remove interface)\n",
2412                   arvif->vdev_id);
2413
2414        ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
2415        if (ret)
2416                ath10k_warn("WMI vdev delete failed: %d\n", ret);
2417
2418        if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2419                ar->monitor_present = false;
2420
2421        ath10k_peer_cleanup(ar, arvif->vdev_id);
2422
2423        mutex_unlock(&ar->conf_mutex);
2424}
2425
2426/*
2427 * FIXME: Has to be verified.
2428 */
2429#define SUPPORTED_FILTERS                       \
2430        (FIF_PROMISC_IN_BSS |                   \
2431        FIF_ALLMULTI |                          \
2432        FIF_CONTROL |                           \
2433        FIF_PSPOLL |                            \
2434        FIF_OTHER_BSS |                         \
2435        FIF_BCN_PRBRESP_PROMISC |               \
2436        FIF_PROBE_REQ |                         \
2437        FIF_FCSFAIL)
2438
2439static void ath10k_configure_filter(struct ieee80211_hw *hw,
2440                                    unsigned int changed_flags,
2441                                    unsigned int *total_flags,
2442                                    u64 multicast)
2443{
2444        struct ath10k *ar = hw->priv;
2445        int ret;
2446
2447        mutex_lock(&ar->conf_mutex);
2448
2449        changed_flags &= SUPPORTED_FILTERS;
2450        *total_flags &= SUPPORTED_FILTERS;
2451        ar->filter_flags = *total_flags;
2452
2453        /* Monitor must not be started if it wasn't created first.
2454         * Promiscuous mode may be started on a non-monitor interface - in
2455         * such case the monitor vdev is not created so starting the
2456         * monitor makes no sense. Since ath10k uses no special RX filters
2457         * (only BSS filter in STA mode) there's no need for any special
2458         * action here. */
2459        if ((ar->filter_flags & FIF_PROMISC_IN_BSS) &&
2460            !ar->monitor_enabled && ar->monitor_present) {
2461                ath10k_dbg(ATH10K_DBG_MAC, "mac monitor %d start\n",
2462                           ar->monitor_vdev_id);
2463
2464                ret = ath10k_monitor_start(ar, ar->monitor_vdev_id);
2465                if (ret)
2466                        ath10k_warn("Unable to start monitor mode\n");
2467        } else if (!(ar->filter_flags & FIF_PROMISC_IN_BSS) &&
2468                   ar->monitor_enabled && ar->monitor_present) {
2469                ath10k_dbg(ATH10K_DBG_MAC, "mac monitor %d stop\n",
2470                           ar->monitor_vdev_id);
2471
2472                ret = ath10k_monitor_stop(ar);
2473                if (ret)
2474                        ath10k_warn("Unable to stop monitor mode\n");
2475        }
2476
2477        mutex_unlock(&ar->conf_mutex);
2478}
2479
2480static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
2481                                    struct ieee80211_vif *vif,
2482                                    struct ieee80211_bss_conf *info,
2483                                    u32 changed)
2484{
2485        struct ath10k *ar = hw->priv;
2486        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2487        int ret = 0;
2488        u32 vdev_param, pdev_param;
2489
2490        mutex_lock(&ar->conf_mutex);
2491
2492        if (changed & BSS_CHANGED_IBSS)
2493                ath10k_control_ibss(arvif, info, vif->addr);
2494
2495        if (changed & BSS_CHANGED_BEACON_INT) {
2496                arvif->beacon_interval = info->beacon_int;
2497                vdev_param = ar->wmi.vdev_param->beacon_interval;
2498                ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
2499                                                arvif->beacon_interval);
2500                ath10k_dbg(ATH10K_DBG_MAC,
2501                           "mac vdev %d beacon_interval %d\n",
2502                           arvif->vdev_id, arvif->beacon_interval);
2503
2504                if (ret)
2505                        ath10k_warn("Failed to set beacon interval for VDEV: %d\n",
2506                                    arvif->vdev_id);
2507        }
2508
2509        if (changed & BSS_CHANGED_BEACON) {
2510                ath10k_dbg(ATH10K_DBG_MAC,
2511                           "vdev %d set beacon tx mode to staggered\n",
2512                           arvif->vdev_id);
2513
2514                pdev_param = ar->wmi.pdev_param->beacon_tx_mode;
2515                ret = ath10k_wmi_pdev_set_param(ar, pdev_param,
2516                                                WMI_BEACON_STAGGERED_MODE);
2517                if (ret)
2518                        ath10k_warn("Failed to set beacon mode for VDEV: %d\n",
2519                                    arvif->vdev_id);
2520        }
2521
2522        if (changed & BSS_CHANGED_BEACON_INFO) {
2523                arvif->dtim_period = info->dtim_period;
2524
2525                ath10k_dbg(ATH10K_DBG_MAC,
2526                           "mac vdev %d dtim_period %d\n",
2527                           arvif->vdev_id, arvif->dtim_period);
2528
2529                vdev_param = ar->wmi.vdev_param->dtim_period;
2530                ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
2531                                                arvif->dtim_period);
2532                if (ret)
2533                        ath10k_warn("Failed to set dtim period for VDEV: %d\n",
2534                                    arvif->vdev_id);
2535        }
2536
2537        if (changed & BSS_CHANGED_SSID &&
2538            vif->type == NL80211_IFTYPE_AP) {
2539                arvif->u.ap.ssid_len = info->ssid_len;
2540                if (info->ssid_len)
2541                        memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
2542                arvif->u.ap.hidden_ssid = info->hidden_ssid;
2543        }
2544
2545        if (changed & BSS_CHANGED_BSSID) {
2546                if (!is_zero_ether_addr(info->bssid)) {
2547                        ath10k_dbg(ATH10K_DBG_MAC,
2548                                   "mac vdev %d create peer %pM\n",
2549                                   arvif->vdev_id, info->bssid);
2550
2551                        ret = ath10k_peer_create(ar, arvif->vdev_id,
2552                                                 info->bssid);
2553                        if (ret)
2554                                ath10k_warn("Failed to add peer %pM for vdev %d when changin bssid: %i\n",
2555                                            info->bssid, arvif->vdev_id, ret);
2556
2557                        if (vif->type == NL80211_IFTYPE_STATION) {
2558                                /*
2559                                 * this is never erased as we it for crypto key
2560                                 * clearing; this is FW requirement
2561                                 */
2562                                memcpy(arvif->u.sta.bssid, info->bssid,
2563                                       ETH_ALEN);
2564
2565                                ath10k_dbg(ATH10K_DBG_MAC,
2566                                           "mac vdev %d start %pM\n",
2567                                           arvif->vdev_id, info->bssid);
2568
2569                                /* FIXME: check return value */
2570                                ret = ath10k_vdev_start(arvif);
2571                        }
2572
2573                        /*
2574                         * Mac80211 does not keep IBSS bssid when leaving IBSS,
2575                         * so driver need to store it. It is needed when leaving
2576                         * IBSS in order to remove BSSID peer.
2577                         */
2578                        if (vif->type == NL80211_IFTYPE_ADHOC)
2579                                memcpy(arvif->u.ibss.bssid, info->bssid,
2580                                       ETH_ALEN);
2581                }
2582        }
2583
2584        if (changed & BSS_CHANGED_BEACON_ENABLED)
2585                ath10k_control_beaconing(arvif, info);
2586
2587        if (changed & BSS_CHANGED_ERP_CTS_PROT) {
2588                u32 cts_prot;
2589                if (info->use_cts_prot)
2590                        cts_prot = 1;
2591                else
2592                        cts_prot = 0;
2593
2594                ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d cts_prot %d\n",
2595                           arvif->vdev_id, cts_prot);
2596
2597                vdev_param = ar->wmi.vdev_param->enable_rtscts;
2598                ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
2599                                                cts_prot);
2600                if (ret)
2601                        ath10k_warn("Failed to set CTS prot for VDEV: %d\n",
2602                                    arvif->vdev_id);
2603        }
2604
2605        if (changed & BSS_CHANGED_ERP_SLOT) {
2606                u32 slottime;
2607                if (info->use_short_slot)
2608                        slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
2609
2610                else
2611                        slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
2612
2613                ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n",
2614                           arvif->vdev_id, slottime);
2615
2616                vdev_param = ar->wmi.vdev_param->slot_time;
2617                ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
2618                                                slottime);
2619                if (ret)
2620                        ath10k_warn("Failed to set erp slot for VDEV: %d\n",
2621                                    arvif->vdev_id);
2622        }
2623
2624        if (changed & BSS_CHANGED_ERP_PREAMBLE) {
2625                u32 preamble;
2626                if (info->use_short_preamble)
2627                        preamble = WMI_VDEV_PREAMBLE_SHORT;
2628                else
2629                        preamble = WMI_VDEV_PREAMBLE_LONG;
2630
2631                ath10k_dbg(ATH10K_DBG_MAC,
2632                           "mac vdev %d preamble %dn",
2633                           arvif->vdev_id, preamble);
2634
2635                vdev_param = ar->wmi.vdev_param->preamble;
2636                ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
2637                                                preamble);
2638                if (ret)
2639                        ath10k_warn("Failed to set preamble for VDEV: %d\n",
2640                                    arvif->vdev_id);
2641        }
2642
2643        if (changed & BSS_CHANGED_ASSOC) {
2644                if (info->assoc)
2645                        ath10k_bss_assoc(hw, vif, info);
2646        }
2647
2648        mutex_unlock(&ar->conf_mutex);
2649}
2650
2651static int ath10k_hw_scan(struct ieee80211_hw *hw,
2652                          struct ieee80211_vif *vif,
2653                          struct cfg80211_scan_request *req)
2654{
2655        struct ath10k *ar = hw->priv;
2656        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2657        struct wmi_start_scan_arg arg;
2658        int ret = 0;
2659        int i;
2660
2661        mutex_lock(&ar->conf_mutex);
2662
2663        spin_lock_bh(&ar->data_lock);
2664        if (ar->scan.in_progress) {
2665                spin_unlock_bh(&ar->data_lock);
2666                ret = -EBUSY;
2667                goto exit;
2668        }
2669
2670        reinit_completion(&ar->scan.started);
2671        reinit_completion(&ar->scan.completed);
2672        ar->scan.in_progress = true;
2673        ar->scan.aborting = false;
2674        ar->scan.is_roc = false;
2675        ar->scan.vdev_id = arvif->vdev_id;
2676        spin_unlock_bh(&ar->data_lock);
2677
2678        memset(&arg, 0, sizeof(arg));
2679        ath10k_wmi_start_scan_init(ar, &arg);
2680        arg.vdev_id = arvif->vdev_id;
2681        arg.scan_id = ATH10K_SCAN_ID;
2682
2683        if (!req->no_cck)
2684                arg.scan_ctrl_flags |= WMI_SCAN_ADD_CCK_RATES;
2685
2686        if (req->ie_len) {
2687                arg.ie_len = req->ie_len;
2688                memcpy(arg.ie, req->ie, arg.ie_len);
2689        }
2690
2691        if (req->n_ssids) {
2692                arg.n_ssids = req->n_ssids;
2693                for (i = 0; i < arg.n_ssids; i++) {
2694                        arg.ssids[i].len  = req->ssids[i].ssid_len;
2695                        arg.ssids[i].ssid = req->ssids[i].ssid;
2696                }
2697        } else {
2698                arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
2699        }
2700
2701        if (req->n_channels) {
2702                arg.n_channels = req->n_channels;
2703                for (i = 0; i < arg.n_channels; i++)
2704                        arg.channels[i] = req->channels[i]->center_freq;
2705        }
2706
2707        ret = ath10k_start_scan(ar, &arg);
2708        if (ret) {
2709                ath10k_warn("could not start hw scan (%d)\n", ret);
2710                spin_lock_bh(&ar->data_lock);
2711                ar->scan.in_progress = false;
2712                spin_unlock_bh(&ar->data_lock);
2713        }
2714
2715exit:
2716        mutex_unlock(&ar->conf_mutex);
2717        return ret;
2718}
2719
2720static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
2721                                  struct ieee80211_vif *vif)
2722{
2723        struct ath10k *ar = hw->priv;
2724        int ret;
2725
2726        mutex_lock(&ar->conf_mutex);
2727        ret = ath10k_abort_scan(ar);
2728        if (ret) {
2729                ath10k_warn("couldn't abort scan (%d). forcefully sending scan completion to mac80211\n",
2730                            ret);
2731                ieee80211_scan_completed(hw, 1 /* aborted */);
2732        }
2733        mutex_unlock(&ar->conf_mutex);
2734}
2735
2736static void ath10k_set_key_h_def_keyidx(struct ath10k *ar,
2737                                        struct ath10k_vif *arvif,
2738                                        enum set_key_cmd cmd,
2739                                        struct ieee80211_key_conf *key)
2740{
2741        u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid;
2742        int ret;
2743
2744        /* 10.1 firmware branch requires default key index to be set to group
2745         * key index after installing it. Otherwise FW/HW Txes corrupted
2746         * frames with multi-vif APs. This is not required for main firmware
2747         * branch (e.g. 636).
2748         *
2749         * FIXME: This has been tested only in AP. It remains unknown if this
2750         * is required for multi-vif STA interfaces on 10.1 */
2751
2752        if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
2753                return;
2754
2755        if (key->cipher == WLAN_CIPHER_SUITE_WEP40)
2756                return;
2757
2758        if (key->cipher == WLAN_CIPHER_SUITE_WEP104)
2759                return;
2760
2761        if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
2762                return;
2763
2764        if (cmd != SET_KEY)
2765                return;
2766
2767        ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
2768                                        key->keyidx);
2769        if (ret)
2770                ath10k_warn("failed to set group key as default key: %d\n",
2771                            ret);
2772}
2773
2774static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
2775                          struct ieee80211_vif *vif, struct ieee80211_sta *sta,
2776                          struct ieee80211_key_conf *key)
2777{
2778        struct ath10k *ar = hw->priv;
2779        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2780        struct ath10k_peer *peer;
2781        const u8 *peer_addr;
2782        bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
2783                      key->cipher == WLAN_CIPHER_SUITE_WEP104;
2784        int ret = 0;
2785
2786        if (key->keyidx > WMI_MAX_KEY_INDEX)
2787                return -ENOSPC;
2788
2789        mutex_lock(&ar->conf_mutex);
2790
2791        if (sta)
2792                peer_addr = sta->addr;
2793        else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
2794                peer_addr = vif->bss_conf.bssid;
2795        else
2796                peer_addr = vif->addr;
2797
2798        key->hw_key_idx = key->keyidx;
2799
2800        /* the peer should not disappear in mid-way (unless FW goes awry) since
2801         * we already hold conf_mutex. we just make sure its there now. */
2802        spin_lock_bh(&ar->data_lock);
2803        peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
2804        spin_unlock_bh(&ar->data_lock);
2805
2806        if (!peer) {
2807                if (cmd == SET_KEY) {
2808                        ath10k_warn("cannot install key for non-existent peer %pM\n",
2809                                    peer_addr);
2810                        ret = -EOPNOTSUPP;
2811                        goto exit;
2812                } else {
2813                        /* if the peer doesn't exist there is no key to disable
2814                         * anymore */
2815                        goto exit;
2816                }
2817        }
2818
2819        if (is_wep) {
2820                if (cmd == SET_KEY)
2821                        arvif->wep_keys[key->keyidx] = key;
2822                else
2823                        arvif->wep_keys[key->keyidx] = NULL;
2824
2825                if (cmd == DISABLE_KEY)
2826                        ath10k_clear_vdev_key(arvif, key);
2827        }
2828
2829        ret = ath10k_install_key(arvif, key, cmd, peer_addr);
2830        if (ret) {
2831                ath10k_warn("ath10k_install_key failed (%d)\n", ret);
2832                goto exit;
2833        }
2834
2835        ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key);
2836
2837        spin_lock_bh(&ar->data_lock);
2838        peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
2839        if (peer && cmd == SET_KEY)
2840                peer->keys[key->keyidx] = key;
2841        else if (peer && cmd == DISABLE_KEY)
2842                peer->keys[key->keyidx] = NULL;
2843        else if (peer == NULL)
2844                /* impossible unless FW goes crazy */
2845                ath10k_warn("peer %pM disappeared!\n", peer_addr);
2846        spin_unlock_bh(&ar->data_lock);
2847
2848exit:
2849        mutex_unlock(&ar->conf_mutex);
2850        return ret;
2851}
2852
2853static int ath10k_sta_state(struct ieee80211_hw *hw,
2854                            struct ieee80211_vif *vif,
2855                            struct ieee80211_sta *sta,
2856                            enum ieee80211_sta_state old_state,
2857                            enum ieee80211_sta_state new_state)
2858{
2859        struct ath10k *ar = hw->priv;
2860        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2861        int max_num_peers;
2862        int ret = 0;
2863
2864        mutex_lock(&ar->conf_mutex);
2865
2866        if (old_state == IEEE80211_STA_NOTEXIST &&
2867            new_state == IEEE80211_STA_NONE &&
2868            vif->type != NL80211_IFTYPE_STATION) {
2869                /*
2870                 * New station addition.
2871                 */
2872                if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features))
2873                        max_num_peers = TARGET_10X_NUM_PEERS_MAX - 1;
2874                else
2875                        max_num_peers = TARGET_NUM_PEERS;
2876
2877                if (ar->num_peers >= max_num_peers) {
2878                        ath10k_warn("Number of peers exceeded: peers number %d (max peers %d)\n",
2879                                    ar->num_peers, max_num_peers);
2880                        ret = -ENOBUFS;
2881                        goto exit;
2882                }
2883
2884                ath10k_dbg(ATH10K_DBG_MAC,
2885                           "mac vdev %d peer create %pM (new sta) num_peers %d\n",
2886                           arvif->vdev_id, sta->addr, ar->num_peers);
2887
2888                ret = ath10k_peer_create(ar, arvif->vdev_id, sta->addr);
2889                if (ret)
2890                        ath10k_warn("Failed to add peer %pM for vdev %d when adding a new sta: %i\n",
2891                                    sta->addr, arvif->vdev_id, ret);
2892        } else if ((old_state == IEEE80211_STA_NONE &&
2893                    new_state == IEEE80211_STA_NOTEXIST)) {
2894                /*
2895                 * Existing station deletion.
2896                 */
2897                ath10k_dbg(ATH10K_DBG_MAC,
2898                           "mac vdev %d peer delete %pM (sta gone)\n",
2899                           arvif->vdev_id, sta->addr);
2900                ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
2901                if (ret)
2902                        ath10k_warn("Failed to delete peer: %pM for VDEV: %d\n",
2903                                    sta->addr, arvif->vdev_id);
2904
2905                if (vif->type == NL80211_IFTYPE_STATION)
2906                        ath10k_bss_disassoc(hw, vif);
2907        } else if (old_state == IEEE80211_STA_AUTH &&
2908                   new_state == IEEE80211_STA_ASSOC &&
2909                   (vif->type == NL80211_IFTYPE_AP ||
2910                    vif->type == NL80211_IFTYPE_ADHOC)) {
2911                /*
2912                 * New association.
2913                 */
2914                ath10k_dbg(ATH10K_DBG_MAC, "mac sta %pM associated\n",
2915                           sta->addr);
2916
2917                ret = ath10k_station_assoc(ar, arvif, sta);
2918                if (ret)
2919                        ath10k_warn("Failed to associate station: %pM\n",
2920                                    sta->addr);
2921        } else if (old_state == IEEE80211_STA_ASSOC &&
2922                   new_state == IEEE80211_STA_AUTH &&
2923                   (vif->type == NL80211_IFTYPE_AP ||
2924                    vif->type == NL80211_IFTYPE_ADHOC)) {
2925                /*
2926                 * Disassociation.
2927                 */
2928                ath10k_dbg(ATH10K_DBG_MAC, "mac sta %pM disassociated\n",
2929                           sta->addr);
2930
2931                ret = ath10k_station_disassoc(ar, arvif, sta);
2932                if (ret)
2933                        ath10k_warn("Failed to disassociate station: %pM\n",
2934                                    sta->addr);
2935        }
2936exit:
2937        mutex_unlock(&ar->conf_mutex);
2938        return ret;
2939}
2940
2941static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
2942                                 u16 ac, bool enable)
2943{
2944        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2945        u32 value = 0;
2946        int ret = 0;
2947
2948        lockdep_assert_held(&ar->conf_mutex);
2949
2950        if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
2951                return 0;
2952
2953        switch (ac) {
2954        case IEEE80211_AC_VO:
2955                value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
2956                        WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
2957                break;
2958        case IEEE80211_AC_VI:
2959                value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
2960                        WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
2961                break;
2962        case IEEE80211_AC_BE:
2963                value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
2964                        WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
2965                break;
2966        case IEEE80211_AC_BK:
2967                value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
2968                        WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
2969                break;
2970        }
2971
2972        if (enable)
2973                arvif->u.sta.uapsd |= value;
2974        else
2975                arvif->u.sta.uapsd &= ~value;
2976
2977        ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2978                                          WMI_STA_PS_PARAM_UAPSD,
2979                                          arvif->u.sta.uapsd);
2980        if (ret) {
2981                ath10k_warn("could not set uapsd params %d\n", ret);
2982                goto exit;
2983        }
2984
2985        if (arvif->u.sta.uapsd)
2986                value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
2987        else
2988                value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
2989
2990        ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2991                                          WMI_STA_PS_PARAM_RX_WAKE_POLICY,
2992                                          value);
2993        if (ret)
2994                ath10k_warn("could not set rx wake param %d\n", ret);
2995
2996exit:
2997        return ret;
2998}
2999
3000static int ath10k_conf_tx(struct ieee80211_hw *hw,
3001                          struct ieee80211_vif *vif, u16 ac,
3002                          const struct ieee80211_tx_queue_params *params)
3003{
3004        struct ath10k *ar = hw->priv;
3005        struct wmi_wmm_params_arg *p = NULL;
3006        int ret;
3007
3008        mutex_lock(&ar->conf_mutex);
3009
3010        switch (ac) {
3011        case IEEE80211_AC_VO:
3012                p = &ar->wmm_params.ac_vo;
3013                break;
3014        case IEEE80211_AC_VI:
3015                p = &ar->wmm_params.ac_vi;
3016                break;
3017        case IEEE80211_AC_BE:
3018                p = &ar->wmm_params.ac_be;
3019                break;
3020        case IEEE80211_AC_BK:
3021                p = &ar->wmm_params.ac_bk;
3022                break;
3023        }
3024
3025        if (WARN_ON(!p)) {
3026                ret = -EINVAL;
3027                goto exit;
3028        }
3029
3030        p->cwmin = params->cw_min;
3031        p->cwmax = params->cw_max;
3032        p->aifs = params->aifs;
3033
3034        /*
3035         * The channel time duration programmed in the HW is in absolute
3036         * microseconds, while mac80211 gives the txop in units of
3037         * 32 microseconds.
3038         */
3039        p->txop = params->txop * 32;
3040
3041        /* FIXME: FW accepts wmm params per hw, not per vif */
3042        ret = ath10k_wmi_pdev_set_wmm_params(ar, &ar->wmm_params);
3043        if (ret) {
3044                ath10k_warn("could not set wmm params %d\n", ret);
3045                goto exit;
3046        }
3047
3048        ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
3049        if (ret)
3050                ath10k_warn("could not set sta uapsd %d\n", ret);
3051
3052exit:
3053        mutex_unlock(&ar->conf_mutex);
3054        return ret;
3055}
3056
3057#define ATH10K_ROC_TIMEOUT_HZ (2*HZ)
3058
3059static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
3060                                    struct ieee80211_vif *vif,
3061                                    struct ieee80211_channel *chan,
3062                                    int duration,
3063                                    enum ieee80211_roc_type type)
3064{
3065        struct ath10k *ar = hw->priv;
3066        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3067        struct wmi_start_scan_arg arg;
3068        int ret;
3069
3070        mutex_lock(&ar->conf_mutex);
3071
3072        spin_lock_bh(&ar->data_lock);
3073        if (ar->scan.in_progress) {
3074                spin_unlock_bh(&ar->data_lock);
3075                ret = -EBUSY;
3076                goto exit;
3077        }
3078
3079        reinit_completion(&ar->scan.started);
3080        reinit_completion(&ar->scan.completed);
3081        reinit_completion(&ar->scan.on_channel);
3082        ar->scan.in_progress = true;
3083        ar->scan.aborting = false;
3084        ar->scan.is_roc = true;
3085        ar->scan.vdev_id = arvif->vdev_id;
3086        ar->scan.roc_freq = chan->center_freq;
3087        spin_unlock_bh(&ar->data_lock);
3088
3089        memset(&arg, 0, sizeof(arg));
3090        ath10k_wmi_start_scan_init(ar, &arg);
3091        arg.vdev_id = arvif->vdev_id;
3092        arg.scan_id = ATH10K_SCAN_ID;
3093        arg.n_channels = 1;
3094        arg.channels[0] = chan->center_freq;
3095        arg.dwell_time_active = duration;
3096        arg.dwell_time_passive = duration;
3097        arg.max_scan_time = 2 * duration;
3098        arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
3099        arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
3100
3101        ret = ath10k_start_scan(ar, &arg);
3102        if (ret) {
3103                ath10k_warn("could not start roc scan (%d)\n", ret);
3104                spin_lock_bh(&ar->data_lock);
3105                ar->scan.in_progress = false;
3106                spin_unlock_bh(&ar->data_lock);
3107                goto exit;
3108        }
3109
3110        ret = wait_for_completion_timeout(&ar->scan.on_channel, 3*HZ);
3111        if (ret == 0) {
3112                ath10k_warn("could not switch to channel for roc scan\n");
3113                ath10k_abort_scan(ar);
3114                ret = -ETIMEDOUT;
3115                goto exit;
3116        }
3117
3118        ret = 0;
3119exit:
3120        mutex_unlock(&ar->conf_mutex);
3121        return ret;
3122}
3123
3124static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
3125{
3126        struct ath10k *ar = hw->priv;
3127
3128        mutex_lock(&ar->conf_mutex);
3129        ath10k_abort_scan(ar);
3130        mutex_unlock(&ar->conf_mutex);
3131
3132        return 0;
3133}
3134
3135/*
3136 * Both RTS and Fragmentation threshold are interface-specific
3137 * in ath10k, but device-specific in mac80211.
3138 */
3139
3140static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
3141{
3142        struct ath10k *ar = hw->priv;
3143        struct ath10k_vif *arvif;
3144        int ret = 0;
3145
3146        mutex_lock(&ar->conf_mutex);
3147        list_for_each_entry(arvif, &ar->arvifs, list) {
3148                ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n",
3149                           arvif->vdev_id, value);
3150
3151                ret = ath10k_mac_set_rts(arvif, value);
3152                if (ret) {
3153                        ath10k_warn("could not set rts threshold for vdev %d (%d)\n",
3154                                    arvif->vdev_id, ret);
3155                        break;
3156                }
3157        }
3158        mutex_unlock(&ar->conf_mutex);
3159
3160        return ret;
3161}
3162
3163static int ath10k_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
3164{
3165        struct ath10k *ar = hw->priv;
3166        struct ath10k_vif *arvif;
3167        int ret = 0;
3168
3169        mutex_lock(&ar->conf_mutex);
3170        list_for_each_entry(arvif, &ar->arvifs, list) {
3171                ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d fragmentation threshold %d\n",
3172                           arvif->vdev_id, value);
3173
3174                ret = ath10k_mac_set_rts(arvif, value);
3175                if (ret) {
3176                        ath10k_warn("could not set fragmentation threshold for vdev %d (%d)\n",
3177                                    arvif->vdev_id, ret);
3178                        break;
3179                }
3180        }
3181        mutex_unlock(&ar->conf_mutex);
3182
3183        return ret;
3184}
3185
3186static void ath10k_flush(struct ieee80211_hw *hw, u32 queues, bool drop)
3187{
3188        struct ath10k *ar = hw->priv;
3189        bool skip;
3190        int ret;
3191
3192        /* mac80211 doesn't care if we really xmit queued frames or not
3193         * we'll collect those frames either way if we stop/delete vdevs */
3194        if (drop)
3195                return;
3196
3197        mutex_lock(&ar->conf_mutex);
3198
3199        if (ar->state == ATH10K_STATE_WEDGED)
3200                goto skip;
3201
3202        ret = wait_event_timeout(ar->htt.empty_tx_wq, ({
3203                        bool empty;
3204
3205                        spin_lock_bh(&ar->htt.tx_lock);
3206                        empty = (ar->htt.num_pending_tx == 0);
3207                        spin_unlock_bh(&ar->htt.tx_lock);
3208
3209                        skip = (ar->state == ATH10K_STATE_WEDGED);
3210
3211                        (empty || skip);
3212                }), ATH10K_FLUSH_TIMEOUT_HZ);
3213
3214        if (ret <= 0 || skip)
3215                ath10k_warn("tx not flushed\n");
3216
3217skip:
3218        mutex_unlock(&ar->conf_mutex);
3219}
3220
3221/* TODO: Implement this function properly
3222 * For now it is needed to reply to Probe Requests in IBSS mode.
3223 * Propably we need this information from FW.
3224 */
3225static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
3226{
3227        return 1;
3228}
3229
3230#ifdef CONFIG_PM
3231static int ath10k_suspend(struct ieee80211_hw *hw,
3232                          struct cfg80211_wowlan *wowlan)
3233{
3234        struct ath10k *ar = hw->priv;
3235        int ret;
3236
3237        ar->is_target_paused = false;
3238
3239        ret = ath10k_wmi_pdev_suspend_target(ar);
3240        if (ret) {
3241                ath10k_warn("could not suspend target (%d)\n", ret);
3242                return 1;
3243        }
3244
3245        ret = wait_event_interruptible_timeout(ar->event_queue,
3246                                               ar->is_target_paused == true,
3247                                               1 * HZ);
3248        if (ret < 0) {
3249                ath10k_warn("suspend interrupted (%d)\n", ret);
3250                goto resume;
3251        } else if (ret == 0) {
3252                ath10k_warn("suspend timed out - target pause event never came\n");
3253                goto resume;
3254        }
3255
3256        ret = ath10k_hif_suspend(ar);
3257        if (ret) {
3258                ath10k_warn("could not suspend hif (%d)\n", ret);
3259                goto resume;
3260        }
3261
3262        return 0;
3263resume:
3264        ret = ath10k_wmi_pdev_resume_target(ar);
3265        if (ret)
3266                ath10k_warn("could not resume target (%d)\n", ret);
3267        return 1;
3268}
3269
3270static int ath10k_resume(struct ieee80211_hw *hw)
3271{
3272        struct ath10k *ar = hw->priv;
3273        int ret;
3274
3275        ret = ath10k_hif_resume(ar);
3276        if (ret) {
3277                ath10k_warn("could not resume hif (%d)\n", ret);
3278                return 1;
3279        }
3280
3281        ret = ath10k_wmi_pdev_resume_target(ar);
3282        if (ret) {
3283                ath10k_warn("could not resume target (%d)\n", ret);
3284                return 1;
3285        }
3286
3287        return 0;
3288}
3289#endif
3290
3291static void ath10k_restart_complete(struct ieee80211_hw *hw)
3292{
3293        struct ath10k *ar = hw->priv;
3294
3295        mutex_lock(&ar->conf_mutex);
3296
3297        /* If device failed to restart it will be in a different state, e.g.
3298         * ATH10K_STATE_WEDGED */
3299        if (ar->state == ATH10K_STATE_RESTARTED) {
3300                ath10k_info("device successfully recovered\n");
3301                ar->state = ATH10K_STATE_ON;
3302        }
3303
3304        mutex_unlock(&ar->conf_mutex);
3305}
3306
3307static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
3308                             struct survey_info *survey)
3309{
3310        struct ath10k *ar = hw->priv;
3311        struct ieee80211_supported_band *sband;
3312        struct survey_info *ar_survey = &ar->survey[idx];
3313        int ret = 0;
3314
3315        mutex_lock(&ar->conf_mutex);
3316
3317        sband = hw->wiphy->bands[IEEE80211_BAND_2GHZ];
3318        if (sband && idx >= sband->n_channels) {
3319                idx -= sband->n_channels;
3320                sband = NULL;
3321        }
3322
3323        if (!sband)
3324                sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
3325
3326        if (!sband || idx >= sband->n_channels) {
3327                ret = -ENOENT;
3328                goto exit;
3329        }
3330
3331        spin_lock_bh(&ar->data_lock);
3332        memcpy(survey, ar_survey, sizeof(*survey));
3333        spin_unlock_bh(&ar->data_lock);
3334
3335        survey->channel = &sband->channels[idx];
3336
3337exit:
3338        mutex_unlock(&ar->conf_mutex);
3339        return ret;
3340}
3341
3342/* Helper table for legacy fixed_rate/bitrate_mask */
3343static const u8 cck_ofdm_rate[] = {
3344        /* CCK */
3345        3, /* 1Mbps */
3346        2, /* 2Mbps */
3347        1, /* 5.5Mbps */
3348        0, /* 11Mbps */
3349        /* OFDM */
3350        3, /* 6Mbps */
3351        7, /* 9Mbps */
3352        2, /* 12Mbps */
3353        6, /* 18Mbps */
3354        1, /* 24Mbps */
3355        5, /* 36Mbps */
3356        0, /* 48Mbps */
3357        4, /* 54Mbps */
3358};
3359
3360/* Check if only one bit set */
3361static int ath10k_check_single_mask(u32 mask)
3362{
3363        int bit;
3364
3365        bit = ffs(mask);
3366        if (!bit)
3367                return 0;
3368
3369        mask &= ~BIT(bit - 1);
3370        if (mask)
3371                return 2;
3372
3373        return 1;
3374}
3375
3376static bool
3377ath10k_default_bitrate_mask(struct ath10k *ar,
3378                            enum ieee80211_band band,
3379                            const struct cfg80211_bitrate_mask *mask)
3380{
3381        u32 legacy = 0x00ff;
3382        u8 ht = 0xff, i;
3383        u16 vht = 0x3ff;
3384
3385        switch (band) {
3386        case IEEE80211_BAND_2GHZ:
3387                legacy = 0x00fff;
3388                vht = 0;
3389                break;
3390        case IEEE80211_BAND_5GHZ:
3391                break;
3392        default:
3393                return false;
3394        }
3395
3396        if (mask->control[band].legacy != legacy)
3397                return false;
3398
3399        for (i = 0; i < ar->num_rf_chains; i++)
3400                if (mask->control[band].ht_mcs[i] != ht)
3401                        return false;
3402
3403        for (i = 0; i < ar->num_rf_chains; i++)
3404                if (mask->control[band].vht_mcs[i] != vht)
3405                        return false;
3406
3407        return true;
3408}
3409
3410static bool
3411ath10k_bitrate_mask_nss(const struct cfg80211_bitrate_mask *mask,
3412                        enum ieee80211_band band,
3413                        u8 *fixed_nss)
3414{
3415        int ht_nss = 0, vht_nss = 0, i;
3416
3417        /* check legacy */
3418        if (ath10k_check_single_mask(mask->control[band].legacy))
3419                return false;
3420
3421        /* check HT */
3422        for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
3423                if (mask->control[band].ht_mcs[i] == 0xff)
3424                        continue;
3425                else if (mask->control[band].ht_mcs[i] == 0x00)
3426                        break;
3427                else
3428                        return false;
3429        }
3430
3431        ht_nss = i;
3432
3433        /* check VHT */
3434        for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
3435                if (mask->control[band].vht_mcs[i] == 0x03ff)
3436                        continue;
3437                else if (mask->control[band].vht_mcs[i] == 0x0000)
3438                        break;
3439                else
3440                        return false;
3441        }
3442
3443        vht_nss = i;
3444
3445        if (ht_nss > 0 && vht_nss > 0)
3446                return false;
3447
3448        if (ht_nss)
3449                *fixed_nss = ht_nss;
3450        else if (vht_nss)
3451                *fixed_nss = vht_nss;
3452        else
3453                return false;
3454
3455        return true;
3456}
3457
3458static bool
3459ath10k_bitrate_mask_correct(const struct cfg80211_bitrate_mask *mask,
3460                            enum ieee80211_band band,
3461                            enum wmi_rate_preamble *preamble)
3462{
3463        int legacy = 0, ht = 0, vht = 0, i;
3464
3465        *preamble = WMI_RATE_PREAMBLE_OFDM;
3466
3467        /* check legacy */
3468        legacy = ath10k_check_single_mask(mask->control[band].legacy);
3469        if (legacy > 1)
3470                return false;
3471
3472        /* check HT */
3473        for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
3474                ht += ath10k_check_single_mask(mask->control[band].ht_mcs[i]);
3475        if (ht > 1)
3476                return false;
3477
3478        /* check VHT */
3479        for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
3480                vht += ath10k_check_single_mask(mask->control[band].vht_mcs[i]);
3481        if (vht > 1)
3482                return false;
3483
3484        /* Currently we support only one fixed_rate */
3485        if ((legacy + ht + vht) != 1)
3486                return false;
3487
3488        if (ht)
3489                *preamble = WMI_RATE_PREAMBLE_HT;
3490        else if (vht)
3491                *preamble = WMI_RATE_PREAMBLE_VHT;
3492
3493        return true;
3494}
3495
3496static bool
3497ath10k_bitrate_mask_rate(const struct cfg80211_bitrate_mask *mask,
3498                         enum ieee80211_band band,
3499                         u8 *fixed_rate,
3500                         u8 *fixed_nss)
3501{
3502        u8 rate = 0, pream = 0, nss = 0, i;
3503        enum wmi_rate_preamble preamble;
3504
3505        /* Check if single rate correct */
3506        if (!ath10k_bitrate_mask_correct(mask, band, &preamble))
3507                return false;
3508
3509        pream = preamble;
3510
3511        switch (preamble) {
3512        case WMI_RATE_PREAMBLE_CCK:
3513        case WMI_RATE_PREAMBLE_OFDM:
3514                i = ffs(mask->control[band].legacy) - 1;
3515
3516                if (band == IEEE80211_BAND_2GHZ && i < 4)
3517                        pream = WMI_RATE_PREAMBLE_CCK;
3518
3519                if (band == IEEE80211_BAND_5GHZ)
3520                        i += 4;
3521
3522                if (i >= ARRAY_SIZE(cck_ofdm_rate))
3523                        return false;
3524
3525                rate = cck_ofdm_rate[i];
3526                break;
3527        case WMI_RATE_PREAMBLE_HT:
3528                for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
3529                        if (mask->control[band].ht_mcs[i])
3530                                break;
3531
3532                if (i == IEEE80211_HT_MCS_MASK_LEN)
3533                        return false;
3534
3535                rate = ffs(mask->control[band].ht_mcs[i]) - 1;
3536                nss = i;
3537                break;
3538        case WMI_RATE_PREAMBLE_VHT:
3539                for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
3540                        if (mask->control[band].vht_mcs[i])
3541                                break;
3542
3543                if (i == NL80211_VHT_NSS_MAX)
3544                        return false;
3545
3546                rate = ffs(mask->control[band].vht_mcs[i]) - 1;
3547                nss = i;
3548                break;
3549        }
3550
3551        *fixed_nss = nss + 1;
3552        nss <<= 4;
3553        pream <<= 6;
3554
3555        ath10k_dbg(ATH10K_DBG_MAC, "mac fixed rate pream 0x%02x nss 0x%02x rate 0x%02x\n",
3556                   pream, nss, rate);
3557
3558        *fixed_rate = pream | nss | rate;
3559
3560        return true;
3561}
3562
3563static bool ath10k_get_fixed_rate_nss(const struct cfg80211_bitrate_mask *mask,
3564                                      enum ieee80211_band band,
3565                                      u8 *fixed_rate,
3566                                      u8 *fixed_nss)
3567{
3568        /* First check full NSS mask, if we can simply limit NSS */
3569        if (ath10k_bitrate_mask_nss(mask, band, fixed_nss))
3570                return true;
3571
3572        /* Next Check single rate is set */
3573        return ath10k_bitrate_mask_rate(mask, band, fixed_rate, fixed_nss);
3574}
3575
3576static int ath10k_set_fixed_rate_param(struct ath10k_vif *arvif,
3577                                       u8 fixed_rate,
3578                                       u8 fixed_nss)
3579{
3580        struct ath10k *ar = arvif->ar;
3581        u32 vdev_param;
3582        int ret = 0;
3583
3584        mutex_lock(&ar->conf_mutex);
3585
3586        if (arvif->fixed_rate == fixed_rate &&
3587            arvif->fixed_nss == fixed_nss)
3588                goto exit;
3589
3590        if (fixed_rate == WMI_FIXED_RATE_NONE)
3591                ath10k_dbg(ATH10K_DBG_MAC, "mac disable fixed bitrate mask\n");
3592
3593        vdev_param = ar->wmi.vdev_param->fixed_rate;
3594        ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
3595                                        vdev_param, fixed_rate);
3596        if (ret) {
3597                ath10k_warn("Could not set fixed_rate param 0x%02x: %d\n",
3598                            fixed_rate, ret);
3599                ret = -EINVAL;
3600                goto exit;
3601        }
3602
3603        arvif->fixed_rate = fixed_rate;
3604
3605        vdev_param = ar->wmi.vdev_param->nss;
3606        ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
3607                                        vdev_param, fixed_nss);
3608
3609        if (ret) {
3610                ath10k_warn("Could not set fixed_nss param %d: %d\n",
3611                            fixed_nss, ret);
3612                ret = -EINVAL;
3613                goto exit;
3614        }
3615
3616        arvif->fixed_nss = fixed_nss;
3617
3618exit:
3619        mutex_unlock(&ar->conf_mutex);
3620        return ret;
3621}
3622
3623static int ath10k_set_bitrate_mask(struct ieee80211_hw *hw,
3624                                   struct ieee80211_vif *vif,
3625                                   const struct cfg80211_bitrate_mask *mask)
3626{
3627        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3628        struct ath10k *ar = arvif->ar;
3629        enum ieee80211_band band = ar->hw->conf.chandef.chan->band;
3630        u8 fixed_rate = WMI_FIXED_RATE_NONE;
3631        u8 fixed_nss = ar->num_rf_chains;
3632
3633        if (!ath10k_default_bitrate_mask(ar, band, mask)) {
3634                if (!ath10k_get_fixed_rate_nss(mask, band,
3635                                               &fixed_rate,
3636                                               &fixed_nss))
3637                        return -EINVAL;
3638        }
3639
3640        return ath10k_set_fixed_rate_param(arvif, fixed_rate, fixed_nss);
3641}
3642
3643static const struct ieee80211_ops ath10k_ops = {
3644        .tx                             = ath10k_tx,
3645        .start                          = ath10k_start,
3646        .stop                           = ath10k_stop,
3647        .config                         = ath10k_config,
3648        .add_interface                  = ath10k_add_interface,
3649        .remove_interface               = ath10k_remove_interface,
3650        .configure_filter               = ath10k_configure_filter,
3651        .bss_info_changed               = ath10k_bss_info_changed,
3652        .hw_scan                        = ath10k_hw_scan,
3653        .cancel_hw_scan                 = ath10k_cancel_hw_scan,
3654        .set_key                        = ath10k_set_key,
3655        .sta_state                      = ath10k_sta_state,
3656        .conf_tx                        = ath10k_conf_tx,
3657        .remain_on_channel              = ath10k_remain_on_channel,
3658        .cancel_remain_on_channel       = ath10k_cancel_remain_on_channel,
3659        .set_rts_threshold              = ath10k_set_rts_threshold,
3660        .set_frag_threshold             = ath10k_set_frag_threshold,
3661        .flush                          = ath10k_flush,
3662        .tx_last_beacon                 = ath10k_tx_last_beacon,
3663        .restart_complete               = ath10k_restart_complete,
3664        .get_survey                     = ath10k_get_survey,
3665        .set_bitrate_mask               = ath10k_set_bitrate_mask,
3666#ifdef CONFIG_PM
3667        .suspend                        = ath10k_suspend,
3668        .resume                         = ath10k_resume,
3669#endif
3670};
3671
3672#define RATETAB_ENT(_rate, _rateid, _flags) { \
3673        .bitrate                = (_rate), \
3674        .flags                  = (_flags), \
3675        .hw_value               = (_rateid), \
3676}
3677
3678#define CHAN2G(_channel, _freq, _flags) { \
3679        .band                   = IEEE80211_BAND_2GHZ, \
3680        .hw_value               = (_channel), \
3681        .center_freq            = (_freq), \
3682        .flags                  = (_flags), \
3683        .max_antenna_gain       = 0, \
3684        .max_power              = 30, \
3685}
3686
3687#define CHAN5G(_channel, _freq, _flags) { \
3688        .band                   = IEEE80211_BAND_5GHZ, \
3689        .hw_value               = (_channel), \
3690        .center_freq            = (_freq), \
3691        .flags                  = (_flags), \
3692        .max_antenna_gain       = 0, \
3693        .max_power              = 30, \
3694}
3695
3696static const struct ieee80211_channel ath10k_2ghz_channels[] = {
3697        CHAN2G(1, 2412, 0),
3698        CHAN2G(2, 2417, 0),
3699        CHAN2G(3, 2422, 0),
3700        CHAN2G(4, 2427, 0),
3701        CHAN2G(5, 2432, 0),
3702        CHAN2G(6, 2437, 0),
3703        CHAN2G(7, 2442, 0),
3704        CHAN2G(8, 2447, 0),
3705        CHAN2G(9, 2452, 0),
3706        CHAN2G(10, 2457, 0),
3707        CHAN2G(11, 2462, 0),
3708        CHAN2G(12, 2467, 0),
3709        CHAN2G(13, 2472, 0),
3710        CHAN2G(14, 2484, 0),
3711};
3712
3713static const struct ieee80211_channel ath10k_5ghz_channels[] = {
3714        CHAN5G(36, 5180, 0),
3715        CHAN5G(40, 5200, 0),
3716        CHAN5G(44, 5220, 0),
3717        CHAN5G(48, 5240, 0),
3718        CHAN5G(52, 5260, 0),
3719        CHAN5G(56, 5280, 0),
3720        CHAN5G(60, 5300, 0),
3721        CHAN5G(64, 5320, 0),
3722        CHAN5G(100, 5500, 0),
3723        CHAN5G(104, 5520, 0),
3724        CHAN5G(108, 5540, 0),
3725        CHAN5G(112, 5560, 0),
3726        CHAN5G(116, 5580, 0),
3727        CHAN5G(120, 5600, 0),
3728        CHAN5G(124, 5620, 0),
3729        CHAN5G(128, 5640, 0),
3730        CHAN5G(132, 5660, 0),
3731        CHAN5G(136, 5680, 0),
3732        CHAN5G(140, 5700, 0),
3733        CHAN5G(149, 5745, 0),
3734        CHAN5G(153, 5765, 0),
3735        CHAN5G(157, 5785, 0),
3736        CHAN5G(161, 5805, 0),
3737        CHAN5G(165, 5825, 0),
3738};
3739
3740static struct ieee80211_rate ath10k_rates[] = {
3741        /* CCK */
3742        RATETAB_ENT(10,  0x82, 0),
3743        RATETAB_ENT(20,  0x84, 0),
3744        RATETAB_ENT(55,  0x8b, 0),
3745        RATETAB_ENT(110, 0x96, 0),
3746        /* OFDM */
3747        RATETAB_ENT(60,  0x0c, 0),
3748        RATETAB_ENT(90,  0x12, 0),
3749        RATETAB_ENT(120, 0x18, 0),
3750        RATETAB_ENT(180, 0x24, 0),
3751        RATETAB_ENT(240, 0x30, 0),
3752        RATETAB_ENT(360, 0x48, 0),
3753        RATETAB_ENT(480, 0x60, 0),
3754        RATETAB_ENT(540, 0x6c, 0),
3755};
3756
3757#define ath10k_a_rates (ath10k_rates + 4)
3758#define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - 4)
3759#define ath10k_g_rates (ath10k_rates + 0)
3760#define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
3761
3762struct ath10k *ath10k_mac_create(void)
3763{
3764        struct ieee80211_hw *hw;
3765        struct ath10k *ar;
3766
3767        hw = ieee80211_alloc_hw(sizeof(struct ath10k), &ath10k_ops);
3768        if (!hw)
3769                return NULL;
3770
3771        ar = hw->priv;
3772        ar->hw = hw;
3773
3774        return ar;
3775}
3776
3777void ath10k_mac_destroy(struct ath10k *ar)
3778{
3779        ieee80211_free_hw(ar->hw);
3780}
3781
3782static const struct ieee80211_iface_limit ath10k_if_limits[] = {
3783        {
3784        .max    = 8,
3785        .types  = BIT(NL80211_IFTYPE_STATION)
3786                | BIT(NL80211_IFTYPE_P2P_CLIENT)
3787        },
3788        {
3789        .max    = 3,
3790        .types  = BIT(NL80211_IFTYPE_P2P_GO)
3791        },
3792        {
3793        .max    = 7,
3794        .types  = BIT(NL80211_IFTYPE_AP)
3795        },
3796};
3797
3798static const struct ieee80211_iface_limit ath10k_10x_if_limits[] = {
3799        {
3800        .max    = 8,
3801        .types  = BIT(NL80211_IFTYPE_AP)
3802        },
3803};
3804
3805static const struct ieee80211_iface_combination ath10k_if_comb[] = {
3806        {
3807                .limits = ath10k_if_limits,
3808                .n_limits = ARRAY_SIZE(ath10k_if_limits),
3809                .max_interfaces = 8,
3810                .num_different_channels = 1,
3811                .beacon_int_infra_match = true,
3812        },
3813};
3814
3815static const struct ieee80211_iface_combination ath10k_10x_if_comb[] = {
3816        {
3817                .limits = ath10k_10x_if_limits,
3818                .n_limits = ARRAY_SIZE(ath10k_10x_if_limits),
3819                .max_interfaces = 8,
3820                .num_different_channels = 1,
3821                .beacon_int_infra_match = true,
3822#ifdef CONFIG_ATH10K_DFS_CERTIFIED
3823                .radar_detect_widths =  BIT(NL80211_CHAN_WIDTH_20_NOHT) |
3824                                        BIT(NL80211_CHAN_WIDTH_20) |
3825                                        BIT(NL80211_CHAN_WIDTH_40) |
3826                                        BIT(NL80211_CHAN_WIDTH_80),
3827#endif
3828        },
3829};
3830
3831static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
3832{
3833        struct ieee80211_sta_vht_cap vht_cap = {0};
3834        u16 mcs_map;
3835        int i;
3836
3837        vht_cap.vht_supported = 1;
3838        vht_cap.cap = ar->vht_cap_info;
3839
3840        mcs_map = 0;
3841        for (i = 0; i < 8; i++) {
3842                if (i < ar->num_rf_chains)
3843                        mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i*2);
3844                else
3845                        mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i*2);
3846        }
3847
3848        vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
3849        vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
3850
3851        return vht_cap;
3852}
3853
3854static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
3855{
3856        int i;
3857        struct ieee80211_sta_ht_cap ht_cap = {0};
3858
3859        if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
3860                return ht_cap;
3861
3862        ht_cap.ht_supported = 1;
3863        ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
3864        ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
3865        ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
3866        ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
3867        ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
3868
3869        if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
3870                ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
3871
3872        if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
3873                ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
3874
3875        if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
3876                u32 smps;
3877
3878                smps   = WLAN_HT_CAP_SM_PS_DYNAMIC;
3879                smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
3880
3881                ht_cap.cap |= smps;
3882        }
3883
3884        if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC)
3885                ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
3886
3887        if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
3888                u32 stbc;
3889
3890                stbc   = ar->ht_cap_info;
3891                stbc  &= WMI_HT_CAP_RX_STBC;
3892                stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
3893                stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
3894                stbc  &= IEEE80211_HT_CAP_RX_STBC;
3895
3896                ht_cap.cap |= stbc;
3897        }
3898
3899        if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
3900                ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
3901
3902        if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
3903                ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
3904
3905        /* max AMSDU is implicitly taken from vht_cap_info */
3906        if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
3907                ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
3908
3909        for (i = 0; i < ar->num_rf_chains; i++)
3910                ht_cap.mcs.rx_mask[i] = 0xFF;
3911
3912        ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
3913
3914        return ht_cap;
3915}
3916
3917
3918static void ath10k_get_arvif_iter(void *data, u8 *mac,
3919                                  struct ieee80211_vif *vif)
3920{
3921        struct ath10k_vif_iter *arvif_iter = data;
3922        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3923
3924        if (arvif->vdev_id == arvif_iter->vdev_id)
3925                arvif_iter->arvif = arvif;
3926}
3927
3928struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
3929{
3930        struct ath10k_vif_iter arvif_iter;
3931        u32 flags;
3932
3933        memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
3934        arvif_iter.vdev_id = vdev_id;
3935
3936        flags = IEEE80211_IFACE_ITER_RESUME_ALL;
3937        ieee80211_iterate_active_interfaces_atomic(ar->hw,
3938                                                   flags,
3939                                                   ath10k_get_arvif_iter,
3940                                                   &arvif_iter);
3941        if (!arvif_iter.arvif) {
3942                ath10k_warn("No VIF found for VDEV: %d\n", vdev_id);
3943                return NULL;
3944        }
3945
3946        return arvif_iter.arvif;
3947}
3948
3949int ath10k_mac_register(struct ath10k *ar)
3950{
3951        struct ieee80211_supported_band *band;
3952        struct ieee80211_sta_vht_cap vht_cap;
3953        struct ieee80211_sta_ht_cap ht_cap;
3954        void *channels;
3955        int ret;
3956
3957        SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
3958
3959        SET_IEEE80211_DEV(ar->hw, ar->dev);
3960
3961        ht_cap = ath10k_get_ht_cap(ar);
3962        vht_cap = ath10k_create_vht_cap(ar);
3963
3964        if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
3965                channels = kmemdup(ath10k_2ghz_channels,
3966                                   sizeof(ath10k_2ghz_channels),
3967                                   GFP_KERNEL);
3968                if (!channels) {
3969                        ret = -ENOMEM;
3970                        goto err_free;
3971                }
3972
3973                band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
3974                band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
3975                band->channels = channels;
3976                band->n_bitrates = ath10k_g_rates_size;
3977                band->bitrates = ath10k_g_rates;
3978                band->ht_cap = ht_cap;
3979
3980                /* vht is not supported in 2.4 GHz */
3981
3982                ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band;
3983        }
3984
3985        if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
3986                channels = kmemdup(ath10k_5ghz_channels,
3987                                   sizeof(ath10k_5ghz_channels),
3988                                   GFP_KERNEL);
3989                if (!channels) {
3990                        ret = -ENOMEM;
3991                        goto err_free;
3992                }
3993
3994                band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
3995                band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
3996                band->channels = channels;
3997                band->n_bitrates = ath10k_a_rates_size;
3998                band->bitrates = ath10k_a_rates;
3999                band->ht_cap = ht_cap;
4000                band->vht_cap = vht_cap;
4001                ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band;
4002        }
4003
4004        ar->hw->wiphy->interface_modes =
4005                BIT(NL80211_IFTYPE_STATION) |
4006                BIT(NL80211_IFTYPE_ADHOC) |
4007                BIT(NL80211_IFTYPE_AP);
4008
4009        if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->fw_features))
4010                ar->hw->wiphy->interface_modes |=
4011                        BIT(NL80211_IFTYPE_P2P_CLIENT) |
4012                        BIT(NL80211_IFTYPE_P2P_GO);
4013
4014        ar->hw->flags = IEEE80211_HW_SIGNAL_DBM |
4015                        IEEE80211_HW_SUPPORTS_PS |
4016                        IEEE80211_HW_SUPPORTS_DYNAMIC_PS |
4017                        IEEE80211_HW_SUPPORTS_UAPSD |
4018                        IEEE80211_HW_MFP_CAPABLE |
4019                        IEEE80211_HW_REPORTS_TX_ACK_STATUS |
4020                        IEEE80211_HW_HAS_RATE_CONTROL |
4021                        IEEE80211_HW_SUPPORTS_STATIC_SMPS |
4022                        IEEE80211_HW_WANT_MONITOR_VIF |
4023                        IEEE80211_HW_AP_LINK_PS;
4024
4025        /* MSDU can have HTT TX fragment pushed in front. The additional 4
4026         * bytes is used for padding/alignment if necessary. */
4027        ar->hw->extra_tx_headroom += sizeof(struct htt_data_tx_desc_frag)*2 + 4;
4028
4029        if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
4030                ar->hw->flags |= IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS;
4031
4032        if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
4033                ar->hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION;
4034                ar->hw->flags |= IEEE80211_HW_TX_AMPDU_SETUP_IN_HW;
4035        }
4036
4037        ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
4038        ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
4039
4040        ar->hw->vif_data_size = sizeof(struct ath10k_vif);
4041
4042        ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
4043
4044        ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
4045        ar->hw->wiphy->max_remain_on_channel_duration = 5000;
4046
4047        ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
4048        /*
4049         * on LL hardware queues are managed entirely by the FW
4050         * so we only advertise to mac we can do the queues thing
4051         */
4052        ar->hw->queues = 4;
4053
4054        if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) {
4055                ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb;
4056                ar->hw->wiphy->n_iface_combinations =
4057                        ARRAY_SIZE(ath10k_10x_if_comb);
4058        } else {
4059                ar->hw->wiphy->iface_combinations = ath10k_if_comb;
4060                ar->hw->wiphy->n_iface_combinations =
4061                        ARRAY_SIZE(ath10k_if_comb);
4062        }
4063
4064        ar->hw->netdev_features = NETIF_F_HW_CSUM;
4065
4066        if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)) {
4067                /* Init ath dfs pattern detector */
4068                ar->ath_common.debug_mask = ATH_DBG_DFS;
4069                ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common,
4070                                                             NL80211_DFS_UNSET);
4071
4072                if (!ar->dfs_detector)
4073                        ath10k_warn("dfs pattern detector init failed\n");
4074        }
4075
4076        ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
4077                            ath10k_reg_notifier);
4078        if (ret) {
4079                ath10k_err("Regulatory initialization failed\n");
4080                goto err_free;
4081        }
4082
4083        ret = ieee80211_register_hw(ar->hw);
4084        if (ret) {
4085                ath10k_err("ieee80211 registration failed: %d\n", ret);
4086                goto err_free;
4087        }
4088
4089        if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
4090                ret = regulatory_hint(ar->hw->wiphy,
4091                                      ar->ath_common.regulatory.alpha2);
4092                if (ret)
4093                        goto err_unregister;
4094        }
4095
4096        return 0;
4097
4098err_unregister:
4099        ieee80211_unregister_hw(ar->hw);
4100err_free:
4101        kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
4102        kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
4103
4104        return ret;
4105}
4106
4107void ath10k_mac_unregister(struct ath10k *ar)
4108{
4109        ieee80211_unregister_hw(ar->hw);
4110
4111        if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
4112                ar->dfs_detector->exit(ar->dfs_detector);
4113
4114        kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
4115        kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
4116
4117        SET_IEEE80211_DEV(ar->hw, NULL);
4118}
4119