Skip to content

Commit cf26df8

Browse files
LorenzoBianconiPaolo Abeni
authored andcommitted
net: ethernet: mtk_eth_wed: add mtk_wed_configure_irq and mtk_wed_dma_{enable/disable}
Introduce mtk_wed_configure_irq, mtk_wed_dma_enable and mtk_wed_dma_disable utility routines. This is a preliminary patch to introduce mt7986 wed support. Tested-by: Daniel Golle <daniel@makrotopia.org> Co-developed-by: Bo Jiao <Bo.Jiao@mediatek.com> Signed-off-by: Bo Jiao <Bo.Jiao@mediatek.com> Co-developed-by: Sujuan Chen <sujuan.chen@mediatek.com> Signed-off-by: Sujuan Chen <sujuan.chen@mediatek.com> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
1 parent 9d8cb4c commit cf26df8

File tree

2 files changed

+64
-29
lines changed

2 files changed

+64
-29
lines changed

drivers/net/ethernet/mediatek/mtk_wed.c

Lines changed: 59 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -237,9 +237,30 @@ mtk_wed_set_ext_int(struct mtk_wed_device *dev, bool en)
237237
}
238238

239239
static void
240-
mtk_wed_stop(struct mtk_wed_device *dev)
240+
mtk_wed_dma_disable(struct mtk_wed_device *dev)
241241
{
242+
wed_clr(dev, MTK_WED_WPDMA_GLO_CFG,
243+
MTK_WED_WPDMA_GLO_CFG_TX_DRV_EN |
244+
MTK_WED_WPDMA_GLO_CFG_RX_DRV_EN);
245+
246+
wed_clr(dev, MTK_WED_WDMA_GLO_CFG, MTK_WED_WDMA_GLO_CFG_RX_DRV_EN);
247+
248+
wed_clr(dev, MTK_WED_GLO_CFG,
249+
MTK_WED_GLO_CFG_TX_DMA_EN |
250+
MTK_WED_GLO_CFG_RX_DMA_EN);
251+
242252
regmap_write(dev->hw->mirror, dev->hw->index * 4, 0);
253+
wdma_m32(dev, MTK_WDMA_GLO_CFG,
254+
MTK_WDMA_GLO_CFG_TX_DMA_EN |
255+
MTK_WDMA_GLO_CFG_RX_INFO1_PRERES |
256+
MTK_WDMA_GLO_CFG_RX_INFO2_PRERES |
257+
MTK_WDMA_GLO_CFG_RX_INFO3_PRERES, 0);
258+
}
259+
260+
static void
261+
mtk_wed_stop(struct mtk_wed_device *dev)
262+
{
263+
mtk_wed_dma_disable(dev);
243264
mtk_wed_set_ext_int(dev, false);
244265

245266
wed_clr(dev, MTK_WED_CTRL,
@@ -252,15 +273,6 @@ mtk_wed_stop(struct mtk_wed_device *dev)
252273
wdma_w32(dev, MTK_WDMA_INT_MASK, 0);
253274
wdma_w32(dev, MTK_WDMA_INT_GRP2, 0);
254275
wed_w32(dev, MTK_WED_WPDMA_INT_MASK, 0);
255-
256-
wed_clr(dev, MTK_WED_GLO_CFG,
257-
MTK_WED_GLO_CFG_TX_DMA_EN |
258-
MTK_WED_GLO_CFG_RX_DMA_EN);
259-
wed_clr(dev, MTK_WED_WPDMA_GLO_CFG,
260-
MTK_WED_WPDMA_GLO_CFG_TX_DRV_EN |
261-
MTK_WED_WPDMA_GLO_CFG_RX_DRV_EN);
262-
wed_clr(dev, MTK_WED_WDMA_GLO_CFG,
263-
MTK_WED_WDMA_GLO_CFG_RX_DRV_EN);
264276
}
265277

266278
static void
@@ -313,7 +325,10 @@ mtk_wed_hw_init_early(struct mtk_wed_device *dev)
313325
MTK_WED_WDMA_GLO_CFG_IDLE_DMAD_SUPPLY;
314326
wed_m32(dev, MTK_WED_WDMA_GLO_CFG, mask, set);
315327

316-
wdma_set(dev, MTK_WDMA_GLO_CFG, MTK_WDMA_GLO_CFG_RX_INFO_PRERES);
328+
wdma_set(dev, MTK_WDMA_GLO_CFG,
329+
MTK_WDMA_GLO_CFG_RX_INFO1_PRERES |
330+
MTK_WDMA_GLO_CFG_RX_INFO2_PRERES |
331+
MTK_WDMA_GLO_CFG_RX_INFO3_PRERES);
317332

318333
offset = dev->hw->index ? 0x04000400 : 0;
319334
wed_w32(dev, MTK_WED_WDMA_OFFSET0, 0x2a042a20 + offset);
@@ -520,43 +535,38 @@ mtk_wed_wdma_ring_setup(struct mtk_wed_device *dev, int idx, int size)
520535
}
521536

522537
static void
523-
mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask)
538+
mtk_wed_configure_irq(struct mtk_wed_device *dev, u32 irq_mask)
524539
{
525-
u32 wdma_mask;
526-
u32 val;
527-
int i;
528-
529-
for (i = 0; i < ARRAY_SIZE(dev->tx_wdma); i++)
530-
if (!dev->tx_wdma[i].desc)
531-
mtk_wed_wdma_ring_setup(dev, i, 16);
532-
533-
wdma_mask = FIELD_PREP(MTK_WDMA_INT_MASK_RX_DONE, GENMASK(1, 0));
534-
535-
mtk_wed_hw_init(dev);
540+
u32 wdma_mask = FIELD_PREP(MTK_WDMA_INT_MASK_RX_DONE, GENMASK(1, 0));
536541

542+
/* wed control cr set */
537543
wed_set(dev, MTK_WED_CTRL,
538544
MTK_WED_CTRL_WDMA_INT_AGENT_EN |
539545
MTK_WED_CTRL_WPDMA_INT_AGENT_EN |
540546
MTK_WED_CTRL_WED_TX_BM_EN |
541547
MTK_WED_CTRL_WED_TX_FREE_AGENT_EN);
542548

543-
wed_w32(dev, MTK_WED_PCIE_INT_TRIGGER, MTK_WED_PCIE_INT_TRIGGER_STATUS);
549+
wed_w32(dev, MTK_WED_PCIE_INT_TRIGGER,
550+
MTK_WED_PCIE_INT_TRIGGER_STATUS);
544551

545552
wed_w32(dev, MTK_WED_WPDMA_INT_TRIGGER,
546553
MTK_WED_WPDMA_INT_TRIGGER_RX_DONE |
547554
MTK_WED_WPDMA_INT_TRIGGER_TX_DONE);
548555

549-
wed_set(dev, MTK_WED_WPDMA_INT_CTRL,
550-
MTK_WED_WPDMA_INT_CTRL_SUBRT_ADV);
551-
556+
/* initail wdma interrupt agent */
552557
wed_w32(dev, MTK_WED_WDMA_INT_TRIGGER, wdma_mask);
553558
wed_clr(dev, MTK_WED_WDMA_INT_CTRL, wdma_mask);
554559

555560
wdma_w32(dev, MTK_WDMA_INT_MASK, wdma_mask);
556561
wdma_w32(dev, MTK_WDMA_INT_GRP2, wdma_mask);
557-
558562
wed_w32(dev, MTK_WED_WPDMA_INT_MASK, irq_mask);
559563
wed_w32(dev, MTK_WED_INT_MASK, irq_mask);
564+
}
565+
566+
static void
567+
mtk_wed_dma_enable(struct mtk_wed_device *dev)
568+
{
569+
wed_set(dev, MTK_WED_WPDMA_INT_CTRL, MTK_WED_WPDMA_INT_CTRL_SUBRT_ADV);
560570

561571
wed_set(dev, MTK_WED_GLO_CFG,
562572
MTK_WED_GLO_CFG_TX_DMA_EN |
@@ -567,6 +577,26 @@ mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask)
567577
wed_set(dev, MTK_WED_WDMA_GLO_CFG,
568578
MTK_WED_WDMA_GLO_CFG_RX_DRV_EN);
569579

580+
wdma_set(dev, MTK_WDMA_GLO_CFG,
581+
MTK_WDMA_GLO_CFG_TX_DMA_EN |
582+
MTK_WDMA_GLO_CFG_RX_INFO1_PRERES |
583+
MTK_WDMA_GLO_CFG_RX_INFO2_PRERES |
584+
MTK_WDMA_GLO_CFG_RX_INFO3_PRERES);
585+
}
586+
587+
static void
588+
mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask)
589+
{
590+
u32 val;
591+
int i;
592+
593+
for (i = 0; i < ARRAY_SIZE(dev->tx_wdma); i++)
594+
if (!dev->tx_wdma[i].desc)
595+
mtk_wed_wdma_ring_setup(dev, i, 16);
596+
597+
mtk_wed_hw_init(dev);
598+
mtk_wed_configure_irq(dev, irq_mask);
599+
570600
mtk_wed_set_ext_int(dev, true);
571601
val = dev->wlan.wpdma_phys |
572602
MTK_PCIE_MIRROR_MAP_EN |
@@ -577,6 +607,7 @@ mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask)
577607
val |= BIT(0);
578608
regmap_write(dev->hw->mirror, dev->hw->index * 4, val);
579609

610+
mtk_wed_dma_enable(dev);
580611
dev->running = true;
581612
}
582613

drivers/net/ethernet/mediatek/mtk_wed_regs.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,11 @@ struct mtk_wdma_desc {
224224
#define MTK_WDMA_RING_RX(_n) (0x100 + (_n) * 0x10)
225225

226226
#define MTK_WDMA_GLO_CFG 0x204
227-
#define MTK_WDMA_GLO_CFG_RX_INFO_PRERES GENMASK(28, 26)
227+
#define MTK_WDMA_GLO_CFG_TX_DMA_EN BIT(0)
228+
#define MTK_WDMA_GLO_CFG_RX_DMA_EN BIT(2)
229+
#define MTK_WDMA_GLO_CFG_RX_INFO3_PRERES BIT(26)
230+
#define MTK_WDMA_GLO_CFG_RX_INFO2_PRERES BIT(27)
231+
#define MTK_WDMA_GLO_CFG_RX_INFO1_PRERES BIT(28)
228232

229233
#define MTK_WDMA_RESET_IDX 0x208
230234
#define MTK_WDMA_RESET_IDX_TX GENMASK(3, 0)

0 commit comments

Comments
 (0)