diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/antenna.c')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/antenna.c | 117 |
1 files changed, 69 insertions, 48 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 | } |