mac80211: encode listen interval for S1G

S1G allows listen interval up to 2^14 * 10000 beacon
intervals. In order to do this listen interval needs a
scaling factor applied to the lower 14 bits. Calculate
this and properly encode the listen interval for S1G STAs.

See IEEE802.11ah-2016 Table 9-44a for reference.

Signed-off-by: Thomas Pedersen <thomas@adapt-ip.com>
Link: https://lore.kernel.org/r/20200922022818.15855-10-thomas@adapt-ip.com
[move listen_int_usf into function using it]
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
Thomas Pedersen
2020-09-21 19:28:10 -07:00
committed by Johannes Berg
parent 80ca257113
commit 05d109576a
4 changed files with 35 additions and 4 deletions

View File

@@ -4383,3 +4383,24 @@ const u8 ieee80211_ac_to_qos_mask[IEEE80211_NUM_ACS] = {
IEEE80211_WMM_IE_STA_QOSINFO_AC_BE,
IEEE80211_WMM_IE_STA_QOSINFO_AC_BK
};
u16 ieee80211_encode_usf(int listen_interval)
{
static const int listen_int_usf[] = { 1, 10, 1000, 10000 };
u16 ui, usf = 0;
/* find greatest USF */
while (usf < IEEE80211_MAX_USF) {
if (listen_interval % listen_int_usf[usf + 1])
break;
usf += 1;
}
ui = listen_interval / listen_int_usf[usf];
/* error if there is a remainder. Should've been checked by user */
WARN_ON_ONCE(ui > IEEE80211_MAX_UI);
listen_interval = FIELD_PREP(LISTEN_INT_USF, usf) |
FIELD_PREP(LISTEN_INT_UI, ui);
return (u16) listen_interval;
}