]> Pileus Git - ~andy/linux/blobdiff - drivers/net/wireless/ath/ath9k/antenna.c
Merge tag 'remove-local-timers' of git://git.kernel.org/pub/scm/linux/kernel/git...
[~andy/linux] / drivers / net / wireless / ath / ath9k / antenna.c
index bbcfeb3b2a60ac90d046110d59161dd118b15e4a..664844c5d3d51ae8752514bb3976fa2074ba0afe 100644 (file)
@@ -311,6 +311,9 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,
                                          struct ath_ant_comb *antcomb,
                                          int alt_ratio)
 {
+       ant_conf->main_gaintb = 0;
+       ant_conf->alt_gaintb = 0;
+
        if (ant_conf->div_group == 0) {
                /* Adjust the fast_div_bias based on main and alt lna conf */
                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,
                        ant_conf->alt_lna_conf) {
                case 0x01: /* A-B LNA2 */
                        ant_conf->fast_div_bias = 0x1;
-                       ant_conf->main_gaintb = 0;
-                       ant_conf->alt_gaintb = 0;
                        break;
                case 0x02: /* A-B LNA1 */
                        ant_conf->fast_div_bias = 0x1;
-                       ant_conf->main_gaintb = 0;
-                       ant_conf->alt_gaintb = 0;
                        break;
                case 0x03: /* A-B A+B */
                        ant_conf->fast_div_bias = 0x1;
-                       ant_conf->main_gaintb = 0;
-                       ant_conf->alt_gaintb = 0;
                        break;
                case 0x10: /* LNA2 A-B */
                        if (!(antcomb->scan) &&
@@ -379,13 +376,9 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,
                                ant_conf->fast_div_bias = 0x3f;
                        else
                                ant_conf->fast_div_bias = 0x1;
-                       ant_conf->main_gaintb = 0;
-                       ant_conf->alt_gaintb = 0;
                        break;
                case 0x12: /* LNA2 LNA1 */
                        ant_conf->fast_div_bias = 0x1;
-                       ant_conf->main_gaintb = 0;
-                       ant_conf->alt_gaintb = 0;
                        break;
                case 0x13: /* LNA2 A+B */
                        if (!(antcomb->scan) &&
@@ -393,8 +386,6 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,
                                ant_conf->fast_div_bias = 0x3f;
                        else
                                ant_conf->fast_div_bias = 0x1;
-                       ant_conf->main_gaintb = 0;
-                       ant_conf->alt_gaintb = 0;
                        break;
                case 0x20: /* LNA1 A-B */
                        if (!(antcomb->scan) &&
@@ -402,13 +393,9 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,
                                ant_conf->fast_div_bias = 0x3f;
                        else
                                ant_conf->fast_div_bias = 0x1;
-                       ant_conf->main_gaintb = 0;
-                       ant_conf->alt_gaintb = 0;
                        break;
                case 0x21: /* LNA1 LNA2 */
                        ant_conf->fast_div_bias = 0x1;
-                       ant_conf->main_gaintb = 0;
-                       ant_conf->alt_gaintb = 0;
                        break;
                case 0x23: /* LNA1 A+B */
                        if (!(antcomb->scan) &&
@@ -416,23 +403,15 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,
                                ant_conf->fast_div_bias = 0x3f;
                        else
                                ant_conf->fast_div_bias = 0x1;
-                       ant_conf->main_gaintb = 0;
-                       ant_conf->alt_gaintb = 0;
                        break;
                case 0x30: /* A+B A-B */
                        ant_conf->fast_div_bias = 0x1;
-                       ant_conf->main_gaintb = 0;
-                       ant_conf->alt_gaintb = 0;
                        break;
                case 0x31: /* A+B LNA2 */
                        ant_conf->fast_div_bias = 0x1;
-                       ant_conf->main_gaintb = 0;
-                       ant_conf->alt_gaintb = 0;
                        break;
                case 0x32: /* A+B LNA1 */
                        ant_conf->fast_div_bias = 0x1;
-                       ant_conf->main_gaintb = 0;
-                       ant_conf->alt_gaintb = 0;
                        break;
                default:
                        break;
@@ -443,18 +422,12 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,
                                ant_conf->alt_lna_conf) {
                case 0x01: /* A-B LNA2 */
                        ant_conf->fast_div_bias = 0x1;
-                       ant_conf->main_gaintb = 0;
-                       ant_conf->alt_gaintb = 0;
                        break;
                case 0x02: /* A-B LNA1 */
                        ant_conf->fast_div_bias = 0x1;
-                       ant_conf->main_gaintb = 0;
-                       ant_conf->alt_gaintb = 0;
                        break;
                case 0x03: /* A-B A+B */
                        ant_conf->fast_div_bias = 0x1;
-                       ant_conf->main_gaintb = 0;
-                       ant_conf->alt_gaintb = 0;
                        break;
                case 0x10: /* LNA2 A-B */
                        if (!(antcomb->scan) &&
@@ -462,13 +435,9 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,
                                ant_conf->fast_div_bias = 0x1;
                        else
                                ant_conf->fast_div_bias = 0x2;
-                       ant_conf->main_gaintb = 0;
-                       ant_conf->alt_gaintb = 0;
                        break;
                case 0x12: /* LNA2 LNA1 */
                        ant_conf->fast_div_bias = 0x1;
-                       ant_conf->main_gaintb = 0;
-                       ant_conf->alt_gaintb = 0;
                        break;
                case 0x13: /* LNA2 A+B */
                        if (!(antcomb->scan) &&
@@ -476,8 +445,6 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,
                                ant_conf->fast_div_bias = 0x1;
                        else
                                ant_conf->fast_div_bias = 0x2;
-                       ant_conf->main_gaintb = 0;
-                       ant_conf->alt_gaintb = 0;
                        break;
                case 0x20: /* LNA1 A-B */
                        if (!(antcomb->scan) &&
@@ -485,13 +452,9 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,
                                ant_conf->fast_div_bias = 0x1;
                        else
                                ant_conf->fast_div_bias = 0x2;
-                       ant_conf->main_gaintb = 0;
-                       ant_conf->alt_gaintb = 0;
                        break;
                case 0x21: /* LNA1 LNA2 */
                        ant_conf->fast_div_bias = 0x1;
-                       ant_conf->main_gaintb = 0;
-                       ant_conf->alt_gaintb = 0;
                        break;
                case 0x23: /* LNA1 A+B */
                        if (!(antcomb->scan) &&
@@ -499,23 +462,77 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,
                                ant_conf->fast_div_bias = 0x1;
                        else
                                ant_conf->fast_div_bias = 0x2;
-                       ant_conf->main_gaintb = 0;
-                       ant_conf->alt_gaintb = 0;
                        break;
                case 0x30: /* A+B A-B */
                        ant_conf->fast_div_bias = 0x1;
-                       ant_conf->main_gaintb = 0;
-                       ant_conf->alt_gaintb = 0;
                        break;
                case 0x31: /* A+B LNA2 */
                        ant_conf->fast_div_bias = 0x1;
-                       ant_conf->main_gaintb = 0;
-                       ant_conf->alt_gaintb = 0;
                        break;
                case 0x32: /* A+B LNA1 */
                        ant_conf->fast_div_bias = 0x1;
-                       ant_conf->main_gaintb = 0;
-                       ant_conf->alt_gaintb = 0;
+                       break;
+               default:
+                       break;
+               }
+       } else if (ant_conf->div_group == 3) {
+               switch ((ant_conf->main_lna_conf << 4) |
+                       ant_conf->alt_lna_conf) {
+               case 0x01: /* A-B LNA2 */
+                       ant_conf->fast_div_bias = 0x1;
+                       break;
+               case 0x02: /* A-B LNA1 */
+                       ant_conf->fast_div_bias = 0x39;
+                       break;
+               case 0x03: /* A-B A+B */
+                       ant_conf->fast_div_bias = 0x1;
+                       break;
+               case 0x10: /* LNA2 A-B */
+                       if ((antcomb->scan == 0) &&
+                           (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) {
+                               ant_conf->fast_div_bias = 0x3f;
+                       } else {
+                               ant_conf->fast_div_bias = 0x1;
+                       }
+                       break;
+               case 0x12: /* LNA2 LNA1 */
+                       ant_conf->fast_div_bias = 0x39;
+                       break;
+               case 0x13: /* LNA2 A+B */
+                       if ((antcomb->scan == 0) &&
+                           (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) {
+                               ant_conf->fast_div_bias = 0x3f;
+                       } else {
+                               ant_conf->fast_div_bias = 0x1;
+                       }
+                       break;
+               case 0x20: /* LNA1 A-B */
+                       if ((antcomb->scan == 0) &&
+                           (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) {
+                               ant_conf->fast_div_bias = 0x3f;
+                       } else {
+                               ant_conf->fast_div_bias = 0x4;
+                       }
+                       break;
+               case 0x21: /* LNA1 LNA2 */
+                       ant_conf->fast_div_bias = 0x6;
+                       break;
+               case 0x23: /* LNA1 A+B */
+                       if ((antcomb->scan == 0) &&
+                           (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) {
+                               ant_conf->fast_div_bias = 0x3f;
+                       } else {
+                               ant_conf->fast_div_bias = 0x6;
+                       }
+                       break;
+               case 0x30: /* A+B A-B */
+                       ant_conf->fast_div_bias = 0x1;
+                       break;
+               case 0x31: /* A+B LNA2 */
+                       ant_conf->fast_div_bias = 0x6;
+                       break;
+               case 0x32: /* A+B LNA1 */
+                       ant_conf->fast_div_bias = 0x1;
                        break;
                default:
                        break;
@@ -759,6 +776,7 @@ div_comb_done:
 void ath_ant_comb_update(struct ath_softc *sc)
 {
        struct ath_hw *ah = sc->sc_ah;
+       struct ath_common *common = ath9k_hw_common(ah);
        struct ath_hw_antcomb_conf div_ant_conf;
        u8 lna_conf;
 
@@ -773,4 +791,7 @@ void ath_ant_comb_update(struct ath_softc *sc)
        div_ant_conf.alt_lna_conf = lna_conf;
 
        ath9k_hw_antdiv_comb_conf_set(ah, &div_ant_conf);
+
+       if (common->antenna_diversity)
+               ath9k_hw_antctrl_shared_chain_lnadiv(ah, true);
 }