wifi: mac80211: move scan work to wiphy work
authorJohannes Berg <johannes.berg@intel.com>
Mon, 28 Aug 2023 11:59:39 +0000 (13:59 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 20 Nov 2023 10:58:54 +0000 (11:58 +0100)
[ Upstream commit 201712512cbbda360f62c222a4bab260350462a0 ]

Move the scan work to wiphy work, which also simplifies
the way we handle the work vs. the scan configuration.

Reviewed-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Stable-dep-of: eadfb54756ae ("wifi: mac80211: move sched-scan stop work to wiphy work")
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/mac80211/ieee80211_i.h
net/mac80211/iface.c
net/mac80211/main.c
net/mac80211/scan.c
net/mac80211/util.c

index 358c886..4e98e03 100644 (file)
@@ -1490,7 +1490,7 @@ struct ieee80211_local {
 
        unsigned long leave_oper_channel_time;
        enum mac80211_scan_state next_scan_state;
-       struct delayed_work scan_work;
+       struct wiphy_delayed_work scan_work;
        struct ieee80211_sub_if_data __rcu *scan_sdata;
        /* For backward compatibility only -- do not use */
        struct cfg80211_chan_def _oper_chandef;
@@ -1929,7 +1929,7 @@ int ieee80211_mesh_finish_csa(struct ieee80211_sub_if_data *sdata,
                              u64 *changed);
 
 /* scan/BSS handling */
-void ieee80211_scan_work(struct work_struct *work);
+void ieee80211_scan_work(struct wiphy *wiphy, struct wiphy_work *work);
 int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata,
                                const u8 *ssid, u8 ssid_len,
                                struct ieee80211_channel **channels,
index be586bc..6e3bfb4 100644 (file)
@@ -691,7 +691,7 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, bool going_do
        ieee80211_recalc_ps(local);
 
        if (cancel_scan)
-               flush_delayed_work(&local->scan_work);
+               wiphy_delayed_work_flush(local->hw.wiphy, &local->scan_work);
 
        if (local->open_count == 0) {
                ieee80211_stop_device(local);
index 3bbd66e..adb8637 100644 (file)
@@ -335,9 +335,7 @@ static void ieee80211_restart_work(struct work_struct *work)
        struct ieee80211_sub_if_data *sdata;
        int ret;
 
-       /* wait for scan work complete */
        flush_workqueue(local->workqueue);
-       flush_work(&local->sched_scan_stopped_work);
 
        rtnl_lock();
        /* we might do interface manipulations, so need both */
@@ -808,7 +806,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_nm(size_t priv_data_len,
        INIT_LIST_HEAD(&local->chanctx_list);
        mutex_init(&local->chanctx_mtx);
 
-       INIT_DELAYED_WORK(&local->scan_work, ieee80211_scan_work);
+       wiphy_delayed_work_init(&local->scan_work, ieee80211_scan_work);
 
        INIT_WORK(&local->restart_work, ieee80211_restart_work);
 
index 0805aa8..2117cb2 100644 (file)
@@ -274,8 +274,8 @@ void ieee80211_scan_rx(struct ieee80211_local *local, struct sk_buff *skb)
                 * the beacon/proberesp rx gives us an opportunity to upgrade
                 * to active scan
                 */
-                set_bit(SCAN_BEACON_DONE, &local->scanning);
-                ieee80211_queue_delayed_work(&local->hw, &local->scan_work, 0);
+               set_bit(SCAN_BEACON_DONE, &local->scanning);
+               wiphy_delayed_work_queue(local->hw.wiphy, &local->scan_work, 0);
        }
 
        if (ieee80211_is_probe_resp(mgmt->frame_control)) {
@@ -505,7 +505,7 @@ void ieee80211_scan_completed(struct ieee80211_hw *hw,
 
        memcpy(&local->scan_info, info, sizeof(*info));
 
-       ieee80211_queue_delayed_work(&local->hw, &local->scan_work, 0);
+       wiphy_delayed_work_queue(local->hw.wiphy, &local->scan_work, 0);
 }
 EXPORT_SYMBOL(ieee80211_scan_completed);
 
@@ -545,8 +545,7 @@ static int ieee80211_start_sw_scan(struct ieee80211_local *local,
        /* We need to set power level at maximum rate for scanning. */
        ieee80211_hw_config(local, 0);
 
-       ieee80211_queue_delayed_work(&local->hw,
-                                    &local->scan_work, 0);
+       wiphy_delayed_work_queue(local->hw.wiphy, &local->scan_work, 0);
 
        return 0;
 }
@@ -603,8 +602,8 @@ void ieee80211_run_deferred_scan(struct ieee80211_local *local)
                                        lockdep_is_held(&local->mtx))))
                return;
 
-       ieee80211_queue_delayed_work(&local->hw, &local->scan_work,
-                                    round_jiffies_relative(0));
+       wiphy_delayed_work_queue(local->hw.wiphy, &local->scan_work,
+                                round_jiffies_relative(0));
 }
 
 static void ieee80211_send_scan_probe_req(struct ieee80211_sub_if_data *sdata,
@@ -795,8 +794,8 @@ static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata,
                }
 
                /* Now, just wait a bit and we are all done! */
-               ieee80211_queue_delayed_work(&local->hw, &local->scan_work,
-                                            next_delay);
+               wiphy_delayed_work_queue(local->hw.wiphy, &local->scan_work,
+                                        next_delay);
                return 0;
        } else {
                /* Do normal software scan */
@@ -1043,7 +1042,7 @@ static void ieee80211_scan_state_resume(struct ieee80211_local *local,
        local->next_scan_state = SCAN_SET_CHANNEL;
 }
 
-void ieee80211_scan_work(struct work_struct *work)
+void ieee80211_scan_work(struct wiphy *wiphy, struct wiphy_work *work)
 {
        struct ieee80211_local *local =
                container_of(work, struct ieee80211_local, scan_work.work);
@@ -1137,7 +1136,8 @@ void ieee80211_scan_work(struct work_struct *work)
                }
        } while (next_delay == 0);
 
-       ieee80211_queue_delayed_work(&local->hw, &local->scan_work, next_delay);
+       wiphy_delayed_work_queue(local->hw.wiphy, &local->scan_work,
+                                next_delay);
        goto out;
 
 out_complete:
@@ -1280,12 +1280,7 @@ void ieee80211_scan_cancel(struct ieee80211_local *local)
                goto out;
        }
 
-       /*
-        * If the work is currently running, it must be blocked on
-        * the mutex, but we'll set scan_sdata = NULL and it'll
-        * simply exit once it acquires the mutex.
-        */
-       cancel_delayed_work(&local->scan_work);
+       wiphy_delayed_work_cancel(local->hw.wiphy, &local->scan_work);
        /* and clean up */
        memset(&local->scan_info, 0, sizeof(local->scan_info));
        __ieee80211_scan_completed(&local->hw, true);
index e878b6a..172173b 100644 (file)
@@ -2340,8 +2340,8 @@ static void ieee80211_flush_completed_scan(struct ieee80211_local *local,
                 */
                if (aborted)
                        set_bit(SCAN_ABORTED, &local->scanning);
-               ieee80211_queue_delayed_work(&local->hw, &local->scan_work, 0);
-               flush_delayed_work(&local->scan_work);
+               wiphy_delayed_work_queue(local->hw.wiphy, &local->scan_work, 0);
+               wiphy_delayed_work_flush(local->hw.wiphy, &local->scan_work);
        }
 }