Message ID | 20240515015155.24931-1-mingyen.hsieh@mediatek.com |
---|---|
State | New |
Headers | show |
Series | wifi: mt76: mt792x: fix scheduler interference in drv own process | expand |
Hi, Mingyen On Tue, May 14, 2024 at 6:52 PM Mingyen Hsieh <mingyen.hsieh@mediatek.com> wrote: > > From: Michael Lo <michael.lo@mediatek.com> > > 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> > --- > drivers/net/wireless/mediatek/mt76/mt7921/pci.c | 3 +++ > drivers/net/wireless/mediatek/mt76/mt7925/pci.c | 3 +++ > drivers/net/wireless/mediatek/mt76/mt792x.h | 1 + > drivers/net/wireless/mediatek/mt76/mt792x_core.c | 6 ++++++ > 4 files changed, 13 insertions(+) > > diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c > index f768e9389ac6..0f7d5a92f3d0 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c > +++ b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c > @@ -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) > + dev->disable_aspm = true; > + > ret = mt792xe_mcu_fw_pmctrl(dev); > if (ret) > goto err_free_dev; > diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/pci.c b/drivers/net/wireless/mediatek/mt76/mt7925/pci.c > index 07b74d492ce1..e7039e312538 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt7925/pci.c > +++ b/drivers/net/wireless/mediatek/mt76/mt7925/pci.c > @@ -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) > + dev->disable_aspm = true; > + > ret = __mt792x_mcu_fw_pmctrl(dev); > if (ret) > goto err_free_dev; > diff --git a/drivers/net/wireless/mediatek/mt76/mt792x.h b/drivers/net/wireless/mediatek/mt76/mt792x.h > index 20578497a405..8f913336a668 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt792x.h > +++ b/drivers/net/wireless/mediatek/mt76/mt792x.h > @@ -190,6 +190,7 @@ struct mt792x_dev { > bool fw_assert:1; > bool has_eht:1; > bool regd_in_progress:1; > + bool disable_aspm:1; > wait_queue_head_t wait; > > struct work_struct init_work; > diff --git a/drivers/net/wireless/mediatek/mt76/mt792x_core.c b/drivers/net/wireless/mediatek/mt76/mt792x_core.c > index a405af8d9052..a11e5438a36e 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt792x_core.c > +++ b/drivers/net/wireless/mediatek/mt76/mt792x_core.c > @@ -766,6 +766,12 @@ 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->disable_aspm) { > + /* wait for LP engine to complete its operation */ > + usleep_range(2000, 3000); > + } > + I think we can reduce the extra delay on platforms that don't support ASPM. Basically, if the platform doesn't support ASPM, we can get rid of the wait. > if (mt76_poll_msec_tick(dev, MT_CONN_ON_LPCTL, > PCIE_LPCR_HOST_OWN_SYNC, 0, 50, 1)) > break; > -- > 2.25.1 > >
diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c index f768e9389ac6..0f7d5a92f3d0 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c +++ b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c @@ -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) + dev->disable_aspm = true; + ret = mt792xe_mcu_fw_pmctrl(dev); if (ret) goto err_free_dev; diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/pci.c b/drivers/net/wireless/mediatek/mt76/mt7925/pci.c index 07b74d492ce1..e7039e312538 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7925/pci.c +++ b/drivers/net/wireless/mediatek/mt76/mt7925/pci.c @@ -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) + dev->disable_aspm = true; + ret = __mt792x_mcu_fw_pmctrl(dev); if (ret) goto err_free_dev; diff --git a/drivers/net/wireless/mediatek/mt76/mt792x.h b/drivers/net/wireless/mediatek/mt76/mt792x.h index 20578497a405..8f913336a668 100644 --- a/drivers/net/wireless/mediatek/mt76/mt792x.h +++ b/drivers/net/wireless/mediatek/mt76/mt792x.h @@ -190,6 +190,7 @@ struct mt792x_dev { bool fw_assert:1; bool has_eht:1; bool regd_in_progress:1; + bool disable_aspm:1; wait_queue_head_t wait; struct work_struct init_work; diff --git a/drivers/net/wireless/mediatek/mt76/mt792x_core.c b/drivers/net/wireless/mediatek/mt76/mt792x_core.c index a405af8d9052..a11e5438a36e 100644 --- a/drivers/net/wireless/mediatek/mt76/mt792x_core.c +++ b/drivers/net/wireless/mediatek/mt76/mt792x_core.c @@ -766,6 +766,12 @@ 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->disable_aspm) { + /* wait for LP engine to complete its operation */ + usleep_range(2000, 3000); + } + if (mt76_poll_msec_tick(dev, MT_CONN_ON_LPCTL, PCIE_LPCR_HOST_OWN_SYNC, 0, 50, 1)) break;