diff --git a/mt7603.h b/mt7603.h index a78223a0..b8a4a177 100644 --- a/mt7603.h +++ b/mt7603.h @@ -125,6 +125,7 @@ struct mt7603_dev { u8 tx_check; u8 txrx_check; + u8 rx_dma_check; u8 rx_pse_check; u16 tx_dma_idx[4]; diff --git a/mt7603_mac.c b/mt7603_mac.c index 9b5e5814..15822f57 100644 --- a/mt7603_mac.c +++ b/mt7603_mac.c @@ -1017,6 +1017,18 @@ static void mt7603_mac_watchdog_reset(struct mt7603_dev *dev) mt7603_beacon_set_timer(dev, -1, beacon_int); } +static bool mt7603_rx_dma_busy(struct mt7603_dev *dev) +{ + u32 val; + + if (!(mt76_rr(dev, MT_WPDMA_GLO_CFG) & MT_WPDMA_GLO_CFG_RX_DMA_BUSY)) + return false; + + mt76_wr(dev, 0x4244, 0x98000000); + val = mt76_rr(dev, 0x4244); + return !!(val & BIT(9)); +} + static bool mt7603_tx_dma_busy(struct mt7603_dev *dev) { u32 val; @@ -1101,12 +1113,15 @@ void mt7603_mac_work(struct work_struct *work) if (WARN_ON_ONCE(mt7603_watchdog_check(dev, &dev->tx_check, mt7603_tx_dma_busy)) || + WARN_ON_ONCE(mt7603_watchdog_check(dev, &dev->rx_dma_check, + mt7603_rx_dma_busy)) || WARN_ON_ONCE(mt7603_watchdog_check(dev, &dev->txrx_check, mt7603_tx_rx_dma_busy)) || WARN_ON_ONCE(mt7603_watchdog_check(dev, &dev->rx_pse_check, mt7603_rx_pse_busy))) { dev->tx_check = 0; dev->txrx_check = 0; + dev->rx_dma_check = 0; dev->rx_pse_check = 0; dev->rx_dma_idx = ~0; memset(dev->tx_dma_idx, 0xff, sizeof(dev->tx_dma_idx));