aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/serial/garmin_gps.c
diff options
context:
space:
mode:
authorAlan Cox <alan@redhat.com>2008-07-22 06:09:07 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-07-22 16:03:22 -0400
commit95da310e66ee8090119596c70ca8432e57f9a97f (patch)
tree7f18c30e9c9ad4d7d53df6453fa338be06f09a85 /drivers/usb/serial/garmin_gps.c
parent1aa3692da57c773e5c76de55c5c4a953962d360e (diff)
usb_serial: API all change
USB serial likes to use port->tty back pointers for the real work it does and to do so without any actual locking. Unfortunately when you consider hangup events, hangup/parallel reopen or even worse hangup followed by parallel close events the tty->port and port->tty pointers are not guaranteed to be the same as port->tty is the active tty while tty->port is the port the tty may or may not still be attached to. So rework the entire API to pass the tty struct. For console cases we need to pass both for now. This shows up multiple drivers that immediately crash with USB console some of which have been fixed in the process. Longer term we need a proper tty as console abstraction Signed-off-by: Alan Cox <alan@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/usb/serial/garmin_gps.c')
-rw-r--r--drivers/usb/serial/garmin_gps.c58
1 files changed, 20 insertions, 38 deletions
diff --git a/drivers/usb/serial/garmin_gps.c b/drivers/usb/serial/garmin_gps.c
index 8ce5a56a48e3..06cfa43c6f02 100644
--- a/drivers/usb/serial/garmin_gps.c
+++ b/drivers/usb/serial/garmin_gps.c
@@ -275,7 +275,7 @@ static inline int isAbortTrfCmnd(const unsigned char *buf)
275static void send_to_tty(struct usb_serial_port *port, 275static void send_to_tty(struct usb_serial_port *port,
276 char *data, unsigned int actual_length) 276 char *data, unsigned int actual_length)
277{ 277{
278 struct tty_struct *tty = port->tty; 278 struct tty_struct *tty = port->port.tty;
279 279
280 if (tty && actual_length) { 280 if (tty && actual_length) {
281 281
@@ -970,7 +970,8 @@ static int garmin_init_session(struct usb_serial_port *port)
970 970
971 971
972 972
973static int garmin_open (struct usb_serial_port *port, struct file *filp) 973static int garmin_open (struct tty_struct *tty,
974 struct usb_serial_port *port, struct file *filp)
974{ 975{
975 unsigned long flags; 976 unsigned long flags;
976 int status = 0; 977 int status = 0;
@@ -983,8 +984,8 @@ static int garmin_open (struct usb_serial_port *port, struct file *filp)
983 * through, otherwise it is scheduled, and with high data rates (like 984 * through, otherwise it is scheduled, and with high data rates (like
984 * with OHCI) data can get lost. 985 * with OHCI) data can get lost.
985 */ 986 */
986 if (port->tty) 987 if (tty)
987 port->tty->low_latency = 1; 988 tty->low_latency = 1;
988 989
989 spin_lock_irqsave(&garmin_data_p->lock, flags); 990 spin_lock_irqsave(&garmin_data_p->lock, flags);
990 garmin_data_p->mode = initial_mode; 991 garmin_data_p->mode = initial_mode;
@@ -998,17 +999,16 @@ static int garmin_open (struct usb_serial_port *port, struct file *filp)
998 usb_kill_urb (port->write_urb); 999 usb_kill_urb (port->write_urb);
999 usb_kill_urb (port->read_urb); 1000 usb_kill_urb (port->read_urb);
1000 1001
1001 if (garmin_data_p->state == STATE_RESET) { 1002 if (garmin_data_p->state == STATE_RESET)
1002 status = garmin_init_session(port); 1003 status = garmin_init_session(port);
1003 }
1004 1004
1005 garmin_data_p->state = STATE_ACTIVE; 1005 garmin_data_p->state = STATE_ACTIVE;
1006
1007 return status; 1006 return status;
1008} 1007}
1009 1008
1010 1009
1011static void garmin_close (struct usb_serial_port *port, struct file * filp) 1010static void garmin_close(struct tty_struct *tty,
1011 struct usb_serial_port *port, struct file * filp)
1012{ 1012{
1013 struct usb_serial *serial = port->serial; 1013 struct usb_serial *serial = port->serial;
1014 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port); 1014 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port);
@@ -1042,7 +1042,6 @@ static void garmin_close (struct usb_serial_port *port, struct file * filp)
1042 mutex_unlock(&port->serial->disc_mutex); 1042 mutex_unlock(&port->serial->disc_mutex);
1043} 1043}
1044 1044
1045
1046static void garmin_write_bulk_callback (struct urb *urb) 1045static void garmin_write_bulk_callback (struct urb *urb)
1047{ 1046{
1048 unsigned long flags; 1047 unsigned long flags;
@@ -1145,10 +1144,8 @@ static int garmin_write_bulk (struct usb_serial_port *port,
1145 return count; 1144 return count;
1146} 1145}
1147 1146
1148 1147static int garmin_write (struct tty_struct *tty, struct usb_serial_port *port,
1149 1148 const unsigned char *buf, int count)
1150static int garmin_write (struct usb_serial_port *port,
1151 const unsigned char *buf, int count)
1152{ 1149{
1153 int pktid, pktsiz, len; 1150 int pktid, pktsiz, len;
1154 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port); 1151 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port);
@@ -1158,7 +1155,6 @@ static int garmin_write (struct usb_serial_port *port,
1158 1155
1159 /* check for our private packets */ 1156 /* check for our private packets */
1160 if (count >= GARMIN_PKTHDR_LENGTH) { 1157 if (count >= GARMIN_PKTHDR_LENGTH) {
1161
1162 len = PRIVPKTSIZ; 1158 len = PRIVPKTSIZ;
1163 if (count < len) 1159 if (count < len)
1164 len = count; 1160 len = count;
@@ -1226,8 +1222,9 @@ static int garmin_write (struct usb_serial_port *port,
1226} 1222}
1227 1223
1228 1224
1229static int garmin_write_room (struct usb_serial_port *port) 1225static int garmin_write_room(struct tty_struct *tty)
1230{ 1226{
1227 struct usb_serial_port *port = tty->driver_data;
1231 /* 1228 /*
1232 * Report back the bytes currently available in the output buffer. 1229 * Report back the bytes currently available in the output buffer.
1233 */ 1230 */
@@ -1236,20 +1233,6 @@ static int garmin_write_room (struct usb_serial_port *port)
1236} 1233}
1237 1234
1238 1235
1239static int garmin_chars_in_buffer (struct usb_serial_port *port)
1240{
1241 /*
1242 * Report back the number of bytes currently in our input buffer.
1243 * Will this lock up the driver - the buffer contains an incomplete
1244 * package which will not be written to the device until it
1245 * has been completed ?
1246 */
1247 //struct garmin_data * garmin_data_p = usb_get_serial_port_data(port);
1248 //return garmin_data_p->insize;
1249 return 0;
1250}
1251
1252
1253static void garmin_read_process(struct garmin_data * garmin_data_p, 1236static void garmin_read_process(struct garmin_data * garmin_data_p,
1254 unsigned char *data, unsigned data_length) 1237 unsigned char *data, unsigned data_length)
1255{ 1238{
@@ -1468,10 +1451,11 @@ static int garmin_flush_queue(struct garmin_data * garmin_data_p)
1468} 1451}
1469 1452
1470 1453
1471static void garmin_throttle (struct usb_serial_port *port) 1454static void garmin_throttle(struct tty_struct *tty)
1472{ 1455{
1473 unsigned long flags; 1456 struct usb_serial_port *port = tty->driver_data;
1474 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port); 1457 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port);
1458 unsigned long flags;
1475 1459
1476 dbg("%s - port %d", __func__, port->number); 1460 dbg("%s - port %d", __func__, port->number);
1477 /* set flag, data received will be put into a queue 1461 /* set flag, data received will be put into a queue
@@ -1482,10 +1466,11 @@ static void garmin_throttle (struct usb_serial_port *port)
1482} 1466}
1483 1467
1484 1468
1485static void garmin_unthrottle (struct usb_serial_port *port) 1469static void garmin_unthrottle (struct tty_struct *tty)
1486{ 1470{
1487 unsigned long flags; 1471 struct usb_serial_port *port = tty->driver_data;
1488 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port); 1472 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port);
1473 unsigned long flags;
1489 int status; 1474 int status;
1490 1475
1491 dbg("%s - port %d", __func__, port->number); 1476 dbg("%s - port %d", __func__, port->number);
@@ -1507,8 +1492,6 @@ static void garmin_unthrottle (struct usb_serial_port *port)
1507 } 1492 }
1508} 1493}
1509 1494
1510
1511
1512/* 1495/*
1513 * The timer is currently only used to send queued packets to 1496 * The timer is currently only used to send queued packets to
1514 * the tty in cases where the protocol provides no own handshaking 1497 * the tty in cases where the protocol provides no own handshaking
@@ -1526,7 +1509,7 @@ static void timeout_handler(unsigned long data)
1526 1509
1527 1510
1528 1511
1529static int garmin_attach (struct usb_serial *serial) 1512static int garmin_attach(struct usb_serial *serial)
1530{ 1513{
1531 int status = 0; 1514 int status = 0;
1532 struct usb_serial_port *port = serial->port[0]; 1515 struct usb_serial_port *port = serial->port[0];
@@ -1556,7 +1539,7 @@ static int garmin_attach (struct usb_serial *serial)
1556} 1539}
1557 1540
1558 1541
1559static void garmin_shutdown (struct usb_serial *serial) 1542static void garmin_shutdown(struct usb_serial *serial)
1560{ 1543{
1561 struct usb_serial_port *port = serial->port[0]; 1544 struct usb_serial_port *port = serial->port[0];
1562 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port); 1545 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port);
@@ -1588,7 +1571,6 @@ static struct usb_serial_driver garmin_device = {
1588 .shutdown = garmin_shutdown, 1571 .shutdown = garmin_shutdown,
1589 .write = garmin_write, 1572 .write = garmin_write,
1590 .write_room = garmin_write_room, 1573 .write_room = garmin_write_room,
1591 .chars_in_buffer = garmin_chars_in_buffer,
1592 .write_bulk_callback = garmin_write_bulk_callback, 1574 .write_bulk_callback = garmin_write_bulk_callback,
1593 .read_bulk_callback = garmin_read_bulk_callback, 1575 .read_bulk_callback = garmin_read_bulk_callback,
1594 .read_int_callback = garmin_read_int_callback, 1576 .read_int_callback = garmin_read_int_callback,