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

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ath_pci_read_cachesize
  2. ath_pci_eeprom_read
  3. ath_pci_aspm_init
  4. ath_pci_probe
  5. ath_pci_remove
  6. ath_pci_suspend
  7. ath_pci_resume
  8. ath_pci_init
  9. ath_pci_exit

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

/* [<][>][^][v][top][bottom][index][help] */