2 * Copyright (c) 2008-2011 Atheros Communications Inc.
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.
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.
17 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
19 #include <linux/nl80211.h>
20 #include <linux/pci.h>
21 #include <linux/module.h>
24 static const struct pci_device_id ath_pci_id_table[] = {
25 { PCI_VDEVICE(ATHEROS, 0x0023) }, /* PCI */
26 { PCI_VDEVICE(ATHEROS, 0x0024) }, /* PCI-E */
27 { PCI_VDEVICE(ATHEROS, 0x0027) }, /* PCI */
29 #ifdef CONFIG_ATH9K_PCOEM
30 /* Mini PCI AR9220 MB92 cards: Compex WLM200NX, Wistron DNMA-92 */
31 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
33 PCI_VENDOR_ID_ATHEROS,
35 .driver_data = ATH9K_PCI_LED_ACT_HI },
38 { PCI_VDEVICE(ATHEROS, 0x0029) }, /* PCI */
40 #ifdef CONFIG_ATH9K_PCOEM
41 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
45 .driver_data = ATH9K_PCI_D3_L1_WAR },
46 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
48 PCI_VENDOR_ID_FOXCONN,
50 .driver_data = ATH9K_PCI_D3_L1_WAR },
51 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
55 .driver_data = ATH9K_PCI_D3_L1_WAR },
56 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
60 .driver_data = ATH9K_PCI_D3_L1_WAR },
61 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
65 .driver_data = ATH9K_PCI_D3_L1_WAR },
66 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
70 .driver_data = ATH9K_PCI_D3_L1_WAR },
71 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
75 .driver_data = ATH9K_PCI_D3_L1_WAR },
76 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
80 .driver_data = ATH9K_PCI_D3_L1_WAR },
81 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
85 .driver_data = ATH9K_PCI_D3_L1_WAR },
88 { PCI_VDEVICE(ATHEROS, 0x002A) }, /* PCI-E */
90 #ifdef CONFIG_ATH9K_PCOEM
91 /* AR9285 card for Asus */
92 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
96 .driver_data = ATH9K_PCI_BT_ANT_DIV },
99 { PCI_VDEVICE(ATHEROS, 0x002B) }, /* PCI-E */
100 { PCI_VDEVICE(ATHEROS, 0x002C) }, /* PCI-E 802.11n bonded out */
101 { PCI_VDEVICE(ATHEROS, 0x002D) }, /* PCI */
102 { PCI_VDEVICE(ATHEROS, 0x002E) }, /* PCI-E */
104 /* Killer Wireless (3x3) */
105 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
109 .driver_data = ATH9K_PCI_KILLER },
110 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
114 .driver_data = ATH9K_PCI_KILLER },
116 { PCI_VDEVICE(ATHEROS, 0x0030) }, /* PCI-E AR9300 */
118 #ifdef CONFIG_ATH9K_PCOEM
120 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
122 PCI_VENDOR_ID_AZWAVE,
124 .driver_data = ATH9K_PCI_CUS198 | ATH9K_PCI_BT_ANT_DIV },
125 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
127 PCI_VENDOR_ID_AZWAVE,
129 .driver_data = ATH9K_PCI_CUS198 | ATH9K_PCI_BT_ANT_DIV },
130 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
132 PCI_VENDOR_ID_AZWAVE,
134 .driver_data = ATH9K_PCI_CUS198 | ATH9K_PCI_BT_ANT_DIV },
135 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
137 PCI_VENDOR_ID_AZWAVE,
139 .driver_data = ATH9K_PCI_CUS198 | ATH9K_PCI_BT_ANT_DIV },
142 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
144 PCI_VENDOR_ID_AZWAVE,
146 .driver_data = ATH9K_PCI_CUS230 | ATH9K_PCI_BT_ANT_DIV },
147 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
149 PCI_VENDOR_ID_FOXCONN,
151 .driver_data = ATH9K_PCI_CUS230 | ATH9K_PCI_BT_ANT_DIV },
154 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
156 PCI_VENDOR_ID_ATHEROS,
158 .driver_data = ATH9K_PCI_BT_ANT_DIV },
159 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
161 PCI_VENDOR_ID_ATHEROS,
163 .driver_data = ATH9K_PCI_BT_ANT_DIV },
164 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
168 .driver_data = ATH9K_PCI_BT_ANT_DIV },
169 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
173 .driver_data = ATH9K_PCI_BT_ANT_DIV },
174 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
176 PCI_VENDOR_ID_SAMSUNG,
178 .driver_data = ATH9K_PCI_BT_ANT_DIV },
179 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
181 PCI_VENDOR_ID_SAMSUNG,
183 .driver_data = ATH9K_PCI_BT_ANT_DIV },
184 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
186 PCI_VENDOR_ID_SAMSUNG,
188 .driver_data = ATH9K_PCI_BT_ANT_DIV },
189 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
191 PCI_VENDOR_ID_SAMSUNG,
193 .driver_data = ATH9K_PCI_BT_ANT_DIV },
194 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
196 PCI_VENDOR_ID_SAMSUNG,
198 .driver_data = ATH9K_PCI_BT_ANT_DIV },
199 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
201 PCI_VENDOR_ID_SAMSUNG,
203 .driver_data = ATH9K_PCI_BT_ANT_DIV },
204 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
206 PCI_VENDOR_ID_SAMSUNG,
208 .driver_data = ATH9K_PCI_BT_ANT_DIV },
209 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
211 PCI_VENDOR_ID_SAMSUNG,
213 .driver_data = ATH9K_PCI_BT_ANT_DIV },
214 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
216 PCI_VENDOR_ID_LENOVO,
218 .driver_data = ATH9K_PCI_BT_ANT_DIV },
219 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
221 PCI_VENDOR_ID_LENOVO,
223 .driver_data = ATH9K_PCI_BT_ANT_DIV },
225 /* AR9485 cards with PLL power-save disabled by default. */
226 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
228 PCI_VENDOR_ID_AZWAVE,
230 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
231 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
233 PCI_VENDOR_ID_AZWAVE,
235 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
236 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
240 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
241 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
245 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
246 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
250 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
251 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
253 PCI_VENDOR_ID_FOXCONN,
255 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
256 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
258 PCI_VENDOR_ID_FOXCONN,
260 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
261 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
265 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
266 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
270 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
271 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
275 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
276 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
278 PCI_VENDOR_ID_AZWAVE,
280 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
281 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
283 PCI_VENDOR_ID_AZWAVE,
285 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
286 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
288 PCI_VENDOR_ID_AZWAVE,
290 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
291 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
293 PCI_VENDOR_ID_AZWAVE,
295 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
296 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
300 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
301 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
305 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
306 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
308 PCI_VENDOR_ID_ASUSTEK,
310 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
313 { PCI_VDEVICE(ATHEROS, 0x0032) }, /* PCI-E AR9485 */
314 { PCI_VDEVICE(ATHEROS, 0x0033) }, /* PCI-E AR9580 */
316 #ifdef CONFIG_ATH9K_PCOEM
318 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
320 PCI_VENDOR_ID_AZWAVE,
322 .driver_data = ATH9K_PCI_CUS217 },
323 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
327 .driver_data = ATH9K_PCI_CUS217 },
329 /* AR9462 with WoW support */
330 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
332 PCI_VENDOR_ID_ATHEROS,
334 .driver_data = ATH9K_PCI_WOW },
335 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
337 PCI_VENDOR_ID_LENOVO,
339 .driver_data = ATH9K_PCI_WOW },
340 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
342 PCI_VENDOR_ID_ATTANSIC,
344 .driver_data = ATH9K_PCI_WOW },
345 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
347 PCI_VENDOR_ID_AZWAVE,
349 .driver_data = ATH9K_PCI_WOW },
350 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
352 PCI_VENDOR_ID_ASUSTEK,
354 .driver_data = ATH9K_PCI_WOW },
355 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
359 .driver_data = ATH9K_PCI_WOW },
360 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
364 .driver_data = ATH9K_PCI_WOW },
365 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
369 .driver_data = ATH9K_PCI_WOW },
370 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
374 .driver_data = ATH9K_PCI_WOW },
375 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
379 .driver_data = ATH9K_PCI_WOW },
380 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
382 0x10CF, /* Fujitsu */
384 .driver_data = ATH9K_PCI_WOW },
385 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
389 .driver_data = ATH9K_PCI_WOW },
390 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
394 .driver_data = ATH9K_PCI_WOW },
396 /* Killer Wireless (2x2) */
397 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
401 .driver_data = ATH9K_PCI_KILLER },
403 { PCI_VDEVICE(ATHEROS, 0x0034) }, /* PCI-E AR9462 */
404 { PCI_VDEVICE(ATHEROS, 0x0037) }, /* PCI-E AR1111/AR9485 */
407 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
409 PCI_VENDOR_ID_ATHEROS,
411 .driver_data = ATH9K_PCI_CUS252 |
412 ATH9K_PCI_AR9565_2ANT |
413 ATH9K_PCI_BT_ANT_DIV },
414 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
416 PCI_VENDOR_ID_AZWAVE,
418 .driver_data = ATH9K_PCI_CUS252 |
419 ATH9K_PCI_AR9565_2ANT |
420 ATH9K_PCI_BT_ANT_DIV },
423 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
425 PCI_VENDOR_ID_FOXCONN,
427 .driver_data = ATH9K_PCI_AR9565_1ANT },
428 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
432 .driver_data = ATH9K_PCI_AR9565_1ANT },
433 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
437 .driver_data = ATH9K_PCI_AR9565_1ANT },
438 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
442 .driver_data = ATH9K_PCI_AR9565_1ANT },
443 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
447 .driver_data = ATH9K_PCI_AR9565_1ANT },
448 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
452 .driver_data = ATH9K_PCI_AR9565_1ANT },
453 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
457 .driver_data = ATH9K_PCI_AR9565_1ANT },
458 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
462 .driver_data = ATH9K_PCI_AR9565_1ANT },
463 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
467 .driver_data = ATH9K_PCI_AR9565_1ANT },
468 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
472 .driver_data = ATH9K_PCI_AR9565_1ANT },
473 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
477 .driver_data = ATH9K_PCI_AR9565_1ANT },
478 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
480 PCI_VENDOR_ID_AZWAVE,
482 .driver_data = ATH9K_PCI_AR9565_1ANT },
483 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
485 PCI_VENDOR_ID_AZWAVE,
487 .driver_data = ATH9K_PCI_AR9565_1ANT },
489 /* WB335 1-ANT / Antenna Diversity */
490 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
492 PCI_VENDOR_ID_ATHEROS,
494 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
495 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
497 PCI_VENDOR_ID_ATHEROS,
499 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
500 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
502 PCI_VENDOR_ID_ATHEROS,
504 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
505 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
507 PCI_VENDOR_ID_FOXCONN,
509 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
510 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
514 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
515 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
519 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
520 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
524 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
525 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
529 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
530 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
534 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
535 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
539 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
540 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
542 PCI_VENDOR_ID_AZWAVE,
544 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
545 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
547 PCI_VENDOR_ID_AZWAVE,
549 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
550 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
554 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
555 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
559 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
560 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
564 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
565 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
569 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
571 /* WB335 2-ANT / Antenna-Diversity */
572 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
574 PCI_VENDOR_ID_SAMSUNG,
576 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
577 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
579 PCI_VENDOR_ID_SAMSUNG,
581 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
582 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
584 PCI_VENDOR_ID_SAMSUNG,
586 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
587 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
589 PCI_VENDOR_ID_SAMSUNG,
591 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
592 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
594 PCI_VENDOR_ID_SAMSUNG,
596 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
597 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
599 PCI_VENDOR_ID_SAMSUNG,
601 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
602 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
604 PCI_VENDOR_ID_SAMSUNG,
606 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
607 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
609 PCI_VENDOR_ID_ATHEROS,
611 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
612 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
614 PCI_VENDOR_ID_ATHEROS,
616 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
617 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
621 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
622 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
626 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
627 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
631 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
632 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
636 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
637 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
641 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
642 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
646 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
647 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
651 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
652 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
656 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
657 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
659 PCI_VENDOR_ID_AZWAVE,
661 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
662 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
664 PCI_VENDOR_ID_AZWAVE,
666 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
667 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
669 PCI_VENDOR_ID_AZWAVE,
671 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
672 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
674 PCI_VENDOR_ID_AZWAVE,
676 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
677 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
679 PCI_VENDOR_ID_AZWAVE,
681 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
682 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
684 PCI_VENDOR_ID_AZWAVE,
686 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
687 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
691 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
692 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
696 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
697 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
701 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
702 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
706 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
707 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
711 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
712 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
716 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
717 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
721 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
722 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
724 PCI_VENDOR_ID_FOXCONN,
726 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
727 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
729 PCI_VENDOR_ID_FOXCONN,
731 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
732 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
734 PCI_VENDOR_ID_FOXCONN,
736 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
737 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
739 PCI_VENDOR_ID_FOXCONN,
741 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
742 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
744 PCI_VENDOR_ID_FOXCONN,
746 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
747 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
749 PCI_VENDOR_ID_LENOVO,
751 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
752 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
754 PCI_VENDOR_ID_LENOVO,
756 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
757 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
759 PCI_VENDOR_ID_ASUSTEK,
761 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
762 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
766 .driver_data = ATH9K_PCI_AR9565_2ANT |
767 ATH9K_PCI_BT_ANT_DIV |
768 ATH9K_PCI_LED_ACT_HI},
770 /* PCI-E AR9565 (WB335) */
771 { PCI_VDEVICE(ATHEROS, 0x0036),
772 .driver_data = ATH9K_PCI_BT_ANT_DIV },
779 /* return bus cachesize in 4B word units */
780 static void ath_pci_read_cachesize(struct ath_common *common, int *csz)
782 struct ath_softc *sc = common->priv;
785 pci_read_config_byte(to_pci_dev(sc->dev), PCI_CACHE_LINE_SIZE, &u8tmp);
789 * This check was put in to avoid "unpleasant" consequences if
790 * the bootrom has not fully initialized all PCI devices.
791 * Sometimes the cache line size register is not set
795 *csz = DEFAULT_CACHELINE >> 2; /* Use the default size */
798 static bool ath_pci_eeprom_read(struct ath_common *common, u32 off, u16 *data)
800 struct ath_hw *ah = common->ah;
802 common->ops->read(ah, AR5416_EEPROM_OFFSET + (off << AR5416_EEPROM_S));
804 if (!ath9k_hw_wait(ah,
805 AR_EEPROM_STATUS_DATA(ah),
806 AR_EEPROM_STATUS_DATA_BUSY |
807 AR_EEPROM_STATUS_DATA_PROT_ACCESS, 0,
812 *data = MS(common->ops->read(ah, AR_EEPROM_STATUS_DATA(ah)),
813 AR_EEPROM_STATUS_DATA_VAL);
818 /* Need to be called after we discover btcoex capabilities */
819 static void ath_pci_aspm_init(struct ath_common *common)
821 struct ath_softc *sc = common->priv;
822 struct ath_hw *ah = sc->sc_ah;
823 struct pci_dev *pdev = to_pci_dev(sc->dev);
824 struct pci_dev *parent;
828 if (!ah->is_pciexpress)
831 parent = pdev->bus->self;
835 if ((ath9k_hw_get_btcoex_scheme(ah) != ATH_BTCOEX_CFG_NONE) &&
836 (AR_SREV_9285(ah))) {
837 /* Bluetooth coexistence requires disabling ASPM. */
838 pcie_capability_clear_word(pdev, PCI_EXP_LNKCTL,
839 PCI_EXP_LNKCTL_ASPM_L0S | PCI_EXP_LNKCTL_ASPM_L1);
842 * Both upstream and downstream PCIe components should
843 * have the same ASPM settings.
845 pcie_capability_clear_word(parent, PCI_EXP_LNKCTL,
846 PCI_EXP_LNKCTL_ASPM_L0S | PCI_EXP_LNKCTL_ASPM_L1);
848 ath_info(common, "Disabling ASPM since BTCOEX is enabled\n");
853 * 0x70c - Ack Frequency Register.
855 * Bits 27:29 - DEFAULT_L1_ENTRANCE_LATENCY.
865 if (AR_SREV_9462(ah))
866 pci_read_config_dword(pdev, 0x70c, &ah->config.aspm_l1_fix);
868 ret = pcie_capability_read_word(parent, PCI_EXP_LNKCTL, &aspm);
869 if (!ret && (aspm & (PCI_EXP_LNKCTL_ASPM_L0S | PCI_EXP_LNKCTL_ASPM_L1))) {
870 ah->aspm_enabled = true;
871 /* Initialize PCIe PM and SERDES registers. */
872 ath9k_hw_configpcipowersave(ah, false);
873 ath_info(common, "ASPM enabled: 0x%x\n", aspm);
877 static const struct ath_bus_ops ath_pci_bus_ops = {
878 .ath_bus_type = ATH_PCI,
879 .read_cachesize = ath_pci_read_cachesize,
880 .eeprom_read = ath_pci_eeprom_read,
881 .aspm_init = ath_pci_aspm_init,
884 static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
886 struct ath_softc *sc;
887 struct ieee80211_hw *hw;
894 if (pcim_enable_device(pdev))
897 ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
899 pr_err("32-bit DMA not available\n");
904 * Cache line size is used to size and align various
905 * structures used to communicate with the hardware.
907 pci_read_config_byte(pdev, PCI_CACHE_LINE_SIZE, &csz);
910 * Linux 2.4.18 (at least) writes the cache line size
911 * register as a 16-bit wide register which is wrong.
912 * We must have this setup properly for rx buffer
913 * DMA to work so force a reasonable value here if it
916 csz = L1_CACHE_BYTES / sizeof(u32);
917 pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, csz);
920 * The default setting of latency timer yields poor results,
921 * set it to the value used by other systems. It may be worth
922 * tweaking this setting more.
924 pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0xa8);
926 pci_set_master(pdev);
929 * Disable the RETRY_TIMEOUT register (0x41) to keep
930 * PCI Tx retries from interfering with C3 CPU state.
932 pci_read_config_dword(pdev, 0x40, &val);
933 if ((val & 0x0000ff00) != 0)
934 pci_write_config_dword(pdev, 0x40, val & 0xffff00ff);
936 ret = pcim_iomap_regions(pdev, BIT(0), "ath9k");
938 dev_err(&pdev->dev, "PCI memory region reserve error\n");
942 ath9k_fill_chanctx_ops();
943 hw = ieee80211_alloc_hw(sizeof(struct ath_softc), &ath9k_ops);
945 dev_err(&pdev->dev, "No memory for ieee80211_hw\n");
949 SET_IEEE80211_DEV(hw, &pdev->dev);
950 pci_set_drvdata(pdev, hw);
954 sc->dev = &pdev->dev;
955 sc->mem = pcim_iomap_table(pdev)[0];
956 sc->driver_data = id->driver_data;
959 if (pci_enable_msi(pdev) == 0) {
961 dev_err(&pdev->dev, "Using MSI\n");
963 dev_err(&pdev->dev, "Using INTx\n");
968 ret = request_irq(pdev->irq, ath_isr, IRQF_SHARED, "ath9k", sc);
970 ret = request_irq(pdev->irq, ath_isr, 0, "ath9k", sc);
973 dev_err(&pdev->dev, "request_irq failed\n");
979 ret = ath9k_init_device(id->device, sc, &ath_pci_bus_ops);
981 dev_err(&pdev->dev, "Failed to initialize device\n");
985 sc->sc_ah->msi_enabled = msi_enabled;
986 sc->sc_ah->msi_reg = 0;
988 ath9k_hw_name(sc->sc_ah, hw_name, sizeof(hw_name));
989 wiphy_info(hw->wiphy, "%s mem=0x%p, irq=%d\n",
990 hw_name, sc->mem, pdev->irq);
995 free_irq(sc->irq, sc);
997 ieee80211_free_hw(hw);
1001 static void ath_pci_remove(struct pci_dev *pdev)
1003 struct ieee80211_hw *hw = pci_get_drvdata(pdev);
1004 struct ath_softc *sc = hw->priv;
1006 if (!is_ath9k_unloaded)
1007 sc->sc_ah->ah_flags |= AH_UNPLUGGED;
1008 ath9k_deinit_device(sc);
1009 free_irq(sc->irq, sc);
1010 ieee80211_free_hw(sc->hw);
1013 #ifdef CONFIG_PM_SLEEP
1015 static int ath_pci_suspend(struct device *device)
1017 struct ieee80211_hw *hw = dev_get_drvdata(device);
1018 struct ath_softc *sc = hw->priv;
1019 struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1021 if (test_bit(ATH_OP_WOW_ENABLED, &common->op_flags)) {
1022 dev_info(device, "WOW is enabled, bypassing PCI suspend\n");
1026 /* The device has to be moved to FULLSLEEP forcibly.
1027 * Otherwise the chip never moved to full sleep,
1028 * when no interface is up.
1030 ath9k_stop_btcoex(sc);
1031 ath9k_hw_disable(sc->sc_ah);
1032 del_timer_sync(&sc->sleep_timer);
1033 ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_FULL_SLEEP);
1038 static int ath_pci_resume(struct device *device)
1040 struct pci_dev *pdev = to_pci_dev(device);
1041 struct ieee80211_hw *hw = pci_get_drvdata(pdev);
1042 struct ath_softc *sc = hw->priv;
1043 struct ath_hw *ah = sc->sc_ah;
1044 struct ath_common *common = ath9k_hw_common(ah);
1048 * Suspend/Resume resets the PCI configuration space, so we have to
1049 * re-disable the RETRY_TIMEOUT register (0x41) to keep
1050 * PCI Tx retries from interfering with C3 CPU state
1052 pci_read_config_dword(pdev, 0x40, &val);
1053 if ((val & 0x0000ff00) != 0)
1054 pci_write_config_dword(pdev, 0x40, val & 0xffff00ff);
1056 ath_pci_aspm_init(common);
1057 ah->reset_power_on = false;
1062 static SIMPLE_DEV_PM_OPS(ath9k_pm_ops, ath_pci_suspend, ath_pci_resume);
1064 #define ATH9K_PM_OPS (&ath9k_pm_ops)
1066 #else /* !CONFIG_PM_SLEEP */
1068 #define ATH9K_PM_OPS NULL
1070 #endif /* !CONFIG_PM_SLEEP */
1073 MODULE_DEVICE_TABLE(pci, ath_pci_id_table);
1075 static struct pci_driver ath_pci_driver = {
1077 .id_table = ath_pci_id_table,
1078 .probe = ath_pci_probe,
1079 .remove = ath_pci_remove,
1080 .driver.pm = ATH9K_PM_OPS,
1083 int ath_pci_init(void)
1085 return pci_register_driver(&ath_pci_driver);
1088 void ath_pci_exit(void)
1090 pci_unregister_driver(&ath_pci_driver);