diff options
-rw-r--r-- | drivers/usb/serial/garmin_gps.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/drivers/usb/serial/garmin_gps.c b/drivers/usb/serial/garmin_gps.c index 26710b189918..b0a7a9e909a4 100644 --- a/drivers/usb/serial/garmin_gps.c +++ b/drivers/usb/serial/garmin_gps.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * Garmin GPS driver | 2 | * Garmin GPS driver |
3 | * | 3 | * |
4 | * Copyright (C) 2006-2009 Hermann Kneissel herkne@users.sourceforge.net | 4 | * Copyright (C) 2006-2011 Hermann Kneissel herkne@gmx.de |
5 | * | 5 | * |
6 | * The latest version of the driver can be found at | 6 | * The latest version of the driver can be found at |
7 | * http://sourceforge.net/projects/garmin-gps/ | 7 | * http://sourceforge.net/projects/garmin-gps/ |
@@ -51,7 +51,7 @@ static int debug; | |||
51 | */ | 51 | */ |
52 | 52 | ||
53 | #define VERSION_MAJOR 0 | 53 | #define VERSION_MAJOR 0 |
54 | #define VERSION_MINOR 33 | 54 | #define VERSION_MINOR 36 |
55 | 55 | ||
56 | #define _STR(s) #s | 56 | #define _STR(s) #s |
57 | #define _DRIVER_VERSION(a, b) "v" _STR(a) "." _STR(b) | 57 | #define _DRIVER_VERSION(a, b) "v" _STR(a) "." _STR(b) |
@@ -410,6 +410,7 @@ static int gsp_send_ack(struct garmin_data *garmin_data_p, __u8 pkt_id) | |||
410 | */ | 410 | */ |
411 | static int gsp_rec_packet(struct garmin_data *garmin_data_p, int count) | 411 | static int gsp_rec_packet(struct garmin_data *garmin_data_p, int count) |
412 | { | 412 | { |
413 | unsigned long flags; | ||
413 | const __u8 *recpkt = garmin_data_p->inbuffer+GSP_INITIAL_OFFSET; | 414 | const __u8 *recpkt = garmin_data_p->inbuffer+GSP_INITIAL_OFFSET; |
414 | __le32 *usbdata = (__le32 *) garmin_data_p->inbuffer; | 415 | __le32 *usbdata = (__le32 *) garmin_data_p->inbuffer; |
415 | 416 | ||
@@ -458,7 +459,9 @@ static int gsp_rec_packet(struct garmin_data *garmin_data_p, int count) | |||
458 | /* if this was an abort-transfer command, flush all | 459 | /* if this was an abort-transfer command, flush all |
459 | queued data. */ | 460 | queued data. */ |
460 | if (isAbortTrfCmnd(garmin_data_p->inbuffer)) { | 461 | if (isAbortTrfCmnd(garmin_data_p->inbuffer)) { |
462 | spin_lock_irqsave(&garmin_data_p->lock, flags); | ||
461 | garmin_data_p->flags |= FLAGS_DROP_DATA; | 463 | garmin_data_p->flags |= FLAGS_DROP_DATA; |
464 | spin_unlock_irqrestore(&garmin_data_p->lock, flags); | ||
462 | pkt_clear(garmin_data_p); | 465 | pkt_clear(garmin_data_p); |
463 | } | 466 | } |
464 | 467 | ||
@@ -943,7 +946,7 @@ static int garmin_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
943 | spin_lock_irqsave(&garmin_data_p->lock, flags); | 946 | spin_lock_irqsave(&garmin_data_p->lock, flags); |
944 | garmin_data_p->mode = initial_mode; | 947 | garmin_data_p->mode = initial_mode; |
945 | garmin_data_p->count = 0; | 948 | garmin_data_p->count = 0; |
946 | garmin_data_p->flags = 0; | 949 | garmin_data_p->flags &= FLAGS_SESSION_REPLY1_SEEN; |
947 | spin_unlock_irqrestore(&garmin_data_p->lock, flags); | 950 | spin_unlock_irqrestore(&garmin_data_p->lock, flags); |
948 | 951 | ||
949 | /* shutdown any bulk reads that might be going on */ | 952 | /* shutdown any bulk reads that might be going on */ |
@@ -1178,7 +1181,8 @@ static int garmin_write_room(struct tty_struct *tty) | |||
1178 | 1181 | ||
1179 | 1182 | ||
1180 | static void garmin_read_process(struct garmin_data *garmin_data_p, | 1183 | static void garmin_read_process(struct garmin_data *garmin_data_p, |
1181 | unsigned char *data, unsigned data_length) | 1184 | unsigned char *data, unsigned data_length, |
1185 | int bulk_data) | ||
1182 | { | 1186 | { |
1183 | unsigned long flags; | 1187 | unsigned long flags; |
1184 | 1188 | ||
@@ -1193,7 +1197,8 @@ static void garmin_read_process(struct garmin_data *garmin_data_p, | |||
1193 | send it directly to the tty port */ | 1197 | send it directly to the tty port */ |
1194 | if (garmin_data_p->flags & FLAGS_QUEUING) { | 1198 | if (garmin_data_p->flags & FLAGS_QUEUING) { |
1195 | pkt_add(garmin_data_p, data, data_length); | 1199 | pkt_add(garmin_data_p, data, data_length); |
1196 | } else if (getLayerId(data) == GARMIN_LAYERID_APPL) { | 1200 | } else if (bulk_data || |
1201 | getLayerId(data) == GARMIN_LAYERID_APPL) { | ||
1197 | 1202 | ||
1198 | spin_lock_irqsave(&garmin_data_p->lock, flags); | 1203 | spin_lock_irqsave(&garmin_data_p->lock, flags); |
1199 | garmin_data_p->flags |= APP_RESP_SEEN; | 1204 | garmin_data_p->flags |= APP_RESP_SEEN; |
@@ -1237,7 +1242,7 @@ static void garmin_read_bulk_callback(struct urb *urb) | |||
1237 | usb_serial_debug_data(debug, &port->dev, | 1242 | usb_serial_debug_data(debug, &port->dev, |
1238 | __func__, urb->actual_length, data); | 1243 | __func__, urb->actual_length, data); |
1239 | 1244 | ||
1240 | garmin_read_process(garmin_data_p, data, urb->actual_length); | 1245 | garmin_read_process(garmin_data_p, data, urb->actual_length, 1); |
1241 | 1246 | ||
1242 | if (urb->actual_length == 0 && | 1247 | if (urb->actual_length == 0 && |
1243 | 0 != (garmin_data_p->flags & FLAGS_BULK_IN_RESTART)) { | 1248 | 0 != (garmin_data_p->flags & FLAGS_BULK_IN_RESTART)) { |
@@ -1346,7 +1351,7 @@ static void garmin_read_int_callback(struct urb *urb) | |||
1346 | __func__, garmin_data_p->serial_num); | 1351 | __func__, garmin_data_p->serial_num); |
1347 | } | 1352 | } |
1348 | 1353 | ||
1349 | garmin_read_process(garmin_data_p, data, urb->actual_length); | 1354 | garmin_read_process(garmin_data_p, data, urb->actual_length, 0); |
1350 | 1355 | ||
1351 | port->interrupt_in_urb->dev = port->serial->dev; | 1356 | port->interrupt_in_urb->dev = port->serial->dev; |
1352 | retval = usb_submit_urb(urb, GFP_ATOMIC); | 1357 | retval = usb_submit_urb(urb, GFP_ATOMIC); |
@@ -1461,6 +1466,7 @@ static int garmin_attach(struct usb_serial *serial) | |||
1461 | garmin_data_p->timer.function = timeout_handler; | 1466 | garmin_data_p->timer.function = timeout_handler; |
1462 | garmin_data_p->port = port; | 1467 | garmin_data_p->port = port; |
1463 | garmin_data_p->state = 0; | 1468 | garmin_data_p->state = 0; |
1469 | garmin_data_p->flags = 0; | ||
1464 | garmin_data_p->count = 0; | 1470 | garmin_data_p->count = 0; |
1465 | usb_set_serial_port_data(port, garmin_data_p); | 1471 | usb_set_serial_port_data(port, garmin_data_p); |
1466 | 1472 | ||