Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

USB: io_edgeport: switch to generic TIOCMIWAIT implementation

Switch to the generic TIOCMIWAIT implementation.

This also fixes the issue with processes waiting for
modem-status-changes not being woken up at disconnect.

Signed-off-by: Johan Hovold <jhovold@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Johan Hovold and committed by
Greg Kroah-Hartman
8b8070d8 d36a7712

+5 -34
+1 -34
drivers/usb/serial/io_edgeport.c
··· 1618 1618 struct usb_serial_port *port = tty->driver_data; 1619 1619 DEFINE_WAIT(wait); 1620 1620 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 1621 - struct async_icount cnow; 1622 - struct async_icount cprev; 1623 1621 1624 1622 dev_dbg(&port->dev, "%s - port %d, cmd = 0x%x\n", __func__, port->number, cmd); 1625 1623 ··· 1629 1631 case TIOCGSERIAL: 1630 1632 dev_dbg(&port->dev, "%s (%d) TIOCGSERIAL\n", __func__, port->number); 1631 1633 return get_serial_info(edge_port, (struct serial_struct __user *) arg); 1632 - 1633 - case TIOCMIWAIT: 1634 - dev_dbg(&port->dev, "%s (%d) TIOCMIWAIT\n", __func__, port->number); 1635 - cprev = port->icount; 1636 - while (1) { 1637 - prepare_to_wait(&port->delta_msr_wait, 1638 - &wait, TASK_INTERRUPTIBLE); 1639 - schedule(); 1640 - finish_wait(&port->delta_msr_wait, &wait); 1641 - /* see if a signal did it */ 1642 - if (signal_pending(current)) 1643 - return -ERESTARTSYS; 1644 - 1645 - if (port->serial->disconnected) 1646 - return -EIO; 1647 - 1648 - cnow = port->icount; 1649 - if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && 1650 - cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) 1651 - return -EIO; /* no change => error */ 1652 - if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) || 1653 - ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) || 1654 - ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) || 1655 - ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts))) { 1656 - return 0; 1657 - } 1658 - cprev = cnow; 1659 - } 1660 - /* NOTREACHED */ 1661 - break; 1662 - 1663 1634 } 1664 1635 return -ENOIOCTLCMD; 1665 1636 } ··· 1989 2022 icount->dcd++; 1990 2023 if (newMsr & EDGEPORT_MSR_DELTA_RI) 1991 2024 icount->rng++; 1992 - wake_up_interruptible(&edge_port->port->delta_msr_wait); 2025 + wake_up_interruptible(&edge_port->port->port.delta_msr_wait); 1993 2026 } 1994 2027 1995 2028 /* Save the new modem status */
+4
drivers/usb/serial/io_tables.h
··· 116 116 .set_termios = edge_set_termios, 117 117 .tiocmget = edge_tiocmget, 118 118 .tiocmset = edge_tiocmset, 119 + .tiocmiwait = usb_serial_generic_tiocmiwait, 119 120 .get_icount = usb_serial_generic_get_icount, 120 121 .write = edge_write, 121 122 .write_room = edge_write_room, ··· 148 147 .set_termios = edge_set_termios, 149 148 .tiocmget = edge_tiocmget, 150 149 .tiocmset = edge_tiocmset, 150 + .tiocmiwait = usb_serial_generic_tiocmiwait, 151 151 .get_icount = usb_serial_generic_get_icount, 152 152 .write = edge_write, 153 153 .write_room = edge_write_room, ··· 180 178 .set_termios = edge_set_termios, 181 179 .tiocmget = edge_tiocmget, 182 180 .tiocmset = edge_tiocmset, 181 + .tiocmiwait = usb_serial_generic_tiocmiwait, 183 182 .get_icount = usb_serial_generic_get_icount, 184 183 .write = edge_write, 185 184 .write_room = edge_write_room, ··· 212 209 .set_termios = edge_set_termios, 213 210 .tiocmget = edge_tiocmget, 214 211 .tiocmset = edge_tiocmset, 212 + .tiocmiwait = usb_serial_generic_tiocmiwait, 215 213 .get_icount = usb_serial_generic_get_icount, 216 214 .write = edge_write, 217 215 .write_room = edge_write_room,