linux/drivers/net/wireless/iwlwifi/iwl-mac80211.c
<<
>>
Prefs
   1/******************************************************************************
   2 *
   3 * Copyright(c) 2003 - 2012 Intel Corporation. All rights reserved.
   4 *
   5 * Portions of this file are derived from the ipw3945 project, as well
   6 * as portions of the ieee80211 subsystem header files.
   7 *
   8 * This program is free software; you can redistribute it and/or modify it
   9 * under the terms of version 2 of the GNU General Public License as
  10 * published by the Free Software Foundation.
  11 *
  12 * This program is distributed in the hope that it will be useful, but WITHOUT
  13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  14 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  15 * more details.
  16 *
  17 * You should have received a copy of the GNU General Public License along with
  18 * this program; if not, write to the Free Software Foundation, Inc.,
  19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  20 *
  21 * The full GNU General Public License is included in this distribution in the
  22 * file called LICENSE.
  23 *
  24 * Contact Information:
  25 *  Intel Linux Wireless <ilw@linux.intel.com>
  26 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
  27 *
  28 *****************************************************************************/
  29#include <linux/kernel.h>
  30#include <linux/module.h>
  31#include <linux/init.h>
  32#include <linux/slab.h>
  33#include <linux/dma-mapping.h>
  34#include <linux/delay.h>
  35#include <linux/sched.h>
  36#include <linux/skbuff.h>
  37#include <linux/netdevice.h>
  38#include <linux/etherdevice.h>
  39#include <linux/if_arp.h>
  40
  41#include <net/mac80211.h>
  42
  43#include <asm/div64.h>
  44
  45#include "iwl-eeprom.h"
  46#include "iwl-dev.h"
  47#include "iwl-core.h"
  48#include "iwl-io.h"
  49#include "iwl-agn-calib.h"
  50#include "iwl-agn.h"
  51#include "iwl-shared.h"
  52#include "iwl-trans.h"
  53#include "iwl-op-mode.h"
  54
  55/*****************************************************************************
  56 *
  57 * mac80211 entry point functions
  58 *
  59 *****************************************************************************/
  60
  61static const struct ieee80211_iface_limit iwlagn_sta_ap_limits[] = {
  62        {
  63                .max = 1,
  64                .types = BIT(NL80211_IFTYPE_STATION),
  65        },
  66        {
  67                .max = 1,
  68                .types = BIT(NL80211_IFTYPE_AP),
  69        },
  70};
  71
  72static const struct ieee80211_iface_limit iwlagn_2sta_limits[] = {
  73        {
  74                .max = 2,
  75                .types = BIT(NL80211_IFTYPE_STATION),
  76        },
  77};
  78
  79static const struct ieee80211_iface_limit iwlagn_p2p_sta_go_limits[] = {
  80        {
  81                .max = 1,
  82                .types = BIT(NL80211_IFTYPE_STATION),
  83        },
  84        {
  85                .max = 1,
  86                .types = BIT(NL80211_IFTYPE_P2P_GO) |
  87                         BIT(NL80211_IFTYPE_AP),
  88        },
  89};
  90
  91static const struct ieee80211_iface_limit iwlagn_p2p_2sta_limits[] = {
  92        {
  93                .max = 2,
  94                .types = BIT(NL80211_IFTYPE_STATION),
  95        },
  96        {
  97                .max = 1,
  98                .types = BIT(NL80211_IFTYPE_P2P_CLIENT),
  99        },
 100};
 101
 102static const struct ieee80211_iface_combination
 103iwlagn_iface_combinations_dualmode[] = {
 104        { .num_different_channels = 1,
 105          .max_interfaces = 2,
 106          .beacon_int_infra_match = true,
 107          .limits = iwlagn_sta_ap_limits,
 108          .n_limits = ARRAY_SIZE(iwlagn_sta_ap_limits),
 109        },
 110        { .num_different_channels = 1,
 111          .max_interfaces = 2,
 112          .limits = iwlagn_2sta_limits,
 113          .n_limits = ARRAY_SIZE(iwlagn_2sta_limits),
 114        },
 115};
 116
 117static const struct ieee80211_iface_combination
 118iwlagn_iface_combinations_p2p[] = {
 119        { .num_different_channels = 1,
 120          .max_interfaces = 2,
 121          .beacon_int_infra_match = true,
 122          .limits = iwlagn_p2p_sta_go_limits,
 123          .n_limits = ARRAY_SIZE(iwlagn_p2p_sta_go_limits),
 124        },
 125        { .num_different_channels = 1,
 126          .max_interfaces = 2,
 127          .limits = iwlagn_p2p_2sta_limits,
 128          .n_limits = ARRAY_SIZE(iwlagn_p2p_2sta_limits),
 129        },
 130};
 131
 132/*
 133 * Not a mac80211 entry point function, but it fits in with all the
 134 * other mac80211 functions grouped here.
 135 */
 136int iwlagn_mac_setup_register(struct iwl_priv *priv,
 137                              const struct iwl_ucode_capabilities *capa)
 138{
 139        int ret;
 140        struct ieee80211_hw *hw = priv->hw;
 141        struct iwl_rxon_context *ctx;
 142
 143        hw->rate_control_algorithm = "iwl-agn-rs";
 144
 145        /* Tell mac80211 our characteristics */
 146        hw->flags = IEEE80211_HW_SIGNAL_DBM |
 147                    IEEE80211_HW_AMPDU_AGGREGATION |
 148                    IEEE80211_HW_NEED_DTIM_PERIOD |
 149                    IEEE80211_HW_SPECTRUM_MGMT |
 150                    IEEE80211_HW_REPORTS_TX_ACK_STATUS;
 151
 152        /*
 153         * Including the following line will crash some AP's.  This
 154         * workaround removes the stimulus which causes the crash until
 155         * the AP software can be fixed.
 156        hw->max_tx_aggregation_subframes = LINK_QUAL_AGG_FRAME_LIMIT_DEF;
 157         */
 158
 159        hw->flags |= IEEE80211_HW_SUPPORTS_PS |
 160                     IEEE80211_HW_SUPPORTS_DYNAMIC_PS;
 161
 162        if (hw_params(priv).sku & EEPROM_SKU_CAP_11N_ENABLE)
 163                hw->flags |= IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS |
 164                             IEEE80211_HW_SUPPORTS_STATIC_SMPS;
 165
 166#ifndef CONFIG_IWLWIFI_EXPERIMENTAL_MFP
 167        /* enable 11w if the uCode advertise */
 168        if (capa->flags & IWL_UCODE_TLV_FLAGS_MFP)
 169#endif /* !CONFIG_IWLWIFI_EXPERIMENTAL_MFP */
 170                hw->flags |= IEEE80211_HW_MFP_CAPABLE;
 171
 172        hw->sta_data_size = sizeof(struct iwl_station_priv);
 173        hw->vif_data_size = sizeof(struct iwl_vif_priv);
 174
 175        for_each_context(priv, ctx) {
 176                hw->wiphy->interface_modes |= ctx->interface_modes;
 177                hw->wiphy->interface_modes |= ctx->exclusive_interface_modes;
 178        }
 179
 180        BUILD_BUG_ON(NUM_IWL_RXON_CTX != 2);
 181
 182        if (hw->wiphy->interface_modes & BIT(NL80211_IFTYPE_P2P_CLIENT)) {
 183                hw->wiphy->iface_combinations = iwlagn_iface_combinations_p2p;
 184                hw->wiphy->n_iface_combinations =
 185                        ARRAY_SIZE(iwlagn_iface_combinations_p2p);
 186        } else if (hw->wiphy->interface_modes & BIT(NL80211_IFTYPE_AP)) {
 187                hw->wiphy->iface_combinations =
 188                        iwlagn_iface_combinations_dualmode;
 189                hw->wiphy->n_iface_combinations =
 190                        ARRAY_SIZE(iwlagn_iface_combinations_dualmode);
 191        }
 192
 193        hw->wiphy->max_remain_on_channel_duration = 1000;
 194
 195        hw->wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY |
 196                            WIPHY_FLAG_DISABLE_BEACON_HINTS |
 197                            WIPHY_FLAG_IBSS_RSN;
 198
 199        if (priv->fw->img[IWL_UCODE_WOWLAN].sec[0].len &&
 200            trans(priv)->ops->wowlan_suspend &&
 201            device_can_wakeup(trans(priv)->dev)) {
 202                hw->wiphy->wowlan.flags = WIPHY_WOWLAN_MAGIC_PKT |
 203                                          WIPHY_WOWLAN_DISCONNECT |
 204                                          WIPHY_WOWLAN_EAP_IDENTITY_REQ |
 205                                          WIPHY_WOWLAN_RFKILL_RELEASE;
 206                if (!iwlagn_mod_params.sw_crypto)
 207                        hw->wiphy->wowlan.flags |=
 208                                WIPHY_WOWLAN_SUPPORTS_GTK_REKEY |
 209                                WIPHY_WOWLAN_GTK_REKEY_FAILURE;
 210
 211                hw->wiphy->wowlan.n_patterns = IWLAGN_WOWLAN_MAX_PATTERNS;
 212                hw->wiphy->wowlan.pattern_min_len =
 213                                        IWLAGN_WOWLAN_MIN_PATTERN_LEN;
 214                hw->wiphy->wowlan.pattern_max_len =
 215                                        IWLAGN_WOWLAN_MAX_PATTERN_LEN;
 216        }
 217
 218        if (iwlagn_mod_params.power_save)
 219                hw->wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT;
 220        else
 221                hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT;
 222
 223        hw->wiphy->max_scan_ssids = PROBE_OPTION_MAX;
 224        /* we create the 802.11 header and a zero-length SSID element */
 225        hw->wiphy->max_scan_ie_len = capa->max_probe_length - 24 - 2;
 226
 227        /* Default value; 4 EDCA QOS priorities */
 228        hw->queues = 4;
 229
 230        hw->max_listen_interval = IWL_CONN_MAX_LISTEN_INTERVAL;
 231
 232        if (priv->bands[IEEE80211_BAND_2GHZ].n_channels)
 233                priv->hw->wiphy->bands[IEEE80211_BAND_2GHZ] =
 234                        &priv->bands[IEEE80211_BAND_2GHZ];
 235        if (priv->bands[IEEE80211_BAND_5GHZ].n_channels)
 236                priv->hw->wiphy->bands[IEEE80211_BAND_5GHZ] =
 237                        &priv->bands[IEEE80211_BAND_5GHZ];
 238
 239        hw->wiphy->hw_version = trans(priv)->hw_id;
 240
 241        iwl_leds_init(priv);
 242
 243        ret = ieee80211_register_hw(priv->hw);
 244        if (ret) {
 245                IWL_ERR(priv, "Failed to register hw (error %d)\n", ret);
 246                return ret;
 247        }
 248        priv->mac80211_registered = 1;
 249
 250        return 0;
 251}
 252
 253void iwlagn_mac_unregister(struct iwl_priv *priv)
 254{
 255        if (!priv->mac80211_registered)
 256                return;
 257        iwl_leds_exit(priv);
 258        ieee80211_unregister_hw(priv->hw);
 259        priv->mac80211_registered = 0;
 260}
 261
 262static int __iwl_up(struct iwl_priv *priv)
 263{
 264        struct iwl_rxon_context *ctx;
 265        int ret;
 266
 267        lockdep_assert_held(&priv->mutex);
 268
 269        if (test_bit(STATUS_EXIT_PENDING, &priv->status)) {
 270                IWL_WARN(priv, "Exit pending; will not bring the NIC up\n");
 271                return -EIO;
 272        }
 273
 274        for_each_context(priv, ctx) {
 275                ret = iwlagn_alloc_bcast_station(priv, ctx);
 276                if (ret) {
 277                        iwl_dealloc_bcast_stations(priv);
 278                        return ret;
 279                }
 280        }
 281
 282        ret = iwl_run_init_ucode(priv);
 283        if (ret) {
 284                IWL_ERR(priv, "Failed to run INIT ucode: %d\n", ret);
 285                goto error;
 286        }
 287
 288        ret = iwl_load_ucode_wait_alive(priv, IWL_UCODE_REGULAR);
 289        if (ret) {
 290                IWL_ERR(priv, "Failed to start RT ucode: %d\n", ret);
 291                goto error;
 292        }
 293
 294        ret = iwl_alive_start(priv);
 295        if (ret)
 296                goto error;
 297        return 0;
 298
 299 error:
 300        set_bit(STATUS_EXIT_PENDING, &priv->status);
 301        iwl_down(priv);
 302        clear_bit(STATUS_EXIT_PENDING, &priv->status);
 303
 304        IWL_ERR(priv, "Unable to initialize device.\n");
 305        return ret;
 306}
 307
 308static int iwlagn_mac_start(struct ieee80211_hw *hw)
 309{
 310        struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
 311        int ret;
 312
 313        IWL_DEBUG_MAC80211(priv, "enter\n");
 314
 315        /* we should be verifying the device is ready to be opened */
 316        mutex_lock(&priv->mutex);
 317        ret = __iwl_up(priv);
 318        mutex_unlock(&priv->mutex);
 319        if (ret)
 320                return ret;
 321
 322        IWL_DEBUG_INFO(priv, "Start UP work done.\n");
 323
 324        /* Now we should be done, and the READY bit should be set. */
 325        if (WARN_ON(!test_bit(STATUS_READY, &priv->status)))
 326                ret = -EIO;
 327
 328        iwlagn_led_enable(priv);
 329
 330        priv->is_open = 1;
 331        IWL_DEBUG_MAC80211(priv, "leave\n");
 332        return 0;
 333}
 334
 335static void iwlagn_mac_stop(struct ieee80211_hw *hw)
 336{
 337        struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
 338
 339        IWL_DEBUG_MAC80211(priv, "enter\n");
 340
 341        if (!priv->is_open)
 342                return;
 343
 344        priv->is_open = 0;
 345
 346        mutex_lock(&priv->mutex);
 347        iwl_down(priv);
 348        mutex_unlock(&priv->mutex);
 349
 350        iwl_cancel_deferred_work(priv);
 351
 352        flush_workqueue(priv->workqueue);
 353
 354        /* User space software may expect getting rfkill changes
 355         * even if interface is down, trans->down will leave the RF
 356         * kill interrupt enabled
 357         */
 358        iwl_trans_stop_hw(trans(priv));
 359
 360        IWL_DEBUG_MAC80211(priv, "leave\n");
 361}
 362
 363static void iwlagn_mac_set_rekey_data(struct ieee80211_hw *hw,
 364                                      struct ieee80211_vif *vif,
 365                                      struct cfg80211_gtk_rekey_data *data)
 366{
 367        struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
 368
 369        if (iwlagn_mod_params.sw_crypto)
 370                return;
 371
 372        IWL_DEBUG_MAC80211(priv, "enter\n");
 373        mutex_lock(&priv->mutex);
 374
 375        if (priv->contexts[IWL_RXON_CTX_BSS].vif != vif)
 376                goto out;
 377
 378        memcpy(priv->kek, data->kek, NL80211_KEK_LEN);
 379        memcpy(priv->kck, data->kck, NL80211_KCK_LEN);
 380        priv->replay_ctr =
 381                cpu_to_le64(be64_to_cpup((__be64 *)&data->replay_ctr));
 382        priv->have_rekey_data = true;
 383
 384 out:
 385        mutex_unlock(&priv->mutex);
 386        IWL_DEBUG_MAC80211(priv, "leave\n");
 387}
 388
 389#ifdef CONFIG_PM_SLEEP
 390
 391static int iwlagn_mac_suspend(struct ieee80211_hw *hw,
 392                              struct cfg80211_wowlan *wowlan)
 393{
 394        struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
 395        struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS];
 396        int ret;
 397
 398        if (WARN_ON(!wowlan))
 399                return -EINVAL;
 400
 401        IWL_DEBUG_MAC80211(priv, "enter\n");
 402        mutex_lock(&priv->mutex);
 403
 404        /* Don't attempt WoWLAN when not associated, tear down instead. */
 405        if (!ctx->vif || ctx->vif->type != NL80211_IFTYPE_STATION ||
 406            !iwl_is_associated_ctx(ctx)) {
 407                ret = 1;
 408                goto out;
 409        }
 410
 411        ret = iwlagn_suspend(priv, wowlan);
 412        if (ret)
 413                goto error;
 414
 415        device_set_wakeup_enable(trans(priv)->dev, true);
 416
 417        iwl_trans_wowlan_suspend(trans(priv));
 418
 419        goto out;
 420
 421 error:
 422        priv->wowlan = false;
 423        iwlagn_prepare_restart(priv);
 424        ieee80211_restart_hw(priv->hw);
 425 out:
 426        mutex_unlock(&priv->mutex);
 427        IWL_DEBUG_MAC80211(priv, "leave\n");
 428
 429        return ret;
 430}
 431
 432static int iwlagn_mac_resume(struct ieee80211_hw *hw)
 433{
 434        struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
 435        struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS];
 436        struct ieee80211_vif *vif;
 437        unsigned long flags;
 438        u32 base, status = 0xffffffff;
 439        int ret = -EIO;
 440        const struct fw_img *img;
 441
 442        IWL_DEBUG_MAC80211(priv, "enter\n");
 443        mutex_lock(&priv->mutex);
 444
 445        iwl_write32(trans(priv), CSR_UCODE_DRV_GP1_CLR,
 446                          CSR_UCODE_DRV_GP1_BIT_D3_CFG_COMPLETE);
 447
 448        base = priv->shrd->device_pointers.error_event_table;
 449        if (iwlagn_hw_valid_rtc_data_addr(base)) {
 450                spin_lock_irqsave(&trans(priv)->reg_lock, flags);
 451                ret = iwl_grab_nic_access_silent(trans(priv));
 452                if (likely(ret == 0)) {
 453                        iwl_write32(trans(priv), HBUS_TARG_MEM_RADDR, base);
 454                        status = iwl_read32(trans(priv), HBUS_TARG_MEM_RDAT);
 455                        iwl_release_nic_access(trans(priv));
 456                }
 457                spin_unlock_irqrestore(&trans(priv)->reg_lock, flags);
 458
 459#ifdef CONFIG_IWLWIFI_DEBUGFS
 460                if (ret == 0) {
 461                        img = &(priv->fw->img[IWL_UCODE_WOWLAN]);
 462                        if (!priv->wowlan_sram) {
 463                                priv->wowlan_sram =
 464                                   kzalloc(img->sec[IWL_UCODE_SECTION_DATA].len,
 465                                                GFP_KERNEL);
 466                        }
 467
 468                        if (priv->wowlan_sram)
 469                                _iwl_read_targ_mem_words(
 470                                      trans(priv), 0x800000,
 471                                      priv->wowlan_sram,
 472                                      img->sec[IWL_UCODE_SECTION_DATA].len / 4);
 473                }
 474#endif
 475        }
 476
 477        /* we'll clear ctx->vif during iwlagn_prepare_restart() */
 478        vif = ctx->vif;
 479
 480        priv->wowlan = false;
 481
 482        device_set_wakeup_enable(trans(priv)->dev, false);
 483
 484        iwlagn_prepare_restart(priv);
 485
 486        memset((void *)&ctx->active, 0, sizeof(ctx->active));
 487        iwl_connection_init_rx_config(priv, ctx);
 488        iwlagn_set_rxon_chain(priv, ctx);
 489
 490        mutex_unlock(&priv->mutex);
 491        IWL_DEBUG_MAC80211(priv, "leave\n");
 492
 493        ieee80211_resume_disconnect(vif);
 494
 495        return 1;
 496}
 497
 498#endif
 499
 500static void iwlagn_mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
 501{
 502        struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
 503
 504        IWL_DEBUG_TX(priv, "dev->xmit(%d bytes) at rate 0x%02x\n", skb->len,
 505                     ieee80211_get_tx_rate(hw, IEEE80211_SKB_CB(skb))->bitrate);
 506
 507        if (iwlagn_tx_skb(priv, skb))
 508                dev_kfree_skb_any(skb);
 509}
 510
 511static void iwlagn_mac_update_tkip_key(struct ieee80211_hw *hw,
 512                                       struct ieee80211_vif *vif,
 513                                       struct ieee80211_key_conf *keyconf,
 514                                       struct ieee80211_sta *sta,
 515                                       u32 iv32, u16 *phase1key)
 516{
 517        struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
 518
 519        iwl_update_tkip_key(priv, vif, keyconf, sta, iv32, phase1key);
 520}
 521
 522static int iwlagn_mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
 523                              struct ieee80211_vif *vif,
 524                              struct ieee80211_sta *sta,
 525                              struct ieee80211_key_conf *key)
 526{
 527        struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
 528        struct iwl_vif_priv *vif_priv = (void *)vif->drv_priv;
 529        struct iwl_rxon_context *ctx = vif_priv->ctx;
 530        int ret;
 531        bool is_default_wep_key = false;
 532
 533        IWL_DEBUG_MAC80211(priv, "enter\n");
 534
 535        if (iwlagn_mod_params.sw_crypto) {
 536                IWL_DEBUG_MAC80211(priv, "leave - hwcrypto disabled\n");
 537                return -EOPNOTSUPP;
 538        }
 539
 540        switch (key->cipher) {
 541        case WLAN_CIPHER_SUITE_TKIP:
 542                key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
 543                /* fall through */
 544        case WLAN_CIPHER_SUITE_CCMP:
 545                key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
 546                break;
 547        default:
 548                break;
 549        }
 550
 551        /*
 552         * We could program these keys into the hardware as well, but we
 553         * don't expect much multicast traffic in IBSS and having keys
 554         * for more stations is probably more useful.
 555         *
 556         * Mark key TX-only and return 0.
 557         */
 558        if (vif->type == NL80211_IFTYPE_ADHOC &&
 559            !(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) {
 560                key->hw_key_idx = WEP_INVALID_OFFSET;
 561                return 0;
 562        }
 563
 564        /* If they key was TX-only, accept deletion */
 565        if (cmd == DISABLE_KEY && key->hw_key_idx == WEP_INVALID_OFFSET)
 566                return 0;
 567
 568        mutex_lock(&priv->mutex);
 569        iwl_scan_cancel_timeout(priv, 100);
 570
 571        BUILD_BUG_ON(WEP_INVALID_OFFSET == IWLAGN_HW_KEY_DEFAULT);
 572
 573        /*
 574         * If we are getting WEP group key and we didn't receive any key mapping
 575         * so far, we are in legacy wep mode (group key only), otherwise we are
 576         * in 1X mode.
 577         * In legacy wep mode, we use another host command to the uCode.
 578         */
 579        if ((key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
 580             key->cipher == WLAN_CIPHER_SUITE_WEP104) && !sta) {
 581                if (cmd == SET_KEY)
 582                        is_default_wep_key = !ctx->key_mapping_keys;
 583                else
 584                        is_default_wep_key =
 585                                key->hw_key_idx == IWLAGN_HW_KEY_DEFAULT;
 586        }
 587
 588
 589        switch (cmd) {
 590        case SET_KEY:
 591                if (is_default_wep_key) {
 592                        ret = iwl_set_default_wep_key(priv, vif_priv->ctx, key);
 593                        break;
 594                }
 595                ret = iwl_set_dynamic_key(priv, vif_priv->ctx, key, sta);
 596                if (ret) {
 597                        /*
 598                         * can't add key for RX, but we don't need it
 599                         * in the device for TX so still return 0
 600                         */
 601                        ret = 0;
 602                        key->hw_key_idx = WEP_INVALID_OFFSET;
 603                }
 604
 605                IWL_DEBUG_MAC80211(priv, "enable hwcrypto key\n");
 606                break;
 607        case DISABLE_KEY:
 608                if (is_default_wep_key)
 609                        ret = iwl_remove_default_wep_key(priv, ctx, key);
 610                else
 611                        ret = iwl_remove_dynamic_key(priv, ctx, key, sta);
 612
 613                IWL_DEBUG_MAC80211(priv, "disable hwcrypto key\n");
 614                break;
 615        default:
 616                ret = -EINVAL;
 617        }
 618
 619        mutex_unlock(&priv->mutex);
 620        IWL_DEBUG_MAC80211(priv, "leave\n");
 621
 622        return ret;
 623}
 624
 625static int iwlagn_mac_ampdu_action(struct ieee80211_hw *hw,
 626                                   struct ieee80211_vif *vif,
 627                                   enum ieee80211_ampdu_mlme_action action,
 628                                   struct ieee80211_sta *sta, u16 tid, u16 *ssn,
 629                                   u8 buf_size)
 630{
 631        struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
 632        int ret = -EINVAL;
 633        struct iwl_station_priv *sta_priv = (void *) sta->drv_priv;
 634
 635        IWL_DEBUG_HT(priv, "A-MPDU action on addr %pM tid %d\n",
 636                     sta->addr, tid);
 637
 638        if (!(hw_params(priv).sku & EEPROM_SKU_CAP_11N_ENABLE))
 639                return -EACCES;
 640
 641        IWL_DEBUG_MAC80211(priv, "enter\n");
 642        mutex_lock(&priv->mutex);
 643
 644        switch (action) {
 645        case IEEE80211_AMPDU_RX_START:
 646                if (iwlagn_mod_params.disable_11n & IWL_DISABLE_HT_RXAGG)
 647                        break;
 648                IWL_DEBUG_HT(priv, "start Rx\n");
 649                ret = iwl_sta_rx_agg_start(priv, sta, tid, *ssn);
 650                break;
 651        case IEEE80211_AMPDU_RX_STOP:
 652                IWL_DEBUG_HT(priv, "stop Rx\n");
 653                ret = iwl_sta_rx_agg_stop(priv, sta, tid);
 654                break;
 655        case IEEE80211_AMPDU_TX_START:
 656                if (iwlagn_mod_params.disable_11n & IWL_DISABLE_HT_TXAGG)
 657                        break;
 658                IWL_DEBUG_HT(priv, "start Tx\n");
 659                ret = iwlagn_tx_agg_start(priv, vif, sta, tid, ssn);
 660                break;
 661        case IEEE80211_AMPDU_TX_STOP:
 662                IWL_DEBUG_HT(priv, "stop Tx\n");
 663                ret = iwlagn_tx_agg_stop(priv, vif, sta, tid);
 664                if ((ret == 0) && (priv->agg_tids_count > 0)) {
 665                        priv->agg_tids_count--;
 666                        IWL_DEBUG_HT(priv, "priv->agg_tids_count = %u\n",
 667                                     priv->agg_tids_count);
 668                }
 669                if (!priv->agg_tids_count &&
 670                    hw_params(priv).use_rts_for_aggregation) {
 671                        /*
 672                         * switch off RTS/CTS if it was previously enabled
 673                         */
 674                        sta_priv->lq_sta.lq.general_params.flags &=
 675                                ~LINK_QUAL_FLAGS_SET_STA_TLC_RTS_MSK;
 676                        iwl_send_lq_cmd(priv, iwl_rxon_ctx_from_vif(vif),
 677                                        &sta_priv->lq_sta.lq, CMD_ASYNC, false);
 678                }
 679                break;
 680        case IEEE80211_AMPDU_TX_OPERATIONAL:
 681                ret = iwlagn_tx_agg_oper(priv, vif, sta, tid, buf_size);
 682                break;
 683        }
 684        mutex_unlock(&priv->mutex);
 685        IWL_DEBUG_MAC80211(priv, "leave\n");
 686        return ret;
 687}
 688
 689static int iwlagn_mac_sta_add(struct ieee80211_hw *hw,
 690                              struct ieee80211_vif *vif,
 691                              struct ieee80211_sta *sta)
 692{
 693        struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
 694        struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
 695        struct iwl_vif_priv *vif_priv = (void *)vif->drv_priv;
 696        bool is_ap = vif->type == NL80211_IFTYPE_STATION;
 697        int ret;
 698        u8 sta_id;
 699
 700        IWL_DEBUG_INFO(priv, "proceeding to add station %pM\n",
 701                        sta->addr);
 702        sta_priv->sta_id = IWL_INVALID_STATION;
 703
 704        atomic_set(&sta_priv->pending_frames, 0);
 705        if (vif->type == NL80211_IFTYPE_AP)
 706                sta_priv->client = true;
 707
 708        ret = iwl_add_station_common(priv, vif_priv->ctx, sta->addr,
 709                                     is_ap, sta, &sta_id);
 710        if (ret) {
 711                IWL_ERR(priv, "Unable to add station %pM (%d)\n",
 712                        sta->addr, ret);
 713                /* Should we return success if return code is EEXIST ? */
 714                return ret;
 715        }
 716
 717        sta_priv->sta_id = sta_id;
 718
 719        return 0;
 720}
 721
 722static int iwlagn_mac_sta_remove(struct ieee80211_hw *hw,
 723                                 struct ieee80211_vif *vif,
 724                                 struct ieee80211_sta *sta)
 725{
 726        struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
 727        struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
 728        int ret;
 729
 730        IWL_DEBUG_INFO(priv, "proceeding to remove station %pM\n", sta->addr);
 731
 732        if (vif->type == NL80211_IFTYPE_STATION) {
 733                /*
 734                 * Station will be removed from device when the RXON
 735                 * is set to unassociated -- just deactivate it here
 736                 * to avoid re-programming it.
 737                 */
 738                ret = 0;
 739                iwl_deactivate_station(priv, sta_priv->sta_id, sta->addr);
 740        } else {
 741                ret = iwl_remove_station(priv, sta_priv->sta_id, sta->addr);
 742                if (ret)
 743                        IWL_DEBUG_QUIET_RFKILL(priv,
 744                                "Error removing station %pM\n", sta->addr);
 745        }
 746        return ret;
 747}
 748
 749static int iwlagn_mac_sta_state(struct ieee80211_hw *hw,
 750                                struct ieee80211_vif *vif,
 751                                struct ieee80211_sta *sta,
 752                                enum ieee80211_sta_state old_state,
 753                                enum ieee80211_sta_state new_state)
 754{
 755        struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
 756        struct iwl_vif_priv *vif_priv = (void *)vif->drv_priv;
 757        enum {
 758                NONE, ADD, REMOVE, HT_RATE_INIT, ADD_RATE_INIT,
 759        } op = NONE;
 760        int ret;
 761
 762        IWL_DEBUG_MAC80211(priv, "station %pM state change %d->%d\n",
 763                           sta->addr, old_state, new_state);
 764
 765        mutex_lock(&priv->mutex);
 766        if (vif->type == NL80211_IFTYPE_STATION) {
 767                if (old_state == IEEE80211_STA_NOTEXIST &&
 768                    new_state == IEEE80211_STA_NONE)
 769                        op = ADD;
 770                else if (old_state == IEEE80211_STA_NONE &&
 771                         new_state == IEEE80211_STA_NOTEXIST)
 772                        op = REMOVE;
 773                else if (old_state == IEEE80211_STA_AUTH &&
 774                         new_state == IEEE80211_STA_ASSOC)
 775                        op = HT_RATE_INIT;
 776        } else {
 777                if (old_state == IEEE80211_STA_AUTH &&
 778                    new_state == IEEE80211_STA_ASSOC)
 779                        op = ADD_RATE_INIT;
 780                else if (old_state == IEEE80211_STA_ASSOC &&
 781                         new_state == IEEE80211_STA_AUTH)
 782                        op = REMOVE;
 783        }
 784
 785        switch (op) {
 786        case ADD:
 787                ret = iwlagn_mac_sta_add(hw, vif, sta);
 788                break;
 789        case REMOVE:
 790                ret = iwlagn_mac_sta_remove(hw, vif, sta);
 791                break;
 792        case ADD_RATE_INIT:
 793                ret = iwlagn_mac_sta_add(hw, vif, sta);
 794                if (ret)
 795                        break;
 796                /* Initialize rate scaling */
 797                IWL_DEBUG_INFO(priv,
 798                               "Initializing rate scaling for station %pM\n",
 799                               sta->addr);
 800                iwl_rs_rate_init(priv, sta, iwl_sta_id(sta));
 801                ret = 0;
 802                break;
 803        case HT_RATE_INIT:
 804                /* Initialize rate scaling */
 805                ret = iwl_sta_update_ht(priv, vif_priv->ctx, sta);
 806                if (ret)
 807                        break;
 808                IWL_DEBUG_INFO(priv,
 809                               "Initializing rate scaling for station %pM\n",
 810                               sta->addr);
 811                iwl_rs_rate_init(priv, sta, iwl_sta_id(sta));
 812                ret = 0;
 813                break;
 814        default:
 815                ret = 0;
 816                break;
 817        }
 818
 819        /*
 820         * mac80211 might WARN if we fail, but due the way we
 821         * (badly) handle hard rfkill, we might fail here
 822         */
 823        if (iwl_is_rfkill(priv))
 824                ret = 0;
 825
 826        mutex_unlock(&priv->mutex);
 827        IWL_DEBUG_MAC80211(priv, "leave\n");
 828
 829        return ret;
 830}
 831
 832static void iwlagn_mac_channel_switch(struct ieee80211_hw *hw,
 833                                struct ieee80211_channel_switch *ch_switch)
 834{
 835        struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
 836        const struct iwl_channel_info *ch_info;
 837        struct ieee80211_conf *conf = &hw->conf;
 838        struct ieee80211_channel *channel = ch_switch->channel;
 839        struct iwl_ht_config *ht_conf = &priv->current_ht_config;
 840        /*
 841         * MULTI-FIXME
 842         * When we add support for multiple interfaces, we need to
 843         * revisit this. The channel switch command in the device
 844         * only affects the BSS context, but what does that really
 845         * mean? And what if we get a CSA on the second interface?
 846         * This needs a lot of work.
 847         */
 848        struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS];
 849        u16 ch;
 850
 851        IWL_DEBUG_MAC80211(priv, "enter\n");
 852
 853        mutex_lock(&priv->mutex);
 854
 855        if (iwl_is_rfkill(priv))
 856                goto out;
 857
 858        if (test_bit(STATUS_EXIT_PENDING, &priv->status) ||
 859            test_bit(STATUS_SCANNING, &priv->status) ||
 860            test_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status))
 861                goto out;
 862
 863        if (!iwl_is_associated_ctx(ctx))
 864                goto out;
 865
 866        if (!cfg(priv)->lib->set_channel_switch)
 867                goto out;
 868
 869        ch = channel->hw_value;
 870        if (le16_to_cpu(ctx->active.channel) == ch)
 871                goto out;
 872
 873        ch_info = iwl_get_channel_info(priv, channel->band, ch);
 874        if (!is_channel_valid(ch_info)) {
 875                IWL_DEBUG_MAC80211(priv, "invalid channel\n");
 876                goto out;
 877        }
 878
 879        priv->current_ht_config.smps = conf->smps_mode;
 880
 881        /* Configure HT40 channels */
 882        ctx->ht.enabled = conf_is_ht(conf);
 883        if (ctx->ht.enabled)
 884                iwlagn_config_ht40(conf, ctx);
 885        else
 886                ctx->ht.is_40mhz = false;
 887
 888        if ((le16_to_cpu(ctx->staging.channel) != ch))
 889                ctx->staging.flags = 0;
 890
 891        iwl_set_rxon_channel(priv, channel, ctx);
 892        iwl_set_rxon_ht(priv, ht_conf);
 893        iwl_set_flags_for_band(priv, ctx, channel->band, ctx->vif);
 894
 895        iwl_set_rate(priv);
 896        /*
 897         * at this point, staging_rxon has the
 898         * configuration for channel switch
 899         */
 900        set_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status);
 901        priv->switch_channel = cpu_to_le16(ch);
 902        if (cfg(priv)->lib->set_channel_switch(priv, ch_switch)) {
 903                clear_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status);
 904                priv->switch_channel = 0;
 905                ieee80211_chswitch_done(ctx->vif, false);
 906        }
 907
 908out:
 909        mutex_unlock(&priv->mutex);
 910        IWL_DEBUG_MAC80211(priv, "leave\n");
 911}
 912
 913static void iwlagn_configure_filter(struct ieee80211_hw *hw,
 914                                    unsigned int changed_flags,
 915                                    unsigned int *total_flags,
 916                                    u64 multicast)
 917{
 918        struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
 919        __le32 filter_or = 0, filter_nand = 0;
 920        struct iwl_rxon_context *ctx;
 921
 922#define CHK(test, flag) do { \
 923        if (*total_flags & (test))              \
 924                filter_or |= (flag);            \
 925        else                                    \
 926                filter_nand |= (flag);          \
 927        } while (0)
 928
 929        IWL_DEBUG_MAC80211(priv, "Enter: changed: 0x%x, total: 0x%x\n",
 930                        changed_flags, *total_flags);
 931
 932        CHK(FIF_OTHER_BSS | FIF_PROMISC_IN_BSS, RXON_FILTER_PROMISC_MSK);
 933        /* Setting _just_ RXON_FILTER_CTL2HOST_MSK causes FH errors */
 934        CHK(FIF_CONTROL, RXON_FILTER_CTL2HOST_MSK | RXON_FILTER_PROMISC_MSK);
 935        CHK(FIF_BCN_PRBRESP_PROMISC, RXON_FILTER_BCON_AWARE_MSK);
 936
 937#undef CHK
 938
 939        mutex_lock(&priv->mutex);
 940
 941        for_each_context(priv, ctx) {
 942                ctx->staging.filter_flags &= ~filter_nand;
 943                ctx->staging.filter_flags |= filter_or;
 944
 945                /*
 946                 * Not committing directly because hardware can perform a scan,
 947                 * but we'll eventually commit the filter flags change anyway.
 948                 */
 949        }
 950
 951        mutex_unlock(&priv->mutex);
 952
 953        /*
 954         * Receiving all multicast frames is always enabled by the
 955         * default flags setup in iwl_connection_init_rx_config()
 956         * since we currently do not support programming multicast
 957         * filters into the device.
 958         */
 959        *total_flags &= FIF_OTHER_BSS | FIF_ALLMULTI | FIF_PROMISC_IN_BSS |
 960                        FIF_BCN_PRBRESP_PROMISC | FIF_CONTROL;
 961}
 962
 963static void iwlagn_mac_flush(struct ieee80211_hw *hw, bool drop)
 964{
 965        struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
 966
 967        mutex_lock(&priv->mutex);
 968        IWL_DEBUG_MAC80211(priv, "enter\n");
 969
 970        if (test_bit(STATUS_EXIT_PENDING, &priv->status)) {
 971                IWL_DEBUG_TX(priv, "Aborting flush due to device shutdown\n");
 972                goto done;
 973        }
 974        if (iwl_is_rfkill(priv)) {
 975                IWL_DEBUG_TX(priv, "Aborting flush due to RF Kill\n");
 976                goto done;
 977        }
 978
 979        /*
 980         * mac80211 will not push any more frames for transmit
 981         * until the flush is completed
 982         */
 983        if (drop) {
 984                IWL_DEBUG_MAC80211(priv, "send flush command\n");
 985                if (iwlagn_txfifo_flush(priv, IWL_DROP_ALL)) {
 986                        IWL_ERR(priv, "flush request fail\n");
 987                        goto done;
 988                }
 989        }
 990        IWL_DEBUG_MAC80211(priv, "wait transmit/flush all frames\n");
 991        iwl_trans_wait_tx_queue_empty(trans(priv));
 992done:
 993        mutex_unlock(&priv->mutex);
 994        IWL_DEBUG_MAC80211(priv, "leave\n");
 995}
 996
 997static int iwlagn_mac_remain_on_channel(struct ieee80211_hw *hw,
 998                                     struct ieee80211_channel *channel,
 999                                     enum nl80211_channel_type channel_type,
1000                                     int duration)
1001{
1002        struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
1003        struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_PAN];
1004        int err = 0;
1005
1006        if (!(priv->shrd->valid_contexts & BIT(IWL_RXON_CTX_PAN)))
1007                return -EOPNOTSUPP;
1008
1009        if (!(ctx->interface_modes & BIT(NL80211_IFTYPE_P2P_CLIENT)))
1010                return -EOPNOTSUPP;
1011
1012        IWL_DEBUG_MAC80211(priv, "enter\n");
1013        mutex_lock(&priv->mutex);
1014
1015        if (test_bit(STATUS_SCAN_HW, &priv->status)) {
1016                err = -EBUSY;
1017                goto out;
1018        }
1019
1020        priv->hw_roc_channel = channel;
1021        priv->hw_roc_chantype = channel_type;
1022        /* convert from ms to TU */
1023        priv->hw_roc_duration = DIV_ROUND_UP(1000 * duration, 1024);
1024        priv->hw_roc_start_notified = false;
1025        cancel_delayed_work(&priv->hw_roc_disable_work);
1026
1027        if (!ctx->is_active) {
1028                static const struct iwl_qos_info default_qos_data = {
1029                        .def_qos_parm = {
1030                                .ac[0] = {
1031                                        .cw_min = cpu_to_le16(3),
1032                                        .cw_max = cpu_to_le16(7),
1033                                        .aifsn = 2,
1034                                        .edca_txop = cpu_to_le16(1504),
1035                                },
1036                                .ac[1] = {
1037                                        .cw_min = cpu_to_le16(7),
1038                                        .cw_max = cpu_to_le16(15),
1039                                        .aifsn = 2,
1040                                        .edca_txop = cpu_to_le16(3008),
1041                                },
1042                                .ac[2] = {
1043                                        .cw_min = cpu_to_le16(15),
1044                                        .cw_max = cpu_to_le16(1023),
1045                                        .aifsn = 3,
1046                                },
1047                                .ac[3] = {
1048                                        .cw_min = cpu_to_le16(15),
1049                                        .cw_max = cpu_to_le16(1023),
1050                                        .aifsn = 7,
1051                                },
1052                        },
1053                };
1054
1055                ctx->is_active = true;
1056                ctx->qos_data = default_qos_data;
1057                ctx->staging.dev_type = RXON_DEV_TYPE_P2P;
1058                memcpy(ctx->staging.node_addr,
1059                       priv->contexts[IWL_RXON_CTX_BSS].staging.node_addr,
1060                       ETH_ALEN);
1061                memcpy(ctx->staging.bssid_addr,
1062                       priv->contexts[IWL_RXON_CTX_BSS].staging.node_addr,
1063                       ETH_ALEN);
1064                err = iwlagn_commit_rxon(priv, ctx);
1065                if (err)
1066                        goto out;
1067                ctx->staging.filter_flags |= RXON_FILTER_ASSOC_MSK |
1068                                             RXON_FILTER_PROMISC_MSK |
1069                                             RXON_FILTER_CTL2HOST_MSK;
1070
1071                err = iwlagn_commit_rxon(priv, ctx);
1072                if (err) {
1073                        iwlagn_disable_roc(priv);
1074                        goto out;
1075                }
1076                priv->hw_roc_setup = true;
1077        }
1078
1079        err = iwl_scan_initiate(priv, ctx->vif, IWL_SCAN_ROC, channel->band);
1080        if (err)
1081                iwlagn_disable_roc(priv);
1082
1083 out:
1084        mutex_unlock(&priv->mutex);
1085        IWL_DEBUG_MAC80211(priv, "leave\n");
1086
1087        return err;
1088}
1089
1090static int iwlagn_mac_cancel_remain_on_channel(struct ieee80211_hw *hw)
1091{
1092        struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
1093
1094        if (!(priv->shrd->valid_contexts & BIT(IWL_RXON_CTX_PAN)))
1095                return -EOPNOTSUPP;
1096
1097        IWL_DEBUG_MAC80211(priv, "enter\n");
1098        mutex_lock(&priv->mutex);
1099        iwl_scan_cancel_timeout(priv, priv->hw_roc_duration);
1100        iwlagn_disable_roc(priv);
1101        mutex_unlock(&priv->mutex);
1102        IWL_DEBUG_MAC80211(priv, "leave\n");
1103
1104        return 0;
1105}
1106
1107static void iwlagn_mac_rssi_callback(struct ieee80211_hw *hw,
1108                           enum ieee80211_rssi_event rssi_event)
1109{
1110        struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
1111
1112        IWL_DEBUG_MAC80211(priv, "enter\n");
1113        mutex_lock(&priv->mutex);
1114
1115        if (cfg(priv)->bt_params &&
1116                        cfg(priv)->bt_params->advanced_bt_coexist) {
1117                if (rssi_event == RSSI_EVENT_LOW)
1118                        priv->bt_enable_pspoll = true;
1119                else if (rssi_event == RSSI_EVENT_HIGH)
1120                        priv->bt_enable_pspoll = false;
1121
1122                iwlagn_send_advance_bt_config(priv);
1123        } else {
1124                IWL_DEBUG_MAC80211(priv, "Advanced BT coex disabled,"
1125                                "ignoring RSSI callback\n");
1126        }
1127
1128        mutex_unlock(&priv->mutex);
1129        IWL_DEBUG_MAC80211(priv, "leave\n");
1130}
1131
1132static int iwlagn_mac_set_tim(struct ieee80211_hw *hw,
1133                           struct ieee80211_sta *sta, bool set)
1134{
1135        struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
1136
1137        queue_work(priv->workqueue, &priv->beacon_update);
1138
1139        return 0;
1140}
1141
1142static int iwlagn_mac_conf_tx(struct ieee80211_hw *hw,
1143                    struct ieee80211_vif *vif, u16 queue,
1144                    const struct ieee80211_tx_queue_params *params)
1145{
1146        struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
1147        struct iwl_vif_priv *vif_priv = (void *)vif->drv_priv;
1148        struct iwl_rxon_context *ctx = vif_priv->ctx;
1149        int q;
1150
1151        if (WARN_ON(!ctx))
1152                return -EINVAL;
1153
1154        IWL_DEBUG_MAC80211(priv, "enter\n");
1155
1156        if (!iwl_is_ready_rf(priv)) {
1157                IWL_DEBUG_MAC80211(priv, "leave - RF not ready\n");
1158                return -EIO;
1159        }
1160
1161        if (queue >= AC_NUM) {
1162                IWL_DEBUG_MAC80211(priv, "leave - queue >= AC_NUM %d\n", queue);
1163                return 0;
1164        }
1165
1166        q = AC_NUM - 1 - queue;
1167
1168        mutex_lock(&priv->mutex);
1169
1170        ctx->qos_data.def_qos_parm.ac[q].cw_min =
1171                cpu_to_le16(params->cw_min);
1172        ctx->qos_data.def_qos_parm.ac[q].cw_max =
1173                cpu_to_le16(params->cw_max);
1174        ctx->qos_data.def_qos_parm.ac[q].aifsn = params->aifs;
1175        ctx->qos_data.def_qos_parm.ac[q].edca_txop =
1176                        cpu_to_le16((params->txop * 32));
1177
1178        ctx->qos_data.def_qos_parm.ac[q].reserved1 = 0;
1179
1180        mutex_unlock(&priv->mutex);
1181
1182        IWL_DEBUG_MAC80211(priv, "leave\n");
1183        return 0;
1184}
1185
1186static int iwlagn_mac_tx_last_beacon(struct ieee80211_hw *hw)
1187{
1188        struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
1189
1190        return priv->ibss_manager == IWL_IBSS_MANAGER;
1191}
1192
1193static int iwl_set_mode(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
1194{
1195        iwl_connection_init_rx_config(priv, ctx);
1196
1197        iwlagn_set_rxon_chain(priv, ctx);
1198
1199        return iwlagn_commit_rxon(priv, ctx);
1200}
1201
1202static int iwl_setup_interface(struct iwl_priv *priv,
1203                               struct iwl_rxon_context *ctx)
1204{
1205        struct ieee80211_vif *vif = ctx->vif;
1206        int err;
1207
1208        lockdep_assert_held(&priv->mutex);
1209
1210        /*
1211         * This variable will be correct only when there's just
1212         * a single context, but all code using it is for hardware
1213         * that supports only one context.
1214         */
1215        priv->iw_mode = vif->type;
1216
1217        ctx->is_active = true;
1218
1219        err = iwl_set_mode(priv, ctx);
1220        if (err) {
1221                if (!ctx->always_active)
1222                        ctx->is_active = false;
1223                return err;
1224        }
1225
1226        if (cfg(priv)->bt_params && cfg(priv)->bt_params->advanced_bt_coexist &&
1227            vif->type == NL80211_IFTYPE_ADHOC) {
1228                /*
1229                 * pretend to have high BT traffic as long as we
1230                 * are operating in IBSS mode, as this will cause
1231                 * the rate scaling etc. to behave as intended.
1232                 */
1233                priv->bt_traffic_load = IWL_BT_COEX_TRAFFIC_LOAD_HIGH;
1234        }
1235
1236        return 0;
1237}
1238
1239static int iwlagn_mac_add_interface(struct ieee80211_hw *hw,
1240                             struct ieee80211_vif *vif)
1241{
1242        struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
1243        struct iwl_vif_priv *vif_priv = (void *)vif->drv_priv;
1244        struct iwl_rxon_context *tmp, *ctx = NULL;
1245        int err;
1246        enum nl80211_iftype viftype = ieee80211_vif_type_p2p(vif);
1247        bool reset = false;
1248
1249        IWL_DEBUG_MAC80211(priv, "enter: type %d, addr %pM\n",
1250                           viftype, vif->addr);
1251
1252        cancel_delayed_work_sync(&priv->hw_roc_disable_work);
1253
1254        mutex_lock(&priv->mutex);
1255
1256        iwlagn_disable_roc(priv);
1257
1258        if (!iwl_is_ready_rf(priv)) {
1259                IWL_WARN(priv, "Try to add interface when device not ready\n");
1260                err = -EINVAL;
1261                goto out;
1262        }
1263
1264        for_each_context(priv, tmp) {
1265                u32 possible_modes =
1266                        tmp->interface_modes | tmp->exclusive_interface_modes;
1267
1268                if (tmp->vif) {
1269                        /* On reset we need to add the same interface again */
1270                        if (tmp->vif == vif) {
1271                                reset = true;
1272                                ctx = tmp;
1273                                break;
1274                        }
1275
1276                        /* check if this busy context is exclusive */
1277                        if (tmp->exclusive_interface_modes &
1278                                                BIT(tmp->vif->type)) {
1279                                err = -EINVAL;
1280                                goto out;
1281                        }
1282                        continue;
1283                }
1284
1285                if (!(possible_modes & BIT(viftype)))
1286                        continue;
1287
1288                /* have maybe usable context w/o interface */
1289                ctx = tmp;
1290                break;
1291        }
1292
1293        if (!ctx) {
1294                err = -EOPNOTSUPP;
1295                goto out;
1296        }
1297
1298        vif_priv->ctx = ctx;
1299        ctx->vif = vif;
1300
1301        err = iwl_setup_interface(priv, ctx);
1302        if (!err || reset)
1303                goto out;
1304
1305        ctx->vif = NULL;
1306        priv->iw_mode = NL80211_IFTYPE_STATION;
1307 out:
1308        mutex_unlock(&priv->mutex);
1309
1310        IWL_DEBUG_MAC80211(priv, "leave\n");
1311        return err;
1312}
1313
1314static void iwl_teardown_interface(struct iwl_priv *priv,
1315                                   struct ieee80211_vif *vif,
1316                                   bool mode_change)
1317{
1318        struct iwl_rxon_context *ctx = iwl_rxon_ctx_from_vif(vif);
1319
1320        lockdep_assert_held(&priv->mutex);
1321
1322        if (priv->scan_vif == vif) {
1323                iwl_scan_cancel_timeout(priv, 200);
1324                iwl_force_scan_end(priv);
1325        }
1326
1327        if (!mode_change) {
1328                iwl_set_mode(priv, ctx);
1329                if (!ctx->always_active)
1330                        ctx->is_active = false;
1331        }
1332
1333        /*
1334         * When removing the IBSS interface, overwrite the
1335         * BT traffic load with the stored one from the last
1336         * notification, if any. If this is a device that
1337         * doesn't implement this, this has no effect since
1338         * both values are the same and zero.
1339         */
1340        if (vif->type == NL80211_IFTYPE_ADHOC)
1341                priv->bt_traffic_load = priv->last_bt_traffic_load;
1342}
1343
1344static void iwlagn_mac_remove_interface(struct ieee80211_hw *hw,
1345                              struct ieee80211_vif *vif)
1346{
1347        struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
1348        struct iwl_rxon_context *ctx = iwl_rxon_ctx_from_vif(vif);
1349
1350        IWL_DEBUG_MAC80211(priv, "enter\n");
1351
1352        mutex_lock(&priv->mutex);
1353
1354        if (WARN_ON(ctx->vif != vif)) {
1355                struct iwl_rxon_context *tmp;
1356                IWL_ERR(priv, "ctx->vif = %p, vif = %p\n", ctx->vif, vif);
1357                for_each_context(priv, tmp)
1358                        IWL_ERR(priv, "\tID = %d:\tctx = %p\tctx->vif = %p\n",
1359                                tmp->ctxid, tmp, tmp->vif);
1360        }
1361        ctx->vif = NULL;
1362
1363        iwl_teardown_interface(priv, vif, false);
1364
1365        mutex_unlock(&priv->mutex);
1366
1367        IWL_DEBUG_MAC80211(priv, "leave\n");
1368
1369}
1370
1371static int iwlagn_mac_change_interface(struct ieee80211_hw *hw,
1372                                struct ieee80211_vif *vif,
1373                                enum nl80211_iftype newtype, bool newp2p)
1374{
1375        struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
1376        struct iwl_rxon_context *ctx = iwl_rxon_ctx_from_vif(vif);
1377        struct iwl_rxon_context *bss_ctx = &priv->contexts[IWL_RXON_CTX_BSS];
1378        struct iwl_rxon_context *tmp;
1379        enum nl80211_iftype newviftype = newtype;
1380        u32 interface_modes;
1381        int err;
1382
1383        IWL_DEBUG_MAC80211(priv, "enter\n");
1384
1385        newtype = ieee80211_iftype_p2p(newtype, newp2p);
1386
1387        mutex_lock(&priv->mutex);
1388
1389        if (!ctx->vif || !iwl_is_ready_rf(priv)) {
1390                /*
1391                 * Huh? But wait ... this can maybe happen when
1392                 * we're in the middle of a firmware restart!
1393                 */
1394                err = -EBUSY;
1395                goto out;
1396        }
1397
1398        interface_modes = ctx->interface_modes | ctx->exclusive_interface_modes;
1399
1400        if (!(interface_modes & BIT(newtype))) {
1401                err = -EBUSY;
1402                goto out;
1403        }
1404
1405        /*
1406         * Refuse a change that should be done by moving from the PAN
1407         * context to the BSS context instead, if the BSS context is
1408         * available and can support the new interface type.
1409         */
1410        if (ctx->ctxid == IWL_RXON_CTX_PAN && !bss_ctx->vif &&
1411            (bss_ctx->interface_modes & BIT(newtype) ||
1412             bss_ctx->exclusive_interface_modes & BIT(newtype))) {
1413                BUILD_BUG_ON(NUM_IWL_RXON_CTX != 2);
1414                err = -EBUSY;
1415                goto out;
1416        }
1417
1418        if (ctx->exclusive_interface_modes & BIT(newtype)) {
1419                for_each_context(priv, tmp) {
1420                        if (ctx == tmp)
1421                                continue;
1422
1423                        if (!tmp->vif)
1424                                continue;
1425
1426                        /*
1427                         * The current mode switch would be exclusive, but
1428                         * another context is active ... refuse the switch.
1429                         */
1430                        err = -EBUSY;
1431                        goto out;
1432                }
1433        }
1434
1435        /* success */
1436        iwl_teardown_interface(priv, vif, true);
1437        vif->type = newviftype;
1438        vif->p2p = newp2p;
1439        err = iwl_setup_interface(priv, ctx);
1440        WARN_ON(err);
1441        /*
1442         * We've switched internally, but submitting to the
1443         * device may have failed for some reason. Mask this
1444         * error, because otherwise mac80211 will not switch
1445         * (and set the interface type back) and we'll be
1446         * out of sync with it.
1447         */
1448        err = 0;
1449
1450 out:
1451        mutex_unlock(&priv->mutex);
1452        IWL_DEBUG_MAC80211(priv, "leave\n");
1453
1454        return err;
1455}
1456
1457static int iwlagn_mac_hw_scan(struct ieee80211_hw *hw,
1458                    struct ieee80211_vif *vif,
1459                    struct cfg80211_scan_request *req)
1460{
1461        struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
1462        int ret;
1463
1464        IWL_DEBUG_MAC80211(priv, "enter\n");
1465
1466        if (req->n_channels == 0)
1467                return -EINVAL;
1468
1469        mutex_lock(&priv->mutex);
1470
1471        /*
1472         * If an internal scan is in progress, just set
1473         * up the scan_request as per above.
1474         */
1475        if (priv->scan_type != IWL_SCAN_NORMAL) {
1476                IWL_DEBUG_SCAN(priv,
1477                               "SCAN request during internal scan - defer\n");
1478                priv->scan_request = req;
1479                priv->scan_vif = vif;
1480                ret = 0;
1481        } else {
1482                priv->scan_request = req;
1483                priv->scan_vif = vif;
1484                /*
1485                 * mac80211 will only ask for one band at a time
1486                 * so using channels[0] here is ok
1487                 */
1488                ret = iwl_scan_initiate(priv, vif, IWL_SCAN_NORMAL,
1489                                        req->channels[0]->band);
1490                if (ret) {
1491                        priv->scan_request = NULL;
1492                        priv->scan_vif = NULL;
1493                }
1494        }
1495
1496        IWL_DEBUG_MAC80211(priv, "leave\n");
1497
1498        mutex_unlock(&priv->mutex);
1499
1500        return ret;
1501}
1502
1503static void iwl_sta_modify_ps_wake(struct iwl_priv *priv, int sta_id)
1504{
1505        struct iwl_addsta_cmd cmd = {
1506                .mode = STA_CONTROL_MODIFY_MSK,
1507                .station_flags_msk = STA_FLG_PWR_SAVE_MSK,
1508                .sta.sta_id = sta_id,
1509        };
1510
1511        iwl_send_add_sta(priv, &cmd, CMD_ASYNC);
1512}
1513
1514static void iwlagn_mac_sta_notify(struct ieee80211_hw *hw,
1515                           struct ieee80211_vif *vif,
1516                           enum sta_notify_cmd cmd,
1517                           struct ieee80211_sta *sta)
1518{
1519        struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
1520        struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
1521        int sta_id;
1522
1523        IWL_DEBUG_MAC80211(priv, "enter\n");
1524
1525        switch (cmd) {
1526        case STA_NOTIFY_SLEEP:
1527                WARN_ON(!sta_priv->client);
1528                sta_priv->asleep = true;
1529                if (atomic_read(&sta_priv->pending_frames) > 0)
1530                        ieee80211_sta_block_awake(hw, sta, true);
1531                break;
1532        case STA_NOTIFY_AWAKE:
1533                WARN_ON(!sta_priv->client);
1534                if (!sta_priv->asleep)
1535                        break;
1536                sta_priv->asleep = false;
1537                sta_id = iwl_sta_id(sta);
1538                if (sta_id != IWL_INVALID_STATION)
1539                        iwl_sta_modify_ps_wake(priv, sta_id);
1540                break;
1541        default:
1542                break;
1543        }
1544        IWL_DEBUG_MAC80211(priv, "leave\n");
1545}
1546
1547struct ieee80211_ops iwlagn_hw_ops = {
1548        .tx = iwlagn_mac_tx,
1549        .start = iwlagn_mac_start,
1550        .stop = iwlagn_mac_stop,
1551#ifdef CONFIG_PM_SLEEP
1552        .suspend = iwlagn_mac_suspend,
1553        .resume = iwlagn_mac_resume,
1554#endif
1555        .add_interface = iwlagn_mac_add_interface,
1556        .remove_interface = iwlagn_mac_remove_interface,
1557        .change_interface = iwlagn_mac_change_interface,
1558        .config = iwlagn_mac_config,
1559        .configure_filter = iwlagn_configure_filter,
1560        .set_key = iwlagn_mac_set_key,
1561        .update_tkip_key = iwlagn_mac_update_tkip_key,
1562        .set_rekey_data = iwlagn_mac_set_rekey_data,
1563        .conf_tx = iwlagn_mac_conf_tx,
1564        .bss_info_changed = iwlagn_bss_info_changed,
1565        .ampdu_action = iwlagn_mac_ampdu_action,
1566        .hw_scan = iwlagn_mac_hw_scan,
1567        .sta_notify = iwlagn_mac_sta_notify,
1568        .sta_state = iwlagn_mac_sta_state,
1569        .channel_switch = iwlagn_mac_channel_switch,
1570        .flush = iwlagn_mac_flush,
1571        .tx_last_beacon = iwlagn_mac_tx_last_beacon,
1572        .remain_on_channel = iwlagn_mac_remain_on_channel,
1573        .cancel_remain_on_channel = iwlagn_mac_cancel_remain_on_channel,
1574        .rssi_callback = iwlagn_mac_rssi_callback,
1575        CFG80211_TESTMODE_CMD(iwlagn_mac_testmode_cmd)
1576        CFG80211_TESTMODE_DUMP(iwlagn_mac_testmode_dump)
1577        .set_tim = iwlagn_mac_set_tim,
1578};
1579
1580/* This function both allocates and initializes hw and priv. */
1581struct ieee80211_hw *iwl_alloc_all(void)
1582{
1583        struct iwl_priv *priv;
1584        struct iwl_op_mode *op_mode;
1585        /* mac80211 allocates memory for this device instance, including
1586         *   space for this driver's private structure */
1587        struct ieee80211_hw *hw;
1588
1589        hw = ieee80211_alloc_hw(sizeof(struct iwl_priv) +
1590                                sizeof(struct iwl_op_mode), &iwlagn_hw_ops);
1591        if (!hw)
1592                goto out;
1593
1594        op_mode = hw->priv;
1595        priv = IWL_OP_MODE_GET_DVM(op_mode);
1596        priv->hw = hw;
1597
1598out:
1599        return hw;
1600}
1601