2024-05-15 01:52:13

by Mingyen Hsieh

[permalink] [raw]
Subject: [PATCH] wifi: mt76: mt792x: fix scheduler interference in drv own process

From: Michael Lo <[email protected]>

Add some time to wait for LP engine to complete its operation
before polling pmctrl register.

Signed-off-by: Michael Lo <[email protected]>
Signed-off-by: Ming Yen Hsieh <[email protected]>
---
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);
+ }
+
if (mt76_poll_msec_tick(dev, MT_CONN_ON_LPCTL,
PCIE_LPCR_HOST_OWN_SYNC, 0, 50, 1))
break;
--
2.25.1



2024-05-15 23:27:09

by Sean Wang

[permalink] [raw]
Subject: Re: [PATCH] wifi: mt76: mt792x: fix scheduler interference in drv own process

Hi, Mingyen

On Tue, May 14, 2024 at 6:52 PM Mingyen Hsieh
<[email protected]> wrote:
>
> From: Michael Lo <[email protected]>
>
> Add some time to wait for LP engine to complete its operation
> before polling pmctrl register.
>
> Signed-off-by: Michael Lo <[email protected]>
> Signed-off-by: Ming Yen Hsieh <[email protected]>
> ---
> 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
>
>