| From 99042bb4ad2e2592f96cf61aea15ff8aada828a0 Mon Sep 17 00:00:00 2001 |
| From: Sergey Organov <sorganov@gmail.com> |
| Date: Wed, 29 Jan 2020 14:21:46 +0300 |
| Subject: [PATCH] usb: gadget: serial: fix Tx stall after buffer overflow |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| commit e4bfded56cf39b8d02733c1e6ef546b97961e18a upstream. |
| |
| Symptom: application opens /dev/ttyGS0 and starts sending (writing) to |
| it while either USB cable is not connected, or nobody listens on the |
| other side of the cable. If driver circular buffer overflows before |
| connection is established, no data will be written to the USB layer |
| until/unless /dev/ttyGS0 is closed and re-opened again by the |
| application (the latter besides having no means of being notified about |
| the event of establishing of the connection.) |
| |
| Fix: on open and/or connect, kick Tx to flush circular buffer data to |
| USB layer. |
| |
| Signed-off-by: Sergey Organov <sorganov@gmail.com> |
| Reviewed-by: Michał Mirosław <mirq-linux@rere.qmqm.pl> |
| Signed-off-by: Felipe Balbi <balbi@kernel.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/usb/gadget/function/u_serial.c b/drivers/usb/gadget/function/u_serial.c |
| index bb1e2e1d0076..038c445a4e9b 100644 |
| --- a/drivers/usb/gadget/function/u_serial.c |
| +++ b/drivers/usb/gadget/function/u_serial.c |
| @@ -560,8 +560,10 @@ static int gs_start_io(struct gs_port *port) |
| port->n_read = 0; |
| started = gs_start_rx(port); |
| |
| - /* unblock any pending writes into our circular buffer */ |
| if (started) { |
| + gs_start_tx(port); |
| + /* Unblock any pending writes into our circular buffer, in case |
| + * we didn't in gs_start_tx() */ |
| tty_wakeup(port->port.tty); |
| } else { |
| gs_free_requests(ep, head, &port->read_allocated); |
| -- |
| 2.7.4 |
| |