|
@@ -790,6 +790,7 @@ static void omap_8250_rx_dma_flush(struct uart_8250_port *p)
|
|
|
{
|
|
|
struct omap8250_priv *priv = p->port.private_data;
|
|
|
struct uart_8250_dma *dma = p->dma;
|
|
|
+ struct dma_tx_state state;
|
|
|
unsigned long flags;
|
|
|
int ret;
|
|
|
|
|
@@ -800,10 +801,12 @@ static void omap_8250_rx_dma_flush(struct uart_8250_port *p)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- ret = dmaengine_pause(dma->rxchan);
|
|
|
- if (WARN_ON_ONCE(ret))
|
|
|
- priv->rx_dma_broken = true;
|
|
|
-
|
|
|
+ ret = dmaengine_tx_status(dma->rxchan, dma->rx_cookie, &state);
|
|
|
+ if (ret == DMA_IN_PROGRESS) {
|
|
|
+ ret = dmaengine_pause(dma->rxchan);
|
|
|
+ if (WARN_ON_ONCE(ret))
|
|
|
+ priv->rx_dma_broken = true;
|
|
|
+ }
|
|
|
spin_unlock_irqrestore(&priv->rx_dma_lock, flags);
|
|
|
|
|
|
__dma_rx_do_complete(p);
|