wifi: mt76: mt792x: fix scheduler interference in drv own process
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>
This commit is contained in:
committed by
Felix Fietkau
parent
86c051f2c4
commit
d53ab629cf
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user