linux/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
<<
>>
Prefs
   1/******************************************************************************
   2 *
   3 * This file is provided under a dual BSD/GPLv2 license.  When using or
   4 * redistributing this file, you may do so under either license.
   5 *
   6 * GPL LICENSE SUMMARY
   7 *
   8 * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
   9 * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
  10 * Copyright(c) 2016 Intel Deutschland GmbH
  11 *
  12 * This program is free software; you can redistribute it and/or modify
  13 * it under the terms of version 2 of the GNU General Public License as
  14 * published by the Free Software Foundation.
  15 *
  16 * This program is distributed in the hope that it will be useful, but
  17 * WITHOUT ANY WARRANTY; without even the implied warranty of
  18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  19 * General Public License for more details.
  20 *
  21 * You should have received a copy of the GNU General Public License
  22 * along with this program; if not, write to the Free Software
  23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
  24 * USA
  25 *
  26 * The full GNU General Public License is included in this distribution
  27 * in the file called COPYING.
  28 *
  29 * Contact Information:
  30 *  Intel Linux Wireless <linuxwifi@intel.com>
  31 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
  32 *
  33 * BSD LICENSE
  34 *
  35 * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
  36 * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
  37 * All rights reserved.
  38 *
  39 * Redistribution and use in source and binary forms, with or without
  40 * modification, are permitted provided that the following conditions
  41 * are met:
  42 *
  43 *  * Redistributions of source code must retain the above copyright
  44 *    notice, this list of conditions and the following disclaimer.
  45 *  * Redistributions in binary form must reproduce the above copyright
  46 *    notice, this list of conditions and the following disclaimer in
  47 *    the documentation and/or other materials provided with the
  48 *    distribution.
  49 *  * Neither the name Intel Corporation nor the names of its
  50 *    contributors may be used to endorse or promote products derived
  51 *    from this software without specific prior written permission.
  52 *
  53 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  54 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  55 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  56 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  57 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  58 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  59 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  60 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  61 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  62 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  63 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  64 *
  65 *****************************************************************************/
  66#include <linux/kernel.h>
  67#include <linux/slab.h>
  68#include <linux/skbuff.h>
  69#include <linux/netdevice.h>
  70#include <linux/etherdevice.h>
  71#include <linux/ip.h>
  72#include <linux/if_arp.h>
  73#include <linux/time.h>
  74#include <net/mac80211.h>
  75#include <net/ieee80211_radiotap.h>
  76#include <net/tcp.h>
  77
  78#include "iwl-op-mode.h"
  79#include "iwl-io.h"
  80#include "mvm.h"
  81#include "sta.h"
  82#include "time-event.h"
  83#include "iwl-eeprom-parse.h"
  84#include "iwl-phy-db.h"
  85#include "testmode.h"
  86#include "iwl-fw-error-dump.h"
  87#include "iwl-prph.h"
  88#include "iwl-nvm-parse.h"
  89#include "fw-dbg.h"
  90
  91static const struct ieee80211_iface_limit iwl_mvm_limits[] = {
  92        {
  93                .max = 1,
  94                .types = BIT(NL80211_IFTYPE_STATION),
  95        },
  96        {
  97                .max = 1,
  98                .types = BIT(NL80211_IFTYPE_AP) |
  99                        BIT(NL80211_IFTYPE_P2P_CLIENT) |
 100                        BIT(NL80211_IFTYPE_P2P_GO),
 101        },
 102        {
 103                .max = 1,
 104                .types = BIT(NL80211_IFTYPE_P2P_DEVICE),
 105        },
 106};
 107
 108static const struct ieee80211_iface_combination iwl_mvm_iface_combinations[] = {
 109        {
 110                .num_different_channels = 2,
 111                .max_interfaces = 3,
 112                .limits = iwl_mvm_limits,
 113                .n_limits = ARRAY_SIZE(iwl_mvm_limits),
 114        },
 115};
 116
 117#ifdef CONFIG_PM_SLEEP
 118static const struct nl80211_wowlan_tcp_data_token_feature
 119iwl_mvm_wowlan_tcp_token_feature = {
 120        .min_len = 0,
 121        .max_len = 255,
 122        .bufsize = IWL_WOWLAN_REMOTE_WAKE_MAX_TOKENS,
 123};
 124
 125static const struct wiphy_wowlan_tcp_support iwl_mvm_wowlan_tcp_support = {
 126        .tok = &iwl_mvm_wowlan_tcp_token_feature,
 127        .data_payload_max = IWL_WOWLAN_TCP_MAX_PACKET_LEN -
 128                            sizeof(struct ethhdr) -
 129                            sizeof(struct iphdr) -
 130                            sizeof(struct tcphdr),
 131        .data_interval_max = 65535, /* __le16 in API */
 132        .wake_payload_max = IWL_WOWLAN_REMOTE_WAKE_MAX_PACKET_LEN -
 133                            sizeof(struct ethhdr) -
 134                            sizeof(struct iphdr) -
 135                            sizeof(struct tcphdr),
 136        .seq = true,
 137};
 138#endif
 139
 140#ifdef CONFIG_IWLWIFI_BCAST_FILTERING
 141/*
 142 * Use the reserved field to indicate magic values.
 143 * these values will only be used internally by the driver,
 144 * and won't make it to the fw (reserved will be 0).
 145 * BC_FILTER_MAGIC_IP - configure the val of this attribute to
 146 *      be the vif's ip address. in case there is not a single
 147 *      ip address (0, or more than 1), this attribute will
 148 *      be skipped.
 149 * BC_FILTER_MAGIC_MAC - set the val of this attribute to
 150 *      the LSB bytes of the vif's mac address
 151 */
 152enum {
 153        BC_FILTER_MAGIC_NONE = 0,
 154        BC_FILTER_MAGIC_IP,
 155        BC_FILTER_MAGIC_MAC,
 156};
 157
 158static const struct iwl_fw_bcast_filter iwl_mvm_default_bcast_filters[] = {
 159        {
 160                /* arp */
 161                .discard = 0,
 162                .frame_type = BCAST_FILTER_FRAME_TYPE_ALL,
 163                .attrs = {
 164                        {
 165                                /* frame type - arp, hw type - ethernet */
 166                                .offset_type =
 167                                        BCAST_FILTER_OFFSET_PAYLOAD_START,
 168                                .offset = sizeof(rfc1042_header),
 169                                .val = cpu_to_be32(0x08060001),
 170                                .mask = cpu_to_be32(0xffffffff),
 171                        },
 172                        {
 173                                /* arp dest ip */
 174                                .offset_type =
 175                                        BCAST_FILTER_OFFSET_PAYLOAD_START,
 176                                .offset = sizeof(rfc1042_header) + 2 +
 177                                          sizeof(struct arphdr) +
 178                                          ETH_ALEN + sizeof(__be32) +
 179                                          ETH_ALEN,
 180                                .mask = cpu_to_be32(0xffffffff),
 181                                /* mark it as special field */
 182                                .reserved1 = cpu_to_le16(BC_FILTER_MAGIC_IP),
 183                        },
 184                },
 185        },
 186        {
 187                /* dhcp offer bcast */
 188                .discard = 0,
 189                .frame_type = BCAST_FILTER_FRAME_TYPE_IPV4,
 190                .attrs = {
 191                        {
 192                                /* udp dest port - 68 (bootp client)*/
 193                                .offset_type = BCAST_FILTER_OFFSET_IP_END,
 194                                .offset = offsetof(struct udphdr, dest),
 195                                .val = cpu_to_be32(0x00440000),
 196                                .mask = cpu_to_be32(0xffff0000),
 197                        },
 198                        {
 199                                /* dhcp - lsb bytes of client hw address */
 200                                .offset_type = BCAST_FILTER_OFFSET_IP_END,
 201                                .offset = 38,
 202                                .mask = cpu_to_be32(0xffffffff),
 203                                /* mark it as special field */
 204                                .reserved1 = cpu_to_le16(BC_FILTER_MAGIC_MAC),
 205                        },
 206                },
 207        },
 208        /* last filter must be empty */
 209        {},
 210};
 211#endif
 212
 213void iwl_mvm_ref(struct iwl_mvm *mvm, enum iwl_mvm_ref_type ref_type)
 214{
 215        if (!iwl_mvm_is_d0i3_supported(mvm))
 216                return;
 217
 218        IWL_DEBUG_RPM(mvm, "Take mvm reference - type %d\n", ref_type);
 219        spin_lock_bh(&mvm->refs_lock);
 220        mvm->refs[ref_type]++;
 221        spin_unlock_bh(&mvm->refs_lock);
 222        iwl_trans_ref(mvm->trans);
 223}
 224
 225void iwl_mvm_unref(struct iwl_mvm *mvm, enum iwl_mvm_ref_type ref_type)
 226{
 227        if (!iwl_mvm_is_d0i3_supported(mvm))
 228                return;
 229
 230        IWL_DEBUG_RPM(mvm, "Leave mvm reference - type %d\n", ref_type);
 231        spin_lock_bh(&mvm->refs_lock);
 232        if (WARN_ON(!mvm->refs[ref_type])) {
 233                spin_unlock_bh(&mvm->refs_lock);
 234                return;
 235        }
 236        mvm->refs[ref_type]--;
 237        spin_unlock_bh(&mvm->refs_lock);
 238        iwl_trans_unref(mvm->trans);
 239}
 240
 241static void iwl_mvm_unref_all_except(struct iwl_mvm *mvm,
 242                                     enum iwl_mvm_ref_type except_ref)
 243{
 244        int i, j;
 245
 246        if (!iwl_mvm_is_d0i3_supported(mvm))
 247                return;
 248
 249        spin_lock_bh(&mvm->refs_lock);
 250        for (i = 0; i < IWL_MVM_REF_COUNT; i++) {
 251                if (except_ref == i || !mvm->refs[i])
 252                        continue;
 253
 254                IWL_DEBUG_RPM(mvm, "Cleanup: remove mvm ref type %d (%d)\n",
 255                              i, mvm->refs[i]);
 256                for (j = 0; j < mvm->refs[i]; j++)
 257                        iwl_trans_unref(mvm->trans);
 258                mvm->refs[i] = 0;
 259        }
 260        spin_unlock_bh(&mvm->refs_lock);
 261}
 262
 263bool iwl_mvm_ref_taken(struct iwl_mvm *mvm)
 264{
 265        int i;
 266        bool taken = false;
 267
 268        if (!iwl_mvm_is_d0i3_supported(mvm))
 269                return true;
 270
 271        spin_lock_bh(&mvm->refs_lock);
 272        for (i = 0; i < IWL_MVM_REF_COUNT; i++) {
 273                if (mvm->refs[i]) {
 274                        taken = true;
 275                        break;
 276                }
 277        }
 278        spin_unlock_bh(&mvm->refs_lock);
 279
 280        return taken;
 281}
 282
 283int iwl_mvm_ref_sync(struct iwl_mvm *mvm, enum iwl_mvm_ref_type ref_type)
 284{
 285        iwl_mvm_ref(mvm, ref_type);
 286
 287        if (!wait_event_timeout(mvm->d0i3_exit_waitq,
 288                                !test_bit(IWL_MVM_STATUS_IN_D0I3, &mvm->status),
 289                                HZ)) {
 290                WARN_ON_ONCE(1);
 291                iwl_mvm_unref(mvm, ref_type);
 292                return -EIO;
 293        }
 294
 295        return 0;
 296}
 297
 298static void iwl_mvm_reset_phy_ctxts(struct iwl_mvm *mvm)
 299{
 300        int i;
 301
 302        memset(mvm->phy_ctxts, 0, sizeof(mvm->phy_ctxts));
 303        for (i = 0; i < NUM_PHY_CTX; i++) {
 304                mvm->phy_ctxts[i].id = i;
 305                mvm->phy_ctxts[i].ref = 0;
 306        }
 307}
 308
 309struct ieee80211_regdomain *iwl_mvm_get_regdomain(struct wiphy *wiphy,
 310                                                  const char *alpha2,
 311                                                  enum iwl_mcc_source src_id,
 312                                                  bool *changed)
 313{
 314        struct ieee80211_regdomain *regd = NULL;
 315        struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
 316        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
 317        struct iwl_mcc_update_resp *resp;
 318
 319        IWL_DEBUG_LAR(mvm, "Getting regdomain data for %s from FW\n", alpha2);
 320
 321        lockdep_assert_held(&mvm->mutex);
 322
 323        resp = iwl_mvm_update_mcc(mvm, alpha2, src_id);
 324        if (IS_ERR_OR_NULL(resp)) {
 325                IWL_DEBUG_LAR(mvm, "Could not get update from FW %d\n",
 326                              PTR_ERR_OR_ZERO(resp));
 327                goto out;
 328        }
 329
 330        if (changed)
 331                *changed = (resp->status == MCC_RESP_NEW_CHAN_PROFILE);
 332
 333        regd = iwl_parse_nvm_mcc_info(mvm->trans->dev, mvm->cfg,
 334                                      __le32_to_cpu(resp->n_channels),
 335                                      resp->channels,
 336                                      __le16_to_cpu(resp->mcc));
 337        /* Store the return source id */
 338        src_id = resp->source_id;
 339        kfree(resp);
 340        if (IS_ERR_OR_NULL(regd)) {
 341                IWL_DEBUG_LAR(mvm, "Could not get parse update from FW %d\n",
 342                              PTR_ERR_OR_ZERO(regd));
 343                goto out;
 344        }
 345
 346        IWL_DEBUG_LAR(mvm, "setting alpha2 from FW to %s (0x%x, 0x%x) src=%d\n",
 347                      regd->alpha2, regd->alpha2[0], regd->alpha2[1], src_id);
 348        mvm->lar_regdom_set = true;
 349        mvm->mcc_src = src_id;
 350
 351out:
 352        return regd;
 353}
 354
 355void iwl_mvm_update_changed_regdom(struct iwl_mvm *mvm)
 356{
 357        bool changed;
 358        struct ieee80211_regdomain *regd;
 359
 360        if (!iwl_mvm_is_lar_supported(mvm))
 361                return;
 362
 363        regd = iwl_mvm_get_current_regdomain(mvm, &changed);
 364        if (!IS_ERR_OR_NULL(regd)) {
 365                /* only update the regulatory core if changed */
 366                if (changed)
 367                        regulatory_set_wiphy_regd(mvm->hw->wiphy, regd);
 368
 369                kfree(regd);
 370        }
 371}
 372
 373struct ieee80211_regdomain *iwl_mvm_get_current_regdomain(struct iwl_mvm *mvm,
 374                                                          bool *changed)
 375{
 376        return iwl_mvm_get_regdomain(mvm->hw->wiphy, "ZZ",
 377                                     iwl_mvm_is_wifi_mcc_supported(mvm) ?
 378                                     MCC_SOURCE_GET_CURRENT :
 379                                     MCC_SOURCE_OLD_FW, changed);
 380}
 381
 382int iwl_mvm_init_fw_regd(struct iwl_mvm *mvm)
 383{
 384        enum iwl_mcc_source used_src;
 385        struct ieee80211_regdomain *regd;
 386        int ret;
 387        bool changed;
 388        const struct ieee80211_regdomain *r =
 389                        rtnl_dereference(mvm->hw->wiphy->regd);
 390
 391        if (!r)
 392                return -ENOENT;
 393
 394        /* save the last source in case we overwrite it below */
 395        used_src = mvm->mcc_src;
 396        if (iwl_mvm_is_wifi_mcc_supported(mvm)) {
 397                /* Notify the firmware we support wifi location updates */
 398                regd = iwl_mvm_get_current_regdomain(mvm, NULL);
 399                if (!IS_ERR_OR_NULL(regd))
 400                        kfree(regd);
 401        }
 402
 403        /* Now set our last stored MCC and source */
 404        regd = iwl_mvm_get_regdomain(mvm->hw->wiphy, r->alpha2, used_src,
 405                                     &changed);
 406        if (IS_ERR_OR_NULL(regd))
 407                return -EIO;
 408
 409        /* update cfg80211 if the regdomain was changed */
 410        if (changed)
 411                ret = regulatory_set_wiphy_regd_sync_rtnl(mvm->hw->wiphy, regd);
 412        else
 413                ret = 0;
 414
 415        kfree(regd);
 416        return ret;
 417}
 418
 419int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
 420{
 421        struct ieee80211_hw *hw = mvm->hw;
 422        int num_mac, ret, i;
 423        static const u32 mvm_ciphers[] = {
 424                WLAN_CIPHER_SUITE_WEP40,
 425                WLAN_CIPHER_SUITE_WEP104,
 426                WLAN_CIPHER_SUITE_TKIP,
 427                WLAN_CIPHER_SUITE_CCMP,
 428        };
 429
 430        /* Tell mac80211 our characteristics */
 431        ieee80211_hw_set(hw, SIGNAL_DBM);
 432        ieee80211_hw_set(hw, SPECTRUM_MGMT);
 433        ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS);
 434        ieee80211_hw_set(hw, QUEUE_CONTROL);
 435        ieee80211_hw_set(hw, WANT_MONITOR_VIF);
 436        ieee80211_hw_set(hw, SUPPORTS_PS);
 437        ieee80211_hw_set(hw, SUPPORTS_DYNAMIC_PS);
 438        ieee80211_hw_set(hw, AMPDU_AGGREGATION);
 439        ieee80211_hw_set(hw, TIMING_BEACON_ONLY);
 440        ieee80211_hw_set(hw, CONNECTION_MONITOR);
 441        ieee80211_hw_set(hw, CHANCTX_STA_CSA);
 442        ieee80211_hw_set(hw, SUPPORT_FAST_XMIT);
 443        ieee80211_hw_set(hw, SUPPORTS_CLONED_SKBS);
 444        ieee80211_hw_set(hw, SUPPORTS_AMSDU_IN_AMPDU);
 445        ieee80211_hw_set(hw, NEEDS_UNIQUE_STA_ADDR);
 446        if (iwl_mvm_has_new_rx_api(mvm))
 447                ieee80211_hw_set(hw, SUPPORTS_REORDERING_BUFFER);
 448
 449        if (mvm->trans->num_rx_queues > 1)
 450                ieee80211_hw_set(hw, USES_RSS);
 451
 452        if (mvm->trans->max_skb_frags)
 453                hw->netdev_features = NETIF_F_HIGHDMA | NETIF_F_SG;
 454
 455        if (!iwl_mvm_is_dqa_supported(mvm))
 456                hw->queues = mvm->first_agg_queue;
 457        else
 458                hw->queues = IEEE80211_MAX_QUEUES;
 459        hw->offchannel_tx_hw_queue = IWL_MVM_OFFCHANNEL_QUEUE;
 460        hw->radiotap_mcs_details |= IEEE80211_RADIOTAP_MCS_HAVE_FEC |
 461                                    IEEE80211_RADIOTAP_MCS_HAVE_STBC;
 462        hw->radiotap_vht_details |= IEEE80211_RADIOTAP_VHT_KNOWN_STBC |
 463                IEEE80211_RADIOTAP_VHT_KNOWN_BEAMFORMED;
 464        hw->rate_control_algorithm = "iwl-mvm-rs";
 465        hw->uapsd_queues = IWL_MVM_UAPSD_QUEUES;
 466        hw->uapsd_max_sp_len = IWL_UAPSD_MAX_SP;
 467
 468        BUILD_BUG_ON(ARRAY_SIZE(mvm->ciphers) < ARRAY_SIZE(mvm_ciphers) + 6);
 469        memcpy(mvm->ciphers, mvm_ciphers, sizeof(mvm_ciphers));
 470        hw->wiphy->n_cipher_suites = ARRAY_SIZE(mvm_ciphers);
 471        hw->wiphy->cipher_suites = mvm->ciphers;
 472
 473        if (iwl_mvm_has_new_rx_api(mvm)) {
 474                mvm->ciphers[hw->wiphy->n_cipher_suites] =
 475                        WLAN_CIPHER_SUITE_GCMP;
 476                hw->wiphy->n_cipher_suites++;
 477                mvm->ciphers[hw->wiphy->n_cipher_suites] =
 478                        WLAN_CIPHER_SUITE_GCMP_256;
 479                hw->wiphy->n_cipher_suites++;
 480        }
 481
 482        /* Enable 11w if software crypto is not enabled (as the
 483         * firmware will interpret some mgmt packets, so enabling it
 484         * with software crypto isn't safe).
 485         */
 486        if (!iwlwifi_mod_params.sw_crypto) {
 487                ieee80211_hw_set(hw, MFP_CAPABLE);
 488                mvm->ciphers[hw->wiphy->n_cipher_suites] =
 489                        WLAN_CIPHER_SUITE_AES_CMAC;
 490                hw->wiphy->n_cipher_suites++;
 491                if (iwl_mvm_has_new_rx_api(mvm)) {
 492                        mvm->ciphers[hw->wiphy->n_cipher_suites] =
 493                                WLAN_CIPHER_SUITE_BIP_GMAC_128;
 494                        hw->wiphy->n_cipher_suites++;
 495                        mvm->ciphers[hw->wiphy->n_cipher_suites] =
 496                                WLAN_CIPHER_SUITE_BIP_GMAC_256;
 497                        hw->wiphy->n_cipher_suites++;
 498                }
 499        }
 500
 501        /* currently FW API supports only one optional cipher scheme */
 502        if (mvm->fw->cs[0].cipher) {
 503                const struct iwl_fw_cipher_scheme *fwcs = &mvm->fw->cs[0];
 504                struct ieee80211_cipher_scheme *cs = &mvm->cs[0];
 505
 506                mvm->hw->n_cipher_schemes = 1;
 507
 508                cs->cipher = le32_to_cpu(fwcs->cipher);
 509                cs->iftype = BIT(NL80211_IFTYPE_STATION);
 510                cs->hdr_len = fwcs->hdr_len;
 511                cs->pn_len = fwcs->pn_len;
 512                cs->pn_off = fwcs->pn_off;
 513                cs->key_idx_off = fwcs->key_idx_off;
 514                cs->key_idx_mask = fwcs->key_idx_mask;
 515                cs->key_idx_shift = fwcs->key_idx_shift;
 516                cs->mic_len = fwcs->mic_len;
 517
 518                mvm->hw->cipher_schemes = mvm->cs;
 519                mvm->ciphers[hw->wiphy->n_cipher_suites] = cs->cipher;
 520                hw->wiphy->n_cipher_suites++;
 521        }
 522
 523        ieee80211_hw_set(hw, SINGLE_SCAN_ON_ALL_BANDS);
 524        hw->wiphy->features |=
 525                NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR |
 526                NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR |
 527                NL80211_FEATURE_ND_RANDOM_MAC_ADDR;
 528
 529        hw->sta_data_size = sizeof(struct iwl_mvm_sta);
 530        hw->vif_data_size = sizeof(struct iwl_mvm_vif);
 531        hw->chanctx_data_size = sizeof(u16);
 532
 533        hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
 534                BIT(NL80211_IFTYPE_P2P_CLIENT) |
 535                BIT(NL80211_IFTYPE_AP) |
 536                BIT(NL80211_IFTYPE_P2P_GO) |
 537                BIT(NL80211_IFTYPE_P2P_DEVICE) |
 538                BIT(NL80211_IFTYPE_ADHOC);
 539
 540        hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
 541        hw->wiphy->regulatory_flags |= REGULATORY_ENABLE_RELAX_NO_IR;
 542        if (iwl_mvm_is_lar_supported(mvm))
 543                hw->wiphy->regulatory_flags |= REGULATORY_WIPHY_SELF_MANAGED;
 544        else
 545                hw->wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG |
 546                                               REGULATORY_DISABLE_BEACON_HINTS;
 547
 548        hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
 549        hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
 550
 551        hw->wiphy->iface_combinations = iwl_mvm_iface_combinations;
 552        hw->wiphy->n_iface_combinations =
 553                ARRAY_SIZE(iwl_mvm_iface_combinations);
 554
 555        hw->wiphy->max_remain_on_channel_duration = 10000;
 556        hw->max_listen_interval = IWL_CONN_MAX_LISTEN_INTERVAL;
 557        /* we can compensate an offset of up to 3 channels = 15 MHz */
 558        hw->wiphy->max_adj_channel_rssi_comp = 3 * 5;
 559
 560        /* Extract MAC address */
 561        memcpy(mvm->addresses[0].addr, mvm->nvm_data->hw_addr, ETH_ALEN);
 562        hw->wiphy->addresses = mvm->addresses;
 563        hw->wiphy->n_addresses = 1;
 564
 565        /* Extract additional MAC addresses if available */
 566        num_mac = (mvm->nvm_data->n_hw_addrs > 1) ?
 567                min(IWL_MVM_MAX_ADDRESSES, mvm->nvm_data->n_hw_addrs) : 1;
 568
 569        for (i = 1; i < num_mac; i++) {
 570                memcpy(mvm->addresses[i].addr, mvm->addresses[i-1].addr,
 571                       ETH_ALEN);
 572                mvm->addresses[i].addr[5]++;
 573                hw->wiphy->n_addresses++;
 574        }
 575
 576        iwl_mvm_reset_phy_ctxts(mvm);
 577
 578        hw->wiphy->max_scan_ie_len = iwl_mvm_max_scan_ie_len(mvm);
 579
 580        hw->wiphy->max_scan_ssids = PROBE_OPTION_MAX;
 581
 582        BUILD_BUG_ON(IWL_MVM_SCAN_STOPPING_MASK & IWL_MVM_SCAN_MASK);
 583        BUILD_BUG_ON(IWL_MVM_MAX_UMAC_SCANS > HWEIGHT32(IWL_MVM_SCAN_MASK) ||
 584                     IWL_MVM_MAX_LMAC_SCANS > HWEIGHT32(IWL_MVM_SCAN_MASK));
 585
 586        if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_UMAC_SCAN))
 587                mvm->max_scans = IWL_MVM_MAX_UMAC_SCANS;
 588        else
 589                mvm->max_scans = IWL_MVM_MAX_LMAC_SCANS;
 590
 591        if (mvm->nvm_data->bands[NL80211_BAND_2GHZ].n_channels)
 592                hw->wiphy->bands[NL80211_BAND_2GHZ] =
 593                        &mvm->nvm_data->bands[NL80211_BAND_2GHZ];
 594        if (mvm->nvm_data->bands[NL80211_BAND_5GHZ].n_channels) {
 595                hw->wiphy->bands[NL80211_BAND_5GHZ] =
 596                        &mvm->nvm_data->bands[NL80211_BAND_5GHZ];
 597
 598                if (fw_has_capa(&mvm->fw->ucode_capa,
 599                                IWL_UCODE_TLV_CAPA_BEAMFORMER) &&
 600                    fw_has_api(&mvm->fw->ucode_capa,
 601                               IWL_UCODE_TLV_API_LQ_SS_PARAMS))
 602                        hw->wiphy->bands[NL80211_BAND_5GHZ]->vht_cap.cap |=
 603                                IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE;
 604        }
 605
 606        hw->wiphy->hw_version = mvm->trans->hw_id;
 607
 608        if (iwlmvm_mod_params.power_scheme != IWL_POWER_SCHEME_CAM)
 609                hw->wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT;
 610        else
 611                hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT;
 612
 613        hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_SCHED_SCAN;
 614        hw->wiphy->max_sched_scan_ssids = PROBE_OPTION_MAX;
 615        hw->wiphy->max_match_sets = IWL_SCAN_MAX_PROFILES;
 616        /* we create the 802.11 header and zero length SSID IE. */
 617        hw->wiphy->max_sched_scan_ie_len =
 618                SCAN_OFFLOAD_PROBE_REQ_SIZE - 24 - 2;
 619        hw->wiphy->max_sched_scan_plans = IWL_MAX_SCHED_SCAN_PLANS;
 620        hw->wiphy->max_sched_scan_plan_interval = U16_MAX;
 621
 622        /*
 623         * the firmware uses u8 for num of iterations, but 0xff is saved for
 624         * infinite loop, so the maximum number of iterations is actually 254.
 625         */
 626        hw->wiphy->max_sched_scan_plan_iterations = 254;
 627
 628        hw->wiphy->features |= NL80211_FEATURE_P2P_GO_CTWIN |
 629                               NL80211_FEATURE_LOW_PRIORITY_SCAN |
 630                               NL80211_FEATURE_P2P_GO_OPPPS |
 631                               NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
 632                               NL80211_FEATURE_DYNAMIC_SMPS |
 633                               NL80211_FEATURE_STATIC_SMPS |
 634                               NL80211_FEATURE_SUPPORTS_WMM_ADMISSION;
 635
 636        if (fw_has_capa(&mvm->fw->ucode_capa,
 637                        IWL_UCODE_TLV_CAPA_TXPOWER_INSERTION_SUPPORT))
 638                hw->wiphy->features |= NL80211_FEATURE_TX_POWER_INSERTION;
 639        if (fw_has_capa(&mvm->fw->ucode_capa,
 640                        IWL_UCODE_TLV_CAPA_QUIET_PERIOD_SUPPORT))
 641                hw->wiphy->features |= NL80211_FEATURE_QUIET;
 642
 643        if (fw_has_capa(&mvm->fw->ucode_capa,
 644                        IWL_UCODE_TLV_CAPA_DS_PARAM_SET_IE_SUPPORT))
 645                hw->wiphy->features |=
 646                        NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES;
 647
 648        if (fw_has_capa(&mvm->fw->ucode_capa,
 649                        IWL_UCODE_TLV_CAPA_WFA_TPC_REP_IE_SUPPORT))
 650                hw->wiphy->features |= NL80211_FEATURE_WFA_TPC_IE_IN_PROBES;
 651
 652        if (fw_has_api(&mvm->fw->ucode_capa,
 653                       IWL_UCODE_TLV_API_SCAN_TSF_REPORT)) {
 654                wiphy_ext_feature_set(hw->wiphy,
 655                                      NL80211_EXT_FEATURE_SCAN_START_TIME);
 656                wiphy_ext_feature_set(hw->wiphy,
 657                                      NL80211_EXT_FEATURE_BSS_PARENT_TSF);
 658                wiphy_ext_feature_set(hw->wiphy,
 659                                      NL80211_EXT_FEATURE_SET_SCAN_DWELL);
 660        }
 661
 662        mvm->rts_threshold = IEEE80211_MAX_RTS_THRESHOLD;
 663
 664#ifdef CONFIG_PM_SLEEP
 665        if (iwl_mvm_is_d0i3_supported(mvm) &&
 666            device_can_wakeup(mvm->trans->dev)) {
 667                mvm->wowlan.flags = WIPHY_WOWLAN_ANY;
 668                hw->wiphy->wowlan = &mvm->wowlan;
 669        }
 670
 671        if (mvm->fw->img[IWL_UCODE_WOWLAN].sec[0].len &&
 672            mvm->trans->ops->d3_suspend &&
 673            mvm->trans->ops->d3_resume &&
 674            device_can_wakeup(mvm->trans->dev)) {
 675                mvm->wowlan.flags |= WIPHY_WOWLAN_MAGIC_PKT |
 676                                     WIPHY_WOWLAN_DISCONNECT |
 677                                     WIPHY_WOWLAN_EAP_IDENTITY_REQ |
 678                                     WIPHY_WOWLAN_RFKILL_RELEASE |
 679                                     WIPHY_WOWLAN_NET_DETECT;
 680                if (!iwlwifi_mod_params.sw_crypto)
 681                        mvm->wowlan.flags |= WIPHY_WOWLAN_SUPPORTS_GTK_REKEY |
 682                                             WIPHY_WOWLAN_GTK_REKEY_FAILURE |
 683                                             WIPHY_WOWLAN_4WAY_HANDSHAKE;
 684
 685                mvm->wowlan.n_patterns = IWL_WOWLAN_MAX_PATTERNS;
 686                mvm->wowlan.pattern_min_len = IWL_WOWLAN_MIN_PATTERN_LEN;
 687                mvm->wowlan.pattern_max_len = IWL_WOWLAN_MAX_PATTERN_LEN;
 688                mvm->wowlan.max_nd_match_sets = IWL_SCAN_MAX_PROFILES;
 689                mvm->wowlan.tcp = &iwl_mvm_wowlan_tcp_support;
 690                hw->wiphy->wowlan = &mvm->wowlan;
 691        }
 692#endif
 693
 694#ifdef CONFIG_IWLWIFI_BCAST_FILTERING
 695        /* assign default bcast filtering configuration */
 696        mvm->bcast_filters = iwl_mvm_default_bcast_filters;
 697#endif
 698
 699        ret = iwl_mvm_leds_init(mvm);
 700        if (ret)
 701                return ret;
 702
 703        if (fw_has_capa(&mvm->fw->ucode_capa,
 704                        IWL_UCODE_TLV_CAPA_TDLS_SUPPORT)) {
 705                IWL_DEBUG_TDLS(mvm, "TDLS supported\n");
 706                hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS;
 707                ieee80211_hw_set(hw, TDLS_WIDER_BW);
 708        }
 709
 710        if (fw_has_capa(&mvm->fw->ucode_capa,
 711                        IWL_UCODE_TLV_CAPA_TDLS_CHANNEL_SWITCH)) {
 712                IWL_DEBUG_TDLS(mvm, "TDLS channel switch supported\n");
 713                hw->wiphy->features |= NL80211_FEATURE_TDLS_CHANNEL_SWITCH;
 714        }
 715
 716        hw->netdev_features |= mvm->cfg->features;
 717        if (!iwl_mvm_is_csum_supported(mvm)) {
 718                hw->netdev_features &= ~(IWL_TX_CSUM_NETIF_FLAGS |
 719                                         NETIF_F_RXCSUM);
 720                /* We may support SW TX CSUM */
 721                if (IWL_MVM_SW_TX_CSUM_OFFLOAD)
 722                        hw->netdev_features |= IWL_TX_CSUM_NETIF_FLAGS;
 723        }
 724
 725        ret = ieee80211_register_hw(mvm->hw);
 726        if (ret)
 727                iwl_mvm_leds_exit(mvm);
 728
 729        if (mvm->cfg->vht_mu_mimo_supported)
 730                wiphy_ext_feature_set(hw->wiphy,
 731                                      NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER);
 732
 733        return ret;
 734}
 735
 736static bool iwl_mvm_defer_tx(struct iwl_mvm *mvm,
 737                             struct ieee80211_sta *sta,
 738                             struct sk_buff *skb)
 739{
 740        struct iwl_mvm_sta *mvmsta;
 741        bool defer = false;
 742
 743        /*
 744         * double check the IN_D0I3 flag both before and after
 745         * taking the spinlock, in order to prevent taking
 746         * the spinlock when not needed.
 747         */
 748        if (likely(!test_bit(IWL_MVM_STATUS_IN_D0I3, &mvm->status)))
 749                return false;
 750
 751        spin_lock(&mvm->d0i3_tx_lock);
 752        /*
 753         * testing the flag again ensures the skb dequeue
 754         * loop (on d0i3 exit) hasn't run yet.
 755         */
 756        if (!test_bit(IWL_MVM_STATUS_IN_D0I3, &mvm->status))
 757                goto out;
 758
 759        mvmsta = iwl_mvm_sta_from_mac80211(sta);
 760        if (mvmsta->sta_id == IWL_MVM_STATION_COUNT ||
 761            mvmsta->sta_id != mvm->d0i3_ap_sta_id)
 762                goto out;
 763
 764        __skb_queue_tail(&mvm->d0i3_tx, skb);
 765        ieee80211_stop_queues(mvm->hw);
 766
 767        /* trigger wakeup */
 768        iwl_mvm_ref(mvm, IWL_MVM_REF_TX);
 769        iwl_mvm_unref(mvm, IWL_MVM_REF_TX);
 770
 771        defer = true;
 772out:
 773        spin_unlock(&mvm->d0i3_tx_lock);
 774        return defer;
 775}
 776
 777static void iwl_mvm_mac_tx(struct ieee80211_hw *hw,
 778                           struct ieee80211_tx_control *control,
 779                           struct sk_buff *skb)
 780{
 781        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
 782        struct ieee80211_sta *sta = control->sta;
 783        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
 784        struct ieee80211_hdr *hdr = (void *)skb->data;
 785
 786        if (iwl_mvm_is_radio_killed(mvm)) {
 787                IWL_DEBUG_DROP(mvm, "Dropping - RF/CT KILL\n");
 788                goto drop;
 789        }
 790
 791        if (IEEE80211_SKB_CB(skb)->hw_queue == IWL_MVM_OFFCHANNEL_QUEUE &&
 792            !test_bit(IWL_MVM_STATUS_ROC_RUNNING, &mvm->status) &&
 793            !test_bit(IWL_MVM_STATUS_ROC_AUX_RUNNING, &mvm->status))
 794                goto drop;
 795
 796        /* treat non-bufferable MMPDUs as broadcast if sta is sleeping */
 797        if (unlikely(info->flags & IEEE80211_TX_CTL_NO_PS_BUFFER &&
 798                     ieee80211_is_mgmt(hdr->frame_control) &&
 799                     !ieee80211_is_deauth(hdr->frame_control) &&
 800                     !ieee80211_is_disassoc(hdr->frame_control) &&
 801                     !ieee80211_is_action(hdr->frame_control)))
 802                sta = NULL;
 803
 804        if (sta) {
 805                if (iwl_mvm_defer_tx(mvm, sta, skb))
 806                        return;
 807                if (iwl_mvm_tx_skb(mvm, skb, sta))
 808                        goto drop;
 809                return;
 810        }
 811
 812        if (iwl_mvm_tx_skb_non_sta(mvm, skb))
 813                goto drop;
 814        return;
 815 drop:
 816        ieee80211_free_txskb(hw, skb);
 817}
 818
 819static inline bool iwl_enable_rx_ampdu(const struct iwl_cfg *cfg)
 820{
 821        if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_RXAGG)
 822                return false;
 823        return true;
 824}
 825
 826static inline bool iwl_enable_tx_ampdu(const struct iwl_cfg *cfg)
 827{
 828        if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_TXAGG)
 829                return false;
 830        if (iwlwifi_mod_params.disable_11n & IWL_ENABLE_HT_TXAGG)
 831                return true;
 832
 833        /* enabled by default */
 834        return true;
 835}
 836
 837#define CHECK_BA_TRIGGER(_mvm, _trig, _tid_bm, _tid, _fmt...)   \
 838        do {                                                    \
 839                if (!(le16_to_cpu(_tid_bm) & BIT(_tid)))        \
 840                        break;                                  \
 841                iwl_mvm_fw_dbg_collect_trig(_mvm, _trig, _fmt); \
 842        } while (0)
 843
 844static void
 845iwl_mvm_ampdu_check_trigger(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
 846                            struct ieee80211_sta *sta, u16 tid, u16 rx_ba_ssn,
 847                            enum ieee80211_ampdu_mlme_action action)
 848{
 849        struct iwl_fw_dbg_trigger_tlv *trig;
 850        struct iwl_fw_dbg_trigger_ba *ba_trig;
 851
 852        if (!iwl_fw_dbg_trigger_enabled(mvm->fw, FW_DBG_TRIGGER_BA))
 853                return;
 854
 855        trig = iwl_fw_dbg_get_trigger(mvm->fw, FW_DBG_TRIGGER_BA);
 856        ba_trig = (void *)trig->data;
 857
 858        if (!iwl_fw_dbg_trigger_check_stop(mvm, vif, trig))
 859                return;
 860
 861        switch (action) {
 862        case IEEE80211_AMPDU_TX_OPERATIONAL: {
 863                struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
 864                struct iwl_mvm_tid_data *tid_data = &mvmsta->tid_data[tid];
 865
 866                CHECK_BA_TRIGGER(mvm, trig, ba_trig->tx_ba_start, tid,
 867                                 "TX AGG START: MAC %pM tid %d ssn %d\n",
 868                                 sta->addr, tid, tid_data->ssn);
 869                break;
 870                }
 871        case IEEE80211_AMPDU_TX_STOP_CONT:
 872                CHECK_BA_TRIGGER(mvm, trig, ba_trig->tx_ba_stop, tid,
 873                                 "TX AGG STOP: MAC %pM tid %d\n",
 874                                 sta->addr, tid);
 875                break;
 876        case IEEE80211_AMPDU_RX_START:
 877                CHECK_BA_TRIGGER(mvm, trig, ba_trig->rx_ba_start, tid,
 878                                 "RX AGG START: MAC %pM tid %d ssn %d\n",
 879                                 sta->addr, tid, rx_ba_ssn);
 880                break;
 881        case IEEE80211_AMPDU_RX_STOP:
 882                CHECK_BA_TRIGGER(mvm, trig, ba_trig->rx_ba_stop, tid,
 883                                 "RX AGG STOP: MAC %pM tid %d\n",
 884                                 sta->addr, tid);
 885                break;
 886        default:
 887                break;
 888        }
 889}
 890
 891static int iwl_mvm_mac_ampdu_action(struct ieee80211_hw *hw,
 892                                    struct ieee80211_vif *vif,
 893                                    struct ieee80211_ampdu_params *params)
 894{
 895        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
 896        int ret;
 897        bool tx_agg_ref = false;
 898        struct ieee80211_sta *sta = params->sta;
 899        enum ieee80211_ampdu_mlme_action action = params->action;
 900        u16 tid = params->tid;
 901        u16 *ssn = &params->ssn;
 902        u8 buf_size = params->buf_size;
 903        bool amsdu = params->amsdu;
 904        u16 timeout = params->timeout;
 905
 906        IWL_DEBUG_HT(mvm, "A-MPDU action on addr %pM tid %d: action %d\n",
 907                     sta->addr, tid, action);
 908
 909        if (!(mvm->nvm_data->sku_cap_11n_enable))
 910                return -EACCES;
 911
 912        /* return from D0i3 before starting a new Tx aggregation */
 913        switch (action) {
 914        case IEEE80211_AMPDU_TX_START:
 915        case IEEE80211_AMPDU_TX_STOP_CONT:
 916        case IEEE80211_AMPDU_TX_STOP_FLUSH:
 917        case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
 918        case IEEE80211_AMPDU_TX_OPERATIONAL:
 919                /*
 920                 * for tx start, wait synchronously until D0i3 exit to
 921                 * get the correct sequence number for the tid.
 922                 * additionally, some other ampdu actions use direct
 923                 * target access, which is not handled automatically
 924                 * by the trans layer (unlike commands), so wait for
 925                 * d0i3 exit in these cases as well.
 926                 */
 927                ret = iwl_mvm_ref_sync(mvm, IWL_MVM_REF_TX_AGG);
 928                if (ret)
 929                        return ret;
 930
 931                tx_agg_ref = true;
 932                break;
 933        default:
 934                break;
 935        }
 936
 937        mutex_lock(&mvm->mutex);
 938
 939        switch (action) {
 940        case IEEE80211_AMPDU_RX_START:
 941                if (!iwl_enable_rx_ampdu(mvm->cfg)) {
 942                        ret = -EINVAL;
 943                        break;
 944                }
 945                ret = iwl_mvm_sta_rx_agg(mvm, sta, tid, *ssn, true, buf_size,
 946                                         timeout);
 947                break;
 948        case IEEE80211_AMPDU_RX_STOP:
 949                ret = iwl_mvm_sta_rx_agg(mvm, sta, tid, 0, false, buf_size,
 950                                         timeout);
 951                break;
 952        case IEEE80211_AMPDU_TX_START:
 953                if (!iwl_enable_tx_ampdu(mvm->cfg)) {
 954                        ret = -EINVAL;
 955                        break;
 956                }
 957                ret = iwl_mvm_sta_tx_agg_start(mvm, vif, sta, tid, ssn);
 958                break;
 959        case IEEE80211_AMPDU_TX_STOP_CONT:
 960                ret = iwl_mvm_sta_tx_agg_stop(mvm, vif, sta, tid);
 961                break;
 962        case IEEE80211_AMPDU_TX_STOP_FLUSH:
 963        case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
 964                ret = iwl_mvm_sta_tx_agg_flush(mvm, vif, sta, tid);
 965                break;
 966        case IEEE80211_AMPDU_TX_OPERATIONAL:
 967                ret = iwl_mvm_sta_tx_agg_oper(mvm, vif, sta, tid,
 968                                              buf_size, amsdu);
 969                break;
 970        default:
 971                WARN_ON_ONCE(1);
 972                ret = -EINVAL;
 973                break;
 974        }
 975
 976        if (!ret) {
 977                u16 rx_ba_ssn = 0;
 978
 979                if (action == IEEE80211_AMPDU_RX_START)
 980                        rx_ba_ssn = *ssn;
 981
 982                iwl_mvm_ampdu_check_trigger(mvm, vif, sta, tid,
 983                                            rx_ba_ssn, action);
 984        }
 985        mutex_unlock(&mvm->mutex);
 986
 987        /*
 988         * If the tid is marked as started, we won't use it for offloaded
 989         * traffic on the next D0i3 entry. It's safe to unref.
 990         */
 991        if (tx_agg_ref)
 992                iwl_mvm_unref(mvm, IWL_MVM_REF_TX_AGG);
 993
 994        return ret;
 995}
 996
 997static void iwl_mvm_cleanup_iterator(void *data, u8 *mac,
 998                                     struct ieee80211_vif *vif)
 999{
1000        struct iwl_mvm *mvm = data;
1001        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
1002
1003        mvmvif->uploaded = false;
1004        mvmvif->ap_sta_id = IWL_MVM_STATION_COUNT;
1005
1006        spin_lock_bh(&mvm->time_event_lock);
1007        iwl_mvm_te_clear_data(mvm, &mvmvif->time_event_data);
1008        spin_unlock_bh(&mvm->time_event_lock);
1009
1010        mvmvif->phy_ctxt = NULL;
1011        memset(&mvmvif->bf_data, 0, sizeof(mvmvif->bf_data));
1012}
1013
1014static void iwl_mvm_restart_cleanup(struct iwl_mvm *mvm)
1015{
1016        /* clear the D3 reconfig, we only need it to avoid dumping a
1017         * firmware coredump on reconfiguration, we shouldn't do that
1018         * on D3->D0 transition
1019         */
1020        if (!test_and_clear_bit(IWL_MVM_STATUS_D3_RECONFIG, &mvm->status)) {
1021                mvm->fw_dump_desc = &iwl_mvm_dump_desc_assert;
1022                iwl_mvm_fw_error_dump(mvm);
1023        }
1024
1025        /* cleanup all stale references (scan, roc), but keep the
1026         * ucode_down ref until reconfig is complete
1027         */
1028        iwl_mvm_unref_all_except(mvm, IWL_MVM_REF_UCODE_DOWN);
1029
1030        iwl_mvm_stop_device(mvm);
1031
1032        mvm->scan_status = 0;
1033        mvm->ps_disabled = false;
1034        mvm->calibrating = false;
1035
1036        /* just in case one was running */
1037        iwl_mvm_cleanup_roc_te(mvm);
1038        ieee80211_remain_on_channel_expired(mvm->hw);
1039
1040        /*
1041         * cleanup all interfaces, even inactive ones, as some might have
1042         * gone down during the HW restart
1043         */
1044        ieee80211_iterate_interfaces(mvm->hw, 0, iwl_mvm_cleanup_iterator, mvm);
1045
1046        mvm->p2p_device_vif = NULL;
1047        mvm->d0i3_ap_sta_id = IWL_MVM_STATION_COUNT;
1048
1049        iwl_mvm_reset_phy_ctxts(mvm);
1050        memset(mvm->fw_key_table, 0, sizeof(mvm->fw_key_table));
1051        memset(mvm->sta_drained, 0, sizeof(mvm->sta_drained));
1052        memset(mvm->sta_deferred_frames, 0, sizeof(mvm->sta_deferred_frames));
1053        memset(mvm->tfd_drained, 0, sizeof(mvm->tfd_drained));
1054        memset(&mvm->last_bt_notif, 0, sizeof(mvm->last_bt_notif));
1055        memset(&mvm->last_bt_ci_cmd, 0, sizeof(mvm->last_bt_ci_cmd));
1056
1057        ieee80211_wake_queues(mvm->hw);
1058
1059        /* clear any stale d0i3 state */
1060        clear_bit(IWL_MVM_STATUS_IN_D0I3, &mvm->status);
1061
1062        mvm->vif_count = 0;
1063        mvm->rx_ba_sessions = 0;
1064        mvm->fw_dbg_conf = FW_DBG_INVALID;
1065
1066        /* keep statistics ticking */
1067        iwl_mvm_accu_radio_stats(mvm);
1068}
1069
1070int __iwl_mvm_mac_start(struct iwl_mvm *mvm)
1071{
1072        int ret;
1073
1074        lockdep_assert_held(&mvm->mutex);
1075
1076        if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) {
1077                /* Clean up some internal and mac80211 state on restart */
1078                iwl_mvm_restart_cleanup(mvm);
1079        } else {
1080                /* Hold the reference to prevent runtime suspend while
1081                 * the start procedure runs.  It's a bit confusing
1082                 * that the UCODE_DOWN reference is taken, but it just
1083                 * means "UCODE is not UP yet". ( TODO: rename this
1084                 * reference).
1085                 */
1086                iwl_mvm_ref(mvm, IWL_MVM_REF_UCODE_DOWN);
1087        }
1088        ret = iwl_mvm_up(mvm);
1089
1090        if (ret && test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) {
1091                /* Something went wrong - we need to finish some cleanup
1092                 * that normally iwl_mvm_mac_restart_complete() below
1093                 * would do.
1094                 */
1095                clear_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status);
1096                iwl_mvm_d0i3_enable_tx(mvm, NULL);
1097        }
1098
1099        return ret;
1100}
1101
1102static int iwl_mvm_mac_start(struct ieee80211_hw *hw)
1103{
1104        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
1105        int ret;
1106
1107        /* Some hw restart cleanups must not hold the mutex */
1108        if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) {
1109                /*
1110                 * Make sure we are out of d0i3. This is needed
1111                 * to make sure the reference accounting is correct
1112                 * (and there is no stale d0i3_exit_work).
1113                 */
1114                wait_event_timeout(mvm->d0i3_exit_waitq,
1115                                   !test_bit(IWL_MVM_STATUS_IN_D0I3,
1116                                             &mvm->status),
1117                                   HZ);
1118        }
1119
1120        mutex_lock(&mvm->mutex);
1121        ret = __iwl_mvm_mac_start(mvm);
1122        mutex_unlock(&mvm->mutex);
1123
1124        return ret;
1125}
1126
1127static void iwl_mvm_restart_complete(struct iwl_mvm *mvm)
1128{
1129        int ret;
1130
1131        mutex_lock(&mvm->mutex);
1132
1133        clear_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status);
1134        iwl_mvm_d0i3_enable_tx(mvm, NULL);
1135        ret = iwl_mvm_update_quotas(mvm, true, NULL);
1136        if (ret)
1137                IWL_ERR(mvm, "Failed to update quotas after restart (%d)\n",
1138                        ret);
1139
1140        /* allow transport/FW low power modes */
1141        iwl_mvm_unref(mvm, IWL_MVM_REF_UCODE_DOWN);
1142
1143        /*
1144         * If we have TDLS peers, remove them. We don't know the last seqno/PN
1145         * of packets the FW sent out, so we must reconnect.
1146         */
1147        iwl_mvm_teardown_tdls_peers(mvm);
1148
1149        mutex_unlock(&mvm->mutex);
1150}
1151
1152static void iwl_mvm_resume_complete(struct iwl_mvm *mvm)
1153{
1154        if (iwl_mvm_is_d0i3_supported(mvm) &&
1155            iwl_mvm_enter_d0i3_on_suspend(mvm))
1156                WARN_ONCE(!wait_event_timeout(mvm->d0i3_exit_waitq,
1157                                              !test_bit(IWL_MVM_STATUS_IN_D0I3,
1158                                                        &mvm->status),
1159                                              HZ),
1160                          "D0i3 exit on resume timed out\n");
1161}
1162
1163static void
1164iwl_mvm_mac_reconfig_complete(struct ieee80211_hw *hw,
1165                              enum ieee80211_reconfig_type reconfig_type)
1166{
1167        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
1168
1169        switch (reconfig_type) {
1170        case IEEE80211_RECONFIG_TYPE_RESTART:
1171                iwl_mvm_restart_complete(mvm);
1172                break;
1173        case IEEE80211_RECONFIG_TYPE_SUSPEND:
1174                iwl_mvm_resume_complete(mvm);
1175                break;
1176        }
1177}
1178
1179void __iwl_mvm_mac_stop(struct iwl_mvm *mvm)
1180{
1181        lockdep_assert_held(&mvm->mutex);
1182
1183        /* firmware counters are obviously reset now, but we shouldn't
1184         * partially track so also clear the fw_reset_accu counters.
1185         */
1186        memset(&mvm->accu_radio_stats, 0, sizeof(mvm->accu_radio_stats));
1187
1188        /* async_handlers_wk is now blocked */
1189
1190        /*
1191         * The work item could be running or queued if the
1192         * ROC time event stops just as we get here.
1193         */
1194        flush_work(&mvm->roc_done_wk);
1195
1196        iwl_mvm_stop_device(mvm);
1197
1198        iwl_mvm_async_handlers_purge(mvm);
1199        /* async_handlers_list is empty and will stay empty: HW is stopped */
1200
1201        /* the fw is stopped, the aux sta is dead: clean up driver state */
1202        iwl_mvm_del_aux_sta(mvm);
1203
1204        iwl_free_fw_paging(mvm);
1205
1206        /*
1207         * Clear IN_HW_RESTART flag when stopping the hw (as restart_complete()
1208         * won't be called in this case).
1209         * But make sure to cleanup interfaces that have gone down before/during
1210         * HW restart was requested.
1211         */
1212        if (test_and_clear_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status))
1213                ieee80211_iterate_interfaces(mvm->hw, 0,
1214                                             iwl_mvm_cleanup_iterator, mvm);
1215
1216        /* We shouldn't have any UIDs still set.  Loop over all the UIDs to
1217         * make sure there's nothing left there and warn if any is found.
1218         */
1219        if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_UMAC_SCAN)) {
1220                int i;
1221
1222                for (i = 0; i < mvm->max_scans; i++) {
1223                        if (WARN_ONCE(mvm->scan_uid_status[i],
1224                                      "UMAC scan UID %d status was not cleaned\n",
1225                                      i))
1226                                mvm->scan_uid_status[i] = 0;
1227                }
1228        }
1229}
1230
1231static void iwl_mvm_mac_stop(struct ieee80211_hw *hw)
1232{
1233        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
1234
1235        flush_work(&mvm->d0i3_exit_work);
1236        flush_work(&mvm->async_handlers_wk);
1237        flush_work(&mvm->add_stream_wk);
1238        cancel_delayed_work_sync(&mvm->fw_dump_wk);
1239        cancel_delayed_work_sync(&mvm->cs_tx_unblock_dwork);
1240        cancel_delayed_work_sync(&mvm->scan_timeout_dwork);
1241        iwl_mvm_free_fw_dump_desc(mvm);
1242
1243        mutex_lock(&mvm->mutex);
1244        __iwl_mvm_mac_stop(mvm);
1245        mutex_unlock(&mvm->mutex);
1246
1247        /*
1248         * The worker might have been waiting for the mutex, let it run and
1249         * discover that its list is now empty.
1250         */
1251        cancel_work_sync(&mvm->async_handlers_wk);
1252}
1253
1254static struct iwl_mvm_phy_ctxt *iwl_mvm_get_free_phy_ctxt(struct iwl_mvm *mvm)
1255{
1256        u16 i;
1257
1258        lockdep_assert_held(&mvm->mutex);
1259
1260        for (i = 0; i < NUM_PHY_CTX; i++)
1261                if (!mvm->phy_ctxts[i].ref)
1262                        return &mvm->phy_ctxts[i];
1263
1264        IWL_ERR(mvm, "No available PHY context\n");
1265        return NULL;
1266}
1267
1268static int iwl_mvm_set_tx_power(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1269                                s16 tx_power)
1270{
1271        struct iwl_dev_tx_power_cmd cmd = {
1272                .v3.set_mode = cpu_to_le32(IWL_TX_POWER_MODE_SET_MAC),
1273                .v3.mac_context_id =
1274                        cpu_to_le32(iwl_mvm_vif_from_mac80211(vif)->id),
1275                .v3.pwr_restriction = cpu_to_le16(8 * tx_power),
1276        };
1277        int len = sizeof(cmd);
1278
1279        if (tx_power == IWL_DEFAULT_MAX_TX_POWER)
1280                cmd.v3.pwr_restriction = cpu_to_le16(IWL_DEV_MAX_TX_POWER);
1281
1282        if (!fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_TX_POWER_ACK))
1283                len = sizeof(cmd.v3);
1284
1285        return iwl_mvm_send_cmd_pdu(mvm, REDUCE_TX_POWER_CMD, 0, len, &cmd);
1286}
1287
1288static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
1289                                     struct ieee80211_vif *vif)
1290{
1291        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
1292        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
1293        int ret;
1294
1295        mvmvif->mvm = mvm;
1296
1297        /*
1298         * make sure D0i3 exit is completed, otherwise a target access
1299         * during tx queue configuration could be done when still in
1300         * D0i3 state.
1301         */
1302        ret = iwl_mvm_ref_sync(mvm, IWL_MVM_REF_ADD_IF);
1303        if (ret)
1304                return ret;
1305
1306        /*
1307         * Not much to do here. The stack will not allow interface
1308         * types or combinations that we didn't advertise, so we
1309         * don't really have to check the types.
1310         */
1311
1312        mutex_lock(&mvm->mutex);
1313
1314        /* make sure that beacon statistics don't go backwards with FW reset */
1315        if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status))
1316                mvmvif->beacon_stats.accu_num_beacons +=
1317                        mvmvif->beacon_stats.num_beacons;
1318
1319        /* Allocate resources for the MAC context, and add it to the fw  */
1320        ret = iwl_mvm_mac_ctxt_init(mvm, vif);
1321        if (ret)
1322                goto out_unlock;
1323
1324        /* Counting number of interfaces is needed for legacy PM */
1325        if (vif->type != NL80211_IFTYPE_P2P_DEVICE)
1326                mvm->vif_count++;
1327
1328        /*
1329         * The AP binding flow can be done only after the beacon
1330         * template is configured (which happens only in the mac80211
1331         * start_ap() flow), and adding the broadcast station can happen
1332         * only after the binding.
1333         * In addition, since modifying the MAC before adding a bcast
1334         * station is not allowed by the FW, delay the adding of MAC context to
1335         * the point where we can also add the bcast station.
1336         * In short: there's not much we can do at this point, other than
1337         * allocating resources :)
1338         */
1339        if (vif->type == NL80211_IFTYPE_AP ||
1340            vif->type == NL80211_IFTYPE_ADHOC) {
1341                ret = iwl_mvm_alloc_bcast_sta(mvm, vif);
1342                if (ret) {
1343                        IWL_ERR(mvm, "Failed to allocate bcast sta\n");
1344                        goto out_release;
1345                }
1346
1347                iwl_mvm_vif_dbgfs_register(mvm, vif);
1348                goto out_unlock;
1349        }
1350
1351        mvmvif->features |= hw->netdev_features;
1352
1353        ret = iwl_mvm_mac_ctxt_add(mvm, vif);
1354        if (ret)
1355                goto out_release;
1356
1357        ret = iwl_mvm_power_update_mac(mvm);
1358        if (ret)
1359                goto out_remove_mac;
1360
1361        /* beacon filtering */
1362        ret = iwl_mvm_disable_beacon_filter(mvm, vif, 0);
1363        if (ret)
1364                goto out_remove_mac;
1365
1366        if (!mvm->bf_allowed_vif &&
1367            vif->type == NL80211_IFTYPE_STATION && !vif->p2p) {
1368                mvm->bf_allowed_vif = mvmvif;
1369                vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER |
1370                                     IEEE80211_VIF_SUPPORTS_CQM_RSSI;
1371        }
1372
1373        /*
1374         * P2P_DEVICE interface does not have a channel context assigned to it,
1375         * so a dedicated PHY context is allocated to it and the corresponding
1376         * MAC context is bound to it at this stage.
1377         */
1378        if (vif->type == NL80211_IFTYPE_P2P_DEVICE) {
1379
1380                mvmvif->phy_ctxt = iwl_mvm_get_free_phy_ctxt(mvm);
1381                if (!mvmvif->phy_ctxt) {
1382                        ret = -ENOSPC;
1383                        goto out_free_bf;
1384                }
1385
1386                iwl_mvm_phy_ctxt_ref(mvm, mvmvif->phy_ctxt);
1387                ret = iwl_mvm_binding_add_vif(mvm, vif);
1388                if (ret)
1389                        goto out_unref_phy;
1390
1391                ret = iwl_mvm_add_bcast_sta(mvm, vif);
1392                if (ret)
1393                        goto out_unbind;
1394
1395                /* Save a pointer to p2p device vif, so it can later be used to
1396                 * update the p2p device MAC when a GO is started/stopped */
1397                mvm->p2p_device_vif = vif;
1398        }
1399
1400        iwl_mvm_vif_dbgfs_register(mvm, vif);
1401        goto out_unlock;
1402
1403 out_unbind:
1404        iwl_mvm_binding_remove_vif(mvm, vif);
1405 out_unref_phy:
1406        iwl_mvm_phy_ctxt_unref(mvm, mvmvif->phy_ctxt);
1407 out_free_bf:
1408        if (mvm->bf_allowed_vif == mvmvif) {
1409                mvm->bf_allowed_vif = NULL;
1410                vif->driver_flags &= ~(IEEE80211_VIF_BEACON_FILTER |
1411                                       IEEE80211_VIF_SUPPORTS_CQM_RSSI);
1412        }
1413 out_remove_mac:
1414        mvmvif->phy_ctxt = NULL;
1415        iwl_mvm_mac_ctxt_remove(mvm, vif);
1416 out_release:
1417        if (vif->type != NL80211_IFTYPE_P2P_DEVICE)
1418                mvm->vif_count--;
1419
1420        iwl_mvm_mac_ctxt_release(mvm, vif);
1421 out_unlock:
1422        mutex_unlock(&mvm->mutex);
1423
1424        iwl_mvm_unref(mvm, IWL_MVM_REF_ADD_IF);
1425
1426        return ret;
1427}
1428
1429static void iwl_mvm_prepare_mac_removal(struct iwl_mvm *mvm,
1430                                        struct ieee80211_vif *vif)
1431{
1432        u32 tfd_msk = iwl_mvm_mac_get_queues_mask(vif);
1433
1434        if (tfd_msk) {
1435                /*
1436                 * mac80211 first removes all the stations of the vif and
1437                 * then removes the vif. When it removes a station it also
1438                 * flushes the AMPDU session. So by now, all the AMPDU sessions
1439                 * of all the stations of this vif are closed, and the queues
1440                 * of these AMPDU sessions are properly closed.
1441                 * We still need to take care of the shared queues of the vif.
1442                 * Flush them here.
1443                 */
1444                mutex_lock(&mvm->mutex);
1445                iwl_mvm_flush_tx_path(mvm, tfd_msk, 0);
1446                mutex_unlock(&mvm->mutex);
1447
1448                /*
1449                 * There are transports that buffer a few frames in the host.
1450                 * For these, the flush above isn't enough since while we were
1451                 * flushing, the transport might have sent more frames to the
1452                 * device. To solve this, wait here until the transport is
1453                 * empty. Technically, this could have replaced the flush
1454                 * above, but flush is much faster than draining. So flush
1455                 * first, and drain to make sure we have no frames in the
1456                 * transport anymore.
1457                 * If a station still had frames on the shared queues, it is
1458                 * already marked as draining, so to complete the draining, we
1459                 * just need to wait until the transport is empty.
1460                 */
1461                iwl_trans_wait_tx_queue_empty(mvm->trans, tfd_msk);
1462        }
1463
1464        if (vif->type == NL80211_IFTYPE_P2P_DEVICE) {
1465                /*
1466                 * Flush the ROC worker which will flush the OFFCHANNEL queue.
1467                 * We assume here that all the packets sent to the OFFCHANNEL
1468                 * queue are sent in ROC session.
1469                 */
1470                flush_work(&mvm->roc_done_wk);
1471        } else {
1472                /*
1473                 * By now, all the AC queues are empty. The AGG queues are
1474                 * empty too. We already got all the Tx responses for all the
1475                 * packets in the queues. The drain work can have been
1476                 * triggered. Flush it.
1477                 */
1478                flush_work(&mvm->sta_drained_wk);
1479        }
1480}
1481
1482static void iwl_mvm_mac_remove_interface(struct ieee80211_hw *hw,
1483                                         struct ieee80211_vif *vif)
1484{
1485        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
1486        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
1487
1488        iwl_mvm_prepare_mac_removal(mvm, vif);
1489
1490        mutex_lock(&mvm->mutex);
1491
1492        if (mvm->bf_allowed_vif == mvmvif) {
1493                mvm->bf_allowed_vif = NULL;
1494                vif->driver_flags &= ~(IEEE80211_VIF_BEACON_FILTER |
1495                                       IEEE80211_VIF_SUPPORTS_CQM_RSSI);
1496        }
1497
1498        iwl_mvm_vif_dbgfs_clean(mvm, vif);
1499
1500        /*
1501         * For AP/GO interface, the tear down of the resources allocated to the
1502         * interface is be handled as part of the stop_ap flow.
1503         */
1504        if (vif->type == NL80211_IFTYPE_AP ||
1505            vif->type == NL80211_IFTYPE_ADHOC) {
1506#ifdef CONFIG_NL80211_TESTMODE
1507                if (vif == mvm->noa_vif) {
1508                        mvm->noa_vif = NULL;
1509                        mvm->noa_duration = 0;
1510                }
1511#endif
1512                iwl_mvm_dealloc_bcast_sta(mvm, vif);
1513                goto out_release;
1514        }
1515
1516        if (vif->type == NL80211_IFTYPE_P2P_DEVICE) {
1517                mvm->p2p_device_vif = NULL;
1518                iwl_mvm_rm_bcast_sta(mvm, vif);
1519                iwl_mvm_binding_remove_vif(mvm, vif);
1520                iwl_mvm_phy_ctxt_unref(mvm, mvmvif->phy_ctxt);
1521                mvmvif->phy_ctxt = NULL;
1522        }
1523
1524        if (mvm->vif_count && vif->type != NL80211_IFTYPE_P2P_DEVICE)
1525                mvm->vif_count--;
1526
1527        iwl_mvm_power_update_mac(mvm);
1528        iwl_mvm_mac_ctxt_remove(mvm, vif);
1529
1530out_release:
1531        iwl_mvm_mac_ctxt_release(mvm, vif);
1532        mutex_unlock(&mvm->mutex);
1533}
1534
1535static int iwl_mvm_mac_config(struct ieee80211_hw *hw, u32 changed)
1536{
1537        return 0;
1538}
1539
1540struct iwl_mvm_mc_iter_data {
1541        struct iwl_mvm *mvm;
1542        int port_id;
1543};
1544
1545static void iwl_mvm_mc_iface_iterator(void *_data, u8 *mac,
1546                                      struct ieee80211_vif *vif)
1547{
1548        struct iwl_mvm_mc_iter_data *data = _data;
1549        struct iwl_mvm *mvm = data->mvm;
1550        struct iwl_mcast_filter_cmd *cmd = mvm->mcast_filter_cmd;
1551        int ret, len;
1552
1553        /* if we don't have free ports, mcast frames will be dropped */
1554        if (WARN_ON_ONCE(data->port_id >= MAX_PORT_ID_NUM))
1555                return;
1556
1557        if (vif->type != NL80211_IFTYPE_STATION ||
1558            !vif->bss_conf.assoc)
1559                return;
1560
1561        cmd->port_id = data->port_id++;
1562        memcpy(cmd->bssid, vif->bss_conf.bssid, ETH_ALEN);
1563        len = roundup(sizeof(*cmd) + cmd->count * ETH_ALEN, 4);
1564
1565        ret = iwl_mvm_send_cmd_pdu(mvm, MCAST_FILTER_CMD, CMD_ASYNC, len, cmd);
1566        if (ret)
1567                IWL_ERR(mvm, "mcast filter cmd error. ret=%d\n", ret);
1568}
1569
1570static void iwl_mvm_recalc_multicast(struct iwl_mvm *mvm)
1571{
1572        struct iwl_mvm_mc_iter_data iter_data = {
1573                .mvm = mvm,
1574        };
1575
1576        lockdep_assert_held(&mvm->mutex);
1577
1578        if (WARN_ON_ONCE(!mvm->mcast_filter_cmd))
1579                return;
1580
1581        ieee80211_iterate_active_interfaces_atomic(
1582                mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
1583                iwl_mvm_mc_iface_iterator, &iter_data);
1584}
1585
1586static u64 iwl_mvm_prepare_multicast(struct ieee80211_hw *hw,
1587                                     struct netdev_hw_addr_list *mc_list)
1588{
1589        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
1590        struct iwl_mcast_filter_cmd *cmd;
1591        struct netdev_hw_addr *addr;
1592        int addr_count;
1593        bool pass_all;
1594        int len;
1595
1596        addr_count = netdev_hw_addr_list_count(mc_list);
1597        pass_all = addr_count > MAX_MCAST_FILTERING_ADDRESSES ||
1598                   IWL_MVM_FW_MCAST_FILTER_PASS_ALL;
1599        if (pass_all)
1600                addr_count = 0;
1601
1602        len = roundup(sizeof(*cmd) + addr_count * ETH_ALEN, 4);
1603        cmd = kzalloc(len, GFP_ATOMIC);
1604        if (!cmd)
1605                return 0;
1606
1607        if (pass_all) {
1608                cmd->pass_all = 1;
1609                return (u64)(unsigned long)cmd;
1610        }
1611
1612        netdev_hw_addr_list_for_each(addr, mc_list) {
1613                IWL_DEBUG_MAC80211(mvm, "mcast addr (%d): %pM\n",
1614                                   cmd->count, addr->addr);
1615                memcpy(&cmd->addr_list[cmd->count * ETH_ALEN],
1616                       addr->addr, ETH_ALEN);
1617                cmd->count++;
1618        }
1619
1620        return (u64)(unsigned long)cmd;
1621}
1622
1623static void iwl_mvm_configure_filter(struct ieee80211_hw *hw,
1624                                     unsigned int changed_flags,
1625                                     unsigned int *total_flags,
1626                                     u64 multicast)
1627{
1628        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
1629        struct iwl_mcast_filter_cmd *cmd = (void *)(unsigned long)multicast;
1630
1631        mutex_lock(&mvm->mutex);
1632
1633        /* replace previous configuration */
1634        kfree(mvm->mcast_filter_cmd);
1635        mvm->mcast_filter_cmd = cmd;
1636
1637        if (!cmd)
1638                goto out;
1639
1640        iwl_mvm_recalc_multicast(mvm);
1641out:
1642        mutex_unlock(&mvm->mutex);
1643        *total_flags = 0;
1644}
1645
1646static void iwl_mvm_config_iface_filter(struct ieee80211_hw *hw,
1647                                        struct ieee80211_vif *vif,
1648                                        unsigned int filter_flags,
1649                                        unsigned int changed_flags)
1650{
1651        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
1652
1653        /* We support only filter for probe requests */
1654        if (!(changed_flags & FIF_PROBE_REQ))
1655                return;
1656
1657        /* Supported only for p2p client interfaces */
1658        if (vif->type != NL80211_IFTYPE_STATION || !vif->bss_conf.assoc ||
1659            !vif->p2p)
1660                return;
1661
1662        mutex_lock(&mvm->mutex);
1663        iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
1664        mutex_unlock(&mvm->mutex);
1665}
1666
1667#ifdef CONFIG_IWLWIFI_BCAST_FILTERING
1668struct iwl_bcast_iter_data {
1669        struct iwl_mvm *mvm;
1670        struct iwl_bcast_filter_cmd *cmd;
1671        u8 current_filter;
1672};
1673
1674static void
1675iwl_mvm_set_bcast_filter(struct ieee80211_vif *vif,
1676                         const struct iwl_fw_bcast_filter *in_filter,
1677                         struct iwl_fw_bcast_filter *out_filter)
1678{
1679        struct iwl_fw_bcast_filter_attr *attr;
1680        int i;
1681
1682        memcpy(out_filter, in_filter, sizeof(*out_filter));
1683
1684        for (i = 0; i < ARRAY_SIZE(out_filter->attrs); i++) {
1685                attr = &out_filter->attrs[i];
1686
1687                if (!attr->mask)
1688                        break;
1689
1690                switch (attr->reserved1) {
1691                case cpu_to_le16(BC_FILTER_MAGIC_IP):
1692                        if (vif->bss_conf.arp_addr_cnt != 1) {
1693                                attr->mask = 0;
1694                                continue;
1695                        }
1696
1697                        attr->val = vif->bss_conf.arp_addr_list[0];
1698                        break;
1699                case cpu_to_le16(BC_FILTER_MAGIC_MAC):
1700                        attr->val = *(__be32 *)&vif->addr[2];
1701                        break;
1702                default:
1703                        break;
1704                }
1705                attr->reserved1 = 0;
1706                out_filter->num_attrs++;
1707        }
1708}
1709
1710static void iwl_mvm_bcast_filter_iterator(void *_data, u8 *mac,
1711                                          struct ieee80211_vif *vif)
1712{
1713        struct iwl_bcast_iter_data *data = _data;
1714        struct iwl_mvm *mvm = data->mvm;
1715        struct iwl_bcast_filter_cmd *cmd = data->cmd;
1716        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
1717        struct iwl_fw_bcast_mac *bcast_mac;
1718        int i;
1719
1720        if (WARN_ON(mvmvif->id >= ARRAY_SIZE(cmd->macs)))
1721                return;
1722
1723        bcast_mac = &cmd->macs[mvmvif->id];
1724
1725        /*
1726         * enable filtering only for associated stations, but not for P2P
1727         * Clients
1728         */
1729        if (vif->type != NL80211_IFTYPE_STATION || vif->p2p ||
1730            !vif->bss_conf.assoc)
1731                return;
1732
1733        bcast_mac->default_discard = 1;
1734
1735        /* copy all configured filters */
1736        for (i = 0; mvm->bcast_filters[i].attrs[0].mask; i++) {
1737                /*
1738                 * Make sure we don't exceed our filters limit.
1739                 * if there is still a valid filter to be configured,
1740                 * be on the safe side and just allow bcast for this mac.
1741                 */
1742                if (WARN_ON_ONCE(data->current_filter >=
1743                                 ARRAY_SIZE(cmd->filters))) {
1744                        bcast_mac->default_discard = 0;
1745                        bcast_mac->attached_filters = 0;
1746                        break;
1747                }
1748
1749                iwl_mvm_set_bcast_filter(vif,
1750                                         &mvm->bcast_filters[i],
1751                                         &cmd->filters[data->current_filter]);
1752
1753                /* skip current filter if it contains no attributes */
1754                if (!cmd->filters[data->current_filter].num_attrs)
1755                        continue;
1756
1757                /* attach the filter to current mac */
1758                bcast_mac->attached_filters |=
1759                                cpu_to_le16(BIT(data->current_filter));
1760
1761                data->current_filter++;
1762        }
1763}
1764
1765bool iwl_mvm_bcast_filter_build_cmd(struct iwl_mvm *mvm,
1766                                    struct iwl_bcast_filter_cmd *cmd)
1767{
1768        struct iwl_bcast_iter_data iter_data = {
1769                .mvm = mvm,
1770                .cmd = cmd,
1771        };
1772
1773        if (IWL_MVM_FW_BCAST_FILTER_PASS_ALL)
1774                return false;
1775
1776        memset(cmd, 0, sizeof(*cmd));
1777        cmd->max_bcast_filters = ARRAY_SIZE(cmd->filters);
1778        cmd->max_macs = ARRAY_SIZE(cmd->macs);
1779
1780#ifdef CONFIG_IWLWIFI_DEBUGFS
1781        /* use debugfs filters/macs if override is configured */
1782        if (mvm->dbgfs_bcast_filtering.override) {
1783                memcpy(cmd->filters, &mvm->dbgfs_bcast_filtering.cmd.filters,
1784                       sizeof(cmd->filters));
1785                memcpy(cmd->macs, &mvm->dbgfs_bcast_filtering.cmd.macs,
1786                       sizeof(cmd->macs));
1787                return true;
1788        }
1789#endif
1790
1791        /* if no filters are configured, do nothing */
1792        if (!mvm->bcast_filters)
1793                return false;
1794
1795        /* configure and attach these filters for each associated sta vif */
1796        ieee80211_iterate_active_interfaces(
1797                mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
1798                iwl_mvm_bcast_filter_iterator, &iter_data);
1799
1800        return true;
1801}
1802
1803static int iwl_mvm_configure_bcast_filter(struct iwl_mvm *mvm)
1804{
1805        struct iwl_bcast_filter_cmd cmd;
1806
1807        if (!(mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_BCAST_FILTERING))
1808                return 0;
1809
1810        if (!iwl_mvm_bcast_filter_build_cmd(mvm, &cmd))
1811                return 0;
1812
1813        return iwl_mvm_send_cmd_pdu(mvm, BCAST_FILTER_CMD, 0,
1814                                    sizeof(cmd), &cmd);
1815}
1816#else
1817static inline int iwl_mvm_configure_bcast_filter(struct iwl_mvm *mvm)
1818{
1819        return 0;
1820}
1821#endif
1822
1823static int iwl_mvm_update_mu_groups(struct iwl_mvm *mvm,
1824                                    struct ieee80211_vif *vif)
1825{
1826        struct iwl_mu_group_mgmt_cmd cmd = {};
1827
1828        memcpy(cmd.membership_status, vif->bss_conf.mu_group.membership,
1829               WLAN_MEMBERSHIP_LEN);
1830        memcpy(cmd.user_position, vif->bss_conf.mu_group.position,
1831               WLAN_USER_POSITION_LEN);
1832
1833        return iwl_mvm_send_cmd_pdu(mvm,
1834                                    WIDE_ID(DATA_PATH_GROUP,
1835                                            UPDATE_MU_GROUPS_CMD),
1836                                    0, sizeof(cmd), &cmd);
1837}
1838
1839static void iwl_mvm_mu_mimo_iface_iterator(void *_data, u8 *mac,
1840                                           struct ieee80211_vif *vif)
1841{
1842        if (vif->mu_mimo_owner) {
1843                struct iwl_mu_group_mgmt_notif *notif = _data;
1844
1845                /*
1846                 * MU-MIMO Group Id action frame is little endian. We treat
1847                 * the data received from firmware as if it came from the
1848                 * action frame, so no conversion is needed.
1849                 */
1850                ieee80211_update_mu_groups(vif,
1851                                           (u8 *)&notif->membership_status,
1852                                           (u8 *)&notif->user_position);
1853        }
1854}
1855
1856void iwl_mvm_mu_mimo_grp_notif(struct iwl_mvm *mvm,
1857                               struct iwl_rx_cmd_buffer *rxb)
1858{
1859        struct iwl_rx_packet *pkt = rxb_addr(rxb);
1860        struct iwl_mu_group_mgmt_notif *notif = (void *)pkt->data;
1861
1862        ieee80211_iterate_active_interfaces_atomic(
1863                        mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
1864                        iwl_mvm_mu_mimo_iface_iterator, notif);
1865}
1866
1867static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
1868                                             struct ieee80211_vif *vif,
1869                                             struct ieee80211_bss_conf *bss_conf,
1870                                             u32 changes)
1871{
1872        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
1873        int ret;
1874
1875        /*
1876         * Re-calculate the tsf id, as the master-slave relations depend on the
1877         * beacon interval, which was not known when the station interface was
1878         * added.
1879         */
1880        if (changes & BSS_CHANGED_ASSOC && bss_conf->assoc)
1881                iwl_mvm_mac_ctxt_recalc_tsf_id(mvm, vif);
1882
1883        if (changes & BSS_CHANGED_ASSOC && !bss_conf->assoc &&
1884            mvmvif->lqm_active)
1885                iwl_mvm_send_lqm_cmd(vif, LQM_CMD_OPERATION_STOP_MEASUREMENT,
1886                                     0, 0);
1887
1888        /*
1889         * If we're not associated yet, take the (new) BSSID before associating
1890         * so the firmware knows. If we're already associated, then use the old
1891         * BSSID here, and we'll send a cleared one later in the CHANGED_ASSOC
1892         * branch for disassociation below.
1893         */
1894        if (changes & BSS_CHANGED_BSSID && !mvmvif->associated)
1895                memcpy(mvmvif->bssid, bss_conf->bssid, ETH_ALEN);
1896
1897        ret = iwl_mvm_mac_ctxt_changed(mvm, vif, false, mvmvif->bssid);
1898        if (ret)
1899                IWL_ERR(mvm, "failed to update MAC %pM\n", vif->addr);
1900
1901        /* after sending it once, adopt mac80211 data */
1902        memcpy(mvmvif->bssid, bss_conf->bssid, ETH_ALEN);
1903        mvmvif->associated = bss_conf->assoc;
1904
1905        if (changes & BSS_CHANGED_ASSOC) {
1906                if (bss_conf->assoc) {
1907                        /* clear statistics to get clean beacon counter */
1908                        iwl_mvm_request_statistics(mvm, true);
1909                        memset(&mvmvif->beacon_stats, 0,
1910                               sizeof(mvmvif->beacon_stats));
1911
1912                        /* add quota for this interface */
1913                        ret = iwl_mvm_update_quotas(mvm, true, NULL);
1914                        if (ret) {
1915                                IWL_ERR(mvm, "failed to update quotas\n");
1916                                return;
1917                        }
1918
1919                        if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART,
1920                                     &mvm->status)) {
1921                                /*
1922                                 * If we're restarting then the firmware will
1923                                 * obviously have lost synchronisation with
1924                                 * the AP. It will attempt to synchronise by
1925                                 * itself, but we can make it more reliable by
1926                                 * scheduling a session protection time event.
1927                                 *
1928                                 * The firmware needs to receive a beacon to
1929                                 * catch up with synchronisation, use 110% of
1930                                 * the beacon interval.
1931                                 *
1932                                 * Set a large maximum delay to allow for more
1933                                 * than a single interface.
1934                                 */
1935                                u32 dur = (11 * vif->bss_conf.beacon_int) / 10;
1936                                iwl_mvm_protect_session(mvm, vif, dur, dur,
1937                                                        5 * dur, false);
1938                        }
1939
1940                        iwl_mvm_sf_update(mvm, vif, false);
1941                        iwl_mvm_power_vif_assoc(mvm, vif);
1942                        if (vif->p2p) {
1943                                iwl_mvm_ref(mvm, IWL_MVM_REF_P2P_CLIENT);
1944                                iwl_mvm_update_smps(mvm, vif,
1945                                                    IWL_MVM_SMPS_REQ_PROT,
1946                                                    IEEE80211_SMPS_DYNAMIC);
1947                        }
1948                } else if (mvmvif->ap_sta_id != IWL_MVM_STATION_COUNT) {
1949                        /*
1950                         * If update fails - SF might be running in associated
1951                         * mode while disassociated - which is forbidden.
1952                         */
1953                        WARN_ONCE(iwl_mvm_sf_update(mvm, vif, false),
1954                                  "Failed to update SF upon disassociation\n");
1955
1956                        /* remove AP station now that the MAC is unassoc */
1957                        ret = iwl_mvm_rm_sta_id(mvm, vif, mvmvif->ap_sta_id);
1958                        if (ret)
1959                                IWL_ERR(mvm, "failed to remove AP station\n");
1960
1961                        if (mvm->d0i3_ap_sta_id == mvmvif->ap_sta_id)
1962                                mvm->d0i3_ap_sta_id = IWL_MVM_STATION_COUNT;
1963                        mvmvif->ap_sta_id = IWL_MVM_STATION_COUNT;
1964                        /* remove quota for this interface */
1965                        ret = iwl_mvm_update_quotas(mvm, false, NULL);
1966                        if (ret)
1967                                IWL_ERR(mvm, "failed to update quotas\n");
1968
1969                        if (vif->p2p)
1970                                iwl_mvm_unref(mvm, IWL_MVM_REF_P2P_CLIENT);
1971
1972                        /* this will take the cleared BSSID from bss_conf */
1973                        ret = iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
1974                        if (ret)
1975                                IWL_ERR(mvm,
1976                                        "failed to update MAC %pM (clear after unassoc)\n",
1977                                        vif->addr);
1978                }
1979
1980                /*
1981                 * The firmware tracks the MU-MIMO group on its own.
1982                 * However, on HW restart we should restore this data.
1983                 */
1984                if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status) &&
1985                    (changes & BSS_CHANGED_MU_GROUPS) && vif->mu_mimo_owner) {
1986                        ret = iwl_mvm_update_mu_groups(mvm, vif);
1987                        if (ret)
1988                                IWL_ERR(mvm,
1989                                        "failed to update VHT MU_MIMO groups\n");
1990                }
1991
1992                iwl_mvm_recalc_multicast(mvm);
1993                iwl_mvm_configure_bcast_filter(mvm);
1994
1995                /* reset rssi values */
1996                mvmvif->bf_data.ave_beacon_signal = 0;
1997
1998                iwl_mvm_bt_coex_vif_change(mvm);
1999                iwl_mvm_update_smps(mvm, vif, IWL_MVM_SMPS_REQ_TT,
2000                                    IEEE80211_SMPS_AUTOMATIC);
2001                if (fw_has_capa(&mvm->fw->ucode_capa,
2002                                IWL_UCODE_TLV_CAPA_UMAC_SCAN))
2003                        iwl_mvm_config_scan(mvm);
2004        } else if (changes & BSS_CHANGED_BEACON_INFO) {
2005                /*
2006                 * We received a beacon _after_ association so
2007                 * remove the session protection.
2008                 */
2009                iwl_mvm_remove_time_event(mvm, mvmvif,
2010                                          &mvmvif->time_event_data);
2011        }
2012
2013        if (changes & BSS_CHANGED_BEACON_INFO) {
2014                iwl_mvm_sf_update(mvm, vif, false);
2015                WARN_ON(iwl_mvm_enable_beacon_filter(mvm, vif, 0));
2016        }
2017
2018        if (changes & (BSS_CHANGED_PS | BSS_CHANGED_P2P_PS | BSS_CHANGED_QOS |
2019                       /*
2020                        * Send power command on every beacon change,
2021                        * because we may have not enabled beacon abort yet.
2022                        */
2023                       BSS_CHANGED_BEACON_INFO)) {
2024                ret = iwl_mvm_power_update_mac(mvm);
2025                if (ret)
2026                        IWL_ERR(mvm, "failed to update power mode\n");
2027        }
2028
2029        if (changes & BSS_CHANGED_TXPOWER) {
2030                IWL_DEBUG_CALIB(mvm, "Changing TX Power to %d\n",
2031                                bss_conf->txpower);
2032                iwl_mvm_set_tx_power(mvm, vif, bss_conf->txpower);
2033        }
2034
2035        if (changes & BSS_CHANGED_CQM) {
2036                IWL_DEBUG_MAC80211(mvm, "cqm info_changed\n");
2037                /* reset cqm events tracking */
2038                mvmvif->bf_data.last_cqm_event = 0;
2039                if (mvmvif->bf_data.bf_enabled) {
2040                        ret = iwl_mvm_enable_beacon_filter(mvm, vif, 0);
2041                        if (ret)
2042                                IWL_ERR(mvm,
2043                                        "failed to update CQM thresholds\n");
2044                }
2045        }
2046
2047        if (changes & BSS_CHANGED_ARP_FILTER) {
2048                IWL_DEBUG_MAC80211(mvm, "arp filter changed\n");
2049                iwl_mvm_configure_bcast_filter(mvm);
2050        }
2051}
2052
2053static int iwl_mvm_start_ap_ibss(struct ieee80211_hw *hw,
2054                                 struct ieee80211_vif *vif)
2055{
2056        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2057        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
2058        int ret;
2059
2060        /*
2061         * iwl_mvm_mac_ctxt_add() might read directly from the device
2062         * (the system time), so make sure it is available.
2063         */
2064        ret = iwl_mvm_ref_sync(mvm, IWL_MVM_REF_START_AP);
2065        if (ret)
2066                return ret;
2067
2068        mutex_lock(&mvm->mutex);
2069
2070        /* Send the beacon template */
2071        ret = iwl_mvm_mac_ctxt_beacon_changed(mvm, vif);
2072        if (ret)
2073                goto out_unlock;
2074
2075        /*
2076         * Re-calculate the tsf id, as the master-slave relations depend on the
2077         * beacon interval, which was not known when the AP interface was added.
2078         */
2079        if (vif->type == NL80211_IFTYPE_AP)
2080                iwl_mvm_mac_ctxt_recalc_tsf_id(mvm, vif);
2081
2082        mvmvif->ap_assoc_sta_count = 0;
2083
2084        /* Add the mac context */
2085        ret = iwl_mvm_mac_ctxt_add(mvm, vif);
2086        if (ret)
2087                goto out_unlock;
2088
2089        /* Perform the binding */
2090        ret = iwl_mvm_binding_add_vif(mvm, vif);
2091        if (ret)
2092                goto out_remove;
2093
2094        /* Send the bcast station. At this stage the TBTT and DTIM time events
2095         * are added and applied to the scheduler */
2096        ret = iwl_mvm_send_add_bcast_sta(mvm, vif);
2097        if (ret)
2098                goto out_unbind;
2099
2100        /* must be set before quota calculations */
2101        mvmvif->ap_ibss_active = true;
2102
2103        /* power updated needs to be done before quotas */
2104        iwl_mvm_power_update_mac(mvm);
2105
2106        ret = iwl_mvm_update_quotas(mvm, false, NULL);
2107        if (ret)
2108                goto out_quota_failed;
2109
2110        /* Need to update the P2P Device MAC (only GO, IBSS is single vif) */
2111        if (vif->p2p && mvm->p2p_device_vif)
2112                iwl_mvm_mac_ctxt_changed(mvm, mvm->p2p_device_vif, false, NULL);
2113
2114        iwl_mvm_ref(mvm, IWL_MVM_REF_AP_IBSS);
2115
2116        iwl_mvm_bt_coex_vif_change(mvm);
2117
2118        /* we don't support TDLS during DCM */
2119        if (iwl_mvm_phy_ctx_count(mvm) > 1)
2120                iwl_mvm_teardown_tdls_peers(mvm);
2121
2122        goto out_unlock;
2123
2124out_quota_failed:
2125        iwl_mvm_power_update_mac(mvm);
2126        mvmvif->ap_ibss_active = false;
2127        iwl_mvm_send_rm_bcast_sta(mvm, vif);
2128out_unbind:
2129        iwl_mvm_binding_remove_vif(mvm, vif);
2130out_remove:
2131        iwl_mvm_mac_ctxt_remove(mvm, vif);
2132out_unlock:
2133        mutex_unlock(&mvm->mutex);
2134        iwl_mvm_unref(mvm, IWL_MVM_REF_START_AP);
2135        return ret;
2136}
2137
2138static void iwl_mvm_stop_ap_ibss(struct ieee80211_hw *hw,
2139                                 struct ieee80211_vif *vif)
2140{
2141        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2142        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
2143
2144        iwl_mvm_prepare_mac_removal(mvm, vif);
2145
2146        mutex_lock(&mvm->mutex);
2147
2148        /* Handle AP stop while in CSA */
2149        if (rcu_access_pointer(mvm->csa_vif) == vif) {
2150                iwl_mvm_remove_time_event(mvm, mvmvif,
2151                                          &mvmvif->time_event_data);
2152                RCU_INIT_POINTER(mvm->csa_vif, NULL);
2153                mvmvif->csa_countdown = false;
2154        }
2155
2156        if (rcu_access_pointer(mvm->csa_tx_blocked_vif) == vif) {
2157                RCU_INIT_POINTER(mvm->csa_tx_blocked_vif, NULL);
2158                mvm->csa_tx_block_bcn_timeout = 0;
2159        }
2160
2161        mvmvif->ap_ibss_active = false;
2162        mvm->ap_last_beacon_gp2 = 0;
2163
2164        iwl_mvm_bt_coex_vif_change(mvm);
2165
2166        iwl_mvm_unref(mvm, IWL_MVM_REF_AP_IBSS);
2167
2168        /* Need to update the P2P Device MAC (only GO, IBSS is single vif) */
2169        if (vif->p2p && mvm->p2p_device_vif)
2170                iwl_mvm_mac_ctxt_changed(mvm, mvm->p2p_device_vif, false, NULL);
2171
2172        iwl_mvm_update_quotas(mvm, false, NULL);
2173        iwl_mvm_send_rm_bcast_sta(mvm, vif);
2174        iwl_mvm_binding_remove_vif(mvm, vif);
2175
2176        iwl_mvm_power_update_mac(mvm);
2177
2178        iwl_mvm_mac_ctxt_remove(mvm, vif);
2179
2180        mutex_unlock(&mvm->mutex);
2181}
2182
2183static void
2184iwl_mvm_bss_info_changed_ap_ibss(struct iwl_mvm *mvm,
2185                                 struct ieee80211_vif *vif,
2186                                 struct ieee80211_bss_conf *bss_conf,
2187                                 u32 changes)
2188{
2189        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
2190
2191        /* Changes will be applied when the AP/IBSS is started */
2192        if (!mvmvif->ap_ibss_active)
2193                return;
2194
2195        if (changes & (BSS_CHANGED_ERP_CTS_PROT | BSS_CHANGED_HT |
2196                       BSS_CHANGED_BANDWIDTH | BSS_CHANGED_QOS) &&
2197            iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL))
2198                IWL_ERR(mvm, "failed to update MAC %pM\n", vif->addr);
2199
2200        /* Need to send a new beacon template to the FW */
2201        if (changes & BSS_CHANGED_BEACON &&
2202            iwl_mvm_mac_ctxt_beacon_changed(mvm, vif))
2203                IWL_WARN(mvm, "Failed updating beacon data\n");
2204
2205        if (changes & BSS_CHANGED_TXPOWER) {
2206                IWL_DEBUG_CALIB(mvm, "Changing TX Power to %d\n",
2207                                bss_conf->txpower);
2208                iwl_mvm_set_tx_power(mvm, vif, bss_conf->txpower);
2209        }
2210}
2211
2212static void iwl_mvm_bss_info_changed(struct ieee80211_hw *hw,
2213                                     struct ieee80211_vif *vif,
2214                                     struct ieee80211_bss_conf *bss_conf,
2215                                     u32 changes)
2216{
2217        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2218
2219        /*
2220         * iwl_mvm_bss_info_changed_station() might call
2221         * iwl_mvm_protect_session(), which reads directly from
2222         * the device (the system time), so make sure it is available.
2223         */
2224        if (iwl_mvm_ref_sync(mvm, IWL_MVM_REF_BSS_CHANGED))
2225                return;
2226
2227        mutex_lock(&mvm->mutex);
2228
2229        if (changes & BSS_CHANGED_IDLE && !bss_conf->idle)
2230                iwl_mvm_scan_stop(mvm, IWL_MVM_SCAN_SCHED, true);
2231
2232        switch (vif->type) {
2233        case NL80211_IFTYPE_STATION:
2234                iwl_mvm_bss_info_changed_station(mvm, vif, bss_conf, changes);
2235                break;
2236        case NL80211_IFTYPE_AP:
2237        case NL80211_IFTYPE_ADHOC:
2238                iwl_mvm_bss_info_changed_ap_ibss(mvm, vif, bss_conf, changes);
2239                break;
2240        case NL80211_IFTYPE_MONITOR:
2241                if (changes & BSS_CHANGED_MU_GROUPS)
2242                        iwl_mvm_update_mu_groups(mvm, vif);
2243                break;
2244        default:
2245                /* shouldn't happen */
2246                WARN_ON_ONCE(1);
2247        }
2248
2249        mutex_unlock(&mvm->mutex);
2250        iwl_mvm_unref(mvm, IWL_MVM_REF_BSS_CHANGED);
2251}
2252
2253static int iwl_mvm_mac_hw_scan(struct ieee80211_hw *hw,
2254                               struct ieee80211_vif *vif,
2255                               struct ieee80211_scan_request *hw_req)
2256{
2257        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2258        int ret;
2259
2260        if (hw_req->req.n_channels == 0 ||
2261            hw_req->req.n_channels > mvm->fw->ucode_capa.n_scan_channels)
2262                return -EINVAL;
2263
2264        mutex_lock(&mvm->mutex);
2265        ret = iwl_mvm_reg_scan_start(mvm, vif, &hw_req->req, &hw_req->ies);
2266        mutex_unlock(&mvm->mutex);
2267
2268        return ret;
2269}
2270
2271static void iwl_mvm_mac_cancel_hw_scan(struct ieee80211_hw *hw,
2272                                       struct ieee80211_vif *vif)
2273{
2274        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2275
2276        mutex_lock(&mvm->mutex);
2277
2278        /* Due to a race condition, it's possible that mac80211 asks
2279         * us to stop a hw_scan when it's already stopped.  This can
2280         * happen, for instance, if we stopped the scan ourselves,
2281         * called ieee80211_scan_completed() and the userspace called
2282         * cancel scan scan before ieee80211_scan_work() could run.
2283         * To handle that, simply return if the scan is not running.
2284        */
2285        if (mvm->scan_status & IWL_MVM_SCAN_REGULAR)
2286                iwl_mvm_scan_stop(mvm, IWL_MVM_SCAN_REGULAR, true);
2287
2288        mutex_unlock(&mvm->mutex);
2289}
2290
2291static void
2292iwl_mvm_mac_allow_buffered_frames(struct ieee80211_hw *hw,
2293                                  struct ieee80211_sta *sta, u16 tids,
2294                                  int num_frames,
2295                                  enum ieee80211_frame_release_type reason,
2296                                  bool more_data)
2297{
2298        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2299
2300        /* Called when we need to transmit (a) frame(s) from mac80211 */
2301
2302        iwl_mvm_sta_modify_sleep_tx_count(mvm, sta, reason, num_frames,
2303                                          tids, more_data, false);
2304}
2305
2306static void
2307iwl_mvm_mac_release_buffered_frames(struct ieee80211_hw *hw,
2308                                    struct ieee80211_sta *sta, u16 tids,
2309                                    int num_frames,
2310                                    enum ieee80211_frame_release_type reason,
2311                                    bool more_data)
2312{
2313        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2314
2315        /* Called when we need to transmit (a) frame(s) from agg queue */
2316
2317        iwl_mvm_sta_modify_sleep_tx_count(mvm, sta, reason, num_frames,
2318                                          tids, more_data, true);
2319}
2320
2321static void iwl_mvm_mac_sta_notify(struct ieee80211_hw *hw,
2322                                   struct ieee80211_vif *vif,
2323                                   enum sta_notify_cmd cmd,
2324                                   struct ieee80211_sta *sta)
2325{
2326        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2327        struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
2328        unsigned long txqs = 0, tids = 0;
2329        int tid;
2330
2331        spin_lock_bh(&mvmsta->lock);
2332        for (tid = 0; tid < IWL_MAX_TID_COUNT; tid++) {
2333                struct iwl_mvm_tid_data *tid_data = &mvmsta->tid_data[tid];
2334
2335                if (tid_data->state != IWL_AGG_ON &&
2336                    tid_data->state != IWL_EMPTYING_HW_QUEUE_DELBA)
2337                        continue;
2338
2339                __set_bit(tid_data->txq_id, &txqs);
2340
2341                if (iwl_mvm_tid_queued(tid_data) == 0)
2342                        continue;
2343
2344                __set_bit(tid, &tids);
2345        }
2346
2347        switch (cmd) {
2348        case STA_NOTIFY_SLEEP:
2349                if (atomic_read(&mvm->pending_frames[mvmsta->sta_id]) > 0)
2350                        ieee80211_sta_block_awake(hw, sta, true);
2351
2352                for_each_set_bit(tid, &tids, IWL_MAX_TID_COUNT)
2353                        ieee80211_sta_set_buffered(sta, tid, true);
2354
2355                if (txqs)
2356                        iwl_trans_freeze_txq_timer(mvm->trans, txqs, true);
2357                /*
2358                 * The fw updates the STA to be asleep. Tx packets on the Tx
2359                 * queues to this station will not be transmitted. The fw will
2360                 * send a Tx response with TX_STATUS_FAIL_DEST_PS.
2361                 */
2362                break;
2363        case STA_NOTIFY_AWAKE:
2364                if (WARN_ON(mvmsta->sta_id == IWL_MVM_STATION_COUNT))
2365                        break;
2366
2367                if (txqs)
2368                        iwl_trans_freeze_txq_timer(mvm->trans, txqs, false);
2369                iwl_mvm_sta_modify_ps_wake(mvm, sta);
2370                break;
2371        default:
2372                break;
2373        }
2374        spin_unlock_bh(&mvmsta->lock);
2375}
2376
2377static void iwl_mvm_sta_pre_rcu_remove(struct ieee80211_hw *hw,
2378                                       struct ieee80211_vif *vif,
2379                                       struct ieee80211_sta *sta)
2380{
2381        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2382        struct iwl_mvm_sta *mvm_sta = iwl_mvm_sta_from_mac80211(sta);
2383
2384        /*
2385         * This is called before mac80211 does RCU synchronisation,
2386         * so here we already invalidate our internal RCU-protected
2387         * station pointer. The rest of the code will thus no longer
2388         * be able to find the station this way, and we don't rely
2389         * on further RCU synchronisation after the sta_state()
2390         * callback deleted the station.
2391         */
2392        mutex_lock(&mvm->mutex);
2393        if (sta == rcu_access_pointer(mvm->fw_id_to_mac_id[mvm_sta->sta_id]))
2394                rcu_assign_pointer(mvm->fw_id_to_mac_id[mvm_sta->sta_id],
2395                                   ERR_PTR(-ENOENT));
2396
2397        mutex_unlock(&mvm->mutex);
2398}
2399
2400static void iwl_mvm_check_uapsd(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
2401                                const u8 *bssid)
2402{
2403        if (!(mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT))
2404                return;
2405
2406        if (vif->p2p && !iwl_mvm_is_p2p_scm_uapsd_supported(mvm)) {
2407                vif->driver_flags &= ~IEEE80211_VIF_SUPPORTS_UAPSD;
2408                return;
2409        }
2410
2411        if (!vif->p2p &&
2412            (iwlwifi_mod_params.uapsd_disable & IWL_DISABLE_UAPSD_BSS)) {
2413                vif->driver_flags &= ~IEEE80211_VIF_SUPPORTS_UAPSD;
2414                return;
2415        }
2416
2417        vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
2418}
2419
2420static void
2421iwl_mvm_tdls_check_trigger(struct iwl_mvm *mvm,
2422                           struct ieee80211_vif *vif, u8 *peer_addr,
2423                           enum nl80211_tdls_operation action)
2424{
2425        struct iwl_fw_dbg_trigger_tlv *trig;
2426        struct iwl_fw_dbg_trigger_tdls *tdls_trig;
2427
2428        if (!iwl_fw_dbg_trigger_enabled(mvm->fw, FW_DBG_TRIGGER_TDLS))
2429                return;
2430
2431        trig = iwl_fw_dbg_get_trigger(mvm->fw, FW_DBG_TRIGGER_TDLS);
2432        tdls_trig = (void *)trig->data;
2433        if (!iwl_fw_dbg_trigger_check_stop(mvm, vif, trig))
2434                return;
2435
2436        if (!(tdls_trig->action_bitmap & BIT(action)))
2437                return;
2438
2439        if (tdls_trig->peer_mode &&
2440            memcmp(tdls_trig->peer, peer_addr, ETH_ALEN) != 0)
2441                return;
2442
2443        iwl_mvm_fw_dbg_collect_trig(mvm, trig,
2444                                    "TDLS event occurred, peer %pM, action %d",
2445                                    peer_addr, action);
2446}
2447
2448static void iwl_mvm_purge_deferred_tx_frames(struct iwl_mvm *mvm,
2449                                             struct iwl_mvm_sta *mvm_sta)
2450{
2451        struct iwl_mvm_tid_data *tid_data;
2452        struct sk_buff *skb;
2453        int i;
2454
2455        spin_lock_bh(&mvm_sta->lock);
2456        for (i = 0; i <= IWL_MAX_TID_COUNT; i++) {
2457                tid_data = &mvm_sta->tid_data[i];
2458                while ((skb = __skb_dequeue(&tid_data->deferred_tx_frames)))
2459                        ieee80211_free_txskb(mvm->hw, skb);
2460        }
2461        spin_unlock_bh(&mvm_sta->lock);
2462}
2463
2464static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw,
2465                                 struct ieee80211_vif *vif,
2466                                 struct ieee80211_sta *sta,
2467                                 enum ieee80211_sta_state old_state,
2468                                 enum ieee80211_sta_state new_state)
2469{
2470        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2471        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
2472        int ret;
2473
2474        IWL_DEBUG_MAC80211(mvm, "station %pM state change %d->%d\n",
2475                           sta->addr, old_state, new_state);
2476
2477        /* this would be a mac80211 bug ... but don't crash */
2478        if (WARN_ON_ONCE(!mvmvif->phy_ctxt))
2479                return -EINVAL;
2480
2481        /* if a STA is being removed, reuse its ID */
2482        flush_work(&mvm->sta_drained_wk);
2483
2484        /*
2485         * If we are in a STA removal flow and in DQA mode:
2486         *
2487         * This is after the sync_rcu part, so the queues have already been
2488         * flushed. No more TXs on their way in mac80211's path, and no more in
2489         * the queues.
2490         * Also, we won't be getting any new TX frames for this station.
2491         * What we might have are deferred TX frames that need to be taken care
2492         * of.
2493         *
2494         * Drop any still-queued deferred-frame before removing the STA, and
2495         * make sure the worker is no longer handling frames for this STA.
2496         */
2497        if (old_state == IEEE80211_STA_NONE &&
2498            new_state == IEEE80211_STA_NOTEXIST &&
2499            iwl_mvm_is_dqa_supported(mvm)) {
2500                struct iwl_mvm_sta *mvm_sta = iwl_mvm_sta_from_mac80211(sta);
2501
2502                iwl_mvm_purge_deferred_tx_frames(mvm, mvm_sta);
2503                flush_work(&mvm->add_stream_wk);
2504
2505                /*
2506                 * No need to make sure deferred TX indication is off since the
2507                 * worker will already remove it if it was on
2508                 */
2509        }
2510
2511        mutex_lock(&mvm->mutex);
2512        if (old_state == IEEE80211_STA_NOTEXIST &&
2513            new_state == IEEE80211_STA_NONE) {
2514                /*
2515                 * Firmware bug - it'll crash if the beacon interval is less
2516                 * than 16. We can't avoid connecting at all, so refuse the
2517                 * station state change, this will cause mac80211 to abandon
2518                 * attempts to connect to this AP, and eventually wpa_s will
2519                 * blacklist the AP...
2520                 */
2521                if (vif->type == NL80211_IFTYPE_STATION &&
2522                    vif->bss_conf.beacon_int < 16) {
2523                        IWL_ERR(mvm,
2524                                "AP %pM beacon interval is %d, refusing due to firmware bug!\n",
2525                                sta->addr, vif->bss_conf.beacon_int);
2526                        ret = -EINVAL;
2527                        goto out_unlock;
2528                }
2529
2530                if (sta->tdls &&
2531                    (vif->p2p ||
2532                     iwl_mvm_tdls_sta_count(mvm, NULL) ==
2533                                                IWL_MVM_TDLS_STA_COUNT ||
2534                     iwl_mvm_phy_ctx_count(mvm) > 1)) {
2535                        IWL_DEBUG_MAC80211(mvm, "refusing TDLS sta\n");
2536                        ret = -EBUSY;
2537                        goto out_unlock;
2538                }
2539
2540                ret = iwl_mvm_add_sta(mvm, vif, sta);
2541                if (sta->tdls && ret == 0) {
2542                        iwl_mvm_recalc_tdls_state(mvm, vif, true);
2543                        iwl_mvm_tdls_check_trigger(mvm, vif, sta->addr,
2544                                                   NL80211_TDLS_SETUP);
2545                }
2546        } else if (old_state == IEEE80211_STA_NONE &&
2547                   new_state == IEEE80211_STA_AUTH) {
2548                /*
2549                 * EBS may be disabled due to previous failures reported by FW.
2550                 * Reset EBS status here assuming environment has been changed.
2551                 */
2552                mvm->last_ebs_successful = true;
2553                iwl_mvm_check_uapsd(mvm, vif, sta->addr);
2554                ret = 0;
2555        } else if (old_state == IEEE80211_STA_AUTH &&
2556                   new_state == IEEE80211_STA_ASSOC) {
2557                if (vif->type == NL80211_IFTYPE_AP) {
2558                        mvmvif->ap_assoc_sta_count++;
2559                        iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
2560                }
2561                ret = iwl_mvm_update_sta(mvm, vif, sta);
2562                if (ret == 0)
2563                        iwl_mvm_rs_rate_init(mvm, sta,
2564                                             mvmvif->phy_ctxt->channel->band,
2565                                             true);
2566        } else if (old_state == IEEE80211_STA_ASSOC &&
2567                   new_state == IEEE80211_STA_AUTHORIZED) {
2568
2569                /* we don't support TDLS during DCM */
2570                if (iwl_mvm_phy_ctx_count(mvm) > 1)
2571                        iwl_mvm_teardown_tdls_peers(mvm);
2572
2573                if (sta->tdls)
2574                        iwl_mvm_tdls_check_trigger(mvm, vif, sta->addr,
2575                                                   NL80211_TDLS_ENABLE_LINK);
2576
2577                /* enable beacon filtering */
2578                WARN_ON(iwl_mvm_enable_beacon_filter(mvm, vif, 0));
2579                ret = 0;
2580        } else if (old_state == IEEE80211_STA_AUTHORIZED &&
2581                   new_state == IEEE80211_STA_ASSOC) {
2582                /* disable beacon filtering */
2583                WARN_ON(iwl_mvm_disable_beacon_filter(mvm, vif, 0));
2584                ret = 0;
2585        } else if (old_state == IEEE80211_STA_ASSOC &&
2586                   new_state == IEEE80211_STA_AUTH) {
2587                if (vif->type == NL80211_IFTYPE_AP) {
2588                        mvmvif->ap_assoc_sta_count--;
2589                        iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
2590                }
2591                ret = 0;
2592        } else if (old_state == IEEE80211_STA_AUTH &&
2593                   new_state == IEEE80211_STA_NONE) {
2594                ret = 0;
2595        } else if (old_state == IEEE80211_STA_NONE &&
2596                   new_state == IEEE80211_STA_NOTEXIST) {
2597                ret = iwl_mvm_rm_sta(mvm, vif, sta);
2598                if (sta->tdls) {
2599                        iwl_mvm_recalc_tdls_state(mvm, vif, false);
2600                        iwl_mvm_tdls_check_trigger(mvm, vif, sta->addr,
2601                                                   NL80211_TDLS_DISABLE_LINK);
2602                }
2603        } else {
2604                ret = -EIO;
2605        }
2606 out_unlock:
2607        mutex_unlock(&mvm->mutex);
2608
2609        if (sta->tdls && ret == 0) {
2610                if (old_state == IEEE80211_STA_NOTEXIST &&
2611                    new_state == IEEE80211_STA_NONE)
2612                        ieee80211_reserve_tid(sta, IWL_MVM_TDLS_FW_TID);
2613                else if (old_state == IEEE80211_STA_NONE &&
2614                         new_state == IEEE80211_STA_NOTEXIST)
2615                        ieee80211_unreserve_tid(sta, IWL_MVM_TDLS_FW_TID);
2616        }
2617
2618        return ret;
2619}
2620
2621static int iwl_mvm_mac_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
2622{
2623        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2624
2625        mvm->rts_threshold = value;
2626
2627        return 0;
2628}
2629
2630static void iwl_mvm_sta_rc_update(struct ieee80211_hw *hw,
2631                                  struct ieee80211_vif *vif,
2632                                  struct ieee80211_sta *sta, u32 changed)
2633{
2634        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2635
2636        if (vif->type == NL80211_IFTYPE_STATION &&
2637            changed & IEEE80211_RC_NSS_CHANGED)
2638                iwl_mvm_sf_update(mvm, vif, false);
2639}
2640
2641static int iwl_mvm_mac_conf_tx(struct ieee80211_hw *hw,
2642                               struct ieee80211_vif *vif, u16 ac,
2643                               const struct ieee80211_tx_queue_params *params)
2644{
2645        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2646        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
2647
2648        mvmvif->queue_params[ac] = *params;
2649
2650        /*
2651         * No need to update right away, we'll get BSS_CHANGED_QOS
2652         * The exception is P2P_DEVICE interface which needs immediate update.
2653         */
2654        if (vif->type == NL80211_IFTYPE_P2P_DEVICE) {
2655                int ret;
2656
2657                mutex_lock(&mvm->mutex);
2658                ret = iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
2659                mutex_unlock(&mvm->mutex);
2660                return ret;
2661        }
2662        return 0;
2663}
2664
2665static void iwl_mvm_mac_mgd_prepare_tx(struct ieee80211_hw *hw,
2666                                      struct ieee80211_vif *vif)
2667{
2668        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2669        u32 duration = IWL_MVM_TE_SESSION_PROTECTION_MAX_TIME_MS;
2670        u32 min_duration = IWL_MVM_TE_SESSION_PROTECTION_MIN_TIME_MS;
2671
2672        if (WARN_ON_ONCE(vif->bss_conf.assoc))
2673                return;
2674
2675        /*
2676         * iwl_mvm_protect_session() reads directly from the device
2677         * (the system time), so make sure it is available.
2678         */
2679        if (iwl_mvm_ref_sync(mvm, IWL_MVM_REF_PREPARE_TX))
2680                return;
2681
2682        mutex_lock(&mvm->mutex);
2683        /* Try really hard to protect the session and hear a beacon */
2684        iwl_mvm_protect_session(mvm, vif, duration, min_duration, 500, false);
2685        mutex_unlock(&mvm->mutex);
2686
2687        iwl_mvm_unref(mvm, IWL_MVM_REF_PREPARE_TX);
2688}
2689
2690static int iwl_mvm_mac_sched_scan_start(struct ieee80211_hw *hw,
2691                                        struct ieee80211_vif *vif,
2692                                        struct cfg80211_sched_scan_request *req,
2693                                        struct ieee80211_scan_ies *ies)
2694{
2695        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2696
2697        int ret;
2698
2699        mutex_lock(&mvm->mutex);
2700
2701        if (!vif->bss_conf.idle) {
2702                ret = -EBUSY;
2703                goto out;
2704        }
2705
2706        ret = iwl_mvm_sched_scan_start(mvm, vif, req, ies, IWL_MVM_SCAN_SCHED);
2707
2708out:
2709        mutex_unlock(&mvm->mutex);
2710        return ret;
2711}
2712
2713static int iwl_mvm_mac_sched_scan_stop(struct ieee80211_hw *hw,
2714                                       struct ieee80211_vif *vif)
2715{
2716        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2717        int ret;
2718
2719        mutex_lock(&mvm->mutex);
2720
2721        /* Due to a race condition, it's possible that mac80211 asks
2722         * us to stop a sched_scan when it's already stopped.  This
2723         * can happen, for instance, if we stopped the scan ourselves,
2724         * called ieee80211_sched_scan_stopped() and the userspace called
2725         * stop sched scan scan before ieee80211_sched_scan_stopped_work()
2726         * could run.  To handle this, simply return if the scan is
2727         * not running.
2728        */
2729        if (!(mvm->scan_status & IWL_MVM_SCAN_SCHED)) {
2730                mutex_unlock(&mvm->mutex);
2731                return 0;
2732        }
2733
2734        ret = iwl_mvm_scan_stop(mvm, IWL_MVM_SCAN_SCHED, false);
2735        mutex_unlock(&mvm->mutex);
2736        iwl_mvm_wait_for_async_handlers(mvm);
2737
2738        return ret;
2739}
2740
2741static int iwl_mvm_mac_set_key(struct ieee80211_hw *hw,
2742                               enum set_key_cmd cmd,
2743                               struct ieee80211_vif *vif,
2744                               struct ieee80211_sta *sta,
2745                               struct ieee80211_key_conf *key)
2746{
2747        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2748        struct iwl_mvm_sta *mvmsta;
2749        struct iwl_mvm_key_pn *ptk_pn;
2750        int keyidx = key->keyidx;
2751        int ret;
2752        u8 key_offset;
2753
2754        if (iwlwifi_mod_params.sw_crypto) {
2755                IWL_DEBUG_MAC80211(mvm, "leave - hwcrypto disabled\n");
2756                return -EOPNOTSUPP;
2757        }
2758
2759        switch (key->cipher) {
2760        case WLAN_CIPHER_SUITE_TKIP:
2761                key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
2762                key->flags |= IEEE80211_KEY_FLAG_PUT_IV_SPACE;
2763                break;
2764        case WLAN_CIPHER_SUITE_CCMP:
2765        case WLAN_CIPHER_SUITE_GCMP:
2766        case WLAN_CIPHER_SUITE_GCMP_256:
2767                key->flags |= IEEE80211_KEY_FLAG_PUT_IV_SPACE;
2768                break;
2769        case WLAN_CIPHER_SUITE_AES_CMAC:
2770        case WLAN_CIPHER_SUITE_BIP_GMAC_128:
2771        case WLAN_CIPHER_SUITE_BIP_GMAC_256:
2772                WARN_ON_ONCE(!ieee80211_hw_check(hw, MFP_CAPABLE));
2773                break;
2774        case WLAN_CIPHER_SUITE_WEP40:
2775        case WLAN_CIPHER_SUITE_WEP104:
2776                /* For non-client mode, only use WEP keys for TX as we probably
2777                 * don't have a station yet anyway and would then have to keep
2778                 * track of the keys, linking them to each of the clients/peers
2779                 * as they appear. For now, don't do that, for performance WEP
2780                 * offload doesn't really matter much, but we need it for some
2781                 * other offload features in client mode.
2782                 */
2783                if (vif->type != NL80211_IFTYPE_STATION)
2784                        return 0;
2785                break;
2786        default:
2787                /* currently FW supports only one optional cipher scheme */
2788                if (hw->n_cipher_schemes &&
2789                    hw->cipher_schemes->cipher == key->cipher)
2790                        key->flags |= IEEE80211_KEY_FLAG_PUT_IV_SPACE;
2791                else
2792                        return -EOPNOTSUPP;
2793        }
2794
2795        mutex_lock(&mvm->mutex);
2796
2797        switch (cmd) {
2798        case SET_KEY:
2799                if ((vif->type == NL80211_IFTYPE_ADHOC ||
2800                     vif->type == NL80211_IFTYPE_AP) && !sta) {
2801                        /*
2802                         * GTK on AP interface is a TX-only key, return 0;
2803                         * on IBSS they're per-station and because we're lazy
2804                         * we don't support them for RX, so do the same.
2805                         * CMAC/GMAC in AP/IBSS modes must be done in software.
2806                         */
2807                        if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC ||
2808                            key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 ||
2809                            key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256)
2810                                ret = -EOPNOTSUPP;
2811                        else
2812                                ret = 0;
2813                        key->hw_key_idx = STA_KEY_IDX_INVALID;
2814                        break;
2815                }
2816
2817                /* During FW restart, in order to restore the state as it was,
2818                 * don't try to reprogram keys we previously failed for.
2819                 */
2820                if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status) &&
2821                    key->hw_key_idx == STA_KEY_IDX_INVALID) {
2822                        IWL_DEBUG_MAC80211(mvm,
2823                                           "skip invalid idx key programming during restart\n");
2824                        ret = 0;
2825                        break;
2826                }
2827
2828                if (!test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status) &&
2829                    sta && iwl_mvm_has_new_rx_api(mvm) &&
2830                    key->flags & IEEE80211_KEY_FLAG_PAIRWISE &&
2831                    (key->cipher == WLAN_CIPHER_SUITE_CCMP ||
2832                     key->cipher == WLAN_CIPHER_SUITE_GCMP ||
2833                     key->cipher == WLAN_CIPHER_SUITE_GCMP_256)) {
2834                        struct ieee80211_key_seq seq;
2835                        int tid, q;
2836
2837                        mvmsta = iwl_mvm_sta_from_mac80211(sta);
2838                        WARN_ON(rcu_access_pointer(mvmsta->ptk_pn[keyidx]));
2839                        ptk_pn = kzalloc(sizeof(*ptk_pn) +
2840                                         mvm->trans->num_rx_queues *
2841                                                sizeof(ptk_pn->q[0]),
2842                                         GFP_KERNEL);
2843                        if (!ptk_pn) {
2844                                ret = -ENOMEM;
2845                                break;
2846                        }
2847
2848                        for (tid = 0; tid < IWL_MAX_TID_COUNT; tid++) {
2849                                ieee80211_get_key_rx_seq(key, tid, &seq);
2850                                for (q = 0; q < mvm->trans->num_rx_queues; q++)
2851                                        memcpy(ptk_pn->q[q].pn[tid],
2852                                               seq.ccmp.pn,
2853                                               IEEE80211_CCMP_PN_LEN);
2854                        }
2855
2856                        rcu_assign_pointer(mvmsta->ptk_pn[keyidx], ptk_pn);
2857                }
2858
2859                /* in HW restart reuse the index, otherwise request a new one */
2860                if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status))
2861                        key_offset = key->hw_key_idx;
2862                else
2863                        key_offset = STA_KEY_IDX_INVALID;
2864
2865                IWL_DEBUG_MAC80211(mvm, "set hwcrypto key\n");
2866                ret = iwl_mvm_set_sta_key(mvm, vif, sta, key, key_offset);
2867                if (ret) {
2868                        IWL_WARN(mvm, "set key failed\n");
2869                        /*
2870                         * can't add key for RX, but we don't need it
2871                         * in the device for TX so still return 0
2872                         */
2873                        key->hw_key_idx = STA_KEY_IDX_INVALID;
2874                        ret = 0;
2875                }
2876
2877                break;
2878        case DISABLE_KEY:
2879                if (key->hw_key_idx == STA_KEY_IDX_INVALID) {
2880                        ret = 0;
2881                        break;
2882                }
2883
2884                if (sta && iwl_mvm_has_new_rx_api(mvm) &&
2885                    key->flags & IEEE80211_KEY_FLAG_PAIRWISE &&
2886                    (key->cipher == WLAN_CIPHER_SUITE_CCMP ||
2887                     key->cipher == WLAN_CIPHER_SUITE_GCMP ||
2888                     key->cipher == WLAN_CIPHER_SUITE_GCMP_256)) {
2889                        mvmsta = iwl_mvm_sta_from_mac80211(sta);
2890                        ptk_pn = rcu_dereference_protected(
2891                                                mvmsta->ptk_pn[keyidx],
2892                                                lockdep_is_held(&mvm->mutex));
2893                        RCU_INIT_POINTER(mvmsta->ptk_pn[keyidx], NULL);
2894                        if (ptk_pn)
2895                                kfree_rcu(ptk_pn, rcu_head);
2896                }
2897
2898                IWL_DEBUG_MAC80211(mvm, "disable hwcrypto key\n");
2899                ret = iwl_mvm_remove_sta_key(mvm, vif, sta, key);
2900                break;
2901        default:
2902                ret = -EINVAL;
2903        }
2904
2905        mutex_unlock(&mvm->mutex);
2906        return ret;
2907}
2908
2909static void iwl_mvm_mac_update_tkip_key(struct ieee80211_hw *hw,
2910                                        struct ieee80211_vif *vif,
2911                                        struct ieee80211_key_conf *keyconf,
2912                                        struct ieee80211_sta *sta,
2913                                        u32 iv32, u16 *phase1key)
2914{
2915        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2916
2917        if (keyconf->hw_key_idx == STA_KEY_IDX_INVALID)
2918                return;
2919
2920        iwl_mvm_update_tkip_key(mvm, vif, keyconf, sta, iv32, phase1key);
2921}
2922
2923
2924static bool iwl_mvm_rx_aux_roc(struct iwl_notif_wait_data *notif_wait,
2925                               struct iwl_rx_packet *pkt, void *data)
2926{
2927        struct iwl_mvm *mvm =
2928                container_of(notif_wait, struct iwl_mvm, notif_wait);
2929        struct iwl_hs20_roc_res *resp;
2930        int resp_len = iwl_rx_packet_payload_len(pkt);
2931        struct iwl_mvm_time_event_data *te_data = data;
2932
2933        if (WARN_ON(pkt->hdr.cmd != HOT_SPOT_CMD))
2934                return true;
2935
2936        if (WARN_ON_ONCE(resp_len != sizeof(*resp))) {
2937                IWL_ERR(mvm, "Invalid HOT_SPOT_CMD response\n");
2938                return true;
2939        }
2940
2941        resp = (void *)pkt->data;
2942
2943        IWL_DEBUG_TE(mvm,
2944                     "Aux ROC: Recieved response from ucode: status=%d uid=%d\n",
2945                     resp->status, resp->event_unique_id);
2946
2947        te_data->uid = le32_to_cpu(resp->event_unique_id);
2948        IWL_DEBUG_TE(mvm, "TIME_EVENT_CMD response - UID = 0x%x\n",
2949                     te_data->uid);
2950
2951        spin_lock_bh(&mvm->time_event_lock);
2952        list_add_tail(&te_data->list, &mvm->aux_roc_te_list);
2953        spin_unlock_bh(&mvm->time_event_lock);
2954
2955        return true;
2956}
2957
2958#define AUX_ROC_MIN_DURATION MSEC_TO_TU(100)
2959#define AUX_ROC_MIN_DELAY MSEC_TO_TU(200)
2960#define AUX_ROC_MAX_DELAY MSEC_TO_TU(600)
2961#define AUX_ROC_SAFETY_BUFFER MSEC_TO_TU(20)
2962#define AUX_ROC_MIN_SAFETY_BUFFER MSEC_TO_TU(10)
2963static int iwl_mvm_send_aux_roc_cmd(struct iwl_mvm *mvm,
2964                                    struct ieee80211_channel *channel,
2965                                    struct ieee80211_vif *vif,
2966                                    int duration)
2967{
2968        int res, time_reg = DEVICE_SYSTEM_TIME_REG;
2969        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
2970        struct iwl_mvm_time_event_data *te_data = &mvmvif->hs_time_event_data;
2971        static const u16 time_event_response[] = { HOT_SPOT_CMD };
2972        struct iwl_notification_wait wait_time_event;
2973        u32 dtim_interval = vif->bss_conf.dtim_period *
2974                vif->bss_conf.beacon_int;
2975        u32 req_dur, delay;
2976        struct iwl_hs20_roc_req aux_roc_req = {
2977                .action = cpu_to_le32(FW_CTXT_ACTION_ADD),
2978                .id_and_color =
2979                        cpu_to_le32(FW_CMD_ID_AND_COLOR(MAC_INDEX_AUX, 0)),
2980                .sta_id_and_color = cpu_to_le32(mvm->aux_sta.sta_id),
2981                /* Set the channel info data */
2982                .channel_info.band = (channel->band == NL80211_BAND_2GHZ) ?
2983                        PHY_BAND_24 : PHY_BAND_5,
2984                .channel_info.channel = channel->hw_value,
2985                .channel_info.width = PHY_VHT_CHANNEL_MODE20,
2986                /* Set the time and duration */
2987                .apply_time = cpu_to_le32(iwl_read_prph(mvm->trans, time_reg)),
2988         };
2989
2990        delay = AUX_ROC_MIN_DELAY;
2991        req_dur = MSEC_TO_TU(duration);
2992
2993        /*
2994         * If we are associated we want the delay time to be at least one
2995         * dtim interval so that the FW can wait until after the DTIM and
2996         * then start the time event, this will potentially allow us to
2997         * remain off-channel for the max duration.
2998         * Since we want to use almost a whole dtim interval we would also
2999         * like the delay to be for 2-3 dtim intervals, in case there are
3000         * other time events with higher priority.
3001         */
3002        if (vif->bss_conf.assoc) {
3003                delay = min_t(u32, dtim_interval * 3, AUX_ROC_MAX_DELAY);
3004                /* We cannot remain off-channel longer than the DTIM interval */
3005                if (dtim_interval <= req_dur) {
3006                        req_dur = dtim_interval - AUX_ROC_SAFETY_BUFFER;
3007                        if (req_dur <= AUX_ROC_MIN_DURATION)
3008                                req_dur = dtim_interval -
3009                                        AUX_ROC_MIN_SAFETY_BUFFER;
3010                }
3011        }
3012
3013        aux_roc_req.duration = cpu_to_le32(req_dur);
3014        aux_roc_req.apply_time_max_delay = cpu_to_le32(delay);
3015
3016        IWL_DEBUG_TE(mvm,
3017                     "ROC: Requesting to remain on channel %u for %ums (requested = %ums, max_delay = %ums, dtim_interval = %ums)\n",
3018                     channel->hw_value, req_dur, duration, delay,
3019                     dtim_interval);
3020        /* Set the node address */
3021        memcpy(aux_roc_req.node_addr, vif->addr, ETH_ALEN);
3022
3023        lockdep_assert_held(&mvm->mutex);
3024
3025        spin_lock_bh(&mvm->time_event_lock);
3026
3027        if (WARN_ON(te_data->id == HOT_SPOT_CMD)) {
3028                spin_unlock_bh(&mvm->time_event_lock);
3029                return -EIO;
3030        }
3031
3032        te_data->vif = vif;
3033        te_data->duration = duration;
3034        te_data->id = HOT_SPOT_CMD;
3035
3036        spin_unlock_bh(&mvm->time_event_lock);
3037
3038        /*
3039         * Use a notification wait, which really just processes the
3040         * command response and doesn't wait for anything, in order
3041         * to be able to process the response and get the UID inside
3042         * the RX path. Using CMD_WANT_SKB doesn't work because it
3043         * stores the buffer and then wakes up this thread, by which
3044         * time another notification (that the time event started)
3045         * might already be processed unsuccessfully.
3046         */
3047        iwl_init_notification_wait(&mvm->notif_wait, &wait_time_event,
3048                                   time_event_response,
3049                                   ARRAY_SIZE(time_event_response),
3050                                   iwl_mvm_rx_aux_roc, te_data);
3051
3052        res = iwl_mvm_send_cmd_pdu(mvm, HOT_SPOT_CMD, 0, sizeof(aux_roc_req),
3053                                   &aux_roc_req);
3054
3055        if (res) {
3056                IWL_ERR(mvm, "Couldn't send HOT_SPOT_CMD: %d\n", res);
3057                iwl_remove_notification(&mvm->notif_wait, &wait_time_event);
3058                goto out_clear_te;
3059        }
3060
3061        /* No need to wait for anything, so just pass 1 (0 isn't valid) */
3062        res = iwl_wait_notification(&mvm->notif_wait, &wait_time_event, 1);
3063        /* should never fail */
3064        WARN_ON_ONCE(res);
3065
3066        if (res) {
3067 out_clear_te:
3068                spin_lock_bh(&mvm->time_event_lock);
3069                iwl_mvm_te_clear_data(mvm, te_data);
3070                spin_unlock_bh(&mvm->time_event_lock);
3071        }
3072
3073        return res;
3074}
3075
3076static int iwl_mvm_roc(struct ieee80211_hw *hw,
3077                       struct ieee80211_vif *vif,
3078                       struct ieee80211_channel *channel,
3079                       int duration,
3080                       enum ieee80211_roc_type type)
3081{
3082        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3083        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
3084        struct cfg80211_chan_def chandef;
3085        struct iwl_mvm_phy_ctxt *phy_ctxt;
3086        int ret, i;
3087
3088        IWL_DEBUG_MAC80211(mvm, "enter (%d, %d, %d)\n", channel->hw_value,
3089                           duration, type);
3090
3091        flush_work(&mvm->roc_done_wk);
3092
3093        mutex_lock(&mvm->mutex);
3094
3095        switch (vif->type) {
3096        case NL80211_IFTYPE_STATION:
3097                if (fw_has_capa(&mvm->fw->ucode_capa,
3098                                IWL_UCODE_TLV_CAPA_HOTSPOT_SUPPORT)) {
3099                        /* Use aux roc framework (HS20) */
3100                        ret = iwl_mvm_send_aux_roc_cmd(mvm, channel,
3101                                                       vif, duration);
3102                        goto out_unlock;
3103                }
3104                IWL_ERR(mvm, "hotspot not supported\n");
3105                ret = -EINVAL;
3106                goto out_unlock;
3107        case NL80211_IFTYPE_P2P_DEVICE:
3108                /* handle below */
3109                break;
3110        default:
3111                IWL_ERR(mvm, "vif isn't P2P_DEVICE: %d\n", vif->type);
3112                ret = -EINVAL;
3113                goto out_unlock;
3114        }
3115
3116        for (i = 0; i < NUM_PHY_CTX; i++) {
3117                phy_ctxt = &mvm->phy_ctxts[i];
3118                if (phy_ctxt->ref == 0 || mvmvif->phy_ctxt == phy_ctxt)
3119                        continue;
3120
3121                if (phy_ctxt->ref && channel == phy_ctxt->channel) {
3122                        /*
3123                         * Unbind the P2P_DEVICE from the current PHY context,
3124                         * and if the PHY context is not used remove it.
3125                         */
3126                        ret = iwl_mvm_binding_remove_vif(mvm, vif);
3127                        if (WARN(ret, "Failed unbinding P2P_DEVICE\n"))
3128                                goto out_unlock;
3129
3130                        iwl_mvm_phy_ctxt_unref(mvm, mvmvif->phy_ctxt);
3131
3132                        /* Bind the P2P_DEVICE to the current PHY Context */
3133                        mvmvif->phy_ctxt = phy_ctxt;
3134
3135                        ret = iwl_mvm_binding_add_vif(mvm, vif);
3136                        if (WARN(ret, "Failed binding P2P_DEVICE\n"))
3137                                goto out_unlock;
3138
3139                        iwl_mvm_phy_ctxt_ref(mvm, mvmvif->phy_ctxt);
3140                        goto schedule_time_event;
3141                }
3142        }
3143
3144        /* Need to update the PHY context only if the ROC channel changed */
3145        if (channel == mvmvif->phy_ctxt->channel)
3146                goto schedule_time_event;
3147
3148        cfg80211_chandef_create(&chandef, channel, NL80211_CHAN_NO_HT);
3149
3150        /*
3151         * Change the PHY context configuration as it is currently referenced
3152         * only by the P2P Device MAC
3153         */
3154        if (mvmvif->phy_ctxt->ref == 1) {
3155                ret = iwl_mvm_phy_ctxt_changed(mvm, mvmvif->phy_ctxt,
3156                                               &chandef, 1, 1);
3157                if (ret)
3158                        goto out_unlock;
3159        } else {
3160                /*
3161                 * The PHY context is shared with other MACs. Need to remove the
3162                 * P2P Device from the binding, allocate an new PHY context and
3163                 * create a new binding
3164                 */
3165                phy_ctxt = iwl_mvm_get_free_phy_ctxt(mvm);
3166                if (!phy_ctxt) {
3167                        ret = -ENOSPC;
3168                        goto out_unlock;
3169                }
3170
3171                ret = iwl_mvm_phy_ctxt_changed(mvm, phy_ctxt, &chandef,
3172                                               1, 1);
3173                if (ret) {
3174                        IWL_ERR(mvm, "Failed to change PHY context\n");
3175                        goto out_unlock;
3176                }
3177
3178                /* Unbind the P2P_DEVICE from the current PHY context */
3179                ret = iwl_mvm_binding_remove_vif(mvm, vif);
3180                if (WARN(ret, "Failed unbinding P2P_DEVICE\n"))
3181                        goto out_unlock;
3182
3183                iwl_mvm_phy_ctxt_unref(mvm, mvmvif->phy_ctxt);
3184
3185                /* Bind the P2P_DEVICE to the new allocated PHY context */
3186                mvmvif->phy_ctxt = phy_ctxt;
3187
3188                ret = iwl_mvm_binding_add_vif(mvm, vif);
3189                if (WARN(ret, "Failed binding P2P_DEVICE\n"))
3190                        goto out_unlock;
3191
3192                iwl_mvm_phy_ctxt_ref(mvm, mvmvif->phy_ctxt);
3193        }
3194
3195schedule_time_event:
3196        /* Schedule the time events */
3197        ret = iwl_mvm_start_p2p_roc(mvm, vif, duration, type);
3198
3199out_unlock:
3200        mutex_unlock(&mvm->mutex);
3201        IWL_DEBUG_MAC80211(mvm, "leave\n");
3202        return ret;
3203}
3204
3205static int iwl_mvm_cancel_roc(struct ieee80211_hw *hw)
3206{
3207        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3208
3209        IWL_DEBUG_MAC80211(mvm, "enter\n");
3210
3211        mutex_lock(&mvm->mutex);
3212        iwl_mvm_stop_roc(mvm);
3213        mutex_unlock(&mvm->mutex);
3214
3215        IWL_DEBUG_MAC80211(mvm, "leave\n");
3216        return 0;
3217}
3218
3219static int __iwl_mvm_add_chanctx(struct iwl_mvm *mvm,
3220                                 struct ieee80211_chanctx_conf *ctx)
3221{
3222        u16 *phy_ctxt_id = (u16 *)ctx->drv_priv;
3223        struct iwl_mvm_phy_ctxt *phy_ctxt;
3224        int ret;
3225
3226        lockdep_assert_held(&mvm->mutex);
3227
3228        IWL_DEBUG_MAC80211(mvm, "Add channel context\n");
3229
3230        phy_ctxt = iwl_mvm_get_free_phy_ctxt(mvm);
3231        if (!phy_ctxt) {
3232                ret = -ENOSPC;
3233                goto out;
3234        }
3235
3236        ret = iwl_mvm_phy_ctxt_changed(mvm, phy_ctxt, &ctx->min_def,
3237                                       ctx->rx_chains_static,
3238                                       ctx->rx_chains_dynamic);
3239        if (ret) {
3240                IWL_ERR(mvm, "Failed to add PHY context\n");
3241                goto out;
3242        }
3243
3244        iwl_mvm_phy_ctxt_ref(mvm, phy_ctxt);
3245        *phy_ctxt_id = phy_ctxt->id;
3246out:
3247        return ret;
3248}
3249
3250static int iwl_mvm_add_chanctx(struct ieee80211_hw *hw,
3251                               struct ieee80211_chanctx_conf *ctx)
3252{
3253        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3254        int ret;
3255
3256        mutex_lock(&mvm->mutex);
3257        ret = __iwl_mvm_add_chanctx(mvm, ctx);
3258        mutex_unlock(&mvm->mutex);
3259
3260        return ret;
3261}
3262
3263static void __iwl_mvm_remove_chanctx(struct iwl_mvm *mvm,
3264                                     struct ieee80211_chanctx_conf *ctx)
3265{
3266        u16 *phy_ctxt_id = (u16 *)ctx->drv_priv;
3267        struct iwl_mvm_phy_ctxt *phy_ctxt = &mvm->phy_ctxts[*phy_ctxt_id];
3268
3269        lockdep_assert_held(&mvm->mutex);
3270
3271        iwl_mvm_phy_ctxt_unref(mvm, phy_ctxt);
3272}
3273
3274static void iwl_mvm_remove_chanctx(struct ieee80211_hw *hw,
3275                                   struct ieee80211_chanctx_conf *ctx)
3276{
3277        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3278
3279        mutex_lock(&mvm->mutex);
3280        __iwl_mvm_remove_chanctx(mvm, ctx);
3281        mutex_unlock(&mvm->mutex);
3282}
3283
3284static void iwl_mvm_change_chanctx(struct ieee80211_hw *hw,
3285                                   struct ieee80211_chanctx_conf *ctx,
3286                                   u32 changed)
3287{
3288        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3289        u16 *phy_ctxt_id = (u16 *)ctx->drv_priv;
3290        struct iwl_mvm_phy_ctxt *phy_ctxt = &mvm->phy_ctxts[*phy_ctxt_id];
3291
3292        if (WARN_ONCE((phy_ctxt->ref > 1) &&
3293                      (changed & ~(IEEE80211_CHANCTX_CHANGE_WIDTH |
3294                                   IEEE80211_CHANCTX_CHANGE_RX_CHAINS |
3295                                   IEEE80211_CHANCTX_CHANGE_RADAR |
3296                                   IEEE80211_CHANCTX_CHANGE_MIN_WIDTH)),
3297                      "Cannot change PHY. Ref=%d, changed=0x%X\n",
3298                      phy_ctxt->ref, changed))
3299                return;
3300
3301        mutex_lock(&mvm->mutex);
3302        iwl_mvm_bt_coex_vif_change(mvm);
3303        iwl_mvm_phy_ctxt_changed(mvm, phy_ctxt, &ctx->min_def,
3304                                 ctx->rx_chains_static,
3305                                 ctx->rx_chains_dynamic);
3306        mutex_unlock(&mvm->mutex);
3307}
3308
3309static int __iwl_mvm_assign_vif_chanctx(struct iwl_mvm *mvm,
3310                                        struct ieee80211_vif *vif,
3311                                        struct ieee80211_chanctx_conf *ctx,
3312                                        bool switching_chanctx)
3313{
3314        u16 *phy_ctxt_id = (u16 *)ctx->drv_priv;
3315        struct iwl_mvm_phy_ctxt *phy_ctxt = &mvm->phy_ctxts[*phy_ctxt_id];
3316        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
3317        int ret;
3318
3319        lockdep_assert_held(&mvm->mutex);
3320
3321        mvmvif->phy_ctxt = phy_ctxt;
3322
3323        switch (vif->type) {
3324        case NL80211_IFTYPE_AP:
3325                /* only needed if we're switching chanctx (i.e. during CSA) */
3326                if (switching_chanctx) {
3327                        mvmvif->ap_ibss_active = true;
3328                        break;
3329                }
3330        case NL80211_IFTYPE_ADHOC:
3331                /*
3332                 * The AP binding flow is handled as part of the start_ap flow
3333                 * (in bss_info_changed), similarly for IBSS.
3334                 */
3335                ret = 0;
3336                goto out;
3337        case NL80211_IFTYPE_STATION:
3338                break;
3339        case NL80211_IFTYPE_MONITOR:
3340                /* always disable PS when a monitor interface is active */
3341                mvmvif->ps_disabled = true;
3342                break;
3343        default:
3344                ret = -EINVAL;
3345                goto out;
3346        }
3347
3348        ret = iwl_mvm_binding_add_vif(mvm, vif);
3349        if (ret)
3350                goto out;
3351
3352        /*
3353         * Power state must be updated before quotas,
3354         * otherwise fw will complain.
3355         */
3356        iwl_mvm_power_update_mac(mvm);
3357
3358        /* Setting the quota at this stage is only required for monitor
3359         * interfaces. For the other types, the bss_info changed flow
3360         * will handle quota settings.
3361         */
3362        if (vif->type == NL80211_IFTYPE_MONITOR) {
3363                mvmvif->monitor_active = true;
3364                ret = iwl_mvm_update_quotas(mvm, false, NULL);
3365                if (ret)
3366                        goto out_remove_binding;
3367
3368                ret = iwl_mvm_add_snif_sta(mvm, vif);
3369                if (ret)
3370                        goto out_remove_binding;
3371
3372        }
3373
3374        /* Handle binding during CSA */
3375        if (vif->type == NL80211_IFTYPE_AP) {
3376                iwl_mvm_update_quotas(mvm, false, NULL);
3377                iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
3378        }
3379
3380        if (switching_chanctx && vif->type == NL80211_IFTYPE_STATION) {
3381                u32 duration = 2 * vif->bss_conf.beacon_int;
3382
3383                /* iwl_mvm_protect_session() reads directly from the
3384                 * device (the system time), so make sure it is
3385                 * available.
3386                 */
3387                ret = iwl_mvm_ref_sync(mvm, IWL_MVM_REF_PROTECT_CSA);
3388                if (ret)
3389                        goto out_remove_binding;
3390
3391                /* Protect the session to make sure we hear the first
3392                 * beacon on the new channel.
3393                 */
3394                iwl_mvm_protect_session(mvm, vif, duration, duration,
3395                                        vif->bss_conf.beacon_int / 2,
3396                                        true);
3397
3398                iwl_mvm_unref(mvm, IWL_MVM_REF_PROTECT_CSA);
3399
3400                iwl_mvm_update_quotas(mvm, false, NULL);
3401        }
3402
3403        goto out;
3404
3405out_remove_binding:
3406        iwl_mvm_binding_remove_vif(mvm, vif);
3407        iwl_mvm_power_update_mac(mvm);
3408out:
3409        if (ret)
3410                mvmvif->phy_ctxt = NULL;
3411        return ret;
3412}
3413static int iwl_mvm_assign_vif_chanctx(struct ieee80211_hw *hw,
3414                                      struct ieee80211_vif *vif,
3415                                      struct ieee80211_chanctx_conf *ctx)
3416{
3417        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3418        int ret;
3419
3420        mutex_lock(&mvm->mutex);
3421        ret = __iwl_mvm_assign_vif_chanctx(mvm, vif, ctx, false);
3422        mutex_unlock(&mvm->mutex);
3423
3424        return ret;
3425}
3426
3427static void __iwl_mvm_unassign_vif_chanctx(struct iwl_mvm *mvm,
3428                                           struct ieee80211_vif *vif,
3429                                           struct ieee80211_chanctx_conf *ctx,
3430                                           bool switching_chanctx)
3431{
3432        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
3433        struct ieee80211_vif *disabled_vif = NULL;
3434
3435        lockdep_assert_held(&mvm->mutex);
3436
3437        iwl_mvm_remove_time_event(mvm, mvmvif, &mvmvif->time_event_data);
3438
3439        switch (vif->type) {
3440        case NL80211_IFTYPE_ADHOC:
3441                goto out;
3442        case NL80211_IFTYPE_MONITOR:
3443                mvmvif->monitor_active = false;
3444                mvmvif->ps_disabled = false;
3445                iwl_mvm_rm_snif_sta(mvm, vif);
3446                break;
3447        case NL80211_IFTYPE_AP:
3448                /* This part is triggered only during CSA */
3449                if (!switching_chanctx || !mvmvif->ap_ibss_active)
3450                        goto out;
3451
3452                mvmvif->csa_countdown = false;
3453
3454                /* Set CS bit on all the stations */
3455                iwl_mvm_modify_all_sta_disable_tx(mvm, mvmvif, true);
3456
3457                /* Save blocked iface, the timeout is set on the next beacon */
3458                rcu_assign_pointer(mvm->csa_tx_blocked_vif, vif);
3459
3460                mvmvif->ap_ibss_active = false;
3461                break;
3462        case NL80211_IFTYPE_STATION:
3463                if (!switching_chanctx)
3464                        break;
3465
3466                disabled_vif = vif;
3467
3468                iwl_mvm_mac_ctxt_changed(mvm, vif, true, NULL);
3469                break;
3470        default:
3471                break;
3472        }
3473
3474        iwl_mvm_update_quotas(mvm, false, disabled_vif);
3475        iwl_mvm_binding_remove_vif(mvm, vif);
3476
3477out:
3478        mvmvif->phy_ctxt = NULL;
3479        iwl_mvm_power_update_mac(mvm);
3480}
3481
3482static void iwl_mvm_unassign_vif_chanctx(struct ieee80211_hw *hw,
3483                                         struct ieee80211_vif *vif,
3484                                         struct ieee80211_chanctx_conf *ctx)
3485{
3486        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3487
3488        mutex_lock(&mvm->mutex);
3489        __iwl_mvm_unassign_vif_chanctx(mvm, vif, ctx, false);
3490        mutex_unlock(&mvm->mutex);
3491}
3492
3493static int
3494iwl_mvm_switch_vif_chanctx_swap(struct iwl_mvm *mvm,
3495                                struct ieee80211_vif_chanctx_switch *vifs)
3496{
3497        int ret;
3498
3499        mutex_lock(&mvm->mutex);
3500        __iwl_mvm_unassign_vif_chanctx(mvm, vifs[0].vif, vifs[0].old_ctx, true);
3501        __iwl_mvm_remove_chanctx(mvm, vifs[0].old_ctx);
3502
3503        ret = __iwl_mvm_add_chanctx(mvm, vifs[0].new_ctx);
3504        if (ret) {
3505                IWL_ERR(mvm, "failed to add new_ctx during channel switch\n");
3506                goto out_reassign;
3507        }
3508
3509        ret = __iwl_mvm_assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].new_ctx,
3510                                           true);
3511        if (ret) {
3512                IWL_ERR(mvm,
3513                        "failed to assign new_ctx during channel switch\n");
3514                goto out_remove;
3515        }
3516
3517        /* we don't support TDLS during DCM - can be caused by channel switch */
3518        if (iwl_mvm_phy_ctx_count(mvm) > 1)
3519                iwl_mvm_teardown_tdls_peers(mvm);
3520
3521        goto out;
3522
3523out_remove:
3524        __iwl_mvm_remove_chanctx(mvm, vifs[0].new_ctx);
3525
3526out_reassign:
3527        if (__iwl_mvm_add_chanctx(mvm, vifs[0].old_ctx)) {
3528                IWL_ERR(mvm, "failed to add old_ctx back after failure.\n");
3529                goto out_restart;
3530        }
3531
3532        if (__iwl_mvm_assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].old_ctx,
3533                                         true)) {
3534                IWL_ERR(mvm, "failed to reassign old_ctx after failure.\n");
3535                goto out_restart;
3536        }
3537
3538        goto out;
3539
3540out_restart:
3541        /* things keep failing, better restart the hw */
3542        iwl_mvm_nic_restart(mvm, false);
3543
3544out:
3545        mutex_unlock(&mvm->mutex);
3546
3547        return ret;
3548}
3549
3550static int
3551iwl_mvm_switch_vif_chanctx_reassign(struct iwl_mvm *mvm,
3552                                    struct ieee80211_vif_chanctx_switch *vifs)
3553{
3554        int ret;
3555
3556        mutex_lock(&mvm->mutex);
3557        __iwl_mvm_unassign_vif_chanctx(mvm, vifs[0].vif, vifs[0].old_ctx, true);
3558
3559        ret = __iwl_mvm_assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].new_ctx,
3560                                           true);
3561        if (ret) {
3562                IWL_ERR(mvm,
3563                        "failed to assign new_ctx during channel switch\n");
3564                goto out_reassign;
3565        }
3566
3567        goto out;
3568
3569out_reassign:
3570        if (__iwl_mvm_assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].old_ctx,
3571                                         true)) {
3572                IWL_ERR(mvm, "failed to reassign old_ctx after failure.\n");
3573                goto out_restart;
3574        }
3575
3576        goto out;
3577
3578out_restart:
3579        /* things keep failing, better restart the hw */
3580        iwl_mvm_nic_restart(mvm, false);
3581
3582out:
3583        mutex_unlock(&mvm->mutex);
3584
3585        return ret;
3586}
3587
3588static int iwl_mvm_switch_vif_chanctx(struct ieee80211_hw *hw,
3589                                      struct ieee80211_vif_chanctx_switch *vifs,
3590                                      int n_vifs,
3591                                      enum ieee80211_chanctx_switch_mode mode)
3592{
3593        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3594        int ret;
3595
3596        /* we only support a single-vif right now */
3597        if (n_vifs > 1)
3598                return -EOPNOTSUPP;
3599
3600        switch (mode) {
3601        case CHANCTX_SWMODE_SWAP_CONTEXTS:
3602                ret = iwl_mvm_switch_vif_chanctx_swap(mvm, vifs);
3603                break;
3604        case CHANCTX_SWMODE_REASSIGN_VIF:
3605                ret = iwl_mvm_switch_vif_chanctx_reassign(mvm, vifs);
3606                break;
3607        default:
3608                ret = -EOPNOTSUPP;
3609                break;
3610        }
3611
3612        return ret;
3613}
3614
3615static int iwl_mvm_set_tim(struct ieee80211_hw *hw,
3616                           struct ieee80211_sta *sta,
3617                           bool set)
3618{
3619        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3620        struct iwl_mvm_sta *mvm_sta = iwl_mvm_sta_from_mac80211(sta);
3621
3622        if (!mvm_sta || !mvm_sta->vif) {
3623                IWL_ERR(mvm, "Station is not associated to a vif\n");
3624                return -EINVAL;
3625        }
3626
3627        return iwl_mvm_mac_ctxt_beacon_changed(mvm, mvm_sta->vif);
3628}
3629
3630#ifdef CONFIG_NL80211_TESTMODE
3631static const struct nla_policy iwl_mvm_tm_policy[IWL_MVM_TM_ATTR_MAX + 1] = {
3632        [IWL_MVM_TM_ATTR_CMD] = { .type = NLA_U32 },
3633        [IWL_MVM_TM_ATTR_NOA_DURATION] = { .type = NLA_U32 },
3634        [IWL_MVM_TM_ATTR_BEACON_FILTER_STATE] = { .type = NLA_U32 },
3635};
3636
3637static int __iwl_mvm_mac_testmode_cmd(struct iwl_mvm *mvm,
3638                                      struct ieee80211_vif *vif,
3639                                      void *data, int len)
3640{
3641        struct nlattr *tb[IWL_MVM_TM_ATTR_MAX + 1];
3642        int err;
3643        u32 noa_duration;
3644
3645        err = nla_parse(tb, IWL_MVM_TM_ATTR_MAX, data, len, iwl_mvm_tm_policy);
3646        if (err)
3647                return err;
3648
3649        if (!tb[IWL_MVM_TM_ATTR_CMD])
3650                return -EINVAL;
3651
3652        switch (nla_get_u32(tb[IWL_MVM_TM_ATTR_CMD])) {
3653        case IWL_MVM_TM_CMD_SET_NOA:
3654                if (!vif || vif->type != NL80211_IFTYPE_AP || !vif->p2p ||
3655                    !vif->bss_conf.enable_beacon ||
3656                    !tb[IWL_MVM_TM_ATTR_NOA_DURATION])
3657                        return -EINVAL;
3658
3659                noa_duration = nla_get_u32(tb[IWL_MVM_TM_ATTR_NOA_DURATION]);
3660                if (noa_duration >= vif->bss_conf.beacon_int)
3661                        return -EINVAL;
3662
3663                mvm->noa_duration = noa_duration;
3664                mvm->noa_vif = vif;
3665
3666                return iwl_mvm_update_quotas(mvm, false, NULL);
3667        case IWL_MVM_TM_CMD_SET_BEACON_FILTER:
3668                /* must be associated client vif - ignore authorized */
3669                if (!vif || vif->type != NL80211_IFTYPE_STATION ||
3670                    !vif->bss_conf.assoc || !vif->bss_conf.dtim_period ||
3671                    !tb[IWL_MVM_TM_ATTR_BEACON_FILTER_STATE])
3672                        return -EINVAL;
3673
3674                if (nla_get_u32(tb[IWL_MVM_TM_ATTR_BEACON_FILTER_STATE]))
3675                        return iwl_mvm_enable_beacon_filter(mvm, vif, 0);
3676                return iwl_mvm_disable_beacon_filter(mvm, vif, 0);
3677        }
3678
3679        return -EOPNOTSUPP;
3680}
3681
3682static int iwl_mvm_mac_testmode_cmd(struct ieee80211_hw *hw,
3683                                    struct ieee80211_vif *vif,
3684                                    void *data, int len)
3685{
3686        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3687        int err;
3688
3689        mutex_lock(&mvm->mutex);
3690        err = __iwl_mvm_mac_testmode_cmd(mvm, vif, data, len);
3691        mutex_unlock(&mvm->mutex);
3692
3693        return err;
3694}
3695#endif
3696
3697static void iwl_mvm_channel_switch(struct ieee80211_hw *hw,
3698                                   struct ieee80211_vif *vif,
3699                                   struct ieee80211_channel_switch *chsw)
3700{
3701        /* By implementing this operation, we prevent mac80211 from
3702         * starting its own channel switch timer, so that we can call
3703         * ieee80211_chswitch_done() ourselves at the right time
3704         * (which is when the absence time event starts).
3705         */
3706
3707        IWL_DEBUG_MAC80211(IWL_MAC80211_GET_MVM(hw),
3708                           "dummy channel switch op\n");
3709}
3710
3711static int iwl_mvm_pre_channel_switch(struct ieee80211_hw *hw,
3712                                      struct ieee80211_vif *vif,
3713                                      struct ieee80211_channel_switch *chsw)
3714{
3715        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3716        struct ieee80211_vif *csa_vif;
3717        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
3718        u32 apply_time;
3719        int ret;
3720
3721        mutex_lock(&mvm->mutex);
3722
3723        mvmvif->csa_failed = false;
3724
3725        IWL_DEBUG_MAC80211(mvm, "pre CSA to freq %d\n",
3726                           chsw->chandef.center_freq1);
3727
3728        iwl_fw_dbg_trigger_simple_stop(mvm, vif, FW_DBG_TRIGGER_CHANNEL_SWITCH);
3729
3730        switch (vif->type) {
3731        case NL80211_IFTYPE_AP:
3732                csa_vif =
3733                        rcu_dereference_protected(mvm->csa_vif,
3734                                                  lockdep_is_held(&mvm->mutex));
3735                if (WARN_ONCE(csa_vif && csa_vif->csa_active,
3736                              "Another CSA is already in progress")) {
3737                        ret = -EBUSY;
3738                        goto out_unlock;
3739                }
3740
3741                /* we still didn't unblock tx. prevent new CS meanwhile */
3742                if (rcu_dereference_protected(mvm->csa_tx_blocked_vif,
3743                                              lockdep_is_held(&mvm->mutex))) {
3744                        ret = -EBUSY;
3745                        goto out_unlock;
3746                }
3747
3748                rcu_assign_pointer(mvm->csa_vif, vif);
3749
3750                if (WARN_ONCE(mvmvif->csa_countdown,
3751                              "Previous CSA countdown didn't complete")) {
3752                        ret = -EBUSY;
3753                        goto out_unlock;
3754                }
3755
3756                mvmvif->csa_target_freq = chsw->chandef.chan->center_freq;
3757
3758                break;
3759        case NL80211_IFTYPE_STATION:
3760                if (mvmvif->lqm_active)
3761                        iwl_mvm_send_lqm_cmd(vif,
3762                                             LQM_CMD_OPERATION_STOP_MEASUREMENT,
3763                                             0, 0);
3764
3765                /* Schedule the time event to a bit before beacon 1,
3766                 * to make sure we're in the new channel when the
3767                 * GO/AP arrives.
3768                 */
3769                apply_time = chsw->device_timestamp +
3770                        ((vif->bss_conf.beacon_int * (chsw->count - 1) -
3771                          IWL_MVM_CHANNEL_SWITCH_TIME_CLIENT) * 1024);
3772
3773                if (chsw->block_tx)
3774                        iwl_mvm_csa_client_absent(mvm, vif);
3775
3776                iwl_mvm_schedule_csa_period(mvm, vif, vif->bss_conf.beacon_int,
3777                                            apply_time);
3778                if (mvmvif->bf_data.bf_enabled) {
3779                        ret = iwl_mvm_disable_beacon_filter(mvm, vif, 0);
3780                        if (ret)
3781                                goto out_unlock;
3782                }
3783
3784                break;
3785        default:
3786                break;
3787        }
3788
3789        mvmvif->ps_disabled = true;
3790
3791        ret = iwl_mvm_power_update_ps(mvm);
3792        if (ret)
3793                goto out_unlock;
3794
3795        /* we won't be on this channel any longer */
3796        iwl_mvm_teardown_tdls_peers(mvm);
3797
3798out_unlock:
3799        mutex_unlock(&mvm->mutex);
3800
3801        return ret;
3802}
3803
3804static int iwl_mvm_post_channel_switch(struct ieee80211_hw *hw,
3805                                       struct ieee80211_vif *vif)
3806{
3807        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
3808        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3809        int ret;
3810
3811        mutex_lock(&mvm->mutex);
3812
3813        if (mvmvif->csa_failed) {
3814                mvmvif->csa_failed = false;
3815                ret = -EIO;
3816                goto out_unlock;
3817        }
3818
3819        if (vif->type == NL80211_IFTYPE_STATION) {
3820                struct iwl_mvm_sta *mvmsta;
3821
3822                mvmsta = iwl_mvm_sta_from_staid_protected(mvm,
3823                                                          mvmvif->ap_sta_id);
3824
3825                if (WARN_ON(!mvmsta)) {
3826                        ret = -EIO;
3827                        goto out_unlock;
3828                }
3829
3830                iwl_mvm_sta_modify_disable_tx(mvm, mvmsta, false);
3831
3832                iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
3833
3834                ret = iwl_mvm_enable_beacon_filter(mvm, vif, 0);
3835                if (ret)
3836                        goto out_unlock;
3837
3838                iwl_mvm_stop_session_protection(mvm, vif);
3839        }
3840
3841        mvmvif->ps_disabled = false;
3842
3843        ret = iwl_mvm_power_update_ps(mvm);
3844
3845out_unlock:
3846        mutex_unlock(&mvm->mutex);
3847
3848        return ret;
3849}
3850
3851static void iwl_mvm_mac_flush(struct ieee80211_hw *hw,
3852                              struct ieee80211_vif *vif, u32 queues, bool drop)
3853{
3854        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3855        struct iwl_mvm_vif *mvmvif;
3856        struct iwl_mvm_sta *mvmsta;
3857        struct ieee80211_sta *sta;
3858        int i;
3859        u32 msk = 0;
3860
3861        if (!vif || vif->type != NL80211_IFTYPE_STATION)
3862                return;
3863
3864        /* Make sure we're done with the deferred traffic before flushing */
3865        if (iwl_mvm_is_dqa_supported(mvm))
3866                flush_work(&mvm->add_stream_wk);
3867
3868        mutex_lock(&mvm->mutex);
3869        mvmvif = iwl_mvm_vif_from_mac80211(vif);
3870
3871        /* flush the AP-station and all TDLS peers */
3872        for (i = 0; i < IWL_MVM_STATION_COUNT; i++) {
3873                sta = rcu_dereference_protected(mvm->fw_id_to_mac_id[i],
3874                                                lockdep_is_held(&mvm->mutex));
3875                if (IS_ERR_OR_NULL(sta))
3876                        continue;
3877
3878                mvmsta = iwl_mvm_sta_from_mac80211(sta);
3879                if (mvmsta->vif != vif)
3880                        continue;
3881
3882                /* make sure only TDLS peers or the AP are flushed */
3883                WARN_ON(i != mvmvif->ap_sta_id && !sta->tdls);
3884
3885                msk |= mvmsta->tfd_queue_msk;
3886        }
3887
3888        if (drop) {
3889                if (iwl_mvm_flush_tx_path(mvm, msk, 0))
3890                        IWL_ERR(mvm, "flush request fail\n");
3891                mutex_unlock(&mvm->mutex);
3892        } else {
3893                mutex_unlock(&mvm->mutex);
3894
3895                /* this can take a while, and we may need/want other operations
3896                 * to succeed while doing this, so do it without the mutex held
3897                 */
3898                iwl_trans_wait_tx_queue_empty(mvm->trans, msk);
3899        }
3900}
3901
3902static int iwl_mvm_mac_get_survey(struct ieee80211_hw *hw, int idx,
3903                                  struct survey_info *survey)
3904{
3905        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3906        int ret;
3907
3908        memset(survey, 0, sizeof(*survey));
3909
3910        /* only support global statistics right now */
3911        if (idx != 0)
3912                return -ENOENT;
3913
3914        if (!fw_has_capa(&mvm->fw->ucode_capa,
3915                         IWL_UCODE_TLV_CAPA_RADIO_BEACON_STATS))
3916                return -ENOENT;
3917
3918        mutex_lock(&mvm->mutex);
3919
3920        if (mvm->ucode_loaded) {
3921                ret = iwl_mvm_request_statistics(mvm, false);
3922                if (ret)
3923                        goto out;
3924        }
3925
3926        survey->filled = SURVEY_INFO_TIME |
3927                         SURVEY_INFO_TIME_RX |
3928                         SURVEY_INFO_TIME_TX |
3929                         SURVEY_INFO_TIME_SCAN;
3930        survey->time = mvm->accu_radio_stats.on_time_rf +
3931                       mvm->radio_stats.on_time_rf;
3932        do_div(survey->time, USEC_PER_MSEC);
3933
3934        survey->time_rx = mvm->accu_radio_stats.rx_time +
3935                          mvm->radio_stats.rx_time;
3936        do_div(survey->time_rx, USEC_PER_MSEC);
3937
3938        survey->time_tx = mvm->accu_radio_stats.tx_time +
3939                          mvm->radio_stats.tx_time;
3940        do_div(survey->time_tx, USEC_PER_MSEC);
3941
3942        survey->time_scan = mvm->accu_radio_stats.on_time_scan +
3943                            mvm->radio_stats.on_time_scan;
3944        do_div(survey->time_scan, USEC_PER_MSEC);
3945
3946        ret = 0;
3947 out:
3948        mutex_unlock(&mvm->mutex);
3949        return ret;
3950}
3951
3952static void iwl_mvm_mac_sta_statistics(struct ieee80211_hw *hw,
3953                                       struct ieee80211_vif *vif,
3954                                       struct ieee80211_sta *sta,
3955                                       struct station_info *sinfo)
3956{
3957        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3958        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
3959        struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
3960
3961        if (mvmsta->avg_energy) {
3962                sinfo->signal_avg = mvmsta->avg_energy;
3963                sinfo->filled |= BIT(NL80211_STA_INFO_SIGNAL_AVG);
3964        }
3965
3966        if (!fw_has_capa(&mvm->fw->ucode_capa,
3967                         IWL_UCODE_TLV_CAPA_RADIO_BEACON_STATS))
3968                return;
3969
3970        /* if beacon filtering isn't on mac80211 does it anyway */
3971        if (!(vif->driver_flags & IEEE80211_VIF_BEACON_FILTER))
3972                return;
3973
3974        if (!vif->bss_conf.assoc)
3975                return;
3976
3977        mutex_lock(&mvm->mutex);
3978
3979        if (mvmvif->ap_sta_id != mvmsta->sta_id)
3980                goto unlock;
3981
3982        if (iwl_mvm_request_statistics(mvm, false))
3983                goto unlock;
3984
3985        sinfo->rx_beacon = mvmvif->beacon_stats.num_beacons +
3986                           mvmvif->beacon_stats.accu_num_beacons;
3987        sinfo->filled |= BIT(NL80211_STA_INFO_BEACON_RX);
3988        if (mvmvif->beacon_stats.avg_signal) {
3989                /* firmware only reports a value after RXing a few beacons */
3990                sinfo->rx_beacon_signal_avg = mvmvif->beacon_stats.avg_signal;
3991                sinfo->filled |= BIT(NL80211_STA_INFO_BEACON_SIGNAL_AVG);
3992        }
3993 unlock:
3994        mutex_unlock(&mvm->mutex);
3995}
3996
3997static void iwl_mvm_event_mlme_callback(struct iwl_mvm *mvm,
3998                                        struct ieee80211_vif *vif,
3999                                        const struct ieee80211_event *event)
4000{
4001#define CHECK_MLME_TRIGGER(_mvm, _trig, _buf, _cnt, _fmt...)    \
4002        do {                                                    \
4003                if ((_cnt) && --(_cnt))                         \
4004                        break;                                  \
4005                iwl_mvm_fw_dbg_collect_trig(_mvm, _trig, _fmt);\
4006        } while (0)
4007
4008        struct iwl_fw_dbg_trigger_tlv *trig;
4009        struct iwl_fw_dbg_trigger_mlme *trig_mlme;
4010
4011        if (!iwl_fw_dbg_trigger_enabled(mvm->fw, FW_DBG_TRIGGER_MLME))
4012                return;
4013
4014        trig = iwl_fw_dbg_get_trigger(mvm->fw, FW_DBG_TRIGGER_MLME);
4015        trig_mlme = (void *)trig->data;
4016        if (!iwl_fw_dbg_trigger_check_stop(mvm, vif, trig))
4017                return;
4018
4019        if (event->u.mlme.data == ASSOC_EVENT) {
4020                if (event->u.mlme.status == MLME_DENIED)
4021                        CHECK_MLME_TRIGGER(mvm, trig, buf,
4022                                           trig_mlme->stop_assoc_denied,
4023                                           "DENIED ASSOC: reason %d",
4024                                            event->u.mlme.reason);
4025                else if (event->u.mlme.status == MLME_TIMEOUT)
4026                        CHECK_MLME_TRIGGER(mvm, trig, buf,
4027                                           trig_mlme->stop_assoc_timeout,
4028                                           "ASSOC TIMEOUT");
4029        } else if (event->u.mlme.data == AUTH_EVENT) {
4030                if (event->u.mlme.status == MLME_DENIED)
4031                        CHECK_MLME_TRIGGER(mvm, trig, buf,
4032                                           trig_mlme->stop_auth_denied,
4033                                           "DENIED AUTH: reason %d",
4034                                           event->u.mlme.reason);
4035                else if (event->u.mlme.status == MLME_TIMEOUT)
4036                        CHECK_MLME_TRIGGER(mvm, trig, buf,
4037                                           trig_mlme->stop_auth_timeout,
4038                                           "AUTH TIMEOUT");
4039        } else if (event->u.mlme.data == DEAUTH_RX_EVENT) {
4040                CHECK_MLME_TRIGGER(mvm, trig, buf,
4041                                   trig_mlme->stop_rx_deauth,
4042                                   "DEAUTH RX %d", event->u.mlme.reason);
4043        } else if (event->u.mlme.data == DEAUTH_TX_EVENT) {
4044                CHECK_MLME_TRIGGER(mvm, trig, buf,
4045                                   trig_mlme->stop_tx_deauth,
4046                                   "DEAUTH TX %d", event->u.mlme.reason);
4047        }
4048#undef CHECK_MLME_TRIGGER
4049}
4050
4051static void iwl_mvm_event_bar_rx_callback(struct iwl_mvm *mvm,
4052                                          struct ieee80211_vif *vif,
4053                                          const struct ieee80211_event *event)
4054{
4055        struct iwl_fw_dbg_trigger_tlv *trig;
4056        struct iwl_fw_dbg_trigger_ba *ba_trig;
4057
4058        if (!iwl_fw_dbg_trigger_enabled(mvm->fw, FW_DBG_TRIGGER_BA))
4059                return;
4060
4061        trig = iwl_fw_dbg_get_trigger(mvm->fw, FW_DBG_TRIGGER_BA);
4062        ba_trig = (void *)trig->data;
4063        if (!iwl_fw_dbg_trigger_check_stop(mvm, vif, trig))
4064                return;
4065
4066        if (!(le16_to_cpu(ba_trig->rx_bar) & BIT(event->u.ba.tid)))
4067                return;
4068
4069        iwl_mvm_fw_dbg_collect_trig(mvm, trig,
4070                                    "BAR received from %pM, tid %d, ssn %d",
4071                                    event->u.ba.sta->addr, event->u.ba.tid,
4072                                    event->u.ba.ssn);
4073}
4074
4075static void
4076iwl_mvm_event_frame_timeout_callback(struct iwl_mvm *mvm,
4077                                     struct ieee80211_vif *vif,
4078                                     const struct ieee80211_event *event)
4079{
4080        struct iwl_fw_dbg_trigger_tlv *trig;
4081        struct iwl_fw_dbg_trigger_ba *ba_trig;
4082
4083        if (!iwl_fw_dbg_trigger_enabled(mvm->fw, FW_DBG_TRIGGER_BA))
4084                return;
4085
4086        trig = iwl_fw_dbg_get_trigger(mvm->fw, FW_DBG_TRIGGER_BA);
4087        ba_trig = (void *)trig->data;
4088        if (!iwl_fw_dbg_trigger_check_stop(mvm, vif, trig))
4089                return;
4090
4091        if (!(le16_to_cpu(ba_trig->frame_timeout) & BIT(event->u.ba.tid)))
4092                return;
4093
4094        iwl_mvm_fw_dbg_collect_trig(mvm, trig,
4095                                    "Frame from %pM timed out, tid %d",
4096                                    event->u.ba.sta->addr, event->u.ba.tid);
4097}
4098
4099static void iwl_mvm_mac_event_callback(struct ieee80211_hw *hw,
4100                                       struct ieee80211_vif *vif,
4101                                       const struct ieee80211_event *event)
4102{
4103        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
4104
4105        switch (event->type) {
4106        case MLME_EVENT:
4107                iwl_mvm_event_mlme_callback(mvm, vif, event);
4108                break;
4109        case BAR_RX_EVENT:
4110                iwl_mvm_event_bar_rx_callback(mvm, vif, event);
4111                break;
4112        case BA_FRAME_TIMEOUT:
4113                iwl_mvm_event_frame_timeout_callback(mvm, vif, event);
4114                break;
4115        default:
4116                break;
4117        }
4118}
4119
4120void iwl_mvm_sync_rx_queues_internal(struct iwl_mvm *mvm,
4121                                     struct iwl_mvm_internal_rxq_notif *notif,
4122                                     u32 size)
4123{
4124        u32 qmask = BIT(mvm->trans->num_rx_queues) - 1;
4125        int ret;
4126
4127        lockdep_assert_held(&mvm->mutex);
4128
4129        if (!iwl_mvm_has_new_rx_api(mvm))
4130                return;
4131
4132        notif->cookie = mvm->queue_sync_cookie;
4133
4134        if (notif->sync)
4135                atomic_set(&mvm->queue_sync_counter,
4136                           mvm->trans->num_rx_queues);
4137
4138        ret = iwl_mvm_notify_rx_queue(mvm, qmask, (u8 *)notif, size);
4139        if (ret) {
4140                IWL_ERR(mvm, "Failed to trigger RX queues sync (%d)\n", ret);
4141                goto out;
4142        }
4143
4144        if (notif->sync)
4145                ret = wait_event_timeout(mvm->rx_sync_waitq,
4146                                         atomic_read(&mvm->queue_sync_counter) == 0,
4147                                         HZ);
4148        WARN_ON_ONCE(!ret);
4149
4150out:
4151        atomic_set(&mvm->queue_sync_counter, 0);
4152        mvm->queue_sync_cookie++;
4153}
4154
4155static void iwl_mvm_sync_rx_queues(struct ieee80211_hw *hw)
4156{
4157        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
4158        struct iwl_mvm_internal_rxq_notif data = {
4159                .type = IWL_MVM_RXQ_EMPTY,
4160                .sync = 1,
4161        };
4162
4163        mutex_lock(&mvm->mutex);
4164        iwl_mvm_sync_rx_queues_internal(mvm, &data, sizeof(data));
4165        mutex_unlock(&mvm->mutex);
4166}
4167
4168const struct ieee80211_ops iwl_mvm_hw_ops = {
4169        .tx = iwl_mvm_mac_tx,
4170        .ampdu_action = iwl_mvm_mac_ampdu_action,
4171        .start = iwl_mvm_mac_start,
4172        .reconfig_complete = iwl_mvm_mac_reconfig_complete,
4173        .stop = iwl_mvm_mac_stop,
4174        .add_interface = iwl_mvm_mac_add_interface,
4175        .remove_interface = iwl_mvm_mac_remove_interface,
4176        .config = iwl_mvm_mac_config,
4177        .prepare_multicast = iwl_mvm_prepare_multicast,
4178        .configure_filter = iwl_mvm_configure_filter,
4179        .config_iface_filter = iwl_mvm_config_iface_filter,
4180        .bss_info_changed = iwl_mvm_bss_info_changed,
4181        .hw_scan = iwl_mvm_mac_hw_scan,
4182        .cancel_hw_scan = iwl_mvm_mac_cancel_hw_scan,
4183        .sta_pre_rcu_remove = iwl_mvm_sta_pre_rcu_remove,
4184        .sta_state = iwl_mvm_mac_sta_state,
4185        .sta_notify = iwl_mvm_mac_sta_notify,
4186        .allow_buffered_frames = iwl_mvm_mac_allow_buffered_frames,
4187        .release_buffered_frames = iwl_mvm_mac_release_buffered_frames,
4188        .set_rts_threshold = iwl_mvm_mac_set_rts_threshold,
4189        .sta_rc_update = iwl_mvm_sta_rc_update,
4190        .conf_tx = iwl_mvm_mac_conf_tx,
4191        .mgd_prepare_tx = iwl_mvm_mac_mgd_prepare_tx,
4192        .mgd_protect_tdls_discover = iwl_mvm_mac_mgd_protect_tdls_discover,
4193        .flush = iwl_mvm_mac_flush,
4194        .sched_scan_start = iwl_mvm_mac_sched_scan_start,
4195        .sched_scan_stop = iwl_mvm_mac_sched_scan_stop,
4196        .set_key = iwl_mvm_mac_set_key,
4197        .update_tkip_key = iwl_mvm_mac_update_tkip_key,
4198        .remain_on_channel = iwl_mvm_roc,
4199        .cancel_remain_on_channel = iwl_mvm_cancel_roc,
4200        .add_chanctx = iwl_mvm_add_chanctx,
4201        .remove_chanctx = iwl_mvm_remove_chanctx,
4202        .change_chanctx = iwl_mvm_change_chanctx,
4203        .assign_vif_chanctx = iwl_mvm_assign_vif_chanctx,
4204        .unassign_vif_chanctx = iwl_mvm_unassign_vif_chanctx,
4205        .switch_vif_chanctx = iwl_mvm_switch_vif_chanctx,
4206
4207        .start_ap = iwl_mvm_start_ap_ibss,
4208        .stop_ap = iwl_mvm_stop_ap_ibss,
4209        .join_ibss = iwl_mvm_start_ap_ibss,
4210        .leave_ibss = iwl_mvm_stop_ap_ibss,
4211
4212        .set_tim = iwl_mvm_set_tim,
4213
4214        .channel_switch = iwl_mvm_channel_switch,
4215        .pre_channel_switch = iwl_mvm_pre_channel_switch,
4216        .post_channel_switch = iwl_mvm_post_channel_switch,
4217
4218        .tdls_channel_switch = iwl_mvm_tdls_channel_switch,
4219        .tdls_cancel_channel_switch = iwl_mvm_tdls_cancel_channel_switch,
4220        .tdls_recv_channel_switch = iwl_mvm_tdls_recv_channel_switch,
4221
4222        .event_callback = iwl_mvm_mac_event_callback,
4223
4224        .sync_rx_queues = iwl_mvm_sync_rx_queues,
4225
4226        CFG80211_TESTMODE_CMD(iwl_mvm_mac_testmode_cmd)
4227
4228#ifdef CONFIG_PM_SLEEP
4229        /* look at d3.c */
4230        .suspend = iwl_mvm_suspend,
4231        .resume = iwl_mvm_resume,
4232        .set_wakeup = iwl_mvm_set_wakeup,
4233        .set_rekey_data = iwl_mvm_set_rekey_data,
4234#if IS_ENABLED(CONFIG_IPV6)
4235        .ipv6_addr_change = iwl_mvm_ipv6_addr_change,
4236#endif
4237        .set_default_unicast_key = iwl_mvm_set_default_unicast_key,
4238#endif
4239        .get_survey = iwl_mvm_mac_get_survey,
4240        .sta_statistics = iwl_mvm_mac_sta_statistics,
4241};
4242