mirror of
https://github.com/torvalds/linux.git
synced 2026-06-03 12:03:54 +02:00
wifi: rtw89: mac: add feature_init to initialize BA CAM V1
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
This commit is contained in:
parent
6f066439f9
commit
3b96833a57
|
|
@ -1683,6 +1683,45 @@ int rtw89_fw_h2c_ba_cam_v1(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
|
|||
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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user