blob: 8e716a0fad413ca293e8907a4cabccd42321c055 [file] [log] [blame]
From 274d96dc00990390f4e830452d9032471deacf33 Mon Sep 17 00:00:00 2001
From: Peter Chiu <chui-hao.chiu@mediatek.com>
Date: Fri, 6 Oct 2023 11:44:03 +0800
Subject: [PATCH 31/98] wifi: mt76: mt7996: refine ampdu factor
Firmware would parse ht/vht/he/eht cap to get correct ampdu parameters.
---
mt76_connac_mcu.h | 4 +++-
mt7996/mcu.c | 44 ++++----------------------------------------
mt7996/mcu.h | 1 -
3 files changed, 7 insertions(+), 42 deletions(-)
diff --git a/mt76_connac_mcu.h b/mt76_connac_mcu.h
index 6fac67b..ca2e573 100644
--- a/mt76_connac_mcu.h
+++ b/mt76_connac_mcu.h
@@ -298,7 +298,9 @@ struct sta_rec_ht {
__le16 tag;
__le16 len;
__le16 ht_cap;
- u16 rsv;
+ __le16 ht_cap_ext;
+ u8 ampdu_param;
+ u8 _rsv[3];
} __packed;
struct sta_rec_vht {
diff --git a/mt7996/mcu.c b/mt7996/mcu.c
index 60af1d4..8b81644 100644
--- a/mt7996/mcu.c
+++ b/mt7996/mcu.c
@@ -1195,6 +1195,10 @@ mt7996_mcu_sta_ht_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
ht = (struct sta_rec_ht *)tlv;
ht->ht_cap = cpu_to_le16(sta->deflink.ht_cap.cap);
+ ht->ampdu_param = u8_encode_bits(sta->deflink.ht_cap.ampdu_factor,
+ IEEE80211_HT_AMPDU_PARM_FACTOR) |
+ u8_encode_bits(sta->deflink.ht_cap.ampdu_density,
+ IEEE80211_HT_AMPDU_PARM_DENSITY);
}
static void
@@ -1651,44 +1655,6 @@ mt7996_mcu_sta_bfee_tlv(struct mt7996_dev *dev, struct sk_buff *skb,
bfee->fb_identity_matrix = (nrow == 1 && tx_ant == 2);
}
-static void
-mt7996_mcu_sta_phy_tlv(struct mt7996_dev *dev, struct sk_buff *skb,
- struct ieee80211_vif *vif, struct ieee80211_sta *sta)
-{
- struct sta_rec_phy *phy;
- struct tlv *tlv;
- u8 af = 0, mm = 0;
-
- if (!sta->deflink.ht_cap.ht_supported && !sta->deflink.he_6ghz_capa.capa)
- return;
-
- tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_PHY, sizeof(*phy));
-
- phy = (struct sta_rec_phy *)tlv;
- if (sta->deflink.ht_cap.ht_supported) {
- af = sta->deflink.ht_cap.ampdu_factor;
- mm = sta->deflink.ht_cap.ampdu_density;
- }
-
- if (sta->deflink.vht_cap.vht_supported) {
- u8 vht_af = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
- sta->deflink.vht_cap.cap);
-
- af = max_t(u8, af, vht_af);
- }
-
- if (sta->deflink.he_6ghz_capa.capa) {
- af = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
- IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
- mm = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
- IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START);
- }
-
- phy->ampdu = FIELD_PREP(IEEE80211_HT_AMPDU_PARM_FACTOR, af) |
- FIELD_PREP(IEEE80211_HT_AMPDU_PARM_DENSITY, mm);
- phy->max_ampdu_len = af;
-}
-
static void
mt7996_mcu_sta_hdrt_tlv(struct mt7996_dev *dev, struct sk_buff *skb)
{
@@ -2100,8 +2066,6 @@ int mt7996_mcu_add_sta(struct mt7996_dev *dev, struct ieee80211_vif *vif,
/* tag order is in accordance with firmware dependency. */
if (sta) {
- /* starec phy */
- mt7996_mcu_sta_phy_tlv(dev, skb, vif, sta);
/* starec hdrt mode */
mt7996_mcu_sta_hdrt_tlv(dev, skb);
/* starec bfer */
diff --git a/mt7996/mcu.h b/mt7996/mcu.h
index af7cd18..ca16336 100644
--- a/mt7996/mcu.h
+++ b/mt7996/mcu.h
@@ -730,7 +730,6 @@ enum {
sizeof(struct sta_rec_uapsd) + \
sizeof(struct sta_rec_amsdu) + \
sizeof(struct sta_rec_bfee) + \
- sizeof(struct sta_rec_phy) + \
sizeof(struct sta_rec_ra_uni) + \
sizeof(struct sta_rec_sec) + \
sizeof(struct sta_rec_ra_fixed_uni) + \
--
2.18.0