]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: mt76: fix vif link allocation
authorFelix Fietkau <nbd@nbd.name>
Fri, 4 Jul 2025 13:08:05 +0000 (15:08 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 20 Aug 2025 16:41:11 +0000 (18:41 +0200)
[ Upstream commit 53a5d72bdd70e262623b6009cc4754927b428bad ]

Reuse the vif deflink for link_id = 0 in order to avoid confusion with
vif->bss_conf, which also gets a link id of 0.

Link: https://patch.msgid.link/20250704-mt7996-mlo-fixes-v1-1-356456c73f43@kernel.org
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/wireless/mediatek/mt76/channel.c
drivers/net/wireless/mediatek/mt76/mt76.h

index cc2d888e3f17a58512e6282686b446109ec7ab3c..77b75792eb488e9c5da9ca8026c04157182c13a4 100644 (file)
@@ -173,13 +173,13 @@ void mt76_unassign_vif_chanctx(struct ieee80211_hw *hw,
        if (!mlink)
                goto out;
 
-       if (link_conf != &vif->bss_conf)
+       if (mlink != (struct mt76_vif_link *)vif->drv_priv)
                rcu_assign_pointer(mvif->link[link_id], NULL);
 
        dev->drv->vif_link_remove(phy, vif, link_conf, mlink);
        mlink->ctx = NULL;
 
-       if (link_conf != &vif->bss_conf)
+       if (mlink != (struct mt76_vif_link *)vif->drv_priv)
                kfree_rcu(mlink, rcu_head);
 
 out:
index 74b75035d3614852b7666f6eafba72b0074d56bf..0ecf77fcbe3d07ade874e95f1c03afbd4ff986b2 100644 (file)
@@ -1874,6 +1874,9 @@ mt76_vif_link(struct mt76_dev *dev, struct ieee80211_vif *vif, int link_id)
        struct mt76_vif_link *mlink = (struct mt76_vif_link *)vif->drv_priv;
        struct mt76_vif_data *mvif = mlink->mvif;
 
+       if (!link_id)
+               return mlink;
+
        return mt76_dereference(mvif->link[link_id], dev);
 }
 
@@ -1884,7 +1887,7 @@ mt76_vif_conf_link(struct mt76_dev *dev, struct ieee80211_vif *vif,
        struct mt76_vif_link *mlink = (struct mt76_vif_link *)vif->drv_priv;
        struct mt76_vif_data *mvif = mlink->mvif;
 
-       if (link_conf == &vif->bss_conf)
+       if (link_conf == &vif->bss_conf || !link_conf->link_id)
                return mlink;
 
        return mt76_dereference(mvif->link[link_conf->link_id], dev);