From: Felix Fietkau Date: Sun, 11 Apr 2021 17:41:56 +0000 (+0200) Subject: mac80211: support rx timestamps for HE rates X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=7d8e14e44f76e18d1696565569ec50ccdce963b3;p=openwrt%2Fstaging%2Fblocktrron.git mac80211: support rx timestamps for HE rates Signed-off-by: Felix Fietkau --- diff --git a/package/kernel/mac80211/patches/subsys/373-mac80211-support-Rx-timestamp-calculation-for-all-pr.patch b/package/kernel/mac80211/patches/subsys/373-mac80211-support-Rx-timestamp-calculation-for-all-pr.patch new file mode 100644 index 0000000000..c432d77b2e --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/373-mac80211-support-Rx-timestamp-calculation-for-all-pr.patch @@ -0,0 +1,134 @@ +From: Avraham Stern +Date: Sun, 6 Dec 2020 14:54:45 +0200 +Subject: [PATCH] mac80211: support Rx timestamp calculation for all preamble + types + +Add support for calculating the Rx timestamp for HE frames. +Since now all frame types are supported, allow setting the Rx +timestamp regardless of the frame type. + +Signed-off-by: Avraham Stern +Signed-off-by: Luca Coelho +Link: https://lore.kernel.org/r/iwlwifi.20201206145305.4786559af475.Ia54486bb0a12e5351f9d5c60ef6fcda7c9e7141c@changeid +Signed-off-by: Johannes Berg +--- + +--- a/net/mac80211/ieee80211_i.h ++++ b/net/mac80211/ieee80211_i.h +@@ -1600,13 +1600,8 @@ ieee80211_have_rx_timestamp(struct ieee8 + { + WARN_ON_ONCE(status->flag & RX_FLAG_MACTIME_START && + status->flag & RX_FLAG_MACTIME_END); +- if (status->flag & (RX_FLAG_MACTIME_START | RX_FLAG_MACTIME_END)) +- return true; +- /* can't handle non-legacy preamble yet */ +- if (status->flag & RX_FLAG_MACTIME_PLCP_START && +- status->encoding == RX_ENC_LEGACY) +- return true; +- return false; ++ return !!(status->flag & (RX_FLAG_MACTIME_START | RX_FLAG_MACTIME_END | ++ RX_FLAG_MACTIME_PLCP_START)); + } + + void ieee80211_vif_inc_num_mcast(struct ieee80211_sub_if_data *sdata); +--- a/net/mac80211/util.c ++++ b/net/mac80211/util.c +@@ -3665,6 +3665,7 @@ u64 ieee80211_calculate_rx_timestamp(str + u64 ts = status->mactime; + struct rate_info ri; + u16 rate; ++ u8 n_ltf; + + if (WARN_ON(!ieee80211_have_rx_timestamp(status))) + return 0; +@@ -3675,11 +3676,58 @@ u64 ieee80211_calculate_rx_timestamp(str + + /* Fill cfg80211 rate info */ + switch (status->encoding) { ++ case RX_ENC_HE: ++ ri.flags |= RATE_INFO_FLAGS_HE_MCS; ++ ri.mcs = status->rate_idx; ++ ri.nss = status->nss; ++ ri.he_ru_alloc = status->he_ru; ++ if (status->enc_flags & RX_ENC_FLAG_SHORT_GI) ++ ri.flags |= RATE_INFO_FLAGS_SHORT_GI; ++ ++ /* ++ * See P802.11ax_D6.0, section 27.3.4 for ++ * VHT PPDU format. ++ */ ++ if (status->flag & RX_FLAG_MACTIME_PLCP_START) { ++ mpdu_offset += 2; ++ ts += 36; ++ ++ /* ++ * TODO: ++ * For HE MU PPDU, add the HE-SIG-B. ++ * For HE ER PPDU, add 8us for the HE-SIG-A. ++ * For HE TB PPDU, add 4us for the HE-STF. ++ * Add the HE-LTF durations - variable. ++ */ ++ } ++ ++ break; + case RX_ENC_HT: + ri.mcs = status->rate_idx; + ri.flags |= RATE_INFO_FLAGS_MCS; + if (status->enc_flags & RX_ENC_FLAG_SHORT_GI) + ri.flags |= RATE_INFO_FLAGS_SHORT_GI; ++ ++ /* ++ * See P802.11REVmd_D3.0, section 19.3.2 for ++ * HT PPDU format. ++ */ ++ if (status->flag & RX_FLAG_MACTIME_PLCP_START) { ++ mpdu_offset += 2; ++ if (status->enc_flags & RX_ENC_FLAG_HT_GF) ++ ts += 24; ++ else ++ ts += 32; ++ ++ /* ++ * Add Data HT-LTFs per streams ++ * TODO: add Extension HT-LTFs, 4us per LTF ++ */ ++ n_ltf = ((ri.mcs >> 3) & 3) + 1; ++ n_ltf = n_ltf == 3 ? 4 : n_ltf; ++ ts += n_ltf * 4; ++ } ++ + break; + case RX_ENC_VHT: + ri.flags |= RATE_INFO_FLAGS_VHT_MCS; +@@ -3687,6 +3735,23 @@ u64 ieee80211_calculate_rx_timestamp(str + ri.nss = status->nss; + if (status->enc_flags & RX_ENC_FLAG_SHORT_GI) + ri.flags |= RATE_INFO_FLAGS_SHORT_GI; ++ ++ /* ++ * See P802.11REVmd_D3.0, section 21.3.2 for ++ * VHT PPDU format. ++ */ ++ if (status->flag & RX_FLAG_MACTIME_PLCP_START) { ++ mpdu_offset += 2; ++ ts += 36; ++ ++ /* ++ * Add VHT-LTFs per streams ++ */ ++ n_ltf = (ri.nss != 1) && (ri.nss % 2) ? ++ ri.nss + 1 : ri.nss; ++ ts += 4 * n_ltf; ++ } ++ + break; + default: + WARN_ON(1); +@@ -3710,7 +3775,6 @@ u64 ieee80211_calculate_rx_timestamp(str + ri.legacy = DIV_ROUND_UP(bitrate, (1 << shift)); + + if (status->flag & RX_FLAG_MACTIME_PLCP_START) { +- /* TODO: handle HT/VHT preambles */ + if (status->band == NL80211_BAND_5GHZ) { + ts += 20 << shift; + mpdu_offset += 2;