Merge branch 'rmobile-fixes-for-linus' of git://github.com/pmundt/linux-sh
[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         struct iwl_link_quality_cmd lq;
567         unsigned long flags_spin;
568         int i;
569         bool found = false;
570         int ret;
571         bool send_lq;
572
573         if (!iwl_is_ready(priv->shrd)) {
574                 IWL_DEBUG_INFO(priv,
575                                "Not ready yet, not restoring any stations.\n");
576                 return;
577         }
578
579         IWL_DEBUG_ASSOC(priv, "Restoring all known stations ... start.\n");
580         spin_lock_irqsave(&priv->shrd->sta_lock, flags_spin);
581         for (i = 0; i < IWLAGN_STATION_COUNT; i++) {
582                 if (ctx->ctxid != priv->stations[i].ctxid)
583                         continue;
584                 if ((priv->stations[i].used & IWL_STA_DRIVER_ACTIVE) &&
585                             !(priv->stations[i].used & IWL_STA_UCODE_ACTIVE)) {
586                         IWL_DEBUG_ASSOC(priv, "Restoring sta %pM\n",
587                                         priv->stations[i].sta.sta.addr);
588                         priv->stations[i].sta.mode = 0;
589                         priv->stations[i].used |= IWL_STA_UCODE_INPROGRESS;
590                         found = true;
591                 }
592         }
593
594         for (i = 0; i < IWLAGN_STATION_COUNT; i++) {
595                 if ((priv->stations[i].used & IWL_STA_UCODE_INPROGRESS)) {
596                         memcpy(&sta_cmd, &priv->stations[i].sta,
597                                sizeof(struct iwl_addsta_cmd));
598                         send_lq = false;
599                         if (priv->stations[i].lq) {
600                                 if (priv->shrd->wowlan)
601                                         iwl_sta_fill_lq(priv, ctx, i, &lq);
602                                 else
603                                         memcpy(&lq, priv->stations[i].lq,
604                                                sizeof(struct iwl_link_quality_cmd));
605                                 send_lq = true;
606                         }
607                         spin_unlock_irqrestore(&priv->shrd->sta_lock,
608                                                flags_spin);
609                         ret = iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC);
610                         if (ret) {
611                                 spin_lock_irqsave(&priv->shrd->sta_lock,
612                                                   flags_spin);
613                                 IWL_ERR(priv, "Adding station %pM failed.\n",
614                                         priv->stations[i].sta.sta.addr);
615                                 priv->stations[i].used &=
616                                                 ~IWL_STA_DRIVER_ACTIVE;
617                                 priv->stations[i].used &=
618                                                 ~IWL_STA_UCODE_INPROGRESS;
619                                 spin_unlock_irqrestore(&priv->shrd->sta_lock,
620                                                        flags_spin);
621                         }
622                         /*
623                          * Rate scaling has already been initialized, send
624                          * current LQ command
625                          */
626                         if (send_lq)
627                                 iwl_send_lq_cmd(priv, ctx, &lq,
628                                                 CMD_SYNC, true);
629                         spin_lock_irqsave(&priv->shrd->sta_lock, flags_spin);
630                         priv->stations[i].used &= ~IWL_STA_UCODE_INPROGRESS;
631                 }
632         }
633
634         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags_spin);
635         if (!found)
636                 IWL_DEBUG_INFO(priv, "Restoring all known stations .... "
637                         "no stations to be restored.\n");
638         else
639                 IWL_DEBUG_INFO(priv, "Restoring all known stations .... "
640                         "complete.\n");
641 }
642
643 void iwl_reprogram_ap_sta(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
644 {
645         unsigned long flags;
646         int sta_id = ctx->ap_sta_id;
647         int ret;
648         struct iwl_addsta_cmd sta_cmd;
649         struct iwl_link_quality_cmd lq;
650         bool active;
651
652         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
653         if (!(priv->stations[sta_id].used & IWL_STA_DRIVER_ACTIVE)) {
654                 spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
655                 return;
656         }
657
658         memcpy(&sta_cmd, &priv->stations[sta_id].sta, sizeof(sta_cmd));
659         sta_cmd.mode = 0;
660         memcpy(&lq, priv->stations[sta_id].lq, sizeof(lq));
661
662         active = priv->stations[sta_id].used & IWL_STA_UCODE_ACTIVE;
663         priv->stations[sta_id].used &= ~IWL_STA_DRIVER_ACTIVE;
664         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
665
666         if (active) {
667                 ret = iwl_send_remove_station(
668                         priv, priv->stations[sta_id].sta.sta.addr,
669                         sta_id, true);
670                 if (ret)
671                         IWL_ERR(priv, "failed to remove STA %pM (%d)\n",
672                                 priv->stations[sta_id].sta.sta.addr, ret);
673         }
674         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
675         priv->stations[sta_id].used |= IWL_STA_DRIVER_ACTIVE;
676         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
677
678         ret = iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC);
679         if (ret)
680                 IWL_ERR(priv, "failed to re-add STA %pM (%d)\n",
681                         priv->stations[sta_id].sta.sta.addr, ret);
682         iwl_send_lq_cmd(priv, ctx, &lq, CMD_SYNC, true);
683 }
684
685 int iwl_get_free_ucode_key_offset(struct iwl_priv *priv)
686 {
687         int i;
688
689         for (i = 0; i < priv->sta_key_max_num; i++)
690                 if (!test_and_set_bit(i, &priv->ucode_key_table))
691                         return i;
692
693         return WEP_INVALID_OFFSET;
694 }
695
696 void iwl_dealloc_bcast_stations(struct iwl_priv *priv)
697 {
698         unsigned long flags;
699         int i;
700
701         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
702         for (i = 0; i < IWLAGN_STATION_COUNT; i++) {
703                 if (!(priv->stations[i].used & IWL_STA_BCAST))
704                         continue;
705
706                 priv->stations[i].used &= ~IWL_STA_UCODE_ACTIVE;
707                 priv->num_stations--;
708                 if (WARN_ON(priv->num_stations < 0))
709                         priv->num_stations = 0;
710                 kfree(priv->stations[i].lq);
711                 priv->stations[i].lq = NULL;
712         }
713         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
714 }
715
716 #ifdef CONFIG_IWLWIFI_DEBUG
717 static void iwl_dump_lq_cmd(struct iwl_priv *priv,
718                            struct iwl_link_quality_cmd *lq)
719 {
720         int i;
721         IWL_DEBUG_RATE(priv, "lq station id 0x%x\n", lq->sta_id);
722         IWL_DEBUG_RATE(priv, "lq ant 0x%X 0x%X\n",
723                        lq->general_params.single_stream_ant_msk,
724                        lq->general_params.dual_stream_ant_msk);
725
726         for (i = 0; i < LINK_QUAL_MAX_RETRY_NUM; i++)
727                 IWL_DEBUG_RATE(priv, "lq index %d 0x%X\n",
728                                i, lq->rs_table[i].rate_n_flags);
729 }
730 #else
731 static inline void iwl_dump_lq_cmd(struct iwl_priv *priv,
732                                    struct iwl_link_quality_cmd *lq)
733 {
734 }
735 #endif
736
737 /**
738  * is_lq_table_valid() - Test one aspect of LQ cmd for validity
739  *
740  * It sometimes happens when a HT rate has been in use and we
741  * loose connectivity with AP then mac80211 will first tell us that the
742  * current channel is not HT anymore before removing the station. In such a
743  * scenario the RXON flags will be updated to indicate we are not
744  * communicating HT anymore, but the LQ command may still contain HT rates.
745  * Test for this to prevent driver from sending LQ command between the time
746  * RXON flags are updated and when LQ command is updated.
747  */
748 static bool is_lq_table_valid(struct iwl_priv *priv,
749                               struct iwl_rxon_context *ctx,
750                               struct iwl_link_quality_cmd *lq)
751 {
752         int i;
753
754         if (ctx->ht.enabled)
755                 return true;
756
757         IWL_DEBUG_INFO(priv, "Channel %u is not an HT channel\n",
758                        ctx->active.channel);
759         for (i = 0; i < LINK_QUAL_MAX_RETRY_NUM; i++) {
760                 if (le32_to_cpu(lq->rs_table[i].rate_n_flags) &
761                     RATE_MCS_HT_MSK) {
762                         IWL_DEBUG_INFO(priv,
763                                        "index %d of LQ expects HT channel\n",
764                                        i);
765                         return false;
766                 }
767         }
768         return true;
769 }
770
771 /**
772  * iwl_send_lq_cmd() - Send link quality command
773  * @init: This command is sent as part of station initialization right
774  *        after station has been added.
775  *
776  * The link quality command is sent as the last step of station creation.
777  * This is the special case in which init is set and we call a callback in
778  * this case to clear the state indicating that station creation is in
779  * progress.
780  */
781 int iwl_send_lq_cmd(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
782                     struct iwl_link_quality_cmd *lq, u8 flags, bool init)
783 {
784         int ret = 0;
785         unsigned long flags_spin;
786
787         struct iwl_host_cmd cmd = {
788                 .id = REPLY_TX_LINK_QUALITY_CMD,
789                 .len = { sizeof(struct iwl_link_quality_cmd), },
790                 .flags = flags,
791                 .data = { lq, },
792         };
793
794         if (WARN_ON(lq->sta_id == IWL_INVALID_STATION))
795                 return -EINVAL;
796
797
798         spin_lock_irqsave(&priv->shrd->sta_lock, flags_spin);
799         if (!(priv->stations[lq->sta_id].used & IWL_STA_DRIVER_ACTIVE)) {
800                 spin_unlock_irqrestore(&priv->shrd->sta_lock, flags_spin);
801                 return -EINVAL;
802         }
803         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags_spin);
804
805         iwl_dump_lq_cmd(priv, lq);
806         if (WARN_ON(init && (cmd.flags & CMD_ASYNC)))
807                 return -EINVAL;
808
809         if (is_lq_table_valid(priv, ctx, lq))
810                 ret = iwl_trans_send_cmd(trans(priv), &cmd);
811         else
812                 ret = -EINVAL;
813
814         if (cmd.flags & CMD_ASYNC)
815                 return ret;
816
817         if (init) {
818                 IWL_DEBUG_INFO(priv, "init LQ command complete, "
819                                "clearing sta addition status for sta %d\n",
820                                lq->sta_id);
821                 spin_lock_irqsave(&priv->shrd->sta_lock, flags_spin);
822                 priv->stations[lq->sta_id].used &= ~IWL_STA_UCODE_INPROGRESS;
823                 spin_unlock_irqrestore(&priv->shrd->sta_lock, flags_spin);
824         }
825         return ret;
826 }
827
828 int iwlagn_mac_sta_remove(struct ieee80211_hw *hw,
829                        struct ieee80211_vif *vif,
830                        struct ieee80211_sta *sta)
831 {
832         struct iwl_priv *priv = hw->priv;
833         struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
834         int ret;
835
836         IWL_DEBUG_MAC80211(priv, "enter: received request to remove "
837                            "station %pM\n", sta->addr);
838         mutex_lock(&priv->shrd->mutex);
839         IWL_DEBUG_INFO(priv, "proceeding to remove station %pM\n",
840                         sta->addr);
841         ret = iwl_remove_station(priv, sta_priv->sta_id, sta->addr);
842         if (ret)
843                 IWL_ERR(priv, "Error removing station %pM\n",
844                         sta->addr);
845         mutex_unlock(&priv->shrd->mutex);
846         IWL_DEBUG_MAC80211(priv, "leave\n");
847
848         return ret;
849 }
850
851 void iwl_sta_fill_lq(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
852                      u8 sta_id, struct iwl_link_quality_cmd *link_cmd)
853 {
854         int i, r;
855         u32 rate_flags = 0;
856         __le32 rate_n_flags;
857
858         lockdep_assert_held(&priv->shrd->mutex);
859
860         memset(link_cmd, 0, sizeof(*link_cmd));
861
862         /* Set up the rate scaling to start at selected rate, fall back
863          * all the way down to 1M in IEEE order, and then spin on 1M */
864         if (priv->band == IEEE80211_BAND_5GHZ)
865                 r = IWL_RATE_6M_INDEX;
866         else if (ctx && ctx->vif && ctx->vif->p2p)
867                 r = IWL_RATE_6M_INDEX;
868         else
869                 r = IWL_RATE_1M_INDEX;
870
871         if (r >= IWL_FIRST_CCK_RATE && r <= IWL_LAST_CCK_RATE)
872                 rate_flags |= RATE_MCS_CCK_MSK;
873
874         rate_flags |= first_antenna(hw_params(priv).valid_tx_ant) <<
875                                 RATE_MCS_ANT_POS;
876         rate_n_flags = iwl_hw_set_rate_n_flags(iwl_rates[r].plcp, rate_flags);
877         for (i = 0; i < LINK_QUAL_MAX_RETRY_NUM; i++)
878                 link_cmd->rs_table[i].rate_n_flags = rate_n_flags;
879
880         link_cmd->general_params.single_stream_ant_msk =
881                         first_antenna(hw_params(priv).valid_tx_ant);
882
883         link_cmd->general_params.dual_stream_ant_msk =
884                 hw_params(priv).valid_tx_ant &
885                 ~first_antenna(hw_params(priv).valid_tx_ant);
886         if (!link_cmd->general_params.dual_stream_ant_msk) {
887                 link_cmd->general_params.dual_stream_ant_msk = ANT_AB;
888         } else if (num_of_ant(hw_params(priv).valid_tx_ant) == 2) {
889                 link_cmd->general_params.dual_stream_ant_msk =
890                         hw_params(priv).valid_tx_ant;
891         }
892
893         link_cmd->agg_params.agg_dis_start_th =
894                 LINK_QUAL_AGG_DISABLE_START_DEF;
895         link_cmd->agg_params.agg_time_limit =
896                 cpu_to_le16(LINK_QUAL_AGG_TIME_LIMIT_DEF);
897
898         link_cmd->sta_id = sta_id;
899 }
900
901 static struct iwl_link_quality_cmd *
902 iwl_sta_alloc_lq(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
903                  u8 sta_id)
904 {
905         struct iwl_link_quality_cmd *link_cmd;
906
907         link_cmd = kzalloc(sizeof(struct iwl_link_quality_cmd), GFP_KERNEL);
908         if (!link_cmd) {
909                 IWL_ERR(priv, "Unable to allocate memory for LQ cmd.\n");
910                 return NULL;
911         }
912
913         iwl_sta_fill_lq(priv, ctx, sta_id, link_cmd);
914
915         return link_cmd;
916 }
917
918 /*
919  * iwlagn_add_bssid_station - Add the special IBSS BSSID station
920  *
921  * Function sleeps.
922  */
923 int iwlagn_add_bssid_station(struct iwl_priv *priv,
924                              struct iwl_rxon_context *ctx,
925                              const u8 *addr, u8 *sta_id_r)
926 {
927         int ret;
928         u8 sta_id;
929         struct iwl_link_quality_cmd *link_cmd;
930         unsigned long flags;
931
932         if (sta_id_r)
933                 *sta_id_r = IWL_INVALID_STATION;
934
935         ret = iwl_add_station_common(priv, ctx, addr, 0, NULL, &sta_id);
936         if (ret) {
937                 IWL_ERR(priv, "Unable to add station %pM\n", addr);
938                 return ret;
939         }
940
941         if (sta_id_r)
942                 *sta_id_r = sta_id;
943
944         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
945         priv->stations[sta_id].used |= IWL_STA_LOCAL;
946         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
947
948         /* Set up default rate scaling table in device's station table */
949         link_cmd = iwl_sta_alloc_lq(priv, ctx, sta_id);
950         if (!link_cmd) {
951                 IWL_ERR(priv,
952                         "Unable to initialize rate scaling for station %pM.\n",
953                         addr);
954                 return -ENOMEM;
955         }
956
957         ret = iwl_send_lq_cmd(priv, ctx, link_cmd, CMD_SYNC, true);
958         if (ret)
959                 IWL_ERR(priv, "Link quality command failed (%d)\n", ret);
960
961         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
962         priv->stations[sta_id].lq = link_cmd;
963         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
964
965         return 0;
966 }
967
968 /*
969  * static WEP keys
970  *
971  * For each context, the device has a table of 4 static WEP keys
972  * (one for each key index) that is updated with the following
973  * commands.
974  */
975
976 static int iwl_send_static_wepkey_cmd(struct iwl_priv *priv,
977                                       struct iwl_rxon_context *ctx,
978                                       bool send_if_empty)
979 {
980         int i, not_empty = 0;
981         u8 buff[sizeof(struct iwl_wep_cmd) +
982                 sizeof(struct iwl_wep_key) * WEP_KEYS_MAX];
983         struct iwl_wep_cmd *wep_cmd = (struct iwl_wep_cmd *)buff;
984         size_t cmd_size  = sizeof(struct iwl_wep_cmd);
985         struct iwl_host_cmd cmd = {
986                 .id = ctx->wep_key_cmd,
987                 .data = { wep_cmd, },
988                 .flags = CMD_SYNC,
989         };
990
991         might_sleep();
992
993         memset(wep_cmd, 0, cmd_size +
994                         (sizeof(struct iwl_wep_key) * WEP_KEYS_MAX));
995
996         for (i = 0; i < WEP_KEYS_MAX ; i++) {
997                 wep_cmd->key[i].key_index = i;
998                 if (ctx->wep_keys[i].key_size) {
999                         wep_cmd->key[i].key_offset = i;
1000                         not_empty = 1;
1001                 } else {
1002                         wep_cmd->key[i].key_offset = WEP_INVALID_OFFSET;
1003                 }
1004
1005                 wep_cmd->key[i].key_size = ctx->wep_keys[i].key_size;
1006                 memcpy(&wep_cmd->key[i].key[3], ctx->wep_keys[i].key,
1007                                 ctx->wep_keys[i].key_size);
1008         }
1009
1010         wep_cmd->global_key_type = WEP_KEY_WEP_TYPE;
1011         wep_cmd->num_keys = WEP_KEYS_MAX;
1012
1013         cmd_size += sizeof(struct iwl_wep_key) * WEP_KEYS_MAX;
1014
1015         cmd.len[0] = cmd_size;
1016
1017         if (not_empty || send_if_empty)
1018                 return iwl_trans_send_cmd(trans(priv), &cmd);
1019         else
1020                 return 0;
1021 }
1022
1023 int iwl_restore_default_wep_keys(struct iwl_priv *priv,
1024                                  struct iwl_rxon_context *ctx)
1025 {
1026         lockdep_assert_held(&priv->shrd->mutex);
1027
1028         return iwl_send_static_wepkey_cmd(priv, ctx, false);
1029 }
1030
1031 int iwl_remove_default_wep_key(struct iwl_priv *priv,
1032                                struct iwl_rxon_context *ctx,
1033                                struct ieee80211_key_conf *keyconf)
1034 {
1035         int ret;
1036
1037         lockdep_assert_held(&priv->shrd->mutex);
1038
1039         IWL_DEBUG_WEP(priv, "Removing default WEP key: idx=%d\n",
1040                       keyconf->keyidx);
1041
1042         memset(&ctx->wep_keys[keyconf->keyidx], 0, sizeof(ctx->wep_keys[0]));
1043         if (iwl_is_rfkill(priv->shrd)) {
1044                 IWL_DEBUG_WEP(priv,
1045                         "Not sending REPLY_WEPKEY command due to RFKILL.\n");
1046                 /* but keys in device are clear anyway so return success */
1047                 return 0;
1048         }
1049         ret = iwl_send_static_wepkey_cmd(priv, ctx, 1);
1050         IWL_DEBUG_WEP(priv, "Remove default WEP key: idx=%d ret=%d\n",
1051                       keyconf->keyidx, ret);
1052
1053         return ret;
1054 }
1055
1056 int iwl_set_default_wep_key(struct iwl_priv *priv,
1057                             struct iwl_rxon_context *ctx,
1058                             struct ieee80211_key_conf *keyconf)
1059 {
1060         int ret;
1061
1062         lockdep_assert_held(&priv->shrd->mutex);
1063
1064         if (keyconf->keylen != WEP_KEY_LEN_128 &&
1065             keyconf->keylen != WEP_KEY_LEN_64) {
1066                 IWL_DEBUG_WEP(priv,
1067                               "Bad WEP key length %d\n", keyconf->keylen);
1068                 return -EINVAL;
1069         }
1070
1071         keyconf->hw_key_idx = IWLAGN_HW_KEY_DEFAULT;
1072
1073         ctx->wep_keys[keyconf->keyidx].key_size = keyconf->keylen;
1074         memcpy(&ctx->wep_keys[keyconf->keyidx].key, &keyconf->key,
1075                                                         keyconf->keylen);
1076
1077         ret = iwl_send_static_wepkey_cmd(priv, ctx, false);
1078         IWL_DEBUG_WEP(priv, "Set default WEP key: len=%d idx=%d ret=%d\n",
1079                 keyconf->keylen, keyconf->keyidx, ret);
1080
1081         return ret;
1082 }
1083
1084 /*
1085  * dynamic (per-station) keys
1086  *
1087  * The dynamic keys are a little more complicated. The device has
1088  * a key cache of up to STA_KEY_MAX_NUM/STA_KEY_MAX_NUM_PAN keys.
1089  * These are linked to stations by a table that contains an index
1090  * into the key table for each station/key index/{mcast,unicast},
1091  * i.e. it's basically an array of pointers like this:
1092  *      key_offset_t key_mapping[NUM_STATIONS][4][2];
1093  * (it really works differently, but you can think of it as such)
1094  *
1095  * The key uploading and linking happens in the same command, the
1096  * add station command with STA_MODIFY_KEY_MASK.
1097  */
1098
1099 static u8 iwlagn_key_sta_id(struct iwl_priv *priv,
1100                             struct ieee80211_vif *vif,
1101                             struct ieee80211_sta *sta)
1102 {
1103         struct iwl_vif_priv *vif_priv = (void *)vif->drv_priv;
1104         u8 sta_id = IWL_INVALID_STATION;
1105
1106         if (sta)
1107                 sta_id = iwl_sta_id(sta);
1108
1109         /*
1110          * The device expects GTKs for station interfaces to be
1111          * installed as GTKs for the AP station. If we have no
1112          * station ID, then use the ap_sta_id in that case.
1113          */
1114         if (!sta && vif && vif_priv->ctx) {
1115                 switch (vif->type) {
1116                 case NL80211_IFTYPE_STATION:
1117                         sta_id = vif_priv->ctx->ap_sta_id;
1118                         break;
1119                 default:
1120                         /*
1121                          * In all other cases, the key will be
1122                          * used either for TX only or is bound
1123                          * to a station already.
1124                          */
1125                         break;
1126                 }
1127         }
1128
1129         return sta_id;
1130 }
1131
1132 static int iwlagn_send_sta_key(struct iwl_priv *priv,
1133                                struct ieee80211_key_conf *keyconf,
1134                                u8 sta_id, u32 tkip_iv32, u16 *tkip_p1k,
1135                                u32 cmd_flags)
1136 {
1137         unsigned long flags;
1138         __le16 key_flags;
1139         struct iwl_addsta_cmd sta_cmd;
1140         int i;
1141
1142         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
1143         memcpy(&sta_cmd, &priv->stations[sta_id].sta, sizeof(sta_cmd));
1144         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
1145
1146         key_flags = cpu_to_le16(keyconf->keyidx << STA_KEY_FLG_KEYID_POS);
1147         key_flags |= STA_KEY_FLG_MAP_KEY_MSK;
1148
1149         switch (keyconf->cipher) {
1150         case WLAN_CIPHER_SUITE_CCMP:
1151                 key_flags |= STA_KEY_FLG_CCMP;
1152                 memcpy(sta_cmd.key.key, keyconf->key, keyconf->keylen);
1153                 break;
1154         case WLAN_CIPHER_SUITE_TKIP:
1155                 key_flags |= STA_KEY_FLG_TKIP;
1156                 sta_cmd.key.tkip_rx_tsc_byte2 = tkip_iv32;
1157                 for (i = 0; i < 5; i++)
1158                         sta_cmd.key.tkip_rx_ttak[i] = cpu_to_le16(tkip_p1k[i]);
1159                 memcpy(sta_cmd.key.key, keyconf->key, keyconf->keylen);
1160                 break;
1161         case WLAN_CIPHER_SUITE_WEP104:
1162                 key_flags |= STA_KEY_FLG_KEY_SIZE_MSK;
1163                 /* fall through */
1164         case WLAN_CIPHER_SUITE_WEP40:
1165                 key_flags |= STA_KEY_FLG_WEP;
1166                 memcpy(&sta_cmd.key.key[3], keyconf->key, keyconf->keylen);
1167                 break;
1168         default:
1169                 WARN_ON(1);
1170                 return -EINVAL;
1171         }
1172
1173         if (!(keyconf->flags & IEEE80211_KEY_FLAG_PAIRWISE))
1174                 key_flags |= STA_KEY_MULTICAST_MSK;
1175
1176         /* key pointer (offset) */
1177         sta_cmd.key.key_offset = keyconf->hw_key_idx;
1178
1179         sta_cmd.key.key_flags = key_flags;
1180         sta_cmd.mode = STA_CONTROL_MODIFY_MSK;
1181         sta_cmd.sta.modify_mask = STA_MODIFY_KEY_MASK;
1182
1183         return iwl_send_add_sta(priv, &sta_cmd, cmd_flags);
1184 }
1185
1186 void iwl_update_tkip_key(struct iwl_priv *priv,
1187                          struct ieee80211_vif *vif,
1188                          struct ieee80211_key_conf *keyconf,
1189                          struct ieee80211_sta *sta, u32 iv32, u16 *phase1key)
1190 {
1191         u8 sta_id = iwlagn_key_sta_id(priv, vif, sta);
1192
1193         if (sta_id == IWL_INVALID_STATION)
1194                 return;
1195
1196         if (iwl_scan_cancel(priv)) {
1197                 /* cancel scan failed, just live w/ bad key and rely
1198                    briefly on SW decryption */
1199                 return;
1200         }
1201
1202         iwlagn_send_sta_key(priv, keyconf, sta_id,
1203                             iv32, phase1key, CMD_ASYNC);
1204 }
1205
1206 int iwl_remove_dynamic_key(struct iwl_priv *priv,
1207                            struct iwl_rxon_context *ctx,
1208                            struct ieee80211_key_conf *keyconf,
1209                            struct ieee80211_sta *sta)
1210 {
1211         unsigned long flags;
1212         struct iwl_addsta_cmd sta_cmd;
1213         u8 sta_id = iwlagn_key_sta_id(priv, ctx->vif, sta);
1214
1215         /* if station isn't there, neither is the key */
1216         if (sta_id == IWL_INVALID_STATION)
1217                 return -ENOENT;
1218
1219         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
1220         memcpy(&sta_cmd, &priv->stations[sta_id].sta, sizeof(sta_cmd));
1221         if (!(priv->stations[sta_id].used & IWL_STA_UCODE_ACTIVE))
1222                 sta_id = IWL_INVALID_STATION;
1223         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
1224
1225         if (sta_id == IWL_INVALID_STATION)
1226                 return 0;
1227
1228         lockdep_assert_held(&priv->shrd->mutex);
1229
1230         ctx->key_mapping_keys--;
1231
1232         IWL_DEBUG_WEP(priv, "Remove dynamic key: idx=%d sta=%d\n",
1233                       keyconf->keyidx, sta_id);
1234
1235         if (!test_and_clear_bit(keyconf->hw_key_idx, &priv->ucode_key_table))
1236                 IWL_ERR(priv, "offset %d not used in uCode key table.\n",
1237                         keyconf->hw_key_idx);
1238
1239         sta_cmd.key.key_flags = STA_KEY_FLG_NO_ENC | STA_KEY_FLG_INVALID;
1240         sta_cmd.key.key_offset = WEP_INVALID_OFFSET;
1241         sta_cmd.sta.modify_mask = STA_MODIFY_KEY_MASK;
1242         sta_cmd.mode = STA_CONTROL_MODIFY_MSK;
1243
1244         return iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC);
1245 }
1246
1247 int iwl_set_dynamic_key(struct iwl_priv *priv,
1248                         struct iwl_rxon_context *ctx,
1249                         struct ieee80211_key_conf *keyconf,
1250                         struct ieee80211_sta *sta)
1251 {
1252         struct ieee80211_key_seq seq;
1253         u16 p1k[5];
1254         int ret;
1255         u8 sta_id = iwlagn_key_sta_id(priv, ctx->vif, sta);
1256         const u8 *addr;
1257
1258         if (sta_id == IWL_INVALID_STATION)
1259                 return -EINVAL;
1260
1261         lockdep_assert_held(&priv->shrd->mutex);
1262
1263         keyconf->hw_key_idx = iwl_get_free_ucode_key_offset(priv);
1264         if (keyconf->hw_key_idx == WEP_INVALID_OFFSET)
1265                 return -ENOSPC;
1266
1267         ctx->key_mapping_keys++;
1268
1269         switch (keyconf->cipher) {
1270         case WLAN_CIPHER_SUITE_TKIP:
1271                 if (sta)
1272                         addr = sta->addr;
1273                 else /* station mode case only */
1274                         addr = ctx->active.bssid_addr;
1275
1276                 /* pre-fill phase 1 key into device cache */
1277                 ieee80211_get_key_rx_seq(keyconf, 0, &seq);
1278                 ieee80211_get_tkip_rx_p1k(keyconf, addr, seq.tkip.iv32, p1k);
1279                 ret = iwlagn_send_sta_key(priv, keyconf, sta_id,
1280                                           seq.tkip.iv32, p1k, CMD_SYNC);
1281                 break;
1282         case WLAN_CIPHER_SUITE_CCMP:
1283         case WLAN_CIPHER_SUITE_WEP40:
1284         case WLAN_CIPHER_SUITE_WEP104:
1285                 ret = iwlagn_send_sta_key(priv, keyconf, sta_id,
1286                                           0, NULL, CMD_SYNC);
1287                 break;
1288         default:
1289                 IWL_ERR(priv, "Unknown cipher %x\n", keyconf->cipher);
1290                 ret = -EINVAL;
1291         }
1292
1293         if (ret) {
1294                 ctx->key_mapping_keys--;
1295                 clear_bit(keyconf->hw_key_idx, &priv->ucode_key_table);
1296         }
1297
1298         IWL_DEBUG_WEP(priv, "Set dynamic key: cipher=%x len=%d idx=%d sta=%pM ret=%d\n",
1299                       keyconf->cipher, keyconf->keylen, keyconf->keyidx,
1300                       sta ? sta->addr : NULL, ret);
1301
1302         return ret;
1303 }
1304
1305 /**
1306  * iwlagn_alloc_bcast_station - add broadcast station into driver's station table.
1307  *
1308  * This adds the broadcast station into the driver's station table
1309  * and marks it driver active, so that it will be restored to the
1310  * device at the next best time.
1311  */
1312 int iwlagn_alloc_bcast_station(struct iwl_priv *priv,
1313                                struct iwl_rxon_context *ctx)
1314 {
1315         struct iwl_link_quality_cmd *link_cmd;
1316         unsigned long flags;
1317         u8 sta_id;
1318
1319         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
1320         sta_id = iwl_prep_station(priv, ctx, iwl_bcast_addr, false, NULL);
1321         if (sta_id == IWL_INVALID_STATION) {
1322                 IWL_ERR(priv, "Unable to prepare broadcast station\n");
1323                 spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
1324
1325                 return -EINVAL;
1326         }
1327
1328         priv->stations[sta_id].used |= IWL_STA_DRIVER_ACTIVE;
1329         priv->stations[sta_id].used |= IWL_STA_BCAST;
1330         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
1331
1332         link_cmd = iwl_sta_alloc_lq(priv, ctx, sta_id);
1333         if (!link_cmd) {
1334                 IWL_ERR(priv,
1335                         "Unable to initialize rate scaling for bcast station.\n");
1336                 return -ENOMEM;
1337         }
1338
1339         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
1340         priv->stations[sta_id].lq = link_cmd;
1341         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
1342
1343         return 0;
1344 }
1345
1346 /**
1347  * iwl_update_bcast_station - update broadcast station's LQ command
1348  *
1349  * Only used by iwlagn. Placed here to have all bcast station management
1350  * code together.
1351  */
1352 int iwl_update_bcast_station(struct iwl_priv *priv,
1353                              struct iwl_rxon_context *ctx)
1354 {
1355         unsigned long flags;
1356         struct iwl_link_quality_cmd *link_cmd;
1357         u8 sta_id = ctx->bcast_sta_id;
1358
1359         link_cmd = iwl_sta_alloc_lq(priv, ctx, sta_id);
1360         if (!link_cmd) {
1361                 IWL_ERR(priv, "Unable to initialize rate scaling for bcast station.\n");
1362                 return -ENOMEM;
1363         }
1364
1365         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
1366         if (priv->stations[sta_id].lq)
1367                 kfree(priv->stations[sta_id].lq);
1368         else
1369                 IWL_DEBUG_INFO(priv, "Bcast station rate scaling has not been initialized yet.\n");
1370         priv->stations[sta_id].lq = link_cmd;
1371         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
1372
1373         return 0;
1374 }
1375
1376 int iwl_update_bcast_stations(struct iwl_priv *priv)
1377 {
1378         struct iwl_rxon_context *ctx;
1379         int ret = 0;
1380
1381         for_each_context(priv, ctx) {
1382                 ret = iwl_update_bcast_station(priv, ctx);
1383                 if (ret)
1384                         break;
1385         }
1386
1387         return ret;
1388 }
1389
1390 /**
1391  * iwl_sta_tx_modify_enable_tid - Enable Tx for this TID in station table
1392  */
1393 int iwl_sta_tx_modify_enable_tid(struct iwl_priv *priv, int sta_id, int tid)
1394 {
1395         unsigned long flags;
1396         struct iwl_addsta_cmd sta_cmd;
1397
1398         lockdep_assert_held(&priv->shrd->mutex);
1399
1400         /* Remove "disable" flag, to enable Tx for this TID */
1401         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
1402         priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_TID_DISABLE_TX;
1403         priv->stations[sta_id].sta.tid_disable_tx &= cpu_to_le16(~(1 << tid));
1404         priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK;
1405         memcpy(&sta_cmd, &priv->stations[sta_id].sta, sizeof(struct iwl_addsta_cmd));
1406         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
1407
1408         return iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC);
1409 }
1410
1411 int iwl_sta_rx_agg_start(struct iwl_priv *priv, struct ieee80211_sta *sta,
1412                          int tid, u16 ssn)
1413 {
1414         unsigned long flags;
1415         int sta_id;
1416         struct iwl_addsta_cmd sta_cmd;
1417
1418         lockdep_assert_held(&priv->shrd->mutex);
1419
1420         sta_id = iwl_sta_id(sta);
1421         if (sta_id == IWL_INVALID_STATION)
1422                 return -ENXIO;
1423
1424         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
1425         priv->stations[sta_id].sta.station_flags_msk = 0;
1426         priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_ADDBA_TID_MSK;
1427         priv->stations[sta_id].sta.add_immediate_ba_tid = (u8)tid;
1428         priv->stations[sta_id].sta.add_immediate_ba_ssn = cpu_to_le16(ssn);
1429         priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK;
1430         memcpy(&sta_cmd, &priv->stations[sta_id].sta, sizeof(struct iwl_addsta_cmd));
1431         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
1432
1433         return iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC);
1434 }
1435
1436 int iwl_sta_rx_agg_stop(struct iwl_priv *priv, struct ieee80211_sta *sta,
1437                         int tid)
1438 {
1439         unsigned long flags;
1440         int sta_id;
1441         struct iwl_addsta_cmd sta_cmd;
1442
1443         lockdep_assert_held(&priv->shrd->mutex);
1444
1445         sta_id = iwl_sta_id(sta);
1446         if (sta_id == IWL_INVALID_STATION) {
1447                 IWL_ERR(priv, "Invalid station for AGG tid %d\n", tid);
1448                 return -ENXIO;
1449         }
1450
1451         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
1452         priv->stations[sta_id].sta.station_flags_msk = 0;
1453         priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_DELBA_TID_MSK;
1454         priv->stations[sta_id].sta.remove_immediate_ba_tid = (u8)tid;
1455         priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK;
1456         memcpy(&sta_cmd, &priv->stations[sta_id].sta, sizeof(struct iwl_addsta_cmd));
1457         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
1458
1459         return iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC);
1460 }
1461
1462 static void iwl_sta_modify_ps_wake(struct iwl_priv *priv, int sta_id)
1463 {
1464         unsigned long flags;
1465
1466         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
1467         priv->stations[sta_id].sta.station_flags &= ~STA_FLG_PWR_SAVE_MSK;
1468         priv->stations[sta_id].sta.station_flags_msk = STA_FLG_PWR_SAVE_MSK;
1469         priv->stations[sta_id].sta.sta.modify_mask = 0;
1470         priv->stations[sta_id].sta.sleep_tx_count = 0;
1471         priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK;
1472         iwl_send_add_sta(priv, &priv->stations[sta_id].sta, CMD_ASYNC);
1473         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
1474
1475 }
1476
1477 void iwl_sta_modify_sleep_tx_count(struct iwl_priv *priv, int sta_id, int cnt)
1478 {
1479         unsigned long flags;
1480
1481         spin_lock_irqsave(&priv->shrd->sta_lock, flags);
1482         priv->stations[sta_id].sta.station_flags |= STA_FLG_PWR_SAVE_MSK;
1483         priv->stations[sta_id].sta.station_flags_msk = STA_FLG_PWR_SAVE_MSK;
1484         priv->stations[sta_id].sta.sta.modify_mask =
1485                                         STA_MODIFY_SLEEP_TX_COUNT_MSK;
1486         priv->stations[sta_id].sta.sleep_tx_count = cpu_to_le16(cnt);
1487         priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK;
1488         iwl_send_add_sta(priv, &priv->stations[sta_id].sta, CMD_ASYNC);
1489         spin_unlock_irqrestore(&priv->shrd->sta_lock, flags);
1490
1491 }
1492
1493 void iwlagn_mac_sta_notify(struct ieee80211_hw *hw,
1494                            struct ieee80211_vif *vif,
1495                            enum sta_notify_cmd cmd,
1496                            struct ieee80211_sta *sta)
1497 {
1498         struct iwl_priv *priv = hw->priv;
1499         struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
1500         int sta_id;
1501
1502         IWL_DEBUG_MAC80211(priv, "enter\n");
1503
1504         switch (cmd) {
1505         case STA_NOTIFY_SLEEP:
1506                 WARN_ON(!sta_priv->client);
1507                 sta_priv->asleep = true;
1508                 if (atomic_read(&sta_priv->pending_frames) > 0)
1509                         ieee80211_sta_block_awake(hw, sta, true);
1510                 break;
1511         case STA_NOTIFY_AWAKE:
1512                 WARN_ON(!sta_priv->client);
1513                 if (!sta_priv->asleep)
1514                         break;
1515                 sta_priv->asleep = false;
1516                 sta_id = iwl_sta_id(sta);
1517                 if (sta_id != IWL_INVALID_STATION)
1518                         iwl_sta_modify_ps_wake(priv, sta_id);
1519                 break;
1520         default:
1521                 break;
1522         }
1523         IWL_DEBUG_MAC80211(priv, "leave\n");
1524 }