[PATCH] wifi: mt76: mt792x: fix scheduler interference in drv own process
Sean Wang
sean.wang at kernel.org
Wed May 15 16:26:45 PDT 2024
Hi, Mingyen
On Tue, May 14, 2024 at 6:52 PM Mingyen Hsieh
<mingyen.hsieh at mediatek.com> wrote:
>
> From: Michael Lo <michael.lo at 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 at mediatek.com>
> Signed-off-by: Ming Yen Hsieh <mingyen.hsieh at 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
>
>
More information about the Linux-mediatek
mailing list