]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: mt76: mt7925: fix CLC command timeout when suspend/resume
authorQuan Zhou <quan.zhou@mediatek.com>
Fri, 3 Jan 2025 13:39:43 +0000 (21:39 +0800)
committerFelix Fietkau <nbd@nbd.name>
Tue, 14 Jan 2025 12:42:30 +0000 (13:42 +0100)
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>
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 34b6adc5ea0e63cc9932fd3520950f548f686e22..f6f8ab38d5aa648911fbd9737b00fa7f0bb49dcb 100644 (file)
@@ -57,6 +57,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)
@@ -64,6 +76,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) &&
@@ -79,11 +92,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 df3c705d1cb3fa42dd55c6dd3134cb30d93ea9b3..a7325ec13c70e1db76fef0d73d2610d90ad606b9 100644 (file)
@@ -215,6 +215,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 4986aaccc75381e4ed117aa1b0e5f3a072da44cb..5c9282b7652279f48455c5e582fad65dceb817ec 100644 (file)
@@ -557,11 +557,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;