wifi: rtw89: mac: add feature_init to initialize BA CAM V1
authorPing-Ke Shih <pkshih@realtek.com>
Mon, 8 Jan 2024 09:11:26 +0000 (17:11 +0800)
committerKalle Valo <kvalo@kernel.org>
Fri, 12 Jan 2024 17:10:52 +0000 (19:10 +0200)
Add a call of feature_init() when bringing interface up. For now, the
feature is to reset BA CAM V1 that is only used by upcoming 8922A.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://msgid.link/20240108091134.67007-3-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/fw.c
drivers/net/wireless/realtek/rtw89/fw.h
drivers/net/wireless/realtek/rtw89/mac.c

index 4cda96f15eccf534dec2940c0da348fad2fc9f9b..28bf8108a17744357a6b2249dbaa9b532f795b2a 100644 (file)
@@ -1683,6 +1683,45 @@ fail:
        return ret;
 }
 
+int rtw89_fw_h2c_init_ba_cam_users(struct rtw89_dev *rtwdev, u8 users,
+                                  u8 offset, u8 mac_idx)
+{
+       struct rtw89_h2c_ba_cam_init *h2c;
+       u32 len = sizeof(*h2c);
+       struct sk_buff *skb;
+       int ret;
+
+       skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
+       if (!skb) {
+               rtw89_err(rtwdev, "failed to alloc skb for h2c ba cam init\n");
+               return -ENOMEM;
+       }
+       skb_put(skb, len);
+       h2c = (struct rtw89_h2c_ba_cam_init *)skb->data;
+
+       h2c->w0 = le32_encode_bits(users, RTW89_H2C_BA_CAM_INIT_USERS_MASK) |
+                 le32_encode_bits(offset, RTW89_H2C_BA_CAM_INIT_OFFSET_MASK) |
+                 le32_encode_bits(mac_idx, RTW89_H2C_BA_CAM_INIT_BAND_SEL);
+
+       rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
+                             H2C_CAT_MAC,
+                             H2C_CL_BA_CAM,
+                             H2C_FUNC_MAC_BA_CAM_INIT, 0, 1,
+                             len);
+
+       ret = rtw89_h2c_tx(rtwdev, skb, false);
+       if (ret) {
+               rtw89_err(rtwdev, "failed to send h2c\n");
+               goto fail;
+       }
+
+       return 0;
+fail:
+       dev_kfree_skb_any(skb);
+
+       return ret;
+}
+
 #define H2C_LOG_CFG_LEN 12
 int rtw89_fw_h2c_fw_log(struct rtw89_dev *rtwdev, bool enable)
 {
index b7f564d30378af43617d1c510f7129d436071367..687623fb7e1d2e3432caeb06f3281fd783ef6503 100644 (file)
@@ -1813,6 +1813,14 @@ struct rtw89_h2c_ba_cam_v1 {
 #define RTW89_H2C_BA_CAM_V1_W1_MLD_EN BIT(10)
 #define RTW89_H2C_BA_CAM_V1_W1_ENTRY_IDX_MASK GENMASK(31, 24)
 
+struct rtw89_h2c_ba_cam_init {
+       __le32 w0;
+} __packed;
+
+#define RTW89_H2C_BA_CAM_INIT_USERS_MASK GENMASK(7, 0)
+#define RTW89_H2C_BA_CAM_INIT_OFFSET_MASK GENMASK(19, 12)
+#define RTW89_H2C_BA_CAM_INIT_BAND_SEL BIT(24)
+
 static inline void SET_LPS_PARM_MACID(void *h2c, u32 val)
 {
        le32p_replace_bits((__le32 *)h2c, val, GENMASK(7, 0));
@@ -3708,6 +3716,7 @@ enum rtw89_fw_ofld_h2c_func {
 #define H2C_CL_BA_CAM                  0xc
 #define H2C_FUNC_MAC_BA_CAM            0x0
 #define H2C_FUNC_MAC_BA_CAM_V1         0x1
+#define H2C_FUNC_MAC_BA_CAM_INIT       0x2
 
 /* CLASS 14 - MCC */
 #define H2C_CL_MCC                     0xe
@@ -3919,6 +3928,8 @@ int rtw89_fw_h2c_ba_cam(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
 int rtw89_fw_h2c_ba_cam_v1(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
                           bool valid, struct ieee80211_ampdu_params *params);
 void rtw89_fw_h2c_init_dynamic_ba_cam_v0_ext(struct rtw89_dev *rtwdev);
+int rtw89_fw_h2c_init_ba_cam_users(struct rtw89_dev *rtwdev, u8 users,
+                                  u8 offset, u8 mac_idx);
 
 int rtw89_fw_h2c_lps_parm(struct rtw89_dev *rtwdev,
                          struct rtw89_lps_parm *lps_param);
index c485ef2cc3d3049a8eb81be1f9a9dd08b10ed94a..0d5f91d4adeeb1a76bbd01c5c4d45824bddcd190 100644 (file)
@@ -3676,6 +3676,28 @@ static int trx_init_ax(struct rtw89_dev *rtwdev)
        return 0;
 }
 
+static int rtw89_mac_feat_init(struct rtw89_dev *rtwdev)
+{
+#define BACAM_1024BMP_OCC_ENTRY 4
+#define BACAM_MAX_RU_SUPPORT_B0_STA 1
+#define BACAM_MAX_RU_SUPPORT_B1_STA 1
+       const struct rtw89_chip_info *chip = rtwdev->chip;
+       u8 users, offset;
+
+       if (chip->bacam_ver != RTW89_BACAM_V1)
+               return 0;
+
+       offset = 0;
+       users = BACAM_MAX_RU_SUPPORT_B0_STA;
+       rtw89_fw_h2c_init_ba_cam_users(rtwdev, users, offset, RTW89_MAC_0);
+
+       offset += users * BACAM_1024BMP_OCC_ENTRY;
+       users = BACAM_MAX_RU_SUPPORT_B1_STA;
+       rtw89_fw_h2c_init_ba_cam_users(rtwdev, users, offset, RTW89_MAC_1);
+
+       return 0;
+}
+
 static void rtw89_disable_fw_watchdog(struct rtw89_dev *rtwdev)
 {
        enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id;
@@ -3910,6 +3932,10 @@ int rtw89_mac_init(struct rtw89_dev *rtwdev)
        if (ret)
                goto fail;
 
+       ret = rtw89_mac_feat_init(rtwdev);
+       if (ret)
+               goto fail;
+
        if (rtwdev->hci.ops->mac_post_init) {
                ret = rtwdev->hci.ops->mac_post_init(rtwdev);
                if (ret)