2
0

752-07-v6.7-net-ethernet-mtk_wed-do-not-configure-rx-offload-if-.patch 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. From: Lorenzo Bianconi <[email protected]>
  2. Date: Mon, 18 Sep 2023 12:29:06 +0200
  3. Subject: [PATCH] net: ethernet: mtk_wed: do not configure rx offload if not
  4. supported
  5. Check if rx offload is supported running mtk_wed_get_rx_capa routine
  6. before configuring it. This is a preliminary patch to introduce Wireless
  7. Ethernet Dispatcher (WED) support for MT7988 SoC.
  8. Co-developed-by: Sujuan Chen <[email protected]>
  9. Signed-off-by: Sujuan Chen <[email protected]>
  10. Signed-off-by: Lorenzo Bianconi <[email protected]>
  11. Signed-off-by: Paolo Abeni <[email protected]>
  12. ---
  13. --- a/drivers/net/ethernet/mediatek/mtk_wed.c
  14. +++ b/drivers/net/ethernet/mediatek/mtk_wed.c
  15. @@ -606,7 +606,7 @@ mtk_wed_stop(struct mtk_wed_device *dev)
  16. wdma_w32(dev, MTK_WDMA_INT_GRP2, 0);
  17. wed_w32(dev, MTK_WED_WPDMA_INT_MASK, 0);
  18. - if (mtk_wed_is_v1(dev->hw))
  19. + if (!mtk_wed_get_rx_capa(dev))
  20. return;
  21. wed_w32(dev, MTK_WED_EXT_INT_MASK1, 0);
  22. @@ -733,16 +733,21 @@ mtk_wed_set_wpdma(struct mtk_wed_device
  23. {
  24. if (mtk_wed_is_v1(dev->hw)) {
  25. wed_w32(dev, MTK_WED_WPDMA_CFG_BASE, dev->wlan.wpdma_phys);
  26. - } else {
  27. - mtk_wed_bus_init(dev);
  28. -
  29. - wed_w32(dev, MTK_WED_WPDMA_CFG_BASE, dev->wlan.wpdma_int);
  30. - wed_w32(dev, MTK_WED_WPDMA_CFG_INT_MASK, dev->wlan.wpdma_mask);
  31. - wed_w32(dev, MTK_WED_WPDMA_CFG_TX, dev->wlan.wpdma_tx);
  32. - wed_w32(dev, MTK_WED_WPDMA_CFG_TX_FREE, dev->wlan.wpdma_txfree);
  33. - wed_w32(dev, MTK_WED_WPDMA_RX_GLO_CFG, dev->wlan.wpdma_rx_glo);
  34. - wed_w32(dev, MTK_WED_WPDMA_RX_RING, dev->wlan.wpdma_rx);
  35. + return;
  36. }
  37. +
  38. + mtk_wed_bus_init(dev);
  39. +
  40. + wed_w32(dev, MTK_WED_WPDMA_CFG_BASE, dev->wlan.wpdma_int);
  41. + wed_w32(dev, MTK_WED_WPDMA_CFG_INT_MASK, dev->wlan.wpdma_mask);
  42. + wed_w32(dev, MTK_WED_WPDMA_CFG_TX, dev->wlan.wpdma_tx);
  43. + wed_w32(dev, MTK_WED_WPDMA_CFG_TX_FREE, dev->wlan.wpdma_txfree);
  44. +
  45. + if (!mtk_wed_get_rx_capa(dev))
  46. + return;
  47. +
  48. + wed_w32(dev, MTK_WED_WPDMA_RX_GLO_CFG, dev->wlan.wpdma_rx_glo);
  49. + wed_w32(dev, MTK_WED_WPDMA_RX_RING, dev->wlan.wpdma_rx);
  50. }
  51. static void
  52. @@ -974,15 +979,17 @@ mtk_wed_hw_init(struct mtk_wed_device *d
  53. MTK_WED_CTRL_WED_TX_FREE_AGENT_EN);
  54. } else {
  55. wed_clr(dev, MTK_WED_TX_TKID_CTRL, MTK_WED_TX_TKID_CTRL_PAUSE);
  56. - /* rx hw init */
  57. - wed_w32(dev, MTK_WED_WPDMA_RX_D_RST_IDX,
  58. - MTK_WED_WPDMA_RX_D_RST_CRX_IDX |
  59. - MTK_WED_WPDMA_RX_D_RST_DRV_IDX);
  60. - wed_w32(dev, MTK_WED_WPDMA_RX_D_RST_IDX, 0);
  61. -
  62. - mtk_wed_rx_buffer_hw_init(dev);
  63. - mtk_wed_rro_hw_init(dev);
  64. - mtk_wed_route_qm_hw_init(dev);
  65. + if (mtk_wed_get_rx_capa(dev)) {
  66. + /* rx hw init */
  67. + wed_w32(dev, MTK_WED_WPDMA_RX_D_RST_IDX,
  68. + MTK_WED_WPDMA_RX_D_RST_CRX_IDX |
  69. + MTK_WED_WPDMA_RX_D_RST_DRV_IDX);
  70. + wed_w32(dev, MTK_WED_WPDMA_RX_D_RST_IDX, 0);
  71. +
  72. + mtk_wed_rx_buffer_hw_init(dev);
  73. + mtk_wed_rro_hw_init(dev);
  74. + mtk_wed_route_qm_hw_init(dev);
  75. + }
  76. }
  77. wed_clr(dev, MTK_WED_TX_BM_CTRL, MTK_WED_TX_BM_CTRL_PAUSE);
  78. @@ -1354,8 +1361,6 @@ mtk_wed_configure_irq(struct mtk_wed_dev
  79. wed_clr(dev, MTK_WED_WDMA_INT_CTRL, wdma_mask);
  80. } else {
  81. - wdma_mask |= FIELD_PREP(MTK_WDMA_INT_MASK_TX_DONE,
  82. - GENMASK(1, 0));
  83. /* initail tx interrupt trigger */
  84. wed_w32(dev, MTK_WED_WPDMA_INT_CTRL_TX,
  85. MTK_WED_WPDMA_INT_CTRL_TX0_DONE_EN |
  86. @@ -1374,15 +1379,20 @@ mtk_wed_configure_irq(struct mtk_wed_dev
  87. FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_TX_FREE_DONE_TRIG,
  88. dev->wlan.txfree_tbit));
  89. - wed_w32(dev, MTK_WED_WPDMA_INT_CTRL_RX,
  90. - MTK_WED_WPDMA_INT_CTRL_RX0_EN |
  91. - MTK_WED_WPDMA_INT_CTRL_RX0_CLR |
  92. - MTK_WED_WPDMA_INT_CTRL_RX1_EN |
  93. - MTK_WED_WPDMA_INT_CTRL_RX1_CLR |
  94. - FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_RX0_DONE_TRIG,
  95. - dev->wlan.rx_tbit[0]) |
  96. - FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_RX1_DONE_TRIG,
  97. - dev->wlan.rx_tbit[1]));
  98. + if (mtk_wed_get_rx_capa(dev)) {
  99. + wed_w32(dev, MTK_WED_WPDMA_INT_CTRL_RX,
  100. + MTK_WED_WPDMA_INT_CTRL_RX0_EN |
  101. + MTK_WED_WPDMA_INT_CTRL_RX0_CLR |
  102. + MTK_WED_WPDMA_INT_CTRL_RX1_EN |
  103. + MTK_WED_WPDMA_INT_CTRL_RX1_CLR |
  104. + FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_RX0_DONE_TRIG,
  105. + dev->wlan.rx_tbit[0]) |
  106. + FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_RX1_DONE_TRIG,
  107. + dev->wlan.rx_tbit[1]));
  108. +
  109. + wdma_mask |= FIELD_PREP(MTK_WDMA_INT_MASK_TX_DONE,
  110. + GENMASK(1, 0));
  111. + }
  112. wed_w32(dev, MTK_WED_WDMA_INT_CLR, wdma_mask);
  113. wed_set(dev, MTK_WED_WDMA_INT_CTRL,
  114. @@ -1401,6 +1411,8 @@ mtk_wed_configure_irq(struct mtk_wed_dev
  115. static void
  116. mtk_wed_dma_enable(struct mtk_wed_device *dev)
  117. {
  118. + int i;
  119. +
  120. wed_set(dev, MTK_WED_WPDMA_INT_CTRL, MTK_WED_WPDMA_INT_CTRL_SUBRT_ADV);
  121. wed_set(dev, MTK_WED_GLO_CFG,
  122. @@ -1420,33 +1432,33 @@ mtk_wed_dma_enable(struct mtk_wed_device
  123. if (mtk_wed_is_v1(dev->hw)) {
  124. wdma_set(dev, MTK_WDMA_GLO_CFG,
  125. MTK_WDMA_GLO_CFG_RX_INFO3_PRERES);
  126. - } else {
  127. - int i;
  128. + return;
  129. + }
  130. - wed_set(dev, MTK_WED_WPDMA_CTRL,
  131. - MTK_WED_WPDMA_CTRL_SDL1_FIXED);
  132. + wed_set(dev, MTK_WED_WPDMA_CTRL,
  133. + MTK_WED_WPDMA_CTRL_SDL1_FIXED);
  134. + wed_set(dev, MTK_WED_WPDMA_GLO_CFG,
  135. + MTK_WED_WPDMA_GLO_CFG_RX_DRV_R0_PKT_PROC |
  136. + MTK_WED_WPDMA_GLO_CFG_RX_DRV_R0_CRX_SYNC);
  137. + wed_clr(dev, MTK_WED_WPDMA_GLO_CFG,
  138. + MTK_WED_WPDMA_GLO_CFG_TX_TKID_KEEP |
  139. + MTK_WED_WPDMA_GLO_CFG_TX_DMAD_DW3_PREV);
  140. - wed_set(dev, MTK_WED_WDMA_GLO_CFG,
  141. - MTK_WED_WDMA_GLO_CFG_TX_DRV_EN |
  142. - MTK_WED_WDMA_GLO_CFG_TX_DDONE_CHK);
  143. + if (!mtk_wed_get_rx_capa(dev))
  144. + return;
  145. - wed_set(dev, MTK_WED_WPDMA_GLO_CFG,
  146. - MTK_WED_WPDMA_GLO_CFG_RX_DRV_R0_PKT_PROC |
  147. - MTK_WED_WPDMA_GLO_CFG_RX_DRV_R0_CRX_SYNC);
  148. -
  149. - wed_clr(dev, MTK_WED_WPDMA_GLO_CFG,
  150. - MTK_WED_WPDMA_GLO_CFG_TX_TKID_KEEP |
  151. - MTK_WED_WPDMA_GLO_CFG_TX_DMAD_DW3_PREV);
  152. + wed_set(dev, MTK_WED_WDMA_GLO_CFG,
  153. + MTK_WED_WDMA_GLO_CFG_TX_DRV_EN |
  154. + MTK_WED_WDMA_GLO_CFG_TX_DDONE_CHK);
  155. - wed_set(dev, MTK_WED_WPDMA_RX_D_GLO_CFG,
  156. - MTK_WED_WPDMA_RX_D_RX_DRV_EN |
  157. - FIELD_PREP(MTK_WED_WPDMA_RX_D_RXD_READ_LEN, 0x18) |
  158. - FIELD_PREP(MTK_WED_WPDMA_RX_D_INIT_PHASE_RXEN_SEL,
  159. - 0x2));
  160. + wed_set(dev, MTK_WED_WPDMA_RX_D_GLO_CFG,
  161. + MTK_WED_WPDMA_RX_D_RX_DRV_EN |
  162. + FIELD_PREP(MTK_WED_WPDMA_RX_D_RXD_READ_LEN, 0x18) |
  163. + FIELD_PREP(MTK_WED_WPDMA_RX_D_INIT_PHASE_RXEN_SEL,
  164. + 0x2));
  165. - for (i = 0; i < MTK_WED_RX_QUEUES; i++)
  166. - mtk_wed_check_wfdma_rx_fill(dev, i);
  167. - }
  168. + for (i = 0; i < MTK_WED_RX_QUEUES; i++)
  169. + mtk_wed_check_wfdma_rx_fill(dev, i);
  170. }
  171. static void
  172. @@ -1473,7 +1485,7 @@ mtk_wed_start(struct mtk_wed_device *dev
  173. val |= BIT(0) | (BIT(1) * !!dev->hw->index);
  174. regmap_write(dev->hw->mirror, dev->hw->index * 4, val);
  175. - } else {
  176. + } else if (mtk_wed_get_rx_capa(dev)) {
  177. /* driver set mid ready and only once */
  178. wed_w32(dev, MTK_WED_EXT_INT_MASK1,
  179. MTK_WED_EXT_INT_STATUS_WPDMA_MID_RDY);
  180. @@ -1485,7 +1497,6 @@ mtk_wed_start(struct mtk_wed_device *dev
  181. if (mtk_wed_rro_cfg(dev))
  182. return;
  183. -
  184. }
  185. mtk_wed_set_512_support(dev, dev->wlan.wcid_512);
  186. @@ -1551,13 +1562,14 @@ mtk_wed_attach(struct mtk_wed_device *de
  187. }
  188. mtk_wed_hw_init_early(dev);
  189. - if (mtk_wed_is_v1(hw)) {
  190. + if (mtk_wed_is_v1(hw))
  191. regmap_update_bits(hw->hifsys, HIFSYS_DMA_AG_MAP,
  192. BIT(hw->index), 0);
  193. - } else {
  194. + else
  195. dev->rev_id = wed_r32(dev, MTK_WED_REV_ID);
  196. +
  197. + if (mtk_wed_get_rx_capa(dev))
  198. ret = mtk_wed_wo_init(hw);
  199. - }
  200. out:
  201. if (ret) {
  202. dev_err(dev->hw->dev, "failed to attach wed device\n");
  203. --- a/drivers/net/ethernet/mediatek/mtk_wed_mcu.c
  204. +++ b/drivers/net/ethernet/mediatek/mtk_wed_mcu.c
  205. @@ -207,7 +207,7 @@ int mtk_wed_mcu_msg_update(struct mtk_we
  206. {
  207. struct mtk_wed_wo *wo = dev->hw->wed_wo;
  208. - if (mtk_wed_is_v1(dev->hw))
  209. + if (!mtk_wed_get_rx_capa(dev))
  210. return 0;
  211. if (WARN_ON(!wo))