ath: optimize processing of CTLs for country IEs for world roaming cards
[deliverable/linux.git] / drivers / net / wireless / ath / ath9k / init.c
CommitLineData
55624204 1/*
5b68138e 2 * Copyright (c) 2008-2011 Atheros Communications Inc.
55624204
S
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
b7f080cf 17#include <linux/dma-mapping.h>
5a0e3ad6 18#include <linux/slab.h>
6fb1b1e1 19#include <linux/ath9k_platform.h>
9d9779e7 20#include <linux/module.h>
5a0e3ad6 21
55624204
S
22#include "ath9k.h"
23
24static char *dev_info = "ath9k";
25
26MODULE_AUTHOR("Atheros Communications");
27MODULE_DESCRIPTION("Support for Atheros 802.11n wireless LAN cards.");
28MODULE_SUPPORTED_DEVICE("Atheros 802.11n WLAN cards");
29MODULE_LICENSE("Dual BSD/GPL");
30
31static unsigned int ath9k_debug = ATH_DBG_DEFAULT;
32module_param_named(debug, ath9k_debug, uint, 0);
33MODULE_PARM_DESC(debug, "Debugging mask");
34
3e6109c5
JL
35int ath9k_modparam_nohwcrypt;
36module_param_named(nohwcrypt, ath9k_modparam_nohwcrypt, int, 0444);
55624204
S
37MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption");
38
93dbbcc4 39int led_blink;
9a75c2ff
VN
40module_param_named(blink, led_blink, int, 0444);
41MODULE_PARM_DESC(blink, "Enable LED blink on activity");
42
8f5dcb1c
VT
43static int ath9k_btcoex_enable;
44module_param_named(btcoex_enable, ath9k_btcoex_enable, int, 0444);
45MODULE_PARM_DESC(btcoex_enable, "Enable wifi-BT coexistence");
46
d584747b 47bool is_ath9k_unloaded;
55624204
S
48/* We use the hw_value as an index into our private channel structure */
49
50#define CHAN2G(_freq, _idx) { \
b1c1d000 51 .band = IEEE80211_BAND_2GHZ, \
55624204
S
52 .center_freq = (_freq), \
53 .hw_value = (_idx), \
54 .max_power = 20, \
55}
56
57#define CHAN5G(_freq, _idx) { \
58 .band = IEEE80211_BAND_5GHZ, \
59 .center_freq = (_freq), \
60 .hw_value = (_idx), \
61 .max_power = 20, \
62}
63
64/* Some 2 GHz radios are actually tunable on 2312-2732
65 * on 5 MHz steps, we support the channels which we know
66 * we have calibration data for all cards though to make
67 * this static */
f209f529 68static const struct ieee80211_channel ath9k_2ghz_chantable[] = {
55624204
S
69 CHAN2G(2412, 0), /* Channel 1 */
70 CHAN2G(2417, 1), /* Channel 2 */
71 CHAN2G(2422, 2), /* Channel 3 */
72 CHAN2G(2427, 3), /* Channel 4 */
73 CHAN2G(2432, 4), /* Channel 5 */
74 CHAN2G(2437, 5), /* Channel 6 */
75 CHAN2G(2442, 6), /* Channel 7 */
76 CHAN2G(2447, 7), /* Channel 8 */
77 CHAN2G(2452, 8), /* Channel 9 */
78 CHAN2G(2457, 9), /* Channel 10 */
79 CHAN2G(2462, 10), /* Channel 11 */
80 CHAN2G(2467, 11), /* Channel 12 */
81 CHAN2G(2472, 12), /* Channel 13 */
82 CHAN2G(2484, 13), /* Channel 14 */
83};
84
85/* Some 5 GHz radios are actually tunable on XXXX-YYYY
86 * on 5 MHz steps, we support the channels which we know
87 * we have calibration data for all cards though to make
88 * this static */
f209f529 89static const struct ieee80211_channel ath9k_5ghz_chantable[] = {
55624204
S
90 /* _We_ call this UNII 1 */
91 CHAN5G(5180, 14), /* Channel 36 */
92 CHAN5G(5200, 15), /* Channel 40 */
93 CHAN5G(5220, 16), /* Channel 44 */
94 CHAN5G(5240, 17), /* Channel 48 */
95 /* _We_ call this UNII 2 */
96 CHAN5G(5260, 18), /* Channel 52 */
97 CHAN5G(5280, 19), /* Channel 56 */
98 CHAN5G(5300, 20), /* Channel 60 */
99 CHAN5G(5320, 21), /* Channel 64 */
100 /* _We_ call this "Middle band" */
101 CHAN5G(5500, 22), /* Channel 100 */
102 CHAN5G(5520, 23), /* Channel 104 */
103 CHAN5G(5540, 24), /* Channel 108 */
104 CHAN5G(5560, 25), /* Channel 112 */
105 CHAN5G(5580, 26), /* Channel 116 */
106 CHAN5G(5600, 27), /* Channel 120 */
107 CHAN5G(5620, 28), /* Channel 124 */
108 CHAN5G(5640, 29), /* Channel 128 */
109 CHAN5G(5660, 30), /* Channel 132 */
110 CHAN5G(5680, 31), /* Channel 136 */
111 CHAN5G(5700, 32), /* Channel 140 */
112 /* _We_ call this UNII 3 */
113 CHAN5G(5745, 33), /* Channel 149 */
114 CHAN5G(5765, 34), /* Channel 153 */
115 CHAN5G(5785, 35), /* Channel 157 */
116 CHAN5G(5805, 36), /* Channel 161 */
117 CHAN5G(5825, 37), /* Channel 165 */
118};
119
120/* Atheros hardware rate code addition for short premble */
121#define SHPCHECK(__hw_rate, __flags) \
122 ((__flags & IEEE80211_RATE_SHORT_PREAMBLE) ? (__hw_rate | 0x04 ) : 0)
123
124#define RATE(_bitrate, _hw_rate, _flags) { \
125 .bitrate = (_bitrate), \
126 .flags = (_flags), \
127 .hw_value = (_hw_rate), \
128 .hw_value_short = (SHPCHECK(_hw_rate, _flags)) \
129}
130
131static struct ieee80211_rate ath9k_legacy_rates[] = {
132 RATE(10, 0x1b, 0),
133 RATE(20, 0x1a, IEEE80211_RATE_SHORT_PREAMBLE),
134 RATE(55, 0x19, IEEE80211_RATE_SHORT_PREAMBLE),
135 RATE(110, 0x18, IEEE80211_RATE_SHORT_PREAMBLE),
136 RATE(60, 0x0b, 0),
137 RATE(90, 0x0f, 0),
138 RATE(120, 0x0a, 0),
139 RATE(180, 0x0e, 0),
140 RATE(240, 0x09, 0),
141 RATE(360, 0x0d, 0),
142 RATE(480, 0x08, 0),
143 RATE(540, 0x0c, 0),
144};
145
0cf55c21
FF
146#ifdef CONFIG_MAC80211_LEDS
147static const struct ieee80211_tpt_blink ath9k_tpt_blink[] = {
148 { .throughput = 0 * 1024, .blink_time = 334 },
149 { .throughput = 1 * 1024, .blink_time = 260 },
150 { .throughput = 5 * 1024, .blink_time = 220 },
151 { .throughput = 10 * 1024, .blink_time = 190 },
152 { .throughput = 20 * 1024, .blink_time = 170 },
153 { .throughput = 50 * 1024, .blink_time = 150 },
154 { .throughput = 70 * 1024, .blink_time = 130 },
155 { .throughput = 100 * 1024, .blink_time = 110 },
156 { .throughput = 200 * 1024, .blink_time = 80 },
157 { .throughput = 300 * 1024, .blink_time = 50 },
158};
159#endif
160
285f2dda 161static void ath9k_deinit_softc(struct ath_softc *sc);
55624204
S
162
163/*
164 * Read and write, they both share the same lock. We do this to serialize
165 * reads and writes on Atheros 802.11n PCI devices only. This is required
166 * as the FIFO on these devices can only accept sanely 2 requests.
167 */
168
169static void ath9k_iowrite32(void *hw_priv, u32 val, u32 reg_offset)
170{
171 struct ath_hw *ah = (struct ath_hw *) hw_priv;
172 struct ath_common *common = ath9k_hw_common(ah);
173 struct ath_softc *sc = (struct ath_softc *) common->priv;
174
175 if (ah->config.serialize_regmode == SER_REG_MODE_ON) {
176 unsigned long flags;
177 spin_lock_irqsave(&sc->sc_serial_rw, flags);
178 iowrite32(val, sc->mem + reg_offset);
179 spin_unlock_irqrestore(&sc->sc_serial_rw, flags);
180 } else
181 iowrite32(val, sc->mem + reg_offset);
182}
183
184static unsigned int ath9k_ioread32(void *hw_priv, u32 reg_offset)
185{
186 struct ath_hw *ah = (struct ath_hw *) hw_priv;
187 struct ath_common *common = ath9k_hw_common(ah);
188 struct ath_softc *sc = (struct ath_softc *) common->priv;
189 u32 val;
190
191 if (ah->config.serialize_regmode == SER_REG_MODE_ON) {
192 unsigned long flags;
193 spin_lock_irqsave(&sc->sc_serial_rw, flags);
194 val = ioread32(sc->mem + reg_offset);
195 spin_unlock_irqrestore(&sc->sc_serial_rw, flags);
196 } else
197 val = ioread32(sc->mem + reg_offset);
198 return val;
199}
200
5479de6e
RM
201static unsigned int __ath9k_reg_rmw(struct ath_softc *sc, u32 reg_offset,
202 u32 set, u32 clr)
203{
204 u32 val;
205
206 val = ioread32(sc->mem + reg_offset);
207 val &= ~clr;
208 val |= set;
209 iowrite32(val, sc->mem + reg_offset);
210
211 return val;
212}
213
845e03c9
FF
214static unsigned int ath9k_reg_rmw(void *hw_priv, u32 reg_offset, u32 set, u32 clr)
215{
216 struct ath_hw *ah = (struct ath_hw *) hw_priv;
217 struct ath_common *common = ath9k_hw_common(ah);
218 struct ath_softc *sc = (struct ath_softc *) common->priv;
219 unsigned long uninitialized_var(flags);
220 u32 val;
221
5479de6e 222 if (ah->config.serialize_regmode == SER_REG_MODE_ON) {
845e03c9 223 spin_lock_irqsave(&sc->sc_serial_rw, flags);
5479de6e 224 val = __ath9k_reg_rmw(sc, reg_offset, set, clr);
845e03c9 225 spin_unlock_irqrestore(&sc->sc_serial_rw, flags);
5479de6e
RM
226 } else
227 val = __ath9k_reg_rmw(sc, reg_offset, set, clr);
845e03c9
FF
228
229 return val;
230}
231
55624204
S
232/**************************/
233/* Initialization */
234/**************************/
235
236static void setup_ht_cap(struct ath_softc *sc,
237 struct ieee80211_sta_ht_cap *ht_info)
238{
3bb065a7
FF
239 struct ath_hw *ah = sc->sc_ah;
240 struct ath_common *common = ath9k_hw_common(ah);
55624204 241 u8 tx_streams, rx_streams;
3bb065a7 242 int i, max_streams;
55624204
S
243
244 ht_info->ht_supported = true;
245 ht_info->cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
246 IEEE80211_HT_CAP_SM_PS |
247 IEEE80211_HT_CAP_SGI_40 |
248 IEEE80211_HT_CAP_DSSSCCK40;
249
b0a33448
LR
250 if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_LDPC)
251 ht_info->cap |= IEEE80211_HT_CAP_LDPC_CODING;
252
6473d24d
VT
253 if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_SGI_20)
254 ht_info->cap |= IEEE80211_HT_CAP_SGI_20;
255
55624204
S
256 ht_info->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
257 ht_info->ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
258
7216198d 259 if (AR_SREV_9330(ah) || AR_SREV_9485(ah))
7f1c7a6a 260 max_streams = 1;
e7104195
MSS
261 else if (AR_SREV_9462(ah))
262 max_streams = 2;
7f1c7a6a 263 else if (AR_SREV_9300_20_OR_LATER(ah))
3bb065a7
FF
264 max_streams = 3;
265 else
266 max_streams = 2;
267
7a37081e 268 if (AR_SREV_9280_20_OR_LATER(ah)) {
074a8c0d
FF
269 if (max_streams >= 2)
270 ht_info->cap |= IEEE80211_HT_CAP_TX_STBC;
271 ht_info->cap |= (1 << IEEE80211_HT_CAP_RX_STBC_SHIFT);
272 }
273
55624204
S
274 /* set up supported mcs set */
275 memset(&ht_info->mcs, 0, sizeof(ht_info->mcs));
82b2d334
FF
276 tx_streams = ath9k_cmn_count_streams(ah->txchainmask, max_streams);
277 rx_streams = ath9k_cmn_count_streams(ah->rxchainmask, max_streams);
3bb065a7 278
226afe68
JP
279 ath_dbg(common, ATH_DBG_CONFIG,
280 "TX streams %d, RX streams: %d\n",
281 tx_streams, rx_streams);
55624204
S
282
283 if (tx_streams != rx_streams) {
55624204
S
284 ht_info->mcs.tx_params |= IEEE80211_HT_MCS_TX_RX_DIFF;
285 ht_info->mcs.tx_params |= ((tx_streams - 1) <<
286 IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT);
287 }
288
3bb065a7
FF
289 for (i = 0; i < rx_streams; i++)
290 ht_info->mcs.rx_mask[i] = 0xff;
55624204
S
291
292 ht_info->mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
293}
294
295static int ath9k_reg_notifier(struct wiphy *wiphy,
296 struct regulatory_request *request)
297{
298 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
9ac58615 299 struct ath_softc *sc = hw->priv;
55624204
S
300 struct ath_regulatory *reg = ath9k_hw_regulatory(sc->sc_ah);
301
302 return ath_reg_notifier_apply(wiphy, request, reg);
303}
304
305/*
306 * This function will allocate both the DMA descriptor structure, and the
307 * buffers it contains. These are used to contain the descriptors used
308 * by the system.
309*/
310int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd,
311 struct list_head *head, const char *name,
4adfcded 312 int nbuf, int ndesc, bool is_tx)
55624204 313{
55624204 314 struct ath_common *common = ath9k_hw_common(sc->sc_ah);
4adfcded 315 u8 *ds;
55624204 316 struct ath_buf *bf;
4adfcded 317 int i, bsize, error, desc_len;
55624204 318
226afe68
JP
319 ath_dbg(common, ATH_DBG_CONFIG, "%s DMA: %u buffers %u desc/buf\n",
320 name, nbuf, ndesc);
55624204
S
321
322 INIT_LIST_HEAD(head);
4adfcded
VT
323
324 if (is_tx)
325 desc_len = sc->sc_ah->caps.tx_desc_len;
326 else
327 desc_len = sizeof(struct ath_desc);
328
55624204 329 /* ath_desc must be a multiple of DWORDs */
4adfcded 330 if ((desc_len % 4) != 0) {
3800276a 331 ath_err(common, "ath_desc not DWORD aligned\n");
4adfcded 332 BUG_ON((desc_len % 4) != 0);
55624204
S
333 error = -ENOMEM;
334 goto fail;
335 }
336
4adfcded 337 dd->dd_desc_len = desc_len * nbuf * ndesc;
55624204
S
338
339 /*
340 * Need additional DMA memory because we can't use
341 * descriptors that cross the 4K page boundary. Assume
342 * one skipped descriptor per 4K page.
343 */
344 if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_4KB_SPLITTRANS)) {
345 u32 ndesc_skipped =
346 ATH_DESC_4KB_BOUND_NUM_SKIPPED(dd->dd_desc_len);
347 u32 dma_len;
348
349 while (ndesc_skipped) {
4adfcded 350 dma_len = ndesc_skipped * desc_len;
55624204
S
351 dd->dd_desc_len += dma_len;
352
353 ndesc_skipped = ATH_DESC_4KB_BOUND_NUM_SKIPPED(dma_len);
ee289b64 354 }
55624204
S
355 }
356
357 /* allocate descriptors */
358 dd->dd_desc = dma_alloc_coherent(sc->dev, dd->dd_desc_len,
359 &dd->dd_desc_paddr, GFP_KERNEL);
360 if (dd->dd_desc == NULL) {
361 error = -ENOMEM;
362 goto fail;
363 }
4adfcded 364 ds = (u8 *) dd->dd_desc;
226afe68
JP
365 ath_dbg(common, ATH_DBG_CONFIG, "%s DMA map: %p (%u) -> %llx (%u)\n",
366 name, ds, (u32) dd->dd_desc_len,
367 ito64(dd->dd_desc_paddr), /*XXX*/(u32) dd->dd_desc_len);
55624204
S
368
369 /* allocate buffers */
370 bsize = sizeof(struct ath_buf) * nbuf;
371 bf = kzalloc(bsize, GFP_KERNEL);
372 if (bf == NULL) {
373 error = -ENOMEM;
374 goto fail2;
375 }
376 dd->dd_bufptr = bf;
377
4adfcded 378 for (i = 0; i < nbuf; i++, bf++, ds += (desc_len * ndesc)) {
55624204
S
379 bf->bf_desc = ds;
380 bf->bf_daddr = DS2PHYS(dd, ds);
381
382 if (!(sc->sc_ah->caps.hw_caps &
383 ATH9K_HW_CAP_4KB_SPLITTRANS)) {
384 /*
385 * Skip descriptor addresses which can cause 4KB
386 * boundary crossing (addr + length) with a 32 dword
387 * descriptor fetch.
388 */
389 while (ATH_DESC_4KB_BOUND_CHECK(bf->bf_daddr)) {
390 BUG_ON((caddr_t) bf->bf_desc >=
391 ((caddr_t) dd->dd_desc +
392 dd->dd_desc_len));
393
4adfcded 394 ds += (desc_len * ndesc);
55624204
S
395 bf->bf_desc = ds;
396 bf->bf_daddr = DS2PHYS(dd, ds);
397 }
398 }
399 list_add_tail(&bf->list, head);
400 }
401 return 0;
402fail2:
403 dma_free_coherent(sc->dev, dd->dd_desc_len, dd->dd_desc,
404 dd->dd_desc_paddr);
405fail:
406 memset(dd, 0, sizeof(*dd));
407 return error;
55624204
S
408}
409
285f2dda
S
410static int ath9k_init_btcoex(struct ath_softc *sc)
411{
066dae93 412 struct ath_txq *txq;
16659f6a 413 struct ath_hw *ah = sc->sc_ah;
066dae93 414 int r;
285f2dda
S
415
416 switch (sc->sc_ah->btcoex_hw.scheme) {
417 case ATH_BTCOEX_CFG_NONE:
418 break;
419 case ATH_BTCOEX_CFG_2WIRE:
420 ath9k_hw_btcoex_init_2wire(sc->sc_ah);
421 break;
422 case ATH_BTCOEX_CFG_3WIRE:
423 ath9k_hw_btcoex_init_3wire(sc->sc_ah);
424 r = ath_init_btcoex_timer(sc);
425 if (r)
426 return -1;
066dae93
FF
427 txq = sc->tx.txq_map[WME_AC_BE];
428 ath9k_hw_init_btcoex_hw(sc->sc_ah, txq->axq_qnum);
19686ddf
MSS
429 sc->btcoex.bt_stomp_type = ATH_BTCOEX_STOMP_LOW;
430 break;
431 case ATH_BTCOEX_CFG_MCI:
285f2dda 432 sc->btcoex.bt_stomp_type = ATH_BTCOEX_STOMP_LOW;
7dc181c2
RM
433 sc->btcoex.duty_cycle = ATH_BTCOEX_DEF_DUTY_CYCLE;
434 INIT_LIST_HEAD(&sc->btcoex.mci.info);
19686ddf
MSS
435
436 r = ath_mci_setup(sc);
437 if (r)
438 return r;
439
16659f6a
MSS
440 if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_MCI) {
441 ah->btcoex_hw.mci.ready = false;
442 ah->btcoex_hw.mci.bt_state = 0;
443 ah->btcoex_hw.mci.bt_ver_major = 3;
444 ah->btcoex_hw.mci.bt_ver_minor = 0;
445 ah->btcoex_hw.mci.bt_version_known = false;
446 ah->btcoex_hw.mci.update_2g5g = true;
447 ah->btcoex_hw.mci.is_2g = true;
448 ah->btcoex_hw.mci.wlan_channels_update = false;
449 ah->btcoex_hw.mci.wlan_channels[0] = 0x00000000;
450 ah->btcoex_hw.mci.wlan_channels[1] = 0xffffffff;
451 ah->btcoex_hw.mci.wlan_channels[2] = 0xffffffff;
452 ah->btcoex_hw.mci.wlan_channels[3] = 0x7fffffff;
453 ah->btcoex_hw.mci.query_bt = true;
454 ah->btcoex_hw.mci.unhalt_bt_gpm = true;
455 ah->btcoex_hw.mci.halted_bt_gpm = false;
456 ah->btcoex_hw.mci.need_flush_btinfo = false;
457 ah->btcoex_hw.mci.wlan_cal_seq = 0;
458 ah->btcoex_hw.mci.wlan_cal_done = 0;
459 ah->btcoex_hw.mci.config = 0x2201;
460 }
285f2dda
S
461 break;
462 default:
463 WARN_ON(1);
464 break;
465 }
466
467 return 0;
468}
469
470static int ath9k_init_queues(struct ath_softc *sc)
471{
285f2dda
S
472 int i = 0;
473
285f2dda 474 sc->beacon.beaconq = ath9k_hw_beaconq_setup(sc->sc_ah);
55624204 475 sc->beacon.cabq = ath_txq_setup(sc, ATH9K_TX_QUEUE_CAB, 0);
55624204
S
476
477 sc->config.cabqReadytime = ATH_CABQ_READY_TIME;
478 ath_cabq_update(sc);
479
60f2d1d5 480 for (i = 0; i < WME_NUM_AC; i++) {
066dae93 481 sc->tx.txq_map[i] = ath_txq_setup(sc, ATH9K_TX_QUEUE_DATA, i);
60f2d1d5
BG
482 sc->tx.txq_map[i]->mac80211_qnum = i;
483 }
285f2dda 484 return 0;
285f2dda
S
485}
486
f209f529 487static int ath9k_init_channels_rates(struct ath_softc *sc)
285f2dda 488{
f209f529
FF
489 void *channels;
490
cac4220b
FF
491 BUILD_BUG_ON(ARRAY_SIZE(ath9k_2ghz_chantable) +
492 ARRAY_SIZE(ath9k_5ghz_chantable) !=
493 ATH9K_NUM_CHANNELS);
494
d4659912 495 if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_2GHZ) {
f209f529
FF
496 channels = kmemdup(ath9k_2ghz_chantable,
497 sizeof(ath9k_2ghz_chantable), GFP_KERNEL);
498 if (!channels)
499 return -ENOMEM;
500
501 sc->sbands[IEEE80211_BAND_2GHZ].channels = channels;
285f2dda
S
502 sc->sbands[IEEE80211_BAND_2GHZ].band = IEEE80211_BAND_2GHZ;
503 sc->sbands[IEEE80211_BAND_2GHZ].n_channels =
504 ARRAY_SIZE(ath9k_2ghz_chantable);
505 sc->sbands[IEEE80211_BAND_2GHZ].bitrates = ath9k_legacy_rates;
506 sc->sbands[IEEE80211_BAND_2GHZ].n_bitrates =
507 ARRAY_SIZE(ath9k_legacy_rates);
55624204
S
508 }
509
d4659912 510 if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ) {
f209f529
FF
511 channels = kmemdup(ath9k_5ghz_chantable,
512 sizeof(ath9k_5ghz_chantable), GFP_KERNEL);
513 if (!channels) {
514 if (sc->sbands[IEEE80211_BAND_2GHZ].channels)
515 kfree(sc->sbands[IEEE80211_BAND_2GHZ].channels);
516 return -ENOMEM;
517 }
518
519 sc->sbands[IEEE80211_BAND_5GHZ].channels = channels;
285f2dda
S
520 sc->sbands[IEEE80211_BAND_5GHZ].band = IEEE80211_BAND_5GHZ;
521 sc->sbands[IEEE80211_BAND_5GHZ].n_channels =
522 ARRAY_SIZE(ath9k_5ghz_chantable);
523 sc->sbands[IEEE80211_BAND_5GHZ].bitrates =
524 ath9k_legacy_rates + 4;
525 sc->sbands[IEEE80211_BAND_5GHZ].n_bitrates =
526 ARRAY_SIZE(ath9k_legacy_rates) - 4;
527 }
f209f529 528 return 0;
285f2dda 529}
55624204 530
285f2dda
S
531static void ath9k_init_misc(struct ath_softc *sc)
532{
533 struct ath_common *common = ath9k_hw_common(sc->sc_ah);
534 int i = 0;
285f2dda 535 setup_timer(&common->ani.timer, ath_ani_calibrate, (unsigned long)sc);
55624204
S
536
537 sc->config.txpowlimit = ATH_TXPOWER_MAX;
538
285f2dda 539 if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT) {
55624204
S
540 sc->sc_flags |= SC_OP_TXAGGR;
541 sc->sc_flags |= SC_OP_RXAGGR;
542 }
543
285f2dda 544 sc->rx.defant = ath9k_hw_getdefantenna(sc->sc_ah);
55624204 545
364734fa 546 memcpy(common->bssidmask, ath_bcast_mac, ETH_ALEN);
55624204 547
285f2dda 548 sc->beacon.slottime = ATH9K_SLOT_TIME_9;
55624204 549
7545daf4 550 for (i = 0; i < ARRAY_SIZE(sc->beacon.bslot); i++)
55624204 551 sc->beacon.bslot[i] = NULL;
102885a5
VT
552
553 if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_ANT_DIV_COMB)
554 sc->ant_comb.count = ATH_ANT_DIV_COMB_INIT_COUNT;
285f2dda 555}
55624204 556
eb93e891 557static int ath9k_init_softc(u16 devid, struct ath_softc *sc,
285f2dda
S
558 const struct ath_bus_ops *bus_ops)
559{
6fb1b1e1 560 struct ath9k_platform_data *pdata = sc->dev->platform_data;
285f2dda
S
561 struct ath_hw *ah = NULL;
562 struct ath_common *common;
563 int ret = 0, i;
564 int csz = 0;
55624204 565
285f2dda
S
566 ah = kzalloc(sizeof(struct ath_hw), GFP_KERNEL);
567 if (!ah)
568 return -ENOMEM;
569
233536e1 570 ah->hw = sc->hw;
285f2dda 571 ah->hw_version.devid = devid;
f9f84e96
FF
572 ah->reg_ops.read = ath9k_ioread32;
573 ah->reg_ops.write = ath9k_iowrite32;
845e03c9 574 ah->reg_ops.rmw = ath9k_reg_rmw;
e8fe7336 575 atomic_set(&ah->intr_ref_cnt, -1);
285f2dda
S
576 sc->sc_ah = ah;
577
6de66dd9 578 if (!pdata) {
a05b5d45 579 ah->ah_flags |= AH_USE_EEPROM;
6de66dd9
FF
580 sc->sc_ah->led_pin = -1;
581 } else {
582 sc->sc_ah->gpio_mask = pdata->gpio_mask;
583 sc->sc_ah->gpio_val = pdata->gpio_val;
584 sc->sc_ah->led_pin = pdata->led_pin;
f2f5f2a1 585 ah->is_clk_25mhz = pdata->is_clk_25mhz;
3762561a 586 ah->get_mac_revision = pdata->get_mac_revision;
7d95847c 587 ah->external_reset = pdata->external_reset;
6de66dd9 588 }
a05b5d45 589
285f2dda 590 common = ath9k_hw_common(ah);
f9f84e96 591 common->ops = &ah->reg_ops;
285f2dda
S
592 common->bus_ops = bus_ops;
593 common->ah = ah;
594 common->hw = sc->hw;
595 common->priv = sc;
596 common->debug_mask = ath9k_debug;
8f5dcb1c 597 common->btcoex_enabled = ath9k_btcoex_enable == 1;
05c0be2f 598 common->disable_ani = false;
20b25744 599 spin_lock_init(&common->cc_lock);
285f2dda 600
285f2dda
S
601 spin_lock_init(&sc->sc_serial_rw);
602 spin_lock_init(&sc->sc_pm_lock);
603 mutex_init(&sc->mutex);
7f010c93
BG
604#ifdef CONFIG_ATH9K_DEBUGFS
605 spin_lock_init(&sc->nodes_lock);
cf3af748 606 spin_lock_init(&sc->debug.samp_lock);
7f010c93
BG
607 INIT_LIST_HEAD(&sc->nodes);
608#endif
285f2dda
S
609 tasklet_init(&sc->intr_tq, ath9k_tasklet, (unsigned long)sc);
610 tasklet_init(&sc->bcon_tasklet, ath_beacon_tasklet,
611 (unsigned long)sc);
612
613 /*
614 * Cache line size is used to size and align various
615 * structures used to communicate with the hardware.
616 */
617 ath_read_cachesize(common, &csz);
618 common->cachelsz = csz << 2; /* convert to bytes */
619
d70357d5 620 /* Initializes the hardware for all supported chipsets */
285f2dda 621 ret = ath9k_hw_init(ah);
d70357d5 622 if (ret)
285f2dda 623 goto err_hw;
55624204 624
6fb1b1e1
FF
625 if (pdata && pdata->macaddr)
626 memcpy(common->macaddr, pdata->macaddr, ETH_ALEN);
627
285f2dda
S
628 ret = ath9k_init_queues(sc);
629 if (ret)
630 goto err_queues;
631
632 ret = ath9k_init_btcoex(sc);
633 if (ret)
634 goto err_btcoex;
635
f209f529
FF
636 ret = ath9k_init_channels_rates(sc);
637 if (ret)
638 goto err_btcoex;
639
f82b4bde 640 ath9k_cmn_init_crypto(sc->sc_ah);
285f2dda
S
641 ath9k_init_misc(sc);
642
55624204 643 return 0;
285f2dda
S
644
645err_btcoex:
55624204
S
646 for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++)
647 if (ATH_TXQ_SETUP(sc, i))
648 ath_tx_cleanupq(sc, &sc->tx.txq[i]);
285f2dda 649err_queues:
285f2dda
S
650 ath9k_hw_deinit(ah);
651err_hw:
55624204 652
285f2dda
S
653 kfree(ah);
654 sc->sc_ah = NULL;
655
656 return ret;
55624204
S
657}
658
babcbc29
FF
659static void ath9k_init_band_txpower(struct ath_softc *sc, int band)
660{
661 struct ieee80211_supported_band *sband;
662 struct ieee80211_channel *chan;
663 struct ath_hw *ah = sc->sc_ah;
babcbc29
FF
664 int i;
665
666 sband = &sc->sbands[band];
667 for (i = 0; i < sband->n_channels; i++) {
668 chan = &sband->channels[i];
669 ah->curchan = &ah->channels[chan->hw_value];
670 ath9k_cmn_update_ichannel(ah->curchan, chan, NL80211_CHAN_HT20);
671 ath9k_hw_set_txpowerlimit(ah, MAX_RATE_POWER, true);
babcbc29
FF
672 }
673}
674
675static void ath9k_init_txpower_limits(struct ath_softc *sc)
676{
677 struct ath_hw *ah = sc->sc_ah;
678 struct ath9k_channel *curchan = ah->curchan;
679
680 if (ah->caps.hw_caps & ATH9K_HW_CAP_2GHZ)
681 ath9k_init_band_txpower(sc, IEEE80211_BAND_2GHZ);
682 if (ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ)
683 ath9k_init_band_txpower(sc, IEEE80211_BAND_5GHZ);
684
685 ah->curchan = curchan;
686}
687
43c35284
FF
688void ath9k_reload_chainmask_settings(struct ath_softc *sc)
689{
690 if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT))
691 return;
692
693 if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_2GHZ)
694 setup_ht_cap(sc, &sc->sbands[IEEE80211_BAND_2GHZ].ht_cap);
695 if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ)
696 setup_ht_cap(sc, &sc->sbands[IEEE80211_BAND_5GHZ].ht_cap);
697}
698
699
285f2dda 700void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
55624204 701{
43c35284
FF
702 struct ath_hw *ah = sc->sc_ah;
703 struct ath_common *common = ath9k_hw_common(ah);
285f2dda 704
55624204
S
705 hw->flags = IEEE80211_HW_RX_INCLUDES_FCS |
706 IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
707 IEEE80211_HW_SIGNAL_DBM |
55624204
S
708 IEEE80211_HW_SUPPORTS_PS |
709 IEEE80211_HW_PS_NULLFUNC_STACK |
05df4986 710 IEEE80211_HW_SPECTRUM_MGMT |
bd8027a7 711 IEEE80211_HW_REPORTS_TX_ACK_STATUS;
55624204 712
5ffaf8a3
LR
713 if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT)
714 hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION;
715
3e6109c5 716 if (AR_SREV_9160_10_OR_LATER(sc->sc_ah) || ath9k_modparam_nohwcrypt)
55624204
S
717 hw->flags |= IEEE80211_HW_MFP_CAPABLE;
718
719 hw->wiphy->interface_modes =
c426ee24
JB
720 BIT(NL80211_IFTYPE_P2P_GO) |
721 BIT(NL80211_IFTYPE_P2P_CLIENT) |
55624204 722 BIT(NL80211_IFTYPE_AP) |
e51f3eff 723 BIT(NL80211_IFTYPE_WDS) |
55624204
S
724 BIT(NL80211_IFTYPE_STATION) |
725 BIT(NL80211_IFTYPE_ADHOC) |
726 BIT(NL80211_IFTYPE_MESH_POINT);
727
008443de
LR
728 if (AR_SREV_5416(sc->sc_ah))
729 hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT;
55624204 730
cfdc9a8b 731 hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
fd656234 732 hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS;
cfdc9a8b 733
55624204
S
734 hw->queues = 4;
735 hw->max_rates = 4;
736 hw->channel_change_time = 5000;
737 hw->max_listen_interval = 10;
65896510 738 hw->max_rate_tries = 10;
55624204
S
739 hw->sta_data_size = sizeof(struct ath_node);
740 hw->vif_data_size = sizeof(struct ath_vif);
741
43c35284
FF
742 hw->wiphy->available_antennas_rx = BIT(ah->caps.max_rxchains) - 1;
743 hw->wiphy->available_antennas_tx = BIT(ah->caps.max_txchains) - 1;
744
745 /* single chain devices with rx diversity */
746 if (ah->caps.hw_caps & ATH9K_HW_CAP_ANT_DIV_COMB)
747 hw->wiphy->available_antennas_rx = BIT(0) | BIT(1);
748
749 sc->ant_rx = hw->wiphy->available_antennas_rx;
750 sc->ant_tx = hw->wiphy->available_antennas_tx;
751
6e5c2b4e 752#ifdef CONFIG_ATH9K_RATE_CONTROL
55624204 753 hw->rate_control_algorithm = "ath9k_rate_control";
6e5c2b4e 754#endif
55624204 755
d4659912 756 if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_2GHZ)
55624204
S
757 hw->wiphy->bands[IEEE80211_BAND_2GHZ] =
758 &sc->sbands[IEEE80211_BAND_2GHZ];
d4659912 759 if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ)
55624204
S
760 hw->wiphy->bands[IEEE80211_BAND_5GHZ] =
761 &sc->sbands[IEEE80211_BAND_5GHZ];
285f2dda 762
43c35284 763 ath9k_reload_chainmask_settings(sc);
285f2dda
S
764
765 SET_IEEE80211_PERM_ADDR(hw, common->macaddr);
55624204
S
766}
767
eb93e891 768int ath9k_init_device(u16 devid, struct ath_softc *sc,
55624204
S
769 const struct ath_bus_ops *bus_ops)
770{
771 struct ieee80211_hw *hw = sc->hw;
772 struct ath_common *common;
773 struct ath_hw *ah;
285f2dda 774 int error = 0;
55624204
S
775 struct ath_regulatory *reg;
776
285f2dda 777 /* Bring up device */
eb93e891 778 error = ath9k_init_softc(devid, sc, bus_ops);
55624204 779 if (error != 0)
285f2dda 780 goto error_init;
55624204
S
781
782 ah = sc->sc_ah;
783 common = ath9k_hw_common(ah);
285f2dda 784 ath9k_set_hw_capab(sc, hw);
55624204 785
285f2dda 786 /* Initialize regulatory */
55624204
S
787 error = ath_regd_init(&common->regulatory, sc->hw->wiphy,
788 ath9k_reg_notifier);
789 if (error)
285f2dda 790 goto error_regd;
55624204
S
791
792 reg = &common->regulatory;
793
285f2dda 794 /* Setup TX DMA */
55624204
S
795 error = ath_tx_init(sc, ATH_TXBUF);
796 if (error != 0)
285f2dda 797 goto error_tx;
55624204 798
285f2dda 799 /* Setup RX DMA */
55624204
S
800 error = ath_rx_init(sc, ATH_RXBUF);
801 if (error != 0)
285f2dda 802 goto error_rx;
55624204 803
babcbc29
FF
804 ath9k_init_txpower_limits(sc);
805
0cf55c21
FF
806#ifdef CONFIG_MAC80211_LEDS
807 /* must be initialized before ieee80211_register_hw */
808 sc->led_cdev.default_trigger = ieee80211_create_tpt_led_trigger(sc->hw,
809 IEEE80211_TPT_LEDTRIG_FL_RADIO, ath9k_tpt_blink,
810 ARRAY_SIZE(ath9k_tpt_blink));
811#endif
812
285f2dda 813 /* Register with mac80211 */
55624204 814 error = ieee80211_register_hw(hw);
285f2dda
S
815 if (error)
816 goto error_register;
55624204 817
eb272441
BG
818 error = ath9k_init_debug(ah);
819 if (error) {
3800276a 820 ath_err(common, "Unable to create debugfs files\n");
eb272441
BG
821 goto error_world;
822 }
823
285f2dda 824 /* Handle world regulatory */
55624204
S
825 if (!ath_is_world_regd(reg)) {
826 error = regulatory_hint(hw->wiphy, reg->alpha2);
827 if (error)
285f2dda 828 goto error_world;
55624204
S
829 }
830
236de514 831 INIT_WORK(&sc->hw_reset_work, ath_reset_work);
347809fc 832 INIT_WORK(&sc->hw_check_work, ath_hw_check);
9f42c2b6 833 INIT_WORK(&sc->paprd_work, ath_paprd_calibrate);
9eab61c2 834 INIT_DELAYED_WORK(&sc->hw_pll_work, ath_hw_pll_work);
9ac58615 835 sc->last_rssi = ATH_RSSI_DUMMY_MARKER;
55624204 836
285f2dda 837 ath_init_leds(sc);
55624204
S
838 ath_start_rfkill_poll(sc);
839
840 return 0;
841
285f2dda
S
842error_world:
843 ieee80211_unregister_hw(hw);
844error_register:
845 ath_rx_cleanup(sc);
846error_rx:
847 ath_tx_cleanup(sc);
848error_tx:
849 /* Nothing */
850error_regd:
851 ath9k_deinit_softc(sc);
852error_init:
55624204
S
853 return error;
854}
855
856/*****************************/
857/* De-Initialization */
858/*****************************/
859
285f2dda 860static void ath9k_deinit_softc(struct ath_softc *sc)
55624204 861{
285f2dda 862 int i = 0;
55624204 863
f209f529
FF
864 if (sc->sbands[IEEE80211_BAND_2GHZ].channels)
865 kfree(sc->sbands[IEEE80211_BAND_2GHZ].channels);
866
867 if (sc->sbands[IEEE80211_BAND_5GHZ].channels)
868 kfree(sc->sbands[IEEE80211_BAND_5GHZ].channels);
869
285f2dda
S
870 if ((sc->btcoex.no_stomp_timer) &&
871 sc->sc_ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE)
872 ath_gen_timer_free(sc->sc_ah, sc->btcoex.no_stomp_timer);
55624204 873
19686ddf
MSS
874 if (sc->sc_ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_MCI)
875 ath_mci_cleanup(sc);
876
285f2dda
S
877 for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++)
878 if (ATH_TXQ_SETUP(sc, i))
879 ath_tx_cleanupq(sc, &sc->tx.txq[i]);
880
285f2dda
S
881 ath9k_hw_deinit(sc->sc_ah);
882
736b3a27
S
883 kfree(sc->sc_ah);
884 sc->sc_ah = NULL;
55624204
S
885}
886
285f2dda 887void ath9k_deinit_device(struct ath_softc *sc)
55624204
S
888{
889 struct ieee80211_hw *hw = sc->hw;
55624204
S
890
891 ath9k_ps_wakeup(sc);
892
55624204 893 wiphy_rfkill_stop_polling(sc->hw->wiphy);
285f2dda 894 ath_deinit_leds(sc);
55624204 895
c7c18060
RM
896 ath9k_ps_restore(sc);
897
55624204
S
898 ieee80211_unregister_hw(hw);
899 ath_rx_cleanup(sc);
900 ath_tx_cleanup(sc);
285f2dda 901 ath9k_deinit_softc(sc);
55624204
S
902}
903
904void ath_descdma_cleanup(struct ath_softc *sc,
905 struct ath_descdma *dd,
906 struct list_head *head)
907{
908 dma_free_coherent(sc->dev, dd->dd_desc_len, dd->dd_desc,
909 dd->dd_desc_paddr);
910
911 INIT_LIST_HEAD(head);
912 kfree(dd->dd_bufptr);
913 memset(dd, 0, sizeof(*dd));
914}
915
55624204
S
916/************************/
917/* Module Hooks */
918/************************/
919
920static int __init ath9k_init(void)
921{
922 int error;
923
924 /* Register rate control algorithm */
925 error = ath_rate_control_register();
926 if (error != 0) {
927 printk(KERN_ERR
928 "ath9k: Unable to register rate control "
929 "algorithm: %d\n",
930 error);
931 goto err_out;
932 }
933
55624204
S
934 error = ath_pci_init();
935 if (error < 0) {
936 printk(KERN_ERR
937 "ath9k: No PCI devices found, driver not installed.\n");
938 error = -ENODEV;
eb272441 939 goto err_rate_unregister;
55624204
S
940 }
941
942 error = ath_ahb_init();
943 if (error < 0) {
944 error = -ENODEV;
945 goto err_pci_exit;
946 }
947
948 return 0;
949
950 err_pci_exit:
951 ath_pci_exit();
952
55624204
S
953 err_rate_unregister:
954 ath_rate_control_unregister();
955 err_out:
956 return error;
957}
958module_init(ath9k_init);
959
960static void __exit ath9k_exit(void)
961{
d584747b 962 is_ath9k_unloaded = true;
55624204
S
963 ath_ahb_exit();
964 ath_pci_exit();
55624204
S
965 ath_rate_control_unregister();
966 printk(KERN_INFO "%s: Driver unloaded\n", dev_info);
967}
968module_exit(ath9k_exit);
This page took 0.330069 seconds and 5 git commands to generate.