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