]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ath10k: fix reported HT MCS rates with NSS > 1
authorSven Eckelmann <sven.eckelmann@openmesh.com>
Fri, 19 May 2017 08:54:02 +0000 (11:54 +0300)
committerKalle Valo <kvalo@qca.qualcomm.com>
Tue, 23 May 2017 15:28:19 +0000 (18:28 +0300)
The QCA4019 firmware 10.4-3.2.1-00050 reports only HT MCS rates between
0-9. But 802.11n MCS rates can be larger than that. For example a 2x2
device can send with up to MCS 15.

The firmware encodes the higher MCS rates using the NSS field. The actual
calculation is not documented by QCA but it seems like the NSS field can be
mapped for HT rates to following MCS offsets:

 * NSS 1: 0
 * NSS 2: 8
 * NSS 3: 16
 * NSS 4: 24

This offset therefore has to be added for HT rates before they are stored
in the rate_info struct.

Fixes: cec17c382140 ("ath10k: add per peer htt tx stats support for 10.4")
Signed-off-by: Sven Eckelmann <sven.eckelmann@openmesh.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath10k/htt_rx.c

index 84b6067ff6e774604722224752eb0c35dbcead21..6c0a821fe79dc3569c7559143f5e8cfcb0531eeb 100644 (file)
@@ -2229,9 +2229,15 @@ ath10k_update_per_peer_tx_stats(struct ath10k *ar,
        txrate.mcs = ATH10K_HW_MCS_RATE(peer_stats->ratecode);
        sgi = ATH10K_HW_GI(peer_stats->flags);
 
-       if (((txrate.flags == WMI_RATE_PREAMBLE_HT) ||
-            (txrate.flags == WMI_RATE_PREAMBLE_VHT)) && txrate.mcs > 9) {
-               ath10k_warn(ar, "Invalid mcs %hhd peer stats", txrate.mcs);
+       if (txrate.flags == WMI_RATE_PREAMBLE_VHT && txrate.mcs > 9) {
+               ath10k_warn(ar, "Invalid VHT mcs %hhd peer stats",  txrate.mcs);
+               return;
+       }
+
+       if (txrate.flags == WMI_RATE_PREAMBLE_HT &&
+           (txrate.mcs > 7 || txrate.nss < 1)) {
+               ath10k_warn(ar, "Invalid HT mcs %hhd nss %hhd peer stats",
+                           txrate.mcs, txrate.nss);
                return;
        }
 
@@ -2254,7 +2260,7 @@ ath10k_update_per_peer_tx_stats(struct ath10k *ar,
                arsta->txrate.legacy = rate;
        } else if (txrate.flags == WMI_RATE_PREAMBLE_HT) {
                arsta->txrate.flags = RATE_INFO_FLAGS_MCS;
-               arsta->txrate.mcs = txrate.mcs;
+               arsta->txrate.mcs = txrate.mcs + 8 * (txrate.nss - 1);
        } else {
                arsta->txrate.flags = RATE_INFO_FLAGS_VHT_MCS;
                arsta->txrate.mcs = txrate.mcs;