aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/serial/garmin_gps.c
diff options
context:
space:
mode:
authorOliver Neukum <oliver@neukum.org>2008-01-22 13:56:18 +0100
committerGreg Kroah-Hartman <gregkh@suse.de>2008-02-01 14:35:05 -0800
commit95bef012ea4a3cce437a4fcf59bb097d14944b0d (patch)
treebc9991b335211030bcc2ee76fdc42ae2fcccb645 /drivers/usb/serial/garmin_gps.c
parente33fe4d86f91127f6f7d931ff59ed6cbda06e72b (diff)
downloadkernel_samsung_smdk4412-95bef012ea4a3cce437a4fcf59bb097d14944b0d.zip
kernel_samsung_smdk4412-95bef012ea4a3cce437a4fcf59bb097d14944b0d.tar.gz
kernel_samsung_smdk4412-95bef012ea4a3cce437a4fcf59bb097d14944b0d.tar.bz2
USB: more serial drivers writing after disconnect
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 <oneukum@suse.de> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/serial/garmin_gps.c')
-rw-r--r--drivers/usb/serial/garmin_gps.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/drivers/usb/serial/garmin_gps.c b/drivers/usb/serial/garmin_gps.c
index f1c90cf..d74e43d 100644
--- a/drivers/usb/serial/garmin_gps.c
+++ b/drivers/usb/serial/garmin_gps.c
@@ -1020,19 +1020,26 @@ static void garmin_close (struct usb_serial_port *port, struct file * filp)
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);
}