lkml.org 
[lkml]   [2003]   [Dec]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    SubjectRe: [PATCH] USB Fixes for 2.6.0-test11
    From
    Date
    ChangeSet 1.1525, 2003/12/10 14:39:48-08:00, greg@kroah.com

    [PATCH] USB: fix bug for multiple opens on ttyUSB devices.

    This patch fixes the bug where running ppp over a ttyUSB device would fail.


    drivers/usb/serial/usb-serial.c | 48 ++++++++++------------------------------
    1 files changed, 13 insertions(+), 35 deletions(-)


    diff -Nru a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c
    --- a/drivers/usb/serial/usb-serial.c Wed Dec 10 16:46:53 2003
    +++ b/drivers/usb/serial/usb-serial.c Wed Dec 10 16:46:53 2003
    @@ -493,12 +493,15 @@
    return retval;
    }

    -static void __serial_close(struct usb_serial_port *port, struct file *filp)
    +static void serial_close(struct tty_struct *tty, struct file * filp)
    {
    - if (!port->open_count) {
    - dbg ("%s - port not opened", __FUNCTION__);
    + struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
    + struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
    +
    + if (!serial)
    return;
    - }
    +
    + dbg("%s - port %d", __FUNCTION__, port->number);

    --port->open_count;
    if (port->open_count <= 0) {
    @@ -506,30 +509,18 @@
    * port is being closed by the last owner */
    port->serial->type->close(port, filp);
    port->open_count = 0;
    +
    + if (port->tty) {
    + if (port->tty->driver_data)
    + port->tty->driver_data = NULL;
    + port->tty = NULL;
    + }
    }

    module_put(port->serial->type->owner);
    kobject_put(&port->serial->kobj);
    }

    -static void serial_close(struct tty_struct *tty, struct file * filp)
    -{
    - struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
    - struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
    -
    - if (!serial)
    - return;
    -
    - dbg("%s - port %d", __FUNCTION__, port->number);
    -
    - /* if disconnect beat us to the punch here, there's nothing to do */
    - if (tty && tty->driver_data) {
    - __serial_close(port, filp);
    - tty->driver_data = NULL;
    - }
    - port->tty = NULL;
    -}
    -
    static int serial_write (struct tty_struct * tty, int from_user, const unsigned char *buf, int count)
    {
    struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
    @@ -848,19 +839,6 @@
    dbg ("%s - %s", __FUNCTION__, kobj->name);

    serial = to_usb_serial(kobj);
    -
    - /* fail all future close/read/write/ioctl/etc calls */
    - for (i = 0; i < serial->num_ports; ++i) {
    - port = serial->port[i];
    - if (port->tty != NULL) {
    - port->tty->driver_data = NULL;
    - while (port->open_count > 0) {
    - __serial_close(port, NULL);
    - }
    - port->tty = NULL;
    - }
    - }
    -
    serial_shutdown (serial);

    /* return the minor range that this device had */
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-03-22 13:59    [W:0.029 / U:62.888 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site