brintos

brintos / linux-shallow public Read only

0
0
Text · 29.1 KiB · 1ff5352 Raw
1092 lines · c
1/*2 * Copyright (c) 2008-2011 Atheros Communications Inc.3 *4 * Permission to use, copy, modify, and/or distribute this software for any5 * purpose with or without fee is hereby granted, provided that the above6 * copyright notice and this permission notice appear in all copies.7 *8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.15 */16 17#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt18 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_PCOEM30	/* 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#endif37 38	{ PCI_VDEVICE(ATHEROS, 0x0029) }, /* PCI   */39 40#ifdef CONFIG_ATH9K_PCOEM41	{ 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#endif87 88	{ PCI_VDEVICE(ATHEROS, 0x002A) }, /* PCI-E */89 90#ifdef CONFIG_ATH9K_PCOEM91	/* 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#endif98 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_PCOEM119	/* 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#endif312 313	{ PCI_VDEVICE(ATHEROS, 0x0032) }, /* PCI-E  AR9485 */314	{ PCI_VDEVICE(ATHEROS, 0x0033) }, /* PCI-E  AR9580 */315 316#ifdef CONFIG_ATH9K_PCOEM317	/* 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#endif774 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 if790	 * the bootrom has not fully initialized all PCI devices.791	 * Sometimes the cache line size register is not set792	 */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 should843		 * 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 us858	 * 001 : 2 us859	 * 010 : 4 us860	 * 011 : 8 us861	 * 100 : 16 us862	 * 101 : 32 us863	 * 110/111 : 64 us864	 */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 various905	 * 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 size911		 * register as a 16-bit wide register which is wrong.912		 * We must have this setup properly for rx buffer913		 * DMA to work so force a reasonable value here if it914		 * 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 worth922	 * 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 keep930	 * 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	else970		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_SLEEP1014 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 to1049	 * re-disable the RETRY_TIMEOUT register (0x41) to keep1050	 * PCI Tx retries from interfering with C3 CPU state1051	 */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	NULL1069 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