mac80211: backport RX timestamp flags patch
authorChristian Marangi <ansuelsmth@gmail.com>
Mon, 17 Jun 2024 16:56:53 +0000 (18:56 +0200)
committerChristian Marangi <ansuelsmth@gmail.com>
Tue, 18 Jun 2024 12:09:42 +0000 (14:09 +0200)
Backport RX timestamp flags patch needed for ath10k-ct to compile with
newer versions.

Link: https://github.com/openwrt/openwrt/pull/15735
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
package/kernel/mac80211/patches/subsys/100-v6.8-wifi-mac80211-rework-RX-timestamp-flags.patch [new file with mode: 0644]

diff --git a/package/kernel/mac80211/patches/subsys/100-v6.8-wifi-mac80211-rework-RX-timestamp-flags.patch b/package/kernel/mac80211/patches/subsys/100-v6.8-wifi-mac80211-rework-RX-timestamp-flags.patch
new file mode 100644 (file)
index 0000000..5f88d69
--- /dev/null
@@ -0,0 +1,161 @@
+From d5b6f6d595b446c1693fdaa6aeb4a65b94d5fc90 Mon Sep 17 00:00:00 2001
+From: Johannes Berg <johannes.berg@intel.com>
+Date: Wed, 20 Dec 2023 13:41:39 +0200
+Subject: [PATCH] wifi: mac80211: rework RX timestamp flags
+
+We only have a single flag free, and before using that for
+another mactime flag, instead refactor the mactime flags
+to use a 2-bit field.
+
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Reviewed-by: Gregory Greenman <gregory.greenman@intel.com>
+Reviewed-by: Benjamin Berg <benjamin.berg@intel.com>
+Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
+Link: https://msgid.link/20231220133549.d0e664832d14.I20c8900106f9bf81316bed778b1e3ce145785274@changeid
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+---
+ drivers/net/wireless/ath/ath10k/htt_rx.c |  2 +-
+ include/net/mac80211.h                   | 13 +++++++++----
+ net/mac80211/ieee80211_i.h               |  5 +----
+ net/mac80211/util.c                      | 16 ++++++++++------
+ 4 files changed, 21 insertions(+), 15 deletions(-)
+
+--- a/drivers/net/wireless/ath/ath10k/htt_rx.c
++++ b/drivers/net/wireless/ath/ath10k/htt_rx.c
+@@ -1294,7 +1294,7 @@ static void ath10k_htt_rx_h_ppdu(struct
+               status->encoding = RX_ENC_LEGACY;
+               status->bw = RATE_INFO_BW_20;
+-              status->flag &= ~RX_FLAG_MACTIME_END;
++              status->flag &= ~RX_FLAG_MACTIME;
+               status->flag |= RX_FLAG_NO_SIGNAL_VAL;
+               status->flag &= ~(RX_FLAG_AMPDU_IS_LAST);
+--- a/include/net/mac80211.h
++++ b/include/net/mac80211.h
+@@ -1352,6 +1352,9 @@ ieee80211_tx_info_clear_status(struct ie
+  *    the frame.
+  * @RX_FLAG_FAILED_PLCP_CRC: Set this flag if the PCLP check failed on
+  *    the frame.
++ * @RX_FLAG_MACTIME: The timestamp passed in the RX status (@mactime
++ *    field) is valid if this field is non-zero, and the position
++ *    where the timestamp was sampled depends on the value.
+  * @RX_FLAG_MACTIME_START: The timestamp passed in the RX status (@mactime
+  *    field) is valid and contains the time the first symbol of the MPDU
+  *    was received. This is useful in monitor mode and for proper IBSS
+@@ -1431,12 +1434,12 @@ ieee80211_tx_info_clear_status(struct ie
+ enum mac80211_rx_flags {
+       RX_FLAG_MMIC_ERROR              = BIT(0),
+       RX_FLAG_DECRYPTED               = BIT(1),
+-      RX_FLAG_MACTIME_PLCP_START      = BIT(2),
++      RX_FLAG_ONLY_MONITOR            = BIT(2),
+       RX_FLAG_MMIC_STRIPPED           = BIT(3),
+       RX_FLAG_IV_STRIPPED             = BIT(4),
+       RX_FLAG_FAILED_FCS_CRC          = BIT(5),
+       RX_FLAG_FAILED_PLCP_CRC         = BIT(6),
+-      RX_FLAG_MACTIME_START           = BIT(7),
++      /* one free bit at 7 */
+       RX_FLAG_NO_SIGNAL_VAL           = BIT(8),
+       RX_FLAG_AMPDU_DETAILS           = BIT(9),
+       RX_FLAG_PN_VALIDATED            = BIT(10),
+@@ -1445,8 +1448,10 @@ enum mac80211_rx_flags {
+       RX_FLAG_AMPDU_IS_LAST           = BIT(13),
+       RX_FLAG_AMPDU_DELIM_CRC_ERROR   = BIT(14),
+       RX_FLAG_AMPDU_DELIM_CRC_KNOWN   = BIT(15),
+-      RX_FLAG_MACTIME_END             = BIT(16),
+-      RX_FLAG_ONLY_MONITOR            = BIT(17),
++      RX_FLAG_MACTIME                 = BIT(16) | BIT(17),
++      RX_FLAG_MACTIME_PLCP_START      = 1 << 16,
++      RX_FLAG_MACTIME_START           = 2 << 16,
++      RX_FLAG_MACTIME_END             = 3 << 16,
+       RX_FLAG_SKIP_MONITOR            = BIT(18),
+       RX_FLAG_AMSDU_MORE              = BIT(19),
+       RX_FLAG_RADIOTAP_TLV_AT_END     = BIT(20),
+--- a/net/mac80211/ieee80211_i.h
++++ b/net/mac80211/ieee80211_i.h
+@@ -1807,10 +1807,7 @@ static inline bool txq_has_queue(struct
+ static inline bool
+ ieee80211_have_rx_timestamp(struct ieee80211_rx_status *status)
+ {
+-      WARN_ON_ONCE(status->flag & RX_FLAG_MACTIME_START &&
+-                   status->flag & RX_FLAG_MACTIME_END);
+-      return !!(status->flag & (RX_FLAG_MACTIME_START | RX_FLAG_MACTIME_END |
+-                                RX_FLAG_MACTIME_PLCP_START));
++      return status->flag & RX_FLAG_MACTIME;
+ }
+ void ieee80211_vif_inc_num_mcast(struct ieee80211_sub_if_data *sdata);
+--- a/net/mac80211/util.c
++++ b/net/mac80211/util.c
+@@ -4174,6 +4174,7 @@ u64 ieee80211_calculate_rx_timestamp(str
+                                    unsigned int mpdu_offset)
+ {
+       u64 ts = status->mactime;
++      bool mactime_plcp_start;
+       struct rate_info ri;
+       u16 rate;
+       u8 n_ltf;
+@@ -4181,6 +4182,9 @@ u64 ieee80211_calculate_rx_timestamp(str
+       if (WARN_ON(!ieee80211_have_rx_timestamp(status)))
+               return 0;
++      mactime_plcp_start = (status->flag & RX_FLAG_MACTIME) ==
++                              RX_FLAG_MACTIME_PLCP_START;
++
+       memset(&ri, 0, sizeof(ri));
+       ri.bw = status->bw;
+@@ -4195,7 +4199,7 @@ u64 ieee80211_calculate_rx_timestamp(str
+               if (status->enc_flags & RX_ENC_FLAG_SHORT_GI)
+                       ri.flags |= RATE_INFO_FLAGS_SHORT_GI;
+               /* TODO/FIXME: is this right? handle other PPDUs */
+-              if (status->flag & RX_FLAG_MACTIME_PLCP_START) {
++              if (mactime_plcp_start) {
+                       mpdu_offset += 2;
+                       ts += 36;
+               }
+@@ -4212,7 +4216,7 @@ u64 ieee80211_calculate_rx_timestamp(str
+                * See P802.11ax_D6.0, section 27.3.4 for
+                * VHT PPDU format.
+                */
+-              if (status->flag & RX_FLAG_MACTIME_PLCP_START) {
++              if (mactime_plcp_start) {
+                       mpdu_offset += 2;
+                       ts += 36;
+@@ -4236,7 +4240,7 @@ u64 ieee80211_calculate_rx_timestamp(str
+                * See P802.11REVmd_D3.0, section 19.3.2 for
+                * HT PPDU format.
+                */
+-              if (status->flag & RX_FLAG_MACTIME_PLCP_START) {
++              if (mactime_plcp_start) {
+                       mpdu_offset += 2;
+                       if (status->enc_flags & RX_ENC_FLAG_HT_GF)
+                               ts += 24;
+@@ -4264,7 +4268,7 @@ u64 ieee80211_calculate_rx_timestamp(str
+                * See P802.11REVmd_D3.0, section 21.3.2 for
+                * VHT PPDU format.
+                */
+-              if (status->flag & RX_FLAG_MACTIME_PLCP_START) {
++              if (mactime_plcp_start) {
+                       mpdu_offset += 2;
+                       ts += 36;
+@@ -4298,7 +4302,7 @@ u64 ieee80211_calculate_rx_timestamp(str
+               bitrate = sband->bitrates[status->rate_idx].bitrate;
+               ri.legacy = DIV_ROUND_UP(bitrate, (1 << shift));
+-              if (status->flag & RX_FLAG_MACTIME_PLCP_START) {
++              if (mactime_plcp_start) {
+                       if (status->band == NL80211_BAND_5GHZ) {
+                               ts += 20 << shift;
+                               mpdu_offset += 2;
+@@ -4320,7 +4324,7 @@ u64 ieee80211_calculate_rx_timestamp(str
+               return 0;
+       /* rewind from end of MPDU */
+-      if (status->flag & RX_FLAG_MACTIME_END)
++      if ((status->flag & RX_FLAG_MACTIME) == RX_FLAG_MACTIME_END)
+               ts -= mpdu_len * 8 * 10 / rate;
+       ts += mpdu_offset * 8 * 10 / rate;