diff options
author | David S. Miller <davem@davemloft.net> | 2012-09-30 02:30:16 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-09-30 02:30:16 -0400 |
commit | a248afdc1b5916c2bfd007233112333d85aa28f6 (patch) | |
tree | 49d4a0b8fdcf7624ea6b0bdf0af2567d7392210e /drivers/net/wireless/ath/ath9k | |
parent | d379142bc4d9b78cdd9fc5aa696ca1ea083fb7d4 (diff) | |
parent | c487606f835a93a725bac1aefd536be98f22474d (diff) |
Merge branch 'for-davem' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next
John W. Linville says:
====================
Here is another batch of updates intended for 3.7...
Highlights include an hci_connect re-write in Bluetooth, HCI/LLC
layer separation in NFC, removal of the raw pn544 NFC driver, NFC LLCP
raw sockets support, improved IBSS auth frame handling in mac80211,
full-MAC AP mode notification support in mac80211, a lot of attention
paid to brcmfmac, and the usual level of updates to iwlwifi, ath9k,
mwifiex, and rt2x00, and various other updates.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/wireless/ath/ath9k')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/antenna.c | 117 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9003_eeprom.c | 20 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9003_mci.c | 7 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9003_mci.h | 4 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9003_phy.c | 66 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9003_phy.h | 24 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9565_1p0_initvals.h | 100 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ath9k.h | 6 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/gpio.c | 58 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/hif_usb.c | 5 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/htc_drv_main.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/hw-ops.h | 7 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/hw.c | 12 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/hw.h | 3 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/init.c | 13 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/main.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/mci.c | 62 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/pci.c | 5 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/rc.c | 11 |
19 files changed, 347 insertions, 177 deletions
diff --git a/drivers/net/wireless/ath/ath9k/antenna.c b/drivers/net/wireless/ath/ath9k/antenna.c index bbcfeb3b2a60..664844c5d3d5 100644 --- a/drivers/net/wireless/ath/ath9k/antenna.c +++ b/drivers/net/wireless/ath/ath9k/antenna.c | |||
@@ -311,6 +311,9 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf, | |||
311 | struct ath_ant_comb *antcomb, | 311 | struct ath_ant_comb *antcomb, |
312 | int alt_ratio) | 312 | int alt_ratio) |
313 | { | 313 | { |
314 | ant_conf->main_gaintb = 0; | ||
315 | ant_conf->alt_gaintb = 0; | ||
316 | |||
314 | if (ant_conf->div_group == 0) { | 317 | if (ant_conf->div_group == 0) { |
315 | /* Adjust the fast_div_bias based on main and alt lna conf */ | 318 | /* Adjust the fast_div_bias based on main and alt lna conf */ |
316 | switch ((ant_conf->main_lna_conf << 4) | | 319 | switch ((ant_conf->main_lna_conf << 4) | |
@@ -360,18 +363,12 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf, | |||
360 | ant_conf->alt_lna_conf) { | 363 | ant_conf->alt_lna_conf) { |
361 | case 0x01: /* A-B LNA2 */ | 364 | case 0x01: /* A-B LNA2 */ |
362 | ant_conf->fast_div_bias = 0x1; | 365 | ant_conf->fast_div_bias = 0x1; |
363 | ant_conf->main_gaintb = 0; | ||
364 | ant_conf->alt_gaintb = 0; | ||
365 | break; | 366 | break; |
366 | case 0x02: /* A-B LNA1 */ | 367 | case 0x02: /* A-B LNA1 */ |
367 | ant_conf->fast_div_bias = 0x1; | 368 | ant_conf->fast_div_bias = 0x1; |
368 | ant_conf->main_gaintb = 0; | ||
369 | ant_conf->alt_gaintb = 0; | ||
370 | break; | 369 | break; |
371 | case 0x03: /* A-B A+B */ | 370 | case 0x03: /* A-B A+B */ |
372 | ant_conf->fast_div_bias = 0x1; | 371 | ant_conf->fast_div_bias = 0x1; |
373 | ant_conf->main_gaintb = 0; | ||
374 | ant_conf->alt_gaintb = 0; | ||
375 | break; | 372 | break; |
376 | case 0x10: /* LNA2 A-B */ | 373 | case 0x10: /* LNA2 A-B */ |
377 | if (!(antcomb->scan) && | 374 | if (!(antcomb->scan) && |
@@ -379,13 +376,9 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf, | |||
379 | ant_conf->fast_div_bias = 0x3f; | 376 | ant_conf->fast_div_bias = 0x3f; |
380 | else | 377 | else |
381 | ant_conf->fast_div_bias = 0x1; | 378 | ant_conf->fast_div_bias = 0x1; |
382 | ant_conf->main_gaintb = 0; | ||
383 | ant_conf->alt_gaintb = 0; | ||
384 | break; | 379 | break; |
385 | case 0x12: /* LNA2 LNA1 */ | 380 | case 0x12: /* LNA2 LNA1 */ |
386 | ant_conf->fast_div_bias = 0x1; | 381 | ant_conf->fast_div_bias = 0x1; |
387 | ant_conf->main_gaintb = 0; | ||
388 | ant_conf->alt_gaintb = 0; | ||
389 | break; | 382 | break; |
390 | case 0x13: /* LNA2 A+B */ | 383 | case 0x13: /* LNA2 A+B */ |
391 | if (!(antcomb->scan) && | 384 | if (!(antcomb->scan) && |
@@ -393,8 +386,6 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf, | |||
393 | ant_conf->fast_div_bias = 0x3f; | 386 | ant_conf->fast_div_bias = 0x3f; |
394 | else | 387 | else |
395 | ant_conf->fast_div_bias = 0x1; | 388 | ant_conf->fast_div_bias = 0x1; |
396 | ant_conf->main_gaintb = 0; | ||
397 | ant_conf->alt_gaintb = 0; | ||
398 | break; | 389 | break; |
399 | case 0x20: /* LNA1 A-B */ | 390 | case 0x20: /* LNA1 A-B */ |
400 | if (!(antcomb->scan) && | 391 | if (!(antcomb->scan) && |
@@ -402,13 +393,9 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf, | |||
402 | ant_conf->fast_div_bias = 0x3f; | 393 | ant_conf->fast_div_bias = 0x3f; |
403 | else | 394 | else |
404 | ant_conf->fast_div_bias = 0x1; | 395 | ant_conf->fast_div_bias = 0x1; |
405 | ant_conf->main_gaintb = 0; | ||
406 | ant_conf->alt_gaintb = 0; | ||
407 | break; | 396 | break; |
408 | case 0x21: /* LNA1 LNA2 */ | 397 | case 0x21: /* LNA1 LNA2 */ |
409 | ant_conf->fast_div_bias = 0x1; | 398 | ant_conf->fast_div_bias = 0x1; |
410 | ant_conf->main_gaintb = 0; | ||
411 | ant_conf->alt_gaintb = 0; | ||
412 | break; | 399 | break; |
413 | case 0x23: /* LNA1 A+B */ | 400 | case 0x23: /* LNA1 A+B */ |
414 | if (!(antcomb->scan) && | 401 | if (!(antcomb->scan) && |
@@ -416,23 +403,15 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf, | |||
416 | ant_conf->fast_div_bias = 0x3f; | 403 | ant_conf->fast_div_bias = 0x3f; |
417 | else | 404 | else |
418 | ant_conf->fast_div_bias = 0x1; | 405 | ant_conf->fast_div_bias = 0x1; |
419 | ant_conf->main_gaintb = 0; | ||
420 | ant_conf->alt_gaintb = 0; | ||
421 | break; | 406 | break; |
422 | case 0x30: /* A+B A-B */ | 407 | case 0x30: /* A+B A-B */ |
423 | ant_conf->fast_div_bias = 0x1; | 408 | ant_conf->fast_div_bias = 0x1; |
424 | ant_conf->main_gaintb = 0; | ||
425 | ant_conf->alt_gaintb = 0; | ||
426 | break; | 409 | break; |
427 | case 0x31: /* A+B LNA2 */ | 410 | case 0x31: /* A+B LNA2 */ |
428 | ant_conf->fast_div_bias = 0x1; | 411 | ant_conf->fast_div_bias = 0x1; |
429 | ant_conf->main_gaintb = 0; | ||
430 | ant_conf->alt_gaintb = 0; | ||
431 | break; | 412 | break; |
432 | case 0x32: /* A+B LNA1 */ | 413 | case 0x32: /* A+B LNA1 */ |
433 | ant_conf->fast_div_bias = 0x1; | 414 | ant_conf->fast_div_bias = 0x1; |
434 | ant_conf->main_gaintb = 0; | ||
435 | ant_conf->alt_gaintb = 0; | ||
436 | break; | 415 | break; |
437 | default: | 416 | default: |
438 | break; | 417 | break; |
@@ -443,18 +422,12 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf, | |||
443 | ant_conf->alt_lna_conf) { | 422 | ant_conf->alt_lna_conf) { |
444 | case 0x01: /* A-B LNA2 */ | 423 | case 0x01: /* A-B LNA2 */ |
445 | ant_conf->fast_div_bias = 0x1; | 424 | ant_conf->fast_div_bias = 0x1; |
446 | ant_conf->main_gaintb = 0; | ||
447 | ant_conf->alt_gaintb = 0; | ||
448 | break; | 425 | break; |
449 | case 0x02: /* A-B LNA1 */ | 426 | case 0x02: /* A-B LNA1 */ |
450 | ant_conf->fast_div_bias = 0x1; | 427 | ant_conf->fast_div_bias = 0x1; |
451 | ant_conf->main_gaintb = 0; | ||
452 | ant_conf->alt_gaintb = 0; | ||
453 | break; | 428 | break; |
454 | case 0x03: /* A-B A+B */ | 429 | case 0x03: /* A-B A+B */ |
455 | ant_conf->fast_div_bias = 0x1; | 430 | ant_conf->fast_div_bias = 0x1; |
456 | ant_conf->main_gaintb = 0; | ||
457 | ant_conf->alt_gaintb = 0; | ||
458 | break; | 431 | break; |
459 | case 0x10: /* LNA2 A-B */ | 432 | case 0x10: /* LNA2 A-B */ |
460 | if (!(antcomb->scan) && | 433 | if (!(antcomb->scan) && |
@@ -462,13 +435,9 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf, | |||
462 | ant_conf->fast_div_bias = 0x1; | 435 | ant_conf->fast_div_bias = 0x1; |
463 | else | 436 | else |
464 | ant_conf->fast_div_bias = 0x2; | 437 | ant_conf->fast_div_bias = 0x2; |
465 | ant_conf->main_gaintb = 0; | ||
466 | ant_conf->alt_gaintb = 0; | ||
467 | break; | 438 | break; |
468 | case 0x12: /* LNA2 LNA1 */ | 439 | case 0x12: /* LNA2 LNA1 */ |
469 | ant_conf->fast_div_bias = 0x1; | 440 | ant_conf->fast_div_bias = 0x1; |
470 | ant_conf->main_gaintb = 0; | ||
471 | ant_conf->alt_gaintb = 0; | ||
472 | break; | 441 | break; |
473 | case 0x13: /* LNA2 A+B */ | 442 | case 0x13: /* LNA2 A+B */ |
474 | if (!(antcomb->scan) && | 443 | if (!(antcomb->scan) && |
@@ -476,8 +445,6 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf, | |||
476 | ant_conf->fast_div_bias = 0x1; | 445 | ant_conf->fast_div_bias = 0x1; |
477 | else | 446 | else |
478 | ant_conf->fast_div_bias = 0x2; | 447 | ant_conf->fast_div_bias = 0x2; |
479 | ant_conf->main_gaintb = 0; | ||
480 | ant_conf->alt_gaintb = 0; | ||
481 | break; | 448 | break; |
482 | case 0x20: /* LNA1 A-B */ | 449 | case 0x20: /* LNA1 A-B */ |
483 | if (!(antcomb->scan) && | 450 | if (!(antcomb->scan) && |
@@ -485,13 +452,9 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf, | |||
485 | ant_conf->fast_div_bias = 0x1; | 452 | ant_conf->fast_div_bias = 0x1; |
486 | else | 453 | else |
487 | ant_conf->fast_div_bias = 0x2; | 454 | ant_conf->fast_div_bias = 0x2; |
488 | ant_conf->main_gaintb = 0; | ||
489 | ant_conf->alt_gaintb = 0; | ||
490 | break; | 455 | break; |
491 | case 0x21: /* LNA1 LNA2 */ | 456 | case 0x21: /* LNA1 LNA2 */ |
492 | ant_conf->fast_div_bias = 0x1; | 457 | ant_conf->fast_div_bias = 0x1; |
493 | ant_conf->main_gaintb = 0; | ||
494 | ant_conf->alt_gaintb = 0; | ||
495 | break; | 458 | break; |
496 | case 0x23: /* LNA1 A+B */ | 459 | case 0x23: /* LNA1 A+B */ |
497 | if (!(antcomb->scan) && | 460 | if (!(antcomb->scan) && |
@@ -499,23 +462,77 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf, | |||
499 | ant_conf->fast_div_bias = 0x1; | 462 | ant_conf->fast_div_bias = 0x1; |
500 | else | 463 | else |
501 | ant_conf->fast_div_bias = 0x2; | 464 | ant_conf->fast_div_bias = 0x2; |
502 | ant_conf->main_gaintb = 0; | ||
503 | ant_conf->alt_gaintb = 0; | ||
504 | break; | 465 | break; |
505 | case 0x30: /* A+B A-B */ | 466 | case 0x30: /* A+B A-B */ |
506 | ant_conf->fast_div_bias = 0x1; | 467 | ant_conf->fast_div_bias = 0x1; |
507 | ant_conf->main_gaintb = 0; | ||
508 | ant_conf->alt_gaintb = 0; | ||
509 | break; | 468 | break; |
510 | case 0x31: /* A+B LNA2 */ | 469 | case 0x31: /* A+B LNA2 */ |
511 | ant_conf->fast_div_bias = 0x1; | 470 | ant_conf->fast_div_bias = 0x1; |
512 | ant_conf->main_gaintb = 0; | ||
513 | ant_conf->alt_gaintb = 0; | ||
514 | break; | 471 | break; |
515 | case 0x32: /* A+B LNA1 */ | 472 | case 0x32: /* A+B LNA1 */ |
516 | ant_conf->fast_div_bias = 0x1; | 473 | ant_conf->fast_div_bias = 0x1; |
517 | ant_conf->main_gaintb = 0; | 474 | break; |
518 | ant_conf->alt_gaintb = 0; | 475 | default: |
476 | break; | ||
477 | } | ||
478 | } else if (ant_conf->div_group == 3) { | ||
479 | switch ((ant_conf->main_lna_conf << 4) | | ||
480 | ant_conf->alt_lna_conf) { | ||
481 | case 0x01: /* A-B LNA2 */ | ||
482 | ant_conf->fast_div_bias = 0x1; | ||
483 | break; | ||
484 | case 0x02: /* A-B LNA1 */ | ||
485 | ant_conf->fast_div_bias = 0x39; | ||
486 | break; | ||
487 | case 0x03: /* A-B A+B */ | ||
488 | ant_conf->fast_div_bias = 0x1; | ||
489 | break; | ||
490 | case 0x10: /* LNA2 A-B */ | ||
491 | if ((antcomb->scan == 0) && | ||
492 | (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) { | ||
493 | ant_conf->fast_div_bias = 0x3f; | ||
494 | } else { | ||
495 | ant_conf->fast_div_bias = 0x1; | ||
496 | } | ||
497 | break; | ||
498 | case 0x12: /* LNA2 LNA1 */ | ||
499 | ant_conf->fast_div_bias = 0x39; | ||
500 | break; | ||
501 | case 0x13: /* LNA2 A+B */ | ||
502 | if ((antcomb->scan == 0) && | ||
503 | (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) { | ||
504 | ant_conf->fast_div_bias = 0x3f; | ||
505 | } else { | ||
506 | ant_conf->fast_div_bias = 0x1; | ||
507 | } | ||
508 | break; | ||
509 | case 0x20: /* LNA1 A-B */ | ||
510 | if ((antcomb->scan == 0) && | ||
511 | (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) { | ||
512 | ant_conf->fast_div_bias = 0x3f; | ||
513 | } else { | ||
514 | ant_conf->fast_div_bias = 0x4; | ||
515 | } | ||
516 | break; | ||
517 | case 0x21: /* LNA1 LNA2 */ | ||
518 | ant_conf->fast_div_bias = 0x6; | ||
519 | break; | ||
520 | case 0x23: /* LNA1 A+B */ | ||
521 | if ((antcomb->scan == 0) && | ||
522 | (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) { | ||
523 | ant_conf->fast_div_bias = 0x3f; | ||
524 | } else { | ||
525 | ant_conf->fast_div_bias = 0x6; | ||
526 | } | ||
527 | break; | ||
528 | case 0x30: /* A+B A-B */ | ||
529 | ant_conf->fast_div_bias = 0x1; | ||
530 | break; | ||
531 | case 0x31: /* A+B LNA2 */ | ||
532 | ant_conf->fast_div_bias = 0x6; | ||
533 | break; | ||
534 | case 0x32: /* A+B LNA1 */ | ||
535 | ant_conf->fast_div_bias = 0x1; | ||
519 | break; | 536 | break; |
520 | default: | 537 | default: |
521 | break; | 538 | break; |
@@ -759,6 +776,7 @@ div_comb_done: | |||
759 | void ath_ant_comb_update(struct ath_softc *sc) | 776 | void ath_ant_comb_update(struct ath_softc *sc) |
760 | { | 777 | { |
761 | struct ath_hw *ah = sc->sc_ah; | 778 | struct ath_hw *ah = sc->sc_ah; |
779 | struct ath_common *common = ath9k_hw_common(ah); | ||
762 | struct ath_hw_antcomb_conf div_ant_conf; | 780 | struct ath_hw_antcomb_conf div_ant_conf; |
763 | u8 lna_conf; | 781 | u8 lna_conf; |
764 | 782 | ||
@@ -773,4 +791,7 @@ void ath_ant_comb_update(struct ath_softc *sc) | |||
773 | div_ant_conf.alt_lna_conf = lna_conf; | 791 | div_ant_conf.alt_lna_conf = lna_conf; |
774 | 792 | ||
775 | ath9k_hw_antdiv_comb_conf_set(ah, &div_ant_conf); | 793 | ath9k_hw_antdiv_comb_conf_set(ah, &div_ant_conf); |
794 | |||
795 | if (common->antenna_diversity) | ||
796 | ath9k_hw_antctrl_shared_chain_lnadiv(ah, true); | ||
776 | } | 797 | } |
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c index 884f9f0014ae..5bbe5057ba18 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c | |||
@@ -3566,9 +3566,9 @@ static u16 ar9003_hw_ant_ctrl_chain_get(struct ath_hw *ah, int chain, | |||
3566 | 3566 | ||
3567 | static void ar9003_hw_ant_ctrl_apply(struct ath_hw *ah, bool is2ghz) | 3567 | static void ar9003_hw_ant_ctrl_apply(struct ath_hw *ah, bool is2ghz) |
3568 | { | 3568 | { |
3569 | struct ath9k_hw_capabilities *pCap = &ah->caps; | ||
3569 | int chain; | 3570 | int chain; |
3570 | u32 regval; | 3571 | u32 regval; |
3571 | u32 ant_div_ctl1; | ||
3572 | static const u32 switch_chain_reg[AR9300_MAX_CHAINS] = { | 3572 | static const u32 switch_chain_reg[AR9300_MAX_CHAINS] = { |
3573 | AR_PHY_SWITCH_CHAIN_0, | 3573 | AR_PHY_SWITCH_CHAIN_0, |
3574 | AR_PHY_SWITCH_CHAIN_1, | 3574 | AR_PHY_SWITCH_CHAIN_1, |
@@ -3633,6 +3633,16 @@ static void ar9003_hw_ant_ctrl_apply(struct ath_hw *ah, bool is2ghz) | |||
3633 | /* enable_lnadiv */ | 3633 | /* enable_lnadiv */ |
3634 | regval &= (~AR_PHY_ANT_DIV_LNADIV); | 3634 | regval &= (~AR_PHY_ANT_DIV_LNADIV); |
3635 | regval |= ((value >> 6) & 0x1) << AR_PHY_ANT_DIV_LNADIV_S; | 3635 | regval |= ((value >> 6) & 0x1) << AR_PHY_ANT_DIV_LNADIV_S; |
3636 | |||
3637 | if (AR_SREV_9565(ah)) { | ||
3638 | if (ah->shared_chain_lnadiv) { | ||
3639 | regval |= (1 << AR_PHY_ANT_SW_RX_PROT_S); | ||
3640 | } else { | ||
3641 | regval &= ~(1 << AR_PHY_ANT_DIV_LNADIV_S); | ||
3642 | regval &= ~(1 << AR_PHY_ANT_SW_RX_PROT_S); | ||
3643 | } | ||
3644 | } | ||
3645 | |||
3636 | REG_WRITE(ah, AR_PHY_MC_GAIN_CTRL, regval); | 3646 | REG_WRITE(ah, AR_PHY_MC_GAIN_CTRL, regval); |
3637 | 3647 | ||
3638 | /*enable fast_div */ | 3648 | /*enable fast_div */ |
@@ -3640,9 +3650,8 @@ static void ar9003_hw_ant_ctrl_apply(struct ath_hw *ah, bool is2ghz) | |||
3640 | regval &= (~AR_FAST_DIV_ENABLE); | 3650 | regval &= (~AR_FAST_DIV_ENABLE); |
3641 | regval |= ((value >> 7) & 0x1) << AR_FAST_DIV_ENABLE_S; | 3651 | regval |= ((value >> 7) & 0x1) << AR_FAST_DIV_ENABLE_S; |
3642 | REG_WRITE(ah, AR_PHY_CCK_DETECT, regval); | 3652 | REG_WRITE(ah, AR_PHY_CCK_DETECT, regval); |
3643 | ant_div_ctl1 = ah->eep_ops->get_eeprom(ah, EEP_ANT_DIV_CTL1); | 3653 | |
3644 | /* check whether antenna diversity is enabled */ | 3654 | if (pCap->hw_caps & ATH9K_HW_CAP_ANT_DIV_COMB) { |
3645 | if ((ant_div_ctl1 >> 0x6) == 0x3) { | ||
3646 | regval = REG_READ(ah, AR_PHY_MC_GAIN_CTRL); | 3655 | regval = REG_READ(ah, AR_PHY_MC_GAIN_CTRL); |
3647 | /* | 3656 | /* |
3648 | * clear bits 25-30 main_lnaconf, alt_lnaconf, | 3657 | * clear bits 25-30 main_lnaconf, alt_lnaconf, |
@@ -3659,10 +3668,7 @@ static void ar9003_hw_ant_ctrl_apply(struct ath_hw *ah, bool is2ghz) | |||
3659 | AR_PHY_ANT_DIV_ALT_LNACONF_S); | 3668 | AR_PHY_ANT_DIV_ALT_LNACONF_S); |
3660 | REG_WRITE(ah, AR_PHY_MC_GAIN_CTRL, regval); | 3669 | REG_WRITE(ah, AR_PHY_MC_GAIN_CTRL, regval); |
3661 | } | 3670 | } |
3662 | |||
3663 | |||
3664 | } | 3671 | } |
3665 | |||
3666 | } | 3672 | } |
3667 | 3673 | ||
3668 | static void ar9003_hw_drive_strength_apply(struct ath_hw *ah) | 3674 | static void ar9003_hw_drive_strength_apply(struct ath_hw *ah) |
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mci.c b/drivers/net/wireless/ath/ath9k/ar9003_mci.c index b2e39e8a21b5..8dbb60b53f1a 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_mci.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_mci.c | |||
@@ -1027,6 +1027,7 @@ void ar9003_mci_2g5g_switch(struct ath_hw *ah, bool force) | |||
1027 | 1027 | ||
1028 | if (!(mci->config & ATH_MCI_CONFIG_DISABLE_OSLA)) | 1028 | if (!(mci->config & ATH_MCI_CONFIG_DISABLE_OSLA)) |
1029 | ar9003_mci_osla_setup(ah, true); | 1029 | ar9003_mci_osla_setup(ah, true); |
1030 | REG_WRITE(ah, AR_SELFGEN_MASK, 0x02); | ||
1030 | } else { | 1031 | } else { |
1031 | ar9003_mci_send_lna_take(ah, true); | 1032 | ar9003_mci_send_lna_take(ah, true); |
1032 | udelay(5); | 1033 | udelay(5); |
@@ -1235,6 +1236,10 @@ u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type) | |||
1235 | case MCI_STATE_NEED_FTP_STOMP: | 1236 | case MCI_STATE_NEED_FTP_STOMP: |
1236 | value = !(mci->config & ATH_MCI_CONFIG_DISABLE_FTP_STOMP); | 1237 | value = !(mci->config & ATH_MCI_CONFIG_DISABLE_FTP_STOMP); |
1237 | break; | 1238 | break; |
1239 | case MCI_STATE_NEED_FLUSH_BT_INFO: | ||
1240 | value = (!mci->unhalt_bt_gpm && mci->need_flush_btinfo) ? 1 : 0; | ||
1241 | mci->need_flush_btinfo = false; | ||
1242 | break; | ||
1238 | default: | 1243 | default: |
1239 | break; | 1244 | break; |
1240 | } | 1245 | } |
@@ -1284,7 +1289,7 @@ void ar9003_mci_set_power_awake(struct ath_hw *ah) | |||
1284 | } | 1289 | } |
1285 | REG_WRITE(ah, AR_DIAG_SW, (diag_sw | BIT(27) | BIT(19) | BIT(18))); | 1290 | REG_WRITE(ah, AR_DIAG_SW, (diag_sw | BIT(27) | BIT(19) | BIT(18))); |
1286 | lna_ctrl = REG_READ(ah, AR_OBS_BUS_CTRL) & 0x3; | 1291 | lna_ctrl = REG_READ(ah, AR_OBS_BUS_CTRL) & 0x3; |
1287 | bt_sleep = REG_READ(ah, AR_MCI_RX_STATUS) & AR_MCI_RX_REMOTE_SLEEP; | 1292 | bt_sleep = MS(REG_READ(ah, AR_MCI_RX_STATUS), AR_MCI_RX_REMOTE_SLEEP); |
1288 | 1293 | ||
1289 | REG_WRITE(ah, AR_BTCOEX_CTRL2, btcoex_ctrl2); | 1294 | REG_WRITE(ah, AR_BTCOEX_CTRL2, btcoex_ctrl2); |
1290 | REG_WRITE(ah, AR_DIAG_SW, diag_sw); | 1295 | REG_WRITE(ah, AR_DIAG_SW, diag_sw); |
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mci.h b/drivers/net/wireless/ath/ath9k/ar9003_mci.h index f3bef8d69edd..30acf2869aa4 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_mci.h +++ b/drivers/net/wireless/ath/ath9k/ar9003_mci.h | |||
@@ -200,6 +200,7 @@ enum mci_state_type { | |||
200 | MCI_STATE_RECOVER_RX, | 200 | MCI_STATE_RECOVER_RX, |
201 | MCI_STATE_NEED_FTP_STOMP, | 201 | MCI_STATE_NEED_FTP_STOMP, |
202 | MCI_STATE_DEBUG, | 202 | MCI_STATE_DEBUG, |
203 | MCI_STATE_NEED_FLUSH_BT_INFO, | ||
203 | MCI_STATE_MAX | 204 | MCI_STATE_MAX |
204 | }; | 205 | }; |
205 | 206 | ||
@@ -211,7 +212,8 @@ enum mci_gpm_coex_opcode { | |||
211 | MCI_GPM_COEX_WLAN_CHANNELS, | 212 | MCI_GPM_COEX_WLAN_CHANNELS, |
212 | MCI_GPM_COEX_BT_PROFILE_INFO, | 213 | MCI_GPM_COEX_BT_PROFILE_INFO, |
213 | MCI_GPM_COEX_BT_STATUS_UPDATE, | 214 | MCI_GPM_COEX_BT_STATUS_UPDATE, |
214 | MCI_GPM_COEX_BT_UPDATE_FLAGS | 215 | MCI_GPM_COEX_BT_UPDATE_FLAGS, |
216 | MCI_GPM_COEX_NOOP, | ||
215 | }; | 217 | }; |
216 | 218 | ||
217 | #define MCI_GPM_NOMORE 0 | 219 | #define MCI_GPM_NOMORE 0 |
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.c b/drivers/net/wireless/ath/ath9k/ar9003_phy.c index 0d800c62e227..fc67844a1430 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c | |||
@@ -605,9 +605,6 @@ static void ar9003_hw_set_chain_masks(struct ath_hw *ah, u8 rx, u8 tx) | |||
605 | 605 | ||
606 | if ((ah->caps.hw_caps & ATH9K_HW_CAP_APM) && (tx == 0x7)) | 606 | if ((ah->caps.hw_caps & ATH9K_HW_CAP_APM) && (tx == 0x7)) |
607 | REG_WRITE(ah, AR_SELFGEN_MASK, 0x3); | 607 | REG_WRITE(ah, AR_SELFGEN_MASK, 0x3); |
608 | else if (AR_SREV_9462(ah)) | ||
609 | /* xxx only when MCI support is enabled */ | ||
610 | REG_WRITE(ah, AR_SELFGEN_MASK, 0x3); | ||
611 | else | 608 | else |
612 | REG_WRITE(ah, AR_SELFGEN_MASK, tx); | 609 | REG_WRITE(ah, AR_SELFGEN_MASK, tx); |
613 | 610 | ||
@@ -1294,6 +1291,9 @@ static void ar9003_hw_antdiv_comb_conf_get(struct ath_hw *ah, | |||
1294 | } else if (AR_SREV_9485(ah)) { | 1291 | } else if (AR_SREV_9485(ah)) { |
1295 | antconf->lna1_lna2_delta = -9; | 1292 | antconf->lna1_lna2_delta = -9; |
1296 | antconf->div_group = 2; | 1293 | antconf->div_group = 2; |
1294 | } else if (AR_SREV_9565(ah)) { | ||
1295 | antconf->lna1_lna2_delta = -3; | ||
1296 | antconf->div_group = 3; | ||
1297 | } else { | 1297 | } else { |
1298 | antconf->lna1_lna2_delta = -3; | 1298 | antconf->lna1_lna2_delta = -3; |
1299 | antconf->div_group = 0; | 1299 | antconf->div_group = 0; |
@@ -1325,6 +1325,65 @@ static void ar9003_hw_antdiv_comb_conf_set(struct ath_hw *ah, | |||
1325 | REG_WRITE(ah, AR_PHY_MC_GAIN_CTRL, regval); | 1325 | REG_WRITE(ah, AR_PHY_MC_GAIN_CTRL, regval); |
1326 | } | 1326 | } |
1327 | 1327 | ||
1328 | static void ar9003_hw_antctrl_shared_chain_lnadiv(struct ath_hw *ah, | ||
1329 | bool enable) | ||
1330 | { | ||
1331 | u8 ant_div_ctl1; | ||
1332 | u32 regval; | ||
1333 | |||
1334 | if (!AR_SREV_9565(ah)) | ||
1335 | return; | ||
1336 | |||
1337 | ah->shared_chain_lnadiv = enable; | ||
1338 | ant_div_ctl1 = ah->eep_ops->get_eeprom(ah, EEP_ANT_DIV_CTL1); | ||
1339 | |||
1340 | regval = REG_READ(ah, AR_PHY_MC_GAIN_CTRL); | ||
1341 | regval &= (~AR_ANT_DIV_CTRL_ALL); | ||
1342 | regval |= (ant_div_ctl1 & 0x3f) << AR_ANT_DIV_CTRL_ALL_S; | ||
1343 | regval &= ~AR_PHY_ANT_DIV_LNADIV; | ||
1344 | regval |= ((ant_div_ctl1 >> 6) & 0x1) << AR_PHY_ANT_DIV_LNADIV_S; | ||
1345 | |||
1346 | if (enable) | ||
1347 | regval |= AR_ANT_DIV_ENABLE; | ||
1348 | |||
1349 | REG_WRITE(ah, AR_PHY_MC_GAIN_CTRL, regval); | ||
1350 | |||
1351 | regval = REG_READ(ah, AR_PHY_CCK_DETECT); | ||
1352 | regval &= ~AR_FAST_DIV_ENABLE; | ||
1353 | regval |= ((ant_div_ctl1 >> 7) & 0x1) << AR_FAST_DIV_ENABLE_S; | ||
1354 | |||
1355 | if (enable) | ||
1356 | regval |= AR_FAST_DIV_ENABLE; | ||
1357 | |||
1358 | REG_WRITE(ah, AR_PHY_CCK_DETECT, regval); | ||
1359 | |||
1360 | if (enable) { | ||
1361 | REG_SET_BIT(ah, AR_PHY_MC_GAIN_CTRL, | ||
1362 | (1 << AR_PHY_ANT_SW_RX_PROT_S)); | ||
1363 | if (IS_CHAN_2GHZ(ah->curchan)) | ||
1364 | REG_SET_BIT(ah, AR_PHY_RESTART, | ||
1365 | AR_PHY_RESTART_ENABLE_DIV_M2FLAG); | ||
1366 | REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, | ||
1367 | AR_BTCOEX_WL_LNADIV_FORCE_ON); | ||
1368 | } else { | ||
1369 | REG_CLR_BIT(ah, AR_PHY_MC_GAIN_CTRL, AR_ANT_DIV_ENABLE); | ||
1370 | REG_CLR_BIT(ah, AR_PHY_MC_GAIN_CTRL, | ||
1371 | (1 << AR_PHY_ANT_SW_RX_PROT_S)); | ||
1372 | REG_CLR_BIT(ah, AR_PHY_CCK_DETECT, AR_FAST_DIV_ENABLE); | ||
1373 | REG_CLR_BIT(ah, AR_BTCOEX_WL_LNADIV, | ||
1374 | AR_BTCOEX_WL_LNADIV_FORCE_ON); | ||
1375 | |||
1376 | regval = REG_READ(ah, AR_PHY_MC_GAIN_CTRL); | ||
1377 | regval &= ~(AR_PHY_ANT_DIV_MAIN_LNACONF | | ||
1378 | AR_PHY_ANT_DIV_ALT_LNACONF | | ||
1379 | AR_PHY_ANT_DIV_MAIN_GAINTB | | ||
1380 | AR_PHY_ANT_DIV_ALT_GAINTB); | ||
1381 | regval |= (AR_PHY_ANT_DIV_LNA1 << AR_PHY_ANT_DIV_MAIN_LNACONF_S); | ||
1382 | regval |= (AR_PHY_ANT_DIV_LNA2 << AR_PHY_ANT_DIV_ALT_LNACONF_S); | ||
1383 | REG_WRITE(ah, AR_PHY_MC_GAIN_CTRL, regval); | ||
1384 | } | ||
1385 | } | ||
1386 | |||
1328 | static int ar9003_hw_fast_chan_change(struct ath_hw *ah, | 1387 | static int ar9003_hw_fast_chan_change(struct ath_hw *ah, |
1329 | struct ath9k_channel *chan, | 1388 | struct ath9k_channel *chan, |
1330 | u8 *ini_reloaded) | 1389 | u8 *ini_reloaded) |
@@ -1423,6 +1482,7 @@ void ar9003_hw_attach_phy_ops(struct ath_hw *ah) | |||
1423 | 1482 | ||
1424 | ops->antdiv_comb_conf_get = ar9003_hw_antdiv_comb_conf_get; | 1483 | ops->antdiv_comb_conf_get = ar9003_hw_antdiv_comb_conf_get; |
1425 | ops->antdiv_comb_conf_set = ar9003_hw_antdiv_comb_conf_set; | 1484 | ops->antdiv_comb_conf_set = ar9003_hw_antdiv_comb_conf_set; |
1485 | ops->antctrl_shared_chain_lnadiv = ar9003_hw_antctrl_shared_chain_lnadiv; | ||
1426 | 1486 | ||
1427 | ar9003_hw_set_nf_limits(ah); | 1487 | ar9003_hw_set_nf_limits(ah); |
1428 | ar9003_hw_set_radar_conf(ah); | 1488 | ar9003_hw_set_radar_conf(ah); |
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.h b/drivers/net/wireless/ath/ath9k/ar9003_phy.h index fdabc9a28a96..9a48e3d2f231 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.h +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.h | |||
@@ -282,6 +282,8 @@ | |||
282 | 282 | ||
283 | #define AR_PHY_ANT_FAST_DIV_BIAS 0x00007e00 | 283 | #define AR_PHY_ANT_FAST_DIV_BIAS 0x00007e00 |
284 | #define AR_PHY_ANT_FAST_DIV_BIAS_S 9 | 284 | #define AR_PHY_ANT_FAST_DIV_BIAS_S 9 |
285 | #define AR_PHY_ANT_SW_RX_PROT 0x00800000 | ||
286 | #define AR_PHY_ANT_SW_RX_PROT_S 23 | ||
285 | #define AR_PHY_ANT_DIV_LNADIV 0x01000000 | 287 | #define AR_PHY_ANT_DIV_LNADIV 0x01000000 |
286 | #define AR_PHY_ANT_DIV_LNADIV_S 24 | 288 | #define AR_PHY_ANT_DIV_LNADIV_S 24 |
287 | #define AR_PHY_ANT_DIV_ALT_LNACONF 0x06000000 | 289 | #define AR_PHY_ANT_DIV_ALT_LNACONF 0x06000000 |
@@ -422,6 +424,8 @@ | |||
422 | #define AR_PHY_FIND_SIG_RELSTEP 0x1f | 424 | #define AR_PHY_FIND_SIG_RELSTEP 0x1f |
423 | #define AR_PHY_FIND_SIG_RELSTEP_S 0 | 425 | #define AR_PHY_FIND_SIG_RELSTEP_S 0 |
424 | #define AR_PHY_FIND_SIG_RELSTEP_SIGN_BIT 5 | 426 | #define AR_PHY_FIND_SIG_RELSTEP_SIGN_BIT 5 |
427 | #define AR_PHY_RESTART_ENABLE_DIV_M2FLAG 0x00200000 | ||
428 | #define AR_PHY_RESTART_ENABLE_DIV_M2FLAG_S 21 | ||
425 | #define AR_PHY_RESTART_DIV_GC 0x001C0000 | 429 | #define AR_PHY_RESTART_DIV_GC 0x001C0000 |
426 | #define AR_PHY_RESTART_DIV_GC_S 18 | 430 | #define AR_PHY_RESTART_DIV_GC_S 18 |
427 | #define AR_PHY_RESTART_ENA 0x01 | 431 | #define AR_PHY_RESTART_ENA 0x01 |
@@ -1261,4 +1265,24 @@ | |||
1261 | #define AR_PHY_CL_TAB_CL_GAIN_MOD 0x1f | 1265 | #define AR_PHY_CL_TAB_CL_GAIN_MOD 0x1f |
1262 | #define AR_PHY_CL_TAB_CL_GAIN_MOD_S 0 | 1266 | #define AR_PHY_CL_TAB_CL_GAIN_MOD_S 0 |
1263 | 1267 | ||
1268 | #define AR_BTCOEX_WL_LNADIV 0x1a64 | ||
1269 | #define AR_BTCOEX_WL_LNADIV_PREDICTED_PERIOD 0x00003FFF | ||
1270 | #define AR_BTCOEX_WL_LNADIV_PREDICTED_PERIOD_S 0 | ||
1271 | #define AR_BTCOEX_WL_LNADIV_DPDT_IGNORE_PRIORITY 0x00004000 | ||
1272 | #define AR_BTCOEX_WL_LNADIV_DPDT_IGNORE_PRIORITY_S 14 | ||
1273 | #define AR_BTCOEX_WL_LNADIV_FORCE_ON 0x00008000 | ||
1274 | #define AR_BTCOEX_WL_LNADIV_FORCE_ON_S 15 | ||
1275 | #define AR_BTCOEX_WL_LNADIV_MODE_OPTION 0x00030000 | ||
1276 | #define AR_BTCOEX_WL_LNADIV_MODE_OPTION_S 16 | ||
1277 | #define AR_BTCOEX_WL_LNADIV_MODE 0x007c0000 | ||
1278 | #define AR_BTCOEX_WL_LNADIV_MODE_S 18 | ||
1279 | #define AR_BTCOEX_WL_LNADIV_ALLOWED_TX_ANTDIV_WL_TX_REQ 0x00800000 | ||
1280 | #define AR_BTCOEX_WL_LNADIV_ALLOWED_TX_ANTDIV_WL_TX_REQ_S 23 | ||
1281 | #define AR_BTCOEX_WL_LNADIV_DISABLE_TX_ANTDIV_ENABLE 0x01000000 | ||
1282 | #define AR_BTCOEX_WL_LNADIV_DISABLE_TX_ANTDIV_ENABLE_S 24 | ||
1283 | #define AR_BTCOEX_WL_LNADIV_CONTINUOUS_BT_ACTIVE_PROTECT 0x02000000 | ||
1284 | #define AR_BTCOEX_WL_LNADIV_CONTINUOUS_BT_ACTIVE_PROTECT_S 25 | ||
1285 | #define AR_BTCOEX_WL_LNADIV_BT_INACTIVE_THRESHOLD 0xFC000000 | ||
1286 | #define AR_BTCOEX_WL_LNADIV_BT_INACTIVE_THRESHOLD_S 26 | ||
1287 | |||
1264 | #endif /* AR9003_PHY_H */ | 1288 | #endif /* AR9003_PHY_H */ |
diff --git a/drivers/net/wireless/ath/ath9k/ar9565_1p0_initvals.h b/drivers/net/wireless/ath/ath9k/ar9565_1p0_initvals.h index fa9e0932769c..843e79f67ff2 100644 --- a/drivers/net/wireless/ath/ath9k/ar9565_1p0_initvals.h +++ b/drivers/net/wireless/ath/ath9k/ar9565_1p0_initvals.h | |||
@@ -58,8 +58,6 @@ static const u32 ar9565_1p0_mac_core[][2] = { | |||
58 | {0x00008040, 0x00000000}, | 58 | {0x00008040, 0x00000000}, |
59 | {0x00008044, 0x00000000}, | 59 | {0x00008044, 0x00000000}, |
60 | {0x00008048, 0x00000000}, | 60 | {0x00008048, 0x00000000}, |
61 | {0x0000804c, 0xffffffff}, | ||
62 | {0x00008050, 0xffffffff}, | ||
63 | {0x00008054, 0x00000000}, | 61 | {0x00008054, 0x00000000}, |
64 | {0x00008058, 0x00000000}, | 62 | {0x00008058, 0x00000000}, |
65 | {0x0000805c, 0x000fc78f}, | 63 | {0x0000805c, 0x000fc78f}, |
@@ -246,7 +244,7 @@ static const u32 ar9565_1p0_baseband_core[][2] = { | |||
246 | {0x00009e50, 0x00ff03f1}, | 244 | {0x00009e50, 0x00ff03f1}, |
247 | {0x00009e54, 0xe4c355c7}, | 245 | {0x00009e54, 0xe4c355c7}, |
248 | {0x00009e5c, 0xe9198724}, | 246 | {0x00009e5c, 0xe9198724}, |
249 | {0x00009fc0, 0x823e4788}, | 247 | {0x00009fc0, 0x823e4fc8}, |
250 | {0x00009fc4, 0x0001efb5}, | 248 | {0x00009fc4, 0x0001efb5}, |
251 | {0x00009fcc, 0x40000014}, | 249 | {0x00009fcc, 0x40000014}, |
252 | {0x0000a20c, 0x00000000}, | 250 | {0x0000a20c, 0x00000000}, |
@@ -291,7 +289,7 @@ static const u32 ar9565_1p0_baseband_core[][2] = { | |||
291 | {0x0000a3ec, 0x20202020}, | 289 | {0x0000a3ec, 0x20202020}, |
292 | {0x0000a3f0, 0x00000000}, | 290 | {0x0000a3f0, 0x00000000}, |
293 | {0x0000a3f4, 0x00000006}, | 291 | {0x0000a3f4, 0x00000006}, |
294 | {0x0000a3f8, 0x0cdbd380}, | 292 | {0x0000a3f8, 0x0c9bd380}, |
295 | {0x0000a3fc, 0x000f0f01}, | 293 | {0x0000a3fc, 0x000f0f01}, |
296 | {0x0000a400, 0x8fa91f01}, | 294 | {0x0000a400, 0x8fa91f01}, |
297 | {0x0000a404, 0x00000000}, | 295 | {0x0000a404, 0x00000000}, |
@@ -355,11 +353,11 @@ static const u32 ar9565_1p0_baseband_postamble[][5] = { | |||
355 | {0x00009e1c, 0x0001cf9c, 0x0001cf9c, 0x00021f9c, 0x00021f9c}, | 353 | {0x00009e1c, 0x0001cf9c, 0x0001cf9c, 0x00021f9c, 0x00021f9c}, |
356 | {0x00009e20, 0x000003b5, 0x000003b5, 0x000003ce, 0x000003ce}, | 354 | {0x00009e20, 0x000003b5, 0x000003b5, 0x000003ce, 0x000003ce}, |
357 | {0x00009e2c, 0x0000001c, 0x0000001c, 0x00000021, 0x00000021}, | 355 | {0x00009e2c, 0x0000001c, 0x0000001c, 0x00000021, 0x00000021}, |
358 | {0x00009e3c, 0xcf946220, 0xcf946220, 0xcf946222, 0xcf946222}, | 356 | {0x00009e3c, 0xcf946222, 0xcf946222, 0xcf946222, 0xcf946222}, |
359 | {0x00009e44, 0xfe321e27, 0xfe321e27, 0xfe291e27, 0xfe291e27}, | 357 | {0x00009e44, 0xfe321e27, 0xfe321e27, 0xfe291e27, 0xfe291e27}, |
360 | {0x00009e48, 0x5030201a, 0x5030201a, 0x50302012, 0x50302012}, | 358 | {0x00009e48, 0x5030201a, 0x5030201a, 0x50302012, 0x50302012}, |
361 | {0x00009fc8, 0x0003f000, 0x0003f000, 0x0001a000, 0x0001a000}, | 359 | {0x00009fc8, 0x0003f000, 0x0003f000, 0x0001a000, 0x0001a000}, |
362 | {0x0000a204, 0x033187c0, 0x033187c4, 0x033187c4, 0x033187c0}, | 360 | {0x0000a204, 0x07318fc0, 0x07318fc4, 0x07318fc4, 0x07318fc0}, |
363 | {0x0000a208, 0x00000104, 0x00000104, 0x00000004, 0x00000004}, | 361 | {0x0000a208, 0x00000104, 0x00000104, 0x00000004, 0x00000004}, |
364 | {0x0000a22c, 0x01026a2f, 0x01026a27, 0x01026a2f, 0x01026a2f}, | 362 | {0x0000a22c, 0x01026a2f, 0x01026a27, 0x01026a2f, 0x01026a2f}, |
365 | {0x0000a230, 0x0000400a, 0x00004014, 0x00004016, 0x0000400b}, | 363 | {0x0000a230, 0x0000400a, 0x00004014, 0x00004016, 0x0000400b}, |
@@ -375,9 +373,9 @@ static const u32 ar9565_1p0_baseband_postamble[][5] = { | |||
375 | {0x0000a284, 0x00000000, 0x00000000, 0x00000150, 0x00000150}, | 373 | {0x0000a284, 0x00000000, 0x00000000, 0x00000150, 0x00000150}, |
376 | {0x0000a288, 0x00100510, 0x00100510, 0x00100510, 0x00100510}, | 374 | {0x0000a288, 0x00100510, 0x00100510, 0x00100510, 0x00100510}, |
377 | {0x0000a28c, 0x00021551, 0x00021551, 0x00021551, 0x00021551}, | 375 | {0x0000a28c, 0x00021551, 0x00021551, 0x00021551, 0x00021551}, |
378 | {0x0000a2c4, 0x00158d18, 0x00158d18, 0x00158d18, 0x00158d18}, | 376 | {0x0000a2c4, 0x00058d18, 0x00058d18, 0x00058d18, 0x00058d18}, |
379 | {0x0000a2d0, 0x00071982, 0x00071982, 0x00071982, 0x00071982}, | 377 | {0x0000a2d0, 0x00071982, 0x00071982, 0x00071982, 0x00071982}, |
380 | {0x0000a2d8, 0x7999a83a, 0x7999a83a, 0x7999a83a, 0x7999a83a}, | 378 | {0x0000a2d8, 0x7999a83b, 0x7999a83b, 0x7999a83b, 0x7999a83b}, |
381 | {0x0000a358, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, | 379 | {0x0000a358, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, |
382 | {0x0000ae04, 0x00800000, 0x00800000, 0x00800000, 0x00800000}, | 380 | {0x0000ae04, 0x00800000, 0x00800000, 0x00800000, 0x00800000}, |
383 | {0x0000ae18, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, | 381 | {0x0000ae18, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, |
@@ -417,7 +415,7 @@ static const u32 ar9565_1p0_radio_core[][2] = { | |||
417 | {0x00016144, 0x02084080}, | 415 | {0x00016144, 0x02084080}, |
418 | {0x00016148, 0x000080c0}, | 416 | {0x00016148, 0x000080c0}, |
419 | {0x00016280, 0x050a0001}, | 417 | {0x00016280, 0x050a0001}, |
420 | {0x00016284, 0x3d841400}, | 418 | {0x00016284, 0x3d841440}, |
421 | {0x00016288, 0x00000000}, | 419 | {0x00016288, 0x00000000}, |
422 | {0x0001628c, 0xe3000000}, | 420 | {0x0001628c, 0xe3000000}, |
423 | {0x00016290, 0xa1004080}, | 421 | {0x00016290, 0xa1004080}, |
@@ -840,27 +838,27 @@ static const u32 ar9565_1p0_common_wo_xlna_rx_gain_table[][2] = { | |||
840 | {0x0000a0b4, 0x00000000}, | 838 | {0x0000a0b4, 0x00000000}, |
841 | {0x0000a0b8, 0x00000000}, | 839 | {0x0000a0b8, 0x00000000}, |
842 | {0x0000a0bc, 0x00000000}, | 840 | {0x0000a0bc, 0x00000000}, |
843 | {0x0000a0c0, 0x301f3000}, | 841 | {0x0000a0c0, 0x00bf00a0}, |
844 | {0x0000a0c4, 0x41004101}, | 842 | {0x0000a0c4, 0x11a011a1}, |
845 | {0x0000a0c8, 0x411e411f}, | 843 | {0x0000a0c8, 0x11be11bf}, |
846 | {0x0000a0cc, 0x411c411d}, | 844 | {0x0000a0cc, 0x11bc11bd}, |
847 | {0x0000a0d0, 0x42434244}, | 845 | {0x0000a0d0, 0x22632264}, |
848 | {0x0000a0d4, 0x42414242}, | 846 | {0x0000a0d4, 0x22612262}, |
849 | {0x0000a0d8, 0x425f4240}, | 847 | {0x0000a0d8, 0x227f2260}, |
850 | {0x0000a0dc, 0x5342425e}, | 848 | {0x0000a0dc, 0x4322227e}, |
851 | {0x0000a0e0, 0x53405341}, | 849 | {0x0000a0e0, 0x43204321}, |
852 | {0x0000a0e4, 0x535e535f}, | 850 | {0x0000a0e4, 0x433e433f}, |
853 | {0x0000a0e8, 0x7402535d}, | 851 | {0x0000a0e8, 0x4462433d}, |
854 | {0x0000a0ec, 0x74007401}, | 852 | {0x0000a0ec, 0x44604461}, |
855 | {0x0000a0f0, 0x741e741f}, | 853 | {0x0000a0f0, 0x447e447f}, |
856 | {0x0000a0f4, 0x7522741d}, | 854 | {0x0000a0f4, 0x5582447d}, |
857 | {0x0000a0f8, 0x75207521}, | 855 | {0x0000a0f8, 0x55805581}, |
858 | {0x0000a0fc, 0x753e753f}, | 856 | {0x0000a0fc, 0x559e559f}, |
859 | {0x0000a100, 0x76617662}, | 857 | {0x0000a100, 0x66816682}, |
860 | {0x0000a104, 0x767f7660}, | 858 | {0x0000a104, 0x669f6680}, |
861 | {0x0000a108, 0x767d767e}, | 859 | {0x0000a108, 0x669d669e}, |
862 | {0x0000a10c, 0x77e277e3}, | 860 | {0x0000a10c, 0x77627763}, |
863 | {0x0000a110, 0x77e077e1}, | 861 | {0x0000a110, 0x77607761}, |
864 | {0x0000a114, 0x00000000}, | 862 | {0x0000a114, 0x00000000}, |
865 | {0x0000a118, 0x00000000}, | 863 | {0x0000a118, 0x00000000}, |
866 | {0x0000a11c, 0x00000000}, | 864 | {0x0000a11c, 0x00000000}, |
@@ -872,27 +870,27 @@ static const u32 ar9565_1p0_common_wo_xlna_rx_gain_table[][2] = { | |||
872 | {0x0000a134, 0x00000000}, | 870 | {0x0000a134, 0x00000000}, |
873 | {0x0000a138, 0x00000000}, | 871 | {0x0000a138, 0x00000000}, |
874 | {0x0000a13c, 0x00000000}, | 872 | {0x0000a13c, 0x00000000}, |
875 | {0x0000a140, 0x301f3000}, | 873 | {0x0000a140, 0x00bf00a0}, |
876 | {0x0000a144, 0x41004101}, | 874 | {0x0000a144, 0x11a011a1}, |
877 | {0x0000a148, 0x411e411f}, | 875 | {0x0000a148, 0x11be11bf}, |
878 | {0x0000a14c, 0x411c411d}, | 876 | {0x0000a14c, 0x11bc11bd}, |
879 | {0x0000a150, 0x42434244}, | 877 | {0x0000a150, 0x22632264}, |
880 | {0x0000a154, 0x42414242}, | 878 | {0x0000a154, 0x22612262}, |
881 | {0x0000a158, 0x425f4240}, | 879 | {0x0000a158, 0x227f2260}, |
882 | {0x0000a15c, 0x5342425e}, | 880 | {0x0000a15c, 0x4322227e}, |
883 | {0x0000a160, 0x53405341}, | 881 | {0x0000a160, 0x43204321}, |
884 | {0x0000a164, 0x535e535f}, | 882 | {0x0000a164, 0x433e433f}, |
885 | {0x0000a168, 0x7402535d}, | 883 | {0x0000a168, 0x4462433d}, |
886 | {0x0000a16c, 0x74007401}, | 884 | {0x0000a16c, 0x44604461}, |
887 | {0x0000a170, 0x741e741f}, | 885 | {0x0000a170, 0x447e447f}, |
888 | {0x0000a174, 0x7522741d}, | 886 | {0x0000a174, 0x5582447d}, |
889 | {0x0000a178, 0x75207521}, | 887 | {0x0000a178, 0x55805581}, |
890 | {0x0000a17c, 0x753e753f}, | 888 | {0x0000a17c, 0x559e559f}, |
891 | {0x0000a180, 0x76617662}, | 889 | {0x0000a180, 0x66816682}, |
892 | {0x0000a184, 0x767f7660}, | 890 | {0x0000a184, 0x669f6680}, |
893 | {0x0000a188, 0x767d767e}, | 891 | {0x0000a188, 0x669d669e}, |
894 | {0x0000a18c, 0x77e277e3}, | 892 | {0x0000a18c, 0x77627763}, |
895 | {0x0000a190, 0x77e077e1}, | 893 | {0x0000a190, 0x77607761}, |
896 | {0x0000a194, 0x00000000}, | 894 | {0x0000a194, 0x00000000}, |
897 | {0x0000a198, 0x00000000}, | 895 | {0x0000a198, 0x00000000}, |
898 | {0x0000a19c, 0x00000000}, | 896 | {0x0000a19c, 0x00000000}, |
diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h index 96b8331ef9e7..8e27f4fb21fe 100644 --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h | |||
@@ -537,6 +537,7 @@ struct ath9k_wow_pattern { | |||
537 | #ifdef CONFIG_MAC80211_LEDS | 537 | #ifdef CONFIG_MAC80211_LEDS |
538 | void ath_init_leds(struct ath_softc *sc); | 538 | void ath_init_leds(struct ath_softc *sc); |
539 | void ath_deinit_leds(struct ath_softc *sc); | 539 | void ath_deinit_leds(struct ath_softc *sc); |
540 | void ath_fill_led_pin(struct ath_softc *sc); | ||
540 | #else | 541 | #else |
541 | static inline void ath_init_leds(struct ath_softc *sc) | 542 | static inline void ath_init_leds(struct ath_softc *sc) |
542 | { | 543 | { |
@@ -545,6 +546,9 @@ static inline void ath_init_leds(struct ath_softc *sc) | |||
545 | static inline void ath_deinit_leds(struct ath_softc *sc) | 546 | static inline void ath_deinit_leds(struct ath_softc *sc) |
546 | { | 547 | { |
547 | } | 548 | } |
549 | static inline void ath_fill_led_pin(struct ath_softc *sc) | ||
550 | { | ||
551 | } | ||
548 | #endif | 552 | #endif |
549 | 553 | ||
550 | /*******************************/ | 554 | /*******************************/ |
@@ -596,8 +600,6 @@ struct ath_ant_comb { | |||
596 | int main_conf; | 600 | int main_conf; |
597 | enum ath9k_ant_div_comb_lna_conf first_quick_scan_conf; | 601 | enum ath9k_ant_div_comb_lna_conf first_quick_scan_conf; |
598 | enum ath9k_ant_div_comb_lna_conf second_quick_scan_conf; | 602 | enum ath9k_ant_div_comb_lna_conf second_quick_scan_conf; |
599 | int first_bias; | ||
600 | int second_bias; | ||
601 | bool first_ratio; | 603 | bool first_ratio; |
602 | bool second_ratio; | 604 | bool second_ratio; |
603 | unsigned long scan_start_time; | 605 | unsigned long scan_start_time; |
diff --git a/drivers/net/wireless/ath/ath9k/gpio.c b/drivers/net/wireless/ath/ath9k/gpio.c index 45f24220b16e..bf7d29ec1a87 100644 --- a/drivers/net/wireless/ath/ath9k/gpio.c +++ b/drivers/net/wireless/ath/ath9k/gpio.c | |||
@@ -44,25 +44,6 @@ void ath_init_leds(struct ath_softc *sc) | |||
44 | if (AR_SREV_9100(sc->sc_ah)) | 44 | if (AR_SREV_9100(sc->sc_ah)) |
45 | return; | 45 | return; |
46 | 46 | ||
47 | if (sc->sc_ah->led_pin < 0) { | ||
48 | if (AR_SREV_9287(sc->sc_ah)) | ||
49 | sc->sc_ah->led_pin = ATH_LED_PIN_9287; | ||
50 | else if (AR_SREV_9485(sc->sc_ah)) | ||
51 | sc->sc_ah->led_pin = ATH_LED_PIN_9485; | ||
52 | else if (AR_SREV_9300(sc->sc_ah)) | ||
53 | sc->sc_ah->led_pin = ATH_LED_PIN_9300; | ||
54 | else if (AR_SREV_9462(sc->sc_ah) || AR_SREV_9565(sc->sc_ah)) | ||
55 | sc->sc_ah->led_pin = ATH_LED_PIN_9462; | ||
56 | else | ||
57 | sc->sc_ah->led_pin = ATH_LED_PIN_DEF; | ||
58 | } | ||
59 | |||
60 | /* Configure gpio 1 for output */ | ||
61 | ath9k_hw_cfg_output(sc->sc_ah, sc->sc_ah->led_pin, | ||
62 | AR_GPIO_OUTPUT_MUX_AS_OUTPUT); | ||
63 | /* LED off, active low */ | ||
64 | ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 1); | ||
65 | |||
66 | if (!led_blink) | 47 | if (!led_blink) |
67 | sc->led_cdev.default_trigger = | 48 | sc->led_cdev.default_trigger = |
68 | ieee80211_get_radio_led_name(sc->hw); | 49 | ieee80211_get_radio_led_name(sc->hw); |
@@ -78,6 +59,31 @@ void ath_init_leds(struct ath_softc *sc) | |||
78 | 59 | ||
79 | sc->led_registered = true; | 60 | sc->led_registered = true; |
80 | } | 61 | } |
62 | |||
63 | void ath_fill_led_pin(struct ath_softc *sc) | ||
64 | { | ||
65 | struct ath_hw *ah = sc->sc_ah; | ||
66 | |||
67 | if (AR_SREV_9100(ah) || (ah->led_pin >= 0)) | ||
68 | return; | ||
69 | |||
70 | if (AR_SREV_9287(ah)) | ||
71 | ah->led_pin = ATH_LED_PIN_9287; | ||
72 | else if (AR_SREV_9485(sc->sc_ah)) | ||
73 | ah->led_pin = ATH_LED_PIN_9485; | ||
74 | else if (AR_SREV_9300(sc->sc_ah)) | ||
75 | ah->led_pin = ATH_LED_PIN_9300; | ||
76 | else if (AR_SREV_9462(sc->sc_ah) || AR_SREV_9565(sc->sc_ah)) | ||
77 | ah->led_pin = ATH_LED_PIN_9462; | ||
78 | else | ||
79 | ah->led_pin = ATH_LED_PIN_DEF; | ||
80 | |||
81 | /* Configure gpio 1 for output */ | ||
82 | ath9k_hw_cfg_output(ah, ah->led_pin, AR_GPIO_OUTPUT_MUX_AS_OUTPUT); | ||
83 | |||
84 | /* LED off, active low */ | ||
85 | ath9k_hw_set_gpio(ah, ah->led_pin, 1); | ||
86 | } | ||
81 | #endif | 87 | #endif |
82 | 88 | ||
83 | /*******************/ | 89 | /*******************/ |
@@ -314,8 +320,10 @@ void ath9k_btcoex_timer_resume(struct ath_softc *sc) | |||
314 | ath_dbg(ath9k_hw_common(ah), BTCOEX, "Starting btcoex timers\n"); | 320 | ath_dbg(ath9k_hw_common(ah), BTCOEX, "Starting btcoex timers\n"); |
315 | 321 | ||
316 | /* make sure duty cycle timer is also stopped when resuming */ | 322 | /* make sure duty cycle timer is also stopped when resuming */ |
317 | if (btcoex->hw_timer_enabled) | 323 | if (btcoex->hw_timer_enabled) { |
318 | ath9k_gen_timer_stop(sc->sc_ah, btcoex->no_stomp_timer); | 324 | ath9k_gen_timer_stop(sc->sc_ah, btcoex->no_stomp_timer); |
325 | btcoex->hw_timer_enabled = false; | ||
326 | } | ||
319 | 327 | ||
320 | btcoex->bt_priority_cnt = 0; | 328 | btcoex->bt_priority_cnt = 0; |
321 | btcoex->bt_priority_time = jiffies; | 329 | btcoex->bt_priority_time = jiffies; |
@@ -336,18 +344,20 @@ void ath9k_btcoex_timer_pause(struct ath_softc *sc) | |||
336 | 344 | ||
337 | del_timer_sync(&btcoex->period_timer); | 345 | del_timer_sync(&btcoex->period_timer); |
338 | 346 | ||
339 | if (btcoex->hw_timer_enabled) | 347 | if (btcoex->hw_timer_enabled) { |
340 | ath9k_gen_timer_stop(ah, btcoex->no_stomp_timer); | 348 | ath9k_gen_timer_stop(ah, btcoex->no_stomp_timer); |
341 | 349 | btcoex->hw_timer_enabled = false; | |
342 | btcoex->hw_timer_enabled = false; | 350 | } |
343 | } | 351 | } |
344 | 352 | ||
345 | void ath9k_btcoex_stop_gen_timer(struct ath_softc *sc) | 353 | void ath9k_btcoex_stop_gen_timer(struct ath_softc *sc) |
346 | { | 354 | { |
347 | struct ath_btcoex *btcoex = &sc->btcoex; | 355 | struct ath_btcoex *btcoex = &sc->btcoex; |
348 | 356 | ||
349 | if (btcoex->hw_timer_enabled) | 357 | if (btcoex->hw_timer_enabled) { |
350 | ath9k_gen_timer_stop(sc->sc_ah, btcoex->no_stomp_timer); | 358 | ath9k_gen_timer_stop(sc->sc_ah, btcoex->no_stomp_timer); |
359 | btcoex->hw_timer_enabled = false; | ||
360 | } | ||
351 | } | 361 | } |
352 | 362 | ||
353 | u16 ath9k_btcoex_aggr_limit(struct ath_softc *sc, u32 max_4ms_framelen) | 363 | u16 ath9k_btcoex_aggr_limit(struct ath_softc *sc, u32 max_4ms_framelen) |
diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c index ee6e50aebf8d..924c4616c3d9 100644 --- a/drivers/net/wireless/ath/ath9k/hif_usb.c +++ b/drivers/net/wireless/ath/ath9k/hif_usb.c | |||
@@ -1072,14 +1072,15 @@ static void ath9k_hif_usb_dev_deinit(struct hif_device_usb *hif_dev) | |||
1072 | */ | 1072 | */ |
1073 | static void ath9k_hif_usb_firmware_fail(struct hif_device_usb *hif_dev) | 1073 | static void ath9k_hif_usb_firmware_fail(struct hif_device_usb *hif_dev) |
1074 | { | 1074 | { |
1075 | struct device *parent = hif_dev->udev->dev.parent; | 1075 | struct device *dev = &hif_dev->udev->dev; |
1076 | struct device *parent = dev->parent; | ||
1076 | 1077 | ||
1077 | complete(&hif_dev->fw_done); | 1078 | complete(&hif_dev->fw_done); |
1078 | 1079 | ||
1079 | if (parent) | 1080 | if (parent) |
1080 | device_lock(parent); | 1081 | device_lock(parent); |
1081 | 1082 | ||
1082 | device_release_driver(&hif_dev->udev->dev); | 1083 | device_release_driver(dev); |
1083 | 1084 | ||
1084 | if (parent) | 1085 | if (parent) |
1085 | device_unlock(parent); | 1086 | device_unlock(parent); |
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/drivers/net/wireless/ath/ath9k/htc_drv_main.c index 61d096e3596f..ca78e33ca23e 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c | |||
@@ -1445,7 +1445,7 @@ static int ath9k_htc_set_key(struct ieee80211_hw *hw, | |||
1445 | key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC; | 1445 | key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC; |
1446 | if (priv->ah->sw_mgmt_crypto && | 1446 | if (priv->ah->sw_mgmt_crypto && |
1447 | key->cipher == WLAN_CIPHER_SUITE_CCMP) | 1447 | key->cipher == WLAN_CIPHER_SUITE_CCMP) |
1448 | key->flags |= IEEE80211_KEY_FLAG_SW_MGMT; | 1448 | key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX; |
1449 | ret = 0; | 1449 | ret = 0; |
1450 | } | 1450 | } |
1451 | break; | 1451 | break; |
diff --git a/drivers/net/wireless/ath/ath9k/hw-ops.h b/drivers/net/wireless/ath/ath9k/hw-ops.h index 265bf77598a2..0f2b97f6b739 100644 --- a/drivers/net/wireless/ath/ath9k/hw-ops.h +++ b/drivers/net/wireless/ath/ath9k/hw-ops.h | |||
@@ -78,6 +78,13 @@ static inline void ath9k_hw_antdiv_comb_conf_set(struct ath_hw *ah, | |||
78 | ath9k_hw_ops(ah)->antdiv_comb_conf_set(ah, antconf); | 78 | ath9k_hw_ops(ah)->antdiv_comb_conf_set(ah, antconf); |
79 | } | 79 | } |
80 | 80 | ||
81 | static inline void ath9k_hw_antctrl_shared_chain_lnadiv(struct ath_hw *ah, | ||
82 | bool enable) | ||
83 | { | ||
84 | if (ath9k_hw_ops(ah)->antctrl_shared_chain_lnadiv) | ||
85 | ath9k_hw_ops(ah)->antctrl_shared_chain_lnadiv(ah, enable); | ||
86 | } | ||
87 | |||
81 | /* Private hardware call ops */ | 88 | /* Private hardware call ops */ |
82 | 89 | ||
83 | /* PHY ops */ | 90 | /* PHY ops */ |
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index 40f57aa2564e..f9a6ec5cf470 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include "rc.h" | 24 | #include "rc.h" |
25 | #include "ar9003_mac.h" | 25 | #include "ar9003_mac.h" |
26 | #include "ar9003_mci.h" | 26 | #include "ar9003_mci.h" |
27 | #include "ar9003_phy.h" | ||
27 | #include "debug.h" | 28 | #include "debug.h" |
28 | #include "ath9k.h" | 29 | #include "ath9k.h" |
29 | 30 | ||
@@ -1733,12 +1734,12 @@ static int ath9k_hw_do_fastcc(struct ath_hw *ah, struct ath9k_channel *chan) | |||
1733 | if (!ret) | 1734 | if (!ret) |
1734 | goto fail; | 1735 | goto fail; |
1735 | 1736 | ||
1736 | ath9k_hw_loadnf(ah, ah->curchan); | ||
1737 | ath9k_hw_start_nfcal(ah, true); | ||
1738 | |||
1739 | if (ath9k_hw_mci_is_enabled(ah)) | 1737 | if (ath9k_hw_mci_is_enabled(ah)) |
1740 | ar9003_mci_2g5g_switch(ah, false); | 1738 | ar9003_mci_2g5g_switch(ah, false); |
1741 | 1739 | ||
1740 | ath9k_hw_loadnf(ah, ah->curchan); | ||
1741 | ath9k_hw_start_nfcal(ah, true); | ||
1742 | |||
1742 | if (AR_SREV_9271(ah)) | 1743 | if (AR_SREV_9271(ah)) |
1743 | ar9002_hw_load_ani_reg(ah, chan); | 1744 | ar9002_hw_load_ani_reg(ah, chan); |
1744 | 1745 | ||
@@ -2025,6 +2026,9 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, | |||
2025 | 2026 | ||
2026 | ath9k_hw_apply_gpio_override(ah); | 2027 | ath9k_hw_apply_gpio_override(ah); |
2027 | 2028 | ||
2029 | if (AR_SREV_9565(ah) && ah->shared_chain_lnadiv) | ||
2030 | REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON); | ||
2031 | |||
2028 | return 0; | 2032 | return 0; |
2029 | } | 2033 | } |
2030 | EXPORT_SYMBOL(ath9k_hw_reset); | 2034 | EXPORT_SYMBOL(ath9k_hw_reset); |
@@ -2535,7 +2539,7 @@ int ath9k_hw_fill_cap_info(struct ath_hw *ah) | |||
2535 | } | 2539 | } |
2536 | 2540 | ||
2537 | 2541 | ||
2538 | if (AR_SREV_9330(ah) || AR_SREV_9485(ah)) { | 2542 | if (AR_SREV_9330(ah) || AR_SREV_9485(ah) || AR_SREV_9565(ah)) { |
2539 | ant_div_ctl1 = ah->eep_ops->get_eeprom(ah, EEP_ANT_DIV_CTL1); | 2543 | ant_div_ctl1 = ah->eep_ops->get_eeprom(ah, EEP_ANT_DIV_CTL1); |
2540 | /* | 2544 | /* |
2541 | * enable the diversity-combining algorithm only when | 2545 | * enable the diversity-combining algorithm only when |
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h index f0798cc50dc1..566a4ce4f156 100644 --- a/drivers/net/wireless/ath/ath9k/hw.h +++ b/drivers/net/wireless/ath/ath9k/hw.h | |||
@@ -686,7 +686,7 @@ struct ath_hw_ops { | |||
686 | struct ath_hw_antcomb_conf *antconf); | 686 | struct ath_hw_antcomb_conf *antconf); |
687 | void (*antdiv_comb_conf_set)(struct ath_hw *ah, | 687 | void (*antdiv_comb_conf_set)(struct ath_hw *ah, |
688 | struct ath_hw_antcomb_conf *antconf); | 688 | struct ath_hw_antcomb_conf *antconf); |
689 | 689 | void (*antctrl_shared_chain_lnadiv)(struct ath_hw *hw, bool enable); | |
690 | }; | 690 | }; |
691 | 691 | ||
692 | struct ath_nf_limits { | 692 | struct ath_nf_limits { |
@@ -730,6 +730,7 @@ struct ath_hw { | |||
730 | bool aspm_enabled; | 730 | bool aspm_enabled; |
731 | bool is_monitoring; | 731 | bool is_monitoring; |
732 | bool need_an_top2_fixup; | 732 | bool need_an_top2_fixup; |
733 | bool shared_chain_lnadiv; | ||
733 | u16 tx_trig_level; | 734 | u16 tx_trig_level; |
734 | 735 | ||
735 | u32 nf_regs[6]; | 736 | u32 nf_regs[6]; |
diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c index f3ce5ca2f1d3..fad3ccd5cd91 100644 --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c | |||
@@ -46,6 +46,10 @@ static int ath9k_btcoex_enable; | |||
46 | module_param_named(btcoex_enable, ath9k_btcoex_enable, int, 0444); | 46 | module_param_named(btcoex_enable, ath9k_btcoex_enable, int, 0444); |
47 | MODULE_PARM_DESC(btcoex_enable, "Enable wifi-BT coexistence"); | 47 | MODULE_PARM_DESC(btcoex_enable, "Enable wifi-BT coexistence"); |
48 | 48 | ||
49 | static int ath9k_enable_diversity; | ||
50 | module_param_named(enable_diversity, ath9k_enable_diversity, int, 0444); | ||
51 | MODULE_PARM_DESC(enable_diversity, "Enable Antenna diversity for AR9565"); | ||
52 | |||
49 | bool is_ath9k_unloaded; | 53 | bool is_ath9k_unloaded; |
50 | /* We use the hw_value as an index into our private channel structure */ | 54 | /* We use the hw_value as an index into our private channel structure */ |
51 | 55 | ||
@@ -546,6 +550,14 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc, | |||
546 | common->debug_mask = ath9k_debug; | 550 | common->debug_mask = ath9k_debug; |
547 | common->btcoex_enabled = ath9k_btcoex_enable == 1; | 551 | common->btcoex_enabled = ath9k_btcoex_enable == 1; |
548 | common->disable_ani = false; | 552 | common->disable_ani = false; |
553 | |||
554 | /* | ||
555 | * Enable Antenna diversity only when BTCOEX is disabled | ||
556 | * and the user manually requests the feature. | ||
557 | */ | ||
558 | if (!common->btcoex_enabled && ath9k_enable_diversity) | ||
559 | common->antenna_diversity = 1; | ||
560 | |||
549 | spin_lock_init(&common->cc_lock); | 561 | spin_lock_init(&common->cc_lock); |
550 | 562 | ||
551 | spin_lock_init(&sc->sc_serial_rw); | 563 | spin_lock_init(&sc->sc_serial_rw); |
@@ -597,6 +609,7 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc, | |||
597 | 609 | ||
598 | ath9k_cmn_init_crypto(sc->sc_ah); | 610 | ath9k_cmn_init_crypto(sc->sc_ah); |
599 | ath9k_init_misc(sc); | 611 | ath9k_init_misc(sc); |
612 | ath_fill_led_pin(sc); | ||
600 | 613 | ||
601 | if (common->bus_ops->aspm_init) | 614 | if (common->bus_ops->aspm_init) |
602 | common->bus_ops->aspm_init(common); | 615 | common->bus_ops->aspm_init(common); |
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index 3923ad933aef..31ab82e3ba85 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c | |||
@@ -1406,7 +1406,7 @@ static int ath9k_set_key(struct ieee80211_hw *hw, | |||
1406 | key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC; | 1406 | key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC; |
1407 | if (sc->sc_ah->sw_mgmt_crypto && | 1407 | if (sc->sc_ah->sw_mgmt_crypto && |
1408 | key->cipher == WLAN_CIPHER_SUITE_CCMP) | 1408 | key->cipher == WLAN_CIPHER_SUITE_CCMP) |
1409 | key->flags |= IEEE80211_KEY_FLAG_SW_MGMT; | 1409 | key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX; |
1410 | ret = 0; | 1410 | ret = 0; |
1411 | } | 1411 | } |
1412 | break; | 1412 | break; |
diff --git a/drivers/net/wireless/ath/ath9k/mci.c b/drivers/net/wireless/ath/ath9k/mci.c index 8f0e8d9c2054..8f51e9e358fd 100644 --- a/drivers/net/wireless/ath/ath9k/mci.c +++ b/drivers/net/wireless/ath/ath9k/mci.c | |||
@@ -80,6 +80,7 @@ void ath_mci_flush_profile(struct ath_mci_profile *mci) | |||
80 | struct ath_mci_profile_info *info, *tinfo; | 80 | struct ath_mci_profile_info *info, *tinfo; |
81 | 81 | ||
82 | mci->aggr_limit = 0; | 82 | mci->aggr_limit = 0; |
83 | mci->num_mgmt = 0; | ||
83 | 84 | ||
84 | if (list_empty(&mci->info)) | 85 | if (list_empty(&mci->info)) |
85 | return; | 86 | return; |
@@ -120,7 +121,14 @@ static void ath_mci_update_scheme(struct ath_softc *sc) | |||
120 | if (mci_hw->config & ATH_MCI_CONFIG_DISABLE_TUNING) | 121 | if (mci_hw->config & ATH_MCI_CONFIG_DISABLE_TUNING) |
121 | goto skip_tuning; | 122 | goto skip_tuning; |
122 | 123 | ||
124 | mci->aggr_limit = 0; | ||
123 | btcoex->duty_cycle = ath_mci_duty_cycle[num_profile]; | 125 | btcoex->duty_cycle = ath_mci_duty_cycle[num_profile]; |
126 | btcoex->btcoex_period = ATH_MCI_DEF_BT_PERIOD; | ||
127 | if (NUM_PROF(mci)) | ||
128 | btcoex->bt_stomp_type = ATH_BTCOEX_STOMP_LOW; | ||
129 | else | ||
130 | btcoex->bt_stomp_type = mci->num_mgmt ? ATH_BTCOEX_STOMP_ALL : | ||
131 | ATH_BTCOEX_STOMP_LOW; | ||
124 | 132 | ||
125 | if (num_profile == 1) { | 133 | if (num_profile == 1) { |
126 | info = list_first_entry(&mci->info, | 134 | info = list_first_entry(&mci->info, |
@@ -132,7 +140,8 @@ static void ath_mci_update_scheme(struct ath_softc *sc) | |||
132 | else if (info->T == 6) { | 140 | else if (info->T == 6) { |
133 | mci->aggr_limit = 6; | 141 | mci->aggr_limit = 6; |
134 | btcoex->duty_cycle = 30; | 142 | btcoex->duty_cycle = 30; |
135 | } | 143 | } else |
144 | mci->aggr_limit = 6; | ||
136 | ath_dbg(common, MCI, | 145 | ath_dbg(common, MCI, |
137 | "Single SCO, aggregation limit %d 1/4 ms\n", | 146 | "Single SCO, aggregation limit %d 1/4 ms\n", |
138 | mci->aggr_limit); | 147 | mci->aggr_limit); |
@@ -241,8 +250,8 @@ static void ath9k_mci_work(struct work_struct *work) | |||
241 | ath_mci_update_scheme(sc); | 250 | ath_mci_update_scheme(sc); |
242 | } | 251 | } |
243 | 252 | ||
244 | static void ath_mci_process_profile(struct ath_softc *sc, | 253 | static u8 ath_mci_process_profile(struct ath_softc *sc, |
245 | struct ath_mci_profile_info *info) | 254 | struct ath_mci_profile_info *info) |
246 | { | 255 | { |
247 | struct ath_common *common = ath9k_hw_common(sc->sc_ah); | 256 | struct ath_common *common = ath9k_hw_common(sc->sc_ah); |
248 | struct ath_btcoex *btcoex = &sc->btcoex; | 257 | struct ath_btcoex *btcoex = &sc->btcoex; |
@@ -268,25 +277,15 @@ static void ath_mci_process_profile(struct ath_softc *sc, | |||
268 | 277 | ||
269 | if (info->start) { | 278 | if (info->start) { |
270 | if (!entry && !ath_mci_add_profile(common, mci, info)) | 279 | if (!entry && !ath_mci_add_profile(common, mci, info)) |
271 | return; | 280 | return 0; |
272 | } else | 281 | } else |
273 | ath_mci_del_profile(common, mci, entry); | 282 | ath_mci_del_profile(common, mci, entry); |
274 | 283 | ||
275 | btcoex->btcoex_period = ATH_MCI_DEF_BT_PERIOD; | 284 | return 1; |
276 | mci->aggr_limit = mci->num_sco ? 6 : 0; | ||
277 | |||
278 | btcoex->duty_cycle = ath_mci_duty_cycle[NUM_PROF(mci)]; | ||
279 | if (NUM_PROF(mci)) | ||
280 | btcoex->bt_stomp_type = ATH_BTCOEX_STOMP_LOW; | ||
281 | else | ||
282 | btcoex->bt_stomp_type = mci->num_mgmt ? ATH_BTCOEX_STOMP_ALL : | ||
283 | ATH_BTCOEX_STOMP_LOW; | ||
284 | |||
285 | ieee80211_queue_work(sc->hw, &sc->mci_work); | ||
286 | } | 285 | } |
287 | 286 | ||
288 | static void ath_mci_process_status(struct ath_softc *sc, | 287 | static u8 ath_mci_process_status(struct ath_softc *sc, |
289 | struct ath_mci_profile_status *status) | 288 | struct ath_mci_profile_status *status) |
290 | { | 289 | { |
291 | struct ath_btcoex *btcoex = &sc->btcoex; | 290 | struct ath_btcoex *btcoex = &sc->btcoex; |
292 | struct ath_mci_profile *mci = &btcoex->mci; | 291 | struct ath_mci_profile *mci = &btcoex->mci; |
@@ -295,14 +294,14 @@ static void ath_mci_process_status(struct ath_softc *sc, | |||
295 | 294 | ||
296 | /* Link status type are not handled */ | 295 | /* Link status type are not handled */ |
297 | if (status->is_link) | 296 | if (status->is_link) |
298 | return; | 297 | return 0; |
299 | 298 | ||
300 | info.conn_handle = status->conn_handle; | 299 | info.conn_handle = status->conn_handle; |
301 | if (ath_mci_find_profile(mci, &info)) | 300 | if (ath_mci_find_profile(mci, &info)) |
302 | return; | 301 | return 0; |
303 | 302 | ||
304 | if (status->conn_handle >= ATH_MCI_MAX_PROFILE) | 303 | if (status->conn_handle >= ATH_MCI_MAX_PROFILE) |
305 | return; | 304 | return 0; |
306 | 305 | ||
307 | if (status->is_critical) | 306 | if (status->is_critical) |
308 | __set_bit(status->conn_handle, mci->status); | 307 | __set_bit(status->conn_handle, mci->status); |
@@ -316,7 +315,9 @@ static void ath_mci_process_status(struct ath_softc *sc, | |||
316 | } while (++i < ATH_MCI_MAX_PROFILE); | 315 | } while (++i < ATH_MCI_MAX_PROFILE); |
317 | 316 | ||
318 | if (old_num_mgmt != mci->num_mgmt) | 317 | if (old_num_mgmt != mci->num_mgmt) |
319 | ieee80211_queue_work(sc->hw, &sc->mci_work); | 318 | return 1; |
319 | |||
320 | return 0; | ||
320 | } | 321 | } |
321 | 322 | ||
322 | static void ath_mci_msg(struct ath_softc *sc, u8 opcode, u8 *rx_payload) | 323 | static void ath_mci_msg(struct ath_softc *sc, u8 opcode, u8 *rx_payload) |
@@ -325,9 +326,16 @@ static void ath_mci_msg(struct ath_softc *sc, u8 opcode, u8 *rx_payload) | |||
325 | struct ath_mci_profile_info profile_info; | 326 | struct ath_mci_profile_info profile_info; |
326 | struct ath_mci_profile_status profile_status; | 327 | struct ath_mci_profile_status profile_status; |
327 | struct ath_common *common = ath9k_hw_common(sc->sc_ah); | 328 | struct ath_common *common = ath9k_hw_common(sc->sc_ah); |
328 | u8 major, minor; | 329 | u8 major, minor, update_scheme = 0; |
329 | u32 seq_num; | 330 | u32 seq_num; |
330 | 331 | ||
332 | if (ar9003_mci_state(ah, MCI_STATE_NEED_FLUSH_BT_INFO) && | ||
333 | ar9003_mci_state(ah, MCI_STATE_ENABLE)) { | ||
334 | ath_dbg(common, MCI, "(MCI) Need to flush BT profiles\n"); | ||
335 | ath_mci_flush_profile(&sc->btcoex.mci); | ||
336 | ar9003_mci_state(ah, MCI_STATE_SEND_STATUS_QUERY); | ||
337 | } | ||
338 | |||
331 | switch (opcode) { | 339 | switch (opcode) { |
332 | case MCI_GPM_COEX_VERSION_QUERY: | 340 | case MCI_GPM_COEX_VERSION_QUERY: |
333 | ar9003_mci_state(ah, MCI_STATE_SEND_WLAN_COEX_VERSION); | 341 | ar9003_mci_state(ah, MCI_STATE_SEND_WLAN_COEX_VERSION); |
@@ -353,7 +361,7 @@ static void ath_mci_msg(struct ath_softc *sc, u8 opcode, u8 *rx_payload) | |||
353 | break; | 361 | break; |
354 | } | 362 | } |
355 | 363 | ||
356 | ath_mci_process_profile(sc, &profile_info); | 364 | update_scheme += ath_mci_process_profile(sc, &profile_info); |
357 | break; | 365 | break; |
358 | case MCI_GPM_COEX_BT_STATUS_UPDATE: | 366 | case MCI_GPM_COEX_BT_STATUS_UPDATE: |
359 | profile_status.is_link = *(rx_payload + | 367 | profile_status.is_link = *(rx_payload + |
@@ -369,12 +377,14 @@ static void ath_mci_msg(struct ath_softc *sc, u8 opcode, u8 *rx_payload) | |||
369 | profile_status.is_link, profile_status.conn_handle, | 377 | profile_status.is_link, profile_status.conn_handle, |
370 | profile_status.is_critical, seq_num); | 378 | profile_status.is_critical, seq_num); |
371 | 379 | ||
372 | ath_mci_process_status(sc, &profile_status); | 380 | update_scheme += ath_mci_process_status(sc, &profile_status); |
373 | break; | 381 | break; |
374 | default: | 382 | default: |
375 | ath_dbg(common, MCI, "Unknown GPM COEX message = 0x%02x\n", opcode); | 383 | ath_dbg(common, MCI, "Unknown GPM COEX message = 0x%02x\n", opcode); |
376 | break; | 384 | break; |
377 | } | 385 | } |
386 | if (update_scheme) | ||
387 | ieee80211_queue_work(sc->hw, &sc->mci_work); | ||
378 | } | 388 | } |
379 | 389 | ||
380 | int ath_mci_setup(struct ath_softc *sc) | 390 | int ath_mci_setup(struct ath_softc *sc) |
@@ -568,9 +578,11 @@ void ath_mci_intr(struct ath_softc *sc) | |||
568 | } | 578 | } |
569 | 579 | ||
570 | if ((mci_int & AR_MCI_INTERRUPT_RX_INVALID_HDR) || | 580 | if ((mci_int & AR_MCI_INTERRUPT_RX_INVALID_HDR) || |
571 | (mci_int & AR_MCI_INTERRUPT_CONT_INFO_TIMEOUT)) | 581 | (mci_int & AR_MCI_INTERRUPT_CONT_INFO_TIMEOUT)) { |
572 | mci_int &= ~(AR_MCI_INTERRUPT_RX_INVALID_HDR | | 582 | mci_int &= ~(AR_MCI_INTERRUPT_RX_INVALID_HDR | |
573 | AR_MCI_INTERRUPT_CONT_INFO_TIMEOUT); | 583 | AR_MCI_INTERRUPT_CONT_INFO_TIMEOUT); |
584 | ath_mci_msg(sc, MCI_GPM_COEX_NOOP, NULL); | ||
585 | } | ||
574 | } | 586 | } |
575 | 587 | ||
576 | void ath_mci_enable(struct ath_softc *sc) | 588 | void ath_mci_enable(struct ath_softc *sc) |
diff --git a/drivers/net/wireless/ath/ath9k/pci.c b/drivers/net/wireless/ath/ath9k/pci.c index a8f6126f6b2d..c0c599673eeb 100644 --- a/drivers/net/wireless/ath/ath9k/pci.c +++ b/drivers/net/wireless/ath/ath9k/pci.c | |||
@@ -128,8 +128,9 @@ static void ath_pci_aspm_init(struct ath_common *common) | |||
128 | if (!parent) | 128 | if (!parent) |
129 | return; | 129 | return; |
130 | 130 | ||
131 | if (ath9k_hw_get_btcoex_scheme(ah) != ATH_BTCOEX_CFG_NONE) { | 131 | if ((ath9k_hw_get_btcoex_scheme(ah) != ATH_BTCOEX_CFG_NONE) && |
132 | /* Bluetooth coexistance requires disabling ASPM. */ | 132 | (AR_SREV_9285(ah))) { |
133 | /* Bluetooth coexistance requires disabling ASPM for AR9285. */ | ||
133 | pci_read_config_byte(pdev, pos + PCI_EXP_LNKCTL, &aspm); | 134 | pci_read_config_byte(pdev, pos + PCI_EXP_LNKCTL, &aspm); |
134 | aspm &= ~(PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1); | 135 | aspm &= ~(PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1); |
135 | pci_write_config_byte(pdev, pos + PCI_EXP_LNKCTL, aspm); | 136 | pci_write_config_byte(pdev, pos + PCI_EXP_LNKCTL, aspm); |
diff --git a/drivers/net/wireless/ath/ath9k/rc.c b/drivers/net/wireless/ath/ath9k/rc.c index 4b12c347d188..27ed80b54881 100644 --- a/drivers/net/wireless/ath/ath9k/rc.c +++ b/drivers/net/wireless/ath/ath9k/rc.c | |||
@@ -1222,11 +1222,14 @@ static u8 ath_rc_build_ht_caps(struct ath_softc *sc, struct ieee80211_sta *sta) | |||
1222 | caps |= WLAN_RC_TS_FLAG | WLAN_RC_DS_FLAG; | 1222 | caps |= WLAN_RC_TS_FLAG | WLAN_RC_DS_FLAG; |
1223 | else if (sta->ht_cap.mcs.rx_mask[1]) | 1223 | else if (sta->ht_cap.mcs.rx_mask[1]) |
1224 | caps |= WLAN_RC_DS_FLAG; | 1224 | caps |= WLAN_RC_DS_FLAG; |
1225 | if (sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) | 1225 | if (sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) { |
1226 | caps |= WLAN_RC_40_FLAG; | 1226 | caps |= WLAN_RC_40_FLAG; |
1227 | if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40 || | 1227 | if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) |
1228 | sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) | 1228 | caps |= WLAN_RC_SGI_FLAG; |
1229 | caps |= WLAN_RC_SGI_FLAG; | 1229 | } else { |
1230 | if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) | ||
1231 | caps |= WLAN_RC_SGI_FLAG; | ||
1232 | } | ||
1230 | } | 1233 | } |
1231 | 1234 | ||
1232 | return caps; | 1235 | return caps; |