wifi: mt76: mt792xu: enable dmashdl support
authorDeren Wu <deren.wu@mediatek.com>
Sat, 23 Dec 2023 03:43:08 +0000 (11:43 +0800)
committerFelix Fietkau <nbd@nbd.name>
Thu, 22 Feb 2024 08:55:17 +0000 (09:55 +0100)
dmashdl(DMA scheduler) was disable and may cause packets corruption
without propoer resource handling. Enable this to control resources
between usb-bus/pse/hardware-ac-queue.

Signed-off-by: Deren Wu <deren.wu@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt792x_usb.c

index 589a3efb9f8c30bbce14ec288e8ad66ecf0acf99..b49668a4b7849362ab9eb1a51458f9ce7b12f805 100644 (file)
@@ -121,44 +121,25 @@ static void mt792xu_uhw_wr(struct mt76_dev *dev, u32 addr, u32 val)
 
 static void mt792xu_dma_prefetch(struct mt792x_dev *dev)
 {
-       mt76_rmw(dev, MT_UWFDMA0_TX_RING_EXT_CTRL(0),
-                MT_WPDMA0_MAX_CNT_MASK, 4);
-       mt76_rmw(dev, MT_UWFDMA0_TX_RING_EXT_CTRL(0),
-                MT_WPDMA0_BASE_PTR_MASK, 0x80);
-
-       mt76_rmw(dev, MT_UWFDMA0_TX_RING_EXT_CTRL(1),
-                MT_WPDMA0_MAX_CNT_MASK, 4);
-       mt76_rmw(dev, MT_UWFDMA0_TX_RING_EXT_CTRL(1),
-                MT_WPDMA0_BASE_PTR_MASK, 0xc0);
-
-       mt76_rmw(dev, MT_UWFDMA0_TX_RING_EXT_CTRL(2),
-                MT_WPDMA0_MAX_CNT_MASK, 4);
-       mt76_rmw(dev, MT_UWFDMA0_TX_RING_EXT_CTRL(2),
-                MT_WPDMA0_BASE_PTR_MASK, 0x100);
-
-       mt76_rmw(dev, MT_UWFDMA0_TX_RING_EXT_CTRL(3),
-                MT_WPDMA0_MAX_CNT_MASK, 4);
-       mt76_rmw(dev, MT_UWFDMA0_TX_RING_EXT_CTRL(3),
-                MT_WPDMA0_BASE_PTR_MASK, 0x140);
-
-       mt76_rmw(dev, MT_UWFDMA0_TX_RING_EXT_CTRL(4),
-                MT_WPDMA0_MAX_CNT_MASK, 4);
-       mt76_rmw(dev, MT_UWFDMA0_TX_RING_EXT_CTRL(4),
-                MT_WPDMA0_BASE_PTR_MASK, 0x180);
-
-       mt76_rmw(dev, MT_UWFDMA0_TX_RING_EXT_CTRL(16),
-                MT_WPDMA0_MAX_CNT_MASK, 4);
-       mt76_rmw(dev, MT_UWFDMA0_TX_RING_EXT_CTRL(16),
-                MT_WPDMA0_BASE_PTR_MASK, 0x280);
-
-       mt76_rmw(dev, MT_UWFDMA0_TX_RING_EXT_CTRL(17),
-                MT_WPDMA0_MAX_CNT_MASK, 4);
-       mt76_rmw(dev, MT_UWFDMA0_TX_RING_EXT_CTRL(17),
-                MT_WPDMA0_BASE_PTR_MASK,  0x2c0);
+#define DMA_PREFETCH_CONF(_idx_, _cnt_, _base_) \
+       mt76_rmw(dev, MT_UWFDMA0_TX_RING_EXT_CTRL((_idx_)), \
+                MT_WPDMA0_MAX_CNT_MASK | MT_WPDMA0_BASE_PTR_MASK, \
+                FIELD_PREP(MT_WPDMA0_MAX_CNT_MASK, (_cnt_)) | \
+                FIELD_PREP(MT_WPDMA0_BASE_PTR_MASK, (_base_)))
+
+       DMA_PREFETCH_CONF(0, 4, 0x080);
+       DMA_PREFETCH_CONF(1, 4, 0x0c0);
+       DMA_PREFETCH_CONF(2, 4, 0x100);
+       DMA_PREFETCH_CONF(3, 4, 0x140);
+       DMA_PREFETCH_CONF(4, 4, 0x180);
+       DMA_PREFETCH_CONF(16, 4, 0x280);
+       DMA_PREFETCH_CONF(17, 4, 0x2c0);
 }
 
 static void mt792xu_wfdma_init(struct mt792x_dev *dev)
 {
+       int i;
+
        mt792xu_dma_prefetch(dev);
 
        mt76_clear(dev, MT_UWFDMA0_GLO_CFG, MT_WFDMA0_GLO_CFG_OMIT_RX_INFO);
@@ -169,10 +150,27 @@ static void mt792xu_wfdma_init(struct mt792x_dev *dev)
                 MT_WFDMA0_GLO_CFG_TX_DMA_EN |
                 MT_WFDMA0_GLO_CFG_RX_DMA_EN);
 
-       /* disable dmashdl */
-       mt76_clear(dev, MT_UWFDMA0_GLO_CFG_EXT0,
-                  MT_WFDMA0_CSR_TX_DMASHDL_ENABLE);
-       mt76_set(dev, MT_DMASHDL_SW_CONTROL, MT_DMASHDL_DMASHDL_BYPASS);
+       mt76_rmw(dev, MT_DMASHDL_REFILL, MT_DMASHDL_REFILL_MASK, 0xffe00000);
+       mt76_clear(dev, MT_DMASHDL_PAGE, MT_DMASHDL_GROUP_SEQ_ORDER);
+       mt76_rmw(dev, MT_DMASHDL_PKT_MAX_SIZE,
+                MT_DMASHDL_PKT_MAX_SIZE_PLE | MT_DMASHDL_PKT_MAX_SIZE_PSE,
+                FIELD_PREP(MT_DMASHDL_PKT_MAX_SIZE_PLE, 1) |
+                FIELD_PREP(MT_DMASHDL_PKT_MAX_SIZE_PSE, 0));
+       for (i = 0; i < 5; i++)
+               mt76_wr(dev, MT_DMASHDL_GROUP_QUOTA(i),
+                       FIELD_PREP(MT_DMASHDL_GROUP_QUOTA_MIN, 0x3) |
+                       FIELD_PREP(MT_DMASHDL_GROUP_QUOTA_MAX, 0xfff));
+       for (i = 5; i < 16; i++)
+               mt76_wr(dev, MT_DMASHDL_GROUP_QUOTA(i),
+                       FIELD_PREP(MT_DMASHDL_GROUP_QUOTA_MIN, 0x0) |
+                       FIELD_PREP(MT_DMASHDL_GROUP_QUOTA_MAX, 0x0));
+       mt76_wr(dev, MT_DMASHDL_Q_MAP(0), 0x32013201);
+       mt76_wr(dev, MT_DMASHDL_Q_MAP(1), 0x32013201);
+       mt76_wr(dev, MT_DMASHDL_Q_MAP(2), 0x55555444);
+       mt76_wr(dev, MT_DMASHDL_Q_MAP(3), 0x55555444);
+
+       mt76_wr(dev, MT_DMASHDL_SCHED_SET(0), 0x76540132);
+       mt76_wr(dev, MT_DMASHDL_SCHED_SET(1), 0xFEDCBA98);
 
        mt76_set(dev, MT_WFDMA_DUMMY_CR, MT_WFDMA_NEED_REINIT);
 }