Skip to content

Commit

Permalink
serial: 8250_exar: Clear buffer before shutdown
Browse files Browse the repository at this point in the history
When closing and shutting down the exar serial port, if the chip
has not finished sending all of the data in its buffer, the
remaining bytes will be lost.  Hold off on the shutdown until the
bytes have all been sent.

Signed-off-by: Robert Middleton <robert.middleton@rm5248.com>
Link: https://lore.kernel.org/r/20190801145640.26080-1-robert.middleton@rm5248.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Robert Middleton authored and Greg Kroah-Hartman committed Sep 4, 2019
1 parent b2b4b8e commit 47b1747
Showing 1 changed file with 23 additions and 0 deletions.
23 changes: 23 additions & 0 deletions drivers/tty/serial/8250/8250_exar.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include <linux/string.h>
#include <linux/tty.h>
#include <linux/8250_pci.h>
#include <linux/delay.h>

#include <asm/byteorder.h>

Expand Down Expand Up @@ -515,6 +516,27 @@ static irqreturn_t exar_misc_handler(int irq, void *data)
return IRQ_HANDLED;
}

static void
exar_shutdown(struct uart_port *port)
{
unsigned char lsr;
bool tx_complete = 0;
struct uart_8250_port *up = up_to_u8250p(port);
struct circ_buf *xmit = &port->state->xmit;
int i = 0;

do {
lsr = serial_in(up, UART_LSR);
if (lsr & (UART_LSR_TEMT | UART_LSR_THRE))
tx_complete = 1;
else
tx_complete = 0;
msleep(1);
} while (!uart_circ_empty(xmit) && !tx_complete && i++ < 1000);

serial8250_do_shutdown(port);
}

static int
exar_pci_probe(struct pci_dev *pcidev, const struct pci_device_id *ent)
{
Expand Down Expand Up @@ -555,6 +577,7 @@ exar_pci_probe(struct pci_dev *pcidev, const struct pci_device_id *ent)
uart.port.flags = UPF_SHARE_IRQ | UPF_EXAR_EFR | UPF_FIXED_TYPE | UPF_FIXED_PORT;
uart.port.irq = pci_irq_vector(pcidev, 0);
uart.port.dev = &pcidev->dev;
uart.port.shutdown = exar_shutdown;

rc = devm_request_irq(&pcidev->dev, uart.port.irq, exar_misc_handler,
IRQF_SHARED, "exar_uart", priv);
Expand Down

0 comments on commit 47b1747

Please sign in to comment.