Commit d5b6f6d5 authored by Johannes Berg's avatar Johannes Berg

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: default avatarJohannes Berg <johannes.berg@intel.com>
Reviewed-by: default avatarGregory Greenman <gregory.greenman@intel.com>
Reviewed-by: default avatarBenjamin Berg <benjamin.berg@intel.com>
Signed-off-by: default avatarMiri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://msgid.link/20231220133549.d0e664832d14.I20c8900106f9bf81316bed778b1e3ce145785274@changeidSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 645f3d85
...@@ -1295,7 +1295,7 @@ static void ath10k_htt_rx_h_ppdu(struct ath10k *ar, ...@@ -1295,7 +1295,7 @@ static void ath10k_htt_rx_h_ppdu(struct ath10k *ar,
status->encoding = RX_ENC_LEGACY; status->encoding = RX_ENC_LEGACY;
status->bw = RATE_INFO_BW_20; 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_NO_SIGNAL_VAL;
status->flag &= ~(RX_FLAG_AMPDU_IS_LAST); status->flag &= ~(RX_FLAG_AMPDU_IS_LAST);
......
...@@ -1355,6 +1355,9 @@ ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info) ...@@ -1355,6 +1355,9 @@ ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info)
* the frame. * the frame.
* @RX_FLAG_FAILED_PLCP_CRC: Set this flag if the PCLP check failed on * @RX_FLAG_FAILED_PLCP_CRC: Set this flag if the PCLP check failed on
* the frame. * 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 * @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 * 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 * 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) ...@@ -1434,12 +1437,12 @@ ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info)
enum mac80211_rx_flags { enum mac80211_rx_flags {
RX_FLAG_MMIC_ERROR = BIT(0), RX_FLAG_MMIC_ERROR = BIT(0),
RX_FLAG_DECRYPTED = BIT(1), 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_MMIC_STRIPPED = BIT(3),
RX_FLAG_IV_STRIPPED = BIT(4), RX_FLAG_IV_STRIPPED = BIT(4),
RX_FLAG_FAILED_FCS_CRC = BIT(5), RX_FLAG_FAILED_FCS_CRC = BIT(5),
RX_FLAG_FAILED_PLCP_CRC = BIT(6), 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_NO_SIGNAL_VAL = BIT(8),
RX_FLAG_AMPDU_DETAILS = BIT(9), RX_FLAG_AMPDU_DETAILS = BIT(9),
RX_FLAG_PN_VALIDATED = BIT(10), RX_FLAG_PN_VALIDATED = BIT(10),
...@@ -1448,8 +1451,10 @@ enum mac80211_rx_flags { ...@@ -1448,8 +1451,10 @@ enum mac80211_rx_flags {
RX_FLAG_AMPDU_IS_LAST = BIT(13), RX_FLAG_AMPDU_IS_LAST = BIT(13),
RX_FLAG_AMPDU_DELIM_CRC_ERROR = BIT(14), RX_FLAG_AMPDU_DELIM_CRC_ERROR = BIT(14),
RX_FLAG_AMPDU_DELIM_CRC_KNOWN = BIT(15), RX_FLAG_AMPDU_DELIM_CRC_KNOWN = BIT(15),
RX_FLAG_MACTIME_END = BIT(16), RX_FLAG_MACTIME = BIT(16) | BIT(17),
RX_FLAG_ONLY_MONITOR = 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_SKIP_MONITOR = BIT(18),
RX_FLAG_AMSDU_MORE = BIT(19), RX_FLAG_AMSDU_MORE = BIT(19),
RX_FLAG_RADIOTAP_TLV_AT_END = BIT(20), RX_FLAG_RADIOTAP_TLV_AT_END = BIT(20),
......
...@@ -1776,10 +1776,7 @@ static inline bool txq_has_queue(struct ieee80211_txq *txq) ...@@ -1776,10 +1776,7 @@ static inline bool txq_has_queue(struct ieee80211_txq *txq)
static inline bool static inline bool
ieee80211_have_rx_timestamp(struct ieee80211_rx_status *status) ieee80211_have_rx_timestamp(struct ieee80211_rx_status *status)
{ {
WARN_ON_ONCE(status->flag & RX_FLAG_MACTIME_START && return status->flag & RX_FLAG_MACTIME;
status->flag & RX_FLAG_MACTIME_END);
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); void ieee80211_vif_inc_num_mcast(struct ieee80211_sub_if_data *sdata);
......
...@@ -4176,6 +4176,7 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local, ...@@ -4176,6 +4176,7 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
unsigned int mpdu_offset) unsigned int mpdu_offset)
{ {
u64 ts = status->mactime; u64 ts = status->mactime;
bool mactime_plcp_start;
struct rate_info ri; struct rate_info ri;
u16 rate; u16 rate;
u8 n_ltf; u8 n_ltf;
...@@ -4183,6 +4184,9 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local, ...@@ -4183,6 +4184,9 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
if (WARN_ON(!ieee80211_have_rx_timestamp(status))) if (WARN_ON(!ieee80211_have_rx_timestamp(status)))
return 0; return 0;
mactime_plcp_start = (status->flag & RX_FLAG_MACTIME) ==
RX_FLAG_MACTIME_PLCP_START;
memset(&ri, 0, sizeof(ri)); memset(&ri, 0, sizeof(ri));
ri.bw = status->bw; ri.bw = status->bw;
...@@ -4197,7 +4201,7 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local, ...@@ -4197,7 +4201,7 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
if (status->enc_flags & RX_ENC_FLAG_SHORT_GI) if (status->enc_flags & RX_ENC_FLAG_SHORT_GI)
ri.flags |= RATE_INFO_FLAGS_SHORT_GI; ri.flags |= RATE_INFO_FLAGS_SHORT_GI;
/* TODO/FIXME: is this right? handle other PPDUs */ /* TODO/FIXME: is this right? handle other PPDUs */
if (status->flag & RX_FLAG_MACTIME_PLCP_START) { if (mactime_plcp_start) {
mpdu_offset += 2; mpdu_offset += 2;
ts += 36; ts += 36;
} }
...@@ -4214,7 +4218,7 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local, ...@@ -4214,7 +4218,7 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
* See P802.11ax_D6.0, section 27.3.4 for * See P802.11ax_D6.0, section 27.3.4 for
* VHT PPDU format. * VHT PPDU format.
*/ */
if (status->flag & RX_FLAG_MACTIME_PLCP_START) { if (mactime_plcp_start) {
mpdu_offset += 2; mpdu_offset += 2;
ts += 36; ts += 36;
...@@ -4238,7 +4242,7 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local, ...@@ -4238,7 +4242,7 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
* See P802.11REVmd_D3.0, section 19.3.2 for * See P802.11REVmd_D3.0, section 19.3.2 for
* HT PPDU format. * HT PPDU format.
*/ */
if (status->flag & RX_FLAG_MACTIME_PLCP_START) { if (mactime_plcp_start) {
mpdu_offset += 2; mpdu_offset += 2;
if (status->enc_flags & RX_ENC_FLAG_HT_GF) if (status->enc_flags & RX_ENC_FLAG_HT_GF)
ts += 24; ts += 24;
...@@ -4266,7 +4270,7 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local, ...@@ -4266,7 +4270,7 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
* See P802.11REVmd_D3.0, section 21.3.2 for * See P802.11REVmd_D3.0, section 21.3.2 for
* VHT PPDU format. * VHT PPDU format.
*/ */
if (status->flag & RX_FLAG_MACTIME_PLCP_START) { if (mactime_plcp_start) {
mpdu_offset += 2; mpdu_offset += 2;
ts += 36; ts += 36;
...@@ -4288,7 +4292,7 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local, ...@@ -4288,7 +4292,7 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
sband = local->hw.wiphy->bands[status->band]; sband = local->hw.wiphy->bands[status->band];
ri.legacy = sband->bitrates[status->rate_idx].bitrate; 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) { if (status->band == NL80211_BAND_5GHZ) {
ts += 20; ts += 20;
mpdu_offset += 2; mpdu_offset += 2;
...@@ -4310,7 +4314,7 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local, ...@@ -4310,7 +4314,7 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
return 0; return 0;
/* rewind from end of MPDU */ /* 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_len * 8 * 10 / rate;
ts += mpdu_offset * 8 * 10 / rate; ts += mpdu_offset * 8 * 10 / rate;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment