else
                pending = kfifo_len(&tport->xmit_fifo);
 
-       /* All data has been transmitted and acknowledged as received */
-       if (!pending && !status && done) {
+       /* All data has been transmitted or command has been cancelled */
+       if (!pending && done) {
                qcom_geni_serial_stop_tx_fifo(uport);
                goto out_write_wakeup;
        }
 
-       avail = port->tx_fifo_depth - (status & TX_FIFO_WC);
+       if (active)
+               avail = port->tx_fifo_depth - (status & TX_FIFO_WC);
+       else
+               avail = port->tx_fifo_depth;
+
        avail *= BYTES_PER_FIFO_WORD;
 
        chunk = min(avail, pending);
        qcom_geni_serial_cancel_tx_cmd(uport);
 }
 
+static void qcom_geni_serial_flush_buffer(struct uart_port *uport)
+{
+       qcom_geni_serial_cancel_tx_cmd(uport);
+}
+
 static int qcom_geni_serial_port_setup(struct uart_port *uport)
 {
        struct qcom_geni_serial_port *port = to_dev_port(uport);
        .request_port = qcom_geni_serial_request_port,
        .config_port = qcom_geni_serial_config_port,
        .shutdown = qcom_geni_serial_shutdown,
+       .flush_buffer = qcom_geni_serial_flush_buffer,
        .type = qcom_geni_serial_get_type,
        .set_mctrl = qcom_geni_serial_set_mctrl,
        .get_mctrl = qcom_geni_serial_get_mctrl,