Message ID | 20230405200729.632435-2-martin.blumenstingl@googlemail.com |
---|---|
State | New |
Headers | show |
Series | [v5,1/9] wifi: rtw88: Clear RTW_FLAG_POWERON early in rtw_mac_power_switch() | expand |
Martin Blumenstingl <martin.blumenstingl@googlemail.com> wrote: > The SDIO HCI implementation needs to know when the MAC is powered on. > This is needed because 32-bit register access has to be split into 4x > 8-bit register access when the MAC is not fully powered on or while > powering off. When the MAC is powered on 32-bit register access can be > used to reduce the number of transfers but splitting into 4x 8-bit > register access still works in that case. > > During the power on sequence is how RTW_FLAG_POWERON is only set when > the power on sequence has completed successfully. During power off > however RTW_FLAG_POWERON is set. This means that the upcoming SDIO HCI > implementation does not know that it has to use 4x 8-bit register > accessors. Clear the RTW_FLAG_POWERON flag early when powering off the > MAC so the whole power off sequence is processed with RTW_FLAG_POWERON > unset. This will make it possible to use the RTW_FLAG_POWERON flag in > the upcoming SDIO HCI implementation. > > Note that a failure in rtw_pwr_seq_parser() while applying > chip->pwr_off_seq can theoretically result in the RTW_FLAG_POWERON > flag being cleared while the chip is still powered on. However, > depending on when the failure occurs in the power off sequence the > chip may be on or off. Even the original approach of clearing > RTW_FLAG_POWERON only when the power off sequence has been applied > successfully could end up in some corner case where the chip is > powered off but RTW_FLAG_POWERON was not cleared. > > Reviewed-by: Ping-Ke Shih <pkshih@realtek.com> > Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> 9 patches applied to wireless-next.git, thanks. 6a92566088b1 wifi: rtw88: Clear RTW_FLAG_POWERON early in rtw_mac_power_switch() 65371a3f14e7 wifi: rtw88: sdio: Add HCI implementation for SDIO based chipsets b722e5b130bc wifi: rtw88: mac: Support SDIO specific bits in the power on sequence a5d25f9ff918 wifi: rtw88: main: Add the {cpwm,rpwm}_addr for SDIO based chipsets 02461d9368c5 wifi: rtw88: main: Reserve 8 bytes of extra TX headroom for SDIO cards 7d6d2dd326a8 mmc: sdio: add Realtek SDIO vendor ID and various wifi device IDs 095e62dd7427 wifi: rtw88: Add support for the SDIO based RTL8822BS chipset 6fdacb78f799 wifi: rtw88: Add support for the SDIO based RTL8822CS chipset b2a777d68434 wifi: rtw88: Add support for the SDIO based RTL8821CS chipset
diff --git a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c index f3a566cf979b..cfdfc8a2c836 100644 --- a/drivers/net/wireless/realtek/rtw88/mac.c +++ b/drivers/net/wireless/realtek/rtw88/mac.c @@ -273,6 +273,9 @@ static int rtw_mac_power_switch(struct rtw_dev *rtwdev, bool pwr_on) if (pwr_on == cur_pwr) return -EALREADY; + if (!pwr_on) + clear_bit(RTW_FLAG_POWERON, rtwdev->flags); + pwr_seq = pwr_on ? chip->pwr_on_seq : chip->pwr_off_seq; ret = rtw_pwr_seq_parser(rtwdev, pwr_seq); if (ret) @@ -280,8 +283,6 @@ static int rtw_mac_power_switch(struct rtw_dev *rtwdev, bool pwr_on) if (pwr_on) set_bit(RTW_FLAG_POWERON, rtwdev->flags); - else - clear_bit(RTW_FLAG_POWERON, rtwdev->flags); return 0; }