diff options
Diffstat (limited to 'libre/linux-libre-rt/0004-Revert-wifi-cfg80211-fix-CQM-for-non-range-use.patch')
-rw-r--r-- | libre/linux-libre-rt/0004-Revert-wifi-cfg80211-fix-CQM-for-non-range-use.patch | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/libre/linux-libre-rt/0004-Revert-wifi-cfg80211-fix-CQM-for-non-range-use.patch b/libre/linux-libre-rt/0004-Revert-wifi-cfg80211-fix-CQM-for-non-range-use.patch new file mode 100644 index 000000000..5ae067c58 --- /dev/null +++ b/libre/linux-libre-rt/0004-Revert-wifi-cfg80211-fix-CQM-for-non-range-use.patch @@ -0,0 +1,140 @@ +From cd906594e5fdf1065975f2a89ce45c066c9f02a3 Mon Sep 17 00:00:00 2001 +From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Date: Mon, 11 Dec 2023 10:16:15 +0100 +Subject: [PATCH 4/5] Revert "wifi: cfg80211: fix CQM for non-range use" +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This reverts commit 4a7e92551618f3737b305f62451353ee05662f57 which is +commit 7e7efdda6adb385fbdfd6f819d76bc68c923c394 upstream. + +It needed to have commit 076fc8775daf ("wifi: cfg80211: remove wdev +mutex") applied to properly work, otherwise regressions happen. + +Link: https://lore.kernel.org/r/e374bb16-5b13-44cc-b11a-2f4eefb1ecf5@manjaro.org +Link: https://lore.kernel.org/r/87sf4belmm.fsf@turtle.gmx.de +Link: https://lore.kernel.org/r/20231210213930.61378-1-leo@leolam.fr +Reported-by: Léo Lam <leo@leolam.fr> +Reported-by: Sven Joachim <svenjoac@gmx.de> +Reported-by: Philip Müller <philm@manjaro.org> +Cc: Johannes Berg <johannes.berg@intel.com> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Cherry-picked-for: https://gitlab.archlinux.org/archlinux/packaging/packages/linux/-/issues/17 +--- + net/wireless/core.h | 1 - + net/wireless/nl80211.c | 50 ++++++++++++++++-------------------------- + 2 files changed, 19 insertions(+), 32 deletions(-) + +diff --git a/net/wireless/core.h b/net/wireless/core.h +index f0a3a2317638..e536c0b615a0 100644 +--- a/net/wireless/core.h ++++ b/net/wireless/core.h +@@ -299,7 +299,6 @@ struct cfg80211_cqm_config { + u32 rssi_hyst; + s32 last_rssi_event_value; + enum nl80211_cqm_rssi_threshold_event last_rssi_event_type; +- bool use_range_api; + int n_rssi_thresholds; + s32 rssi_thresholds[] __counted_by(n_rssi_thresholds); + }; +diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c +index 6a82dd876f27..931a03f4549c 100644 +--- a/net/wireless/nl80211.c ++++ b/net/wireless/nl80211.c +@@ -12824,6 +12824,10 @@ static int cfg80211_cqm_rssi_update(struct cfg80211_registered_device *rdev, + int i, n, low_index; + int err; + ++ /* RSSI reporting disabled? */ ++ if (!cqm_config) ++ return rdev_set_cqm_rssi_range_config(rdev, dev, 0, 0); ++ + /* + * Obtain current RSSI value if possible, if not and no RSSI threshold + * event has been received yet, we should receive an event after a +@@ -12898,6 +12902,18 @@ static int nl80211_set_cqm_rssi(struct genl_info *info, + wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) + return -EOPNOTSUPP; + ++ if (n_thresholds <= 1 && rdev->ops->set_cqm_rssi_config) { ++ if (n_thresholds == 0 || thresholds[0] == 0) /* Disabling */ ++ return rdev_set_cqm_rssi_config(rdev, dev, 0, 0); ++ ++ return rdev_set_cqm_rssi_config(rdev, dev, ++ thresholds[0], hysteresis); ++ } ++ ++ if (!wiphy_ext_feature_isset(&rdev->wiphy, ++ NL80211_EXT_FEATURE_CQM_RSSI_LIST)) ++ return -EOPNOTSUPP; ++ + if (n_thresholds == 1 && thresholds[0] == 0) /* Disabling */ + n_thresholds = 0; + +@@ -12905,20 +12921,6 @@ static int nl80211_set_cqm_rssi(struct genl_info *info, + old = rcu_dereference_protected(wdev->cqm_config, + lockdep_is_held(&wdev->mtx)); + +- /* if already disabled just succeed */ +- if (!n_thresholds && !old) +- return 0; +- +- if (n_thresholds > 1) { +- if (!wiphy_ext_feature_isset(&rdev->wiphy, +- NL80211_EXT_FEATURE_CQM_RSSI_LIST) || +- !rdev->ops->set_cqm_rssi_range_config) +- return -EOPNOTSUPP; +- } else { +- if (!rdev->ops->set_cqm_rssi_config) +- return -EOPNOTSUPP; +- } +- + if (n_thresholds) { + cqm_config = kzalloc(struct_size(cqm_config, rssi_thresholds, + n_thresholds), +@@ -12933,26 +12935,13 @@ static int nl80211_set_cqm_rssi(struct genl_info *info, + memcpy(cqm_config->rssi_thresholds, thresholds, + flex_array_size(cqm_config, rssi_thresholds, + n_thresholds)); +- cqm_config->use_range_api = n_thresholds > 1 || +- !rdev->ops->set_cqm_rssi_config; + + rcu_assign_pointer(wdev->cqm_config, cqm_config); +- +- if (cqm_config->use_range_api) +- err = cfg80211_cqm_rssi_update(rdev, dev, cqm_config); +- else +- err = rdev_set_cqm_rssi_config(rdev, dev, +- thresholds[0], +- hysteresis); + } else { + RCU_INIT_POINTER(wdev->cqm_config, NULL); +- /* if enabled as range also disable via range */ +- if (old->use_range_api) +- err = rdev_set_cqm_rssi_range_config(rdev, dev, 0, 0); +- else +- err = rdev_set_cqm_rssi_config(rdev, dev, 0, 0); + } + ++ err = cfg80211_cqm_rssi_update(rdev, dev, cqm_config); + if (err) { + rcu_assign_pointer(wdev->cqm_config, old); + kfree_rcu(cqm_config, rcu_head); +@@ -19142,11 +19131,10 @@ void cfg80211_cqm_rssi_notify_work(struct wiphy *wiphy, struct wiphy_work *work) + wdev_lock(wdev); + cqm_config = rcu_dereference_protected(wdev->cqm_config, + lockdep_is_held(&wdev->mtx)); +- if (!cqm_config) ++ if (!wdev->cqm_config) + goto unlock; + +- if (cqm_config->use_range_api) +- cfg80211_cqm_rssi_update(rdev, wdev->netdev, cqm_config); ++ cfg80211_cqm_rssi_update(rdev, wdev->netdev, cqm_config); + + rssi_level = cqm_config->last_rssi_event_value; + rssi_event = cqm_config->last_rssi_event_type; +-- +2.43.0 + |