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