OSDN Git Service

mt76: mt7921: introduce dedicated control for deep_sleep
authorLorenzo Bianconi <lorenzo@kernel.org>
Sat, 12 Jun 2021 14:49:30 +0000 (16:49 +0200)
committerFelix Fietkau <nbd@nbd.name>
Sat, 19 Jun 2021 07:22:50 +0000 (09:22 +0200)
Introduce ds_enable switch to fully control fw deep_sleep capability

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76_connac.h
drivers/net/wireless/mediatek/mt76/mt7921/debugfs.c
drivers/net/wireless/mediatek/mt76/mt7921/init.c
drivers/net/wireless/mediatek/mt76/mt7921/main.c
drivers/net/wireless/mediatek/mt76/mt7921/pci.c

index 9b3f8d2..93a37ed 100644 (file)
@@ -46,6 +46,7 @@ enum {
 
 struct mt76_connac_pm {
        bool enable;
+       bool ds_enable;
        bool suspended;
 
        spinlock_t txq_lock;
index c8cba18..77468bd 100644 (file)
@@ -251,7 +251,7 @@ mt7921_pm_set(void *data, u64 val)
                                            IEEE80211_IFACE_ITER_RESUME_ALL,
                                            mt7921_pm_interface_iter, mphy->priv);
 
-       mt76_connac_mcu_set_deep_sleep(&dev->mt76, !!pm->enable);
+       mt76_connac_mcu_set_deep_sleep(&dev->mt76, pm->ds_enable);
 
        mt7921_mutex_release(dev);
 
@@ -274,15 +274,31 @@ static int
 mt7921_deep_sleep_set(void *data, u64 val)
 {
        struct mt7921_dev *dev = data;
+       struct mt76_connac_pm *pm = &dev->pm;
+       bool enable = !!val;
 
        mt7921_mutex_acquire(dev);
-       mt76_connac_mcu_set_deep_sleep(&dev->mt76, !!val);
+       if (pm->ds_enable != enable) {
+               mt76_connac_mcu_set_deep_sleep(&dev->mt76, enable);
+               pm->ds_enable = enable;
+       }
        mt7921_mutex_release(dev);
 
        return 0;
 }
 
-DEFINE_DEBUGFS_ATTRIBUTE(fops_ds, NULL, mt7921_deep_sleep_set, "%lld\n");
+static int
+mt7921_deep_sleep_get(void *data, u64 *val)
+{
+       struct mt7921_dev *dev = data;
+
+       *val = dev->pm.ds_enable;
+
+       return 0;
+}
+
+DEFINE_DEBUGFS_ATTRIBUTE(fops_ds, mt7921_deep_sleep_get,
+                        mt7921_deep_sleep_set, "%lld\n");
 
 static int
 mt7921_pm_stats(struct seq_file *s, void *data)
index aca057c..9925c15 100644 (file)
@@ -201,6 +201,7 @@ int mt7921_register_device(struct mt7921_dev *dev)
        dev->pm.stats.last_wake_event = jiffies;
        dev->pm.stats.last_doze_event = jiffies;
        dev->pm.enable = true;
+       dev->pm.ds_enable = true;
 
        ret = mt7921_init_hardware(dev);
        if (ret)
@@ -235,7 +236,7 @@ int mt7921_register_device(struct mt7921_dev *dev)
        if (ret)
                return ret;
 
-       return mt76_connac_mcu_set_deep_sleep(&dev->mt76, dev->pm.enable);
+       return mt76_connac_mcu_set_deep_sleep(&dev->mt76, dev->pm.ds_enable);
 }
 
 void mt7921_unregister_device(struct mt7921_dev *dev)
index 6fd5c86..0fb152a 100644 (file)
@@ -820,7 +820,7 @@ static int mt7921_sta_state(struct ieee80211_hw *hw,
 {
        struct mt7921_dev *dev = mt7921_hw_dev(hw);
 
-       if (dev->pm.enable) {
+       if (dev->pm.ds_enable) {
                mt7921_mutex_acquire(dev);
                mt76_connac_sta_state_dp(&dev->mt76, old_state, new_state);
                mt7921_mutex_release(dev);
index 27906b2..c3905bc 100644 (file)
@@ -208,8 +208,10 @@ static int mt7921_pci_suspend(struct pci_dev *pdev, pm_message_t state)
                        goto restore_suspend;
        }
 
-       if (!pm->enable)
-               mt76_connac_mcu_set_deep_sleep(&dev->mt76, true);
+       /* always enable deep sleep during suspend to reduce
+        * power consumption
+        */
+       mt76_connac_mcu_set_deep_sleep(&dev->mt76, true);
 
        napi_disable(&mdev->tx_napi);
        mt76_worker_disable(&mdev->tx_worker);
@@ -252,7 +254,7 @@ restore_napi:
        }
        napi_enable(&mdev->tx_napi);
 
-       if (!pm->enable)
+       if (!pm->ds_enable)
                mt76_connac_mcu_set_deep_sleep(&dev->mt76, false);
 
        if (hif_suspend)
@@ -268,9 +270,10 @@ static int mt7921_pci_resume(struct pci_dev *pdev)
 {
        struct mt76_dev *mdev = pci_get_drvdata(pdev);
        struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76);
+       struct mt76_connac_pm *pm = &dev->pm;
        int i, err;
 
-       dev->pm.suspended = false;
+       pm->suspended = false;
        err = pci_set_power_state(pdev, PCI_D0);
        if (err)
                return err;
@@ -301,7 +304,8 @@ static int mt7921_pci_resume(struct pci_dev *pdev)
        napi_enable(&mdev->tx_napi);
        napi_schedule(&mdev->tx_napi);
 
-       if (!dev->pm.enable)
+       /* restore previous ds setting */
+       if (!pm->ds_enable)
                mt76_connac_mcu_set_deep_sleep(&dev->mt76, false);
 
        if (!test_bit(MT76_STATE_SUSPEND, &dev->mphy.state))