Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * Copyright (c) 2008-2011 Atheros Communications Inc.
0003  *
0004  * Permission to use, copy, modify, and/or distribute this software for any
0005  * purpose with or without fee is hereby granted, provided that the above
0006  * copyright notice and this permission notice appear in all copies.
0007  *
0008  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
0009  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
0010  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
0011  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
0012  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
0013  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
0014  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
0015  */
0016 
0017 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0018 
0019 #include <linux/nl80211.h>
0020 #include <linux/pci.h>
0021 #include <linux/module.h>
0022 #include "ath9k.h"
0023 
0024 extern int ath9k_use_msi;
0025 
0026 static const struct pci_device_id ath_pci_id_table[] = {
0027     { PCI_VDEVICE(ATHEROS, 0x0023) }, /* PCI   */
0028     { PCI_VDEVICE(ATHEROS, 0x0024) }, /* PCI-E */
0029     { PCI_VDEVICE(ATHEROS, 0x0027) }, /* PCI   */
0030 
0031 #ifdef CONFIG_ATH9K_PCOEM
0032     /* Mini PCI AR9220 MB92 cards: Compex WLM200NX, Wistron DNMA-92 */
0033     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0034              0x0029,
0035              PCI_VENDOR_ID_ATHEROS,
0036              0x2096),
0037       .driver_data = ATH9K_PCI_LED_ACT_HI },
0038 #endif
0039 
0040     { PCI_VDEVICE(ATHEROS, 0x0029) }, /* PCI   */
0041 
0042 #ifdef CONFIG_ATH9K_PCOEM
0043     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0044              0x002A,
0045              PCI_VENDOR_ID_AZWAVE,
0046              0x1C71),
0047       .driver_data = ATH9K_PCI_D3_L1_WAR },
0048     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0049              0x002A,
0050              PCI_VENDOR_ID_FOXCONN,
0051              0xE01F),
0052       .driver_data = ATH9K_PCI_D3_L1_WAR },
0053     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0054              0x002A,
0055              0x11AD, /* LITEON */
0056              0x6632),
0057       .driver_data = ATH9K_PCI_D3_L1_WAR },
0058     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0059              0x002A,
0060              0x11AD, /* LITEON */
0061              0x6642),
0062       .driver_data = ATH9K_PCI_D3_L1_WAR },
0063     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0064              0x002A,
0065              PCI_VENDOR_ID_QMI,
0066              0x0306),
0067       .driver_data = ATH9K_PCI_D3_L1_WAR },
0068     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0069              0x002A,
0070              0x185F, /* WNC */
0071              0x309D),
0072       .driver_data = ATH9K_PCI_D3_L1_WAR },
0073     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0074              0x002A,
0075              0x10CF, /* Fujitsu */
0076              0x147C),
0077       .driver_data = ATH9K_PCI_D3_L1_WAR },
0078     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0079              0x002A,
0080              0x10CF, /* Fujitsu */
0081              0x147D),
0082       .driver_data = ATH9K_PCI_D3_L1_WAR },
0083     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0084              0x002A,
0085              0x10CF, /* Fujitsu */
0086              0x1536),
0087       .driver_data = ATH9K_PCI_D3_L1_WAR },
0088 #endif
0089 
0090     { PCI_VDEVICE(ATHEROS, 0x002A) }, /* PCI-E */
0091 
0092 #ifdef CONFIG_ATH9K_PCOEM
0093     /* AR9285 card for Asus */
0094     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0095              0x002B,
0096              PCI_VENDOR_ID_AZWAVE,
0097              0x2C37),
0098       .driver_data = ATH9K_PCI_BT_ANT_DIV },
0099 #endif
0100 
0101     { PCI_VDEVICE(ATHEROS, 0x002B) }, /* PCI-E */
0102     { PCI_VDEVICE(ATHEROS, 0x002C) }, /* PCI-E 802.11n bonded out */
0103     { PCI_VDEVICE(ATHEROS, 0x002D) }, /* PCI   */
0104     { PCI_VDEVICE(ATHEROS, 0x002E) }, /* PCI-E */
0105 
0106     /* Killer Wireless (3x3) */
0107     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0108              0x0030,
0109              0x1A56,
0110              0x2000),
0111       .driver_data = ATH9K_PCI_KILLER },
0112     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0113              0x0030,
0114              0x1A56,
0115              0x2001),
0116       .driver_data = ATH9K_PCI_KILLER },
0117 
0118     { PCI_VDEVICE(ATHEROS, 0x0030) }, /* PCI-E  AR9300 */
0119 
0120 #ifdef CONFIG_ATH9K_PCOEM
0121     /* PCI-E CUS198 */
0122     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0123              0x0032,
0124              PCI_VENDOR_ID_AZWAVE,
0125              0x2086),
0126       .driver_data = ATH9K_PCI_CUS198 | ATH9K_PCI_BT_ANT_DIV },
0127     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0128              0x0032,
0129              PCI_VENDOR_ID_AZWAVE,
0130              0x1237),
0131       .driver_data = ATH9K_PCI_CUS198 | ATH9K_PCI_BT_ANT_DIV },
0132     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0133              0x0032,
0134              PCI_VENDOR_ID_AZWAVE,
0135              0x2126),
0136       .driver_data = ATH9K_PCI_CUS198 | ATH9K_PCI_BT_ANT_DIV },
0137     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0138              0x0032,
0139              PCI_VENDOR_ID_AZWAVE,
0140              0x126A),
0141       .driver_data = ATH9K_PCI_CUS198 | ATH9K_PCI_BT_ANT_DIV },
0142 
0143     /* PCI-E CUS230 */
0144     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0145              0x0032,
0146              PCI_VENDOR_ID_AZWAVE,
0147              0x2152),
0148       .driver_data = ATH9K_PCI_CUS230 | ATH9K_PCI_BT_ANT_DIV },
0149     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0150              0x0032,
0151              PCI_VENDOR_ID_FOXCONN,
0152              0xE075),
0153       .driver_data = ATH9K_PCI_CUS230 | ATH9K_PCI_BT_ANT_DIV },
0154 
0155     /* WB225 */
0156     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0157              0x0032,
0158              PCI_VENDOR_ID_ATHEROS,
0159              0x3119),
0160       .driver_data = ATH9K_PCI_BT_ANT_DIV },
0161     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0162              0x0032,
0163              PCI_VENDOR_ID_ATHEROS,
0164              0x3122),
0165       .driver_data = ATH9K_PCI_BT_ANT_DIV },
0166     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0167              0x0032,
0168              0x185F, /* WNC */
0169              0x3119),
0170       .driver_data = ATH9K_PCI_BT_ANT_DIV },
0171     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0172              0x0032,
0173              0x185F, /* WNC */
0174              0x3027),
0175       .driver_data = ATH9K_PCI_BT_ANT_DIV },
0176     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0177              0x0032,
0178              PCI_VENDOR_ID_SAMSUNG,
0179              0x4105),
0180       .driver_data = ATH9K_PCI_BT_ANT_DIV },
0181     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0182              0x0032,
0183              PCI_VENDOR_ID_SAMSUNG,
0184              0x4106),
0185       .driver_data = ATH9K_PCI_BT_ANT_DIV },
0186     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0187              0x0032,
0188              PCI_VENDOR_ID_SAMSUNG,
0189              0x410D),
0190       .driver_data = ATH9K_PCI_BT_ANT_DIV },
0191     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0192              0x0032,
0193              PCI_VENDOR_ID_SAMSUNG,
0194              0x410E),
0195       .driver_data = ATH9K_PCI_BT_ANT_DIV },
0196     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0197              0x0032,
0198              PCI_VENDOR_ID_SAMSUNG,
0199              0x410F),
0200       .driver_data = ATH9K_PCI_BT_ANT_DIV },
0201     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0202              0x0032,
0203              PCI_VENDOR_ID_SAMSUNG,
0204              0xC706),
0205       .driver_data = ATH9K_PCI_BT_ANT_DIV },
0206     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0207              0x0032,
0208              PCI_VENDOR_ID_SAMSUNG,
0209              0xC680),
0210       .driver_data = ATH9K_PCI_BT_ANT_DIV },
0211     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0212              0x0032,
0213              PCI_VENDOR_ID_SAMSUNG,
0214              0xC708),
0215       .driver_data = ATH9K_PCI_BT_ANT_DIV },
0216     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0217              0x0032,
0218              PCI_VENDOR_ID_LENOVO,
0219              0x3218),
0220       .driver_data = ATH9K_PCI_BT_ANT_DIV },
0221     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0222              0x0032,
0223              PCI_VENDOR_ID_LENOVO,
0224              0x3219),
0225       .driver_data = ATH9K_PCI_BT_ANT_DIV },
0226 
0227     /* AR9485 cards with PLL power-save disabled by default. */
0228     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0229              0x0032,
0230              PCI_VENDOR_ID_AZWAVE,
0231              0x2C97),
0232       .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
0233     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0234              0x0032,
0235              PCI_VENDOR_ID_AZWAVE,
0236              0x2100),
0237       .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
0238     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0239              0x0032,
0240              0x1C56, /* ASKEY */
0241              0x4001),
0242       .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
0243     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0244              0x0032,
0245              0x11AD, /* LITEON */
0246              0x6627),
0247       .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
0248     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0249              0x0032,
0250              0x11AD, /* LITEON */
0251              0x6628),
0252       .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
0253     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0254              0x0032,
0255              PCI_VENDOR_ID_FOXCONN,
0256              0xE04E),
0257       .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
0258     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0259              0x0032,
0260              PCI_VENDOR_ID_FOXCONN,
0261              0xE04F),
0262       .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
0263     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0264              0x0032,
0265              0x144F, /* ASKEY */
0266              0x7197),
0267       .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
0268     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0269              0x0032,
0270              0x1B9A, /* XAVI */
0271              0x2000),
0272       .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
0273     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0274              0x0032,
0275              0x1B9A, /* XAVI */
0276              0x2001),
0277       .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
0278     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0279              0x0032,
0280              PCI_VENDOR_ID_AZWAVE,
0281              0x1186),
0282       .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
0283     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0284              0x0032,
0285              PCI_VENDOR_ID_AZWAVE,
0286              0x1F86),
0287       .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
0288     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0289              0x0032,
0290              PCI_VENDOR_ID_AZWAVE,
0291              0x1195),
0292       .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
0293     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0294              0x0032,
0295              PCI_VENDOR_ID_AZWAVE,
0296              0x1F95),
0297       .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
0298     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0299              0x0032,
0300              0x1B9A, /* XAVI */
0301              0x1C00),
0302       .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
0303     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0304              0x0032,
0305              0x1B9A, /* XAVI */
0306              0x1C01),
0307       .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
0308     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0309              0x0032,
0310              PCI_VENDOR_ID_ASUSTEK,
0311              0x850D),
0312       .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
0313 #endif
0314 
0315     { PCI_VDEVICE(ATHEROS, 0x0032) }, /* PCI-E  AR9485 */
0316     { PCI_VDEVICE(ATHEROS, 0x0033) }, /* PCI-E  AR9580 */
0317 
0318 #ifdef CONFIG_ATH9K_PCOEM
0319     /* PCI-E CUS217 */
0320     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0321              0x0034,
0322              PCI_VENDOR_ID_AZWAVE,
0323              0x2116),
0324       .driver_data = ATH9K_PCI_CUS217 },
0325     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0326              0x0034,
0327              0x11AD, /* LITEON */
0328              0x6661),
0329       .driver_data = ATH9K_PCI_CUS217 },
0330 
0331     /* AR9462 with WoW support */
0332     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0333              0x0034,
0334              PCI_VENDOR_ID_ATHEROS,
0335              0x3117),
0336       .driver_data = ATH9K_PCI_WOW },
0337     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0338              0x0034,
0339              PCI_VENDOR_ID_LENOVO,
0340              0x3214),
0341       .driver_data = ATH9K_PCI_WOW },
0342     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0343              0x0034,
0344              PCI_VENDOR_ID_ATTANSIC,
0345              0x0091),
0346       .driver_data = ATH9K_PCI_WOW },
0347     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0348              0x0034,
0349              PCI_VENDOR_ID_AZWAVE,
0350              0x2110),
0351       .driver_data = ATH9K_PCI_WOW },
0352     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0353              0x0034,
0354              PCI_VENDOR_ID_ASUSTEK,
0355              0x850E),
0356       .driver_data = ATH9K_PCI_WOW },
0357     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0358              0x0034,
0359              0x11AD, /* LITEON */
0360              0x6631),
0361       .driver_data = ATH9K_PCI_WOW },
0362     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0363              0x0034,
0364              0x11AD, /* LITEON */
0365              0x6641),
0366       .driver_data = ATH9K_PCI_WOW },
0367     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0368              0x0034,
0369              PCI_VENDOR_ID_HP,
0370              0x1864),
0371       .driver_data = ATH9K_PCI_WOW },
0372     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0373              0x0034,
0374              0x14CD, /* USI */
0375              0x0063),
0376       .driver_data = ATH9K_PCI_WOW },
0377     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0378              0x0034,
0379              0x14CD, /* USI */
0380              0x0064),
0381       .driver_data = ATH9K_PCI_WOW },
0382     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0383              0x0034,
0384              0x10CF, /* Fujitsu */
0385              0x1783),
0386       .driver_data = ATH9K_PCI_WOW },
0387     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0388              0x0034,
0389              PCI_VENDOR_ID_DELL,
0390              0x020B),
0391       .driver_data = ATH9K_PCI_WOW },
0392     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0393              0x0034,
0394              PCI_VENDOR_ID_DELL,
0395              0x0300),
0396       .driver_data = ATH9K_PCI_WOW },
0397 
0398     /* Killer Wireless (2x2) */
0399     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0400              0x0030,
0401              0x1A56,
0402              0x2003),
0403       .driver_data = ATH9K_PCI_KILLER },
0404 
0405     { PCI_VDEVICE(ATHEROS, 0x0034) }, /* PCI-E  AR9462 */
0406     { PCI_VDEVICE(ATHEROS, 0x0037) }, /* PCI-E  AR1111/AR9485 */
0407 
0408     /* CUS252 */
0409     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0410              0x0036,
0411              PCI_VENDOR_ID_ATHEROS,
0412              0x3028),
0413       .driver_data = ATH9K_PCI_CUS252 |
0414              ATH9K_PCI_AR9565_2ANT |
0415              ATH9K_PCI_BT_ANT_DIV },
0416     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0417              0x0036,
0418              PCI_VENDOR_ID_AZWAVE,
0419              0x2176),
0420       .driver_data = ATH9K_PCI_CUS252 |
0421              ATH9K_PCI_AR9565_2ANT |
0422              ATH9K_PCI_BT_ANT_DIV },
0423 
0424     /* WB335 1-ANT */
0425     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0426              0x0036,
0427              PCI_VENDOR_ID_FOXCONN,
0428              0xE068),
0429       .driver_data = ATH9K_PCI_AR9565_1ANT },
0430     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0431              0x0036,
0432              0x185F, /* WNC */
0433              0xA119),
0434       .driver_data = ATH9K_PCI_AR9565_1ANT },
0435     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0436              0x0036,
0437              0x11AD, /* LITEON */
0438              0x0632),
0439       .driver_data = ATH9K_PCI_AR9565_1ANT },
0440     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0441              0x0036,
0442              0x11AD, /* LITEON */
0443              0x06B2),
0444       .driver_data = ATH9K_PCI_AR9565_1ANT },
0445     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0446              0x0036,
0447              0x11AD, /* LITEON */
0448              0x0842),
0449       .driver_data = ATH9K_PCI_AR9565_1ANT },
0450     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0451              0x0036,
0452              0x11AD, /* LITEON */
0453              0x1842),
0454       .driver_data = ATH9K_PCI_AR9565_1ANT },
0455     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0456              0x0036,
0457              0x11AD, /* LITEON */
0458              0x6671),
0459       .driver_data = ATH9K_PCI_AR9565_1ANT },
0460     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0461              0x0036,
0462              0x1B9A, /* XAVI */
0463              0x2811),
0464       .driver_data = ATH9K_PCI_AR9565_1ANT },
0465     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0466              0x0036,
0467              0x1B9A, /* XAVI */
0468              0x2812),
0469       .driver_data = ATH9K_PCI_AR9565_1ANT },
0470     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0471              0x0036,
0472              0x1B9A, /* XAVI */
0473              0x28A1),
0474       .driver_data = ATH9K_PCI_AR9565_1ANT },
0475     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0476              0x0036,
0477              0x1B9A, /* XAVI */
0478              0x28A3),
0479       .driver_data = ATH9K_PCI_AR9565_1ANT },
0480     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0481              0x0036,
0482              PCI_VENDOR_ID_AZWAVE,
0483              0x218A),
0484       .driver_data = ATH9K_PCI_AR9565_1ANT },
0485     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0486              0x0036,
0487              PCI_VENDOR_ID_AZWAVE,
0488              0x2F8A),
0489       .driver_data = ATH9K_PCI_AR9565_1ANT },
0490 
0491     /* WB335 1-ANT / Antenna Diversity */
0492     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0493              0x0036,
0494              PCI_VENDOR_ID_ATHEROS,
0495              0x3025),
0496       .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
0497     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0498              0x0036,
0499              PCI_VENDOR_ID_ATHEROS,
0500              0x3026),
0501       .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
0502     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0503              0x0036,
0504              PCI_VENDOR_ID_ATHEROS,
0505              0x302B),
0506       .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
0507     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0508              0x0036,
0509              PCI_VENDOR_ID_FOXCONN,
0510              0xE069),
0511       .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
0512     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0513              0x0036,
0514              0x185F, /* WNC */
0515              0x3028),
0516       .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
0517     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0518              0x0036,
0519              0x11AD, /* LITEON */
0520              0x0622),
0521       .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
0522     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0523              0x0036,
0524              0x11AD, /* LITEON */
0525              0x0672),
0526       .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
0527     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0528              0x0036,
0529              0x11AD, /* LITEON */
0530              0x0662),
0531       .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
0532     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0533              0x0036,
0534              0x11AD, /* LITEON */
0535              0x06A2),
0536       .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
0537     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0538              0x0036,
0539              0x11AD, /* LITEON */
0540              0x0682),
0541       .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
0542     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0543              0x0036,
0544              PCI_VENDOR_ID_AZWAVE,
0545              0x213A),
0546       .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
0547     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0548              0x0036,
0549              PCI_VENDOR_ID_AZWAVE,
0550              0x213C),
0551       .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
0552     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0553              0x0036,
0554              PCI_VENDOR_ID_HP,
0555              0x18E3),
0556       .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
0557     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0558              0x0036,
0559              PCI_VENDOR_ID_HP,
0560              0x217F),
0561       .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
0562     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0563              0x0036,
0564              PCI_VENDOR_ID_HP,
0565              0x2005),
0566       .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
0567     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0568              0x0036,
0569              PCI_VENDOR_ID_DELL,
0570              0x020C),
0571       .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
0572 
0573     /* WB335 2-ANT / Antenna-Diversity */
0574     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0575              0x0036,
0576              PCI_VENDOR_ID_SAMSUNG,
0577              0x411A),
0578       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0579     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0580              0x0036,
0581              PCI_VENDOR_ID_SAMSUNG,
0582              0x411B),
0583       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0584     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0585              0x0036,
0586              PCI_VENDOR_ID_SAMSUNG,
0587              0x411C),
0588       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0589     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0590              0x0036,
0591              PCI_VENDOR_ID_SAMSUNG,
0592              0x411D),
0593       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0594     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0595              0x0036,
0596              PCI_VENDOR_ID_SAMSUNG,
0597              0x411E),
0598       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0599     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0600              0x0036,
0601              PCI_VENDOR_ID_SAMSUNG,
0602              0x4129),
0603       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0604     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0605              0x0036,
0606              PCI_VENDOR_ID_SAMSUNG,
0607              0x412A),
0608       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0609     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0610              0x0036,
0611              PCI_VENDOR_ID_ATHEROS,
0612              0x3027),
0613       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0614     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0615              0x0036,
0616              PCI_VENDOR_ID_ATHEROS,
0617              0x302C),
0618       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0619     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0620              0x0036,
0621              0x11AD, /* LITEON */
0622              0x0642),
0623       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0624     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0625              0x0036,
0626              0x11AD, /* LITEON */
0627              0x0652),
0628       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0629     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0630              0x0036,
0631              0x11AD, /* LITEON */
0632              0x0612),
0633       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0634     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0635              0x0036,
0636              0x11AD, /* LITEON */
0637              0x0832),
0638       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0639     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0640              0x0036,
0641              0x11AD, /* LITEON */
0642              0x1832),
0643       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0644     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0645              0x0036,
0646              0x11AD, /* LITEON */
0647              0x0692),
0648       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0649     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0650              0x0036,
0651              0x11AD, /* LITEON */
0652              0x0803),
0653       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0654     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0655              0x0036,
0656              0x11AD, /* LITEON */
0657              0x0813),
0658       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0659     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0660              0x0036,
0661              PCI_VENDOR_ID_AZWAVE,
0662              0x2130),
0663       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0664     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0665              0x0036,
0666              PCI_VENDOR_ID_AZWAVE,
0667              0x213B),
0668       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0669     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0670              0x0036,
0671              PCI_VENDOR_ID_AZWAVE,
0672              0x2182),
0673       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0674     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0675              0x0036,
0676              PCI_VENDOR_ID_AZWAVE,
0677              0x218B),
0678       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0679     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0680              0x0036,
0681              PCI_VENDOR_ID_AZWAVE,
0682              0x218C),
0683       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0684     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0685              0x0036,
0686              PCI_VENDOR_ID_AZWAVE,
0687              0x2F82),
0688       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0689     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0690              0x0036,
0691              0x144F, /* ASKEY */
0692              0x7202),
0693       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0694     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0695              0x0036,
0696              0x1B9A, /* XAVI */
0697              0x2810),
0698       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0699     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0700              0x0036,
0701              0x1B9A, /* XAVI */
0702              0x2813),
0703       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0704     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0705              0x0036,
0706              0x1B9A, /* XAVI */
0707              0x28A2),
0708       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0709     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0710              0x0036,
0711              0x1B9A, /* XAVI */
0712              0x28A4),
0713       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0714     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0715              0x0036,
0716              0x185F, /* WNC */
0717              0x3027),
0718       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0719     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0720              0x0036,
0721              0x185F, /* WNC */
0722              0xA120),
0723       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0724     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0725              0x0036,
0726              PCI_VENDOR_ID_FOXCONN,
0727              0xE07F),
0728       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0729     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0730              0x0036,
0731              PCI_VENDOR_ID_FOXCONN,
0732              0xE08F),
0733       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0734     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0735              0x0036,
0736              PCI_VENDOR_ID_FOXCONN,
0737              0xE081),
0738       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0739     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0740              0x0036,
0741              PCI_VENDOR_ID_FOXCONN,
0742              0xE091),
0743       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0744     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0745              0x0036,
0746              PCI_VENDOR_ID_FOXCONN,
0747              0xE099),
0748       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0749     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0750              0x0036,
0751              PCI_VENDOR_ID_LENOVO,
0752              0x3026),
0753       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0754     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0755              0x0036,
0756              PCI_VENDOR_ID_LENOVO,
0757              0x4026),
0758       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0759     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0760              0x0036,
0761              PCI_VENDOR_ID_ASUSTEK,
0762              0x85F2),
0763       .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
0764     { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0765              0x0036,
0766              PCI_VENDOR_ID_DELL,
0767              0x020E),
0768       .driver_data = ATH9K_PCI_AR9565_2ANT |
0769              ATH9K_PCI_BT_ANT_DIV |
0770              ATH9K_PCI_LED_ACT_HI},
0771 
0772     /* PCI-E AR9565 (WB335) */
0773     { PCI_VDEVICE(ATHEROS, 0x0036),
0774       .driver_data = ATH9K_PCI_BT_ANT_DIV },
0775 #endif
0776 
0777     { 0 }
0778 };
0779 
0780 
0781 /* return bus cachesize in 4B word units */
0782 static void ath_pci_read_cachesize(struct ath_common *common, int *csz)
0783 {
0784     struct ath_softc *sc = (struct ath_softc *) common->priv;
0785     u8 u8tmp;
0786 
0787     pci_read_config_byte(to_pci_dev(sc->dev), PCI_CACHE_LINE_SIZE, &u8tmp);
0788     *csz = (int)u8tmp;
0789 
0790     /*
0791      * This check was put in to avoid "unpleasant" consequences if
0792      * the bootrom has not fully initialized all PCI devices.
0793      * Sometimes the cache line size register is not set
0794      */
0795 
0796     if (*csz == 0)
0797         *csz = DEFAULT_CACHELINE >> 2;   /* Use the default size */
0798 }
0799 
0800 static bool ath_pci_eeprom_read(struct ath_common *common, u32 off, u16 *data)
0801 {
0802     struct ath_hw *ah = (struct ath_hw *) common->ah;
0803 
0804     common->ops->read(ah, AR5416_EEPROM_OFFSET + (off << AR5416_EEPROM_S));
0805 
0806     if (!ath9k_hw_wait(ah,
0807                 AR_EEPROM_STATUS_DATA,
0808                 AR_EEPROM_STATUS_DATA_BUSY |
0809                 AR_EEPROM_STATUS_DATA_PROT_ACCESS, 0,
0810                 AH_WAIT_TIMEOUT)) {
0811         return false;
0812     }
0813 
0814     *data = MS(common->ops->read(ah, AR_EEPROM_STATUS_DATA),
0815             AR_EEPROM_STATUS_DATA_VAL);
0816 
0817     return true;
0818 }
0819 
0820 /* Need to be called after we discover btcoex capabilities */
0821 static void ath_pci_aspm_init(struct ath_common *common)
0822 {
0823     struct ath_softc *sc = (struct ath_softc *) common->priv;
0824     struct ath_hw *ah = sc->sc_ah;
0825     struct pci_dev *pdev = to_pci_dev(sc->dev);
0826     struct pci_dev *parent;
0827     u16 aspm;
0828     int ret;
0829 
0830     if (!ah->is_pciexpress)
0831         return;
0832 
0833     parent = pdev->bus->self;
0834     if (!parent)
0835         return;
0836 
0837     if ((ath9k_hw_get_btcoex_scheme(ah) != ATH_BTCOEX_CFG_NONE) &&
0838         (AR_SREV_9285(ah))) {
0839         /* Bluetooth coexistence requires disabling ASPM. */
0840         pcie_capability_clear_word(pdev, PCI_EXP_LNKCTL,
0841             PCI_EXP_LNKCTL_ASPM_L0S | PCI_EXP_LNKCTL_ASPM_L1);
0842 
0843         /*
0844          * Both upstream and downstream PCIe components should
0845          * have the same ASPM settings.
0846          */
0847         pcie_capability_clear_word(parent, PCI_EXP_LNKCTL,
0848             PCI_EXP_LNKCTL_ASPM_L0S | PCI_EXP_LNKCTL_ASPM_L1);
0849 
0850         ath_info(common, "Disabling ASPM since BTCOEX is enabled\n");
0851         return;
0852     }
0853 
0854     /*
0855      * 0x70c - Ack Frequency Register.
0856      *
0857      * Bits 27:29 - DEFAULT_L1_ENTRANCE_LATENCY.
0858      *
0859      * 000 : 1 us
0860      * 001 : 2 us
0861      * 010 : 4 us
0862      * 011 : 8 us
0863      * 100 : 16 us
0864      * 101 : 32 us
0865      * 110/111 : 64 us
0866      */
0867     if (AR_SREV_9462(ah))
0868         pci_read_config_dword(pdev, 0x70c, &ah->config.aspm_l1_fix);
0869 
0870     ret = pcie_capability_read_word(parent, PCI_EXP_LNKCTL, &aspm);
0871     if (!ret && (aspm & (PCI_EXP_LNKCTL_ASPM_L0S | PCI_EXP_LNKCTL_ASPM_L1))) {
0872         ah->aspm_enabled = true;
0873         /* Initialize PCIe PM and SERDES registers. */
0874         ath9k_hw_configpcipowersave(ah, false);
0875         ath_info(common, "ASPM enabled: 0x%x\n", aspm);
0876     }
0877 }
0878 
0879 static const struct ath_bus_ops ath_pci_bus_ops = {
0880     .ath_bus_type = ATH_PCI,
0881     .read_cachesize = ath_pci_read_cachesize,
0882     .eeprom_read = ath_pci_eeprom_read,
0883     .aspm_init = ath_pci_aspm_init,
0884 };
0885 
0886 static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
0887 {
0888     struct ath_softc *sc;
0889     struct ieee80211_hw *hw;
0890     u8 csz;
0891     u32 val;
0892     int ret = 0;
0893     char hw_name[64];
0894     int msi_enabled = 0;
0895 
0896     if (pcim_enable_device(pdev))
0897         return -EIO;
0898 
0899     ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
0900     if (ret) {
0901         pr_err("32-bit DMA not available\n");
0902         return ret;
0903     }
0904 
0905     /*
0906      * Cache line size is used to size and align various
0907      * structures used to communicate with the hardware.
0908      */
0909     pci_read_config_byte(pdev, PCI_CACHE_LINE_SIZE, &csz);
0910     if (csz == 0) {
0911         /*
0912          * Linux 2.4.18 (at least) writes the cache line size
0913          * register as a 16-bit wide register which is wrong.
0914          * We must have this setup properly for rx buffer
0915          * DMA to work so force a reasonable value here if it
0916          * comes up zero.
0917          */
0918         csz = L1_CACHE_BYTES / sizeof(u32);
0919         pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, csz);
0920     }
0921     /*
0922      * The default setting of latency timer yields poor results,
0923      * set it to the value used by other systems. It may be worth
0924      * tweaking this setting more.
0925      */
0926     pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0xa8);
0927 
0928     pci_set_master(pdev);
0929 
0930     /*
0931      * Disable the RETRY_TIMEOUT register (0x41) to keep
0932      * PCI Tx retries from interfering with C3 CPU state.
0933      */
0934     pci_read_config_dword(pdev, 0x40, &val);
0935     if ((val & 0x0000ff00) != 0)
0936         pci_write_config_dword(pdev, 0x40, val & 0xffff00ff);
0937 
0938     ret = pcim_iomap_regions(pdev, BIT(0), "ath9k");
0939     if (ret) {
0940         dev_err(&pdev->dev, "PCI memory region reserve error\n");
0941         return -ENODEV;
0942     }
0943 
0944     ath9k_fill_chanctx_ops();
0945     hw = ieee80211_alloc_hw(sizeof(struct ath_softc), &ath9k_ops);
0946     if (!hw) {
0947         dev_err(&pdev->dev, "No memory for ieee80211_hw\n");
0948         return -ENOMEM;
0949     }
0950 
0951     SET_IEEE80211_DEV(hw, &pdev->dev);
0952     pci_set_drvdata(pdev, hw);
0953 
0954     sc = hw->priv;
0955     sc->hw = hw;
0956     sc->dev = &pdev->dev;
0957     sc->mem = pcim_iomap_table(pdev)[0];
0958     sc->driver_data = id->driver_data;
0959 
0960     if (ath9k_use_msi) {
0961         if (pci_enable_msi(pdev) == 0) {
0962             msi_enabled = 1;
0963             dev_err(&pdev->dev, "Using MSI\n");
0964         } else {
0965             dev_err(&pdev->dev, "Using INTx\n");
0966         }
0967     }
0968 
0969     if (!msi_enabled)
0970         ret = request_irq(pdev->irq, ath_isr, IRQF_SHARED, "ath9k", sc);
0971     else
0972         ret = request_irq(pdev->irq, ath_isr, 0, "ath9k", sc);
0973 
0974     if (ret) {
0975         dev_err(&pdev->dev, "request_irq failed\n");
0976         goto err_irq;
0977     }
0978 
0979     sc->irq = pdev->irq;
0980 
0981     ret = ath9k_init_device(id->device, sc, &ath_pci_bus_ops);
0982     if (ret) {
0983         dev_err(&pdev->dev, "Failed to initialize device\n");
0984         goto err_init;
0985     }
0986 
0987     sc->sc_ah->msi_enabled = msi_enabled;
0988     sc->sc_ah->msi_reg = 0;
0989 
0990     ath9k_hw_name(sc->sc_ah, hw_name, sizeof(hw_name));
0991     wiphy_info(hw->wiphy, "%s mem=0x%lx, irq=%d\n",
0992            hw_name, (unsigned long)sc->mem, pdev->irq);
0993 
0994     return 0;
0995 
0996 err_init:
0997     free_irq(sc->irq, sc);
0998 err_irq:
0999     ieee80211_free_hw(hw);
1000     return ret;
1001 }
1002 
1003 static void ath_pci_remove(struct pci_dev *pdev)
1004 {
1005     struct ieee80211_hw *hw = pci_get_drvdata(pdev);
1006     struct ath_softc *sc = hw->priv;
1007 
1008     if (!is_ath9k_unloaded)
1009         sc->sc_ah->ah_flags |= AH_UNPLUGGED;
1010     ath9k_deinit_device(sc);
1011     free_irq(sc->irq, sc);
1012     ieee80211_free_hw(sc->hw);
1013 }
1014 
1015 #ifdef CONFIG_PM_SLEEP
1016 
1017 static int ath_pci_suspend(struct device *device)
1018 {
1019     struct ieee80211_hw *hw = dev_get_drvdata(device);
1020     struct ath_softc *sc = hw->priv;
1021     struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1022 
1023     if (test_bit(ATH_OP_WOW_ENABLED, &common->op_flags)) {
1024         dev_info(device, "WOW is enabled, bypassing PCI suspend\n");
1025         return 0;
1026     }
1027 
1028     /* The device has to be moved to FULLSLEEP forcibly.
1029      * Otherwise the chip never moved to full sleep,
1030      * when no interface is up.
1031      */
1032     ath9k_stop_btcoex(sc);
1033     ath9k_hw_disable(sc->sc_ah);
1034     del_timer_sync(&sc->sleep_timer);
1035     ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_FULL_SLEEP);
1036 
1037     return 0;
1038 }
1039 
1040 static int ath_pci_resume(struct device *device)
1041 {
1042     struct pci_dev *pdev = to_pci_dev(device);
1043     struct ieee80211_hw *hw = pci_get_drvdata(pdev);
1044     struct ath_softc *sc = hw->priv;
1045     struct ath_hw *ah = sc->sc_ah;
1046     struct ath_common *common = ath9k_hw_common(ah);
1047     u32 val;
1048 
1049     /*
1050      * Suspend/Resume resets the PCI configuration space, so we have to
1051      * re-disable the RETRY_TIMEOUT register (0x41) to keep
1052      * PCI Tx retries from interfering with C3 CPU state
1053      */
1054     pci_read_config_dword(pdev, 0x40, &val);
1055     if ((val & 0x0000ff00) != 0)
1056         pci_write_config_dword(pdev, 0x40, val & 0xffff00ff);
1057 
1058     ath_pci_aspm_init(common);
1059     ah->reset_power_on = false;
1060 
1061     return 0;
1062 }
1063 
1064 static SIMPLE_DEV_PM_OPS(ath9k_pm_ops, ath_pci_suspend, ath_pci_resume);
1065 
1066 #define ATH9K_PM_OPS    (&ath9k_pm_ops)
1067 
1068 #else /* !CONFIG_PM_SLEEP */
1069 
1070 #define ATH9K_PM_OPS    NULL
1071 
1072 #endif /* !CONFIG_PM_SLEEP */
1073 
1074 
1075 MODULE_DEVICE_TABLE(pci, ath_pci_id_table);
1076 
1077 static struct pci_driver ath_pci_driver = {
1078     .name       = "ath9k",
1079     .id_table   = ath_pci_id_table,
1080     .probe      = ath_pci_probe,
1081     .remove     = ath_pci_remove,
1082     .driver.pm  = ATH9K_PM_OPS,
1083 };
1084 
1085 int ath_pci_init(void)
1086 {
1087     return pci_register_driver(&ath_pci_driver);
1088 }
1089 
1090 void ath_pci_exit(void)
1091 {
1092     pci_unregister_driver(&ath_pci_driver);
1093 }