Message ID | 20210728014335.8785-2-pkshih@realtek.com |
---|---|
State | Superseded |
Headers | show |
Series | rtw88: fix WoWLAN function and report reason to mac80211 | expand |
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 --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; }