]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: mt76: mt7925: extend mt7925_mcu_set_tx with for per-link BSS
authorDeren Wu <deren.wu@mediatek.com>
Thu, 13 Jun 2024 03:02:00 +0000 (20:02 -0700)
committerFelix Fietkau <nbd@nbd.name>
Tue, 9 Jul 2024 21:01:48 +0000 (23:01 +0200)
Extend mt7925_mcu_set_tx with per-link BSS configuration.

The patch we created is a prerequisite to enable the MLO function in the
driver. It is purely a refactoring patch so the functionality should
remain unchanged.

Co-developed-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Deren Wu <deren.wu@mediatek.com>
Link: https://patch.msgid.link/20240613030241.5771-7-sean.wang@kernel.org
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7925/mac.c
drivers/net/wireless/mediatek/mt76/mt7925/main.c
drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
drivers/net/wireless/mediatek/mt76/mt7925/mt7925.h
drivers/net/wireless/mediatek/mt76/mt792x.h

index 48425fc4e7fe879adf0c50c3b77e403b3f38a1dc..2be2ab914411f52b9aaeb3f10c75ce1aff312a35 100644 (file)
@@ -1245,7 +1245,7 @@ mt7925_vif_connect_iter(void *priv, u8 *mac,
 
        mt76_connac_mcu_uni_add_dev(&dev->mphy, &vif->bss_conf,
                                    &mvif->sta.deflink.wcid, true);
-       mt7925_mcu_set_tx(dev, vif);
+       mt7925_mcu_set_tx(dev, &vif->bss_conf);
 
        if (vif->type == NL80211_IFTYPE_AP) {
                mt76_connac_mcu_uni_add_bss(dev->phy.mt76, vif, &mvif->sta.deflink.wcid,
index b0c8b090d2ceb3c0ba7d6f0f66e4983b4f266dba..d11919688bae8e92c33984efe7b8a682197b5076 100644 (file)
@@ -1410,7 +1410,7 @@ static void mt7925_link_info_changed(struct ieee80211_hw *hw,
 
        /* ensure that enable txcmd_mode after bss_info */
        if (changed & (BSS_CHANGED_QOS | BSS_CHANGED_BEACON_ENABLED))
-               mt7925_mcu_set_tx(dev, vif);
+               mt7925_mcu_set_tx(dev, info);
 
        mt792x_mutex_release(dev);
 }
index 5e72f7278e8b11db79601b5ff6798c25be936226..1c262a024dc8edfdbcd9ae4be87d890508bb06b5 100644 (file)
@@ -900,7 +900,8 @@ int mt7925_mcu_wtbl_update_hdr_trans(struct mt792x_dev *dev,
                                     MCU_WMWA_UNI_CMD(STA_REC_UPDATE), true);
 }
 
-int mt7925_mcu_set_tx(struct mt792x_dev *dev, struct ieee80211_vif *vif)
+int mt7925_mcu_set_tx(struct mt792x_dev *dev,
+                     struct ieee80211_bss_conf *bss_conf)
 {
 #define MCU_EDCA_AC_PARAM      0
 #define WMM_AIFS_SET           BIT(0)
@@ -909,12 +910,12 @@ int mt7925_mcu_set_tx(struct mt792x_dev *dev, struct ieee80211_vif *vif)
 #define WMM_TXOP_SET           BIT(3)
 #define WMM_PARAM_SET          (WMM_AIFS_SET | WMM_CW_MIN_SET | \
                                 WMM_CW_MAX_SET | WMM_TXOP_SET)
-       struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
+       struct mt792x_bss_conf *mconf = mt792x_link_conf_to_mconf(bss_conf);
        struct {
                u8 bss_idx;
                u8 __rsv[3];
        } __packed hdr = {
-               .bss_idx = mvif->bss_conf.mt76.idx,
+               .bss_idx = mconf->mt76.idx,
        };
        struct sk_buff *skb;
        int len = sizeof(hdr) + IEEE80211_NUM_ACS * sizeof(struct edca);
@@ -927,7 +928,7 @@ int mt7925_mcu_set_tx(struct mt792x_dev *dev, struct ieee80211_vif *vif)
        skb_put_data(skb, &hdr, sizeof(hdr));
 
        for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
-               struct ieee80211_tx_queue_params *q = &mvif->bss_conf.queue_params[ac];
+               struct ieee80211_tx_queue_params *q = &mconf->queue_params[ac];
                struct edca *e;
                struct tlv *tlv;
 
index 8a4a71f6bcb6d0e1ecc5d749b96257466c363eef..f689f7a359ea6b518a83031e6c3c5e21cbdcfcdc 100644 (file)
@@ -198,7 +198,7 @@ int mt7925_mcu_sta_update(struct mt792x_dev *dev, struct ieee80211_sta *sta,
                          struct ieee80211_vif *vif, bool enable,
                          enum mt76_sta_info_state state);
 int mt7925_mcu_set_chan_info(struct mt792x_phy *phy, u16 tag);
-int mt7925_mcu_set_tx(struct mt792x_dev *dev, struct ieee80211_vif *vif);
+int mt7925_mcu_set_tx(struct mt792x_dev *dev, struct ieee80211_bss_conf *bss_conf);
 int mt7925_mcu_set_eeprom(struct mt792x_dev *dev);
 int mt7925_mcu_get_rx_rate(struct mt792x_phy *phy, struct ieee80211_vif *vif,
                           struct ieee80211_sta *sta, struct rate_info *rate);
index eee872aa010804f25b0cc70297445f91b383dedd..9630514ae25f17d6a596f87f99c4ca4a0eec52c6 100644 (file)
@@ -114,6 +114,7 @@ struct mt792x_bss_conf {
 
 struct mt792x_vif {
        struct mt792x_bss_conf bss_conf; /* must be first */
+       struct mt792x_bss_conf __rcu *link_conf[IEEE80211_MLD_MAX_NUM_LINKS];
 
        struct mt792x_sta sta;
        struct mt792x_sta *wep_sta;
@@ -221,6 +222,30 @@ struct mt792x_dev {
        u32 backup_l2;
 };
 
+static inline struct mt792x_bss_conf *
+mt792x_vif_to_link(struct mt792x_vif *mvif, u8 link_id)
+{
+       struct ieee80211_vif *vif;
+
+       vif = container_of((void *)mvif, struct ieee80211_vif, drv_priv);
+
+       if (!ieee80211_vif_is_mld(vif) ||
+           link_id >= IEEE80211_LINK_UNSPECIFIED)
+               return &mvif->bss_conf;
+
+       return rcu_dereference_protected(mvif->link_conf[link_id],
+               lockdep_is_held(&mvif->phy->dev->mt76.mutex));
+}
+
+static inline struct mt792x_bss_conf *
+mt792x_link_conf_to_mconf(struct ieee80211_bss_conf *link_conf)
+{
+       struct ieee80211_vif *vif = link_conf->vif;
+       struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
+
+       return mt792x_vif_to_link(mvif, link_conf->link_id);
+}
+
 static inline struct mt792x_dev *
 mt792x_hw_dev(struct ieee80211_hw *hw)
 {