pandora: defconfig: update
[pandora-kernel.git] / drivers / net / wireless / iwlwifi / iwl-agn-sta.c
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
30 #include <net/mac80211.h>
31
32 #include "iwl-dev.h"
33 #include "iwl-core.h"
34 #include "iwl-agn.h"
35 #include "iwl-trans.h"
36
37 /* priv->shrd->sta_lock must be held */
38 static void iwl_sta_ucode_activate(struct iwl_priv *priv, u8 sta_id)
39 {
40
41         if (!(priv->stations[sta_id].used & IWL_STA_DRIVER_ACTIVE))
42                 IWL_ERR(priv, "ACTIVATE a non DRIVER active station id %u "
43                         "addr %pM\n",
44                         sta_id, priv->stations[sta_id].sta.sta.addr);
45
46         if (priv->stations[sta_id].used & IWL_STA_UCODE_ACTIVE) {
47                 IWL_DEBUG_ASSOC(priv,
48                                 "STA id %u addr %pM already present in uCode "
49                                 "(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
58 static int iwl_process_add_sta_resp(struct iwl_priv *priv,
59                                     struct iwl_addsta_cmd *addsta,
60                                     struct iwl_rx_packet *pkt)
61 {
62         u8 sta_id = addsta->sta.sta_id;
63         unsigned long flags;
64         int ret = -EIO;
65
66         if (pkt->hdr.flags & IWL_CMD_FAILED_MSK) {
67                 IWL_ERR(priv, "Bad return from REPLY_ADD_STA (0x%08X)\n",
68                         pkt->hdr.flags);
69                 return ret;
70         }
71
72         IWL_DEBUG_INFO(priv, "Processing response for adding station %u\n",
73                        sta_id);
74
75         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
76
77         switch (pkt->u.add_sta.status) {
78         case ADD_STA_SUCCESS_MSK:
79                 IWL_DEBUG_INFO(priv, "REPLY_ADD_STA PASSED\n");
80                 iwl_sta_ucode_activate(priv, sta_id);
81                 ret = 0;
82                 break;
83         case ADD_STA_NO_ROOM_IN_TABLE:
84                 IWL_ERR(priv, "Adding station %d failed, no room in table.\n",
85                         sta_id);
86                 break;
87         case ADD_STA_NO_BLOCK_ACK_RESOURCE:
88                 IWL_ERR(priv, "Adding station %d failed, no block ack "
89                         "resource.\n", sta_id);
90                 break;
91         case ADD_STA_MODIFY_NON_EXIST_STA:
92                 IWL_ERR(priv, "Attempting to modify non-existing station %d\n",
93                         sta_id);
94                 break;
95         default:
96                 IWL_DEBUG_ASSOC(priv, "Received REPLY_ADD_STA:(0x%08X)\n",
97                                 pkt->u.add_sta.status);
98                 break;
99         }
100
101         IWL_DEBUG_INFO(priv, "%s station id %u addr %pM\n",
102                        priv->stations[sta_id].sta.mode ==
103                        STA_CONTROL_MODIFY_MSK ?  "Modified" : "Added",
104                        sta_id, priv->stations[sta_id].sta.sta.addr);
105
106         /*
107          * XXX: The MAC address in the command buffer is often changed from
108          * the original sent to the device. That is, the MAC address
109          * written to the command buffer often is not the same MAC address
110          * read from the command buffer when the command returns. This
111          * issue has not yet been resolved and this debugging is left to
112          * observe the problem.
113          */
114         IWL_DEBUG_INFO(priv, "%s station according to cmd buffer %pM\n",
115                        priv->stations[sta_id].sta.mode ==
116                        STA_CONTROL_MODIFY_MSK ? "Modified" : "Added",
117                        addsta->sta.addr);
118         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
119
120         return ret;
121 }
122
123 int iwl_add_sta_callback(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb,
124                                struct iwl_device_cmd *cmd)
125 {
126         struct iwl_rx_packet *pkt = rxb_addr(rxb);
127         struct iwl_addsta_cmd *addsta =
128                 (struct iwl_addsta_cmd *) cmd->payload;
129
130         return iwl_process_add_sta_resp(priv, addsta, pkt);
131 }
132
133 static u16 iwlagn_build_addsta_hcmd(const struct iwl_addsta_cmd *cmd, u8 *data)
134 {
135         u16 size = (u16)sizeof(struct iwl_addsta_cmd);
136         struct iwl_addsta_cmd *addsta = (struct iwl_addsta_cmd *)data;
137         memcpy(addsta, cmd, size);
138         /* resrved in 5000 */
139         addsta->rate_n_flags = cpu_to_le16(0);
140         return size;
141 }
142
143 int iwl_send_add_sta(struct iwl_priv *priv,
144                      struct iwl_addsta_cmd *sta, u8 flags)
145 {
146         int ret = 0;
147         u8 data[sizeof(*sta)];
148         struct iwl_host_cmd cmd = {
149                 .id = REPLY_ADD_STA,
150                 .flags = flags,
151                 .data = { data, },
152         };
153         u8 sta_id __maybe_unused = sta->sta.sta_id;
154
155         IWL_DEBUG_INFO(priv, "Adding sta %u (%pM) %ssynchronously\n",
156                        sta_id, sta->sta.addr, flags & CMD_ASYNC ?  "a" : "");
157
158         if (!(flags & CMD_ASYNC)) {
159                 cmd.flags |= CMD_WANT_SKB;
160                 might_sleep();
161         }
162
163         cmd.len[0] = iwlagn_build_addsta_hcmd(sta, data);
164         ret = iwl_trans_send_cmd(trans(priv), &cmd);
165
166         if (ret || (flags & CMD_ASYNC))
167                 return ret;
168         /*else the command was successfully sent in SYNC mode, need to free
169          * the reply page */
170
171         iwl_free_pages(priv->shrd, cmd.reply_page);
172
173         if (cmd.handler_status)
174                 IWL_ERR(priv, "%s - error in the CMD response %d", __func__,
175                         cmd.handler_status);
176
177         return cmd.handler_status;
178 }
179
180 static void iwl_set_ht_add_station(struct iwl_priv *priv, u8 index,
181                                    struct ieee80211_sta *sta,
182                                    struct iwl_rxon_context *ctx)
183 {
184         struct ieee80211_sta_ht_cap *sta_ht_inf = &sta->ht_cap;
185         __le32 sta_flags;
186         u8 mimo_ps_mode;
187
188         if (!sta || !sta_ht_inf->ht_supported)
189                 goto done;
190
191         mimo_ps_mode = (sta_ht_inf->cap & IEEE80211_HT_CAP_SM_PS) >> 2;
192         IWL_DEBUG_ASSOC(priv, "spatial multiplexing power save mode: %s\n",
193                         (mimo_ps_mode == WLAN_HT_CAP_SM_PS_STATIC) ?
194                         "static" :
195                         (mimo_ps_mode == WLAN_HT_CAP_SM_PS_DYNAMIC) ?
196                         "dynamic" : "disabled");
197
198         sta_flags = priv->stations[index].sta.station_flags;
199
200         sta_flags &= ~(STA_FLG_RTS_MIMO_PROT_MSK | STA_FLG_MIMO_DIS_MSK);
201
202         switch (mimo_ps_mode) {
203         case WLAN_HT_CAP_SM_PS_STATIC:
204                 sta_flags |= STA_FLG_MIMO_DIS_MSK;
205                 break;
206         case WLAN_HT_CAP_SM_PS_DYNAMIC:
207                 sta_flags |= STA_FLG_RTS_MIMO_PROT_MSK;
208                 break;
209         case WLAN_HT_CAP_SM_PS_DISABLED:
210                 break;
211         default:
212                 IWL_WARN(priv, "Invalid MIMO PS mode %d\n", mimo_ps_mode);
213                 break;
214         }
215
216         sta_flags |= cpu_to_le32(
217               (u32)sta_ht_inf->ampdu_factor << STA_FLG_MAX_AGG_SIZE_POS);
218
219         sta_flags |= cpu_to_le32(
220               (u32)sta_ht_inf->ampdu_density << STA_FLG_AGG_MPDU_DENSITY_POS);
221
222         if (iwl_is_ht40_tx_allowed(priv, ctx, &sta->ht_cap))
223                 sta_flags |= STA_FLG_HT40_EN_MSK;
224         else
225                 sta_flags &= ~STA_FLG_HT40_EN_MSK;
226
227         priv->stations[index].sta.station_flags = sta_flags;
228  done:
229         return;
230 }
231
232 /**
233  * iwl_prep_station - Prepare station information for addition
234  *
235  * should be called with sta_lock held
236  */
237 u8 iwl_prep_station(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
238                     const u8 *addr, bool is_ap, struct ieee80211_sta *sta)
239 {
240         struct iwl_station_entry *station;
241         int i;
242         u8 sta_id = IWL_INVALID_STATION;
243
244         if (is_ap)
245                 sta_id = ctx->ap_sta_id;
246         else if (is_broadcast_ether_addr(addr))
247                 sta_id = ctx->bcast_sta_id;
248         else
249                 for (i = IWL_STA_ID; i < IWLAGN_STATION_COUNT; i++) {
250                         if (!compare_ether_addr(priv->stations[i].sta.sta.addr,
251                                                 addr)) {
252                                 sta_id = i;
253                                 break;
254                         }
255
256                         if (!priv->stations[i].used &&
257                             sta_id == IWL_INVALID_STATION)
258                                 sta_id = i;
259                 }
260
261         /*
262          * These two conditions have the same outcome, but keep them
263          * separate
264          */
265         if (unlikely(sta_id == IWL_INVALID_STATION))
266                 return sta_id;
267
268         /*
269          * uCode is not able to deal with multiple requests to add a
270          * station. Keep track if one is in progress so that we do not send
271          * another.
272          */
273         if (priv->stations[sta_id].used & IWL_STA_UCODE_INPROGRESS) {
274                 IWL_DEBUG_INFO(priv, "STA %d already in process of being "
275                                "added.\n", sta_id);
276                 return sta_id;
277         }
278
279         if ((priv->stations[sta_id].used & IWL_STA_DRIVER_ACTIVE) &&
280             (priv->stations[sta_id].used & IWL_STA_UCODE_ACTIVE) &&
281             !compare_ether_addr(priv->stations[sta_id].sta.sta.addr, addr)) {
282                 IWL_DEBUG_ASSOC(priv, "STA %d (%pM) already added, not "
283                                 "adding again.\n", sta_id, addr);
284                 return sta_id;
285         }
286
287         station = &priv->stations[sta_id];
288         station->used = IWL_STA_DRIVER_ACTIVE;
289         IWL_DEBUG_ASSOC(priv, "Add STA to driver ID %d: %pM\n",
290                         sta_id, addr);
291         priv->num_stations++;
292
293         /* Set up the REPLY_ADD_STA command to send to device */
294         memset(&station->sta, 0, sizeof(struct iwl_addsta_cmd));
295         memcpy(station->sta.sta.addr, addr, ETH_ALEN);
296         station->sta.mode = 0;
297         station->sta.sta.sta_id = sta_id;
298         station->sta.station_flags = ctx->station_flags;
299         station->ctxid = ctx->ctxid;
300
301         if (sta) {
302                 struct iwl_station_priv *sta_priv;
303
304                 sta_priv = (void *)sta->drv_priv;
305                 sta_priv->ctx = ctx;
306         }
307
308         /*
309          * OK to call unconditionally, since local stations (IBSS BSSID
310          * STA and broadcast STA) pass in a NULL sta, and mac80211
311          * doesn't allow HT IBSS.
312          */
313         iwl_set_ht_add_station(priv, sta_id, sta, ctx);
314
315         return sta_id;
316
317 }
318
319 #define STA_WAIT_TIMEOUT (HZ/2)
320
321 /**
322  * iwl_add_station_common -
323  */
324 int iwl_add_station_common(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
325                            const u8 *addr, bool is_ap,
326                            struct ieee80211_sta *sta, u8 *sta_id_r)
327 {
328         unsigned long flags_spin;
329         int ret = 0;
330         u8 sta_id;
331         struct iwl_addsta_cmd sta_cmd;
332
333         *sta_id_r = 0;
334         spin_lock_irqsave(&priv->shrd->sta_lock, flags_spin);
335         sta_id = iwl_prep_station(priv, ctx, addr, is_ap, sta);
336         if (sta_id == IWL_INVALID_STATION) {
337                 IWL_ERR(priv, "Unable to prepare station %pM for addition\n",
338                         addr);
339                 spin_unlock_irqrestore(&priv->shrd->sta_lock, flags_spin);
340                 return -EINVAL;
341         }
342
343         /*
344          * uCode is not able to deal with multiple requests to add a
345          * station. Keep track if one is in progress so that we do not send
346          * another.
347          */
348         if (priv->stations[sta_id].used & IWL_STA_UCODE_INPROGRESS) {
349                 IWL_DEBUG_INFO(priv, "STA %d already in process of being "
350                                "added.\n", sta_id);
351                 spin_unlock_irqrestore(&priv->shrd->sta_lock, flags_spin);
352                 return -EEXIST;
353         }
354
355         if ((priv->stations[sta_id].used & IWL_STA_DRIVER_ACTIVE) &&
356             (priv->stations[sta_id].used & IWL_STA_UCODE_ACTIVE)) {
357                 IWL_DEBUG_ASSOC(priv, "STA %d (%pM) already added, not "
358                                 "adding again.\n", sta_id, addr);
359                 spin_unlock_irqrestore(&priv->shrd->sta_lock, flags_spin);
360                 return -EEXIST;
361         }
362
363         priv->stations[sta_id].used |= IWL_STA_UCODE_INPROGRESS;
364         memcpy(&sta_cmd, &priv->stations[sta_id].sta,
365                sizeof(struct iwl_addsta_cmd));
366         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags_spin);
367
368         /* Add station to device's station table */
369         ret = iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC);
370         if (ret) {
371                 spin_lock_irqsave(&priv->shrd->sta_lock, flags_spin);
372                 IWL_ERR(priv, "Adding station %pM failed.\n",
373                         priv->stations[sta_id].sta.sta.addr);
374                 priv->stations[sta_id].used &= ~IWL_STA_DRIVER_ACTIVE;
375                 priv->stations[sta_id].used &= ~IWL_STA_UCODE_INPROGRESS;
376                 spin_unlock_irqrestore(&priv->shrd->sta_lock, flags_spin);
377         }
378         *sta_id_r = sta_id;
379         return ret;
380 }
381
382 /**
383  * iwl_sta_ucode_deactivate - deactivate ucode status for a station
384  *
385  * priv->shrd->sta_lock must be held
386  */
387 static void iwl_sta_ucode_deactivate(struct iwl_priv *priv, u8 sta_id)
388 {
389         /* Ucode must be active and driver must be non active */
390         if ((priv->stations[sta_id].used &
391              (IWL_STA_UCODE_ACTIVE | IWL_STA_DRIVER_ACTIVE)) !=
392               IWL_STA_UCODE_ACTIVE)
393                 IWL_ERR(priv, "removed non active STA %u\n", sta_id);
394
395         priv->stations[sta_id].used &= ~IWL_STA_UCODE_ACTIVE;
396
397         memset(&priv->stations[sta_id], 0, sizeof(struct iwl_station_entry));
398         IWL_DEBUG_ASSOC(priv, "Removed STA %u\n", sta_id);
399 }
400
401 static int iwl_send_remove_station(struct iwl_priv *priv,
402                                    const u8 *addr, int sta_id,
403                                    bool temporary)
404 {
405         struct iwl_rx_packet *pkt;
406         int ret;
407
408         unsigned long flags_spin;
409         struct iwl_rem_sta_cmd rm_sta_cmd;
410
411         struct iwl_host_cmd cmd = {
412                 .id = REPLY_REMOVE_STA,
413                 .len = { sizeof(struct iwl_rem_sta_cmd), },
414                 .flags = CMD_SYNC,
415                 .data = { &rm_sta_cmd, },
416         };
417
418         memset(&rm_sta_cmd, 0, sizeof(rm_sta_cmd));
419         rm_sta_cmd.num_sta = 1;
420         memcpy(&rm_sta_cmd.addr, addr, ETH_ALEN);
421
422         cmd.flags |= CMD_WANT_SKB;
423
424         ret = iwl_trans_send_cmd(trans(priv), &cmd);
425
426         if (ret)
427                 return ret;
428
429         pkt = (struct iwl_rx_packet *)cmd.reply_page;
430         if (pkt->hdr.flags & IWL_CMD_FAILED_MSK) {
431                 IWL_ERR(priv, "Bad return from REPLY_REMOVE_STA (0x%08X)\n",
432                           pkt->hdr.flags);
433                 ret = -EIO;
434         }
435
436         if (!ret) {
437                 switch (pkt->u.rem_sta.status) {
438                 case REM_STA_SUCCESS_MSK:
439                         if (!temporary) {
440                                 spin_lock_irqsave(&priv->shrd->sta_lock,
441                                         flags_spin);
442                                 iwl_sta_ucode_deactivate(priv, sta_id);
443                                 spin_unlock_irqrestore(&priv->shrd->sta_lock,
444                                         flags_spin);
445                         }
446                         IWL_DEBUG_ASSOC(priv, "REPLY_REMOVE_STA PASSED\n");
447                         break;
448                 default:
449                         ret = -EIO;
450                         IWL_ERR(priv, "REPLY_REMOVE_STA failed\n");
451                         break;
452                 }
453         }
454         iwl_free_pages(priv->shrd, cmd.reply_page);
455
456         return ret;
457 }
458
459 /**
460  * iwl_remove_station - Remove driver's knowledge of station.
461  */
462 int iwl_remove_station(struct iwl_priv *priv, const u8 sta_id,
463                        const u8 *addr)
464 {
465         unsigned long flags;
466
467         if (!iwl_is_ready(priv->shrd)) {
468                 IWL_DEBUG_INFO(priv,
469                         "Unable to remove station %pM, device not ready.\n",
470                         addr);
471                 /*
472                  * It is typical for stations to be removed when we are
473                  * going down. Return success since device will be down
474                  * soon anyway
475                  */
476                 return 0;
477         }
478
479         IWL_DEBUG_ASSOC(priv, "Removing STA from driver:%d  %pM\n",
480                         sta_id, addr);
481
482         if (WARN_ON(sta_id == IWL_INVALID_STATION))
483                 return -EINVAL;
484
485         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
486
487         if (!(priv->stations[sta_id].used & IWL_STA_DRIVER_ACTIVE)) {
488                 IWL_DEBUG_INFO(priv, "Removing %pM but non DRIVER active\n",
489                                 addr);
490                 goto out_err;
491         }
492
493         if (!(priv->stations[sta_id].used & IWL_STA_UCODE_ACTIVE)) {
494                 IWL_DEBUG_INFO(priv, "Removing %pM but non UCODE active\n",
495                                 addr);
496                 goto out_err;
497         }
498
499         if (priv->stations[sta_id].used & IWL_STA_LOCAL) {
500                 kfree(priv->stations[sta_id].lq);
501                 priv->stations[sta_id].lq = NULL;
502         }
503
504         priv->stations[sta_id].used &= ~IWL_STA_DRIVER_ACTIVE;
505
506         priv->num_stations--;
507
508         if (WARN_ON(priv->num_stations < 0))
509                 priv->num_stations = 0;
510
511         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
512
513         return iwl_send_remove_station(priv, addr, sta_id, false);
514 out_err:
515         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
516         return -EINVAL;
517 }
518
519 /**
520  * iwl_clear_ucode_stations - clear ucode station table bits
521  *
522  * This function clears all the bits in the driver indicating
523  * which stations are active in the ucode. Call when something
524  * other than explicit station management would cause this in
525  * the ucode, e.g. unassociated RXON.
526  */
527 void iwl_clear_ucode_stations(struct iwl_priv *priv,
528                               struct iwl_rxon_context *ctx)
529 {
530         int i;
531         unsigned long flags_spin;
532         bool cleared = false;
533
534         IWL_DEBUG_INFO(priv, "Clearing ucode stations in driver\n");
535
536         spin_lock_irqsave(&priv->shrd->sta_lock, flags_spin);
537         for (i = 0; i < IWLAGN_STATION_COUNT; i++) {
538                 if (ctx && ctx->ctxid != priv->stations[i].ctxid)
539                         continue;
540
541                 if (priv->stations[i].used & IWL_STA_UCODE_ACTIVE) {
542                         IWL_DEBUG_INFO(priv,
543                                 "Clearing ucode active for station %d\n", i);
544                         priv->stations[i].used &= ~IWL_STA_UCODE_ACTIVE;
545                         cleared = true;
546                 }
547         }
548         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags_spin);
549
550         if (!cleared)
551                 IWL_DEBUG_INFO(priv,
552                                "No active stations found to be cleared\n");
553 }
554
555 /**
556  * iwl_restore_stations() - Restore driver known stations to device
557  *
558  * All stations considered active by driver, but not present in ucode, is
559  * restored.
560  *
561  * Function sleeps.
562  */
563 void iwl_restore_stations(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
564 {
565         struct iwl_addsta_cmd sta_cmd;
566         static const struct iwl_link_quality_cmd zero_lq = {};
567         struct iwl_link_quality_cmd lq;
568         unsigned long flags_spin;
569         int i;
570         bool found = false;
571         int ret;
572         bool send_lq;
573
574         if (!iwl_is_ready(priv->shrd)) {
575                 IWL_DEBUG_INFO(priv,
576                                "Not ready yet, not restoring any stations.\n");
577                 return;
578         }
579
580         IWL_DEBUG_ASSOC(priv, "Restoring all known stations ... start.\n");
581         spin_lock_irqsave(&priv->shrd->sta_lock, flags_spin);
582         for (i = 0; i < IWLAGN_STATION_COUNT; i++) {
583                 if (ctx->ctxid != priv->stations[i].ctxid)
584                         continue;
585                 if ((priv->stations[i].used & IWL_STA_DRIVER_ACTIVE) &&
586                             !(priv->stations[i].used & IWL_STA_UCODE_ACTIVE)) {
587                         IWL_DEBUG_ASSOC(priv, "Restoring sta %pM\n",
588                                         priv->stations[i].sta.sta.addr);
589                         priv->stations[i].sta.mode = 0;
590                         priv->stations[i].used |= IWL_STA_UCODE_INPROGRESS;
591                         found = true;
592                 }
593         }
594
595         for (i = 0; i < IWLAGN_STATION_COUNT; i++) {
596                 if ((priv->stations[i].used & IWL_STA_UCODE_INPROGRESS)) {
597                         memcpy(&sta_cmd, &priv->stations[i].sta,
598                                sizeof(struct iwl_addsta_cmd));
599                         send_lq = false;
600                         if (priv->stations[i].lq) {
601                                 if (priv->shrd->wowlan)
602                                         iwl_sta_fill_lq(priv, ctx, i, &lq);
603                                 else
604                                         memcpy(&lq, priv->stations[i].lq,
605                                                sizeof(struct iwl_link_quality_cmd));
606
607                                 if (memcmp(&lq, &zero_lq, sizeof(lq)))
608                                         send_lq = true;
609                         }
610                         spin_unlock_irqrestore(&priv->shrd->sta_lock,
611                                                flags_spin);
612                         ret = iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC);
613                         if (ret) {
614                                 spin_lock_irqsave(&priv->shrd->sta_lock,
615                                                   flags_spin);
616                                 IWL_ERR(priv, "Adding station %pM failed.\n",
617                                         priv->stations[i].sta.sta.addr);
618                                 priv->stations[i].used &=
619                                                 ~IWL_STA_DRIVER_ACTIVE;
620                                 priv->stations[i].used &=
621                                                 ~IWL_STA_UCODE_INPROGRESS;
622                                 spin_unlock_irqrestore(&priv->shrd->sta_lock,
623                                                        flags_spin);
624                         }
625                         /*
626                          * Rate scaling has already been initialized, send
627                          * current LQ command
628                          */
629                         if (send_lq)
630                                 iwl_send_lq_cmd(priv, ctx, &lq,
631                                                 CMD_SYNC, true);
632                         spin_lock_irqsave(&priv->shrd->sta_lock, flags_spin);
633                         priv->stations[i].used &= ~IWL_STA_UCODE_INPROGRESS;
634                 }
635         }
636
637         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags_spin);
638         if (!found)
639                 IWL_DEBUG_INFO(priv, "Restoring all known stations .... "
640                         "no stations to be restored.\n");
641         else
642                 IWL_DEBUG_INFO(priv, "Restoring all known stations .... "
643                         "complete.\n");
644 }
645
646 void iwl_reprogram_ap_sta(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
647 {
648         unsigned long flags;
649         int sta_id = ctx->ap_sta_id;
650         int ret;
651         struct iwl_addsta_cmd sta_cmd;
652         struct iwl_link_quality_cmd lq;
653         bool active;
654
655         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
656         if (!(priv->stations[sta_id].used & IWL_STA_DRIVER_ACTIVE)) {
657                 spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
658                 return;
659         }
660
661         memcpy(&sta_cmd, &priv->stations[sta_id].sta, sizeof(sta_cmd));
662         sta_cmd.mode = 0;
663         memcpy(&lq, priv->stations[sta_id].lq, sizeof(lq));
664
665         active = priv->stations[sta_id].used & IWL_STA_UCODE_ACTIVE;
666         priv->stations[sta_id].used &= ~IWL_STA_DRIVER_ACTIVE;
667         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
668
669         if (active) {
670                 ret = iwl_send_remove_station(
671                         priv, priv->stations[sta_id].sta.sta.addr,
672                         sta_id, true);
673                 if (ret)
674                         IWL_ERR(priv, "failed to remove STA %pM (%d)\n",
675                                 priv->stations[sta_id].sta.sta.addr, ret);
676         }
677         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
678         priv->stations[sta_id].used |= IWL_STA_DRIVER_ACTIVE;
679         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
680
681         ret = iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC);
682         if (ret)
683                 IWL_ERR(priv, "failed to re-add STA %pM (%d)\n",
684                         priv->stations[sta_id].sta.sta.addr, ret);
685         iwl_send_lq_cmd(priv, ctx, &lq, CMD_SYNC, true);
686 }
687
688 int iwl_get_free_ucode_key_offset(struct iwl_priv *priv)
689 {
690         int i;
691
692         for (i = 0; i < priv->sta_key_max_num; i++)
693                 if (!test_and_set_bit(i, &priv->ucode_key_table))
694                         return i;
695
696         return WEP_INVALID_OFFSET;
697 }
698
699 void iwl_dealloc_bcast_stations(struct iwl_priv *priv)
700 {
701         unsigned long flags;
702         int i;
703
704         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
705         for (i = 0; i < IWLAGN_STATION_COUNT; i++) {
706                 if (!(priv->stations[i].used & IWL_STA_BCAST))
707                         continue;
708
709                 priv->stations[i].used &= ~IWL_STA_UCODE_ACTIVE;
710                 priv->num_stations--;
711                 if (WARN_ON(priv->num_stations < 0))
712                         priv->num_stations = 0;
713                 kfree(priv->stations[i].lq);
714                 priv->stations[i].lq = NULL;
715         }
716         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
717 }
718
719 #ifdef CONFIG_IWLWIFI_DEBUG
720 static void iwl_dump_lq_cmd(struct iwl_priv *priv,
721                            struct iwl_link_quality_cmd *lq)
722 {
723         int i;
724         IWL_DEBUG_RATE(priv, "lq station id 0x%x\n", lq->sta_id);
725         IWL_DEBUG_RATE(priv, "lq ant 0x%X 0x%X\n",
726                        lq->general_params.single_stream_ant_msk,
727                        lq->general_params.dual_stream_ant_msk);
728
729         for (i = 0; i < LINK_QUAL_MAX_RETRY_NUM; i++)
730                 IWL_DEBUG_RATE(priv, "lq index %d 0x%X\n",
731                                i, lq->rs_table[i].rate_n_flags);
732 }
733 #else
734 static inline void iwl_dump_lq_cmd(struct iwl_priv *priv,
735                                    struct iwl_link_quality_cmd *lq)
736 {
737 }
738 #endif
739
740 /**
741  * is_lq_table_valid() - Test one aspect of LQ cmd for validity
742  *
743  * It sometimes happens when a HT rate has been in use and we
744  * loose connectivity with AP then mac80211 will first tell us that the
745  * current channel is not HT anymore before removing the station. In such a
746  * scenario the RXON flags will be updated to indicate we are not
747  * communicating HT anymore, but the LQ command may still contain HT rates.
748  * Test for this to prevent driver from sending LQ command between the time
749  * RXON flags are updated and when LQ command is updated.
750  */
751 static bool is_lq_table_valid(struct iwl_priv *priv,
752                               struct iwl_rxon_context *ctx,
753                               struct iwl_link_quality_cmd *lq)
754 {
755         int i;
756
757         if (ctx->ht.enabled)
758                 return true;
759
760         IWL_DEBUG_INFO(priv, "Channel %u is not an HT channel\n",
761                        ctx->active.channel);
762         for (i = 0; i < LINK_QUAL_MAX_RETRY_NUM; i++) {
763                 if (le32_to_cpu(lq->rs_table[i].rate_n_flags) &
764                     RATE_MCS_HT_MSK) {
765                         IWL_DEBUG_INFO(priv,
766                                        "index %d of LQ expects HT channel\n",
767                                        i);
768                         return false;
769                 }
770         }
771         return true;
772 }
773
774 /**
775  * iwl_send_lq_cmd() - Send link quality command
776  * @init: This command is sent as part of station initialization right
777  *        after station has been added.
778  *
779  * The link quality command is sent as the last step of station creation.
780  * This is the special case in which init is set and we call a callback in
781  * this case to clear the state indicating that station creation is in
782  * progress.
783  */
784 int iwl_send_lq_cmd(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
785                     struct iwl_link_quality_cmd *lq, u8 flags, bool init)
786 {
787         int ret = 0;
788         unsigned long flags_spin;
789
790         struct iwl_host_cmd cmd = {
791                 .id = REPLY_TX_LINK_QUALITY_CMD,
792                 .len = { sizeof(struct iwl_link_quality_cmd), },
793                 .flags = flags,
794                 .data = { lq, },
795         };
796
797         if (WARN_ON(lq->sta_id == IWL_INVALID_STATION))
798                 return -EINVAL;
799
800
801         spin_lock_irqsave(&priv->shrd->sta_lock, flags_spin);
802         if (!(priv->stations[lq->sta_id].used & IWL_STA_DRIVER_ACTIVE)) {
803                 spin_unlock_irqrestore(&priv->shrd->sta_lock, flags_spin);
804                 return -EINVAL;
805         }
806         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags_spin);
807
808         iwl_dump_lq_cmd(priv, lq);
809         if (WARN_ON(init && (cmd.flags & CMD_ASYNC)))
810                 return -EINVAL;
811
812         if (is_lq_table_valid(priv, ctx, lq))
813                 ret = iwl_trans_send_cmd(trans(priv), &cmd);
814         else
815                 ret = -EINVAL;
816
817         if (cmd.flags & CMD_ASYNC)
818                 return ret;
819
820         if (init) {
821                 IWL_DEBUG_INFO(priv, "init LQ command complete, "
822                                "clearing sta addition status for sta %d\n",
823                                lq->sta_id);
824                 spin_lock_irqsave(&priv->shrd->sta_lock, flags_spin);
825                 priv->stations[lq->sta_id].used &= ~IWL_STA_UCODE_INPROGRESS;
826                 spin_unlock_irqrestore(&priv->shrd->sta_lock, flags_spin);
827         }
828         return ret;
829 }
830
831 int iwlagn_mac_sta_remove(struct ieee80211_hw *hw,
832                        struct ieee80211_vif *vif,
833                        struct ieee80211_sta *sta)
834 {
835         struct iwl_priv *priv = hw->priv;
836         struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
837         int ret;
838
839         IWL_DEBUG_MAC80211(priv, "enter: received request to remove "
840                            "station %pM\n", sta->addr);
841         mutex_lock(&priv->shrd->mutex);
842         IWL_DEBUG_INFO(priv, "proceeding to remove station %pM\n",
843                         sta->addr);
844         ret = iwl_remove_station(priv, sta_priv->sta_id, sta->addr);
845         if (ret)
846                 IWL_ERR(priv, "Error removing station %pM\n",
847                         sta->addr);
848         mutex_unlock(&priv->shrd->mutex);
849         IWL_DEBUG_MAC80211(priv, "leave\n");
850
851         return ret;
852 }
853
854 void iwl_sta_fill_lq(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
855                      u8 sta_id, struct iwl_link_quality_cmd *link_cmd)
856 {
857         int i, r;
858         u32 rate_flags = 0;
859         __le32 rate_n_flags;
860
861         lockdep_assert_held(&priv->shrd->mutex);
862
863         memset(link_cmd, 0, sizeof(*link_cmd));
864
865         /* Set up the rate scaling to start at selected rate, fall back
866          * all the way down to 1M in IEEE order, and then spin on 1M */
867         if (priv->band == IEEE80211_BAND_5GHZ)
868                 r = IWL_RATE_6M_INDEX;
869         else if (ctx && ctx->vif && ctx->vif->p2p)
870                 r = IWL_RATE_6M_INDEX;
871         else
872                 r = IWL_RATE_1M_INDEX;
873
874         if (r >= IWL_FIRST_CCK_RATE && r <= IWL_LAST_CCK_RATE)
875                 rate_flags |= RATE_MCS_CCK_MSK;
876
877         rate_flags |= first_antenna(hw_params(priv).valid_tx_ant) <<
878                                 RATE_MCS_ANT_POS;
879         rate_n_flags = iwl_hw_set_rate_n_flags(iwl_rates[r].plcp, rate_flags);
880         for (i = 0; i < LINK_QUAL_MAX_RETRY_NUM; i++)
881                 link_cmd->rs_table[i].rate_n_flags = rate_n_flags;
882
883         link_cmd->general_params.single_stream_ant_msk =
884                         first_antenna(hw_params(priv).valid_tx_ant);
885
886         link_cmd->general_params.dual_stream_ant_msk =
887                 hw_params(priv).valid_tx_ant &
888                 ~first_antenna(hw_params(priv).valid_tx_ant);
889         if (!link_cmd->general_params.dual_stream_ant_msk) {
890                 link_cmd->general_params.dual_stream_ant_msk = ANT_AB;
891         } else if (num_of_ant(hw_params(priv).valid_tx_ant) == 2) {
892                 link_cmd->general_params.dual_stream_ant_msk =
893                         hw_params(priv).valid_tx_ant;
894         }
895
896         link_cmd->agg_params.agg_dis_start_th =
897                 LINK_QUAL_AGG_DISABLE_START_DEF;
898         link_cmd->agg_params.agg_time_limit =
899                 cpu_to_le16(LINK_QUAL_AGG_TIME_LIMIT_DEF);
900
901         link_cmd->sta_id = sta_id;
902 }
903
904 static struct iwl_link_quality_cmd *
905 iwl_sta_alloc_lq(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
906                  u8 sta_id)
907 {
908         struct iwl_link_quality_cmd *link_cmd;
909
910         link_cmd = kzalloc(sizeof(struct iwl_link_quality_cmd), GFP_KERNEL);
911         if (!link_cmd) {
912                 IWL_ERR(priv, "Unable to allocate memory for LQ cmd.\n");
913                 return NULL;
914         }
915
916         iwl_sta_fill_lq(priv, ctx, sta_id, link_cmd);
917
918         return link_cmd;
919 }
920
921 /*
922  * iwlagn_add_bssid_station - Add the special IBSS BSSID station
923  *
924  * Function sleeps.
925  */
926 int iwlagn_add_bssid_station(struct iwl_priv *priv,
927                              struct iwl_rxon_context *ctx,
928                              const u8 *addr, u8 *sta_id_r)
929 {
930         int ret;
931         u8 sta_id;
932         struct iwl_link_quality_cmd *link_cmd;
933         unsigned long flags;
934
935         if (sta_id_r)
936                 *sta_id_r = IWL_INVALID_STATION;
937
938         ret = iwl_add_station_common(priv, ctx, addr, 0, NULL, &sta_id);
939         if (ret) {
940                 IWL_ERR(priv, "Unable to add station %pM\n", addr);
941                 return ret;
942         }
943
944         if (sta_id_r)
945                 *sta_id_r = sta_id;
946
947         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
948         priv->stations[sta_id].used |= IWL_STA_LOCAL;
949         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
950
951         /* Set up default rate scaling table in device's station table */
952         link_cmd = iwl_sta_alloc_lq(priv, ctx, sta_id);
953         if (!link_cmd) {
954                 IWL_ERR(priv,
955                         "Unable to initialize rate scaling for station %pM.\n",
956                         addr);
957                 return -ENOMEM;
958         }
959
960         ret = iwl_send_lq_cmd(priv, ctx, link_cmd, CMD_SYNC, true);
961         if (ret)
962                 IWL_ERR(priv, "Link quality command failed (%d)\n", ret);
963
964         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
965         priv->stations[sta_id].lq = link_cmd;
966         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
967
968         return 0;
969 }
970
971 /*
972  * static WEP keys
973  *
974  * For each context, the device has a table of 4 static WEP keys
975  * (one for each key index) that is updated with the following
976  * commands.
977  */
978
979 static int iwl_send_static_wepkey_cmd(struct iwl_priv *priv,
980                                       struct iwl_rxon_context *ctx,
981                                       bool send_if_empty)
982 {
983         int i, not_empty = 0;
984         u8 buff[sizeof(struct iwl_wep_cmd) +
985                 sizeof(struct iwl_wep_key) * WEP_KEYS_MAX];
986         struct iwl_wep_cmd *wep_cmd = (struct iwl_wep_cmd *)buff;
987         size_t cmd_size  = sizeof(struct iwl_wep_cmd);
988         struct iwl_host_cmd cmd = {
989                 .id = ctx->wep_key_cmd,
990                 .data = { wep_cmd, },
991                 .flags = CMD_SYNC,
992         };
993
994         might_sleep();
995
996         memset(wep_cmd, 0, cmd_size +
997                         (sizeof(struct iwl_wep_key) * WEP_KEYS_MAX));
998
999         for (i = 0; i < WEP_KEYS_MAX ; i++) {
1000                 wep_cmd->key[i].key_index = i;
1001                 if (ctx->wep_keys[i].key_size) {
1002                         wep_cmd->key[i].key_offset = i;
1003                         not_empty = 1;
1004                 } else {
1005                         wep_cmd->key[i].key_offset = WEP_INVALID_OFFSET;
1006                 }
1007
1008                 wep_cmd->key[i].key_size = ctx->wep_keys[i].key_size;
1009                 memcpy(&wep_cmd->key[i].key[3], ctx->wep_keys[i].key,
1010                                 ctx->wep_keys[i].key_size);
1011         }
1012
1013         wep_cmd->global_key_type = WEP_KEY_WEP_TYPE;
1014         wep_cmd->num_keys = WEP_KEYS_MAX;
1015
1016         cmd_size += sizeof(struct iwl_wep_key) * WEP_KEYS_MAX;
1017
1018         cmd.len[0] = cmd_size;
1019
1020         if (not_empty || send_if_empty)
1021                 return iwl_trans_send_cmd(trans(priv), &cmd);
1022         else
1023                 return 0;
1024 }
1025
1026 int iwl_restore_default_wep_keys(struct iwl_priv *priv,
1027                                  struct iwl_rxon_context *ctx)
1028 {
1029         lockdep_assert_held(&priv->shrd->mutex);
1030
1031         return iwl_send_static_wepkey_cmd(priv, ctx, false);
1032 }
1033
1034 int iwl_remove_default_wep_key(struct iwl_priv *priv,
1035                                struct iwl_rxon_context *ctx,
1036                                struct ieee80211_key_conf *keyconf)
1037 {
1038         int ret;
1039
1040         lockdep_assert_held(&priv->shrd->mutex);
1041
1042         IWL_DEBUG_WEP(priv, "Removing default WEP key: idx=%d\n",
1043                       keyconf->keyidx);
1044
1045         memset(&ctx->wep_keys[keyconf->keyidx], 0, sizeof(ctx->wep_keys[0]));
1046         if (iwl_is_rfkill(priv->shrd)) {
1047                 IWL_DEBUG_WEP(priv,
1048                         "Not sending REPLY_WEPKEY command due to RFKILL.\n");
1049                 /* but keys in device are clear anyway so return success */
1050                 return 0;
1051         }
1052         ret = iwl_send_static_wepkey_cmd(priv, ctx, 1);
1053         IWL_DEBUG_WEP(priv, "Remove default WEP key: idx=%d ret=%d\n",
1054                       keyconf->keyidx, ret);
1055
1056         return ret;
1057 }
1058
1059 int iwl_set_default_wep_key(struct iwl_priv *priv,
1060                             struct iwl_rxon_context *ctx,
1061                             struct ieee80211_key_conf *keyconf)
1062 {
1063         int ret;
1064
1065         lockdep_assert_held(&priv->shrd->mutex);
1066
1067         if (keyconf->keylen != WEP_KEY_LEN_128 &&
1068             keyconf->keylen != WEP_KEY_LEN_64) {
1069                 IWL_DEBUG_WEP(priv,
1070                               "Bad WEP key length %d\n", keyconf->keylen);
1071                 return -EINVAL;
1072         }
1073
1074         keyconf->hw_key_idx = IWLAGN_HW_KEY_DEFAULT;
1075
1076         ctx->wep_keys[keyconf->keyidx].key_size = keyconf->keylen;
1077         memcpy(&ctx->wep_keys[keyconf->keyidx].key, &keyconf->key,
1078                                                         keyconf->keylen);
1079
1080         ret = iwl_send_static_wepkey_cmd(priv, ctx, false);
1081         IWL_DEBUG_WEP(priv, "Set default WEP key: len=%d idx=%d ret=%d\n",
1082                 keyconf->keylen, keyconf->keyidx, ret);
1083
1084         return ret;
1085 }
1086
1087 /*
1088  * dynamic (per-station) keys
1089  *
1090  * The dynamic keys are a little more complicated. The device has
1091  * a key cache of up to STA_KEY_MAX_NUM/STA_KEY_MAX_NUM_PAN keys.
1092  * These are linked to stations by a table that contains an index
1093  * into the key table for each station/key index/{mcast,unicast},
1094  * i.e. it's basically an array of pointers like this:
1095  *      key_offset_t key_mapping[NUM_STATIONS][4][2];
1096  * (it really works differently, but you can think of it as such)
1097  *
1098  * The key uploading and linking happens in the same command, the
1099  * add station command with STA_MODIFY_KEY_MASK.
1100  */
1101
1102 static u8 iwlagn_key_sta_id(struct iwl_priv *priv,
1103                             struct ieee80211_vif *vif,
1104                             struct ieee80211_sta *sta)
1105 {
1106         struct iwl_vif_priv *vif_priv = (void *)vif->drv_priv;
1107         u8 sta_id = IWL_INVALID_STATION;
1108
1109         if (sta)
1110                 sta_id = iwl_sta_id(sta);
1111
1112         /*
1113          * The device expects GTKs for station interfaces to be
1114          * installed as GTKs for the AP station. If we have no
1115          * station ID, then use the ap_sta_id in that case.
1116          */
1117         if (!sta && vif && vif_priv->ctx) {
1118                 switch (vif->type) {
1119                 case NL80211_IFTYPE_STATION:
1120                         sta_id = vif_priv->ctx->ap_sta_id;
1121                         break;
1122                 default:
1123                         /*
1124                          * In all other cases, the key will be
1125                          * used either for TX only or is bound
1126                          * to a station already.
1127                          */
1128                         break;
1129                 }
1130         }
1131
1132         return sta_id;
1133 }
1134
1135 static int iwlagn_send_sta_key(struct iwl_priv *priv,
1136                                struct ieee80211_key_conf *keyconf,
1137                                u8 sta_id, u32 tkip_iv32, u16 *tkip_p1k,
1138                                u32 cmd_flags)
1139 {
1140         unsigned long flags;
1141         __le16 key_flags;
1142         struct iwl_addsta_cmd sta_cmd;
1143         int i;
1144
1145         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
1146         memcpy(&sta_cmd, &priv->stations[sta_id].sta, sizeof(sta_cmd));
1147         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
1148
1149         key_flags = cpu_to_le16(keyconf->keyidx << STA_KEY_FLG_KEYID_POS);
1150         key_flags |= STA_KEY_FLG_MAP_KEY_MSK;
1151
1152         switch (keyconf->cipher) {
1153         case WLAN_CIPHER_SUITE_CCMP:
1154                 key_flags |= STA_KEY_FLG_CCMP;
1155                 memcpy(sta_cmd.key.key, keyconf->key, keyconf->keylen);
1156                 break;
1157         case WLAN_CIPHER_SUITE_TKIP:
1158                 key_flags |= STA_KEY_FLG_TKIP;
1159                 sta_cmd.key.tkip_rx_tsc_byte2 = tkip_iv32;
1160                 for (i = 0; i < 5; i++)
1161                         sta_cmd.key.tkip_rx_ttak[i] = cpu_to_le16(tkip_p1k[i]);
1162                 memcpy(sta_cmd.key.key, keyconf->key, keyconf->keylen);
1163                 break;
1164         case WLAN_CIPHER_SUITE_WEP104:
1165                 key_flags |= STA_KEY_FLG_KEY_SIZE_MSK;
1166                 /* fall through */
1167         case WLAN_CIPHER_SUITE_WEP40:
1168                 key_flags |= STA_KEY_FLG_WEP;
1169                 memcpy(&sta_cmd.key.key[3], keyconf->key, keyconf->keylen);
1170                 break;
1171         default:
1172                 WARN_ON(1);
1173                 return -EINVAL;
1174         }
1175
1176         if (!(keyconf->flags & IEEE80211_KEY_FLAG_PAIRWISE))
1177                 key_flags |= STA_KEY_MULTICAST_MSK;
1178
1179         /* key pointer (offset) */
1180         sta_cmd.key.key_offset = keyconf->hw_key_idx;
1181
1182         sta_cmd.key.key_flags = key_flags;
1183         sta_cmd.mode = STA_CONTROL_MODIFY_MSK;
1184         sta_cmd.sta.modify_mask = STA_MODIFY_KEY_MASK;
1185
1186         return iwl_send_add_sta(priv, &sta_cmd, cmd_flags);
1187 }
1188
1189 void iwl_update_tkip_key(struct iwl_priv *priv,
1190                          struct ieee80211_vif *vif,
1191                          struct ieee80211_key_conf *keyconf,
1192                          struct ieee80211_sta *sta, u32 iv32, u16 *phase1key)
1193 {
1194         u8 sta_id = iwlagn_key_sta_id(priv, vif, sta);
1195
1196         if (sta_id == IWL_INVALID_STATION)
1197                 return;
1198
1199         if (iwl_scan_cancel(priv)) {
1200                 /* cancel scan failed, just live w/ bad key and rely
1201                    briefly on SW decryption */
1202                 return;
1203         }
1204
1205         iwlagn_send_sta_key(priv, keyconf, sta_id,
1206                             iv32, phase1key, CMD_ASYNC);
1207 }
1208
1209 int iwl_remove_dynamic_key(struct iwl_priv *priv,
1210                            struct iwl_rxon_context *ctx,
1211                            struct ieee80211_key_conf *keyconf,
1212                            struct ieee80211_sta *sta)
1213 {
1214         unsigned long flags;
1215         struct iwl_addsta_cmd sta_cmd;
1216         u8 sta_id = iwlagn_key_sta_id(priv, ctx->vif, sta);
1217         __le16 key_flags;
1218
1219         /* if station isn't there, neither is the key */
1220         if (sta_id == IWL_INVALID_STATION)
1221                 return -ENOENT;
1222
1223         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
1224         memcpy(&sta_cmd, &priv->stations[sta_id].sta, sizeof(sta_cmd));
1225         if (!(priv->stations[sta_id].used & IWL_STA_UCODE_ACTIVE))
1226                 sta_id = IWL_INVALID_STATION;
1227         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
1228
1229         if (sta_id == IWL_INVALID_STATION)
1230                 return 0;
1231
1232         lockdep_assert_held(&priv->shrd->mutex);
1233
1234         ctx->key_mapping_keys--;
1235
1236         IWL_DEBUG_WEP(priv, "Remove dynamic key: idx=%d sta=%d\n",
1237                       keyconf->keyidx, sta_id);
1238
1239         if (!test_and_clear_bit(keyconf->hw_key_idx, &priv->ucode_key_table))
1240                 IWL_ERR(priv, "offset %d not used in uCode key table.\n",
1241                         keyconf->hw_key_idx);
1242
1243         key_flags = cpu_to_le16(keyconf->keyidx << STA_KEY_FLG_KEYID_POS);
1244         key_flags |= STA_KEY_FLG_MAP_KEY_MSK | STA_KEY_FLG_NO_ENC |
1245                      STA_KEY_FLG_INVALID;
1246
1247         if (!(keyconf->flags & IEEE80211_KEY_FLAG_PAIRWISE))
1248                 key_flags |= STA_KEY_MULTICAST_MSK;
1249
1250         sta_cmd.key.key_flags = key_flags;
1251         sta_cmd.key.key_offset = keyconf->hw_key_idx;
1252         sta_cmd.sta.modify_mask = STA_MODIFY_KEY_MASK;
1253         sta_cmd.mode = STA_CONTROL_MODIFY_MSK;
1254
1255         return iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC);
1256 }
1257
1258 int iwl_set_dynamic_key(struct iwl_priv *priv,
1259                         struct iwl_rxon_context *ctx,
1260                         struct ieee80211_key_conf *keyconf,
1261                         struct ieee80211_sta *sta)
1262 {
1263         struct ieee80211_key_seq seq;
1264         u16 p1k[5];
1265         int ret;
1266         u8 sta_id = iwlagn_key_sta_id(priv, ctx->vif, sta);
1267         const u8 *addr;
1268
1269         if (sta_id == IWL_INVALID_STATION)
1270                 return -EINVAL;
1271
1272         lockdep_assert_held(&priv->shrd->mutex);
1273
1274         keyconf->hw_key_idx = iwl_get_free_ucode_key_offset(priv);
1275         if (keyconf->hw_key_idx == WEP_INVALID_OFFSET)
1276                 return -ENOSPC;
1277
1278         ctx->key_mapping_keys++;
1279
1280         switch (keyconf->cipher) {
1281         case WLAN_CIPHER_SUITE_TKIP:
1282                 if (sta)
1283                         addr = sta->addr;
1284                 else /* station mode case only */
1285                         addr = ctx->active.bssid_addr;
1286
1287                 /* pre-fill phase 1 key into device cache */
1288                 ieee80211_get_key_rx_seq(keyconf, 0, &seq);
1289                 ieee80211_get_tkip_rx_p1k(keyconf, addr, seq.tkip.iv32, p1k);
1290                 ret = iwlagn_send_sta_key(priv, keyconf, sta_id,
1291                                           seq.tkip.iv32, p1k, CMD_SYNC);
1292                 break;
1293         case WLAN_CIPHER_SUITE_CCMP:
1294         case WLAN_CIPHER_SUITE_WEP40:
1295         case WLAN_CIPHER_SUITE_WEP104:
1296                 ret = iwlagn_send_sta_key(priv, keyconf, sta_id,
1297                                           0, NULL, CMD_SYNC);
1298                 break;
1299         default:
1300                 IWL_ERR(priv, "Unknown cipher %x\n", keyconf->cipher);
1301                 ret = -EINVAL;
1302         }
1303
1304         if (ret) {
1305                 ctx->key_mapping_keys--;
1306                 clear_bit(keyconf->hw_key_idx, &priv->ucode_key_table);
1307         }
1308
1309         IWL_DEBUG_WEP(priv, "Set dynamic key: cipher=%x len=%d idx=%d sta=%pM ret=%d\n",
1310                       keyconf->cipher, keyconf->keylen, keyconf->keyidx,
1311                       sta ? sta->addr : NULL, ret);
1312
1313         return ret;
1314 }
1315
1316 /**
1317  * iwlagn_alloc_bcast_station - add broadcast station into driver's station table.
1318  *
1319  * This adds the broadcast station into the driver's station table
1320  * and marks it driver active, so that it will be restored to the
1321  * device at the next best time.
1322  */
1323 int iwlagn_alloc_bcast_station(struct iwl_priv *priv,
1324                                struct iwl_rxon_context *ctx)
1325 {
1326         struct iwl_link_quality_cmd *link_cmd;
1327         unsigned long flags;
1328         u8 sta_id;
1329
1330         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
1331         sta_id = iwl_prep_station(priv, ctx, iwl_bcast_addr, false, NULL);
1332         if (sta_id == IWL_INVALID_STATION) {
1333                 IWL_ERR(priv, "Unable to prepare broadcast station\n");
1334                 spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
1335
1336                 return -EINVAL;
1337         }
1338
1339         priv->stations[sta_id].used |= IWL_STA_DRIVER_ACTIVE;
1340         priv->stations[sta_id].used |= IWL_STA_BCAST;
1341         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
1342
1343         link_cmd = iwl_sta_alloc_lq(priv, ctx, sta_id);
1344         if (!link_cmd) {
1345                 IWL_ERR(priv,
1346                         "Unable to initialize rate scaling for bcast station.\n");
1347                 return -ENOMEM;
1348         }
1349
1350         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
1351         priv->stations[sta_id].lq = link_cmd;
1352         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
1353
1354         return 0;
1355 }
1356
1357 /**
1358  * iwl_update_bcast_station - update broadcast station's LQ command
1359  *
1360  * Only used by iwlagn. Placed here to have all bcast station management
1361  * code together.
1362  */
1363 int iwl_update_bcast_station(struct iwl_priv *priv,
1364                              struct iwl_rxon_context *ctx)
1365 {
1366         unsigned long flags;
1367         struct iwl_link_quality_cmd *link_cmd;
1368         u8 sta_id = ctx->bcast_sta_id;
1369
1370         link_cmd = iwl_sta_alloc_lq(priv, ctx, sta_id);
1371         if (!link_cmd) {
1372                 IWL_ERR(priv, "Unable to initialize rate scaling for bcast station.\n");
1373                 return -ENOMEM;
1374         }
1375
1376         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
1377         if (priv->stations[sta_id].lq)
1378                 kfree(priv->stations[sta_id].lq);
1379         else
1380                 IWL_DEBUG_INFO(priv, "Bcast station rate scaling has not been initialized yet.\n");
1381         priv->stations[sta_id].lq = link_cmd;
1382         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
1383
1384         return 0;
1385 }
1386
1387 int iwl_update_bcast_stations(struct iwl_priv *priv)
1388 {
1389         struct iwl_rxon_context *ctx;
1390         int ret = 0;
1391
1392         for_each_context(priv, ctx) {
1393                 ret = iwl_update_bcast_station(priv, ctx);
1394                 if (ret)
1395                         break;
1396         }
1397
1398         return ret;
1399 }
1400
1401 /**
1402  * iwl_sta_tx_modify_enable_tid - Enable Tx for this TID in station table
1403  */
1404 int iwl_sta_tx_modify_enable_tid(struct iwl_priv *priv, int sta_id, int tid)
1405 {
1406         unsigned long flags;
1407         struct iwl_addsta_cmd sta_cmd;
1408
1409         lockdep_assert_held(&priv->shrd->mutex);
1410
1411         /* Remove "disable" flag, to enable Tx for this TID */
1412         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
1413         priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_TID_DISABLE_TX;
1414         priv->stations[sta_id].sta.tid_disable_tx &= cpu_to_le16(~(1 << tid));
1415         priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK;
1416         memcpy(&sta_cmd, &priv->stations[sta_id].sta, sizeof(struct iwl_addsta_cmd));
1417         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
1418
1419         return iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC);
1420 }
1421
1422 int iwl_sta_rx_agg_start(struct iwl_priv *priv, struct ieee80211_sta *sta,
1423                          int tid, u16 ssn)
1424 {
1425         unsigned long flags;
1426         int sta_id;
1427         struct iwl_addsta_cmd sta_cmd;
1428
1429         lockdep_assert_held(&priv->shrd->mutex);
1430
1431         sta_id = iwl_sta_id(sta);
1432         if (sta_id == IWL_INVALID_STATION)
1433                 return -ENXIO;
1434
1435         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
1436         priv->stations[sta_id].sta.station_flags_msk = 0;
1437         priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_ADDBA_TID_MSK;
1438         priv->stations[sta_id].sta.add_immediate_ba_tid = (u8)tid;
1439         priv->stations[sta_id].sta.add_immediate_ba_ssn = cpu_to_le16(ssn);
1440         priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK;
1441         memcpy(&sta_cmd, &priv->stations[sta_id].sta, sizeof(struct iwl_addsta_cmd));
1442         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
1443
1444         return iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC);
1445 }
1446
1447 int iwl_sta_rx_agg_stop(struct iwl_priv *priv, struct ieee80211_sta *sta,
1448                         int tid)
1449 {
1450         unsigned long flags;
1451         int sta_id;
1452         struct iwl_addsta_cmd sta_cmd;
1453
1454         lockdep_assert_held(&priv->shrd->mutex);
1455
1456         sta_id = iwl_sta_id(sta);
1457         if (sta_id == IWL_INVALID_STATION) {
1458                 IWL_ERR(priv, "Invalid station for AGG tid %d\n", tid);
1459                 return -ENXIO;
1460         }
1461
1462         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
1463         priv->stations[sta_id].sta.station_flags_msk = 0;
1464         priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_DELBA_TID_MSK;
1465         priv->stations[sta_id].sta.remove_immediate_ba_tid = (u8)tid;
1466         priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK;
1467         memcpy(&sta_cmd, &priv->stations[sta_id].sta, sizeof(struct iwl_addsta_cmd));
1468         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
1469
1470         return iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC);
1471 }
1472
1473 static void iwl_sta_modify_ps_wake(struct iwl_priv *priv, int sta_id)
1474 {
1475         unsigned long flags;
1476
1477         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
1478         priv->stations[sta_id].sta.station_flags &= ~STA_FLG_PWR_SAVE_MSK;
1479         priv->stations[sta_id].sta.station_flags_msk = STA_FLG_PWR_SAVE_MSK;
1480         priv->stations[sta_id].sta.sta.modify_mask = 0;
1481         priv->stations[sta_id].sta.sleep_tx_count = 0;
1482         priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK;
1483         iwl_send_add_sta(priv, &priv->stations[sta_id].sta, CMD_ASYNC);
1484         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
1485
1486 }
1487
1488 void iwl_sta_modify_sleep_tx_count(struct iwl_priv *priv, int sta_id, int cnt)
1489 {
1490         unsigned long flags;
1491
1492         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
1493         priv->stations[sta_id].sta.station_flags |= STA_FLG_PWR_SAVE_MSK;
1494         priv->stations[sta_id].sta.station_flags_msk = STA_FLG_PWR_SAVE_MSK;
1495         priv->stations[sta_id].sta.sta.modify_mask =
1496                                         STA_MODIFY_SLEEP_TX_COUNT_MSK;
1497         priv->stations[sta_id].sta.sleep_tx_count = cpu_to_le16(cnt);
1498         priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK;
1499         iwl_send_add_sta(priv, &priv->stations[sta_id].sta, CMD_ASYNC);
1500         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
1501
1502 }
1503
1504 void iwlagn_mac_sta_notify(struct ieee80211_hw *hw,
1505                            struct ieee80211_vif *vif,
1506                            enum sta_notify_cmd cmd,
1507                            struct ieee80211_sta *sta)
1508 {
1509         struct iwl_priv *priv = hw->priv;
1510         struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
1511         int sta_id;
1512
1513         IWL_DEBUG_MAC80211(priv, "enter\n");
1514
1515         switch (cmd) {
1516         case STA_NOTIFY_SLEEP:
1517                 WARN_ON(!sta_priv->client);
1518                 sta_priv->asleep = true;
1519                 if (atomic_read(&sta_priv->pending_frames) > 0)
1520                         ieee80211_sta_block_awake(hw, sta, true);
1521                 break;
1522         case STA_NOTIFY_AWAKE:
1523                 WARN_ON(!sta_priv->client);
1524                 if (!sta_priv->asleep)
1525                         break;
1526                 sta_priv->asleep = false;
1527                 sta_id = iwl_sta_id(sta);
1528                 if (sta_id != IWL_INVALID_STATION)
1529                         iwl_sta_modify_ps_wake(priv, sta_id);
1530                 break;
1531         default:
1532                 break;
1533         }
1534         IWL_DEBUG_MAC80211(priv, "leave\n");
1535 }