diff options
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ath9k.h | 16 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/calib.c | 13 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/calib.h | 4 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/main.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/recv.c | 25 |
5 files changed, 54 insertions, 5 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h index 3afd7ee41a63..544599b826c1 100644 --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h | |||
@@ -290,12 +290,28 @@ struct ath_tx_control { | |||
290 | #define ATH_TX_XRETRY 0x02 | 290 | #define ATH_TX_XRETRY 0x02 |
291 | #define ATH_TX_BAR 0x04 | 291 | #define ATH_TX_BAR 0x04 |
292 | 292 | ||
293 | #define ATH_RSSI_LPF_LEN 10 | ||
294 | #define RSSI_LPF_THRESHOLD -20 | ||
295 | #define ATH9K_RSSI_BAD 0x80 | ||
296 | #define ATH_RSSI_EP_MULTIPLIER (1<<7) | ||
297 | #define ATH_EP_MUL(x, mul) ((x) * (mul)) | ||
298 | #define ATH_RSSI_IN(x) (ATH_EP_MUL((x), ATH_RSSI_EP_MULTIPLIER)) | ||
299 | #define ATH_LPF_RSSI(x, y, len) \ | ||
300 | ((x != ATH_RSSI_DUMMY_MARKER) ? (((x) * ((len) - 1) + (y)) / (len)) : (y)) | ||
301 | #define ATH_RSSI_LPF(x, y) do { \ | ||
302 | if ((y) >= RSSI_LPF_THRESHOLD) \ | ||
303 | x = ATH_LPF_RSSI((x), ATH_RSSI_IN((y)), ATH_RSSI_LPF_LEN); \ | ||
304 | } while (0) | ||
305 | #define ATH_EP_RND(x, mul) \ | ||
306 | ((((x)%(mul)) >= ((mul)/2)) ? ((x) + ((mul) - 1)) / (mul) : (x)/(mul)) | ||
307 | |||
293 | struct ath_node { | 308 | struct ath_node { |
294 | struct ath_softc *an_sc; | 309 | struct ath_softc *an_sc; |
295 | struct ath_atx_tid tid[WME_NUM_TID]; | 310 | struct ath_atx_tid tid[WME_NUM_TID]; |
296 | struct ath_atx_ac ac[WME_NUM_AC]; | 311 | struct ath_atx_ac ac[WME_NUM_AC]; |
297 | u16 maxampdu; | 312 | u16 maxampdu; |
298 | u8 mpdudensity; | 313 | u8 mpdudensity; |
314 | int last_rssi; | ||
299 | }; | 315 | }; |
300 | 316 | ||
301 | struct ath_tx { | 317 | struct ath_tx { |
diff --git a/drivers/net/wireless/ath/ath9k/calib.c b/drivers/net/wireless/ath/ath9k/calib.c index a32d7e7fecbe..1f0c5fe4a68b 100644 --- a/drivers/net/wireless/ath/ath9k/calib.c +++ b/drivers/net/wireless/ath/ath9k/calib.c | |||
@@ -691,15 +691,22 @@ int16_t ath9k_hw_getnf(struct ath_hw *ah, | |||
691 | void ath9k_init_nfcal_hist_buffer(struct ath_hw *ah) | 691 | void ath9k_init_nfcal_hist_buffer(struct ath_hw *ah) |
692 | { | 692 | { |
693 | int i, j; | 693 | int i, j; |
694 | s16 noise_floor; | ||
695 | |||
696 | if (AR_SREV_9280(ah)) | ||
697 | noise_floor = AR_PHY_CCA_MAX_AR9280_GOOD_VALUE; | ||
698 | else if (AR_SREV_9285(ah)) | ||
699 | noise_floor = AR_PHY_CCA_MAX_AR9285_GOOD_VALUE; | ||
700 | else | ||
701 | noise_floor = AR_PHY_CCA_MAX_AR5416_GOOD_VALUE; | ||
694 | 702 | ||
695 | for (i = 0; i < NUM_NF_READINGS; i++) { | 703 | for (i = 0; i < NUM_NF_READINGS; i++) { |
696 | ah->nfCalHist[i].currIndex = 0; | 704 | ah->nfCalHist[i].currIndex = 0; |
697 | ah->nfCalHist[i].privNF = AR_PHY_CCA_MAX_GOOD_VALUE; | 705 | ah->nfCalHist[i].privNF = noise_floor; |
698 | ah->nfCalHist[i].invalidNFcount = | 706 | ah->nfCalHist[i].invalidNFcount = |
699 | AR_PHY_CCA_FILTERWINDOW_LENGTH; | 707 | AR_PHY_CCA_FILTERWINDOW_LENGTH; |
700 | for (j = 0; j < ATH9K_NF_CAL_HIST_MAX; j++) { | 708 | for (j = 0; j < ATH9K_NF_CAL_HIST_MAX; j++) { |
701 | ah->nfCalHist[i].nfCalBuffer[j] = | 709 | ah->nfCalHist[i].nfCalBuffer[j] = noise_floor; |
702 | AR_PHY_CCA_MAX_GOOD_VALUE; | ||
703 | } | 710 | } |
704 | } | 711 | } |
705 | } | 712 | } |
diff --git a/drivers/net/wireless/ath/ath9k/calib.h b/drivers/net/wireless/ath/ath9k/calib.h index fe5367f14148..547e697b9055 100644 --- a/drivers/net/wireless/ath/ath9k/calib.h +++ b/drivers/net/wireless/ath/ath9k/calib.h | |||
@@ -25,7 +25,9 @@ extern const struct ath9k_percal_data adc_dc_cal_multi_sample; | |||
25 | extern const struct ath9k_percal_data adc_dc_cal_single_sample; | 25 | extern const struct ath9k_percal_data adc_dc_cal_single_sample; |
26 | extern const struct ath9k_percal_data adc_init_dc_cal; | 26 | extern const struct ath9k_percal_data adc_init_dc_cal; |
27 | 27 | ||
28 | #define AR_PHY_CCA_MAX_GOOD_VALUE -85 | 28 | #define AR_PHY_CCA_MAX_AR5416_GOOD_VALUE -85 |
29 | #define AR_PHY_CCA_MAX_AR9280_GOOD_VALUE -112 | ||
30 | #define AR_PHY_CCA_MAX_AR9285_GOOD_VALUE -118 | ||
29 | #define AR_PHY_CCA_MAX_HIGH_VALUE -62 | 31 | #define AR_PHY_CCA_MAX_HIGH_VALUE -62 |
30 | #define AR_PHY_CCA_MIN_BAD_VALUE -140 | 32 | #define AR_PHY_CCA_MIN_BAD_VALUE -140 |
31 | #define AR_PHY_CCA_FILTERWINDOW_LENGTH_INIT 3 | 33 | #define AR_PHY_CCA_FILTERWINDOW_LENGTH_INIT 3 |
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index 19df7882d0d3..2ad718489c0d 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c | |||
@@ -465,6 +465,7 @@ static void ath_node_attach(struct ath_softc *sc, struct ieee80211_sta *sta) | |||
465 | an->maxampdu = 1 << (IEEE80211_HTCAP_MAXRXAMPDU_FACTOR + | 465 | an->maxampdu = 1 << (IEEE80211_HTCAP_MAXRXAMPDU_FACTOR + |
466 | sta->ht_cap.ampdu_factor); | 466 | sta->ht_cap.ampdu_factor); |
467 | an->mpdudensity = parse_mpdudensity(sta->ht_cap.ampdu_density); | 467 | an->mpdudensity = parse_mpdudensity(sta->ht_cap.ampdu_density); |
468 | an->last_rssi = ATH_RSSI_DUMMY_MARKER; | ||
468 | } | 469 | } |
469 | } | 470 | } |
470 | 471 | ||
diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c index b3da81db453b..61edfab20ffc 100644 --- a/drivers/net/wireless/ath/ath9k/recv.c +++ b/drivers/net/wireless/ath/ath9k/recv.c | |||
@@ -145,6 +145,10 @@ static int ath_rx_prepare(struct sk_buff *skb, struct ath_desc *ds, | |||
145 | u8 ratecode; | 145 | u8 ratecode; |
146 | __le16 fc; | 146 | __le16 fc; |
147 | struct ieee80211_hw *hw; | 147 | struct ieee80211_hw *hw; |
148 | struct ieee80211_sta *sta; | ||
149 | struct ath_node *an; | ||
150 | int last_rssi = ATH_RSSI_DUMMY_MARKER; | ||
151 | |||
148 | 152 | ||
149 | hdr = (struct ieee80211_hdr *)skb->data; | 153 | hdr = (struct ieee80211_hdr *)skb->data; |
150 | fc = hdr->frame_control; | 154 | fc = hdr->frame_control; |
@@ -229,11 +233,30 @@ static int ath_rx_prepare(struct sk_buff *skb, struct ath_desc *ds, | |||
229 | } | 233 | } |
230 | } | 234 | } |
231 | 235 | ||
236 | rcu_read_lock(); | ||
237 | sta = ieee80211_find_sta(sc->hw, hdr->addr2); | ||
238 | if (sta) { | ||
239 | an = (struct ath_node *) sta->drv_priv; | ||
240 | if (ds->ds_rxstat.rs_rssi != ATH9K_RSSI_BAD && | ||
241 | !ds->ds_rxstat.rs_moreaggr) | ||
242 | ATH_RSSI_LPF(an->last_rssi, ds->ds_rxstat.rs_rssi); | ||
243 | last_rssi = an->last_rssi; | ||
244 | } | ||
245 | rcu_read_unlock(); | ||
246 | |||
247 | if (likely(last_rssi != ATH_RSSI_DUMMY_MARKER)) | ||
248 | ds->ds_rxstat.rs_rssi = ATH_EP_RND(last_rssi, | ||
249 | ATH_RSSI_EP_MULTIPLIER); | ||
250 | if (ds->ds_rxstat.rs_rssi < 0) | ||
251 | ds->ds_rxstat.rs_rssi = 0; | ||
252 | else if (ds->ds_rxstat.rs_rssi > 127) | ||
253 | ds->ds_rxstat.rs_rssi = 127; | ||
254 | |||
232 | rx_status->mactime = ath_extend_tsf(sc, ds->ds_rxstat.rs_tstamp); | 255 | rx_status->mactime = ath_extend_tsf(sc, ds->ds_rxstat.rs_tstamp); |
233 | rx_status->band = hw->conf.channel->band; | 256 | rx_status->band = hw->conf.channel->band; |
234 | rx_status->freq = hw->conf.channel->center_freq; | 257 | rx_status->freq = hw->conf.channel->center_freq; |
235 | rx_status->noise = sc->ani.noise_floor; | 258 | rx_status->noise = sc->ani.noise_floor; |
236 | rx_status->signal = rx_status->noise + ds->ds_rxstat.rs_rssi; | 259 | rx_status->signal = ATH_DEFAULT_NOISE_FLOOR + ds->ds_rxstat.rs_rssi; |
237 | rx_status->antenna = ds->ds_rxstat.rs_antenna; | 260 | rx_status->antenna = ds->ds_rxstat.rs_antenna; |
238 | 261 | ||
239 | /* | 262 | /* |