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:51:51 +0000 (11:51 +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 3960f40c9da99886e3c02eac694e380001a7a5d7..ab759b3b2e88e8408535e23483eafa177d71a273 100644 (file)
@@ -1445,7 +1445,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;
@@ -1862,7 +1862,7 @@ int ieee80211_mesh_csa_beacon(struct ieee80211_sub_if_data *sdata,
 int ieee80211_mesh_finish_csa(struct ieee80211_sub_if_data *sdata);
 
 /* 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 8dd3c10a99e0b1d747d6d7cfaf960ec6a2709da1..e00e1bf0f754a724d9b7796696729612b26cae18 100644 (file)
@@ -697,7 +697,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 444a0d6021f358bc4f8cbba1ba0ca4b4a4d48e95..5422476eb1a1cc29135410114a0ac41a82023876 100644 (file)
@@ -334,9 +334,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 */
@@ -806,7 +804,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 dc3cdee51e6604d8713b0c1915743dbe2212bfbc..445b789e0e9bf7c2cd306226084451ec9a115aae 100644 (file)
@@ -291,8 +291,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)) {
@@ -522,7 +522,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);
 
@@ -562,8 +562,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;
 }
@@ -620,8 +619,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,
@@ -812,8 +811,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 */
@@ -1060,7 +1059,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);
@@ -1154,7 +1153,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:
@@ -1297,12 +1297,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 114956ef17fc3406d01d84aec306ce3b686e2cb4..1088d90e355ba7281446880082b8628e02b05ab3 100644 (file)
@@ -2234,8 +2234,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);
        }
 }