This is a note to let you know that I've just added the patch titled
USB: serial: add generic wait_until_sent implementation
to the 3.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
usb-serial-add-generic-wait_until_sent-implementation.patch
and it can be found in the queue-3.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree,
please let <[email protected]> know about it.
>From dcf0105039660e951dfea348d317043d17988dfc Mon Sep 17 00:00:00 2001
From: Johan Hovold <[email protected]>
Date: Wed, 8 May 2013 17:51:43 +0200
Subject: USB: serial: add generic wait_until_sent implementation
From: Johan Hovold <[email protected]>
commit dcf0105039660e951dfea348d317043d17988dfc upstream.
Add generic wait_until_sent implementation which polls for empty
hardware buffers using the new port-operation tx_empty.
The generic implementation will be used for all sub-drivers that
implement tx_empty but does not define wait_until_sent.
Signed-off-by: Johan Hovold <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
---
drivers/usb/serial/generic.c | 31 +++++++++++++++++++++++++++++++
drivers/usb/serial/usb-serial.c | 2 ++
include/linux/usb/serial.h | 3 +++
3 files changed, 36 insertions(+)
--- a/drivers/usb/serial/generic.c
+++ b/drivers/usb/serial/generic.c
@@ -264,6 +264,37 @@ int usb_serial_generic_chars_in_buffer(s
}
EXPORT_SYMBOL_GPL(usb_serial_generic_chars_in_buffer);
+void usb_serial_generic_wait_until_sent(struct tty_struct *tty, long timeout)
+{
+ struct usb_serial_port *port = tty->driver_data;
+ unsigned int bps;
+ unsigned long period;
+ unsigned long expire;
+
+ bps = tty_get_baud_rate(tty);
+ if (!bps)
+ bps = 9600; /* B0 */
+ /*
+ * Use a poll-period of roughly the time it takes to send one
+ * character or at least one jiffy.
+ */
+ period = max_t(unsigned long, (10 * HZ / bps), 1);
+ period = min_t(unsigned long, period, timeout);
+
+ dev_dbg(&port->dev, "%s - timeout = %u ms, period = %u ms\n",
+ __func__, jiffies_to_msecs(timeout),
+ jiffies_to_msecs(period));
+ expire = jiffies + timeout;
+ while (!port->serial->type->tx_empty(port)) {
+ schedule_timeout_interruptible(period);
+ if (signal_pending(current))
+ break;
+ if (time_after(jiffies, expire))
+ break;
+ }
+}
+EXPORT_SYMBOL_GPL(usb_serial_generic_wait_until_sent);
+
static int usb_serial_generic_submit_read_urb(struct usb_serial_port *port,
int index, gfp_t mem_flags)
{
--- a/drivers/usb/serial/usb-serial.c
+++ b/drivers/usb/serial/usb-serial.c
@@ -1346,6 +1346,8 @@ static void fixup_generic(struct usb_ser
set_to_generic_if_null(device, close);
set_to_generic_if_null(device, write_room);
set_to_generic_if_null(device, chars_in_buffer);
+ if (device->tx_empty)
+ set_to_generic_if_null(device, wait_until_sent);
set_to_generic_if_null(device, read_bulk_callback);
set_to_generic_if_null(device, write_bulk_callback);
set_to_generic_if_null(device, disconnect);
--- a/include/linux/usb/serial.h
+++ b/include/linux/usb/serial.h
@@ -268,6 +268,7 @@ struct usb_serial_driver {
void (*break_ctl)(struct tty_struct *tty, int break_state);
int (*chars_in_buffer)(struct tty_struct *tty);
void (*wait_until_sent)(struct tty_struct *tty, long timeout);
+ bool (*tx_empty)(struct usb_serial_port *port);
void (*throttle)(struct tty_struct *tty);
void (*unthrottle)(struct tty_struct *tty);
int (*tiocmget)(struct tty_struct *tty);
@@ -326,6 +327,8 @@ extern void usb_serial_generic_close(str
extern int usb_serial_generic_resume(struct usb_serial *serial);
extern int usb_serial_generic_write_room(struct tty_struct *tty);
extern int usb_serial_generic_chars_in_buffer(struct tty_struct *tty);
+extern void usb_serial_generic_wait_until_sent(struct tty_struct *tty,
+ long timeout);
extern void usb_serial_generic_read_bulk_callback(struct urb *urb);
extern void usb_serial_generic_write_bulk_callback(struct urb *urb);
extern void usb_serial_generic_throttle(struct tty_struct *tty);
Patches currently in stable-queue which might be from [email protected] are
queue-3.9/usb-mos7720-fix-dma-to-stack.patch
queue-3.9/usb-zte_ev-fix-broken-open.patch
queue-3.9/usb-ark3116-fix-control-message-timeout.patch
queue-3.9/usb-serial-add-wait_until_sent-operation.patch
queue-3.9/usb-mos7840-fix-dma-to-stack.patch
queue-3.9/usb-serial-fix-treo-kyocera-interrrupt-in-urb-context.patch
queue-3.9/usb-serial-add-generic-wait_until_sent-implementation.patch
queue-3.9/usb-mos7720-fix-hardware-flow-control.patch
queue-3.9/usb-keyspan-fix-bogus-array-index.patch
queue-3.9/usb-zte_ev-fix-control-message-timeouts.patch
queue-3.9/usb-mos7720-fix-message-timeouts.patch
queue-3.9/usb-iuu_phoenix-fix-bulk-message-timeout.patch
queue-3.9/usb-whiteheat-fix-broken-port-configuration.patch
queue-3.9/usb-visor-fix-initialisation-of-treo-kyocera-devices.patch
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html