mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-29 10:08:59 +00:00
162 lines
5.8 KiB
Diff
162 lines
5.8 KiB
Diff
|
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;
|