Commit 02a55c00 authored by Chin-Yen Lee's avatar Chin-Yen Lee Committed by Kalle Valo
Browse files

rtw88: use read_poll_timeout instead of fixed sleep



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: default avatarChin-Yen Lee <timlee@realtek.com>
Signed-off-by: default avatarPing-Ke Shih <pkshih@realtek.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/20210728014335.8785-2-pkshih@realtek.com
parent 8d52b46c
Loading
Loading
Loading
Loading
+16 −5
Original line number Diff line number Diff line
@@ -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;
	}