]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: mac80211: use wiphy_hrtimer_work for ttlm_work
authorBenjamin Berg <benjamin.berg@intel.com>
Tue, 28 Oct 2025 10:58:38 +0000 (12:58 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Nov 2025 20:37:45 +0000 (15:37 -0500)
commit dfa865d490b1bd252045463588a91a4d3c82f3c8 upstream.

The work item may be scheduled relatively far in the future. As the
event happens at a specific point in time, the normal timer accuracy is
not sufficient in that case.

Switch to use wiphy_hrtimer_work so that the accuracy is sufficient.

CC: stable@vger.kernel.org
Fixes: 702e80470a33 ("wifi: mac80211: support handling of advertised TID-to-link mapping")
Signed-off-by: Benjamin Berg <benjamin.berg@intel.com>
Reviewed-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20251028125710.83c2c611545e.I35498a6d883ea24b0dc4910cf521aa768d2a0e90@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
net/mac80211/ieee80211_i.h
net/mac80211/mlme.c

index f985b45267af7cf54f5bbac49d731fa2c4f45a4a..61d3ce0173b6a14337faebd9e12ef1953e5a4ceb 100644 (file)
@@ -608,7 +608,7 @@ struct ieee80211_if_managed {
        u16 removed_links;
 
        /* TID-to-link mapping support */
-       struct wiphy_delayed_work ttlm_work;
+       struct wiphy_hrtimer_work ttlm_work;
        struct ieee80211_adv_ttlm_info ttlm_info;
        struct wiphy_work teardown_ttlm_work;
 
index 3498a4092f85aafa438cbbf002bdd9964cbe8b93..48169515cd844af212fe1e1fc9f43a9883e3c96b 100644 (file)
@@ -45,7 +45,7 @@
 #define IEEE80211_ASSOC_TIMEOUT_SHORT  (HZ / 10)
 #define IEEE80211_ASSOC_MAX_TRIES      3
 
-#define IEEE80211_ADV_TTLM_SAFETY_BUFFER_MS msecs_to_jiffies(100)
+#define IEEE80211_ADV_TTLM_SAFETY_BUFFER_MS (100 * USEC_PER_MSEC)
 #define IEEE80211_ADV_TTLM_ST_UNDERFLOW 0xff00
 
 #define IEEE80211_NEG_TTLM_REQ_TIMEOUT (HZ / 5)
@@ -4237,7 +4237,7 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
 
        memset(&sdata->u.mgd.ttlm_info, 0,
               sizeof(sdata->u.mgd.ttlm_info));
-       wiphy_delayed_work_cancel(sdata->local->hw.wiphy, &ifmgd->ttlm_work);
+       wiphy_hrtimer_work_cancel(sdata->local->hw.wiphy, &ifmgd->ttlm_work);
 
        memset(&sdata->vif.neg_ttlm, 0, sizeof(sdata->vif.neg_ttlm));
        wiphy_delayed_work_cancel(sdata->local->hw.wiphy,
@@ -7087,7 +7087,7 @@ static void ieee80211_process_adv_ttlm(struct ieee80211_sub_if_data *sdata,
                        /* if a planned TID-to-link mapping was cancelled -
                         * abort it
                         */
-                       wiphy_delayed_work_cancel(sdata->local->hw.wiphy,
+                       wiphy_hrtimer_work_cancel(sdata->local->hw.wiphy,
                                                  &sdata->u.mgd.ttlm_work);
                } else if (sdata->u.mgd.ttlm_info.active) {
                        /* if no TID-to-link element, set to default mapping in
@@ -7122,7 +7122,7 @@ static void ieee80211_process_adv_ttlm(struct ieee80211_sub_if_data *sdata,
 
                if (ttlm_info.switch_time) {
                        u16 beacon_ts_tu, st_tu, delay;
-                       u32 delay_jiffies;
+                       u64 delay_usec;
                        u64 mask;
 
                        /* The t2l map switch time is indicated with a partial
@@ -7144,23 +7144,23 @@ static void ieee80211_process_adv_ttlm(struct ieee80211_sub_if_data *sdata,
                        if (delay > IEEE80211_ADV_TTLM_ST_UNDERFLOW)
                                return;
 
-                       delay_jiffies = TU_TO_JIFFIES(delay);
+                       delay_usec = ieee80211_tu_to_usec(delay);
 
                        /* Link switching can take time, so schedule it
                         * 100ms before to be ready on time
                         */
-                       if (delay_jiffies > IEEE80211_ADV_TTLM_SAFETY_BUFFER_MS)
-                               delay_jiffies -=
+                       if (delay_usec > IEEE80211_ADV_TTLM_SAFETY_BUFFER_MS)
+                               delay_usec -=
                                        IEEE80211_ADV_TTLM_SAFETY_BUFFER_MS;
                        else
-                               delay_jiffies = 0;
+                               delay_usec = 0;
 
                        sdata->u.mgd.ttlm_info = ttlm_info;
-                       wiphy_delayed_work_cancel(sdata->local->hw.wiphy,
+                       wiphy_hrtimer_work_cancel(sdata->local->hw.wiphy,
                                                  &sdata->u.mgd.ttlm_work);
-                       wiphy_delayed_work_queue(sdata->local->hw.wiphy,
+                       wiphy_hrtimer_work_queue(sdata->local->hw.wiphy,
                                                 &sdata->u.mgd.ttlm_work,
-                                                delay_jiffies);
+                                                us_to_ktime(delay_usec));
                        return;
                }
        }
@@ -8761,7 +8761,7 @@ void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata)
        timer_setup(&ifmgd->conn_mon_timer, ieee80211_sta_conn_mon_timer, 0);
        wiphy_delayed_work_init(&ifmgd->tx_tspec_wk,
                                ieee80211_sta_handle_tspec_ac_params_wk);
-       wiphy_delayed_work_init(&ifmgd->ttlm_work,
+       wiphy_hrtimer_work_init(&ifmgd->ttlm_work,
                                ieee80211_tid_to_link_map_work);
        wiphy_delayed_work_init(&ifmgd->neg_ttlm_timeout_work,
                                ieee80211_neg_ttlm_timeout_work);