Commit 8b1b4730 authored by Ping-Ke Shih's avatar Ping-Ke Shih Committed by Kalle Valo

wifi: rtw89: 8852c: initialize and correct BA CAM content

The bacam_v1 must do additional initialization, and H2C content of BA CAM
is also different. So, correct them accordingly.
Signed-off-by: default avatarPing-Ke Shih <pkshih@realtek.com>
Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20220816013247.6243-3-pkshih@realtek.com
parent 2def7356
...@@ -2869,6 +2869,7 @@ int rtw89_core_start(struct rtw89_dev *rtwdev) ...@@ -2869,6 +2869,7 @@ int rtw89_core_start(struct rtw89_dev *rtwdev)
rtw89_btc_ntfy_radio_state(rtwdev, BTC_RFCTRL_WL_ON); rtw89_btc_ntfy_radio_state(rtwdev, BTC_RFCTRL_WL_ON);
rtw89_fw_h2c_fw_log(rtwdev, rtwdev->fw.fw_log_enable); rtw89_fw_h2c_fw_log(rtwdev, rtwdev->fw.fw_log_enable);
rtw89_fw_h2c_init_ba_cam(rtwdev);
return 0; return 0;
} }
......
...@@ -2572,6 +2572,8 @@ struct rtw89_chip_info { ...@@ -2572,6 +2572,8 @@ struct rtw89_chip_info {
u8 bcam_num; u8 bcam_num;
u8 scam_num; u8 scam_num;
u8 bacam_num; u8 bacam_num;
u8 bacam_dynamic_num;
bool bacam_v1;
u8 sec_ctrl_efuse_size; u8 sec_ctrl_efuse_size;
u32 physical_efuse_size; u32 physical_efuse_size;
......
...@@ -679,6 +679,8 @@ EXPORT_SYMBOL(rtw89_fw_h2c_dctl_sec_cam_v1); ...@@ -679,6 +679,8 @@ EXPORT_SYMBOL(rtw89_fw_h2c_dctl_sec_cam_v1);
int rtw89_fw_h2c_ba_cam(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta, int rtw89_fw_h2c_ba_cam(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
bool valid, struct ieee80211_ampdu_params *params) bool valid, struct ieee80211_ampdu_params *params)
{ {
const struct rtw89_chip_info *chip = rtwdev->chip;
struct rtw89_vif *rtwvif = rtwsta->rtwvif;
u8 macid = rtwsta->mac_id; u8 macid = rtwsta->mac_id;
struct sk_buff *skb; struct sk_buff *skb;
u8 entry_idx; u8 entry_idx;
...@@ -704,7 +706,10 @@ int rtw89_fw_h2c_ba_cam(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta, ...@@ -704,7 +706,10 @@ int rtw89_fw_h2c_ba_cam(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
} }
skb_put(skb, H2C_BA_CAM_LEN); skb_put(skb, H2C_BA_CAM_LEN);
SET_BA_CAM_MACID(skb->data, macid); SET_BA_CAM_MACID(skb->data, macid);
SET_BA_CAM_ENTRY_IDX(skb->data, entry_idx); if (chip->bacam_v1)
SET_BA_CAM_ENTRY_IDX_V1(skb->data, entry_idx);
else
SET_BA_CAM_ENTRY_IDX(skb->data, entry_idx);
if (!valid) if (!valid)
goto end; goto end;
SET_BA_CAM_VALID(skb->data, valid); SET_BA_CAM_VALID(skb->data, valid);
...@@ -717,6 +722,11 @@ int rtw89_fw_h2c_ba_cam(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta, ...@@ -717,6 +722,11 @@ int rtw89_fw_h2c_ba_cam(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
SET_BA_CAM_INIT_REQ(skb->data, 1); SET_BA_CAM_INIT_REQ(skb->data, 1);
SET_BA_CAM_SSN(skb->data, params->ssn); SET_BA_CAM_SSN(skb->data, params->ssn);
if (chip->bacam_v1) {
SET_BA_CAM_STD_EN(skb->data, 1);
SET_BA_CAM_BAND(skb->data, rtwvif->mac_idx);
}
end: end:
rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C, rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
H2C_CAT_MAC, H2C_CAT_MAC,
...@@ -736,6 +746,56 @@ int rtw89_fw_h2c_ba_cam(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta, ...@@ -736,6 +746,56 @@ int rtw89_fw_h2c_ba_cam(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
return -EBUSY; return -EBUSY;
} }
static int rtw89_fw_h2c_init_dynamic_ba_cam_v1(struct rtw89_dev *rtwdev,
u8 entry_idx, u8 uid)
{
struct sk_buff *skb;
skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_BA_CAM_LEN);
if (!skb) {
rtw89_err(rtwdev, "failed to alloc skb for dynamic h2c ba cam\n");
return -ENOMEM;
}
skb_put(skb, H2C_BA_CAM_LEN);
SET_BA_CAM_VALID(skb->data, 1);
SET_BA_CAM_ENTRY_IDX_V1(skb->data, entry_idx);
SET_BA_CAM_UID(skb->data, uid);
SET_BA_CAM_BAND(skb->data, 0);
SET_BA_CAM_STD_EN(skb->data, 0);
rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
H2C_CAT_MAC,
H2C_CL_BA_CAM,
H2C_FUNC_MAC_BA_CAM, 0, 1,
H2C_BA_CAM_LEN);
if (rtw89_h2c_tx(rtwdev, skb, false)) {
rtw89_err(rtwdev, "failed to send h2c\n");
goto fail;
}
return 0;
fail:
dev_kfree_skb_any(skb);
return -EBUSY;
}
void rtw89_fw_h2c_init_ba_cam_v1(struct rtw89_dev *rtwdev)
{
const struct rtw89_chip_info *chip = rtwdev->chip;
u8 entry_idx = chip->bacam_num;
u8 uid = 0;
int i;
for (i = 0; i < chip->bacam_dynamic_num; i++) {
rtw89_fw_h2c_init_dynamic_ba_cam_v1(rtwdev, entry_idx, uid);
entry_idx++;
uid++;
}
}
#define H2C_LOG_CFG_LEN 12 #define H2C_LOG_CFG_LEN 12
int rtw89_fw_h2c_fw_log(struct rtw89_dev *rtwdev, bool enable) int rtw89_fw_h2c_fw_log(struct rtw89_dev *rtwdev, bool enable)
{ {
......
...@@ -2669,6 +2669,7 @@ void rtw89_fw_free_all_early_h2c(struct rtw89_dev *rtwdev); ...@@ -2669,6 +2669,7 @@ void rtw89_fw_free_all_early_h2c(struct rtw89_dev *rtwdev);
int rtw89_fw_h2c_general_pkt(struct rtw89_dev *rtwdev, u8 macid); int rtw89_fw_h2c_general_pkt(struct rtw89_dev *rtwdev, u8 macid);
int rtw89_fw_h2c_ba_cam(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta, int rtw89_fw_h2c_ba_cam(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
bool valid, struct ieee80211_ampdu_params *params); bool valid, struct ieee80211_ampdu_params *params);
void rtw89_fw_h2c_init_ba_cam_v1(struct rtw89_dev *rtwdev);
int rtw89_fw_h2c_lps_parm(struct rtw89_dev *rtwdev, int rtw89_fw_h2c_lps_parm(struct rtw89_dev *rtwdev,
struct rtw89_lps_parm *lps_param); struct rtw89_lps_parm *lps_param);
...@@ -2689,4 +2690,12 @@ int rtw89_hw_scan_offload(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif, ...@@ -2689,4 +2690,12 @@ int rtw89_hw_scan_offload(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
void rtw89_hw_scan_abort(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif); void rtw89_hw_scan_abort(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif);
int rtw89_fw_h2c_trigger_cpu_exception(struct rtw89_dev *rtwdev); int rtw89_fw_h2c_trigger_cpu_exception(struct rtw89_dev *rtwdev);
static inline void rtw89_fw_h2c_init_ba_cam(struct rtw89_dev *rtwdev)
{
const struct rtw89_chip_info *chip = rtwdev->chip;
if (chip->bacam_v1)
rtw89_fw_h2c_init_ba_cam_v1(rtwdev);
}
#endif #endif
...@@ -2149,6 +2149,8 @@ const struct rtw89_chip_info rtw8852a_chip_info = { ...@@ -2149,6 +2149,8 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
.bcam_num = 10, .bcam_num = 10,
.scam_num = 128, .scam_num = 128,
.bacam_num = 2, .bacam_num = 2,
.bacam_dynamic_num = 4,
.bacam_v1 = false,
.sec_ctrl_efuse_size = 4, .sec_ctrl_efuse_size = 4,
.physical_efuse_size = 1216, .physical_efuse_size = 1216,
.logical_efuse_size = 1536, .logical_efuse_size = 1536,
......
...@@ -2981,6 +2981,8 @@ const struct rtw89_chip_info rtw8852c_chip_info = { ...@@ -2981,6 +2981,8 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
.bcam_num = 20, .bcam_num = 20,
.scam_num = 128, .scam_num = 128,
.bacam_num = 8, .bacam_num = 8,
.bacam_dynamic_num = 8,
.bacam_v1 = true,
.sec_ctrl_efuse_size = 4, .sec_ctrl_efuse_size = 4,
.physical_efuse_size = 1216, .physical_efuse_size = 1216,
.logical_efuse_size = 2048, .logical_efuse_size = 2048,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment