From 9428e34d1fdbd125c7aa3951bb329b67ce565be2 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Wed, 21 Nov 2018 13:07:59 +0100 Subject: [PATCH] mt7603: fix watchdog reset sequence - issue PSE reset first - skip DMA reset if PSE reset failed - schedule tx after reset has completed Signed-off-by: Felix Fietkau --- mt7603/mac.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/mt7603/mac.c b/mt7603/mac.c index d2ead6cf..12f3b779 100644 --- a/mt7603/mac.c +++ b/mt7603/mac.c @@ -1259,6 +1259,10 @@ static void mt7603_mac_watchdog_reset(struct mt7603_dev *dev) mutex_lock(&dev->mt76.mutex); + mt7603_pse_reset(dev); + if (dev->pse_reset_failed) + goto skip_dma_reset; + mt7603_mac_stop(dev); mt76_clear(dev, MT_WPDMA_GLO_CFG, @@ -1271,8 +1275,6 @@ static void mt7603_mac_watchdog_reset(struct mt7603_dev *dev) mt7603_beacon_set_timer(dev, -1, 0); mt76_set(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_FORCE_TX_EOF); - mt7603_pse_reset(dev); - for (i = 0; i < ARRAY_SIZE(dev->mt76.q_tx); i++) mt76_queue_tx_cleanup(dev, i, true); @@ -1282,9 +1284,11 @@ static void mt7603_mac_watchdog_reset(struct mt7603_dev *dev) mt7603_mac_dma_start(dev); mt7603_irq_enable(dev, mask); - clear_bit(MT76_RESET, &dev->mt76.state); mt7603_beacon_set_timer(dev, -1, beacon_int); + +skip_dma_reset: + clear_bit(MT76_RESET, &dev->mt76.state); mutex_unlock(&dev->mt76.mutex); tasklet_enable(&dev->tx_tasklet); @@ -1292,6 +1296,7 @@ static void mt7603_mac_watchdog_reset(struct mt7603_dev *dev) napi_enable(&dev->mt76.napi[0]); napi_enable(&dev->mt76.napi[1]); ieee80211_wake_queues(dev->mt76.hw); + mt76_txq_schedule_all(&dev->mt76); } static u32 mt7603_dma_debug(struct mt7603_dev *dev, u8 index)