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        INIT_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                return ret;
 327
 328        ret = ath10k_wait_for_peer_created(ar, vdev_id, addr);
 329        if (ret)
 330                return ret;
 331
 332        return 0;
 333}
 334
 335static int  ath10k_mac_set_rts(struct ath10k_vif *arvif, u32 value)
 336{
 337        if (value != 0xFFFFFFFF)
 338                value = min_t(u32, arvif->ar->hw->wiphy->rts_threshold,
 339                              ATH10K_RTS_MAX);
 340
 341        return ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id,
 342                                         WMI_VDEV_PARAM_RTS_THRESHOLD,
 343                                         value);
 344}
 345
 346static int ath10k_mac_set_frag(struct ath10k_vif *arvif, u32 value)
 347{
 348        if (value != 0xFFFFFFFF)
 349                value = clamp_t(u32, arvif->ar->hw->wiphy->frag_threshold,
 350                                ATH10K_FRAGMT_THRESHOLD_MIN,
 351                                ATH10K_FRAGMT_THRESHOLD_MAX);
 352
 353        return ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id,
 354                                         WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
 355                                         value);
 356}
 357
 358static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
 359{
 360        int ret;
 361
 362        lockdep_assert_held(&ar->conf_mutex);
 363
 364        ret = ath10k_wmi_peer_delete(ar, vdev_id, addr);
 365        if (ret)
 366                return ret;
 367
 368        ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
 369        if (ret)
 370                return ret;
 371
 372        return 0;
 373}
 374
 375static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id)
 376{
 377        struct ath10k_peer *peer, *tmp;
 378
 379        lockdep_assert_held(&ar->conf_mutex);
 380
 381        spin_lock_bh(&ar->data_lock);
 382        list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
 383                if (peer->vdev_id != vdev_id)
 384                        continue;
 385
 386                ath10k_warn("removing stale peer %pM from vdev_id %d\n",
 387                            peer->addr, vdev_id);
 388
 389                list_del(&peer->list);
 390                kfree(peer);
 391        }
 392        spin_unlock_bh(&ar->data_lock);
 393}
 394
 395static void ath10k_peer_cleanup_all(struct ath10k *ar)
 396{
 397        struct ath10k_peer *peer, *tmp;
 398
 399        lockdep_assert_held(&ar->conf_mutex);
 400
 401        spin_lock_bh(&ar->data_lock);
 402        list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
 403                list_del(&peer->list);
 404                kfree(peer);
 405        }
 406        spin_unlock_bh(&ar->data_lock);
 407}
 408
 409/************************/
 410/* Interface management */
 411/************************/
 412
 413static inline int ath10k_vdev_setup_sync(struct ath10k *ar)
 414{
 415        int ret;
 416
 417        lockdep_assert_held(&ar->conf_mutex);
 418
 419        ret = wait_for_completion_timeout(&ar->vdev_setup_done,
 420                                          ATH10K_VDEV_SETUP_TIMEOUT_HZ);
 421        if (ret == 0)
 422                return -ETIMEDOUT;
 423
 424        return 0;
 425}
 426
 427static int ath10k_vdev_start(struct ath10k_vif *arvif)
 428{
 429        struct ath10k *ar = arvif->ar;
 430        struct ieee80211_conf *conf = &ar->hw->conf;
 431        struct ieee80211_channel *channel = conf->chandef.chan;
 432        struct wmi_vdev_start_request_arg arg = {};
 433        int ret = 0;
 434
 435        lockdep_assert_held(&ar->conf_mutex);
 436
 437        INIT_COMPLETION(ar->vdev_setup_done);
 438
 439        arg.vdev_id = arvif->vdev_id;
 440        arg.dtim_period = arvif->dtim_period;
 441        arg.bcn_intval = arvif->beacon_interval;
 442
 443        arg.channel.freq = channel->center_freq;
 444
 445        arg.channel.band_center_freq1 = conf->chandef.center_freq1;
 446
 447        arg.channel.mode = chan_to_phymode(&conf->chandef);
 448
 449        arg.channel.min_power = channel->max_power * 3;
 450        arg.channel.max_power = channel->max_power * 4;
 451        arg.channel.max_reg_power = channel->max_reg_power * 4;
 452        arg.channel.max_antenna_gain = channel->max_antenna_gain;
 453
 454        if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
 455                arg.ssid = arvif->u.ap.ssid;
 456                arg.ssid_len = arvif->u.ap.ssid_len;
 457                arg.hidden_ssid = arvif->u.ap.hidden_ssid;
 458        } else if (arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
 459                arg.ssid = arvif->vif->bss_conf.ssid;
 460                arg.ssid_len = arvif->vif->bss_conf.ssid_len;
 461        }
 462
 463        ret = ath10k_wmi_vdev_start(ar, &arg);
 464        if (ret) {
 465                ath10k_warn("WMI vdev start failed: ret %d\n", ret);
 466                return ret;
 467        }
 468
 469        ret = ath10k_vdev_setup_sync(ar);
 470        if (ret) {
 471                ath10k_warn("vdev setup failed %d\n", ret);
 472                return ret;
 473        }
 474
 475        return ret;
 476}
 477
 478static int ath10k_vdev_stop(struct ath10k_vif *arvif)
 479{
 480        struct ath10k *ar = arvif->ar;
 481        int ret;
 482
 483        lockdep_assert_held(&ar->conf_mutex);
 484
 485        INIT_COMPLETION(ar->vdev_setup_done);
 486
 487        ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id);
 488        if (ret) {
 489                ath10k_warn("WMI vdev stop failed: ret %d\n", ret);
 490                return ret;
 491        }
 492
 493        ret = ath10k_vdev_setup_sync(ar);
 494        if (ret) {
 495                ath10k_warn("vdev setup failed %d\n", ret);
 496                return ret;
 497        }
 498
 499        return ret;
 500}
 501
 502static int ath10k_monitor_start(struct ath10k *ar, int vdev_id)
 503{
 504        struct ieee80211_channel *channel = ar->hw->conf.chandef.chan;
 505        struct wmi_vdev_start_request_arg arg = {};
 506        enum nl80211_channel_type type;
 507        int ret = 0;
 508
 509        lockdep_assert_held(&ar->conf_mutex);
 510
 511        type = cfg80211_get_chandef_type(&ar->hw->conf.chandef);
 512
 513        arg.vdev_id = vdev_id;
 514        arg.channel.freq = channel->center_freq;
 515        arg.channel.band_center_freq1 = ar->hw->conf.chandef.center_freq1;
 516
 517        /* TODO setup this dynamically, what in case we
 518           don't have any vifs? */
 519        arg.channel.mode = chan_to_phymode(&ar->hw->conf.chandef);
 520
 521        arg.channel.min_power = channel->max_power * 3;
 522        arg.channel.max_power = channel->max_power * 4;
 523        arg.channel.max_reg_power = channel->max_reg_power * 4;
 524        arg.channel.max_antenna_gain = channel->max_antenna_gain;
 525
 526        ret = ath10k_wmi_vdev_start(ar, &arg);
 527        if (ret) {
 528                ath10k_warn("Monitor vdev start failed: ret %d\n", ret);
 529                return ret;
 530        }
 531
 532        ret = ath10k_vdev_setup_sync(ar);
 533        if (ret) {
 534                ath10k_warn("Monitor vdev setup failed %d\n", ret);
 535                return ret;
 536        }
 537
 538        ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
 539        if (ret) {
 540                ath10k_warn("Monitor vdev up failed: %d\n", ret);
 541                goto vdev_stop;
 542        }
 543
 544        ar->monitor_vdev_id = vdev_id;
 545        ar->monitor_enabled = true;
 546
 547        return 0;
 548
 549vdev_stop:
 550        ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
 551        if (ret)
 552                ath10k_warn("Monitor vdev stop failed: %d\n", ret);
 553
 554        return ret;
 555}
 556
 557static int ath10k_monitor_stop(struct ath10k *ar)
 558{
 559        int ret = 0;
 560
 561        lockdep_assert_held(&ar->conf_mutex);
 562
 563        /* For some reasons, ath10k_wmi_vdev_down() here couse
 564         * often ath10k_wmi_vdev_stop() to fail. Next we could
 565         * not run monitor vdev and driver reload
 566         * required. Don't see such problems we skip
 567         * ath10k_wmi_vdev_down() here.
 568         */
 569
 570        ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
 571        if (ret)
 572                ath10k_warn("Monitor vdev stop failed: %d\n", ret);
 573
 574        ret = ath10k_vdev_setup_sync(ar);
 575        if (ret)
 576                ath10k_warn("Monitor_down sync failed: %d\n", ret);
 577
 578        ar->monitor_enabled = false;
 579        return ret;
 580}
 581
 582static int ath10k_monitor_create(struct ath10k *ar)
 583{
 584        int bit, ret = 0;
 585
 586        lockdep_assert_held(&ar->conf_mutex);
 587
 588        if (ar->monitor_present) {
 589                ath10k_warn("Monitor mode already enabled\n");
 590                return 0;
 591        }
 592
 593        bit = ffs(ar->free_vdev_map);
 594        if (bit == 0) {
 595                ath10k_warn("No free VDEV slots\n");
 596                return -ENOMEM;
 597        }
 598
 599        ar->monitor_vdev_id = bit - 1;
 600        ar->free_vdev_map &= ~(1 << ar->monitor_vdev_id);
 601
 602        ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id,
 603                                     WMI_VDEV_TYPE_MONITOR,
 604                                     0, ar->mac_addr);
 605        if (ret) {
 606                ath10k_warn("WMI vdev monitor create failed: ret %d\n", ret);
 607                goto vdev_fail;
 608        }
 609
 610        ath10k_dbg(ATH10K_DBG_MAC, "Monitor interface created, vdev id: %d\n",
 611                   ar->monitor_vdev_id);
 612
 613        ar->monitor_present = true;
 614        return 0;
 615
 616vdev_fail:
 617        /*
 618         * Restore the ID to the global map.
 619         */
 620        ar->free_vdev_map |= 1 << (ar->monitor_vdev_id);
 621        return ret;
 622}
 623
 624static int ath10k_monitor_destroy(struct ath10k *ar)
 625{
 626        int ret = 0;
 627
 628        lockdep_assert_held(&ar->conf_mutex);
 629
 630        if (!ar->monitor_present)
 631                return 0;
 632
 633        ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
 634        if (ret) {
 635                ath10k_warn("WMI vdev monitor delete failed: %d\n", ret);
 636                return ret;
 637        }
 638
 639        ar->free_vdev_map |= 1 << (ar->monitor_vdev_id);
 640        ar->monitor_present = false;
 641
 642        ath10k_dbg(ATH10K_DBG_MAC, "Monitor interface destroyed, vdev id: %d\n",
 643                   ar->monitor_vdev_id);
 644        return ret;
 645}
 646
 647static void ath10k_control_beaconing(struct ath10k_vif *arvif,
 648                                struct ieee80211_bss_conf *info)
 649{
 650        int ret = 0;
 651
 652        lockdep_assert_held(&arvif->ar->conf_mutex);
 653
 654        if (!info->enable_beacon) {
 655                ath10k_vdev_stop(arvif);
 656                return;
 657        }
 658
 659        arvif->tx_seq_no = 0x1000;
 660
 661        ret = ath10k_vdev_start(arvif);
 662        if (ret)
 663                return;
 664
 665        ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, 0, info->bssid);
 666        if (ret) {
 667                ath10k_warn("Failed to bring up VDEV: %d\n",
 668                            arvif->vdev_id);
 669                return;
 670        }
 671        ath10k_dbg(ATH10K_DBG_MAC, "VDEV: %d up\n", arvif->vdev_id);
 672}
 673
 674static void ath10k_control_ibss(struct ath10k_vif *arvif,
 675                                struct ieee80211_bss_conf *info,
 676                                const u8 self_peer[ETH_ALEN])
 677{
 678        int ret = 0;
 679
 680        lockdep_assert_held(&arvif->ar->conf_mutex);
 681
 682        if (!info->ibss_joined) {
 683                ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, self_peer);
 684                if (ret)
 685                        ath10k_warn("Failed to delete IBSS self peer:%pM for VDEV:%d ret:%d\n",
 686                                    self_peer, arvif->vdev_id, ret);
 687
 688                if (is_zero_ether_addr(arvif->u.ibss.bssid))
 689                        return;
 690
 691                ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id,
 692                                         arvif->u.ibss.bssid);
 693                if (ret) {
 694                        ath10k_warn("Failed to delete IBSS BSSID peer:%pM for VDEV:%d ret:%d\n",
 695                                    arvif->u.ibss.bssid, arvif->vdev_id, ret);
 696                        return;
 697                }
 698
 699                memset(arvif->u.ibss.bssid, 0, ETH_ALEN);
 700
 701                return;
 702        }
 703
 704        ret = ath10k_peer_create(arvif->ar, arvif->vdev_id, self_peer);
 705        if (ret) {
 706                ath10k_warn("Failed to create IBSS self peer:%pM for VDEV:%d ret:%d\n",
 707                            self_peer, arvif->vdev_id, ret);
 708                return;
 709        }
 710
 711        ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id,
 712                                        WMI_VDEV_PARAM_ATIM_WINDOW,
 713                                        ATH10K_DEFAULT_ATIM);
 714        if (ret)
 715                ath10k_warn("Failed to set IBSS ATIM for VDEV:%d ret:%d\n",
 716                            arvif->vdev_id, ret);
 717}
 718
 719/*
 720 * Review this when mac80211 gains per-interface powersave support.
 721 */
 722static void ath10k_ps_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
 723{
 724        struct ath10k_generic_iter *ar_iter = data;
 725        struct ieee80211_conf *conf = &ar_iter->ar->hw->conf;
 726        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
 727        enum wmi_sta_powersave_param param;
 728        enum wmi_sta_ps_mode psmode;
 729        int ret;
 730
 731        lockdep_assert_held(&arvif->ar->conf_mutex);
 732
 733        if (vif->type != NL80211_IFTYPE_STATION)
 734                return;
 735
 736        if (conf->flags & IEEE80211_CONF_PS) {
 737                psmode = WMI_STA_PS_MODE_ENABLED;
 738                param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
 739
 740                ret = ath10k_wmi_set_sta_ps_param(ar_iter->ar,
 741                                                  arvif->vdev_id,
 742                                                  param,
 743                                                  conf->dynamic_ps_timeout);
 744                if (ret) {
 745                        ath10k_warn("Failed to set inactivity time for VDEV: %d\n",
 746                                    arvif->vdev_id);
 747                        return;
 748                }
 749
 750                ar_iter->ret = ret;
 751        } else {
 752                psmode = WMI_STA_PS_MODE_DISABLED;
 753        }
 754
 755        ar_iter->ret = ath10k_wmi_set_psmode(ar_iter->ar, arvif->vdev_id,
 756                                             psmode);
 757        if (ar_iter->ret)
 758                ath10k_warn("Failed to set PS Mode: %d for VDEV: %d\n",
 759                            psmode, arvif->vdev_id);
 760        else
 761                ath10k_dbg(ATH10K_DBG_MAC, "Set PS Mode: %d for VDEV: %d\n",
 762                           psmode, arvif->vdev_id);
 763}
 764
 765/**********************/
 766/* Station management */
 767/**********************/
 768
 769static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
 770                                      struct ath10k_vif *arvif,
 771                                      struct ieee80211_sta *sta,
 772                                      struct ieee80211_bss_conf *bss_conf,
 773                                      struct wmi_peer_assoc_complete_arg *arg)
 774{
 775        lockdep_assert_held(&ar->conf_mutex);
 776
 777        memcpy(arg->addr, sta->addr, ETH_ALEN);
 778        arg->vdev_id = arvif->vdev_id;
 779        arg->peer_aid = sta->aid;
 780        arg->peer_flags |= WMI_PEER_AUTH;
 781
 782        if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
 783                /*
 784                 * Seems FW have problems with Power Save in STA
 785                 * mode when we setup this parameter to high (eg. 5).
 786                 * Often we see that FW don't send NULL (with clean P flags)
 787                 * frame even there is info about buffered frames in beacons.
 788                 * Sometimes we have to wait more than 10 seconds before FW
 789                 * will wakeup. Often sending one ping from AP to our device
 790                 * just fail (more than 50%).
 791                 *
 792                 * Seems setting this FW parameter to 1 couse FW
 793                 * will check every beacon and will wakup immediately
 794                 * after detection buffered data.
 795                 */
 796                arg->peer_listen_intval = 1;
 797        else
 798                arg->peer_listen_intval = ar->hw->conf.listen_interval;
 799
 800        arg->peer_num_spatial_streams = 1;
 801
 802        /*
 803         * The assoc capabilities are available only in managed mode.
 804         */
 805        if (arvif->vdev_type == WMI_VDEV_TYPE_STA && bss_conf)
 806                arg->peer_caps = bss_conf->assoc_capability;
 807}
 808
 809static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
 810                                       struct ath10k_vif *arvif,
 811                                       struct wmi_peer_assoc_complete_arg *arg)
 812{
 813        struct ieee80211_vif *vif = arvif->vif;
 814        struct ieee80211_bss_conf *info = &vif->bss_conf;
 815        struct cfg80211_bss *bss;
 816        const u8 *rsnie = NULL;
 817        const u8 *wpaie = NULL;
 818
 819        lockdep_assert_held(&ar->conf_mutex);
 820
 821        bss = cfg80211_get_bss(ar->hw->wiphy, ar->hw->conf.chandef.chan,
 822                               info->bssid, NULL, 0, 0, 0);
 823        if (bss) {
 824                const struct cfg80211_bss_ies *ies;
 825
 826                rcu_read_lock();
 827                rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
 828
 829                ies = rcu_dereference(bss->ies);
 830
 831                wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
 832                                WLAN_OUI_TYPE_MICROSOFT_WPA,
 833                                ies->data,
 834                                ies->len);
 835                rcu_read_unlock();
 836                cfg80211_put_bss(ar->hw->wiphy, bss);
 837        }
 838
 839        /* FIXME: base on RSN IE/WPA IE is a correct idea? */
 840        if (rsnie || wpaie) {
 841                ath10k_dbg(ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__);
 842                arg->peer_flags |= WMI_PEER_NEED_PTK_4_WAY;
 843        }
 844
 845        if (wpaie) {
 846                ath10k_dbg(ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__);
 847                arg->peer_flags |= WMI_PEER_NEED_GTK_2_WAY;
 848        }
 849}
 850
 851static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
 852                                      struct ieee80211_sta *sta,
 853                                      struct wmi_peer_assoc_complete_arg *arg)
 854{
 855        struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
 856        const struct ieee80211_supported_band *sband;
 857        const struct ieee80211_rate *rates;
 858        u32 ratemask;
 859        int i;
 860
 861        lockdep_assert_held(&ar->conf_mutex);
 862
 863        sband = ar->hw->wiphy->bands[ar->hw->conf.chandef.chan->band];
 864        ratemask = sta->supp_rates[ar->hw->conf.chandef.chan->band];
 865        rates = sband->bitrates;
 866
 867        rateset->num_rates = 0;
 868
 869        for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
 870                if (!(ratemask & 1))
 871                        continue;
 872
 873                rateset->rates[rateset->num_rates] = rates->hw_value;
 874                rateset->num_rates++;
 875        }
 876}
 877
 878static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
 879                                   struct ieee80211_sta *sta,
 880                                   struct wmi_peer_assoc_complete_arg *arg)
 881{
 882        const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
 883        int smps;
 884        int i, n;
 885
 886        lockdep_assert_held(&ar->conf_mutex);
 887
 888        if (!ht_cap->ht_supported)
 889                return;
 890
 891        arg->peer_flags |= WMI_PEER_HT;
 892        arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
 893                                    ht_cap->ampdu_factor)) - 1;
 894
 895        arg->peer_mpdu_density =
 896                ath10k_parse_mpdudensity(ht_cap->ampdu_density);
 897
 898        arg->peer_ht_caps = ht_cap->cap;
 899        arg->peer_rate_caps |= WMI_RC_HT_FLAG;
 900
 901        if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
 902                arg->peer_flags |= WMI_PEER_LDPC;
 903
 904        if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
 905                arg->peer_flags |= WMI_PEER_40MHZ;
 906                arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
 907        }
 908
 909        if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20)
 910                arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
 911
 912        if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40)
 913                arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
 914
 915        if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
 916                arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG;
 917                arg->peer_flags |= WMI_PEER_STBC;
 918        }
 919
 920        if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
 921                u32 stbc;
 922                stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
 923                stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
 924                stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
 925                arg->peer_rate_caps |= stbc;
 926                arg->peer_flags |= WMI_PEER_STBC;
 927        }
 928
 929        smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
 930        smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
 931
 932        if (smps == WLAN_HT_CAP_SM_PS_STATIC) {
 933                arg->peer_flags |= WMI_PEER_SPATIAL_MUX;
 934                arg->peer_flags |= WMI_PEER_STATIC_MIMOPS;
 935        } else if (smps == WLAN_HT_CAP_SM_PS_DYNAMIC) {
 936                arg->peer_flags |= WMI_PEER_SPATIAL_MUX;
 937                arg->peer_flags |= WMI_PEER_DYN_MIMOPS;
 938        }
 939
 940        if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
 941                arg->peer_rate_caps |= WMI_RC_TS_FLAG;
 942        else if (ht_cap->mcs.rx_mask[1])
 943                arg->peer_rate_caps |= WMI_RC_DS_FLAG;
 944
 945        for (i = 0, n = 0; i < IEEE80211_HT_MCS_MASK_LEN*8; i++)
 946                if (ht_cap->mcs.rx_mask[i/8] & (1 << i%8))
 947                        arg->peer_ht_rates.rates[n++] = i;
 948
 949        arg->peer_ht_rates.num_rates = n;
 950        arg->peer_num_spatial_streams = max((n+7) / 8, 1);
 951
 952        ath10k_dbg(ATH10K_DBG_MAC, "mcs cnt %d nss %d\n",
 953                   arg->peer_ht_rates.num_rates,
 954                   arg->peer_num_spatial_streams);
 955}
 956
 957static void ath10k_peer_assoc_h_qos_ap(struct ath10k *ar,
 958                                       struct ath10k_vif *arvif,
 959                                       struct ieee80211_sta *sta,
 960                                       struct ieee80211_bss_conf *bss_conf,
 961                                       struct wmi_peer_assoc_complete_arg *arg)
 962{
 963        u32 uapsd = 0;
 964        u32 max_sp = 0;
 965
 966        lockdep_assert_held(&ar->conf_mutex);
 967
 968        if (sta->wme)
 969                arg->peer_flags |= WMI_PEER_QOS;
 970
 971        if (sta->wme && sta->uapsd_queues) {
 972                ath10k_dbg(ATH10K_DBG_MAC, "uapsd_queues: 0x%X, max_sp: %d\n",
 973                           sta->uapsd_queues, sta->max_sp);
 974
 975                arg->peer_flags |= WMI_PEER_APSD;
 976                arg->peer_flags |= WMI_RC_UAPSD_FLAG;
 977
 978                if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
 979                        uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
 980                                 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
 981                if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
 982                        uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
 983                                 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
 984                if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
 985                        uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
 986                                 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
 987                if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
 988                        uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
 989                                 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
 990
 991
 992                if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
 993                        max_sp = sta->max_sp;
 994
 995                ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
 996                                           sta->addr,
 997                                           WMI_AP_PS_PEER_PARAM_UAPSD,
 998                                           uapsd);
 999
1000                ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1001                                           sta->addr,
1002                                           WMI_AP_PS_PEER_PARAM_MAX_SP,
1003                                           max_sp);
1004
1005                /* TODO setup this based on STA listen interval and
1006                   beacon interval. Currently we don't know
1007                   sta->listen_interval - mac80211 patch required.
1008                   Currently use 10 seconds */
1009                ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1010                                           sta->addr,
1011                                           WMI_AP_PS_PEER_PARAM_AGEOUT_TIME,
1012                                           10);
1013        }
1014}
1015
1016static void ath10k_peer_assoc_h_qos_sta(struct ath10k *ar,
1017                                        struct ath10k_vif *arvif,
1018                                        struct ieee80211_sta *sta,
1019                                        struct ieee80211_bss_conf *bss_conf,
1020                                        struct wmi_peer_assoc_complete_arg *arg)
1021{
1022        if (bss_conf->qos)
1023                arg->peer_flags |= WMI_PEER_QOS;
1024}
1025
1026static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
1027                                    struct ieee80211_sta *sta,
1028                                    struct wmi_peer_assoc_complete_arg *arg)
1029{
1030        const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
1031
1032        if (!vht_cap->vht_supported)
1033                return;
1034
1035        arg->peer_flags |= WMI_PEER_VHT;
1036
1037        arg->peer_vht_caps = vht_cap->cap;
1038
1039        if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1040                arg->peer_flags |= WMI_PEER_80MHZ;
1041
1042        arg->peer_vht_rates.rx_max_rate =
1043                __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
1044        arg->peer_vht_rates.rx_mcs_set =
1045                __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
1046        arg->peer_vht_rates.tx_max_rate =
1047                __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
1048        arg->peer_vht_rates.tx_mcs_set =
1049                __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map);
1050
1051        ath10k_dbg(ATH10K_DBG_MAC, "mac vht peer\n");
1052}
1053
1054static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
1055                                    struct ath10k_vif *arvif,
1056                                    struct ieee80211_sta *sta,
1057                                    struct ieee80211_bss_conf *bss_conf,
1058                                    struct wmi_peer_assoc_complete_arg *arg)
1059{
1060        switch (arvif->vdev_type) {
1061        case WMI_VDEV_TYPE_AP:
1062                ath10k_peer_assoc_h_qos_ap(ar, arvif, sta, bss_conf, arg);
1063                break;
1064        case WMI_VDEV_TYPE_STA:
1065                ath10k_peer_assoc_h_qos_sta(ar, arvif, sta, bss_conf, arg);
1066                break;
1067        default:
1068                break;
1069        }
1070}
1071
1072static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
1073                                        struct ath10k_vif *arvif,
1074                                        struct ieee80211_sta *sta,
1075                                        struct wmi_peer_assoc_complete_arg *arg)
1076{
1077        enum wmi_phy_mode phymode = MODE_UNKNOWN;
1078
1079        /* FIXME: add VHT */
1080
1081        switch (ar->hw->conf.chandef.chan->band) {
1082        case IEEE80211_BAND_2GHZ:
1083                if (sta->ht_cap.ht_supported) {
1084                        if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1085                                phymode = MODE_11NG_HT40;
1086                        else
1087                                phymode = MODE_11NG_HT20;
1088                } else {
1089                        phymode = MODE_11G;
1090                }
1091
1092                break;
1093        case IEEE80211_BAND_5GHZ:
1094                if (sta->ht_cap.ht_supported) {
1095                        if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1096                                phymode = MODE_11NA_HT40;
1097                        else
1098                                phymode = MODE_11NA_HT20;
1099                } else {
1100                        phymode = MODE_11A;
1101                }
1102
1103                break;
1104        default:
1105                break;
1106        }
1107
1108        arg->peer_phymode = phymode;
1109        WARN_ON(phymode == MODE_UNKNOWN);
1110}
1111
1112static int ath10k_peer_assoc(struct ath10k *ar,
1113                             struct ath10k_vif *arvif,
1114                             struct ieee80211_sta *sta,
1115                             struct ieee80211_bss_conf *bss_conf)
1116{
1117        struct wmi_peer_assoc_complete_arg arg;
1118
1119        lockdep_assert_held(&ar->conf_mutex);
1120
1121        memset(&arg, 0, sizeof(struct wmi_peer_assoc_complete_arg));
1122
1123        ath10k_peer_assoc_h_basic(ar, arvif, sta, bss_conf, &arg);
1124        ath10k_peer_assoc_h_crypto(ar, arvif, &arg);
1125        ath10k_peer_assoc_h_rates(ar, sta, &arg);
1126        ath10k_peer_assoc_h_ht(ar, sta, &arg);
1127        ath10k_peer_assoc_h_vht(ar, sta, &arg);
1128        ath10k_peer_assoc_h_qos(ar, arvif, sta, bss_conf, &arg);
1129        ath10k_peer_assoc_h_phymode(ar, arvif, sta, &arg);
1130
1131        return ath10k_wmi_peer_assoc(ar, &arg);
1132}
1133
1134/* can be called only in mac80211 callbacks due to `key_count` usage */
1135static void ath10k_bss_assoc(struct ieee80211_hw *hw,
1136                             struct ieee80211_vif *vif,
1137                             struct ieee80211_bss_conf *bss_conf)
1138{
1139        struct ath10k *ar = hw->priv;
1140        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1141        struct ieee80211_sta *ap_sta;
1142        int ret;
1143
1144        lockdep_assert_held(&ar->conf_mutex);
1145
1146        rcu_read_lock();
1147
1148        ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
1149        if (!ap_sta) {
1150                ath10k_warn("Failed to find station entry for %pM\n",
1151                            bss_conf->bssid);
1152                rcu_read_unlock();
1153                return;
1154        }
1155
1156        ret = ath10k_peer_assoc(ar, arvif, ap_sta, bss_conf);
1157        if (ret) {
1158                ath10k_warn("Peer assoc failed for %pM\n", bss_conf->bssid);
1159                rcu_read_unlock();
1160                return;
1161        }
1162
1163        rcu_read_unlock();
1164
1165        ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, bss_conf->aid,
1166                                 bss_conf->bssid);
1167        if (ret)
1168                ath10k_warn("VDEV: %d up failed: ret %d\n",
1169                            arvif->vdev_id, ret);
1170        else
1171                ath10k_dbg(ATH10K_DBG_MAC,
1172                           "VDEV: %d associated, BSSID: %pM, AID: %d\n",
1173                           arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
1174}
1175
1176/*
1177 * FIXME: flush TIDs
1178 */
1179static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
1180                                struct ieee80211_vif *vif)
1181{
1182        struct ath10k *ar = hw->priv;
1183        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1184        int ret;
1185
1186        lockdep_assert_held(&ar->conf_mutex);
1187
1188        /*
1189         * For some reason, calling VDEV-DOWN before VDEV-STOP
1190         * makes the FW to send frames via HTT after disassociation.
1191         * No idea why this happens, even though VDEV-DOWN is supposed
1192         * to be analogous to link down, so just stop the VDEV.
1193         */
1194        ret = ath10k_vdev_stop(arvif);
1195        if (!ret)
1196                ath10k_dbg(ATH10K_DBG_MAC, "VDEV: %d stopped\n",
1197                           arvif->vdev_id);
1198
1199        /*
1200         * If we don't call VDEV-DOWN after VDEV-STOP FW will remain active and
1201         * report beacons from previously associated network through HTT.
1202         * This in turn would spam mac80211 WARN_ON if we bring down all
1203         * interfaces as it expects there is no rx when no interface is
1204         * running.
1205         */
1206        ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1207        if (ret)
1208                ath10k_dbg(ATH10K_DBG_MAC, "VDEV: %d ath10k_wmi_vdev_down failed (%d)\n",
1209                           arvif->vdev_id, ret);
1210
1211        ath10k_wmi_flush_tx(ar);
1212
1213        arvif->def_wep_key_index = 0;
1214}
1215
1216static int ath10k_station_assoc(struct ath10k *ar, struct ath10k_vif *arvif,
1217                                struct ieee80211_sta *sta)
1218{
1219        int ret = 0;
1220
1221        lockdep_assert_held(&ar->conf_mutex);
1222
1223        ret = ath10k_peer_assoc(ar, arvif, sta, NULL);
1224        if (ret) {
1225                ath10k_warn("WMI peer assoc failed for %pM\n", sta->addr);
1226                return ret;
1227        }
1228
1229        ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
1230        if (ret) {
1231                ath10k_warn("could not install peer wep keys (%d)\n", ret);
1232                return ret;
1233        }
1234
1235        return ret;
1236}
1237
1238static int ath10k_station_disassoc(struct ath10k *ar, struct ath10k_vif *arvif,
1239                                   struct ieee80211_sta *sta)
1240{
1241        int ret = 0;
1242
1243        lockdep_assert_held(&ar->conf_mutex);
1244
1245        ret = ath10k_clear_peer_keys(arvif, sta->addr);
1246        if (ret) {
1247                ath10k_warn("could not clear all peer wep keys (%d)\n", ret);
1248                return ret;
1249        }
1250
1251        return ret;
1252}
1253
1254/**************/
1255/* Regulatory */
1256/**************/
1257
1258static int ath10k_update_channel_list(struct ath10k *ar)
1259{
1260        struct ieee80211_hw *hw = ar->hw;
1261        struct ieee80211_supported_band **bands;
1262        enum ieee80211_band band;
1263        struct ieee80211_channel *channel;
1264        struct wmi_scan_chan_list_arg arg = {0};
1265        struct wmi_channel_arg *ch;
1266        bool passive;
1267        int len;
1268        int ret;
1269        int i;
1270
1271        lockdep_assert_held(&ar->conf_mutex);
1272
1273        bands = hw->wiphy->bands;
1274        for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1275                if (!bands[band])
1276                        continue;
1277
1278                for (i = 0; i < bands[band]->n_channels; i++) {
1279                        if (bands[band]->channels[i].flags &
1280                            IEEE80211_CHAN_DISABLED)
1281                                continue;
1282
1283                        arg.n_channels++;
1284                }
1285        }
1286
1287        len = sizeof(struct wmi_channel_arg) * arg.n_channels;
1288        arg.channels = kzalloc(len, GFP_KERNEL);
1289        if (!arg.channels)
1290                return -ENOMEM;
1291
1292        ch = arg.channels;
1293        for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1294                if (!bands[band])
1295                        continue;
1296
1297                for (i = 0; i < bands[band]->n_channels; i++) {
1298                        channel = &bands[band]->channels[i];
1299
1300                        if (channel->flags & IEEE80211_CHAN_DISABLED)
1301                                continue;
1302
1303                        ch->allow_ht   = true;
1304
1305                        /* FIXME: when should we really allow VHT? */
1306                        ch->allow_vht = true;
1307
1308                        ch->allow_ibss =
1309                                !(channel->flags & IEEE80211_CHAN_NO_IBSS);
1310
1311                        ch->ht40plus =
1312                                !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
1313
1314                        passive = channel->flags & IEEE80211_CHAN_PASSIVE_SCAN;
1315                        ch->passive = passive;
1316
1317                        ch->freq = channel->center_freq;
1318                        ch->min_power = channel->max_power * 3;
1319                        ch->max_power = channel->max_power * 4;
1320                        ch->max_reg_power = channel->max_reg_power * 4;
1321                        ch->max_antenna_gain = channel->max_antenna_gain;
1322                        ch->reg_class_id = 0; /* FIXME */
1323
1324                        /* FIXME: why use only legacy modes, why not any
1325                         * HT/VHT modes? Would that even make any
1326                         * difference? */
1327                        if (channel->band == IEEE80211_BAND_2GHZ)
1328                                ch->mode = MODE_11G;
1329                        else
1330                                ch->mode = MODE_11A;
1331
1332                        if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
1333                                continue;
1334
1335                        ath10k_dbg(ATH10K_DBG_WMI,
1336                                   "%s: [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
1337                                   __func__, ch - arg.channels, arg.n_channels,
1338                                   ch->freq, ch->max_power, ch->max_reg_power,
1339                                   ch->max_antenna_gain, ch->mode);
1340
1341                        ch++;
1342                }
1343        }
1344
1345        ret = ath10k_wmi_scan_chan_list(ar, &arg);
1346        kfree(arg.channels);
1347
1348        return ret;
1349}
1350
1351static void ath10k_regd_update(struct ath10k *ar)
1352{
1353        struct reg_dmn_pair_mapping *regpair;
1354        int ret;
1355
1356        lockdep_assert_held(&ar->conf_mutex);
1357
1358        ret = ath10k_update_channel_list(ar);
1359        if (ret)
1360                ath10k_warn("could not update channel list (%d)\n", ret);
1361
1362        regpair = ar->ath_common.regulatory.regpair;
1363
1364        /* Target allows setting up per-band regdomain but ath_common provides
1365         * a combined one only */
1366        ret = ath10k_wmi_pdev_set_regdomain(ar,
1367                                            regpair->regDmnEnum,
1368                                            regpair->regDmnEnum, /* 2ghz */
1369                                            regpair->regDmnEnum, /* 5ghz */
1370                                            regpair->reg_2ghz_ctl,
1371                                            regpair->reg_5ghz_ctl);
1372        if (ret)
1373                ath10k_warn("could not set pdev regdomain (%d)\n", ret);
1374}
1375
1376static void ath10k_reg_notifier(struct wiphy *wiphy,
1377                                struct regulatory_request *request)
1378{
1379        struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
1380        struct ath10k *ar = hw->priv;
1381
1382        ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
1383
1384        mutex_lock(&ar->conf_mutex);
1385        if (ar->state == ATH10K_STATE_ON)
1386                ath10k_regd_update(ar);
1387        mutex_unlock(&ar->conf_mutex);
1388}
1389
1390/***************/
1391/* TX handlers */
1392/***************/
1393
1394/*
1395 * Frames sent to the FW have to be in "Native Wifi" format.
1396 * Strip the QoS field from the 802.11 header.
1397 */
1398static void ath10k_tx_h_qos_workaround(struct ieee80211_hw *hw,
1399                                       struct ieee80211_tx_control *control,
1400                                       struct sk_buff *skb)
1401{
1402        struct ieee80211_hdr *hdr = (void *)skb->data;
1403        u8 *qos_ctl;
1404
1405        if (!ieee80211_is_data_qos(hdr->frame_control))
1406                return;
1407
1408        qos_ctl = ieee80211_get_qos_ctl(hdr);
1409        memmove(skb->data + IEEE80211_QOS_CTL_LEN,
1410                skb->data, (void *)qos_ctl - (void *)skb->data);
1411        skb_pull(skb, IEEE80211_QOS_CTL_LEN);
1412}
1413
1414static void ath10k_tx_h_update_wep_key(struct sk_buff *skb)
1415{
1416        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1417        struct ieee80211_vif *vif = info->control.vif;
1418        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1419        struct ath10k *ar = arvif->ar;
1420        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1421        struct ieee80211_key_conf *key = info->control.hw_key;
1422        int ret;
1423
1424        /* TODO AP mode should be implemented */
1425        if (vif->type != NL80211_IFTYPE_STATION)
1426                return;
1427
1428        if (!ieee80211_has_protected(hdr->frame_control))
1429                return;
1430
1431        if (!key)
1432                return;
1433
1434        if (key->cipher != WLAN_CIPHER_SUITE_WEP40 &&
1435            key->cipher != WLAN_CIPHER_SUITE_WEP104)
1436                return;
1437
1438        if (key->keyidx == arvif->def_wep_key_index)
1439                return;
1440
1441        ath10k_dbg(ATH10K_DBG_MAC, "new wep keyidx will be %d\n", key->keyidx);
1442
1443        ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
1444                                        WMI_VDEV_PARAM_DEF_KEYID,
1445                                        key->keyidx);
1446        if (ret) {
1447                ath10k_warn("could not update wep keyidx (%d)\n", ret);
1448                return;
1449        }
1450
1451        arvif->def_wep_key_index = key->keyidx;
1452}
1453
1454static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar, struct sk_buff *skb)
1455{
1456        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1457        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1458        struct ieee80211_vif *vif = info->control.vif;
1459        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1460
1461        /* This is case only for P2P_GO */
1462        if (arvif->vdev_type != WMI_VDEV_TYPE_AP ||
1463            arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
1464                return;
1465
1466        if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
1467                spin_lock_bh(&ar->data_lock);
1468                if (arvif->u.ap.noa_data)
1469                        if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
1470                                              GFP_ATOMIC))
1471                                memcpy(skb_put(skb, arvif->u.ap.noa_len),
1472                                       arvif->u.ap.noa_data,
1473                                       arvif->u.ap.noa_len);
1474                spin_unlock_bh(&ar->data_lock);
1475        }
1476}
1477
1478static void ath10k_tx_htt(struct ath10k *ar, struct sk_buff *skb)
1479{
1480        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1481        int ret;
1482
1483        if (ieee80211_is_mgmt(hdr->frame_control))
1484                ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
1485        else if (ieee80211_is_nullfunc(hdr->frame_control))
1486                /* FW does not report tx status properly for NullFunc frames
1487                 * unless they are sent through mgmt tx path. mac80211 sends
1488                 * those frames when it detects link/beacon loss and depends on
1489                 * the tx status to be correct. */
1490                ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
1491        else
1492                ret = ath10k_htt_tx(&ar->htt, skb);
1493
1494        if (ret) {
1495                ath10k_warn("tx failed (%d). dropping packet.\n", ret);
1496                ieee80211_free_txskb(ar->hw, skb);
1497        }
1498}
1499
1500void ath10k_offchan_tx_purge(struct ath10k *ar)
1501{
1502        struct sk_buff *skb;
1503
1504        for (;;) {
1505                skb = skb_dequeue(&ar->offchan_tx_queue);
1506                if (!skb)
1507                        break;
1508
1509                ieee80211_free_txskb(ar->hw, skb);
1510        }
1511}
1512
1513void ath10k_offchan_tx_work(struct work_struct *work)
1514{
1515        struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
1516        struct ath10k_peer *peer;
1517        struct ieee80211_hdr *hdr;
1518        struct sk_buff *skb;
1519        const u8 *peer_addr;
1520        int vdev_id;
1521        int ret;
1522
1523        /* FW requirement: We must create a peer before FW will send out
1524         * an offchannel frame. Otherwise the frame will be stuck and
1525         * never transmitted. We delete the peer upon tx completion.
1526         * It is unlikely that a peer for offchannel tx will already be
1527         * present. However it may be in some rare cases so account for that.
1528         * Otherwise we might remove a legitimate peer and break stuff. */
1529
1530        for (;;) {
1531                skb = skb_dequeue(&ar->offchan_tx_queue);
1532                if (!skb)
1533                        break;
1534
1535                mutex_lock(&ar->conf_mutex);
1536
1537                ath10k_dbg(ATH10K_DBG_MAC, "processing offchannel skb %p\n",
1538                           skb);
1539
1540                hdr = (struct ieee80211_hdr *)skb->data;
1541                peer_addr = ieee80211_get_DA(hdr);
1542                vdev_id = ATH10K_SKB_CB(skb)->htt.vdev_id;
1543
1544                spin_lock_bh(&ar->data_lock);
1545                peer = ath10k_peer_find(ar, vdev_id, peer_addr);
1546                spin_unlock_bh(&ar->data_lock);
1547
1548                if (peer)
1549                        ath10k_dbg(ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n",
1550                                   peer_addr, vdev_id);
1551
1552                if (!peer) {
1553                        ret = ath10k_peer_create(ar, vdev_id, peer_addr);
1554                        if (ret)
1555                                ath10k_warn("peer %pM on vdev %d not created (%d)\n",
1556                                            peer_addr, vdev_id, ret);
1557                }
1558
1559                spin_lock_bh(&ar->data_lock);
1560                INIT_COMPLETION(ar->offchan_tx_completed);
1561                ar->offchan_tx_skb = skb;
1562                spin_unlock_bh(&ar->data_lock);
1563
1564                ath10k_tx_htt(ar, skb);
1565
1566                ret = wait_for_completion_timeout(&ar->offchan_tx_completed,
1567                                                  3 * HZ);
1568                if (ret <= 0)
1569                        ath10k_warn("timed out waiting for offchannel skb %p\n",
1570                                    skb);
1571
1572                if (!peer) {
1573                        ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
1574                        if (ret)
1575                                ath10k_warn("peer %pM on vdev %d not deleted (%d)\n",
1576                                            peer_addr, vdev_id, ret);
1577                }
1578
1579                mutex_unlock(&ar->conf_mutex);
1580        }
1581}
1582
1583/************/
1584/* Scanning */
1585/************/
1586
1587/*
1588 * This gets called if we dont get a heart-beat during scan.
1589 * This may indicate the FW has hung and we need to abort the
1590 * scan manually to prevent cancel_hw_scan() from deadlocking
1591 */
1592void ath10k_reset_scan(unsigned long ptr)
1593{
1594        struct ath10k *ar = (struct ath10k *)ptr;
1595
1596        spin_lock_bh(&ar->data_lock);
1597        if (!ar->scan.in_progress) {
1598                spin_unlock_bh(&ar->data_lock);
1599                return;
1600        }
1601
1602        ath10k_warn("scan timeout. resetting. fw issue?\n");
1603
1604        if (ar->scan.is_roc)
1605                ieee80211_remain_on_channel_expired(ar->hw);
1606        else
1607                ieee80211_scan_completed(ar->hw, 1 /* aborted */);
1608
1609        ar->scan.in_progress = false;
1610        complete_all(&ar->scan.completed);
1611        spin_unlock_bh(&ar->data_lock);
1612}
1613
1614static int ath10k_abort_scan(struct ath10k *ar)
1615{
1616        struct wmi_stop_scan_arg arg = {
1617                .req_id = 1, /* FIXME */
1618                .req_type = WMI_SCAN_STOP_ONE,
1619                .u.scan_id = ATH10K_SCAN_ID,
1620        };
1621        int ret;
1622
1623        lockdep_assert_held(&ar->conf_mutex);
1624
1625        del_timer_sync(&ar->scan.timeout);
1626
1627        spin_lock_bh(&ar->data_lock);
1628        if (!ar->scan.in_progress) {
1629                spin_unlock_bh(&ar->data_lock);
1630                return 0;
1631        }
1632
1633        ar->scan.aborting = true;
1634        spin_unlock_bh(&ar->data_lock);
1635
1636        ret = ath10k_wmi_stop_scan(ar, &arg);
1637        if (ret) {
1638                ath10k_warn("could not submit wmi stop scan (%d)\n", ret);
1639                spin_lock_bh(&ar->data_lock);
1640                ar->scan.in_progress = false;
1641                ath10k_offchan_tx_purge(ar);
1642                spin_unlock_bh(&ar->data_lock);
1643                return -EIO;
1644        }
1645
1646        ath10k_wmi_flush_tx(ar);
1647
1648        ret = wait_for_completion_timeout(&ar->scan.completed, 3*HZ);
1649        if (ret == 0)
1650                ath10k_warn("timed out while waiting for scan to stop\n");
1651
1652        /* scan completion may be done right after we timeout here, so let's
1653         * check the in_progress and tell mac80211 scan is completed. if we
1654         * don't do that and FW fails to send us scan completion indication
1655         * then userspace won't be able to scan anymore */
1656        ret = 0;
1657
1658        spin_lock_bh(&ar->data_lock);
1659        if (ar->scan.in_progress) {
1660                ath10k_warn("could not stop scan. its still in progress\n");
1661                ar->scan.in_progress = false;
1662                ath10k_offchan_tx_purge(ar);
1663                ret = -ETIMEDOUT;
1664        }
1665        spin_unlock_bh(&ar->data_lock);
1666
1667        return ret;
1668}
1669
1670static int ath10k_start_scan(struct ath10k *ar,
1671                             const struct wmi_start_scan_arg *arg)
1672{
1673        int ret;
1674
1675        lockdep_assert_held(&ar->conf_mutex);
1676
1677        ret = ath10k_wmi_start_scan(ar, arg);
1678        if (ret)
1679                return ret;
1680
1681        /* make sure we submit the command so the completion
1682        * timeout makes sense */
1683        ath10k_wmi_flush_tx(ar);
1684
1685        ret = wait_for_completion_timeout(&ar->scan.started, 1*HZ);
1686        if (ret == 0) {
1687                ath10k_abort_scan(ar);
1688                return ret;
1689        }
1690
1691        /* the scan can complete earlier, before we even
1692         * start the timer. in that case the timer handler
1693         * checks ar->scan.in_progress and bails out if its
1694         * false. Add a 200ms margin to account event/command
1695         * processing. */
1696        mod_timer(&ar->scan.timeout, jiffies +
1697                  msecs_to_jiffies(arg->max_scan_time+200));
1698        return 0;
1699}
1700
1701/**********************/
1702/* mac80211 callbacks */
1703/**********************/
1704
1705static void ath10k_tx(struct ieee80211_hw *hw,
1706                      struct ieee80211_tx_control *control,
1707                      struct sk_buff *skb)
1708{
1709        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1710        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1711        struct ath10k *ar = hw->priv;
1712        struct ath10k_vif *arvif = NULL;
1713        u32 vdev_id = 0;
1714        u8 tid;
1715
1716        if (info->control.vif) {
1717                arvif = ath10k_vif_to_arvif(info->control.vif);
1718                vdev_id = arvif->vdev_id;
1719        } else if (ar->monitor_enabled) {
1720                vdev_id = ar->monitor_vdev_id;
1721        }
1722
1723        /* We should disable CCK RATE due to P2P */
1724        if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
1725                ath10k_dbg(ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
1726
1727        /* we must calculate tid before we apply qos workaround
1728         * as we'd lose the qos control field */
1729        tid = HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1730        if (ieee80211_is_data_qos(hdr->frame_control) &&
1731            is_unicast_ether_addr(ieee80211_get_DA(hdr))) {
1732                u8 *qc = ieee80211_get_qos_ctl(hdr);
1733                tid = qc[0] & IEEE80211_QOS_CTL_TID_MASK;
1734        }
1735
1736        /* it makes no sense to process injected frames like that */
1737        if (info->control.vif &&
1738            info->control.vif->type != NL80211_IFTYPE_MONITOR) {
1739                ath10k_tx_h_qos_workaround(hw, control, skb);
1740                ath10k_tx_h_update_wep_key(skb);
1741                ath10k_tx_h_add_p2p_noa_ie(ar, skb);
1742                ath10k_tx_h_seq_no(skb);
1743        }
1744
1745        memset(ATH10K_SKB_CB(skb), 0, sizeof(*ATH10K_SKB_CB(skb)));
1746        ATH10K_SKB_CB(skb)->htt.vdev_id = vdev_id;
1747        ATH10K_SKB_CB(skb)->htt.tid = tid;
1748
1749        if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
1750                spin_lock_bh(&ar->data_lock);
1751                ATH10K_SKB_CB(skb)->htt.is_offchan = true;
1752                ATH10K_SKB_CB(skb)->htt.vdev_id = ar->scan.vdev_id;
1753                spin_unlock_bh(&ar->data_lock);
1754
1755                ath10k_dbg(ATH10K_DBG_MAC, "queued offchannel skb %p\n", skb);
1756
1757                skb_queue_tail(&ar->offchan_tx_queue, skb);
1758                ieee80211_queue_work(hw, &ar->offchan_tx_work);
1759                return;
1760        }
1761
1762        ath10k_tx_htt(ar, skb);
1763}
1764
1765/*
1766 * Initialize various parameters with default vaules.
1767 */
1768void ath10k_halt(struct ath10k *ar)
1769{
1770        lockdep_assert_held(&ar->conf_mutex);
1771
1772        del_timer_sync(&ar->scan.timeout);
1773        ath10k_offchan_tx_purge(ar);
1774        ath10k_peer_cleanup_all(ar);
1775        ath10k_core_stop(ar);
1776        ath10k_hif_power_down(ar);
1777
1778        spin_lock_bh(&ar->data_lock);
1779        if (ar->scan.in_progress) {
1780                del_timer(&ar->scan.timeout);
1781                ar->scan.in_progress = false;
1782                ieee80211_scan_completed(ar->hw, true);
1783        }
1784        spin_unlock_bh(&ar->data_lock);
1785}
1786
1787static int ath10k_start(struct ieee80211_hw *hw)
1788{
1789        struct ath10k *ar = hw->priv;
1790        int ret = 0;
1791
1792        mutex_lock(&ar->conf_mutex);
1793
1794        if (ar->state != ATH10K_STATE_OFF &&
1795            ar->state != ATH10K_STATE_RESTARTING) {
1796                ret = -EINVAL;
1797                goto exit;
1798        }
1799
1800        ret = ath10k_hif_power_up(ar);
1801        if (ret) {
1802                ath10k_err("could not init hif (%d)\n", ret);
1803                ar->state = ATH10K_STATE_OFF;
1804                goto exit;
1805        }
1806
1807        ret = ath10k_core_start(ar);
1808        if (ret) {
1809                ath10k_err("could not init core (%d)\n", ret);
1810                ath10k_hif_power_down(ar);
1811                ar->state = ATH10K_STATE_OFF;
1812                goto exit;
1813        }
1814
1815        if (ar->state == ATH10K_STATE_OFF)
1816                ar->state = ATH10K_STATE_ON;
1817        else if (ar->state == ATH10K_STATE_RESTARTING)
1818                ar->state = ATH10K_STATE_RESTARTED;
1819
1820        ret = ath10k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS, 1);
1821        if (ret)
1822                ath10k_warn("could not enable WMI_PDEV_PARAM_PMF_QOS (%d)\n",
1823                            ret);
1824
1825        ret = ath10k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 0);
1826        if (ret)
1827                ath10k_warn("could not init WMI_PDEV_PARAM_DYNAMIC_BW (%d)\n",
1828                            ret);
1829
1830        ath10k_regd_update(ar);
1831
1832exit:
1833        mutex_unlock(&ar->conf_mutex);
1834        return 0;
1835}
1836
1837static void ath10k_stop(struct ieee80211_hw *hw)
1838{
1839        struct ath10k *ar = hw->priv;
1840
1841        mutex_lock(&ar->conf_mutex);
1842        if (ar->state == ATH10K_STATE_ON ||
1843            ar->state == ATH10K_STATE_RESTARTED ||
1844            ar->state == ATH10K_STATE_WEDGED)
1845                ath10k_halt(ar);
1846
1847        ar->state = ATH10K_STATE_OFF;
1848        mutex_unlock(&ar->conf_mutex);
1849
1850        cancel_work_sync(&ar->offchan_tx_work);
1851        cancel_work_sync(&ar->restart_work);
1852}
1853
1854static void ath10k_config_ps(struct ath10k *ar)
1855{
1856        struct ath10k_generic_iter ar_iter;
1857
1858        lockdep_assert_held(&ar->conf_mutex);
1859
1860        /* During HW reconfiguration mac80211 reports all interfaces that were
1861         * running until reconfiguration was started. Since FW doesn't have any
1862         * vdevs at this point we must not iterate over this interface list.
1863         * This setting will be updated upon add_interface(). */
1864        if (ar->state == ATH10K_STATE_RESTARTED)
1865                return;
1866
1867        memset(&ar_iter, 0, sizeof(struct ath10k_generic_iter));
1868        ar_iter.ar = ar;
1869
1870        ieee80211_iterate_active_interfaces_atomic(
1871                ar->hw, IEEE80211_IFACE_ITER_NORMAL,
1872                ath10k_ps_iter, &ar_iter);
1873
1874        if (ar_iter.ret)
1875                ath10k_warn("failed to set ps config (%d)\n", ar_iter.ret);
1876}
1877
1878static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
1879{
1880        struct ath10k *ar = hw->priv;
1881        struct ieee80211_conf *conf = &hw->conf;
1882        int ret = 0;
1883
1884        mutex_lock(&ar->conf_mutex);
1885
1886        if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
1887                ath10k_dbg(ATH10K_DBG_MAC, "Config channel %d mhz\n",
1888                           conf->chandef.chan->center_freq);
1889                spin_lock_bh(&ar->data_lock);
1890                ar->rx_channel = conf->chandef.chan;
1891                spin_unlock_bh(&ar->data_lock);
1892        }
1893
1894        if (changed & IEEE80211_CONF_CHANGE_PS)
1895                ath10k_config_ps(ar);
1896
1897        if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
1898                if (conf->flags & IEEE80211_CONF_MONITOR)
1899                        ret = ath10k_monitor_create(ar);
1900                else
1901                        ret = ath10k_monitor_destroy(ar);
1902        }
1903
1904        ath10k_wmi_flush_tx(ar);
1905        mutex_unlock(&ar->conf_mutex);
1906        return ret;
1907}
1908
1909/*
1910 * TODO:
1911 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
1912 * because we will send mgmt frames without CCK. This requirement
1913 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
1914 * in the TX packet.
1915 */
1916static int ath10k_add_interface(struct ieee80211_hw *hw,
1917                                struct ieee80211_vif *vif)
1918{
1919        struct ath10k *ar = hw->priv;
1920        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1921        enum wmi_sta_powersave_param param;
1922        int ret = 0;
1923        u32 value;
1924        int bit;
1925
1926        mutex_lock(&ar->conf_mutex);
1927
1928        memset(arvif, 0, sizeof(*arvif));
1929
1930        arvif->ar = ar;
1931        arvif->vif = vif;
1932
1933        if ((vif->type == NL80211_IFTYPE_MONITOR) && ar->monitor_present) {
1934                ath10k_warn("Only one monitor interface allowed\n");
1935                ret = -EBUSY;
1936                goto exit;
1937        }
1938
1939        bit = ffs(ar->free_vdev_map);
1940        if (bit == 0) {
1941                ret = -EBUSY;
1942                goto exit;
1943        }
1944
1945        arvif->vdev_id = bit - 1;
1946        arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
1947        ar->free_vdev_map &= ~(1 << arvif->vdev_id);
1948
1949        if (ar->p2p)
1950                arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
1951
1952        switch (vif->type) {
1953        case NL80211_IFTYPE_UNSPECIFIED:
1954        case NL80211_IFTYPE_STATION:
1955                arvif->vdev_type = WMI_VDEV_TYPE_STA;
1956                if (vif->p2p)
1957                        arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
1958                break;
1959        case NL80211_IFTYPE_ADHOC:
1960                arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
1961                break;
1962        case NL80211_IFTYPE_AP:
1963                arvif->vdev_type = WMI_VDEV_TYPE_AP;
1964
1965                if (vif->p2p)
1966                        arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
1967                break;
1968        case NL80211_IFTYPE_MONITOR:
1969                arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
1970                break;
1971        default:
1972                WARN_ON(1);
1973                break;
1974        }
1975
1976        ath10k_dbg(ATH10K_DBG_MAC, "Add interface: id %d type %d subtype %d\n",
1977                   arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype);
1978
1979        ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
1980                                     arvif->vdev_subtype, vif->addr);
1981        if (ret) {
1982                ath10k_warn("WMI vdev create failed: ret %d\n", ret);
1983                goto exit;
1984        }
1985
1986        ret = ath10k_wmi_vdev_set_param(ar, 0, WMI_VDEV_PARAM_DEF_KEYID,
1987                                        arvif->def_wep_key_index);
1988        if (ret)
1989                ath10k_warn("Failed to set default keyid: %d\n", ret);
1990
1991        ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
1992                                        WMI_VDEV_PARAM_TX_ENCAP_TYPE,
1993                                        ATH10K_HW_TXRX_NATIVE_WIFI);
1994        if (ret)
1995                ath10k_warn("Failed to set TX encap: %d\n", ret);
1996
1997        if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
1998                ret = ath10k_peer_create(ar, arvif->vdev_id, vif->addr);
1999                if (ret) {
2000                        ath10k_warn("Failed to create peer for AP: %d\n", ret);
2001                        goto exit;
2002                }
2003        }
2004
2005        if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
2006                param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
2007                value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
2008                ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2009                                                  param, value);
2010                if (ret)
2011                        ath10k_warn("Failed to set RX wake policy: %d\n", ret);
2012
2013                param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
2014                value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
2015                ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2016                                                  param, value);
2017                if (ret)
2018                        ath10k_warn("Failed to set TX wake thresh: %d\n", ret);
2019
2020                param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
2021                value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
2022                ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2023                                                  param, value);
2024                if (ret)
2025                        ath10k_warn("Failed to set PSPOLL count: %d\n", ret);
2026        }
2027
2028        ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
2029        if (ret)
2030                ath10k_warn("failed to set rts threshold for vdev %d (%d)\n",
2031                            arvif->vdev_id, ret);
2032
2033        ret = ath10k_mac_set_frag(arvif, ar->hw->wiphy->frag_threshold);
2034        if (ret)
2035                ath10k_warn("failed to set frag threshold for vdev %d (%d)\n",
2036                            arvif->vdev_id, ret);
2037
2038        if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2039                ar->monitor_present = true;
2040
2041exit:
2042        mutex_unlock(&ar->conf_mutex);
2043        return ret;
2044}
2045
2046static void ath10k_remove_interface(struct ieee80211_hw *hw,
2047                                    struct ieee80211_vif *vif)
2048{
2049        struct ath10k *ar = hw->priv;
2050        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2051        int ret;
2052
2053        mutex_lock(&ar->conf_mutex);
2054
2055        ath10k_dbg(ATH10K_DBG_MAC, "Remove interface: id %d\n", arvif->vdev_id);
2056
2057        ar->free_vdev_map |= 1 << (arvif->vdev_id);
2058
2059        if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
2060                ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, vif->addr);
2061                if (ret)
2062                        ath10k_warn("Failed to remove peer for AP: %d\n", ret);
2063
2064                kfree(arvif->u.ap.noa_data);
2065        }
2066
2067        ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
2068        if (ret)
2069                ath10k_warn("WMI vdev delete failed: %d\n", ret);
2070
2071        if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2072                ar->monitor_present = false;
2073
2074        ath10k_peer_cleanup(ar, arvif->vdev_id);
2075
2076        mutex_unlock(&ar->conf_mutex);
2077}
2078
2079/*
2080 * FIXME: Has to be verified.
2081 */
2082#define SUPPORTED_FILTERS                       \
2083        (FIF_PROMISC_IN_BSS |                   \
2084        FIF_ALLMULTI |                          \
2085        FIF_CONTROL |                           \
2086        FIF_PSPOLL |                            \
2087        FIF_OTHER_BSS |                         \
2088        FIF_BCN_PRBRESP_PROMISC |               \
2089        FIF_PROBE_REQ |                         \
2090        FIF_FCSFAIL)
2091
2092static void ath10k_configure_filter(struct ieee80211_hw *hw,
2093                                    unsigned int changed_flags,
2094                                    unsigned int *total_flags,
2095                                    u64 multicast)
2096{
2097        struct ath10k *ar = hw->priv;
2098        int ret;
2099
2100        mutex_lock(&ar->conf_mutex);
2101
2102        changed_flags &= SUPPORTED_FILTERS;
2103        *total_flags &= SUPPORTED_FILTERS;
2104        ar->filter_flags = *total_flags;
2105
2106        if ((ar->filter_flags & FIF_PROMISC_IN_BSS) &&
2107            !ar->monitor_enabled) {
2108                ret = ath10k_monitor_start(ar, ar->monitor_vdev_id);
2109                if (ret)
2110                        ath10k_warn("Unable to start monitor mode\n");
2111                else
2112                        ath10k_dbg(ATH10K_DBG_MAC, "Monitor mode started\n");
2113        } else if (!(ar->filter_flags & FIF_PROMISC_IN_BSS) &&
2114                   ar->monitor_enabled) {
2115                ret = ath10k_monitor_stop(ar);
2116                if (ret)
2117                        ath10k_warn("Unable to stop monitor mode\n");
2118                else
2119                        ath10k_dbg(ATH10K_DBG_MAC, "Monitor mode stopped\n");
2120        }
2121
2122        mutex_unlock(&ar->conf_mutex);
2123}
2124
2125static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
2126                                    struct ieee80211_vif *vif,
2127                                    struct ieee80211_bss_conf *info,
2128                                    u32 changed)
2129{
2130        struct ath10k *ar = hw->priv;
2131        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2132        int ret = 0;
2133
2134        mutex_lock(&ar->conf_mutex);
2135
2136        if (changed & BSS_CHANGED_IBSS)
2137                ath10k_control_ibss(arvif, info, vif->addr);
2138
2139        if (changed & BSS_CHANGED_BEACON_INT) {
2140                arvif->beacon_interval = info->beacon_int;
2141                ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
2142                                                WMI_VDEV_PARAM_BEACON_INTERVAL,
2143                                                arvif->beacon_interval);
2144                if (ret)
2145                        ath10k_warn("Failed to set beacon interval for VDEV: %d\n",
2146                                    arvif->vdev_id);
2147                else
2148                        ath10k_dbg(ATH10K_DBG_MAC,
2149                                   "Beacon interval: %d set for VDEV: %d\n",
2150                                   arvif->beacon_interval, arvif->vdev_id);
2151        }
2152
2153        if (changed & BSS_CHANGED_BEACON) {
2154                ret = ath10k_wmi_pdev_set_param(ar,
2155                                                WMI_PDEV_PARAM_BEACON_TX_MODE,
2156                                                WMI_BEACON_STAGGERED_MODE);
2157                if (ret)
2158                        ath10k_warn("Failed to set beacon mode for VDEV: %d\n",
2159                                    arvif->vdev_id);
2160                else
2161                        ath10k_dbg(ATH10K_DBG_MAC,
2162                                   "Set staggered beacon mode for VDEV: %d\n",
2163                                   arvif->vdev_id);
2164        }
2165
2166        if (changed & BSS_CHANGED_BEACON_INFO) {
2167                arvif->dtim_period = info->dtim_period;
2168
2169                ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
2170                                                WMI_VDEV_PARAM_DTIM_PERIOD,
2171                                                arvif->dtim_period);
2172                if (ret)
2173                        ath10k_warn("Failed to set dtim period for VDEV: %d\n",
2174                                    arvif->vdev_id);
2175                else
2176                        ath10k_dbg(ATH10K_DBG_MAC,
2177                                   "Set dtim period: %d for VDEV: %d\n",
2178                                   arvif->dtim_period, arvif->vdev_id);
2179        }
2180
2181        if (changed & BSS_CHANGED_SSID &&
2182            vif->type == NL80211_IFTYPE_AP) {
2183                arvif->u.ap.ssid_len = info->ssid_len;
2184                if (info->ssid_len)
2185                        memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
2186                arvif->u.ap.hidden_ssid = info->hidden_ssid;
2187        }
2188
2189        if (changed & BSS_CHANGED_BSSID) {
2190                if (!is_zero_ether_addr(info->bssid)) {
2191                        ret = ath10k_peer_create(ar, arvif->vdev_id,
2192                                                 info->bssid);
2193                        if (ret)
2194                                ath10k_warn("Failed to add peer: %pM for VDEV: %d\n",
2195                                            info->bssid, arvif->vdev_id);
2196                        else
2197                                ath10k_dbg(ATH10K_DBG_MAC,
2198                                           "Added peer: %pM for VDEV: %d\n",
2199                                           info->bssid, arvif->vdev_id);
2200
2201
2202                        if (vif->type == NL80211_IFTYPE_STATION) {
2203                                /*
2204                                 * this is never erased as we it for crypto key
2205                                 * clearing; this is FW requirement
2206                                 */
2207                                memcpy(arvif->u.sta.bssid, info->bssid,
2208                                       ETH_ALEN);
2209
2210                                ret = ath10k_vdev_start(arvif);
2211                                if (!ret)
2212                                        ath10k_dbg(ATH10K_DBG_MAC,
2213                                                   "VDEV: %d started with BSSID: %pM\n",
2214                                                   arvif->vdev_id, info->bssid);
2215                        }
2216
2217                        /*
2218                         * Mac80211 does not keep IBSS bssid when leaving IBSS,
2219                         * so driver need to store it. It is needed when leaving
2220                         * IBSS in order to remove BSSID peer.
2221                         */
2222                        if (vif->type == NL80211_IFTYPE_ADHOC)
2223                                memcpy(arvif->u.ibss.bssid, info->bssid,
2224                                       ETH_ALEN);
2225                }
2226        }
2227
2228        if (changed & BSS_CHANGED_BEACON_ENABLED)
2229                ath10k_control_beaconing(arvif, info);
2230
2231        if (changed & BSS_CHANGED_ERP_CTS_PROT) {
2232                u32 cts_prot;
2233                if (info->use_cts_prot)
2234                        cts_prot = 1;
2235                else
2236                        cts_prot = 0;
2237
2238                ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
2239                                                WMI_VDEV_PARAM_ENABLE_RTSCTS,
2240                                                cts_prot);
2241                if (ret)
2242                        ath10k_warn("Failed to set CTS prot for VDEV: %d\n",
2243                                    arvif->vdev_id);
2244                else
2245                        ath10k_dbg(ATH10K_DBG_MAC,
2246                                   "Set CTS prot: %d for VDEV: %d\n",
2247                                   cts_prot, arvif->vdev_id);
2248        }
2249
2250        if (changed & BSS_CHANGED_ERP_SLOT) {
2251                u32 slottime;
2252                if (info->use_short_slot)
2253                        slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
2254
2255                else
2256                        slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
2257
2258                ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
2259                                                WMI_VDEV_PARAM_SLOT_TIME,
2260                                                slottime);
2261                if (ret)
2262                        ath10k_warn("Failed to set erp slot for VDEV: %d\n",
2263                                    arvif->vdev_id);
2264                else
2265                        ath10k_dbg(ATH10K_DBG_MAC,
2266                                   "Set slottime: %d for VDEV: %d\n",
2267                                   slottime, arvif->vdev_id);
2268        }
2269
2270        if (changed & BSS_CHANGED_ERP_PREAMBLE) {
2271                u32 preamble;
2272                if (info->use_short_preamble)
2273                        preamble = WMI_VDEV_PREAMBLE_SHORT;
2274                else
2275                        preamble = WMI_VDEV_PREAMBLE_LONG;
2276
2277                ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
2278                                                WMI_VDEV_PARAM_PREAMBLE,
2279                                                preamble);
2280                if (ret)
2281                        ath10k_warn("Failed to set preamble for VDEV: %d\n",
2282                                    arvif->vdev_id);
2283                else
2284                        ath10k_dbg(ATH10K_DBG_MAC,
2285                                   "Set preamble: %d for VDEV: %d\n",
2286                                   preamble, arvif->vdev_id);
2287        }
2288
2289        if (changed & BSS_CHANGED_ASSOC) {
2290                if (info->assoc)
2291                        ath10k_bss_assoc(hw, vif, info);
2292        }
2293
2294        mutex_unlock(&ar->conf_mutex);
2295}
2296
2297static int ath10k_hw_scan(struct ieee80211_hw *hw,
2298                          struct ieee80211_vif *vif,
2299                          struct cfg80211_scan_request *req)
2300{
2301        struct ath10k *ar = hw->priv;
2302        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2303        struct wmi_start_scan_arg arg;
2304        int ret = 0;
2305        int i;
2306
2307        mutex_lock(&ar->conf_mutex);
2308
2309        spin_lock_bh(&ar->data_lock);
2310        if (ar->scan.in_progress) {
2311                spin_unlock_bh(&ar->data_lock);
2312                ret = -EBUSY;
2313                goto exit;
2314        }
2315
2316        INIT_COMPLETION(ar->scan.started);
2317        INIT_COMPLETION(ar->scan.completed);
2318        ar->scan.in_progress = true;
2319        ar->scan.aborting = false;
2320        ar->scan.is_roc = false;
2321        ar->scan.vdev_id = arvif->vdev_id;
2322        spin_unlock_bh(&ar->data_lock);
2323
2324        memset(&arg, 0, sizeof(arg));
2325        ath10k_wmi_start_scan_init(ar, &arg);
2326        arg.vdev_id = arvif->vdev_id;
2327        arg.scan_id = ATH10K_SCAN_ID;
2328
2329        if (!req->no_cck)
2330                arg.scan_ctrl_flags |= WMI_SCAN_ADD_CCK_RATES;
2331
2332        if (req->ie_len) {
2333                arg.ie_len = req->ie_len;
2334                memcpy(arg.ie, req->ie, arg.ie_len);
2335        }
2336
2337        if (req->n_ssids) {
2338                arg.n_ssids = req->n_ssids;
2339                for (i = 0; i < arg.n_ssids; i++) {
2340                        arg.ssids[i].len  = req->ssids[i].ssid_len;
2341                        arg.ssids[i].ssid = req->ssids[i].ssid;
2342                }
2343        } else {
2344                arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
2345        }
2346
2347        if (req->n_channels) {
2348                arg.n_channels = req->n_channels;
2349                for (i = 0; i < arg.n_channels; i++)
2350                        arg.channels[i] = req->channels[i]->center_freq;
2351        }
2352
2353        ret = ath10k_start_scan(ar, &arg);
2354        if (ret) {
2355                ath10k_warn("could not start hw scan (%d)\n", ret);
2356                spin_lock_bh(&ar->data_lock);
2357                ar->scan.in_progress = false;
2358                spin_unlock_bh(&ar->data_lock);
2359        }
2360
2361exit:
2362        mutex_unlock(&ar->conf_mutex);
2363        return ret;
2364}
2365
2366static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
2367                                  struct ieee80211_vif *vif)
2368{
2369        struct ath10k *ar = hw->priv;
2370        int ret;
2371
2372        mutex_lock(&ar->conf_mutex);
2373        ret = ath10k_abort_scan(ar);
2374        if (ret) {
2375                ath10k_warn("couldn't abort scan (%d). forcefully sending scan completion to mac80211\n",
2376                            ret);
2377                ieee80211_scan_completed(hw, 1 /* aborted */);
2378        }
2379        mutex_unlock(&ar->conf_mutex);
2380}
2381
2382static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
2383                          struct ieee80211_vif *vif, struct ieee80211_sta *sta,
2384                          struct ieee80211_key_conf *key)
2385{
2386        struct ath10k *ar = hw->priv;
2387        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2388        struct ath10k_peer *peer;
2389        const u8 *peer_addr;
2390        bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
2391                      key->cipher == WLAN_CIPHER_SUITE_WEP104;
2392        int ret = 0;
2393
2394        if (key->keyidx > WMI_MAX_KEY_INDEX)
2395                return -ENOSPC;
2396
2397        mutex_lock(&ar->conf_mutex);
2398
2399        if (sta)
2400                peer_addr = sta->addr;
2401        else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
2402                peer_addr = vif->bss_conf.bssid;
2403        else
2404                peer_addr = vif->addr;
2405
2406        key->hw_key_idx = key->keyidx;
2407
2408        /* the peer should not disappear in mid-way (unless FW goes awry) since
2409         * we already hold conf_mutex. we just make sure its there now. */
2410        spin_lock_bh(&ar->data_lock);
2411        peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
2412        spin_unlock_bh(&ar->data_lock);
2413
2414        if (!peer) {
2415                if (cmd == SET_KEY) {
2416                        ath10k_warn("cannot install key for non-existent peer %pM\n",
2417                                    peer_addr);
2418                        ret = -EOPNOTSUPP;
2419                        goto exit;
2420                } else {
2421                        /* if the peer doesn't exist there is no key to disable
2422                         * anymore */
2423                        goto exit;
2424                }
2425        }
2426
2427        if (is_wep) {
2428                if (cmd == SET_KEY)
2429                        arvif->wep_keys[key->keyidx] = key;
2430                else
2431                        arvif->wep_keys[key->keyidx] = NULL;
2432
2433                if (cmd == DISABLE_KEY)
2434                        ath10k_clear_vdev_key(arvif, key);
2435        }
2436
2437        ret = ath10k_install_key(arvif, key, cmd, peer_addr);
2438        if (ret) {
2439                ath10k_warn("ath10k_install_key failed (%d)\n", ret);
2440                goto exit;
2441        }
2442
2443        spin_lock_bh(&ar->data_lock);
2444        peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
2445        if (peer && cmd == SET_KEY)
2446                peer->keys[key->keyidx] = key;
2447        else if (peer && cmd == DISABLE_KEY)
2448                peer->keys[key->keyidx] = NULL;
2449        else if (peer == NULL)
2450                /* impossible unless FW goes crazy */
2451                ath10k_warn("peer %pM disappeared!\n", peer_addr);
2452        spin_unlock_bh(&ar->data_lock);
2453
2454exit:
2455        mutex_unlock(&ar->conf_mutex);
2456        return ret;
2457}
2458
2459static int ath10k_sta_state(struct ieee80211_hw *hw,
2460                            struct ieee80211_vif *vif,
2461                            struct ieee80211_sta *sta,
2462                            enum ieee80211_sta_state old_state,
2463                            enum ieee80211_sta_state new_state)
2464{
2465        struct ath10k *ar = hw->priv;
2466        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2467        int ret = 0;
2468
2469        mutex_lock(&ar->conf_mutex);
2470
2471        if (old_state == IEEE80211_STA_NOTEXIST &&
2472            new_state == IEEE80211_STA_NONE &&
2473            vif->type != NL80211_IFTYPE_STATION) {
2474                /*
2475                 * New station addition.
2476                 */
2477                ret = ath10k_peer_create(ar, arvif->vdev_id, sta->addr);
2478                if (ret)
2479                        ath10k_warn("Failed to add peer: %pM for VDEV: %d\n",
2480                                    sta->addr, arvif->vdev_id);
2481                else
2482                        ath10k_dbg(ATH10K_DBG_MAC,
2483                                   "Added peer: %pM for VDEV: %d\n",
2484                                   sta->addr, arvif->vdev_id);
2485        } else if ((old_state == IEEE80211_STA_NONE &&
2486                    new_state == IEEE80211_STA_NOTEXIST)) {
2487                /*
2488                 * Existing station deletion.
2489                 */
2490                ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
2491                if (ret)
2492                        ath10k_warn("Failed to delete peer: %pM for VDEV: %d\n",
2493                                    sta->addr, arvif->vdev_id);
2494                else
2495                        ath10k_dbg(ATH10K_DBG_MAC,
2496                                   "Removed peer: %pM for VDEV: %d\n",
2497                                   sta->addr, arvif->vdev_id);
2498
2499                if (vif->type == NL80211_IFTYPE_STATION)
2500                        ath10k_bss_disassoc(hw, vif);
2501        } else if (old_state == IEEE80211_STA_AUTH &&
2502                   new_state == IEEE80211_STA_ASSOC &&
2503                   (vif->type == NL80211_IFTYPE_AP ||
2504                    vif->type == NL80211_IFTYPE_ADHOC)) {
2505                /*
2506                 * New association.
2507                 */
2508                ret = ath10k_station_assoc(ar, arvif, sta);
2509                if (ret)
2510                        ath10k_warn("Failed to associate station: %pM\n",
2511                                    sta->addr);
2512                else
2513                        ath10k_dbg(ATH10K_DBG_MAC,
2514                                   "Station %pM moved to assoc state\n",
2515                                   sta->addr);
2516        } else if (old_state == IEEE80211_STA_ASSOC &&
2517                   new_state == IEEE80211_STA_AUTH &&
2518                   (vif->type == NL80211_IFTYPE_AP ||
2519                    vif->type == NL80211_IFTYPE_ADHOC)) {
2520                /*
2521                 * Disassociation.
2522                 */
2523                ret = ath10k_station_disassoc(ar, arvif, sta);
2524                if (ret)
2525                        ath10k_warn("Failed to disassociate station: %pM\n",
2526                                    sta->addr);
2527                else
2528                        ath10k_dbg(ATH10K_DBG_MAC,
2529                                   "Station %pM moved to disassociated state\n",
2530                                   sta->addr);
2531        }
2532
2533        mutex_unlock(&ar->conf_mutex);
2534        return ret;
2535}
2536
2537static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
2538                                 u16 ac, bool enable)
2539{
2540        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2541        u32 value = 0;
2542        int ret = 0;
2543
2544        lockdep_assert_held(&ar->conf_mutex);
2545
2546        if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
2547                return 0;
2548
2549        switch (ac) {
2550        case IEEE80211_AC_VO:
2551                value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
2552                        WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
2553                break;
2554        case IEEE80211_AC_VI:
2555                value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
2556                        WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
2557                break;
2558        case IEEE80211_AC_BE:
2559                value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
2560                        WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
2561                break;
2562        case IEEE80211_AC_BK:
2563                value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
2564                        WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
2565                break;
2566        }
2567
2568        if (enable)
2569                arvif->u.sta.uapsd |= value;
2570        else
2571                arvif->u.sta.uapsd &= ~value;
2572
2573        ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2574                                          WMI_STA_PS_PARAM_UAPSD,
2575                                          arvif->u.sta.uapsd);
2576        if (ret) {
2577                ath10k_warn("could not set uapsd params %d\n", ret);
2578                goto exit;
2579        }
2580
2581        if (arvif->u.sta.uapsd)
2582                value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
2583        else
2584                value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
2585
2586        ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2587                                          WMI_STA_PS_PARAM_RX_WAKE_POLICY,
2588                                          value);
2589        if (ret)
2590                ath10k_warn("could not set rx wake param %d\n", ret);
2591
2592exit:
2593        return ret;
2594}
2595
2596static int ath10k_conf_tx(struct ieee80211_hw *hw,
2597                          struct ieee80211_vif *vif, u16 ac,
2598                          const struct ieee80211_tx_queue_params *params)
2599{
2600        struct ath10k *ar = hw->priv;
2601        struct wmi_wmm_params_arg *p = NULL;
2602        int ret;
2603
2604        mutex_lock(&ar->conf_mutex);
2605
2606        switch (ac) {
2607        case IEEE80211_AC_VO:
2608                p = &ar->wmm_params.ac_vo;
2609                break;
2610        case IEEE80211_AC_VI:
2611                p = &ar->wmm_params.ac_vi;
2612                break;
2613        case IEEE80211_AC_BE:
2614                p = &ar->wmm_params.ac_be;
2615                break;
2616        case IEEE80211_AC_BK:
2617                p = &ar->wmm_params.ac_bk;
2618                break;
2619        }
2620
2621        if (WARN_ON(!p)) {
2622                ret = -EINVAL;
2623                goto exit;
2624        }
2625
2626        p->cwmin = params->cw_min;
2627        p->cwmax = params->cw_max;
2628        p->aifs = params->aifs;
2629
2630        /*
2631         * The channel time duration programmed in the HW is in absolute
2632         * microseconds, while mac80211 gives the txop in units of
2633         * 32 microseconds.
2634         */
2635        p->txop = params->txop * 32;
2636
2637        /* FIXME: FW accepts wmm params per hw, not per vif */
2638        ret = ath10k_wmi_pdev_set_wmm_params(ar, &ar->wmm_params);
2639        if (ret) {
2640                ath10k_warn("could not set wmm params %d\n", ret);
2641                goto exit;
2642        }
2643
2644        ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
2645        if (ret)
2646                ath10k_warn("could not set sta uapsd %d\n", ret);
2647
2648exit:
2649        mutex_unlock(&ar->conf_mutex);
2650        return ret;
2651}
2652
2653#define ATH10K_ROC_TIMEOUT_HZ (2*HZ)
2654
2655static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
2656                                    struct ieee80211_vif *vif,
2657                                    struct ieee80211_channel *chan,
2658                                    int duration,
2659                                    enum ieee80211_roc_type type)
2660{
2661        struct ath10k *ar = hw->priv;
2662        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2663        struct wmi_start_scan_arg arg;
2664        int ret;
2665
2666        mutex_lock(&ar->conf_mutex);
2667
2668        spin_lock_bh(&ar->data_lock);
2669        if (ar->scan.in_progress) {
2670                spin_unlock_bh(&ar->data_lock);
2671                ret = -EBUSY;
2672                goto exit;
2673        }
2674
2675        INIT_COMPLETION(ar->scan.started);
2676        INIT_COMPLETION(ar->scan.completed);
2677        INIT_COMPLETION(ar->scan.on_channel);
2678        ar->scan.in_progress = true;
2679        ar->scan.aborting = false;
2680        ar->scan.is_roc = true;
2681        ar->scan.vdev_id = arvif->vdev_id;
2682        ar->scan.roc_freq = chan->center_freq;
2683        spin_unlock_bh(&ar->data_lock);
2684
2685        memset(&arg, 0, sizeof(arg));
2686        ath10k_wmi_start_scan_init(ar, &arg);
2687        arg.vdev_id = arvif->vdev_id;
2688        arg.scan_id = ATH10K_SCAN_ID;
2689        arg.n_channels = 1;
2690        arg.channels[0] = chan->center_freq;
2691        arg.dwell_time_active = duration;
2692        arg.dwell_time_passive = duration;
2693        arg.max_scan_time = 2 * duration;
2694        arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
2695        arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
2696
2697        ret = ath10k_start_scan(ar, &arg);
2698        if (ret) {
2699                ath10k_warn("could not start roc scan (%d)\n", ret);
2700                spin_lock_bh(&ar->data_lock);
2701                ar->scan.in_progress = false;
2702                spin_unlock_bh(&ar->data_lock);
2703                goto exit;
2704        }
2705
2706        ret = wait_for_completion_timeout(&ar->scan.on_channel, 3*HZ);
2707        if (ret == 0) {
2708                ath10k_warn("could not switch to channel for roc scan\n");
2709                ath10k_abort_scan(ar);
2710                ret = -ETIMEDOUT;
2711                goto exit;
2712        }
2713
2714        ret = 0;
2715exit:
2716        mutex_unlock(&ar->conf_mutex);
2717        return ret;
2718}
2719
2720static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
2721{
2722        struct ath10k *ar = hw->priv;
2723
2724        mutex_lock(&ar->conf_mutex);
2725        ath10k_abort_scan(ar);
2726        mutex_unlock(&ar->conf_mutex);
2727
2728        return 0;
2729}
2730
2731/*
2732 * Both RTS and Fragmentation threshold are interface-specific
2733 * in ath10k, but device-specific in mac80211.
2734 */
2735static void ath10k_set_rts_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
2736{
2737        struct ath10k_generic_iter *ar_iter = data;
2738        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2739        u32 rts = ar_iter->ar->hw->wiphy->rts_threshold;
2740
2741        lockdep_assert_held(&arvif->ar->conf_mutex);
2742
2743        /* During HW reconfiguration mac80211 reports all interfaces that were
2744         * running until reconfiguration was started. Since FW doesn't have any
2745         * vdevs at this point we must not iterate over this interface list.
2746         * This setting will be updated upon add_interface(). */
2747        if (ar_iter->ar->state == ATH10K_STATE_RESTARTED)
2748                return;
2749
2750        ar_iter->ret = ath10k_mac_set_rts(arvif, rts);
2751        if (ar_iter->ret)
2752                ath10k_warn("Failed to set RTS threshold for VDEV: %d\n",
2753                            arvif->vdev_id);
2754        else
2755                ath10k_dbg(ATH10K_DBG_MAC,
2756                           "Set RTS threshold: %d for VDEV: %d\n",
2757                           rts, arvif->vdev_id);
2758}
2759
2760static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
2761{
2762        struct ath10k_generic_iter ar_iter;
2763        struct ath10k *ar = hw->priv;
2764
2765        memset(&ar_iter, 0, sizeof(struct ath10k_generic_iter));
2766        ar_iter.ar = ar;
2767
2768        mutex_lock(&ar->conf_mutex);
2769        ieee80211_iterate_active_interfaces_atomic(
2770                hw, IEEE80211_IFACE_ITER_NORMAL,
2771                ath10k_set_rts_iter, &ar_iter);
2772        mutex_unlock(&ar->conf_mutex);
2773
2774        return ar_iter.ret;
2775}
2776
2777static void ath10k_set_frag_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
2778{
2779        struct ath10k_generic_iter *ar_iter = data;
2780        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2781        u32 frag = ar_iter->ar->hw->wiphy->frag_threshold;
2782
2783        lockdep_assert_held(&arvif->ar->conf_mutex);
2784
2785        /* During HW reconfiguration mac80211 reports all interfaces that were
2786         * running until reconfiguration was started. Since FW doesn't have any
2787         * vdevs at this point we must not iterate over this interface list.
2788         * This setting will be updated upon add_interface(). */
2789        if (ar_iter->ar->state == ATH10K_STATE_RESTARTED)
2790                return;
2791
2792        ar_iter->ret = ath10k_mac_set_frag(arvif, frag);
2793        if (ar_iter->ret)
2794                ath10k_warn("Failed to set frag threshold for VDEV: %d\n",
2795                            arvif->vdev_id);
2796        else
2797                ath10k_dbg(ATH10K_DBG_MAC,
2798                           "Set frag threshold: %d for VDEV: %d\n",
2799                           frag, arvif->vdev_id);
2800}
2801
2802static int ath10k_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
2803{
2804        struct ath10k_generic_iter ar_iter;
2805        struct ath10k *ar = hw->priv;
2806
2807        memset(&ar_iter, 0, sizeof(struct ath10k_generic_iter));
2808        ar_iter.ar = ar;
2809
2810        mutex_lock(&ar->conf_mutex);
2811        ieee80211_iterate_active_interfaces_atomic(
2812                hw, IEEE80211_IFACE_ITER_NORMAL,
2813                ath10k_set_frag_iter, &ar_iter);
2814        mutex_unlock(&ar->conf_mutex);
2815
2816        return ar_iter.ret;
2817}
2818
2819static void ath10k_flush(struct ieee80211_hw *hw, u32 queues, bool drop)
2820{
2821        struct ath10k *ar = hw->priv;
2822        bool skip;
2823        int ret;
2824
2825        /* mac80211 doesn't care if we really xmit queued frames or not
2826         * we'll collect those frames either way if we stop/delete vdevs */
2827        if (drop)
2828                return;
2829
2830        mutex_lock(&ar->conf_mutex);
2831
2832        if (ar->state == ATH10K_STATE_WEDGED)
2833                goto skip;
2834
2835        ret = wait_event_timeout(ar->htt.empty_tx_wq, ({
2836                        bool empty;
2837
2838                        spin_lock_bh(&ar->htt.tx_lock);
2839                        empty = bitmap_empty(ar->htt.used_msdu_ids,
2840                                             ar->htt.max_num_pending_tx);
2841                        spin_unlock_bh(&ar->htt.tx_lock);
2842
2843                        skip = (ar->state == ATH10K_STATE_WEDGED);
2844
2845                        (empty || skip);
2846                }), ATH10K_FLUSH_TIMEOUT_HZ);
2847
2848        if (ret <= 0 || skip)
2849                ath10k_warn("tx not flushed\n");
2850
2851skip:
2852        mutex_unlock(&ar->conf_mutex);
2853}
2854
2855/* TODO: Implement this function properly
2856 * For now it is needed to reply to Probe Requests in IBSS mode.
2857 * Propably we need this information from FW.
2858 */
2859static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
2860{
2861        return 1;
2862}
2863
2864#ifdef CONFIG_PM
2865static int ath10k_suspend(struct ieee80211_hw *hw,
2866                          struct cfg80211_wowlan *wowlan)
2867{
2868        struct ath10k *ar = hw->priv;
2869        int ret;
2870
2871        ar->is_target_paused = false;
2872
2873        ret = ath10k_wmi_pdev_suspend_target(ar);
2874        if (ret) {
2875                ath10k_warn("could not suspend target (%d)\n", ret);
2876                return 1;
2877        }
2878
2879        ret = wait_event_interruptible_timeout(ar->event_queue,
2880                                               ar->is_target_paused == true,
2881                                               1 * HZ);
2882        if (ret < 0) {
2883                ath10k_warn("suspend interrupted (%d)\n", ret);
2884                goto resume;
2885        } else if (ret == 0) {
2886                ath10k_warn("suspend timed out - target pause event never came\n");
2887                goto resume;
2888        }
2889
2890        ret = ath10k_hif_suspend(ar);
2891        if (ret) {
2892                ath10k_warn("could not suspend hif (%d)\n", ret);
2893                goto resume;
2894        }
2895
2896        return 0;
2897resume:
2898        ret = ath10k_wmi_pdev_resume_target(ar);
2899        if (ret)
2900                ath10k_warn("could not resume target (%d)\n", ret);
2901        return 1;
2902}
2903
2904static int ath10k_resume(struct ieee80211_hw *hw)
2905{
2906        struct ath10k *ar = hw->priv;
2907        int ret;
2908
2909        ret = ath10k_hif_resume(ar);
2910        if (ret) {
2911                ath10k_warn("could not resume hif (%d)\n", ret);
2912                return 1;
2913        }
2914
2915        ret = ath10k_wmi_pdev_resume_target(ar);
2916        if (ret) {
2917                ath10k_warn("could not resume target (%d)\n", ret);
2918                return 1;
2919        }
2920
2921        return 0;
2922}
2923#endif
2924
2925static void ath10k_restart_complete(struct ieee80211_hw *hw)
2926{
2927        struct ath10k *ar = hw->priv;
2928
2929        mutex_lock(&ar->conf_mutex);
2930
2931        /* If device failed to restart it will be in a different state, e.g.
2932         * ATH10K_STATE_WEDGED */
2933        if (ar->state == ATH10K_STATE_RESTARTED) {
2934                ath10k_info("device successfully recovered\n");
2935                ar->state = ATH10K_STATE_ON;
2936        }
2937
2938        mutex_unlock(&ar->conf_mutex);
2939}
2940
2941static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
2942                             struct survey_info *survey)
2943{
2944        struct ath10k *ar = hw->priv;
2945        struct ieee80211_supported_band *sband;
2946        struct survey_info *ar_survey = &ar->survey[idx];
2947        int ret = 0;
2948
2949        mutex_lock(&ar->conf_mutex);
2950
2951        sband = hw->wiphy->bands[IEEE80211_BAND_2GHZ];
2952        if (sband && idx >= sband->n_channels) {
2953                idx -= sband->n_channels;
2954                sband = NULL;
2955        }
2956
2957        if (!sband)
2958                sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
2959
2960        if (!sband || idx >= sband->n_channels) {
2961                ret = -ENOENT;
2962                goto exit;
2963        }
2964
2965        spin_lock_bh(&ar->data_lock);
2966        memcpy(survey, ar_survey, sizeof(*survey));
2967        spin_unlock_bh(&ar->data_lock);
2968
2969        survey->channel = &sband->channels[idx];
2970
2971exit:
2972        mutex_unlock(&ar->conf_mutex);
2973        return ret;
2974}
2975
2976static const struct ieee80211_ops ath10k_ops = {
2977        .tx                             = ath10k_tx,
2978        .start                          = ath10k_start,
2979        .stop                           = ath10k_stop,
2980        .config                         = ath10k_config,
2981        .add_interface                  = ath10k_add_interface,
2982        .remove_interface               = ath10k_remove_interface,
2983        .configure_filter               = ath10k_configure_filter,
2984        .bss_info_changed               = ath10k_bss_info_changed,
2985        .hw_scan                        = ath10k_hw_scan,
2986        .cancel_hw_scan                 = ath10k_cancel_hw_scan,
2987        .set_key                        = ath10k_set_key,
2988        .sta_state                      = ath10k_sta_state,
2989        .conf_tx                        = ath10k_conf_tx,
2990        .remain_on_channel              = ath10k_remain_on_channel,
2991        .cancel_remain_on_channel       = ath10k_cancel_remain_on_channel,
2992        .set_rts_threshold              = ath10k_set_rts_threshold,
2993        .set_frag_threshold             = ath10k_set_frag_threshold,
2994        .flush                          = ath10k_flush,
2995        .tx_last_beacon                 = ath10k_tx_last_beacon,
2996        .restart_complete               = ath10k_restart_complete,
2997        .get_survey                     = ath10k_get_survey,
2998#ifdef CONFIG_PM
2999        .suspend                        = ath10k_suspend,
3000        .resume                         = ath10k_resume,
3001#endif
3002};
3003
3004#define RATETAB_ENT(_rate, _rateid, _flags) { \
3005        .bitrate                = (_rate), \
3006        .flags                  = (_flags), \
3007        .hw_value               = (_rateid), \
3008}
3009
3010#define CHAN2G(_channel, _freq, _flags) { \
3011        .band                   = IEEE80211_BAND_2GHZ, \
3012        .hw_value               = (_channel), \
3013        .center_freq            = (_freq), \
3014        .flags                  = (_flags), \
3015        .max_antenna_gain       = 0, \
3016        .max_power              = 30, \
3017}
3018
3019#define CHAN5G(_channel, _freq, _flags) { \
3020        .band                   = IEEE80211_BAND_5GHZ, \
3021        .hw_value               = (_channel), \
3022        .center_freq            = (_freq), \
3023        .flags                  = (_flags), \
3024        .max_antenna_gain       = 0, \
3025        .max_power              = 30, \
3026}
3027
3028static const struct ieee80211_channel ath10k_2ghz_channels[] = {
3029        CHAN2G(1, 2412, 0),
3030        CHAN2G(2, 2417, 0),
3031        CHAN2G(3, 2422, 0),
3032        CHAN2G(4, 2427, 0),
3033        CHAN2G(5, 2432, 0),
3034        CHAN2G(6, 2437, 0),
3035        CHAN2G(7, 2442, 0),
3036        CHAN2G(8, 2447, 0),
3037        CHAN2G(9, 2452, 0),
3038        CHAN2G(10, 2457, 0),
3039        CHAN2G(11, 2462, 0),
3040        CHAN2G(12, 2467, 0),
3041        CHAN2G(13, 2472, 0),
3042        CHAN2G(14, 2484, 0),
3043};
3044
3045static const struct ieee80211_channel ath10k_5ghz_channels[] = {
3046        CHAN5G(36, 5180, 0),
3047        CHAN5G(40, 5200, 0),
3048        CHAN5G(44, 5220, 0),
3049        CHAN5G(48, 5240, 0),
3050        CHAN5G(52, 5260, 0),
3051        CHAN5G(56, 5280, 0),
3052        CHAN5G(60, 5300, 0),
3053        CHAN5G(64, 5320, 0),
3054        CHAN5G(100, 5500, 0),
3055        CHAN5G(104, 5520, 0),
3056        CHAN5G(108, 5540, 0),
3057        CHAN5G(112, 5560, 0),
3058        CHAN5G(116, 5580, 0),
3059        CHAN5G(120, 5600, 0),
3060        CHAN5G(124, 5620, 0),
3061        CHAN5G(128, 5640, 0),
3062        CHAN5G(132, 5660, 0),
3063        CHAN5G(136, 5680, 0),
3064        CHAN5G(140, 5700, 0),
3065        CHAN5G(149, 5745, 0),
3066        CHAN5G(153, 5765, 0),
3067        CHAN5G(157, 5785, 0),
3068        CHAN5G(161, 5805, 0),
3069        CHAN5G(165, 5825, 0),
3070};
3071
3072static struct ieee80211_rate ath10k_rates[] = {
3073        /* CCK */
3074        RATETAB_ENT(10,  0x82, 0),
3075        RATETAB_ENT(20,  0x84, 0),
3076        RATETAB_ENT(55,  0x8b, 0),
3077        RATETAB_ENT(110, 0x96, 0),
3078        /* OFDM */
3079        RATETAB_ENT(60,  0x0c, 0),
3080        RATETAB_ENT(90,  0x12, 0),
3081        RATETAB_ENT(120, 0x18, 0),
3082        RATETAB_ENT(180, 0x24, 0),
3083        RATETAB_ENT(240, 0x30, 0),
3084        RATETAB_ENT(360, 0x48, 0),
3085        RATETAB_ENT(480, 0x60, 0),
3086        RATETAB_ENT(540, 0x6c, 0),
3087};
3088
3089#define ath10k_a_rates (ath10k_rates + 4)
3090#define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - 4)
3091#define ath10k_g_rates (ath10k_rates + 0)
3092#define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
3093
3094struct ath10k *ath10k_mac_create(void)
3095{
3096        struct ieee80211_hw *hw;
3097        struct ath10k *ar;
3098
3099        hw = ieee80211_alloc_hw(sizeof(struct ath10k), &ath10k_ops);
3100        if (!hw)
3101                return NULL;
3102
3103        ar = hw->priv;
3104        ar->hw = hw;
3105
3106        return ar;
3107}
3108
3109void ath10k_mac_destroy(struct ath10k *ar)
3110{
3111        ieee80211_free_hw(ar->hw);
3112}
3113
3114static const struct ieee80211_iface_limit ath10k_if_limits[] = {
3115        {
3116        .max    = 8,
3117        .types  = BIT(NL80211_IFTYPE_STATION)
3118                | BIT(NL80211_IFTYPE_P2P_CLIENT)
3119        },
3120        {
3121        .max    = 3,
3122        .types  = BIT(NL80211_IFTYPE_P2P_GO)
3123        },
3124        {
3125        .max    = 7,
3126        .types  = BIT(NL80211_IFTYPE_AP)
3127        },
3128};
3129
3130static const struct ieee80211_iface_combination ath10k_if_comb = {
3131        .limits = ath10k_if_limits,
3132        .n_limits = ARRAY_SIZE(ath10k_if_limits),
3133        .max_interfaces = 8,
3134        .num_different_channels = 1,
3135        .beacon_int_infra_match = true,
3136};
3137
3138static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
3139{
3140        struct ieee80211_sta_vht_cap vht_cap = {0};
3141        u16 mcs_map;
3142        int i;
3143
3144        vht_cap.vht_supported = 1;
3145        vht_cap.cap = ar->vht_cap_info;
3146
3147        mcs_map = 0;
3148        for (i = 0; i < 8; i++) {
3149                if (i < ar->num_rf_chains)
3150                        mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i*2);
3151                else
3152                        mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i*2);
3153        }
3154
3155        vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
3156        vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
3157
3158        return vht_cap;
3159}
3160
3161static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
3162{
3163        int i;
3164        struct ieee80211_sta_ht_cap ht_cap = {0};
3165
3166        if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
3167                return ht_cap;
3168
3169        ht_cap.ht_supported = 1;
3170        ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
3171        ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
3172        ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
3173        ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
3174        ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
3175
3176        if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
3177                ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
3178
3179        if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
3180                ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
3181
3182        if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
3183                u32 smps;
3184
3185                smps   = WLAN_HT_CAP_SM_PS_DYNAMIC;
3186                smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
3187
3188                ht_cap.cap |= smps;
3189        }
3190
3191        if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC)
3192                ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
3193
3194        if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
3195                u32 stbc;
3196
3197                stbc   = ar->ht_cap_info;
3198                stbc  &= WMI_HT_CAP_RX_STBC;
3199                stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
3200                stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
3201                stbc  &= IEEE80211_HT_CAP_RX_STBC;
3202
3203                ht_cap.cap |= stbc;
3204        }
3205
3206        if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
3207                ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
3208
3209        if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
3210                ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
3211
3212        /* max AMSDU is implicitly taken from vht_cap_info */
3213        if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
3214                ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
3215
3216        for (i = 0; i < ar->num_rf_chains; i++)
3217                ht_cap.mcs.rx_mask[i] = 0xFF;
3218
3219        ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
3220
3221        return ht_cap;
3222}
3223
3224
3225static void ath10k_get_arvif_iter(void *data, u8 *mac,
3226                                  struct ieee80211_vif *vif)
3227{
3228        struct ath10k_vif_iter *arvif_iter = data;
3229        struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3230
3231        if (arvif->vdev_id == arvif_iter->vdev_id)
3232                arvif_iter->arvif = arvif;
3233}
3234
3235struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
3236{
3237        struct ath10k_vif_iter arvif_iter;
3238        u32 flags;
3239
3240        memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
3241        arvif_iter.vdev_id = vdev_id;
3242
3243        flags = IEEE80211_IFACE_ITER_RESUME_ALL;
3244        ieee80211_iterate_active_interfaces_atomic(ar->hw,
3245                                                   flags,
3246                                                   ath10k_get_arvif_iter,
3247                                                   &arvif_iter);
3248        if (!arvif_iter.arvif) {
3249                ath10k_warn("No VIF found for VDEV: %d\n", vdev_id);
3250                return NULL;
3251        }
3252
3253        return arvif_iter.arvif;
3254}
3255
3256int ath10k_mac_register(struct ath10k *ar)
3257{
3258        struct ieee80211_supported_band *band;
3259        struct ieee80211_sta_vht_cap vht_cap;
3260        struct ieee80211_sta_ht_cap ht_cap;
3261        void *channels;
3262        int ret;
3263
3264        SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
3265
3266        SET_IEEE80211_DEV(ar->hw, ar->dev);
3267
3268        ht_cap = ath10k_get_ht_cap(ar);
3269        vht_cap = ath10k_create_vht_cap(ar);
3270
3271        if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
3272                channels = kmemdup(ath10k_2ghz_channels,
3273                                   sizeof(ath10k_2ghz_channels),
3274                                   GFP_KERNEL);
3275                if (!channels) {
3276                        ret = -ENOMEM;
3277                        goto err_free;
3278                }
3279
3280                band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
3281                band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
3282                band->channels = channels;
3283                band->n_bitrates = ath10k_g_rates_size;
3284                band->bitrates = ath10k_g_rates;
3285                band->ht_cap = ht_cap;
3286
3287                /* vht is not supported in 2.4 GHz */
3288
3289                ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band;
3290        }
3291
3292        if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
3293                channels = kmemdup(ath10k_5ghz_channels,
3294                                   sizeof(ath10k_5ghz_channels),
3295                                   GFP_KERNEL);
3296                if (!channels) {
3297                        ret = -ENOMEM;
3298                        goto err_free;
3299                }
3300
3301                band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
3302                band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
3303                band->channels = channels;
3304                band->n_bitrates = ath10k_a_rates_size;
3305                band->bitrates = ath10k_a_rates;
3306                band->ht_cap = ht_cap;
3307                band->vht_cap = vht_cap;
3308                ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band;
3309        }
3310
3311        ar->hw->wiphy->interface_modes =
3312                BIT(NL80211_IFTYPE_STATION) |
3313                BIT(NL80211_IFTYPE_ADHOC) |
3314                BIT(NL80211_IFTYPE_AP) |
3315                BIT(NL80211_IFTYPE_P2P_CLIENT) |
3316                BIT(NL80211_IFTYPE_P2P_GO);
3317
3318        ar->hw->flags = IEEE80211_HW_SIGNAL_DBM |
3319                        IEEE80211_HW_SUPPORTS_PS |
3320                        IEEE80211_HW_SUPPORTS_DYNAMIC_PS |
3321                        IEEE80211_HW_SUPPORTS_UAPSD |
3322                        IEEE80211_HW_MFP_CAPABLE |
3323                        IEEE80211_HW_REPORTS_TX_ACK_STATUS |
3324                        IEEE80211_HW_HAS_RATE_CONTROL |
3325                        IEEE80211_HW_SUPPORTS_STATIC_SMPS |
3326                        IEEE80211_HW_WANT_MONITOR_VIF |
3327                        IEEE80211_HW_AP_LINK_PS;
3328
3329        if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
3330                ar->hw->flags |= IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS;
3331
3332        if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
3333                ar->hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION;
3334                ar->hw->flags |= IEEE80211_HW_TX_AMPDU_SETUP_IN_HW;
3335        }
3336
3337        ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
3338        ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
3339
3340        ar->hw->vif_data_size = sizeof(struct ath10k_vif);
3341
3342        ar->hw->channel_change_time = 5000;
3343        ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
3344
3345        ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
3346        ar->hw->wiphy->max_remain_on_channel_duration = 5000;
3347
3348        ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
3349        /*
3350         * on LL hardware queues are managed entirely by the FW
3351         * so we only advertise to mac we can do the queues thing
3352         */
3353        ar->hw->queues = 4;
3354
3355        ar->hw->wiphy->iface_combinations = &ath10k_if_comb;
3356        ar->hw->wiphy->n_iface_combinations = 1;
3357
3358        ar->hw->netdev_features = NETIF_F_HW_CSUM;
3359
3360        ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
3361                            ath10k_reg_notifier);
3362        if (ret) {
3363                ath10k_err("Regulatory initialization failed\n");
3364                goto err_free;
3365        }
3366
3367        ret = ieee80211_register_hw(ar->hw);
3368        if (ret) {
3369                ath10k_err("ieee80211 registration failed: %d\n", ret);
3370                goto err_free;
3371        }
3372
3373        if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
3374                ret = regulatory_hint(ar->hw->wiphy,
3375                                      ar->ath_common.regulatory.alpha2);
3376                if (ret)
3377                        goto err_unregister;
3378        }
3379
3380        return 0;
3381
3382err_unregister:
3383        ieee80211_unregister_hw(ar->hw);
3384err_free:
3385        kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
3386        kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
3387
3388        return ret;
3389}
3390
3391void ath10k_mac_unregister(struct ath10k *ar)
3392{
3393        ieee80211_unregister_hw(ar->hw);
3394
3395        kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
3396        kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
3397
3398        SET_IEEE80211_DEV(ar->hw, NULL);
3399}
3400