]> pilppa.org Git - linux-2.6-omap-h63xx.git/blob - drivers/net/wireless/iwlwifi/iwl-agn.c
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
[linux-2.6-omap-h63xx.git] / drivers / net / wireless / iwlwifi / iwl-agn.c
1 /******************************************************************************
2  *
3  * Copyright(c) 2003 - 2009 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 <linux/kernel.h>
31 #include <linux/module.h>
32 #include <linux/init.h>
33 #include <linux/pci.h>
34 #include <linux/dma-mapping.h>
35 #include <linux/delay.h>
36 #include <linux/skbuff.h>
37 #include <linux/netdevice.h>
38 #include <linux/wireless.h>
39 #include <linux/firmware.h>
40 #include <linux/etherdevice.h>
41 #include <linux/if_arp.h>
42
43 #include <net/mac80211.h>
44
45 #include <asm/div64.h>
46
47 #define DRV_NAME        "iwlagn"
48
49 #include "iwl-eeprom.h"
50 #include "iwl-dev.h"
51 #include "iwl-core.h"
52 #include "iwl-io.h"
53 #include "iwl-helpers.h"
54 #include "iwl-sta.h"
55 #include "iwl-calib.h"
56
57
58 /******************************************************************************
59  *
60  * module boiler plate
61  *
62  ******************************************************************************/
63
64 /*
65  * module name, copyright, version, etc.
66  */
67 #define DRV_DESCRIPTION "Intel(R) Wireless WiFi Link AGN driver for Linux"
68
69 #ifdef CONFIG_IWLWIFI_DEBUG
70 #define VD "d"
71 #else
72 #define VD
73 #endif
74
75 #ifdef CONFIG_IWLAGN_SPECTRUM_MEASUREMENT
76 #define VS "s"
77 #else
78 #define VS
79 #endif
80
81 #define DRV_VERSION     IWLWIFI_VERSION VD VS
82
83
84 MODULE_DESCRIPTION(DRV_DESCRIPTION);
85 MODULE_VERSION(DRV_VERSION);
86 MODULE_AUTHOR(DRV_COPYRIGHT " " DRV_AUTHOR);
87 MODULE_LICENSE("GPL");
88 MODULE_ALIAS("iwl4965");
89
90 /*************** STATION TABLE MANAGEMENT ****
91  * mac80211 should be examined to determine if sta_info is duplicating
92  * the functionality provided here
93  */
94
95 /**************************************************************/
96
97
98
99 static void iwl_set_rxon_hwcrypto(struct iwl_priv *priv, int hw_decrypt)
100 {
101         struct iwl_rxon_cmd *rxon = &priv->staging_rxon;
102
103         if (hw_decrypt)
104                 rxon->filter_flags &= ~RXON_FILTER_DIS_DECRYPT_MSK;
105         else
106                 rxon->filter_flags |= RXON_FILTER_DIS_DECRYPT_MSK;
107
108 }
109
110 /**
111  * iwl_full_rxon_required - check if full RXON (vs RXON_ASSOC) cmd is needed
112  * @priv: staging_rxon is compared to active_rxon
113  *
114  * If the RXON structure is changing enough to require a new tune,
115  * or is clearing the RXON_FILTER_ASSOC_MSK, then return 1 to indicate that
116  * a new tune (full RXON command, rather than RXON_ASSOC cmd) is required.
117  */
118 static int iwl_full_rxon_required(struct iwl_priv *priv)
119 {
120
121         /* These items are only settable from the full RXON command */
122         if (!(iwl_is_associated(priv)) ||
123             compare_ether_addr(priv->staging_rxon.bssid_addr,
124                                priv->active_rxon.bssid_addr) ||
125             compare_ether_addr(priv->staging_rxon.node_addr,
126                                priv->active_rxon.node_addr) ||
127             compare_ether_addr(priv->staging_rxon.wlap_bssid_addr,
128                                priv->active_rxon.wlap_bssid_addr) ||
129             (priv->staging_rxon.dev_type != priv->active_rxon.dev_type) ||
130             (priv->staging_rxon.channel != priv->active_rxon.channel) ||
131             (priv->staging_rxon.air_propagation !=
132              priv->active_rxon.air_propagation) ||
133             (priv->staging_rxon.ofdm_ht_single_stream_basic_rates !=
134              priv->active_rxon.ofdm_ht_single_stream_basic_rates) ||
135             (priv->staging_rxon.ofdm_ht_dual_stream_basic_rates !=
136              priv->active_rxon.ofdm_ht_dual_stream_basic_rates) ||
137             (priv->staging_rxon.assoc_id != priv->active_rxon.assoc_id))
138                 return 1;
139
140         /* flags, filter_flags, ofdm_basic_rates, and cck_basic_rates can
141          * be updated with the RXON_ASSOC command -- however only some
142          * flag transitions are allowed using RXON_ASSOC */
143
144         /* Check if we are not switching bands */
145         if ((priv->staging_rxon.flags & RXON_FLG_BAND_24G_MSK) !=
146             (priv->active_rxon.flags & RXON_FLG_BAND_24G_MSK))
147                 return 1;
148
149         /* Check if we are switching association toggle */
150         if ((priv->staging_rxon.filter_flags & RXON_FILTER_ASSOC_MSK) !=
151                 (priv->active_rxon.filter_flags & RXON_FILTER_ASSOC_MSK))
152                 return 1;
153
154         return 0;
155 }
156
157 /**
158  * iwl_commit_rxon - commit staging_rxon to hardware
159  *
160  * The RXON command in staging_rxon is committed to the hardware and
161  * the active_rxon structure is updated with the new data.  This
162  * function correctly transitions out of the RXON_ASSOC_MSK state if
163  * a HW tune is required based on the RXON structure changes.
164  */
165 static int iwl_commit_rxon(struct iwl_priv *priv)
166 {
167         /* cast away the const for active_rxon in this function */
168         struct iwl_rxon_cmd *active_rxon = (void *)&priv->active_rxon;
169         int ret;
170         bool new_assoc =
171                 !!(priv->staging_rxon.filter_flags & RXON_FILTER_ASSOC_MSK);
172
173         if (!iwl_is_alive(priv))
174                 return -EBUSY;
175
176         /* always get timestamp with Rx frame */
177         priv->staging_rxon.flags |= RXON_FLG_TSF2HOST_MSK;
178         /* allow CTS-to-self if possible. this is relevant only for
179          * 5000, but will not damage 4965 */
180         priv->staging_rxon.flags |= RXON_FLG_SELF_CTS_EN;
181
182         ret = iwl_agn_check_rxon_cmd(priv);
183         if (ret) {
184                 IWL_ERR(priv, "Invalid RXON configuration.  Not committing.\n");
185                 return -EINVAL;
186         }
187
188         /* If we don't need to send a full RXON, we can use
189          * iwl_rxon_assoc_cmd which is used to reconfigure filter
190          * and other flags for the current radio configuration. */
191         if (!iwl_full_rxon_required(priv)) {
192                 ret = iwl_send_rxon_assoc(priv);
193                 if (ret) {
194                         IWL_ERR(priv, "Error setting RXON_ASSOC (%d)\n", ret);
195                         return ret;
196                 }
197
198                 memcpy(active_rxon, &priv->staging_rxon, sizeof(*active_rxon));
199                 return 0;
200         }
201
202         /* station table will be cleared */
203         priv->assoc_station_added = 0;
204
205         /* If we are currently associated and the new config requires
206          * an RXON_ASSOC and the new config wants the associated mask enabled,
207          * we must clear the associated from the active configuration
208          * before we apply the new config */
209         if (iwl_is_associated(priv) && new_assoc) {
210                 IWL_DEBUG_INFO("Toggling associated bit on current RXON\n");
211                 active_rxon->filter_flags &= ~RXON_FILTER_ASSOC_MSK;
212
213                 ret = iwl_send_cmd_pdu(priv, REPLY_RXON,
214                                       sizeof(struct iwl_rxon_cmd),
215                                       &priv->active_rxon);
216
217                 /* If the mask clearing failed then we set
218                  * active_rxon back to what it was previously */
219                 if (ret) {
220                         active_rxon->filter_flags |= RXON_FILTER_ASSOC_MSK;
221                         IWL_ERR(priv, "Error clearing ASSOC_MSK (%d)\n", ret);
222                         return ret;
223                 }
224         }
225
226         IWL_DEBUG_INFO("Sending RXON\n"
227                        "* with%s RXON_FILTER_ASSOC_MSK\n"
228                        "* channel = %d\n"
229                        "* bssid = %pM\n",
230                        (new_assoc ? "" : "out"),
231                        le16_to_cpu(priv->staging_rxon.channel),
232                        priv->staging_rxon.bssid_addr);
233
234         iwl_set_rxon_hwcrypto(priv, !priv->hw_params.sw_crypto);
235
236         /* Apply the new configuration
237          * RXON unassoc clears the station table in uCode, send it before
238          * we add the bcast station. If assoc bit is set, we will send RXON
239          * after having added the bcast and bssid station.
240          */
241         if (!new_assoc) {
242                 ret = iwl_send_cmd_pdu(priv, REPLY_RXON,
243                               sizeof(struct iwl_rxon_cmd), &priv->staging_rxon);
244                 if (ret) {
245                         IWL_ERR(priv, "Error setting new RXON (%d)\n", ret);
246                         return ret;
247                 }
248                 memcpy(active_rxon, &priv->staging_rxon, sizeof(*active_rxon));
249         }
250
251         iwl_clear_stations_table(priv);
252
253         if (!priv->error_recovering)
254                 priv->start_calib = 0;
255
256         /* Add the broadcast address so we can send broadcast frames */
257         if (iwl_rxon_add_station(priv, iwl_bcast_addr, 0) ==
258                                                 IWL_INVALID_STATION) {
259                 IWL_ERR(priv, "Error adding BROADCAST address for transmit.\n");
260                 return -EIO;
261         }
262
263         /* If we have set the ASSOC_MSK and we are in BSS mode then
264          * add the IWL_AP_ID to the station rate table */
265         if (new_assoc) {
266                 if (priv->iw_mode == NL80211_IFTYPE_STATION) {
267                         ret = iwl_rxon_add_station(priv,
268                                            priv->active_rxon.bssid_addr, 1);
269                         if (ret == IWL_INVALID_STATION) {
270                                 IWL_ERR(priv,
271                                         "Error adding AP address for TX.\n");
272                                 return -EIO;
273                         }
274                         priv->assoc_station_added = 1;
275                         if (priv->default_wep_key &&
276                             iwl_send_static_wepkey_cmd(priv, 0))
277                                 IWL_ERR(priv,
278                                         "Could not send WEP static key.\n");
279                 }
280
281                 /* Apply the new configuration
282                  * RXON assoc doesn't clear the station table in uCode,
283                  */
284                 ret = iwl_send_cmd_pdu(priv, REPLY_RXON,
285                               sizeof(struct iwl_rxon_cmd), &priv->staging_rxon);
286                 if (ret) {
287                         IWL_ERR(priv, "Error setting new RXON (%d)\n", ret);
288                         return ret;
289                 }
290                 memcpy(active_rxon, &priv->staging_rxon, sizeof(*active_rxon));
291         }
292
293         iwl_init_sensitivity(priv);
294
295         /* If we issue a new RXON command which required a tune then we must
296          * send a new TXPOWER command or we won't be able to Tx any frames */
297         ret = iwl_set_tx_power(priv, priv->tx_power_user_lmt, true);
298         if (ret) {
299                 IWL_ERR(priv, "Error sending TX power (%d)\n", ret);
300                 return ret;
301         }
302
303         return 0;
304 }
305
306 void iwl_update_chain_flags(struct iwl_priv *priv)
307 {
308
309         iwl_set_rxon_chain(priv);
310         iwl_commit_rxon(priv);
311 }
312
313 static void iwl_clear_free_frames(struct iwl_priv *priv)
314 {
315         struct list_head *element;
316
317         IWL_DEBUG_INFO("%d frames on pre-allocated heap on clear.\n",
318                        priv->frames_count);
319
320         while (!list_empty(&priv->free_frames)) {
321                 element = priv->free_frames.next;
322                 list_del(element);
323                 kfree(list_entry(element, struct iwl_frame, list));
324                 priv->frames_count--;
325         }
326
327         if (priv->frames_count) {
328                 IWL_WARN(priv, "%d frames still in use.  Did we lose one?\n",
329                             priv->frames_count);
330                 priv->frames_count = 0;
331         }
332 }
333
334 static struct iwl_frame *iwl_get_free_frame(struct iwl_priv *priv)
335 {
336         struct iwl_frame *frame;
337         struct list_head *element;
338         if (list_empty(&priv->free_frames)) {
339                 frame = kzalloc(sizeof(*frame), GFP_KERNEL);
340                 if (!frame) {
341                         IWL_ERR(priv, "Could not allocate frame!\n");
342                         return NULL;
343                 }
344
345                 priv->frames_count++;
346                 return frame;
347         }
348
349         element = priv->free_frames.next;
350         list_del(element);
351         return list_entry(element, struct iwl_frame, list);
352 }
353
354 static void iwl_free_frame(struct iwl_priv *priv, struct iwl_frame *frame)
355 {
356         memset(frame, 0, sizeof(*frame));
357         list_add(&frame->list, &priv->free_frames);
358 }
359
360 static unsigned int iwl_fill_beacon_frame(struct iwl_priv *priv,
361                                           struct ieee80211_hdr *hdr,
362                                           int left)
363 {
364         if (!iwl_is_associated(priv) || !priv->ibss_beacon ||
365             ((priv->iw_mode != NL80211_IFTYPE_ADHOC) &&
366              (priv->iw_mode != NL80211_IFTYPE_AP)))
367                 return 0;
368
369         if (priv->ibss_beacon->len > left)
370                 return 0;
371
372         memcpy(hdr, priv->ibss_beacon->data, priv->ibss_beacon->len);
373
374         return priv->ibss_beacon->len;
375 }
376
377 static u8 iwl_rate_get_lowest_plcp(struct iwl_priv *priv)
378 {
379         int i;
380         int rate_mask;
381
382         /* Set rate mask*/
383         if (priv->staging_rxon.flags & RXON_FLG_BAND_24G_MSK)
384                 rate_mask = priv->active_rate_basic & IWL_CCK_RATES_MASK;
385         else
386                 rate_mask = priv->active_rate_basic & IWL_OFDM_RATES_MASK;
387
388         /* Find lowest valid rate */
389         for (i = IWL_RATE_1M_INDEX; i != IWL_RATE_INVALID;
390                                         i = iwl_rates[i].next_ieee) {
391                 if (rate_mask & (1 << i))
392                         return iwl_rates[i].plcp;
393         }
394
395         /* No valid rate was found. Assign the lowest one */
396         if (priv->staging_rxon.flags & RXON_FLG_BAND_24G_MSK)
397                 return IWL_RATE_1M_PLCP;
398         else
399                 return IWL_RATE_6M_PLCP;
400 }
401
402 static unsigned int iwl_hw_get_beacon_cmd(struct iwl_priv *priv,
403                                        struct iwl_frame *frame, u8 rate)
404 {
405         struct iwl_tx_beacon_cmd *tx_beacon_cmd;
406         unsigned int frame_size;
407
408         tx_beacon_cmd = &frame->u.beacon;
409         memset(tx_beacon_cmd, 0, sizeof(*tx_beacon_cmd));
410
411         tx_beacon_cmd->tx.sta_id = priv->hw_params.bcast_sta_id;
412         tx_beacon_cmd->tx.stop_time.life_time = TX_CMD_LIFE_TIME_INFINITE;
413
414         frame_size = iwl_fill_beacon_frame(priv, tx_beacon_cmd->frame,
415                                 sizeof(frame->u) - sizeof(*tx_beacon_cmd));
416
417         BUG_ON(frame_size > MAX_MPDU_SIZE);
418         tx_beacon_cmd->tx.len = cpu_to_le16((u16)frame_size);
419
420         if ((rate == IWL_RATE_1M_PLCP) || (rate >= IWL_RATE_2M_PLCP))
421                 tx_beacon_cmd->tx.rate_n_flags =
422                         iwl_hw_set_rate_n_flags(rate, RATE_MCS_CCK_MSK);
423         else
424                 tx_beacon_cmd->tx.rate_n_flags =
425                         iwl_hw_set_rate_n_flags(rate, 0);
426
427         tx_beacon_cmd->tx.tx_flags = TX_CMD_FLG_SEQ_CTL_MSK |
428                                      TX_CMD_FLG_TSF_MSK |
429                                      TX_CMD_FLG_STA_RATE_MSK;
430
431         return sizeof(*tx_beacon_cmd) + frame_size;
432 }
433 static int iwl_send_beacon_cmd(struct iwl_priv *priv)
434 {
435         struct iwl_frame *frame;
436         unsigned int frame_size;
437         int rc;
438         u8 rate;
439
440         frame = iwl_get_free_frame(priv);
441
442         if (!frame) {
443                 IWL_ERR(priv, "Could not obtain free frame buffer for beacon "
444                           "command.\n");
445                 return -ENOMEM;
446         }
447
448         rate = iwl_rate_get_lowest_plcp(priv);
449
450         frame_size = iwl_hw_get_beacon_cmd(priv, frame, rate);
451
452         rc = iwl_send_cmd_pdu(priv, REPLY_TX_BEACON, frame_size,
453                               &frame->u.cmd[0]);
454
455         iwl_free_frame(priv, frame);
456
457         return rc;
458 }
459
460 static inline dma_addr_t iwl_tfd_tb_get_addr(struct iwl_tfd *tfd, u8 idx)
461 {
462         struct iwl_tfd_tb *tb = &tfd->tbs[idx];
463
464         dma_addr_t addr = get_unaligned_le32(&tb->lo);
465         if (sizeof(dma_addr_t) > sizeof(u32))
466                 addr |=
467                 ((dma_addr_t)(le16_to_cpu(tb->hi_n_len) & 0xF) << 16) << 16;
468
469         return addr;
470 }
471
472 static inline u16 iwl_tfd_tb_get_len(struct iwl_tfd *tfd, u8 idx)
473 {
474         struct iwl_tfd_tb *tb = &tfd->tbs[idx];
475
476         return le16_to_cpu(tb->hi_n_len) >> 4;
477 }
478
479 static inline void iwl_tfd_set_tb(struct iwl_tfd *tfd, u8 idx,
480                                   dma_addr_t addr, u16 len)
481 {
482         struct iwl_tfd_tb *tb = &tfd->tbs[idx];
483         u16 hi_n_len = len << 4;
484
485         put_unaligned_le32(addr, &tb->lo);
486         if (sizeof(dma_addr_t) > sizeof(u32))
487                 hi_n_len |= ((addr >> 16) >> 16) & 0xF;
488
489         tb->hi_n_len = cpu_to_le16(hi_n_len);
490
491         tfd->num_tbs = idx + 1;
492 }
493
494 static inline u8 iwl_tfd_get_num_tbs(struct iwl_tfd *tfd)
495 {
496         return tfd->num_tbs & 0x1f;
497 }
498
499 /**
500  * iwl_hw_txq_free_tfd - Free all chunks referenced by TFD [txq->q.read_ptr]
501  * @priv - driver private data
502  * @txq - tx queue
503  *
504  * Does NOT advance any TFD circular buffer read/write indexes
505  * Does NOT free the TFD itself (which is within circular buffer)
506  */
507 void iwl_hw_txq_free_tfd(struct iwl_priv *priv, struct iwl_tx_queue *txq)
508 {
509         struct iwl_tfd *tfd_tmp = (struct iwl_tfd *)txq->tfds;
510         struct iwl_tfd *tfd;
511         struct pci_dev *dev = priv->pci_dev;
512         int index = txq->q.read_ptr;
513         int i;
514         int num_tbs;
515
516         tfd = &tfd_tmp[index];
517
518         /* Sanity check on number of chunks */
519         num_tbs = iwl_tfd_get_num_tbs(tfd);
520
521         if (num_tbs >= IWL_NUM_OF_TBS) {
522                 IWL_ERR(priv, "Too many chunks: %i\n", num_tbs);
523                 /* @todo issue fatal error, it is quite serious situation */
524                 return;
525         }
526
527         /* Unmap tx_cmd */
528         if (num_tbs)
529                 pci_unmap_single(dev,
530                                 pci_unmap_addr(&txq->cmd[index]->meta, mapping),
531                                 pci_unmap_len(&txq->cmd[index]->meta, len),
532                                 PCI_DMA_TODEVICE);
533
534         /* Unmap chunks, if any. */
535         for (i = 1; i < num_tbs; i++) {
536                 pci_unmap_single(dev, iwl_tfd_tb_get_addr(tfd, i),
537                                 iwl_tfd_tb_get_len(tfd, i), PCI_DMA_TODEVICE);
538
539                 if (txq->txb) {
540                         dev_kfree_skb(txq->txb[txq->q.read_ptr].skb[i - 1]);
541                         txq->txb[txq->q.read_ptr].skb[i - 1] = NULL;
542                 }
543         }
544 }
545
546 int iwl_hw_txq_attach_buf_to_tfd(struct iwl_priv *priv,
547                                  struct iwl_tx_queue *txq,
548                                  dma_addr_t addr, u16 len,
549                                  u8 reset, u8 pad)
550 {
551         struct iwl_queue *q;
552         struct iwl_tfd *tfd, *tfd_tmp;
553         u32 num_tbs;
554
555         q = &txq->q;
556         tfd_tmp = (struct iwl_tfd *)txq->tfds;
557         tfd = &tfd_tmp[q->write_ptr];
558
559         if (reset)
560                 memset(tfd, 0, sizeof(*tfd));
561
562         num_tbs = iwl_tfd_get_num_tbs(tfd);
563
564         /* Each TFD can point to a maximum 20 Tx buffers */
565         if (num_tbs >= IWL_NUM_OF_TBS) {
566                 IWL_ERR(priv, "Error can not send more than %d chunks\n",
567                           IWL_NUM_OF_TBS);
568                 return -EINVAL;
569         }
570
571         BUG_ON(addr & ~DMA_BIT_MASK(36));
572         if (unlikely(addr & ~IWL_TX_DMA_MASK))
573                 IWL_ERR(priv, "Unaligned address = %llx\n",
574                           (unsigned long long)addr);
575
576         iwl_tfd_set_tb(tfd, num_tbs, addr, len);
577
578         return 0;
579 }
580
581 /*
582  * Tell nic where to find circular buffer of Tx Frame Descriptors for
583  * given Tx queue, and enable the DMA channel used for that queue.
584  *
585  * 4965 supports up to 16 Tx queues in DRAM, mapped to up to 8 Tx DMA
586  * channels supported in hardware.
587  */
588 int iwl_hw_tx_queue_init(struct iwl_priv *priv,
589                          struct iwl_tx_queue *txq)
590 {
591         int ret;
592         unsigned long flags;
593         int txq_id = txq->q.id;
594
595         spin_lock_irqsave(&priv->lock, flags);
596         ret = iwl_grab_nic_access(priv);
597         if (ret) {
598                 spin_unlock_irqrestore(&priv->lock, flags);
599                 return ret;
600         }
601
602         /* Circular buffer (TFD queue in DRAM) physical base address */
603         iwl_write_direct32(priv, FH_MEM_CBBC_QUEUE(txq_id),
604                              txq->q.dma_addr >> 8);
605
606         iwl_release_nic_access(priv);
607         spin_unlock_irqrestore(&priv->lock, flags);
608
609         return 0;
610 }
611
612
613 /******************************************************************************
614  *
615  * Misc. internal state and helper functions
616  *
617  ******************************************************************************/
618
619 static void iwl_ht_conf(struct iwl_priv *priv,
620                             struct ieee80211_bss_conf *bss_conf)
621 {
622         struct ieee80211_sta_ht_cap *ht_conf;
623         struct iwl_ht_info *iwl_conf = &priv->current_ht_config;
624         struct ieee80211_sta *sta;
625
626         IWL_DEBUG_MAC80211("enter: \n");
627
628         if (!iwl_conf->is_ht)
629                 return;
630
631
632         /*
633          * It is totally wrong to base global information on something
634          * that is valid only when associated, alas, this driver works
635          * that way and I don't know how to fix it.
636          */
637
638         rcu_read_lock();
639         sta = ieee80211_find_sta(priv->hw, priv->bssid);
640         if (!sta) {
641                 rcu_read_unlock();
642                 return;
643         }
644         ht_conf = &sta->ht_cap;
645
646         if (ht_conf->cap & IEEE80211_HT_CAP_SGI_20)
647                 iwl_conf->sgf |= HT_SHORT_GI_20MHZ;
648         if (ht_conf->cap & IEEE80211_HT_CAP_SGI_40)
649                 iwl_conf->sgf |= HT_SHORT_GI_40MHZ;
650
651         iwl_conf->is_green_field = !!(ht_conf->cap & IEEE80211_HT_CAP_GRN_FLD);
652         iwl_conf->max_amsdu_size =
653                 !!(ht_conf->cap & IEEE80211_HT_CAP_MAX_AMSDU);
654
655         iwl_conf->supported_chan_width =
656                 !!(ht_conf->cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40);
657
658         /*
659          * XXX: The HT configuration needs to be moved into iwl_mac_config()
660          *      to be done there correctly.
661          */
662
663         iwl_conf->extension_chan_offset = IEEE80211_HT_PARAM_CHA_SEC_NONE;
664         if (conf_is_ht40_minus(&priv->hw->conf))
665                 iwl_conf->extension_chan_offset = IEEE80211_HT_PARAM_CHA_SEC_BELOW;
666         else if (conf_is_ht40_plus(&priv->hw->conf))
667                 iwl_conf->extension_chan_offset = IEEE80211_HT_PARAM_CHA_SEC_ABOVE;
668
669         /* If no above or below channel supplied disable FAT channel */
670         if (iwl_conf->extension_chan_offset != IEEE80211_HT_PARAM_CHA_SEC_ABOVE &&
671             iwl_conf->extension_chan_offset != IEEE80211_HT_PARAM_CHA_SEC_BELOW)
672                 iwl_conf->supported_chan_width = 0;
673
674         iwl_conf->sm_ps = (u8)((ht_conf->cap & IEEE80211_HT_CAP_SM_PS) >> 2);
675
676         memcpy(&iwl_conf->mcs, &ht_conf->mcs, 16);
677
678         iwl_conf->tx_chan_width = iwl_conf->supported_chan_width != 0;
679         iwl_conf->ht_protection =
680                 bss_conf->ht.operation_mode & IEEE80211_HT_OP_MODE_PROTECTION;
681         iwl_conf->non_GF_STA_present =
682                 !!(bss_conf->ht.operation_mode & IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT);
683
684         rcu_read_unlock();
685
686         IWL_DEBUG_MAC80211("leave\n");
687 }
688
689 /*
690  * QoS  support
691 */
692 static void iwl_activate_qos(struct iwl_priv *priv, u8 force)
693 {
694         if (test_bit(STATUS_EXIT_PENDING, &priv->status))
695                 return;
696
697         priv->qos_data.def_qos_parm.qos_flags = 0;
698
699         if (priv->qos_data.qos_cap.q_AP.queue_request &&
700             !priv->qos_data.qos_cap.q_AP.txop_request)
701                 priv->qos_data.def_qos_parm.qos_flags |=
702                         QOS_PARAM_FLG_TXOP_TYPE_MSK;
703         if (priv->qos_data.qos_active)
704                 priv->qos_data.def_qos_parm.qos_flags |=
705                         QOS_PARAM_FLG_UPDATE_EDCA_MSK;
706
707         if (priv->current_ht_config.is_ht)
708                 priv->qos_data.def_qos_parm.qos_flags |= QOS_PARAM_FLG_TGN_MSK;
709
710         if (force || iwl_is_associated(priv)) {
711                 IWL_DEBUG_QOS("send QoS cmd with Qos active=%d FLAGS=0x%X\n",
712                                 priv->qos_data.qos_active,
713                                 priv->qos_data.def_qos_parm.qos_flags);
714
715                 iwl_send_cmd_pdu_async(priv, REPLY_QOS_PARAM,
716                                        sizeof(struct iwl_qosparam_cmd),
717                                        &priv->qos_data.def_qos_parm, NULL);
718         }
719 }
720
721 #define MAX_UCODE_BEACON_INTERVAL       4096
722
723 static u16 iwl_adjust_beacon_interval(u16 beacon_val)
724 {
725         u16 new_val = 0;
726         u16 beacon_factor = 0;
727
728         beacon_factor = (beacon_val + MAX_UCODE_BEACON_INTERVAL)
729                                         / MAX_UCODE_BEACON_INTERVAL;
730         new_val = beacon_val / beacon_factor;
731
732         return new_val;
733 }
734
735 static void iwl_setup_rxon_timing(struct iwl_priv *priv)
736 {
737         u64 tsf;
738         s32 interval_tm, rem;
739         unsigned long flags;
740         struct ieee80211_conf *conf = NULL;
741         u16 beacon_int = 0;
742
743         conf = ieee80211_get_hw_conf(priv->hw);
744
745         spin_lock_irqsave(&priv->lock, flags);
746         priv->rxon_timing.timestamp = cpu_to_le64(priv->timestamp);
747         priv->rxon_timing.listen_interval = cpu_to_le16(conf->listen_interval);
748
749         if (priv->iw_mode == NL80211_IFTYPE_STATION) {
750                 beacon_int = iwl_adjust_beacon_interval(priv->beacon_int);
751                 priv->rxon_timing.atim_window = 0;
752         } else {
753                 beacon_int = iwl_adjust_beacon_interval(conf->beacon_int);
754
755                 /* TODO: we need to get atim_window from upper stack
756                  * for now we set to 0 */
757                 priv->rxon_timing.atim_window = 0;
758         }
759
760         priv->rxon_timing.beacon_interval = cpu_to_le16(beacon_int);
761
762         tsf = priv->timestamp; /* tsf is modifed by do_div: copy it */
763         interval_tm = beacon_int * 1024;
764         rem = do_div(tsf, interval_tm);
765         priv->rxon_timing.beacon_init_val = cpu_to_le32(interval_tm - rem);
766
767         spin_unlock_irqrestore(&priv->lock, flags);
768         IWL_DEBUG_ASSOC("beacon interval %d beacon timer %d beacon tim %d\n",
769                         le16_to_cpu(priv->rxon_timing.beacon_interval),
770                         le32_to_cpu(priv->rxon_timing.beacon_init_val),
771                         le16_to_cpu(priv->rxon_timing.atim_window));
772 }
773
774 static void iwl_set_flags_for_band(struct iwl_priv *priv,
775                                    enum ieee80211_band band)
776 {
777         if (band == IEEE80211_BAND_5GHZ) {
778                 priv->staging_rxon.flags &=
779                     ~(RXON_FLG_BAND_24G_MSK | RXON_FLG_AUTO_DETECT_MSK
780                       | RXON_FLG_CCK_MSK);
781                 priv->staging_rxon.flags |= RXON_FLG_SHORT_SLOT_MSK;
782         } else {
783                 /* Copied from iwl_post_associate() */
784                 if (priv->assoc_capability & WLAN_CAPABILITY_SHORT_SLOT_TIME)
785                         priv->staging_rxon.flags |= RXON_FLG_SHORT_SLOT_MSK;
786                 else
787                         priv->staging_rxon.flags &= ~RXON_FLG_SHORT_SLOT_MSK;
788
789                 if (priv->iw_mode == NL80211_IFTYPE_ADHOC)
790                         priv->staging_rxon.flags &= ~RXON_FLG_SHORT_SLOT_MSK;
791
792                 priv->staging_rxon.flags |= RXON_FLG_BAND_24G_MSK;
793                 priv->staging_rxon.flags |= RXON_FLG_AUTO_DETECT_MSK;
794                 priv->staging_rxon.flags &= ~RXON_FLG_CCK_MSK;
795         }
796 }
797
798 /*
799  * initialize rxon structure with default values from eeprom
800  */
801 static void iwl_connection_init_rx_config(struct iwl_priv *priv, int mode)
802 {
803         const struct iwl_channel_info *ch_info;
804
805         memset(&priv->staging_rxon, 0, sizeof(priv->staging_rxon));
806
807         switch (mode) {
808         case NL80211_IFTYPE_AP:
809                 priv->staging_rxon.dev_type = RXON_DEV_TYPE_AP;
810                 break;
811
812         case NL80211_IFTYPE_STATION:
813                 priv->staging_rxon.dev_type = RXON_DEV_TYPE_ESS;
814                 priv->staging_rxon.filter_flags = RXON_FILTER_ACCEPT_GRP_MSK;
815                 break;
816
817         case NL80211_IFTYPE_ADHOC:
818                 priv->staging_rxon.dev_type = RXON_DEV_TYPE_IBSS;
819                 priv->staging_rxon.flags = RXON_FLG_SHORT_PREAMBLE_MSK;
820                 priv->staging_rxon.filter_flags = RXON_FILTER_BCON_AWARE_MSK |
821                                                   RXON_FILTER_ACCEPT_GRP_MSK;
822                 break;
823
824         case NL80211_IFTYPE_MONITOR:
825                 priv->staging_rxon.dev_type = RXON_DEV_TYPE_SNIFFER;
826                 priv->staging_rxon.filter_flags = RXON_FILTER_PROMISC_MSK |
827                     RXON_FILTER_CTL2HOST_MSK | RXON_FILTER_ACCEPT_GRP_MSK;
828                 break;
829         default:
830                 IWL_ERR(priv, "Unsupported interface type %d\n", mode);
831                 break;
832         }
833
834 #if 0
835         /* TODO:  Figure out when short_preamble would be set and cache from
836          * that */
837         if (!hw_to_local(priv->hw)->short_preamble)
838                 priv->staging_rxon.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK;
839         else
840                 priv->staging_rxon.flags |= RXON_FLG_SHORT_PREAMBLE_MSK;
841 #endif
842
843         ch_info = iwl_get_channel_info(priv, priv->band,
844                                        le16_to_cpu(priv->active_rxon.channel));
845
846         if (!ch_info)
847                 ch_info = &priv->channel_info[0];
848
849         /*
850          * in some case A channels are all non IBSS
851          * in this case force B/G channel
852          */
853         if ((priv->iw_mode == NL80211_IFTYPE_ADHOC) &&
854             !(is_channel_ibss(ch_info)))
855                 ch_info = &priv->channel_info[0];
856
857         priv->staging_rxon.channel = cpu_to_le16(ch_info->channel);
858         priv->band = ch_info->band;
859
860         iwl_set_flags_for_band(priv, priv->band);
861
862         priv->staging_rxon.ofdm_basic_rates =
863             (IWL_OFDM_RATES_MASK >> IWL_FIRST_OFDM_RATE) & 0xFF;
864         priv->staging_rxon.cck_basic_rates =
865             (IWL_CCK_RATES_MASK >> IWL_FIRST_CCK_RATE) & 0xF;
866
867         priv->staging_rxon.flags &= ~(RXON_FLG_CHANNEL_MODE_MIXED_MSK |
868                                         RXON_FLG_CHANNEL_MODE_PURE_40_MSK);
869         memcpy(priv->staging_rxon.node_addr, priv->mac_addr, ETH_ALEN);
870         memcpy(priv->staging_rxon.wlap_bssid_addr, priv->mac_addr, ETH_ALEN);
871         priv->staging_rxon.ofdm_ht_single_stream_basic_rates = 0xff;
872         priv->staging_rxon.ofdm_ht_dual_stream_basic_rates = 0xff;
873         iwl_set_rxon_chain(priv);
874 }
875
876 static int iwl_set_mode(struct iwl_priv *priv, int mode)
877 {
878         iwl_connection_init_rx_config(priv, mode);
879         memcpy(priv->staging_rxon.node_addr, priv->mac_addr, ETH_ALEN);
880
881         iwl_clear_stations_table(priv);
882
883         /* dont commit rxon if rf-kill is on*/
884         if (!iwl_is_ready_rf(priv))
885                 return -EAGAIN;
886
887         cancel_delayed_work(&priv->scan_check);
888         if (iwl_scan_cancel_timeout(priv, 100)) {
889                 IWL_WARN(priv, "Aborted scan still in progress after 100ms\n");
890                 IWL_DEBUG_MAC80211("leaving - scan abort failed.\n");
891                 return -EAGAIN;
892         }
893
894         iwl_commit_rxon(priv);
895
896         return 0;
897 }
898
899 static void iwl_set_rate(struct iwl_priv *priv)
900 {
901         const struct ieee80211_supported_band *hw = NULL;
902         struct ieee80211_rate *rate;
903         int i;
904
905         hw = iwl_get_hw_mode(priv, priv->band);
906         if (!hw) {
907                 IWL_ERR(priv, "Failed to set rate: unable to get hw mode\n");
908                 return;
909         }
910
911         priv->active_rate = 0;
912         priv->active_rate_basic = 0;
913
914         for (i = 0; i < hw->n_bitrates; i++) {
915                 rate = &(hw->bitrates[i]);
916                 if (rate->hw_value < IWL_RATE_COUNT)
917                         priv->active_rate |= (1 << rate->hw_value);
918         }
919
920         IWL_DEBUG_RATE("Set active_rate = %0x, active_rate_basic = %0x\n",
921                        priv->active_rate, priv->active_rate_basic);
922
923         /*
924          * If a basic rate is configured, then use it (adding IWL_RATE_1M_MASK)
925          * otherwise set it to the default of all CCK rates and 6, 12, 24 for
926          * OFDM
927          */
928         if (priv->active_rate_basic & IWL_CCK_BASIC_RATES_MASK)
929                 priv->staging_rxon.cck_basic_rates =
930                     ((priv->active_rate_basic &
931                       IWL_CCK_RATES_MASK) >> IWL_FIRST_CCK_RATE) & 0xF;
932         else
933                 priv->staging_rxon.cck_basic_rates =
934                     (IWL_CCK_BASIC_RATES_MASK >> IWL_FIRST_CCK_RATE) & 0xF;
935
936         if (priv->active_rate_basic & IWL_OFDM_BASIC_RATES_MASK)
937                 priv->staging_rxon.ofdm_basic_rates =
938                     ((priv->active_rate_basic &
939                       (IWL_OFDM_BASIC_RATES_MASK | IWL_RATE_6M_MASK)) >>
940                       IWL_FIRST_OFDM_RATE) & 0xFF;
941         else
942                 priv->staging_rxon.ofdm_basic_rates =
943                    (IWL_OFDM_BASIC_RATES_MASK >> IWL_FIRST_OFDM_RATE) & 0xFF;
944 }
945
946
947 /******************************************************************************
948  *
949  * Generic RX handler implementations
950  *
951  ******************************************************************************/
952 static void iwl_rx_reply_alive(struct iwl_priv *priv,
953                                 struct iwl_rx_mem_buffer *rxb)
954 {
955         struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data;
956         struct iwl_alive_resp *palive;
957         struct delayed_work *pwork;
958
959         palive = &pkt->u.alive_frame;
960
961         IWL_DEBUG_INFO("Alive ucode status 0x%08X revision "
962                        "0x%01X 0x%01X\n",
963                        palive->is_valid, palive->ver_type,
964                        palive->ver_subtype);
965
966         if (palive->ver_subtype == INITIALIZE_SUBTYPE) {
967                 IWL_DEBUG_INFO("Initialization Alive received.\n");
968                 memcpy(&priv->card_alive_init,
969                        &pkt->u.alive_frame,
970                        sizeof(struct iwl_init_alive_resp));
971                 pwork = &priv->init_alive_start;
972         } else {
973                 IWL_DEBUG_INFO("Runtime Alive received.\n");
974                 memcpy(&priv->card_alive, &pkt->u.alive_frame,
975                        sizeof(struct iwl_alive_resp));
976                 pwork = &priv->alive_start;
977         }
978
979         /* We delay the ALIVE response by 5ms to
980          * give the HW RF Kill time to activate... */
981         if (palive->is_valid == UCODE_VALID_OK)
982                 queue_delayed_work(priv->workqueue, pwork,
983                                    msecs_to_jiffies(5));
984         else
985                 IWL_WARN(priv, "uCode did not respond OK.\n");
986 }
987
988 static void iwl_rx_reply_error(struct iwl_priv *priv,
989                                    struct iwl_rx_mem_buffer *rxb)
990 {
991         struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data;
992
993         IWL_ERR(priv, "Error Reply type 0x%08X cmd %s (0x%02X) "
994                 "seq 0x%04X ser 0x%08X\n",
995                 le32_to_cpu(pkt->u.err_resp.error_type),
996                 get_cmd_string(pkt->u.err_resp.cmd_id),
997                 pkt->u.err_resp.cmd_id,
998                 le16_to_cpu(pkt->u.err_resp.bad_cmd_seq_num),
999                 le32_to_cpu(pkt->u.err_resp.error_info));
1000 }
1001
1002 #define TX_STATUS_ENTRY(x) case TX_STATUS_FAIL_ ## x: return #x
1003
1004 static void iwl_rx_csa(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb)
1005 {
1006         struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data;
1007         struct iwl_rxon_cmd *rxon = (void *)&priv->active_rxon;
1008         struct iwl_csa_notification *csa = &(pkt->u.csa_notif);
1009         IWL_DEBUG_11H("CSA notif: channel %d, status %d\n",
1010                       le16_to_cpu(csa->channel), le32_to_cpu(csa->status));
1011         rxon->channel = csa->channel;
1012         priv->staging_rxon.channel = csa->channel;
1013 }
1014
1015 static void iwl_rx_pm_sleep_notif(struct iwl_priv *priv,
1016                                       struct iwl_rx_mem_buffer *rxb)
1017 {
1018 #ifdef CONFIG_IWLWIFI_DEBUG
1019         struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data;
1020         struct iwl_sleep_notification *sleep = &(pkt->u.sleep_notif);
1021         IWL_DEBUG_RX("sleep mode: %d, src: %d\n",
1022                      sleep->pm_sleep_mode, sleep->pm_wakeup_src);
1023 #endif
1024 }
1025
1026 static void iwl_rx_pm_debug_statistics_notif(struct iwl_priv *priv,
1027                                              struct iwl_rx_mem_buffer *rxb)
1028 {
1029         struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data;
1030         IWL_DEBUG_RADIO("Dumping %d bytes of unhandled "
1031                         "notification for %s:\n",
1032                         le32_to_cpu(pkt->len), get_cmd_string(pkt->hdr.cmd));
1033         iwl_print_hex_dump(priv, IWL_DL_RADIO, pkt->u.raw, le32_to_cpu(pkt->len));
1034 }
1035
1036 static void iwl_bg_beacon_update(struct work_struct *work)
1037 {
1038         struct iwl_priv *priv =
1039                 container_of(work, struct iwl_priv, beacon_update);
1040         struct sk_buff *beacon;
1041
1042         /* Pull updated AP beacon from mac80211. will fail if not in AP mode */
1043         beacon = ieee80211_beacon_get(priv->hw, priv->vif);
1044
1045         if (!beacon) {
1046                 IWL_ERR(priv, "update beacon failed\n");
1047                 return;
1048         }
1049
1050         mutex_lock(&priv->mutex);
1051         /* new beacon skb is allocated every time; dispose previous.*/
1052         if (priv->ibss_beacon)
1053                 dev_kfree_skb(priv->ibss_beacon);
1054
1055         priv->ibss_beacon = beacon;
1056         mutex_unlock(&priv->mutex);
1057
1058         iwl_send_beacon_cmd(priv);
1059 }
1060
1061 /**
1062  * iwl_bg_statistics_periodic - Timer callback to queue statistics
1063  *
1064  * This callback is provided in order to send a statistics request.
1065  *
1066  * This timer function is continually reset to execute within
1067  * REG_RECALIB_PERIOD seconds since the last STATISTICS_NOTIFICATION
1068  * was received.  We need to ensure we receive the statistics in order
1069  * to update the temperature used for calibrating the TXPOWER.
1070  */
1071 static void iwl_bg_statistics_periodic(unsigned long data)
1072 {
1073         struct iwl_priv *priv = (struct iwl_priv *)data;
1074
1075         if (test_bit(STATUS_EXIT_PENDING, &priv->status))
1076                 return;
1077
1078         /* dont send host command if rf-kill is on */
1079         if (!iwl_is_ready_rf(priv))
1080                 return;
1081
1082         iwl_send_statistics_request(priv, CMD_ASYNC);
1083 }
1084
1085 static void iwl_rx_beacon_notif(struct iwl_priv *priv,
1086                                 struct iwl_rx_mem_buffer *rxb)
1087 {
1088 #ifdef CONFIG_IWLWIFI_DEBUG
1089         struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data;
1090         struct iwl4965_beacon_notif *beacon =
1091                 (struct iwl4965_beacon_notif *)pkt->u.raw;
1092         u8 rate = iwl_hw_get_rate(beacon->beacon_notify_hdr.rate_n_flags);
1093
1094         IWL_DEBUG_RX("beacon status %x retries %d iss %d "
1095                 "tsf %d %d rate %d\n",
1096                 le32_to_cpu(beacon->beacon_notify_hdr.u.status) & TX_STATUS_MSK,
1097                 beacon->beacon_notify_hdr.failure_frame,
1098                 le32_to_cpu(beacon->ibss_mgr_status),
1099                 le32_to_cpu(beacon->high_tsf),
1100                 le32_to_cpu(beacon->low_tsf), rate);
1101 #endif
1102
1103         if ((priv->iw_mode == NL80211_IFTYPE_AP) &&
1104             (!test_bit(STATUS_EXIT_PENDING, &priv->status)))
1105                 queue_work(priv->workqueue, &priv->beacon_update);
1106 }
1107
1108 /* Handle notification from uCode that card's power state is changing
1109  * due to software, hardware, or critical temperature RFKILL */
1110 static void iwl_rx_card_state_notif(struct iwl_priv *priv,
1111                                     struct iwl_rx_mem_buffer *rxb)
1112 {
1113         struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data;
1114         u32 flags = le32_to_cpu(pkt->u.card_state_notif.flags);
1115         unsigned long status = priv->status;
1116
1117         IWL_DEBUG_RF_KILL("Card state received: HW:%s SW:%s\n",
1118                           (flags & HW_CARD_DISABLED) ? "Kill" : "On",
1119                           (flags & SW_CARD_DISABLED) ? "Kill" : "On");
1120
1121         if (flags & (SW_CARD_DISABLED | HW_CARD_DISABLED |
1122                      RF_CARD_DISABLED)) {
1123
1124                 iwl_write32(priv, CSR_UCODE_DRV_GP1_SET,
1125                             CSR_UCODE_DRV_GP1_BIT_CMD_BLOCKED);
1126
1127                 if (!iwl_grab_nic_access(priv)) {
1128                         iwl_write_direct32(
1129                                 priv, HBUS_TARG_MBX_C,
1130                                 HBUS_TARG_MBX_C_REG_BIT_CMD_BLOCKED);
1131
1132                         iwl_release_nic_access(priv);
1133                 }
1134
1135                 if (!(flags & RXON_CARD_DISABLED)) {
1136                         iwl_write32(priv, CSR_UCODE_DRV_GP1_CLR,
1137                                     CSR_UCODE_DRV_GP1_BIT_CMD_BLOCKED);
1138                         if (!iwl_grab_nic_access(priv)) {
1139                                 iwl_write_direct32(
1140                                         priv, HBUS_TARG_MBX_C,
1141                                         HBUS_TARG_MBX_C_REG_BIT_CMD_BLOCKED);
1142
1143                                 iwl_release_nic_access(priv);
1144                         }
1145                 }
1146
1147                 if (flags & RF_CARD_DISABLED) {
1148                         iwl_write32(priv, CSR_UCODE_DRV_GP1_SET,
1149                                     CSR_UCODE_DRV_GP1_REG_BIT_CT_KILL_EXIT);
1150                         iwl_read32(priv, CSR_UCODE_DRV_GP1);
1151                         if (!iwl_grab_nic_access(priv))
1152                                 iwl_release_nic_access(priv);
1153                 }
1154         }
1155
1156         if (flags & HW_CARD_DISABLED)
1157                 set_bit(STATUS_RF_KILL_HW, &priv->status);
1158         else
1159                 clear_bit(STATUS_RF_KILL_HW, &priv->status);
1160
1161
1162         if (flags & SW_CARD_DISABLED)
1163                 set_bit(STATUS_RF_KILL_SW, &priv->status);
1164         else
1165                 clear_bit(STATUS_RF_KILL_SW, &priv->status);
1166
1167         if (!(flags & RXON_CARD_DISABLED))
1168                 iwl_scan_cancel(priv);
1169
1170         if ((test_bit(STATUS_RF_KILL_HW, &status) !=
1171              test_bit(STATUS_RF_KILL_HW, &priv->status)) ||
1172             (test_bit(STATUS_RF_KILL_SW, &status) !=
1173              test_bit(STATUS_RF_KILL_SW, &priv->status)))
1174                 queue_work(priv->workqueue, &priv->rf_kill);
1175         else
1176                 wake_up_interruptible(&priv->wait_command_queue);
1177 }
1178
1179 int iwl_set_pwr_src(struct iwl_priv *priv, enum iwl_pwr_src src)
1180 {
1181         int ret;
1182         unsigned long flags;
1183
1184         spin_lock_irqsave(&priv->lock, flags);
1185         ret = iwl_grab_nic_access(priv);
1186         if (ret)
1187                 goto err;
1188
1189         if (src == IWL_PWR_SRC_VAUX) {
1190                 u32 val;
1191                 ret = pci_read_config_dword(priv->pci_dev, PCI_CFG_POWER_SOURCE,
1192                                             &val);
1193
1194                 if (val & PCI_CFG_PMC_PME_FROM_D3COLD_SUPPORT)
1195                         iwl_set_bits_mask_prph(priv, APMG_PS_CTRL_REG,
1196                                                APMG_PS_CTRL_VAL_PWR_SRC_VAUX,
1197                                                ~APMG_PS_CTRL_MSK_PWR_SRC);
1198         } else {
1199                 iwl_set_bits_mask_prph(priv, APMG_PS_CTRL_REG,
1200                                        APMG_PS_CTRL_VAL_PWR_SRC_VMAIN,
1201                                        ~APMG_PS_CTRL_MSK_PWR_SRC);
1202         }
1203
1204         iwl_release_nic_access(priv);
1205 err:
1206         spin_unlock_irqrestore(&priv->lock, flags);
1207         return ret;
1208 }
1209
1210 /**
1211  * iwl_setup_rx_handlers - Initialize Rx handler callbacks
1212  *
1213  * Setup the RX handlers for each of the reply types sent from the uCode
1214  * to the host.
1215  *
1216  * This function chains into the hardware specific files for them to setup
1217  * any hardware specific handlers as well.
1218  */
1219 static void iwl_setup_rx_handlers(struct iwl_priv *priv)
1220 {
1221         priv->rx_handlers[REPLY_ALIVE] = iwl_rx_reply_alive;
1222         priv->rx_handlers[REPLY_ERROR] = iwl_rx_reply_error;
1223         priv->rx_handlers[CHANNEL_SWITCH_NOTIFICATION] = iwl_rx_csa;
1224         priv->rx_handlers[PM_SLEEP_NOTIFICATION] = iwl_rx_pm_sleep_notif;
1225         priv->rx_handlers[PM_DEBUG_STATISTIC_NOTIFIC] =
1226             iwl_rx_pm_debug_statistics_notif;
1227         priv->rx_handlers[BEACON_NOTIFICATION] = iwl_rx_beacon_notif;
1228
1229         /*
1230          * The same handler is used for both the REPLY to a discrete
1231          * statistics request from the host as well as for the periodic
1232          * statistics notifications (after received beacons) from the uCode.
1233          */
1234         priv->rx_handlers[REPLY_STATISTICS_CMD] = iwl_rx_statistics;
1235         priv->rx_handlers[STATISTICS_NOTIFICATION] = iwl_rx_statistics;
1236
1237         iwl_setup_spectrum_handlers(priv);
1238         iwl_setup_rx_scan_handlers(priv);
1239
1240         /* status change handler */
1241         priv->rx_handlers[CARD_STATE_NOTIFICATION] = iwl_rx_card_state_notif;
1242
1243         priv->rx_handlers[MISSED_BEACONS_NOTIFICATION] =
1244             iwl_rx_missed_beacon_notif;
1245         /* Rx handlers */
1246         priv->rx_handlers[REPLY_RX_PHY_CMD] = iwl_rx_reply_rx_phy;
1247         priv->rx_handlers[REPLY_RX_MPDU_CMD] = iwl_rx_reply_rx;
1248         /* block ack */
1249         priv->rx_handlers[REPLY_COMPRESSED_BA] = iwl_rx_reply_compressed_ba;
1250         /* Set up hardware specific Rx handlers */
1251         priv->cfg->ops->lib->rx_handler_setup(priv);
1252 }
1253
1254 /**
1255  * iwl_rx_handle - Main entry function for receiving responses from uCode
1256  *
1257  * Uses the priv->rx_handlers callback function array to invoke
1258  * the appropriate handlers, including command responses,
1259  * frame-received notifications, and other notifications.
1260  */
1261 void iwl_rx_handle(struct iwl_priv *priv)
1262 {
1263         struct iwl_rx_mem_buffer *rxb;
1264         struct iwl_rx_packet *pkt;
1265         struct iwl_rx_queue *rxq = &priv->rxq;
1266         u32 r, i;
1267         int reclaim;
1268         unsigned long flags;
1269         u8 fill_rx = 0;
1270         u32 count = 8;
1271
1272         /* uCode's read index (stored in shared DRAM) indicates the last Rx
1273          * buffer that the driver may process (last buffer filled by ucode). */
1274         r = le16_to_cpu(rxq->rb_stts->closed_rb_num) &  0x0FFF;
1275         i = rxq->read;
1276
1277         /* Rx interrupt, but nothing sent from uCode */
1278         if (i == r)
1279                 IWL_DEBUG(IWL_DL_RX, "r = %d, i = %d\n", r, i);
1280
1281         if (iwl_rx_queue_space(rxq) > (RX_QUEUE_SIZE / 2))
1282                 fill_rx = 1;
1283
1284         while (i != r) {
1285                 rxb = rxq->queue[i];
1286
1287                 /* If an RXB doesn't have a Rx queue slot associated with it,
1288                  * then a bug has been introduced in the queue refilling
1289                  * routines -- catch it here */
1290                 BUG_ON(rxb == NULL);
1291
1292                 rxq->queue[i] = NULL;
1293
1294                 dma_sync_single_range_for_cpu(
1295                                 &priv->pci_dev->dev, rxb->real_dma_addr,
1296                                 rxb->aligned_dma_addr - rxb->real_dma_addr,
1297                                 priv->hw_params.rx_buf_size,
1298                                 PCI_DMA_FROMDEVICE);
1299                 pkt = (struct iwl_rx_packet *)rxb->skb->data;
1300
1301                 /* Reclaim a command buffer only if this packet is a response
1302                  *   to a (driver-originated) command.
1303                  * If the packet (e.g. Rx frame) originated from uCode,
1304                  *   there is no command buffer to reclaim.
1305                  * Ucode should set SEQ_RX_FRAME bit if ucode-originated,
1306                  *   but apparently a few don't get set; catch them here. */
1307                 reclaim = !(pkt->hdr.sequence & SEQ_RX_FRAME) &&
1308                         (pkt->hdr.cmd != REPLY_RX_PHY_CMD) &&
1309                         (pkt->hdr.cmd != REPLY_RX) &&
1310                         (pkt->hdr.cmd != REPLY_RX_MPDU_CMD) &&
1311                         (pkt->hdr.cmd != REPLY_COMPRESSED_BA) &&
1312                         (pkt->hdr.cmd != STATISTICS_NOTIFICATION) &&
1313                         (pkt->hdr.cmd != REPLY_TX);
1314
1315                 /* Based on type of command response or notification,
1316                  *   handle those that need handling via function in
1317                  *   rx_handlers table.  See iwl_setup_rx_handlers() */
1318                 if (priv->rx_handlers[pkt->hdr.cmd]) {
1319                         IWL_DEBUG(IWL_DL_RX, "r = %d, i = %d, %s, 0x%02x\n", r,
1320                                 i, get_cmd_string(pkt->hdr.cmd), pkt->hdr.cmd);
1321                         priv->rx_handlers[pkt->hdr.cmd] (priv, rxb);
1322                 } else {
1323                         /* No handling needed */
1324                         IWL_DEBUG(IWL_DL_RX,
1325                                 "r %d i %d No handler needed for %s, 0x%02x\n",
1326                                 r, i, get_cmd_string(pkt->hdr.cmd),
1327                                 pkt->hdr.cmd);
1328                 }
1329
1330                 if (reclaim) {
1331                         /* Invoke any callbacks, transfer the skb to caller, and
1332                          * fire off the (possibly) blocking iwl_send_cmd()
1333                          * as we reclaim the driver command queue */
1334                         if (rxb && rxb->skb)
1335                                 iwl_tx_cmd_complete(priv, rxb);
1336                         else
1337                                 IWL_WARN(priv, "Claim null rxb?\n");
1338                 }
1339
1340                 /* For now we just don't re-use anything.  We can tweak this
1341                  * later to try and re-use notification packets and SKBs that
1342                  * fail to Rx correctly */
1343                 if (rxb->skb != NULL) {
1344                         priv->alloc_rxb_skb--;
1345                         dev_kfree_skb_any(rxb->skb);
1346                         rxb->skb = NULL;
1347                 }
1348
1349                 pci_unmap_single(priv->pci_dev, rxb->real_dma_addr,
1350                                  priv->hw_params.rx_buf_size + 256,
1351                                  PCI_DMA_FROMDEVICE);
1352                 spin_lock_irqsave(&rxq->lock, flags);
1353                 list_add_tail(&rxb->list, &priv->rxq.rx_used);
1354                 spin_unlock_irqrestore(&rxq->lock, flags);
1355                 i = (i + 1) & RX_QUEUE_MASK;
1356                 /* If there are a lot of unused frames,
1357                  * restock the Rx queue so ucode wont assert. */
1358                 if (fill_rx) {
1359                         count++;
1360                         if (count >= 8) {
1361                                 priv->rxq.read = i;
1362                                 iwl_rx_queue_restock(priv);
1363                                 count = 0;
1364                         }
1365                 }
1366         }
1367
1368         /* Backtrack one entry */
1369         priv->rxq.read = i;
1370         iwl_rx_queue_restock(priv);
1371 }
1372
1373 #ifdef CONFIG_IWLWIFI_DEBUG
1374 static void iwl_print_rx_config_cmd(struct iwl_priv *priv)
1375 {
1376         struct iwl_rxon_cmd *rxon = &priv->staging_rxon;
1377
1378         IWL_DEBUG_RADIO("RX CONFIG:\n");
1379         iwl_print_hex_dump(priv, IWL_DL_RADIO, (u8 *) rxon, sizeof(*rxon));
1380         IWL_DEBUG_RADIO("u16 channel: 0x%x\n", le16_to_cpu(rxon->channel));
1381         IWL_DEBUG_RADIO("u32 flags: 0x%08X\n", le32_to_cpu(rxon->flags));
1382         IWL_DEBUG_RADIO("u32 filter_flags: 0x%08x\n",
1383                         le32_to_cpu(rxon->filter_flags));
1384         IWL_DEBUG_RADIO("u8 dev_type: 0x%x\n", rxon->dev_type);
1385         IWL_DEBUG_RADIO("u8 ofdm_basic_rates: 0x%02x\n",
1386                         rxon->ofdm_basic_rates);
1387         IWL_DEBUG_RADIO("u8 cck_basic_rates: 0x%02x\n", rxon->cck_basic_rates);
1388         IWL_DEBUG_RADIO("u8[6] node_addr: %pM\n", rxon->node_addr);
1389         IWL_DEBUG_RADIO("u8[6] bssid_addr: %pM\n", rxon->bssid_addr);
1390         IWL_DEBUG_RADIO("u16 assoc_id: 0x%x\n", le16_to_cpu(rxon->assoc_id));
1391 }
1392 #endif
1393
1394 /* call this function to flush any scheduled tasklet */
1395 static inline void iwl_synchronize_irq(struct iwl_priv *priv)
1396 {
1397         /* wait to make sure we flush pending tasklet*/
1398         synchronize_irq(priv->pci_dev->irq);
1399         tasklet_kill(&priv->irq_tasklet);
1400 }
1401
1402 /**
1403  * iwl_irq_handle_error - called for HW or SW error interrupt from card
1404  */
1405 static void iwl_irq_handle_error(struct iwl_priv *priv)
1406 {
1407         /* Set the FW error flag -- cleared on iwl_down */
1408         set_bit(STATUS_FW_ERROR, &priv->status);
1409
1410         /* Cancel currently queued command. */
1411         clear_bit(STATUS_HCMD_ACTIVE, &priv->status);
1412
1413 #ifdef CONFIG_IWLWIFI_DEBUG
1414         if (priv->debug_level & IWL_DL_FW_ERRORS) {
1415                 iwl_dump_nic_error_log(priv);
1416                 iwl_dump_nic_event_log(priv);
1417                 iwl_print_rx_config_cmd(priv);
1418         }
1419 #endif
1420
1421         wake_up_interruptible(&priv->wait_command_queue);
1422
1423         /* Keep the restart process from trying to send host
1424          * commands by clearing the INIT status bit */
1425         clear_bit(STATUS_READY, &priv->status);
1426
1427         if (!test_bit(STATUS_EXIT_PENDING, &priv->status)) {
1428                 IWL_DEBUG(IWL_DL_FW_ERRORS,
1429                           "Restarting adapter due to uCode error.\n");
1430
1431                 if (iwl_is_associated(priv)) {
1432                         memcpy(&priv->recovery_rxon, &priv->active_rxon,
1433                                sizeof(priv->recovery_rxon));
1434                         priv->error_recovering = 1;
1435                 }
1436                 if (priv->cfg->mod_params->restart_fw)
1437                         queue_work(priv->workqueue, &priv->restart);
1438         }
1439 }
1440
1441 static void iwl_error_recovery(struct iwl_priv *priv)
1442 {
1443         unsigned long flags;
1444
1445         memcpy(&priv->staging_rxon, &priv->recovery_rxon,
1446                sizeof(priv->staging_rxon));
1447         priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
1448         iwl_commit_rxon(priv);
1449
1450         iwl_rxon_add_station(priv, priv->bssid, 1);
1451
1452         spin_lock_irqsave(&priv->lock, flags);
1453         priv->assoc_id = le16_to_cpu(priv->staging_rxon.assoc_id);
1454         priv->error_recovering = 0;
1455         spin_unlock_irqrestore(&priv->lock, flags);
1456 }
1457
1458 static void iwl_irq_tasklet(struct iwl_priv *priv)
1459 {
1460         u32 inta, handled = 0;
1461         u32 inta_fh;
1462         unsigned long flags;
1463 #ifdef CONFIG_IWLWIFI_DEBUG
1464         u32 inta_mask;
1465 #endif
1466
1467         spin_lock_irqsave(&priv->lock, flags);
1468
1469         /* Ack/clear/reset pending uCode interrupts.
1470          * Note:  Some bits in CSR_INT are "OR" of bits in CSR_FH_INT_STATUS,
1471          *  and will clear only when CSR_FH_INT_STATUS gets cleared. */
1472         inta = iwl_read32(priv, CSR_INT);
1473         iwl_write32(priv, CSR_INT, inta);
1474
1475         /* Ack/clear/reset pending flow-handler (DMA) interrupts.
1476          * Any new interrupts that happen after this, either while we're
1477          * in this tasklet, or later, will show up in next ISR/tasklet. */
1478         inta_fh = iwl_read32(priv, CSR_FH_INT_STATUS);
1479         iwl_write32(priv, CSR_FH_INT_STATUS, inta_fh);
1480
1481 #ifdef CONFIG_IWLWIFI_DEBUG
1482         if (priv->debug_level & IWL_DL_ISR) {
1483                 /* just for debug */
1484                 inta_mask = iwl_read32(priv, CSR_INT_MASK);
1485                 IWL_DEBUG_ISR("inta 0x%08x, enabled 0x%08x, fh 0x%08x\n",
1486                               inta, inta_mask, inta_fh);
1487         }
1488 #endif
1489
1490         /* Since CSR_INT and CSR_FH_INT_STATUS reads and clears are not
1491          * atomic, make sure that inta covers all the interrupts that
1492          * we've discovered, even if FH interrupt came in just after
1493          * reading CSR_INT. */
1494         if (inta_fh & CSR49_FH_INT_RX_MASK)
1495                 inta |= CSR_INT_BIT_FH_RX;
1496         if (inta_fh & CSR49_FH_INT_TX_MASK)
1497                 inta |= CSR_INT_BIT_FH_TX;
1498
1499         /* Now service all interrupt bits discovered above. */
1500         if (inta & CSR_INT_BIT_HW_ERR) {
1501                 IWL_ERR(priv, "Microcode HW error detected.  Restarting.\n");
1502
1503                 /* Tell the device to stop sending interrupts */
1504                 iwl_disable_interrupts(priv);
1505
1506                 iwl_irq_handle_error(priv);
1507
1508                 handled |= CSR_INT_BIT_HW_ERR;
1509
1510                 spin_unlock_irqrestore(&priv->lock, flags);
1511
1512                 return;
1513         }
1514
1515 #ifdef CONFIG_IWLWIFI_DEBUG
1516         if (priv->debug_level & (IWL_DL_ISR)) {
1517                 /* NIC fires this, but we don't use it, redundant with WAKEUP */
1518                 if (inta & CSR_INT_BIT_SCD)
1519                         IWL_DEBUG_ISR("Scheduler finished to transmit "
1520                                       "the frame/frames.\n");
1521
1522                 /* Alive notification via Rx interrupt will do the real work */
1523                 if (inta & CSR_INT_BIT_ALIVE)
1524                         IWL_DEBUG_ISR("Alive interrupt\n");
1525         }
1526 #endif
1527         /* Safely ignore these bits for debug checks below */
1528         inta &= ~(CSR_INT_BIT_SCD | CSR_INT_BIT_ALIVE);
1529
1530         /* HW RF KILL switch toggled */
1531         if (inta & CSR_INT_BIT_RF_KILL) {
1532                 int hw_rf_kill = 0;
1533                 if (!(iwl_read32(priv, CSR_GP_CNTRL) &
1534                                 CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW))
1535                         hw_rf_kill = 1;
1536
1537                 IWL_DEBUG(IWL_DL_RF_KILL, "RF_KILL bit toggled to %s.\n",
1538                                 hw_rf_kill ? "disable radio" : "enable radio");
1539
1540                 /* driver only loads ucode once setting the interface up.
1541                  * the driver allows loading the ucode even if the radio
1542                  * is killed. Hence update the killswitch state here. The
1543                  * rfkill handler will care about restarting if needed.
1544                  */
1545                 if (!test_bit(STATUS_ALIVE, &priv->status)) {
1546                         if (hw_rf_kill)
1547                                 set_bit(STATUS_RF_KILL_HW, &priv->status);
1548                         else
1549                                 clear_bit(STATUS_RF_KILL_HW, &priv->status);
1550                         queue_work(priv->workqueue, &priv->rf_kill);
1551                 }
1552
1553                 handled |= CSR_INT_BIT_RF_KILL;
1554         }
1555
1556         /* Chip got too hot and stopped itself */
1557         if (inta & CSR_INT_BIT_CT_KILL) {
1558                 IWL_ERR(priv, "Microcode CT kill error detected.\n");
1559                 handled |= CSR_INT_BIT_CT_KILL;
1560         }
1561
1562         /* Error detected by uCode */
1563         if (inta & CSR_INT_BIT_SW_ERR) {
1564                 IWL_ERR(priv, "Microcode SW error detected. "
1565                         " Restarting 0x%X.\n", inta);
1566                 iwl_irq_handle_error(priv);
1567                 handled |= CSR_INT_BIT_SW_ERR;
1568         }
1569
1570         /* uCode wakes up after power-down sleep */
1571         if (inta & CSR_INT_BIT_WAKEUP) {
1572                 IWL_DEBUG_ISR("Wakeup interrupt\n");
1573                 iwl_rx_queue_update_write_ptr(priv, &priv->rxq);
1574                 iwl_txq_update_write_ptr(priv, &priv->txq[0]);
1575                 iwl_txq_update_write_ptr(priv, &priv->txq[1]);
1576                 iwl_txq_update_write_ptr(priv, &priv->txq[2]);
1577                 iwl_txq_update_write_ptr(priv, &priv->txq[3]);
1578                 iwl_txq_update_write_ptr(priv, &priv->txq[4]);
1579                 iwl_txq_update_write_ptr(priv, &priv->txq[5]);
1580
1581                 handled |= CSR_INT_BIT_WAKEUP;
1582         }
1583
1584         /* All uCode command responses, including Tx command responses,
1585          * Rx "responses" (frame-received notification), and other
1586          * notifications from uCode come through here*/
1587         if (inta & (CSR_INT_BIT_FH_RX | CSR_INT_BIT_SW_RX)) {
1588                 iwl_rx_handle(priv);
1589                 handled |= (CSR_INT_BIT_FH_RX | CSR_INT_BIT_SW_RX);
1590         }
1591
1592         if (inta & CSR_INT_BIT_FH_TX) {
1593                 IWL_DEBUG_ISR("Tx interrupt\n");
1594                 handled |= CSR_INT_BIT_FH_TX;
1595                 /* FH finished to write, send event */
1596                 priv->ucode_write_complete = 1;
1597                 wake_up_interruptible(&priv->wait_command_queue);
1598         }
1599
1600         if (inta & ~handled)
1601                 IWL_ERR(priv, "Unhandled INTA bits 0x%08x\n", inta & ~handled);
1602
1603         if (inta & ~CSR_INI_SET_MASK) {
1604                 IWL_WARN(priv, "Disabled INTA bits 0x%08x were pending\n",
1605                          inta & ~CSR_INI_SET_MASK);
1606                 IWL_WARN(priv, "   with FH_INT = 0x%08x\n", inta_fh);
1607         }
1608
1609         /* Re-enable all interrupts */
1610         /* only Re-enable if diabled by irq */
1611         if (test_bit(STATUS_INT_ENABLED, &priv->status))
1612                 iwl_enable_interrupts(priv);
1613
1614 #ifdef CONFIG_IWLWIFI_DEBUG
1615         if (priv->debug_level & (IWL_DL_ISR)) {
1616                 inta = iwl_read32(priv, CSR_INT);
1617                 inta_mask = iwl_read32(priv, CSR_INT_MASK);
1618                 inta_fh = iwl_read32(priv, CSR_FH_INT_STATUS);
1619                 IWL_DEBUG_ISR("End inta 0x%08x, enabled 0x%08x, fh 0x%08x, "
1620                         "flags 0x%08lx\n", inta, inta_mask, inta_fh, flags);
1621         }
1622 #endif
1623         spin_unlock_irqrestore(&priv->lock, flags);
1624 }
1625
1626 static irqreturn_t iwl_isr(int irq, void *data)
1627 {
1628         struct iwl_priv *priv = data;
1629         u32 inta, inta_mask;
1630         u32 inta_fh;
1631         if (!priv)
1632                 return IRQ_NONE;
1633
1634         spin_lock(&priv->lock);
1635
1636         /* Disable (but don't clear!) interrupts here to avoid
1637          *    back-to-back ISRs and sporadic interrupts from our NIC.
1638          * If we have something to service, the tasklet will re-enable ints.
1639          * If we *don't* have something, we'll re-enable before leaving here. */
1640         inta_mask = iwl_read32(priv, CSR_INT_MASK);  /* just for debug */
1641         iwl_write32(priv, CSR_INT_MASK, 0x00000000);
1642
1643         /* Discover which interrupts are active/pending */
1644         inta = iwl_read32(priv, CSR_INT);
1645         inta_fh = iwl_read32(priv, CSR_FH_INT_STATUS);
1646
1647         /* Ignore interrupt if there's nothing in NIC to service.
1648          * This may be due to IRQ shared with another device,
1649          * or due to sporadic interrupts thrown from our NIC. */
1650         if (!inta && !inta_fh) {
1651                 IWL_DEBUG_ISR("Ignore interrupt, inta == 0, inta_fh == 0\n");
1652                 goto none;
1653         }
1654
1655         if ((inta == 0xFFFFFFFF) || ((inta & 0xFFFFFFF0) == 0xa5a5a5a0)) {
1656                 /* Hardware disappeared. It might have already raised
1657                  * an interrupt */
1658                 IWL_WARN(priv, "HARDWARE GONE?? INTA == 0x%08x\n", inta);
1659                 goto unplugged;
1660         }
1661
1662         IWL_DEBUG_ISR("ISR inta 0x%08x, enabled 0x%08x, fh 0x%08x\n",
1663                       inta, inta_mask, inta_fh);
1664
1665         inta &= ~CSR_INT_BIT_SCD;
1666
1667         /* iwl_irq_tasklet() will service interrupts and re-enable them */
1668         if (likely(inta || inta_fh))
1669                 tasklet_schedule(&priv->irq_tasklet);
1670
1671  unplugged:
1672         spin_unlock(&priv->lock);
1673         return IRQ_HANDLED;
1674
1675  none:
1676         /* re-enable interrupts here since we don't have anything to service. */
1677         /* only Re-enable if diabled by irq */
1678         if (test_bit(STATUS_INT_ENABLED, &priv->status))
1679                 iwl_enable_interrupts(priv);
1680         spin_unlock(&priv->lock);
1681         return IRQ_NONE;
1682 }
1683
1684 /******************************************************************************
1685  *
1686  * uCode download functions
1687  *
1688  ******************************************************************************/
1689
1690 static void iwl_dealloc_ucode_pci(struct iwl_priv *priv)
1691 {
1692         iwl_free_fw_desc(priv->pci_dev, &priv->ucode_code);
1693         iwl_free_fw_desc(priv->pci_dev, &priv->ucode_data);
1694         iwl_free_fw_desc(priv->pci_dev, &priv->ucode_data_backup);
1695         iwl_free_fw_desc(priv->pci_dev, &priv->ucode_init);
1696         iwl_free_fw_desc(priv->pci_dev, &priv->ucode_init_data);
1697         iwl_free_fw_desc(priv->pci_dev, &priv->ucode_boot);
1698 }
1699
1700 static void iwl_nic_start(struct iwl_priv *priv)
1701 {
1702         /* Remove all resets to allow NIC to operate */
1703         iwl_write32(priv, CSR_RESET, 0);
1704 }
1705
1706
1707 /**
1708  * iwl_read_ucode - Read uCode images from disk file.
1709  *
1710  * Copy into buffers for card to fetch via bus-mastering
1711  */
1712 static int iwl_read_ucode(struct iwl_priv *priv)
1713 {
1714         struct iwl_ucode *ucode;
1715         int ret = -EINVAL, index;
1716         const struct firmware *ucode_raw;
1717         const char *name_pre = priv->cfg->fw_name_pre;
1718         const unsigned int api_max = priv->cfg->ucode_api_max;
1719         const unsigned int api_min = priv->cfg->ucode_api_min;
1720         char buf[25];
1721         u8 *src;
1722         size_t len;
1723         u32 api_ver, inst_size, data_size, init_size, init_data_size, boot_size;
1724
1725         /* Ask kernel firmware_class module to get the boot firmware off disk.
1726          * request_firmware() is synchronous, file is in memory on return. */
1727         for (index = api_max; index >= api_min; index--) {
1728                 sprintf(buf, "%s%d%s", name_pre, index, ".ucode");
1729                 ret = request_firmware(&ucode_raw, buf, &priv->pci_dev->dev);
1730                 if (ret < 0) {
1731                         IWL_ERR(priv, "%s firmware file req failed: %d\n",
1732                                   buf, ret);
1733                         if (ret == -ENOENT)
1734                                 continue;
1735                         else
1736                                 goto error;
1737                 } else {
1738                         if (index < api_max)
1739                                 IWL_ERR(priv, "Loaded firmware %s, "
1740                                         "which is deprecated. "
1741                                         "Please use API v%u instead.\n",
1742                                           buf, api_max);
1743
1744                         IWL_DEBUG_INFO("Got firmware '%s' file (%zd bytes) from disk\n",
1745                                        buf, ucode_raw->size);
1746                         break;
1747                 }
1748         }
1749
1750         if (ret < 0)
1751                 goto error;
1752
1753         /* Make sure that we got at least our header! */
1754         if (ucode_raw->size < sizeof(*ucode)) {
1755                 IWL_ERR(priv, "File size way too small!\n");
1756                 ret = -EINVAL;
1757                 goto err_release;
1758         }
1759
1760         /* Data from ucode file:  header followed by uCode images */
1761         ucode = (void *)ucode_raw->data;
1762
1763         priv->ucode_ver = le32_to_cpu(ucode->ver);
1764         api_ver = IWL_UCODE_API(priv->ucode_ver);
1765         inst_size = le32_to_cpu(ucode->inst_size);
1766         data_size = le32_to_cpu(ucode->data_size);
1767         init_size = le32_to_cpu(ucode->init_size);
1768         init_data_size = le32_to_cpu(ucode->init_data_size);
1769         boot_size = le32_to_cpu(ucode->boot_size);
1770
1771         /* api_ver should match the api version forming part of the
1772          * firmware filename ... but we don't check for that and only rely
1773          * on the API version read from firware header from here on forward */
1774
1775         if (api_ver < api_min || api_ver > api_max) {
1776                 IWL_ERR(priv, "Driver unable to support your firmware API. "
1777                           "Driver supports v%u, firmware is v%u.\n",
1778                           api_max, api_ver);
1779                 priv->ucode_ver = 0;
1780                 ret = -EINVAL;
1781                 goto err_release;
1782         }
1783         if (api_ver != api_max)
1784                 IWL_ERR(priv, "Firmware has old API version. Expected v%u, "
1785                           "got v%u. New firmware can be obtained "
1786                           "from http://www.intellinuxwireless.org.\n",
1787                           api_max, api_ver);
1788
1789         IWL_INFO(priv, "loaded firmware version %u.%u.%u.%u\n",
1790                IWL_UCODE_MAJOR(priv->ucode_ver),
1791                IWL_UCODE_MINOR(priv->ucode_ver),
1792                IWL_UCODE_API(priv->ucode_ver),
1793                IWL_UCODE_SERIAL(priv->ucode_ver));
1794
1795         IWL_DEBUG_INFO("f/w package hdr ucode version raw = 0x%x\n",
1796                        priv->ucode_ver);
1797         IWL_DEBUG_INFO("f/w package hdr runtime inst size = %u\n",
1798                        inst_size);
1799         IWL_DEBUG_INFO("f/w package hdr runtime data size = %u\n",
1800                        data_size);
1801         IWL_DEBUG_INFO("f/w package hdr init inst size = %u\n",
1802                        init_size);
1803         IWL_DEBUG_INFO("f/w package hdr init data size = %u\n",
1804                        init_data_size);
1805         IWL_DEBUG_INFO("f/w package hdr boot inst size = %u\n",
1806                        boot_size);
1807
1808         /* Verify size of file vs. image size info in file's header */
1809         if (ucode_raw->size < sizeof(*ucode) +
1810                 inst_size + data_size + init_size +
1811                 init_data_size + boot_size) {
1812
1813                 IWL_DEBUG_INFO("uCode file size %d too small\n",
1814                                (int)ucode_raw->size);
1815                 ret = -EINVAL;
1816                 goto err_release;
1817         }
1818
1819         /* Verify that uCode images will fit in card's SRAM */
1820         if (inst_size > priv->hw_params.max_inst_size) {
1821                 IWL_DEBUG_INFO("uCode instr len %d too large to fit in\n",
1822                                inst_size);
1823                 ret = -EINVAL;
1824                 goto err_release;
1825         }
1826
1827         if (data_size > priv->hw_params.max_data_size) {
1828                 IWL_DEBUG_INFO("uCode data len %d too large to fit in\n",
1829                                 data_size);
1830                 ret = -EINVAL;
1831                 goto err_release;
1832         }
1833         if (init_size > priv->hw_params.max_inst_size) {
1834                 IWL_DEBUG_INFO
1835                     ("uCode init instr len %d too large to fit in\n",
1836                       init_size);
1837                 ret = -EINVAL;
1838                 goto err_release;
1839         }
1840         if (init_data_size > priv->hw_params.max_data_size) {
1841                 IWL_DEBUG_INFO
1842                     ("uCode init data len %d too large to fit in\n",
1843                       init_data_size);
1844                 ret = -EINVAL;
1845                 goto err_release;
1846         }
1847         if (boot_size > priv->hw_params.max_bsm_size) {
1848                 IWL_DEBUG_INFO
1849                     ("uCode boot instr len %d too large to fit in\n",
1850                       boot_size);
1851                 ret = -EINVAL;
1852                 goto err_release;
1853         }
1854
1855         /* Allocate ucode buffers for card's bus-master loading ... */
1856
1857         /* Runtime instructions and 2 copies of data:
1858          * 1) unmodified from disk
1859          * 2) backup cache for save/restore during power-downs */
1860         priv->ucode_code.len = inst_size;
1861         iwl_alloc_fw_desc(priv->pci_dev, &priv->ucode_code);
1862
1863         priv->ucode_data.len = data_size;
1864         iwl_alloc_fw_desc(priv->pci_dev, &priv->ucode_data);
1865
1866         priv->ucode_data_backup.len = data_size;
1867         iwl_alloc_fw_desc(priv->pci_dev, &priv->ucode_data_backup);
1868
1869         if (!priv->ucode_code.v_addr || !priv->ucode_data.v_addr ||
1870             !priv->ucode_data_backup.v_addr)
1871                 goto err_pci_alloc;
1872
1873         /* Initialization instructions and data */
1874         if (init_size && init_data_size) {
1875                 priv->ucode_init.len = init_size;
1876                 iwl_alloc_fw_desc(priv->pci_dev, &priv->ucode_init);
1877
1878                 priv->ucode_init_data.len = init_data_size;
1879                 iwl_alloc_fw_desc(priv->pci_dev, &priv->ucode_init_data);
1880
1881                 if (!priv->ucode_init.v_addr || !priv->ucode_init_data.v_addr)
1882                         goto err_pci_alloc;
1883         }
1884
1885         /* Bootstrap (instructions only, no data) */
1886         if (boot_size) {
1887                 priv->ucode_boot.len = boot_size;
1888                 iwl_alloc_fw_desc(priv->pci_dev, &priv->ucode_boot);
1889
1890                 if (!priv->ucode_boot.v_addr)
1891                         goto err_pci_alloc;
1892         }
1893
1894         /* Copy images into buffers for card's bus-master reads ... */
1895
1896         /* Runtime instructions (first block of data in file) */
1897         src = &ucode->data[0];
1898         len = priv->ucode_code.len;
1899         IWL_DEBUG_INFO("Copying (but not loading) uCode instr len %Zd\n", len);
1900         memcpy(priv->ucode_code.v_addr, src, len);
1901         IWL_DEBUG_INFO("uCode instr buf vaddr = 0x%p, paddr = 0x%08x\n",
1902                 priv->ucode_code.v_addr, (u32)priv->ucode_code.p_addr);
1903
1904         /* Runtime data (2nd block)
1905          * NOTE:  Copy into backup buffer will be done in iwl_up()  */
1906         src = &ucode->data[inst_size];
1907         len = priv->ucode_data.len;
1908         IWL_DEBUG_INFO("Copying (but not loading) uCode data len %Zd\n", len);
1909         memcpy(priv->ucode_data.v_addr, src, len);
1910         memcpy(priv->ucode_data_backup.v_addr, src, len);
1911
1912         /* Initialization instructions (3rd block) */
1913         if (init_size) {
1914                 src = &ucode->data[inst_size + data_size];
1915                 len = priv->ucode_init.len;
1916                 IWL_DEBUG_INFO("Copying (but not loading) init instr len %Zd\n",
1917                                 len);
1918                 memcpy(priv->ucode_init.v_addr, src, len);
1919         }
1920
1921         /* Initialization data (4th block) */
1922         if (init_data_size) {
1923                 src = &ucode->data[inst_size + data_size + init_size];
1924                 len = priv->ucode_init_data.len;
1925                 IWL_DEBUG_INFO("Copying (but not loading) init data len %Zd\n",
1926                                len);
1927                 memcpy(priv->ucode_init_data.v_addr, src, len);
1928         }
1929
1930         /* Bootstrap instructions (5th block) */
1931         src = &ucode->data[inst_size + data_size + init_size + init_data_size];
1932         len = priv->ucode_boot.len;
1933         IWL_DEBUG_INFO("Copying (but not loading) boot instr len %Zd\n", len);
1934         memcpy(priv->ucode_boot.v_addr, src, len);
1935
1936         /* We have our copies now, allow OS release its copies */
1937         release_firmware(ucode_raw);
1938         return 0;
1939
1940  err_pci_alloc:
1941         IWL_ERR(priv, "failed to allocate pci memory\n");
1942         ret = -ENOMEM;
1943         iwl_dealloc_ucode_pci(priv);
1944
1945  err_release:
1946         release_firmware(ucode_raw);
1947
1948  error:
1949         return ret;
1950 }
1951
1952 /* temporary */
1953 static int iwl_mac_beacon_update(struct ieee80211_hw *hw,
1954                                  struct sk_buff *skb);
1955
1956 /**
1957  * iwl_alive_start - called after REPLY_ALIVE notification received
1958  *                   from protocol/runtime uCode (initialization uCode's
1959  *                   Alive gets handled by iwl_init_alive_start()).
1960  */
1961 static void iwl_alive_start(struct iwl_priv *priv)
1962 {
1963         int ret = 0;
1964
1965         IWL_DEBUG_INFO("Runtime Alive received.\n");
1966
1967         if (priv->card_alive.is_valid != UCODE_VALID_OK) {
1968                 /* We had an error bringing up the hardware, so take it
1969                  * all the way back down so we can try again */
1970                 IWL_DEBUG_INFO("Alive failed.\n");
1971                 goto restart;
1972         }
1973
1974         /* Initialize uCode has loaded Runtime uCode ... verify inst image.
1975          * This is a paranoid check, because we would not have gotten the
1976          * "runtime" alive if code weren't properly loaded.  */
1977         if (iwl_verify_ucode(priv)) {
1978                 /* Runtime instruction load was bad;
1979                  * take it all the way back down so we can try again */
1980                 IWL_DEBUG_INFO("Bad runtime uCode load.\n");
1981                 goto restart;
1982         }
1983
1984         iwl_clear_stations_table(priv);
1985         ret = priv->cfg->ops->lib->alive_notify(priv);
1986         if (ret) {
1987                 IWL_WARN(priv,
1988                         "Could not complete ALIVE transition [ntf]: %d\n", ret);
1989                 goto restart;
1990         }
1991
1992         /* After the ALIVE response, we can send host commands to the uCode */
1993         set_bit(STATUS_ALIVE, &priv->status);
1994
1995         if (iwl_is_rfkill(priv))
1996                 return;
1997
1998         ieee80211_wake_queues(priv->hw);
1999
2000         priv->active_rate = priv->rates_mask;
2001         priv->active_rate_basic = priv->rates_mask & IWL_BASIC_RATES_MASK;
2002
2003         if (iwl_is_associated(priv)) {
2004                 struct iwl_rxon_cmd *active_rxon =
2005                                 (struct iwl_rxon_cmd *)&priv->active_rxon;
2006
2007                 memcpy(&priv->staging_rxon, &priv->active_rxon,
2008                        sizeof(priv->staging_rxon));
2009                 active_rxon->filter_flags &= ~RXON_FILTER_ASSOC_MSK;
2010         } else {
2011                 /* Initialize our rx_config data */
2012                 iwl_connection_init_rx_config(priv, priv->iw_mode);
2013                 memcpy(priv->staging_rxon.node_addr, priv->mac_addr, ETH_ALEN);
2014         }
2015
2016         /* Configure Bluetooth device coexistence support */
2017         iwl_send_bt_config(priv);
2018
2019         iwl_reset_run_time_calib(priv);
2020
2021         /* Configure the adapter for unassociated operation */
2022         iwl_commit_rxon(priv);
2023
2024         /* At this point, the NIC is initialized and operational */
2025         iwl_rf_kill_ct_config(priv);
2026
2027         iwl_leds_register(priv);
2028
2029         IWL_DEBUG_INFO("ALIVE processing complete.\n");
2030         set_bit(STATUS_READY, &priv->status);
2031         wake_up_interruptible(&priv->wait_command_queue);
2032
2033         if (priv->error_recovering)
2034                 iwl_error_recovery(priv);
2035
2036         iwl_power_update_mode(priv, 1);
2037
2038         /* reassociate for ADHOC mode */
2039         if (priv->vif && (priv->iw_mode == NL80211_IFTYPE_ADHOC)) {
2040                 struct sk_buff *beacon = ieee80211_beacon_get(priv->hw,
2041                                                                 priv->vif);
2042                 if (beacon)
2043                         iwl_mac_beacon_update(priv->hw, beacon);
2044         }
2045
2046
2047         if (test_and_clear_bit(STATUS_MODE_PENDING, &priv->status))
2048                 iwl_set_mode(priv, priv->iw_mode);
2049
2050         return;
2051
2052  restart:
2053         queue_work(priv->workqueue, &priv->restart);
2054 }
2055
2056 static void iwl_cancel_deferred_work(struct iwl_priv *priv);
2057
2058 static void __iwl_down(struct iwl_priv *priv)
2059 {
2060         unsigned long flags;
2061         int exit_pending = test_bit(STATUS_EXIT_PENDING, &priv->status);
2062
2063         IWL_DEBUG_INFO(DRV_NAME " is going down\n");
2064
2065         if (!exit_pending)
2066                 set_bit(STATUS_EXIT_PENDING, &priv->status);
2067
2068         iwl_leds_unregister(priv);
2069
2070         iwl_clear_stations_table(priv);
2071
2072         /* Unblock any waiting calls */
2073         wake_up_interruptible_all(&priv->wait_command_queue);
2074
2075         /* Wipe out the EXIT_PENDING status bit if we are not actually
2076          * exiting the module */
2077         if (!exit_pending)
2078                 clear_bit(STATUS_EXIT_PENDING, &priv->status);
2079
2080         /* stop and reset the on-board processor */
2081         iwl_write32(priv, CSR_RESET, CSR_RESET_REG_FLAG_NEVO_RESET);
2082
2083         /* tell the device to stop sending interrupts */
2084         spin_lock_irqsave(&priv->lock, flags);
2085         iwl_disable_interrupts(priv);
2086         spin_unlock_irqrestore(&priv->lock, flags);
2087         iwl_synchronize_irq(priv);
2088
2089         if (priv->mac80211_registered)
2090                 ieee80211_stop_queues(priv->hw);
2091
2092         /* If we have not previously called iwl_init() then
2093          * clear all bits but the RF Kill and SUSPEND bits and return */
2094         if (!iwl_is_init(priv)) {
2095                 priv->status = test_bit(STATUS_RF_KILL_HW, &priv->status) <<
2096                                         STATUS_RF_KILL_HW |
2097                                test_bit(STATUS_RF_KILL_SW, &priv->status) <<
2098                                         STATUS_RF_KILL_SW |
2099                                test_bit(STATUS_GEO_CONFIGURED, &priv->status) <<
2100                                         STATUS_GEO_CONFIGURED |
2101                                test_bit(STATUS_IN_SUSPEND, &priv->status) <<
2102                                         STATUS_IN_SUSPEND |
2103                                test_bit(STATUS_EXIT_PENDING, &priv->status) <<
2104                                         STATUS_EXIT_PENDING;
2105                 goto exit;
2106         }
2107
2108         /* ...otherwise clear out all the status bits but the RF Kill and
2109          * SUSPEND bits and continue taking the NIC down. */
2110         priv->status &= test_bit(STATUS_RF_KILL_HW, &priv->status) <<
2111                                 STATUS_RF_KILL_HW |
2112                         test_bit(STATUS_RF_KILL_SW, &priv->status) <<
2113                                 STATUS_RF_KILL_SW |
2114                         test_bit(STATUS_GEO_CONFIGURED, &priv->status) <<
2115                                 STATUS_GEO_CONFIGURED |
2116                         test_bit(STATUS_IN_SUSPEND, &priv->status) <<
2117                                 STATUS_IN_SUSPEND |
2118                         test_bit(STATUS_FW_ERROR, &priv->status) <<
2119                                 STATUS_FW_ERROR |
2120                        test_bit(STATUS_EXIT_PENDING, &priv->status) <<
2121                                 STATUS_EXIT_PENDING;
2122
2123         spin_lock_irqsave(&priv->lock, flags);
2124         iwl_clear_bit(priv, CSR_GP_CNTRL,
2125                          CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
2126         spin_unlock_irqrestore(&priv->lock, flags);
2127
2128         iwl_txq_ctx_stop(priv);
2129         iwl_rxq_stop(priv);
2130
2131         spin_lock_irqsave(&priv->lock, flags);
2132         if (!iwl_grab_nic_access(priv)) {
2133                 iwl_write_prph(priv, APMG_CLK_DIS_REG,
2134                                          APMG_CLK_VAL_DMA_CLK_RQT);
2135                 iwl_release_nic_access(priv);
2136         }
2137         spin_unlock_irqrestore(&priv->lock, flags);
2138
2139         udelay(5);
2140
2141         /* FIXME: apm_ops.suspend(priv) */
2142         if (exit_pending || test_bit(STATUS_IN_SUSPEND, &priv->status))
2143                 priv->cfg->ops->lib->apm_ops.stop(priv);
2144         else
2145                 priv->cfg->ops->lib->apm_ops.reset(priv);
2146  exit:
2147         memset(&priv->card_alive, 0, sizeof(struct iwl_alive_resp));
2148
2149         if (priv->ibss_beacon)
2150                 dev_kfree_skb(priv->ibss_beacon);
2151         priv->ibss_beacon = NULL;
2152
2153         /* clear out any free frames */
2154         iwl_clear_free_frames(priv);
2155 }
2156
2157 static void iwl_down(struct iwl_priv *priv)
2158 {
2159         mutex_lock(&priv->mutex);
2160         __iwl_down(priv);
2161         mutex_unlock(&priv->mutex);
2162
2163         iwl_cancel_deferred_work(priv);
2164 }
2165
2166 #define MAX_HW_RESTARTS 5
2167
2168 static int __iwl_up(struct iwl_priv *priv)
2169 {
2170         int i;
2171         int ret;
2172
2173         if (test_bit(STATUS_EXIT_PENDING, &priv->status)) {
2174                 IWL_WARN(priv, "Exit pending; will not bring the NIC up\n");
2175                 return -EIO;
2176         }
2177
2178         if (!priv->ucode_data_backup.v_addr || !priv->ucode_data.v_addr) {
2179                 IWL_ERR(priv, "ucode not available for device bringup\n");
2180                 return -EIO;
2181         }
2182
2183         /* If platform's RF_KILL switch is NOT set to KILL */
2184         if (iwl_read32(priv, CSR_GP_CNTRL) & CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW)
2185                 clear_bit(STATUS_RF_KILL_HW, &priv->status);
2186         else
2187                 set_bit(STATUS_RF_KILL_HW, &priv->status);
2188
2189         if (iwl_is_rfkill(priv)) {
2190                 iwl_enable_interrupts(priv);
2191                 IWL_WARN(priv, "Radio disabled by %s RF Kill switch\n",
2192                     test_bit(STATUS_RF_KILL_HW, &priv->status) ? "HW" : "SW");
2193                 return 0;
2194         }
2195
2196         iwl_write32(priv, CSR_INT, 0xFFFFFFFF);
2197
2198         ret = iwl_hw_nic_init(priv);
2199         if (ret) {
2200                 IWL_ERR(priv, "Unable to init nic\n");
2201                 return ret;
2202         }
2203
2204         /* make sure rfkill handshake bits are cleared */
2205         iwl_write32(priv, CSR_UCODE_DRV_GP1_CLR, CSR_UCODE_SW_BIT_RFKILL);
2206         iwl_write32(priv, CSR_UCODE_DRV_GP1_CLR,
2207                     CSR_UCODE_DRV_GP1_BIT_CMD_BLOCKED);
2208
2209         /* clear (again), then enable host interrupts */
2210         iwl_write32(priv, CSR_INT, 0xFFFFFFFF);
2211         iwl_enable_interrupts(priv);
2212
2213         /* really make sure rfkill handshake bits are cleared */
2214         iwl_write32(priv, CSR_UCODE_DRV_GP1_CLR, CSR_UCODE_SW_BIT_RFKILL);
2215         iwl_write32(priv, CSR_UCODE_DRV_GP1_CLR, CSR_UCODE_SW_BIT_RFKILL);
2216
2217         /* Copy original ucode data image from disk into backup cache.
2218          * This will be used to initialize the on-board processor's
2219          * data SRAM for a clean start when the runtime program first loads. */
2220         memcpy(priv->ucode_data_backup.v_addr, priv->ucode_data.v_addr,
2221                priv->ucode_data.len);
2222
2223         for (i = 0; i < MAX_HW_RESTARTS; i++) {
2224
2225                 iwl_clear_stations_table(priv);
2226
2227                 /* load bootstrap state machine,
2228                  * load bootstrap program into processor's memory,
2229                  * prepare to load the "initialize" uCode */
2230                 ret = priv->cfg->ops->lib->load_ucode(priv);
2231
2232                 if (ret) {
2233                         IWL_ERR(priv, "Unable to set up bootstrap uCode: %d\n",
2234                                 ret);
2235                         continue;
2236                 }
2237
2238                 /* Clear out the uCode error bit if it is set */
2239                 clear_bit(STATUS_FW_ERROR, &priv->status);
2240
2241                 /* start card; "initialize" will load runtime ucode */
2242                 iwl_nic_start(priv);
2243
2244                 IWL_DEBUG_INFO(DRV_NAME " is coming up\n");
2245
2246                 return 0;
2247         }
2248
2249         set_bit(STATUS_EXIT_PENDING, &priv->status);
2250         __iwl_down(priv);
2251         clear_bit(STATUS_EXIT_PENDING, &priv->status);
2252
2253         /* tried to restart and config the device for as long as our
2254          * patience could withstand */
2255         IWL_ERR(priv, "Unable to initialize device after %d attempts.\n", i);
2256         return -EIO;
2257 }
2258
2259
2260 /*****************************************************************************
2261  *
2262  * Workqueue callbacks
2263  *
2264  *****************************************************************************/
2265
2266 static void iwl_bg_init_alive_start(struct work_struct *data)
2267 {
2268         struct iwl_priv *priv =
2269             container_of(data, struct iwl_priv, init_alive_start.work);
2270
2271         if (test_bit(STATUS_EXIT_PENDING, &priv->status))
2272                 return;
2273
2274         mutex_lock(&priv->mutex);
2275         priv->cfg->ops->lib->init_alive_start(priv);
2276         mutex_unlock(&priv->mutex);
2277 }
2278
2279 static void iwl_bg_alive_start(struct work_struct *data)
2280 {
2281         struct iwl_priv *priv =
2282             container_of(data, struct iwl_priv, alive_start.work);
2283
2284         if (test_bit(STATUS_EXIT_PENDING, &priv->status))
2285                 return;
2286
2287         mutex_lock(&priv->mutex);
2288         iwl_alive_start(priv);
2289         mutex_unlock(&priv->mutex);
2290 }
2291
2292 static void iwl_bg_run_time_calib_work(struct work_struct *work)
2293 {
2294         struct iwl_priv *priv = container_of(work, struct iwl_priv,
2295                         run_time_calib_work);
2296
2297         mutex_lock(&priv->mutex);
2298
2299         if (test_bit(STATUS_EXIT_PENDING, &priv->status) ||
2300             test_bit(STATUS_SCANNING, &priv->status)) {
2301                 mutex_unlock(&priv->mutex);
2302                 return;
2303         }
2304
2305         if (priv->start_calib) {
2306                 iwl_chain_noise_calibration(priv, &priv->statistics);
2307
2308                 iwl_sensitivity_calibration(priv, &priv->statistics);
2309         }
2310
2311         mutex_unlock(&priv->mutex);
2312         return;
2313 }
2314
2315 static void iwl_bg_up(struct work_struct *data)
2316 {
2317         struct iwl_priv *priv = container_of(data, struct iwl_priv, up);
2318
2319         if (test_bit(STATUS_EXIT_PENDING, &priv->status))
2320                 return;
2321
2322         mutex_lock(&priv->mutex);
2323         __iwl_up(priv);
2324         mutex_unlock(&priv->mutex);
2325         iwl_rfkill_set_hw_state(priv);
2326 }
2327
2328 static void iwl_bg_restart(struct work_struct *data)
2329 {
2330         struct iwl_priv *priv = container_of(data, struct iwl_priv, restart);
2331
2332         if (test_bit(STATUS_EXIT_PENDING, &priv->status))
2333                 return;
2334
2335         iwl_down(priv);
2336         queue_work(priv->workqueue, &priv->up);
2337 }
2338
2339 static void iwl_bg_rx_replenish(struct work_struct *data)
2340 {
2341         struct iwl_priv *priv =
2342             container_of(data, struct iwl_priv, rx_replenish);
2343
2344         if (test_bit(STATUS_EXIT_PENDING, &priv->status))
2345                 return;
2346
2347         mutex_lock(&priv->mutex);
2348         iwl_rx_replenish(priv);
2349         mutex_unlock(&priv->mutex);
2350 }
2351
2352 #define IWL_DELAY_NEXT_SCAN (HZ*2)
2353
2354 static void iwl_post_associate(struct iwl_priv *priv)
2355 {
2356         struct ieee80211_conf *conf = NULL;
2357         int ret = 0;
2358         unsigned long flags;
2359
2360         if (priv->iw_mode == NL80211_IFTYPE_AP) {
2361                 IWL_ERR(priv, "%s Should not be called in AP mode\n", __func__);
2362                 return;
2363         }
2364
2365         IWL_DEBUG_ASSOC("Associated as %d to: %pM\n",
2366                         priv->assoc_id, priv->active_rxon.bssid_addr);
2367
2368
2369         if (test_bit(STATUS_EXIT_PENDING, &priv->status))
2370                 return;
2371
2372
2373         if (!priv->vif || !priv->is_open)
2374                 return;
2375
2376         iwl_power_cancel_timeout(priv);
2377         iwl_scan_cancel_timeout(priv, 200);
2378
2379         conf = ieee80211_get_hw_conf(priv->hw);
2380
2381         priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
2382         iwl_commit_rxon(priv);
2383
2384         iwl_setup_rxon_timing(priv);
2385         ret = iwl_send_cmd_pdu(priv, REPLY_RXON_TIMING,
2386                               sizeof(priv->rxon_timing), &priv->rxon_timing);
2387         if (ret)
2388                 IWL_WARN(priv, "REPLY_RXON_TIMING failed - "
2389                             "Attempting to continue.\n");
2390
2391         priv->staging_rxon.filter_flags |= RXON_FILTER_ASSOC_MSK;
2392
2393         iwl_set_rxon_ht(priv, &priv->current_ht_config);
2394
2395         iwl_set_rxon_chain(priv);
2396         priv->staging_rxon.assoc_id = cpu_to_le16(priv->assoc_id);
2397
2398         IWL_DEBUG_ASSOC("assoc id %d beacon interval %d\n",
2399                         priv->assoc_id, priv->beacon_int);
2400
2401         if (priv->assoc_capability & WLAN_CAPABILITY_SHORT_PREAMBLE)
2402                 priv->staging_rxon.flags |= RXON_FLG_SHORT_PREAMBLE_MSK;
2403         else
2404                 priv->staging_rxon.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK;
2405
2406         if (priv->staging_rxon.flags & RXON_FLG_BAND_24G_MSK) {
2407                 if (priv->assoc_capability & WLAN_CAPABILITY_SHORT_SLOT_TIME)
2408                         priv->staging_rxon.flags |= RXON_FLG_SHORT_SLOT_MSK;
2409                 else
2410                         priv->staging_rxon.flags &= ~RXON_FLG_SHORT_SLOT_MSK;
2411
2412                 if (priv->iw_mode == NL80211_IFTYPE_ADHOC)
2413                         priv->staging_rxon.flags &= ~RXON_FLG_SHORT_SLOT_MSK;
2414
2415         }
2416
2417         iwl_commit_rxon(priv);
2418
2419         switch (priv->iw_mode) {
2420         case NL80211_IFTYPE_STATION:
2421                 break;
2422
2423         case NL80211_IFTYPE_ADHOC:
2424
2425                 /* assume default assoc id */
2426                 priv->assoc_id = 1;
2427
2428                 iwl_rxon_add_station(priv, priv->bssid, 0);
2429                 iwl_send_beacon_cmd(priv);
2430
2431                 break;
2432
2433         default:
2434                 IWL_ERR(priv, "%s Should not be called in %d mode\n",
2435                           __func__, priv->iw_mode);
2436                 break;
2437         }
2438
2439         if (priv->iw_mode == NL80211_IFTYPE_ADHOC)
2440                 priv->assoc_station_added = 1;
2441
2442         spin_lock_irqsave(&priv->lock, flags);
2443         iwl_activate_qos(priv, 0);
2444         spin_unlock_irqrestore(&priv->lock, flags);
2445
2446         /* the chain noise calibration will enabled PM upon completion
2447          * If chain noise has already been run, then we need to enable
2448          * power management here */
2449         if (priv->chain_noise_data.state == IWL_CHAIN_NOISE_DONE)
2450                 iwl_power_enable_management(priv);
2451
2452         /* Enable Rx differential gain and sensitivity calibrations */
2453         iwl_chain_noise_reset(priv);
2454         priv->start_calib = 1;
2455
2456 }
2457
2458 /*****************************************************************************
2459  *
2460  * mac80211 entry point functions
2461  *
2462  *****************************************************************************/
2463
2464 #define UCODE_READY_TIMEOUT     (4 * HZ)
2465
2466 static int iwl_mac_start(struct ieee80211_hw *hw)
2467 {
2468         struct iwl_priv *priv = hw->priv;
2469         int ret;
2470
2471         IWL_DEBUG_MAC80211("enter\n");
2472
2473         /* we should be verifying the device is ready to be opened */
2474         mutex_lock(&priv->mutex);
2475
2476         memset(&priv->staging_rxon, 0, sizeof(struct iwl_rxon_cmd));
2477         /* fetch ucode file from disk, alloc and copy to bus-master buffers ...
2478          * ucode filename and max sizes are card-specific. */
2479
2480         if (!priv->ucode_code.len) {
2481                 ret = iwl_read_ucode(priv);
2482                 if (ret) {
2483                         IWL_ERR(priv, "Could not read microcode: %d\n", ret);
2484                         mutex_unlock(&priv->mutex);
2485                         return ret;
2486                 }
2487         }
2488
2489         ret = __iwl_up(priv);
2490
2491         mutex_unlock(&priv->mutex);
2492
2493         iwl_rfkill_set_hw_state(priv);
2494
2495         if (ret)
2496                 return ret;
2497
2498         if (iwl_is_rfkill(priv))
2499                 goto out;
2500
2501         IWL_DEBUG_INFO("Start UP work done.\n");
2502
2503         if (test_bit(STATUS_IN_SUSPEND, &priv->status))
2504                 return 0;
2505
2506         /* Wait for START_ALIVE from Run Time ucode. Otherwise callbacks from
2507          * mac80211 will not be run successfully. */
2508         ret = wait_event_interruptible_timeout(priv->wait_command_queue,
2509                         test_bit(STATUS_READY, &priv->status),
2510                         UCODE_READY_TIMEOUT);
2511         if (!ret) {
2512                 if (!test_bit(STATUS_READY, &priv->status)) {
2513                         IWL_ERR(priv, "START_ALIVE timeout after %dms.\n",
2514                                 jiffies_to_msecs(UCODE_READY_TIMEOUT));
2515                         return -ETIMEDOUT;
2516                 }
2517         }
2518
2519 out:
2520         priv->is_open = 1;
2521         IWL_DEBUG_MAC80211("leave\n");
2522         return 0;
2523 }
2524
2525 static void iwl_mac_stop(struct ieee80211_hw *hw)
2526 {
2527         struct iwl_priv *priv = hw->priv;
2528
2529         IWL_DEBUG_MAC80211("enter\n");
2530
2531         if (!priv->is_open) {
2532                 IWL_DEBUG_MAC80211("leave - skip\n");
2533                 return;
2534         }
2535
2536         priv->is_open = 0;
2537
2538         if (iwl_is_ready_rf(priv)) {
2539                 /* stop mac, cancel any scan request and clear
2540                  * RXON_FILTER_ASSOC_MSK BIT
2541                  */
2542                 mutex_lock(&priv->mutex);
2543                 iwl_scan_cancel_timeout(priv, 100);
2544                 mutex_unlock(&priv->mutex);
2545         }
2546
2547         iwl_down(priv);
2548
2549         flush_workqueue(priv->workqueue);
2550
2551         /* enable interrupts again in order to receive rfkill changes */
2552         iwl_write32(priv, CSR_INT, 0xFFFFFFFF);
2553         iwl_enable_interrupts(priv);
2554
2555         IWL_DEBUG_MAC80211("leave\n");
2556 }
2557
2558 static int iwl_mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
2559 {
2560         struct iwl_priv *priv = hw->priv;
2561
2562         IWL_DEBUG_MACDUMP("enter\n");
2563
2564         IWL_DEBUG_TX("dev->xmit(%d bytes) at rate 0x%02x\n", skb->len,
2565                      ieee80211_get_tx_rate(hw, IEEE80211_SKB_CB(skb))->bitrate);
2566
2567         if (iwl_tx_skb(priv, skb))
2568                 dev_kfree_skb_any(skb);
2569
2570         IWL_DEBUG_MACDUMP("leave\n");
2571         return NETDEV_TX_OK;
2572 }
2573
2574 static int iwl_mac_add_interface(struct ieee80211_hw *hw,
2575                                  struct ieee80211_if_init_conf *conf)
2576 {
2577         struct iwl_priv *priv = hw->priv;
2578         unsigned long flags;
2579
2580         IWL_DEBUG_MAC80211("enter: type %d\n", conf->type);
2581
2582         if (priv->vif) {
2583                 IWL_DEBUG_MAC80211("leave - vif != NULL\n");
2584                 return -EOPNOTSUPP;
2585         }
2586
2587         spin_lock_irqsave(&priv->lock, flags);
2588         priv->vif = conf->vif;
2589         priv->iw_mode = conf->type;
2590
2591         spin_unlock_irqrestore(&priv->lock, flags);
2592
2593         mutex_lock(&priv->mutex);
2594
2595         if (conf->mac_addr) {
2596                 IWL_DEBUG_MAC80211("Set %pM\n", conf->mac_addr);
2597                 memcpy(priv->mac_addr, conf->mac_addr, ETH_ALEN);
2598         }
2599
2600         if (iwl_set_mode(priv, conf->type) == -EAGAIN)
2601                 /* we are not ready, will run again when ready */
2602                 set_bit(STATUS_MODE_PENDING, &priv->status);
2603
2604         mutex_unlock(&priv->mutex);
2605
2606         IWL_DEBUG_MAC80211("leave\n");
2607         return 0;
2608 }
2609
2610 /**
2611  * iwl_mac_config - mac80211 config callback
2612  *
2613  * We ignore conf->flags & IEEE80211_CONF_SHORT_SLOT_TIME since it seems to
2614  * be set inappropriately and the driver currently sets the hardware up to
2615  * use it whenever needed.
2616  */
2617 static int iwl_mac_config(struct ieee80211_hw *hw, u32 changed)
2618 {
2619         struct iwl_priv *priv = hw->priv;
2620         const struct iwl_channel_info *ch_info;
2621         struct ieee80211_conf *conf = &hw->conf;
2622         unsigned long flags;
2623         int ret = 0;
2624         u16 channel;
2625
2626         mutex_lock(&priv->mutex);
2627         IWL_DEBUG_MAC80211("enter to channel %d\n", conf->channel->hw_value);
2628
2629         priv->current_ht_config.is_ht = conf_is_ht(conf);
2630
2631         if (conf->radio_enabled && iwl_radio_kill_sw_enable_radio(priv)) {
2632                 IWL_DEBUG_MAC80211("leave - RF-KILL - waiting for uCode\n");
2633                 goto out;
2634         }
2635
2636         if (!conf->radio_enabled)
2637                 iwl_radio_kill_sw_disable_radio(priv);
2638
2639         if (!iwl_is_ready(priv)) {
2640                 IWL_DEBUG_MAC80211("leave - not ready\n");
2641                 ret = -EIO;
2642                 goto out;
2643         }
2644
2645         if (unlikely(!priv->cfg->mod_params->disable_hw_scan &&
2646                      test_bit(STATUS_SCANNING, &priv->status))) {
2647                 IWL_DEBUG_MAC80211("leave - scanning\n");
2648                 mutex_unlock(&priv->mutex);
2649                 return 0;
2650         }
2651
2652         channel = ieee80211_frequency_to_channel(conf->channel->center_freq);
2653         ch_info = iwl_get_channel_info(priv, conf->channel->band, channel);
2654         if (!is_channel_valid(ch_info)) {
2655                 IWL_DEBUG_MAC80211("leave - invalid channel\n");
2656                 ret = -EINVAL;
2657                 goto out;
2658         }
2659
2660         if (priv->iw_mode == NL80211_IFTYPE_ADHOC &&
2661             !is_channel_ibss(ch_info)) {
2662                 IWL_ERR(priv, "channel %d in band %d not IBSS channel\n",
2663                         conf->channel->hw_value, conf->channel->band);
2664                 ret = -EINVAL;
2665                 goto out;
2666         }
2667
2668         spin_lock_irqsave(&priv->lock, flags);
2669
2670
2671         /* if we are switching from ht to 2.4 clear flags
2672          * from any ht related info since 2.4 does not
2673          * support ht */
2674         if ((le16_to_cpu(priv->staging_rxon.channel) != channel)
2675 #ifdef IEEE80211_CONF_CHANNEL_SWITCH
2676             && !(conf->flags & IEEE80211_CONF_CHANNEL_SWITCH)
2677 #endif
2678         )
2679                 priv->staging_rxon.flags = 0;
2680
2681         iwl_set_rxon_channel(priv, conf->channel);
2682
2683         iwl_set_flags_for_band(priv, conf->channel->band);
2684
2685         /* The list of supported rates and rate mask can be different
2686          * for each band; since the band may have changed, reset
2687          * the rate mask to what mac80211 lists */
2688         iwl_set_rate(priv);
2689
2690         spin_unlock_irqrestore(&priv->lock, flags);
2691
2692 #ifdef IEEE80211_CONF_CHANNEL_SWITCH
2693         if (conf->flags & IEEE80211_CONF_CHANNEL_SWITCH) {
2694                 iwl_hw_channel_switch(priv, conf->channel);
2695                 goto out;
2696         }
2697 #endif
2698
2699         if (!conf->radio_enabled) {
2700                 IWL_DEBUG_MAC80211("leave - radio disabled\n");
2701                 goto out;
2702         }
2703
2704         if (iwl_is_rfkill(priv)) {
2705                 IWL_DEBUG_MAC80211("leave - RF kill\n");
2706                 ret = -EIO;
2707                 goto out;
2708         }
2709
2710         if (conf->flags & IEEE80211_CONF_PS)
2711                 ret = iwl_power_set_user_mode(priv, IWL_POWER_INDEX_3);
2712         else
2713                 ret = iwl_power_set_user_mode(priv, IWL_POWER_MODE_CAM);
2714         if (ret)
2715                 IWL_DEBUG_MAC80211("Error setting power level\n");
2716
2717         IWL_DEBUG_MAC80211("TX Power old=%d new=%d\n",
2718                            priv->tx_power_user_lmt, conf->power_level);
2719
2720         iwl_set_tx_power(priv, conf->power_level, false);
2721
2722         iwl_set_rate(priv);
2723
2724         /* call to ensure that 4965 rx_chain is set properly in monitor mode */
2725         iwl_set_rxon_chain(priv);
2726
2727         if (memcmp(&priv->active_rxon,
2728                    &priv->staging_rxon, sizeof(priv->staging_rxon)))
2729                 iwl_commit_rxon(priv);
2730         else
2731                 IWL_DEBUG_INFO("No re-sending same RXON configuration.\n");
2732
2733         IWL_DEBUG_MAC80211("leave\n");
2734
2735 out:
2736         mutex_unlock(&priv->mutex);
2737         return ret;
2738 }
2739
2740 static void iwl_config_ap(struct iwl_priv *priv)
2741 {
2742         int ret = 0;
2743         unsigned long flags;
2744
2745         if (test_bit(STATUS_EXIT_PENDING, &priv->status))
2746                 return;
2747
2748         /* The following should be done only at AP bring up */
2749         if (!iwl_is_associated(priv)) {
2750
2751                 /* RXON - unassoc (to set timing command) */
2752                 priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
2753                 iwl_commit_rxon(priv);
2754
2755                 /* RXON Timing */
2756                 iwl_setup_rxon_timing(priv);
2757                 ret = iwl_send_cmd_pdu(priv, REPLY_RXON_TIMING,
2758                                 sizeof(priv->rxon_timing), &priv->rxon_timing);
2759                 if (ret)
2760                         IWL_WARN(priv, "REPLY_RXON_TIMING failed - "
2761                                         "Attempting to continue.\n");
2762
2763                 iwl_set_rxon_chain(priv);
2764
2765                 /* FIXME: what should be the assoc_id for AP? */
2766                 priv->staging_rxon.assoc_id = cpu_to_le16(priv->assoc_id);
2767                 if (priv->assoc_capability & WLAN_CAPABILITY_SHORT_PREAMBLE)
2768                         priv->staging_rxon.flags |=
2769                                 RXON_FLG_SHORT_PREAMBLE_MSK;
2770                 else
2771                         priv->staging_rxon.flags &=
2772                                 ~RXON_FLG_SHORT_PREAMBLE_MSK;
2773
2774                 if (priv->staging_rxon.flags & RXON_FLG_BAND_24G_MSK) {
2775                         if (priv->assoc_capability &
2776                                 WLAN_CAPABILITY_SHORT_SLOT_TIME)
2777                                 priv->staging_rxon.flags |=
2778                                         RXON_FLG_SHORT_SLOT_MSK;
2779                         else
2780                                 priv->staging_rxon.flags &=
2781                                         ~RXON_FLG_SHORT_SLOT_MSK;
2782
2783                         if (priv->iw_mode == NL80211_IFTYPE_ADHOC)
2784                                 priv->staging_rxon.flags &=
2785                                         ~RXON_FLG_SHORT_SLOT_MSK;
2786                 }
2787                 /* restore RXON assoc */
2788                 priv->staging_rxon.filter_flags |= RXON_FILTER_ASSOC_MSK;
2789                 iwl_commit_rxon(priv);
2790                 spin_lock_irqsave(&priv->lock, flags);
2791                 iwl_activate_qos(priv, 1);
2792                 spin_unlock_irqrestore(&priv->lock, flags);
2793                 iwl_rxon_add_station(priv, iwl_bcast_addr, 0);
2794         }
2795         iwl_send_beacon_cmd(priv);
2796
2797         /* FIXME - we need to add code here to detect a totally new
2798          * configuration, reset the AP, unassoc, rxon timing, assoc,
2799          * clear sta table, add BCAST sta... */
2800 }
2801
2802
2803 static int iwl_mac_config_interface(struct ieee80211_hw *hw,
2804                                         struct ieee80211_vif *vif,
2805                                     struct ieee80211_if_conf *conf)
2806 {
2807         struct iwl_priv *priv = hw->priv;
2808         int rc;
2809
2810         if (conf == NULL)
2811                 return -EIO;
2812
2813         if (priv->vif != vif) {
2814                 IWL_DEBUG_MAC80211("leave - priv->vif != vif\n");
2815                 return 0;
2816         }
2817
2818         if (priv->iw_mode == NL80211_IFTYPE_ADHOC &&
2819             conf->changed & IEEE80211_IFCC_BEACON) {
2820                 struct sk_buff *beacon = ieee80211_beacon_get(hw, vif);
2821                 if (!beacon)
2822                         return -ENOMEM;
2823                 mutex_lock(&priv->mutex);
2824                 rc = iwl_mac_beacon_update(hw, beacon);
2825                 mutex_unlock(&priv->mutex);
2826                 if (rc)
2827                         return rc;
2828         }
2829
2830         if (!iwl_is_alive(priv))
2831                 return -EAGAIN;
2832
2833         mutex_lock(&priv->mutex);
2834
2835         if (conf->bssid)
2836                 IWL_DEBUG_MAC80211("bssid: %pM\n", conf->bssid);
2837
2838 /*
2839  * very dubious code was here; the probe filtering flag is never set:
2840  *
2841         if (unlikely(test_bit(STATUS_SCANNING, &priv->status)) &&
2842             !(priv->hw->flags & IEEE80211_HW_NO_PROBE_FILTERING)) {
2843  */
2844
2845         if (priv->iw_mode == NL80211_IFTYPE_AP) {
2846                 if (!conf->bssid) {
2847                         conf->bssid = priv->mac_addr;
2848                         memcpy(priv->bssid, priv->mac_addr, ETH_ALEN);
2849                         IWL_DEBUG_MAC80211("bssid was set to: %pM\n",
2850                                            conf->bssid);
2851                 }
2852                 if (priv->ibss_beacon)
2853                         dev_kfree_skb(priv->ibss_beacon);
2854
2855                 priv->ibss_beacon = ieee80211_beacon_get(hw, vif);
2856         }
2857
2858         if (iwl_is_rfkill(priv))
2859                 goto done;
2860
2861         if (conf->bssid && !is_zero_ether_addr(conf->bssid) &&
2862             !is_multicast_ether_addr(conf->bssid)) {
2863                 /* If there is currently a HW scan going on in the background
2864                  * then we need to cancel it else the RXON below will fail. */
2865                 if (iwl_scan_cancel_timeout(priv, 100)) {
2866                         IWL_WARN(priv, "Aborted scan still in progress "
2867                                     "after 100ms\n");
2868                         IWL_DEBUG_MAC80211("leaving - scan abort failed.\n");
2869                         mutex_unlock(&priv->mutex);
2870                         return -EAGAIN;
2871                 }
2872                 memcpy(priv->staging_rxon.bssid_addr, conf->bssid, ETH_ALEN);
2873
2874                 /* TODO: Audit driver for usage of these members and see
2875                  * if mac80211 deprecates them (priv->bssid looks like it
2876                  * shouldn't be there, but I haven't scanned the IBSS code
2877                  * to verify) - jpk */
2878                 memcpy(priv->bssid, conf->bssid, ETH_ALEN);
2879
2880                 if (priv->iw_mode == NL80211_IFTYPE_AP)
2881                         iwl_config_ap(priv);
2882                 else {
2883                         rc = iwl_commit_rxon(priv);
2884                         if ((priv->iw_mode == NL80211_IFTYPE_STATION) && rc)
2885                                 iwl_rxon_add_station(
2886                                         priv, priv->active_rxon.bssid_addr, 1);
2887                 }
2888
2889         } else {
2890                 iwl_scan_cancel_timeout(priv, 100);
2891                 priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
2892                 iwl_commit_rxon(priv);
2893         }
2894
2895  done:
2896         IWL_DEBUG_MAC80211("leave\n");
2897         mutex_unlock(&priv->mutex);
2898
2899         return 0;
2900 }
2901
2902 static void iwl_configure_filter(struct ieee80211_hw *hw,
2903                                  unsigned int changed_flags,
2904                                  unsigned int *total_flags,
2905                                  int mc_count, struct dev_addr_list *mc_list)
2906 {
2907         struct iwl_priv *priv = hw->priv;
2908         __le32 *filter_flags = &priv->staging_rxon.filter_flags;
2909
2910         IWL_DEBUG_MAC80211("Enter: changed: 0x%x, total: 0x%x\n",
2911                         changed_flags, *total_flags);
2912
2913         if (changed_flags & (FIF_OTHER_BSS | FIF_PROMISC_IN_BSS)) {
2914                 if (*total_flags & (FIF_OTHER_BSS | FIF_PROMISC_IN_BSS))
2915                         *filter_flags |= RXON_FILTER_PROMISC_MSK;
2916                 else
2917                         *filter_flags &= ~RXON_FILTER_PROMISC_MSK;
2918         }
2919         if (changed_flags & FIF_ALLMULTI) {
2920                 if (*total_flags & FIF_ALLMULTI)
2921                         *filter_flags |= RXON_FILTER_ACCEPT_GRP_MSK;
2922                 else
2923                         *filter_flags &= ~RXON_FILTER_ACCEPT_GRP_MSK;
2924         }
2925         if (changed_flags & FIF_CONTROL) {
2926                 if (*total_flags & FIF_CONTROL)
2927                         *filter_flags |= RXON_FILTER_CTL2HOST_MSK;
2928                 else
2929                         *filter_flags &= ~RXON_FILTER_CTL2HOST_MSK;
2930         }
2931         if (changed_flags & FIF_BCN_PRBRESP_PROMISC) {
2932                 if (*total_flags & FIF_BCN_PRBRESP_PROMISC)
2933                         *filter_flags |= RXON_FILTER_BCON_AWARE_MSK;
2934                 else
2935                         *filter_flags &= ~RXON_FILTER_BCON_AWARE_MSK;
2936         }
2937
2938         /* We avoid iwl_commit_rxon here to commit the new filter flags
2939          * since mac80211 will call ieee80211_hw_config immediately.
2940          * (mc_list is not supported at this time). Otherwise, we need to
2941          * queue a background iwl_commit_rxon work.
2942          */
2943
2944         *total_flags &= FIF_OTHER_BSS | FIF_ALLMULTI | FIF_PROMISC_IN_BSS |
2945                         FIF_BCN_PRBRESP_PROMISC | FIF_CONTROL;
2946 }
2947
2948 static void iwl_mac_remove_interface(struct ieee80211_hw *hw,
2949                                      struct ieee80211_if_init_conf *conf)
2950 {
2951         struct iwl_priv *priv = hw->priv;
2952
2953         IWL_DEBUG_MAC80211("enter\n");
2954
2955         mutex_lock(&priv->mutex);
2956
2957         if (iwl_is_ready_rf(priv)) {
2958                 iwl_scan_cancel_timeout(priv, 100);
2959                 priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
2960                 iwl_commit_rxon(priv);
2961         }
2962         if (priv->vif == conf->vif) {
2963                 priv->vif = NULL;
2964                 memset(priv->bssid, 0, ETH_ALEN);
2965         }
2966         mutex_unlock(&priv->mutex);
2967
2968         IWL_DEBUG_MAC80211("leave\n");
2969
2970 }
2971
2972 #define IWL_DELAY_NEXT_SCAN_AFTER_ASSOC (HZ*6)
2973 static void iwl_bss_info_changed(struct ieee80211_hw *hw,
2974                                      struct ieee80211_vif *vif,
2975                                      struct ieee80211_bss_conf *bss_conf,
2976                                      u32 changes)
2977 {
2978         struct iwl_priv *priv = hw->priv;
2979
2980         IWL_DEBUG_MAC80211("changes = 0x%X\n", changes);
2981
2982         if (changes & BSS_CHANGED_ERP_PREAMBLE) {
2983                 IWL_DEBUG_MAC80211("ERP_PREAMBLE %d\n",
2984                                    bss_conf->use_short_preamble);
2985                 if (bss_conf->use_short_preamble)
2986                         priv->staging_rxon.flags |= RXON_FLG_SHORT_PREAMBLE_MSK;
2987                 else
2988                         priv->staging_rxon.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK;
2989         }
2990
2991         if (changes & BSS_CHANGED_ERP_CTS_PROT) {
2992                 IWL_DEBUG_MAC80211("ERP_CTS %d\n", bss_conf->use_cts_prot);
2993                 if (bss_conf->use_cts_prot && (priv->band != IEEE80211_BAND_5GHZ))
2994                         priv->staging_rxon.flags |= RXON_FLG_TGG_PROTECT_MSK;
2995                 else
2996                         priv->staging_rxon.flags &= ~RXON_FLG_TGG_PROTECT_MSK;
2997         }
2998
2999         if (changes & BSS_CHANGED_HT) {
3000                 iwl_ht_conf(priv, bss_conf);
3001                 iwl_set_rxon_chain(priv);
3002         }
3003
3004         if (changes & BSS_CHANGED_ASSOC) {
3005                 IWL_DEBUG_MAC80211("ASSOC %d\n", bss_conf->assoc);
3006                 /* This should never happen as this function should
3007                  * never be called from interrupt context. */
3008                 if (WARN_ON_ONCE(in_interrupt()))
3009                         return;
3010                 if (bss_conf->assoc) {
3011                         priv->assoc_id = bss_conf->aid;
3012                         priv->beacon_int = bss_conf->beacon_int;
3013                         priv->power_data.dtim_period = bss_conf->dtim_period;
3014                         priv->timestamp = bss_conf->timestamp;
3015                         priv->assoc_capability = bss_conf->assoc_capability;
3016
3017                         /* we have just associated, don't start scan too early
3018                          * leave time for EAPOL exchange to complete
3019                          */
3020                         priv->next_scan_jiffies = jiffies +
3021                                         IWL_DELAY_NEXT_SCAN_AFTER_ASSOC;
3022                         mutex_lock(&priv->mutex);
3023                         iwl_post_associate(priv);
3024                         mutex_unlock(&priv->mutex);
3025                 } else {
3026                         priv->assoc_id = 0;
3027                         IWL_DEBUG_MAC80211("DISASSOC %d\n", bss_conf->assoc);
3028                 }
3029         } else if (changes && iwl_is_associated(priv) && priv->assoc_id) {
3030                         IWL_DEBUG_MAC80211("Associated Changes %d\n", changes);
3031                         iwl_send_rxon_assoc(priv);
3032         }
3033
3034 }
3035
3036 static int iwl_mac_hw_scan(struct ieee80211_hw *hw, u8 *ssid, size_t ssid_len)
3037 {
3038         unsigned long flags;
3039         struct iwl_priv *priv = hw->priv;
3040         int ret;
3041
3042         IWL_DEBUG_MAC80211("enter\n");
3043
3044         mutex_lock(&priv->mutex);
3045         spin_lock_irqsave(&priv->lock, flags);
3046
3047         if (!iwl_is_ready_rf(priv)) {
3048                 ret = -EIO;
3049                 IWL_DEBUG_MAC80211("leave - not ready or exit pending\n");
3050                 goto out_unlock;
3051         }
3052
3053         /* We don't schedule scan within next_scan_jiffies period.
3054          * Avoid scanning during possible EAPOL exchange, return
3055          * success immediately.
3056          */
3057         if (priv->next_scan_jiffies &&
3058             time_after(priv->next_scan_jiffies, jiffies)) {
3059                 IWL_DEBUG_SCAN("scan rejected: within next scan period\n");
3060                 queue_work(priv->workqueue, &priv->scan_completed);
3061                 ret = 0;
3062                 goto out_unlock;
3063         }
3064
3065         /* if we just finished scan ask for delay */
3066         if (iwl_is_associated(priv) && priv->last_scan_jiffies &&
3067             time_after(priv->last_scan_jiffies + IWL_DELAY_NEXT_SCAN, jiffies)) {
3068                 IWL_DEBUG_SCAN("scan rejected: within previous scan period\n");
3069                 queue_work(priv->workqueue, &priv->scan_completed);
3070                 ret = 0;
3071                 goto out_unlock;
3072         }
3073
3074         if (ssid_len) {
3075                 priv->one_direct_scan = 1;
3076                 priv->direct_ssid_len =  min_t(u8, ssid_len, IW_ESSID_MAX_SIZE);
3077                 memcpy(priv->direct_ssid, ssid, priv->direct_ssid_len);
3078         } else {
3079                 priv->one_direct_scan = 0;
3080         }
3081
3082         ret = iwl_scan_initiate(priv);
3083
3084         IWL_DEBUG_MAC80211("leave\n");
3085
3086 out_unlock:
3087         spin_unlock_irqrestore(&priv->lock, flags);
3088         mutex_unlock(&priv->mutex);
3089
3090         return ret;
3091 }
3092
3093 static void iwl_mac_update_tkip_key(struct ieee80211_hw *hw,
3094                         struct ieee80211_key_conf *keyconf, const u8 *addr,
3095                         u32 iv32, u16 *phase1key)
3096 {
3097
3098         struct iwl_priv *priv = hw->priv;
3099         IWL_DEBUG_MAC80211("enter\n");
3100
3101         iwl_update_tkip_key(priv, keyconf, addr, iv32, phase1key);
3102
3103         IWL_DEBUG_MAC80211("leave\n");
3104 }
3105
3106 static int iwl_mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
3107                            struct ieee80211_vif *vif,
3108                            struct ieee80211_sta *sta,
3109                            struct ieee80211_key_conf *key)
3110 {
3111         struct iwl_priv *priv = hw->priv;
3112         const u8 *addr;
3113         int ret;
3114         u8 sta_id;
3115         bool is_default_wep_key = false;
3116
3117         IWL_DEBUG_MAC80211("enter\n");
3118
3119         if (priv->hw_params.sw_crypto) {
3120                 IWL_DEBUG_MAC80211("leave - hwcrypto disabled\n");
3121                 return -EOPNOTSUPP;
3122         }
3123         addr = sta ? sta->addr : iwl_bcast_addr;
3124         sta_id = iwl_find_station(priv, addr);
3125         if (sta_id == IWL_INVALID_STATION) {
3126                 IWL_DEBUG_MAC80211("leave - %pM not in station map.\n",
3127                                    addr);
3128                 return -EINVAL;
3129
3130         }
3131
3132         mutex_lock(&priv->mutex);
3133         iwl_scan_cancel_timeout(priv, 100);
3134         mutex_unlock(&priv->mutex);
3135
3136         /* If we are getting WEP group key and we didn't receive any key mapping
3137          * so far, we are in legacy wep mode (group key only), otherwise we are
3138          * in 1X mode.
3139          * In legacy wep mode, we use another host command to the uCode */
3140         if (key->alg == ALG_WEP && sta_id == priv->hw_params.bcast_sta_id &&
3141                 priv->iw_mode != NL80211_IFTYPE_AP) {
3142                 if (cmd == SET_KEY)
3143                         is_default_wep_key = !priv->key_mapping_key;
3144                 else
3145                         is_default_wep_key =
3146                                         (key->hw_key_idx == HW_KEY_DEFAULT);
3147         }
3148
3149         switch (cmd) {
3150         case SET_KEY:
3151                 if (is_default_wep_key)
3152                         ret = iwl_set_default_wep_key(priv, key);
3153                 else
3154                         ret = iwl_set_dynamic_key(priv, key, sta_id);
3155
3156                 IWL_DEBUG_MAC80211("enable hwcrypto key\n");
3157                 break;
3158         case DISABLE_KEY:
3159                 if (is_default_wep_key)
3160                         ret = iwl_remove_default_wep_key(priv, key);
3161                 else
3162                         ret = iwl_remove_dynamic_key(priv, key, sta_id);
3163
3164                 IWL_DEBUG_MAC80211("disable hwcrypto key\n");
3165                 break;
3166         default:
3167                 ret = -EINVAL;
3168         }
3169
3170         IWL_DEBUG_MAC80211("leave\n");
3171
3172         return ret;
3173 }
3174
3175 static int iwl_mac_conf_tx(struct ieee80211_hw *hw, u16 queue,
3176                            const struct ieee80211_tx_queue_params *params)
3177 {
3178         struct iwl_priv *priv = hw->priv;
3179         unsigned long flags;
3180         int q;
3181
3182         IWL_DEBUG_MAC80211("enter\n");
3183
3184         if (!iwl_is_ready_rf(priv)) {
3185                 IWL_DEBUG_MAC80211("leave - RF not ready\n");
3186                 return -EIO;
3187         }
3188
3189         if (queue >= AC_NUM) {
3190                 IWL_DEBUG_MAC80211("leave - queue >= AC_NUM %d\n", queue);
3191                 return 0;
3192         }
3193
3194         q = AC_NUM - 1 - queue;
3195
3196         spin_lock_irqsave(&priv->lock, flags);
3197
3198         priv->qos_data.def_qos_parm.ac[q].cw_min = cpu_to_le16(params->cw_min);
3199         priv->qos_data.def_qos_parm.ac[q].cw_max = cpu_to_le16(params->cw_max);
3200         priv->qos_data.def_qos_parm.ac[q].aifsn = params->aifs;
3201         priv->qos_data.def_qos_parm.ac[q].edca_txop =
3202                         cpu_to_le16((params->txop * 32));
3203
3204         priv->qos_data.def_qos_parm.ac[q].reserved1 = 0;
3205         priv->qos_data.qos_active = 1;
3206
3207         if (priv->iw_mode == NL80211_IFTYPE_AP)
3208                 iwl_activate_qos(priv, 1);
3209         else if (priv->assoc_id && iwl_is_associated(priv))
3210                 iwl_activate_qos(priv, 0);
3211
3212         spin_unlock_irqrestore(&priv->lock, flags);
3213
3214         IWL_DEBUG_MAC80211("leave\n");
3215         return 0;
3216 }
3217
3218 static int iwl_mac_ampdu_action(struct ieee80211_hw *hw,
3219                              enum ieee80211_ampdu_mlme_action action,
3220                              struct ieee80211_sta *sta, u16 tid, u16 *ssn)
3221 {
3222         struct iwl_priv *priv = hw->priv;
3223
3224         IWL_DEBUG_HT("A-MPDU action on addr %pM tid %d\n",
3225                      sta->addr, tid);
3226
3227         if (!(priv->cfg->sku & IWL_SKU_N))
3228                 return -EACCES;
3229
3230         switch (action) {
3231         case IEEE80211_AMPDU_RX_START:
3232                 IWL_DEBUG_HT("start Rx\n");
3233                 return iwl_sta_rx_agg_start(priv, sta->addr, tid, *ssn);
3234         case IEEE80211_AMPDU_RX_STOP:
3235                 IWL_DEBUG_HT("stop Rx\n");
3236                 return iwl_sta_rx_agg_stop(priv, sta->addr, tid);
3237         case IEEE80211_AMPDU_TX_START:
3238                 IWL_DEBUG_HT("start Tx\n");
3239                 return iwl_tx_agg_start(priv, sta->addr, tid, ssn);
3240         case IEEE80211_AMPDU_TX_STOP:
3241                 IWL_DEBUG_HT("stop Tx\n");
3242                 return iwl_tx_agg_stop(priv, sta->addr, tid);
3243         default:
3244                 IWL_DEBUG_HT("unknown\n");
3245                 return -EINVAL;
3246                 break;
3247         }
3248         return 0;
3249 }
3250
3251 static int iwl_mac_get_tx_stats(struct ieee80211_hw *hw,
3252                                 struct ieee80211_tx_queue_stats *stats)
3253 {
3254         struct iwl_priv *priv = hw->priv;
3255         int i, avail;
3256         struct iwl_tx_queue *txq;
3257         struct iwl_queue *q;
3258         unsigned long flags;
3259
3260         IWL_DEBUG_MAC80211("enter\n");
3261
3262         if (!iwl_is_ready_rf(priv)) {
3263                 IWL_DEBUG_MAC80211("leave - RF not ready\n");
3264                 return -EIO;
3265         }
3266
3267         spin_lock_irqsave(&priv->lock, flags);
3268
3269         for (i = 0; i < AC_NUM; i++) {
3270                 txq = &priv->txq[i];
3271                 q = &txq->q;
3272                 avail = iwl_queue_space(q);
3273
3274                 stats[i].len = q->n_window - avail;
3275                 stats[i].limit = q->n_window - q->high_mark;
3276                 stats[i].count = q->n_window;
3277
3278         }
3279         spin_unlock_irqrestore(&priv->lock, flags);
3280
3281         IWL_DEBUG_MAC80211("leave\n");
3282
3283         return 0;
3284 }
3285
3286 static int iwl_mac_get_stats(struct ieee80211_hw *hw,
3287                              struct ieee80211_low_level_stats *stats)
3288 {
3289         struct iwl_priv *priv = hw->priv;
3290
3291         priv = hw->priv;
3292         IWL_DEBUG_MAC80211("enter\n");
3293         IWL_DEBUG_MAC80211("leave\n");
3294
3295         return 0;
3296 }
3297
3298 static void iwl_mac_reset_tsf(struct ieee80211_hw *hw)
3299 {
3300         struct iwl_priv *priv = hw->priv;
3301         unsigned long flags;
3302
3303         mutex_lock(&priv->mutex);
3304         IWL_DEBUG_MAC80211("enter\n");
3305
3306         spin_lock_irqsave(&priv->lock, flags);
3307         memset(&priv->current_ht_config, 0, sizeof(struct iwl_ht_info));
3308         spin_unlock_irqrestore(&priv->lock, flags);
3309
3310         iwl_reset_qos(priv);
3311
3312         spin_lock_irqsave(&priv->lock, flags);
3313         priv->assoc_id = 0;
3314         priv->assoc_capability = 0;
3315         priv->assoc_station_added = 0;
3316
3317         /* new association get rid of ibss beacon skb */
3318         if (priv->ibss_beacon)
3319                 dev_kfree_skb(priv->ibss_beacon);
3320
3321         priv->ibss_beacon = NULL;
3322
3323         priv->beacon_int = priv->hw->conf.beacon_int;
3324         priv->timestamp = 0;
3325         if ((priv->iw_mode == NL80211_IFTYPE_STATION))
3326                 priv->beacon_int = 0;
3327
3328         spin_unlock_irqrestore(&priv->lock, flags);
3329
3330         if (!iwl_is_ready_rf(priv)) {
3331                 IWL_DEBUG_MAC80211("leave - not ready\n");
3332                 mutex_unlock(&priv->mutex);
3333                 return;
3334         }
3335
3336         /* we are restarting association process
3337          * clear RXON_FILTER_ASSOC_MSK bit
3338          */
3339         if (priv->iw_mode != NL80211_IFTYPE_AP) {
3340                 iwl_scan_cancel_timeout(priv, 100);
3341                 priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
3342                 iwl_commit_rxon(priv);
3343         }
3344
3345         iwl_power_update_mode(priv, 0);
3346
3347         /* Per mac80211.h: This is only used in IBSS mode... */
3348         if (priv->iw_mode != NL80211_IFTYPE_ADHOC) {
3349
3350                 /* switch to CAM during association period.
3351                  * the ucode will block any association/authentication
3352                  * frome during assiciation period if it can not hear
3353                  * the AP because of PM. the timer enable PM back is
3354                  * association do not complete
3355                  */
3356                 if (priv->hw->conf.channel->flags & (IEEE80211_CHAN_PASSIVE_SCAN |
3357                                                      IEEE80211_CHAN_RADAR))
3358                                 iwl_power_disable_management(priv, 3000);
3359
3360                 IWL_DEBUG_MAC80211("leave - not in IBSS\n");
3361                 mutex_unlock(&priv->mutex);
3362                 return;
3363         }
3364
3365         iwl_set_rate(priv);
3366
3367         mutex_unlock(&priv->mutex);
3368
3369         IWL_DEBUG_MAC80211("leave\n");
3370 }
3371
3372 static int iwl_mac_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb)
3373 {
3374         struct iwl_priv *priv = hw->priv;
3375         unsigned long flags;
3376         __le64 timestamp;
3377
3378         IWL_DEBUG_MAC80211("enter\n");
3379
3380         if (!iwl_is_ready_rf(priv)) {
3381                 IWL_DEBUG_MAC80211("leave - RF not ready\n");
3382                 return -EIO;
3383         }
3384
3385         if (priv->iw_mode != NL80211_IFTYPE_ADHOC) {
3386                 IWL_DEBUG_MAC80211("leave - not IBSS\n");
3387                 return -EIO;
3388         }
3389
3390         spin_lock_irqsave(&priv->lock, flags);
3391
3392         if (priv->ibss_beacon)
3393                 dev_kfree_skb(priv->ibss_beacon);
3394
3395         priv->ibss_beacon = skb;
3396
3397         priv->assoc_id = 0;
3398         timestamp = ((struct ieee80211_mgmt *)skb->data)->u.beacon.timestamp;
3399         priv->timestamp = le64_to_cpu(timestamp);
3400
3401         IWL_DEBUG_MAC80211("leave\n");
3402         spin_unlock_irqrestore(&priv->lock, flags);
3403
3404         iwl_reset_qos(priv);
3405
3406         iwl_post_associate(priv);
3407
3408
3409         return 0;
3410 }
3411
3412 /*****************************************************************************
3413  *
3414  * sysfs attributes
3415  *
3416  *****************************************************************************/
3417
3418 #ifdef CONFIG_IWLWIFI_DEBUG
3419
3420 /*
3421  * The following adds a new attribute to the sysfs representation
3422  * of this device driver (i.e. a new file in /sys/class/net/wlan0/device/)
3423  * used for controlling the debug level.
3424  *
3425  * See the level definitions in iwl for details.
3426  */
3427
3428 static ssize_t show_debug_level(struct device *d,
3429                                 struct device_attribute *attr, char *buf)
3430 {
3431         struct iwl_priv *priv = d->driver_data;
3432
3433         return sprintf(buf, "0x%08X\n", priv->debug_level);
3434 }
3435 static ssize_t store_debug_level(struct device *d,
3436                                 struct device_attribute *attr,
3437                                  const char *buf, size_t count)
3438 {
3439         struct iwl_priv *priv = d->driver_data;
3440         unsigned long val;
3441         int ret;
3442
3443         ret = strict_strtoul(buf, 0, &val);
3444         if (ret)
3445                 IWL_ERR(priv, "%s is not in hex or decimal form.\n", buf);
3446         else
3447                 priv->debug_level = val;
3448
3449         return strnlen(buf, count);
3450 }
3451
3452 static DEVICE_ATTR(debug_level, S_IWUSR | S_IRUGO,
3453                         show_debug_level, store_debug_level);
3454
3455
3456 #endif /* CONFIG_IWLWIFI_DEBUG */
3457
3458
3459 static ssize_t show_version(struct device *d,
3460                                 struct device_attribute *attr, char *buf)
3461 {
3462         struct iwl_priv *priv = d->driver_data;
3463         struct iwl_alive_resp *palive = &priv->card_alive;
3464         ssize_t pos = 0;
3465         u16 eeprom_ver;
3466
3467         if (palive->is_valid)
3468                 pos += sprintf(buf + pos,
3469                                 "fw version: 0x%01X.0x%01X.0x%01X.0x%01X\n"
3470                                 "fw type: 0x%01X 0x%01X\n",
3471                                 palive->ucode_major, palive->ucode_minor,
3472                                 palive->sw_rev[0], palive->sw_rev[1],
3473                                 palive->ver_type, palive->ver_subtype);
3474         else
3475                 pos += sprintf(buf + pos, "fw not loaded\n");
3476
3477         if (priv->eeprom) {
3478                 eeprom_ver = iwl_eeprom_query16(priv, EEPROM_VERSION);
3479                 pos += sprintf(buf + pos, "EEPROM version: 0x%x\n",
3480                                  eeprom_ver);
3481         } else {
3482                 pos += sprintf(buf + pos, "EEPROM not initialzed\n");
3483         }
3484
3485         return pos;
3486 }
3487
3488 static DEVICE_ATTR(version, S_IWUSR | S_IRUGO, show_version, NULL);
3489
3490 static ssize_t show_temperature(struct device *d,
3491                                 struct device_attribute *attr, char *buf)
3492 {
3493         struct iwl_priv *priv = (struct iwl_priv *)d->driver_data;
3494
3495         if (!iwl_is_alive(priv))
3496                 return -EAGAIN;
3497
3498         return sprintf(buf, "%d\n", priv->temperature);
3499 }
3500
3501 static DEVICE_ATTR(temperature, S_IRUGO, show_temperature, NULL);
3502
3503 static ssize_t show_tx_power(struct device *d,
3504                              struct device_attribute *attr, char *buf)
3505 {
3506         struct iwl_priv *priv = (struct iwl_priv *)d->driver_data;
3507
3508         if (!iwl_is_ready_rf(priv))
3509                 return sprintf(buf, "off\n");
3510         else
3511                 return sprintf(buf, "%d\n", priv->tx_power_user_lmt);
3512 }
3513
3514 static ssize_t store_tx_power(struct device *d,
3515                               struct device_attribute *attr,
3516                               const char *buf, size_t count)
3517 {
3518         struct iwl_priv *priv = (struct iwl_priv *)d->driver_data;
3519         unsigned long val;
3520         int ret;
3521
3522         ret = strict_strtoul(buf, 10, &val);
3523         if (ret)
3524                 IWL_INFO(priv, "%s is not in decimal form.\n", buf);
3525         else
3526                 iwl_set_tx_power(priv, val, false);
3527
3528         return count;
3529 }
3530
3531 static DEVICE_ATTR(tx_power, S_IWUSR | S_IRUGO, show_tx_power, store_tx_power);
3532
3533 static ssize_t show_flags(struct device *d,
3534                           struct device_attribute *attr, char *buf)
3535 {
3536         struct iwl_priv *priv = (struct iwl_priv *)d->driver_data;
3537
3538         return sprintf(buf, "0x%04X\n", priv->active_rxon.flags);
3539 }
3540
3541 static ssize_t store_flags(struct device *d,
3542                            struct device_attribute *attr,
3543                            const char *buf, size_t count)
3544 {
3545         struct iwl_priv *priv = (struct iwl_priv *)d->driver_data;
3546         unsigned long val;
3547         u32 flags;
3548         int ret = strict_strtoul(buf, 0, &val);
3549         if (ret)
3550                 return ret;
3551         flags = (u32)val;
3552
3553         mutex_lock(&priv->mutex);
3554         if (le32_to_cpu(priv->staging_rxon.flags) != flags) {
3555                 /* Cancel any currently running scans... */
3556                 if (iwl_scan_cancel_timeout(priv, 100))
3557                         IWL_WARN(priv, "Could not cancel scan.\n");
3558                 else {
3559                         IWL_DEBUG_INFO("Commit rxon.flags = 0x%04X\n", flags);
3560                         priv->staging_rxon.flags = cpu_to_le32(flags);
3561                         iwl_commit_rxon(priv);
3562                 }
3563         }
3564         mutex_unlock(&priv->mutex);
3565
3566         return count;
3567 }
3568
3569 static DEVICE_ATTR(flags, S_IWUSR | S_IRUGO, show_flags, store_flags);
3570
3571 static ssize_t show_filter_flags(struct device *d,
3572                                  struct device_attribute *attr, char *buf)
3573 {
3574         struct iwl_priv *priv = (struct iwl_priv *)d->driver_data;
3575
3576         return sprintf(buf, "0x%04X\n",
3577                 le32_to_cpu(priv->active_rxon.filter_flags));
3578 }
3579
3580 static ssize_t store_filter_flags(struct device *d,
3581                                   struct device_attribute *attr,
3582                                   const char *buf, size_t count)
3583 {
3584         struct iwl_priv *priv = (struct iwl_priv *)d->driver_data;
3585         unsigned long val;
3586         u32 filter_flags;
3587         int ret = strict_strtoul(buf, 0, &val);
3588         if (ret)
3589                 return ret;
3590         filter_flags = (u32)val;
3591
3592         mutex_lock(&priv->mutex);
3593         if (le32_to_cpu(priv->staging_rxon.filter_flags) != filter_flags) {
3594                 /* Cancel any currently running scans... */
3595                 if (iwl_scan_cancel_timeout(priv, 100))
3596                         IWL_WARN(priv, "Could not cancel scan.\n");
3597                 else {
3598                         IWL_DEBUG_INFO("Committing rxon.filter_flags = "
3599                                        "0x%04X\n", filter_flags);
3600                         priv->staging_rxon.filter_flags =
3601                                 cpu_to_le32(filter_flags);
3602                         iwl_commit_rxon(priv);
3603                 }
3604         }
3605         mutex_unlock(&priv->mutex);
3606
3607         return count;
3608 }
3609
3610 static DEVICE_ATTR(filter_flags, S_IWUSR | S_IRUGO, show_filter_flags,
3611                    store_filter_flags);
3612
3613 static ssize_t store_power_level(struct device *d,
3614                                  struct device_attribute *attr,
3615                                  const char *buf, size_t count)
3616 {
3617         struct iwl_priv *priv = dev_get_drvdata(d);
3618         int ret;
3619         unsigned long mode;
3620
3621
3622         mutex_lock(&priv->mutex);
3623
3624         if (!iwl_is_ready(priv)) {
3625                 ret = -EAGAIN;
3626                 goto out;
3627         }
3628
3629         ret = strict_strtoul(buf, 10, &mode);
3630         if (ret)
3631                 goto out;
3632
3633         ret = iwl_power_set_user_mode(priv, mode);
3634         if (ret) {
3635                 IWL_DEBUG_MAC80211("failed setting power mode.\n");
3636                 goto out;
3637         }
3638         ret = count;
3639
3640  out:
3641         mutex_unlock(&priv->mutex);
3642         return ret;
3643 }
3644
3645 static ssize_t show_power_level(struct device *d,
3646                                 struct device_attribute *attr, char *buf)
3647 {
3648         struct iwl_priv *priv = dev_get_drvdata(d);
3649         int mode = priv->power_data.user_power_setting;
3650         int system = priv->power_data.system_power_setting;
3651         int level = priv->power_data.power_mode;
3652         char *p = buf;
3653
3654         switch (system) {
3655         case IWL_POWER_SYS_AUTO:
3656                 p += sprintf(p, "SYSTEM:auto");
3657                 break;
3658         case IWL_POWER_SYS_AC:
3659                 p += sprintf(p, "SYSTEM:ac");
3660                 break;
3661         case IWL_POWER_SYS_BATTERY:
3662                 p += sprintf(p, "SYSTEM:battery");
3663                 break;
3664         }
3665
3666         p += sprintf(p, "\tMODE:%s", (mode < IWL_POWER_AUTO) ?
3667                         "fixed" : "auto");
3668         p += sprintf(p, "\tINDEX:%d", level);
3669         p += sprintf(p, "\n");
3670         return p - buf + 1;
3671 }
3672
3673 static DEVICE_ATTR(power_level, S_IWUSR | S_IRUSR, show_power_level,
3674                    store_power_level);
3675
3676
3677 static ssize_t show_statistics(struct device *d,
3678                                struct device_attribute *attr, char *buf)
3679 {
3680         struct iwl_priv *priv = dev_get_drvdata(d);
3681         u32 size = sizeof(struct iwl_notif_statistics);
3682         u32 len = 0, ofs = 0;
3683         u8 *data = (u8 *)&priv->statistics;
3684         int rc = 0;
3685
3686         if (!iwl_is_alive(priv))
3687                 return -EAGAIN;
3688
3689         mutex_lock(&priv->mutex);
3690         rc = iwl_send_statistics_request(priv, 0);
3691         mutex_unlock(&priv->mutex);
3692
3693         if (rc) {
3694                 len = sprintf(buf,
3695                               "Error sending statistics request: 0x%08X\n", rc);
3696                 return len;
3697         }
3698
3699         while (size && (PAGE_SIZE - len)) {
3700                 hex_dump_to_buffer(data + ofs, size, 16, 1, buf + len,
3701                                    PAGE_SIZE - len, 1);
3702                 len = strlen(buf);
3703                 if (PAGE_SIZE - len)
3704                         buf[len++] = '\n';
3705
3706                 ofs += 16;
3707                 size -= min(size, 16U);
3708         }
3709
3710         return len;
3711 }
3712
3713 static DEVICE_ATTR(statistics, S_IRUGO, show_statistics, NULL);
3714
3715
3716 /*****************************************************************************
3717  *
3718  * driver setup and teardown
3719  *
3720  *****************************************************************************/
3721
3722 static void iwl_setup_deferred_work(struct iwl_priv *priv)
3723 {
3724         priv->workqueue = create_workqueue(DRV_NAME);
3725
3726         init_waitqueue_head(&priv->wait_command_queue);
3727
3728         INIT_WORK(&priv->up, iwl_bg_up);
3729         INIT_WORK(&priv->restart, iwl_bg_restart);
3730         INIT_WORK(&priv->rx_replenish, iwl_bg_rx_replenish);
3731         INIT_WORK(&priv->rf_kill, iwl_bg_rf_kill);
3732         INIT_WORK(&priv->beacon_update, iwl_bg_beacon_update);
3733         INIT_WORK(&priv->run_time_calib_work, iwl_bg_run_time_calib_work);
3734         INIT_DELAYED_WORK(&priv->init_alive_start, iwl_bg_init_alive_start);
3735         INIT_DELAYED_WORK(&priv->alive_start, iwl_bg_alive_start);
3736
3737         iwl_setup_scan_deferred_work(priv);
3738         iwl_setup_power_deferred_work(priv);
3739
3740         if (priv->cfg->ops->lib->setup_deferred_work)
3741                 priv->cfg->ops->lib->setup_deferred_work(priv);
3742
3743         init_timer(&priv->statistics_periodic);
3744         priv->statistics_periodic.data = (unsigned long)priv;
3745         priv->statistics_periodic.function = iwl_bg_statistics_periodic;
3746
3747         tasklet_init(&priv->irq_tasklet, (void (*)(unsigned long))
3748                      iwl_irq_tasklet, (unsigned long)priv);
3749 }
3750
3751 static void iwl_cancel_deferred_work(struct iwl_priv *priv)
3752 {
3753         if (priv->cfg->ops->lib->cancel_deferred_work)
3754                 priv->cfg->ops->lib->cancel_deferred_work(priv);
3755
3756         cancel_delayed_work_sync(&priv->init_alive_start);
3757         cancel_delayed_work(&priv->scan_check);
3758         cancel_delayed_work_sync(&priv->set_power_save);
3759         cancel_delayed_work(&priv->alive_start);
3760         cancel_work_sync(&priv->beacon_update);
3761         del_timer_sync(&priv->statistics_periodic);
3762 }
3763
3764 static struct attribute *iwl_sysfs_entries[] = {
3765         &dev_attr_flags.attr,
3766         &dev_attr_filter_flags.attr,
3767         &dev_attr_power_level.attr,
3768         &dev_attr_statistics.attr,
3769         &dev_attr_temperature.attr,
3770         &dev_attr_tx_power.attr,
3771 #ifdef CONFIG_IWLWIFI_DEBUG
3772         &dev_attr_debug_level.attr,
3773 #endif
3774         &dev_attr_version.attr,
3775
3776         NULL
3777 };
3778
3779 static struct attribute_group iwl_attribute_group = {
3780         .name = NULL,           /* put in device directory */
3781         .attrs = iwl_sysfs_entries,
3782 };
3783
3784 static struct ieee80211_ops iwl_hw_ops = {
3785         .tx = iwl_mac_tx,
3786         .start = iwl_mac_start,
3787         .stop = iwl_mac_stop,
3788         .add_interface = iwl_mac_add_interface,
3789         .remove_interface = iwl_mac_remove_interface,
3790         .config = iwl_mac_config,
3791         .config_interface = iwl_mac_config_interface,
3792         .configure_filter = iwl_configure_filter,
3793         .set_key = iwl_mac_set_key,
3794         .update_tkip_key = iwl_mac_update_tkip_key,
3795         .get_stats = iwl_mac_get_stats,
3796         .get_tx_stats = iwl_mac_get_tx_stats,
3797         .conf_tx = iwl_mac_conf_tx,
3798         .reset_tsf = iwl_mac_reset_tsf,
3799         .bss_info_changed = iwl_bss_info_changed,
3800         .ampdu_action = iwl_mac_ampdu_action,
3801         .hw_scan = iwl_mac_hw_scan
3802 };
3803
3804 static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
3805 {
3806         int err = 0;
3807         struct iwl_priv *priv;
3808         struct ieee80211_hw *hw;
3809         struct iwl_cfg *cfg = (struct iwl_cfg *)(ent->driver_data);
3810         unsigned long flags;
3811         u16 pci_cmd;
3812
3813         /************************
3814          * 1. Allocating HW data
3815          ************************/
3816
3817         /* Disabling hardware scan means that mac80211 will perform scans
3818          * "the hard way", rather than using device's scan. */
3819         if (cfg->mod_params->disable_hw_scan) {
3820                 if (cfg->mod_params->debug & IWL_DL_INFO)
3821                         dev_printk(KERN_DEBUG, &(pdev->dev),
3822                                    "Disabling hw_scan\n");
3823                 iwl_hw_ops.hw_scan = NULL;
3824         }
3825
3826         hw = iwl_alloc_all(cfg, &iwl_hw_ops);
3827         if (!hw) {
3828                 err = -ENOMEM;
3829                 goto out;
3830         }
3831         priv = hw->priv;
3832         /* At this point both hw and priv are allocated. */
3833
3834         SET_IEEE80211_DEV(hw, &pdev->dev);
3835
3836         IWL_DEBUG_INFO("*** LOAD DRIVER ***\n");
3837         priv->cfg = cfg;
3838         priv->pci_dev = pdev;
3839
3840 #ifdef CONFIG_IWLWIFI_DEBUG
3841         priv->debug_level = priv->cfg->mod_params->debug;
3842         atomic_set(&priv->restrict_refcnt, 0);
3843 #endif
3844
3845         /**************************
3846          * 2. Initializing PCI bus
3847          **************************/
3848         if (pci_enable_device(pdev)) {
3849                 err = -ENODEV;
3850                 goto out_ieee80211_free_hw;
3851         }
3852
3853         pci_set_master(pdev);
3854
3855         err = pci_set_dma_mask(pdev, DMA_BIT_MASK(36));
3856         if (!err)
3857                 err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(36));
3858         if (err) {
3859                 err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
3860                 if (!err)
3861                         err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
3862                 /* both attempts failed: */
3863                 if (err) {
3864                         IWL_WARN(priv, "No suitable DMA available.\n");
3865                         goto out_pci_disable_device;
3866                 }
3867         }
3868
3869         err = pci_request_regions(pdev, DRV_NAME);
3870         if (err)
3871                 goto out_pci_disable_device;
3872
3873         pci_set_drvdata(pdev, priv);
3874
3875
3876         /***********************
3877          * 3. Read REV register
3878          ***********************/
3879         priv->hw_base = pci_iomap(pdev, 0, 0);
3880         if (!priv->hw_base) {
3881                 err = -ENODEV;
3882                 goto out_pci_release_regions;
3883         }
3884
3885         IWL_DEBUG_INFO("pci_resource_len = 0x%08llx\n",
3886                 (unsigned long long) pci_resource_len(pdev, 0));
3887         IWL_DEBUG_INFO("pci_resource_base = %p\n", priv->hw_base);
3888
3889         iwl_hw_detect(priv);
3890         IWL_INFO(priv, "Detected Intel Wireless WiFi Link %s REV=0x%X\n",
3891                 priv->cfg->name, priv->hw_rev);
3892
3893         /* We disable the RETRY_TIMEOUT register (0x41) to keep
3894          * PCI Tx retries from interfering with C3 CPU state */
3895         pci_write_config_byte(pdev, PCI_CFG_RETRY_TIMEOUT, 0x00);
3896
3897         /* amp init */
3898         err = priv->cfg->ops->lib->apm_ops.init(priv);
3899         if (err < 0) {
3900                 IWL_DEBUG_INFO("Failed to init APMG\n");
3901                 goto out_iounmap;
3902         }
3903         /*****************
3904          * 4. Read EEPROM
3905          *****************/
3906         /* Read the EEPROM */
3907         err = iwl_eeprom_init(priv);
3908         if (err) {
3909                 IWL_ERR(priv, "Unable to init EEPROM\n");
3910                 goto out_iounmap;
3911         }
3912         err = iwl_eeprom_check_version(priv);
3913         if (err)
3914                 goto out_iounmap;
3915
3916         /* extract MAC Address */
3917         iwl_eeprom_get_mac(priv, priv->mac_addr);
3918         IWL_DEBUG_INFO("MAC address: %pM\n", priv->mac_addr);
3919         SET_IEEE80211_PERM_ADDR(priv->hw, priv->mac_addr);
3920
3921         /************************
3922          * 5. Setup HW constants
3923          ************************/
3924         if (iwl_set_hw_params(priv)) {
3925                 IWL_ERR(priv, "failed to set hw parameters\n");
3926                 goto out_free_eeprom;
3927         }
3928
3929         /*******************
3930          * 6. Setup priv
3931          *******************/
3932
3933         err = iwl_init_drv(priv);
3934         if (err)
3935                 goto out_free_eeprom;
3936         /* At this point both hw and priv are initialized. */
3937
3938         /**********************************
3939          * 7. Initialize module parameters
3940          **********************************/
3941
3942         /* Disable radio (SW RF KILL) via parameter when loading driver */
3943         if (priv->cfg->mod_params->disable) {
3944                 set_bit(STATUS_RF_KILL_SW, &priv->status);
3945                 IWL_DEBUG_INFO("Radio disabled.\n");
3946         }
3947
3948         /********************
3949          * 8. Setup services
3950          ********************/
3951         spin_lock_irqsave(&priv->lock, flags);
3952         iwl_disable_interrupts(priv);
3953         spin_unlock_irqrestore(&priv->lock, flags);
3954
3955         pci_enable_msi(priv->pci_dev);
3956
3957         err = request_irq(priv->pci_dev->irq, iwl_isr, IRQF_SHARED,
3958                           DRV_NAME, priv);
3959         if (err) {
3960                 IWL_ERR(priv, "Error allocating IRQ %d\n", priv->pci_dev->irq);
3961                 goto out_disable_msi;
3962         }
3963         err = sysfs_create_group(&pdev->dev.kobj, &iwl_attribute_group);
3964         if (err) {
3965                 IWL_ERR(priv, "failed to create sysfs device attributes\n");
3966                 goto out_uninit_drv;
3967         }
3968
3969         iwl_setup_deferred_work(priv);
3970         iwl_setup_rx_handlers(priv);
3971
3972         /**********************************
3973          * 9. Setup and register mac80211
3974          **********************************/
3975
3976         /* enable interrupts if needed: hw bug w/a */
3977         pci_read_config_word(priv->pci_dev, PCI_COMMAND, &pci_cmd);
3978         if (pci_cmd & PCI_COMMAND_INTX_DISABLE) {
3979                 pci_cmd &= ~PCI_COMMAND_INTX_DISABLE;
3980                 pci_write_config_word(priv->pci_dev, PCI_COMMAND, pci_cmd);
3981         }
3982
3983         iwl_enable_interrupts(priv);
3984
3985         err = iwl_setup_mac(priv);
3986         if (err)
3987                 goto out_remove_sysfs;
3988
3989         err = iwl_dbgfs_register(priv, DRV_NAME);
3990         if (err)
3991                 IWL_ERR(priv, "failed to create debugfs files\n");
3992
3993         /* If platform's RF_KILL switch is NOT set to KILL */
3994         if (iwl_read32(priv, CSR_GP_CNTRL) & CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW)
3995                 clear_bit(STATUS_RF_KILL_HW, &priv->status);
3996         else
3997                 set_bit(STATUS_RF_KILL_HW, &priv->status);
3998
3999         err = iwl_rfkill_init(priv);
4000         if (err)
4001                 IWL_ERR(priv, "Unable to initialize RFKILL system. "
4002                                   "Ignoring error: %d\n", err);
4003         else
4004                 iwl_rfkill_set_hw_state(priv);
4005
4006         iwl_power_initialize(priv);
4007         return 0;
4008
4009  out_remove_sysfs:
4010         sysfs_remove_group(&pdev->dev.kobj, &iwl_attribute_group);
4011  out_disable_msi:
4012         pci_disable_msi(priv->pci_dev);
4013         pci_disable_device(priv->pci_dev);
4014  out_uninit_drv:
4015         iwl_uninit_drv(priv);
4016  out_free_eeprom:
4017         iwl_eeprom_free(priv);
4018  out_iounmap:
4019         pci_iounmap(pdev, priv->hw_base);
4020  out_pci_release_regions:
4021         pci_release_regions(pdev);
4022         pci_set_drvdata(pdev, NULL);
4023  out_pci_disable_device:
4024         pci_disable_device(pdev);
4025  out_ieee80211_free_hw:
4026         ieee80211_free_hw(priv->hw);
4027  out:
4028         return err;
4029 }
4030
4031 static void __devexit iwl_pci_remove(struct pci_dev *pdev)
4032 {
4033         struct iwl_priv *priv = pci_get_drvdata(pdev);
4034         unsigned long flags;
4035
4036         if (!priv)
4037                 return;
4038
4039         IWL_DEBUG_INFO("*** UNLOAD DRIVER ***\n");
4040
4041         iwl_dbgfs_unregister(priv);
4042         sysfs_remove_group(&pdev->dev.kobj, &iwl_attribute_group);
4043
4044         /* ieee80211_unregister_hw call wil cause iwl_mac_stop to
4045          * to be called and iwl_down since we are removing the device
4046          * we need to set STATUS_EXIT_PENDING bit.
4047          */
4048         set_bit(STATUS_EXIT_PENDING, &priv->status);
4049         if (priv->mac80211_registered) {
4050                 ieee80211_unregister_hw(priv->hw);
4051                 priv->mac80211_registered = 0;
4052         } else {
4053                 iwl_down(priv);
4054         }
4055
4056         /* make sure we flush any pending irq or
4057          * tasklet for the driver
4058          */
4059         spin_lock_irqsave(&priv->lock, flags);
4060         iwl_disable_interrupts(priv);
4061         spin_unlock_irqrestore(&priv->lock, flags);
4062
4063         iwl_synchronize_irq(priv);
4064
4065         iwl_rfkill_unregister(priv);
4066         iwl_dealloc_ucode_pci(priv);
4067
4068         if (priv->rxq.bd)
4069                 iwl_rx_queue_free(priv, &priv->rxq);
4070         iwl_hw_txq_ctx_free(priv);
4071
4072         iwl_clear_stations_table(priv);
4073         iwl_eeprom_free(priv);
4074
4075
4076         /*netif_stop_queue(dev); */
4077         flush_workqueue(priv->workqueue);
4078
4079         /* ieee80211_unregister_hw calls iwl_mac_stop, which flushes
4080          * priv->workqueue... so we can't take down the workqueue
4081          * until now... */
4082         destroy_workqueue(priv->workqueue);
4083         priv->workqueue = NULL;
4084
4085         free_irq(priv->pci_dev->irq, priv);
4086         pci_disable_msi(priv->pci_dev);
4087         pci_iounmap(pdev, priv->hw_base);
4088         pci_release_regions(pdev);
4089         pci_disable_device(pdev);
4090         pci_set_drvdata(pdev, NULL);
4091
4092         iwl_uninit_drv(priv);
4093
4094         if (priv->ibss_beacon)
4095                 dev_kfree_skb(priv->ibss_beacon);
4096
4097         ieee80211_free_hw(priv->hw);
4098 }
4099
4100 #ifdef CONFIG_PM
4101
4102 static int iwl_pci_suspend(struct pci_dev *pdev, pm_message_t state)
4103 {
4104         struct iwl_priv *priv = pci_get_drvdata(pdev);
4105
4106         if (priv->is_open) {
4107                 set_bit(STATUS_IN_SUSPEND, &priv->status);
4108                 iwl_mac_stop(priv->hw);
4109                 priv->is_open = 1;
4110         }
4111
4112         pci_save_state(pdev);
4113         pci_disable_device(pdev);
4114         pci_set_power_state(pdev, PCI_D3hot);
4115
4116         return 0;
4117 }
4118
4119 static int iwl_pci_resume(struct pci_dev *pdev)
4120 {
4121         struct iwl_priv *priv = pci_get_drvdata(pdev);
4122
4123         pci_set_power_state(pdev, PCI_D0);
4124         pci_enable_device(pdev);
4125         pci_restore_state(pdev);
4126         iwl_enable_interrupts(priv);
4127
4128         if (priv->is_open)
4129                 iwl_mac_start(priv->hw);
4130
4131         clear_bit(STATUS_IN_SUSPEND, &priv->status);
4132         return 0;
4133 }
4134
4135 #endif /* CONFIG_PM */
4136
4137 /*****************************************************************************
4138  *
4139  * driver and module entry point
4140  *
4141  *****************************************************************************/
4142
4143 /* Hardware specific file defines the PCI IDs table for that hardware module */
4144 static struct pci_device_id iwl_hw_card_ids[] = {
4145 #ifdef CONFIG_IWL4965
4146         {IWL_PCI_DEVICE(0x4229, PCI_ANY_ID, iwl4965_agn_cfg)},
4147         {IWL_PCI_DEVICE(0x4230, PCI_ANY_ID, iwl4965_agn_cfg)},
4148 #endif /* CONFIG_IWL4965 */
4149 #ifdef CONFIG_IWL5000
4150         {IWL_PCI_DEVICE(0x4232, 0x1205, iwl5100_bg_cfg)},
4151         {IWL_PCI_DEVICE(0x4232, 0x1305, iwl5100_bg_cfg)},
4152         {IWL_PCI_DEVICE(0x4232, 0x1206, iwl5100_abg_cfg)},
4153         {IWL_PCI_DEVICE(0x4232, 0x1306, iwl5100_abg_cfg)},
4154         {IWL_PCI_DEVICE(0x4232, 0x1326, iwl5100_abg_cfg)},
4155         {IWL_PCI_DEVICE(0x4237, 0x1216, iwl5100_abg_cfg)},
4156         {IWL_PCI_DEVICE(0x4232, PCI_ANY_ID, iwl5100_agn_cfg)},
4157         {IWL_PCI_DEVICE(0x4235, PCI_ANY_ID, iwl5300_agn_cfg)},
4158         {IWL_PCI_DEVICE(0x4236, PCI_ANY_ID, iwl5300_agn_cfg)},
4159         {IWL_PCI_DEVICE(0x4237, PCI_ANY_ID, iwl5100_agn_cfg)},
4160 /* 5350 WiFi/WiMax */
4161         {IWL_PCI_DEVICE(0x423A, 0x1001, iwl5350_agn_cfg)},
4162         {IWL_PCI_DEVICE(0x423A, 0x1021, iwl5350_agn_cfg)},
4163         {IWL_PCI_DEVICE(0x423B, 0x1011, iwl5350_agn_cfg)},
4164 /* 5150 Wifi/WiMax */
4165         {IWL_PCI_DEVICE(0x423C, PCI_ANY_ID, iwl5150_agn_cfg)},
4166         {IWL_PCI_DEVICE(0x423D, PCI_ANY_ID, iwl5150_agn_cfg)},
4167 /* 6000/6050 Series */
4168         {IWL_PCI_DEVICE(0x0082, 0x1102, iwl6000_2ag_cfg)},
4169         {IWL_PCI_DEVICE(0x0085, 0x1112, iwl6000_2ag_cfg)},
4170         {IWL_PCI_DEVICE(0x0082, 0x1122, iwl6000_2ag_cfg)},
4171         {IWL_PCI_DEVICE(0x422B, PCI_ANY_ID, iwl6000_3agn_cfg)},
4172         {IWL_PCI_DEVICE(0x4238, PCI_ANY_ID, iwl6000_3agn_cfg)},
4173         {IWL_PCI_DEVICE(0x0082, PCI_ANY_ID, iwl6000_2agn_cfg)},
4174         {IWL_PCI_DEVICE(0x0085, PCI_ANY_ID, iwl6000_3agn_cfg)},
4175         {IWL_PCI_DEVICE(0x0086, PCI_ANY_ID, iwl6050_3agn_cfg)},
4176         {IWL_PCI_DEVICE(0x0087, PCI_ANY_ID, iwl6050_2agn_cfg)},
4177         {IWL_PCI_DEVICE(0x0088, PCI_ANY_ID, iwl6050_3agn_cfg)},
4178         {IWL_PCI_DEVICE(0x0089, PCI_ANY_ID, iwl6050_2agn_cfg)},
4179 /* 100 Series WiFi */
4180         {IWL_PCI_DEVICE(0x0083, PCI_ANY_ID, iwl100_bgn_cfg)},
4181         {IWL_PCI_DEVICE(0x0084, PCI_ANY_ID, iwl100_bgn_cfg)},
4182 #endif /* CONFIG_IWL5000 */
4183
4184         {0}
4185 };
4186 MODULE_DEVICE_TABLE(pci, iwl_hw_card_ids);
4187
4188 static struct pci_driver iwl_driver = {
4189         .name = DRV_NAME,
4190         .id_table = iwl_hw_card_ids,
4191         .probe = iwl_pci_probe,
4192         .remove = __devexit_p(iwl_pci_remove),
4193 #ifdef CONFIG_PM
4194         .suspend = iwl_pci_suspend,
4195         .resume = iwl_pci_resume,
4196 #endif
4197 };
4198
4199 static int __init iwl_init(void)
4200 {
4201
4202         int ret;
4203         printk(KERN_INFO DRV_NAME ": " DRV_DESCRIPTION ", " DRV_VERSION "\n");
4204         printk(KERN_INFO DRV_NAME ": " DRV_COPYRIGHT "\n");
4205
4206         ret = iwlagn_rate_control_register();
4207         if (ret) {
4208                 printk(KERN_ERR DRV_NAME
4209                        "Unable to register rate control algorithm: %d\n", ret);
4210                 return ret;
4211         }
4212
4213         ret = pci_register_driver(&iwl_driver);
4214         if (ret) {
4215                 printk(KERN_ERR DRV_NAME "Unable to initialize PCI module\n");
4216                 goto error_register;
4217         }
4218
4219         return ret;
4220
4221 error_register:
4222         iwlagn_rate_control_unregister();
4223         return ret;
4224 }
4225
4226 static void __exit iwl_exit(void)
4227 {
4228         pci_unregister_driver(&iwl_driver);
4229         iwlagn_rate_control_unregister();
4230 }
4231
4232 module_exit(iwl_exit);
4233 module_init(iwl_init);