mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
wifi: mt76: mt7996: Add MLO support to mt7996_tx_check_aggr()
Generalize mt7996_tx_check_aggr() and mt7996_txwi_free() routines to introduce MLO support for MT7996 driver. Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> Link: https://patch.msgid.link/20250704-mt7996-mlo-fixes-v1-8-356456c73f43@kernel.org Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
a59650a227
commit
62da647a2b
1 changed files with 21 additions and 23 deletions
|
@ -1129,15 +1129,14 @@ u32 mt7996_wed_init_buf(void *ptr, dma_addr_t phys, int token_id)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mt7996_tx_check_aggr(struct ieee80211_sta *sta, struct sk_buff *skb)
|
mt7996_tx_check_aggr(struct ieee80211_link_sta *link_sta,
|
||||||
|
struct mt76_wcid *wcid, struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||||
bool is_8023 = info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP;
|
bool is_8023 = info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP;
|
||||||
struct mt7996_sta_link *msta_link;
|
|
||||||
struct mt7996_sta *msta;
|
|
||||||
u16 fc, tid;
|
u16 fc, tid;
|
||||||
|
|
||||||
if (!sta || !(sta->deflink.ht_cap.ht_supported || sta->deflink.he_cap.has_he))
|
if (!(link_sta->ht_cap.ht_supported || link_sta->he_cap.has_he))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK;
|
tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK;
|
||||||
|
@ -1146,7 +1145,8 @@ mt7996_tx_check_aggr(struct ieee80211_sta *sta, struct sk_buff *skb)
|
||||||
|
|
||||||
if (is_8023) {
|
if (is_8023) {
|
||||||
fc = IEEE80211_FTYPE_DATA |
|
fc = IEEE80211_FTYPE_DATA |
|
||||||
(sta->wme ? IEEE80211_STYPE_QOS_DATA : IEEE80211_STYPE_DATA);
|
(link_sta->sta->wme ? IEEE80211_STYPE_QOS_DATA
|
||||||
|
: IEEE80211_STYPE_DATA);
|
||||||
} else {
|
} else {
|
||||||
/* No need to get precise TID for Action/Management Frame,
|
/* No need to get precise TID for Action/Management Frame,
|
||||||
* since it will not meet the following Frame Control
|
* since it will not meet the following Frame Control
|
||||||
|
@ -1162,19 +1162,16 @@ mt7996_tx_check_aggr(struct ieee80211_sta *sta, struct sk_buff *skb)
|
||||||
if (unlikely(fc != (IEEE80211_FTYPE_DATA | IEEE80211_STYPE_QOS_DATA)))
|
if (unlikely(fc != (IEEE80211_FTYPE_DATA | IEEE80211_STYPE_QOS_DATA)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
msta = (struct mt7996_sta *)sta->drv_priv;
|
if (!test_and_set_bit(tid, &wcid->ampdu_state))
|
||||||
msta_link = &msta->deflink;
|
ieee80211_start_tx_ba_session(link_sta->sta, tid, 0);
|
||||||
|
|
||||||
if (!test_and_set_bit(tid, &msta_link->wcid.ampdu_state))
|
|
||||||
ieee80211_start_tx_ba_session(sta, tid, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mt7996_txwi_free(struct mt7996_dev *dev, struct mt76_txwi_cache *t,
|
mt7996_txwi_free(struct mt7996_dev *dev, struct mt76_txwi_cache *t,
|
||||||
struct ieee80211_sta *sta, struct list_head *free_list)
|
struct ieee80211_link_sta *link_sta,
|
||||||
|
struct mt76_wcid *wcid, struct list_head *free_list)
|
||||||
{
|
{
|
||||||
struct mt76_dev *mdev = &dev->mt76;
|
struct mt76_dev *mdev = &dev->mt76;
|
||||||
struct mt76_wcid *wcid;
|
|
||||||
__le32 *txwi;
|
__le32 *txwi;
|
||||||
u16 wcid_idx;
|
u16 wcid_idx;
|
||||||
|
|
||||||
|
@ -1183,12 +1180,10 @@ mt7996_txwi_free(struct mt7996_dev *dev, struct mt76_txwi_cache *t,
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
txwi = (__le32 *)mt76_get_txwi_ptr(mdev, t);
|
txwi = (__le32 *)mt76_get_txwi_ptr(mdev, t);
|
||||||
if (sta) {
|
if (link_sta) {
|
||||||
wcid = (struct mt76_wcid *)sta->drv_priv;
|
|
||||||
wcid_idx = wcid->idx;
|
wcid_idx = wcid->idx;
|
||||||
|
|
||||||
if (likely(t->skb->protocol != cpu_to_be16(ETH_P_PAE)))
|
if (likely(t->skb->protocol != cpu_to_be16(ETH_P_PAE)))
|
||||||
mt7996_tx_check_aggr(sta, t->skb);
|
mt7996_tx_check_aggr(link_sta, wcid, t->skb);
|
||||||
} else {
|
} else {
|
||||||
wcid_idx = le32_get_bits(txwi[9], MT_TXD9_WLAN_IDX);
|
wcid_idx = le32_get_bits(txwi[9], MT_TXD9_WLAN_IDX);
|
||||||
}
|
}
|
||||||
|
@ -1207,8 +1202,8 @@ mt7996_mac_tx_free(struct mt7996_dev *dev, void *data, int len)
|
||||||
struct mt76_dev *mdev = &dev->mt76;
|
struct mt76_dev *mdev = &dev->mt76;
|
||||||
struct mt76_phy *phy2 = mdev->phys[MT_BAND1];
|
struct mt76_phy *phy2 = mdev->phys[MT_BAND1];
|
||||||
struct mt76_phy *phy3 = mdev->phys[MT_BAND2];
|
struct mt76_phy *phy3 = mdev->phys[MT_BAND2];
|
||||||
|
struct ieee80211_link_sta *link_sta = NULL;
|
||||||
struct mt76_txwi_cache *txwi;
|
struct mt76_txwi_cache *txwi;
|
||||||
struct ieee80211_sta *sta = NULL;
|
|
||||||
struct mt76_wcid *wcid = NULL;
|
struct mt76_wcid *wcid = NULL;
|
||||||
LIST_HEAD(free_list);
|
LIST_HEAD(free_list);
|
||||||
struct sk_buff *skb, *tmp;
|
struct sk_buff *skb, *tmp;
|
||||||
|
@ -1245,7 +1240,7 @@ mt7996_mac_tx_free(struct mt7996_dev *dev, void *data, int len)
|
||||||
*/
|
*/
|
||||||
info = le32_to_cpu(*cur_info);
|
info = le32_to_cpu(*cur_info);
|
||||||
if (info & MT_TXFREE_INFO_PAIR) {
|
if (info & MT_TXFREE_INFO_PAIR) {
|
||||||
struct mt7996_sta_link *msta_link;
|
struct ieee80211_sta *sta;
|
||||||
u16 idx;
|
u16 idx;
|
||||||
|
|
||||||
idx = FIELD_GET(MT_TXFREE_INFO_WLAN_ID, info);
|
idx = FIELD_GET(MT_TXFREE_INFO_WLAN_ID, info);
|
||||||
|
@ -1254,9 +1249,11 @@ mt7996_mac_tx_free(struct mt7996_dev *dev, void *data, int len)
|
||||||
if (!sta)
|
if (!sta)
|
||||||
goto next;
|
goto next;
|
||||||
|
|
||||||
msta_link = container_of(wcid, struct mt7996_sta_link,
|
link_sta = rcu_dereference(sta->link[wcid->link_id]);
|
||||||
wcid);
|
if (!link_sta)
|
||||||
mt76_wcid_add_poll(&dev->mt76, &msta_link->wcid);
|
goto next;
|
||||||
|
|
||||||
|
mt76_wcid_add_poll(&dev->mt76, wcid);
|
||||||
next:
|
next:
|
||||||
/* ver 7 has a new DW with pair = 1, skip it */
|
/* ver 7 has a new DW with pair = 1, skip it */
|
||||||
if (ver == 7 && ((void *)(cur_info + 1) < end) &&
|
if (ver == 7 && ((void *)(cur_info + 1) < end) &&
|
||||||
|
@ -1289,7 +1286,8 @@ next:
|
||||||
if (!txwi)
|
if (!txwi)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
mt7996_txwi_free(dev, txwi, sta, &free_list);
|
mt7996_txwi_free(dev, txwi, link_sta, wcid,
|
||||||
|
&free_list);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1748,7 +1746,7 @@ void mt7996_tx_token_put(struct mt7996_dev *dev)
|
||||||
|
|
||||||
spin_lock_bh(&dev->mt76.token_lock);
|
spin_lock_bh(&dev->mt76.token_lock);
|
||||||
idr_for_each_entry(&dev->mt76.token, txwi, id) {
|
idr_for_each_entry(&dev->mt76.token, txwi, id) {
|
||||||
mt7996_txwi_free(dev, txwi, NULL, NULL);
|
mt7996_txwi_free(dev, txwi, NULL, NULL, NULL);
|
||||||
dev->mt76.token_count--;
|
dev->mt76.token_count--;
|
||||||
}
|
}
|
||||||
spin_unlock_bh(&dev->mt76.token_lock);
|
spin_unlock_bh(&dev->mt76.token_lock);
|
||||||
|
|
Loading…
Add table
Reference in a new issue