Bump version to v1.5 and start work on adding 4.19 kernel suppot
[librecmc/librecmc.git] / package / kernel / mac80211 / patches / 020-15-rt2800-status-based-rate-flags-for-nomatch-case.patch
1 From 9d7a7a4d2b02bcd30fb5fe4270278212353cc332 Mon Sep 17 00:00:00 2001
2 From: Stanislaw Gruszka <sgruszka@redhat.com>
3 Date: Wed, 15 Feb 2017 10:25:11 +0100
4 Subject: [PATCH 15/19] rt2800: status based rate flags for nomatch case
5
6 We use skb_desc->tx_rate_flags from entry as rate[].flags even if
7 skb does not match status. Patch corrects flags and also fixes
8 mcs for legacy rates.
9
10 rt2800_rate_from_status() is based on Felix's mt76
11 mt76x2_mac_process_tx_rate() function.
12
13 Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
14 Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
15 ---
16  drivers/net/wireless/ralink/rt2x00/rt2800.h    |  2 ++
17  drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 35 +++++++++++++++++++++++++-
18  2 files changed, 36 insertions(+), 1 deletion(-)
19
20 diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h b/drivers/net/wireless/ralink/rt2x00/rt2800.h
21 index 0e7051d8132f..480b08601785 100644
22 --- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
23 +++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
24 @@ -1760,6 +1760,8 @@
25  #define TX_STA_FIFO_WCID               FIELD32(0x0000ff00)
26  #define TX_STA_FIFO_SUCCESS_RATE       FIELD32(0xffff0000)
27  #define TX_STA_FIFO_MCS                        FIELD32(0x007f0000)
28 +#define TX_STA_FIFO_BW                 FIELD32(0x00800000)
29 +#define TX_STA_FIFO_SGI                        FIELD32(0x01000000)
30  #define TX_STA_FIFO_PHYMODE            FIELD32(0xc0000000)
31  
32  /*
33 diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
34 index 4a7bec708a13..8d00c599e47a 100644
35 --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
36 +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
37 @@ -852,6 +852,39 @@ void rt2800_process_rxwi(struct queue_entry *entry,
38  }
39  EXPORT_SYMBOL_GPL(rt2800_process_rxwi);
40  
41 +static void rt2800_rate_from_status(struct skb_frame_desc *skbdesc,
42 +                                   u32 status, enum nl80211_band band)
43 +{
44 +       u8 flags = 0;
45 +       u8 idx = rt2x00_get_field32(status, TX_STA_FIFO_MCS);
46 +
47 +       switch (rt2x00_get_field32(status, TX_STA_FIFO_PHYMODE)) {
48 +       case RATE_MODE_HT_GREENFIELD:
49 +               flags |= IEEE80211_TX_RC_GREEN_FIELD;
50 +               /* fall through */
51 +       case RATE_MODE_HT_MIX:
52 +               flags |= IEEE80211_TX_RC_MCS;
53 +               break;
54 +       case RATE_MODE_OFDM:
55 +               if (band == NL80211_BAND_2GHZ)
56 +                       idx += 4;
57 +               break;
58 +       case RATE_MODE_CCK:
59 +               if (idx >= 8)
60 +                       idx -= 8;
61 +               break;
62 +       }
63 +
64 +       if (rt2x00_get_field32(status, TX_STA_FIFO_BW))
65 +               flags |= IEEE80211_TX_RC_40_MHZ_WIDTH;
66 +
67 +       if (rt2x00_get_field32(status, TX_STA_FIFO_SGI))
68 +               flags |= IEEE80211_TX_RC_SHORT_GI;
69 +
70 +       skbdesc->tx_rate_idx = idx;
71 +       skbdesc->tx_rate_flags = flags;
72 +}
73 +
74  void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi,
75                          bool match)
76  {
77 @@ -898,7 +931,7 @@ void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi,
78          * and provide retry count.
79          */
80         if (unlikely((aggr == 1 && ampdu == 0 && real_mcs != mcs)) || !match) {
81 -               skbdesc->tx_rate_idx = real_mcs;
82 +               rt2800_rate_from_status(skbdesc, status, rt2x00dev->curr_band);
83                 mcs = real_mcs;
84         }
85  
86 -- 
87 2.12.1
88