Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Felix Fietkau and committed by
John W. Linville
e45e91d8 f40c4608

+46 -35
+4 -4
drivers/net/wireless/ath/ath9k/antenna.c
··· 724 724 struct ath_ant_comb *antcomb = &sc->ant_comb; 725 725 int alt_ratio = 0, alt_rssi_avg = 0, main_rssi_avg = 0, curr_alt_set; 726 726 int curr_main_set; 727 - int main_rssi = rs->rs_rssi_ctl0; 728 - int alt_rssi = rs->rs_rssi_ctl1; 727 + int main_rssi = rs->rs_rssi_ctl[0]; 728 + int alt_rssi = rs->rs_rssi_ctl[1]; 729 729 int rx_ant_conf, main_ant_conf; 730 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 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 735 ATH_ANT_RX_MASK; 736 736 737 737 if (alt_rssi >= antcomb->low_rssi_thresh) {
+6 -6
drivers/net/wireless/ath/ath9k/ar9003_mac.c
··· 476 476 477 477 /* XXX: Keycache */ 478 478 rxs->rs_rssi = MS(rxsp->status5, AR_RxRSSICombined); 479 - rxs->rs_rssi_ctl0 = MS(rxsp->status1, AR_RxRSSIAnt00); 480 - rxs->rs_rssi_ctl1 = MS(rxsp->status1, AR_RxRSSIAnt01); 481 - rxs->rs_rssi_ctl2 = MS(rxsp->status1, AR_RxRSSIAnt02); 482 - rxs->rs_rssi_ext0 = MS(rxsp->status5, AR_RxRSSIAnt10); 483 - rxs->rs_rssi_ext1 = MS(rxsp->status5, AR_RxRSSIAnt11); 484 - rxs->rs_rssi_ext2 = MS(rxsp->status5, AR_RxRSSIAnt12); 479 + rxs->rs_rssi_ctl[0] = MS(rxsp->status1, AR_RxRSSIAnt00); 480 + rxs->rs_rssi_ctl[1] = MS(rxsp->status1, AR_RxRSSIAnt01); 481 + rxs->rs_rssi_ctl[2] = MS(rxsp->status1, AR_RxRSSIAnt02); 482 + rxs->rs_rssi_ext[0] = MS(rxsp->status5, AR_RxRSSIAnt10); 483 + rxs->rs_rssi_ext[1] = MS(rxsp->status5, AR_RxRSSIAnt11); 484 + rxs->rs_rssi_ext[2] = MS(rxsp->status5, AR_RxRSSIAnt12); 485 485 486 486 if (rxsp->status11 & AR_RxKeyIdxValid) 487 487 rxs->rs_keyix = MS(rxsp->status11, AR_KeyIdx);
+2 -2
drivers/net/wireless/ath/ath9k/dfs.c
··· 158 158 return; 159 159 } 160 160 161 - ard.rssi = rs->rs_rssi_ctl0; 162 - ard.ext_rssi = rs->rs_rssi_ext0; 161 + ard.rssi = rs->rs_rssi_ctl[0]; 162 + ard.ext_rssi = rs->rs_rssi_ext[0]; 163 163 164 164 /* 165 165 * hardware stores this as 8 bit signed value.
+12 -12
drivers/net/wireless/ath/ath9k/mac.c
··· 550 550 551 551 if (ads.ds_rxstatus8 & AR_PostDelimCRCErr) { 552 552 rs->rs_rssi = ATH9K_RSSI_BAD; 553 - rs->rs_rssi_ctl0 = ATH9K_RSSI_BAD; 554 - rs->rs_rssi_ctl1 = ATH9K_RSSI_BAD; 555 - rs->rs_rssi_ctl2 = ATH9K_RSSI_BAD; 556 - rs->rs_rssi_ext0 = ATH9K_RSSI_BAD; 557 - rs->rs_rssi_ext1 = ATH9K_RSSI_BAD; 558 - rs->rs_rssi_ext2 = ATH9K_RSSI_BAD; 553 + rs->rs_rssi_ctl[0] = ATH9K_RSSI_BAD; 554 + rs->rs_rssi_ctl[1] = ATH9K_RSSI_BAD; 555 + rs->rs_rssi_ctl[2] = ATH9K_RSSI_BAD; 556 + rs->rs_rssi_ext[0] = ATH9K_RSSI_BAD; 557 + rs->rs_rssi_ext[1] = ATH9K_RSSI_BAD; 558 + rs->rs_rssi_ext[2] = ATH9K_RSSI_BAD; 559 559 } else { 560 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 562 AR_RxRSSIAnt00); 563 - rs->rs_rssi_ctl1 = MS(ads.ds_rxstatus0, 563 + rs->rs_rssi_ctl[1] = MS(ads.ds_rxstatus0, 564 564 AR_RxRSSIAnt01); 565 - rs->rs_rssi_ctl2 = MS(ads.ds_rxstatus0, 565 + rs->rs_rssi_ctl[2] = MS(ads.ds_rxstatus0, 566 566 AR_RxRSSIAnt02); 567 - rs->rs_rssi_ext0 = MS(ads.ds_rxstatus4, 567 + rs->rs_rssi_ext[0] = MS(ads.ds_rxstatus4, 568 568 AR_RxRSSIAnt10); 569 - rs->rs_rssi_ext1 = MS(ads.ds_rxstatus4, 569 + rs->rs_rssi_ext[1] = MS(ads.ds_rxstatus4, 570 570 AR_RxRSSIAnt11); 571 - rs->rs_rssi_ext2 = MS(ads.ds_rxstatus4, 571 + rs->rs_rssi_ext[2] = MS(ads.ds_rxstatus4, 572 572 AR_RxRSSIAnt12); 573 573 } 574 574 if (ads.ds_rxstatus8 & AR_RxKeyIdxValid)
+2 -6
drivers/net/wireless/ath/ath9k/mac.h
··· 133 133 u8 rs_rate; 134 134 u8 rs_antenna; 135 135 u8 rs_more; 136 - int8_t rs_rssi_ctl0; 137 - int8_t rs_rssi_ctl1; 138 - int8_t rs_rssi_ctl2; 139 - int8_t rs_rssi_ext0; 140 - int8_t rs_rssi_ext1; 141 - int8_t rs_rssi_ext2; 136 + int8_t rs_rssi_ctl[3]; 137 + int8_t rs_rssi_ext[3]; 142 138 u8 rs_isaggr; 143 139 u8 rs_firstaggr; 144 140 u8 rs_moreaggr;
+20 -5
drivers/net/wireless/ath/ath9k/recv.c
··· 906 906 struct ath_hw *ah = common->ah; 907 907 int last_rssi; 908 908 int rssi = rx_stats->rs_rssi; 909 + int i, j; 909 910 910 911 /* 911 912 * RSSI is not available for subframes in an A-MPDU. ··· 923 922 if (rx_stats->rs_rssi == ATH9K_RSSI_BAD) { 924 923 rxs->flag |= RX_FLAG_NO_SIGNAL_VAL; 925 924 return; 925 + } 926 + 927 + for (i = 0, j = 0; i < ARRAY_SIZE(rx_stats->rs_rssi_ctl); i++) { 928 + s8 rssi; 929 + 930 + if (!(ah->rxchainmask & BIT(i))) 931 + continue; 932 + 933 + rssi = rx_stats->rs_rssi_ctl[i]; 934 + if (rssi != ATH9K_RSSI_BAD) { 935 + rxs->chains |= BIT(j); 936 + rxs->chain_signal[j] = ah->noise + rssi; 937 + } 938 + j++; 926 939 } 927 940 928 941 /* ··· 1088 1073 fft_sample_40.channel_type = chan_type; 1089 1074 1090 1075 if (chan_type == NL80211_CHAN_HT40PLUS) { 1091 - lower_rssi = fix_rssi_inv_only(rs->rs_rssi_ctl0); 1092 - upper_rssi = fix_rssi_inv_only(rs->rs_rssi_ext0); 1076 + lower_rssi = fix_rssi_inv_only(rs->rs_rssi_ctl[0]); 1077 + upper_rssi = fix_rssi_inv_only(rs->rs_rssi_ext[0]); 1093 1078 1094 1079 fft_sample_40.lower_noise = ah->noise; 1095 1080 fft_sample_40.upper_noise = ext_nf; 1096 1081 } else { 1097 - lower_rssi = fix_rssi_inv_only(rs->rs_rssi_ext0); 1098 - upper_rssi = fix_rssi_inv_only(rs->rs_rssi_ctl0); 1082 + lower_rssi = fix_rssi_inv_only(rs->rs_rssi_ext[0]); 1083 + upper_rssi = fix_rssi_inv_only(rs->rs_rssi_ctl[0]); 1099 1084 1100 1085 fft_sample_40.lower_noise = ext_nf; 1101 1086 fft_sample_40.upper_noise = ah->noise; ··· 1131 1116 fft_sample_20.tlv.length = __cpu_to_be16(length); 1132 1117 fft_sample_20.freq = __cpu_to_be16(freq); 1133 1118 1134 - fft_sample_20.rssi = fix_rssi_inv_only(rs->rs_rssi_ctl0); 1119 + fft_sample_20.rssi = fix_rssi_inv_only(rs->rs_rssi_ctl[0]); 1135 1120 fft_sample_20.noise = ah->noise; 1136 1121 1137 1122 mag_info = ((struct ath_ht20_mag_info *)radar_info) - 1;