ktime_t mac80211_hwsim_tsf_to_boottime(struct mac80211_hwsim_data *data,
u64 tsf)
{
- return us_to_ktime(tsf - data->tsf_offset);
+ scoped_guard(spinlock_bh, &data->tsf_offset_lock) {
+ return us_to_ktime(tsf - data->tsf_offset);
+ }
}
u64 mac80211_hwsim_boottime_to_tsf(struct mac80211_hwsim_data *data,
ktime_t ts)
{
- return ktime_to_us(ts + data->tsf_offset);
+ scoped_guard(spinlock_bh, &data->tsf_offset_lock) {
+ return ktime_to_us(ts) + data->tsf_offset;
+ }
}
u64 mac80211_hwsim_get_tsf(struct ieee80211_hw *hw,
struct mac80211_hwsim_data *data = hw->priv;
u64 sim_time = mac80211_hwsim_get_sim_tsf();
- return sim_time + data->tsf_offset;
+ scoped_guard(spinlock_bh, &data->tsf_offset_lock) {
+ return sim_time + data->tsf_offset;
+ }
}
static __le64 __mac80211_hwsim_get_tsf(struct mac80211_hwsim_data *data)
{
u64 sim_time = mac80211_hwsim_get_sim_tsf();
- return cpu_to_le64(sim_time + data->tsf_offset);
+ scoped_guard(spinlock_bh, &data->tsf_offset_lock) {
+ return cpu_to_le64(sim_time + data->tsf_offset);
+ }
}
static void mac80211_hwsim_set_tsf(struct ieee80211_hw *hw,
if (conf && !conf->enable_beacon)
return;
- /* adjust after beaconing with new timestamp at old TBTT */
- if (tsf > now)
- data->tsf_offset += delta;
- else
- data->tsf_offset -= delta;
+ scoped_guard(spinlock_bh, &data->tsf_offset_lock) {
+ /* adjust after beaconing with new timestamp at old TBTT */
+ if (tsf > now)
+ data->tsf_offset += delta;
+ else
+ data->tsf_offset -= delta;
+ }
}
static void mac80211_hwsim_monitor_rx(struct ieee80211_hw *hw,
/* TODO: get MCS */
int bitrate = 100;
+ spin_lock_bh(&data->tsf_offset_lock);
+
txrate = ieee80211_get_tx_rate(data->hw, info);
if (txrate)
bitrate = txrate->bitrate;
10 * 8 * 10 /
bitrate);
}
+
+ spin_unlock_bh(&data->tsf_offset_lock);
}
static void mac80211_hwsim_tx_frame_nl(struct ieee80211_hw *hw,
hw->wiphy->mbssid_max_interfaces = 8;
hw->wiphy->ema_max_profile_periodicity = 3;
+ spin_lock_init(&data->tsf_offset_lock);
+
data->rx_rssi = DEFAULT_RX_RSSI;
INIT_DELAYED_WORK(&data->roc_start, hw_roc_start);