Commit a0f721b8 authored by Quan Zhou's avatar Quan Zhou Committed by Felix Fietkau
Browse files

wifi: mt76: mt7925: fix CLC command timeout when suspend/resume



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: default avatarQuan Zhou <quan.zhou@mediatek.com>
Link: https://patch.msgid.link/bab00a2805d0533fd8beaa059222659858a9dcb5.1735910455.git.quan.zhou@mediatek.com


Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent 1b97fc84
Loading
Loading
Loading
Loading
+17 −3
Original line number Diff line number Diff line
@@ -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);
+1 −0
Original line number Diff line number Diff line
@@ -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);
+3 −0
Original line number Diff line number Diff line
@@ -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;