blob: 351538cd8e4c401a201f1f286b054157b1b16b65 [file] [log] [blame]
Sujith55624202010-01-08 10:36:02 +05301/*
2 * Copyright (c) 2008-2009 Atheros Communications Inc.
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
17#include "ath9k.h"
18
19static char *dev_info = "ath9k";
20
21MODULE_AUTHOR("Atheros Communications");
22MODULE_DESCRIPTION("Support for Atheros 802.11n wireless LAN cards.");
23MODULE_SUPPORTED_DEVICE("Atheros 802.11n WLAN cards");
24MODULE_LICENSE("Dual BSD/GPL");
25
26static unsigned int ath9k_debug = ATH_DBG_DEFAULT;
27module_param_named(debug, ath9k_debug, uint, 0);
28MODULE_PARM_DESC(debug, "Debugging mask");
29
30int modparam_nohwcrypt;
31module_param_named(nohwcrypt, modparam_nohwcrypt, int, 0444);
32MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption");
33
34/* We use the hw_value as an index into our private channel structure */
35
36#define CHAN2G(_freq, _idx) { \
37 .center_freq = (_freq), \
38 .hw_value = (_idx), \
39 .max_power = 20, \
40}
41
42#define CHAN5G(_freq, _idx) { \
43 .band = IEEE80211_BAND_5GHZ, \
44 .center_freq = (_freq), \
45 .hw_value = (_idx), \
46 .max_power = 20, \
47}
48
49/* Some 2 GHz radios are actually tunable on 2312-2732
50 * on 5 MHz steps, we support the channels which we know
51 * we have calibration data for all cards though to make
52 * this static */
53static struct ieee80211_channel ath9k_2ghz_chantable[] = {
54 CHAN2G(2412, 0), /* Channel 1 */
55 CHAN2G(2417, 1), /* Channel 2 */
56 CHAN2G(2422, 2), /* Channel 3 */
57 CHAN2G(2427, 3), /* Channel 4 */
58 CHAN2G(2432, 4), /* Channel 5 */
59 CHAN2G(2437, 5), /* Channel 6 */
60 CHAN2G(2442, 6), /* Channel 7 */
61 CHAN2G(2447, 7), /* Channel 8 */
62 CHAN2G(2452, 8), /* Channel 9 */
63 CHAN2G(2457, 9), /* Channel 10 */
64 CHAN2G(2462, 10), /* Channel 11 */
65 CHAN2G(2467, 11), /* Channel 12 */
66 CHAN2G(2472, 12), /* Channel 13 */
67 CHAN2G(2484, 13), /* Channel 14 */
68};
69
70/* Some 5 GHz radios are actually tunable on XXXX-YYYY
71 * on 5 MHz steps, we support the channels which we know
72 * we have calibration data for all cards though to make
73 * this static */
74static struct ieee80211_channel ath9k_5ghz_chantable[] = {
75 /* _We_ call this UNII 1 */
76 CHAN5G(5180, 14), /* Channel 36 */
77 CHAN5G(5200, 15), /* Channel 40 */
78 CHAN5G(5220, 16), /* Channel 44 */
79 CHAN5G(5240, 17), /* Channel 48 */
80 /* _We_ call this UNII 2 */
81 CHAN5G(5260, 18), /* Channel 52 */
82 CHAN5G(5280, 19), /* Channel 56 */
83 CHAN5G(5300, 20), /* Channel 60 */
84 CHAN5G(5320, 21), /* Channel 64 */
85 /* _We_ call this "Middle band" */
86 CHAN5G(5500, 22), /* Channel 100 */
87 CHAN5G(5520, 23), /* Channel 104 */
88 CHAN5G(5540, 24), /* Channel 108 */
89 CHAN5G(5560, 25), /* Channel 112 */
90 CHAN5G(5580, 26), /* Channel 116 */
91 CHAN5G(5600, 27), /* Channel 120 */
92 CHAN5G(5620, 28), /* Channel 124 */
93 CHAN5G(5640, 29), /* Channel 128 */
94 CHAN5G(5660, 30), /* Channel 132 */
95 CHAN5G(5680, 31), /* Channel 136 */
96 CHAN5G(5700, 32), /* Channel 140 */
97 /* _We_ call this UNII 3 */
98 CHAN5G(5745, 33), /* Channel 149 */
99 CHAN5G(5765, 34), /* Channel 153 */
100 CHAN5G(5785, 35), /* Channel 157 */
101 CHAN5G(5805, 36), /* Channel 161 */
102 CHAN5G(5825, 37), /* Channel 165 */
103};
104
105/* Atheros hardware rate code addition for short premble */
106#define SHPCHECK(__hw_rate, __flags) \
107 ((__flags & IEEE80211_RATE_SHORT_PREAMBLE) ? (__hw_rate | 0x04 ) : 0)
108
109#define RATE(_bitrate, _hw_rate, _flags) { \
110 .bitrate = (_bitrate), \
111 .flags = (_flags), \
112 .hw_value = (_hw_rate), \
113 .hw_value_short = (SHPCHECK(_hw_rate, _flags)) \
114}
115
116static struct ieee80211_rate ath9k_legacy_rates[] = {
117 RATE(10, 0x1b, 0),
118 RATE(20, 0x1a, IEEE80211_RATE_SHORT_PREAMBLE),
119 RATE(55, 0x19, IEEE80211_RATE_SHORT_PREAMBLE),
120 RATE(110, 0x18, IEEE80211_RATE_SHORT_PREAMBLE),
121 RATE(60, 0x0b, 0),
122 RATE(90, 0x0f, 0),
123 RATE(120, 0x0a, 0),
124 RATE(180, 0x0e, 0),
125 RATE(240, 0x09, 0),
126 RATE(360, 0x0d, 0),
127 RATE(480, 0x08, 0),
128 RATE(540, 0x0c, 0),
129};
130
Sujith285f2dd2010-01-08 10:36:07 +0530131static void ath9k_deinit_softc(struct ath_softc *sc);
Sujith55624202010-01-08 10:36:02 +0530132
133/*
134 * Read and write, they both share the same lock. We do this to serialize
135 * reads and writes on Atheros 802.11n PCI devices only. This is required
136 * as the FIFO on these devices can only accept sanely 2 requests.
137 */
138
139static void ath9k_iowrite32(void *hw_priv, u32 val, u32 reg_offset)
140{
141 struct ath_hw *ah = (struct ath_hw *) hw_priv;
142 struct ath_common *common = ath9k_hw_common(ah);
143 struct ath_softc *sc = (struct ath_softc *) common->priv;
144
145 if (ah->config.serialize_regmode == SER_REG_MODE_ON) {
146 unsigned long flags;
147 spin_lock_irqsave(&sc->sc_serial_rw, flags);
148 iowrite32(val, sc->mem + reg_offset);
149 spin_unlock_irqrestore(&sc->sc_serial_rw, flags);
150 } else
151 iowrite32(val, sc->mem + reg_offset);
152}
153
154static unsigned int ath9k_ioread32(void *hw_priv, u32 reg_offset)
155{
156 struct ath_hw *ah = (struct ath_hw *) hw_priv;
157 struct ath_common *common = ath9k_hw_common(ah);
158 struct ath_softc *sc = (struct ath_softc *) common->priv;
159 u32 val;
160
161 if (ah->config.serialize_regmode == SER_REG_MODE_ON) {
162 unsigned long flags;
163 spin_lock_irqsave(&sc->sc_serial_rw, flags);
164 val = ioread32(sc->mem + reg_offset);
165 spin_unlock_irqrestore(&sc->sc_serial_rw, flags);
166 } else
167 val = ioread32(sc->mem + reg_offset);
168 return val;
169}
170
171static const struct ath_ops ath9k_common_ops = {
172 .read = ath9k_ioread32,
173 .write = ath9k_iowrite32,
174};
175
Felix Fietkau3bb065a2010-04-19 19:57:34 +0200176static int count_streams(unsigned int chainmask, int max)
177{
178 int streams = 0;
179
180 do {
181 if (++streams == max)
182 break;
183 } while ((chainmask = chainmask & (chainmask - 1)));
184
185 return streams;
186}
187
Sujith55624202010-01-08 10:36:02 +0530188/**************************/
189/* Initialization */
190/**************************/
191
192static void setup_ht_cap(struct ath_softc *sc,
193 struct ieee80211_sta_ht_cap *ht_info)
194{
Felix Fietkau3bb065a2010-04-19 19:57:34 +0200195 struct ath_hw *ah = sc->sc_ah;
196 struct ath_common *common = ath9k_hw_common(ah);
Sujith55624202010-01-08 10:36:02 +0530197 u8 tx_streams, rx_streams;
Felix Fietkau3bb065a2010-04-19 19:57:34 +0200198 int i, max_streams;
Sujith55624202010-01-08 10:36:02 +0530199
200 ht_info->ht_supported = true;
201 ht_info->cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
202 IEEE80211_HT_CAP_SM_PS |
203 IEEE80211_HT_CAP_SGI_40 |
204 IEEE80211_HT_CAP_DSSSCCK40;
205
Luis R. Rodriguezb0a33442010-04-15 17:39:39 -0400206 if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_LDPC)
207 ht_info->cap |= IEEE80211_HT_CAP_LDPC_CODING;
208
Sujith55624202010-01-08 10:36:02 +0530209 ht_info->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
210 ht_info->ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
211
Felix Fietkau3bb065a2010-04-19 19:57:34 +0200212 if (AR_SREV_9300_20_OR_LATER(ah))
213 max_streams = 3;
214 else
215 max_streams = 2;
216
Sujith55624202010-01-08 10:36:02 +0530217 /* set up supported mcs set */
218 memset(&ht_info->mcs, 0, sizeof(ht_info->mcs));
Felix Fietkau3bb065a2010-04-19 19:57:34 +0200219 tx_streams = count_streams(common->tx_chainmask, max_streams);
220 rx_streams = count_streams(common->rx_chainmask, max_streams);
221
222 ath_print(common, ATH_DBG_CONFIG,
223 "TX streams %d, RX streams: %d\n",
224 tx_streams, rx_streams);
Sujith55624202010-01-08 10:36:02 +0530225
226 if (tx_streams != rx_streams) {
Sujith55624202010-01-08 10:36:02 +0530227 ht_info->mcs.tx_params |= IEEE80211_HT_MCS_TX_RX_DIFF;
228 ht_info->mcs.tx_params |= ((tx_streams - 1) <<
229 IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT);
230 }
231
Felix Fietkau3bb065a2010-04-19 19:57:34 +0200232 for (i = 0; i < rx_streams; i++)
233 ht_info->mcs.rx_mask[i] = 0xff;
Sujith55624202010-01-08 10:36:02 +0530234
235 ht_info->mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
236}
237
238static int ath9k_reg_notifier(struct wiphy *wiphy,
239 struct regulatory_request *request)
240{
241 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
242 struct ath_wiphy *aphy = hw->priv;
243 struct ath_softc *sc = aphy->sc;
244 struct ath_regulatory *reg = ath9k_hw_regulatory(sc->sc_ah);
245
246 return ath_reg_notifier_apply(wiphy, request, reg);
247}
248
249/*
250 * This function will allocate both the DMA descriptor structure, and the
251 * buffers it contains. These are used to contain the descriptors used
252 * by the system.
253*/
254int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd,
255 struct list_head *head, const char *name,
Vasanthakumar Thiagarajan4adfcde2010-04-15 17:39:33 -0400256 int nbuf, int ndesc, bool is_tx)
Sujith55624202010-01-08 10:36:02 +0530257{
258#define DS2PHYS(_dd, _ds) \
259 ((_dd)->dd_desc_paddr + ((caddr_t)(_ds) - (caddr_t)(_dd)->dd_desc))
260#define ATH_DESC_4KB_BOUND_CHECK(_daddr) ((((_daddr) & 0xFFF) > 0xF7F) ? 1 : 0)
261#define ATH_DESC_4KB_BOUND_NUM_SKIPPED(_len) ((_len) / 4096)
262 struct ath_common *common = ath9k_hw_common(sc->sc_ah);
Vasanthakumar Thiagarajan4adfcde2010-04-15 17:39:33 -0400263 u8 *ds;
Sujith55624202010-01-08 10:36:02 +0530264 struct ath_buf *bf;
Vasanthakumar Thiagarajan4adfcde2010-04-15 17:39:33 -0400265 int i, bsize, error, desc_len;
Sujith55624202010-01-08 10:36:02 +0530266
267 ath_print(common, ATH_DBG_CONFIG, "%s DMA: %u buffers %u desc/buf\n",
268 name, nbuf, ndesc);
269
270 INIT_LIST_HEAD(head);
Vasanthakumar Thiagarajan4adfcde2010-04-15 17:39:33 -0400271
272 if (is_tx)
273 desc_len = sc->sc_ah->caps.tx_desc_len;
274 else
275 desc_len = sizeof(struct ath_desc);
276
Sujith55624202010-01-08 10:36:02 +0530277 /* ath_desc must be a multiple of DWORDs */
Vasanthakumar Thiagarajan4adfcde2010-04-15 17:39:33 -0400278 if ((desc_len % 4) != 0) {
Sujith55624202010-01-08 10:36:02 +0530279 ath_print(common, ATH_DBG_FATAL,
280 "ath_desc not DWORD aligned\n");
Vasanthakumar Thiagarajan4adfcde2010-04-15 17:39:33 -0400281 BUG_ON((desc_len % 4) != 0);
Sujith55624202010-01-08 10:36:02 +0530282 error = -ENOMEM;
283 goto fail;
284 }
285
Vasanthakumar Thiagarajan4adfcde2010-04-15 17:39:33 -0400286 dd->dd_desc_len = desc_len * nbuf * ndesc;
Sujith55624202010-01-08 10:36:02 +0530287
288 /*
289 * Need additional DMA memory because we can't use
290 * descriptors that cross the 4K page boundary. Assume
291 * one skipped descriptor per 4K page.
292 */
293 if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_4KB_SPLITTRANS)) {
294 u32 ndesc_skipped =
295 ATH_DESC_4KB_BOUND_NUM_SKIPPED(dd->dd_desc_len);
296 u32 dma_len;
297
298 while (ndesc_skipped) {
Vasanthakumar Thiagarajan4adfcde2010-04-15 17:39:33 -0400299 dma_len = ndesc_skipped * desc_len;
Sujith55624202010-01-08 10:36:02 +0530300 dd->dd_desc_len += dma_len;
301
302 ndesc_skipped = ATH_DESC_4KB_BOUND_NUM_SKIPPED(dma_len);
303 };
304 }
305
306 /* allocate descriptors */
307 dd->dd_desc = dma_alloc_coherent(sc->dev, dd->dd_desc_len,
308 &dd->dd_desc_paddr, GFP_KERNEL);
309 if (dd->dd_desc == NULL) {
310 error = -ENOMEM;
311 goto fail;
312 }
Vasanthakumar Thiagarajan4adfcde2010-04-15 17:39:33 -0400313 ds = (u8 *) dd->dd_desc;
Sujith55624202010-01-08 10:36:02 +0530314 ath_print(common, ATH_DBG_CONFIG, "%s DMA map: %p (%u) -> %llx (%u)\n",
315 name, ds, (u32) dd->dd_desc_len,
316 ito64(dd->dd_desc_paddr), /*XXX*/(u32) dd->dd_desc_len);
317
318 /* allocate buffers */
319 bsize = sizeof(struct ath_buf) * nbuf;
320 bf = kzalloc(bsize, GFP_KERNEL);
321 if (bf == NULL) {
322 error = -ENOMEM;
323 goto fail2;
324 }
325 dd->dd_bufptr = bf;
326
Vasanthakumar Thiagarajan4adfcde2010-04-15 17:39:33 -0400327 for (i = 0; i < nbuf; i++, bf++, ds += (desc_len * ndesc)) {
Sujith55624202010-01-08 10:36:02 +0530328 bf->bf_desc = ds;
329 bf->bf_daddr = DS2PHYS(dd, ds);
330
331 if (!(sc->sc_ah->caps.hw_caps &
332 ATH9K_HW_CAP_4KB_SPLITTRANS)) {
333 /*
334 * Skip descriptor addresses which can cause 4KB
335 * boundary crossing (addr + length) with a 32 dword
336 * descriptor fetch.
337 */
338 while (ATH_DESC_4KB_BOUND_CHECK(bf->bf_daddr)) {
339 BUG_ON((caddr_t) bf->bf_desc >=
340 ((caddr_t) dd->dd_desc +
341 dd->dd_desc_len));
342
Vasanthakumar Thiagarajan4adfcde2010-04-15 17:39:33 -0400343 ds += (desc_len * ndesc);
Sujith55624202010-01-08 10:36:02 +0530344 bf->bf_desc = ds;
345 bf->bf_daddr = DS2PHYS(dd, ds);
346 }
347 }
348 list_add_tail(&bf->list, head);
349 }
350 return 0;
351fail2:
352 dma_free_coherent(sc->dev, dd->dd_desc_len, dd->dd_desc,
353 dd->dd_desc_paddr);
354fail:
355 memset(dd, 0, sizeof(*dd));
356 return error;
357#undef ATH_DESC_4KB_BOUND_CHECK
358#undef ATH_DESC_4KB_BOUND_NUM_SKIPPED
359#undef DS2PHYS
360}
361
Sujith285f2dd2010-01-08 10:36:07 +0530362static void ath9k_init_crypto(struct ath_softc *sc)
Sujith55624202010-01-08 10:36:02 +0530363{
Sujith285f2dd2010-01-08 10:36:07 +0530364 struct ath_common *common = ath9k_hw_common(sc->sc_ah);
365 int i = 0;
Sujith55624202010-01-08 10:36:02 +0530366
367 /* Get the hardware key cache size. */
Sujith285f2dd2010-01-08 10:36:07 +0530368 common->keymax = sc->sc_ah->caps.keycache_size;
Sujith55624202010-01-08 10:36:02 +0530369 if (common->keymax > ATH_KEYMAX) {
370 ath_print(common, ATH_DBG_ANY,
371 "Warning, using only %u entries in %u key cache\n",
372 ATH_KEYMAX, common->keymax);
373 common->keymax = ATH_KEYMAX;
374 }
375
376 /*
377 * Reset the key cache since some parts do not
378 * reset the contents on initial power up.
379 */
380 for (i = 0; i < common->keymax; i++)
Sujith285f2dd2010-01-08 10:36:07 +0530381 ath9k_hw_keyreset(sc->sc_ah, (u16) i);
Sujith55624202010-01-08 10:36:02 +0530382
Sujith285f2dd2010-01-08 10:36:07 +0530383 if (ath9k_hw_getcapability(sc->sc_ah, ATH9K_CAP_CIPHER,
Sujith55624202010-01-08 10:36:02 +0530384 ATH9K_CIPHER_TKIP, NULL)) {
385 /*
386 * Whether we should enable h/w TKIP MIC.
387 * XXX: if we don't support WME TKIP MIC, then we wouldn't
388 * report WMM capable, so it's always safe to turn on
389 * TKIP MIC in this case.
390 */
Sujith285f2dd2010-01-08 10:36:07 +0530391 ath9k_hw_setcapability(sc->sc_ah, ATH9K_CAP_TKIP_MIC, 0, 1, NULL);
Sujith55624202010-01-08 10:36:02 +0530392 }
393
394 /*
395 * Check whether the separate key cache entries
396 * are required to handle both tx+rx MIC keys.
397 * With split mic keys the number of stations is limited
398 * to 27 otherwise 59.
399 */
Sujith285f2dd2010-01-08 10:36:07 +0530400 if (ath9k_hw_getcapability(sc->sc_ah, ATH9K_CAP_CIPHER,
Sujith55624202010-01-08 10:36:02 +0530401 ATH9K_CIPHER_TKIP, NULL)
Sujith285f2dd2010-01-08 10:36:07 +0530402 && ath9k_hw_getcapability(sc->sc_ah, ATH9K_CAP_CIPHER,
Sujith55624202010-01-08 10:36:02 +0530403 ATH9K_CIPHER_MIC, NULL)
Sujith285f2dd2010-01-08 10:36:07 +0530404 && ath9k_hw_getcapability(sc->sc_ah, ATH9K_CAP_TKIP_SPLIT,
Sujith55624202010-01-08 10:36:02 +0530405 0, NULL))
406 common->splitmic = 1;
407
408 /* turn on mcast key search if possible */
Sujith285f2dd2010-01-08 10:36:07 +0530409 if (!ath9k_hw_getcapability(sc->sc_ah, ATH9K_CAP_MCAST_KEYSRCH, 0, NULL))
410 (void)ath9k_hw_setcapability(sc->sc_ah, ATH9K_CAP_MCAST_KEYSRCH,
411 1, 1, NULL);
Sujith55624202010-01-08 10:36:02 +0530412
Sujith285f2dd2010-01-08 10:36:07 +0530413}
Sujith55624202010-01-08 10:36:02 +0530414
Sujith285f2dd2010-01-08 10:36:07 +0530415static int ath9k_init_btcoex(struct ath_softc *sc)
416{
417 int r, qnum;
418
419 switch (sc->sc_ah->btcoex_hw.scheme) {
420 case ATH_BTCOEX_CFG_NONE:
421 break;
422 case ATH_BTCOEX_CFG_2WIRE:
423 ath9k_hw_btcoex_init_2wire(sc->sc_ah);
424 break;
425 case ATH_BTCOEX_CFG_3WIRE:
426 ath9k_hw_btcoex_init_3wire(sc->sc_ah);
427 r = ath_init_btcoex_timer(sc);
428 if (r)
429 return -1;
430 qnum = ath_tx_get_qnum(sc, ATH9K_TX_QUEUE_DATA, ATH9K_WME_AC_BE);
431 ath9k_hw_init_btcoex_hw(sc->sc_ah, qnum);
432 sc->btcoex.bt_stomp_type = ATH_BTCOEX_STOMP_LOW;
433 break;
434 default:
435 WARN_ON(1);
436 break;
Sujith55624202010-01-08 10:36:02 +0530437 }
438
Sujith285f2dd2010-01-08 10:36:07 +0530439 return 0;
440}
Sujith55624202010-01-08 10:36:02 +0530441
Sujith285f2dd2010-01-08 10:36:07 +0530442static int ath9k_init_queues(struct ath_softc *sc)
443{
444 struct ath_common *common = ath9k_hw_common(sc->sc_ah);
445 int i = 0;
Sujith55624202010-01-08 10:36:02 +0530446
Sujith285f2dd2010-01-08 10:36:07 +0530447 for (i = 0; i < ARRAY_SIZE(sc->tx.hwq_map); i++)
448 sc->tx.hwq_map[i] = -1;
Sujith55624202010-01-08 10:36:02 +0530449
Sujith285f2dd2010-01-08 10:36:07 +0530450 sc->beacon.beaconq = ath9k_hw_beaconq_setup(sc->sc_ah);
451 if (sc->beacon.beaconq == -1) {
452 ath_print(common, ATH_DBG_FATAL,
453 "Unable to setup a beacon xmit queue\n");
454 goto err;
Sujith55624202010-01-08 10:36:02 +0530455 }
456
Sujith285f2dd2010-01-08 10:36:07 +0530457 sc->beacon.cabq = ath_txq_setup(sc, ATH9K_TX_QUEUE_CAB, 0);
458 if (sc->beacon.cabq == NULL) {
459 ath_print(common, ATH_DBG_FATAL,
460 "Unable to setup CAB xmit queue\n");
461 goto err;
462 }
Sujith55624202010-01-08 10:36:02 +0530463
Sujith285f2dd2010-01-08 10:36:07 +0530464 sc->config.cabqReadytime = ATH_CABQ_READY_TIME;
465 ath_cabq_update(sc);
466
467 if (!ath_tx_setup(sc, ATH9K_WME_AC_BK)) {
468 ath_print(common, ATH_DBG_FATAL,
469 "Unable to setup xmit queue for BK traffic\n");
470 goto err;
471 }
472
473 if (!ath_tx_setup(sc, ATH9K_WME_AC_BE)) {
474 ath_print(common, ATH_DBG_FATAL,
475 "Unable to setup xmit queue for BE traffic\n");
476 goto err;
477 }
478 if (!ath_tx_setup(sc, ATH9K_WME_AC_VI)) {
479 ath_print(common, ATH_DBG_FATAL,
480 "Unable to setup xmit queue for VI traffic\n");
481 goto err;
482 }
483 if (!ath_tx_setup(sc, ATH9K_WME_AC_VO)) {
484 ath_print(common, ATH_DBG_FATAL,
485 "Unable to setup xmit queue for VO traffic\n");
486 goto err;
487 }
488
489 return 0;
490
491err:
492 for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++)
493 if (ATH_TXQ_SETUP(sc, i))
494 ath_tx_cleanupq(sc, &sc->tx.txq[i]);
495
496 return -EIO;
497}
498
499static void ath9k_init_channels_rates(struct ath_softc *sc)
500{
Sujith55624202010-01-08 10:36:02 +0530501 if (test_bit(ATH9K_MODE_11G, sc->sc_ah->caps.wireless_modes)) {
502 sc->sbands[IEEE80211_BAND_2GHZ].channels = ath9k_2ghz_chantable;
503 sc->sbands[IEEE80211_BAND_2GHZ].band = IEEE80211_BAND_2GHZ;
504 sc->sbands[IEEE80211_BAND_2GHZ].n_channels =
505 ARRAY_SIZE(ath9k_2ghz_chantable);
506 sc->sbands[IEEE80211_BAND_2GHZ].bitrates = ath9k_legacy_rates;
507 sc->sbands[IEEE80211_BAND_2GHZ].n_bitrates =
508 ARRAY_SIZE(ath9k_legacy_rates);
509 }
510
511 if (test_bit(ATH9K_MODE_11A, sc->sc_ah->caps.wireless_modes)) {
512 sc->sbands[IEEE80211_BAND_5GHZ].channels = ath9k_5ghz_chantable;
513 sc->sbands[IEEE80211_BAND_5GHZ].band = IEEE80211_BAND_5GHZ;
514 sc->sbands[IEEE80211_BAND_5GHZ].n_channels =
515 ARRAY_SIZE(ath9k_5ghz_chantable);
516 sc->sbands[IEEE80211_BAND_5GHZ].bitrates =
517 ath9k_legacy_rates + 4;
518 sc->sbands[IEEE80211_BAND_5GHZ].n_bitrates =
519 ARRAY_SIZE(ath9k_legacy_rates) - 4;
520 }
Sujith285f2dd2010-01-08 10:36:07 +0530521}
Sujith55624202010-01-08 10:36:02 +0530522
Sujith285f2dd2010-01-08 10:36:07 +0530523static void ath9k_init_misc(struct ath_softc *sc)
524{
525 struct ath_common *common = ath9k_hw_common(sc->sc_ah);
526 int i = 0;
527
528 common->ani.noise_floor = ATH_DEFAULT_NOISE_FLOOR;
529 setup_timer(&common->ani.timer, ath_ani_calibrate, (unsigned long)sc);
530
531 sc->config.txpowlimit = ATH_TXPOWER_MAX;
532
533 if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT) {
534 sc->sc_flags |= SC_OP_TXAGGR;
535 sc->sc_flags |= SC_OP_RXAGGR;
Sujith55624202010-01-08 10:36:02 +0530536 }
537
Sujith285f2dd2010-01-08 10:36:07 +0530538 common->tx_chainmask = sc->sc_ah->caps.tx_chainmask;
539 common->rx_chainmask = sc->sc_ah->caps.rx_chainmask;
540
Luis R. Rodriguez8fe65362010-04-15 17:38:14 -0400541 ath9k_hw_set_diversity(sc->sc_ah, true);
Sujith285f2dd2010-01-08 10:36:07 +0530542 sc->rx.defant = ath9k_hw_getdefantenna(sc->sc_ah);
543
544 if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_BSSIDMASK)
545 memcpy(common->bssidmask, ath_bcast_mac, ETH_ALEN);
546
547 sc->beacon.slottime = ATH9K_SLOT_TIME_9;
548
549 for (i = 0; i < ARRAY_SIZE(sc->beacon.bslot); i++) {
550 sc->beacon.bslot[i] = NULL;
551 sc->beacon.bslot_aphy[i] = NULL;
552 }
553}
554
555static int ath9k_init_softc(u16 devid, struct ath_softc *sc, u16 subsysid,
556 const struct ath_bus_ops *bus_ops)
557{
558 struct ath_hw *ah = NULL;
559 struct ath_common *common;
560 int ret = 0, i;
561 int csz = 0;
562
Sujith285f2dd2010-01-08 10:36:07 +0530563 ah = kzalloc(sizeof(struct ath_hw), GFP_KERNEL);
564 if (!ah)
565 return -ENOMEM;
566
567 ah->hw_version.devid = devid;
568 ah->hw_version.subsysid = subsysid;
569 sc->sc_ah = ah;
570
571 common = ath9k_hw_common(ah);
572 common->ops = &ath9k_common_ops;
573 common->bus_ops = bus_ops;
574 common->ah = ah;
575 common->hw = sc->hw;
576 common->priv = sc;
577 common->debug_mask = ath9k_debug;
578
579 spin_lock_init(&sc->wiphy_lock);
580 spin_lock_init(&sc->sc_resetlock);
581 spin_lock_init(&sc->sc_serial_rw);
582 spin_lock_init(&sc->sc_pm_lock);
583 mutex_init(&sc->mutex);
584 tasklet_init(&sc->intr_tq, ath9k_tasklet, (unsigned long)sc);
585 tasklet_init(&sc->bcon_tasklet, ath_beacon_tasklet,
586 (unsigned long)sc);
587
588 /*
589 * Cache line size is used to size and align various
590 * structures used to communicate with the hardware.
591 */
592 ath_read_cachesize(common, &csz);
593 common->cachelsz = csz << 2; /* convert to bytes */
594
Luis R. Rodriguezd70357d2010-04-15 17:38:06 -0400595 /* Initializes the hardware for all supported chipsets */
Sujith285f2dd2010-01-08 10:36:07 +0530596 ret = ath9k_hw_init(ah);
Luis R. Rodriguezd70357d2010-04-15 17:38:06 -0400597 if (ret)
Sujith285f2dd2010-01-08 10:36:07 +0530598 goto err_hw;
Sujith285f2dd2010-01-08 10:36:07 +0530599
600 ret = ath9k_init_debug(ah);
601 if (ret) {
602 ath_print(common, ATH_DBG_FATAL,
603 "Unable to create debugfs files\n");
604 goto err_debug;
605 }
606
607 ret = ath9k_init_queues(sc);
608 if (ret)
609 goto err_queues;
610
611 ret = ath9k_init_btcoex(sc);
612 if (ret)
613 goto err_btcoex;
614
615 ath9k_init_crypto(sc);
616 ath9k_init_channels_rates(sc);
617 ath9k_init_misc(sc);
618
Sujith55624202010-01-08 10:36:02 +0530619 return 0;
Sujith285f2dd2010-01-08 10:36:07 +0530620
621err_btcoex:
Sujith55624202010-01-08 10:36:02 +0530622 for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++)
623 if (ATH_TXQ_SETUP(sc, i))
624 ath_tx_cleanupq(sc, &sc->tx.txq[i]);
Sujith285f2dd2010-01-08 10:36:07 +0530625err_queues:
626 ath9k_exit_debug(ah);
627err_debug:
628 ath9k_hw_deinit(ah);
629err_hw:
630 tasklet_kill(&sc->intr_tq);
631 tasklet_kill(&sc->bcon_tasklet);
Sujith55624202010-01-08 10:36:02 +0530632
Sujith285f2dd2010-01-08 10:36:07 +0530633 kfree(ah);
634 sc->sc_ah = NULL;
635
636 return ret;
Sujith55624202010-01-08 10:36:02 +0530637}
638
Sujith285f2dd2010-01-08 10:36:07 +0530639void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
Sujith55624202010-01-08 10:36:02 +0530640{
Sujith285f2dd2010-01-08 10:36:07 +0530641 struct ath_common *common = ath9k_hw_common(sc->sc_ah);
642
Sujith55624202010-01-08 10:36:02 +0530643 hw->flags = IEEE80211_HW_RX_INCLUDES_FCS |
644 IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
645 IEEE80211_HW_SIGNAL_DBM |
Sujith55624202010-01-08 10:36:02 +0530646 IEEE80211_HW_SUPPORTS_PS |
647 IEEE80211_HW_PS_NULLFUNC_STACK |
Vivek Natarajan05df4982010-02-09 11:34:50 +0530648 IEEE80211_HW_SPECTRUM_MGMT |
649 IEEE80211_HW_REPORTS_TX_ACK_STATUS;
Sujith55624202010-01-08 10:36:02 +0530650
Luis R. Rodriguez5ffaf8a2010-02-02 11:58:33 -0500651 if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT)
652 hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION;
653
Sujith55624202010-01-08 10:36:02 +0530654 if (AR_SREV_9160_10_OR_LATER(sc->sc_ah) || modparam_nohwcrypt)
655 hw->flags |= IEEE80211_HW_MFP_CAPABLE;
656
657 hw->wiphy->interface_modes =
658 BIT(NL80211_IFTYPE_AP) |
659 BIT(NL80211_IFTYPE_STATION) |
660 BIT(NL80211_IFTYPE_ADHOC) |
661 BIT(NL80211_IFTYPE_MESH_POINT);
662
663 hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT;
664
665 hw->queues = 4;
666 hw->max_rates = 4;
667 hw->channel_change_time = 5000;
668 hw->max_listen_interval = 10;
Felix Fietkau65896512010-01-24 03:26:11 +0100669 hw->max_rate_tries = 10;
Sujith55624202010-01-08 10:36:02 +0530670 hw->sta_data_size = sizeof(struct ath_node);
671 hw->vif_data_size = sizeof(struct ath_vif);
672
673 hw->rate_control_algorithm = "ath9k_rate_control";
674
675 if (test_bit(ATH9K_MODE_11G, sc->sc_ah->caps.wireless_modes))
676 hw->wiphy->bands[IEEE80211_BAND_2GHZ] =
677 &sc->sbands[IEEE80211_BAND_2GHZ];
678 if (test_bit(ATH9K_MODE_11A, sc->sc_ah->caps.wireless_modes))
679 hw->wiphy->bands[IEEE80211_BAND_5GHZ] =
680 &sc->sbands[IEEE80211_BAND_5GHZ];
Sujith285f2dd2010-01-08 10:36:07 +0530681
682 if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT) {
683 if (test_bit(ATH9K_MODE_11G, sc->sc_ah->caps.wireless_modes))
684 setup_ht_cap(sc, &sc->sbands[IEEE80211_BAND_2GHZ].ht_cap);
685 if (test_bit(ATH9K_MODE_11A, sc->sc_ah->caps.wireless_modes))
686 setup_ht_cap(sc, &sc->sbands[IEEE80211_BAND_5GHZ].ht_cap);
687 }
688
689 SET_IEEE80211_PERM_ADDR(hw, common->macaddr);
Sujith55624202010-01-08 10:36:02 +0530690}
691
Sujith285f2dd2010-01-08 10:36:07 +0530692int ath9k_init_device(u16 devid, struct ath_softc *sc, u16 subsysid,
Sujith55624202010-01-08 10:36:02 +0530693 const struct ath_bus_ops *bus_ops)
694{
695 struct ieee80211_hw *hw = sc->hw;
696 struct ath_common *common;
697 struct ath_hw *ah;
Sujith285f2dd2010-01-08 10:36:07 +0530698 int error = 0;
Sujith55624202010-01-08 10:36:02 +0530699 struct ath_regulatory *reg;
700
Sujith285f2dd2010-01-08 10:36:07 +0530701 /* Bring up device */
702 error = ath9k_init_softc(devid, sc, subsysid, bus_ops);
Sujith55624202010-01-08 10:36:02 +0530703 if (error != 0)
Sujith285f2dd2010-01-08 10:36:07 +0530704 goto error_init;
Sujith55624202010-01-08 10:36:02 +0530705
706 ah = sc->sc_ah;
707 common = ath9k_hw_common(ah);
Sujith285f2dd2010-01-08 10:36:07 +0530708 ath9k_set_hw_capab(sc, hw);
Sujith55624202010-01-08 10:36:02 +0530709
Sujith285f2dd2010-01-08 10:36:07 +0530710 /* Initialize regulatory */
Sujith55624202010-01-08 10:36:02 +0530711 error = ath_regd_init(&common->regulatory, sc->hw->wiphy,
712 ath9k_reg_notifier);
713 if (error)
Sujith285f2dd2010-01-08 10:36:07 +0530714 goto error_regd;
Sujith55624202010-01-08 10:36:02 +0530715
716 reg = &common->regulatory;
717
Sujith285f2dd2010-01-08 10:36:07 +0530718 /* Setup TX DMA */
Sujith55624202010-01-08 10:36:02 +0530719 error = ath_tx_init(sc, ATH_TXBUF);
720 if (error != 0)
Sujith285f2dd2010-01-08 10:36:07 +0530721 goto error_tx;
Sujith55624202010-01-08 10:36:02 +0530722
Sujith285f2dd2010-01-08 10:36:07 +0530723 /* Setup RX DMA */
Sujith55624202010-01-08 10:36:02 +0530724 error = ath_rx_init(sc, ATH_RXBUF);
725 if (error != 0)
Sujith285f2dd2010-01-08 10:36:07 +0530726 goto error_rx;
727
728 /* Register with mac80211 */
729 error = ieee80211_register_hw(hw);
730 if (error)
731 goto error_register;
732
733 /* Handle world regulatory */
734 if (!ath_is_world_regd(reg)) {
735 error = regulatory_hint(hw->wiphy, reg->alpha2);
736 if (error)
737 goto error_world;
738 }
Sujith55624202010-01-08 10:36:02 +0530739
740 INIT_WORK(&sc->chan_work, ath9k_wiphy_chan_work);
741 INIT_DELAYED_WORK(&sc->wiphy_work, ath9k_wiphy_work);
742 sc->wiphy_scheduler_int = msecs_to_jiffies(500);
743
Sujith55624202010-01-08 10:36:02 +0530744 ath_init_leds(sc);
Sujith55624202010-01-08 10:36:02 +0530745 ath_start_rfkill_poll(sc);
746
747 return 0;
748
Sujith285f2dd2010-01-08 10:36:07 +0530749error_world:
750 ieee80211_unregister_hw(hw);
751error_register:
752 ath_rx_cleanup(sc);
753error_rx:
754 ath_tx_cleanup(sc);
755error_tx:
756 /* Nothing */
757error_regd:
758 ath9k_deinit_softc(sc);
759error_init:
Sujith55624202010-01-08 10:36:02 +0530760 return error;
761}
762
763/*****************************/
764/* De-Initialization */
765/*****************************/
766
Sujith285f2dd2010-01-08 10:36:07 +0530767static void ath9k_deinit_softc(struct ath_softc *sc)
Sujith55624202010-01-08 10:36:02 +0530768{
Sujith285f2dd2010-01-08 10:36:07 +0530769 int i = 0;
Sujith55624202010-01-08 10:36:02 +0530770
Sujith285f2dd2010-01-08 10:36:07 +0530771 if ((sc->btcoex.no_stomp_timer) &&
772 sc->sc_ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE)
773 ath_gen_timer_free(sc->sc_ah, sc->btcoex.no_stomp_timer);
Sujith55624202010-01-08 10:36:02 +0530774
Sujith285f2dd2010-01-08 10:36:07 +0530775 for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++)
776 if (ATH_TXQ_SETUP(sc, i))
777 ath_tx_cleanupq(sc, &sc->tx.txq[i]);
778
779 ath9k_exit_debug(sc->sc_ah);
780 ath9k_hw_deinit(sc->sc_ah);
781
782 tasklet_kill(&sc->intr_tq);
783 tasklet_kill(&sc->bcon_tasklet);
Sujith736b3a22010-03-17 14:25:24 +0530784
785 kfree(sc->sc_ah);
786 sc->sc_ah = NULL;
Sujith55624202010-01-08 10:36:02 +0530787}
788
Sujith285f2dd2010-01-08 10:36:07 +0530789void ath9k_deinit_device(struct ath_softc *sc)
Sujith55624202010-01-08 10:36:02 +0530790{
791 struct ieee80211_hw *hw = sc->hw;
Sujith55624202010-01-08 10:36:02 +0530792 int i = 0;
793
794 ath9k_ps_wakeup(sc);
795
Sujith55624202010-01-08 10:36:02 +0530796 wiphy_rfkill_stop_polling(sc->hw->wiphy);
Sujith285f2dd2010-01-08 10:36:07 +0530797 ath_deinit_leds(sc);
Sujith55624202010-01-08 10:36:02 +0530798
799 for (i = 0; i < sc->num_sec_wiphy; i++) {
800 struct ath_wiphy *aphy = sc->sec_wiphy[i];
801 if (aphy == NULL)
802 continue;
803 sc->sec_wiphy[i] = NULL;
804 ieee80211_unregister_hw(aphy->hw);
805 ieee80211_free_hw(aphy->hw);
806 }
Sujith285f2dd2010-01-08 10:36:07 +0530807 kfree(sc->sec_wiphy);
808
Sujith55624202010-01-08 10:36:02 +0530809 ieee80211_unregister_hw(hw);
810 ath_rx_cleanup(sc);
811 ath_tx_cleanup(sc);
Sujith285f2dd2010-01-08 10:36:07 +0530812 ath9k_deinit_softc(sc);
Sujith55624202010-01-08 10:36:02 +0530813}
814
815void ath_descdma_cleanup(struct ath_softc *sc,
816 struct ath_descdma *dd,
817 struct list_head *head)
818{
819 dma_free_coherent(sc->dev, dd->dd_desc_len, dd->dd_desc,
820 dd->dd_desc_paddr);
821
822 INIT_LIST_HEAD(head);
823 kfree(dd->dd_bufptr);
824 memset(dd, 0, sizeof(*dd));
825}
826
Sujith55624202010-01-08 10:36:02 +0530827/************************/
828/* Module Hooks */
829/************************/
830
831static int __init ath9k_init(void)
832{
833 int error;
834
835 /* Register rate control algorithm */
836 error = ath_rate_control_register();
837 if (error != 0) {
838 printk(KERN_ERR
839 "ath9k: Unable to register rate control "
840 "algorithm: %d\n",
841 error);
842 goto err_out;
843 }
844
845 error = ath9k_debug_create_root();
846 if (error) {
847 printk(KERN_ERR
848 "ath9k: Unable to create debugfs root: %d\n",
849 error);
850 goto err_rate_unregister;
851 }
852
853 error = ath_pci_init();
854 if (error < 0) {
855 printk(KERN_ERR
856 "ath9k: No PCI devices found, driver not installed.\n");
857 error = -ENODEV;
858 goto err_remove_root;
859 }
860
861 error = ath_ahb_init();
862 if (error < 0) {
863 error = -ENODEV;
864 goto err_pci_exit;
865 }
866
867 return 0;
868
869 err_pci_exit:
870 ath_pci_exit();
871
872 err_remove_root:
873 ath9k_debug_remove_root();
874 err_rate_unregister:
875 ath_rate_control_unregister();
876 err_out:
877 return error;
878}
879module_init(ath9k_init);
880
881static void __exit ath9k_exit(void)
882{
883 ath_ahb_exit();
884 ath_pci_exit();
885 ath9k_debug_remove_root();
886 ath_rate_control_unregister();
887 printk(KERN_INFO "%s: Driver unloaded\n", dev_info);
888}
889module_exit(ath9k_exit);