Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 55fabefe authored by Thomas Pedersen's avatar Thomas Pedersen Committed by John W. Linville
Browse files

mac80211: call drv_get_tsf() in sleepable context



The call to drv_get/set_tsf() was put on the workqueue to perform tsf
adjustments since that function might sleep. However it ended up inside
a spinlock, whose critical section must be atomic. Do tsf adjustment
outside the spinlock instead, and get rid of a warning.

Signed-off-by: default avatarThomas Pedersen <thomas@cozybit.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent cf193f6d
Loading
Loading
Loading
Loading
+1 −2
Original line number Original line Diff line number Diff line
@@ -56,7 +56,6 @@ void mesh_sync_adjust_tbtt(struct ieee80211_sub_if_data *sdata)
	u64 tsfdelta;
	u64 tsfdelta;


	spin_lock_bh(&ifmsh->sync_offset_lock);
	spin_lock_bh(&ifmsh->sync_offset_lock);

	if (ifmsh->sync_offset_clockdrift_max < beacon_int_fraction) {
	if (ifmsh->sync_offset_clockdrift_max < beacon_int_fraction) {
		msync_dbg(sdata, "TBTT : max clockdrift=%lld; adjusting\n",
		msync_dbg(sdata, "TBTT : max clockdrift=%lld; adjusting\n",
			  (long long) ifmsh->sync_offset_clockdrift_max);
			  (long long) ifmsh->sync_offset_clockdrift_max);
@@ -69,11 +68,11 @@ void mesh_sync_adjust_tbtt(struct ieee80211_sub_if_data *sdata)
		tsfdelta = -beacon_int_fraction;
		tsfdelta = -beacon_int_fraction;
		ifmsh->sync_offset_clockdrift_max -= beacon_int_fraction;
		ifmsh->sync_offset_clockdrift_max -= beacon_int_fraction;
	}
	}
	spin_unlock_bh(&ifmsh->sync_offset_lock);


	tsf = drv_get_tsf(local, sdata);
	tsf = drv_get_tsf(local, sdata);
	if (tsf != -1ULL)
	if (tsf != -1ULL)
		drv_set_tsf(local, sdata, tsf + tsfdelta);
		drv_set_tsf(local, sdata, tsf + tsfdelta);
	spin_unlock_bh(&ifmsh->sync_offset_lock);
}
}


static void mesh_sync_offset_rx_bcn_presp(struct ieee80211_sub_if_data *sdata,
static void mesh_sync_offset_rx_bcn_presp(struct ieee80211_sub_if_data *sdata,