610-v5.13-51-net-ethernet-mtk_eth_soc-use-iopoll.h-macro-for-DMA-.patch 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. From 3bc8e0aff23be0526af0dbc7973a8866a08d73f1 Mon Sep 17 00:00:00 2001
  2. From: Ilya Lipnitskiy <[email protected]>
  3. Date: Thu, 22 Apr 2021 22:21:08 -0700
  4. Subject: [PATCH] net: ethernet: mtk_eth_soc: use iopoll.h macro for DMA init
  5. Replace a tight busy-wait loop without a pause with a standard
  6. readx_poll_timeout_atomic routine with a 5 us poll period.
  7. Tested by booting a MT7621 device to ensure the driver initializes
  8. properly.
  9. Signed-off-by: Ilya Lipnitskiy <[email protected]>
  10. Reviewed-by: Andrew Lunn <[email protected]>
  11. Signed-off-by: David S. Miller <[email protected]>
  12. ---
  13. drivers/net/ethernet/mediatek/mtk_eth_soc.c | 29 +++++++++------------
  14. drivers/net/ethernet/mediatek/mtk_eth_soc.h | 2 +-
  15. 2 files changed, 14 insertions(+), 17 deletions(-)
  16. --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
  17. +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
  18. @@ -2054,25 +2054,22 @@ static int mtk_set_features(struct net_d
  19. /* wait for DMA to finish whatever it is doing before we start using it again */
  20. static int mtk_dma_busy_wait(struct mtk_eth *eth)
  21. {
  22. - unsigned long t_start = jiffies;
  23. + unsigned int reg;
  24. + int ret;
  25. + u32 val;
  26. - while (1) {
  27. - if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) {
  28. - if (!(mtk_r32(eth, MTK_QDMA_GLO_CFG) &
  29. - (MTK_RX_DMA_BUSY | MTK_TX_DMA_BUSY)))
  30. - return 0;
  31. - } else {
  32. - if (!(mtk_r32(eth, MTK_PDMA_GLO_CFG) &
  33. - (MTK_RX_DMA_BUSY | MTK_TX_DMA_BUSY)))
  34. - return 0;
  35. - }
  36. + if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA))
  37. + reg = MTK_QDMA_GLO_CFG;
  38. + else
  39. + reg = MTK_PDMA_GLO_CFG;
  40. - if (time_after(jiffies, t_start + MTK_DMA_BUSY_TIMEOUT))
  41. - break;
  42. - }
  43. + ret = readx_poll_timeout_atomic(__raw_readl, eth->base + reg, val,
  44. + !(val & (MTK_RX_DMA_BUSY | MTK_TX_DMA_BUSY)),
  45. + 5, MTK_DMA_BUSY_TIMEOUT_US);
  46. + if (ret)
  47. + dev_err(eth->dev, "DMA init timeout\n");
  48. - dev_err(eth->dev, "DMA init timeout\n");
  49. - return -1;
  50. + return ret;
  51. }
  52. static int mtk_dma_init(struct mtk_eth *eth)
  53. --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
  54. +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
  55. @@ -213,7 +213,7 @@
  56. #define MTK_TX_DMA_BUSY BIT(1)
  57. #define MTK_RX_DMA_EN BIT(2)
  58. #define MTK_TX_DMA_EN BIT(0)
  59. -#define MTK_DMA_BUSY_TIMEOUT HZ
  60. +#define MTK_DMA_BUSY_TIMEOUT_US 1000000
  61. /* QDMA Reset Index Register */
  62. #define MTK_QDMA_RST_IDX 0x1A08