123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- From: Lorenzo Bianconi <[email protected]>
- Date: Sat, 14 Jan 2023 18:01:32 +0100
- Subject: [PATCH] net: ethernet: mtk_wed: add reset/reset_complete callbacks
- Introduce reset and reset_complete wlan callback to schedule WLAN driver
- reset when ethernet/wed driver is resetting.
- Tested-by: Daniel Golle <[email protected]>
- Co-developed-by: Sujuan Chen <[email protected]>
- Signed-off-by: Sujuan Chen <[email protected]>
- Signed-off-by: Lorenzo Bianconi <[email protected]>
- Signed-off-by: Paolo Abeni <[email protected]>
- ---
- --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
- +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
- @@ -3629,6 +3629,11 @@ static void mtk_pending_work(struct work
- set_bit(MTK_RESETTING, ð->state);
-
- mtk_prepare_for_reset(eth);
- + mtk_wed_fe_reset();
- + /* Run again reset preliminary configuration in order to avoid any
- + * possible race during FE reset since it can run releasing RTNL lock.
- + */
- + mtk_prepare_for_reset(eth);
-
- /* stop all devices to make sure that dma is properly shut down */
- for (i = 0; i < MTK_MAC_COUNT; i++) {
- @@ -3666,6 +3671,8 @@ static void mtk_pending_work(struct work
-
- clear_bit(MTK_RESETTING, ð->state);
-
- + mtk_wed_fe_reset_complete();
- +
- rtnl_unlock();
- }
-
- --- a/drivers/net/ethernet/mediatek/mtk_wed.c
- +++ b/drivers/net/ethernet/mediatek/mtk_wed.c
- @@ -205,6 +205,48 @@ mtk_wed_wo_reset(struct mtk_wed_device *
- iounmap(reg);
- }
-
- +void mtk_wed_fe_reset(void)
- +{
- + int i;
- +
- + mutex_lock(&hw_lock);
- +
- + for (i = 0; i < ARRAY_SIZE(hw_list); i++) {
- + struct mtk_wed_hw *hw = hw_list[i];
- + struct mtk_wed_device *dev = hw->wed_dev;
- + int err;
- +
- + if (!dev || !dev->wlan.reset)
- + continue;
- +
- + /* reset callback blocks until WLAN reset is completed */
- + err = dev->wlan.reset(dev);
- + if (err)
- + dev_err(dev->dev, "wlan reset failed: %d\n", err);
- + }
- +
- + mutex_unlock(&hw_lock);
- +}
- +
- +void mtk_wed_fe_reset_complete(void)
- +{
- + int i;
- +
- + mutex_lock(&hw_lock);
- +
- + for (i = 0; i < ARRAY_SIZE(hw_list); i++) {
- + struct mtk_wed_hw *hw = hw_list[i];
- + struct mtk_wed_device *dev = hw->wed_dev;
- +
- + if (!dev || !dev->wlan.reset_complete)
- + continue;
- +
- + dev->wlan.reset_complete(dev);
- + }
- +
- + mutex_unlock(&hw_lock);
- +}
- +
- static struct mtk_wed_hw *
- mtk_wed_assign(struct mtk_wed_device *dev)
- {
- --- a/drivers/net/ethernet/mediatek/mtk_wed.h
- +++ b/drivers/net/ethernet/mediatek/mtk_wed.h
- @@ -128,6 +128,8 @@ void mtk_wed_add_hw(struct device_node *
- void mtk_wed_exit(void);
- int mtk_wed_flow_add(int index);
- void mtk_wed_flow_remove(int index);
- +void mtk_wed_fe_reset(void);
- +void mtk_wed_fe_reset_complete(void);
- #else
- static inline void
- mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
- @@ -147,6 +149,13 @@ static inline void mtk_wed_flow_remove(i
- {
- }
-
- +static inline void mtk_wed_fe_reset(void)
- +{
- +}
- +
- +static inline void mtk_wed_fe_reset_complete(void)
- +{
- +}
- #endif
-
- #ifdef CONFIG_DEBUG_FS
- --- a/include/linux/soc/mediatek/mtk_wed.h
- +++ b/include/linux/soc/mediatek/mtk_wed.h
- @@ -151,6 +151,8 @@ struct mtk_wed_device {
- void (*release_rx_buf)(struct mtk_wed_device *wed);
- void (*update_wo_rx_stats)(struct mtk_wed_device *wed,
- struct mtk_wed_wo_rx_stats *stats);
- + int (*reset)(struct mtk_wed_device *wed);
- + void (*reset_complete)(struct mtk_wed_device *wed);
- } wlan;
- #endif
- };
|