399d5cf532
Some of our local patches have been accepted upstream. And there are some more relevant changes (mostly for rt2800usb). Import them and rebase our remaining local patches on top. Signed-off-by: Daniel Golle <daniel@makrotopia.org>
88 lines
2.9 KiB
Diff
88 lines
2.9 KiB
Diff
From 9d7a7a4d2b02bcd30fb5fe4270278212353cc332 Mon Sep 17 00:00:00 2001
|
|
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
|
Date: Wed, 15 Feb 2017 10:25:11 +0100
|
|
Subject: [PATCH 15/19] rt2800: status based rate flags for nomatch case
|
|
|
|
We use skb_desc->tx_rate_flags from entry as rate[].flags even if
|
|
skb does not match status. Patch corrects flags and also fixes
|
|
mcs for legacy rates.
|
|
|
|
rt2800_rate_from_status() is based on Felix's mt76
|
|
mt76x2_mac_process_tx_rate() function.
|
|
|
|
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
|
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
|
---
|
|
drivers/net/wireless/ralink/rt2x00/rt2800.h | 2 ++
|
|
drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 35 +++++++++++++++++++++++++-
|
|
2 files changed, 36 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h b/drivers/net/wireless/ralink/rt2x00/rt2800.h
|
|
index 0e7051d8132f..480b08601785 100644
|
|
--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
|
|
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
|
|
@@ -1760,6 +1760,8 @@
|
|
#define TX_STA_FIFO_WCID FIELD32(0x0000ff00)
|
|
#define TX_STA_FIFO_SUCCESS_RATE FIELD32(0xffff0000)
|
|
#define TX_STA_FIFO_MCS FIELD32(0x007f0000)
|
|
+#define TX_STA_FIFO_BW FIELD32(0x00800000)
|
|
+#define TX_STA_FIFO_SGI FIELD32(0x01000000)
|
|
#define TX_STA_FIFO_PHYMODE FIELD32(0xc0000000)
|
|
|
|
/*
|
|
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
|
index 4a7bec708a13..8d00c599e47a 100644
|
|
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
|
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
|
@@ -852,6 +852,39 @@ void rt2800_process_rxwi(struct queue_entry *entry,
|
|
}
|
|
EXPORT_SYMBOL_GPL(rt2800_process_rxwi);
|
|
|
|
+static void rt2800_rate_from_status(struct skb_frame_desc *skbdesc,
|
|
+ u32 status, enum nl80211_band band)
|
|
+{
|
|
+ u8 flags = 0;
|
|
+ u8 idx = rt2x00_get_field32(status, TX_STA_FIFO_MCS);
|
|
+
|
|
+ switch (rt2x00_get_field32(status, TX_STA_FIFO_PHYMODE)) {
|
|
+ case RATE_MODE_HT_GREENFIELD:
|
|
+ flags |= IEEE80211_TX_RC_GREEN_FIELD;
|
|
+ /* fall through */
|
|
+ case RATE_MODE_HT_MIX:
|
|
+ flags |= IEEE80211_TX_RC_MCS;
|
|
+ break;
|
|
+ case RATE_MODE_OFDM:
|
|
+ if (band == NL80211_BAND_2GHZ)
|
|
+ idx += 4;
|
|
+ break;
|
|
+ case RATE_MODE_CCK:
|
|
+ if (idx >= 8)
|
|
+ idx -= 8;
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ if (rt2x00_get_field32(status, TX_STA_FIFO_BW))
|
|
+ flags |= IEEE80211_TX_RC_40_MHZ_WIDTH;
|
|
+
|
|
+ if (rt2x00_get_field32(status, TX_STA_FIFO_SGI))
|
|
+ flags |= IEEE80211_TX_RC_SHORT_GI;
|
|
+
|
|
+ skbdesc->tx_rate_idx = idx;
|
|
+ skbdesc->tx_rate_flags = flags;
|
|
+}
|
|
+
|
|
void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi,
|
|
bool match)
|
|
{
|
|
@@ -898,7 +931,7 @@ void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi,
|
|
* and provide retry count.
|
|
*/
|
|
if (unlikely((aggr == 1 && ampdu == 0 && real_mcs != mcs)) || !match) {
|
|
- skbdesc->tx_rate_idx = real_mcs;
|
|
+ rt2800_rate_from_status(skbdesc, status, rt2x00dev->curr_band);
|
|
mcs = real_mcs;
|
|
}
|
|
|
|
--
|
|
2.12.1
|
|
|