struct work_struct qos_work;
        struct uart_8250_dma omap8250_dma;
        spinlock_t rx_dma_lock;
+       bool rx_dma_broken;
 };
 
 static u32 uart_read(struct uart_8250_port *up, u32 reg)
        struct omap8250_priv    *priv = p->port.private_data;
        struct uart_8250_dma    *dma = p->dma;
        unsigned long           flags;
+       int ret;
 
        spin_lock_irqsave(&priv->rx_dma_lock, flags);
 
                return;
        }
 
-       dmaengine_pause(dma->rxchan);
+       ret = dmaengine_pause(dma->rxchan);
+       if (WARN_ON_ONCE(ret))
+               priv->rx_dma_broken = true;
 
        spin_unlock_irqrestore(&priv->rx_dma_lock, flags);
 
                break;
        }
 
+       if (priv->rx_dma_broken)
+               return -EINVAL;
+
        spin_lock_irqsave(&priv->rx_dma_lock, flags);
 
        if (dma->rx_running)
 
                        if (of_machine_is_compatible("ti,am33xx"))
                                priv->habit |= OMAP_DMA_TX_KICK;
+                       /*
+                        * pause is currently not supported atleast on omap-sdma
+                        * and edma on most earlier kernels.
+                        */
+                       priv->rx_dma_broken = true;
                }
        }
 #endif