Hi, this covers the rest of the obvious cases by using the flags and locks to guard against disconnect which were introduced in the earlier patch against mos7720.
Signed-off-by: Oliver Neukum <[EMAIL PROTECTED]> Regards Oliver ---- --- linux-2.6.24-serial_intfdata/drivers/usb/serial/visor.c~ 2008-01-21 15:21:09.000000000 +0100 +++ linux-2.6.24-serial_intfdata/drivers/usb/serial/visor.c 2008-01-22 13:30:04.000000000 +0100 @@ -362,7 +362,7 @@ static void visor_close (struct usb_seri kfree (transfer_buffer); } } - mutex_lock(&port->serial->disc_mutex); + mutex_unlock(&port->serial->disc_mutex); if (stats) dev_info(&port->dev, "Bytes In = %d Bytes Out = %d\n", --- linux-2.6.24/drivers/usb/serial/airprime.c 2008-01-18 21:55:17.000000000 +0100 +++ linux-2.6.24-serial_intfdata/drivers/usb/serial/airprime.c 2008-01-22 13:30:00.000000000 +0100 @@ -217,7 +217,10 @@ static void airprime_close(struct usb_se priv->rts_state = 0; priv->dtr_state = 0; - airprime_send_setup(port); + mutex_lock(&port->serial->disc_mutex); + if (!port->serial->disconnected) + airprime_send_setup(port); + mutex_lock(&port->serial->disc_mutex); for (i = 0; i < NUM_READ_URBS; ++i) { usb_kill_urb (priv->read_urbp[i]); --- linux-2.6.24/drivers/usb/serial/ftdi_sio.c 2008-01-18 21:57:01.000000000 +0100 +++ linux-2.6.24-serial_intfdata/drivers/usb/serial/ftdi_sio.c 2008-01-22 13:29:57.000000000 +0100 @@ -1411,7 +1411,8 @@ static void ftdi_close (struct usb_seria dbg("%s", __FUNCTION__); - if (c_cflag & HUPCL){ + mutex_lock(&port->serial->disc_mutex); + if (c_cflag & HUPCL && !port->serial->disconnected){ /* Disable flow control */ if (usb_control_msg(port->serial->dev, usb_sndctrlpipe(port->serial->dev, 0), @@ -1425,6 +1426,7 @@ static void ftdi_close (struct usb_seria /* drop RTS and DTR */ clear_mctrl(port, TIOCM_DTR | TIOCM_RTS); } /* Note change no line if hupcl is off */ + mutex_unlock(&port->serial->disc_mutex); /* cancel any scheduled reading */ cancel_delayed_work(&priv->rx_work); --- linux-2.6.24/drivers/usb/serial/cp2101.c 2008-01-18 21:57:01.000000000 +0100 +++ linux-2.6.24-serial_intfdata/drivers/usb/serial/cp2101.c 2008-01-22 13:29:54.000000000 +0100 @@ -341,7 +342,10 @@ static void cp2101_close (struct usb_ser usb_kill_urb(port->write_urb); usb_kill_urb(port->read_urb); - cp2101_set_config_single(port, CP2101_UART, UART_DISABLE); + mutex_lock(&port->serial->disc_mutex); + if (!port->serial->disconnected) + cp2101_set_config_single(port, CP2101_UART, UART_DISABLE); + mutex_unlock(&port->serial->disc_mutex); } /* --- linux-2.6.24/drivers/usb/serial/garmin_gps.c 2008-01-18 21:55:17.000000000 +0100 +++ linux-2.6.24-serial_intfdata/drivers/usb/serial/garmin_gps.c 2008-01-22 13:29:50.000000000 +0100 @@ -1020,19 +1020,26 @@ static void garmin_close (struct usb_ser if (!serial) return; - garmin_clear(garmin_data_p); + mutex_lock(&port->serial->disc_mutex); + if (!port->serial->disconnected) + garmin_clear(garmin_data_p); /* shutdown our urbs */ usb_kill_urb (port->read_urb); usb_kill_urb (port->write_urb); - if (noResponseFromAppLayer(garmin_data_p) || - ((garmin_data_p->flags & CLEAR_HALT_REQUIRED) != 0)) { - process_resetdev_request(port); - garmin_data_p->state = STATE_RESET; + if (!port->serial->disconnected) { + if (noResponseFromAppLayer(garmin_data_p) || + ((garmin_data_p->flags & CLEAR_HALT_REQUIRED) != 0)) { + process_resetdev_request(port); + garmin_data_p->state = STATE_RESET; + } else { + garmin_data_p->state = STATE_DISCONNECTED; + } } else { garmin_data_p->state = STATE_DISCONNECTED; } + mutex_unlock(&port->serial->disc_mutex); } - To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html