diff options
author | Felix Fietkau <nbd@openwrt.org> | 2013-12-14 12:03:36 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2013-12-18 15:23:19 -0500 |
commit | e45e91d8812c1cd4dac98efd6fb6d0dd27fa3d4a (patch) | |
tree | 729b637e74af3de63b8ea177df6af7b6a5bf80ad | |
parent | f40c46082717cea32ba1852c8217cbb9693fe80f (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.c | 8 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9003_mac.c | 12 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/dfs.c | 4 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/mac.c | 24 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/mac.h | 8 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/recv.c | 25 |
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; |