Discussion:
[ath9k-devel] [PATCH] ath9k_htc: partial revert of e5ba18c6901631237c49ec54ce54397369dea7fa
Robert Millan
2016-10-25 10:28:16 UTC
Permalink
A regression introduced by e5ba18c6901631237c49ec54ce54397369dea7fa
caused loss of signal power information when using Atheros AR9271
chips in monitor mode.

Fix this by a partial revert of the aforementioned commit until root
cause is found.

Signed-off-by: Robert Millan <***@beabloo.com>
---
drivers/net/wireless/ath/ath9k/htc.h | 1 +
drivers/net/wireless/ath/ath9k/htc_drv_init.c | 1 -
drivers/net/wireless/ath/ath9k/htc_drv_main.c | 1 -
drivers/net/wireless/ath/ath9k/htc_drv_txrx.c | 21 +++++++++++++++++++--
4 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/drivers/net/wireless/ath/ath9k/htc.h b/drivers/net/wireless/ath/ath9k/htc.h
index 16dff4b..c4a9fca 100644
--- a/drivers/net/wireless/ath/ath9k/htc.h
+++ b/drivers/net/wireless/ath/ath9k/htc.h
@@ -279,6 +279,7 @@ struct ath9k_htc_rxbuf {
};

struct ath9k_htc_rx {
+ int last_rssi; /* FIXME: per-STA */
struct list_head rxbuf;
spinlock_t rxbuflock;
};
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_init.c b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
index b65c1b6..1052eb6 100644
--- a/drivers/net/wireless/ath/ath9k/htc_drv_init.c
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
@@ -593,7 +593,6 @@ static void ath9k_init_misc(struct ath9k_htc_priv *priv)

memcpy(common->bssidmask, ath_bcast_mac, ETH_ALEN);

- common->last_rssi = ATH_RSSI_DUMMY_MARKER;
priv->ah->opmode = NL80211_IFTYPE_STATION;

priv->spec_priv.ah = priv->ah;
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
index a553c91..ff22882 100644
--- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
@@ -1489,7 +1489,6 @@ static void ath9k_htc_bss_iter(void *data, u8 *mac, struct ieee80211_vif *vif)

if ((vif->type == NL80211_IFTYPE_STATION) && bss_conf->assoc) {
common->curaid = bss_conf->aid;
- common->last_rssi = ATH_RSSI_DUMMY_MARKER;
memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN);
set_bit(ATH_OP_PRIM_STA_VIF, &common->op_flags);
}
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
index cea7a63..3c4f9df 100644
--- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
@@ -924,6 +924,7 @@ void ath9k_host_rx_init(struct ath9k_htc_priv *priv)
ath9k_hw_rxena(priv->ah);
ath9k_htc_opmode_init(priv);
ath9k_hw_startpcureceive(priv->ah, test_bit(ATH_OP_SCANNING, &common->op_flags));
+ priv->rx.last_rssi = ATH_RSSI_DUMMY_MARKER;
}

static inline void convert_htc_flag(struct ath_rx_status *rx_stats,
@@ -972,6 +973,7 @@ static bool ath9k_rx_prepare(struct ath9k_htc_priv *priv,
struct ath_htc_rx_status *rxstatus;
struct ath_rx_status rx_stats;
bool decrypt_error = false;
+ int last_rssi = ATH_RSSI_DUMMY_MARKER;

if (skb->len < HTC_RX_FRAME_HEADER_SIZE) {
ath_err(common, "Corrupted RX frame, dropping (len: %d)\n",
@@ -1029,8 +1031,23 @@ static bool ath9k_rx_prepare(struct ath9k_htc_priv *priv,
if (ath9k_cmn_process_rate(common, hw, &rx_stats, rx_status))
goto rx_next;

- rx_stats.is_mybeacon = ath_is_mybeacon(common, hdr);
- ath9k_cmn_process_rssi(common, hw, &rx_stats, rx_status);
+ if (rxbuf->rxstatus.rs_rssi != ATH9K_RSSI_BAD &&
+ !rxbuf->rxstatus.rs_moreaggr)
+ ATH_RSSI_LPF(priv->rx.last_rssi,
+ rxbuf->rxstatus.rs_rssi);
+ last_rssi = priv->rx.last_rssi;
+
+ if (ath_is_mybeacon(common, hdr)) {
+ s8 rssi = rxbuf->rxstatus.rs_rssi;
+
+ if (likely(last_rssi != ATH_RSSI_DUMMY_MARKER))
+ rssi = ATH_EP_RND(last_rssi, ATH_RSSI_EP_MULTIPLIER);
+
+ if (rssi < 0)
+ rssi = 0;
+
+ priv->ah->stats.avgbrssi = rssi;
+ }

rx_status->band = ah->curchan->chan->band;
rx_status->freq = ah->curchan->chan->center_freq;
--
1.9.1
Loading...