mt76: mt7615: do not request {driver,fw}_own if already granted
authorLorenzo Bianconi <lorenzo@kernel.org>
Fri, 3 Jul 2020 08:15:57 +0000 (10:15 +0200)
committerFelix Fietkau <nbd@nbd.name>
Tue, 21 Jul 2020 17:01:17 +0000 (19:01 +0200)
Check MT76_STATE_PM in mt7615_driver_own/mt7615_firmware_own
in order to not requested power ownership if it is already granted

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

index 02a82cd848c400e144a507e80962dd23b5780fd4..b3f0e2cae040321c6f4aa780e7133a1d025bd218 100644 (file)
@@ -442,6 +442,7 @@ void mt7615_init_device(struct mt7615_dev *dev)
        INIT_WORK(&dev->pm.wake_work, mt7615_pm_wake_work);
        init_completion(&dev->pm.wake_cmpl);
        spin_lock_init(&dev->pm.txq_lock);
+       set_bit(MT76_STATE_PM, &dev->mphy.state);
        INIT_DELAYED_WORK(&dev->phy.mac_work, mt7615_mac_work);
        INIT_DELAYED_WORK(&dev->phy.scan_work, mt7615_scan_work);
        skb_queue_head_init(&dev->phy.scan_event_list);
index 72cfc197b93610332e9d869a837587c9488ef1d7..6118c2eeece867a36ca91367fbc1c6ed5340b8ce 100644 (file)
@@ -1894,6 +1894,9 @@ int mt7615_driver_own(struct mt7615_dev *dev)
        int err = 0;
        u32 addr;
 
+       if (!test_and_clear_bit(MT76_STATE_PM, &mphy->state))
+               goto out;
+
        mt7622_trigger_hif_int(dev, true);
 
        addr = is_mt7663(mdev) ? MT_PCIE_DOORBELL_PUSH : MT_CFG_LPCR_HOST;
@@ -1901,15 +1904,13 @@ int mt7615_driver_own(struct mt7615_dev *dev)
 
        addr = is_mt7663(mdev) ? MT_CONN_HIF_ON_LPCTL : MT_CFG_LPCR_HOST;
        if (!mt76_poll_msec(dev, addr, MT_CFG_LPCR_HOST_FW_OWN, 0, 3000)) {
-               dev_err(dev->mt76.dev, "Timeout for driver own\n");
+               dev_err(mdev->dev, "Timeout for driver own\n");
+               set_bit(MT76_STATE_PM, &mphy->state);
                err = -EIO;
-               goto out;
        }
 
-       clear_bit(MT76_STATE_PM, &mphy->state);
-
-out:
        mt7622_trigger_hif_int(dev, false);
+out:
        dev->pm.last_activity = jiffies;
 
        return err;
@@ -1922,22 +1923,22 @@ int mt7615_firmware_own(struct mt7615_dev *dev)
        int err = 0;
        u32 addr;
 
-       addr = is_mt7663(&dev->mt76) ? MT_CONN_HIF_ON_LPCTL : MT_CFG_LPCR_HOST;
+       if (test_and_set_bit(MT76_STATE_PM, &mphy->state))
+               return 0;
+
        mt7622_trigger_hif_int(dev, true);
 
+       addr = is_mt7663(&dev->mt76) ? MT_CONN_HIF_ON_LPCTL : MT_CFG_LPCR_HOST;
        mt76_wr(dev, addr, MT_CFG_LPCR_HOST_FW_OWN);
 
        if (is_mt7622(&dev->mt76) &&
            !mt76_poll_msec(dev, addr, MT_CFG_LPCR_HOST_FW_OWN,
                            MT_CFG_LPCR_HOST_FW_OWN, 300)) {
                dev_err(dev->mt76.dev, "Timeout for firmware own\n");
+               clear_bit(MT76_STATE_PM, &mphy->state);
                err = -EIO;
-               goto out;
        }
 
-       set_bit(MT76_STATE_PM, &mphy->state);
-
-out:
        mt7622_trigger_hif_int(dev, false);
 
        return err;
index cd709fd617db2fcca54b5842977a14eaa9fbeef8..54885ad97891d5b520f7aa0216dfcac52f415f0c 100644 (file)
@@ -60,6 +60,8 @@ int mt7663u_mcu_init(struct mt7615_dev *dev)
 
        dev->mt76.mcu_ops = &mt7663u_mcu_ops,
 
+       /* usb does not support runtime-pm */
+       clear_bit(MT76_STATE_PM, &dev->mphy.state);
        mt76_set(dev, MT_UDMA_TX_QSEL, MT_FW_DL_EN);
 
        if (test_and_clear_bit(MT76_STATE_POWER_OFF, &dev->mphy.state)) {