e93ddb74457e51ec13d13bf4eebf59527484078f
[sfrench/cifs-2.6.git] / drivers / net / wireless / iwlwifi / iwl-core.c
1 /******************************************************************************
2  *
3  * GPL LICENSE SUMMARY
4  *
5  * Copyright(c) 2008 - 2009 Intel Corporation. All rights reserved.
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of version 2 of the GNU General Public License as
9  * published by the Free Software Foundation.
10  *
11  * This program is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
19  * USA
20  *
21  * The full GNU General Public License is included in this distribution
22  * in the file called LICENSE.GPL.
23  *
24  * Contact Information:
25  *  Intel Linux Wireless <ilw@linux.intel.com>
26  * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
27  *****************************************************************************/
28
29 #include <linux/kernel.h>
30 #include <linux/module.h>
31 #include <linux/etherdevice.h>
32 #include <net/mac80211.h>
33
34 #include "iwl-eeprom.h"
35 #include "iwl-dev.h" /* FIXME: remove */
36 #include "iwl-debug.h"
37 #include "iwl-core.h"
38 #include "iwl-io.h"
39 #include "iwl-rfkill.h"
40 #include "iwl-power.h"
41 #include "iwl-sta.h"
42 #include "iwl-helpers.h"
43
44
45 MODULE_DESCRIPTION("iwl core");
46 MODULE_VERSION(IWLWIFI_VERSION);
47 MODULE_AUTHOR(DRV_COPYRIGHT " " DRV_AUTHOR);
48 MODULE_LICENSE("GPL");
49
50 #define IWL_DECLARE_RATE_INFO(r, s, ip, in, rp, rn, pp, np)    \
51         [IWL_RATE_##r##M_INDEX] = { IWL_RATE_##r##M_PLCP,      \
52                                     IWL_RATE_SISO_##s##M_PLCP, \
53                                     IWL_RATE_MIMO2_##s##M_PLCP,\
54                                     IWL_RATE_MIMO3_##s##M_PLCP,\
55                                     IWL_RATE_##r##M_IEEE,      \
56                                     IWL_RATE_##ip##M_INDEX,    \
57                                     IWL_RATE_##in##M_INDEX,    \
58                                     IWL_RATE_##rp##M_INDEX,    \
59                                     IWL_RATE_##rn##M_INDEX,    \
60                                     IWL_RATE_##pp##M_INDEX,    \
61                                     IWL_RATE_##np##M_INDEX }
62
63 static irqreturn_t iwl_isr(int irq, void *data);
64
65 /*
66  * Parameter order:
67  *   rate, ht rate, prev rate, next rate, prev tgg rate, next tgg rate
68  *
69  * If there isn't a valid next or previous rate then INV is used which
70  * maps to IWL_RATE_INVALID
71  *
72  */
73 const struct iwl_rate_info iwl_rates[IWL_RATE_COUNT] = {
74         IWL_DECLARE_RATE_INFO(1, INV, INV, 2, INV, 2, INV, 2),    /*  1mbps */
75         IWL_DECLARE_RATE_INFO(2, INV, 1, 5, 1, 5, 1, 5),          /*  2mbps */
76         IWL_DECLARE_RATE_INFO(5, INV, 2, 6, 2, 11, 2, 11),        /*5.5mbps */
77         IWL_DECLARE_RATE_INFO(11, INV, 9, 12, 9, 12, 5, 18),      /* 11mbps */
78         IWL_DECLARE_RATE_INFO(6, 6, 5, 9, 5, 11, 5, 11),        /*  6mbps */
79         IWL_DECLARE_RATE_INFO(9, 6, 6, 11, 6, 11, 5, 11),       /*  9mbps */
80         IWL_DECLARE_RATE_INFO(12, 12, 11, 18, 11, 18, 11, 18),   /* 12mbps */
81         IWL_DECLARE_RATE_INFO(18, 18, 12, 24, 12, 24, 11, 24),   /* 18mbps */
82         IWL_DECLARE_RATE_INFO(24, 24, 18, 36, 18, 36, 18, 36),   /* 24mbps */
83         IWL_DECLARE_RATE_INFO(36, 36, 24, 48, 24, 48, 24, 48),   /* 36mbps */
84         IWL_DECLARE_RATE_INFO(48, 48, 36, 54, 36, 54, 36, 54),   /* 48mbps */
85         IWL_DECLARE_RATE_INFO(54, 54, 48, INV, 48, INV, 48, INV),/* 54mbps */
86         IWL_DECLARE_RATE_INFO(60, 60, 48, INV, 48, INV, 48, INV),/* 60mbps */
87         /* FIXME:RS:          ^^    should be INV (legacy) */
88 };
89 EXPORT_SYMBOL(iwl_rates);
90
91 /**
92  * translate ucode response to mac80211 tx status control values
93  */
94 void iwl_hwrate_to_tx_control(struct iwl_priv *priv, u32 rate_n_flags,
95                                   struct ieee80211_tx_info *info)
96 {
97         int rate_index;
98         struct ieee80211_tx_rate *r = &info->control.rates[0];
99
100         info->antenna_sel_tx =
101                 ((rate_n_flags & RATE_MCS_ANT_ABC_MSK) >> RATE_MCS_ANT_POS);
102         if (rate_n_flags & RATE_MCS_HT_MSK)
103                 r->flags |= IEEE80211_TX_RC_MCS;
104         if (rate_n_flags & RATE_MCS_GF_MSK)
105                 r->flags |= IEEE80211_TX_RC_GREEN_FIELD;
106         if (rate_n_flags & RATE_MCS_FAT_MSK)
107                 r->flags |= IEEE80211_TX_RC_40_MHZ_WIDTH;
108         if (rate_n_flags & RATE_MCS_DUP_MSK)
109                 r->flags |= IEEE80211_TX_RC_DUP_DATA;
110         if (rate_n_flags & RATE_MCS_SGI_MSK)
111                 r->flags |= IEEE80211_TX_RC_SHORT_GI;
112         rate_index = iwl_hwrate_to_plcp_idx(rate_n_flags);
113         if (info->band == IEEE80211_BAND_5GHZ)
114                 rate_index -= IWL_FIRST_OFDM_RATE;
115         r->idx = rate_index;
116 }
117 EXPORT_SYMBOL(iwl_hwrate_to_tx_control);
118
119 int iwl_hwrate_to_plcp_idx(u32 rate_n_flags)
120 {
121         int idx = 0;
122
123         /* HT rate format */
124         if (rate_n_flags & RATE_MCS_HT_MSK) {
125                 idx = (rate_n_flags & 0xff);
126
127                 if (idx >= IWL_RATE_MIMO3_6M_PLCP)
128                         idx = idx - IWL_RATE_MIMO3_6M_PLCP;
129                 else if (idx >= IWL_RATE_MIMO2_6M_PLCP)
130                         idx = idx - IWL_RATE_MIMO2_6M_PLCP;
131
132                 idx += IWL_FIRST_OFDM_RATE;
133                 /* skip 9M not supported in ht*/
134                 if (idx >= IWL_RATE_9M_INDEX)
135                         idx += 1;
136                 if ((idx >= IWL_FIRST_OFDM_RATE) && (idx <= IWL_LAST_OFDM_RATE))
137                         return idx;
138
139         /* legacy rate format, search for match in table */
140         } else {
141                 for (idx = 0; idx < ARRAY_SIZE(iwl_rates); idx++)
142                         if (iwl_rates[idx].plcp == (rate_n_flags & 0xFF))
143                                 return idx;
144         }
145
146         return -1;
147 }
148 EXPORT_SYMBOL(iwl_hwrate_to_plcp_idx);
149
150 u8 iwl_toggle_tx_ant(struct iwl_priv *priv, u8 ant)
151 {
152         int i;
153         u8 ind = ant;
154         for (i = 0; i < RATE_ANT_NUM - 1; i++) {
155                 ind = (ind + 1) < RATE_ANT_NUM ?  ind + 1 : 0;
156                 if (priv->hw_params.valid_tx_ant & BIT(ind))
157                         return ind;
158         }
159         return ant;
160 }
161
162 const u8 iwl_bcast_addr[ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
163 EXPORT_SYMBOL(iwl_bcast_addr);
164
165
166 /* This function both allocates and initializes hw and priv. */
167 struct ieee80211_hw *iwl_alloc_all(struct iwl_cfg *cfg,
168                 struct ieee80211_ops *hw_ops)
169 {
170         struct iwl_priv *priv;
171
172         /* mac80211 allocates memory for this device instance, including
173          *   space for this driver's private structure */
174         struct ieee80211_hw *hw =
175                 ieee80211_alloc_hw(sizeof(struct iwl_priv), hw_ops);
176         if (hw == NULL) {
177                 printk(KERN_ERR "%s: Can not allocate network device\n",
178                        cfg->name);
179                 goto out;
180         }
181
182         priv = hw->priv;
183         priv->hw = hw;
184
185 out:
186         return hw;
187 }
188 EXPORT_SYMBOL(iwl_alloc_all);
189
190 void iwl_hw_detect(struct iwl_priv *priv)
191 {
192         priv->hw_rev = _iwl_read32(priv, CSR_HW_REV);
193         priv->hw_wa_rev = _iwl_read32(priv, CSR_HW_REV_WA_REG);
194         pci_read_config_byte(priv->pci_dev, PCI_REVISION_ID, &priv->rev_id);
195 }
196 EXPORT_SYMBOL(iwl_hw_detect);
197
198 int iwl_hw_nic_init(struct iwl_priv *priv)
199 {
200         unsigned long flags;
201         struct iwl_rx_queue *rxq = &priv->rxq;
202         int ret;
203
204         /* nic_init */
205         spin_lock_irqsave(&priv->lock, flags);
206         priv->cfg->ops->lib->apm_ops.init(priv);
207         iwl_write32(priv, CSR_INT_COALESCING, 512 / 32);
208         spin_unlock_irqrestore(&priv->lock, flags);
209
210         ret = priv->cfg->ops->lib->apm_ops.set_pwr_src(priv, IWL_PWR_SRC_VMAIN);
211
212         priv->cfg->ops->lib->apm_ops.config(priv);
213
214         /* Allocate the RX queue, or reset if it is already allocated */
215         if (!rxq->bd) {
216                 ret = iwl_rx_queue_alloc(priv);
217                 if (ret) {
218                         IWL_ERR(priv, "Unable to initialize Rx queue\n");
219                         return -ENOMEM;
220                 }
221         } else
222                 iwl_rx_queue_reset(priv, rxq);
223
224         iwl_rx_replenish(priv);
225
226         iwl_rx_init(priv, rxq);
227
228         spin_lock_irqsave(&priv->lock, flags);
229
230         rxq->need_update = 1;
231         iwl_rx_queue_update_write_ptr(priv, rxq);
232
233         spin_unlock_irqrestore(&priv->lock, flags);
234
235         /* Allocate and init all Tx and Command queues */
236         ret = iwl_txq_ctx_reset(priv);
237         if (ret)
238                 return ret;
239
240         set_bit(STATUS_INIT, &priv->status);
241
242         return 0;
243 }
244 EXPORT_SYMBOL(iwl_hw_nic_init);
245
246 /*
247  * QoS  support
248 */
249 void iwl_activate_qos(struct iwl_priv *priv, u8 force)
250 {
251         if (test_bit(STATUS_EXIT_PENDING, &priv->status))
252                 return;
253
254         priv->qos_data.def_qos_parm.qos_flags = 0;
255
256         if (priv->qos_data.qos_cap.q_AP.queue_request &&
257             !priv->qos_data.qos_cap.q_AP.txop_request)
258                 priv->qos_data.def_qos_parm.qos_flags |=
259                         QOS_PARAM_FLG_TXOP_TYPE_MSK;
260         if (priv->qos_data.qos_active)
261                 priv->qos_data.def_qos_parm.qos_flags |=
262                         QOS_PARAM_FLG_UPDATE_EDCA_MSK;
263
264         if (priv->current_ht_config.is_ht)
265                 priv->qos_data.def_qos_parm.qos_flags |= QOS_PARAM_FLG_TGN_MSK;
266
267         if (force || iwl_is_associated(priv)) {
268                 IWL_DEBUG_QOS(priv, "send QoS cmd with Qos active=%d FLAGS=0x%X\n",
269                                 priv->qos_data.qos_active,
270                                 priv->qos_data.def_qos_parm.qos_flags);
271
272                 iwl_send_cmd_pdu_async(priv, REPLY_QOS_PARAM,
273                                        sizeof(struct iwl_qosparam_cmd),
274                                        &priv->qos_data.def_qos_parm, NULL);
275         }
276 }
277 EXPORT_SYMBOL(iwl_activate_qos);
278
279 /*
280  * AC        CWmin         CW max      AIFSN      TXOP Limit    TXOP Limit
281  *                                              (802.11b)      (802.11a/g)
282  * AC_BK      15            1023        7           0               0
283  * AC_BE      15            1023        3           0               0
284  * AC_VI       7              15        2          6.016ms       3.008ms
285  * AC_VO       3               7        2          3.264ms       1.504ms
286  */
287 void iwl_reset_qos(struct iwl_priv *priv)
288 {
289         u16 cw_min = 15;
290         u16 cw_max = 1023;
291         u8 aifs = 2;
292         bool is_legacy = false;
293         unsigned long flags;
294         int i;
295
296         spin_lock_irqsave(&priv->lock, flags);
297         /* QoS always active in AP and ADHOC mode
298          * In STA mode wait for association
299          */
300         if (priv->iw_mode == NL80211_IFTYPE_ADHOC ||
301             priv->iw_mode == NL80211_IFTYPE_AP)
302                 priv->qos_data.qos_active = 1;
303         else
304                 priv->qos_data.qos_active = 0;
305
306         /* check for legacy mode */
307         if ((priv->iw_mode == NL80211_IFTYPE_ADHOC &&
308             (priv->active_rate & IWL_OFDM_RATES_MASK) == 0) ||
309             (priv->iw_mode == NL80211_IFTYPE_STATION &&
310             (priv->staging_rxon.flags & RXON_FLG_SHORT_SLOT_MSK) == 0)) {
311                 cw_min = 31;
312                 is_legacy = 1;
313         }
314
315         if (priv->qos_data.qos_active)
316                 aifs = 3;
317
318         /* AC_BE */
319         priv->qos_data.def_qos_parm.ac[0].cw_min = cpu_to_le16(cw_min);
320         priv->qos_data.def_qos_parm.ac[0].cw_max = cpu_to_le16(cw_max);
321         priv->qos_data.def_qos_parm.ac[0].aifsn = aifs;
322         priv->qos_data.def_qos_parm.ac[0].edca_txop = 0;
323         priv->qos_data.def_qos_parm.ac[0].reserved1 = 0;
324
325         if (priv->qos_data.qos_active) {
326                 /* AC_BK */
327                 i = 1;
328                 priv->qos_data.def_qos_parm.ac[i].cw_min = cpu_to_le16(cw_min);
329                 priv->qos_data.def_qos_parm.ac[i].cw_max = cpu_to_le16(cw_max);
330                 priv->qos_data.def_qos_parm.ac[i].aifsn = 7;
331                 priv->qos_data.def_qos_parm.ac[i].edca_txop = 0;
332                 priv->qos_data.def_qos_parm.ac[i].reserved1 = 0;
333
334                 /* AC_VI */
335                 i = 2;
336                 priv->qos_data.def_qos_parm.ac[i].cw_min =
337                         cpu_to_le16((cw_min + 1) / 2 - 1);
338                 priv->qos_data.def_qos_parm.ac[i].cw_max =
339                         cpu_to_le16(cw_min);
340                 priv->qos_data.def_qos_parm.ac[i].aifsn = 2;
341                 if (is_legacy)
342                         priv->qos_data.def_qos_parm.ac[i].edca_txop =
343                                 cpu_to_le16(6016);
344                 else
345                         priv->qos_data.def_qos_parm.ac[i].edca_txop =
346                                 cpu_to_le16(3008);
347                 priv->qos_data.def_qos_parm.ac[i].reserved1 = 0;
348
349                 /* AC_VO */
350                 i = 3;
351                 priv->qos_data.def_qos_parm.ac[i].cw_min =
352                         cpu_to_le16((cw_min + 1) / 4 - 1);
353                 priv->qos_data.def_qos_parm.ac[i].cw_max =
354                         cpu_to_le16((cw_min + 1) / 2 - 1);
355                 priv->qos_data.def_qos_parm.ac[i].aifsn = 2;
356                 priv->qos_data.def_qos_parm.ac[i].reserved1 = 0;
357                 if (is_legacy)
358                         priv->qos_data.def_qos_parm.ac[i].edca_txop =
359                                 cpu_to_le16(3264);
360                 else
361                         priv->qos_data.def_qos_parm.ac[i].edca_txop =
362                                 cpu_to_le16(1504);
363         } else {
364                 for (i = 1; i < 4; i++) {
365                         priv->qos_data.def_qos_parm.ac[i].cw_min =
366                                 cpu_to_le16(cw_min);
367                         priv->qos_data.def_qos_parm.ac[i].cw_max =
368                                 cpu_to_le16(cw_max);
369                         priv->qos_data.def_qos_parm.ac[i].aifsn = aifs;
370                         priv->qos_data.def_qos_parm.ac[i].edca_txop = 0;
371                         priv->qos_data.def_qos_parm.ac[i].reserved1 = 0;
372                 }
373         }
374         IWL_DEBUG_QOS(priv, "set QoS to default \n");
375
376         spin_unlock_irqrestore(&priv->lock, flags);
377 }
378 EXPORT_SYMBOL(iwl_reset_qos);
379
380 #define MAX_BIT_RATE_40_MHZ 150 /* Mbps */
381 #define MAX_BIT_RATE_20_MHZ 72 /* Mbps */
382 static void iwlcore_init_ht_hw_capab(const struct iwl_priv *priv,
383                               struct ieee80211_sta_ht_cap *ht_info,
384                               enum ieee80211_band band)
385 {
386         u16 max_bit_rate = 0;
387         u8 rx_chains_num = priv->hw_params.rx_chains_num;
388         u8 tx_chains_num = priv->hw_params.tx_chains_num;
389
390         ht_info->cap = 0;
391         memset(&ht_info->mcs, 0, sizeof(ht_info->mcs));
392
393         ht_info->ht_supported = true;
394
395         ht_info->cap |= IEEE80211_HT_CAP_GRN_FLD;
396         ht_info->cap |= IEEE80211_HT_CAP_SGI_20;
397         ht_info->cap |= (IEEE80211_HT_CAP_SM_PS &
398                              (WLAN_HT_CAP_SM_PS_DISABLED << 2));
399
400         max_bit_rate = MAX_BIT_RATE_20_MHZ;
401         if (priv->hw_params.fat_channel & BIT(band)) {
402                 ht_info->cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
403                 ht_info->cap |= IEEE80211_HT_CAP_SGI_40;
404                 ht_info->mcs.rx_mask[4] = 0x01;
405                 max_bit_rate = MAX_BIT_RATE_40_MHZ;
406         }
407
408         if (priv->cfg->mod_params->amsdu_size_8K)
409                 ht_info->cap |= IEEE80211_HT_CAP_MAX_AMSDU;
410
411         ht_info->ampdu_factor = CFG_HT_RX_AMPDU_FACTOR_DEF;
412         ht_info->ampdu_density = CFG_HT_MPDU_DENSITY_DEF;
413
414         ht_info->mcs.rx_mask[0] = 0xFF;
415         if (rx_chains_num >= 2)
416                 ht_info->mcs.rx_mask[1] = 0xFF;
417         if (rx_chains_num >= 3)
418                 ht_info->mcs.rx_mask[2] = 0xFF;
419
420         /* Highest supported Rx data rate */
421         max_bit_rate *= rx_chains_num;
422         WARN_ON(max_bit_rate & ~IEEE80211_HT_MCS_RX_HIGHEST_MASK);
423         ht_info->mcs.rx_highest = cpu_to_le16(max_bit_rate);
424
425         /* Tx MCS capabilities */
426         ht_info->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
427         if (tx_chains_num != rx_chains_num) {
428                 ht_info->mcs.tx_params |= IEEE80211_HT_MCS_TX_RX_DIFF;
429                 ht_info->mcs.tx_params |= ((tx_chains_num - 1) <<
430                                 IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT);
431         }
432 }
433
434 static void iwlcore_init_hw_rates(struct iwl_priv *priv,
435                               struct ieee80211_rate *rates)
436 {
437         int i;
438
439         for (i = 0; i < IWL_RATE_COUNT; i++) {
440                 rates[i].bitrate = iwl_rates[i].ieee * 5;
441                 rates[i].hw_value = i; /* Rate scaling will work on indexes */
442                 rates[i].hw_value_short = i;
443                 rates[i].flags = 0;
444                 if ((i > IWL_LAST_OFDM_RATE) || (i < IWL_FIRST_OFDM_RATE)) {
445                         /*
446                          * If CCK != 1M then set short preamble rate flag.
447                          */
448                         rates[i].flags |=
449                                 (iwl_rates[i].plcp == IWL_RATE_1M_PLCP) ?
450                                         0 : IEEE80211_RATE_SHORT_PREAMBLE;
451                 }
452         }
453 }
454
455
456 /**
457  * iwlcore_init_geos - Initialize mac80211's geo/channel info based from eeprom
458  */
459 int iwlcore_init_geos(struct iwl_priv *priv)
460 {
461         struct iwl_channel_info *ch;
462         struct ieee80211_supported_band *sband;
463         struct ieee80211_channel *channels;
464         struct ieee80211_channel *geo_ch;
465         struct ieee80211_rate *rates;
466         int i = 0;
467
468         if (priv->bands[IEEE80211_BAND_2GHZ].n_bitrates ||
469             priv->bands[IEEE80211_BAND_5GHZ].n_bitrates) {
470                 IWL_DEBUG_INFO(priv, "Geography modes already initialized.\n");
471                 set_bit(STATUS_GEO_CONFIGURED, &priv->status);
472                 return 0;
473         }
474
475         channels = kzalloc(sizeof(struct ieee80211_channel) *
476                            priv->channel_count, GFP_KERNEL);
477         if (!channels)
478                 return -ENOMEM;
479
480         rates = kzalloc((sizeof(struct ieee80211_rate) * (IWL_RATE_COUNT + 1)),
481                         GFP_KERNEL);
482         if (!rates) {
483                 kfree(channels);
484                 return -ENOMEM;
485         }
486
487         /* 5.2GHz channels start after the 2.4GHz channels */
488         sband = &priv->bands[IEEE80211_BAND_5GHZ];
489         sband->channels = &channels[ARRAY_SIZE(iwl_eeprom_band_1)];
490         /* just OFDM */
491         sband->bitrates = &rates[IWL_FIRST_OFDM_RATE];
492         sband->n_bitrates = IWL_RATE_COUNT - IWL_FIRST_OFDM_RATE;
493
494         if (priv->cfg->sku & IWL_SKU_N)
495                 iwlcore_init_ht_hw_capab(priv, &sband->ht_cap,
496                                          IEEE80211_BAND_5GHZ);
497
498         sband = &priv->bands[IEEE80211_BAND_2GHZ];
499         sband->channels = channels;
500         /* OFDM & CCK */
501         sband->bitrates = rates;
502         sband->n_bitrates = IWL_RATE_COUNT;
503
504         if (priv->cfg->sku & IWL_SKU_N)
505                 iwlcore_init_ht_hw_capab(priv, &sband->ht_cap,
506                                          IEEE80211_BAND_2GHZ);
507
508         priv->ieee_channels = channels;
509         priv->ieee_rates = rates;
510
511         for (i = 0;  i < priv->channel_count; i++) {
512                 ch = &priv->channel_info[i];
513
514                 /* FIXME: might be removed if scan is OK */
515                 if (!is_channel_valid(ch))
516                         continue;
517
518                 if (is_channel_a_band(ch))
519                         sband =  &priv->bands[IEEE80211_BAND_5GHZ];
520                 else
521                         sband =  &priv->bands[IEEE80211_BAND_2GHZ];
522
523                 geo_ch = &sband->channels[sband->n_channels++];
524
525                 geo_ch->center_freq =
526                                 ieee80211_channel_to_frequency(ch->channel);
527                 geo_ch->max_power = ch->max_power_avg;
528                 geo_ch->max_antenna_gain = 0xff;
529                 geo_ch->hw_value = ch->channel;
530
531                 if (is_channel_valid(ch)) {
532                         if (!(ch->flags & EEPROM_CHANNEL_IBSS))
533                                 geo_ch->flags |= IEEE80211_CHAN_NO_IBSS;
534
535                         if (!(ch->flags & EEPROM_CHANNEL_ACTIVE))
536                                 geo_ch->flags |= IEEE80211_CHAN_PASSIVE_SCAN;
537
538                         if (ch->flags & EEPROM_CHANNEL_RADAR)
539                                 geo_ch->flags |= IEEE80211_CHAN_RADAR;
540
541                         geo_ch->flags |= ch->fat_extension_channel;
542
543                         if (ch->max_power_avg > priv->tx_power_channel_lmt)
544                                 priv->tx_power_channel_lmt = ch->max_power_avg;
545                 } else {
546                         geo_ch->flags |= IEEE80211_CHAN_DISABLED;
547                 }
548
549                 /* Save flags for reg domain usage */
550                 geo_ch->orig_flags = geo_ch->flags;
551
552                 IWL_DEBUG_INFO(priv, "Channel %d Freq=%d[%sGHz] %s flag=0x%X\n",
553                                 ch->channel, geo_ch->center_freq,
554                                 is_channel_a_band(ch) ?  "5.2" : "2.4",
555                                 geo_ch->flags & IEEE80211_CHAN_DISABLED ?
556                                 "restricted" : "valid",
557                                  geo_ch->flags);
558         }
559
560         if ((priv->bands[IEEE80211_BAND_5GHZ].n_channels == 0) &&
561              priv->cfg->sku & IWL_SKU_A) {
562                 IWL_INFO(priv, "Incorrectly detected BG card as ABG. "
563                         "Please send your PCI ID 0x%04X:0x%04X to maintainer.\n",
564                            priv->pci_dev->device,
565                            priv->pci_dev->subsystem_device);
566                 priv->cfg->sku &= ~IWL_SKU_A;
567         }
568
569         IWL_INFO(priv, "Tunable channels: %d 802.11bg, %d 802.11a channels\n",
570                    priv->bands[IEEE80211_BAND_2GHZ].n_channels,
571                    priv->bands[IEEE80211_BAND_5GHZ].n_channels);
572
573         set_bit(STATUS_GEO_CONFIGURED, &priv->status);
574
575         return 0;
576 }
577 EXPORT_SYMBOL(iwlcore_init_geos);
578
579 /*
580  * iwlcore_free_geos - undo allocations in iwlcore_init_geos
581  */
582 void iwlcore_free_geos(struct iwl_priv *priv)
583 {
584         kfree(priv->ieee_channels);
585         kfree(priv->ieee_rates);
586         clear_bit(STATUS_GEO_CONFIGURED, &priv->status);
587 }
588 EXPORT_SYMBOL(iwlcore_free_geos);
589
590 static bool is_single_rx_stream(struct iwl_priv *priv)
591 {
592         return !priv->current_ht_config.is_ht ||
593                ((priv->current_ht_config.mcs.rx_mask[1] == 0) &&
594                 (priv->current_ht_config.mcs.rx_mask[2] == 0));
595 }
596
597 static u8 iwl_is_channel_extension(struct iwl_priv *priv,
598                                    enum ieee80211_band band,
599                                    u16 channel, u8 extension_chan_offset)
600 {
601         const struct iwl_channel_info *ch_info;
602
603         ch_info = iwl_get_channel_info(priv, band, channel);
604         if (!is_channel_valid(ch_info))
605                 return 0;
606
607         if (extension_chan_offset == IEEE80211_HT_PARAM_CHA_SEC_ABOVE)
608                 return !(ch_info->fat_extension_channel &
609                                         IEEE80211_CHAN_NO_HT40PLUS);
610         else if (extension_chan_offset == IEEE80211_HT_PARAM_CHA_SEC_BELOW)
611                 return !(ch_info->fat_extension_channel &
612                                         IEEE80211_CHAN_NO_HT40MINUS);
613
614         return 0;
615 }
616
617 u8 iwl_is_fat_tx_allowed(struct iwl_priv *priv,
618                          struct ieee80211_sta_ht_cap *sta_ht_inf)
619 {
620         struct iwl_ht_info *iwl_ht_conf = &priv->current_ht_config;
621
622         if ((!iwl_ht_conf->is_ht) ||
623             (iwl_ht_conf->supported_chan_width != IWL_CHANNEL_WIDTH_40MHZ))
624                 return 0;
625
626         /* We do not check for IEEE80211_HT_CAP_SUP_WIDTH_20_40
627          * the bit will not set if it is pure 40MHz case
628          */
629         if (sta_ht_inf) {
630                 if (!sta_ht_inf->ht_supported)
631                         return 0;
632         }
633
634         if (iwl_ht_conf->ht_protection & IEEE80211_HT_OP_MODE_PROTECTION_20MHZ)
635                 return 1;
636         else
637                 return iwl_is_channel_extension(priv, priv->band,
638                                 le16_to_cpu(priv->staging_rxon.channel),
639                                 iwl_ht_conf->extension_chan_offset);
640 }
641 EXPORT_SYMBOL(iwl_is_fat_tx_allowed);
642
643 void iwl_set_rxon_hwcrypto(struct iwl_priv *priv, int hw_decrypt)
644 {
645         struct iwl_rxon_cmd *rxon = &priv->staging_rxon;
646
647         if (hw_decrypt)
648                 rxon->filter_flags &= ~RXON_FILTER_DIS_DECRYPT_MSK;
649         else
650                 rxon->filter_flags |= RXON_FILTER_DIS_DECRYPT_MSK;
651
652 }
653 EXPORT_SYMBOL(iwl_set_rxon_hwcrypto);
654
655 /**
656  * iwl_check_rxon_cmd - validate RXON structure is valid
657  *
658  * NOTE:  This is really only useful during development and can eventually
659  * be #ifdef'd out once the driver is stable and folks aren't actively
660  * making changes
661  */
662 int iwl_check_rxon_cmd(struct iwl_priv *priv)
663 {
664         int error = 0;
665         int counter = 1;
666         struct iwl_rxon_cmd *rxon = &priv->staging_rxon;
667
668         if (rxon->flags & RXON_FLG_BAND_24G_MSK) {
669                 error |= le32_to_cpu(rxon->flags &
670                                 (RXON_FLG_TGJ_NARROW_BAND_MSK |
671                                  RXON_FLG_RADAR_DETECT_MSK));
672                 if (error)
673                         IWL_WARN(priv, "check 24G fields %d | %d\n",
674                                     counter++, error);
675         } else {
676                 error |= (rxon->flags & RXON_FLG_SHORT_SLOT_MSK) ?
677                                 0 : le32_to_cpu(RXON_FLG_SHORT_SLOT_MSK);
678                 if (error)
679                         IWL_WARN(priv, "check 52 fields %d | %d\n",
680                                     counter++, error);
681                 error |= le32_to_cpu(rxon->flags & RXON_FLG_CCK_MSK);
682                 if (error)
683                         IWL_WARN(priv, "check 52 CCK %d | %d\n",
684                                     counter++, error);
685         }
686         error |= (rxon->node_addr[0] | rxon->bssid_addr[0]) & 0x1;
687         if (error)
688                 IWL_WARN(priv, "check mac addr %d | %d\n", counter++, error);
689
690         /* make sure basic rates 6Mbps and 1Mbps are supported */
691         error |= (((rxon->ofdm_basic_rates & IWL_RATE_6M_MASK) == 0) &&
692                   ((rxon->cck_basic_rates & IWL_RATE_1M_MASK) == 0));
693         if (error)
694                 IWL_WARN(priv, "check basic rate %d | %d\n", counter++, error);
695
696         error |= (le16_to_cpu(rxon->assoc_id) > 2007);
697         if (error)
698                 IWL_WARN(priv, "check assoc id %d | %d\n", counter++, error);
699
700         error |= ((rxon->flags & (RXON_FLG_CCK_MSK | RXON_FLG_SHORT_SLOT_MSK))
701                         == (RXON_FLG_CCK_MSK | RXON_FLG_SHORT_SLOT_MSK));
702         if (error)
703                 IWL_WARN(priv, "check CCK and short slot %d | %d\n",
704                             counter++, error);
705
706         error |= ((rxon->flags & (RXON_FLG_CCK_MSK | RXON_FLG_AUTO_DETECT_MSK))
707                         == (RXON_FLG_CCK_MSK | RXON_FLG_AUTO_DETECT_MSK));
708         if (error)
709                 IWL_WARN(priv, "check CCK & auto detect %d | %d\n",
710                             counter++, error);
711
712         error |= ((rxon->flags & (RXON_FLG_AUTO_DETECT_MSK |
713                         RXON_FLG_TGG_PROTECT_MSK)) == RXON_FLG_TGG_PROTECT_MSK);
714         if (error)
715                 IWL_WARN(priv, "check TGG and auto detect %d | %d\n",
716                             counter++, error);
717
718         if (error)
719                 IWL_WARN(priv, "Tuning to channel %d\n",
720                             le16_to_cpu(rxon->channel));
721
722         if (error) {
723                 IWL_ERR(priv, "Not a valid iwl_rxon_assoc_cmd field values\n");
724                 return -1;
725         }
726         return 0;
727 }
728 EXPORT_SYMBOL(iwl_check_rxon_cmd);
729
730 /**
731  * iwl_full_rxon_required - check if full RXON (vs RXON_ASSOC) cmd is needed
732  * @priv: staging_rxon is compared to active_rxon
733  *
734  * If the RXON structure is changing enough to require a new tune,
735  * or is clearing the RXON_FILTER_ASSOC_MSK, then return 1 to indicate that
736  * a new tune (full RXON command, rather than RXON_ASSOC cmd) is required.
737  */
738 int iwl_full_rxon_required(struct iwl_priv *priv)
739 {
740
741         /* These items are only settable from the full RXON command */
742         if (!(iwl_is_associated(priv)) ||
743             compare_ether_addr(priv->staging_rxon.bssid_addr,
744                                priv->active_rxon.bssid_addr) ||
745             compare_ether_addr(priv->staging_rxon.node_addr,
746                                priv->active_rxon.node_addr) ||
747             compare_ether_addr(priv->staging_rxon.wlap_bssid_addr,
748                                priv->active_rxon.wlap_bssid_addr) ||
749             (priv->staging_rxon.dev_type != priv->active_rxon.dev_type) ||
750             (priv->staging_rxon.channel != priv->active_rxon.channel) ||
751             (priv->staging_rxon.air_propagation !=
752              priv->active_rxon.air_propagation) ||
753             (priv->staging_rxon.ofdm_ht_single_stream_basic_rates !=
754              priv->active_rxon.ofdm_ht_single_stream_basic_rates) ||
755             (priv->staging_rxon.ofdm_ht_dual_stream_basic_rates !=
756              priv->active_rxon.ofdm_ht_dual_stream_basic_rates) ||
757             (priv->staging_rxon.ofdm_ht_triple_stream_basic_rates !=
758              priv->active_rxon.ofdm_ht_triple_stream_basic_rates) ||
759             (priv->staging_rxon.assoc_id != priv->active_rxon.assoc_id))
760                 return 1;
761
762         /* flags, filter_flags, ofdm_basic_rates, and cck_basic_rates can
763          * be updated with the RXON_ASSOC command -- however only some
764          * flag transitions are allowed using RXON_ASSOC */
765
766         /* Check if we are not switching bands */
767         if ((priv->staging_rxon.flags & RXON_FLG_BAND_24G_MSK) !=
768             (priv->active_rxon.flags & RXON_FLG_BAND_24G_MSK))
769                 return 1;
770
771         /* Check if we are switching association toggle */
772         if ((priv->staging_rxon.filter_flags & RXON_FILTER_ASSOC_MSK) !=
773                 (priv->active_rxon.filter_flags & RXON_FILTER_ASSOC_MSK))
774                 return 1;
775
776         return 0;
777 }
778 EXPORT_SYMBOL(iwl_full_rxon_required);
779
780 u8 iwl_rate_get_lowest_plcp(struct iwl_priv *priv)
781 {
782         int i;
783         int rate_mask;
784
785         /* Set rate mask*/
786         if (priv->staging_rxon.flags & RXON_FLG_BAND_24G_MSK)
787                 rate_mask = priv->active_rate_basic & IWL_CCK_RATES_MASK;
788         else
789                 rate_mask = priv->active_rate_basic & IWL_OFDM_RATES_MASK;
790
791         /* Find lowest valid rate */
792         for (i = IWL_RATE_1M_INDEX; i != IWL_RATE_INVALID;
793                                         i = iwl_rates[i].next_ieee) {
794                 if (rate_mask & (1 << i))
795                         return iwl_rates[i].plcp;
796         }
797
798         /* No valid rate was found. Assign the lowest one */
799         if (priv->staging_rxon.flags & RXON_FLG_BAND_24G_MSK)
800                 return IWL_RATE_1M_PLCP;
801         else
802                 return IWL_RATE_6M_PLCP;
803 }
804 EXPORT_SYMBOL(iwl_rate_get_lowest_plcp);
805
806 void iwl_set_rxon_ht(struct iwl_priv *priv, struct iwl_ht_info *ht_info)
807 {
808         struct iwl_rxon_cmd *rxon = &priv->staging_rxon;
809
810         if (!ht_info->is_ht) {
811                 rxon->flags &= ~(RXON_FLG_CHANNEL_MODE_MSK |
812                         RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK |
813                         RXON_FLG_FAT_PROT_MSK |
814                         RXON_FLG_HT_PROT_MSK);
815                 return;
816         }
817
818         /* FIXME: if the definition of ht_protection changed, the "translation"
819          * will be needed for rxon->flags
820          */
821         rxon->flags |= cpu_to_le32(ht_info->ht_protection << RXON_FLG_HT_OPERATING_MODE_POS);
822
823         /* Set up channel bandwidth:
824          * 20 MHz only, 20/40 mixed or pure 40 if fat ok */
825         /* clear the HT channel mode before set the mode */
826         rxon->flags &= ~(RXON_FLG_CHANNEL_MODE_MSK |
827                          RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK);
828         if (iwl_is_fat_tx_allowed(priv, NULL)) {
829                 /* pure 40 fat */
830                 if (rxon->flags & RXON_FLG_FAT_PROT_MSK)
831                         rxon->flags |= RXON_FLG_CHANNEL_MODE_PURE_40;
832                 else {
833                         /* Note: control channel is opposite of extension channel */
834                         switch (ht_info->extension_chan_offset) {
835                         case IEEE80211_HT_PARAM_CHA_SEC_ABOVE:
836                                 rxon->flags &= ~(RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK);
837                                 rxon->flags |= RXON_FLG_CHANNEL_MODE_MIXED;
838                                 break;
839                         case IEEE80211_HT_PARAM_CHA_SEC_BELOW:
840                                 rxon->flags |= RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK;
841                                 rxon->flags |= RXON_FLG_CHANNEL_MODE_MIXED;
842                                 break;
843                         case IEEE80211_HT_PARAM_CHA_SEC_NONE:
844                         default:
845                                 /* channel location only valid if in Mixed mode */
846                                 IWL_ERR(priv, "invalid extension channel offset\n");
847                                 break;
848                         }
849                 }
850         } else {
851                 rxon->flags |= RXON_FLG_CHANNEL_MODE_LEGACY;
852         }
853
854         if (priv->cfg->ops->hcmd->set_rxon_chain)
855                 priv->cfg->ops->hcmd->set_rxon_chain(priv);
856
857         IWL_DEBUG_ASSOC(priv, "supported HT rate 0x%X 0x%X 0x%X "
858                         "rxon flags 0x%X operation mode :0x%X "
859                         "extension channel offset 0x%x\n",
860                         ht_info->mcs.rx_mask[0],
861                         ht_info->mcs.rx_mask[1],
862                         ht_info->mcs.rx_mask[2],
863                         le32_to_cpu(rxon->flags), ht_info->ht_protection,
864                         ht_info->extension_chan_offset);
865         return;
866 }
867 EXPORT_SYMBOL(iwl_set_rxon_ht);
868
869 #define IWL_NUM_RX_CHAINS_MULTIPLE      3
870 #define IWL_NUM_RX_CHAINS_SINGLE        2
871 #define IWL_NUM_IDLE_CHAINS_DUAL        2
872 #define IWL_NUM_IDLE_CHAINS_SINGLE      1
873
874 /* Determine how many receiver/antenna chains to use.
875  * More provides better reception via diversity.  Fewer saves power.
876  * MIMO (dual stream) requires at least 2, but works better with 3.
877  * This does not determine *which* chains to use, just how many.
878  */
879 static int iwl_get_active_rx_chain_count(struct iwl_priv *priv)
880 {
881         bool is_single = is_single_rx_stream(priv);
882         bool is_cam = !test_bit(STATUS_POWER_PMI, &priv->status);
883
884         /* # of Rx chains to use when expecting MIMO. */
885         if (is_single || (!is_cam && (priv->current_ht_config.sm_ps ==
886                                                  WLAN_HT_CAP_SM_PS_STATIC)))
887                 return IWL_NUM_RX_CHAINS_SINGLE;
888         else
889                 return IWL_NUM_RX_CHAINS_MULTIPLE;
890 }
891
892 static int iwl_get_idle_rx_chain_count(struct iwl_priv *priv, int active_cnt)
893 {
894         int idle_cnt;
895         bool is_cam = !test_bit(STATUS_POWER_PMI, &priv->status);
896         /* # Rx chains when idling and maybe trying to save power */
897         switch (priv->current_ht_config.sm_ps) {
898         case WLAN_HT_CAP_SM_PS_STATIC:
899         case WLAN_HT_CAP_SM_PS_DYNAMIC:
900                 idle_cnt = (is_cam) ? IWL_NUM_IDLE_CHAINS_DUAL :
901                                         IWL_NUM_IDLE_CHAINS_SINGLE;
902                 break;
903         case WLAN_HT_CAP_SM_PS_DISABLED:
904                 idle_cnt = (is_cam) ? active_cnt : IWL_NUM_IDLE_CHAINS_SINGLE;
905                 break;
906         case WLAN_HT_CAP_SM_PS_INVALID:
907         default:
908                 IWL_ERR(priv, "invalid mimo ps mode %d\n",
909                            priv->current_ht_config.sm_ps);
910                 WARN_ON(1);
911                 idle_cnt = -1;
912                 break;
913         }
914         return idle_cnt;
915 }
916
917 /* up to 4 chains */
918 static u8 iwl_count_chain_bitmap(u32 chain_bitmap)
919 {
920         u8 res;
921         res = (chain_bitmap & BIT(0)) >> 0;
922         res += (chain_bitmap & BIT(1)) >> 1;
923         res += (chain_bitmap & BIT(2)) >> 2;
924         res += (chain_bitmap & BIT(4)) >> 4;
925         return res;
926 }
927
928 /**
929  * iwl_is_monitor_mode - Determine if interface in monitor mode
930  *
931  * priv->iw_mode is set in add_interface, but add_interface is
932  * never called for monitor mode. The only way mac80211 informs us about
933  * monitor mode is through configuring filters (call to configure_filter).
934  */
935 bool iwl_is_monitor_mode(struct iwl_priv *priv)
936 {
937         return !!(priv->staging_rxon.filter_flags & RXON_FILTER_PROMISC_MSK);
938 }
939 EXPORT_SYMBOL(iwl_is_monitor_mode);
940
941 /**
942  * iwl_set_rxon_chain - Set up Rx chain usage in "staging" RXON image
943  *
944  * Selects how many and which Rx receivers/antennas/chains to use.
945  * This should not be used for scan command ... it puts data in wrong place.
946  */
947 void iwl_set_rxon_chain(struct iwl_priv *priv)
948 {
949         bool is_single = is_single_rx_stream(priv);
950         bool is_cam = !test_bit(STATUS_POWER_PMI, &priv->status);
951         u8 idle_rx_cnt, active_rx_cnt, valid_rx_cnt;
952         u32 active_chains;
953         u16 rx_chain;
954
955         /* Tell uCode which antennas are actually connected.
956          * Before first association, we assume all antennas are connected.
957          * Just after first association, iwl_chain_noise_calibration()
958          *    checks which antennas actually *are* connected. */
959          if (priv->chain_noise_data.active_chains)
960                 active_chains = priv->chain_noise_data.active_chains;
961         else
962                 active_chains = priv->hw_params.valid_rx_ant;
963
964         rx_chain = active_chains << RXON_RX_CHAIN_VALID_POS;
965
966         /* How many receivers should we use? */
967         active_rx_cnt = iwl_get_active_rx_chain_count(priv);
968         idle_rx_cnt = iwl_get_idle_rx_chain_count(priv, active_rx_cnt);
969
970
971         /* correct rx chain count according hw settings
972          * and chain noise calibration
973          */
974         valid_rx_cnt = iwl_count_chain_bitmap(active_chains);
975         if (valid_rx_cnt < active_rx_cnt)
976                 active_rx_cnt = valid_rx_cnt;
977
978         if (valid_rx_cnt < idle_rx_cnt)
979                 idle_rx_cnt = valid_rx_cnt;
980
981         rx_chain |= active_rx_cnt << RXON_RX_CHAIN_MIMO_CNT_POS;
982         rx_chain |= idle_rx_cnt  << RXON_RX_CHAIN_CNT_POS;
983
984         /* copied from 'iwl_bg_request_scan()' */
985         /* Force use of chains B and C (0x6) for Rx for 4965
986          * Avoid A (0x1) because of its off-channel reception on A-band.
987          * MIMO is not used here, but value is required */
988         if (iwl_is_monitor_mode(priv) &&
989             !(priv->staging_rxon.flags & RXON_FLG_BAND_24G_MSK) &&
990             ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) == CSR_HW_REV_TYPE_4965)) {
991                 rx_chain = ANT_ABC << RXON_RX_CHAIN_VALID_POS;
992                 rx_chain |= ANT_BC << RXON_RX_CHAIN_FORCE_SEL_POS;
993                 rx_chain |= ANT_ABC << RXON_RX_CHAIN_FORCE_MIMO_SEL_POS;
994                 rx_chain |= 0x1 << RXON_RX_CHAIN_DRIVER_FORCE_POS;
995         }
996
997         priv->staging_rxon.rx_chain = cpu_to_le16(rx_chain);
998
999         if (!is_single && (active_rx_cnt >= IWL_NUM_RX_CHAINS_SINGLE) && is_cam)
1000                 priv->staging_rxon.rx_chain |= RXON_RX_CHAIN_MIMO_FORCE_MSK;
1001         else
1002                 priv->staging_rxon.rx_chain &= ~RXON_RX_CHAIN_MIMO_FORCE_MSK;
1003
1004         IWL_DEBUG_ASSOC(priv, "rx_chain=0x%X active=%d idle=%d\n",
1005                         priv->staging_rxon.rx_chain,
1006                         active_rx_cnt, idle_rx_cnt);
1007
1008         WARN_ON(active_rx_cnt == 0 || idle_rx_cnt == 0 ||
1009                 active_rx_cnt < idle_rx_cnt);
1010 }
1011 EXPORT_SYMBOL(iwl_set_rxon_chain);
1012
1013 /**
1014  * iwl_set_rxon_channel - Set the phymode and channel values in staging RXON
1015  * @phymode: MODE_IEEE80211A sets to 5.2GHz; all else set to 2.4GHz
1016  * @channel: Any channel valid for the requested phymode
1017
1018  * In addition to setting the staging RXON, priv->phymode is also set.
1019  *
1020  * NOTE:  Does not commit to the hardware; it sets appropriate bit fields
1021  * in the staging RXON flag structure based on the phymode
1022  */
1023 int iwl_set_rxon_channel(struct iwl_priv *priv, struct ieee80211_channel *ch)
1024 {
1025         enum ieee80211_band band = ch->band;
1026         u16 channel = ieee80211_frequency_to_channel(ch->center_freq);
1027
1028         if (!iwl_get_channel_info(priv, band, channel)) {
1029                 IWL_DEBUG_INFO(priv, "Could not set channel to %d [%d]\n",
1030                                channel, band);
1031                 return -EINVAL;
1032         }
1033
1034         if ((le16_to_cpu(priv->staging_rxon.channel) == channel) &&
1035             (priv->band == band))
1036                 return 0;
1037
1038         priv->staging_rxon.channel = cpu_to_le16(channel);
1039         if (band == IEEE80211_BAND_5GHZ)
1040                 priv->staging_rxon.flags &= ~RXON_FLG_BAND_24G_MSK;
1041         else
1042                 priv->staging_rxon.flags |= RXON_FLG_BAND_24G_MSK;
1043
1044         priv->band = band;
1045
1046         IWL_DEBUG_INFO(priv, "Staging channel set to %d [%d]\n", channel, band);
1047
1048         return 0;
1049 }
1050 EXPORT_SYMBOL(iwl_set_rxon_channel);
1051
1052 void iwl_set_flags_for_band(struct iwl_priv *priv,
1053                             enum ieee80211_band band)
1054 {
1055         if (band == IEEE80211_BAND_5GHZ) {
1056                 priv->staging_rxon.flags &=
1057                     ~(RXON_FLG_BAND_24G_MSK | RXON_FLG_AUTO_DETECT_MSK
1058                       | RXON_FLG_CCK_MSK);
1059                 priv->staging_rxon.flags |= RXON_FLG_SHORT_SLOT_MSK;
1060         } else {
1061                 /* Copied from iwl_post_associate() */
1062                 if (priv->assoc_capability & WLAN_CAPABILITY_SHORT_SLOT_TIME)
1063                         priv->staging_rxon.flags |= RXON_FLG_SHORT_SLOT_MSK;
1064                 else
1065                         priv->staging_rxon.flags &= ~RXON_FLG_SHORT_SLOT_MSK;
1066
1067                 if (priv->iw_mode == NL80211_IFTYPE_ADHOC)
1068                         priv->staging_rxon.flags &= ~RXON_FLG_SHORT_SLOT_MSK;
1069
1070                 priv->staging_rxon.flags |= RXON_FLG_BAND_24G_MSK;
1071                 priv->staging_rxon.flags |= RXON_FLG_AUTO_DETECT_MSK;
1072                 priv->staging_rxon.flags &= ~RXON_FLG_CCK_MSK;
1073         }
1074 }
1075 EXPORT_SYMBOL(iwl_set_flags_for_band);
1076
1077 /*
1078  * initialize rxon structure with default values from eeprom
1079  */
1080 void iwl_connection_init_rx_config(struct iwl_priv *priv, int mode)
1081 {
1082         const struct iwl_channel_info *ch_info;
1083
1084         memset(&priv->staging_rxon, 0, sizeof(priv->staging_rxon));
1085
1086         switch (mode) {
1087         case NL80211_IFTYPE_AP:
1088                 priv->staging_rxon.dev_type = RXON_DEV_TYPE_AP;
1089                 break;
1090
1091         case NL80211_IFTYPE_STATION:
1092                 priv->staging_rxon.dev_type = RXON_DEV_TYPE_ESS;
1093                 priv->staging_rxon.filter_flags = RXON_FILTER_ACCEPT_GRP_MSK;
1094                 break;
1095
1096         case NL80211_IFTYPE_ADHOC:
1097                 priv->staging_rxon.dev_type = RXON_DEV_TYPE_IBSS;
1098                 priv->staging_rxon.flags = RXON_FLG_SHORT_PREAMBLE_MSK;
1099                 priv->staging_rxon.filter_flags = RXON_FILTER_BCON_AWARE_MSK |
1100                                                   RXON_FILTER_ACCEPT_GRP_MSK;
1101                 break;
1102
1103         default:
1104                 IWL_ERR(priv, "Unsupported interface type %d\n", mode);
1105                 break;
1106         }
1107
1108 #if 0
1109         /* TODO:  Figure out when short_preamble would be set and cache from
1110          * that */
1111         if (!hw_to_local(priv->hw)->short_preamble)
1112                 priv->staging_rxon.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK;
1113         else
1114                 priv->staging_rxon.flags |= RXON_FLG_SHORT_PREAMBLE_MSK;
1115 #endif
1116
1117         ch_info = iwl_get_channel_info(priv, priv->band,
1118                                        le16_to_cpu(priv->active_rxon.channel));
1119
1120         if (!ch_info)
1121                 ch_info = &priv->channel_info[0];
1122
1123         /*
1124          * in some case A channels are all non IBSS
1125          * in this case force B/G channel
1126          */
1127         if ((priv->iw_mode == NL80211_IFTYPE_ADHOC) &&
1128             !(is_channel_ibss(ch_info)))
1129                 ch_info = &priv->channel_info[0];
1130
1131         priv->staging_rxon.channel = cpu_to_le16(ch_info->channel);
1132         priv->band = ch_info->band;
1133
1134         iwl_set_flags_for_band(priv, priv->band);
1135
1136         priv->staging_rxon.ofdm_basic_rates =
1137             (IWL_OFDM_RATES_MASK >> IWL_FIRST_OFDM_RATE) & 0xFF;
1138         priv->staging_rxon.cck_basic_rates =
1139             (IWL_CCK_RATES_MASK >> IWL_FIRST_CCK_RATE) & 0xF;
1140
1141         /* clear both MIX and PURE40 mode flag */
1142         priv->staging_rxon.flags &= ~(RXON_FLG_CHANNEL_MODE_MIXED |
1143                                         RXON_FLG_CHANNEL_MODE_PURE_40);
1144         memcpy(priv->staging_rxon.node_addr, priv->mac_addr, ETH_ALEN);
1145         memcpy(priv->staging_rxon.wlap_bssid_addr, priv->mac_addr, ETH_ALEN);
1146         priv->staging_rxon.ofdm_ht_single_stream_basic_rates = 0xff;
1147         priv->staging_rxon.ofdm_ht_dual_stream_basic_rates = 0xff;
1148         priv->staging_rxon.ofdm_ht_triple_stream_basic_rates = 0xff;
1149 }
1150 EXPORT_SYMBOL(iwl_connection_init_rx_config);
1151
1152 static void iwl_set_rate(struct iwl_priv *priv)
1153 {
1154         const struct ieee80211_supported_band *hw = NULL;
1155         struct ieee80211_rate *rate;
1156         int i;
1157
1158         hw = iwl_get_hw_mode(priv, priv->band);
1159         if (!hw) {
1160                 IWL_ERR(priv, "Failed to set rate: unable to get hw mode\n");
1161                 return;
1162         }
1163
1164         priv->active_rate = 0;
1165         priv->active_rate_basic = 0;
1166
1167         for (i = 0; i < hw->n_bitrates; i++) {
1168                 rate = &(hw->bitrates[i]);
1169                 if (rate->hw_value < IWL_RATE_COUNT)
1170                         priv->active_rate |= (1 << rate->hw_value);
1171         }
1172
1173         IWL_DEBUG_RATE(priv, "Set active_rate = %0x, active_rate_basic = %0x\n",
1174                        priv->active_rate, priv->active_rate_basic);
1175
1176         /*
1177          * If a basic rate is configured, then use it (adding IWL_RATE_1M_MASK)
1178          * otherwise set it to the default of all CCK rates and 6, 12, 24 for
1179          * OFDM
1180          */
1181         if (priv->active_rate_basic & IWL_CCK_BASIC_RATES_MASK)
1182                 priv->staging_rxon.cck_basic_rates =
1183                     ((priv->active_rate_basic &
1184                       IWL_CCK_RATES_MASK) >> IWL_FIRST_CCK_RATE) & 0xF;
1185         else
1186                 priv->staging_rxon.cck_basic_rates =
1187                     (IWL_CCK_BASIC_RATES_MASK >> IWL_FIRST_CCK_RATE) & 0xF;
1188
1189         if (priv->active_rate_basic & IWL_OFDM_BASIC_RATES_MASK)
1190                 priv->staging_rxon.ofdm_basic_rates =
1191                     ((priv->active_rate_basic &
1192                       (IWL_OFDM_BASIC_RATES_MASK | IWL_RATE_6M_MASK)) >>
1193                       IWL_FIRST_OFDM_RATE) & 0xFF;
1194         else
1195                 priv->staging_rxon.ofdm_basic_rates =
1196                    (IWL_OFDM_BASIC_RATES_MASK >> IWL_FIRST_OFDM_RATE) & 0xFF;
1197 }
1198
1199 void iwl_rx_csa(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb)
1200 {
1201         struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data;
1202         struct iwl_rxon_cmd *rxon = (void *)&priv->active_rxon;
1203         struct iwl_csa_notification *csa = &(pkt->u.csa_notif);
1204         IWL_DEBUG_11H(priv, "CSA notif: channel %d, status %d\n",
1205                       le16_to_cpu(csa->channel), le32_to_cpu(csa->status));
1206         rxon->channel = csa->channel;
1207         priv->staging_rxon.channel = csa->channel;
1208 }
1209 EXPORT_SYMBOL(iwl_rx_csa);
1210
1211 #ifdef CONFIG_IWLWIFI_DEBUG
1212 static void iwl_print_rx_config_cmd(struct iwl_priv *priv)
1213 {
1214         struct iwl_rxon_cmd *rxon = &priv->staging_rxon;
1215
1216         IWL_DEBUG_RADIO(priv, "RX CONFIG:\n");
1217         iwl_print_hex_dump(priv, IWL_DL_RADIO, (u8 *) rxon, sizeof(*rxon));
1218         IWL_DEBUG_RADIO(priv, "u16 channel: 0x%x\n", le16_to_cpu(rxon->channel));
1219         IWL_DEBUG_RADIO(priv, "u32 flags: 0x%08X\n", le32_to_cpu(rxon->flags));
1220         IWL_DEBUG_RADIO(priv, "u32 filter_flags: 0x%08x\n",
1221                         le32_to_cpu(rxon->filter_flags));
1222         IWL_DEBUG_RADIO(priv, "u8 dev_type: 0x%x\n", rxon->dev_type);
1223         IWL_DEBUG_RADIO(priv, "u8 ofdm_basic_rates: 0x%02x\n",
1224                         rxon->ofdm_basic_rates);
1225         IWL_DEBUG_RADIO(priv, "u8 cck_basic_rates: 0x%02x\n", rxon->cck_basic_rates);
1226         IWL_DEBUG_RADIO(priv, "u8[6] node_addr: %pM\n", rxon->node_addr);
1227         IWL_DEBUG_RADIO(priv, "u8[6] bssid_addr: %pM\n", rxon->bssid_addr);
1228         IWL_DEBUG_RADIO(priv, "u16 assoc_id: 0x%x\n", le16_to_cpu(rxon->assoc_id));
1229 }
1230 #endif
1231
1232 /**
1233  * iwl_irq_handle_error - called for HW or SW error interrupt from card
1234  */
1235 void iwl_irq_handle_error(struct iwl_priv *priv)
1236 {
1237         /* Set the FW error flag -- cleared on iwl_down */
1238         set_bit(STATUS_FW_ERROR, &priv->status);
1239
1240         /* Cancel currently queued command. */
1241         clear_bit(STATUS_HCMD_ACTIVE, &priv->status);
1242
1243 #ifdef CONFIG_IWLWIFI_DEBUG
1244         if (priv->debug_level & IWL_DL_FW_ERRORS) {
1245                 iwl_dump_nic_error_log(priv);
1246                 iwl_dump_nic_event_log(priv);
1247                 iwl_print_rx_config_cmd(priv);
1248         }
1249 #endif
1250
1251         wake_up_interruptible(&priv->wait_command_queue);
1252
1253         /* Keep the restart process from trying to send host
1254          * commands by clearing the INIT status bit */
1255         clear_bit(STATUS_READY, &priv->status);
1256
1257         if (!test_bit(STATUS_EXIT_PENDING, &priv->status)) {
1258                 IWL_DEBUG(priv, IWL_DL_FW_ERRORS,
1259                           "Restarting adapter due to uCode error.\n");
1260
1261                 if (priv->cfg->mod_params->restart_fw)
1262                         queue_work(priv->workqueue, &priv->restart);
1263         }
1264 }
1265 EXPORT_SYMBOL(iwl_irq_handle_error);
1266
1267 void iwl_configure_filter(struct ieee80211_hw *hw,
1268                           unsigned int changed_flags,
1269                           unsigned int *total_flags,
1270                           int mc_count, struct dev_addr_list *mc_list)
1271 {
1272         struct iwl_priv *priv = hw->priv;
1273         __le32 *filter_flags = &priv->staging_rxon.filter_flags;
1274
1275         IWL_DEBUG_MAC80211(priv, "Enter: changed: 0x%x, total: 0x%x\n",
1276                         changed_flags, *total_flags);
1277
1278         if (changed_flags & (FIF_OTHER_BSS | FIF_PROMISC_IN_BSS)) {
1279                 if (*total_flags & (FIF_OTHER_BSS | FIF_PROMISC_IN_BSS))
1280                         *filter_flags |= RXON_FILTER_PROMISC_MSK;
1281                 else
1282                         *filter_flags &= ~RXON_FILTER_PROMISC_MSK;
1283         }
1284         if (changed_flags & FIF_ALLMULTI) {
1285                 if (*total_flags & FIF_ALLMULTI)
1286                         *filter_flags |= RXON_FILTER_ACCEPT_GRP_MSK;
1287                 else
1288                         *filter_flags &= ~RXON_FILTER_ACCEPT_GRP_MSK;
1289         }
1290         if (changed_flags & FIF_CONTROL) {
1291                 if (*total_flags & FIF_CONTROL)
1292                         *filter_flags |= RXON_FILTER_CTL2HOST_MSK;
1293                 else
1294                         *filter_flags &= ~RXON_FILTER_CTL2HOST_MSK;
1295         }
1296         if (changed_flags & FIF_BCN_PRBRESP_PROMISC) {
1297                 if (*total_flags & FIF_BCN_PRBRESP_PROMISC)
1298                         *filter_flags |= RXON_FILTER_BCON_AWARE_MSK;
1299                 else
1300                         *filter_flags &= ~RXON_FILTER_BCON_AWARE_MSK;
1301         }
1302
1303         /* We avoid iwl_commit_rxon here to commit the new filter flags
1304          * since mac80211 will call ieee80211_hw_config immediately.
1305          * (mc_list is not supported at this time). Otherwise, we need to
1306          * queue a background iwl_commit_rxon work.
1307          */
1308
1309         *total_flags &= FIF_OTHER_BSS | FIF_ALLMULTI | FIF_PROMISC_IN_BSS |
1310                         FIF_BCN_PRBRESP_PROMISC | FIF_CONTROL;
1311 }
1312 EXPORT_SYMBOL(iwl_configure_filter);
1313
1314 int iwl_setup_mac(struct iwl_priv *priv)
1315 {
1316         int ret;
1317         struct ieee80211_hw *hw = priv->hw;
1318         hw->rate_control_algorithm = "iwl-agn-rs";
1319
1320         /* Tell mac80211 our characteristics */
1321         hw->flags = IEEE80211_HW_SIGNAL_DBM |
1322                     IEEE80211_HW_NOISE_DBM |
1323                     IEEE80211_HW_AMPDU_AGGREGATION |
1324                     IEEE80211_HW_SPECTRUM_MGMT;
1325         hw->wiphy->interface_modes =
1326                 BIT(NL80211_IFTYPE_STATION) |
1327                 BIT(NL80211_IFTYPE_ADHOC);
1328
1329         hw->wiphy->custom_regulatory = true;
1330
1331         hw->wiphy->max_scan_ssids = PROBE_OPTION_MAX;
1332         /* we create the 802.11 header and a zero-length SSID element */
1333         hw->wiphy->max_scan_ie_len = IWL_MAX_PROBE_REQUEST - 24 - 2;
1334
1335         /* Default value; 4 EDCA QOS priorities */
1336         hw->queues = 4;
1337
1338         hw->max_listen_interval = IWL_CONN_MAX_LISTEN_INTERVAL;
1339
1340         if (priv->bands[IEEE80211_BAND_2GHZ].n_channels)
1341                 priv->hw->wiphy->bands[IEEE80211_BAND_2GHZ] =
1342                         &priv->bands[IEEE80211_BAND_2GHZ];
1343         if (priv->bands[IEEE80211_BAND_5GHZ].n_channels)
1344                 priv->hw->wiphy->bands[IEEE80211_BAND_5GHZ] =
1345                         &priv->bands[IEEE80211_BAND_5GHZ];
1346
1347         ret = ieee80211_register_hw(priv->hw);
1348         if (ret) {
1349                 IWL_ERR(priv, "Failed to register hw (error %d)\n", ret);
1350                 return ret;
1351         }
1352         priv->mac80211_registered = 1;
1353
1354         return 0;
1355 }
1356 EXPORT_SYMBOL(iwl_setup_mac);
1357
1358 int iwl_set_hw_params(struct iwl_priv *priv)
1359 {
1360         priv->hw_params.sw_crypto = priv->cfg->mod_params->sw_crypto;
1361         priv->hw_params.max_rxq_size = RX_QUEUE_SIZE;
1362         priv->hw_params.max_rxq_log = RX_QUEUE_SIZE_LOG;
1363         if (priv->cfg->mod_params->amsdu_size_8K)
1364                 priv->hw_params.rx_buf_size = IWL_RX_BUF_SIZE_8K;
1365         else
1366                 priv->hw_params.rx_buf_size = IWL_RX_BUF_SIZE_4K;
1367         priv->hw_params.max_pkt_size = priv->hw_params.rx_buf_size - 256;
1368
1369         if (priv->cfg->mod_params->disable_11n)
1370                 priv->cfg->sku &= ~IWL_SKU_N;
1371
1372         /* Device-specific setup */
1373         return priv->cfg->ops->lib->set_hw_params(priv);
1374 }
1375 EXPORT_SYMBOL(iwl_set_hw_params);
1376
1377 int iwl_init_drv(struct iwl_priv *priv)
1378 {
1379         int ret;
1380
1381         priv->ibss_beacon = NULL;
1382
1383         spin_lock_init(&priv->lock);
1384         spin_lock_init(&priv->sta_lock);
1385         spin_lock_init(&priv->hcmd_lock);
1386
1387         INIT_LIST_HEAD(&priv->free_frames);
1388
1389         mutex_init(&priv->mutex);
1390
1391         /* Clear the driver's (not device's) station table */
1392         priv->cfg->ops->smgmt->clear_station_table(priv);
1393
1394         priv->data_retry_limit = -1;
1395         priv->ieee_channels = NULL;
1396         priv->ieee_rates = NULL;
1397         priv->band = IEEE80211_BAND_2GHZ;
1398
1399         priv->iw_mode = NL80211_IFTYPE_STATION;
1400
1401         priv->current_ht_config.sm_ps = WLAN_HT_CAP_SM_PS_DISABLED;
1402
1403         /* Choose which receivers/antennas to use */
1404         if (priv->cfg->ops->hcmd->set_rxon_chain)
1405                 priv->cfg->ops->hcmd->set_rxon_chain(priv);
1406
1407         iwl_init_scan_params(priv);
1408
1409         iwl_reset_qos(priv);
1410
1411         priv->qos_data.qos_active = 0;
1412         priv->qos_data.qos_cap.val = 0;
1413
1414         priv->rates_mask = IWL_RATES_MASK;
1415         /* If power management is turned on, default to CAM mode */
1416         priv->power_mode = IWL_POWER_MODE_CAM;
1417         priv->tx_power_user_lmt = IWL_TX_POWER_TARGET_POWER_MAX;
1418
1419         ret = iwl_init_channel_map(priv);
1420         if (ret) {
1421                 IWL_ERR(priv, "initializing regulatory failed: %d\n", ret);
1422                 goto err;
1423         }
1424
1425         ret = iwlcore_init_geos(priv);
1426         if (ret) {
1427                 IWL_ERR(priv, "initializing geos failed: %d\n", ret);
1428                 goto err_free_channel_map;
1429         }
1430         iwlcore_init_hw_rates(priv, priv->ieee_rates);
1431
1432         return 0;
1433
1434 err_free_channel_map:
1435         iwl_free_channel_map(priv);
1436 err:
1437         return ret;
1438 }
1439 EXPORT_SYMBOL(iwl_init_drv);
1440
1441 int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force)
1442 {
1443         int ret = 0;
1444         if (tx_power < IWL_TX_POWER_TARGET_POWER_MIN) {
1445                 IWL_WARN(priv, "Requested user TXPOWER %d below lower limit %d.\n",
1446                          tx_power,
1447                          IWL_TX_POWER_TARGET_POWER_MIN);
1448                 return -EINVAL;
1449         }
1450
1451         if (tx_power > IWL_TX_POWER_TARGET_POWER_MAX) {
1452                 IWL_WARN(priv, "Requested user TXPOWER %d above upper limit %d.\n",
1453                          tx_power,
1454                          IWL_TX_POWER_TARGET_POWER_MAX);
1455                 return -EINVAL;
1456         }
1457
1458         if (priv->tx_power_user_lmt != tx_power)
1459                 force = true;
1460
1461         priv->tx_power_user_lmt = tx_power;
1462
1463         /* if nic is not up don't send command */
1464         if (!iwl_is_ready_rf(priv))
1465                 return ret;
1466
1467         if (force && priv->cfg->ops->lib->send_tx_power)
1468                 ret = priv->cfg->ops->lib->send_tx_power(priv);
1469
1470         return ret;
1471 }
1472 EXPORT_SYMBOL(iwl_set_tx_power);
1473
1474 void iwl_uninit_drv(struct iwl_priv *priv)
1475 {
1476         iwl_calib_free_results(priv);
1477         iwlcore_free_geos(priv);
1478         iwl_free_channel_map(priv);
1479         kfree(priv->scan);
1480 }
1481 EXPORT_SYMBOL(iwl_uninit_drv);
1482
1483
1484 void iwl_disable_interrupts(struct iwl_priv *priv)
1485 {
1486         clear_bit(STATUS_INT_ENABLED, &priv->status);
1487
1488         /* disable interrupts from uCode/NIC to host */
1489         iwl_write32(priv, CSR_INT_MASK, 0x00000000);
1490
1491         /* acknowledge/clear/reset any interrupts still pending
1492          * from uCode or flow handler (Rx/Tx DMA) */
1493         iwl_write32(priv, CSR_INT, 0xffffffff);
1494         iwl_write32(priv, CSR_FH_INT_STATUS, 0xffffffff);
1495         IWL_DEBUG_ISR(priv, "Disabled interrupts\n");
1496 }
1497 EXPORT_SYMBOL(iwl_disable_interrupts);
1498
1499 void iwl_enable_interrupts(struct iwl_priv *priv)
1500 {
1501         IWL_DEBUG_ISR(priv, "Enabling interrupts\n");
1502         set_bit(STATUS_INT_ENABLED, &priv->status);
1503         iwl_write32(priv, CSR_INT_MASK, priv->inta_mask);
1504 }
1505 EXPORT_SYMBOL(iwl_enable_interrupts);
1506
1507
1508 #define ICT_COUNT (PAGE_SIZE/sizeof(u32))
1509
1510 /* Free dram table */
1511 void iwl_free_isr_ict(struct iwl_priv *priv)
1512 {
1513         if (priv->ict_tbl_vir) {
1514                 pci_free_consistent(priv->pci_dev, (sizeof(u32) * ICT_COUNT) +
1515                                         PAGE_SIZE, priv->ict_tbl_vir,
1516                                         priv->ict_tbl_dma);
1517                 priv->ict_tbl_vir = NULL;
1518         }
1519 }
1520 EXPORT_SYMBOL(iwl_free_isr_ict);
1521
1522
1523 /* allocate dram shared table it is a PAGE_SIZE aligned
1524  * also reset all data related to ICT table interrupt.
1525  */
1526 int iwl_alloc_isr_ict(struct iwl_priv *priv)
1527 {
1528
1529         if (priv->cfg->use_isr_legacy)
1530                 return 0;
1531         /* allocate shrared data table */
1532         priv->ict_tbl_vir = pci_alloc_consistent(priv->pci_dev, (sizeof(u32) *
1533                                                   ICT_COUNT) + PAGE_SIZE,
1534                                                   &priv->ict_tbl_dma);
1535         if (!priv->ict_tbl_vir)
1536                 return -ENOMEM;
1537
1538         /* align table to PAGE_SIZE boundry */
1539         priv->aligned_ict_tbl_dma = ALIGN(priv->ict_tbl_dma, PAGE_SIZE);
1540
1541         IWL_DEBUG_ISR(priv, "ict dma addr %Lx dma aligned %Lx diff %d\n",
1542                              (unsigned long long)priv->ict_tbl_dma,
1543                              (unsigned long long)priv->aligned_ict_tbl_dma,
1544                         (int)(priv->aligned_ict_tbl_dma - priv->ict_tbl_dma));
1545
1546         priv->ict_tbl =  priv->ict_tbl_vir +
1547                           (priv->aligned_ict_tbl_dma - priv->ict_tbl_dma);
1548
1549         IWL_DEBUG_ISR(priv, "ict vir addr %p vir aligned %p diff %d\n",
1550                              priv->ict_tbl, priv->ict_tbl_vir,
1551                         (int)(priv->aligned_ict_tbl_dma - priv->ict_tbl_dma));
1552
1553         /* reset table and index to all 0 */
1554         memset(priv->ict_tbl_vir,0, (sizeof(u32) * ICT_COUNT) + PAGE_SIZE);
1555         priv->ict_index = 0;
1556
1557         /* add periodic RX interrupt */
1558         priv->inta_mask |= CSR_INT_BIT_RX_PERIODIC;
1559         return 0;
1560 }
1561 EXPORT_SYMBOL(iwl_alloc_isr_ict);
1562
1563 /* Device is going up inform it about using ICT interrupt table,
1564  * also we need to tell the driver to start using ICT interrupt.
1565  */
1566 int iwl_reset_ict(struct iwl_priv *priv)
1567 {
1568         u32 val;
1569         unsigned long flags;
1570
1571         if (!priv->ict_tbl_vir)
1572                 return 0;
1573
1574         spin_lock_irqsave(&priv->lock, flags);
1575         iwl_disable_interrupts(priv);
1576
1577         memset(&priv->ict_tbl[0],0, sizeof(u32) * ICT_COUNT);
1578
1579         val = priv->aligned_ict_tbl_dma >> PAGE_SHIFT;
1580
1581         val |= CSR_DRAM_INT_TBL_ENABLE;
1582         val |= CSR_DRAM_INIT_TBL_WRAP_CHECK;
1583
1584         IWL_DEBUG_ISR(priv, "CSR_DRAM_INT_TBL_REG =0x%X "
1585                         "aligned dma address %Lx\n",
1586                         val, (unsigned long long)priv->aligned_ict_tbl_dma);
1587
1588         iwl_write32(priv, CSR_DRAM_INT_TBL_REG, val);
1589         priv->use_ict = true;
1590         priv->ict_index = 0;
1591         iwl_write32(priv, CSR_INT, priv->inta_mask);
1592         iwl_enable_interrupts(priv);
1593         spin_unlock_irqrestore(&priv->lock, flags);
1594
1595         return 0;
1596 }
1597 EXPORT_SYMBOL(iwl_reset_ict);
1598
1599 /* Device is going down disable ict interrupt usage */
1600 void iwl_disable_ict(struct iwl_priv *priv)
1601 {
1602         unsigned long flags;
1603
1604         spin_lock_irqsave(&priv->lock, flags);
1605         priv->use_ict = false;
1606         spin_unlock_irqrestore(&priv->lock, flags);
1607 }
1608 EXPORT_SYMBOL(iwl_disable_ict);
1609
1610 /* interrupt handler using ict table, with this interrupt driver will
1611  * stop using INTA register to get device's interrupt, reading this register
1612  * is expensive, device will write interrupts in ICT dram table, increment
1613  * index then will fire interrupt to driver, driver will OR all ICT table
1614  * entries from current index up to table entry with 0 value. the result is
1615  * the interrupt we need to service, driver will set the entries back to 0 and
1616  * set index.
1617  */
1618 irqreturn_t iwl_isr_ict(int irq, void *data)
1619 {
1620         struct iwl_priv *priv = data;
1621         u32 inta, inta_mask;
1622         u32 val = 0;
1623
1624         if (!priv)
1625                 return IRQ_NONE;
1626
1627         /* dram interrupt table not set yet,
1628          * use legacy interrupt.
1629          */
1630         if (!priv->use_ict)
1631                 return iwl_isr(irq, data);
1632
1633         spin_lock(&priv->lock);
1634
1635         /* Disable (but don't clear!) interrupts here to avoid
1636          * back-to-back ISRs and sporadic interrupts from our NIC.
1637          * If we have something to service, the tasklet will re-enable ints.
1638          * If we *don't* have something, we'll re-enable before leaving here.
1639          */
1640         inta_mask = iwl_read32(priv, CSR_INT_MASK);  /* just for debug */
1641         iwl_write32(priv, CSR_INT_MASK, 0x00000000);
1642
1643
1644         /* Ignore interrupt if there's nothing in NIC to service.
1645          * This may be due to IRQ shared with another device,
1646          * or due to sporadic interrupts thrown from our NIC. */
1647         if (!priv->ict_tbl[priv->ict_index]) {
1648                 IWL_DEBUG_ISR(priv, "Ignore interrupt, inta == 0\n");
1649                 goto none;
1650         }
1651
1652         /* read all entries that not 0 start with ict_index */
1653         while (priv->ict_tbl[priv->ict_index]) {
1654
1655                 val |= priv->ict_tbl[priv->ict_index];
1656                 IWL_DEBUG_ISR(priv, "ICT index %d value 0x%08X\n",
1657                                         priv->ict_index,
1658                                         priv->ict_tbl[priv->ict_index]);
1659                 priv->ict_tbl[priv->ict_index] = 0;
1660                 priv->ict_index = iwl_queue_inc_wrap(priv->ict_index,
1661                                                                 ICT_COUNT);
1662
1663         }
1664
1665         /* We should not get this value, just ignore it. */
1666         if (val == 0xffffffff)
1667                 val = 0;
1668
1669         inta = (0xff & val) | ((0xff00 & val) << 16);
1670         IWL_DEBUG_ISR(priv, "ISR inta 0x%08x, enabled 0x%08x ict 0x%08x\n",
1671                         inta, inta_mask, val);
1672
1673         inta &= priv->inta_mask;
1674         priv->inta |= inta;
1675
1676         /* iwl_irq_tasklet() will service interrupts and re-enable them */
1677         if (likely(inta))
1678                 tasklet_schedule(&priv->irq_tasklet);
1679         else if (test_bit(STATUS_INT_ENABLED, &priv->status) && !priv->inta) {
1680                 /* Allow interrupt if was disabled by this handler and
1681                  * no tasklet was schedules, We should not enable interrupt,
1682                  * tasklet will enable it.
1683                  */
1684                 iwl_enable_interrupts(priv);
1685         }
1686
1687         spin_unlock(&priv->lock);
1688         return IRQ_HANDLED;
1689
1690  none:
1691         /* re-enable interrupts here since we don't have anything to service.
1692          * only Re-enable if disabled by irq.
1693          */
1694         if (test_bit(STATUS_INT_ENABLED, &priv->status) && !priv->inta)
1695                 iwl_enable_interrupts(priv);
1696
1697         spin_unlock(&priv->lock);
1698         return IRQ_NONE;
1699 }
1700 EXPORT_SYMBOL(iwl_isr_ict);
1701
1702
1703 static irqreturn_t iwl_isr(int irq, void *data)
1704 {
1705         struct iwl_priv *priv = data;
1706         u32 inta, inta_mask;
1707         u32 inta_fh;
1708
1709         if (!priv)
1710                 return IRQ_NONE;
1711
1712         spin_lock(&priv->lock);
1713
1714         /* Disable (but don't clear!) interrupts here to avoid
1715          *    back-to-back ISRs and sporadic interrupts from our NIC.
1716          * If we have something to service, the tasklet will re-enable ints.
1717          * If we *don't* have something, we'll re-enable before leaving here. */
1718         inta_mask = iwl_read32(priv, CSR_INT_MASK);  /* just for debug */
1719         iwl_write32(priv, CSR_INT_MASK, 0x00000000);
1720
1721         /* Discover which interrupts are active/pending */
1722         inta = iwl_read32(priv, CSR_INT);
1723
1724         /* Ignore interrupt if there's nothing in NIC to service.
1725          * This may be due to IRQ shared with another device,
1726          * or due to sporadic interrupts thrown from our NIC. */
1727         if (!inta) {
1728                 IWL_DEBUG_ISR(priv, "Ignore interrupt, inta == 0\n");
1729                 goto none;
1730         }
1731
1732         if ((inta == 0xFFFFFFFF) || ((inta & 0xFFFFFFF0) == 0xa5a5a5a0)) {
1733                 /* Hardware disappeared. It might have already raised
1734                  * an interrupt */
1735                 IWL_WARN(priv, "HARDWARE GONE?? INTA == 0x%08x\n", inta);
1736                 goto unplugged;
1737         }
1738
1739 #ifdef CONFIG_IWLWIFI_DEBUG
1740         if (priv->debug_level & (IWL_DL_ISR)) {
1741                 inta_fh = iwl_read32(priv, CSR_FH_INT_STATUS);
1742                 IWL_DEBUG_ISR(priv, "ISR inta 0x%08x, enabled 0x%08x, "
1743                               "fh 0x%08x\n", inta, inta_mask, inta_fh);
1744         }
1745 #endif
1746
1747         priv->inta |= inta;
1748         /* iwl_irq_tasklet() will service interrupts and re-enable them */
1749         if (likely(inta))
1750                 tasklet_schedule(&priv->irq_tasklet);
1751         else if (test_bit(STATUS_INT_ENABLED, &priv->status) && !priv->inta)
1752                 iwl_enable_interrupts(priv);
1753
1754  unplugged:
1755         spin_unlock(&priv->lock);
1756         return IRQ_HANDLED;
1757
1758  none:
1759         /* re-enable interrupts here since we don't have anything to service. */
1760         /* only Re-enable if diabled by irq  and no schedules tasklet. */
1761         if (test_bit(STATUS_INT_ENABLED, &priv->status) && !priv->inta)
1762                 iwl_enable_interrupts(priv);
1763
1764         spin_unlock(&priv->lock);
1765         return IRQ_NONE;
1766 }
1767
1768 irqreturn_t iwl_isr_legacy(int irq, void *data)
1769 {
1770         struct iwl_priv *priv = data;
1771         u32 inta, inta_mask;
1772         u32 inta_fh;
1773         if (!priv)
1774                 return IRQ_NONE;
1775
1776         spin_lock(&priv->lock);
1777
1778         /* Disable (but don't clear!) interrupts here to avoid
1779          *    back-to-back ISRs and sporadic interrupts from our NIC.
1780          * If we have something to service, the tasklet will re-enable ints.
1781          * If we *don't* have something, we'll re-enable before leaving here. */
1782         inta_mask = iwl_read32(priv, CSR_INT_MASK);  /* just for debug */
1783         iwl_write32(priv, CSR_INT_MASK, 0x00000000);
1784
1785         /* Discover which interrupts are active/pending */
1786         inta = iwl_read32(priv, CSR_INT);
1787         inta_fh = iwl_read32(priv, CSR_FH_INT_STATUS);
1788
1789         /* Ignore interrupt if there's nothing in NIC to service.
1790          * This may be due to IRQ shared with another device,
1791          * or due to sporadic interrupts thrown from our NIC. */
1792         if (!inta && !inta_fh) {
1793                 IWL_DEBUG_ISR(priv, "Ignore interrupt, inta == 0, inta_fh == 0\n");
1794                 goto none;
1795         }
1796
1797         if ((inta == 0xFFFFFFFF) || ((inta & 0xFFFFFFF0) == 0xa5a5a5a0)) {
1798                 /* Hardware disappeared. It might have already raised
1799                  * an interrupt */
1800                 IWL_WARN(priv, "HARDWARE GONE?? INTA == 0x%08x\n", inta);
1801                 goto unplugged;
1802         }
1803
1804         IWL_DEBUG_ISR(priv, "ISR inta 0x%08x, enabled 0x%08x, fh 0x%08x\n",
1805                       inta, inta_mask, inta_fh);
1806
1807         inta &= ~CSR_INT_BIT_SCD;
1808
1809         /* iwl_irq_tasklet() will service interrupts and re-enable them */
1810         if (likely(inta || inta_fh))
1811                 tasklet_schedule(&priv->irq_tasklet);
1812
1813  unplugged:
1814         spin_unlock(&priv->lock);
1815         return IRQ_HANDLED;
1816
1817  none:
1818         /* re-enable interrupts here since we don't have anything to service. */
1819         /* only Re-enable if diabled by irq */
1820         if (test_bit(STATUS_INT_ENABLED, &priv->status))
1821                 iwl_enable_interrupts(priv);
1822         spin_unlock(&priv->lock);
1823         return IRQ_NONE;
1824 }
1825 EXPORT_SYMBOL(iwl_isr_legacy);
1826
1827 int iwl_send_bt_config(struct iwl_priv *priv)
1828 {
1829         struct iwl_bt_cmd bt_cmd = {
1830                 .flags = 3,
1831                 .lead_time = 0xAA,
1832                 .max_kill = 1,
1833                 .kill_ack_mask = 0,
1834                 .kill_cts_mask = 0,
1835         };
1836
1837         return iwl_send_cmd_pdu(priv, REPLY_BT_CONFIG,
1838                                 sizeof(struct iwl_bt_cmd), &bt_cmd);
1839 }
1840 EXPORT_SYMBOL(iwl_send_bt_config);
1841
1842 int iwl_send_statistics_request(struct iwl_priv *priv, u8 flags)
1843 {
1844         u32 stat_flags = 0;
1845         struct iwl_host_cmd cmd = {
1846                 .id = REPLY_STATISTICS_CMD,
1847                 .meta.flags = flags,
1848                 .len = sizeof(stat_flags),
1849                 .data = (u8 *) &stat_flags,
1850         };
1851         return iwl_send_cmd(priv, &cmd);
1852 }
1853 EXPORT_SYMBOL(iwl_send_statistics_request);
1854
1855 /**
1856  * iwl_verify_inst_sparse - verify runtime uCode image in card vs. host,
1857  *   using sample data 100 bytes apart.  If these sample points are good,
1858  *   it's a pretty good bet that everything between them is good, too.
1859  */
1860 static int iwlcore_verify_inst_sparse(struct iwl_priv *priv, __le32 *image, u32 len)
1861 {
1862         u32 val;
1863         int ret = 0;
1864         u32 errcnt = 0;
1865         u32 i;
1866
1867         IWL_DEBUG_INFO(priv, "ucode inst image size is %u\n", len);
1868
1869         for (i = 0; i < len; i += 100, image += 100/sizeof(u32)) {
1870                 /* read data comes through single port, auto-incr addr */
1871                 /* NOTE: Use the debugless read so we don't flood kernel log
1872                  * if IWL_DL_IO is set */
1873                 iwl_write_direct32(priv, HBUS_TARG_MEM_RADDR,
1874                         i + IWL49_RTC_INST_LOWER_BOUND);
1875                 val = _iwl_read_direct32(priv, HBUS_TARG_MEM_RDAT);
1876                 if (val != le32_to_cpu(*image)) {
1877                         ret = -EIO;
1878                         errcnt++;
1879                         if (errcnt >= 3)
1880                                 break;
1881                 }
1882         }
1883
1884         return ret;
1885 }
1886
1887 /**
1888  * iwlcore_verify_inst_full - verify runtime uCode image in card vs. host,
1889  *     looking at all data.
1890  */
1891 static int iwl_verify_inst_full(struct iwl_priv *priv, __le32 *image,
1892                                  u32 len)
1893 {
1894         u32 val;
1895         u32 save_len = len;
1896         int ret = 0;
1897         u32 errcnt;
1898
1899         IWL_DEBUG_INFO(priv, "ucode inst image size is %u\n", len);
1900
1901         iwl_write_direct32(priv, HBUS_TARG_MEM_RADDR,
1902                            IWL49_RTC_INST_LOWER_BOUND);
1903
1904         errcnt = 0;
1905         for (; len > 0; len -= sizeof(u32), image++) {
1906                 /* read data comes through single port, auto-incr addr */
1907                 /* NOTE: Use the debugless read so we don't flood kernel log
1908                  * if IWL_DL_IO is set */
1909                 val = _iwl_read_direct32(priv, HBUS_TARG_MEM_RDAT);
1910                 if (val != le32_to_cpu(*image)) {
1911                         IWL_ERR(priv, "uCode INST section is invalid at "
1912                                   "offset 0x%x, is 0x%x, s/b 0x%x\n",
1913                                   save_len - len, val, le32_to_cpu(*image));
1914                         ret = -EIO;
1915                         errcnt++;
1916                         if (errcnt >= 20)
1917                                 break;
1918                 }
1919         }
1920
1921         if (!errcnt)
1922                 IWL_DEBUG_INFO(priv,
1923                     "ucode image in INSTRUCTION memory is good\n");
1924
1925         return ret;
1926 }
1927
1928 /**
1929  * iwl_verify_ucode - determine which instruction image is in SRAM,
1930  *    and verify its contents
1931  */
1932 int iwl_verify_ucode(struct iwl_priv *priv)
1933 {
1934         __le32 *image;
1935         u32 len;
1936         int ret;
1937
1938         /* Try bootstrap */
1939         image = (__le32 *)priv->ucode_boot.v_addr;
1940         len = priv->ucode_boot.len;
1941         ret = iwlcore_verify_inst_sparse(priv, image, len);
1942         if (!ret) {
1943                 IWL_DEBUG_INFO(priv, "Bootstrap uCode is good in inst SRAM\n");
1944                 return 0;
1945         }
1946
1947         /* Try initialize */
1948         image = (__le32 *)priv->ucode_init.v_addr;
1949         len = priv->ucode_init.len;
1950         ret = iwlcore_verify_inst_sparse(priv, image, len);
1951         if (!ret) {
1952                 IWL_DEBUG_INFO(priv, "Initialize uCode is good in inst SRAM\n");
1953                 return 0;
1954         }
1955
1956         /* Try runtime/protocol */
1957         image = (__le32 *)priv->ucode_code.v_addr;
1958         len = priv->ucode_code.len;
1959         ret = iwlcore_verify_inst_sparse(priv, image, len);
1960         if (!ret) {
1961                 IWL_DEBUG_INFO(priv, "Runtime uCode is good in inst SRAM\n");
1962                 return 0;
1963         }
1964
1965         IWL_ERR(priv, "NO VALID UCODE IMAGE IN INSTRUCTION SRAM!!\n");
1966
1967         /* Since nothing seems to match, show first several data entries in
1968          * instruction SRAM, so maybe visual inspection will give a clue.
1969          * Selection of bootstrap image (vs. other images) is arbitrary. */
1970         image = (__le32 *)priv->ucode_boot.v_addr;
1971         len = priv->ucode_boot.len;
1972         ret = iwl_verify_inst_full(priv, image, len);
1973
1974         return ret;
1975 }
1976 EXPORT_SYMBOL(iwl_verify_ucode);
1977
1978
1979 static const char *desc_lookup_text[] = {
1980         "OK",
1981         "FAIL",
1982         "BAD_PARAM",
1983         "BAD_CHECKSUM",
1984         "NMI_INTERRUPT_WDG",
1985         "SYSASSERT",
1986         "FATAL_ERROR",
1987         "BAD_COMMAND",
1988         "HW_ERROR_TUNE_LOCK",
1989         "HW_ERROR_TEMPERATURE",
1990         "ILLEGAL_CHAN_FREQ",
1991         "VCC_NOT_STABLE",
1992         "FH_ERROR",
1993         "NMI_INTERRUPT_HOST",
1994         "NMI_INTERRUPT_ACTION_PT",
1995         "NMI_INTERRUPT_UNKNOWN",
1996         "UCODE_VERSION_MISMATCH",
1997         "HW_ERROR_ABS_LOCK",
1998         "HW_ERROR_CAL_LOCK_FAIL",
1999         "NMI_INTERRUPT_INST_ACTION_PT",
2000         "NMI_INTERRUPT_DATA_ACTION_PT",
2001         "NMI_TRM_HW_ER",
2002         "NMI_INTERRUPT_TRM",
2003         "NMI_INTERRUPT_BREAK_POINT"
2004         "DEBUG_0",
2005         "DEBUG_1",
2006         "DEBUG_2",
2007         "DEBUG_3",
2008         "UNKNOWN"
2009 };
2010
2011 static const char *desc_lookup(int i)
2012 {
2013         int max = ARRAY_SIZE(desc_lookup_text) - 1;
2014
2015         if (i < 0 || i > max)
2016                 i = max;
2017
2018         return desc_lookup_text[i];
2019 }
2020
2021 #define ERROR_START_OFFSET  (1 * sizeof(u32))
2022 #define ERROR_ELEM_SIZE     (7 * sizeof(u32))
2023
2024 void iwl_dump_nic_error_log(struct iwl_priv *priv)
2025 {
2026         u32 data2, line;
2027         u32 desc, time, count, base, data1;
2028         u32 blink1, blink2, ilink1, ilink2;
2029
2030         if (priv->ucode_type == UCODE_INIT)
2031                 base = le32_to_cpu(priv->card_alive_init.error_event_table_ptr);
2032         else
2033                 base = le32_to_cpu(priv->card_alive.error_event_table_ptr);
2034
2035         if (!priv->cfg->ops->lib->is_valid_rtc_data_addr(base)) {
2036                 IWL_ERR(priv, "Not valid error log pointer 0x%08X\n", base);
2037                 return;
2038         }
2039
2040         count = iwl_read_targ_mem(priv, base);
2041
2042         if (ERROR_START_OFFSET <= count * ERROR_ELEM_SIZE) {
2043                 IWL_ERR(priv, "Start IWL Error Log Dump:\n");
2044                 IWL_ERR(priv, "Status: 0x%08lX, count: %d\n",
2045                         priv->status, count);
2046         }
2047
2048         desc = iwl_read_targ_mem(priv, base + 1 * sizeof(u32));
2049         blink1 = iwl_read_targ_mem(priv, base + 3 * sizeof(u32));
2050         blink2 = iwl_read_targ_mem(priv, base + 4 * sizeof(u32));
2051         ilink1 = iwl_read_targ_mem(priv, base + 5 * sizeof(u32));
2052         ilink2 = iwl_read_targ_mem(priv, base + 6 * sizeof(u32));
2053         data1 = iwl_read_targ_mem(priv, base + 7 * sizeof(u32));
2054         data2 = iwl_read_targ_mem(priv, base + 8 * sizeof(u32));
2055         line = iwl_read_targ_mem(priv, base + 9 * sizeof(u32));
2056         time = iwl_read_targ_mem(priv, base + 11 * sizeof(u32));
2057
2058         IWL_ERR(priv, "Desc                               Time       "
2059                 "data1      data2      line\n");
2060         IWL_ERR(priv, "%-28s (#%02d) %010u 0x%08X 0x%08X %u\n",
2061                 desc_lookup(desc), desc, time, data1, data2, line);
2062         IWL_ERR(priv, "blink1  blink2  ilink1  ilink2\n");
2063         IWL_ERR(priv, "0x%05X 0x%05X 0x%05X 0x%05X\n", blink1, blink2,
2064                 ilink1, ilink2);
2065
2066 }
2067 EXPORT_SYMBOL(iwl_dump_nic_error_log);
2068
2069 #define EVENT_START_OFFSET  (4 * sizeof(u32))
2070
2071 /**
2072  * iwl_print_event_log - Dump error event log to syslog
2073  *
2074  */
2075 static void iwl_print_event_log(struct iwl_priv *priv, u32 start_idx,
2076                                 u32 num_events, u32 mode)
2077 {
2078         u32 i;
2079         u32 base;       /* SRAM byte address of event log header */
2080         u32 event_size; /* 2 u32s, or 3 u32s if timestamp recorded */
2081         u32 ptr;        /* SRAM byte address of log data */
2082         u32 ev, time, data; /* event log data */
2083
2084         if (num_events == 0)
2085                 return;
2086         if (priv->ucode_type == UCODE_INIT)
2087                 base = le32_to_cpu(priv->card_alive_init.log_event_table_ptr);
2088         else
2089                 base = le32_to_cpu(priv->card_alive.log_event_table_ptr);
2090
2091         if (mode == 0)
2092                 event_size = 2 * sizeof(u32);
2093         else
2094                 event_size = 3 * sizeof(u32);
2095
2096         ptr = base + EVENT_START_OFFSET + (start_idx * event_size);
2097
2098         /* "time" is actually "data" for mode 0 (no timestamp).
2099         * place event id # at far right for easier visual parsing. */
2100         for (i = 0; i < num_events; i++) {
2101                 ev = iwl_read_targ_mem(priv, ptr);
2102                 ptr += sizeof(u32);
2103                 time = iwl_read_targ_mem(priv, ptr);
2104                 ptr += sizeof(u32);
2105                 if (mode == 0) {
2106                         /* data, ev */
2107                         IWL_ERR(priv, "EVT_LOG:0x%08x:%04u\n", time, ev);
2108                 } else {
2109                         data = iwl_read_targ_mem(priv, ptr);
2110                         ptr += sizeof(u32);
2111                         IWL_ERR(priv, "EVT_LOGT:%010u:0x%08x:%04u\n",
2112                                         time, data, ev);
2113                 }
2114         }
2115 }
2116
2117 void iwl_dump_nic_event_log(struct iwl_priv *priv)
2118 {
2119         u32 base;       /* SRAM byte address of event log header */
2120         u32 capacity;   /* event log capacity in # entries */
2121         u32 mode;       /* 0 - no timestamp, 1 - timestamp recorded */
2122         u32 num_wraps;  /* # times uCode wrapped to top of log */
2123         u32 next_entry; /* index of next entry to be written by uCode */
2124         u32 size;       /* # entries that we'll print */
2125
2126         if (priv->ucode_type == UCODE_INIT)
2127                 base = le32_to_cpu(priv->card_alive_init.log_event_table_ptr);
2128         else
2129                 base = le32_to_cpu(priv->card_alive.log_event_table_ptr);
2130
2131         if (!priv->cfg->ops->lib->is_valid_rtc_data_addr(base)) {
2132                 IWL_ERR(priv, "Invalid event log pointer 0x%08X\n", base);
2133                 return;
2134         }
2135
2136         /* event log header */
2137         capacity = iwl_read_targ_mem(priv, base);
2138         mode = iwl_read_targ_mem(priv, base + (1 * sizeof(u32)));
2139         num_wraps = iwl_read_targ_mem(priv, base + (2 * sizeof(u32)));
2140         next_entry = iwl_read_targ_mem(priv, base + (3 * sizeof(u32)));
2141
2142         size = num_wraps ? capacity : next_entry;
2143
2144         /* bail out if nothing in log */
2145         if (size == 0) {
2146                 IWL_ERR(priv, "Start IWL Event Log Dump: nothing in log\n");
2147                 return;
2148         }
2149
2150         IWL_ERR(priv, "Start IWL Event Log Dump: display count %d, wraps %d\n",
2151                         size, num_wraps);
2152
2153         /* if uCode has wrapped back to top of log, start at the oldest entry,
2154          * i.e the next one that uCode would fill. */
2155         if (num_wraps)
2156                 iwl_print_event_log(priv, next_entry,
2157                                         capacity - next_entry, mode);
2158         /* (then/else) start at top of log */
2159         iwl_print_event_log(priv, 0, next_entry, mode);
2160
2161 }
2162 EXPORT_SYMBOL(iwl_dump_nic_event_log);
2163
2164 void iwl_rf_kill_ct_config(struct iwl_priv *priv)
2165 {
2166         struct iwl_ct_kill_config cmd;
2167         unsigned long flags;
2168         int ret = 0;
2169
2170         spin_lock_irqsave(&priv->lock, flags);
2171         iwl_write32(priv, CSR_UCODE_DRV_GP1_CLR,
2172                     CSR_UCODE_DRV_GP1_REG_BIT_CT_KILL_EXIT);
2173         spin_unlock_irqrestore(&priv->lock, flags);
2174
2175         cmd.critical_temperature_R =
2176                 cpu_to_le32(priv->hw_params.ct_kill_threshold);
2177
2178         ret = iwl_send_cmd_pdu(priv, REPLY_CT_KILL_CONFIG_CMD,
2179                                sizeof(cmd), &cmd);
2180         if (ret)
2181                 IWL_ERR(priv, "REPLY_CT_KILL_CONFIG_CMD failed\n");
2182         else
2183                 IWL_DEBUG_INFO(priv, "REPLY_CT_KILL_CONFIG_CMD succeeded, "
2184                         "critical temperature is %d\n",
2185                         cmd.critical_temperature_R);
2186 }
2187 EXPORT_SYMBOL(iwl_rf_kill_ct_config);
2188
2189
2190 /*
2191  * CARD_STATE_CMD
2192  *
2193  * Use: Sets the device's internal card state to enable, disable, or halt
2194  *
2195  * When in the 'enable' state the card operates as normal.
2196  * When in the 'disable' state, the card enters into a low power mode.
2197  * When in the 'halt' state, the card is shut down and must be fully
2198  * restarted to come back on.
2199  */
2200 int iwl_send_card_state(struct iwl_priv *priv, u32 flags, u8 meta_flag)
2201 {
2202         struct iwl_host_cmd cmd = {
2203                 .id = REPLY_CARD_STATE_CMD,
2204                 .len = sizeof(u32),
2205                 .data = &flags,
2206                 .meta.flags = meta_flag,
2207         };
2208
2209         return iwl_send_cmd(priv, &cmd);
2210 }
2211 EXPORT_SYMBOL(iwl_send_card_state);
2212
2213 void iwl_radio_kill_sw_disable_radio(struct iwl_priv *priv)
2214 {
2215         unsigned long flags;
2216
2217         if (test_bit(STATUS_RF_KILL_SW, &priv->status))
2218                 return;
2219
2220         IWL_DEBUG_RF_KILL(priv, "Manual SW RF KILL set to: RADIO OFF\n");
2221
2222         iwl_scan_cancel(priv);
2223         /* FIXME: This is a workaround for AP */
2224         if (priv->iw_mode != NL80211_IFTYPE_AP) {
2225                 spin_lock_irqsave(&priv->lock, flags);
2226                 iwl_write32(priv, CSR_UCODE_DRV_GP1_SET,
2227                             CSR_UCODE_SW_BIT_RFKILL);
2228                 spin_unlock_irqrestore(&priv->lock, flags);
2229                 /* call the host command only if no hw rf-kill set */
2230                 if (!test_bit(STATUS_RF_KILL_HW, &priv->status) &&
2231                     iwl_is_ready(priv))
2232                         iwl_send_card_state(priv,
2233                                 CARD_STATE_CMD_DISABLE, 0);
2234                 set_bit(STATUS_RF_KILL_SW, &priv->status);
2235                         /* make sure mac80211 stop sending Tx frame */
2236                 if (priv->mac80211_registered)
2237                         ieee80211_stop_queues(priv->hw);
2238         }
2239 }
2240 EXPORT_SYMBOL(iwl_radio_kill_sw_disable_radio);
2241
2242 int iwl_radio_kill_sw_enable_radio(struct iwl_priv *priv)
2243 {
2244         unsigned long flags;
2245
2246         if (!test_bit(STATUS_RF_KILL_SW, &priv->status))
2247                 return 0;
2248
2249         IWL_DEBUG_RF_KILL(priv, "Manual SW RF KILL set to: RADIO ON\n");
2250
2251         spin_lock_irqsave(&priv->lock, flags);
2252         iwl_write32(priv, CSR_UCODE_DRV_GP1_CLR, CSR_UCODE_SW_BIT_RFKILL);
2253
2254         /* If the driver is up it will receive CARD_STATE_NOTIFICATION
2255          * notification where it will clear SW rfkill status.
2256          * Setting it here would break the handler. Only if the
2257          * interface is down we can set here since we don't
2258          * receive any further notification.
2259          */
2260         if (!priv->is_open)
2261                 clear_bit(STATUS_RF_KILL_SW, &priv->status);
2262         spin_unlock_irqrestore(&priv->lock, flags);
2263
2264         /* wake up ucode */
2265         msleep(10);
2266
2267         iwl_read32(priv, CSR_UCODE_DRV_GP1);
2268         spin_lock_irqsave(&priv->reg_lock, flags);
2269         if (!iwl_grab_nic_access(priv))
2270                 iwl_release_nic_access(priv);
2271         spin_unlock_irqrestore(&priv->reg_lock, flags);
2272
2273         if (test_bit(STATUS_RF_KILL_HW, &priv->status)) {
2274                 IWL_DEBUG_RF_KILL(priv, "Can not turn radio back on - "
2275                                   "disabled by HW switch\n");
2276                 return 0;
2277         }
2278
2279         /* when driver is up while rfkill is on, it wont receive
2280          * any CARD_STATE_NOTIFICATION notifications so we have to
2281          * restart it in here
2282          */
2283         if (priv->is_open && !test_bit(STATUS_ALIVE, &priv->status)) {
2284                 clear_bit(STATUS_RF_KILL_SW, &priv->status);
2285                 if (!iwl_is_rfkill(priv))
2286                         queue_work(priv->workqueue, &priv->up);
2287         }
2288
2289         /* If the driver is already loaded, it will receive
2290          * CARD_STATE_NOTIFICATION notifications and the handler will
2291          * call restart to reload the driver.
2292          */
2293         return 1;
2294 }
2295 EXPORT_SYMBOL(iwl_radio_kill_sw_enable_radio);
2296
2297 void iwl_bg_rf_kill(struct work_struct *work)
2298 {
2299         struct iwl_priv *priv = container_of(work, struct iwl_priv, rf_kill);
2300
2301         wake_up_interruptible(&priv->wait_command_queue);
2302
2303         if (test_bit(STATUS_EXIT_PENDING, &priv->status))
2304                 return;
2305
2306         mutex_lock(&priv->mutex);
2307
2308         if (!iwl_is_rfkill(priv)) {
2309                 IWL_DEBUG_RF_KILL(priv,
2310                           "HW and/or SW RF Kill no longer active, restarting "
2311                           "device\n");
2312                 if (!test_bit(STATUS_EXIT_PENDING, &priv->status) &&
2313                     priv->is_open)
2314                         queue_work(priv->workqueue, &priv->restart);
2315         } else {
2316                 /* make sure mac80211 stop sending Tx frame */
2317                 if (priv->mac80211_registered)
2318                         ieee80211_stop_queues(priv->hw);
2319
2320                 if (!test_bit(STATUS_RF_KILL_HW, &priv->status))
2321                         IWL_DEBUG_RF_KILL(priv, "Can not turn radio back on - "
2322                                           "disabled by SW switch\n");
2323                 else
2324                         IWL_WARN(priv, "Radio Frequency Kill Switch is On:\n"
2325                                     "Kill switch must be turned off for "
2326                                     "wireless networking to work.\n");
2327         }
2328         mutex_unlock(&priv->mutex);
2329         iwl_rfkill_set_hw_state(priv);
2330 }
2331 EXPORT_SYMBOL(iwl_bg_rf_kill);
2332
2333 void iwl_rx_pm_sleep_notif(struct iwl_priv *priv,
2334                            struct iwl_rx_mem_buffer *rxb)
2335 {
2336 #ifdef CONFIG_IWLWIFI_DEBUG
2337         struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data;
2338         struct iwl_sleep_notification *sleep = &(pkt->u.sleep_notif);
2339         IWL_DEBUG_RX(priv, "sleep mode: %d, src: %d\n",
2340                      sleep->pm_sleep_mode, sleep->pm_wakeup_src);
2341 #endif
2342 }
2343 EXPORT_SYMBOL(iwl_rx_pm_sleep_notif);
2344
2345 void iwl_rx_pm_debug_statistics_notif(struct iwl_priv *priv,
2346                                       struct iwl_rx_mem_buffer *rxb)
2347 {
2348         struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data;
2349         IWL_DEBUG_RADIO(priv, "Dumping %d bytes of unhandled "
2350                         "notification for %s:\n",
2351                         le32_to_cpu(pkt->len), get_cmd_string(pkt->hdr.cmd));
2352         iwl_print_hex_dump(priv, IWL_DL_RADIO, pkt->u.raw, le32_to_cpu(pkt->len));
2353 }
2354 EXPORT_SYMBOL(iwl_rx_pm_debug_statistics_notif);
2355
2356 void iwl_rx_reply_error(struct iwl_priv *priv,
2357                         struct iwl_rx_mem_buffer *rxb)
2358 {
2359         struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data;
2360
2361         IWL_ERR(priv, "Error Reply type 0x%08X cmd %s (0x%02X) "
2362                 "seq 0x%04X ser 0x%08X\n",
2363                 le32_to_cpu(pkt->u.err_resp.error_type),
2364                 get_cmd_string(pkt->u.err_resp.cmd_id),
2365                 pkt->u.err_resp.cmd_id,
2366                 le16_to_cpu(pkt->u.err_resp.bad_cmd_seq_num),
2367                 le32_to_cpu(pkt->u.err_resp.error_info));
2368 }
2369 EXPORT_SYMBOL(iwl_rx_reply_error);
2370
2371 void iwl_clear_isr_stats(struct iwl_priv *priv)
2372 {
2373         memset(&priv->isr_stats, 0, sizeof(priv->isr_stats));
2374 }
2375 EXPORT_SYMBOL(iwl_clear_isr_stats);
2376
2377 int iwl_mac_conf_tx(struct ieee80211_hw *hw, u16 queue,
2378                            const struct ieee80211_tx_queue_params *params)
2379 {
2380         struct iwl_priv *priv = hw->priv;
2381         unsigned long flags;
2382         int q;
2383
2384         IWL_DEBUG_MAC80211(priv, "enter\n");
2385
2386         if (!iwl_is_ready_rf(priv)) {
2387                 IWL_DEBUG_MAC80211(priv, "leave - RF not ready\n");
2388                 return -EIO;
2389         }
2390
2391         if (queue >= AC_NUM) {
2392                 IWL_DEBUG_MAC80211(priv, "leave - queue >= AC_NUM %d\n", queue);
2393                 return 0;
2394         }
2395
2396         q = AC_NUM - 1 - queue;
2397
2398         spin_lock_irqsave(&priv->lock, flags);
2399
2400         priv->qos_data.def_qos_parm.ac[q].cw_min = cpu_to_le16(params->cw_min);
2401         priv->qos_data.def_qos_parm.ac[q].cw_max = cpu_to_le16(params->cw_max);
2402         priv->qos_data.def_qos_parm.ac[q].aifsn = params->aifs;
2403         priv->qos_data.def_qos_parm.ac[q].edca_txop =
2404                         cpu_to_le16((params->txop * 32));
2405
2406         priv->qos_data.def_qos_parm.ac[q].reserved1 = 0;
2407         priv->qos_data.qos_active = 1;
2408
2409         if (priv->iw_mode == NL80211_IFTYPE_AP)
2410                 iwl_activate_qos(priv, 1);
2411         else if (priv->assoc_id && iwl_is_associated(priv))
2412                 iwl_activate_qos(priv, 0);
2413
2414         spin_unlock_irqrestore(&priv->lock, flags);
2415
2416         IWL_DEBUG_MAC80211(priv, "leave\n");
2417         return 0;
2418 }
2419 EXPORT_SYMBOL(iwl_mac_conf_tx);
2420
2421 static void iwl_ht_conf(struct iwl_priv *priv,
2422                             struct ieee80211_bss_conf *bss_conf)
2423 {
2424         struct ieee80211_sta_ht_cap *ht_conf;
2425         struct iwl_ht_info *iwl_conf = &priv->current_ht_config;
2426         struct ieee80211_sta *sta;
2427
2428         IWL_DEBUG_MAC80211(priv, "enter: \n");
2429
2430         if (!iwl_conf->is_ht)
2431                 return;
2432
2433
2434         /*
2435          * It is totally wrong to base global information on something
2436          * that is valid only when associated, alas, this driver works
2437          * that way and I don't know how to fix it.
2438          */
2439
2440         rcu_read_lock();
2441         sta = ieee80211_find_sta(priv->hw, priv->bssid);
2442         if (!sta) {
2443                 rcu_read_unlock();
2444                 return;
2445         }
2446         ht_conf = &sta->ht_cap;
2447
2448         if (ht_conf->cap & IEEE80211_HT_CAP_SGI_20)
2449                 iwl_conf->sgf |= HT_SHORT_GI_20MHZ;
2450         if (ht_conf->cap & IEEE80211_HT_CAP_SGI_40)
2451                 iwl_conf->sgf |= HT_SHORT_GI_40MHZ;
2452
2453         iwl_conf->is_green_field = !!(ht_conf->cap & IEEE80211_HT_CAP_GRN_FLD);
2454         iwl_conf->max_amsdu_size =
2455                 !!(ht_conf->cap & IEEE80211_HT_CAP_MAX_AMSDU);
2456
2457         iwl_conf->supported_chan_width =
2458                 !!(ht_conf->cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40);
2459
2460         /*
2461          * XXX: The HT configuration needs to be moved into iwl_mac_config()
2462          *      to be done there correctly.
2463          */
2464
2465         iwl_conf->extension_chan_offset = IEEE80211_HT_PARAM_CHA_SEC_NONE;
2466         if (conf_is_ht40_minus(&priv->hw->conf))
2467                 iwl_conf->extension_chan_offset = IEEE80211_HT_PARAM_CHA_SEC_BELOW;
2468         else if (conf_is_ht40_plus(&priv->hw->conf))
2469                 iwl_conf->extension_chan_offset = IEEE80211_HT_PARAM_CHA_SEC_ABOVE;
2470
2471         /* If no above or below channel supplied disable FAT channel */
2472         if (iwl_conf->extension_chan_offset != IEEE80211_HT_PARAM_CHA_SEC_ABOVE &&
2473             iwl_conf->extension_chan_offset != IEEE80211_HT_PARAM_CHA_SEC_BELOW)
2474                 iwl_conf->supported_chan_width = 0;
2475
2476         iwl_conf->sm_ps = (u8)((ht_conf->cap & IEEE80211_HT_CAP_SM_PS) >> 2);
2477
2478         memcpy(&iwl_conf->mcs, &ht_conf->mcs, 16);
2479
2480         iwl_conf->tx_chan_width = iwl_conf->supported_chan_width != 0;
2481         iwl_conf->ht_protection =
2482                 bss_conf->ht_operation_mode & IEEE80211_HT_OP_MODE_PROTECTION;
2483         iwl_conf->non_GF_STA_present =
2484                 !!(bss_conf->ht_operation_mode & IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT);
2485
2486         rcu_read_unlock();
2487
2488         IWL_DEBUG_MAC80211(priv, "leave\n");
2489 }
2490
2491 #define IWL_DELAY_NEXT_SCAN_AFTER_ASSOC (HZ*6)
2492 void iwl_bss_info_changed(struct ieee80211_hw *hw,
2493                           struct ieee80211_vif *vif,
2494                           struct ieee80211_bss_conf *bss_conf,
2495                           u32 changes)
2496 {
2497         struct iwl_priv *priv = hw->priv;
2498         int ret;
2499
2500         IWL_DEBUG_MAC80211(priv, "changes = 0x%X\n", changes);
2501
2502         if (!iwl_is_alive(priv))
2503                 return;
2504
2505         mutex_lock(&priv->mutex);
2506
2507         if (changes & BSS_CHANGED_BEACON &&
2508             priv->iw_mode == NL80211_IFTYPE_AP) {
2509                 dev_kfree_skb(priv->ibss_beacon);
2510                 priv->ibss_beacon = ieee80211_beacon_get(hw, vif);
2511         }
2512
2513         if ((changes & BSS_CHANGED_BSSID) && !iwl_is_rfkill(priv)) {
2514                 /* If there is currently a HW scan going on in the background
2515                  * then we need to cancel it else the RXON below will fail. */
2516                 if (iwl_scan_cancel_timeout(priv, 100)) {
2517                         IWL_WARN(priv, "Aborted scan still in progress "
2518                                     "after 100ms\n");
2519                         IWL_DEBUG_MAC80211(priv, "leaving - scan abort failed.\n");
2520                         mutex_unlock(&priv->mutex);
2521                         return;
2522                 }
2523                 memcpy(priv->staging_rxon.bssid_addr,
2524                        bss_conf->bssid, ETH_ALEN);
2525
2526                 /* TODO: Audit driver for usage of these members and see
2527                  * if mac80211 deprecates them (priv->bssid looks like it
2528                  * shouldn't be there, but I haven't scanned the IBSS code
2529                  * to verify) - jpk */
2530                 memcpy(priv->bssid, bss_conf->bssid, ETH_ALEN);
2531
2532                 if (priv->iw_mode == NL80211_IFTYPE_AP)
2533                         iwlcore_config_ap(priv);
2534                 else {
2535                         int rc = iwlcore_commit_rxon(priv);
2536                         if ((priv->iw_mode == NL80211_IFTYPE_STATION) && rc)
2537                                 iwl_rxon_add_station(
2538                                         priv, priv->active_rxon.bssid_addr, 1);
2539                 }
2540         } else if (!iwl_is_rfkill(priv)) {
2541                 iwl_scan_cancel_timeout(priv, 100);
2542                 priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
2543                 iwlcore_commit_rxon(priv);
2544         }
2545
2546         if (priv->iw_mode == NL80211_IFTYPE_ADHOC &&
2547             changes & BSS_CHANGED_BEACON) {
2548                 struct sk_buff *beacon = ieee80211_beacon_get(hw, vif);
2549
2550                 if (beacon)
2551                         iwl_mac_beacon_update(hw, beacon);
2552         }
2553
2554         mutex_unlock(&priv->mutex);
2555
2556         if (changes & BSS_CHANGED_ERP_PREAMBLE) {
2557                 IWL_DEBUG_MAC80211(priv, "ERP_PREAMBLE %d\n",
2558                                    bss_conf->use_short_preamble);
2559                 if (bss_conf->use_short_preamble)
2560                         priv->staging_rxon.flags |= RXON_FLG_SHORT_PREAMBLE_MSK;
2561                 else
2562                         priv->staging_rxon.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK;
2563         }
2564
2565         if (changes & BSS_CHANGED_ERP_CTS_PROT) {
2566                 IWL_DEBUG_MAC80211(priv, "ERP_CTS %d\n", bss_conf->use_cts_prot);
2567                 if (bss_conf->use_cts_prot && (priv->band != IEEE80211_BAND_5GHZ))
2568                         priv->staging_rxon.flags |= RXON_FLG_TGG_PROTECT_MSK;
2569                 else
2570                         priv->staging_rxon.flags &= ~RXON_FLG_TGG_PROTECT_MSK;
2571         }
2572
2573         if (changes & BSS_CHANGED_HT) {
2574                 iwl_ht_conf(priv, bss_conf);
2575
2576                 if (priv->cfg->ops->hcmd->set_rxon_chain)
2577                         priv->cfg->ops->hcmd->set_rxon_chain(priv);
2578         }
2579
2580         if (changes & BSS_CHANGED_ASSOC) {
2581                 IWL_DEBUG_MAC80211(priv, "ASSOC %d\n", bss_conf->assoc);
2582                 /* This should never happen as this function should
2583                  * never be called from interrupt context. */
2584                 if (WARN_ON_ONCE(in_interrupt()))
2585                         return;
2586                 if (bss_conf->assoc) {
2587                         priv->assoc_id = bss_conf->aid;
2588                         priv->beacon_int = bss_conf->beacon_int;
2589                         priv->power_data.dtim_period = bss_conf->dtim_period;
2590                         priv->timestamp = bss_conf->timestamp;
2591                         priv->assoc_capability = bss_conf->assoc_capability;
2592
2593                         /* we have just associated, don't start scan too early
2594                          * leave time for EAPOL exchange to complete
2595                          */
2596                         priv->next_scan_jiffies = jiffies +
2597                                         IWL_DELAY_NEXT_SCAN_AFTER_ASSOC;
2598                         mutex_lock(&priv->mutex);
2599                         priv->cfg->ops->lib->post_associate(priv);
2600                         mutex_unlock(&priv->mutex);
2601                 } else {
2602                         priv->assoc_id = 0;
2603                         IWL_DEBUG_MAC80211(priv, "DISASSOC %d\n", bss_conf->assoc);
2604                 }
2605         } else if (changes && iwl_is_associated(priv) && priv->assoc_id) {
2606                         IWL_DEBUG_MAC80211(priv, "Associated Changes %d\n", changes);
2607                         ret = iwl_send_rxon_assoc(priv);
2608                         if (!ret)
2609                                 /* Sync active_rxon with latest change. */
2610                                 memcpy((void *)&priv->active_rxon,
2611                                         &priv->staging_rxon,
2612                                         sizeof(struct iwl_rxon_cmd));
2613         }
2614         IWL_DEBUG_MAC80211(priv, "leave\n");
2615 }
2616 EXPORT_SYMBOL(iwl_bss_info_changed);
2617
2618 int iwl_mac_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb)
2619 {
2620         struct iwl_priv *priv = hw->priv;
2621         unsigned long flags;
2622         __le64 timestamp;
2623
2624         IWL_DEBUG_MAC80211(priv, "enter\n");
2625
2626         if (!iwl_is_ready_rf(priv)) {
2627                 IWL_DEBUG_MAC80211(priv, "leave - RF not ready\n");
2628                 return -EIO;
2629         }
2630
2631         if (priv->iw_mode != NL80211_IFTYPE_ADHOC) {
2632                 IWL_DEBUG_MAC80211(priv, "leave - not IBSS\n");
2633                 return -EIO;
2634         }
2635
2636         spin_lock_irqsave(&priv->lock, flags);
2637
2638         if (priv->ibss_beacon)
2639                 dev_kfree_skb(priv->ibss_beacon);
2640
2641         priv->ibss_beacon = skb;
2642
2643         priv->assoc_id = 0;
2644         timestamp = ((struct ieee80211_mgmt *)skb->data)->u.beacon.timestamp;
2645         priv->timestamp = le64_to_cpu(timestamp);
2646
2647         IWL_DEBUG_MAC80211(priv, "leave\n");
2648         spin_unlock_irqrestore(&priv->lock, flags);
2649
2650         iwl_reset_qos(priv);
2651
2652         priv->cfg->ops->lib->post_associate(priv);
2653
2654
2655         return 0;
2656 }
2657 EXPORT_SYMBOL(iwl_mac_beacon_update);
2658
2659 int iwl_set_mode(struct iwl_priv *priv, int mode)
2660 {
2661         if (mode == NL80211_IFTYPE_ADHOC) {
2662                 const struct iwl_channel_info *ch_info;
2663
2664                 ch_info = iwl_get_channel_info(priv,
2665                         priv->band,
2666                         le16_to_cpu(priv->staging_rxon.channel));
2667
2668                 if (!ch_info || !is_channel_ibss(ch_info)) {
2669                         IWL_ERR(priv, "channel %d not IBSS channel\n",
2670                                   le16_to_cpu(priv->staging_rxon.channel));
2671                         return -EINVAL;
2672                 }
2673         }
2674
2675         iwl_connection_init_rx_config(priv, mode);
2676
2677         if (priv->cfg->ops->hcmd->set_rxon_chain)
2678                 priv->cfg->ops->hcmd->set_rxon_chain(priv);
2679
2680         memcpy(priv->staging_rxon.node_addr, priv->mac_addr, ETH_ALEN);
2681
2682         priv->cfg->ops->smgmt->clear_station_table(priv);
2683
2684         /* dont commit rxon if rf-kill is on*/
2685         if (!iwl_is_ready_rf(priv))
2686                 return -EAGAIN;
2687
2688         cancel_delayed_work(&priv->scan_check);
2689         if (iwl_scan_cancel_timeout(priv, 100)) {
2690                 IWL_WARN(priv, "Aborted scan still in progress after 100ms\n");
2691                 IWL_DEBUG_MAC80211(priv, "leaving - scan abort failed.\n");
2692                 return -EAGAIN;
2693         }
2694
2695         iwlcore_commit_rxon(priv);
2696
2697         return 0;
2698 }
2699 EXPORT_SYMBOL(iwl_set_mode);
2700
2701 int iwl_mac_add_interface(struct ieee80211_hw *hw,
2702                                  struct ieee80211_if_init_conf *conf)
2703 {
2704         struct iwl_priv *priv = hw->priv;
2705         unsigned long flags;
2706
2707         IWL_DEBUG_MAC80211(priv, "enter: type %d\n", conf->type);
2708
2709         if (priv->vif) {
2710                 IWL_DEBUG_MAC80211(priv, "leave - vif != NULL\n");
2711                 return -EOPNOTSUPP;
2712         }
2713
2714         spin_lock_irqsave(&priv->lock, flags);
2715         priv->vif = conf->vif;
2716         priv->iw_mode = conf->type;
2717
2718         spin_unlock_irqrestore(&priv->lock, flags);
2719
2720         mutex_lock(&priv->mutex);
2721
2722         if (conf->mac_addr) {
2723                 IWL_DEBUG_MAC80211(priv, "Set %pM\n", conf->mac_addr);
2724                 memcpy(priv->mac_addr, conf->mac_addr, ETH_ALEN);
2725         }
2726
2727         if (iwl_set_mode(priv, conf->type) == -EAGAIN)
2728                 /* we are not ready, will run again when ready */
2729                 set_bit(STATUS_MODE_PENDING, &priv->status);
2730
2731         mutex_unlock(&priv->mutex);
2732
2733         IWL_DEBUG_MAC80211(priv, "leave\n");
2734         return 0;
2735 }
2736 EXPORT_SYMBOL(iwl_mac_add_interface);
2737
2738 void iwl_mac_remove_interface(struct ieee80211_hw *hw,
2739                                      struct ieee80211_if_init_conf *conf)
2740 {
2741         struct iwl_priv *priv = hw->priv;
2742
2743         IWL_DEBUG_MAC80211(priv, "enter\n");
2744
2745         mutex_lock(&priv->mutex);
2746
2747         if (iwl_is_ready_rf(priv)) {
2748                 iwl_scan_cancel_timeout(priv, 100);
2749                 priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
2750                 iwlcore_commit_rxon(priv);
2751         }
2752         if (priv->vif == conf->vif) {
2753                 priv->vif = NULL;
2754                 memset(priv->bssid, 0, ETH_ALEN);
2755         }
2756         mutex_unlock(&priv->mutex);
2757
2758         IWL_DEBUG_MAC80211(priv, "leave\n");
2759
2760 }
2761 EXPORT_SYMBOL(iwl_mac_remove_interface);
2762
2763 /**
2764  * iwl_mac_config - mac80211 config callback
2765  *
2766  * We ignore conf->flags & IEEE80211_CONF_SHORT_SLOT_TIME since it seems to
2767  * be set inappropriately and the driver currently sets the hardware up to
2768  * use it whenever needed.
2769  */
2770 int iwl_mac_config(struct ieee80211_hw *hw, u32 changed)
2771 {
2772         struct iwl_priv *priv = hw->priv;
2773         const struct iwl_channel_info *ch_info;
2774         struct ieee80211_conf *conf = &hw->conf;
2775         unsigned long flags = 0;
2776         int ret = 0;
2777         u16 ch;
2778         int scan_active = 0;
2779
2780         mutex_lock(&priv->mutex);
2781
2782         IWL_DEBUG_MAC80211(priv, "enter to channel %d changed 0x%X\n",
2783                                         conf->channel->hw_value, changed);
2784
2785         if (unlikely(!priv->cfg->mod_params->disable_hw_scan &&
2786                         test_bit(STATUS_SCANNING, &priv->status))) {
2787                 scan_active = 1;
2788                 IWL_DEBUG_MAC80211(priv, "leave - scanning\n");
2789         }
2790
2791
2792         /* during scanning mac80211 will delay channel setting until
2793          * scan finish with changed = 0
2794          */
2795         if (!changed || (changed & IEEE80211_CONF_CHANGE_CHANNEL)) {
2796                 if (scan_active)
2797                         goto set_ch_out;
2798
2799                 ch = ieee80211_frequency_to_channel(conf->channel->center_freq);
2800                 ch_info = iwl_get_channel_info(priv, conf->channel->band, ch);
2801                 if (!is_channel_valid(ch_info)) {
2802                         IWL_DEBUG_MAC80211(priv, "leave - invalid channel\n");
2803                         ret = -EINVAL;
2804                         goto set_ch_out;
2805                 }
2806
2807                 if (priv->iw_mode == NL80211_IFTYPE_ADHOC &&
2808                         !is_channel_ibss(ch_info)) {
2809                         IWL_ERR(priv, "channel %d in band %d not "
2810                                 "IBSS channel\n",
2811                                 conf->channel->hw_value, conf->channel->band);
2812                         ret = -EINVAL;
2813                         goto set_ch_out;
2814                 }
2815
2816                 priv->current_ht_config.is_ht = conf_is_ht(conf);
2817
2818                 spin_lock_irqsave(&priv->lock, flags);
2819
2820
2821                 /* if we are switching from ht to 2.4 clear flags
2822                  * from any ht related info since 2.4 does not
2823                  * support ht */
2824                 if ((le16_to_cpu(priv->staging_rxon.channel) != ch))
2825                         priv->staging_rxon.flags = 0;
2826
2827                 iwl_set_rxon_channel(priv, conf->channel);
2828
2829                 iwl_set_flags_for_band(priv, conf->channel->band);
2830                 spin_unlock_irqrestore(&priv->lock, flags);
2831  set_ch_out:
2832                 /* The list of supported rates and rate mask can be different
2833                  * for each band; since the band may have changed, reset
2834                  * the rate mask to what mac80211 lists */
2835                 iwl_set_rate(priv);
2836         }
2837
2838         if (changed & IEEE80211_CONF_CHANGE_PS &&
2839             priv->iw_mode == NL80211_IFTYPE_STATION) {
2840                 priv->power_data.power_disabled =
2841                         !(conf->flags & IEEE80211_CONF_PS);
2842                 ret = iwl_power_update_mode(priv, 0);
2843                 if (ret)
2844                         IWL_DEBUG_MAC80211(priv, "Error setting power level\n");
2845         }
2846
2847         if (changed & IEEE80211_CONF_CHANGE_POWER) {
2848                 IWL_DEBUG_MAC80211(priv, "TX Power old=%d new=%d\n",
2849                         priv->tx_power_user_lmt, conf->power_level);
2850
2851                 iwl_set_tx_power(priv, conf->power_level, false);
2852         }
2853
2854         /* call to ensure that 4965 rx_chain is set properly in monitor mode */
2855         if (priv->cfg->ops->hcmd->set_rxon_chain)
2856                 priv->cfg->ops->hcmd->set_rxon_chain(priv);
2857
2858         if (changed & IEEE80211_CONF_CHANGE_RADIO_ENABLED) {
2859                 if (conf->radio_enabled &&
2860                         iwl_radio_kill_sw_enable_radio(priv)) {
2861                         IWL_DEBUG_MAC80211(priv, "leave - RF-KILL - "
2862                                                 "waiting for uCode\n");
2863                         goto out;
2864                 }
2865
2866                 if (!conf->radio_enabled)
2867                         iwl_radio_kill_sw_disable_radio(priv);
2868         }
2869
2870         if (!conf->radio_enabled) {
2871                 IWL_DEBUG_MAC80211(priv, "leave - radio disabled\n");
2872                 goto out;
2873         }
2874
2875         if (!iwl_is_ready(priv)) {
2876                 IWL_DEBUG_MAC80211(priv, "leave - not ready\n");
2877                 goto out;
2878         }
2879
2880         if (scan_active)
2881                 goto out;
2882
2883         if (memcmp(&priv->active_rxon,
2884                    &priv->staging_rxon, sizeof(priv->staging_rxon)))
2885                 iwlcore_commit_rxon(priv);
2886         else
2887                 IWL_DEBUG_INFO(priv, "Not re-sending same RXON configuration.\n");
2888
2889
2890 out:
2891         IWL_DEBUG_MAC80211(priv, "leave\n");
2892         mutex_unlock(&priv->mutex);
2893         return ret;
2894 }
2895 EXPORT_SYMBOL(iwl_mac_config);
2896
2897 int iwl_mac_get_tx_stats(struct ieee80211_hw *hw,
2898                          struct ieee80211_tx_queue_stats *stats)
2899 {
2900         struct iwl_priv *priv = hw->priv;
2901         int i, avail;
2902         struct iwl_tx_queue *txq;
2903         struct iwl_queue *q;
2904         unsigned long flags;
2905
2906         IWL_DEBUG_MAC80211(priv, "enter\n");
2907
2908         if (!iwl_is_ready_rf(priv)) {
2909                 IWL_DEBUG_MAC80211(priv, "leave - RF not ready\n");
2910                 return -EIO;
2911         }
2912
2913         spin_lock_irqsave(&priv->lock, flags);
2914
2915         for (i = 0; i < AC_NUM; i++) {
2916                 txq = &priv->txq[i];
2917                 q = &txq->q;
2918                 avail = iwl_queue_space(q);
2919
2920                 stats[i].len = q->n_window - avail;
2921                 stats[i].limit = q->n_window - q->high_mark;
2922                 stats[i].count = q->n_window;
2923
2924         }
2925         spin_unlock_irqrestore(&priv->lock, flags);
2926
2927         IWL_DEBUG_MAC80211(priv, "leave\n");
2928
2929         return 0;
2930 }
2931 EXPORT_SYMBOL(iwl_mac_get_tx_stats);
2932
2933 void iwl_mac_reset_tsf(struct ieee80211_hw *hw)
2934 {
2935         struct iwl_priv *priv = hw->priv;
2936         unsigned long flags;
2937
2938         mutex_lock(&priv->mutex);
2939         IWL_DEBUG_MAC80211(priv, "enter\n");
2940
2941         spin_lock_irqsave(&priv->lock, flags);
2942         memset(&priv->current_ht_config, 0, sizeof(struct iwl_ht_info));
2943         spin_unlock_irqrestore(&priv->lock, flags);
2944
2945         iwl_reset_qos(priv);
2946
2947         spin_lock_irqsave(&priv->lock, flags);
2948         priv->assoc_id = 0;
2949         priv->assoc_capability = 0;
2950         priv->assoc_station_added = 0;
2951
2952         /* new association get rid of ibss beacon skb */
2953         if (priv->ibss_beacon)
2954                 dev_kfree_skb(priv->ibss_beacon);
2955
2956         priv->ibss_beacon = NULL;
2957
2958         priv->beacon_int = priv->vif->bss_conf.beacon_int;
2959         priv->timestamp = 0;
2960         if ((priv->iw_mode == NL80211_IFTYPE_STATION))
2961                 priv->beacon_int = 0;
2962
2963         spin_unlock_irqrestore(&priv->lock, flags);
2964
2965         if (!iwl_is_ready_rf(priv)) {
2966                 IWL_DEBUG_MAC80211(priv, "leave - not ready\n");
2967                 mutex_unlock(&priv->mutex);
2968                 return;
2969         }
2970
2971         /* we are restarting association process
2972          * clear RXON_FILTER_ASSOC_MSK bit
2973          */
2974         if (priv->iw_mode != NL80211_IFTYPE_AP) {
2975                 iwl_scan_cancel_timeout(priv, 100);
2976                 priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
2977                 iwlcore_commit_rxon(priv);
2978         }
2979
2980         if (priv->iw_mode != NL80211_IFTYPE_ADHOC) {
2981                 IWL_DEBUG_MAC80211(priv, "leave - not in IBSS\n");
2982                 mutex_unlock(&priv->mutex);
2983                 return;
2984         }
2985
2986         iwl_set_rate(priv);
2987
2988         mutex_unlock(&priv->mutex);
2989
2990         IWL_DEBUG_MAC80211(priv, "leave\n");
2991 }
2992 EXPORT_SYMBOL(iwl_mac_reset_tsf);
2993
2994 #ifdef CONFIG_PM
2995
2996 int iwl_pci_suspend(struct pci_dev *pdev, pm_message_t state)
2997 {
2998         struct iwl_priv *priv = pci_get_drvdata(pdev);
2999
3000         /*
3001          * This function is called when system goes into suspend state
3002          * mac80211 will call iwl_mac_stop() from the mac80211 suspend function
3003          * first but since iwl_mac_stop() has no knowledge of who the caller is,
3004          * it will not call apm_ops.stop() to stop the DMA operation.
3005          * Calling apm_ops.stop here to make sure we stop the DMA.
3006          */
3007         priv->cfg->ops->lib->apm_ops.stop(priv);
3008
3009         pci_save_state(pdev);
3010         pci_disable_device(pdev);
3011         pci_set_power_state(pdev, PCI_D3hot);
3012
3013         return 0;
3014 }
3015 EXPORT_SYMBOL(iwl_pci_suspend);
3016
3017 int iwl_pci_resume(struct pci_dev *pdev)
3018 {
3019         struct iwl_priv *priv = pci_get_drvdata(pdev);
3020         int ret;
3021
3022         pci_set_power_state(pdev, PCI_D0);
3023         ret = pci_enable_device(pdev);
3024         if (ret)
3025                 return ret;
3026         pci_restore_state(pdev);
3027         iwl_enable_interrupts(priv);
3028
3029         return 0;
3030 }
3031 EXPORT_SYMBOL(iwl_pci_resume);
3032
3033 #endif /* CONFIG_PM */