From 90d3a30a16a30741ef0bd7029e5b3065892d995b Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Fri, 9 Sep 2016 04:45:25 +0000 Subject: [PATCH] [ath_hal] fixes for finer grain timestamping, some 11n macros * change the HT_RC_2_MCS to do MCS0..23 * Use it when looking up the ht20/ht40 array for bits-per-symbol * add a clk_to_psec (picoseconds) routine, so we can get sub-microsecond accuracy for the math * .. and make that + clk_to_usec public, so higher layer code that is returning clocks (eg the ANI diag routines, some upcoming locationing experiments) can be converted to microseconds. Whilst here, add a comment in ar5416 so i or someone else can revisit the latency values. --- sys/dev/ath/ath_hal/ah.c | 37 +++++++++++++++++------ sys/dev/ath/ath_hal/ah.h | 7 +++++ sys/dev/ath/ath_hal/ah_internal.h | 6 ---- sys/dev/ath/ath_hal/ar5416/ar5416_reset.c | 3 ++ 4 files changed, 37 insertions(+), 16 deletions(-) diff --git a/sys/dev/ath/ath_hal/ah.c b/sys/dev/ath/ath_hal/ah.c index 2d723bdae8d6..5e50ad0e563d 100644 --- a/sys/dev/ath/ath_hal/ah.c +++ b/sys/dev/ath/ath_hal/ah.c @@ -275,7 +275,7 @@ ath_hal_reverseBits(uint32_t val, uint32_t n) #define HT_STF 4 #define HT_LTF(n) ((n) * 4) -#define HT_RC_2_MCS(_rc) ((_rc) & 0xf) +#define HT_RC_2_MCS(_rc) ((_rc) & 0x1f) #define HT_RC_2_STREAMS(_rc) ((((_rc) & 0x78) >> 3) + 1) #define IS_HT_RATE(_rc) ( (_rc) & IEEE80211_RATE_MCS) @@ -334,9 +334,9 @@ ath_computedur_ht(uint32_t frameLen, uint16_t rate, int streams, KASSERT((rate &~ IEEE80211_RATE_MCS) < 31, ("bad mcs 0x%x", rate)); if (isht40) - bitsPerSymbol = ht40_bps[rate & 0x1f]; + bitsPerSymbol = ht40_bps[HT_RC_2_MCS(rate)]; else - bitsPerSymbol = ht20_bps[rate & 0x1f]; + bitsPerSymbol = ht20_bps[HT_RC_2_MCS(rate)]; numBits = OFDM_PLCP_BITS + (frameLen << 3); numSymbols = howmany(numBits, bitsPerSymbol); if (isShortGI) @@ -490,6 +490,11 @@ typedef enum { WIRELESS_MODE_MAX } WIRELESS_MODE; +/* + * XXX TODO: for some (?) chips, an 11b mode still runs at 11bg. + * Maybe AR5211 has separate 11b and 11g only modes, so 11b is 22MHz + * and 11g is 44MHz, but AR5416 and later run 11b in 11bg mode, right? + */ static WIRELESS_MODE ath_hal_chan2wmode(struct ath_hal *ah, const struct ieee80211_channel *chan) { @@ -542,23 +547,35 @@ ath_hal_mac_clks(struct ath_hal *ah, u_int usecs) u_int ath_hal_mac_usec(struct ath_hal *ah, u_int clks) +{ + uint64_t psec; + + psec = ath_hal_mac_psec(ah, clks); + return (psec / 1000000); +} + +/* + * XXX TODO: half, quarter rates. + */ +uint64_t +ath_hal_mac_psec(struct ath_hal *ah, u_int clks) { const struct ieee80211_channel *c = AH_PRIVATE(ah)->ah_curchan; - u_int usec; + uint64_t psec; /* NB: ah_curchan may be null when called attach time */ /* XXX merlin and later specific workaround - 5ghz fast clock is 44 */ if (c != AH_NULL && IS_5GHZ_FAST_CLOCK_EN(ah, c)) { - usec = clks / CLOCK_FAST_RATE_5GHZ_OFDM; + psec = (clks * 1000000ULL) / CLOCK_FAST_RATE_5GHZ_OFDM; if (IEEE80211_IS_CHAN_HT40(c)) - usec >>= 1; + psec >>= 1; } else if (c != AH_NULL) { - usec = clks / CLOCK_RATE[ath_hal_chan2wmode(ah, c)]; + psec = (clks * 1000000ULL) / CLOCK_RATE[ath_hal_chan2wmode(ah, c)]; if (IEEE80211_IS_CHAN_HT40(c)) - usec >>= 1; + psec >>= 1; } else - usec = clks / CLOCK_RATE[WIRELESS_MODE_11b]; - return usec; + psec = (clks * 1000000ULL) / CLOCK_RATE[WIRELESS_MODE_11b]; + return psec; } /* diff --git a/sys/dev/ath/ath_hal/ah.h b/sys/dev/ath/ath_hal/ah.h index 519fcb8338df..7dd8b9b19857 100644 --- a/sys/dev/ath/ath_hal/ah.h +++ b/sys/dev/ath/ath_hal/ah.h @@ -1674,4 +1674,11 @@ ath_hal_get_mfp_qos(struct ath_hal *ah) return HAL_MFP_QOSDATA; } +/* + * Convert between microseconds and core system clocks. + */ +extern u_int ath_hal_mac_clks(struct ath_hal *ah, u_int usecs); +extern u_int ath_hal_mac_usec(struct ath_hal *ah, u_int clks); +extern uint64_t ath_hal_mac_psec(struct ath_hal *ah, u_int clks); + #endif /* _ATH_AH_H_ */ diff --git a/sys/dev/ath/ath_hal/ah_internal.h b/sys/dev/ath/ath_hal/ah_internal.h index 5710255e7025..6583c73dd11a 100644 --- a/sys/dev/ath/ath_hal/ah_internal.h +++ b/sys/dev/ath/ath_hal/ah_internal.h @@ -726,12 +726,6 @@ ath_hal_gethwchannel(struct ath_hal *ah, const struct ieee80211_channel *c) return ath_hal_checkchannel(ah, c)->channel; } -/* - * Convert between microseconds and core system clocks. - */ -extern u_int ath_hal_mac_clks(struct ath_hal *ah, u_int usecs); -extern u_int ath_hal_mac_usec(struct ath_hal *ah, u_int clks); - /* * Generic get/set capability support. Each chip overrides * this routine to support chip-specific capabilities. diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c b/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c index 6abb7b4f8549..9542480fea8c 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c @@ -2833,6 +2833,9 @@ ar5416SetIFSTiming(struct ath_hal *ah, const struct ieee80211_channel *chan) clk_44 = 1; /* XXX does this need save/restoring for the 11n chips? */ + /* + * XXX TODO: should mask out the txlat/rxlat/usec values? + */ refClock = OS_REG_READ(ah, AR_USEC) & AR_USEC_USEC32; /*