]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtw89: wow: update config mac for 802.11ax chip
authorChih-Kang Chang <gary.chang@realtek.com>
Thu, 20 Jun 2024 05:58:21 +0000 (13:58 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Thu, 27 Jun 2024 01:23:10 +0000 (09:23 +0800)
The 802.11ax chip also needs rtw89_mac_cpu_io_rx(), which notifies Firmware
to start or stop WoWLAN and waits until Firmware process over. Then,
the driver can continue processing to avoid unexpected behavior.

Signed-off-by: Chih-Kang Chang <gary.chang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20240620055825.17592-4-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/mac.c
drivers/net/wireless/realtek/rtw89/mac.h
drivers/net/wireless/realtek/rtw89/mac_be.c
drivers/net/wireless/realtek/rtw89/reg.h

index b759fa8fbca9aca5a836b0377a8913f247cfcd94..73462f3343e363f71174b8091aaafc9c0784dd17 100644 (file)
@@ -6320,9 +6320,30 @@ int rtw89_mac_ptk_drop_by_band_and_wait(struct rtw89_dev *rtwdev,
        return ret;
 }
 
+int rtw89_mac_cpu_io_rx(struct rtw89_dev *rtwdev, bool wow_enable)
+{
+       struct rtw89_mac_h2c_info h2c_info = {};
+       struct rtw89_mac_c2h_info c2h_info = {};
+       u32 ret;
+
+       h2c_info.id = RTW89_FWCMD_H2CREG_FUNC_WOW_CPUIO_RX_CTRL;
+       h2c_info.content_len = sizeof(h2c_info.u.hdr);
+       h2c_info.u.hdr.w0 = u32_encode_bits(wow_enable, RTW89_H2CREG_WOW_CPUIO_RX_CTRL_EN);
+
+       ret = rtw89_fw_msg_reg(rtwdev, &h2c_info, &c2h_info);
+       if (ret)
+               return ret;
+
+       if (c2h_info.id != RTW89_FWCMD_C2HREG_FUNC_WOW_CPUIO_RX_ACK)
+               ret = -EINVAL;
+
+       return ret;
+}
+
 static int rtw89_wow_config_mac_ax(struct rtw89_dev *rtwdev, bool enable_wow)
 {
        const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
+       const struct rtw89_chip_info *chip = rtwdev->chip;
        int ret;
 
        if (enable_wow) {
@@ -6333,12 +6354,19 @@ static int rtw89_wow_config_mac_ax(struct rtw89_dev *rtwdev, bool enable_wow)
                }
 
                rtw89_write32_set(rtwdev, R_AX_RX_FUNCTION_STOP, B_AX_HDR_RX_STOP);
+               rtw89_mac_cpu_io_rx(rtwdev, enable_wow);
                rtw89_write32_clr(rtwdev, mac->rx_fltr, B_AX_SNIFFER_MODE);
                rtw89_mac_cfg_ppdu_status(rtwdev, RTW89_MAC_0, false);
                rtw89_write32(rtwdev, R_AX_ACTION_FWD0, 0);
                rtw89_write32(rtwdev, R_AX_ACTION_FWD1, 0);
                rtw89_write32(rtwdev, R_AX_TF_FWD, 0);
                rtw89_write32(rtwdev, R_AX_HW_RPT_FWD, 0);
+
+               if (chip->chip_id == RTL8852A || rtw89_is_rtl885xb(rtwdev))
+                       rtw89_write8(rtwdev, R_BE_DBG_WOW_READY, WOWLAN_NOT_READY);
+               else
+                       rtw89_write32_set(rtwdev, R_AX_DBG_WOW,
+                                         B_AX_DBG_WOW_CPU_IO_RX_EN);
        } else {
                ret = rtw89_mac_resize_ple_rx_quota(rtwdev, false);
                if (ret) {
@@ -6346,6 +6374,7 @@ static int rtw89_wow_config_mac_ax(struct rtw89_dev *rtwdev, bool enable_wow)
                        return ret;
                }
 
+               rtw89_mac_cpu_io_rx(rtwdev, enable_wow);
                rtw89_write32_clr(rtwdev, R_AX_RX_FUNCTION_STOP, B_AX_HDR_RX_STOP);
                rtw89_mac_cfg_ppdu_status(rtwdev, RTW89_MAC_0, true);
                rtw89_write32(rtwdev, R_AX_ACTION_FWD0, TRXCFG_MPDU_PROC_ACT_FRWD);
index a580cb719233799d53a03613a48e8901b8397385..cc9f914d440c47260592d334c68418c903a51a91 100644 (file)
@@ -1446,5 +1446,6 @@ int rtw89_mac_dle_quota_change(struct rtw89_dev *rtwdev, enum rtw89_qta_mode mod
 int rtw89_mac_get_dle_rsvd_qt_cfg(struct rtw89_dev *rtwdev,
                                  enum rtw89_mac_dle_rsvd_qt_type type,
                                  struct rtw89_mac_dle_rsvd_qt_cfg *cfg);
+int rtw89_mac_cpu_io_rx(struct rtw89_dev *rtwdev, bool wow_enable);
 
 #endif
index 934bdf3b398f1811a43a70ce62f2aae6839ed79f..f212b67771d50de6aa7c551eed23018de7367a7c 100644 (file)
@@ -2312,26 +2312,6 @@ static void rtw89_mac_dump_qta_lost_be(struct rtw89_dev *rtwdev)
        dump_err_status_dispatcher_be(rtwdev);
 }
 
-static int rtw89_mac_cpu_io_rx(struct rtw89_dev *rtwdev, bool wow_enable)
-{
-       struct rtw89_mac_h2c_info h2c_info = {};
-       struct rtw89_mac_c2h_info c2h_info = {};
-       u32 ret;
-
-       h2c_info.id = RTW89_FWCMD_H2CREG_FUNC_WOW_CPUIO_RX_CTRL;
-       h2c_info.content_len = sizeof(h2c_info.u.hdr);
-       h2c_info.u.hdr.w0 = u32_encode_bits(wow_enable, RTW89_H2CREG_WOW_CPUIO_RX_CTRL_EN);
-
-       ret = rtw89_fw_msg_reg(rtwdev, &h2c_info, &c2h_info);
-       if (ret)
-               return ret;
-
-       if (c2h_info.id != RTW89_FWCMD_C2HREG_FUNC_WOW_CPUIO_RX_ACK)
-               ret = -EINVAL;
-
-       return ret;
-}
-
 static int rtw89_wow_config_mac_be(struct rtw89_dev *rtwdev, bool enable_wow)
 {
        if (enable_wow) {
index fd81cf863beae35cd62981e81727ce0c5b540851..c9f6bdc84d0307492fdedfee46efe829f6376c84 100644 (file)
 #define B_AX_S0_LDO_VSEL_F_MASK GENMASK(22, 21)
 
 #define R_AX_DBG_WOW 0x0504
+#define B_AX_DBG_WOW_CPU_IO_RX_EN BIT(8)
 
 #define R_AX_SEC_CTRL 0x0C00
 #define B_AX_SEC_IDMEM_SIZE_CONFIG_MASK GENMASK(17, 16)