@@ -237,9 +237,30 @@ mtk_wed_set_ext_int(struct mtk_wed_device *dev, bool en)
237237}
238238
239239static 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
266278static 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
522537static 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
0 commit comments