Version:  2.0.40 2.2.26 2.4.37 3.11 3.12 3.13 3.14 3.15 3.16 3.17 3.18 3.19 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8

Linux/drivers/net/wireless/ath/ath9k/pci.c

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

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us