linux/drivers/net/wireless/iwlwifi/iwl-sta.c
<<
>>
Prefs
   1/******************************************************************************
   2 *
   3 * Copyright(c) 2003 - 2010 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
  30#include <net/mac80211.h>
  31#include <linux/etherdevice.h>
  32#include <linux/sched.h>
  33#include <linux/lockdep.h>
  34
  35#include "iwl-dev.h"
  36#include "iwl-core.h"
  37#include "iwl-sta.h"
  38
  39/* priv->sta_lock must be held */
  40static void iwl_sta_ucode_activate(struct iwl_priv *priv, u8 sta_id)
  41{
  42
  43        if (!(priv->stations[sta_id].used & IWL_STA_DRIVER_ACTIVE))
  44                IWL_ERR(priv, "ACTIVATE a non DRIVER active station id %u addr %pM\n",
  45                        sta_id, priv->stations[sta_id].sta.sta.addr);
  46
  47        if (priv->stations[sta_id].used & IWL_STA_UCODE_ACTIVE) {
  48                IWL_DEBUG_ASSOC(priv,
  49                                "STA id %u addr %pM already present in uCode (according to driver)\n",
  50                                sta_id, priv->stations[sta_id].sta.sta.addr);
  51        } else {
  52                priv->stations[sta_id].used |= IWL_STA_UCODE_ACTIVE;
  53                IWL_DEBUG_ASSOC(priv, "Added STA id %u addr %pM to uCode\n",
  54                                sta_id, priv->stations[sta_id].sta.sta.addr);
  55        }
  56}
  57
  58static int iwl_process_add_sta_resp(struct iwl_priv *priv,
  59                                    struct iwl_addsta_cmd *addsta,
  60                                    struct iwl_rx_packet *pkt,
  61                                    bool sync)
  62{
  63        u8 sta_id = addsta->sta.sta_id;
  64        unsigned long flags;
  65        int ret = -EIO;
  66
  67        if (pkt->hdr.flags & IWL_CMD_FAILED_MSK) {
  68                IWL_ERR(priv, "Bad return from REPLY_ADD_STA (0x%08X)\n",
  69                        pkt->hdr.flags);
  70                return ret;
  71        }
  72
  73        IWL_DEBUG_INFO(priv, "Processing response for adding station %u\n",
  74                       sta_id);
  75
  76        spin_lock_irqsave(&priv->sta_lock, flags);
  77
  78        switch (pkt->u.add_sta.status) {
  79        case ADD_STA_SUCCESS_MSK:
  80                IWL_DEBUG_INFO(priv, "REPLY_ADD_STA PASSED\n");
  81                iwl_sta_ucode_activate(priv, sta_id);
  82                ret = 0;
  83                break;
  84        case ADD_STA_NO_ROOM_IN_TABLE:
  85                IWL_ERR(priv, "Adding station %d failed, no room in table.\n",
  86                        sta_id);
  87                break;
  88        case ADD_STA_NO_BLOCK_ACK_RESOURCE:
  89                IWL_ERR(priv, "Adding station %d failed, no block ack resource.\n",
  90                        sta_id);
  91                break;
  92        case ADD_STA_MODIFY_NON_EXIST_STA:
  93                IWL_ERR(priv, "Attempting to modify non-existing station %d\n",
  94                        sta_id);
  95                break;
  96        default:
  97                IWL_DEBUG_ASSOC(priv, "Received REPLY_ADD_STA:(0x%08X)\n",
  98                                pkt->u.add_sta.status);
  99                break;
 100        }
 101
 102        IWL_DEBUG_INFO(priv, "%s station id %u addr %pM\n",
 103                       priv->stations[sta_id].sta.mode ==
 104                       STA_CONTROL_MODIFY_MSK ?  "Modified" : "Added",
 105                       sta_id, priv->stations[sta_id].sta.sta.addr);
 106
 107        /*
 108         * XXX: The MAC address in the command buffer is often changed from
 109         * the original sent to the device. That is, the MAC address
 110         * written to the command buffer often is not the same MAC address
 111         * read from the command buffer when the command returns. This
 112         * issue has not yet been resolved and this debugging is left to
 113         * observe the problem.
 114         */
 115        IWL_DEBUG_INFO(priv, "%s station according to cmd buffer %pM\n",
 116                       priv->stations[sta_id].sta.mode ==
 117                       STA_CONTROL_MODIFY_MSK ? "Modified" : "Added",
 118                       addsta->sta.addr);
 119        spin_unlock_irqrestore(&priv->sta_lock, flags);
 120
 121        return ret;
 122}
 123
 124static void iwl_add_sta_callback(struct iwl_priv *priv,
 125                                 struct iwl_device_cmd *cmd,
 126                                 struct iwl_rx_packet *pkt)
 127{
 128        struct iwl_addsta_cmd *addsta =
 129                (struct iwl_addsta_cmd *)cmd->cmd.payload;
 130
 131        iwl_process_add_sta_resp(priv, addsta, pkt, false);
 132
 133}
 134
 135int iwl_send_add_sta(struct iwl_priv *priv,
 136                     struct iwl_addsta_cmd *sta, u8 flags)
 137{
 138        struct iwl_rx_packet *pkt = NULL;
 139        int ret = 0;
 140        u8 data[sizeof(*sta)];
 141        struct iwl_host_cmd cmd = {
 142                .id = REPLY_ADD_STA,
 143                .flags = flags,
 144                .data = data,
 145        };
 146        u8 sta_id __maybe_unused = sta->sta.sta_id;
 147
 148        IWL_DEBUG_INFO(priv, "Adding sta %u (%pM) %ssynchronously\n",
 149                       sta_id, sta->sta.addr, flags & CMD_ASYNC ?  "a" : "");
 150
 151        if (flags & CMD_ASYNC)
 152                cmd.callback = iwl_add_sta_callback;
 153        else {
 154                cmd.flags |= CMD_WANT_SKB;
 155                might_sleep();
 156        }
 157
 158        cmd.len = priv->cfg->ops->utils->build_addsta_hcmd(sta, data);
 159        ret = iwl_send_cmd(priv, &cmd);
 160
 161        if (ret || (flags & CMD_ASYNC))
 162                return ret;
 163
 164        if (ret == 0) {
 165                pkt = (struct iwl_rx_packet *)cmd.reply_page;
 166                ret = iwl_process_add_sta_resp(priv, sta, pkt, true);
 167        }
 168        iwl_free_pages(priv, cmd.reply_page);
 169
 170        return ret;
 171}
 172EXPORT_SYMBOL(iwl_send_add_sta);
 173
 174static void iwl_set_ht_add_station(struct iwl_priv *priv, u8 index,
 175                                   struct ieee80211_sta *sta,
 176                                   struct iwl_rxon_context *ctx)
 177{
 178        struct ieee80211_sta_ht_cap *sta_ht_inf = &sta->ht_cap;
 179        __le32 sta_flags;
 180        u8 mimo_ps_mode;
 181
 182        if (!sta || !sta_ht_inf->ht_supported)
 183                goto done;
 184
 185        mimo_ps_mode = (sta_ht_inf->cap & IEEE80211_HT_CAP_SM_PS) >> 2;
 186        IWL_DEBUG_ASSOC(priv, "spatial multiplexing power save mode: %s\n",
 187                        (mimo_ps_mode == WLAN_HT_CAP_SM_PS_STATIC) ?
 188                        "static" :
 189                        (mimo_ps_mode == WLAN_HT_CAP_SM_PS_DYNAMIC) ?
 190                        "dynamic" : "disabled");
 191
 192        sta_flags = priv->stations[index].sta.station_flags;
 193
 194        sta_flags &= ~(STA_FLG_RTS_MIMO_PROT_MSK | STA_FLG_MIMO_DIS_MSK);
 195
 196        switch (mimo_ps_mode) {
 197        case WLAN_HT_CAP_SM_PS_STATIC:
 198                sta_flags |= STA_FLG_MIMO_DIS_MSK;
 199                break;
 200        case WLAN_HT_CAP_SM_PS_DYNAMIC:
 201                sta_flags |= STA_FLG_RTS_MIMO_PROT_MSK;
 202                break;
 203        case WLAN_HT_CAP_SM_PS_DISABLED:
 204                break;
 205        default:
 206                IWL_WARN(priv, "Invalid MIMO PS mode %d\n", mimo_ps_mode);
 207                break;
 208        }
 209
 210        sta_flags |= cpu_to_le32(
 211              (u32)sta_ht_inf->ampdu_factor << STA_FLG_MAX_AGG_SIZE_POS);
 212
 213        sta_flags |= cpu_to_le32(
 214              (u32)sta_ht_inf->ampdu_density << STA_FLG_AGG_MPDU_DENSITY_POS);
 215
 216        if (iwl_is_ht40_tx_allowed(priv, ctx, &sta->ht_cap))
 217                sta_flags |= STA_FLG_HT40_EN_MSK;
 218        else
 219                sta_flags &= ~STA_FLG_HT40_EN_MSK;
 220
 221        priv->stations[index].sta.station_flags = sta_flags;
 222 done:
 223        return;
 224}
 225
 226/**
 227 * iwl_prep_station - Prepare station information for addition
 228 *
 229 * should be called with sta_lock held
 230 */
 231u8 iwl_prep_station(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
 232                    const u8 *addr, bool is_ap, struct ieee80211_sta *sta)
 233{
 234        struct iwl_station_entry *station;
 235        int i;
 236        u8 sta_id = IWL_INVALID_STATION;
 237        u16 rate;
 238
 239        if (is_ap)
 240                sta_id = ctx->ap_sta_id;
 241        else if (is_broadcast_ether_addr(addr))
 242                sta_id = ctx->bcast_sta_id;
 243        else
 244                for (i = IWL_STA_ID; i < priv->hw_params.max_stations; i++) {
 245                        if (!compare_ether_addr(priv->stations[i].sta.sta.addr,
 246                                                addr)) {
 247                                sta_id = i;
 248                                break;
 249                        }
 250
 251                        if (!priv->stations[i].used &&
 252                            sta_id == IWL_INVALID_STATION)
 253                                sta_id = i;
 254                }
 255
 256        /*
 257         * These two conditions have the same outcome, but keep them
 258         * separate
 259         */
 260        if (unlikely(sta_id == IWL_INVALID_STATION))
 261                return sta_id;
 262
 263        /*
 264         * uCode is not able to deal with multiple requests to add a
 265         * station. Keep track if one is in progress so that we do not send
 266         * another.
 267         */
 268        if (priv->stations[sta_id].used & IWL_STA_UCODE_INPROGRESS) {
 269                IWL_DEBUG_INFO(priv, "STA %d already in process of being added.\n",
 270                                sta_id);
 271                return sta_id;
 272        }
 273
 274        if ((priv->stations[sta_id].used & IWL_STA_DRIVER_ACTIVE) &&
 275            (priv->stations[sta_id].used & IWL_STA_UCODE_ACTIVE) &&
 276            !compare_ether_addr(priv->stations[sta_id].sta.sta.addr, addr)) {
 277                IWL_DEBUG_ASSOC(priv, "STA %d (%pM) already added, not adding again.\n",
 278                                sta_id, addr);
 279                return sta_id;
 280        }
 281
 282        station = &priv->stations[sta_id];
 283        station->used = IWL_STA_DRIVER_ACTIVE;
 284        IWL_DEBUG_ASSOC(priv, "Add STA to driver ID %d: %pM\n",
 285                        sta_id, addr);
 286        priv->num_stations++;
 287
 288        /* Set up the REPLY_ADD_STA command to send to device */
 289        memset(&station->sta, 0, sizeof(struct iwl_addsta_cmd));
 290        memcpy(station->sta.sta.addr, addr, ETH_ALEN);
 291        station->sta.mode = 0;
 292        station->sta.sta.sta_id = sta_id;
 293        station->sta.station_flags = ctx->station_flags;
 294        station->ctxid = ctx->ctxid;
 295
 296        if (sta) {
 297                struct iwl_station_priv_common *sta_priv;
 298
 299                sta_priv = (void *)sta->drv_priv;
 300                sta_priv->ctx = ctx;
 301        }
 302
 303        /*
 304         * OK to call unconditionally, since local stations (IBSS BSSID
 305         * STA and broadcast STA) pass in a NULL sta, and mac80211
 306         * doesn't allow HT IBSS.
 307         */
 308        iwl_set_ht_add_station(priv, sta_id, sta, ctx);
 309
 310        /* 3945 only */
 311        rate = (priv->band == IEEE80211_BAND_5GHZ) ?
 312                IWL_RATE_6M_PLCP : IWL_RATE_1M_PLCP;
 313        /* Turn on both antennas for the station... */
 314        station->sta.rate_n_flags = cpu_to_le16(rate | RATE_MCS_ANT_AB_MSK);
 315
 316        return sta_id;
 317
 318}
 319EXPORT_SYMBOL_GPL(iwl_prep_station);
 320
 321#define STA_WAIT_TIMEOUT (HZ/2)
 322
 323/**
 324 * iwl_add_station_common -
 325 */
 326int iwl_add_station_common(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
 327                           const u8 *addr, bool is_ap,
 328                           struct ieee80211_sta *sta, u8 *sta_id_r)
 329{
 330        unsigned long flags_spin;
 331        int ret = 0;
 332        u8 sta_id;
 333        struct iwl_addsta_cmd sta_cmd;
 334
 335        *sta_id_r = 0;
 336        spin_lock_irqsave(&priv->sta_lock, flags_spin);
 337        sta_id = iwl_prep_station(priv, ctx, addr, is_ap, sta);
 338        if (sta_id == IWL_INVALID_STATION) {
 339                IWL_ERR(priv, "Unable to prepare station %pM for addition\n",
 340                        addr);
 341                spin_unlock_irqrestore(&priv->sta_lock, flags_spin);
 342                return -EINVAL;
 343        }
 344
 345        /*
 346         * uCode is not able to deal with multiple requests to add a
 347         * station. Keep track if one is in progress so that we do not send
 348         * another.
 349         */
 350        if (priv->stations[sta_id].used & IWL_STA_UCODE_INPROGRESS) {
 351                IWL_DEBUG_INFO(priv, "STA %d already in process of being added.\n",
 352                               sta_id);
 353                spin_unlock_irqrestore(&priv->sta_lock, flags_spin);
 354                return -EEXIST;
 355        }
 356
 357        if ((priv->stations[sta_id].used & IWL_STA_DRIVER_ACTIVE) &&
 358            (priv->stations[sta_id].used & IWL_STA_UCODE_ACTIVE)) {
 359                IWL_DEBUG_ASSOC(priv, "STA %d (%pM) already added, not adding again.\n",
 360                                sta_id, addr);
 361                spin_unlock_irqrestore(&priv->sta_lock, flags_spin);
 362                return -EEXIST;
 363        }
 364
 365        priv->stations[sta_id].used |= IWL_STA_UCODE_INPROGRESS;
 366        memcpy(&sta_cmd, &priv->stations[sta_id].sta, sizeof(struct iwl_addsta_cmd));
 367        spin_unlock_irqrestore(&priv->sta_lock, flags_spin);
 368
 369        /* Add station to device's station table */
 370        ret = iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC);
 371        if (ret) {
 372                spin_lock_irqsave(&priv->sta_lock, flags_spin);
 373                IWL_ERR(priv, "Adding station %pM failed.\n",
 374                        priv->stations[sta_id].sta.sta.addr);
 375                priv->stations[sta_id].used &= ~IWL_STA_DRIVER_ACTIVE;
 376                priv->stations[sta_id].used &= ~IWL_STA_UCODE_INPROGRESS;
 377                spin_unlock_irqrestore(&priv->sta_lock, flags_spin);
 378        }
 379        *sta_id_r = sta_id;
 380        return ret;
 381}
 382EXPORT_SYMBOL(iwl_add_station_common);
 383
 384/**
 385 * iwl_sta_ucode_deactivate - deactivate ucode status for a station
 386 *
 387 * priv->sta_lock must be held
 388 */
 389static void iwl_sta_ucode_deactivate(struct iwl_priv *priv, u8 sta_id)
 390{
 391        /* Ucode must be active and driver must be non active */
 392        if ((priv->stations[sta_id].used &
 393             (IWL_STA_UCODE_ACTIVE | IWL_STA_DRIVER_ACTIVE)) != IWL_STA_UCODE_ACTIVE)
 394                IWL_ERR(priv, "removed non active STA %u\n", sta_id);
 395
 396        priv->stations[sta_id].used &= ~IWL_STA_UCODE_ACTIVE;
 397
 398        memset(&priv->stations[sta_id], 0, sizeof(struct iwl_station_entry));
 399        IWL_DEBUG_ASSOC(priv, "Removed STA %u\n", sta_id);
 400}
 401
 402static int iwl_send_remove_station(struct iwl_priv *priv,
 403                                   const u8 *addr, int sta_id,
 404                                   bool temporary)
 405{
 406        struct iwl_rx_packet *pkt;
 407        int ret;
 408
 409        unsigned long flags_spin;
 410        struct iwl_rem_sta_cmd rm_sta_cmd;
 411
 412        struct iwl_host_cmd cmd = {
 413                .id = REPLY_REMOVE_STA,
 414                .len = sizeof(struct iwl_rem_sta_cmd),
 415                .flags = CMD_SYNC,
 416                .data = &rm_sta_cmd,
 417        };
 418
 419        memset(&rm_sta_cmd, 0, sizeof(rm_sta_cmd));
 420        rm_sta_cmd.num_sta = 1;
 421        memcpy(&rm_sta_cmd.addr, addr, ETH_ALEN);
 422
 423        cmd.flags |= CMD_WANT_SKB;
 424
 425        ret = iwl_send_cmd(priv, &cmd);
 426
 427        if (ret)
 428                return ret;
 429
 430        pkt = (struct iwl_rx_packet *)cmd.reply_page;
 431        if (pkt->hdr.flags & IWL_CMD_FAILED_MSK) {
 432                IWL_ERR(priv, "Bad return from REPLY_REMOVE_STA (0x%08X)\n",
 433                          pkt->hdr.flags);
 434                ret = -EIO;
 435        }
 436
 437        if (!ret) {
 438                switch (pkt->u.rem_sta.status) {
 439                case REM_STA_SUCCESS_MSK:
 440                        if (!temporary) {
 441                                spin_lock_irqsave(&priv->sta_lock, flags_spin);
 442                                iwl_sta_ucode_deactivate(priv, sta_id);
 443                                spin_unlock_irqrestore(&priv->sta_lock, flags_spin);
 444                        }
 445                        IWL_DEBUG_ASSOC(priv, "REPLY_REMOVE_STA PASSED\n");
 446                        break;
 447                default:
 448                        ret = -EIO;
 449                        IWL_ERR(priv, "REPLY_REMOVE_STA failed\n");
 450                        break;
 451                }
 452        }
 453        iwl_free_pages(priv, cmd.reply_page);
 454
 455        return ret;
 456}
 457
 458/**
 459 * iwl_remove_station - Remove driver's knowledge of station.
 460 */
 461int iwl_remove_station(struct iwl_priv *priv, const u8 sta_id,
 462                       const u8 *addr)
 463{
 464        unsigned long flags;
 465
 466        if (!iwl_is_ready(priv)) {
 467                IWL_DEBUG_INFO(priv,
 468                        "Unable to remove station %pM, device not ready.\n",
 469                        addr);
 470                /*
 471                 * It is typical for stations to be removed when we are
 472                 * going down. Return success since device will be down
 473                 * soon anyway
 474                 */
 475                return 0;
 476        }
 477
 478        IWL_DEBUG_ASSOC(priv, "Removing STA from driver:%d  %pM\n",
 479                        sta_id, addr);
 480
 481        if (WARN_ON(sta_id == IWL_INVALID_STATION))
 482                return -EINVAL;
 483
 484        spin_lock_irqsave(&priv->sta_lock, flags);
 485
 486        if (!(priv->stations[sta_id].used & IWL_STA_DRIVER_ACTIVE)) {
 487                IWL_DEBUG_INFO(priv, "Removing %pM but non DRIVER active\n",
 488                                addr);
 489                goto out_err;
 490        }
 491
 492        if (!(priv->stations[sta_id].used & IWL_STA_UCODE_ACTIVE)) {
 493                IWL_DEBUG_INFO(priv, "Removing %pM but non UCODE active\n",
 494                                addr);
 495                goto out_err;
 496        }
 497
 498        if (priv->stations[sta_id].used & IWL_STA_LOCAL) {
 499                kfree(priv->stations[sta_id].lq);
 500                priv->stations[sta_id].lq = NULL;
 501        }
 502
 503        priv->stations[sta_id].used &= ~IWL_STA_DRIVER_ACTIVE;
 504
 505        priv->num_stations--;
 506
 507        BUG_ON(priv->num_stations < 0);
 508
 509        spin_unlock_irqrestore(&priv->sta_lock, flags);
 510
 511        return iwl_send_remove_station(priv, addr, sta_id, false);
 512out_err:
 513        spin_unlock_irqrestore(&priv->sta_lock, flags);
 514        return -EINVAL;
 515}
 516EXPORT_SYMBOL_GPL(iwl_remove_station);
 517
 518/**
 519 * iwl_clear_ucode_stations - clear ucode station table bits
 520 *
 521 * This function clears all the bits in the driver indicating
 522 * which stations are active in the ucode. Call when something
 523 * other than explicit station management would cause this in
 524 * the ucode, e.g. unassociated RXON.
 525 */
 526void iwl_clear_ucode_stations(struct iwl_priv *priv,
 527                              struct iwl_rxon_context *ctx)
 528{
 529        int i;
 530        unsigned long flags_spin;
 531        bool cleared = false;
 532
 533        IWL_DEBUG_INFO(priv, "Clearing ucode stations in driver\n");
 534
 535        spin_lock_irqsave(&priv->sta_lock, flags_spin);
 536        for (i = 0; i < priv->hw_params.max_stations; i++) {
 537                if (ctx && ctx->ctxid != priv->stations[i].ctxid)
 538                        continue;
 539
 540                if (priv->stations[i].used & IWL_STA_UCODE_ACTIVE) {
 541                        IWL_DEBUG_INFO(priv, "Clearing ucode active for station %d\n", i);
 542                        priv->stations[i].used &= ~IWL_STA_UCODE_ACTIVE;
 543                        cleared = true;
 544                }
 545        }
 546        spin_unlock_irqrestore(&priv->sta_lock, flags_spin);
 547
 548        if (!cleared)
 549                IWL_DEBUG_INFO(priv, "No active stations found to be cleared\n");
 550}
 551EXPORT_SYMBOL(iwl_clear_ucode_stations);
 552
 553/**
 554 * iwl_restore_stations() - Restore driver known stations to device
 555 *
 556 * All stations considered active by driver, but not present in ucode, is
 557 * restored.
 558 *
 559 * Function sleeps.
 560 */
 561void iwl_restore_stations(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
 562{
 563        struct iwl_addsta_cmd sta_cmd;
 564        struct iwl_link_quality_cmd lq;
 565        unsigned long flags_spin;
 566        int i;
 567        bool found = false;
 568        int ret;
 569        bool send_lq;
 570
 571        if (!iwl_is_ready(priv)) {
 572                IWL_DEBUG_INFO(priv, "Not ready yet, not restoring any stations.\n");
 573                return;
 574        }
 575
 576        IWL_DEBUG_ASSOC(priv, "Restoring all known stations ... start.\n");
 577        spin_lock_irqsave(&priv->sta_lock, flags_spin);
 578        for (i = 0; i < priv->hw_params.max_stations; i++) {
 579                if (ctx->ctxid != priv->stations[i].ctxid)
 580                        continue;
 581                if ((priv->stations[i].used & IWL_STA_DRIVER_ACTIVE) &&
 582                            !(priv->stations[i].used & IWL_STA_UCODE_ACTIVE)) {
 583                        IWL_DEBUG_ASSOC(priv, "Restoring sta %pM\n",
 584                                        priv->stations[i].sta.sta.addr);
 585                        priv->stations[i].sta.mode = 0;
 586                        priv->stations[i].used |= IWL_STA_UCODE_INPROGRESS;
 587                        found = true;
 588                }
 589        }
 590
 591        for (i = 0; i < priv->hw_params.max_stations; i++) {
 592                if ((priv->stations[i].used & IWL_STA_UCODE_INPROGRESS)) {
 593                        memcpy(&sta_cmd, &priv->stations[i].sta,
 594                               sizeof(struct iwl_addsta_cmd));
 595                        send_lq = false;
 596                        if (priv->stations[i].lq) {
 597                                memcpy(&lq, priv->stations[i].lq,
 598                                       sizeof(struct iwl_link_quality_cmd));
 599                                send_lq = true;
 600                        }
 601                        spin_unlock_irqrestore(&priv->sta_lock, flags_spin);
 602                        ret = iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC);
 603                        if (ret) {
 604                                spin_lock_irqsave(&priv->sta_lock, flags_spin);
 605                                IWL_ERR(priv, "Adding station %pM failed.\n",
 606                                        priv->stations[i].sta.sta.addr);
 607                                priv->stations[i].used &= ~IWL_STA_DRIVER_ACTIVE;
 608                                priv->stations[i].used &= ~IWL_STA_UCODE_INPROGRESS;
 609                                spin_unlock_irqrestore(&priv->sta_lock, flags_spin);
 610                        }
 611                        /*
 612                         * Rate scaling has already been initialized, send
 613                         * current LQ command
 614                         */
 615                        if (send_lq)
 616                                iwl_send_lq_cmd(priv, ctx, &lq, CMD_SYNC, true);
 617                        spin_lock_irqsave(&priv->sta_lock, flags_spin);
 618                        priv->stations[i].used &= ~IWL_STA_UCODE_INPROGRESS;
 619                }
 620        }
 621
 622        spin_unlock_irqrestore(&priv->sta_lock, flags_spin);
 623        if (!found)
 624                IWL_DEBUG_INFO(priv, "Restoring all known stations .... no stations to be restored.\n");
 625        else
 626                IWL_DEBUG_INFO(priv, "Restoring all known stations .... complete.\n");
 627}
 628EXPORT_SYMBOL(iwl_restore_stations);
 629
 630void iwl_reprogram_ap_sta(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
 631{
 632        unsigned long flags;
 633        int sta_id = ctx->ap_sta_id;
 634        int ret;
 635        struct iwl_addsta_cmd sta_cmd;
 636        struct iwl_link_quality_cmd lq;
 637        bool active;
 638
 639        spin_lock_irqsave(&priv->sta_lock, flags);
 640        if (!(priv->stations[sta_id].used & IWL_STA_DRIVER_ACTIVE)) {
 641                spin_unlock_irqrestore(&priv->sta_lock, flags);
 642                return;
 643        }
 644
 645        memcpy(&sta_cmd, &priv->stations[sta_id].sta, sizeof(sta_cmd));
 646        sta_cmd.mode = 0;
 647        memcpy(&lq, priv->stations[sta_id].lq, sizeof(lq));
 648
 649        active = priv->stations[sta_id].used & IWL_STA_UCODE_ACTIVE;
 650        priv->stations[sta_id].used &= ~IWL_STA_DRIVER_ACTIVE;
 651        spin_unlock_irqrestore(&priv->sta_lock, flags);
 652
 653        if (active) {
 654                ret = iwl_send_remove_station(
 655                        priv, priv->stations[sta_id].sta.sta.addr,
 656                        sta_id, true);
 657                if (ret)
 658                        IWL_ERR(priv, "failed to remove STA %pM (%d)\n",
 659                                priv->stations[sta_id].sta.sta.addr, ret);
 660        }
 661        spin_lock_irqsave(&priv->sta_lock, flags);
 662        priv->stations[sta_id].used |= IWL_STA_DRIVER_ACTIVE;
 663        spin_unlock_irqrestore(&priv->sta_lock, flags);
 664
 665        ret = iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC);
 666        if (ret)
 667                IWL_ERR(priv, "failed to re-add STA %pM (%d)\n",
 668                        priv->stations[sta_id].sta.sta.addr, ret);
 669        iwl_send_lq_cmd(priv, ctx, &lq, CMD_SYNC, true);
 670}
 671EXPORT_SYMBOL(iwl_reprogram_ap_sta);
 672
 673int iwl_get_free_ucode_key_index(struct iwl_priv *priv)
 674{
 675        int i;
 676
 677        for (i = 0; i < priv->sta_key_max_num; i++)
 678                if (!test_and_set_bit(i, &priv->ucode_key_table))
 679                        return i;
 680
 681        return WEP_INVALID_OFFSET;
 682}
 683EXPORT_SYMBOL(iwl_get_free_ucode_key_index);
 684
 685void iwl_dealloc_bcast_stations(struct iwl_priv *priv)
 686{
 687        unsigned long flags;
 688        int i;
 689
 690        spin_lock_irqsave(&priv->sta_lock, flags);
 691        for (i = 0; i < priv->hw_params.max_stations; i++) {
 692                if (!(priv->stations[i].used & IWL_STA_BCAST))
 693                        continue;
 694
 695                priv->stations[i].used &= ~IWL_STA_UCODE_ACTIVE;
 696                priv->num_stations--;
 697                BUG_ON(priv->num_stations < 0);
 698                kfree(priv->stations[i].lq);
 699                priv->stations[i].lq = NULL;
 700        }
 701        spin_unlock_irqrestore(&priv->sta_lock, flags);
 702}
 703EXPORT_SYMBOL_GPL(iwl_dealloc_bcast_stations);
 704
 705#ifdef CONFIG_IWLWIFI_DEBUG
 706static void iwl_dump_lq_cmd(struct iwl_priv *priv,
 707                           struct iwl_link_quality_cmd *lq)
 708{
 709        int i;
 710        IWL_DEBUG_RATE(priv, "lq station id 0x%x\n", lq->sta_id);
 711        IWL_DEBUG_RATE(priv, "lq ant 0x%X 0x%X\n",
 712                       lq->general_params.single_stream_ant_msk,
 713                       lq->general_params.dual_stream_ant_msk);
 714
 715        for (i = 0; i < LINK_QUAL_MAX_RETRY_NUM; i++)
 716                IWL_DEBUG_RATE(priv, "lq index %d 0x%X\n",
 717                               i, lq->rs_table[i].rate_n_flags);
 718}
 719#else
 720static inline void iwl_dump_lq_cmd(struct iwl_priv *priv,
 721                                   struct iwl_link_quality_cmd *lq)
 722{
 723}
 724#endif
 725
 726/**
 727 * is_lq_table_valid() - Test one aspect of LQ cmd for validity
 728 *
 729 * It sometimes happens when a HT rate has been in use and we
 730 * loose connectivity with AP then mac80211 will first tell us that the
 731 * current channel is not HT anymore before removing the station. In such a
 732 * scenario the RXON flags will be updated to indicate we are not
 733 * communicating HT anymore, but the LQ command may still contain HT rates.
 734 * Test for this to prevent driver from sending LQ command between the time
 735 * RXON flags are updated and when LQ command is updated.
 736 */
 737static bool is_lq_table_valid(struct iwl_priv *priv,
 738                              struct iwl_rxon_context *ctx,
 739                              struct iwl_link_quality_cmd *lq)
 740{
 741        int i;
 742
 743        if (ctx->ht.enabled)
 744                return true;
 745
 746        IWL_DEBUG_INFO(priv, "Channel %u is not an HT channel\n",
 747                       ctx->active.channel);
 748        for (i = 0; i < LINK_QUAL_MAX_RETRY_NUM; i++) {
 749                if (le32_to_cpu(lq->rs_table[i].rate_n_flags) & RATE_MCS_HT_MSK) {
 750                        IWL_DEBUG_INFO(priv,
 751                                       "index %d of LQ expects HT channel\n",
 752                                       i);
 753                        return false;
 754                }
 755        }
 756        return true;
 757}
 758
 759/**
 760 * iwl_send_lq_cmd() - Send link quality command
 761 * @init: This command is sent as part of station initialization right
 762 *        after station has been added.
 763 *
 764 * The link quality command is sent as the last step of station creation.
 765 * This is the special case in which init is set and we call a callback in
 766 * this case to clear the state indicating that station creation is in
 767 * progress.
 768 */
 769int iwl_send_lq_cmd(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
 770                    struct iwl_link_quality_cmd *lq, u8 flags, bool init)
 771{
 772        int ret = 0;
 773        unsigned long flags_spin;
 774
 775        struct iwl_host_cmd cmd = {
 776                .id = REPLY_TX_LINK_QUALITY_CMD,
 777                .len = sizeof(struct iwl_link_quality_cmd),
 778                .flags = flags,
 779                .data = lq,
 780        };
 781
 782        if (WARN_ON(lq->sta_id == IWL_INVALID_STATION))
 783                return -EINVAL;
 784
 785
 786        spin_lock_irqsave(&priv->sta_lock, flags_spin);
 787        if (!(priv->stations[lq->sta_id].used & IWL_STA_DRIVER_ACTIVE)) {
 788                spin_unlock_irqrestore(&priv->sta_lock, flags_spin);
 789                return -EINVAL;
 790        }
 791        spin_unlock_irqrestore(&priv->sta_lock, flags_spin);
 792
 793        iwl_dump_lq_cmd(priv, lq);
 794        BUG_ON(init && (cmd.flags & CMD_ASYNC));
 795
 796        if (is_lq_table_valid(priv, ctx, lq))
 797                ret = iwl_send_cmd(priv, &cmd);
 798        else
 799                ret = -EINVAL;
 800
 801        if (cmd.flags & CMD_ASYNC)
 802                return ret;
 803
 804        if (init) {
 805                IWL_DEBUG_INFO(priv, "init LQ command complete, clearing sta addition status for sta %d\n",
 806                               lq->sta_id);
 807                spin_lock_irqsave(&priv->sta_lock, flags_spin);
 808                priv->stations[lq->sta_id].used &= ~IWL_STA_UCODE_INPROGRESS;
 809                spin_unlock_irqrestore(&priv->sta_lock, flags_spin);
 810        }
 811        return ret;
 812}
 813EXPORT_SYMBOL(iwl_send_lq_cmd);
 814
 815int iwl_mac_sta_remove(struct ieee80211_hw *hw,
 816                       struct ieee80211_vif *vif,
 817                       struct ieee80211_sta *sta)
 818{
 819        struct iwl_priv *priv = hw->priv;
 820        struct iwl_station_priv_common *sta_common = (void *)sta->drv_priv;
 821        int ret;
 822
 823        IWL_DEBUG_INFO(priv, "received request to remove station %pM\n",
 824                        sta->addr);
 825        mutex_lock(&priv->mutex);
 826        IWL_DEBUG_INFO(priv, "proceeding to remove station %pM\n",
 827                        sta->addr);
 828        ret = iwl_remove_station(priv, sta_common->sta_id, sta->addr);
 829        if (ret)
 830                IWL_ERR(priv, "Error removing station %pM\n",
 831                        sta->addr);
 832        mutex_unlock(&priv->mutex);
 833        return ret;
 834}
 835EXPORT_SYMBOL(iwl_mac_sta_remove);
 836