Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 364413
b: refs/heads/master
c: 980373b
h: refs/heads/master
i:
  364411: 29cf309
v: v3
  • Loading branch information
Johan Hovold authored and Greg Kroah-Hartman committed Mar 25, 2013
1 parent c497051 commit 07c5dae
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 143d9d961608b737d90a813deaaf91affb41c83c
refs/heads/master: 980373b7918b8023be6b7df03857f494ae124d0b
58 changes: 58 additions & 0 deletions trunk/drivers/usb/serial/generic.c
Original file line number Diff line number Diff line change
Expand Up @@ -418,6 +418,64 @@ void usb_serial_generic_unthrottle(struct tty_struct *tty)
}
EXPORT_SYMBOL_GPL(usb_serial_generic_unthrottle);

static bool usb_serial_generic_msr_changed(struct tty_struct *tty,
unsigned long arg, struct async_icount *cprev)
{
struct usb_serial_port *port = tty->driver_data;
struct async_icount cnow;
unsigned long flags;
bool ret;

/*
* Use tty-port initialised flag to detect all hangups including the
* one generated at USB-device disconnect.
*
* FIXME: Remove hupping check once tty_port_hangup calls shutdown
* (which clears the initialised flag) before wake up.
*/
if (test_bit(TTY_HUPPING, &tty->flags))
return true;
if (!test_bit(ASYNCB_INITIALIZED, &port->port.flags))
return true;

spin_lock_irqsave(&port->lock, flags);
cnow = port->icount; /* atomic copy*/
spin_unlock_irqrestore(&port->lock, flags);

ret = ((arg & TIOCM_RNG) && (cnow.rng != cprev->rng)) ||
((arg & TIOCM_DSR) && (cnow.dsr != cprev->dsr)) ||
((arg & TIOCM_CD) && (cnow.dcd != cprev->dcd)) ||
((arg & TIOCM_CTS) && (cnow.cts != cprev->cts));

*cprev = cnow;

return ret;
}

int usb_serial_generic_tiocmiwait(struct tty_struct *tty, unsigned long arg)
{
struct usb_serial_port *port = tty->driver_data;
struct async_icount cnow;
unsigned long flags;
int ret;

spin_lock_irqsave(&port->lock, flags);
cnow = port->icount; /* atomic copy */
spin_unlock_irqrestore(&port->lock, flags);

ret = wait_event_interruptible(port->port.delta_msr_wait,
usb_serial_generic_msr_changed(tty, arg, &cnow));
if (!ret) {
if (test_bit(TTY_HUPPING, &tty->flags))
ret = -EIO;
if (!test_bit(ASYNCB_INITIALIZED, &port->port.flags))
ret = -EIO;
}

return ret;
}
EXPORT_SYMBOL_GPL(usb_serial_generic_tiocmiwait);

#ifdef CONFIG_MAGIC_SYSRQ
int usb_serial_handle_sysrq_char(struct usb_serial_port *port, unsigned int ch)
{
Expand Down
5 changes: 5 additions & 0 deletions trunk/include/linux/usb/serial.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

#include <linux/kref.h>
#include <linux/mutex.h>
#include <linux/serial.h>
#include <linux/sysrq.h>
#include <linux/kfifo.h>

Expand Down Expand Up @@ -61,6 +62,7 @@
* @bulk_out_buffers: pointers to the bulk out buffers for this port
* @write_urbs: pointers to the bulk out urbs for this port
* @write_urbs_free: status bitmap the for bulk out urbs
* @icount: interrupt counters
* @tx_bytes: number of bytes currently in host stack queues
* @bulk_out_endpointAddress: endpoint address for the bulk out pipe for this
* port.
Expand Down Expand Up @@ -109,6 +111,7 @@ struct usb_serial_port {
unsigned long write_urbs_free;
__u8 bulk_out_endpointAddress;

struct async_icount icount;
int tx_bytes;

unsigned long flags;
Expand Down Expand Up @@ -330,6 +333,8 @@ 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);
extern void usb_serial_generic_unthrottle(struct tty_struct *tty);
extern int usb_serial_generic_tiocmiwait(struct tty_struct *tty,
unsigned long arg);
extern int usb_serial_generic_register(void);
extern void usb_serial_generic_deregister(void);
extern int usb_serial_generic_submit_read_urbs(struct usb_serial_port *port,
Expand Down

0 comments on commit 07c5dae

Please sign in to comment.