137 lines
4.5 KiB
Diff
137 lines
4.5 KiB
Diff
From: Lorenzo Bianconi <lorenzo@kernel.org>
|
|
Date: Tue, 16 Nov 2021 12:41:52 +0100
|
|
Subject: [PATCH] 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>
|
|
---
|
|
|
|
--- a/include/net/cfg80211.h
|
|
+++ b/include/net/cfg80211.h
|
|
@@ -7580,15 +7580,33 @@ void cfg80211_cqm_txe_notify(struct net_
|
|
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
|
|
* @chandef: chandef for the current channel
|
|
+ * @offchan: the radar has been detected on the offchannel chain
|
|
* @gfp: context flags
|
|
*
|
|
* This function is called when a radar is detected on the current chanenl.
|
|
*/
|
|
-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);
|
|
+
|
|
+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
|
|
--- a/net/wireless/mlme.c
|
|
+++ b/net/wireless/mlme.c
|
|
@@ -905,13 +905,13 @@ void cfg80211_dfs_channels_update_work(s
|
|
}
|
|
|
|
|
|
-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 *
|
|
*/
|
|
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 *
|
|
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 cfg8
|
|
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;
|
|
--- a/net/wireless/trace.h
|
|
+++ b/net/wireless/trace.h
|
|
@@ -3022,18 +3022,21 @@ TRACE_EVENT(cfg80211_ch_switch_started_n
|
|
);
|
|
|
|
TRACE_EVENT(cfg80211_radar_event,
|
|
- TP_PROTO(struct wiphy *wiphy, struct cfg80211_chan_def *chandef),
|
|
- TP_ARGS(wiphy, chandef),
|
|
+ TP_PROTO(struct wiphy *wiphy, struct cfg80211_chan_def *chandef,
|
|
+ bool offchan),
|
|
+ TP_ARGS(wiphy, chandef, offchan),
|
|
TP_STRUCT__entry(
|
|
WIPHY_ENTRY
|
|
CHAN_DEF_ENTRY
|
|
+ __field(bool, offchan)
|
|
),
|
|
TP_fast_assign(
|
|
WIPHY_ASSIGN;
|
|
CHAN_DEF_ASSIGN(chandef);
|
|
+ __entry->offchan = offchan;
|
|
),
|
|
- TP_printk(WIPHY_PR_FMT ", " CHAN_DEF_PR_FMT,
|
|
- WIPHY_PR_ARG, CHAN_DEF_PR_ARG)
|
|
+ TP_printk(WIPHY_PR_FMT ", " CHAN_DEF_PR_FMT ", offchan %d",
|
|
+ WIPHY_PR_ARG, CHAN_DEF_PR_ARG, __entry->offchan)
|
|
);
|
|
|
|
TRACE_EVENT(cfg80211_cac_event,
|