wifi: rtw88: use RTW_FLAG_POWERON flag to prevent to power on/off twice
Subsystems (2)
Ping-Ke Shih
maintainerPATCH 1/1 wifi: rtw88: use RTW_FLAG_POWERON flag to prevent to power on/off twice
Use power state to decide whether we can enter or leave IPS accurately, and then prevent to power on/off twice.
The commit 6bf3a083407b ("wifi: rtw88: add flag check before enter or leave IPS") would like to prevent this as well, but it still can't entirely handle all cases. The exception is that WiFi gets connected and does suspend/resume, it will power on twice and cause it failed to power on after resuming, like:
rtw_8723de 0000:03:00.0: failed to poll offset=0x6 mask=0x2 value=0x2 rtw_8723de 0000:03:00.0: mac power on failed
rtw_8723de 0000:03:00.0: failed to power on mac
rtw_8723de 0000:03:00.0: leave idle state failed rtw_8723de 0000:03:00.0: failed to leave ips state rtw_8723de 0000:03:00.0: failed to leave idle state rtw_8723de 0000:03:00.0: failed to send h2c command
To fix this, introduce new flag RTW_FLAG_POWERON to reflect power state, and call rtw_mac_pre_system_cfg() to configure registers properly between power-off/-on.
---
Hi Kalle,
This patch is to fix 8723DE failed to power on after system resume. Please queue this to 6.3
Thank you
Ping-Ke
--- drivers/net/wireless/realtek/rtw88/coex.c | 2 +- drivers/net/wireless/realtek/rtw88/mac.c | 10 ++++++++++ drivers/net/wireless/realtek/rtw88/main.h | 2 +- drivers/net/wireless/realtek/rtw88/ps.c | 4 ++-- drivers/net/wireless/realtek/rtw88/wow.c | 2 +- 5 files changed, 15 insertions(+), 5 deletions(-)
drivers/net/wireless/realtek/rtw88/coex.c +1 -1
@@ -4056,7 +4056,7 @@ void rtw_coex_display_coex_info(struct rtw_dev *rtwdev, struct seq_file *m) rtwdev->stats.tx_throughput, rtwdev->stats.rx_throughput);seq_printf (m,"%-40s = %u/ %u/ %u\n" ,"IPS/ Low Power/ PS mode" , -test_bit (RTW_FLAG_INACTIVE_PS , rtwdev->flags), + !test_bit (RTW_FLAG_POWERON , rtwdev->flags),test_bit (RTW_FLAG_LEISURE_PS_DEEP , rtwdev->flags), rtwdev->lps_conf.mode);
drivers/net/wireless/realtek/rtw88/mac.c +10 -0
@@ -273,6 +273,11 @@ static int rtw_mac_power_switch(struct rtw_dev *rtwdev, bool pwr_on)if (rtw_pwr_seq_parser (rtwdev, pwr_seq))return -EINVAL ; +if (pwr_on) +set_bit (RTW_FLAG_POWERON , rtwdev->flags); +else +clear_bit (RTW_FLAG_POWERON , rtwdev->flags); +return 0 ; }
@@ -335,6 +340,11 @@ int rtw_mac_power_on(struct rtw_dev *rtwdev) ret =rtw_mac_power_switch (rtwdev, true);if (ret == -EALREADY ) {rtw_mac_power_switch (rtwdev, false); + + ret =rtw_mac_pre_system_cfg (rtwdev); +if (ret) + goto err; + ret =rtw_mac_power_switch (rtwdev, true);if (ret) goto err;
drivers/net/wireless/realtek/rtw88/main.h +1 -1
@@ -356,7 +356,7 @@ enum rtw_flags {RTW_FLAG_RUNNING ,RTW_FLAG_FW_RUNNING ,RTW_FLAG_SCANNING , -RTW_FLAG_INACTIVE_PS , +RTW_FLAG_POWERON ,RTW_FLAG_LEISURE_PS ,RTW_FLAG_LEISURE_PS_DEEP , RTW_FLAG_DIG_DISABLE,
drivers/net/wireless/realtek/rtw88/ps.c +2 -2
@@ -25,7 +25,7 @@ static int rtw_ips_pwr_up(struct rtw_dev *rtwdev)int rtw_enter_ips (struct rtw_dev *rtwdev) { -if (test_and_set_bit (RTW_FLAG_INACTIVE_PS , rtwdev->flags)) +if (!test_bit (RTW_FLAG_POWERON , rtwdev->flags))return 0 ;rtw_coex_ips_notify (rtwdev,COEX_IPS_ENTER );
@@ -50,7 +50,7 @@ int rtw_leave_ips(struct rtw_dev *rtwdev) {int ret; -if (!test_and_clear_bit (RTW_FLAG_INACTIVE_PS , rtwdev->flags)) +if (test_bit (RTW_FLAG_POWERON , rtwdev->flags))return 0 ;rtw_hci_link_ps (rtwdev, false);
drivers/net/wireless/realtek/rtw88/wow.c +1 -1
@@ -592,7 +592,7 @@ static int rtw_wow_leave_no_link_ps(struct rtw_dev *rtwdev)if (rtw_get_lps_deep_mode (rtwdev) !=LPS_DEEP_MODE_NONE )rtw_leave_lps_deep (rtwdev); }else { -if (test_bit (RTW_FLAG_INACTIVE_PS , rtwdev->flags)) { +if (!test_bit (RTW_FLAG_POWERON , rtwdev->flags)) { rtw_wow->ips_enabled = true; ret =rtw_leave_ips (rtwdev);if (ret)
Signature · 1 line
2.25.1
Quoted 21 lines · Ping-Ke Shih
Use power state to decide whether we can enter or leave IPS accurately, and then prevent to power on/off twice.
The commit
6bf3a083407b("wifi: rtw88: add flag check before enter or leave IPS") would like to prevent this as well, but it still can't entirely handle all cases. The exception is that WiFi gets connected and does suspend/resume, it will power on twice and cause it failed to power on after resuming, like:
rtw_8723de0000:03:00.0: failed to poll offset=0x6 mask=0x2 value=0x2rtw_8723de0000:03:00.0: mac power on failed
rtw_8723de0000:03:00.0: failed to power on mac
rtw_8723de0000:03:00.0: leave idle state failedrtw_8723de0000:03:00.0: failed to leave ips statertw_8723de0000:03:00.0: failed to leave idle statertw_8723de0000:03:00.0: failed to send h2c commandTo fix this, introduce new flag
RTW_FLAG_POWERONto reflect power state, and callrtw_mac_pre_system_cfg()to configure registers properly between power-off/-on.
Quoted 5 lines
Reported-by Paul Gover <[email protected]>Fixes 6bf3a083407b ("wifi: rtw88: add flag check before enter or leave IPS")Cc <[email protected]>Signed-off-by Ping-Ke Shih <[email protected]>
Patch applied to wireless-next.git, thanks.
4a267bc5ea8f wifi: rtw88: use RTW_FLAG_POWERON flag to prevent to power on/off twice
Signature · 3 lines
https://patchwork.kernel.org/project/linux-wireless/patch/[email protected]/ https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches