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