summaryrefslogtreecommitdiff
path: root/drivers/usb/gadget/u_serial.h
diff options
context:
space:
mode:
authorDavid Brownell <dbrownell@users.sourceforge.net>2008-06-19 17:51:44 -0700
committerGreg Kroah-Hartman <gregkh@suse.de>2008-07-21 15:15:59 -0700
commitc1dca562be8ada614ef193aa246c6f8705bcd6b9 (patch)
treed1a1946657e1f14756349af5f343ed6366b7c37c /drivers/usb/gadget/u_serial.h
parentbb24280ffce6a8bc6b03d29a43ec16ac14e9ec85 (diff)
usb gadget: split out serial core
This abstracts the "gadget serial" driver TTY glue into a separate component, cleaning it up and disentangling it from connection state. It also changed some behaviors for the better: - Stops using "experimental" major #127, and switches over to having the TTY layer allocate the dev_t numbers. - Provides /sys/class/tty/ttyGS* nodes, thus mdev/udev support. (Note "mdev" hotplug bug in Busybox v1.7.2: /dev/ttyGS0 will be a *block* device without CONFIG_SYSFS_DEPRECATED_V2.) - The tty nodes no longer reject opens when there's no host. Now they can support normal getty configs in /etc/inttab... - Now implements RX throttling. When the line discipline says it doesn't want any more data, only packets in flight will be delivered (currently, max 1K/8K at full/high speeds) until it unthrottles the data. - Supports low_latency. This is a good policy for all USB serial adapters, since it eliminates scheduler overhead on RX paths. This also includes much cleanup including better comments, fixing memory leaks and other bugs (including some locking fixes), messaging cleanup, and an interface audit and tightening. This added up to a significant object code shrinkage, on the order of 20% (!) depending on CPU and compiler. A separate patch actually kicks in this new code, using the functions declared in this new header, and removes the previous glue. Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/gadget/u_serial.h')
-rw-r--r--drivers/usb/gadget/u_serial.h62
1 files changed, 62 insertions, 0 deletions
diff --git a/drivers/usb/gadget/u_serial.h b/drivers/usb/gadget/u_serial.h
new file mode 100644
index 000000000000..bc38e68d0f26
--- /dev/null
+++ b/drivers/usb/gadget/u_serial.h
@@ -0,0 +1,62 @@
+/*
+ * u_serial.h - interface to USB gadget "serial port"/TTY utilities
+ *
+ * Copyright (C) 2008 David Brownell
+ * Copyright (C) 2008 by Nokia Corporation
+ *
+ * This software is distributed under the terms of the GNU General
+ * Public License ("GPL") as published by the Free Software Foundation,
+ * either version 2 of that License or (at your option) any later version.
+ */
+
+#ifndef __U_SERIAL_H
+#define __U_SERIAL_H
+
+/* #include <linux/usb/composite.h> */
+#include <linux/usb/ch9.h>
+#include <linux/usb/gadget.h>
+
+#include <linux/usb/cdc.h>
+
+/*
+ * One non-multiplexed "serial" I/O port ... there can be several of these
+ * on any given USB peripheral device, if it provides enough endpoints.
+ *
+ * The "u_serial" utility component exists to do one thing: manage TTY
+ * style I/O using the USB peripheral endpoints listed here, including
+ * hookups to sysfs and /dev for each logical "tty" device.
+ *
+ * REVISIT need TTY --> USB event flow too, so ACM can report open/close
+ * as carrier detect events. Model after ECM. There's more ACM state too.
+ *
+ * REVISIT someday, allow multiplexing several TTYs over these endpoints.
+ */
+struct gserial {
+ /* struct usb_function func; */
+
+ /* port is managed by gserial_{connect,disconnect} */
+ struct gs_port *ioport;
+
+ struct usb_ep *in;
+ struct usb_ep *out;
+ struct usb_endpoint_descriptor *in_desc;
+ struct usb_endpoint_descriptor *out_desc;
+
+ /* REVISIT avoid this CDC-ACM support harder ... */
+ struct usb_cdc_line_coding port_line_coding; /* 9600-8-N-1 etc */
+
+ /* FIXME remove these when we switch to acm_bind_config... */
+ struct usb_ep *notify;
+ struct usb_endpoint_descriptor *notify_desc;
+ u16 port_handshake_bits;
+};
+
+/* port setup/teardown is handled by gadget driver */
+int gserial_setup(struct usb_gadget *g, unsigned n_ports);
+void gserial_cleanup(void);
+
+/* connect/disconnect is handled by individual functions */
+int gserial_connect(struct gserial *, u8 port_num);
+void gserial_disconnect(struct gserial *);
+
+#endif /* __U_SERIAL_H */