]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: mt76: mt792x: fix scheduler interference in drv own process
authorMichael Lo <michael.lo@mediatek.com>
Thu, 23 May 2024 11:21:31 +0000 (19:21 +0800)
committerFelix Fietkau <nbd@nbd.name>
Tue, 9 Jul 2024 21:02:10 +0000 (23:02 +0200)
Add some time to wait for LP engine to complete its operation
before polling pmctrl register.

Signed-off-by: Michael Lo <michael.lo@mediatek.com>
Signed-off-by: Ming Yen Hsieh <mingyen.hsieh@mediatek.com>
Tested-by: David Ruth <druth@chromium.org>
Acked-by: Sean Wang <sean.wang@mediatek.com>
Link: https://patch.msgid.link/20240523112131.31437-1-mingyen.hsieh@mediatek.com
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76.h
drivers/net/wireless/mediatek/mt76/mt7921/pci.c
drivers/net/wireless/mediatek/mt76/mt7925/pci.c
drivers/net/wireless/mediatek/mt76/mt792x.h
drivers/net/wireless/mediatek/mt76/mt792x_core.c
drivers/net/wireless/mediatek/mt76/pci.c

index 5f8773364d51b5017cebf25f5eb7d130d51b2ae1..4a58a78d5ed25d07dba95b4ba0fe7c6c2b43a566 100644 (file)
@@ -1085,6 +1085,7 @@ bool ____mt76_poll_msec(struct mt76_dev *dev, u32 offset, u32 mask, u32 val,
 
 void mt76_mmio_init(struct mt76_dev *dev, void __iomem *regs);
 void mt76_pci_disable_aspm(struct pci_dev *pdev);
+bool mt76_pci_aspm_supported(struct pci_dev *pdev);
 
 static inline u16 mt76_chip(struct mt76_dev *dev)
 {
index e75e7b6d3aaf5e8b2449274129cb1407f1efff8a..a7430216a80df0857e1385b108aa962ad29f93aa 100644 (file)
@@ -339,6 +339,9 @@ static int mt7921_pci_probe(struct pci_dev *pdev,
        bus_ops->rmw = mt7921_rmw;
        dev->mt76.bus = bus_ops;
 
+       if (!mt7921_disable_aspm && mt76_pci_aspm_supported(pdev))
+               dev->aspm_supported = true;
+
        ret = mt792xe_mcu_fw_pmctrl(dev);
        if (ret)
                goto err_free_dev;
index 577574fb7a1ee84d35fe451bf7764da153119bb3..6e4f4e78c3505dc956a2321d5eb078a191317f6d 100644 (file)
@@ -373,6 +373,9 @@ static int mt7925_pci_probe(struct pci_dev *pdev,
        bus_ops->rmw = mt7925_rmw;
        dev->mt76.bus = bus_ops;
 
+       if (!mt7925_disable_aspm && mt76_pci_aspm_supported(pdev))
+               dev->aspm_supported = true;
+
        ret = __mt792x_mcu_fw_pmctrl(dev);
        if (ret)
                goto err_free_dev;
index 30635aeba363a15e5c81d66e5c20d29cad071d72..7fa74d59cc48f8356af597bd7d965cc66093ac35 100644 (file)
@@ -215,6 +215,7 @@ struct mt792x_dev {
        bool fw_assert:1;
        bool has_eht:1;
        bool regd_in_progress:1;
+       bool aspm_supported:1;
        wait_queue_head_t wait;
 
        struct work_struct init_work;
index ae2ac146a7f7a777698c10cea0025badb2c9571d..78fe37c2e07b5910b3538d44dd6ba58adc64a6a0 100644 (file)
@@ -809,6 +809,10 @@ int __mt792xe_mcu_drv_pmctrl(struct mt792x_dev *dev)
 
        for (i = 0; i < MT792x_DRV_OWN_RETRY_COUNT; i++) {
                mt76_wr(dev, MT_CONN_ON_LPCTL, PCIE_LPCR_HOST_CLR_OWN);
+
+               if (dev->aspm_supported)
+                       usleep_range(2000, 3000);
+
                if (mt76_poll_msec_tick(dev, MT_CONN_ON_LPCTL,
                                        PCIE_LPCR_HOST_OWN_SYNC, 0, 50, 1))
                        break;
index 4c1c159fbb62fc4b43f75ef9e73c0dcd91043dfe..b5031ca7f73fb83928e80ccb8bd8b5f4b70c7eed 100644 (file)
@@ -45,3 +45,26 @@ void mt76_pci_disable_aspm(struct pci_dev *pdev)
                                           aspm_conf);
 }
 EXPORT_SYMBOL_GPL(mt76_pci_disable_aspm);
+
+bool mt76_pci_aspm_supported(struct pci_dev *pdev)
+{
+       struct pci_dev *parent = pdev->bus->self;
+       u16 aspm_conf, parent_aspm_conf = 0;
+       bool result = true;
+
+       pcie_capability_read_word(pdev, PCI_EXP_LNKCTL, &aspm_conf);
+       aspm_conf &= PCI_EXP_LNKCTL_ASPMC;
+       if (parent) {
+               pcie_capability_read_word(parent, PCI_EXP_LNKCTL,
+                                         &parent_aspm_conf);
+               parent_aspm_conf &= PCI_EXP_LNKCTL_ASPMC;
+       }
+
+       if (!aspm_conf && (!parent || !parent_aspm_conf)) {
+               /* aspm already disabled */
+               result = false;
+       }
+
+       return result;
+}
+EXPORT_SYMBOL_GPL(mt76_pci_aspm_supported);