@@ -1044,9 +1044,14 @@ static int mac80211_hwsim_config(struct ieee80211_hw *hw, u32 changed)
data->power_level = conf->power_level;
if (!data->started || !ktime_to_ns(data->beacon_int))
hrtimer_cancel(&data->beacon_timer);
- else if (!hrtimer_is_queued(&data->beacon_timer))
- hrtimer_start(&data->beacon_timer, data->beacon_int,
- HRTIMER_MODE_REL);
+ else if (!hrtimer_is_queued(&data->beacon_timer)) {
+ u64 tsf = le64_to_cpu(__mac80211_hwsim_get_tsf(data));
+ u64 bcn_int = ktime_to_ns(data->beacon_int) / 1000;
+ u64 next_tbtt = bcn_int - do_div(tsf, bcn_int);
+
+ hrtimer_start(&data->beacon_timer,
+ ns_to_ktime(next_tbtt * 1000), HRTIMER_MODE_REL);
+ }
return 0;
}
@@ -1099,9 +1104,15 @@ static void mac80211_hwsim_bss_info_changed(struct ieee80211_hw *hw,
data->beacon_int = ns_to_ktime(info->beacon_int * 1024 * 1000);
if (WARN_ON(!ktime_to_ns(data->beacon_int)))
data->beacon_int = ns_to_ktime(1000 * 1000);
- if (data->started && !hrtimer_is_queued(&data->beacon_timer))
+ if (data->started && !hrtimer_is_queued(&data->beacon_timer)) {
+ u64 tsf = le64_to_cpu(__mac80211_hwsim_get_tsf(data));
+ u64 bcn_int = ktime_to_ns(data->beacon_int) / 1000;
+ u64 next_tbtt = bcn_int - do_div(tsf, bcn_int);
+
hrtimer_start(&data->beacon_timer,
- data->beacon_int, HRTIMER_MODE_REL);
+ ns_to_ktime(next_tbtt * 1000),
+ HRTIMER_MODE_REL);
+ }
}
if (changed & BSS_CHANGED_ERP_CTS_PROT) {
A beacon period starts at TSF time 0. Spoof this by rounding the starting beacon time to a multiple of the beacon interval. Signed-off-by: Thomas Pedersen <thomas@cozybit.com> --- drivers/net/wireless/mac80211_hwsim.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-)