diff mbox series

[v2,1/5] rtw88: use read_poll_timeout instead of fixed sleep

Message ID 20210728014335.8785-2-pkshih@realtek.com
State Superseded
Headers show
Series rtw88: fix WoWLAN function and report reason to mac80211 | expand

Commit Message

Ping-Ke Shih July 28, 2021, 1:43 a.m. UTC
From: Chin-Yen Lee <timlee@realtek.com>

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 <timlee@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
 drivers/net/wireless/realtek/rtw88/wow.c | 21 ++++++++++++++++-----
 1 file changed, 16 insertions(+), 5 deletions(-)

Comments

Kalle Valo Aug. 21, 2021, 7:19 p.m. UTC | #1
Ping-Ke Shih <pkshih@realtek.com> wrote:

> From: Chin-Yen Lee <timlee@realtek.com>

> 

> 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 <timlee@realtek.com>

> Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>


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/20210728014335.8785-2-pkshih@realtek.com/

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

Patch

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;
 	}