summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/realtek/rtw89/core.c9
-rw-r--r--drivers/net/wireless/realtek/rtw89/core.h11
-rw-r--r--drivers/net/wireless/realtek/rtw89/debug.c7
-rw-r--r--drivers/net/wireless/realtek/rtw89/fw.c61
-rw-r--r--drivers/net/wireless/realtek/rtw89/fw.h26
-rw-r--r--drivers/net/wireless/realtek/rtw89/mac80211.c2
-rw-r--r--drivers/net/wireless/realtek/rtw89/ser.c4
7 files changed, 64 insertions, 56 deletions
diff --git a/drivers/net/wireless/realtek/rtw89/core.c b/drivers/net/wireless/realtek/rtw89/core.c
index b074b3677c43..0c1c5c8ae8ce 100644
--- a/drivers/net/wireless/realtek/rtw89/core.c
+++ b/drivers/net/wireless/realtek/rtw89/core.c
@@ -5601,7 +5601,7 @@ void rtw89_core_release_all_bits_map(unsigned long *addr, unsigned int nbits)
}
int rtw89_core_acquire_sta_ba_entry(struct rtw89_dev *rtwdev,
- struct rtw89_sta_link *rtwsta_link, u8 tid,
+ struct rtw89_sta *rtwsta, u8 tid,
u8 *cam_idx)
{
const struct rtw89_chip_info *chip = rtwdev->chip;
@@ -5639,7 +5639,7 @@ int rtw89_core_acquire_sta_ba_entry(struct rtw89_dev *rtwdev,
}
entry->tid = tid;
- list_add_tail(&entry->list, &rtwsta_link->ba_cam_list);
+ list_add_tail(&entry->list, &rtwsta->ba_cam_list);
*cam_idx = idx;
@@ -5647,7 +5647,7 @@ int rtw89_core_acquire_sta_ba_entry(struct rtw89_dev *rtwdev,
}
int rtw89_core_release_sta_ba_entry(struct rtw89_dev *rtwdev,
- struct rtw89_sta_link *rtwsta_link, u8 tid,
+ struct rtw89_sta *rtwsta, u8 tid,
u8 *cam_idx)
{
struct rtw89_cam_info *cam_info = &rtwdev->cam_info;
@@ -5656,7 +5656,7 @@ int rtw89_core_release_sta_ba_entry(struct rtw89_dev *rtwdev,
lockdep_assert_wiphy(rtwdev->hw->wiphy);
- list_for_each_entry_safe(entry, tmp, &rtwsta_link->ba_cam_list, list) {
+ list_for_each_entry_safe(entry, tmp, &rtwsta->ba_cam_list, list) {
if (entry->tid != tid)
continue;
@@ -5751,7 +5751,6 @@ int rtw89_core_sta_link_add(struct rtw89_dev *rtwdev,
int ret;
rtwsta_link->prev_rssi = 0;
- INIT_LIST_HEAD(&rtwsta_link->ba_cam_list);
ewma_rssi_init(&rtwsta_link->avg_rssi);
ewma_snr_init(&rtwsta_link->avg_snr);
ewma_evm_init(&rtwsta_link->evm_1ss);
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
index 57fa1ce080dd..3a6099386b09 100644
--- a/drivers/net/wireless/realtek/rtw89/core.h
+++ b/drivers/net/wireless/realtek/rtw89/core.h
@@ -4665,7 +4665,6 @@ struct rtw89_sta_link {
__le32 htc_template;
struct rtw89_addr_cam_entry addr_cam; /* AP mode or TDLS peer only */
struct rtw89_bssid_cam_entry bssid_cam; /* TDLS peer only */
- struct list_head ba_cam_list;
bool use_cfg_mask;
struct cfg80211_bitrate_mask mask;
@@ -5016,9 +5015,7 @@ struct rtw89_chip_ops {
struct rtw89_sta_link *rtwsta_link);
int (*h2c_update_beacon)(struct rtw89_dev *rtwdev,
struct rtw89_vif_link *rtwvif_link);
- int (*h2c_ba_cam)(struct rtw89_dev *rtwdev,
- struct rtw89_vif_link *rtwvif_link,
- struct rtw89_sta_link *rtwsta_link,
+ int (*h2c_ba_cam)(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
bool valid, struct ieee80211_ampdu_params *params);
int (*h2c_wow_cam_update)(struct rtw89_dev *rtwdev,
struct rtw89_wow_cam_info *cam_info);
@@ -7805,6 +7802,8 @@ struct rtw89_sta {
struct rtw89_tid_stats tid_rx_stats[IEEE80211_NUM_TIDS];
DECLARE_BITMAP(ampdu_map, IEEE80211_NUM_TIDS);
+ struct list_head ba_cam_list;
+
DECLARE_BITMAP(pairwise_sec_cam_map, RTW89_MAX_SEC_CAM_NUM);
struct list_head dlink_pool;
@@ -9366,10 +9365,10 @@ u8 rtw89_core_acquire_bit_map(unsigned long *addr, unsigned long size);
void rtw89_core_release_bit_map(unsigned long *addr, u8 bit);
void rtw89_core_release_all_bits_map(unsigned long *addr, unsigned int nbits);
int rtw89_core_acquire_sta_ba_entry(struct rtw89_dev *rtwdev,
- struct rtw89_sta_link *rtwsta_link, u8 tid,
+ struct rtw89_sta *rtwsta, u8 tid,
u8 *cam_idx);
int rtw89_core_release_sta_ba_entry(struct rtw89_dev *rtwdev,
- struct rtw89_sta_link *rtwsta_link, u8 tid,
+ struct rtw89_sta *rtwsta, u8 tid,
u8 *cam_idx);
void rtw89_core_free_sta_pending_ba(struct rtw89_dev *rtwdev,
struct ieee80211_sta *sta);
diff --git a/drivers/net/wireless/realtek/rtw89/debug.c b/drivers/net/wireless/realtek/rtw89/debug.c
index 2417381bca1c..3a430bd082c3 100644
--- a/drivers/net/wireless/realtek/rtw89/debug.c
+++ b/drivers/net/wireless/realtek/rtw89/debug.c
@@ -4642,13 +4642,13 @@ void rtw89_vif_ids_get_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
static int rtw89_dump_ba_cam(struct rtw89_dev *rtwdev,
char *buf, size_t bufsz,
- struct rtw89_sta_link *rtwsta_link)
+ struct rtw89_sta *rtwsta)
{
struct rtw89_ba_cam_entry *entry;
char *p = buf, *end = buf + bufsz;
bool first = true;
- list_for_each_entry(entry, &rtwsta_link->ba_cam_list, list) {
+ list_for_each_entry(entry, &rtwsta->ba_cam_list, list) {
if (first) {
p += scnprintf(p, end - p, "\tba_cam ");
first = false;
@@ -4683,7 +4683,6 @@ static int rtw89_sta_link_ids_get(struct rtw89_dev *rtwdev,
p += scnprintf(p, end - p, "\tlink_id=%u%s\n", rtwsta_link->link_id,
designated ? " (*)" : "");
p += rtw89_dump_addr_cam(rtwdev, p, end - p, &rtwsta_link->addr_cam);
- p += rtw89_dump_ba_cam(rtwdev, p, end - p, rtwsta_link);
return p - buf;
}
@@ -4705,6 +4704,8 @@ static void rtw89_sta_ids_get_iter(void *data, struct ieee80211_sta *sta)
p += scnprintf(p, end - p, "STA %pM %s\n", sta->addr,
sta->tdls ? "(TDLS)" : "");
+ p += rtw89_dump_ba_cam(rtwdev, p, end - p, rtwsta);
+
rtw89_sta_for_each_link(rtwsta, rtwsta_link, link_id)
p += rtw89_sta_link_ids_get(rtwdev, p, end - p, rtwsta_link,
rtwsta_link == designated_link);
diff --git a/drivers/net/wireless/realtek/rtw89/fw.c b/drivers/net/wireless/realtek/rtw89/fw.c
index 5b33bdb5a3e8..3d699e398333 100644
--- a/drivers/net/wireless/realtek/rtw89/fw.c
+++ b/drivers/net/wireless/realtek/rtw89/fw.c
@@ -2606,23 +2606,28 @@ fail:
}
EXPORT_SYMBOL(rtw89_fw_h2c_default_dmac_tbl_v3);
-int rtw89_fw_h2c_ba_cam(struct rtw89_dev *rtwdev,
- struct rtw89_vif_link *rtwvif_link,
- struct rtw89_sta_link *rtwsta_link,
+int rtw89_fw_h2c_ba_cam(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
bool valid, struct ieee80211_ampdu_params *params)
{
const struct rtw89_chip_info *chip = rtwdev->chip;
+ struct rtw89_vif_link *rtwvif_link;
+ struct rtw89_sta_link *rtwsta_link;
struct rtw89_h2c_ba_cam *h2c;
- u8 macid = rtwsta_link->mac_id;
u32 len = sizeof(*h2c);
struct sk_buff *skb;
u8 entry_idx;
+ u8 macid;
int ret;
+ rtwsta_link = rtw89_get_designated_link(rtwsta);
+ rtwvif_link = rtwsta_link->rtwvif_link;
+
+ macid = rtwsta_link->mac_id;
+
ret = valid ?
- rtw89_core_acquire_sta_ba_entry(rtwdev, rtwsta_link, params->tid,
+ rtw89_core_acquire_sta_ba_entry(rtwdev, rtwsta, params->tid,
&entry_idx) :
- rtw89_core_release_sta_ba_entry(rtwdev, rtwsta_link, params->tid,
+ rtw89_core_release_sta_ba_entry(rtwdev, rtwsta, params->tid,
&entry_idx);
if (ret) {
/* it still works even if we don't have static BA CAM, because
@@ -2741,24 +2746,33 @@ void rtw89_fw_h2c_init_dynamic_ba_cam_v0_ext(struct rtw89_dev *rtwdev)
}
}
-int rtw89_fw_h2c_ba_cam_v1(struct rtw89_dev *rtwdev,
- struct rtw89_vif_link *rtwvif_link,
- struct rtw89_sta_link *rtwsta_link,
+int rtw89_fw_h2c_ba_cam_v1(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
bool valid, struct ieee80211_ampdu_params *params)
{
const struct rtw89_chip_info *chip = rtwdev->chip;
+ struct rtw89_vif_link *rtwvif_link;
+ struct rtw89_sta_link *rtwsta_link;
struct rtw89_h2c_ba_cam_v1 *h2c;
- u8 macid = rtwsta_link->mac_id;
+ struct ieee80211_vif *vif;
u32 len = sizeof(*h2c);
struct sk_buff *skb;
u8 entry_idx;
u8 bmap_size;
+ bool is_mld;
+ u8 macid;
int ret;
+ rtwsta_link = rtw89_get_designated_link(rtwsta);
+ rtwvif_link = rtwsta_link->rtwvif_link;
+ vif = rtwvif_link_to_vif(rtwvif_link);
+
+ macid = rtwsta_link->mac_id;
+ is_mld = ieee80211_vif_is_mld(vif);
+
ret = valid ?
- rtw89_core_acquire_sta_ba_entry(rtwdev, rtwsta_link, params->tid,
+ rtw89_core_acquire_sta_ba_entry(rtwdev, rtwsta, params->tid,
&entry_idx) :
- rtw89_core_release_sta_ba_entry(rtwdev, rtwsta_link, params->tid,
+ rtw89_core_release_sta_ba_entry(rtwdev, rtwsta, params->tid,
&entry_idx);
if (ret) {
/* it still works even if we don't have static BA CAM, because
@@ -2797,6 +2811,7 @@ int rtw89_fw_h2c_ba_cam_v1(struct rtw89_dev *rtwdev,
entry_idx += chip->bacam_dynamic_num; /* std entry right after dynamic ones */
h2c->w1 = le32_encode_bits(entry_idx, RTW89_H2C_BA_CAM_V1_W1_ENTRY_IDX_MASK) |
le32_encode_bits(1, RTW89_H2C_BA_CAM_V1_W1_STD_ENTRY_EN) |
+ le32_encode_bits(is_mld, RTW89_H2C_BA_CAM_V1_W1_MLD_EN) |
le32_encode_bits(!!rtwvif_link->mac_idx,
RTW89_H2C_BA_CAM_V1_W1_BAND_SEL);
@@ -2820,24 +2835,33 @@ fail:
}
EXPORT_SYMBOL(rtw89_fw_h2c_ba_cam_v1);
-int rtw89_fw_h2c_ba_cam_g7(struct rtw89_dev *rtwdev,
- struct rtw89_vif_link *rtwvif_link,
- struct rtw89_sta_link *rtwsta_link,
+int rtw89_fw_h2c_ba_cam_g7(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
bool valid, struct ieee80211_ampdu_params *params)
{
const struct rtw89_chip_info *chip = rtwdev->chip;
+ struct rtw89_vif_link *rtwvif_link;
+ struct rtw89_sta_link *rtwsta_link;
struct rtw89_h2c_ba_cam_g7 *h2c;
- u16 macid = rtwsta_link->mac_id;
+ struct ieee80211_vif *vif;
u32 len = sizeof(*h2c);
struct sk_buff *skb;
u8 entry_idx;
u8 bmap_size;
+ bool is_mld;
+ u16 macid;
int ret;
+ rtwsta_link = rtw89_get_designated_link(rtwsta);
+ rtwvif_link = rtwsta_link->rtwvif_link;
+ vif = rtwvif_link_to_vif(rtwvif_link);
+
+ macid = rtwsta_link->mac_id;
+ is_mld = ieee80211_vif_is_mld(vif);
+
ret = valid ?
- rtw89_core_acquire_sta_ba_entry(rtwdev, rtwsta_link, params->tid,
+ rtw89_core_acquire_sta_ba_entry(rtwdev, rtwsta, params->tid,
&entry_idx) :
- rtw89_core_release_sta_ba_entry(rtwdev, rtwsta_link, params->tid,
+ rtw89_core_release_sta_ba_entry(rtwdev, rtwsta, params->tid,
&entry_idx);
if (ret) {
/*
@@ -2871,6 +2895,7 @@ int rtw89_fw_h2c_ba_cam_g7(struct rtw89_dev *rtwdev,
le32_encode_bits(1, RTW89_H2C_BA_CAM_G7_W0_INIT_REQ) |
le32_encode_bits(params->tid, RTW89_H2C_BA_CAM_G7_W0_TID_MASK) |
le32_encode_bits(1, RTW89_H2C_BA_CAM_G7_W0_STD_ENTRY_EN) |
+ le32_encode_bits(is_mld, RTW89_H2C_BA_CAM_G7_W0_MLD_EN) |
le32_encode_bits(!!rtwvif_link->mac_idx,
RTW89_H2C_BA_CAM_G7_W0_BAND_SEL) |
le32_encode_bits(bmap_size, RTW89_H2C_BA_CAM_G7_W0_BMAP_SIZE_MASK) |
diff --git a/drivers/net/wireless/realtek/rtw89/fw.h b/drivers/net/wireless/realtek/rtw89/fw.h
index 5df3bb97249a..473278f6bbea 100644
--- a/drivers/net/wireless/realtek/rtw89/fw.h
+++ b/drivers/net/wireless/realtek/rtw89/fw.h
@@ -5593,17 +5593,11 @@ void rtw89_fw_release_general_pkt_list_vif(struct rtw89_dev *rtwdev,
struct rtw89_vif_link *rtwvif_link,
bool notify_fw);
void rtw89_fw_release_general_pkt_list(struct rtw89_dev *rtwdev, bool notify_fw);
-int rtw89_fw_h2c_ba_cam(struct rtw89_dev *rtwdev,
- struct rtw89_vif_link *rtwvif_link,
- struct rtw89_sta_link *rtwsta_link,
+int rtw89_fw_h2c_ba_cam(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
bool valid, struct ieee80211_ampdu_params *params);
-int rtw89_fw_h2c_ba_cam_v1(struct rtw89_dev *rtwdev,
- struct rtw89_vif_link *rtwvif_link,
- struct rtw89_sta_link *rtwsta_link,
+int rtw89_fw_h2c_ba_cam_v1(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
bool valid, struct ieee80211_ampdu_params *params);
-int rtw89_fw_h2c_ba_cam_g7(struct rtw89_dev *rtwdev,
- struct rtw89_vif_link *rtwvif_link,
- struct rtw89_sta_link *rtwsta_link,
+int rtw89_fw_h2c_ba_cam_g7(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,
@@ -5845,20 +5839,8 @@ int rtw89_chip_h2c_ba_cam(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
bool valid, struct ieee80211_ampdu_params *params)
{
const struct rtw89_chip_info *chip = rtwdev->chip;
- struct rtw89_vif_link *rtwvif_link;
- struct rtw89_sta_link *rtwsta_link;
- unsigned int link_id;
- int ret;
-
- rtw89_sta_for_each_link(rtwsta, rtwsta_link, link_id) {
- rtwvif_link = rtwsta_link->rtwvif_link;
- ret = chip->ops->h2c_ba_cam(rtwdev, rtwvif_link, rtwsta_link,
- valid, params);
- if (ret)
- return ret;
- }
- return 0;
+ return chip->ops->h2c_ba_cam(rtwdev, rtwsta, valid, params);
}
static inline
diff --git a/drivers/net/wireless/realtek/rtw89/mac80211.c b/drivers/net/wireless/realtek/rtw89/mac80211.c
index cf356a54d91c..9e6cafc492c4 100644
--- a/drivers/net/wireless/realtek/rtw89/mac80211.c
+++ b/drivers/net/wireless/realtek/rtw89/mac80211.c
@@ -519,6 +519,8 @@ static int __rtw89_ops_sta_add(struct rtw89_dev *rtwdev,
INIT_LIST_HEAD(&rtwsta->dlink_pool);
skb_queue_head_init(&rtwsta->roc_queue);
+
+ INIT_LIST_HEAD(&rtwsta->ba_cam_list);
bitmap_zero(rtwsta->pairwise_sec_cam_map, RTW89_MAX_SEC_CAM_NUM);
rtwsta_link = rtw89_sta_set_link(rtwsta, sta->deflink.link_id);
diff --git a/drivers/net/wireless/realtek/rtw89/ser.c b/drivers/net/wireless/realtek/rtw89/ser.c
index a507ce1fcd63..701440bd7be1 100644
--- a/drivers/net/wireless/realtek/rtw89/ser.c
+++ b/drivers/net/wireless/realtek/rtw89/ser.c
@@ -327,6 +327,8 @@ static void ser_sta_deinit_cam_iter(void *data, struct ieee80211_sta *sta)
if (rtwvif != target_rtwvif)
return;
+ INIT_LIST_HEAD(&rtwsta->ba_cam_list);
+
rtw89_sta_for_each_link(rtwsta, rtwsta_link, link_id) {
rtwvif_link = rtwsta_link->rtwvif_link;
@@ -334,8 +336,6 @@ static void ser_sta_deinit_cam_iter(void *data, struct ieee80211_sta *sta)
rtw89_cam_deinit_addr_cam(rtwdev, &rtwsta_link->addr_cam);
if (sta->tdls)
rtw89_cam_deinit_bssid_cam(rtwdev, &rtwsta_link->bssid_cam);
-
- INIT_LIST_HEAD(&rtwsta_link->ba_cam_list);
}
}