123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- 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
|