OSDN Git Service

mt76: mt7663: add awake and doze time accounting
authorLorenzo Bianconi <lorenzo@kernel.org>
Wed, 21 Apr 2021 10:43:49 +0000 (12:43 +0200)
committerFelix Fietkau <nbd@nbd.name>
Wed, 21 Apr 2021 18:55:55 +0000 (20:55 +0200)
Similar to mt7921, introduce awake and doze time accounting
for runtime pm.

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7615/debugfs.c
drivers/net/wireless/mediatek/mt76/mt7615/init.c
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c

index 1b41422..676bb22 100644 (file)
@@ -69,6 +69,7 @@ static int
 mt7615_pm_set(void *data, u64 val)
 {
        struct mt7615_dev *dev = data;
+       struct mt76_connac_pm *pm = &dev->pm;
        int ret = 0;
 
        if (!mt7615_wait_for_mcu_init(dev))
@@ -77,6 +78,9 @@ mt7615_pm_set(void *data, u64 val)
        if (!mt7615_firmware_offload(dev) || !mt76_is_mmio(&dev->mt76))
                return -EOPNOTSUPP;
 
+       if (val == pm->enable)
+               return 0;
+
        mt7615_mutex_acquire(dev);
 
        if (dev->phy.n_beacon_vif) {
@@ -84,7 +88,11 @@ mt7615_pm_set(void *data, u64 val)
                goto out;
        }
 
-       dev->pm.enable = val;
+       if (!pm->enable) {
+               pm->stats.last_wake_event = jiffies;
+               pm->stats.last_doze_event = jiffies;
+       }
+       pm->enable = val;
 out:
        mt7615_mutex_release(dev);
 
@@ -104,6 +112,26 @@ mt7615_pm_get(void *data, u64 *val)
 DEFINE_DEBUGFS_ATTRIBUTE(fops_pm, mt7615_pm_get, mt7615_pm_set, "%lld\n");
 
 static int
+mt7615_pm_stats(struct seq_file *s, void *data)
+{
+       struct mt7615_dev *dev = dev_get_drvdata(s->private);
+       struct mt76_connac_pm *pm = &dev->pm;
+       unsigned long awake_time = pm->stats.awake_time;
+       unsigned long doze_time = pm->stats.doze_time;
+
+       if (!test_bit(MT76_STATE_PM, &dev->mphy.state))
+               awake_time += jiffies - pm->stats.last_wake_event;
+       else
+               doze_time += jiffies - pm->stats.last_doze_event;
+
+       seq_printf(s, "awake time: %14u\ndoze time: %15u\n",
+                  jiffies_to_msecs(awake_time),
+                  jiffies_to_msecs(doze_time));
+
+       return 0;
+}
+
+static int
 mt7615_pm_idle_timeout_set(void *data, u64 val)
 {
        struct mt7615_dev *dev = data;
@@ -515,6 +543,8 @@ int mt7615_init_debugfs(struct mt7615_dev *dev)
        debugfs_create_file("runtime-pm", 0600, dir, dev, &fops_pm);
        debugfs_create_file("idle-timeout", 0600, dir, dev,
                            &fops_pm_idle_timeout);
+       debugfs_create_devm_seqfile(dev->mt76.dev, "runtime_pm_stats", dir,
+                                   mt7615_pm_stats);
        debugfs_create_devm_seqfile(dev->mt76.dev, "radio", dir,
                                    mt7615_radio_read);
 
index 894b258..86341d1 100644 (file)
@@ -526,6 +526,8 @@ void mt7615_init_device(struct mt7615_dev *dev)
 
        mt7615_init_wiphy(hw);
        dev->pm.idle_timeout = MT7615_PM_TIMEOUT;
+       dev->pm.stats.last_wake_event = jiffies;
+       dev->pm.stats.last_doze_event = jiffies;
        mt7615_cap_dbdc_disable(dev);
        dev->phy.dfs_state = -1;
 
index 45c6fb5..3c1528e 100644 (file)
@@ -288,6 +288,7 @@ EXPORT_SYMBOL_GPL(mt7622_trigger_hif_int);
 static int mt7615_mcu_drv_pmctrl(struct mt7615_dev *dev)
 {
        struct mt76_phy *mphy = &dev->mt76.phy;
+       struct mt76_connac_pm *pm = &dev->pm;
        struct mt76_dev *mdev = &dev->mt76;
        u32 addr;
        int err;
@@ -317,15 +318,20 @@ static int mt7615_mcu_drv_pmctrl(struct mt7615_dev *dev)
 
        clear_bit(MT76_STATE_PM, &mphy->state);
 
+       pm->stats.last_wake_event = jiffies;
+       pm->stats.doze_time += pm->stats.last_wake_event -
+                              pm->stats.last_doze_event;
+
        return 0;
 }
 
 static int mt7615_mcu_lp_drv_pmctrl(struct mt7615_dev *dev)
 {
        struct mt76_phy *mphy = &dev->mt76.phy;
+       struct mt76_connac_pm *pm = &dev->pm;
        int i, err = 0;
 
-       mutex_lock(&dev->pm.mutex);
+       mutex_lock(&pm->mutex);
 
        if (!test_bit(MT76_STATE_PM, &mphy->state))
                goto out;
@@ -344,8 +350,11 @@ static int mt7615_mcu_lp_drv_pmctrl(struct mt7615_dev *dev)
        }
        clear_bit(MT76_STATE_PM, &mphy->state);
 
+       pm->stats.last_wake_event = jiffies;
+       pm->stats.doze_time += pm->stats.last_wake_event -
+                              pm->stats.last_doze_event;
 out:
-       mutex_unlock(&dev->pm.mutex);
+       mutex_unlock(&pm->mutex);
 
        return err;
 }
@@ -353,12 +362,13 @@ out:
 static int mt7615_mcu_fw_pmctrl(struct mt7615_dev *dev)
 {
        struct mt76_phy *mphy = &dev->mt76.phy;
+       struct mt76_connac_pm *pm = &dev->pm;
        int err = 0;
        u32 addr;
 
-       mutex_lock(&dev->pm.mutex);
+       mutex_lock(&pm->mutex);
 
-       if (mt76_connac_skip_fw_pmctrl(mphy, &dev->pm))
+       if (mt76_connac_skip_fw_pmctrl(mphy, pm))
                goto out;
 
        mt7622_trigger_hif_int(dev, true);
@@ -375,8 +385,12 @@ static int mt7615_mcu_fw_pmctrl(struct mt7615_dev *dev)
        }
 
        mt7622_trigger_hif_int(dev, false);
+
+       pm->stats.last_doze_event = jiffies;
+       pm->stats.awake_time += pm->stats.last_doze_event -
+                               pm->stats.last_wake_event;
 out:
-       mutex_unlock(&dev->pm.mutex);
+       mutex_unlock(&pm->mutex);
 
        return err;
 }