| From: Felix Fietkau <nbd@nbd.name> |
| Date: Fri, 15 Jan 2021 12:15:06 +0100 |
| Subject: [PATCH] mac80211: minstrel_ht: fix rounding error in throughput |
| calculation |
| |
| On lower data rates, the throughput calculation has a significant rounding |
| error, causing rates like 48M and 54M OFDM to share the same throughput |
| value with >= 90% success probablity. |
| |
| This is because the result of the division (prob_avg * 1000) / nsecs |
| is really small (8 in this example). |
| |
| Improve accuracy by moving over some zeroes, making better use of the full |
| range of u32 before the division. |
| |
| Signed-off-by: Felix Fietkau <nbd@nbd.name> |
| --- |
| |
| --- a/net/mac80211/rc80211_minstrel_ht.c |
| +++ b/net/mac80211/rc80211_minstrel_ht.c |
| @@ -445,10 +445,9 @@ minstrel_ht_get_tp_avg(struct minstrel_h |
| * (prob is scaled - see MINSTREL_FRAC above) |
| */ |
| if (prob_avg > MINSTREL_FRAC(90, 100)) |
| - return MINSTREL_TRUNC(100000 * ((MINSTREL_FRAC(90, 100) * 1000) |
| - / nsecs)); |
| - else |
| - return MINSTREL_TRUNC(100000 * ((prob_avg * 1000) / nsecs)); |
| + prob_avg = MINSTREL_FRAC(90, 100); |
| + |
| + return MINSTREL_TRUNC(100 * ((prob_avg * 1000000) / nsecs)); |
| } |
| |
| /* |