1/*
2 * Copyright (c) 2008-2011 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#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
18
19#include <linux/nl80211.h>
20#include <linux/pci.h>
21#include <linux/module.h>
22#include "ath9k.h"
23
24static 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   */
28
29#ifdef CONFIG_ATH9K_PCOEM
30	/* Mini PCI AR9220 MB92 cards: Compex WLM200NX, Wistron DNMA-92 */
31	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
32			 0x0029,
33			 PCI_VENDOR_ID_ATHEROS,
34			 0x2096),
35	  .driver_data = ATH9K_PCI_LED_ACT_HI },
36#endif
37
38	{ PCI_VDEVICE(ATHEROS, 0x0029) }, /* PCI   */
39
40#ifdef CONFIG_ATH9K_PCOEM
41	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
42			 0x002A,
43			 PCI_VENDOR_ID_AZWAVE,
44			 0x1C71),
45	  .driver_data = ATH9K_PCI_D3_L1_WAR },
46	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
47			 0x002A,
48			 PCI_VENDOR_ID_FOXCONN,
49			 0xE01F),
50	  .driver_data = ATH9K_PCI_D3_L1_WAR },
51	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
52			 0x002A,
53			 0x11AD, /* LITEON */
54			 0x6632),
55	  .driver_data = ATH9K_PCI_D3_L1_WAR },
56	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
57			 0x002A,
58			 0x11AD, /* LITEON */
59			 0x6642),
60	  .driver_data = ATH9K_PCI_D3_L1_WAR },
61	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
62			 0x002A,
63			 PCI_VENDOR_ID_QMI,
64			 0x0306),
65	  .driver_data = ATH9K_PCI_D3_L1_WAR },
66	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
67			 0x002A,
68			 0x185F, /* WNC */
69			 0x309D),
70	  .driver_data = ATH9K_PCI_D3_L1_WAR },
71	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
72			 0x002A,
73			 0x10CF, /* Fujitsu */
74			 0x147C),
75	  .driver_data = ATH9K_PCI_D3_L1_WAR },
76	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
77			 0x002A,
78			 0x10CF, /* Fujitsu */
79			 0x147D),
80	  .driver_data = ATH9K_PCI_D3_L1_WAR },
81	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
82			 0x002A,
83			 0x10CF, /* Fujitsu */
84			 0x1536),
85	  .driver_data = ATH9K_PCI_D3_L1_WAR },
86#endif
87
88	{ PCI_VDEVICE(ATHEROS, 0x002A) }, /* PCI-E */
89
90#ifdef CONFIG_ATH9K_PCOEM
91	/* AR9285 card for Asus */
92	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
93			 0x002B,
94			 PCI_VENDOR_ID_AZWAVE,
95			 0x2C37),
96	  .driver_data = ATH9K_PCI_BT_ANT_DIV },
97#endif
98
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 */
103
104	/* Killer Wireless (3x3) */
105	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
106			 0x0030,
107			 0x1A56,
108			 0x2000),
109	  .driver_data = ATH9K_PCI_KILLER },
110	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
111			 0x0030,
112			 0x1A56,
113			 0x2001),
114	  .driver_data = ATH9K_PCI_KILLER },
115
116	{ PCI_VDEVICE(ATHEROS, 0x0030) }, /* PCI-E  AR9300 */
117
118#ifdef CONFIG_ATH9K_PCOEM
119	/* PCI-E CUS198 */
120	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
121			 0x0032,
122			 PCI_VENDOR_ID_AZWAVE,
123			 0x2086),
124	  .driver_data = ATH9K_PCI_CUS198 | ATH9K_PCI_BT_ANT_DIV },
125	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
126			 0x0032,
127			 PCI_VENDOR_ID_AZWAVE,
128			 0x1237),
129	  .driver_data = ATH9K_PCI_CUS198 | ATH9K_PCI_BT_ANT_DIV },
130	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
131			 0x0032,
132			 PCI_VENDOR_ID_AZWAVE,
133			 0x2126),
134	  .driver_data = ATH9K_PCI_CUS198 | ATH9K_PCI_BT_ANT_DIV },
135	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
136			 0x0032,
137			 PCI_VENDOR_ID_AZWAVE,
138			 0x126A),
139	  .driver_data = ATH9K_PCI_CUS198 | ATH9K_PCI_BT_ANT_DIV },
140
141	/* PCI-E CUS230 */
142	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
143			 0x0032,
144			 PCI_VENDOR_ID_AZWAVE,
145			 0x2152),
146	  .driver_data = ATH9K_PCI_CUS230 | ATH9K_PCI_BT_ANT_DIV },
147	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
148			 0x0032,
149			 PCI_VENDOR_ID_FOXCONN,
150			 0xE075),
151	  .driver_data = ATH9K_PCI_CUS230 | ATH9K_PCI_BT_ANT_DIV },
152
153	/* WB225 */
154	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
155			 0x0032,
156			 PCI_VENDOR_ID_ATHEROS,
157			 0x3119),
158	  .driver_data = ATH9K_PCI_BT_ANT_DIV },
159	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
160			 0x0032,
161			 PCI_VENDOR_ID_ATHEROS,
162			 0x3122),
163	  .driver_data = ATH9K_PCI_BT_ANT_DIV },
164	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
165			 0x0032,
166			 0x185F, /* WNC */
167			 0x3119),
168	  .driver_data = ATH9K_PCI_BT_ANT_DIV },
169	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
170			 0x0032,
171			 0x185F, /* WNC */
172			 0x3027),
173	  .driver_data = ATH9K_PCI_BT_ANT_DIV },
174	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
175			 0x0032,
176			 PCI_VENDOR_ID_SAMSUNG,
177			 0x4105),
178	  .driver_data = ATH9K_PCI_BT_ANT_DIV },
179	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
180			 0x0032,
181			 PCI_VENDOR_ID_SAMSUNG,
182			 0x4106),
183	  .driver_data = ATH9K_PCI_BT_ANT_DIV },
184	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
185			 0x0032,
186			 PCI_VENDOR_ID_SAMSUNG,
187			 0x410D),
188	  .driver_data = ATH9K_PCI_BT_ANT_DIV },
189	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
190			 0x0032,
191			 PCI_VENDOR_ID_SAMSUNG,
192			 0x410E),
193	  .driver_data = ATH9K_PCI_BT_ANT_DIV },
194	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
195			 0x0032,
196			 PCI_VENDOR_ID_SAMSUNG,
197			 0x410F),
198	  .driver_data = ATH9K_PCI_BT_ANT_DIV },
199	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
200			 0x0032,
201			 PCI_VENDOR_ID_SAMSUNG,
202			 0xC706),
203	  .driver_data = ATH9K_PCI_BT_ANT_DIV },
204	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
205			 0x0032,
206			 PCI_VENDOR_ID_SAMSUNG,
207			 0xC680),
208	  .driver_data = ATH9K_PCI_BT_ANT_DIV },
209	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
210			 0x0032,
211			 PCI_VENDOR_ID_SAMSUNG,
212			 0xC708),
213	  .driver_data = ATH9K_PCI_BT_ANT_DIV },
214	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
215			 0x0032,
216			 PCI_VENDOR_ID_LENOVO,
217			 0x3218),
218	  .driver_data = ATH9K_PCI_BT_ANT_DIV },
219	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
220			 0x0032,
221			 PCI_VENDOR_ID_LENOVO,
222			 0x3219),
223	  .driver_data = ATH9K_PCI_BT_ANT_DIV },
224
225	/* AR9485 cards with PLL power-save disabled by default. */
226	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
227			 0x0032,
228			 PCI_VENDOR_ID_AZWAVE,
229			 0x2C97),
230	  .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
231	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
232			 0x0032,
233			 PCI_VENDOR_ID_AZWAVE,
234			 0x2100),
235	  .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
236	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
237			 0x0032,
238			 0x1C56, /* ASKEY */
239			 0x4001),
240	  .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
241	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
242			 0x0032,
243			 0x11AD, /* LITEON */
244			 0x6627),
245	  .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
246	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
247			 0x0032,
248			 0x11AD, /* LITEON */
249			 0x6628),
250	  .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
251	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
252			 0x0032,
253			 PCI_VENDOR_ID_FOXCONN,
254			 0xE04E),
255	  .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
256	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
257			 0x0032,
258			 PCI_VENDOR_ID_FOXCONN,
259			 0xE04F),
260	  .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
261	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
262			 0x0032,
263			 0x144F, /* ASKEY */
264			 0x7197),
265	  .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
266	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
267			 0x0032,
268			 0x1B9A, /* XAVI */
269			 0x2000),
270	  .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
271	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
272			 0x0032,
273			 0x1B9A, /* XAVI */
274			 0x2001),
275	  .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
276	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
277			 0x0032,
278			 PCI_VENDOR_ID_AZWAVE,
279			 0x1186),
280	  .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
281	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
282			 0x0032,
283			 PCI_VENDOR_ID_AZWAVE,
284			 0x1F86),
285	  .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
286	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
287			 0x0032,
288			 PCI_VENDOR_ID_AZWAVE,
289			 0x1195),
290	  .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
291	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
292			 0x0032,
293			 PCI_VENDOR_ID_AZWAVE,
294			 0x1F95),
295	  .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
296	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
297			 0x0032,
298			 0x1B9A, /* XAVI */
299			 0x1C00),
300	  .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
301	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
302			 0x0032,
303			 0x1B9A, /* XAVI */
304			 0x1C01),
305	  .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
306	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
307			 0x0032,
308			 PCI_VENDOR_ID_ASUSTEK,
309			 0x850D),
310	  .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
311#endif
312
313	{ PCI_VDEVICE(ATHEROS, 0x0032) }, /* PCI-E  AR9485 */
314	{ PCI_VDEVICE(ATHEROS, 0x0033) }, /* PCI-E  AR9580 */
315
316#ifdef CONFIG_ATH9K_PCOEM
317	/* PCI-E CUS217 */
318	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
319			 0x0034,
320			 PCI_VENDOR_ID_AZWAVE,
321			 0x2116),
322	  .driver_data = ATH9K_PCI_CUS217 },
323	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
324			 0x0034,
325			 0x11AD, /* LITEON */
326			 0x6661),
327	  .driver_data = ATH9K_PCI_CUS217 },
328
329	/* AR9462 with WoW support */
330	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
331			 0x0034,
332			 PCI_VENDOR_ID_ATHEROS,
333			 0x3117),
334	  .driver_data = ATH9K_PCI_WOW },
335	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
336			 0x0034,
337			 PCI_VENDOR_ID_LENOVO,
338			 0x3214),
339	  .driver_data = ATH9K_PCI_WOW },
340	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
341			 0x0034,
342			 PCI_VENDOR_ID_ATTANSIC,
343			 0x0091),
344	  .driver_data = ATH9K_PCI_WOW },
345	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
346			 0x0034,
347			 PCI_VENDOR_ID_AZWAVE,
348			 0x2110),
349	  .driver_data = ATH9K_PCI_WOW },
350	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
351			 0x0034,
352			 PCI_VENDOR_ID_ASUSTEK,
353			 0x850E),
354	  .driver_data = ATH9K_PCI_WOW },
355	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
356			 0x0034,
357			 0x11AD, /* LITEON */
358			 0x6631),
359	  .driver_data = ATH9K_PCI_WOW },
360	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
361			 0x0034,
362			 0x11AD, /* LITEON */
363			 0x6641),
364	  .driver_data = ATH9K_PCI_WOW },
365	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
366			 0x0034,
367			 PCI_VENDOR_ID_HP,
368			 0x1864),
369	  .driver_data = ATH9K_PCI_WOW },
370	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
371			 0x0034,
372			 0x14CD, /* USI */
373			 0x0063),
374	  .driver_data = ATH9K_PCI_WOW },
375	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
376			 0x0034,
377			 0x14CD, /* USI */
378			 0x0064),
379	  .driver_data = ATH9K_PCI_WOW },
380	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
381			 0x0034,
382			 0x10CF, /* Fujitsu */
383			 0x1783),
384	  .driver_data = ATH9K_PCI_WOW },
385	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
386			 0x0034,
387			 PCI_VENDOR_ID_DELL,
388			 0x020B),
389	  .driver_data = ATH9K_PCI_WOW },
390	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
391			 0x0034,
392			 PCI_VENDOR_ID_DELL,
393			 0x0300),
394	  .driver_data = ATH9K_PCI_WOW },
395
396	/* Killer Wireless (2x2) */
397	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
398			 0x0030,
399			 0x1A56,
400			 0x2003),
401	  .driver_data = ATH9K_PCI_KILLER },
402
403	{ PCI_VDEVICE(ATHEROS, 0x0034) }, /* PCI-E  AR9462 */
404	{ PCI_VDEVICE(ATHEROS, 0x0037) }, /* PCI-E  AR1111/AR9485 */
405
406	/* CUS252 */
407	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
408			 0x0036,
409			 PCI_VENDOR_ID_ATHEROS,
410			 0x3028),
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,
415			 0x0036,
416			 PCI_VENDOR_ID_AZWAVE,
417			 0x2176),
418	  .driver_data = ATH9K_PCI_CUS252 |
419			 ATH9K_PCI_AR9565_2ANT |
420			 ATH9K_PCI_BT_ANT_DIV },
421
422	/* WB335 1-ANT */
423	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
424			 0x0036,
425			 PCI_VENDOR_ID_FOXCONN,
426			 0xE068),
427	  .driver_data = ATH9K_PCI_AR9565_1ANT },
428	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
429			 0x0036,
430			 0x185F, /* WNC */
431			 0xA119),
432	  .driver_data = ATH9K_PCI_AR9565_1ANT },
433	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
434			 0x0036,
435			 0x11AD, /* LITEON */
436			 0x0632),
437	  .driver_data = ATH9K_PCI_AR9565_1ANT },
438	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
439			 0x0036,
440			 0x11AD, /* LITEON */
441			 0x06B2),
442	  .driver_data = ATH9K_PCI_AR9565_1ANT },
443	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
444			 0x0036,
445			 0x11AD, /* LITEON */
446			 0x0842),
447	  .driver_data = ATH9K_PCI_AR9565_1ANT },
448	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
449			 0x0036,
450			 0x11AD, /* LITEON */
451			 0x1842),
452	  .driver_data = ATH9K_PCI_AR9565_1ANT },
453	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
454			 0x0036,
455			 0x11AD, /* LITEON */
456			 0x6671),
457	  .driver_data = ATH9K_PCI_AR9565_1ANT },
458	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
459			 0x0036,
460			 0x1B9A, /* XAVI */
461			 0x2811),
462	  .driver_data = ATH9K_PCI_AR9565_1ANT },
463	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
464			 0x0036,
465			 0x1B9A, /* XAVI */
466			 0x2812),
467	  .driver_data = ATH9K_PCI_AR9565_1ANT },
468	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
469			 0x0036,
470			 0x1B9A, /* XAVI */
471			 0x28A1),
472	  .driver_data = ATH9K_PCI_AR9565_1ANT },
473	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
474			 0x0036,
475			 0x1B9A, /* XAVI */
476			 0x28A3),
477	  .driver_data = ATH9K_PCI_AR9565_1ANT },
478	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
479			 0x0036,
480			 PCI_VENDOR_ID_AZWAVE,
481			 0x218A),
482	  .driver_data = ATH9K_PCI_AR9565_1ANT },
483	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
484			 0x0036,
485			 PCI_VENDOR_ID_AZWAVE,
486			 0x2F8A),
487	  .driver_data = ATH9K_PCI_AR9565_1ANT },
488
489	/* WB335 1-ANT / Antenna Diversity */
490	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
491			 0x0036,
492			 PCI_VENDOR_ID_ATHEROS,
493			 0x3025),
494	  .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
495	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
496			 0x0036,
497			 PCI_VENDOR_ID_ATHEROS,
498			 0x3026),
499	  .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
500	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
501			 0x0036,
502			 PCI_VENDOR_ID_ATHEROS,
503			 0x302B),
504	  .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
505	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
506			 0x0036,
507			 PCI_VENDOR_ID_FOXCONN,
508			 0xE069),
509	  .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
510	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
511			 0x0036,
512			 0x185F, /* WNC */
513			 0x3028),
514	  .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
515	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
516			 0x0036,
517			 0x11AD, /* LITEON */
518			 0x0622),
519	  .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
520	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
521			 0x0036,
522			 0x11AD, /* LITEON */
523			 0x0672),
524	  .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
525	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
526			 0x0036,
527			 0x11AD, /* LITEON */
528			 0x0662),
529	  .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
530	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
531			 0x0036,
532			 0x11AD, /* LITEON */
533			 0x06A2),
534	  .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
535	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
536			 0x0036,
537			 0x11AD, /* LITEON */
538			 0x0682),
539	  .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
540	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
541			 0x0036,
542			 PCI_VENDOR_ID_AZWAVE,
543			 0x213A),
544	  .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
545	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
546			 0x0036,
547			 PCI_VENDOR_ID_AZWAVE,
548			 0x213C),
549	  .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
550	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
551			 0x0036,
552			 PCI_VENDOR_ID_HP,
553			 0x18E3),
554	  .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
555	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
556			 0x0036,
557			 PCI_VENDOR_ID_HP,
558			 0x217F),
559	  .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
560	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
561			 0x0036,
562			 PCI_VENDOR_ID_HP,
563			 0x2005),
564	  .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
565	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
566			 0x0036,
567			 PCI_VENDOR_ID_DELL,
568			 0x020C),
569	  .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
570
571	/* WB335 2-ANT / Antenna-Diversity */
572	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
573			 0x0036,
574			 PCI_VENDOR_ID_SAMSUNG,
575			 0x411A),
576	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
577	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
578			 0x0036,
579			 PCI_VENDOR_ID_SAMSUNG,
580			 0x411B),
581	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
582	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
583			 0x0036,
584			 PCI_VENDOR_ID_SAMSUNG,
585			 0x411C),
586	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
587	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
588			 0x0036,
589			 PCI_VENDOR_ID_SAMSUNG,
590			 0x411D),
591	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
592	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
593			 0x0036,
594			 PCI_VENDOR_ID_SAMSUNG,
595			 0x411E),
596	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
597	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
598			 0x0036,
599			 PCI_VENDOR_ID_SAMSUNG,
600			 0x4129),
601	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
602	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
603			 0x0036,
604			 PCI_VENDOR_ID_SAMSUNG,
605			 0x412A),
606	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
607	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
608			 0x0036,
609			 PCI_VENDOR_ID_ATHEROS,
610			 0x3027),
611	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
612	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
613			 0x0036,
614			 PCI_VENDOR_ID_ATHEROS,
615			 0x302C),
616	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
617	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
618			 0x0036,
619			 0x11AD, /* LITEON */
620			 0x0642),
621	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
622	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
623			 0x0036,
624			 0x11AD, /* LITEON */
625			 0x0652),
626	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
627	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
628			 0x0036,
629			 0x11AD, /* LITEON */
630			 0x0612),
631	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
632	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
633			 0x0036,
634			 0x11AD, /* LITEON */
635			 0x0832),
636	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
637	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
638			 0x0036,
639			 0x11AD, /* LITEON */
640			 0x1832),
641	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
642	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
643			 0x0036,
644			 0x11AD, /* LITEON */
645			 0x0692),
646	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
647	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
648			 0x0036,
649			 0x11AD, /* LITEON */
650			 0x0803),
651	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
652	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
653			 0x0036,
654			 0x11AD, /* LITEON */
655			 0x0813),
656	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
657	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
658			 0x0036,
659			 PCI_VENDOR_ID_AZWAVE,
660			 0x2130),
661	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
662	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
663			 0x0036,
664			 PCI_VENDOR_ID_AZWAVE,
665			 0x213B),
666	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
667	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
668			 0x0036,
669			 PCI_VENDOR_ID_AZWAVE,
670			 0x2182),
671	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
672	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
673			 0x0036,
674			 PCI_VENDOR_ID_AZWAVE,
675			 0x218B),
676	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
677	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
678			 0x0036,
679			 PCI_VENDOR_ID_AZWAVE,
680			 0x218C),
681	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
682	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
683			 0x0036,
684			 PCI_VENDOR_ID_AZWAVE,
685			 0x2F82),
686	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
687	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
688			 0x0036,
689			 0x144F, /* ASKEY */
690			 0x7202),
691	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
692	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
693			 0x0036,
694			 0x1B9A, /* XAVI */
695			 0x2810),
696	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
697	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
698			 0x0036,
699			 0x1B9A, /* XAVI */
700			 0x2813),
701	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
702	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
703			 0x0036,
704			 0x1B9A, /* XAVI */
705			 0x28A2),
706	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
707	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
708			 0x0036,
709			 0x1B9A, /* XAVI */
710			 0x28A4),
711	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
712	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
713			 0x0036,
714			 0x185F, /* WNC */
715			 0x3027),
716	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
717	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
718			 0x0036,
719			 0x185F, /* WNC */
720			 0xA120),
721	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
722	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
723			 0x0036,
724			 PCI_VENDOR_ID_FOXCONN,
725			 0xE07F),
726	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
727	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
728			 0x0036,
729			 PCI_VENDOR_ID_FOXCONN,
730			 0xE08F),
731	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
732	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
733			 0x0036,
734			 PCI_VENDOR_ID_FOXCONN,
735			 0xE081),
736	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
737	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
738			 0x0036,
739			 PCI_VENDOR_ID_FOXCONN,
740			 0xE091),
741	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
742	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
743			 0x0036,
744			 PCI_VENDOR_ID_FOXCONN,
745			 0xE099),
746	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
747	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
748			 0x0036,
749			 PCI_VENDOR_ID_LENOVO,
750			 0x3026),
751	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
752	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
753			 0x0036,
754			 PCI_VENDOR_ID_LENOVO,
755			 0x4026),
756	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
757	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
758			 0x0036,
759			 PCI_VENDOR_ID_ASUSTEK,
760			 0x85F2),
761	  .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
762	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
763			 0x0036,
764			 PCI_VENDOR_ID_DELL,
765			 0x020E),
766	  .driver_data = ATH9K_PCI_AR9565_2ANT |
767			 ATH9K_PCI_BT_ANT_DIV |
768			 ATH9K_PCI_LED_ACT_HI},
769
770	/* PCI-E AR9565 (WB335) */
771	{ PCI_VDEVICE(ATHEROS, 0x0036),
772	  .driver_data = ATH9K_PCI_BT_ANT_DIV },
773#endif
774
775	{ 0 }
776};
777
778
779/* return bus cachesize in 4B word units */
780static void ath_pci_read_cachesize(struct ath_common *common, int *csz)
781{
782	struct ath_softc *sc = common->priv;
783	u8 u8tmp;
784
785	pci_read_config_byte(to_pci_dev(sc->dev), PCI_CACHE_LINE_SIZE, &u8tmp);
786	*csz = (int)u8tmp;
787
788	/*
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
792	 */
793
794	if (*csz == 0)
795		*csz = DEFAULT_CACHELINE >> 2;   /* Use the default size */
796}
797
798static bool ath_pci_eeprom_read(struct ath_common *common, u32 off, u16 *data)
799{
800	struct ath_hw *ah = common->ah;
801
802	common->ops->read(ah, AR5416_EEPROM_OFFSET + (off << AR5416_EEPROM_S));
803
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,
808				AH_WAIT_TIMEOUT)) {
809		return false;
810	}
811
812	*data = MS(common->ops->read(ah, AR_EEPROM_STATUS_DATA(ah)),
813			AR_EEPROM_STATUS_DATA_VAL);
814
815	return true;
816}
817
818/* Need to be called after we discover btcoex capabilities */
819static void ath_pci_aspm_init(struct ath_common *common)
820{
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;
825	u16 aspm;
826	int ret;
827
828	if (!ah->is_pciexpress)
829		return;
830
831	parent = pdev->bus->self;
832	if (!parent)
833		return;
834
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);
840
841		/*
842		 * Both upstream and downstream PCIe components should
843		 * have the same ASPM settings.
844		 */
845		pcie_capability_clear_word(parent, PCI_EXP_LNKCTL,
846			PCI_EXP_LNKCTL_ASPM_L0S | PCI_EXP_LNKCTL_ASPM_L1);
847
848		ath_info(common, "Disabling ASPM since BTCOEX is enabled\n");
849		return;
850	}
851
852	/*
853	 * 0x70c - Ack Frequency Register.
854	 *
855	 * Bits 27:29 - DEFAULT_L1_ENTRANCE_LATENCY.
856	 *
857	 * 000 : 1 us
858	 * 001 : 2 us
859	 * 010 : 4 us
860	 * 011 : 8 us
861	 * 100 : 16 us
862	 * 101 : 32 us
863	 * 110/111 : 64 us
864	 */
865	if (AR_SREV_9462(ah))
866		pci_read_config_dword(pdev, 0x70c, &ah->config.aspm_l1_fix);
867
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);
874	}
875}
876
877static 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,
882};
883
884static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
885{
886	struct ath_softc *sc;
887	struct ieee80211_hw *hw;
888	u8 csz;
889	u32 val;
890	int ret = 0;
891	char hw_name[64];
892	int msi_enabled = 0;
893
894	if (pcim_enable_device(pdev))
895		return -EIO;
896
897	ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
898	if (ret) {
899		pr_err("32-bit DMA not available\n");
900		return ret;
901	}
902
903	/*
904	 * Cache line size is used to size and align various
905	 * structures used to communicate with the hardware.
906	 */
907	pci_read_config_byte(pdev, PCI_CACHE_LINE_SIZE, &csz);
908	if (csz == 0) {
909		/*
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
914		 * comes up zero.
915		 */
916		csz = L1_CACHE_BYTES / sizeof(u32);
917		pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, csz);
918	}
919	/*
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.
923	 */
924	pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0xa8);
925
926	pci_set_master(pdev);
927
928	/*
929	 * Disable the RETRY_TIMEOUT register (0x41) to keep
930	 * PCI Tx retries from interfering with C3 CPU state.
931	 */
932	pci_read_config_dword(pdev, 0x40, &val);
933	if ((val & 0x0000ff00) != 0)
934		pci_write_config_dword(pdev, 0x40, val & 0xffff00ff);
935
936	ret = pcim_iomap_regions(pdev, BIT(0), "ath9k");
937	if (ret) {
938		dev_err(&pdev->dev, "PCI memory region reserve error\n");
939		return -ENODEV;
940	}
941
942	ath9k_fill_chanctx_ops();
943	hw = ieee80211_alloc_hw(sizeof(struct ath_softc), &ath9k_ops);
944	if (!hw) {
945		dev_err(&pdev->dev, "No memory for ieee80211_hw\n");
946		return -ENOMEM;
947	}
948
949	SET_IEEE80211_DEV(hw, &pdev->dev);
950	pci_set_drvdata(pdev, hw);
951
952	sc = hw->priv;
953	sc->hw = hw;
954	sc->dev = &pdev->dev;
955	sc->mem = pcim_iomap_table(pdev)[0];
956	sc->driver_data = id->driver_data;
957
958	if (ath9k_use_msi) {
959		if (pci_enable_msi(pdev) == 0) {
960			msi_enabled = 1;
961			dev_err(&pdev->dev, "Using MSI\n");
962		} else {
963			dev_err(&pdev->dev, "Using INTx\n");
964		}
965	}
966
967	if (!msi_enabled)
968		ret = request_irq(pdev->irq, ath_isr, IRQF_SHARED, "ath9k", sc);
969	else
970		ret = request_irq(pdev->irq, ath_isr, 0, "ath9k", sc);
971
972	if (ret) {
973		dev_err(&pdev->dev, "request_irq failed\n");
974		goto err_irq;
975	}
976
977	sc->irq = pdev->irq;
978
979	ret = ath9k_init_device(id->device, sc, &ath_pci_bus_ops);
980	if (ret) {
981		dev_err(&pdev->dev, "Failed to initialize device\n");
982		goto err_init;
983	}
984
985	sc->sc_ah->msi_enabled = msi_enabled;
986	sc->sc_ah->msi_reg = 0;
987
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);
991
992	return 0;
993
994err_init:
995	free_irq(sc->irq, sc);
996err_irq:
997	ieee80211_free_hw(hw);
998	return ret;
999}
1000
1001static void ath_pci_remove(struct pci_dev *pdev)
1002{
1003	struct ieee80211_hw *hw = pci_get_drvdata(pdev);
1004	struct ath_softc *sc = hw->priv;
1005
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);
1011}
1012
1013#ifdef CONFIG_PM_SLEEP
1014
1015static int ath_pci_suspend(struct device *device)
1016{
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);
1020
1021	if (test_bit(ATH_OP_WOW_ENABLED, &common->op_flags)) {
1022		dev_info(device, "WOW is enabled, bypassing PCI suspend\n");
1023		return 0;
1024	}
1025
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.
1029	 */
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);
1034
1035	return 0;
1036}
1037
1038static int ath_pci_resume(struct device *device)
1039{
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);
1045	u32 val;
1046
1047	/*
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
1051	 */
1052	pci_read_config_dword(pdev, 0x40, &val);
1053	if ((val & 0x0000ff00) != 0)
1054		pci_write_config_dword(pdev, 0x40, val & 0xffff00ff);
1055
1056	ath_pci_aspm_init(common);
1057	ah->reset_power_on = false;
1058
1059	return 0;
1060}
1061
1062static SIMPLE_DEV_PM_OPS(ath9k_pm_ops, ath_pci_suspend, ath_pci_resume);
1063
1064#define ATH9K_PM_OPS	(&ath9k_pm_ops)
1065
1066#else /* !CONFIG_PM_SLEEP */
1067
1068#define ATH9K_PM_OPS	NULL
1069
1070#endif /* !CONFIG_PM_SLEEP */
1071
1072
1073MODULE_DEVICE_TABLE(pci, ath_pci_id_table);
1074
1075static struct pci_driver ath_pci_driver = {
1076	.name       = "ath9k",
1077	.id_table   = ath_pci_id_table,
1078	.probe      = ath_pci_probe,
1079	.remove     = ath_pci_remove,
1080	.driver.pm  = ATH9K_PM_OPS,
1081};
1082
1083int ath_pci_init(void)
1084{
1085	return pci_register_driver(&ath_pci_driver);
1086}
1087
1088void ath_pci_exit(void)
1089{
1090	pci_unregister_driver(&ath_pci_driver);
1091}
1092