1 /* 2 * Copyright (c) 2008-2011 Atheros Communications Inc. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 18 19 #include <linux/nl80211.h> 20 #include <linux/pci.h> 21 #include <linux/module.h> 22 #include "ath9k.h" 23 24 extern int ath9k_use_msi; 25 26 static const struct pci_device_id ath_pci_id_table[] = { 27 { PCI_VDEVICE(ATHEROS, 0x0023) }, /* PCI */ 28 { PCI_VDEVICE(ATHEROS, 0x0024) }, /* PCI-E */ 29 { PCI_VDEVICE(ATHEROS, 0x0027) }, /* PCI */ 30 31 #ifdef CONFIG_ATH9K_PCOEM 32 /* Mini PCI AR9220 MB92 cards: Compex WLM200NX, Wistron DNMA-92 */ 33 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 34 0x0029, 35 PCI_VENDOR_ID_ATHEROS, 36 0x2096), 37 .driver_data = ATH9K_PCI_LED_ACT_HI }, 38 #endif 39 40 { PCI_VDEVICE(ATHEROS, 0x0029) }, /* PCI */ 41 42 #ifdef CONFIG_ATH9K_PCOEM 43 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 44 0x002A, 45 PCI_VENDOR_ID_AZWAVE, 46 0x1C71), 47 .driver_data = ATH9K_PCI_D3_L1_WAR }, 48 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 49 0x002A, 50 PCI_VENDOR_ID_FOXCONN, 51 0xE01F), 52 .driver_data = ATH9K_PCI_D3_L1_WAR }, 53 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 54 0x002A, 55 0x11AD, /* LITEON */ 56 0x6632), 57 .driver_data = ATH9K_PCI_D3_L1_WAR }, 58 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 59 0x002A, 60 0x11AD, /* LITEON */ 61 0x6642), 62 .driver_data = ATH9K_PCI_D3_L1_WAR }, 63 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 64 0x002A, 65 PCI_VENDOR_ID_QMI, 66 0x0306), 67 .driver_data = ATH9K_PCI_D3_L1_WAR }, 68 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 69 0x002A, 70 0x185F, /* WNC */ 71 0x309D), 72 .driver_data = ATH9K_PCI_D3_L1_WAR }, 73 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 74 0x002A, 75 0x10CF, /* Fujitsu */ 76 0x147C), 77 .driver_data = ATH9K_PCI_D3_L1_WAR }, 78 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 79 0x002A, 80 0x10CF, /* Fujitsu */ 81 0x147D), 82 .driver_data = ATH9K_PCI_D3_L1_WAR }, 83 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 84 0x002A, 85 0x10CF, /* Fujitsu */ 86 0x1536), 87 .driver_data = ATH9K_PCI_D3_L1_WAR }, 88 #endif 89 90 { PCI_VDEVICE(ATHEROS, 0x002A) }, /* PCI-E */ 91 92 #ifdef CONFIG_ATH9K_PCOEM 93 /* AR9285 card for Asus */ 94 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 95 0x002B, 96 PCI_VENDOR_ID_AZWAVE, 97 0x2C37), 98 .driver_data = ATH9K_PCI_BT_ANT_DIV }, 99 #endif 100 101 { PCI_VDEVICE(ATHEROS, 0x002B) }, /* PCI-E */ 102 { PCI_VDEVICE(ATHEROS, 0x002C) }, /* PCI-E 802.11n bonded out */ 103 { PCI_VDEVICE(ATHEROS, 0x002D) }, /* PCI */ 104 { PCI_VDEVICE(ATHEROS, 0x002E) }, /* PCI-E */ 105 106 /* Killer Wireless (3x3) */ 107 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 108 0x0030, 109 0x1A56, 110 0x2000), 111 .driver_data = ATH9K_PCI_KILLER }, 112 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 113 0x0030, 114 0x1A56, 115 0x2001), 116 .driver_data = ATH9K_PCI_KILLER }, 117 118 { PCI_VDEVICE(ATHEROS, 0x0030) }, /* PCI-E AR9300 */ 119 120 #ifdef CONFIG_ATH9K_PCOEM 121 /* PCI-E CUS198 */ 122 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 123 0x0032, 124 PCI_VENDOR_ID_AZWAVE, 125 0x2086), 126 .driver_data = ATH9K_PCI_CUS198 | ATH9K_PCI_BT_ANT_DIV }, 127 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 128 0x0032, 129 PCI_VENDOR_ID_AZWAVE, 130 0x1237), 131 .driver_data = ATH9K_PCI_CUS198 | ATH9K_PCI_BT_ANT_DIV }, 132 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 133 0x0032, 134 PCI_VENDOR_ID_AZWAVE, 135 0x2126), 136 .driver_data = ATH9K_PCI_CUS198 | ATH9K_PCI_BT_ANT_DIV }, 137 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 138 0x0032, 139 PCI_VENDOR_ID_AZWAVE, 140 0x126A), 141 .driver_data = ATH9K_PCI_CUS198 | ATH9K_PCI_BT_ANT_DIV }, 142 143 /* PCI-E CUS230 */ 144 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 145 0x0032, 146 PCI_VENDOR_ID_AZWAVE, 147 0x2152), 148 .driver_data = ATH9K_PCI_CUS230 | ATH9K_PCI_BT_ANT_DIV }, 149 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 150 0x0032, 151 PCI_VENDOR_ID_FOXCONN, 152 0xE075), 153 .driver_data = ATH9K_PCI_CUS230 | ATH9K_PCI_BT_ANT_DIV }, 154 155 /* WB225 */ 156 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 157 0x0032, 158 PCI_VENDOR_ID_ATHEROS, 159 0x3119), 160 .driver_data = ATH9K_PCI_BT_ANT_DIV }, 161 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 162 0x0032, 163 PCI_VENDOR_ID_ATHEROS, 164 0x3122), 165 .driver_data = ATH9K_PCI_BT_ANT_DIV }, 166 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 167 0x0032, 168 0x185F, /* WNC */ 169 0x3119), 170 .driver_data = ATH9K_PCI_BT_ANT_DIV }, 171 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 172 0x0032, 173 0x185F, /* WNC */ 174 0x3027), 175 .driver_data = ATH9K_PCI_BT_ANT_DIV }, 176 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 177 0x0032, 178 PCI_VENDOR_ID_SAMSUNG, 179 0x4105), 180 .driver_data = ATH9K_PCI_BT_ANT_DIV }, 181 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 182 0x0032, 183 PCI_VENDOR_ID_SAMSUNG, 184 0x4106), 185 .driver_data = ATH9K_PCI_BT_ANT_DIV }, 186 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 187 0x0032, 188 PCI_VENDOR_ID_SAMSUNG, 189 0x410D), 190 .driver_data = ATH9K_PCI_BT_ANT_DIV }, 191 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 192 0x0032, 193 PCI_VENDOR_ID_SAMSUNG, 194 0x410E), 195 .driver_data = ATH9K_PCI_BT_ANT_DIV }, 196 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 197 0x0032, 198 PCI_VENDOR_ID_SAMSUNG, 199 0x410F), 200 .driver_data = ATH9K_PCI_BT_ANT_DIV }, 201 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 202 0x0032, 203 PCI_VENDOR_ID_SAMSUNG, 204 0xC706), 205 .driver_data = ATH9K_PCI_BT_ANT_DIV }, 206 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 207 0x0032, 208 PCI_VENDOR_ID_SAMSUNG, 209 0xC680), 210 .driver_data = ATH9K_PCI_BT_ANT_DIV }, 211 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 212 0x0032, 213 PCI_VENDOR_ID_SAMSUNG, 214 0xC708), 215 .driver_data = ATH9K_PCI_BT_ANT_DIV }, 216 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 217 0x0032, 218 PCI_VENDOR_ID_LENOVO, 219 0x3218), 220 .driver_data = ATH9K_PCI_BT_ANT_DIV }, 221 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 222 0x0032, 223 PCI_VENDOR_ID_LENOVO, 224 0x3219), 225 .driver_data = ATH9K_PCI_BT_ANT_DIV }, 226 227 /* AR9485 cards with PLL power-save disabled by default. */ 228 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 229 0x0032, 230 PCI_VENDOR_ID_AZWAVE, 231 0x2C97), 232 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, 233 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 234 0x0032, 235 PCI_VENDOR_ID_AZWAVE, 236 0x2100), 237 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, 238 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 239 0x0032, 240 0x1C56, /* ASKEY */ 241 0x4001), 242 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, 243 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 244 0x0032, 245 0x11AD, /* LITEON */ 246 0x6627), 247 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, 248 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 249 0x0032, 250 0x11AD, /* LITEON */ 251 0x6628), 252 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, 253 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 254 0x0032, 255 PCI_VENDOR_ID_FOXCONN, 256 0xE04E), 257 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, 258 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 259 0x0032, 260 PCI_VENDOR_ID_FOXCONN, 261 0xE04F), 262 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, 263 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 264 0x0032, 265 0x144F, /* ASKEY */ 266 0x7197), 267 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, 268 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 269 0x0032, 270 0x1B9A, /* XAVI */ 271 0x2000), 272 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, 273 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 274 0x0032, 275 0x1B9A, /* XAVI */ 276 0x2001), 277 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, 278 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 279 0x0032, 280 PCI_VENDOR_ID_AZWAVE, 281 0x1186), 282 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, 283 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 284 0x0032, 285 PCI_VENDOR_ID_AZWAVE, 286 0x1F86), 287 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, 288 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 289 0x0032, 290 PCI_VENDOR_ID_AZWAVE, 291 0x1195), 292 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, 293 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 294 0x0032, 295 PCI_VENDOR_ID_AZWAVE, 296 0x1F95), 297 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, 298 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 299 0x0032, 300 0x1B9A, /* XAVI */ 301 0x1C00), 302 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, 303 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 304 0x0032, 305 0x1B9A, /* XAVI */ 306 0x1C01), 307 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, 308 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 309 0x0032, 310 PCI_VENDOR_ID_ASUSTEK, 311 0x850D), 312 .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, 313 #endif 314 315 { PCI_VDEVICE(ATHEROS, 0x0032) }, /* PCI-E AR9485 */ 316 { PCI_VDEVICE(ATHEROS, 0x0033) }, /* PCI-E AR9580 */ 317 318 #ifdef CONFIG_ATH9K_PCOEM 319 /* PCI-E CUS217 */ 320 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 321 0x0034, 322 PCI_VENDOR_ID_AZWAVE, 323 0x2116), 324 .driver_data = ATH9K_PCI_CUS217 }, 325 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 326 0x0034, 327 0x11AD, /* LITEON */ 328 0x6661), 329 .driver_data = ATH9K_PCI_CUS217 }, 330 331 /* AR9462 with WoW support */ 332 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 333 0x0034, 334 PCI_VENDOR_ID_ATHEROS, 335 0x3117), 336 .driver_data = ATH9K_PCI_WOW }, 337 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 338 0x0034, 339 PCI_VENDOR_ID_LENOVO, 340 0x3214), 341 .driver_data = ATH9K_PCI_WOW }, 342 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 343 0x0034, 344 PCI_VENDOR_ID_ATTANSIC, 345 0x0091), 346 .driver_data = ATH9K_PCI_WOW }, 347 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 348 0x0034, 349 PCI_VENDOR_ID_AZWAVE, 350 0x2110), 351 .driver_data = ATH9K_PCI_WOW }, 352 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 353 0x0034, 354 PCI_VENDOR_ID_ASUSTEK, 355 0x850E), 356 .driver_data = ATH9K_PCI_WOW }, 357 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 358 0x0034, 359 0x11AD, /* LITEON */ 360 0x6631), 361 .driver_data = ATH9K_PCI_WOW }, 362 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 363 0x0034, 364 0x11AD, /* LITEON */ 365 0x6641), 366 .driver_data = ATH9K_PCI_WOW }, 367 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 368 0x0034, 369 PCI_VENDOR_ID_HP, 370 0x1864), 371 .driver_data = ATH9K_PCI_WOW }, 372 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 373 0x0034, 374 0x14CD, /* USI */ 375 0x0063), 376 .driver_data = ATH9K_PCI_WOW }, 377 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 378 0x0034, 379 0x14CD, /* USI */ 380 0x0064), 381 .driver_data = ATH9K_PCI_WOW }, 382 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 383 0x0034, 384 0x10CF, /* Fujitsu */ 385 0x1783), 386 .driver_data = ATH9K_PCI_WOW }, 387 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 388 0x0034, 389 PCI_VENDOR_ID_DELL, 390 0x020B), 391 .driver_data = ATH9K_PCI_WOW }, 392 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 393 0x0034, 394 PCI_VENDOR_ID_DELL, 395 0x0300), 396 .driver_data = ATH9K_PCI_WOW }, 397 398 /* Killer Wireless (2x2) */ 399 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 400 0x0030, 401 0x1A56, 402 0x2003), 403 .driver_data = ATH9K_PCI_KILLER }, 404 405 { PCI_VDEVICE(ATHEROS, 0x0034) }, /* PCI-E AR9462 */ 406 { PCI_VDEVICE(ATHEROS, 0x0037) }, /* PCI-E AR1111/AR9485 */ 407 408 /* CUS252 */ 409 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 410 0x0036, 411 PCI_VENDOR_ID_ATHEROS, 412 0x3028), 413 .driver_data = ATH9K_PCI_CUS252 | 414 ATH9K_PCI_AR9565_2ANT | 415 ATH9K_PCI_BT_ANT_DIV }, 416 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 417 0x0036, 418 PCI_VENDOR_ID_AZWAVE, 419 0x2176), 420 .driver_data = ATH9K_PCI_CUS252 | 421 ATH9K_PCI_AR9565_2ANT | 422 ATH9K_PCI_BT_ANT_DIV }, 423 424 /* WB335 1-ANT */ 425 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 426 0x0036, 427 PCI_VENDOR_ID_FOXCONN, 428 0xE068), 429 .driver_data = ATH9K_PCI_AR9565_1ANT }, 430 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 431 0x0036, 432 0x185F, /* WNC */ 433 0xA119), 434 .driver_data = ATH9K_PCI_AR9565_1ANT }, 435 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 436 0x0036, 437 0x11AD, /* LITEON */ 438 0x0632), 439 .driver_data = ATH9K_PCI_AR9565_1ANT }, 440 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 441 0x0036, 442 0x11AD, /* LITEON */ 443 0x06B2), 444 .driver_data = ATH9K_PCI_AR9565_1ANT }, 445 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 446 0x0036, 447 0x11AD, /* LITEON */ 448 0x0842), 449 .driver_data = ATH9K_PCI_AR9565_1ANT }, 450 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 451 0x0036, 452 0x11AD, /* LITEON */ 453 0x1842), 454 .driver_data = ATH9K_PCI_AR9565_1ANT }, 455 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 456 0x0036, 457 0x11AD, /* LITEON */ 458 0x6671), 459 .driver_data = ATH9K_PCI_AR9565_1ANT }, 460 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 461 0x0036, 462 0x1B9A, /* XAVI */ 463 0x2811), 464 .driver_data = ATH9K_PCI_AR9565_1ANT }, 465 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 466 0x0036, 467 0x1B9A, /* XAVI */ 468 0x2812), 469 .driver_data = ATH9K_PCI_AR9565_1ANT }, 470 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 471 0x0036, 472 0x1B9A, /* XAVI */ 473 0x28A1), 474 .driver_data = ATH9K_PCI_AR9565_1ANT }, 475 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 476 0x0036, 477 0x1B9A, /* XAVI */ 478 0x28A3), 479 .driver_data = ATH9K_PCI_AR9565_1ANT }, 480 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 481 0x0036, 482 PCI_VENDOR_ID_AZWAVE, 483 0x218A), 484 .driver_data = ATH9K_PCI_AR9565_1ANT }, 485 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 486 0x0036, 487 PCI_VENDOR_ID_AZWAVE, 488 0x2F8A), 489 .driver_data = ATH9K_PCI_AR9565_1ANT }, 490 491 /* WB335 1-ANT / Antenna Diversity */ 492 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 493 0x0036, 494 PCI_VENDOR_ID_ATHEROS, 495 0x3025), 496 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV }, 497 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 498 0x0036, 499 PCI_VENDOR_ID_ATHEROS, 500 0x3026), 501 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV }, 502 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 503 0x0036, 504 PCI_VENDOR_ID_ATHEROS, 505 0x302B), 506 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV }, 507 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 508 0x0036, 509 PCI_VENDOR_ID_FOXCONN, 510 0xE069), 511 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV }, 512 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 513 0x0036, 514 0x185F, /* WNC */ 515 0x3028), 516 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV }, 517 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 518 0x0036, 519 0x11AD, /* LITEON */ 520 0x0622), 521 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV }, 522 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 523 0x0036, 524 0x11AD, /* LITEON */ 525 0x0672), 526 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV }, 527 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 528 0x0036, 529 0x11AD, /* LITEON */ 530 0x0662), 531 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV }, 532 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 533 0x0036, 534 0x11AD, /* LITEON */ 535 0x06A2), 536 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV }, 537 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 538 0x0036, 539 0x11AD, /* LITEON */ 540 0x0682), 541 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV }, 542 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 543 0x0036, 544 PCI_VENDOR_ID_AZWAVE, 545 0x213A), 546 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV }, 547 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 548 0x0036, 549 PCI_VENDOR_ID_AZWAVE, 550 0x213C), 551 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV }, 552 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 553 0x0036, 554 PCI_VENDOR_ID_HP, 555 0x18E3), 556 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV }, 557 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 558 0x0036, 559 PCI_VENDOR_ID_HP, 560 0x217F), 561 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV }, 562 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 563 0x0036, 564 PCI_VENDOR_ID_HP, 565 0x2005), 566 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV }, 567 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 568 0x0036, 569 PCI_VENDOR_ID_DELL, 570 0x020C), 571 .driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV }, 572 573 /* WB335 2-ANT / Antenna-Diversity */ 574 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 575 0x0036, 576 PCI_VENDOR_ID_SAMSUNG, 577 0x411A), 578 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 579 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 580 0x0036, 581 PCI_VENDOR_ID_SAMSUNG, 582 0x411B), 583 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 584 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 585 0x0036, 586 PCI_VENDOR_ID_SAMSUNG, 587 0x411C), 588 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 589 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 590 0x0036, 591 PCI_VENDOR_ID_SAMSUNG, 592 0x411D), 593 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 594 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 595 0x0036, 596 PCI_VENDOR_ID_SAMSUNG, 597 0x411E), 598 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 599 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 600 0x0036, 601 PCI_VENDOR_ID_SAMSUNG, 602 0x4129), 603 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 604 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 605 0x0036, 606 PCI_VENDOR_ID_SAMSUNG, 607 0x412A), 608 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 609 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 610 0x0036, 611 PCI_VENDOR_ID_ATHEROS, 612 0x3027), 613 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 614 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 615 0x0036, 616 PCI_VENDOR_ID_ATHEROS, 617 0x302C), 618 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 619 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 620 0x0036, 621 0x11AD, /* LITEON */ 622 0x0642), 623 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 624 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 625 0x0036, 626 0x11AD, /* LITEON */ 627 0x0652), 628 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 629 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 630 0x0036, 631 0x11AD, /* LITEON */ 632 0x0612), 633 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 634 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 635 0x0036, 636 0x11AD, /* LITEON */ 637 0x0832), 638 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 639 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 640 0x0036, 641 0x11AD, /* LITEON */ 642 0x1832), 643 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 644 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 645 0x0036, 646 0x11AD, /* LITEON */ 647 0x0692), 648 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 649 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 650 0x0036, 651 0x11AD, /* LITEON */ 652 0x0803), 653 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 654 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 655 0x0036, 656 0x11AD, /* LITEON */ 657 0x0813), 658 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 659 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 660 0x0036, 661 PCI_VENDOR_ID_AZWAVE, 662 0x2130), 663 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 664 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 665 0x0036, 666 PCI_VENDOR_ID_AZWAVE, 667 0x213B), 668 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 669 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 670 0x0036, 671 PCI_VENDOR_ID_AZWAVE, 672 0x2182), 673 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 674 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 675 0x0036, 676 PCI_VENDOR_ID_AZWAVE, 677 0x218B), 678 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 679 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 680 0x0036, 681 PCI_VENDOR_ID_AZWAVE, 682 0x218C), 683 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 684 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 685 0x0036, 686 PCI_VENDOR_ID_AZWAVE, 687 0x2F82), 688 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 689 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 690 0x0036, 691 0x144F, /* ASKEY */ 692 0x7202), 693 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 694 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 695 0x0036, 696 0x1B9A, /* XAVI */ 697 0x2810), 698 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 699 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 700 0x0036, 701 0x1B9A, /* XAVI */ 702 0x2813), 703 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 704 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 705 0x0036, 706 0x1B9A, /* XAVI */ 707 0x28A2), 708 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 709 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 710 0x0036, 711 0x1B9A, /* XAVI */ 712 0x28A4), 713 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 714 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 715 0x0036, 716 0x185F, /* WNC */ 717 0x3027), 718 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 719 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 720 0x0036, 721 0x185F, /* WNC */ 722 0xA120), 723 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 724 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 725 0x0036, 726 PCI_VENDOR_ID_FOXCONN, 727 0xE07F), 728 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 729 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 730 0x0036, 731 PCI_VENDOR_ID_FOXCONN, 732 0xE08F), 733 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 734 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 735 0x0036, 736 PCI_VENDOR_ID_FOXCONN, 737 0xE081), 738 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 739 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 740 0x0036, 741 PCI_VENDOR_ID_FOXCONN, 742 0xE091), 743 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 744 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 745 0x0036, 746 PCI_VENDOR_ID_FOXCONN, 747 0xE099), 748 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 749 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 750 0x0036, 751 PCI_VENDOR_ID_LENOVO, 752 0x3026), 753 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 754 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 755 0x0036, 756 PCI_VENDOR_ID_LENOVO, 757 0x4026), 758 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 759 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 760 0x0036, 761 PCI_VENDOR_ID_ASUSTEK, 762 0x85F2), 763 .driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV }, 764 { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 765 0x0036, 766 PCI_VENDOR_ID_DELL, 767 0x020E), 768 .driver_data = ATH9K_PCI_AR9565_2ANT | 769 ATH9K_PCI_BT_ANT_DIV | 770 ATH9K_PCI_LED_ACT_HI}, 771 772 /* PCI-E AR9565 (WB335) */ 773 { PCI_VDEVICE(ATHEROS, 0x0036), 774 .driver_data = ATH9K_PCI_BT_ANT_DIV }, 775 #endif 776 777 { 0 } 778 }; 779 780 781 /* return bus cachesize in 4B word units */ 782 static void ath_pci_read_cachesize(struct ath_common *common, int *csz) 783 { 784 struct ath_softc *sc = common->priv; 785 u8 u8tmp; 786 787 pci_read_config_byte(to_pci_dev(sc->dev), PCI_CACHE_LINE_SIZE, &u8tmp); 788 *csz = (int)u8tmp; 789 790 /* 791 * This check was put in to avoid "unpleasant" consequences if 792 * the bootrom has not fully initialized all PCI devices. 793 * Sometimes the cache line size register is not set 794 */ 795 796 if (*csz == 0) 797 *csz = DEFAULT_CACHELINE >> 2; /* Use the default size */ 798 } 799 800 static bool ath_pci_eeprom_read(struct ath_common *common, u32 off, u16 *data) 801 { 802 struct ath_hw *ah = 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(ah), 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(ah)), 815 AR_EEPROM_STATUS_DATA_VAL); 816 817 return true; 818 } 819 820 /* Need to be called after we discover btcoex capabilities */ 821 static void ath_pci_aspm_init(struct ath_common *common) 822 { 823 struct ath_softc *sc = 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 879 static 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 886 static 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%p, irq=%d\n", 992 hw_name, sc->mem, pdev->irq); 993 994 return 0; 995 996 err_init: 997 free_irq(sc->irq, sc); 998 err_irq: 999 ieee80211_free_hw(hw); 1000 return ret; 1001 } 1002 1003 static 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 1017 static 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 1040 static 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 1064 static 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 1075 MODULE_DEVICE_TABLE(pci, ath_pci_id_table); 1076 1077 static 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 1085 int ath_pci_init(void) 1086 { 1087 return pci_register_driver(&ath_pci_driver); 1088 } 1089 1090 void ath_pci_exit(void) 1091 { 1092 pci_unregister_driver(&ath_pci_driver); 1093 } 1094