| From c79a6cbc5666b936cdde44951d509959e4818048 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 29 Jan 2020 14:21:46 +0300 |
| Subject: usb: gadget: serial: fix Tx stall after buffer overflow |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Sergey Organov <sorganov@gmail.com> |
| |
| [ Upstream commit e4bfded56cf39b8d02733c1e6ef546b97961e18a ] |
| |
| 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: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/usb/gadget/function/u_serial.c | 4 +++- |
| 1 file changed, 3 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/usb/gadget/function/u_serial.c b/drivers/usb/gadget/function/u_serial.c |
| index f986e5c559748..8167d379e115b 100644 |
| --- a/drivers/usb/gadget/function/u_serial.c |
| +++ b/drivers/usb/gadget/function/u_serial.c |
| @@ -561,8 +561,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.20.1 |
| |