This updates mac80211 to version 5.15.33-1 which is based on kernel 5.15.33. The removed patches were applied upstream. This new release contains many fixes which were merged into the upstream Linux kernel. This also contains the following new drivers which are needed for ath11k: * net/qrtr/ * drivers/bus/mhi/ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
183 lines
6.6 KiB
Diff
183 lines
6.6 KiB
Diff
From: Lorenzo Bianconi <lorenzo@kernel.org>
|
|
Date: Wed, 27 Oct 2021 11:03:42 +0200
|
|
Subject: [PATCH] cfg80211: move offchan_cac_event to a dedicated work
|
|
|
|
In order to make cfg80211_offchan_cac_abort() (renamed from
|
|
cfg80211_offchan_cac_event) callable in other contexts and
|
|
without so much locking restrictions, make it trigger a new
|
|
work instead of operating directly.
|
|
|
|
Do some other renames while at it to clarify.
|
|
|
|
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
|
|
Link: https://lore.kernel.org/r/6145c3d0f30400a568023f67981981d24c7c6133.1635325205.git.lorenzo@kernel.org
|
|
[rewrite commit log]
|
|
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|
---
|
|
|
|
--- a/include/net/cfg80211.h
|
|
+++ b/include/net/cfg80211.h
|
|
@@ -7620,19 +7620,13 @@ void cfg80211_cac_event(struct net_devic
|
|
enum nl80211_radar_event event, gfp_t gfp);
|
|
|
|
/**
|
|
- * cfg80211_offchan_cac_event - Channel Availability Check (CAC) offchan event
|
|
+ * cfg80211_offchan_cac_abort - Channel Availability Check offchan abort event
|
|
* @wiphy: the wiphy
|
|
- * @chandef: chandef for the current channel
|
|
- * @event: type of event
|
|
*
|
|
- * This function is called when a Channel Availability Check (CAC) is finished,
|
|
- * started or aborted by a offchannel dedicated chain.
|
|
- *
|
|
- * Note that this acquires the wiphy lock.
|
|
+ * This function is called by the driver when a Channel Availability Check
|
|
+ * (CAC) is aborted by a offchannel dedicated chain.
|
|
*/
|
|
-void cfg80211_offchan_cac_event(struct wiphy *wiphy,
|
|
- const struct cfg80211_chan_def *chandef,
|
|
- enum nl80211_radar_event event);
|
|
+void cfg80211_offchan_cac_abort(struct wiphy *wiphy);
|
|
|
|
/**
|
|
* cfg80211_gtk_rekey_notify - notify userspace about driver rekeying
|
|
--- a/net/wireless/core.c
|
|
+++ b/net/wireless/core.c
|
|
@@ -543,7 +543,9 @@ use_default_name:
|
|
INIT_WORK(&rdev->rfkill_block, cfg80211_rfkill_block_work);
|
|
INIT_WORK(&rdev->conn_work, cfg80211_conn_work);
|
|
INIT_WORK(&rdev->event_work, cfg80211_event_work);
|
|
- INIT_DELAYED_WORK(&rdev->offchan_cac_work, cfg80211_offchan_cac_work);
|
|
+ INIT_WORK(&rdev->offchan_cac_abort_wk, cfg80211_offchan_cac_abort_wk);
|
|
+ INIT_DELAYED_WORK(&rdev->offchan_cac_done_wk,
|
|
+ cfg80211_offchan_cac_done_wk);
|
|
|
|
init_waitqueue_head(&rdev->dev_wait);
|
|
|
|
@@ -1053,11 +1055,13 @@ void wiphy_unregister(struct wiphy *wiph
|
|
cancel_work_sync(&rdev->conn_work);
|
|
flush_work(&rdev->event_work);
|
|
cancel_delayed_work_sync(&rdev->dfs_update_channels_wk);
|
|
+ cancel_delayed_work_sync(&rdev->offchan_cac_done_wk);
|
|
flush_work(&rdev->destroy_work);
|
|
flush_work(&rdev->sched_scan_stop_wk);
|
|
flush_work(&rdev->propagate_radar_detect_wk);
|
|
flush_work(&rdev->propagate_cac_done_wk);
|
|
flush_work(&rdev->mgmt_registrations_update_wk);
|
|
+ flush_work(&rdev->offchan_cac_abort_wk);
|
|
|
|
#ifdef CONFIG_PM
|
|
if (rdev->wiphy.wowlan_config && rdev->ops->set_wakeup)
|
|
--- a/net/wireless/core.h
|
|
+++ b/net/wireless/core.h
|
|
@@ -86,7 +86,8 @@ struct cfg80211_registered_device {
|
|
|
|
struct wireless_dev *offchan_radar_wdev;
|
|
struct cfg80211_chan_def offchan_radar_chandef;
|
|
- struct delayed_work offchan_cac_work;
|
|
+ struct delayed_work offchan_cac_done_wk;
|
|
+ struct work_struct offchan_cac_abort_wk;
|
|
|
|
/* netlink port which started critical protocol (0 means not started) */
|
|
u32 crit_proto_nlportid;
|
|
@@ -502,7 +503,9 @@ cfg80211_start_offchan_radar_detection(s
|
|
|
|
void cfg80211_stop_offchan_radar_detection(struct wireless_dev *wdev);
|
|
|
|
-void cfg80211_offchan_cac_work(struct work_struct *work);
|
|
+void cfg80211_offchan_cac_done_wk(struct work_struct *work);
|
|
+
|
|
+void cfg80211_offchan_cac_abort_wk(struct work_struct *work);
|
|
|
|
bool cfg80211_any_wiphy_oper_chan(struct wiphy *wiphy,
|
|
struct ieee80211_channel *chan);
|
|
--- a/net/wireless/mlme.c
|
|
+++ b/net/wireless/mlme.c
|
|
@@ -971,17 +971,6 @@ void cfg80211_cac_event(struct net_devic
|
|
}
|
|
EXPORT_SYMBOL(cfg80211_cac_event);
|
|
|
|
-void cfg80211_offchan_cac_work(struct work_struct *work)
|
|
-{
|
|
- struct delayed_work *delayed_work = to_delayed_work(work);
|
|
- struct cfg80211_registered_device *rdev;
|
|
-
|
|
- rdev = container_of(delayed_work, struct cfg80211_registered_device,
|
|
- offchan_cac_work);
|
|
- cfg80211_offchan_cac_event(&rdev->wiphy, &rdev->offchan_radar_chandef,
|
|
- NL80211_RADAR_CAC_FINISHED);
|
|
-}
|
|
-
|
|
static void
|
|
__cfg80211_offchan_cac_event(struct cfg80211_registered_device *rdev,
|
|
struct wireless_dev *wdev,
|
|
@@ -1006,7 +995,7 @@ __cfg80211_offchan_cac_event(struct cfg8
|
|
rdev->offchan_radar_wdev = NULL;
|
|
break;
|
|
case NL80211_RADAR_CAC_ABORTED:
|
|
- cancel_delayed_work(&rdev->offchan_cac_work);
|
|
+ cancel_delayed_work(&rdev->offchan_cac_done_wk);
|
|
wdev = rdev->offchan_radar_wdev;
|
|
rdev->offchan_radar_wdev = NULL;
|
|
break;
|
|
@@ -1022,17 +1011,44 @@ __cfg80211_offchan_cac_event(struct cfg8
|
|
nl80211_radar_notify(rdev, chandef, event, netdev, GFP_KERNEL);
|
|
}
|
|
|
|
-void cfg80211_offchan_cac_event(struct wiphy *wiphy,
|
|
- const struct cfg80211_chan_def *chandef,
|
|
- enum nl80211_radar_event event)
|
|
+static void
|
|
+cfg80211_offchan_cac_event(struct cfg80211_registered_device *rdev,
|
|
+ const struct cfg80211_chan_def *chandef,
|
|
+ enum nl80211_radar_event event)
|
|
+{
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
+ __cfg80211_offchan_cac_event(rdev, NULL, chandef, event);
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
+}
|
|
+
|
|
+void cfg80211_offchan_cac_done_wk(struct work_struct *work)
|
|
+{
|
|
+ struct delayed_work *delayed_work = to_delayed_work(work);
|
|
+ struct cfg80211_registered_device *rdev;
|
|
+
|
|
+ rdev = container_of(delayed_work, struct cfg80211_registered_device,
|
|
+ offchan_cac_done_wk);
|
|
+ cfg80211_offchan_cac_event(rdev, &rdev->offchan_radar_chandef,
|
|
+ NL80211_RADAR_CAC_FINISHED);
|
|
+}
|
|
+
|
|
+void cfg80211_offchan_cac_abort_wk(struct work_struct *work)
|
|
+{
|
|
+ struct cfg80211_registered_device *rdev;
|
|
+
|
|
+ rdev = container_of(work, struct cfg80211_registered_device,
|
|
+ offchan_cac_abort_wk);
|
|
+ cfg80211_offchan_cac_event(rdev, &rdev->offchan_radar_chandef,
|
|
+ NL80211_RADAR_CAC_ABORTED);
|
|
+}
|
|
+
|
|
+void cfg80211_offchan_cac_abort(struct wiphy *wiphy)
|
|
{
|
|
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
|
|
|
|
- wiphy_lock(wiphy);
|
|
- __cfg80211_offchan_cac_event(rdev, NULL, chandef, event);
|
|
- wiphy_unlock(wiphy);
|
|
+ queue_work(cfg80211_wq, &rdev->offchan_cac_abort_wk);
|
|
}
|
|
-EXPORT_SYMBOL(cfg80211_offchan_cac_event);
|
|
+EXPORT_SYMBOL(cfg80211_offchan_cac_abort);
|
|
|
|
int
|
|
cfg80211_start_offchan_radar_detection(struct cfg80211_registered_device *rdev,
|
|
@@ -1062,7 +1078,7 @@ cfg80211_start_offchan_radar_detection(s
|
|
rdev->offchan_radar_chandef = *chandef;
|
|
__cfg80211_offchan_cac_event(rdev, wdev, chandef,
|
|
NL80211_RADAR_CAC_STARTED);
|
|
- queue_delayed_work(cfg80211_wq, &rdev->offchan_cac_work,
|
|
+ queue_delayed_work(cfg80211_wq, &rdev->offchan_cac_done_wk,
|
|
msecs_to_jiffies(cac_time_ms));
|
|
|
|
return 0;
|