795-net-ethernet-mtk_eth_wed-add-mtk_wed_configure_irq-a.patch 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. From e5ecb4f619197b93fa682d722452dc8412864cdb Mon Sep 17 00:00:00 2001
  2. Message-Id: <e5ecb4f619197b93fa682d722452dc8412864cdb.1662886033.git.lorenzo@kernel.org>
  3. From: Lorenzo Bianconi <[email protected]>
  4. Date: Fri, 26 Aug 2022 01:12:57 +0200
  5. Subject: [PATCH net-next 1/5] net: ethernet: mtk_eth_wed: add
  6. mtk_wed_configure_irq and mtk_wed_dma_{enable/disable}
  7. Introduce mtk_wed_configure_irq, mtk_wed_dma_enable and mtk_wed_dma_disable
  8. utility routines.
  9. This is a preliminary patch to introduce mt7986 wed support.
  10. Co-developed-by: Bo Jiao <[email protected]>
  11. Signed-off-by: Bo Jiao <[email protected]>
  12. Co-developed-by: Sujuan Chen <[email protected]>
  13. Signed-off-by: Sujuan Chen <[email protected]>
  14. Signed-off-by: Lorenzo Bianconi <[email protected]>
  15. ---
  16. drivers/net/ethernet/mediatek/mtk_wed.c | 87 +++++++++++++-------
  17. drivers/net/ethernet/mediatek/mtk_wed_regs.h | 6 +-
  18. 2 files changed, 64 insertions(+), 29 deletions(-)
  19. --- a/drivers/net/ethernet/mediatek/mtk_wed.c
  20. +++ b/drivers/net/ethernet/mediatek/mtk_wed.c
  21. @@ -237,9 +237,30 @@ mtk_wed_set_ext_int(struct mtk_wed_devic
  22. }
  23. static void
  24. -mtk_wed_stop(struct mtk_wed_device *dev)
  25. +mtk_wed_dma_disable(struct mtk_wed_device *dev)
  26. {
  27. + wed_clr(dev, MTK_WED_WPDMA_GLO_CFG,
  28. + MTK_WED_WPDMA_GLO_CFG_TX_DRV_EN |
  29. + MTK_WED_WPDMA_GLO_CFG_RX_DRV_EN);
  30. +
  31. + wed_clr(dev, MTK_WED_WDMA_GLO_CFG, MTK_WED_WDMA_GLO_CFG_RX_DRV_EN);
  32. +
  33. + wed_clr(dev, MTK_WED_GLO_CFG,
  34. + MTK_WED_GLO_CFG_TX_DMA_EN |
  35. + MTK_WED_GLO_CFG_RX_DMA_EN);
  36. +
  37. regmap_write(dev->hw->mirror, dev->hw->index * 4, 0);
  38. + wdma_m32(dev, MTK_WDMA_GLO_CFG,
  39. + MTK_WDMA_GLO_CFG_TX_DMA_EN |
  40. + MTK_WDMA_GLO_CFG_RX_INFO1_PRERES |
  41. + MTK_WDMA_GLO_CFG_RX_INFO2_PRERES |
  42. + MTK_WDMA_GLO_CFG_RX_INFO3_PRERES, 0);
  43. +}
  44. +
  45. +static void
  46. +mtk_wed_stop(struct mtk_wed_device *dev)
  47. +{
  48. + mtk_wed_dma_disable(dev);
  49. mtk_wed_set_ext_int(dev, false);
  50. wed_clr(dev, MTK_WED_CTRL,
  51. @@ -252,15 +273,6 @@ mtk_wed_stop(struct mtk_wed_device *dev)
  52. wdma_w32(dev, MTK_WDMA_INT_MASK, 0);
  53. wdma_w32(dev, MTK_WDMA_INT_GRP2, 0);
  54. wed_w32(dev, MTK_WED_WPDMA_INT_MASK, 0);
  55. -
  56. - wed_clr(dev, MTK_WED_GLO_CFG,
  57. - MTK_WED_GLO_CFG_TX_DMA_EN |
  58. - MTK_WED_GLO_CFG_RX_DMA_EN);
  59. - wed_clr(dev, MTK_WED_WPDMA_GLO_CFG,
  60. - MTK_WED_WPDMA_GLO_CFG_TX_DRV_EN |
  61. - MTK_WED_WPDMA_GLO_CFG_RX_DRV_EN);
  62. - wed_clr(dev, MTK_WED_WDMA_GLO_CFG,
  63. - MTK_WED_WDMA_GLO_CFG_RX_DRV_EN);
  64. }
  65. static void
  66. @@ -313,7 +325,10 @@ mtk_wed_hw_init_early(struct mtk_wed_dev
  67. MTK_WED_WDMA_GLO_CFG_IDLE_DMAD_SUPPLY;
  68. wed_m32(dev, MTK_WED_WDMA_GLO_CFG, mask, set);
  69. - wdma_set(dev, MTK_WDMA_GLO_CFG, MTK_WDMA_GLO_CFG_RX_INFO_PRERES);
  70. + wdma_set(dev, MTK_WDMA_GLO_CFG,
  71. + MTK_WDMA_GLO_CFG_RX_INFO1_PRERES |
  72. + MTK_WDMA_GLO_CFG_RX_INFO2_PRERES |
  73. + MTK_WDMA_GLO_CFG_RX_INFO3_PRERES);
  74. offset = dev->hw->index ? 0x04000400 : 0;
  75. wed_w32(dev, MTK_WED_WDMA_OFFSET0, 0x2a042a20 + offset);
  76. @@ -520,43 +535,38 @@ mtk_wed_wdma_ring_setup(struct mtk_wed_d
  77. }
  78. static void
  79. -mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask)
  80. +mtk_wed_configure_irq(struct mtk_wed_device *dev, u32 irq_mask)
  81. {
  82. - u32 wdma_mask;
  83. - u32 val;
  84. - int i;
  85. -
  86. - for (i = 0; i < ARRAY_SIZE(dev->tx_wdma); i++)
  87. - if (!dev->tx_wdma[i].desc)
  88. - mtk_wed_wdma_ring_setup(dev, i, 16);
  89. -
  90. - wdma_mask = FIELD_PREP(MTK_WDMA_INT_MASK_RX_DONE, GENMASK(1, 0));
  91. -
  92. - mtk_wed_hw_init(dev);
  93. + u32 wdma_mask = FIELD_PREP(MTK_WDMA_INT_MASK_RX_DONE, GENMASK(1, 0));
  94. + /* wed control cr set */
  95. wed_set(dev, MTK_WED_CTRL,
  96. MTK_WED_CTRL_WDMA_INT_AGENT_EN |
  97. MTK_WED_CTRL_WPDMA_INT_AGENT_EN |
  98. MTK_WED_CTRL_WED_TX_BM_EN |
  99. MTK_WED_CTRL_WED_TX_FREE_AGENT_EN);
  100. - wed_w32(dev, MTK_WED_PCIE_INT_TRIGGER, MTK_WED_PCIE_INT_TRIGGER_STATUS);
  101. + wed_w32(dev, MTK_WED_PCIE_INT_TRIGGER,
  102. + MTK_WED_PCIE_INT_TRIGGER_STATUS);
  103. wed_w32(dev, MTK_WED_WPDMA_INT_TRIGGER,
  104. MTK_WED_WPDMA_INT_TRIGGER_RX_DONE |
  105. MTK_WED_WPDMA_INT_TRIGGER_TX_DONE);
  106. - wed_set(dev, MTK_WED_WPDMA_INT_CTRL,
  107. - MTK_WED_WPDMA_INT_CTRL_SUBRT_ADV);
  108. -
  109. + /* initail wdma interrupt agent */
  110. wed_w32(dev, MTK_WED_WDMA_INT_TRIGGER, wdma_mask);
  111. wed_clr(dev, MTK_WED_WDMA_INT_CTRL, wdma_mask);
  112. wdma_w32(dev, MTK_WDMA_INT_MASK, wdma_mask);
  113. wdma_w32(dev, MTK_WDMA_INT_GRP2, wdma_mask);
  114. -
  115. wed_w32(dev, MTK_WED_WPDMA_INT_MASK, irq_mask);
  116. wed_w32(dev, MTK_WED_INT_MASK, irq_mask);
  117. +}
  118. +
  119. +static void
  120. +mtk_wed_dma_enable(struct mtk_wed_device *dev)
  121. +{
  122. + wed_set(dev, MTK_WED_WPDMA_INT_CTRL, MTK_WED_WPDMA_INT_CTRL_SUBRT_ADV);
  123. wed_set(dev, MTK_WED_GLO_CFG,
  124. MTK_WED_GLO_CFG_TX_DMA_EN |
  125. @@ -567,6 +577,26 @@ mtk_wed_start(struct mtk_wed_device *dev
  126. wed_set(dev, MTK_WED_WDMA_GLO_CFG,
  127. MTK_WED_WDMA_GLO_CFG_RX_DRV_EN);
  128. + wdma_set(dev, MTK_WDMA_GLO_CFG,
  129. + MTK_WDMA_GLO_CFG_TX_DMA_EN |
  130. + MTK_WDMA_GLO_CFG_RX_INFO1_PRERES |
  131. + MTK_WDMA_GLO_CFG_RX_INFO2_PRERES |
  132. + MTK_WDMA_GLO_CFG_RX_INFO3_PRERES);
  133. +}
  134. +
  135. +static void
  136. +mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask)
  137. +{
  138. + u32 val;
  139. + int i;
  140. +
  141. + for (i = 0; i < ARRAY_SIZE(dev->tx_wdma); i++)
  142. + if (!dev->tx_wdma[i].desc)
  143. + mtk_wed_wdma_ring_setup(dev, i, 16);
  144. +
  145. + mtk_wed_hw_init(dev);
  146. + mtk_wed_configure_irq(dev, irq_mask);
  147. +
  148. mtk_wed_set_ext_int(dev, true);
  149. val = dev->wlan.wpdma_phys |
  150. MTK_PCIE_MIRROR_MAP_EN |
  151. @@ -577,6 +607,7 @@ mtk_wed_start(struct mtk_wed_device *dev
  152. val |= BIT(0);
  153. regmap_write(dev->hw->mirror, dev->hw->index * 4, val);
  154. + mtk_wed_dma_enable(dev);
  155. dev->running = true;
  156. }
  157. --- a/drivers/net/ethernet/mediatek/mtk_wed_regs.h
  158. +++ b/drivers/net/ethernet/mediatek/mtk_wed_regs.h
  159. @@ -224,7 +224,11 @@ struct mtk_wdma_desc {
  160. #define MTK_WDMA_RING_RX(_n) (0x100 + (_n) * 0x10)
  161. #define MTK_WDMA_GLO_CFG 0x204
  162. -#define MTK_WDMA_GLO_CFG_RX_INFO_PRERES GENMASK(28, 26)
  163. +#define MTK_WDMA_GLO_CFG_TX_DMA_EN BIT(0)
  164. +#define MTK_WDMA_GLO_CFG_RX_DMA_EN BIT(2)
  165. +#define MTK_WDMA_GLO_CFG_RX_INFO3_PRERES BIT(26)
  166. +#define MTK_WDMA_GLO_CFG_RX_INFO2_PRERES BIT(27)
  167. +#define MTK_WDMA_GLO_CFG_RX_INFO1_PRERES BIT(28)
  168. #define MTK_WDMA_RESET_IDX 0x208
  169. #define MTK_WDMA_RESET_IDX_TX GENMASK(3, 0)