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

Reply via email to