Previously every MLD link used OMAC 0, which can clash with another interface. Make each link reuse the primary link OMAC instead; only a 3-link hybrid MLD gives every link its own OMAC so each band's own MAC is programmed independently. Signed-off-by: Emery Hsin --- drivers/net/wireless/mediatek/mt76/mt7925/main.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/main.c b/drivers/net/wireless/mediatek/mt76/mt7925/main.c index f191b9e7d3f5..01d7526dbfa9 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7925/main.c +++ b/drivers/net/wireless/mediatek/mt76/mt7925/main.c @@ -379,7 +379,7 @@ static int mt7925_start(struct ieee80211_hw *hw) static int mt7925_mac_link_bss_add(struct mt792x_dev *dev, struct ieee80211_bss_conf *link_conf, struct mt792x_link_sta *mlink, - u8 link_idx) + bool share_omac, u8 link_idx) { struct mt792x_bss_conf *mconf = mt792x_link_conf_to_mconf(link_conf); struct ieee80211_vif *vif = link_conf->vif; @@ -398,8 +398,11 @@ static int mt7925_mac_link_bss_add(struct mt792x_dev *dev, } } - mconf->mt76.omac_idx = ieee80211_vif_is_mld(vif) ? - 0 : mconf->mt76.idx; + /* Links share the primary OMAC except in 3-link hybrid mode. */ + if (share_omac) + mconf->mt76.omac_idx = mvif->bss_conf.mt76.idx; + else + mconf->mt76.omac_idx = mconf->mt76.idx; mconf->mt76.band_idx = MT792x_BAND_AUTO; mconf->absent = false; @@ -482,7 +485,8 @@ mt7925_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif) mvif->deflink_id = IEEE80211_LINK_UNSPECIFIED; mvif->mlo_pm_state = MT792x_MLO_LINK_DISASSOC; - ret = mt7925_mac_link_bss_add(dev, &vif->bss_conf, &mvif->sta.deflink, 0); + ret = mt7925_mac_link_bss_add(dev, &vif->bss_conf, &mvif->sta.deflink, + true, 0); if (ret < 0) goto out; @@ -2516,7 +2520,9 @@ mt7925_change_vif_links(struct ieee80211_hw *hw, struct ieee80211_vif *vif, rcu_assign_pointer(mvif->link_conf[link_id], mconf); rcu_assign_pointer(mvif->sta.link[link_id], mlink); - err = mt7925_mac_link_bss_add(dev, link_conf, mlink, link_idx++); + err = mt7925_mac_link_bss_add(dev, link_conf, mlink, + hweight16(new_links) != 3, + link_idx++); if (err < 0) goto free; -- 2.45.2