2022-04-20 12:07:21

by Ping-Ke Shih

[permalink] [raw]
Subject: [PATCH 2/2] rtw88: pci: 8821c: Disable 21ce completion timeout

From: Po-Hao Huang <[email protected]>

Disable this capability to avoid timeout errors on certain platforms.
Without it, pci bus might stuck and leads to disconnection.

Signed-off-by: Po-Hao Huang <[email protected]>
Signed-off-by: Ping-Ke Shih <[email protected]>
---
drivers/net/wireless/realtek/rtw88/pci.c | 12 ++++++++++++
1 file changed, 12 insertions(+)

diff --git a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/realtek/rtw88/pci.c
index 33042b63a151e..3ef0de70af328 100644
--- a/drivers/net/wireless/realtek/rtw88/pci.c
+++ b/drivers/net/wireless/realtek/rtw88/pci.c
@@ -1482,12 +1482,15 @@ static void rtw_pci_interface_cfg(struct rtw_dev *rtwdev)

static void rtw_pci_phy_cfg(struct rtw_dev *rtwdev)
{
+ struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv;
struct rtw_chip_info *chip = rtwdev->chip;
+ struct pci_dev *pdev = rtwpci->pdev;
const struct rtw_intf_phy_para *para;
u16 cut;
u16 value;
u16 offset;
int i;
+ int ret;

cut = BIT(0) << rtwdev->hal.cut_version;

@@ -1520,6 +1523,15 @@ static void rtw_pci_phy_cfg(struct rtw_dev *rtwdev)
}

rtw_pci_link_cfg(rtwdev);
+
+ /* Disable 8821ce completion timeout by default */
+ if (chip->id == RTW_CHIP_TYPE_8821C) {
+ ret = pcie_capability_set_word(pdev, PCI_EXP_DEVCTL2,
+ PCI_EXP_DEVCTL2_COMP_TMOUT_DIS);
+ if (ret)
+ rtw_err(rtwdev, "failed to set PCI cap, ret = %d\n",
+ ret);
+ }
}

static int __maybe_unused rtw_pci_suspend(struct device *dev)
--
2.25.1


2022-04-21 08:10:50

by Chris Chiu

[permalink] [raw]
Subject: Re: [PATCH 2/2] rtw88: pci: 8821c: Disable 21ce completion timeout


On 2022/4/20 17:30, Ping-Ke Shih wrote:
> From: Po-Hao Huang <[email protected]>
>
> Disable this capability to avoid timeout errors on certain platforms.
> Without it, pci bus might stuck and leads to disconnection.
>
> Signed-off-by: Po-Hao Huang <[email protected]>
> Signed-off-by: Ping-Ke Shih <[email protected]>
> ---

Tested-by: Chris Chiu <[email protected]>

> drivers/net/wireless/realtek/rtw88/pci.c | 12 ++++++++++++
> 1 file changed, 12 insertions(+)
>
> diff --git a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/realtek/rtw88/pci.c
> index 33042b63a151e..3ef0de70af328 100644
> --- a/drivers/net/wireless/realtek/rtw88/pci.c
> +++ b/drivers/net/wireless/realtek/rtw88/pci.c
> @@ -1482,12 +1482,15 @@ static void rtw_pci_interface_cfg(struct rtw_dev *rtwdev)
>
> static void rtw_pci_phy_cfg(struct rtw_dev *rtwdev)
> {
> + struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv;
> struct rtw_chip_info *chip = rtwdev->chip;
> + struct pci_dev *pdev = rtwpci->pdev;
> const struct rtw_intf_phy_para *para;
> u16 cut;
> u16 value;
> u16 offset;
> int i;
> + int ret;
>
> cut = BIT(0) << rtwdev->hal.cut_version;
>
> @@ -1520,6 +1523,15 @@ static void rtw_pci_phy_cfg(struct rtw_dev *rtwdev)
> }
>
> rtw_pci_link_cfg(rtwdev);
> +
> + /* Disable 8821ce completion timeout by default */
> + if (chip->id == RTW_CHIP_TYPE_8821C) {
> + ret = pcie_capability_set_word(pdev, PCI_EXP_DEVCTL2,
> + PCI_EXP_DEVCTL2_COMP_TMOUT_DIS);
> + if (ret)
> + rtw_err(rtwdev, "failed to set PCI cap, ret = %d\n",
> + ret);
> + }
> }
>
> static int __maybe_unused rtw_pci_suspend(struct device *dev)