wifi: mt76: connac: Extend mt76_connac_mcu_uni_add_dev for MLO
Subsystems (2)
PATCH 1/17 wifi: mt76: connac: Extend mt76_connac_mcu_uni_add_dev for MLO
From: Sean Wang <[email protected]>
This commit extends the mt76_connac_mcu_uni_add_dev function to include support for Multi-Link Operation (MLO). Additionally, backward compatibility for MT7921 is preserved, enabling seamless integration with existing setups.
--- drivers/net/wireless/mediatek/mt76/mt7615/mcu.c | 2 +- drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c | 2 +- drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h | 1 + drivers/net/wireless/mediatek/mt76/mt7921/mac.c | 1 + drivers/net/wireless/mediatek/mt76/mt7921/main.c | 1 + drivers/net/wireless/mediatek/mt76/mt7925/mac.c | 4 +++- drivers/net/wireless/mediatek/mt76/mt7925/main.c | 2 +- drivers/net/wireless/mediatek/mt76/mt792x_core.c | 3 ++- 8 files changed, 11 insertions(+), 5 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +1 -1
@@ -1113,7 +1113,7 @@ mt7615_mcu_uni_add_dev(struct mt7615_phy *phy, struct ieee80211_vif *vif, {struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; -return mt76_connac_mcu_uni_add_dev (phy->mt76, &vif->bss_conf, +return mt76_connac_mcu_uni_add_dev (phy->mt76, &vif->bss_conf, &mvif->mt76, &mvif->sta.wcid, enable); }
drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c +1 -1
@@ -1137,10 +1137,10 @@ EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_ba_tlv);int mt76_connac_mcu_uni_add_dev (struct mt76_phy *phy,struct ieee80211_bss_conf *bss_conf, +struct mt76_vif *mvif,struct mt76_wcid *wcid,bool enable) { -struct mt76_vif *mvif = (struct mt76_vif *)bss_conf->vif->drv_priv;struct mt76_dev *dev = phy->dev; struct { struct {
drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h +1 -0
@@ -1938,6 +1938,7 @@ void mt76_connac_mcu_sta_ba_tlv(struct sk_buff *skb, bool enable, bool tx);int mt76_connac_mcu_uni_add_dev (struct mt76_phy *phy,struct ieee80211_bss_conf *bss_conf, +struct mt76_vif *mvif,struct mt76_wcid *wcid,bool enable); int mt76_connac_mcu_sta_ba(struct mt76_dev *dev, struct mt76_vif *mvif,
drivers/net/wireless/mediatek/mt76/mt7921/mac.c +1 -0
@@ -647,6 +647,7 @@ mt7921_vif_connect_iter(void *priv, u8 *mac,ieee80211_disconnect (vif, true);mt76_connac_mcu_uni_add_dev (&dev->mphy, &vif->bss_conf, + &mvif->bss_conf.mt76, &mvif->sta.deflink.wcid, true);mt7921_mcu_set_tx (dev, vif);
drivers/net/wireless/mediatek/mt76/mt7921/main.c +1 -0
@@ -308,6 +308,7 @@ mt7921_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif) mvif->bss_conf.mt76.wmm_idx = mvif->bss_conf.mt76.idx %MT76_CONNAC_MAX_WMM_SETS ; ret =mt76_connac_mcu_uni_add_dev (&dev->mphy, &vif->bss_conf, + &mvif->bss_conf.mt76, &mvif->sta.deflink.wcid, true);if (ret) goto out;
drivers/net/wireless/mediatek/mt76/mt7925/mac.c +3 -1
@@ -1271,6 +1271,7 @@ mt7925_vif_connect_iter(void *priv, u8 *mac,struct mt792x_dev *dev = mvif->phy->dev;struct ieee80211_hw *hw =mt76_hw (dev);struct ieee80211_bss_conf *bss_conf; +struct mt792x_bss_conf *mconf;int i;if (vif->type ==NL80211_IFTYPE_STATION )
@@ -1278,8 +1279,9 @@ mt7925_vif_connect_iter(void *priv, u8 *mac,for_each_set_bit (i, &valid,IEEE80211_MLD_MAX_NUM_LINKS ) { bss_conf =mt792x_vif_to_bss_conf (vif, i); + mconf =mt792x_vif_to_link (mvif, i); -mt76_connac_mcu_uni_add_dev (&dev->mphy, bss_conf, +mt76_connac_mcu_uni_add_dev (&dev->mphy, bss_conf, &mconf->mt76, &mvif->sta.deflink.wcid, true);mt7925_mcu_set_tx (dev, bss_conf); }
drivers/net/wireless/mediatek/mt76/mt7925/main.c +1 -1
@@ -372,7 +372,7 @@ static int mt7925_mac_link_bss_add(struct mt792x_dev *dev,else mconf->mt76.basic_rates_idx = MT792x_BASIC_RATES_TBL; - ret =mt76_connac_mcu_uni_add_dev (&dev->mphy, link_conf, + ret =mt76_connac_mcu_uni_add_dev (&dev->mphy, link_conf, &mconf->mt76, &mlink->wcid, true);if (ret) goto out;
drivers/net/wireless/mediatek/mt76/mt792x_core.c +2 -1
@@ -151,7 +151,8 @@ void mt792x_mac_link_bss_remove(struct mt792x_dev *dev, link_conf =mt792x_vif_to_bss_conf (vif, mconf->link_id);mt76_connac_free_pending_tx_skbs (&dev->pm, &mlink->wcid); -mt76_connac_mcu_uni_add_dev (&dev->mphy, link_conf, &mlink->wcid, false); +mt76_connac_mcu_uni_add_dev (&dev->mphy, link_conf, &mconf->mt76, + &mlink->wcid, false);rcu_assign_pointer (dev->mt76.wcid[idx],NULL );
Signature · 1 line
2.25.1
PATCH 2/17 wifi: mt76: mt7925: Fix incorrect MLD address in bss_mld_tlv for MLO support
From: Ming Yen Hsieh <[email protected]>
For this TLV, the address should be set to the MLD address rather than the link address.
--- drivers/net/wireless/mediatek/mt76/mt7925/mcu.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mt7925/mcu.c +2 -1
@@ -2463,6 +2463,7 @@ static void mt7925_mcu_bss_mld_tlv(struct sk_buff *skb, struct ieee80211_bss_conf *link_conf) { + struct ieee80211_vif *vif = link_conf->vif;struct mt792x_bss_conf *mconf =mt792x_link_conf_to_mconf (link_conf);struct mt792x_vif *mvif = (struct mt792x_vif *)link_conf->vif->drv_priv;struct bss_mld_tlv *mld;
@@ -2483,7 +2484,7 @@ mt7925_mcu_bss_mld_tlv(struct sk_buff *skb, mld->eml_enable = !!(link_conf->vif->cfg.eml_cap &IEEE80211_EML_CAP_EMLSR_SUPP ); -memcpy (mld->mac_addr, link_conf->addr,ETH_ALEN ); +memcpy (mld->mac_addr, vif->addr,ETH_ALEN ); } static void
Signature · 1 line
2.25.1
PATCH 3/17 wifi: mt76: mt7925: Fix incorrect WCID assignment for MLO
In reply to [email protected]From: Ming Yen Hsieh <[email protected]>
For MLO, each link must have a corresponding WCID.
--- .../net/wireless/mediatek/mt76/mt7925/mac.c | 2 +- .../net/wireless/mediatek/mt76/mt7925/main.c | 19 ++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7925/mac.c +1 -1
@@ -49,7 +49,7 @@ static void mt7925_mac_sta_poll(struct mt792x_dev *dev)break ; mlink =list_first_entry (&sta_poll_list, struct mt792x_link_sta, wcid.poll_list); - msta = container_of(mlink, struct mt792x_sta, deflink); + msta = mlink->sta;spin_lock_bh (&dev->mt76.sta_poll_lock);list_del_init (&mlink->wcid.poll_list);spin_unlock_bh (&dev->mt76.sta_poll_lock);
drivers/net/wireless/mediatek/mt76/mt7925/main.c +10 -9
@@ -837,6 +837,7 @@ static int mt7925_mac_link_sta_add(struct mt76_dev *mdev,u8 link_id = link_sta->link_id;struct mt792x_link_sta *mlink;struct mt792x_sta *msta; +struct mt76_wcid *wcid;int ret, idx; msta = (struct mt792x_sta *)link_sta->sta->drv_priv;
@@ -855,6 +856,15 @@ static int mt7925_mac_link_sta_add(struct mt76_dev *mdev, mlink->last_txs = jiffies; mlink->wcid.link_id = link_sta->link_id; mlink->wcid.link_valid = !!link_sta->sta->valid_links; + mlink->sta = msta; + + wcid = &mlink->wcid; +ewma_signal_init (&wcid->rssi); +rcu_assign_pointer (dev->mt76.wcid[wcid->idx], wcid); +mt76_wcid_init (wcid); +ewma_avg_signal_init (&mlink->avg_ack_signal); +memset (mlink->airtime_ac,0 , +sizeof (msta->deflink.airtime_ac)); ret =mt76_connac_pm_wake (&dev->mphy, &dev->pm);if (ret)
@@ -904,7 +914,6 @@ mt7925_mac_sta_add_links(struct mt792x_dev *dev, struct ieee80211_vif *vif, struct ieee80211_sta *sta, unsigned long new_links) { struct mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv; -struct mt76_wcid *wcid;unsigned int link_id;int err =0 ;
@@ -921,14 +930,6 @@ mt7925_mac_sta_add_links(struct mt792x_dev *dev, struct ieee80211_vif *vif, err = -ENOMEM ;break ; } - - wcid = &mlink->wcid; -ewma_signal_init (&wcid->rssi); -rcu_assign_pointer (dev->mt76.wcid[wcid->idx], wcid); -mt76_wcid_init (wcid); -ewma_avg_signal_init (&mlink->avg_ack_signal); -memset (mlink->airtime_ac,0 , -sizeof (msta->deflink.airtime_ac)); } msta->valid_links |=BIT (link_id);
Signature · 1 line
2.25.1
PATCH 4/17 wifi: mt76: mt7925: Fix incorrect band_idx setting when enabling sniffer mode
In reply to [email protected]From: Eric-SY Chang <[email protected]>
In the current sniffer mode, the band_idx must be set to 0.
--- drivers/net/wireless/mediatek/mt76/mt7925/mcu.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7925/mcu.c +1 -3
@@ -1976,8 +1976,6 @@ int mt7925_get_txpwr_info(struct mt792x_dev *dev, u8 band_idx, struct mt7925_txp int mt7925_mcu_set_sniffer(struct mt792x_dev *dev, struct ieee80211_vif *vif, bool enable) { - struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv; - struct { struct { u8 band_idx;
@@ -1991,7 +1989,7 @@ int mt7925_mcu_set_sniffer(struct mt792x_dev *dev, struct ieee80211_vif *vif, }__packed enable; }__packed req = { .hdr = { - .band_idx = mvif->bss_conf.mt76.band_idx, + .band_idx =0 , }, .enable = { .tag =cpu_to_le16 (UNI_SNIFFER_ENABLE ),
Signature · 1 line
2.25.1
PATCH 5/17 wifi: mt76: mt7925: Fix incorrect WCID phy_idx assignment
In reply to [email protected]From: "allan.wang" <[email protected]>
Fix incorrect WCID phy_idx assignment.
--- drivers/net/wireless/mediatek/mt76/mt7925/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7925/main.c +2 -2
@@ -384,7 +384,7 @@ static int mt7925_mac_link_bss_add(struct mt792x_dev *dev,INIT_LIST_HEAD (&mlink->wcid.poll_list); mlink->wcid.idx = idx; - mlink->wcid.phy_idx = mconf->mt76.band_idx; + mlink->wcid.phy_idx =0 ; mlink->wcid.hw_key_idx =-1 ; mlink->wcid.tx_info |=MT_WCID_TX_INFO_SET ;mt76_wcid_init (&mlink->wcid);
@@ -851,7 +851,7 @@ static int mt7925_mac_link_sta_add(struct mt76_dev *mdev,INIT_LIST_HEAD (&mlink->wcid.poll_list); mlink->wcid.sta =1 ; mlink->wcid.idx = idx; - mlink->wcid.phy_idx = mconf->mt76.band_idx; + mlink->wcid.phy_idx =0 ; mlink->wcid.tx_info |=MT_WCID_TX_INFO_SET ; mlink->last_txs = jiffies; mlink->wcid.link_id = link_sta->link_id;
Signature · 1 line
2.25.1
Re: [PATCH 05/17] wifi: mt76: mt7925: Fix incorrect WCID phy_idx assignment
Quoted 6 lines · [email protected] writes:
From: "allan.wang" <[email protected]>
Fix incorrect WCID
phy_idxassignment.Fixes 86c051f2c418 ("wifi: mt76: mt7925: enabling MLO when the firmware supports it")Signed-off-by allan.wang <[email protected]>
Allan's name seems to be in wrong format both in from and s-o-b. This is the preferred format:
Quoted 1 line
Signed-off-by Sean Wang <[email protected]>
Signature · 3 lines
https://patchwork.kernel.org/project/linux-wireless/list/ https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
PATCH 6/17 wifi: mt76: mt7925: fix wrong parameter for related cmd of chan info
In reply to [email protected]From: Ming Yen Hsieh <[email protected]>
Fix incorrect parameters for the related channel information command.
--- .../net/wireless/mediatek/mt76/mt7925/mcu.c | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7925/mcu.c +21 -2
@@ -1200,6 +1200,8 @@ int mt7925_mcu_set_mlo_roc(struct mt792x_bss_conf *mconf, u16 sel_links, req.roc[i].bw_from_ap =CMD_CBW_20MHZ ; req.roc[i].center_chan = center_ch; req.roc[i].center_chan_from_ap = center_ch; + req.roc[i].center_chan2 =0 ; + req.roc[i].center_chan2_from_ap =0 ;/* STR : 0xfe indicates BAND_ALL with enabling DBDC * EMLSR : 0xff indicates (BAND_AUTO) without DBDC
@@ -2177,11 +2179,27 @@ void mt7925_mcu_bss_rlm_tlv(struct sk_buff *skb, struct mt76_phy *phy, req = (struct bss_rlm_tlv *)tlv; req->control_channel = chandef->chan->hw_value; req->center_chan =ieee80211_frequency_to_channel (freq1); - req->center_chan2 =ieee80211_frequency_to_channel (freq2); + req->center_chan2 =0 ; req->tx_streams =hweight8 (phy->antenna_mask); req->ht_op_info =4 ;/* set HT 40M allowed */ req->rx_streams =hweight8 (phy->antenna_mask); - req->band = band; + req->center_chan2 =0 ; + req->sco =0 ; + req->band =1 ; + +switch (band) { +case NL80211_BAND_2GHZ : + req->band =1 ; +break ; +case NL80211_BAND_5GHZ : + req->band =2 ; +break ; +case NL80211_BAND_6GHZ : + req->band =3 ; +break ; +default : +break ; + }switch (chandef->width) {case NL80211_CHAN_WIDTH_40 :
@@ -2192,6 +2210,7 @@ void mt7925_mcu_bss_rlm_tlv(struct sk_buff *skb, struct mt76_phy *phy,break ;case NL80211_CHAN_WIDTH_80P80 : req->bw =CMD_CBW_8080MHZ ; + req->center_chan2 =ieee80211_frequency_to_channel (freq2);break ;case NL80211_CHAN_WIDTH_160 : req->bw =CMD_CBW_160MHZ ;
Signature · 1 line
2.25.1
PATCH 7/17 wifi: mt76: mt7925: Fix CNM Timeout with Single Active Link in MLO
In reply to [email protected]From: Leon Yen <[email protected]>
Fix CNM command timeout issue when only a single active link is available during MLO connection to fix the following kernel log error.
[ 741.931030] wlan0: [link 1] local address be:90:e0:22:c4:22, AP link address 08:0c:43:7a:19:2a [ 741.931042] wlan0: [link 1] determined AP 08:0c:43:7a:19:2a to be EHT [ 741.931052] wlan0: [link 1] connecting with EHT mode, max bandwidth 160 MHz [ 741.931071] wlan0: WMM AC=0 acm=0 aifs=2 cWmin=3 cWmax=7 txop=47 uapsd=0, downgraded=0 [ 741.931076] wlan0: WMM AC=1 acm=0 aifs=2 cWmin=7 cWmax=15 txop=94 uapsd=0, downgraded=0 [ 741.931080] wlan0: WMM AC=2 acm=0 aifs=3 cWmin=15 cWmax=1023 txop=0 uapsd=0, downgraded=0 [ 741.931085] wlan0: WMM AC=3 acm=0 aifs=7 cWmin=15 cWmax=1023 txop=0 uapsd=0, downgraded=0 [ 741.931095] wlan0: moving STA 22:0c:43:7a:19:2a to state 3 [ 749.090928] mt7925e 0000:2b:00.0: Message 00020002 (seq 15) timeout [ 752.162972] mt7925e 0000:2b:00.0: Message 00020003 (seq 1) timeout [ 755.234975] mt7925e 0000:2b:00.0: Message 00020002 (seq 2) timeout [ 758.306971] mt7925e 0000:2b:00.0: Message 00020004 (seq 3) timeout
--- drivers/net/wireless/mediatek/mt76/mt7925/mcu.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mt7925/mcu.c +6 -1
@@ -1153,7 +1153,12 @@ int mt7925_mcu_set_mlo_roc(struct mt792x_bss_conf *mconf, u16 sel_links,u8 rsv[4 ]; }__packed hdr;struct roc_acquire_tlv roc[2 ]; - }__packed req; + }__packed req = { + .roc[0 ].tag =cpu_to_le16 (UNI_ROC_NUM ), + .roc[0 ].len =cpu_to_le16 (sizeof (struct roc_acquire_tlv )), + .roc[1 ].tag =cpu_to_le16 (UNI_ROC_NUM ), + .roc[1 ].len =cpu_to_le16 (sizeof (struct roc_acquire_tlv )) + };if (!mconf ||hweight16 (vif->valid_links) <2 ||hweight16 (sel_links) !=2 )
Signature · 1 line
2.25.1
PATCH 8/17 wifi: mt76: mt7925: Enhance mt7925_mac_link_bss_add to support MLO
In reply to [email protected]From: Ming Yen Hsieh <[email protected]>
In mt7925_mac_link_bss_add(), the mt76_connac_mcu_uni_add_dev() function must be executed only after all parameters have been properly initialized.
--- drivers/net/wireless/mediatek/mt76/mt7925/main.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7925/main.c +8 -6
@@ -365,18 +365,14 @@ static int mt7925_mac_link_bss_add(struct mt792x_dev *dev, mconf->mt76.omac_idx =ieee80211_vif_is_mld (vif) ?0 : mconf->mt76.idx; mconf->mt76.band_idx =0xff ; - mconf->mt76.wmm_idx = mconf->mt76.idx %MT76_CONNAC_MAX_WMM_SETS ; + mconf->mt76.wmm_idx =ieee80211_vif_is_mld (vif) ? +0 : mconf->mt76.idx %MT76_CONNAC_MAX_WMM_SETS ;if (mvif->phy->mt76->chandef.chan->band !=NL80211_BAND_2GHZ ) mconf->mt76.basic_rates_idx = MT792x_BASIC_RATES_TBL +4 ;else mconf->mt76.basic_rates_idx = MT792x_BASIC_RATES_TBL; - ret =mt76_connac_mcu_uni_add_dev (&dev->mphy, link_conf, &mconf->mt76, - &mlink->wcid, true); -if (ret) - goto out; - dev->mt76.vif_mask |=BIT_ULL (mconf->mt76.idx); mvif->phy->omac_mask |=BIT_ULL (mconf->mt76.omac_idx);
@@ -395,6 +391,12 @@ static int mt7925_mac_link_bss_add(struct mt792x_dev *dev,ewma_rssi_init (&mconf->rssi);rcu_assign_pointer (dev->mt76.wcid[idx], &mlink->wcid); + + ret =mt76_connac_mcu_uni_add_dev (&dev->mphy, link_conf, &mconf->mt76, + &mlink->wcid, true); +if (ret) + goto out; +if (vif->txq) { mtxq = (struct mt76_txq *)vif->txq->drv_priv; mtxq->wcid = idx;
Signature · 1 line
2.25.1
PATCH 9/17 wifi: mt76: Enhance mt7925_mac_link_sta_add to support MLO
In reply to [email protected]From: Ming Yen Hsieh <[email protected]>
Enhance mt7925_mac_link_sta_add to support MLO.
--- drivers/net/wireless/mediatek/mt76/mt7925/main.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7925/main.c +8 -3
@@ -878,9 +878,14 @@ static int mt7925_mac_link_sta_add(struct mt76_dev *mdev, link_conf =mt792x_vif_to_bss_conf (vif, link_id);/* should update bss info before STA add */ -if (vif->type ==NL80211_IFTYPE_STATION && !link_sta->sta->tdls) -mt7925_mcu_add_bss_info (&dev->phy, mconf->mt76.ctx, - link_conf, link_sta, false); +if (vif->type ==NL80211_IFTYPE_STATION && !link_sta->sta->tdls) { +if (ieee80211_vif_is_mld (vif)) +mt7925_mcu_add_bss_info (&dev->phy, mconf->mt76.ctx, + link_conf, link_sta, link_sta != mlink->pri_link); +else +mt7925_mcu_add_bss_info (&dev->phy, mconf->mt76.ctx, + link_conf, link_sta, false); + }if (ieee80211_vif_is_mld (vif) && link_sta == mlink->pri_link) {
Signature · 1 line
2.25.1
PATCH 10/17 wifi: mt76: mt7925: Update mt7925_mcu_sta_update for BC in ASSOC state
In reply to [email protected]From: Ming Yen Hsieh <[email protected]>
Update mt7925_mcu_sta_update for broadcast (BC) in the ASSOC state.
--- drivers/net/wireless/mediatek/mt76/mt7925/mcu.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mt7925/mcu.c +5 -1
@@ -1905,7 +1905,11 @@ int mt7925_mcu_sta_update(struct mt792x_dev *dev, mlink =mt792x_sta_to_link (msta, link_sta->link_id); } info.wcid = link_sta ? &mlink->wcid : &mvif->sta.deflink.wcid; - info.newly = link_sta ? state !=MT76_STA_INFO_STATE_ASSOC : true; + +if (link_sta) + info.newly = state !=MT76_STA_INFO_STATE_ASSOC ; +else + info.newly = state ==MT76_STA_INFO_STATE_ASSOC ? false : true;if (ieee80211_vif_is_mld (vif)) err =mt7925_mcu_mlo_sta_cmd (&dev->mphy, &info);
Signature · 1 line
2.25.1
PATCH 11/17 wifi: mt76: mt7925: Update mt792x_rx_get_wcid for per-link STA
In reply to [email protected]From: Ming Yen Hsieh <[email protected]>
Update mt792x_rx_get_wcid to support per-link STA.
--- drivers/net/wireless/mediatek/mt76/mt792x_mac.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mt792x_mac.c +1 -1
@@ -153,7 +153,7 @@ struct mt76_wcid *mt792x_rx_get_wcid(struct mt792x_dev *dev, u16 idx,return NULL ; link = container_of(wcid, struct mt792x_link_sta, wcid); - sta = container_of(link, struct mt792x_sta, deflink); + sta = link->sta;if (!sta->vif)return NULL ;
Signature · 1 line
2.25.1
PATCH 12/17 wifi: mt76: mt7925: Update mt7925_unassign_vif_chanctx for per-link BSS
In reply to [email protected]From: Ming Yen Hsieh <[email protected]>
Update mt7925_unassign_vif_chanctx to support per-link BSS.
--- drivers/net/wireless/mediatek/mt76/mt7925/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mt7925/main.c +1 -1
@@ -2090,7 +2090,7 @@ static void mt7925_unassign_vif_chanctx(struct ieee80211_hw *hw,if (vif->type ==NL80211_IFTYPE_STATION && mconf == &mvif->bss_conf) -mt7925_mcu_add_bss_info (&dev->phy,NULL , pri_link_conf, +mt7925_mcu_add_bss_info (&dev->phy,NULL , link_conf,NULL , false); }else { mconf = &mvif->bss_conf;
Signature · 1 line
2.25.1
kernel test robot
build botRe: [PATCH 12/17] wifi: mt76: mt7925: Update mt7925_unassign_vif_chanctx for per-link BSS
kernel test robot noticed the following build warnings:
Hi,
kernel test robot noticed the following build warnings:
[auto build test WARNING on wireless-next/main]
[also build test WARNING on wireless/main linus/master v6.13-rc2 next-20241211] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/sean-wang-kernel-org/wifi-mt76-mt7925-Fix-incorrect-MLD-address-in-bss_mld_tlv-for-MLO-support/20241211-092359 base: https://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next.git main patch link: https://lore.kernel.org/r/20241211011926.5002-12-sean.wang%40kernel.org patch subject: [PATCH 12/17] wifi: mt76: mt7925: Update mt7925_unassign_vif_chanctx for per-link BSS config: sh-allyesconfig (https://download.01.org/0day-ci/archive/20241212/[email protected]/config) compiler: sh4-linux-gcc (GCC) 14.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241212/[email protected]/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/
All warnings (new ones prefixed by >>):
drivers/net/wireless/mediatek/mt76/mt7925/main.c: In function 'mt7925_unassign_vif_chanctx':
>> drivers/net/wireless/mediatek/mt76/mt7925/main.c:2082:36: warning: variable 'pri_link_conf' set but not used [-Wunused-but-set-variable]
2082 | struct ieee80211_bss_conf *pri_link_conf;
| ^~~~~~~~~~~~~vim +/pri_link_conf +2082 drivers/net/wireless/mediatek/mt76/mt7925/main.c
621e9e22b8d031 Sean Wang 2024-07-06 2073
621e9e22b8d031 Sean Wang 2024-07-06 2074 static void mt7925_unassign_vif_chanctx(struct ieee80211_hw *hw,
621e9e22b8d031 Sean Wang 2024-07-06 2075 struct ieee80211_vif *vif,
621e9e22b8d031 Sean Wang 2024-07-06 2076 struct ieee80211_bss_conf *link_conf,
621e9e22b8d031 Sean Wang 2024-07-06 2077 struct ieee80211_chanctx_conf *ctx)
621e9e22b8d031 Sean Wang 2024-07-06 2078 {
621e9e22b8d031 Sean Wang 2024-07-06 2079 struct mt792x_chanctx *mctx = (struct mt792x_chanctx *)ctx->drv_priv;
621e9e22b8d031 Sean Wang 2024-07-06 2080 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
621e9e22b8d031 Sean Wang 2024-07-06 2081 struct mt792x_dev *dev = mt792x_hw_dev(hw);
621e9e22b8d031 Sean Wang 2024-07-06 @2082 struct ieee80211_bss_conf *pri_link_conf;
621e9e22b8d031 Sean Wang 2024-07-06 2083 struct mt792x_bss_conf *mconf;
621e9e22b8d031 Sean Wang 2024-07-06 2084
621e9e22b8d031 Sean Wang 2024-07-06 2085 mutex_lock(&dev->mt76.mutex);
621e9e22b8d031 Sean Wang 2024-07-06 2086
621e9e22b8d031 Sean Wang 2024-07-06 2087 if (ieee80211_vif_is_mld(vif)) {
621e9e22b8d031 Sean Wang 2024-07-06 2088 mconf = mt792x_vif_to_link(mvif, link_conf->link_id);
621e9e22b8d031 Sean Wang 2024-07-06 2089 pri_link_conf = mt792x_vif_to_bss_conf(vif, mvif->deflink_id);
621e9e22b8d031 Sean Wang 2024-07-06 2090
621e9e22b8d031 Sean Wang 2024-07-06 2091 if (vif->type == NL80211_IFTYPE_STATION &&
621e9e22b8d031 Sean Wang 2024-07-06 2092 mconf == &mvif->bss_conf)
ef9f0dc93583f5 Ming Yen Hsieh 2024-12-10 2093 mt7925_mcu_add_bss_info(&dev->phy, NULL, link_conf,
621e9e22b8d031 Sean Wang 2024-07-06 2094 NULL, false);
621e9e22b8d031 Sean Wang 2024-07-06 2095 } else {
621e9e22b8d031 Sean Wang 2024-07-06 2096 mconf = &mvif->bss_conf;
621e9e22b8d031 Sean Wang 2024-07-06 2097 }
621e9e22b8d031 Sean Wang 2024-07-06 2098
621e9e22b8d031 Sean Wang 2024-07-06 2099 mctx->bss_conf = NULL;
621e9e22b8d031 Sean Wang 2024-07-06 2100 mconf->mt76.ctx = NULL;
621e9e22b8d031 Sean Wang 2024-07-06 2101 mutex_unlock(&dev->mt76.mutex);
621e9e22b8d031 Sean Wang 2024-07-06 2102 }
621e9e22b8d031 Sean Wang 2024-07-06 2103 Signature · 2 lines
0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
PATCH 13/17 wifi: mt76: mt7925: Update secondary link PS flow
In reply to [email protected]From: Ming Yen Hsieh <[email protected]>
Update the power-saving flow for secondary links.
--- .../net/wireless/mediatek/mt76/mt7925/main.c | 7 ++++++ .../net/wireless/mediatek/mt76/mt7925/mcu.c | 25 ++++++------------- .../net/wireless/mediatek/mt76/mt7925/mcu.h | 3 +++ drivers/net/wireless/mediatek/mt76/mt792x.h | 7 ++++-- 4 files changed, 22 insertions(+), 20 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7925/main.c +7 -0
@@ -1903,6 +1903,13 @@ static void mt7925_link_info_changed(struct ieee80211_hw *hw,if (changed & (BSS_CHANGED_QOS |BSS_CHANGED_BEACON_ENABLED ))mt7925_mcu_set_tx (dev, info); +if (changed &BSS_CHANGED_BSSID ) { +if (ieee80211_vif_is_mld (vif) && +hweight16 (mvif->valid_links) ==2 ) +/* Indicate the secondary setup done */ +mt7925_mcu_uni_bss_bcnft (dev, info, true); + } +mt792x_mutex_release (dev); }
drivers/net/wireless/mediatek/mt76/mt7925/mcu.c +7 -18
@@ -1364,7 +1364,7 @@ int mt7925_mcu_uni_bss_ps(struct mt792x_dev *dev, &ps_req, sizeof(ps_req), true); } -static int +int mt7925_mcu_uni_bss_bcnft (struct mt792x_dev *dev,struct ieee80211_bss_conf *link_conf,bool enable) {
@@ -1925,32 +1925,21 @@ int mt7925_mcu_set_beacon_filter(struct mt792x_dev *dev, {#define MT7925_FIF_BIT_CLR BIT(1)#define MT7925_FIF_BIT_SET BIT(0) -struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv; -unsigned long valid =ieee80211_vif_is_mld (vif) ? - mvif->valid_links :BIT (0 ); -struct ieee80211_bss_conf *bss_conf;int err =0 ; -int i;if (enable) { -for_each_set_bit (i, &valid,IEEE80211_MLD_MAX_NUM_LINKS ) { - bss_conf =mt792x_vif_to_bss_conf (vif, i); - err =mt7925_mcu_uni_bss_bcnft (dev, bss_conf, true); -if (err <0 ) -return err; - } + err =mt7925_mcu_uni_bss_bcnft (dev, &vif->bss_conf, true); +if (err <0 ) +return err;return mt7925_mcu_set_rxfilter (dev,0 ,MT7925_FIF_BIT_SET ,MT_WF_RFCR_DROP_OTHER_BEACON ); } -for_each_set_bit (i, &valid,IEEE80211_MLD_MAX_NUM_LINKS ) { - bss_conf =mt792x_vif_to_bss_conf (vif, i); - err =mt7925_mcu_set_bss_pm (dev, bss_conf, false); -if (err) -return err; - } + err =mt7925_mcu_set_bss_pm (dev, &vif->bss_conf, false); +if (err <0 ) +return err; return mt7925_mcu_set_rxfilter(dev, 0, MT7925_FIF_BIT_CLR,
drivers/net/wireless/mediatek/mt76/mt7925/mcu.h +3 -0
@@ -643,4 +643,7 @@ int mt7925_mcu_set_chctx(struct mt76_phy *phy, struct mt76_vif *mvif,int mt7925_mcu_set_rate_txpower (struct mt76_phy *phy);int mt7925_mcu_update_arp_filter (struct mt76_dev *dev,struct ieee80211_bss_conf *link_conf); +int +mt7925_mcu_uni_bss_bcnft (struct mt792x_dev *dev, +struct ieee80211_bss_conf *link_conf,bool enable);#endif
drivers/net/wireless/mediatek/mt76/mt792x.h +5 -2
@@ -241,6 +241,7 @@ static inline struct mt792x_bss_conf * mt792x_vif_to_link(struct mt792x_vif *mvif, u8 link_id) {struct ieee80211_vif *vif; +struct mt792x_bss_conf *bss_conf; vif = container_of((void *)mvif, struct ieee80211_vif, drv_priv);
@@ -248,8 +249,10 @@ mt792x_vif_to_link(struct mt792x_vif *mvif, u8 link_id) link_id >= IEEE80211_LINK_UNSPECIFIED)return &mvif->bss_conf; -return rcu_dereference_protected (mvif->link_conf[link_id], -lockdep_is_held (&mvif->phy->dev->mt76.mutex)); + bss_conf =rcu_dereference_protected (mvif->link_conf[link_id], +lockdep_is_held (&mvif->phy->dev->mt76.mutex)); + +return bss_conf ? bss_conf : &mvif->bss_conf; } static inline struct mt792x_link_sta *
Signature · 1 line
2.25.1
PATCH 14/17 wifi: mt76: mt7925: Init secondary link PM state
In reply to [email protected]From: Ming Yen Hsieh <[email protected]>
Initialize secondary link PM state.
--- drivers/net/wireless/mediatek/mt76/mt7925/main.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/wireless/mediatek/mt76/mt7925/main.c +2 -0
@@ -1989,6 +1989,8 @@ mt7925_change_vif_links(struct ieee80211_hw *hw, struct ieee80211_vif *vif, goto free;if (mconf != &mvif->bss_conf) { +mt7925_mcu_set_bss_pm (dev, link_conf, true); + err =mt7925_set_mlo_roc (phy, &mvif->bss_conf, vif->active_links);if (err <0 )
Signature · 1 line
2.25.1
PATCH 15/17 wifi: mt76: mt7925: Update mt7925_mcu_uni_[tx,rx]_ba for MLO
In reply to [email protected]From: Ming Yen Hsieh <[email protected]>
Update mt7925_mcu_uni_[tx,rx]_ba for MLO support in firmware.
--- .../net/wireless/mediatek/mt76/mt7925/main.c | 10 ++-- .../net/wireless/mediatek/mt76/mt7925/mcu.c | 50 +++++++++++++++---- .../wireless/mediatek/mt76/mt7925/mt7925.h | 2 + 3 files changed, 48 insertions(+), 14 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7925/main.c +5 -5
@@ -1258,22 +1258,22 @@ mt7925_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,case IEEE80211_AMPDU_RX_START :mt76_rx_aggr_start (&dev->mt76, &msta->deflink.wcid, tid, ssn, params->buf_size); -mt7925_mcu_uni_rx_ba (dev, params, true); +mt7925_mcu_uni_rx_ba (dev, vif, params, true);break ;case IEEE80211_AMPDU_RX_STOP :mt76_rx_aggr_stop (&dev->mt76, &msta->deflink.wcid, tid); -mt7925_mcu_uni_rx_ba (dev, params, false); +mt7925_mcu_uni_rx_ba (dev, vif, params, false);break ;case IEEE80211_AMPDU_TX_OPERATIONAL : mtxq->aggr = true; mtxq->send_bar = false; -mt7925_mcu_uni_tx_ba (dev, params, true); +mt7925_mcu_uni_tx_ba (dev, vif, params, true);break ;case IEEE80211_AMPDU_TX_STOP_FLUSH :case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT : mtxq->aggr = false;clear_bit (tid, &msta->deflink.wcid.ampdu_state); -mt7925_mcu_uni_tx_ba (dev, params, false); +mt7925_mcu_uni_tx_ba (dev, vif, params, false);break ;case IEEE80211_AMPDU_TX_START :set_bit (tid, &msta->deflink.wcid.ampdu_state);
@@ -1282,7 +1282,7 @@ mt7925_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,case IEEE80211_AMPDU_TX_STOP_CONT : mtxq->aggr = false;clear_bit (tid, &msta->deflink.wcid.ampdu_state); -mt7925_mcu_uni_tx_ba (dev, params, false); +mt7925_mcu_uni_tx_ba (dev, vif, params, false);ieee80211_stop_tx_ba_cb_irqsafe (vif, sta->addr, tid);break ; }
drivers/net/wireless/mediatek/mt76/mt7925/mcu.c +41 -9
79 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7925/mt7925.h +2 -0
@@ -242,9 +242,11 @@ int mt7925_mcu_set_beacon_filter(struct mt792x_dev *dev,struct ieee80211_vif *vif, bool enable);int mt7925_mcu_uni_tx_ba (struct mt792x_dev *dev, +struct ieee80211_vif *vif,struct ieee80211_ampdu_params *params,bool enable);int mt7925_mcu_uni_rx_ba (struct mt792x_dev *dev, +struct ieee80211_vif *vif,struct ieee80211_ampdu_params *params,bool enable);void mt7925_scan_work (struct work_struct *work);
Signature · 1 line
2.25.1
PATCH 16/17 wifi: mt76: mt7925: Cleanup MLO settings post-disconnection
In reply to [email protected]From: Ming Yen Hsieh <[email protected]>
Clean up MLO settings after disconnection.
--- .../net/wireless/mediatek/mt76/mt7925/main.c | 37 ++++++++++++++++++- .../net/wireless/mediatek/mt76/mt7925/mcu.c | 4 +- .../net/wireless/mediatek/mt76/mt7925/mcu.h | 2 +- 3 files changed, 38 insertions(+), 5 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7925/main.c +35 -2
@@ -1149,8 +1149,7 @@ static void mt7925_mac_link_sta_remove(struct mt76_dev *mdev,struct mt792x_bss_conf *mconf; mconf =mt792x_link_conf_to_mconf (link_conf); -mt7925_mcu_add_bss_info (&dev->phy, mconf->mt76.ctx, link_conf, - link_sta, false); +mt792x_mac_link_bss_remove (dev, mconf, mlink); }spin_lock_bh (&mdev->sta_poll_lock);
@@ -1208,12 +1207,46 @@ void mt7925_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif, { struct mt792x_dev *dev = container_of(mdev, struct mt792x_dev, mt76);struct mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv; +struct { +struct { +u8 omac_idx; +u8 band_idx; +__le16 pad; + } __packed hdr; +struct req_tlv { +__le16 tag; +__le16 len; +u8 active; +u8 link_idx;/* hw link idx */ +u8 omac_addr[ETH_ALEN ]; + } __packed tlv; + } dev_req = { + .hdr = { + .omac_idx =0 , + .band_idx =0 , + }, + .tlv = { + .tag =cpu_to_le16 (DEV_INFO_ACTIVE ), + .len =cpu_to_le16 (sizeof (struct req_tlv )), + .active = true, + }, + };unsigned long rem; rem =ieee80211_vif_is_mld (vif) ? msta->valid_links :BIT (0 );mt7925_mac_sta_remove_links (dev, vif, sta, rem); +if (ieee80211_vif_is_mld (vif)) { +mt7925_mcu_set_dbdc (&dev->mphy, false); + +/* recovery omac address for the legacy interface */ +memcpy (dev_req.tlv.omac_addr, vif->addr,ETH_ALEN ); +mt76_mcu_send_msg (mdev,MCU_UNI_CMD (DEV_INFO_UPDATE ), + &dev_req,sizeof (dev_req), true); + + } +if (vif->type ==NL80211_IFTYPE_STATION ) {struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
drivers/net/wireless/mediatek/mt76/mt7925/mcu.c +2 -2
@@ -2662,7 +2662,7 @@ int mt7925_mcu_add_bss_info(struct mt792x_phy *phy, MCU_UNI_CMD(BSS_INFO_UPDATE), true); } -int mt7925_mcu_set_dbdc (struct mt76_phy *phy) +int mt7925_mcu_set_dbdc (struct mt76_phy *phy,bool enable) {struct mt76_dev *mdev = phy->dev;
@@ -2682,7 +2682,7 @@ int mt7925_mcu_set_dbdc(struct mt76_phy *phy) tlv =mt76_connac_mcu_add_tlv (skb,UNI_MBMC_SETTING ,sizeof (*conf)); conf = (struct mbmc_conf_tlv *)tlv; - conf->mbmc_en =1 ; + conf->mbmc_en = enable; conf->band =0 ;/* unused */ err = mt76_mcu_skb_send_msg(mdev, skb, MCU_UNI_CMD(SET_DBDC_PARMS),
drivers/net/wireless/mediatek/mt76/mt7925/mcu.h +1 -1
@@ -616,7 +616,7 @@ mt7925_mcu_get_cipher(int cipher) } } -int mt7925_mcu_set_dbdc (struct mt76_phy *phy); +int mt7925_mcu_set_dbdc (struct mt76_phy *phy,bool enable);int mt7925_mcu_hw_scan (struct mt76_phy *phy,struct ieee80211_vif *vif,struct ieee80211_scan_request *scan_req); int mt7925_mcu_cancel_hw_scan(struct mt76_phy *phy,
Signature · 1 line
2.25.1
PATCH 17/17 wifi: mt76: mt7925: Properly handle responses for commands with events
In reply to [email protected]From: Ming Yen Hsieh <[email protected]>
Properly retrieve the response for commands with events. Ensure accurate handling of event-driven commands.
--- drivers/net/wireless/mediatek/mt76/mt7925/main.c | 1 - drivers/net/wireless/mediatek/mt76/mt7925/mcu.c | 10 +++++----- 2 files changed, 5 insertions(+), 6 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7925/main.c +0 -1
@@ -1244,7 +1244,6 @@ void mt7925_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,memcpy (dev_req.tlv.omac_addr, vif->addr,ETH_ALEN );mt76_mcu_send_msg (mdev,MCU_UNI_CMD (DEV_INFO_UPDATE ), &dev_req,sizeof (dev_req), true); - }if (vif->type ==NL80211_IFTYPE_STATION ) {
drivers/net/wireless/mediatek/mt76/mt7925/mcu.c +5 -5
@@ -1254,7 +1254,7 @@ int mt7925_mcu_set_mlo_roc(struct mt792x_bss_conf *mconf, u16 sel_links, }return mt76_mcu_send_msg (&mvif->phy->dev->mt76,MCU_UNI_CMD (ROC ), - &req,sizeof (req), false); + &req,sizeof (req), true); } int mt7925_mcu_set_roc(struct mt792x_phy *phy, struct mt792x_bss_conf *mconf,
@@ -1303,7 +1303,7 @@ int mt7925_mcu_set_roc(struct mt792x_phy *phy, struct mt792x_bss_conf *mconf, }return mt76_mcu_send_msg (&dev->mt76,MCU_UNI_CMD (ROC ), - &req,sizeof (req), false); + &req,sizeof (req), true); } int mt7925_mcu_abort_roc(struct mt792x_phy *phy, struct mt792x_bss_conf *mconf,
@@ -1333,7 +1333,7 @@ int mt7925_mcu_abort_roc(struct mt792x_phy *phy, struct mt792x_bss_conf *mconf, };return mt76_mcu_send_msg (&dev->mt76,MCU_UNI_CMD (ROC ), - &req,sizeof (req), false); + &req,sizeof (req), true); }int mt7925_mcu_set_eeprom (struct mt792x_dev *dev)
@@ -1486,12 +1486,12 @@ mt7925_mcu_set_bss_pm(struct mt792x_dev *dev,int err; err =mt76_mcu_send_msg (&dev->mt76,MCU_UNI_CMD (BSS_INFO_UPDATE ), - &req1,sizeof (req1), false); + &req1,sizeof (req1), true);if (err <0 || !enable)return err;return mt76_mcu_send_msg (&dev->mt76,MCU_UNI_CMD (BSS_INFO_UPDATE ), - &req,sizeof (req), false); + &req,sizeof (req), true); } static void
Signature · 1 line
2.25.1