]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: mt76: mt7925: fix CLC command timeout when suspend/resume
authorQuan Zhou <quan.zhou@mediatek.com>
Mon, 5 Jan 2026 11:16:27 +0000 (12:16 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 8 Jan 2026 09:15:02 +0000 (10:15 +0100)
[ Upstream commit a0f721b8d986b62b4de316444f2b2e356d17e3b5 ]

When enter suspend/resume while in a connected state, the upper layer
will trigger disconnection before entering suspend, and at the same time,
it will trigger regd_notifier() and update CLC, causing the CLC event to
not be received due to suspend, resulting in a command timeout.

Therefore, the update of CLC is postponed until resume, to ensure data
consistency and avoid the occurrence of command timeout.

Signed-off-by: Quan Zhou <quan.zhou@mediatek.com>
Link: https://patch.msgid.link/bab00a2805d0533fd8beaa059222659858a9dcb5.1735910455.git.quan.zhou@mediatek.com
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/wireless/mediatek/mt76/mt7925/init.c
drivers/net/wireless/mediatek/mt76/mt7925/mt7925.h
drivers/net/wireless/mediatek/mt76/mt7925/pci.c

index 3f48ae80aed46e6057df54edc2a5eec235b30c8f..105ba5d0934ca4b5f75c719309baa16a4f425315 100644 (file)
@@ -59,6 +59,18 @@ static int mt7925_thermal_init(struct mt792x_phy *phy)
                                                       mt7925_hwmon_groups);
        return PTR_ERR_OR_ZERO(hwmon);
 }
+
+void mt7925_regd_update(struct mt792x_dev *dev)
+{
+       struct mt76_dev *mdev = &dev->mt76;
+       struct ieee80211_hw *hw = mdev->hw;
+
+       mt7925_mcu_set_clc(dev, mdev->alpha2, dev->country_ie_env);
+       mt7925_mcu_set_channel_domain(hw->priv);
+       mt7925_set_tx_sar_pwr(hw, NULL);
+}
+EXPORT_SYMBOL_GPL(mt7925_regd_update);
+
 static void
 mt7925_regd_notifier(struct wiphy *wiphy,
                     struct regulatory_request *req)
@@ -66,6 +78,7 @@ mt7925_regd_notifier(struct wiphy *wiphy,
        struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
        struct mt792x_dev *dev = mt792x_hw_dev(hw);
        struct mt76_dev *mdev = &dev->mt76;
+       struct mt76_connac_pm *pm = &dev->pm;
 
        /* allow world regdom at the first boot only */
        if (!memcmp(req->alpha2, "00", 2) &&
@@ -81,11 +94,12 @@ mt7925_regd_notifier(struct wiphy *wiphy,
        mdev->region = req->dfs_region;
        dev->country_ie_env = req->country_ie_env;
 
+       if (pm->suspended)
+               return;
+
        dev->regd_in_progress = true;
        mt792x_mutex_acquire(dev);
-       mt7925_mcu_set_clc(dev, req->alpha2, req->country_ie_env);
-       mt7925_mcu_set_channel_domain(hw->priv);
-       mt7925_set_tx_sar_pwr(hw, NULL);
+       mt7925_regd_update(dev);
        mt792x_mutex_release(dev);
        dev->regd_in_progress = false;
        wake_up(&dev->wait);
index c83b8a2104985c37c93ef013f5036d645a121dac..76f31abe91461b1ec7b53fe7c9edf38e12d3087c 100644 (file)
@@ -218,6 +218,7 @@ int mt7925_mcu_chip_config(struct mt792x_dev *dev, const char *cmd);
 int mt7925_mcu_set_rxfilter(struct mt792x_dev *dev, u32 fif,
                            u8 bit_op, u32 bit_map);
 
+void mt7925_regd_update(struct mt792x_dev *dev);
 int mt7925_mac_init(struct mt792x_dev *dev);
 int mt7925_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
                       struct ieee80211_sta *sta);
index b4cc5607e0d6b1efad4f446ab4d898cf82ccd57b..ccb663bd9f5280a43a9f8610e4da0f81b7284e7f 100644 (file)
@@ -554,11 +554,14 @@ static int mt7925_pci_resume(struct device *device)
        local_bh_enable();
 
        err = mt76_connac_mcu_set_hif_suspend(mdev, false);
+       if (err < 0)
+               goto failed;
 
        /* restore previous ds setting */
        if (!pm->ds_enable)
                mt7925_mcu_set_deep_sleep(dev, false);
 
+       mt7925_regd_update(dev);
 failed:
        pm->suspended = false;