wifi: mt76: mt7996: set correct wcid in txp
authorPeter Chiu <chui-hao.chiu@mediatek.com>
Thu, 17 Aug 2023 08:01:46 +0000 (16:01 +0800)
committerFelix Fietkau <nbd@nbd.name>
Sat, 30 Sep 2023 18:03:04 +0000 (20:03 +0200)
Set correct wcid in txp to let the SDO hw module look into the correct
wtbl, otherwise the tx descriptor may be wrongly fiiled. This patch also
fixed the issue that driver could not correctly report sta statistics,
especially in WDS mode, which misled AQL.

Fixes: 98686cd21624 ("wifi: mt76: mt7996: add driver for MediaTek Wi-Fi 7 (802.11be) devices")
Co-developed-by: Michael-CY Lee <michael-cy.lee@mediatek.com>
Signed-off-by: Michael-CY Lee <michael-cy.lee@mediatek.com>
Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76_connac3_mac.h
drivers/net/wireless/mediatek/mt76/mt7996/mac.c

index 68ca0844cbbfad88995802bc2a8de7290a64e1c1..87bfa441a93743a99c1f7e72ae252cd9d42f60d3 100644 (file)
@@ -257,6 +257,8 @@ enum tx_mgnt_type {
 #define MT_TXD7_UDP_TCP_SUM            BIT(15)
 #define MT_TXD7_TX_TIME                        GENMASK(9, 0)
 
+#define MT_TXD9_WLAN_IDX               GENMASK(23, 8)
+
 #define MT_TX_RATE_STBC                        BIT(14)
 #define MT_TX_RATE_NSS                 GENMASK(13, 10)
 #define MT_TX_RATE_MODE                        GENMASK(9, 6)
index 0eebf915df2658353844a89263d85882cf322e3c..269e023e431133bb67ed1016e68f7dba53ca9767 100644 (file)
@@ -991,10 +991,8 @@ int mt7996_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
        }
 
        txp->fw.token = cpu_to_le16(id);
-       if (test_bit(MT_WCID_FLAG_4ADDR, &wcid->flags))
-               txp->fw.rept_wds_wcid = cpu_to_le16(wcid->idx);
-       else
-               txp->fw.rept_wds_wcid = cpu_to_le16(0xfff);
+       txp->fw.rept_wds_wcid = cpu_to_le16(sta ? wcid->idx : 0xfff);
+
        tx_info->skb = NULL;
 
        /* pass partial skb header to fw */
@@ -1051,7 +1049,7 @@ mt7996_txwi_free(struct mt7996_dev *dev, struct mt76_txwi_cache *t,
                if (likely(t->skb->protocol != cpu_to_be16(ETH_P_PAE)))
                        mt7996_tx_check_aggr(sta, txwi);
        } else {
-               wcid_idx = le32_get_bits(txwi[1], MT_TXD1_WLAN_IDX);
+               wcid_idx = le32_get_bits(txwi[9], MT_TXD9_WLAN_IDX);
        }
 
        __mt76_tx_complete_skb(mdev, wcid_idx, t->skb, free_list);