wifi: mac80211: rework RX timestamp flags
authorJohannes Berg <johannes.berg@intel.com>
Wed, 20 Dec 2023 11:41:39 +0000 (13:41 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 21 Dec 2023 19:35:15 +0000 (20:35 +0100)
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
include/net/mac80211.h
net/mac80211/ieee80211_i.h
net/mac80211/util.c

index fa0f598ed6bfef66d39ae720f8707d28b361e40f..7d28ae5453cf81abc77b2fb12c098f74bed568fd 100644 (file)
@@ -1295,7 +1295,7 @@ static void ath10k_htt_rx_h_ppdu(struct ath10k *ar,
                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);
index 6d2e94bc841ca57b36da1ec1d5011f1b3bb2fe92..941980c7aa214a601282a6203fce9f3f0b5bbcc3 100644 (file)
@@ -1355,6 +1355,9 @@ ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info)
  *     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
@@ -1434,12 +1437,12 @@ ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info)
 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),
@@ -1448,8 +1451,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),
index f45bec3f562ce4d0ba69a17bcb632ebc70621ef8..0ed82cc263f24ac8f9bb97978ed0cd0a0b2a1b8a 100644 (file)
@@ -1776,10 +1776,7 @@ static inline bool txq_has_queue(struct ieee80211_txq *txq)
 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);
index ed680120d5a7be39bdf1ca655c3c39da43b16c16..643c54855be6c38fe47bd7c1ff4bb6fc8e318c57 100644 (file)
@@ -4176,6 +4176,7 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
                                     unsigned int mpdu_offset)
 {
        u64 ts = status->mactime;
+       bool mactime_plcp_start;
        struct rate_info ri;
        u16 rate;
        u8 n_ltf;
@@ -4183,6 +4184,9 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
        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;
@@ -4197,7 +4201,7 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
                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;
                }
@@ -4214,7 +4218,7 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
                 * 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;
 
@@ -4238,7 +4242,7 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
                 * 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;
@@ -4266,7 +4270,7 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
                 * 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;
 
@@ -4288,7 +4292,7 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
                sband = local->hw.wiphy->bands[status->band];
                ri.legacy = sband->bitrates[status->rate_idx].bitrate;
 
-               if (status->flag & RX_FLAG_MACTIME_PLCP_START) {
+               if (mactime_plcp_start) {
                        if (status->band == NL80211_BAND_5GHZ) {
                                ts += 20;
                                mpdu_offset += 2;
@@ -4310,7 +4314,7 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
                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;