Commit c47240cb authored by Lorenzo Bianconi's avatar Lorenzo Bianconi Committed by Johannes Berg

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: default avatarOwen Peng <owen.peng@mediatek.com>
Signed-off-by: default avatarLorenzo Bianconi <lorenzo@kernel.org>
Link: https://lore.kernel.org/r/3ff583e021e3343a3ced54a7b09b5e184d1880dc.1637062727.git.lorenzo@kernel.orgSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 3536672b
...@@ -7605,15 +7605,33 @@ void cfg80211_cqm_txe_notify(struct net_device *dev, const u8 *peer, ...@@ -7605,15 +7605,33 @@ void cfg80211_cqm_txe_notify(struct net_device *dev, const u8 *peer,
void cfg80211_cqm_beacon_loss_notify(struct net_device *dev, gfp_t gfp); void cfg80211_cqm_beacon_loss_notify(struct net_device *dev, gfp_t gfp);
/** /**
* cfg80211_radar_event - radar detection event * __cfg80211_radar_event - radar detection event
* @wiphy: the wiphy * @wiphy: the wiphy
* @chandef: chandef for the current channel * @chandef: chandef for the current channel
* @offchan: the radar has been detected on the offchannel chain
* @gfp: context flags * @gfp: context flags
* *
* This function is called when a radar is detected on the current chanenl. * This function is called when a radar is detected on the current chanenl.
*/ */
void cfg80211_radar_event(struct wiphy *wiphy, void __cfg80211_radar_event(struct wiphy *wiphy,
struct cfg80211_chan_def *chandef, gfp_t gfp); struct cfg80211_chan_def *chandef,
bool offchan, gfp_t gfp);
static inline void
cfg80211_radar_event(struct wiphy *wiphy,
struct cfg80211_chan_def *chandef,
gfp_t gfp)
{
__cfg80211_radar_event(wiphy, chandef, false, gfp);
}
static inline void
cfg80211_offchan_radar_event(struct wiphy *wiphy,
struct cfg80211_chan_def *chandef,
gfp_t gfp)
{
__cfg80211_radar_event(wiphy, chandef, true, gfp);
}
/** /**
* cfg80211_sta_opmode_change_notify - STA's ht/vht operation mode change event * cfg80211_sta_opmode_change_notify - STA's ht/vht operation mode change event
......
...@@ -905,13 +905,13 @@ void cfg80211_dfs_channels_update_work(struct work_struct *work) ...@@ -905,13 +905,13 @@ void cfg80211_dfs_channels_update_work(struct work_struct *work)
} }
void cfg80211_radar_event(struct wiphy *wiphy, void __cfg80211_radar_event(struct wiphy *wiphy,
struct cfg80211_chan_def *chandef, struct cfg80211_chan_def *chandef,
gfp_t gfp) bool offchan, gfp_t gfp)
{ {
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 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 /* only set the chandef supplied channel to unavailable, in
* case the radar is detected on only one of multiple channels * case the radar is detected on only one of multiple channels
...@@ -919,6 +919,9 @@ void cfg80211_radar_event(struct wiphy *wiphy, ...@@ -919,6 +919,9 @@ void cfg80211_radar_event(struct wiphy *wiphy,
*/ */
cfg80211_set_dfs_state(wiphy, chandef, NL80211_DFS_UNAVAILABLE); 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); cfg80211_sched_dfs_chan_update(rdev);
nl80211_radar_notify(rdev, chandef, NL80211_RADAR_DETECTED, NULL, gfp); nl80211_radar_notify(rdev, chandef, NL80211_RADAR_DETECTED, NULL, gfp);
...@@ -926,7 +929,7 @@ void cfg80211_radar_event(struct wiphy *wiphy, ...@@ -926,7 +929,7 @@ void cfg80211_radar_event(struct wiphy *wiphy,
memcpy(&rdev->radar_chandef, chandef, sizeof(struct cfg80211_chan_def)); memcpy(&rdev->radar_chandef, chandef, sizeof(struct cfg80211_chan_def));
queue_work(cfg80211_wq, &rdev->propagate_radar_detect_wk); 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, void cfg80211_cac_event(struct net_device *netdev,
const struct cfg80211_chan_def *chandef, const struct cfg80211_chan_def *chandef,
...@@ -998,7 +1001,8 @@ __cfg80211_offchan_cac_event(struct cfg80211_registered_device *rdev, ...@@ -998,7 +1001,8 @@ __cfg80211_offchan_cac_event(struct cfg80211_registered_device *rdev,
rdev->offchan_radar_wdev = NULL; rdev->offchan_radar_wdev = NULL;
break; break;
case NL80211_RADAR_CAC_ABORTED: 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; wdev = rdev->offchan_radar_wdev;
rdev->offchan_radar_wdev = NULL; rdev->offchan_radar_wdev = NULL;
break; break;
......
...@@ -3053,18 +3053,21 @@ TRACE_EVENT(cfg80211_ch_switch_started_notify, ...@@ -3053,18 +3053,21 @@ TRACE_EVENT(cfg80211_ch_switch_started_notify,
); );
TRACE_EVENT(cfg80211_radar_event, TRACE_EVENT(cfg80211_radar_event,
TP_PROTO(struct wiphy *wiphy, struct cfg80211_chan_def *chandef), TP_PROTO(struct wiphy *wiphy, struct cfg80211_chan_def *chandef,
TP_ARGS(wiphy, chandef), bool offchan),
TP_ARGS(wiphy, chandef, offchan),
TP_STRUCT__entry( TP_STRUCT__entry(
WIPHY_ENTRY WIPHY_ENTRY
CHAN_DEF_ENTRY CHAN_DEF_ENTRY
__field(bool, offchan)
), ),
TP_fast_assign( TP_fast_assign(
WIPHY_ASSIGN; WIPHY_ASSIGN;
CHAN_DEF_ASSIGN(chandef); CHAN_DEF_ASSIGN(chandef);
__entry->offchan = offchan;
), ),
TP_printk(WIPHY_PR_FMT ", " CHAN_DEF_PR_FMT, TP_printk(WIPHY_PR_FMT ", " CHAN_DEF_PR_FMT ", offchan %d",
WIPHY_PR_ARG, CHAN_DEF_PR_ARG) WIPHY_PR_ARG, CHAN_DEF_PR_ARG, __entry->offchan)
); );
TRACE_EVENT(cfg80211_cac_event, TRACE_EVENT(cfg80211_cac_event,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment