wifi: mt76: scan: set vif offchannel link for scanning/roc
authorFelix Fietkau <nbd@nbd.name>
Tue, 11 Mar 2025 10:36:41 +0000 (11:36 +0100)
committerFelix Fietkau <nbd@nbd.name>
Wed, 19 Mar 2025 13:47:04 +0000 (14:47 +0100)
The driver needs to know what vif link to use

Link: https://patch.msgid.link/20250311103646.43346-4-nbd@nbd.name
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/channel.c
drivers/net/wireless/mediatek/mt76/mt76.h

index 6a35c6ebd823e28139cef512489016da99bf2f01..e7b839e74290345717ea1f9b9fcaeba8a15ad3fa 100644 (file)
@@ -293,6 +293,7 @@ struct mt76_vif_link *mt76_get_vif_phy_link(struct mt76_phy *phy,
                kfree(mlink);
                return ERR_PTR(ret);
        }
+       rcu_assign_pointer(mvif->offchannel_link, mlink);
 
        return mlink;
 }
@@ -301,10 +302,12 @@ void mt76_put_vif_phy_link(struct mt76_phy *phy, struct ieee80211_vif *vif,
                           struct mt76_vif_link *mlink)
 {
        struct mt76_dev *dev = phy->dev;
+       struct mt76_vif_data *mvif = mlink->mvif;
 
        if (IS_ERR_OR_NULL(mlink) || !mlink->offchannel)
                return;
 
+       rcu_assign_pointer(mvif->offchannel_link, NULL);
        dev->drv->vif_link_remove(phy, vif, &vif->bss_conf, mlink);
        kfree(mlink);
 }
index 7596191252dc361cbf138218ac4d837f29c645c7..c16a6743ad64cd82e606b00fb0a858926d145a30 100644 (file)
@@ -351,6 +351,7 @@ struct mt76_wcid {
        u8 hw_key_idx;
        u8 hw_key_idx2;
 
+       u8 offchannel:1;
        u8 sta:1;
        u8 sta_disabled:1;
        u8 amsdu:1;
@@ -787,6 +788,7 @@ struct mt76_vif_link {
 
 struct mt76_vif_data {
        struct mt76_vif_link __rcu *link[IEEE80211_MLD_MAX_NUM_LINKS];
+       struct mt76_vif_link __rcu *offchannel_link;
 
        struct mt76_phy *roc_phy;
        u16 valid_links;