2021-07-28 01:44:55

by Ping-Ke Shih

[permalink] [raw]
Subject: [PATCH v2 1/5] rtw88: use read_poll_timeout instead of fixed sleep

From: Chin-Yen Lee <[email protected]>

In current wow flow, driver calls rtw_wow_fw_start and sleep for 100ms,
to wait firmware finish preliminary work and then update the value of
WOWLAN_WAKE_REASON register to zero. But later firmware will start wow
function with power-saving mode, in which mode the value of
WOWLAN_WAKE_REASON register is 0xea. So driver may get 0xea value and
return fail. We use read_poll_timeout instead to check the value to avoid
this issue.

Signed-off-by: Chin-Yen Lee <[email protected]>
Signed-off-by: Ping-Ke Shih <[email protected]>
---
drivers/net/wireless/realtek/rtw88/wow.c | 21 ++++++++++++++++-----
1 file changed, 16 insertions(+), 5 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtw88/wow.c b/drivers/net/wireless/realtek/rtw88/wow.c
index fc9544f4e5e4..bdccfa70dddc 100644
--- a/drivers/net/wireless/realtek/rtw88/wow.c
+++ b/drivers/net/wireless/realtek/rtw88/wow.c
@@ -283,15 +283,26 @@ static void rtw_wow_rx_dma_start(struct rtw_dev *rtwdev)

static int rtw_wow_check_fw_status(struct rtw_dev *rtwdev, bool wow_enable)
{
- /* wait 100ms for wow firmware to finish work */
- msleep(100);
+ int ret;
+ u8 check;
+ u32 check_dis;

if (wow_enable) {
- if (rtw_read8(rtwdev, REG_WOWLAN_WAKE_REASON))
+ ret = read_poll_timeout(rtw_read8, check, !check, 1000,
+ 100000, true, rtwdev,
+ REG_WOWLAN_WAKE_REASON);
+ if (ret)
goto wow_fail;
} else {
- if (rtw_read32_mask(rtwdev, REG_FE1IMR, BIT_FS_RXDONE) ||
- rtw_read32_mask(rtwdev, REG_RXPKT_NUM, BIT_RW_RELEASE))
+ ret = read_poll_timeout(rtw_read32_mask, check_dis,
+ !check_dis, 1000, 100000, true, rtwdev,
+ REG_FE1IMR, BIT_FS_RXDONE);
+ if (ret)
+ goto wow_fail;
+ ret = read_poll_timeout(rtw_read32_mask, check_dis,
+ !check_dis, 1000, 100000, false, rtwdev,
+ REG_RXPKT_NUM, BIT_RW_RELEASE);
+ if (ret)
goto wow_fail;
}

--
2.25.1



2021-08-21 19:20:55

by Kalle Valo

[permalink] [raw]
Subject: Re: [PATCH v2 1/5] rtw88: use read_poll_timeout instead of fixed sleep

Ping-Ke Shih <[email protected]> wrote:

> From: Chin-Yen Lee <[email protected]>
>
> In current wow flow, driver calls rtw_wow_fw_start and sleep for 100ms,
> to wait firmware finish preliminary work and then update the value of
> WOWLAN_WAKE_REASON register to zero. But later firmware will start wow
> function with power-saving mode, in which mode the value of
> WOWLAN_WAKE_REASON register is 0xea. So driver may get 0xea value and
> return fail. We use read_poll_timeout instead to check the value to avoid
> this issue.
>
> Signed-off-by: Chin-Yen Lee <[email protected]>
> Signed-off-by: Ping-Ke Shih <[email protected]>

5 patches applied to wireless-drivers-next.git, thanks.

02a55c0009a5 rtw88: use read_poll_timeout instead of fixed sleep
67368f14a816 rtw88: refine the setting of rsvd pages for different firmware
05e45887382c rtw88: wow: build wow function only if CONFIG_PM is on
4bac10f2de22 rtw88: wow: report wow reason through mac80211 api
69c7044526d9 rtw88: wow: fix size access error of probe request

--
https://patchwork.kernel.org/project/linux-wireless/patch/[email protected]/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches