wifi: mt76: mt7921: fix skb leak by txs missing in AMSDU
authorDeren Wu <deren.wu@mediatek.com>
Wed, 17 May 2023 09:18:24 +0000 (17:18 +0800)
committerFelix Fietkau <nbd@nbd.name>
Tue, 25 Jul 2023 19:59:41 +0000 (21:59 +0200)
txs may be dropped if the frame is aggregated in AMSDU. When the problem
shows up, some SKBs would be hold in driver to cause network stopped
temporarily. Even if the problem can be recovered by txs timeout handling,
mt7921 still need to disable txs in AMSDU to avoid this issue.

Cc: stable@vger.kernel.org
Fixes: 163f4d22c118 ("mt76: mt7921: add MAC support")
Reviewed-by: Shayne Chen <shayne.chen@mediatek.com>
Signed-off-by: Deren Wu <deren.wu@mediatek.com>
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c

index 3501f05031182079b50ea8cce64fe5f92b0a15e1..f481ca3a0db85e75c56242b2a5cde18773b2eb34 100644 (file)
@@ -495,6 +495,7 @@ void mt76_connac2_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
                                    BSS_CHANGED_BEACON_ENABLED));
        bool inband_disc = !!(changed & (BSS_CHANGED_UNSOL_BCAST_PROBE_RESP |
                                         BSS_CHANGED_FILS_DISCOVERY));
+       bool amsdu_en = wcid->amsdu;
 
        if (vif) {
                struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
@@ -554,12 +555,14 @@ void mt76_connac2_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
        txwi[4] = 0;
 
        val = FIELD_PREP(MT_TXD5_PID, pid);
-       if (pid >= MT_PACKET_ID_FIRST)
+       if (pid >= MT_PACKET_ID_FIRST) {
                val |= MT_TXD5_TX_STATUS_HOST;
+               amsdu_en = amsdu_en && !is_mt7921(dev);
+       }
 
        txwi[5] = cpu_to_le32(val);
        txwi[6] = 0;
-       txwi[7] = wcid->amsdu ? cpu_to_le32(MT_TXD7_HW_AMSDU) : 0;
+       txwi[7] = amsdu_en ? cpu_to_le32(MT_TXD7_HW_AMSDU) : 0;
 
        if (is_8023)
                mt76_connac2_mac_write_txwi_8023(txwi, skb, wcid);