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        int ret;
 829
 830        if (!ah->is_pciexpress)
 831                return;
 832
 833        parent = pdev->bus->self;
 834        if (!parent)
 835                return;
 836
 837        if ((ath9k_hw_get_btcoex_scheme(ah) != ATH_BTCOEX_CFG_NONE) &&
 838            (AR_SREV_9285(ah))) {
 839                /* Bluetooth coexistence requires disabling ASPM. */
 840                pcie_capability_clear_word(pdev, PCI_EXP_LNKCTL,
 841                        PCI_EXP_LNKCTL_ASPM_L0S | PCI_EXP_LNKCTL_ASPM_L1);
 842
 843                /*
 844                 * Both upstream and downstream PCIe components should
 845                 * have the same ASPM settings.
 846                 */
 847                pcie_capability_clear_word(parent, PCI_EXP_LNKCTL,
 848                        PCI_EXP_LNKCTL_ASPM_L0S | PCI_EXP_LNKCTL_ASPM_L1);
 849
 850                ath_info(common, "Disabling ASPM since BTCOEX is enabled\n");
 851                return;
 852        }
 853
 854        /*
 855         * 0x70c - Ack Frequency Register.
 856         *
 857         * Bits 27:29 - DEFAULT_L1_ENTRANCE_LATENCY.
 858         *
 859         * 000 : 1 us
 860         * 001 : 2 us
 861         * 010 : 4 us
 862         * 011 : 8 us
 863         * 100 : 16 us
 864         * 101 : 32 us
 865         * 110/111 : 64 us
 866         */
 867        if (AR_SREV_9462(ah))
 868                pci_read_config_dword(pdev, 0x70c, &ah->config.aspm_l1_fix);
 869
 870        ret = pcie_capability_read_word(parent, PCI_EXP_LNKCTL, &aspm);
 871        if (!ret && (aspm & (PCI_EXP_LNKCTL_ASPM_L0S | PCI_EXP_LNKCTL_ASPM_L1))) {
 872                ah->aspm_enabled = true;
 873                /* Initialize PCIe PM and SERDES registers. */
 874                ath9k_hw_configpcipowersave(ah, false);
 875                ath_info(common, "ASPM enabled: 0x%x\n", aspm);
 876        }
 877}
 878
 879static const struct ath_bus_ops ath_pci_bus_ops = {
 880        .ath_bus_type = ATH_PCI,
 881        .read_cachesize = ath_pci_read_cachesize,
 882        .eeprom_read = ath_pci_eeprom_read,
 883        .aspm_init = ath_pci_aspm_init,
 884};
 885
 886static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 887{
 888        struct ath_softc *sc;
 889        struct ieee80211_hw *hw;
 890        u8 csz;
 891        u32 val;
 892        int ret = 0;
 893        char hw_name[64];
 894        int msi_enabled = 0;
 895
 896        if (pcim_enable_device(pdev))
 897                return -EIO;
 898
 899        ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
 900        if (ret) {
 901                pr_err("32-bit DMA not available\n");
 902                return ret;
 903        }
 904
 905        /*
 906         * Cache line size is used to size and align various
 907         * structures used to communicate with the hardware.
 908         */
 909        pci_read_config_byte(pdev, PCI_CACHE_LINE_SIZE, &csz);
 910        if (csz == 0) {
 911                /*
 912                 * Linux 2.4.18 (at least) writes the cache line size
 913                 * register as a 16-bit wide register which is wrong.
 914                 * We must have this setup properly for rx buffer
 915                 * DMA to work so force a reasonable value here if it
 916                 * comes up zero.
 917                 */
 918                csz = L1_CACHE_BYTES / sizeof(u32);
 919                pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, csz);
 920        }
 921        /*
 922         * The default setting of latency timer yields poor results,
 923         * set it to the value used by other systems. It may be worth
 924         * tweaking this setting more.
 925         */
 926        pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0xa8);
 927
 928        pci_set_master(pdev);
 929
 930        /*
 931         * Disable the RETRY_TIMEOUT register (0x41) to keep
 932         * PCI Tx retries from interfering with C3 CPU state.
 933         */
 934        pci_read_config_dword(pdev, 0x40, &val);
 935        if ((val & 0x0000ff00) != 0)
 936                pci_write_config_dword(pdev, 0x40, val & 0xffff00ff);
 937
 938        ret = pcim_iomap_regions(pdev, BIT(0), "ath9k");
 939        if (ret) {
 940                dev_err(&pdev->dev, "PCI memory region reserve error\n");
 941                return -ENODEV;
 942        }
 943
 944        ath9k_fill_chanctx_ops();
 945        hw = ieee80211_alloc_hw(sizeof(struct ath_softc), &ath9k_ops);
 946        if (!hw) {
 947                dev_err(&pdev->dev, "No memory for ieee80211_hw\n");
 948                return -ENOMEM;
 949        }
 950
 951        SET_IEEE80211_DEV(hw, &pdev->dev);
 952        pci_set_drvdata(pdev, hw);
 953
 954        sc = hw->priv;
 955        sc->hw = hw;
 956        sc->dev = &pdev->dev;
 957        sc->mem = pcim_iomap_table(pdev)[0];
 958        sc->driver_data = id->driver_data;
 959
 960        if (ath9k_use_msi) {
 961                if (pci_enable_msi(pdev) == 0) {
 962                        msi_enabled = 1;
 963                        dev_err(&pdev->dev, "Using MSI\n");
 964                } else {
 965                        dev_err(&pdev->dev, "Using INTx\n");
 966                }
 967        }
 968
 969        if (!msi_enabled)
 970                ret = request_irq(pdev->irq, ath_isr, IRQF_SHARED, "ath9k", sc);
 971        else
 972                ret = request_irq(pdev->irq, ath_isr, 0, "ath9k", sc);
 973
 974        if (ret) {
 975                dev_err(&pdev->dev, "request_irq failed\n");
 976                goto err_irq;
 977        }
 978
 979        sc->irq = pdev->irq;
 980
 981        ret = ath9k_init_device(id->device, sc, &ath_pci_bus_ops);
 982        if (ret) {
 983                dev_err(&pdev->dev, "Failed to initialize device\n");
 984                goto err_init;
 985        }
 986
 987        sc->sc_ah->msi_enabled = msi_enabled;
 988        sc->sc_ah->msi_reg = 0;
 989
 990        ath9k_hw_name(sc->sc_ah, hw_name, sizeof(hw_name));
 991        wiphy_info(hw->wiphy, "%s mem=0x%lx, irq=%d\n",
 992                   hw_name, (unsigned long)sc->mem, pdev->irq);
 993
 994        return 0;
 995
 996err_init:
 997        free_irq(sc->irq, sc);
 998err_irq:
 999        ieee80211_free_hw(hw);
1000        return ret;
1001}
1002
1003static void ath_pci_remove(struct pci_dev *pdev)
1004{
1005        struct ieee80211_hw *hw = pci_get_drvdata(pdev);
1006        struct ath_softc *sc = hw->priv;
1007
1008        if (!is_ath9k_unloaded)
1009                sc->sc_ah->ah_flags |= AH_UNPLUGGED;
1010        ath9k_deinit_device(sc);
1011        free_irq(sc->irq, sc);
1012        ieee80211_free_hw(sc->hw);
1013}
1014
1015#ifdef CONFIG_PM_SLEEP
1016
1017static int ath_pci_suspend(struct device *device)
1018{
1019        struct ieee80211_hw *hw = dev_get_drvdata(device);
1020        struct ath_softc *sc = hw->priv;
1021        struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1022
1023        if (test_bit(ATH_OP_WOW_ENABLED, &common->op_flags)) {
1024                dev_info(device, "WOW is enabled, bypassing PCI suspend\n");
1025                return 0;
1026        }
1027
1028        /* The device has to be moved to FULLSLEEP forcibly.
1029         * Otherwise the chip never moved to full sleep,
1030         * when no interface is up.
1031         */
1032        ath9k_stop_btcoex(sc);
1033        ath9k_hw_disable(sc->sc_ah);
1034        del_timer_sync(&sc->sleep_timer);
1035        ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_FULL_SLEEP);
1036
1037        return 0;
1038}
1039
1040static int ath_pci_resume(struct device *device)
1041{
1042        struct pci_dev *pdev = to_pci_dev(device);
1043        struct ieee80211_hw *hw = pci_get_drvdata(pdev);
1044        struct ath_softc *sc = hw->priv;
1045        struct ath_hw *ah = sc->sc_ah;
1046        struct ath_common *common = ath9k_hw_common(ah);
1047        u32 val;
1048
1049        /*
1050         * Suspend/Resume resets the PCI configuration space, so we have to
1051         * re-disable the RETRY_TIMEOUT register (0x41) to keep
1052         * PCI Tx retries from interfering with C3 CPU state
1053         */
1054        pci_read_config_dword(pdev, 0x40, &val);
1055        if ((val & 0x0000ff00) != 0)
1056                pci_write_config_dword(pdev, 0x40, val & 0xffff00ff);
1057
1058        ath_pci_aspm_init(common);
1059        ah->reset_power_on = false;
1060
1061        return 0;
1062}
1063
1064static SIMPLE_DEV_PM_OPS(ath9k_pm_ops, ath_pci_suspend, ath_pci_resume);
1065
1066#define ATH9K_PM_OPS    (&ath9k_pm_ops)
1067
1068#else /* !CONFIG_PM_SLEEP */
1069
1070#define ATH9K_PM_OPS    NULL
1071
1072#endif /* !CONFIG_PM_SLEEP */
1073
1074
1075MODULE_DEVICE_TABLE(pci, ath_pci_id_table);
1076
1077static struct pci_driver ath_pci_driver = {
1078        .name       = "ath9k",
1079        .id_table   = ath_pci_id_table,
1080        .probe      = ath_pci_probe,
1081        .remove     = ath_pci_remove,
1082        .driver.pm  = ATH9K_PM_OPS,
1083};
1084
1085int ath_pci_init(void)
1086{
1087        return pci_register_driver(&ath_pci_driver);
1088}
1089
1090void ath_pci_exit(void)
1091{
1092        pci_unregister_driver(&ath_pci_driver);
1093}
1094