linux/drivers/net/wireless/ath/ath9k/pci.c
<<
>>
Prefs
   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
  24extern int ath9k_use_msi;
  25
  26static 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 */
 782static 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
 800static 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 */
 821static 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
 878static 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
 885static 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
1001err_init:
1002        free_irq(sc->irq, sc);
1003err_irq:
1004        ieee80211_free_hw(hw);
1005        return ret;
1006}
1007
1008static 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
1022static 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
1046static 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
1070static 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
1081MODULE_DEVICE_TABLE(pci, ath_pci_id_table);
1082
1083static 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
1091int ath_pci_init(void)
1092{
1093        return pci_register_driver(&ath_pci_driver);
1094}
1095
1096void ath_pci_exit(void)
1097{
1098        pci_unregister_driver(&ath_pci_driver);
1099}
1100