pch_uart: fix exclusive access issue
authorTomoya MORINAGA <tomoya-linux@dsn.okisemi.com>
Wed, 23 Feb 2011 01:03:18 +0000 (10:03 +0900)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 23 Feb 2011 01:22:04 +0000 (17:22 -0800)
Signed-off-by: Tomoya MORINAGA <tomoya-linux@dsn.okisemi.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/tty/serial/pch_uart.c

index 0c95051fa0a4f103a472c21bbdeb6c3567be1e4f..da0ba0fa2b9922716d0490b6acdae93760938282 100644 (file)
@@ -636,8 +636,7 @@ static void pch_dma_tx_complete(void *arg)
        priv->tx_dma_use = 0;
        priv->nent = 0;
        kfree(priv->sg_tx_p);
-       if (uart_circ_chars_pending(xmit))
-               pch_uart_hal_enable_interrupt(priv, PCH_UART_HAL_TX_INT);
+       pch_uart_hal_enable_interrupt(priv, PCH_UART_HAL_TX_INT);
 }
 
 static int pop_tx(struct eg20t_port *priv, int size)
@@ -793,6 +792,14 @@ static unsigned int dma_handle_tx(struct eg20t_port *priv)
                return 0;
        }
 
+       if (priv->tx_dma_use) {
+               dev_dbg(priv->port.dev, "%s:Tx is not completed. (%lu)\n",
+                       __func__, jiffies);
+               pch_uart_hal_disable_interrupt(priv, PCH_UART_HAL_TX_INT);
+               priv->tx_empty = 1;
+               return 0;
+       }
+
        fifo_size = max(priv->fifo_size, 1);
        tx_empty = 1;
        if (pop_tx_x(priv, xmit->buf)) {