Skip to content

Commit c1d6dd5

Browse files
csyuancnbd168
authored andcommitted
wifi: mt76: mt7996: Add mt7996_mcu_teardown_mld_sta rouine
mt7996_mcu_teardown_mld_sta is used to remove MLO configuration from the MCU. This is a preliminary patch to enable MLO for MT7996 driver Co-developed-by: Bo Jiao <Bo.Jiao@mediatek.com> Signed-off-by: Bo Jiao <Bo.Jiao@mediatek.com> Co-developed-by: Peter Chiu <chui-hao.chiu@mediatek.com> Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com> Signed-off-by: Shayne Chen <shayne.chen@mediatek.com> Co-developed-by: Lorenzo Bianconi <lorenzo@kernel.org> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> Link: https://patch.msgid.link/20250312-b4-mt7996-mlo-p2-v1-3-015b3d6fd928@kernel.org Signed-off-by: Felix Fietkau <nbd@nbd.name>
1 parent 00cef41 commit c1d6dd5

File tree

3 files changed

+30
-3
lines changed

3 files changed

+30
-3
lines changed

drivers/net/wireless/mediatek/mt76/mt7996/main.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,6 +1017,7 @@ mt7996_mac_sta_event(struct mt7996_dev *dev, struct ieee80211_vif *vif,
10171017
struct ieee80211_sta *sta, enum mt76_sta_event ev)
10181018
{
10191019
struct mt7996_sta *msta = (struct mt7996_sta *)sta->drv_priv;
1020+
unsigned long links = sta->valid_links;
10201021
struct ieee80211_link_sta *link_sta;
10211022
unsigned int link_id;
10221023

@@ -1067,11 +1068,16 @@ mt7996_mac_sta_event(struct mt7996_dev *dev, struct ieee80211_vif *vif,
10671068
mt7996_mac_twt_teardown_flow(dev, link,
10681069
msta_link, i);
10691070

1070-
mt7996_mcu_add_sta(dev, link_conf, link_sta, link,
1071-
msta_link, CONN_STATE_DISCONNECT,
1072-
false);
1071+
if (sta->mlo && links == BIT(link_id)) /* last link */
1072+
mt7996_mcu_teardown_mld_sta(dev, link,
1073+
msta_link);
1074+
else
1075+
mt7996_mcu_add_sta(dev, link_conf, link_sta,
1076+
link, msta_link,
1077+
CONN_STATE_DISCONNECT, false);
10731078
msta_link->wcid.sta_disabled = 1;
10741079
msta_link->wcid.sta = 0;
1080+
links = links & ~BIT(link_id);
10751081
break;
10761082
}
10771083
}

drivers/net/wireless/mediatek/mt76/mt7996/mcu.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2346,6 +2346,24 @@ int mt7996_mcu_add_sta(struct mt7996_dev *dev,
23462346
MCU_WMWA_UNI_CMD(STA_REC_UPDATE), true);
23472347
}
23482348

2349+
int mt7996_mcu_teardown_mld_sta(struct mt7996_dev *dev,
2350+
struct mt7996_vif_link *link,
2351+
struct mt7996_sta_link *msta_link)
2352+
{
2353+
struct sk_buff *skb;
2354+
2355+
skb = __mt76_connac_mcu_alloc_sta_req(&dev->mt76, &link->mt76,
2356+
&msta_link->wcid,
2357+
MT7996_STA_UPDATE_MAX_SIZE);
2358+
if (IS_ERR(skb))
2359+
return PTR_ERR(skb);
2360+
2361+
mt76_connac_mcu_add_tlv(skb, STA_REC_MLD_OFF, sizeof(struct tlv));
2362+
2363+
return mt76_mcu_skb_send_msg(&dev->mt76, skb,
2364+
MCU_WMWA_UNI_CMD(STA_REC_UPDATE), true);
2365+
}
2366+
23492367
static int
23502368
mt7996_mcu_sta_key_tlv(struct mt76_wcid *wcid,
23512369
struct sk_buff *skb,

drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -578,6 +578,9 @@ int mt7996_mcu_add_sta(struct mt7996_dev *dev,
578578
struct mt7996_vif_link *link,
579579
struct mt7996_sta_link *msta_link,
580580
int conn_state, bool newly);
581+
int mt7996_mcu_teardown_mld_sta(struct mt7996_dev *dev,
582+
struct mt7996_vif_link *link,
583+
struct mt7996_sta_link *msta_link);
581584
int mt7996_mcu_add_tx_ba(struct mt7996_dev *dev,
582585
struct ieee80211_ampdu_params *params,
583586
bool add);

0 commit comments

Comments
 (0)