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