From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: ARC-Seal: i=1; a=rsa-sha256; t=1516607931; cv=none; d=google.com; s=arc-20160816; b=yy4IwkQhKqWg0h0igK3OPPCrrZJSJ4WwWtWHIYG70Qk4nhAAId+vuHOEDZ+ErJFz1D zyHiVIxdHYnT+j2ffR+JqtG4yL9N6LMAfiMt35rKhzKzqNFGbKlym7hSTo40xKllnLoe JJFlVY5JXGGEfhfNJczeNCW6eJLC/I/HaxyE1zwiS74H07OHaoQFZh9e4vg/mc7bYbUi H6kGzbfRaOF6WBUu6o5LNXBnEePWV06dBpOJKcCl8UhRQ7ZxqD2+yqamNZHLh8ATqjWA Ieq3X/wxZ4K83NpDOyGbq1tt0ykFFl9WWTEUTReY9s5zkSiZE50c36GeGRP5qbNtc+Ou fdLQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=message-id:date:subject:cc:to:from:dkim-signature :arc-authentication-results; bh=xroenPQVy6VzbO2PaitV40OimOqyLugpS2uz94DhGuA=; b=AQoVESUPUak2GnfJj/Um13FCSsHk986GCTjMEzmSSDGq/vLvANmCdtYhCkjbC9zqp1 k8u1x3UM9rf7b4lYZGFfFpnYVAGVk0EoAl+M00gmAe5z8doNaBbr8dhhvrfqcTzir7PY fwfgiILkGrYbOVfP9MfLgIUknbNnKkF3VuI515snsDM9ltiR0wuWEB34RLVNrqEgjnPY JM+b8jpS3ARm2xoHK9cpk+vInB0l3Dr3ukRAwKkeyC7ciizxCYtZ0zdmslO22qU7IRHz PAl4jX3ErIACOfSFTlXPhYBq37+3BgXw3siT2Rwx1+jVzlFt5yT6tNvVmUL3EjV9mvqU IJOQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=nlJbtZQF; spf=pass (google.com: domain of hpeter@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=hpeter@gmail.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gmail.com Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=nlJbtZQF; spf=pass (google.com: domain of hpeter@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=hpeter@gmail.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gmail.com X-Google-Smtp-Source: AH8x2250Ad0DYzesZ1ZBeIFwQ4nYOIdKoHDPfrRgJireY7zMF27bD6BvFwQAJNqwNuhYCIdxpn76OA== From: "Ji-Ze Hong (Peter Hong)" X-Google-Original-From: "Ji-Ze Hong (Peter Hong)" To: johan@kernel.org Cc: gregkh@linuxfoundation.org, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, peter_hong@fintek.com.tw, "Ji-Ze Hong (Peter Hong)" Subject: [PATCH 1/5] USB: serial: f81232: clear overrun flag Date: Mon, 22 Jan 2018 15:58:43 +0800 Message-Id: <1516607927-8887-1-git-send-email-hpeter+linux_kernel@gmail.com> X-Mailer: git-send-email 2.7.4 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: =?utf-8?q?1590278678016900188?= X-GMAIL-MSGID: =?utf-8?q?1590278678016900188?= X-Mailing-List: linux-kernel@vger.kernel.org List-ID: The F81232 will report data and LSR with bulk like following format: bulk-in data: [LSR(1Byte)+DATA(1Byte)][LSR(1Byte)+DATA(1Byte)]... LSR will auto clear frame/parity/break error flag when reading by H/W, but overrrun will only cleared when reading LSR. So this patch add a worker to read LSR when OE. Signed-off-by: Ji-Ze Hong (Peter Hong) --- drivers/usb/serial/f81232.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/drivers/usb/serial/f81232.c b/drivers/usb/serial/f81232.c index 96036f87b1de..46836041c50e 100644 --- a/drivers/usb/serial/f81232.c +++ b/drivers/usb/serial/f81232.c @@ -41,12 +41,14 @@ MODULE_DEVICE_TABLE(usb, id_table); #define FIFO_CONTROL_REGISTER (0x02 + SERIAL_BASE_ADDRESS) #define LINE_CONTROL_REGISTER (0x03 + SERIAL_BASE_ADDRESS) #define MODEM_CONTROL_REGISTER (0x04 + SERIAL_BASE_ADDRESS) +#define LINE_STATUS_REGISTER (0x05 + SERIAL_BASE_ADDRESS) #define MODEM_STATUS_REGISTER (0x06 + SERIAL_BASE_ADDRESS) struct f81232_private { struct mutex lock; u8 modem_control; u8 modem_status; + struct work_struct lsr_work; struct work_struct interrupt_work; struct usb_serial_port *port; }; @@ -282,6 +284,7 @@ static void f81232_read_int_callback(struct urb *urb) static void f81232_process_read_urb(struct urb *urb) { struct usb_serial_port *port = urb->context; + struct f81232_private *priv = usb_get_serial_port_data(port); unsigned char *data = urb->transfer_buffer; char tty_flag; unsigned int i; @@ -315,6 +318,7 @@ static void f81232_process_read_urb(struct urb *urb) if (lsr & UART_LSR_OE) { port->icount.overrun++; + schedule_work(&priv->lsr_work); tty_insert_flip_char(&port->port, 0, TTY_OVERRUN); } @@ -623,6 +627,21 @@ static void f81232_interrupt_work(struct work_struct *work) f81232_read_msr(priv->port); } +static void f81232_lsr_worker(struct work_struct *work) +{ + struct f81232_private *priv; + struct usb_serial_port *port; + int status; + u8 tmp; + + priv = container_of(work, struct f81232_private, lsr_work); + port = priv->port; + + status = f81232_get_register(port, LINE_STATUS_REGISTER, &tmp); + if (status) + dev_warn(&port->dev, "read LSR failed: %d\n", status); +} + static int f81232_port_probe(struct usb_serial_port *port) { struct f81232_private *priv; @@ -633,6 +652,7 @@ static int f81232_port_probe(struct usb_serial_port *port) mutex_init(&priv->lock); INIT_WORK(&priv->interrupt_work, f81232_interrupt_work); + INIT_WORK(&priv->lsr_work, f81232_lsr_worker); usb_set_serial_port_data(port, priv); -- 2.7.4