aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2013-12-14 12:03:36 -0500
committerJohn W. Linville <linville@tuxdriver.com>2013-12-18 15:23:19 -0500
commite45e91d8812c1cd4dac98efd6fb6d0dd27fa3d4a (patch)
tree729b637e74af3de63b8ea177df6af7b6a5bf80ad
parentf40c46082717cea32ba1852c8217cbb9693fe80f (diff)
ath9k: add support for reporting per-chain signal strength
Signed-off-by: Felix Fietkau <nbd@openwrt.org> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/ath/ath9k/antenna.c8
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9003_mac.c12
-rw-r--r--drivers/net/wireless/ath/ath9k/dfs.c4
-rw-r--r--drivers/net/wireless/ath/ath9k/mac.c24
-rw-r--r--drivers/net/wireless/ath/ath9k/mac.h8
-rw-r--r--drivers/net/wireless/ath/ath9k/recv.c25
6 files changed, 46 insertions, 35 deletions
diff --git a/drivers/net/wireless/ath/ath9k/antenna.c b/drivers/net/wireless/ath/ath9k/antenna.c
index bd048cc69a33..a3668433dc02 100644
--- a/drivers/net/wireless/ath/ath9k/antenna.c
+++ b/drivers/net/wireless/ath/ath9k/antenna.c
@@ -724,14 +724,14 @@ void ath_ant_comb_scan(struct ath_softc *sc, struct ath_rx_status *rs)
724 struct ath_ant_comb *antcomb = &sc->ant_comb; 724 struct ath_ant_comb *antcomb = &sc->ant_comb;
725 int alt_ratio = 0, alt_rssi_avg = 0, main_rssi_avg = 0, curr_alt_set; 725 int alt_ratio = 0, alt_rssi_avg = 0, main_rssi_avg = 0, curr_alt_set;
726 int curr_main_set; 726 int curr_main_set;
727 int main_rssi = rs->rs_rssi_ctl0; 727 int main_rssi = rs->rs_rssi_ctl[0];
728 int alt_rssi = rs->rs_rssi_ctl1; 728 int alt_rssi = rs->rs_rssi_ctl[1];
729 int rx_ant_conf, main_ant_conf; 729 int rx_ant_conf, main_ant_conf;
730 bool short_scan = false, ret; 730 bool short_scan = false, ret;
731 731
732 rx_ant_conf = (rs->rs_rssi_ctl2 >> ATH_ANT_RX_CURRENT_SHIFT) & 732 rx_ant_conf = (rs->rs_rssi_ctl[2] >> ATH_ANT_RX_CURRENT_SHIFT) &
733 ATH_ANT_RX_MASK; 733 ATH_ANT_RX_MASK;
734 main_ant_conf = (rs->rs_rssi_ctl2 >> ATH_ANT_RX_MAIN_SHIFT) & 734 main_ant_conf = (rs->rs_rssi_ctl[2] >> ATH_ANT_RX_MAIN_SHIFT) &
735 ATH_ANT_RX_MASK; 735 ATH_ANT_RX_MASK;
736 736
737 if (alt_rssi >= antcomb->low_rssi_thresh) { 737 if (alt_rssi >= antcomb->low_rssi_thresh) {
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mac.c b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
index f6c5c1b50471..6eb8657681bf 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
@@ -476,12 +476,12 @@ int ath9k_hw_process_rxdesc_edma(struct ath_hw *ah, struct ath_rx_status *rxs,
476 476
477 /* XXX: Keycache */ 477 /* XXX: Keycache */
478 rxs->rs_rssi = MS(rxsp->status5, AR_RxRSSICombined); 478 rxs->rs_rssi = MS(rxsp->status5, AR_RxRSSICombined);
479 rxs->rs_rssi_ctl0 = MS(rxsp->status1, AR_RxRSSIAnt00); 479 rxs->rs_rssi_ctl[0] = MS(rxsp->status1, AR_RxRSSIAnt00);
480 rxs->rs_rssi_ctl1 = MS(rxsp->status1, AR_RxRSSIAnt01); 480 rxs->rs_rssi_ctl[1] = MS(rxsp->status1, AR_RxRSSIAnt01);
481 rxs->rs_rssi_ctl2 = MS(rxsp->status1, AR_RxRSSIAnt02); 481 rxs->rs_rssi_ctl[2] = MS(rxsp->status1, AR_RxRSSIAnt02);
482 rxs->rs_rssi_ext0 = MS(rxsp->status5, AR_RxRSSIAnt10); 482 rxs->rs_rssi_ext[0] = MS(rxsp->status5, AR_RxRSSIAnt10);
483 rxs->rs_rssi_ext1 = MS(rxsp->status5, AR_RxRSSIAnt11); 483 rxs->rs_rssi_ext[1] = MS(rxsp->status5, AR_RxRSSIAnt11);
484 rxs->rs_rssi_ext2 = MS(rxsp->status5, AR_RxRSSIAnt12); 484 rxs->rs_rssi_ext[2] = MS(rxsp->status5, AR_RxRSSIAnt12);
485 485
486 if (rxsp->status11 & AR_RxKeyIdxValid) 486 if (rxsp->status11 & AR_RxKeyIdxValid)
487 rxs->rs_keyix = MS(rxsp->status11, AR_KeyIdx); 487 rxs->rs_keyix = MS(rxsp->status11, AR_KeyIdx);
diff --git a/drivers/net/wireless/ath/ath9k/dfs.c b/drivers/net/wireless/ath/ath9k/dfs.c
index 7187d3671512..857bb28b3894 100644
--- a/drivers/net/wireless/ath/ath9k/dfs.c
+++ b/drivers/net/wireless/ath/ath9k/dfs.c
@@ -158,8 +158,8 @@ void ath9k_dfs_process_phyerr(struct ath_softc *sc, void *data,
158 return; 158 return;
159 } 159 }
160 160
161 ard.rssi = rs->rs_rssi_ctl0; 161 ard.rssi = rs->rs_rssi_ctl[0];
162 ard.ext_rssi = rs->rs_rssi_ext0; 162 ard.ext_rssi = rs->rs_rssi_ext[0];
163 163
164 /* 164 /*
165 * hardware stores this as 8 bit signed value. 165 * hardware stores this as 8 bit signed value.
diff --git a/drivers/net/wireless/ath/ath9k/mac.c b/drivers/net/wireless/ath/ath9k/mac.c
index 6a18f9d3e9cc..a8504822b4fd 100644
--- a/drivers/net/wireless/ath/ath9k/mac.c
+++ b/drivers/net/wireless/ath/ath9k/mac.c
@@ -550,25 +550,25 @@ int ath9k_hw_rxprocdesc(struct ath_hw *ah, struct ath_desc *ds,
550 550
551 if (ads.ds_rxstatus8 & AR_PostDelimCRCErr) { 551 if (ads.ds_rxstatus8 & AR_PostDelimCRCErr) {
552 rs->rs_rssi = ATH9K_RSSI_BAD; 552 rs->rs_rssi = ATH9K_RSSI_BAD;
553 rs->rs_rssi_ctl0 = ATH9K_RSSI_BAD; 553 rs->rs_rssi_ctl[0] = ATH9K_RSSI_BAD;
554 rs->rs_rssi_ctl1 = ATH9K_RSSI_BAD; 554 rs->rs_rssi_ctl[1] = ATH9K_RSSI_BAD;
555 rs->rs_rssi_ctl2 = ATH9K_RSSI_BAD; 555 rs->rs_rssi_ctl[2] = ATH9K_RSSI_BAD;
556 rs->rs_rssi_ext0 = ATH9K_RSSI_BAD; 556 rs->rs_rssi_ext[0] = ATH9K_RSSI_BAD;
557 rs->rs_rssi_ext1 = ATH9K_RSSI_BAD; 557 rs->rs_rssi_ext[1] = ATH9K_RSSI_BAD;
558 rs->rs_rssi_ext2 = ATH9K_RSSI_BAD; 558 rs->rs_rssi_ext[2] = ATH9K_RSSI_BAD;
559 } else { 559 } else {
560 rs->rs_rssi = MS(ads.ds_rxstatus4, AR_RxRSSICombined); 560 rs->rs_rssi = MS(ads.ds_rxstatus4, AR_RxRSSICombined);
561 rs->rs_rssi_ctl0 = MS(ads.ds_rxstatus0, 561 rs->rs_rssi_ctl[0] = MS(ads.ds_rxstatus0,
562 AR_RxRSSIAnt00); 562 AR_RxRSSIAnt00);
563 rs->rs_rssi_ctl1 = MS(ads.ds_rxstatus0, 563 rs->rs_rssi_ctl[1] = MS(ads.ds_rxstatus0,
564 AR_RxRSSIAnt01); 564 AR_RxRSSIAnt01);
565 rs->rs_rssi_ctl2 = MS(ads.ds_rxstatus0, 565 rs->rs_rssi_ctl[2] = MS(ads.ds_rxstatus0,
566 AR_RxRSSIAnt02); 566 AR_RxRSSIAnt02);
567 rs->rs_rssi_ext0 = MS(ads.ds_rxstatus4, 567 rs->rs_rssi_ext[0] = MS(ads.ds_rxstatus4,
568 AR_RxRSSIAnt10); 568 AR_RxRSSIAnt10);
569 rs->rs_rssi_ext1 = MS(ads.ds_rxstatus4, 569 rs->rs_rssi_ext[1] = MS(ads.ds_rxstatus4,
570 AR_RxRSSIAnt11); 570 AR_RxRSSIAnt11);
571 rs->rs_rssi_ext2 = MS(ads.ds_rxstatus4, 571 rs->rs_rssi_ext[2] = MS(ads.ds_rxstatus4,
572 AR_RxRSSIAnt12); 572 AR_RxRSSIAnt12);
573 } 573 }
574 if (ads.ds_rxstatus8 & AR_RxKeyIdxValid) 574 if (ads.ds_rxstatus8 & AR_RxKeyIdxValid)
diff --git a/drivers/net/wireless/ath/ath9k/mac.h b/drivers/net/wireless/ath/ath9k/mac.h
index e3eed81f2439..10271373a0cd 100644
--- a/drivers/net/wireless/ath/ath9k/mac.h
+++ b/drivers/net/wireless/ath/ath9k/mac.h
@@ -133,12 +133,8 @@ struct ath_rx_status {
133 u8 rs_rate; 133 u8 rs_rate;
134 u8 rs_antenna; 134 u8 rs_antenna;
135 u8 rs_more; 135 u8 rs_more;
136 int8_t rs_rssi_ctl0; 136 int8_t rs_rssi_ctl[3];
137 int8_t rs_rssi_ctl1; 137 int8_t rs_rssi_ext[3];
138 int8_t rs_rssi_ctl2;
139 int8_t rs_rssi_ext0;
140 int8_t rs_rssi_ext1;
141 int8_t rs_rssi_ext2;
142 u8 rs_isaggr; 138 u8 rs_isaggr;
143 u8 rs_firstaggr; 139 u8 rs_firstaggr;
144 u8 rs_moreaggr; 140 u8 rs_moreaggr;
diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
index 95ddca5495d4..2410224b6def 100644
--- a/drivers/net/wireless/ath/ath9k/recv.c
+++ b/drivers/net/wireless/ath/ath9k/recv.c
@@ -906,6 +906,7 @@ static void ath9k_process_rssi(struct ath_common *common,
906 struct ath_hw *ah = common->ah; 906 struct ath_hw *ah = common->ah;
907 int last_rssi; 907 int last_rssi;
908 int rssi = rx_stats->rs_rssi; 908 int rssi = rx_stats->rs_rssi;
909 int i, j;
909 910
910 /* 911 /*
911 * RSSI is not available for subframes in an A-MPDU. 912 * RSSI is not available for subframes in an A-MPDU.
@@ -924,6 +925,20 @@ static void ath9k_process_rssi(struct ath_common *common,
924 return; 925 return;
925 } 926 }
926 927
928 for (i = 0, j = 0; i < ARRAY_SIZE(rx_stats->rs_rssi_ctl); i++) {
929 s8 rssi;
930
931 if (!(ah->rxchainmask & BIT(i)))
932 continue;
933
934 rssi = rx_stats->rs_rssi_ctl[i];
935 if (rssi != ATH9K_RSSI_BAD) {
936 rxs->chains |= BIT(j);
937 rxs->chain_signal[j] = ah->noise + rssi;
938 }
939 j++;
940 }
941
927 /* 942 /*
928 * Update Beacon RSSI, this is used by ANI. 943 * Update Beacon RSSI, this is used by ANI.
929 */ 944 */
@@ -1073,14 +1088,14 @@ static int ath_process_fft(struct ath_softc *sc, struct ieee80211_hdr *hdr,
1073 fft_sample_40.channel_type = chan_type; 1088 fft_sample_40.channel_type = chan_type;
1074 1089
1075 if (chan_type == NL80211_CHAN_HT40PLUS) { 1090 if (chan_type == NL80211_CHAN_HT40PLUS) {
1076 lower_rssi = fix_rssi_inv_only(rs->rs_rssi_ctl0); 1091 lower_rssi = fix_rssi_inv_only(rs->rs_rssi_ctl[0]);
1077 upper_rssi = fix_rssi_inv_only(rs->rs_rssi_ext0); 1092 upper_rssi = fix_rssi_inv_only(rs->rs_rssi_ext[0]);
1078 1093
1079 fft_sample_40.lower_noise = ah->noise; 1094 fft_sample_40.lower_noise = ah->noise;
1080 fft_sample_40.upper_noise = ext_nf; 1095 fft_sample_40.upper_noise = ext_nf;
1081 } else { 1096 } else {
1082 lower_rssi = fix_rssi_inv_only(rs->rs_rssi_ext0); 1097 lower_rssi = fix_rssi_inv_only(rs->rs_rssi_ext[0]);
1083 upper_rssi = fix_rssi_inv_only(rs->rs_rssi_ctl0); 1098 upper_rssi = fix_rssi_inv_only(rs->rs_rssi_ctl[0]);
1084 1099
1085 fft_sample_40.lower_noise = ext_nf; 1100 fft_sample_40.lower_noise = ext_nf;
1086 fft_sample_40.upper_noise = ah->noise; 1101 fft_sample_40.upper_noise = ah->noise;
@@ -1116,7 +1131,7 @@ static int ath_process_fft(struct ath_softc *sc, struct ieee80211_hdr *hdr,
1116 fft_sample_20.tlv.length = __cpu_to_be16(length); 1131 fft_sample_20.tlv.length = __cpu_to_be16(length);
1117 fft_sample_20.freq = __cpu_to_be16(freq); 1132 fft_sample_20.freq = __cpu_to_be16(freq);
1118 1133
1119 fft_sample_20.rssi = fix_rssi_inv_only(rs->rs_rssi_ctl0); 1134 fft_sample_20.rssi = fix_rssi_inv_only(rs->rs_rssi_ctl[0]);
1120 fft_sample_20.noise = ah->noise; 1135 fft_sample_20.noise = ah->noise;
1121 1136
1122 mag_info = ((struct ath_ht20_mag_info *)radar_info) - 1; 1137 mag_info = ((struct ath_ht20_mag_info *)radar_info) - 1;