wifi: mt76: mt7925: fix the wrong link_idx when a p2p_device is present
authorMing Yen Hsieh <mingyen.hsieh@mediatek.com>
Wed, 5 Mar 2025 00:08:47 +0000 (16:08 -0800)
committerFelix Fietkau <nbd@nbd.name>
Wed, 19 Mar 2025 13:47:03 +0000 (14:47 +0100)
When the p2p device and MLO station are running concurrently, the p2p device
will occupy the wrong link_idx when the MLO secondary link is added.

Fixes: 9e4c3a007f01 ("wifi: mt76: connac: Extend mt76_connac_mcu_uni_add_dev for MLO")
Cc: stable@vger.kernel.org
Co-developed-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Tested-by: Caleb Jorden <cjorden@gmail.com>
Signed-off-by: Ming Yen Hsieh <mingyen.hsieh@mediatek.com>
Link: https://patch.msgid.link/20250305000851.493671-2-sean.wang@kernel.org
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76.h
drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
drivers/net/wireless/mediatek/mt76/mt7925/main.c

index 132148f..05651ef 100644 (file)
@@ -769,6 +769,7 @@ struct mt76_testmode_data {
 
 struct mt76_vif_link {
        u8 idx;
+       u8 link_idx;
        u8 omac_idx;
        u8 band_idx;
        u8 wmm_idx;
index f30cf9e..d0e49d6 100644 (file)
@@ -1168,7 +1168,7 @@ int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy,
                        .tag = cpu_to_le16(DEV_INFO_ACTIVE),
                        .len = cpu_to_le16(sizeof(struct req_tlv)),
                        .active = enable,
-                       .link_idx = mvif->idx,
+                       .link_idx = mvif->link_idx,
                },
        };
        struct {
@@ -1191,7 +1191,7 @@ int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy,
                        .bmc_tx_wlan_idx = cpu_to_le16(wcid->idx),
                        .sta_idx = cpu_to_le16(wcid->idx),
                        .conn_state = 1,
-                       .link_idx = mvif->idx,
+                       .link_idx = mvif->link_idx,
                },
        };
        int err, idx, cmd, len;
index 47a6040..676882f 100644 (file)
@@ -360,10 +360,15 @@ static int mt7925_mac_link_bss_add(struct mt792x_dev *dev,
        struct mt76_txq *mtxq;
        int idx, ret = 0;
 
-       mconf->mt76.idx = __ffs64(~dev->mt76.vif_mask);
-       if (mconf->mt76.idx >= MT792x_MAX_INTERFACES) {
-               ret = -ENOSPC;
-               goto out;
+       if (vif->type == NL80211_IFTYPE_P2P_DEVICE) {
+               mconf->mt76.idx = MT792x_MAX_INTERFACES;
+       } else {
+               mconf->mt76.idx = __ffs64(~dev->mt76.vif_mask);
+
+               if (mconf->mt76.idx >= MT792x_MAX_INTERFACES) {
+                       ret = -ENOSPC;
+                       goto out;
+               }
        }
 
        mconf->mt76.omac_idx = ieee80211_vif_is_mld(vif) ?
@@ -371,6 +376,7 @@ static int mt7925_mac_link_bss_add(struct mt792x_dev *dev,
        mconf->mt76.band_idx = 0xff;
        mconf->mt76.wmm_idx = ieee80211_vif_is_mld(vif) ?
                              0 : mconf->mt76.idx % MT76_CONNAC_MAX_WMM_SETS;
+       mconf->mt76.link_idx = hweight16(mvif->valid_links);
 
        if (mvif->phy->mt76->chandef.chan->band != NL80211_BAND_2GHZ)
                mconf->mt76.basic_rates_idx = MT792x_BASIC_RATES_TBL + 4;