From 0134270319b4fa130f35eb012a736ec1d94b3f16 Mon Sep 17 00:00:00 2001 From: Christian Marangi Date: Mon, 17 Jun 2024 18:56:53 +0200 Subject: [PATCH] mac80211: backport RX timestamp flags patch 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 --- ...i-mac80211-rework-RX-timestamp-flags.patch | 161 ++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 package/kernel/mac80211/patches/subsys/100-v6.8-wifi-mac80211-rework-RX-timestamp-flags.patch 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 index 0000000000..5f88d697c3 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/100-v6.8-wifi-mac80211-rework-RX-timestamp-flags.patch @@ -0,0 +1,161 @@ +From d5b6f6d595b446c1693fdaa6aeb4a65b94d5fc90 Mon Sep 17 00:00:00 2001 +From: Johannes Berg +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 +Reviewed-by: Gregory Greenman +Reviewed-by: Benjamin Berg +Signed-off-by: Miri Korenblit +Link: https://msgid.link/20231220133549.d0e664832d14.I20c8900106f9bf81316bed778b1e3ce145785274@changeid +Signed-off-by: Johannes Berg +--- + 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;