729-22-v6.3-net-ethernet-mtk_wed-add-reset-reset_complete-callba.patch 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. From: Lorenzo Bianconi <[email protected]>
  2. Date: Sat, 14 Jan 2023 18:01:32 +0100
  3. Subject: [PATCH] net: ethernet: mtk_wed: add reset/reset_complete callbacks
  4. Introduce reset and reset_complete wlan callback to schedule WLAN driver
  5. reset when ethernet/wed driver is resetting.
  6. Tested-by: Daniel Golle <[email protected]>
  7. Co-developed-by: Sujuan Chen <[email protected]>
  8. Signed-off-by: Sujuan Chen <[email protected]>
  9. Signed-off-by: Lorenzo Bianconi <[email protected]>
  10. Signed-off-by: Paolo Abeni <[email protected]>
  11. ---
  12. --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
  13. +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
  14. @@ -3646,6 +3646,11 @@ static void mtk_pending_work(struct work
  15. set_bit(MTK_RESETTING, &eth->state);
  16. mtk_prepare_for_reset(eth);
  17. + mtk_wed_fe_reset();
  18. + /* Run again reset preliminary configuration in order to avoid any
  19. + * possible race during FE reset since it can run releasing RTNL lock.
  20. + */
  21. + mtk_prepare_for_reset(eth);
  22. /* stop all devices to make sure that dma is properly shut down */
  23. for (i = 0; i < MTK_MAC_COUNT; i++) {
  24. @@ -3683,6 +3688,8 @@ static void mtk_pending_work(struct work
  25. clear_bit(MTK_RESETTING, &eth->state);
  26. + mtk_wed_fe_reset_complete();
  27. +
  28. rtnl_unlock();
  29. }
  30. --- a/drivers/net/ethernet/mediatek/mtk_wed.c
  31. +++ b/drivers/net/ethernet/mediatek/mtk_wed.c
  32. @@ -205,6 +205,48 @@ mtk_wed_wo_reset(struct mtk_wed_device *
  33. iounmap(reg);
  34. }
  35. +void mtk_wed_fe_reset(void)
  36. +{
  37. + int i;
  38. +
  39. + mutex_lock(&hw_lock);
  40. +
  41. + for (i = 0; i < ARRAY_SIZE(hw_list); i++) {
  42. + struct mtk_wed_hw *hw = hw_list[i];
  43. + struct mtk_wed_device *dev = hw->wed_dev;
  44. + int err;
  45. +
  46. + if (!dev || !dev->wlan.reset)
  47. + continue;
  48. +
  49. + /* reset callback blocks until WLAN reset is completed */
  50. + err = dev->wlan.reset(dev);
  51. + if (err)
  52. + dev_err(dev->dev, "wlan reset failed: %d\n", err);
  53. + }
  54. +
  55. + mutex_unlock(&hw_lock);
  56. +}
  57. +
  58. +void mtk_wed_fe_reset_complete(void)
  59. +{
  60. + int i;
  61. +
  62. + mutex_lock(&hw_lock);
  63. +
  64. + for (i = 0; i < ARRAY_SIZE(hw_list); i++) {
  65. + struct mtk_wed_hw *hw = hw_list[i];
  66. + struct mtk_wed_device *dev = hw->wed_dev;
  67. +
  68. + if (!dev || !dev->wlan.reset_complete)
  69. + continue;
  70. +
  71. + dev->wlan.reset_complete(dev);
  72. + }
  73. +
  74. + mutex_unlock(&hw_lock);
  75. +}
  76. +
  77. static struct mtk_wed_hw *
  78. mtk_wed_assign(struct mtk_wed_device *dev)
  79. {
  80. --- a/drivers/net/ethernet/mediatek/mtk_wed.h
  81. +++ b/drivers/net/ethernet/mediatek/mtk_wed.h
  82. @@ -128,6 +128,8 @@ void mtk_wed_add_hw(struct device_node *
  83. void mtk_wed_exit(void);
  84. int mtk_wed_flow_add(int index);
  85. void mtk_wed_flow_remove(int index);
  86. +void mtk_wed_fe_reset(void);
  87. +void mtk_wed_fe_reset_complete(void);
  88. #else
  89. static inline void
  90. mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
  91. @@ -147,6 +149,13 @@ static inline void mtk_wed_flow_remove(i
  92. {
  93. }
  94. +static inline void mtk_wed_fe_reset(void)
  95. +{
  96. +}
  97. +
  98. +static inline void mtk_wed_fe_reset_complete(void)
  99. +{
  100. +}
  101. #endif
  102. #ifdef CONFIG_DEBUG_FS
  103. --- a/include/linux/soc/mediatek/mtk_wed.h
  104. +++ b/include/linux/soc/mediatek/mtk_wed.h
  105. @@ -151,6 +151,8 @@ struct mtk_wed_device {
  106. void (*release_rx_buf)(struct mtk_wed_device *wed);
  107. void (*update_wo_rx_stats)(struct mtk_wed_device *wed,
  108. struct mtk_wed_wo_rx_stats *stats);
  109. + int (*reset)(struct mtk_wed_device *wed);
  110. + void (*reset_complete)(struct mtk_wed_device *wed);
  111. } wlan;
  112. #endif
  113. };