]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: mt76: mt7925: add link handling in mt7925_sta_set_decap_offload
authorSean Wang <sean.wang@mediatek.com>
Sat, 6 Jul 2024 08:27:58 +0000 (01:27 -0700)
committerFelix Fietkau <nbd@nbd.name>
Tue, 9 Jul 2024 21:02:05 +0000 (23:02 +0200)
add link handling in mt7925_sta_set_decap_offload

Co-developed-by: Ming Yen Hsieh <mingyen.hsieh@mediatek.com>
Signed-off-by: Ming Yen Hsieh <mingyen.hsieh@mediatek.com>
Co-developed-by: Deren Wu <deren.wu@mediatek.com>
Signed-off-by: Deren Wu <deren.wu@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Link: https://patch.msgid.link/df2524e3a63a93699bde441e4ab70a70bbac53ef.1720248331.git.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/mt7925.h

index 68a615bbec76d9fdc585b8395d992badfe5436b6..0b61695c9b65c752fa4899934501855ac7be1b81 100644 (file)
@@ -1464,16 +1464,27 @@ static void mt7925_sta_set_decap_offload(struct ieee80211_hw *hw,
                                         bool enabled)
 {
        struct mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv;
+       struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
        struct mt792x_dev *dev = mt792x_hw_dev(hw);
+       unsigned long valid = mvif->valid_links;
+       u8 i;
 
        mt792x_mutex_acquire(dev);
 
-       if (enabled)
-               set_bit(MT_WCID_FLAG_HDR_TRANS, &msta->deflink.wcid.flags);
-       else
-               clear_bit(MT_WCID_FLAG_HDR_TRANS, &msta->deflink.wcid.flags);
+       valid = ieee80211_vif_is_mld(vif) ? mvif->valid_links : BIT(0);
+
+       for_each_set_bit(i, &valid, IEEE80211_MLD_MAX_NUM_LINKS) {
+               struct mt792x_link_sta *mlink;
 
-       mt7925_mcu_wtbl_update_hdr_trans(dev, vif, sta);
+               mlink = mt792x_sta_to_link(msta, i);
+
+               if (enabled)
+                       set_bit(MT_WCID_FLAG_HDR_TRANS, &mlink->wcid.flags);
+               else
+                       clear_bit(MT_WCID_FLAG_HDR_TRANS, &mlink->wcid.flags);
+
+               mt7925_mcu_wtbl_update_hdr_trans(dev, vif, sta, i);
+       }
 
        mt792x_mutex_release(dev);
 }
index 76ead51fdef24808db79977862feaca13e81c14b..20b118cd450c041f680b1da43bb3270c0f156f56 100644 (file)
@@ -887,10 +887,15 @@ mt7925_mcu_sta_hdr_trans_tlv(struct sk_buff *skb,
        else
                hdr_trans->from_ds = true;
 
-       if (link_sta)
-               wcid = (struct mt76_wcid *)link_sta->sta->drv_priv;
-       else
+       if (link_sta) {
+               struct mt792x_sta *msta = (struct mt792x_sta *)link_sta->sta->drv_priv;
+               struct mt792x_link_sta *mlink;
+
+               mlink = mt792x_sta_to_link(msta, link_sta->link_id);
+               wcid = &mlink->wcid;
+       } else {
                wcid = &mvif->sta.deflink.wcid;
+       }
 
        if (!wcid)
                return;
@@ -904,17 +909,24 @@ mt7925_mcu_sta_hdr_trans_tlv(struct sk_buff *skb,
 
 int mt7925_mcu_wtbl_update_hdr_trans(struct mt792x_dev *dev,
                                     struct ieee80211_vif *vif,
-                                    struct ieee80211_sta *sta)
+                                    struct ieee80211_sta *sta,
+                                    int link_id)
 {
        struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
        struct ieee80211_link_sta *link_sta = sta ? &sta->deflink : NULL;
+       struct mt792x_link_sta *mlink;
+       struct mt792x_bss_conf *mconf;
        struct mt792x_sta *msta;
        struct sk_buff *skb;
 
        msta = sta ? (struct mt792x_sta *)sta->drv_priv : &mvif->sta;
 
-       skb = __mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->bss_conf.mt76,
-                                             &msta->deflink.wcid,
+       mlink = mt792x_sta_to_link(msta, link_id);
+       link_sta = mt792x_sta_to_link_sta(vif, sta, link_id);
+       mconf = mt792x_vif_to_link(mvif, link_id);
+
+       skb = __mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mconf->mt76,
+                                             &mlink->wcid,
                                              MT7925_STA_UPDATE_MAX_SIZE);
        if (IS_ERR(skb))
                return PTR_ERR(skb);
index bcf8541fa31dee5c15601e3bcb13350fff9195f6..1ae66629e39fcb70473abc8d3556b09ceaf351a7 100644 (file)
@@ -316,6 +316,7 @@ int mt7925_mcu_add_key(struct mt76_dev *dev, struct ieee80211_vif *vif,
 int mt7925_mcu_set_rts_thresh(struct mt792x_phy *phy, u32 val);
 int mt7925_mcu_wtbl_update_hdr_trans(struct mt792x_dev *dev,
                                     struct ieee80211_vif *vif,
-                                    struct ieee80211_sta *sta);
+                                    struct ieee80211_sta *sta,
+                                    int link_id);
 
 #endif