static void qcom_geni_serial_start_tx_fifo(struct uart_port *uport)
 {
+       unsigned char c;
        u32 irq_en;
 
-       if (qcom_geni_serial_main_active(uport) ||
-           !qcom_geni_serial_tx_empty(uport))
-               return;
+       /*
+        * Start a new transfer in case the previous command was cancelled and
+        * left data in the FIFO which may prevent the watermark interrupt
+        * from triggering. Note that the stale data is discarded.
+        */
+       if (!qcom_geni_serial_main_active(uport) &&
+           !qcom_geni_serial_tx_empty(uport)) {
+               if (uart_fifo_out(uport, &c, 1) == 1) {
+                       writel(M_CMD_DONE_EN, uport->membase + SE_GENI_M_IRQ_CLEAR);
+                       qcom_geni_serial_setup_tx(uport, 1);
+                       writel(c, uport->membase + SE_GENI_TX_FIFOn);
+               }
+       }
 
        irq_en = readl(uport->membase + SE_GENI_M_IRQ_EN);
        irq_en |= M_TX_FIFO_WATERMARK_EN | M_CMD_DONE_EN;
-
        writel(DEF_TX_WM, uport->membase + SE_GENI_TX_WATERMARK_REG);
        writel(irq_en, uport->membase + SE_GENI_M_IRQ_EN);
 }
 static void qcom_geni_serial_stop_tx_fifo(struct uart_port *uport)
 {
        u32 irq_en;
-       struct qcom_geni_serial_port *port = to_dev_port(uport);
 
        irq_en = readl(uport->membase + SE_GENI_M_IRQ_EN);
        irq_en &= ~(M_CMD_DONE_EN | M_TX_FIFO_WATERMARK_EN);
        writel(0, uport->membase + SE_GENI_TX_WATERMARK_REG);
        writel(irq_en, uport->membase + SE_GENI_M_IRQ_EN);
-       /* Possible stop tx is called multiple times. */
+}
+
+static void qcom_geni_serial_cancel_tx_cmd(struct uart_port *uport)
+{
+       struct qcom_geni_serial_port *port = to_dev_port(uport);
+
        if (!qcom_geni_serial_main_active(uport))
                return;
 
                writel(M_CMD_ABORT_EN, uport->membase + SE_GENI_M_IRQ_CLEAR);
        }
        writel(M_CMD_CANCEL_EN, uport->membase + SE_GENI_M_IRQ_CLEAR);
+
+       port->tx_remaining = 0;
 }
 
 static void qcom_geni_serial_handle_rx_fifo(struct uart_port *uport, bool drop)
 {
        disable_irq(uport->irq);
 
-       if (uart_console(uport))
-               return;
-
        qcom_geni_serial_stop_tx(uport);
        qcom_geni_serial_stop_rx(uport);
+
+       qcom_geni_serial_cancel_tx_cmd(uport);
 }
 
 static int qcom_geni_serial_port_setup(struct uart_port *uport)