mac80211: support rx timestamps for HE rates
Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
		| @@ -0,0 +1,134 @@ | |||||||
|  | From: Avraham Stern <avraham.stern@intel.com> | ||||||
|  | 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 <avraham.stern@intel.com> | ||||||
|  | Signed-off-by: Luca Coelho <luciano.coelho@intel.com> | ||||||
|  | Link: https://lore.kernel.org/r/iwlwifi.20201206145305.4786559af475.Ia54486bb0a12e5351f9d5c60ef6fcda7c9e7141c@changeid | ||||||
|  | Signed-off-by: Johannes Berg <johannes.berg@intel.com> | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | --- 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; | ||||||
		Reference in New Issue
	
	Block a user
	 Felix Fietkau
					Felix Fietkau