]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: mt76: mt7925: pass WCID indices to bss_basic_tlv()
authorSean Wang <sean.wang@mediatek.com>
Fri, 6 Mar 2026 23:22:21 +0000 (17:22 -0600)
committerFelix Fietkau <nbd@nbd.name>
Tue, 24 Mar 2026 15:49:31 +0000 (15:49 +0000)
Drop the mt792x_sta_to_link() lookup in mt7925_mcu_bss_basic_tlv() and
pass the resolved WCID indices from the caller instead. The link
context is already known, so the lookup is redundant.

This makes link ownership explicit and keeps the helper lookup-free.

No functional change intended.

Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Link: https://patch.msgid.link/20260306232238.2039675-3-sean.wang@kernel.org
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7925/main.c
drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
drivers/net/wireless/mediatek/mt76/mt7925/mcu.h

index afcc0fa4aa35523e3edd9aba81433a01566f7a82..353461f0e16994e1ad3e81786f5334851e80abef 100644 (file)
@@ -850,20 +850,22 @@ mt7925_get_rates_table(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
 
 static int mt7925_mac_link_sta_add(struct mt76_dev *mdev,
                                   struct ieee80211_vif *vif,
-                                  struct ieee80211_link_sta *link_sta)
+                                  struct ieee80211_link_sta *link_sta,
+                                  struct mt792x_link_sta *mlink)
 {
        struct mt792x_dev *dev = container_of(mdev, struct mt792x_dev, mt76);
        struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
        struct ieee80211_bss_conf *link_conf;
        struct mt792x_bss_conf *mconf;
        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;
-       mlink = mt792x_sta_to_link(msta, link_id);
+
+       if (WARN_ON_ONCE(!mlink))
+               return -EINVAL;
 
        idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT792x_WTBL_STA - 1);
        if (idx < 0)
@@ -898,12 +900,21 @@ static int mt7925_mac_link_sta_add(struct mt76_dev *mdev,
 
        /* should update bss info before STA add */
        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);
+               struct mt792x_link_sta *mlink_bc;
+
+               mlink_bc = mt792x_sta_to_link(&mvif->sta, mconf->link_id);
+
+               if (ieee80211_vif_is_mld(vif)) {
+                       mt7925_mcu_add_bss_info_sta(&dev->phy, mconf->mt76.ctx,
+                                                   link_conf, link_sta,
+                                                   mlink_bc->wcid.idx, mlink->wcid.idx,
+                                                   link_sta != mlink->pri_link);
+               } else {
+                       mt7925_mcu_add_bss_info_sta(&dev->phy, mconf->mt76.ctx,
+                                                   link_conf, link_sta,
+                                                   mlink_bc->wcid.idx, mlink->wcid.idx,
+                                                   false);
+               }
        }
 
        if (ieee80211_vif_is_mld(vif) &&
@@ -965,7 +976,7 @@ mt7925_mac_sta_add_links(struct mt792x_dev *dev, struct ieee80211_vif *vif,
                mlink->wcid.def_wcid = &msta->deflink.wcid;
 
                link_sta = mt792x_sta_to_link_sta(vif, sta, link_id);
-               mt7925_mac_link_sta_add(&dev->mt76, vif, link_sta);
+               mt7925_mac_link_sta_add(&dev->mt76, vif, link_sta, mlink);
        }
 
        return err;
@@ -989,7 +1000,8 @@ int mt7925_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
 
                err = mt7925_mac_sta_add_links(dev, vif, sta, sta->valid_links);
        } else {
-               err = mt7925_mac_link_sta_add(mdev, vif, &sta->deflink);
+               err = mt7925_mac_link_sta_add(mdev, vif, &sta->deflink,
+                                             &msta->deflink);
        }
 
        return err;
index fa5f79004a6e2dd7ffadcb1074c83cd66614e2cf..76bcfaf8ebfade89bb374d94b22ff795199f99d0 100644 (file)
@@ -2476,7 +2476,9 @@ mt7925_mcu_bss_basic_tlv(struct sk_buff *skb,
                         struct ieee80211_bss_conf *link_conf,
                         struct ieee80211_link_sta *link_sta,
                         struct ieee80211_chanctx_conf *ctx,
-                        struct mt76_phy *phy, u16 wlan_idx,
+                        struct mt76_phy *phy,
+                        u16 bmc_tx_wlan_idx,
+                        u16 sta_wlan_idx,
                         bool enable)
 {
        struct ieee80211_vif *vif = link_conf->vif;
@@ -2485,7 +2487,6 @@ mt7925_mcu_bss_basic_tlv(struct sk_buff *skb,
                                                  &link_conf->chanreq.oper;
        enum nl80211_band band = chandef->chan->band;
        struct mt76_connac_bss_basic_tlv *basic_req;
-       struct mt792x_link_sta *mlink;
        struct tlv *tlv;
        int conn_type;
        u8 idx;
@@ -2509,20 +2510,9 @@ mt7925_mcu_bss_basic_tlv(struct sk_buff *skb,
        basic_req->phymode = mt76_connac_get_phy_mode(phy, vif, band, link_sta);
        basic_req->bcn_interval = cpu_to_le16(link_conf->beacon_int);
        basic_req->dtim_period = link_conf->dtim_period;
-       basic_req->bmc_tx_wlan_idx = cpu_to_le16(wlan_idx);
+       basic_req->bmc_tx_wlan_idx = cpu_to_le16(bmc_tx_wlan_idx);
        basic_req->link_idx = mconf->mt76.idx;
-
-       if (link_sta) {
-               struct mt792x_sta *msta;
-
-               msta = (struct mt792x_sta *)link_sta->sta->drv_priv;
-               mlink = mt792x_sta_to_link(msta, link_sta->link_id);
-
-       } else {
-               mlink = &mconf->vif->sta.deflink;
-       }
-
-       basic_req->sta_idx = cpu_to_le16(mlink->wcid.idx);
+       basic_req->sta_idx = cpu_to_le16(sta_wlan_idx);
        basic_req->omac_idx = mconf->mt76.omac_idx;
        basic_req->band_idx = mconf->mt76.band_idx;
        basic_req->wmm_idx = mconf->mt76.wmm_idx;
@@ -2829,16 +2819,16 @@ void mt7925_mcu_del_dev(struct mt76_dev *mdev,
                          &dev_req, sizeof(dev_req), true);
 }
 
-int mt7925_mcu_add_bss_info(struct mt792x_phy *phy,
-                           struct ieee80211_chanctx_conf *ctx,
-                           struct ieee80211_bss_conf *link_conf,
-                           struct ieee80211_link_sta *link_sta,
-                           int enable)
+int mt7925_mcu_add_bss_info_sta(struct mt792x_phy *phy,
+                               struct ieee80211_chanctx_conf *ctx,
+                               struct ieee80211_bss_conf *link_conf,
+                               struct ieee80211_link_sta *link_sta,
+                               u16 bmc_tx_wlan_idx,
+                               u16 sta_wlan_idx,
+                               int enable)
 {
-       struct mt792x_vif *mvif = (struct mt792x_vif *)link_conf->vif->drv_priv;
        struct mt792x_bss_conf *mconf = mt792x_link_conf_to_mconf(link_conf);
        struct mt792x_dev *dev = phy->dev;
-       struct mt792x_link_sta *mlink_bc;
        struct sk_buff *skb;
 
        skb = __mt7925_mcu_alloc_bss_req(&dev->mt76, &mconf->mt76,
@@ -2846,11 +2836,9 @@ int mt7925_mcu_add_bss_info(struct mt792x_phy *phy,
        if (IS_ERR(skb))
                return PTR_ERR(skb);
 
-       mlink_bc = mt792x_sta_to_link(&mvif->sta, mconf->link_id);
-
        /* bss_basic must be first */
        mt7925_mcu_bss_basic_tlv(skb, link_conf, link_sta, ctx, phy->mt76,
-                                mlink_bc->wcid.idx, enable);
+                                bmc_tx_wlan_idx, sta_wlan_idx, enable);
        mt7925_mcu_bss_sec_tlv(skb, link_conf);
        mt7925_mcu_bss_bmc_tlv(skb, phy, ctx, link_conf);
        mt7925_mcu_bss_qos_tlv(skb, link_conf);
@@ -2871,6 +2859,33 @@ int mt7925_mcu_add_bss_info(struct mt792x_phy *phy,
                                     MCU_UNI_CMD(BSS_INFO_UPDATE), true);
 }
 
+int mt7925_mcu_add_bss_info(struct mt792x_phy *phy,
+                           struct ieee80211_chanctx_conf *ctx,
+                           struct ieee80211_bss_conf *link_conf,
+                           struct ieee80211_link_sta *link_sta,
+                           int enable)
+{
+       struct mt792x_vif *mvif = (struct mt792x_vif *)link_conf->vif->drv_priv;
+       struct mt792x_bss_conf *mconf = mt792x_link_conf_to_mconf(link_conf);
+       struct mt792x_link_sta *mlink_bc;
+       struct mt792x_link_sta *mlink;
+
+       mlink_bc = mt792x_sta_to_link(&mvif->sta, mconf->link_id);
+
+       if (link_sta) {
+               struct mt792x_sta *msta = (void *)link_sta->sta->drv_priv;
+
+               mlink = mt792x_sta_to_link(msta, link_sta->link_id);
+               if (WARN_ON(!mlink))
+                       return -EINVAL;
+       } else {
+               mlink = &mconf->vif->sta.deflink;
+       }
+
+       return mt7925_mcu_add_bss_info_sta(phy, ctx, link_conf, link_sta,
+                                          mlink_bc->wcid.idx, mlink->wcid.idx, enable);
+}
+
 int mt7925_mcu_set_dbdc(struct mt76_phy *phy, bool enable)
 {
        struct mt76_dev *mdev = phy->dev;
index e09e0600534aa5d7de16a8869dea3d1e9086b10d..56e2772f3ffed31360c38104907aa3213abb723f 100644 (file)
@@ -693,6 +693,13 @@ int mt7925_mcu_add_bss_info(struct mt792x_phy *phy,
                            struct ieee80211_bss_conf *link_conf,
                            struct ieee80211_link_sta *link_sta,
                            int enable);
+int mt7925_mcu_add_bss_info_sta(struct mt792x_phy *phy,
+                               struct ieee80211_chanctx_conf *ctx,
+                               struct ieee80211_bss_conf *link_conf,
+                               struct ieee80211_link_sta *link_sta,
+                               u16 bmc_tx_wlan_idx,
+                               u16 sta_wlan_idx,
+                               int enable);
 int mt7925_mcu_set_timing(struct mt792x_phy *phy,
                          struct ieee80211_bss_conf *link_conf);
 int mt7925_mcu_set_deep_sleep(struct mt792x_dev *dev, bool enable);