struct sirfsoc_int_status *uint_st = &sirfport->uart_reg->uart_int_st;
        unsigned int count;
        unsigned long flags;
+       struct dma_tx_state tx_state;
 
        spin_lock_irqsave(&sirfport->rx_lock, flags);
-       while (sirfport->rx_completed != sirfport->rx_issued) {
+       while (DMA_COMPLETE == dmaengine_tx_status(sirfport->rx_dma_chan,
+               sirfport->rx_dma_items[sirfport->rx_completed].cookie, &tx_state)) {
                sirfsoc_uart_insert_rx_buf_to_tty(sirfport,
                                        SIRFSOC_RX_DMA_BUF_SIZE);
                sirfport->rx_completed++;
        struct sirfsoc_register *ureg = &sirfport->uart_reg->uart_reg;
        struct sirfsoc_int_en *uint_en = &sirfport->uart_reg->uart_int_en;
        unsigned long flags;
+       struct dma_tx_state tx_state;
        spin_lock_irqsave(&sirfport->rx_lock, flags);
-       while (sirfport->rx_completed != sirfport->rx_issued) {
+       while (DMA_COMPLETE == dmaengine_tx_status(sirfport->rx_dma_chan,
+                       sirfport->rx_dma_items[sirfport->rx_completed].cookie, &tx_state)) {
                sirfsoc_uart_insert_rx_buf_to_tty(sirfport,
                                        SIRFSOC_RX_DMA_BUF_SIZE);
                if (rd_regl(port, ureg->sirfsoc_int_en_reg) &