improve runtime-pm support for mt7663/mt7921
Subsystems (2)
Lorenzo Bianconi
maintainercover improve runtime-pm support for mt7663/mt7921
This is the second series to fix/improve runtime-pm support for mt7663/mt7921 chipsets.
This series is based on the series below:
https://patchwork.kernel.org/project/linux-wireless/list/?series=469235
Lorenzo Bianconi (3):
mt76: mt7921: improve doze opportunity
mt76: mt7663: add awake and doze time accounting
mt76: connac: unschedule mac_work before going to sleep
Sean Wang (1):
mt76: mt7921: mt7921_stop should put device in fw_own state
.../wireless/mediatek/mt76/mt7615/debugfs.c | 32 ++++++++++++++++++- .../net/wireless/mediatek/mt76/mt7615/init.c | 2 ++ .../net/wireless/mediatek/mt76/mt7615/mac.c | 2 ++ .../net/wireless/mediatek/mt76/mt7615/mcu.c | 24 +++++++++++--- .../wireless/mediatek/mt76/mt76_connac_mac.c | 6 ++-- .../net/wireless/mediatek/mt76/mt7921/mac.c | 6 ++-- .../wireless/mediatek/mt76/mt7921/mt7921.h | 2 +- 7 files changed, 63 insertions(+), 11 deletions(-)
Signature · 1 line
2.30.2
Lorenzo Bianconi
maintainerPATCH 1/4 mt76: mt7921: improve doze opportunity
Increase mt7921 mac work timeout in oder to have move sleep opportunities
--- drivers/net/wireless/mediatek/mt76/mt7921/mac.c | 4 ++-- drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7921/mac.c +2 -2
@@ -1461,12 +1461,12 @@ void mt7921_mac_work(struct work_struct *work)mt7921_mutex_acquire (phy->dev);mt76_update_survey (mphy->dev); -if (++mphy->mac_work_count ==5 ) { +if (++mphy->mac_work_count ==2 ) { mphy->mac_work_count =0 ;mt7921_mac_update_mib_stats (phy); } -if (++phy->sta_work_count ==10 ) { +if (++phy->sta_work_count ==4 ) { phy->sta_work_count =0 ;mt7921_mac_sta_stats_work (phy); }
drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h +1 -1
@@ -18,7 +18,7 @@#define MT7921_PM_TIMEOUT (HZ / 12)#define MT7921_HW_SCAN_TIMEOUT (HZ / 10) -#define MT7921_WATCHDOG_TIME (HZ / 10) +#define MT7921_WATCHDOG_TIME (HZ / 4)#define MT7921_RESET_TIMEOUT (30 * HZ)#define MT7921_TX_RING_SIZE 2048
Signature · 1 line
2.30.2
Lorenzo Bianconi
maintainerPATCH 2/4 mt76: mt7663: add awake and doze time accounting
In reply to Lorenzo BianconiSimilar to mt7921, introduce awake and doze time accounting for runtime pm.
--- .../wireless/mediatek/mt76/mt7615/debugfs.c | 32 ++++++++++++++++++- .../net/wireless/mediatek/mt76/mt7615/init.c | 2 ++ .../net/wireless/mediatek/mt76/mt7615/mcu.c | 24 +++++++++++--- 3 files changed, 52 insertions(+), 6 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/debugfs.c +31 -1
@@ -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);
@@ -103,6 +111,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) {
@@ -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);
drivers/net/wireless/mediatek/mt76/mt7615/init.c +2 -0
@@ -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 ;
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +19 -5
@@ -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 @@ static int mt7615_mcu_lp_drv_pmctrl(struct mt7615_dev *dev)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; }
Signature · 1 line
2.30.2
Lorenzo Bianconi
maintainerPATCH 3/4 mt76: connac: unschedule mac_work before going to sleep
In reply to Lorenzo BianconiIn order to wake the device less frequently and so reduce power consumpation, unschedule mac_work before going to sleep
--- drivers/net/wireless/mediatek/mt76/mt7615/mac.c | 2 ++ drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c | 4 +++- drivers/net/wireless/mediatek/mt76/mt7921/mac.c | 2 ++ 3 files changed, 7 insertions(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +2 -0
@@ -1912,6 +1912,8 @@ void mt7615_pm_wake_work(struct work_struct *work)napi_schedule (&dev->mt76.napi[i]);mt76_connac_pm_dequeue_skbs (mphy, &dev->pm);mt76_queue_tx_cleanup (dev, dev->mt76.q_mcu[MT_MCUQ_WM ], false); +ieee80211_queue_delayed_work (mphy->hw, &mphy->mac_work, +MT7615_WATCHDOG_TIME ); }ieee80211_wake_queues (mphy->hw);
drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c +3 -1
@@ -42,8 +42,10 @@ void mt76_connac_power_save_sched(struct mt76_phy *phy, pm->last_activity = jiffies; -if (!test_bit (MT76_STATE_PM , &phy->state)) +if (!test_bit (MT76_STATE_PM , &phy->state)) { +cancel_delayed_work (&phy->mac_work);queue_delayed_work (dev->wq, &pm->ps_work, pm->idle_timeout); + } }EXPORT_SYMBOL_GPL (mt76_connac_power_save_sched);
drivers/net/wireless/mediatek/mt76/mt7921/mac.c +2 -0
@@ -1492,6 +1492,8 @@ void mt7921_pm_wake_work(struct work_struct *work)napi_schedule (&dev->mt76.napi[i]);mt76_connac_pm_dequeue_skbs (mphy, &dev->pm);mt7921_tx_cleanup (dev); +ieee80211_queue_delayed_work (mphy->hw, &mphy->mac_work, +MT7921_WATCHDOG_TIME ); }ieee80211_wake_queues (mphy->hw);
Signature · 1 line
2.30.2
Lorenzo Bianconi
maintainerPATCH 4/4 mt76: mt7921: mt7921_stop should put device in fw_own state
In reply to Lorenzo BianconiFrom: Sean Wang <[email protected]>
mt7921_stop should put device in fw_own state to reduce power consumption.
--- drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c +1 -1
@@ -37,7 +37,7 @@ void mt76_connac_power_save_sched(struct mt76_phy *phy,if (!mt76_is_mmio (dev))return ; -if (!pm->enable || !test_bit (MT76_STATE_RUNNING , &phy->state)) +if (!pm->enable)return ; pm->last_activity = jiffies;
Signature · 1 line
2.30.2