mt76: mt7915: add txfree event v3
authorBo Jiao <Bo.Jiao@mediatek.com>
Mon, 20 Dec 2021 02:18:00 +0000 (10:18 +0800)
committerFelix Fietkau <nbd@nbd.name>
Thu, 3 Feb 2022 12:57:56 +0000 (13:57 +0100)
Update txfree v3 format.
This is an intermediate patch to add mt7916 support.

Co-developed-by: Sujuan Chen <sujuan.chen@mediatek.com>
Signed-off-by: Sujuan Chen <sujuan.chen@mediatek.com>
Co-developed-by: Ryder Lee <ryder.lee@mediatek.com>
Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
Signed-off-by: Bo Jiao <Bo.Jiao@mediatek.com>
Reviewed-by: Shayne Chen <shayne.chen@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7915/mac.c
drivers/net/wireless/mediatek/mt76/mt7915/mac.h

index 0be2e9f60a358dcfbd3c45058c822780bd2eb19e..74ec7cd01272ac5a15f0751547d032a9533d673c 100644 (file)
@@ -1387,8 +1387,10 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, void *data, int len)
        LIST_HEAD(free_list);
        struct sk_buff *skb, *tmp;
        void *end = data + len;
-       u8 i, count;
-       bool wake = false;
+       bool v3, wake = false;
+       u16 total, count = 0;
+       u32 txd = le32_to_cpu(free->txd);
+       u32 *cur_info;
 
        /* clean DMA queues and unmap buffers first */
        mt76_queue_tx_cleanup(dev, dev->mphy.q_tx[MT_TXQ_PSD], false);
@@ -1403,12 +1405,14 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, void *data, int len)
         * to the time ack is received or dropped by hw (air + hw queue time).
         * Should avoid accessing WTBL to get Tx airtime, and use it instead.
         */
-       count = FIELD_GET(MT_TX_FREE_MSDU_CNT, le16_to_cpu(free->ctrl));
-       if (WARN_ON_ONCE((void *)&free->info[count] > end))
+       total = FIELD_GET(MT_TX_FREE_MSDU_CNT, le16_to_cpu(free->ctrl));
+       v3 = (FIELD_GET(MT_TX_FREE_VER, txd) == 0x4);
+       if (WARN_ON_ONCE((void *)&free->info[total >> v3] > end))
                return;
 
-       for (i = 0; i < count; i++) {
-               u32 msdu, info = le32_to_cpu(free->info[i]);
+       for (cur_info = &free->info[0]; count < total; cur_info++) {
+               u32 msdu, info = le32_to_cpu(*cur_info);
+               u8 i;
 
                /*
                 * 1'b1: new wcid pair.
@@ -1419,7 +1423,6 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, void *data, int len)
                        struct mt76_wcid *wcid;
                        u16 idx;
 
-                       count++;
                        idx = FIELD_GET(MT_TX_FREE_WLAN_ID, info);
                        wcid = rcu_dereference(dev->mt76.wcid[idx]);
                        sta = wcid_to_sta(wcid);
@@ -1434,12 +1437,24 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, void *data, int len)
                        continue;
                }
 
-               msdu = FIELD_GET(MT_TX_FREE_MSDU_ID, info);
-               txwi = mt76_token_release(mdev, msdu, &wake);
-               if (!txwi)
+               if (v3 && (info & MT_TX_FREE_MPDU_HEADER))
                        continue;
 
-               mt7915_txwi_free(dev, txwi, sta, &free_list);
+               for (i = 0; i < 1 + v3; i++) {
+                       if (v3) {
+                               msdu = (info >> (15 * i)) & MT_TX_FREE_MSDU_ID_V3;
+                               if (msdu == MT_TX_FREE_MSDU_ID_V3)
+                                       continue;
+                       } else {
+                               msdu = FIELD_GET(MT_TX_FREE_MSDU_ID, info);
+                       }
+                       count++;
+                       txwi = mt76_token_release(mdev, msdu, &wake);
+                       if (!txwi)
+                               continue;
+
+                       mt7915_txwi_free(dev, txwi, sta, &free_list);
+               }
        }
 
        mt7915_mac_sta_poll(dev);
index 7a2c740d1464ed198a864bc0414f922299a6aea9..4504ebcbcd13a5934960de8b78c52a73178d1d1f 100644 (file)
@@ -298,18 +298,20 @@ struct mt7915_txp {
 struct mt7915_tx_free {
        __le16 rx_byte_cnt;
        __le16 ctrl;
-       u8 txd_cnt;
-       u8 rsv[3];
+       __le32 txd;
        __le32 info[];
 } __packed __aligned(4);
 
+#define MT_TX_FREE_VER                 GENMASK(18, 16)
 #define MT_TX_FREE_MSDU_CNT            GENMASK(9, 0)
 #define MT_TX_FREE_WLAN_ID             GENMASK(23, 14)
 #define MT_TX_FREE_LATENCY             GENMASK(12, 0)
 /* 0: success, others: dropped */
-#define MT_TX_FREE_STATUS              GENMASK(14, 13)
 #define MT_TX_FREE_MSDU_ID             GENMASK(30, 16)
 #define MT_TX_FREE_PAIR                        BIT(31)
+#define MT_TX_FREE_MPDU_HEADER         BIT(30)
+#define MT_TX_FREE_MSDU_ID_V3          GENMASK(14, 0)
+
 /* will support this field in further revision */
 #define MT_TX_FREE_RATE                        GENMASK(13, 0)