cfg80211: schedule offchan_cac_abort_wk in cfg80211_radar_event
If necessary schedule offchan_cac_abort_wk work in cfg80211_radar_event routine adding offchan parameter to cfg80211_radar_event signature. Rename cfg80211_radar_event in __cfg80211_radar_event and introduce the two following inline helpers: - cfg80211_radar_event - cfg80211_offchan_radar_event Doing so the drv will not need to run cfg80211_offchan_cac_abort() after radar detection on the offchannel chain. Tested-by: Owen Peng <owen.peng@mediatek.com> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> Link: https://lore.kernel.org/r/3ff583e021e3343a3ced54a7b09b5e184d1880dc.1637062727.git.lorenzo@kernel.org Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
committed by
Johannes Berg
parent
3536672bbd
commit
c47240cb46
@ -905,13 +905,13 @@ void cfg80211_dfs_channels_update_work(struct work_struct *work)
|
||||
}
|
||||
|
||||
|
||||
void cfg80211_radar_event(struct wiphy *wiphy,
|
||||
struct cfg80211_chan_def *chandef,
|
||||
gfp_t gfp)
|
||||
void __cfg80211_radar_event(struct wiphy *wiphy,
|
||||
struct cfg80211_chan_def *chandef,
|
||||
bool offchan, gfp_t gfp)
|
||||
{
|
||||
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
|
||||
|
||||
trace_cfg80211_radar_event(wiphy, chandef);
|
||||
trace_cfg80211_radar_event(wiphy, chandef, offchan);
|
||||
|
||||
/* only set the chandef supplied channel to unavailable, in
|
||||
* case the radar is detected on only one of multiple channels
|
||||
@ -919,6 +919,9 @@ void cfg80211_radar_event(struct wiphy *wiphy,
|
||||
*/
|
||||
cfg80211_set_dfs_state(wiphy, chandef, NL80211_DFS_UNAVAILABLE);
|
||||
|
||||
if (offchan)
|
||||
queue_work(cfg80211_wq, &rdev->offchan_cac_abort_wk);
|
||||
|
||||
cfg80211_sched_dfs_chan_update(rdev);
|
||||
|
||||
nl80211_radar_notify(rdev, chandef, NL80211_RADAR_DETECTED, NULL, gfp);
|
||||
@ -926,7 +929,7 @@ void cfg80211_radar_event(struct wiphy *wiphy,
|
||||
memcpy(&rdev->radar_chandef, chandef, sizeof(struct cfg80211_chan_def));
|
||||
queue_work(cfg80211_wq, &rdev->propagate_radar_detect_wk);
|
||||
}
|
||||
EXPORT_SYMBOL(cfg80211_radar_event);
|
||||
EXPORT_SYMBOL(__cfg80211_radar_event);
|
||||
|
||||
void cfg80211_cac_event(struct net_device *netdev,
|
||||
const struct cfg80211_chan_def *chandef,
|
||||
@ -998,7 +1001,8 @@ __cfg80211_offchan_cac_event(struct cfg80211_registered_device *rdev,
|
||||
rdev->offchan_radar_wdev = NULL;
|
||||
break;
|
||||
case NL80211_RADAR_CAC_ABORTED:
|
||||
cancel_delayed_work(&rdev->offchan_cac_done_wk);
|
||||
if (!cancel_delayed_work(&rdev->offchan_cac_done_wk))
|
||||
return;
|
||||
wdev = rdev->offchan_radar_wdev;
|
||||
rdev->offchan_radar_wdev = NULL;
|
||||
break;
|
||||
|
Reference in New Issue
Block a user