The reported RSSI values are relative to the calibrated noise floor, not
relative to a hardcoded value of -95.
Signed-off-by: Felix Fietkau <[email protected]>
---
drivers/net/wireless/ath/ath9k/recv.c | 11 ++++++++++-
1 files changed, 10 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
index a9c3f46..87d96c5 100644
--- a/drivers/net/wireless/ath/ath9k/recv.c
+++ b/drivers/net/wireless/ath/ath9k/recv.c
@@ -959,6 +959,9 @@ static int ath9k_rx_skb_preprocess(struct ath_common *common,
struct ieee80211_rx_status *rx_status,
bool *decrypt_error)
{
+ struct ath_hw *ah = common->ah;
+ int noise;
+
memset(rx_status, 0, sizeof(struct ieee80211_rx_status));
/*
@@ -979,7 +982,13 @@ static int ath9k_rx_skb_preprocess(struct ath_common *common,
rx_status->band = hw->conf.channel->band;
rx_status->freq = hw->conf.channel->center_freq;
- rx_status->signal = ATH_DEFAULT_NOISE_FLOOR + rx_stats->rs_rssi;
+
+ if (ah->curchan)
+ noise = ah->curchan->noisefloor;
+ else
+ noise = ATH_DEFAULT_NOISE_FLOOR;
+
+ rx_status->signal = noise + rx_stats->rs_rssi;
rx_status->antenna = rx_stats->rs_antenna;
rx_status->flag |= RX_FLAG_MACTIME_MPDU;
--
1.7.3.2
Since the beacon timers are global, the individual vif type should not
be used to determine the beacon timer configuration mode, use the
global opmode instead.
Signed-off-by: Felix Fietkau <[email protected]>
---
drivers/net/wireless/ath/ath9k/beacon.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/ath/ath9k/beacon.c b/drivers/net/wireless/ath/ath9k/beacon.c
index 24861b2..f688527 100644
--- a/drivers/net/wireless/ath/ath9k/beacon.c
+++ b/drivers/net/wireless/ath/ath9k/beacon.c
@@ -700,7 +700,7 @@ void ath_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif)
if (cur_conf->dtim_period == 0)
cur_conf->dtim_period = 1;
- switch (iftype) {
+ switch (sc->sc_ah->opmode) {
case NL80211_IFTYPE_AP:
ath_beacon_config_ap(sc, cur_conf);
break;
--
1.7.3.2
On Sat, Apr 02, 2011 at 03:39:46AM +0200, Felix Fietkau wrote:
> The reported RSSI values are relative to the calibrated noise floor, not
> relative to a hardcoded value of -95.
>
> Signed-off-by: Felix Fietkau <[email protected]>
> ---
> drivers/net/wireless/ath/ath9k/recv.c | 11 ++++++++++-
> 1 files changed, 10 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
> index a9c3f46..87d96c5 100644
> --- a/drivers/net/wireless/ath/ath9k/recv.c
> +++ b/drivers/net/wireless/ath/ath9k/recv.c
> @@ -959,6 +959,9 @@ static int ath9k_rx_skb_preprocess(struct ath_common *common,
> struct ieee80211_rx_status *rx_status,
> bool *decrypt_error)
> {
> + struct ath_hw *ah = common->ah;
> + int noise;
> +
> memset(rx_status, 0, sizeof(struct ieee80211_rx_status));
>
> /*
> @@ -979,7 +982,13 @@ static int ath9k_rx_skb_preprocess(struct ath_common *common,
>
> rx_status->band = hw->conf.channel->band;
> rx_status->freq = hw->conf.channel->center_freq;
> - rx_status->signal = ATH_DEFAULT_NOISE_FLOOR + rx_stats->rs_rssi;
In some cases noisefloor values were not reliable and so using
default works for most of the cases. Please refer to our earlier
commit a59b5a5e684652eec035c869ab8911a1689c8f53. Let me see if i
can get more information.
> +
> + if (ah->curchan)
> + noise = ah->curchan->noisefloor;
Even otherwise, noisefloor can be zero sometimes and so it can
return incorrect signal strengths.. Please refer to some samples.
BSS 00:10:18:90:3a:9e (on wlan56)
TSF: 110532917222 usec (1d, 06:42:12)
freq: 2462
beacon interval: 100
capability: ESS (0x0001)
signal: 50.00 dBm
last seen: 20 ms ago
SSID: Broadcom
Supported rates: 1.0* 2.0* 5.5* 11.0* 18.0 24.0 36.0 54.0
DS Parameter set: channel 11
ERP: NonERP_Present Use_Protection Barker_Preamble_Mode
Extended supported rates: 6.0 9.0 12.0 48.0
HT capabilities:
SS 00:03:7f:0b:a6:1b (on wlan56)
TSF: 4376472960 usec (0d, 01:12:56)
freq: 2462
beacon interval: 100
capability: ESS Privacy ShortPreamble (0x0031)
signal: 60.00 dBm
last seen: 8 ms ago
SSID: STRESS-HB125
> + else
> + noise = ATH_DEFAULT_NOISE_FLOOR;
> +
> + rx_status->signal = noise + rx_stats->rs_rssi;
> rx_status->antenna = rx_stats->rs_antenna;
> rx_status->flag |= RX_FLAG_MACTIME_MPDU;
>
> --
> 1.7.3.2
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
On 2011-04-05 8:07 PM, Senthil Balasubramanian wrote:
> On Sat, Apr 02, 2011 at 03:39:46AM +0200, Felix Fietkau wrote:
>> The reported RSSI values are relative to the calibrated noise floor, not
>> relative to a hardcoded value of -95.
>>
>> Signed-off-by: Felix Fietkau<[email protected]>
>> ---
>> drivers/net/wireless/ath/ath9k/recv.c | 11 ++++++++++-
>> 1 files changed, 10 insertions(+), 1 deletions(-)
>>
>> diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
>> index a9c3f46..87d96c5 100644
>> --- a/drivers/net/wireless/ath/ath9k/recv.c
>> +++ b/drivers/net/wireless/ath/ath9k/recv.c
>> @@ -959,6 +959,9 @@ static int ath9k_rx_skb_preprocess(struct ath_common *common,
>> struct ieee80211_rx_status *rx_status,
>> bool *decrypt_error)
>> {
>> + struct ath_hw *ah = common->ah;
>> + int noise;
>> +
>> memset(rx_status, 0, sizeof(struct ieee80211_rx_status));
>>
>> /*
>> @@ -979,7 +982,13 @@ static int ath9k_rx_skb_preprocess(struct ath_common *common,
>>
>> rx_status->band = hw->conf.channel->band;
>> rx_status->freq = hw->conf.channel->center_freq;
>> - rx_status->signal = ATH_DEFAULT_NOISE_FLOOR + rx_stats->rs_rssi;
> In some cases noisefloor values were not reliable and so using
> default works for most of the cases. Please refer to our earlier
> commit a59b5a5e684652eec035c869ab8911a1689c8f53. Let me see if i
> can get more information.
Well, if the average noise floor is at -110 (which is not uncommon with
AR9280 chipsets) then that means the signal strength is off by at least
15 dBm as well.
>> +
>> + if (ah->curchan)
>> + noise = ah->curchan->noisefloor;
> Even otherwise, noisefloor can be zero sometimes and so it can
> return incorrect signal strengths.. Please refer to some samples.
OK, that's easy to fix, we only need to initialize the channel
noisefloor when we switch to the channel. I'll make a patch to fix it
the noisefloor values and then resend this one.
John, please drop this patch but apply the other two in the series.
- Felix
The recent cleanups in the beacon code fixed SWBA backoff calculation,
however it did not remove a line of code that worked around the issues
from the earlier version of the code.
After the cleanup, the initial TSF based slot calculation now always
returns 0 instead of ATH_BCBUF-1, so the previous hack that reversed the
slot order needs to be removed, as ad-hoc mode does not use staggered
beacons.
Signed-off-by: Felix Fietkau <[email protected]>
---
drivers/net/wireless/ath/ath9k/beacon.c | 8 --------
1 files changed, 0 insertions(+), 8 deletions(-)
diff --git a/drivers/net/wireless/ath/ath9k/beacon.c b/drivers/net/wireless/ath/ath9k/beacon.c
index 74f33bc..24861b2 100644
--- a/drivers/net/wireless/ath/ath9k/beacon.c
+++ b/drivers/net/wireless/ath/ath9k/beacon.c
@@ -392,14 +392,6 @@ void ath_beacon_tasklet(unsigned long data)
tsf += TU_TO_USEC(ah->config.sw_beacon_response_time);
tsftu = TSF_TO_TU((tsf * ATH_BCBUF) >>32, tsf * ATH_BCBUF);
slot = (tsftu % (intval * ATH_BCBUF)) / intval;
- /*
- * Reverse the slot order to get slot 0 on the TBTT offset that does
- * not require TSF adjustment and other slots adding
- * slot/ATH_BCBUF * beacon_int to timestamp. For example, with
- * ATH_BCBUF = 4, we process beacon slots as follows: 3 2 1 0 3 2 1 ..
- * and slot 0 is at correct offset to TBTT.
- */
- slot = ATH_BCBUF - slot - 1;
vif = sc->beacon.bslot[slot];
ath_dbg(common, ATH_DBG_BEACON,
--
1.7.3.2