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