blob: 24a08ac2e4eebc53d4068b27b88b6707371e42ca [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * USB Keyspan PDA / Xircom / Entregra Converter driver
3 *
4 * Copyright (C) 1999 - 2001 Greg Kroah-Hartman <greg@kroah.com>
5 * Copyright (C) 1999, 2000 Brian Warner <warner@lothar.com>
6 * Copyright (C) 2000 Al Borchers <borchers@steinerpoint.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * See Documentation/usb/usb-serial.txt for more information on using this driver
14 *
15 * (09/07/2001) gkh
16 * cleaned up the Xircom support. Added ids for Entregra device which is
17 * the same as the Xircom device. Enabled the code to be compiled for
18 * either Xircom or Keyspan devices.
19 *
20 * (08/11/2001) Cristian M. Craciunescu
21 * support for Xircom PGSDB9
22 *
23 * (05/31/2001) gkh
24 * switched from using spinlock to a semaphore, which fixes lots of problems.
25 *
26 * (04/08/2001) gb
27 * Identify version on module load.
28 *
29 * (11/01/2000) Adam J. Richter
30 * usb_device_id table support
31 *
32 * (10/05/2000) gkh
33 * Fixed bug with urb->dev not being set properly, now that the usb
34 * core needs it.
35 *
36 * (08/28/2000) gkh
37 * Added locks for SMP safeness.
38 * Fixed MOD_INC and MOD_DEC logic and the ability to open a port more
39 * than once.
40 *
41 * (07/20/2000) borchers
42 * - keyspan_pda_write no longer sleeps if it is called on interrupt time;
43 * PPP and the line discipline with stty echo on can call write on
44 * interrupt time and this would cause an oops if write slept
45 * - if keyspan_pda_write is in an interrupt, it will not call
46 * usb_control_msg (which sleeps) to query the room in the device
47 * buffer, it simply uses the current room value it has
48 * - if the urb is busy or if it is throttled keyspan_pda_write just
49 * returns 0, rather than sleeping to wait for this to change; the
50 * write_chan code in n_tty.c will sleep if needed before calling
51 * keyspan_pda_write again
52 * - if the device needs to be unthrottled, write now queues up the
53 * call to usb_control_msg (which sleeps) to unthrottle the device
54 * - the wakeups from keyspan_pda_write_bulk_callback are queued rather
55 * than done directly from the callback to avoid the race in write_chan
56 * - keyspan_pda_chars_in_buffer also indicates its buffer is full if the
57 * urb status is -EINPROGRESS, meaning it cannot write at the moment
58 *
59 * (07/19/2000) gkh
60 * Added module_init and module_exit functions to handle the fact that this
61 * driver is a loadable module now.
62 *
63 * (03/26/2000) gkh
64 * Split driver up into device specific pieces.
65 *
66 */
67
68
Linus Torvalds1da177e2005-04-16 15:20:36 -070069#include <linux/kernel.h>
70#include <linux/errno.h>
71#include <linux/init.h>
72#include <linux/slab.h>
73#include <linux/tty.h>
74#include <linux/tty_driver.h>
75#include <linux/tty_flip.h>
76#include <linux/module.h>
77#include <linux/spinlock.h>
78#include <linux/workqueue.h>
David Woodhouse3edbf982008-05-30 15:15:13 +030079#include <linux/firmware.h>
80#include <linux/ihex.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070081#include <asm/uaccess.h>
82#include <linux/usb.h>
Greg Kroah-Hartmana9698882006-07-11 21:22:58 -070083#include <linux/usb/serial.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070084
85static int debug;
86
Linus Torvalds1da177e2005-04-16 15:20:36 -070087/* make a simple define to handle if we are compiling keyspan_pda or xircom support */
88#if defined(CONFIG_USB_SERIAL_KEYSPAN_PDA) || defined(CONFIG_USB_SERIAL_KEYSPAN_PDA_MODULE)
89 #define KEYSPAN
90#else
91 #undef KEYSPAN
92#endif
93#if defined(CONFIG_USB_SERIAL_XIRCOM) || defined(CONFIG_USB_SERIAL_XIRCOM_MODULE)
94 #define XIRCOM
95#else
96 #undef XIRCOM
97#endif
98
Linus Torvalds1da177e2005-04-16 15:20:36 -070099/*
100 * Version Information
101 */
102#define DRIVER_VERSION "v1.1"
103#define DRIVER_AUTHOR "Brian Warner <warner@lothar.com>"
104#define DRIVER_DESC "USB Keyspan PDA Converter driver"
105
106struct keyspan_pda_private {
107 int tx_room;
108 int tx_throttled;
109 struct work_struct wakeup_work;
110 struct work_struct unthrottle_work;
David Howellsc4028952006-11-22 14:57:56 +0000111 struct usb_serial *serial;
112 struct usb_serial_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700113};
114
115
116#define KEYSPAN_VENDOR_ID 0x06cd
117#define KEYSPAN_PDA_FAKE_ID 0x0103
118#define KEYSPAN_PDA_ID 0x0104 /* no clue */
119
120/* For Xircom PGSDB9 and older Entregra version of the same device */
121#define XIRCOM_VENDOR_ID 0x085a
122#define XIRCOM_FAKE_ID 0x8027
123#define ENTREGRA_VENDOR_ID 0x1645
124#define ENTREGRA_FAKE_ID 0x8093
125
126static struct usb_device_id id_table_combined [] = {
127#ifdef KEYSPAN
128 { USB_DEVICE(KEYSPAN_VENDOR_ID, KEYSPAN_PDA_FAKE_ID) },
129#endif
130#ifdef XIRCOM
131 { USB_DEVICE(XIRCOM_VENDOR_ID, XIRCOM_FAKE_ID) },
132 { USB_DEVICE(ENTREGRA_VENDOR_ID, ENTREGRA_FAKE_ID) },
133#endif
134 { USB_DEVICE(KEYSPAN_VENDOR_ID, KEYSPAN_PDA_ID) },
135 { } /* Terminating entry */
136};
137
138MODULE_DEVICE_TABLE (usb, id_table_combined);
139
140static struct usb_driver keyspan_pda_driver = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700141 .name = "keyspan_pda",
142 .probe = usb_serial_probe,
143 .disconnect = usb_serial_disconnect,
144 .id_table = id_table_combined,
Greg Kroah-Hartmanba9dc652005-11-16 13:41:28 -0800145 .no_dynamic_id = 1,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700146};
147
148static struct usb_device_id id_table_std [] = {
149 { USB_DEVICE(KEYSPAN_VENDOR_ID, KEYSPAN_PDA_ID) },
150 { } /* Terminating entry */
151};
152
153#ifdef KEYSPAN
154static struct usb_device_id id_table_fake [] = {
155 { USB_DEVICE(KEYSPAN_VENDOR_ID, KEYSPAN_PDA_FAKE_ID) },
156 { } /* Terminating entry */
157};
158#endif
159
160#ifdef XIRCOM
161static struct usb_device_id id_table_fake_xircom [] = {
162 { USB_DEVICE(XIRCOM_VENDOR_ID, XIRCOM_FAKE_ID) },
163 { USB_DEVICE(ENTREGRA_VENDOR_ID, ENTREGRA_FAKE_ID) },
164 { }
165};
166#endif
167
David Howellsc4028952006-11-22 14:57:56 +0000168static void keyspan_pda_wakeup_write(struct work_struct *work)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700169{
David Howellsc4028952006-11-22 14:57:56 +0000170 struct keyspan_pda_private *priv =
171 container_of(work, struct keyspan_pda_private, wakeup_work);
172 struct usb_serial_port *port = priv->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700173
Alan Cox95da3102008-07-22 11:09:07 +0100174 tty_wakeup(port->port.tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700175}
176
David Howellsc4028952006-11-22 14:57:56 +0000177static void keyspan_pda_request_unthrottle(struct work_struct *work)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700178{
David Howellsc4028952006-11-22 14:57:56 +0000179 struct keyspan_pda_private *priv =
180 container_of(work, struct keyspan_pda_private, unthrottle_work);
181 struct usb_serial *serial = priv->serial;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700182 int result;
183
184 dbg(" request_unthrottle");
185 /* ask the device to tell us when the tx buffer becomes
186 sufficiently empty */
187 result = usb_control_msg(serial->dev,
188 usb_sndctrlpipe(serial->dev, 0),
189 7, /* request_unthrottle */
190 USB_TYPE_VENDOR | USB_RECIP_INTERFACE
191 | USB_DIR_OUT,
192 16, /* value: threshold */
193 0, /* index */
194 NULL,
195 0,
196 2000);
197 if (result < 0)
198 dbg("%s - error %d from usb_control_msg",
Harvey Harrison441b62c2008-03-03 16:08:34 -0800199 __func__, result);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700200}
201
202
David Howells7d12e782006-10-05 14:55:46 +0100203static void keyspan_pda_rx_interrupt (struct urb *urb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700204{
Ming Leicdc97792008-02-24 18:41:47 +0800205 struct usb_serial_port *port = urb->context;
Alan Cox95da3102008-07-22 11:09:07 +0100206 struct tty_struct *tty = port->port.tty;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700207 unsigned char *data = urb->transfer_buffer;
208 int i;
Greg Kroah-Hartman23189ae2007-06-15 15:44:13 -0700209 int retval;
210 int status = urb->status;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700211 struct keyspan_pda_private *priv;
212 priv = usb_get_serial_port_data(port);
213
Greg Kroah-Hartman23189ae2007-06-15 15:44:13 -0700214 switch (status) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700215 case 0:
216 /* success */
217 break;
218 case -ECONNRESET:
219 case -ENOENT:
220 case -ESHUTDOWN:
221 /* this urb is terminated, clean up */
Greg Kroah-Hartman23189ae2007-06-15 15:44:13 -0700222 dbg("%s - urb shutting down with status: %d",
Harvey Harrison441b62c2008-03-03 16:08:34 -0800223 __func__, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700224 return;
225 default:
Greg Kroah-Hartman23189ae2007-06-15 15:44:13 -0700226 dbg("%s - nonzero urb status received: %d",
Harvey Harrison441b62c2008-03-03 16:08:34 -0800227 __func__, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700228 goto exit;
229 }
230
231 /* see if the message is data or a status interrupt */
232 switch (data[0]) {
233 case 0:
234 /* rest of message is rx data */
235 if (urb->actual_length) {
236 for (i = 1; i < urb->actual_length ; ++i) {
237 tty_insert_flip_char(tty, data[i], 0);
238 }
239 tty_flip_buffer_push(tty);
240 }
241 break;
242 case 1:
243 /* status interrupt */
244 dbg(" rx int, d1=%d, d2=%d", data[1], data[2]);
245 switch (data[1]) {
246 case 1: /* modemline change */
247 break;
248 case 2: /* tx unthrottle interrupt */
249 priv->tx_throttled = 0;
250 /* queue up a wakeup at scheduler time */
251 schedule_work(&priv->wakeup_work);
252 break;
253 default:
254 break;
255 }
256 break;
257 default:
258 break;
259 }
260
261exit:
Greg Kroah-Hartman23189ae2007-06-15 15:44:13 -0700262 retval = usb_submit_urb (urb, GFP_ATOMIC);
263 if (retval)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700264 err ("%s - usb_submit_urb failed with result %d",
Harvey Harrison441b62c2008-03-03 16:08:34 -0800265 __func__, retval);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700266}
267
268
Alan Cox95da3102008-07-22 11:09:07 +0100269static void keyspan_pda_rx_throttle(struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700270{
271 /* stop receiving characters. We just turn off the URB request, and
272 let chars pile up in the device. If we're doing hardware
273 flowcontrol, the device will signal the other end when its buffer
274 fills up. If we're doing XON/XOFF, this would be a good time to
275 send an XOFF, although it might make sense to foist that off
276 upon the device too. */
Alan Cox95da3102008-07-22 11:09:07 +0100277 struct usb_serial_port *port = tty->driver_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700278 dbg("keyspan_pda_rx_throttle port %d", port->number);
279 usb_kill_urb(port->interrupt_in_urb);
280}
281
282
Alan Cox95da3102008-07-22 11:09:07 +0100283static void keyspan_pda_rx_unthrottle(struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700284{
Alan Cox95da3102008-07-22 11:09:07 +0100285 struct usb_serial_port *port = tty->driver_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700286 /* just restart the receive interrupt URB */
287 dbg("keyspan_pda_rx_unthrottle port %d", port->number);
288 port->interrupt_in_urb->dev = port->serial->dev;
289 if (usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC))
290 dbg(" usb_submit_urb(read urb) failed");
291 return;
292}
293
294
Alan Coxe7806e32007-12-13 16:15:28 -0800295static speed_t keyspan_pda_setbaud (struct usb_serial *serial, speed_t baud)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700296{
297 int rc;
298 int bindex;
299
300 switch(baud) {
301 case 110: bindex = 0; break;
302 case 300: bindex = 1; break;
303 case 1200: bindex = 2; break;
304 case 2400: bindex = 3; break;
305 case 4800: bindex = 4; break;
306 case 9600: bindex = 5; break;
307 case 19200: bindex = 6; break;
308 case 38400: bindex = 7; break;
309 case 57600: bindex = 8; break;
310 case 115200: bindex = 9; break;
Alan Coxe7806e32007-12-13 16:15:28 -0800311 default:
312 bindex = 5; /* Default to 9600 */
313 baud = 9600;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700314 }
315
316 /* rather than figure out how to sleep while waiting for this
317 to complete, I just use the "legacy" API. */
318 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
319 0, /* set baud */
320 USB_TYPE_VENDOR
321 | USB_RECIP_INTERFACE
322 | USB_DIR_OUT, /* type */
323 bindex, /* value */
324 0, /* index */
325 NULL, /* &data */
326 0, /* size */
327 2000); /* timeout */
Alan Coxe7806e32007-12-13 16:15:28 -0800328 if (rc < 0)
329 return 0;
330 return baud;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700331}
332
333
Alan Cox95da3102008-07-22 11:09:07 +0100334static void keyspan_pda_break_ctl(struct tty_struct *tty, int break_state)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700335{
Alan Cox95da3102008-07-22 11:09:07 +0100336 struct usb_serial_port *port = tty->driver_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700337 struct usb_serial *serial = port->serial;
338 int value;
339 int result;
340
341 if (break_state == -1)
342 value = 1; /* start break */
343 else
344 value = 0; /* clear break */
345 result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
346 4, /* set break */
347 USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT,
348 value, 0, NULL, 0, 2000);
349 if (result < 0)
350 dbg("%s - error %d from usb_control_msg",
Harvey Harrison441b62c2008-03-03 16:08:34 -0800351 __func__, result);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700352 /* there is something funky about this.. the TCSBRK that 'cu' performs
353 ought to translate into a break_ctl(-1),break_ctl(0) pair HZ/4
354 seconds apart, but it feels like the break sent isn't as long as it
355 is on /dev/ttyS0 */
356}
357
358
Alan Cox95da3102008-07-22 11:09:07 +0100359static void keyspan_pda_set_termios(struct tty_struct *tty,
360 struct usb_serial_port *port, struct ktermios *old_termios)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700361{
362 struct usb_serial *serial = port->serial;
Alan Coxe7806e32007-12-13 16:15:28 -0800363 speed_t speed;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700364
365 /* cflag specifies lots of stuff: number of stop bits, parity, number
366 of data bits, baud. What can the device actually handle?:
367 CSTOPB (1 stop bit or 2)
368 PARENB (parity)
369 CSIZE (5bit .. 8bit)
370 There is minimal hw support for parity (a PSW bit seems to hold the
371 parity of whatever is in the accumulator). The UART either deals
372 with 10 bits (start, 8 data, stop) or 11 bits (start, 8 data,
373 1 special, stop). So, with firmware changes, we could do:
374 8N1: 10 bit
375 8N2: 11 bit, extra bit always (mark?)
376 8[EOMS]1: 11 bit, extra bit is parity
377 7[EOMS]1: 10 bit, b0/b7 is parity
378 7[EOMS]2: 11 bit, b0/b7 is parity, extra bit always (mark?)
379
380 HW flow control is dictated by the tty->termios->c_cflags & CRTSCTS
381 bit.
382
383 For now, just do baud. */
384
Alan Cox95da3102008-07-22 11:09:07 +0100385 speed = tty_get_baud_rate(tty);
Alan Coxe7806e32007-12-13 16:15:28 -0800386 speed = keyspan_pda_setbaud(serial, speed);
387
388 if (speed == 0) {
389 dbg("can't handle requested baud rate");
390 /* It hasn't changed so.. */
391 speed = tty_termios_baud_rate(old_termios);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700392 }
Alan Coxe7806e32007-12-13 16:15:28 -0800393 /* Only speed can change so copy the old h/w parameters
394 then encode the new speed */
Alan Cox95da3102008-07-22 11:09:07 +0100395 tty_termios_copy_hw(tty->termios, old_termios);
396 tty_encode_baud_rate(tty, speed, speed);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700397}
398
399
400/* modem control pins: DTR and RTS are outputs and can be controlled.
401 DCD, RI, DSR, CTS are inputs and can be read. All outputs can also be
402 read. The byte passed is: DTR(b7) DCD RI DSR CTS RTS(b2) unused unused */
403
404static int keyspan_pda_get_modem_info(struct usb_serial *serial,
405 unsigned char *value)
406{
407 int rc;
408 unsigned char data;
409 rc = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
410 3, /* get pins */
411 USB_TYPE_VENDOR|USB_RECIP_INTERFACE|USB_DIR_IN,
412 0, 0, &data, 1, 2000);
Benny Halevy3b36a8f2008-06-27 12:22:32 +0300413 if (rc >= 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700414 *value = data;
415 return rc;
416}
417
418
419static int keyspan_pda_set_modem_info(struct usb_serial *serial,
420 unsigned char value)
421{
422 int rc;
423 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
424 3, /* set pins */
425 USB_TYPE_VENDOR|USB_RECIP_INTERFACE|USB_DIR_OUT,
426 value, 0, NULL, 0, 2000);
427 return rc;
428}
429
Alan Cox95da3102008-07-22 11:09:07 +0100430static int keyspan_pda_tiocmget(struct tty_struct *tty, struct file *file)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700431{
Alan Cox95da3102008-07-22 11:09:07 +0100432 struct usb_serial_port *port = tty->driver_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700433 struct usb_serial *serial = port->serial;
434 int rc;
435 unsigned char status;
436 int value;
437
438 rc = keyspan_pda_get_modem_info(serial, &status);
439 if (rc < 0)
440 return rc;
441 value =
442 ((status & (1<<7)) ? TIOCM_DTR : 0) |
443 ((status & (1<<6)) ? TIOCM_CAR : 0) |
444 ((status & (1<<5)) ? TIOCM_RNG : 0) |
445 ((status & (1<<4)) ? TIOCM_DSR : 0) |
446 ((status & (1<<3)) ? TIOCM_CTS : 0) |
447 ((status & (1<<2)) ? TIOCM_RTS : 0);
448 return value;
449}
450
Alan Cox95da3102008-07-22 11:09:07 +0100451static int keyspan_pda_tiocmset(struct tty_struct *tty, struct file *file,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700452 unsigned int set, unsigned int clear)
453{
Alan Cox95da3102008-07-22 11:09:07 +0100454 struct usb_serial_port *port = tty->driver_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700455 struct usb_serial *serial = port->serial;
456 int rc;
457 unsigned char status;
458
459 rc = keyspan_pda_get_modem_info(serial, &status);
460 if (rc < 0)
461 return rc;
462
463 if (set & TIOCM_RTS)
464 status |= (1<<2);
465 if (set & TIOCM_DTR)
466 status |= (1<<7);
467
468 if (clear & TIOCM_RTS)
469 status &= ~(1<<2);
470 if (clear & TIOCM_DTR)
471 status &= ~(1<<7);
472 rc = keyspan_pda_set_modem_info(serial, status);
473 return rc;
474}
475
Alan Cox95da3102008-07-22 11:09:07 +0100476static int keyspan_pda_write(struct tty_struct *tty,
477 struct usb_serial_port *port, const unsigned char *buf, int count)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700478{
479 struct usb_serial *serial = port->serial;
480 int request_unthrottle = 0;
481 int rc = 0;
482 struct keyspan_pda_private *priv;
483
484 priv = usb_get_serial_port_data(port);
485 /* guess how much room is left in the device's ring buffer, and if we
486 want to send more than that, check first, updating our notion of
487 what is left. If our write will result in no room left, ask the
488 device to give us an interrupt when the room available rises above
489 a threshold, and hold off all writers (eventually, those using
490 select() or poll() too) until we receive that unthrottle interrupt.
491 Block if we can't write anything at all, otherwise write as much as
492 we can. */
493 dbg("keyspan_pda_write(%d)",count);
494 if (count == 0) {
495 dbg(" write request of 0 bytes");
496 return (0);
497 }
498
499 /* we might block because of:
500 the TX urb is in-flight (wait until it completes)
501 the device is full (wait until it says there is room)
502 */
Peter Zijlstrae81ee632006-09-25 12:51:41 +0200503 spin_lock_bh(&port->lock);
Greg Kroah-Hartman507ca9b2005-04-23 12:49:16 -0700504 if (port->write_urb_busy || priv->tx_throttled) {
Peter Zijlstrae81ee632006-09-25 12:51:41 +0200505 spin_unlock_bh(&port->lock);
Greg Kroah-Hartman507ca9b2005-04-23 12:49:16 -0700506 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700507 }
Greg Kroah-Hartman507ca9b2005-04-23 12:49:16 -0700508 port->write_urb_busy = 1;
Peter Zijlstrae81ee632006-09-25 12:51:41 +0200509 spin_unlock_bh(&port->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700510
511 /* At this point the URB is in our control, nobody else can submit it
512 again (the only sudden transition was the one from EINPROGRESS to
513 finished). Also, the tx process is not throttled. So we are
514 ready to write. */
515
516 count = (count > port->bulk_out_size) ? port->bulk_out_size : count;
517
518 /* Check if we might overrun the Tx buffer. If so, ask the
519 device how much room it really has. This is done only on
520 scheduler time, since usb_control_msg() sleeps. */
521 if (count > priv->tx_room && !in_interrupt()) {
522 unsigned char room;
523 rc = usb_control_msg(serial->dev,
524 usb_rcvctrlpipe(serial->dev, 0),
525 6, /* write_room */
526 USB_TYPE_VENDOR | USB_RECIP_INTERFACE
527 | USB_DIR_IN,
528 0, /* value: 0 means "remaining room" */
529 0, /* index */
530 &room,
531 1,
532 2000);
533 if (rc < 0) {
534 dbg(" roomquery failed");
535 goto exit;
536 }
537 if (rc == 0) {
538 dbg(" roomquery returned 0 bytes");
539 rc = -EIO; /* device didn't return any data */
540 goto exit;
541 }
542 dbg(" roomquery says %d", room);
543 priv->tx_room = room;
544 }
545 if (count > priv->tx_room) {
546 /* we're about to completely fill the Tx buffer, so
547 we'll be throttled afterwards. */
548 count = priv->tx_room;
549 request_unthrottle = 1;
550 }
551
552 if (count) {
553 /* now transfer data */
554 memcpy (port->write_urb->transfer_buffer, buf, count);
555 /* send the data out the bulk port */
556 port->write_urb->transfer_buffer_length = count;
Greg Kroah-Hartman507ca9b2005-04-23 12:49:16 -0700557
Linus Torvalds1da177e2005-04-16 15:20:36 -0700558 priv->tx_room -= count;
559
560 port->write_urb->dev = port->serial->dev;
561 rc = usb_submit_urb(port->write_urb, GFP_ATOMIC);
562 if (rc) {
563 dbg(" usb_submit_urb(write bulk) failed");
564 goto exit;
565 }
566 }
567 else {
568 /* There wasn't any room left, so we are throttled until
569 the buffer empties a bit */
570 request_unthrottle = 1;
571 }
572
573 if (request_unthrottle) {
574 priv->tx_throttled = 1; /* block writers */
575 schedule_work(&priv->unthrottle_work);
576 }
577
578 rc = count;
579exit:
Greg Kroah-Hartman507ca9b2005-04-23 12:49:16 -0700580 if (rc < 0)
581 port->write_urb_busy = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700582 return rc;
583}
584
585
David Howells7d12e782006-10-05 14:55:46 +0100586static void keyspan_pda_write_bulk_callback (struct urb *urb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700587{
Ming Leicdc97792008-02-24 18:41:47 +0800588 struct usb_serial_port *port = urb->context;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700589 struct keyspan_pda_private *priv;
590
Greg Kroah-Hartman507ca9b2005-04-23 12:49:16 -0700591 port->write_urb_busy = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700592 priv = usb_get_serial_port_data(port);
593
594 /* queue up a wakeup at scheduler time */
595 schedule_work(&priv->wakeup_work);
596}
597
598
Alan Cox95da3102008-07-22 11:09:07 +0100599static int keyspan_pda_write_room(struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700600{
Alan Cox95da3102008-07-22 11:09:07 +0100601 struct usb_serial_port *port = tty->driver_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700602 struct keyspan_pda_private *priv;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700603 priv = usb_get_serial_port_data(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700604 /* used by n_tty.c for processing of tabs and such. Giving it our
605 conservative guess is probably good enough, but needs testing by
606 running a console through the device. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700607 return (priv->tx_room);
608}
609
610
Alan Cox95da3102008-07-22 11:09:07 +0100611static int keyspan_pda_chars_in_buffer(struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700612{
Alan Cox95da3102008-07-22 11:09:07 +0100613 struct usb_serial_port *port = tty->driver_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700614 struct keyspan_pda_private *priv;
Alan Coxa5b6f602008-04-08 17:16:06 +0100615 unsigned long flags;
616 int ret = 0;
Greg Kroah-Hartman507ca9b2005-04-23 12:49:16 -0700617
Linus Torvalds1da177e2005-04-16 15:20:36 -0700618 priv = usb_get_serial_port_data(port);
Greg Kroah-Hartman507ca9b2005-04-23 12:49:16 -0700619
Linus Torvalds1da177e2005-04-16 15:20:36 -0700620 /* when throttled, return at least WAKEUP_CHARS to tell select() (via
621 n_tty.c:normal_poll() ) that we're not writeable. */
Alan Coxa5b6f602008-04-08 17:16:06 +0100622
623 spin_lock_irqsave(&port->lock, flags);
Greg Kroah-Hartman507ca9b2005-04-23 12:49:16 -0700624 if (port->write_urb_busy || priv->tx_throttled)
Alan Coxa5b6f602008-04-08 17:16:06 +0100625 ret = 256;
626 spin_unlock_irqrestore(&port->lock, flags);
627 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700628}
629
630
Alan Cox95da3102008-07-22 11:09:07 +0100631static int keyspan_pda_open(struct tty_struct *tty,
632 struct usb_serial_port *port, struct file *filp)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700633{
634 struct usb_serial *serial = port->serial;
635 unsigned char room;
636 int rc = 0;
637 struct keyspan_pda_private *priv;
638
639 /* find out how much room is in the Tx ring */
640 rc = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
641 6, /* write_room */
642 USB_TYPE_VENDOR | USB_RECIP_INTERFACE
643 | USB_DIR_IN,
644 0, /* value */
645 0, /* index */
646 &room,
647 1,
648 2000);
649 if (rc < 0) {
Harvey Harrison441b62c2008-03-03 16:08:34 -0800650 dbg("%s - roomquery failed", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700651 goto error;
652 }
653 if (rc == 0) {
Harvey Harrison441b62c2008-03-03 16:08:34 -0800654 dbg("%s - roomquery returned 0 bytes", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700655 rc = -EIO;
656 goto error;
657 }
658 priv = usb_get_serial_port_data(port);
659 priv->tx_room = room;
660 priv->tx_throttled = room ? 0 : 1;
661
662 /* the normal serial device seems to always turn on DTR and RTS here,
663 so do the same */
Alan Cox95da3102008-07-22 11:09:07 +0100664 if (tty && (tty->termios->c_cflag & CBAUD))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700665 keyspan_pda_set_modem_info(serial, (1<<7) | (1<<2) );
666 else
667 keyspan_pda_set_modem_info(serial, 0);
668
669 /*Start reading from the device*/
670 port->interrupt_in_urb->dev = serial->dev;
671 rc = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
672 if (rc) {
Harvey Harrison441b62c2008-03-03 16:08:34 -0800673 dbg("%s - usb_submit_urb(read int) failed", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700674 goto error;
675 }
676
677error:
678 return rc;
679}
680
681
Alan Cox95da3102008-07-22 11:09:07 +0100682static void keyspan_pda_close(struct tty_struct *tty,
683 struct usb_serial_port *port, struct file *filp)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700684{
685 struct usb_serial *serial = port->serial;
686
687 if (serial->dev) {
688 /* the normal serial device seems to always shut off DTR and RTS now */
Alan Cox95da3102008-07-22 11:09:07 +0100689 if (tty->termios->c_cflag & HUPCL)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700690 keyspan_pda_set_modem_info(serial, 0);
691
692 /* shutdown our bulk reads and writes */
693 usb_kill_urb(port->write_urb);
694 usb_kill_urb(port->interrupt_in_urb);
695 }
696}
697
698
699/* download the firmware to a "fake" device (pre-renumeration) */
700static int keyspan_pda_fake_startup (struct usb_serial *serial)
701{
702 int response;
David Woodhouse3edbf982008-05-30 15:15:13 +0300703 const char *fw_name;
704 const struct ihex_binrec *record;
705 const struct firmware *fw;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700706
707 /* download the firmware here ... */
708 response = ezusb_set_reset(serial, 1);
709
David Woodhouse3edbf982008-05-30 15:15:13 +0300710 if (0) { ; }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700711#ifdef KEYSPAN
David Woodhouse3edbf982008-05-30 15:15:13 +0300712 else if (le16_to_cpu(serial->dev->descriptor.idVendor) == KEYSPAN_VENDOR_ID)
713 fw_name = "keyspan_pda/keyspan_pda.fw";
Linus Torvalds1da177e2005-04-16 15:20:36 -0700714#endif
715#ifdef XIRCOM
David Woodhouse3edbf982008-05-30 15:15:13 +0300716 else if ((le16_to_cpu(serial->dev->descriptor.idVendor) == XIRCOM_VENDOR_ID) ||
717 (le16_to_cpu(serial->dev->descriptor.idVendor) == ENTREGRA_VENDOR_ID))
718 fw_name = "keyspan_pda/xircom_pgs.fw";
Linus Torvalds1da177e2005-04-16 15:20:36 -0700719#endif
David Woodhouse3edbf982008-05-30 15:15:13 +0300720 else {
Harvey Harrison441b62c2008-03-03 16:08:34 -0800721 err("%s: unknown vendor, aborting.", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700722 return -ENODEV;
723 }
David Woodhouse3edbf982008-05-30 15:15:13 +0300724 if (request_ihex_firmware(&fw, fw_name, &serial->dev->dev)) {
725 err("failed to load firmware \"%s\"\n", fw_name);
726 return -ENOENT;
727 }
728 record = (const struct ihex_binrec *)fw->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700729
David Woodhouse3edbf982008-05-30 15:15:13 +0300730 while (record) {
731 response = ezusb_writememory(serial, be32_to_cpu(record->addr),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700732 (unsigned char *)record->data,
David Woodhouse3edbf982008-05-30 15:15:13 +0300733 be16_to_cpu(record->len), 0xa0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700734 if (response < 0) {
735 err("ezusb_writememory failed for Keyspan PDA "
736 "firmware (%d %04X %p %d)",
David Woodhouse3edbf982008-05-30 15:15:13 +0300737 response, be32_to_cpu(record->addr),
738 record->data, be16_to_cpu(record->len));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700739 break;
740 }
David Woodhouse3edbf982008-05-30 15:15:13 +0300741 record = ihex_next_binrec(record);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700742 }
David Woodhouse3edbf982008-05-30 15:15:13 +0300743 release_firmware(fw);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700744 /* bring device out of reset. Renumeration will occur in a moment
745 and the new device will bind to the real driver */
746 response = ezusb_set_reset(serial, 0);
747
748 /* we want this device to fail to have a driver assigned to it. */
749 return (1);
750}
751
752static int keyspan_pda_startup (struct usb_serial *serial)
753{
754
755 struct keyspan_pda_private *priv;
756
757 /* allocate the private data structures for all ports. Well, for all
758 one ports. */
759
760 priv = kmalloc(sizeof(struct keyspan_pda_private), GFP_KERNEL);
761 if (!priv)
762 return (1); /* error */
763 usb_set_serial_port_data(serial->port[0], priv);
764 init_waitqueue_head(&serial->port[0]->write_wait);
David Howellsc4028952006-11-22 14:57:56 +0000765 INIT_WORK(&priv->wakeup_work, keyspan_pda_wakeup_write);
766 INIT_WORK(&priv->unthrottle_work, keyspan_pda_request_unthrottle);
767 priv->serial = serial;
768 priv->port = serial->port[0];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700769 return (0);
770}
771
772static void keyspan_pda_shutdown (struct usb_serial *serial)
773{
Harvey Harrison441b62c2008-03-03 16:08:34 -0800774 dbg("%s", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700775
776 kfree(usb_get_serial_port_data(serial->port[0]));
777}
778
779#ifdef KEYSPAN
Greg Kroah-Hartmanea653702005-06-20 21:15:16 -0700780static struct usb_serial_driver keyspan_pda_fake_device = {
Greg Kroah-Hartman18fcac32005-06-20 21:15:16 -0700781 .driver = {
782 .owner = THIS_MODULE,
Greg Kroah-Hartman269bda12005-06-20 21:15:16 -0700783 .name = "keyspan_pda_pre",
Greg Kroah-Hartman18fcac32005-06-20 21:15:16 -0700784 },
Greg Kroah-Hartman269bda12005-06-20 21:15:16 -0700785 .description = "Keyspan PDA - (prerenumeration)",
Johannes Hölzld9b1b782006-12-17 21:50:24 +0100786 .usb_driver = &keyspan_pda_driver,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700787 .id_table = id_table_fake,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700788 .num_ports = 1,
789 .attach = keyspan_pda_fake_startup,
790};
791#endif
792
793#ifdef XIRCOM
Greg Kroah-Hartmanea653702005-06-20 21:15:16 -0700794static struct usb_serial_driver xircom_pgs_fake_device = {
Greg Kroah-Hartman18fcac32005-06-20 21:15:16 -0700795 .driver = {
796 .owner = THIS_MODULE,
Greg Kroah-Hartman269bda12005-06-20 21:15:16 -0700797 .name = "xircom_no_firm",
Greg Kroah-Hartman18fcac32005-06-20 21:15:16 -0700798 },
Greg Kroah-Hartman269bda12005-06-20 21:15:16 -0700799 .description = "Xircom / Entregra PGS - (prerenumeration)",
Johannes Hölzld9b1b782006-12-17 21:50:24 +0100800 .usb_driver = &keyspan_pda_driver,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700801 .id_table = id_table_fake_xircom,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700802 .num_ports = 1,
803 .attach = keyspan_pda_fake_startup,
804};
805#endif
806
Greg Kroah-Hartmanea653702005-06-20 21:15:16 -0700807static struct usb_serial_driver keyspan_pda_device = {
Greg Kroah-Hartman18fcac32005-06-20 21:15:16 -0700808 .driver = {
809 .owner = THIS_MODULE,
Greg Kroah-Hartman269bda12005-06-20 21:15:16 -0700810 .name = "keyspan_pda",
Greg Kroah-Hartman18fcac32005-06-20 21:15:16 -0700811 },
Greg Kroah-Hartman269bda12005-06-20 21:15:16 -0700812 .description = "Keyspan PDA",
Johannes Hölzld9b1b782006-12-17 21:50:24 +0100813 .usb_driver = &keyspan_pda_driver,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700814 .id_table = id_table_std,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700815 .num_ports = 1,
816 .open = keyspan_pda_open,
817 .close = keyspan_pda_close,
818 .write = keyspan_pda_write,
819 .write_room = keyspan_pda_write_room,
820 .write_bulk_callback = keyspan_pda_write_bulk_callback,
821 .read_int_callback = keyspan_pda_rx_interrupt,
822 .chars_in_buffer = keyspan_pda_chars_in_buffer,
823 .throttle = keyspan_pda_rx_throttle,
824 .unthrottle = keyspan_pda_rx_unthrottle,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700825 .set_termios = keyspan_pda_set_termios,
826 .break_ctl = keyspan_pda_break_ctl,
827 .tiocmget = keyspan_pda_tiocmget,
828 .tiocmset = keyspan_pda_tiocmset,
829 .attach = keyspan_pda_startup,
830 .shutdown = keyspan_pda_shutdown,
831};
832
833
834static int __init keyspan_pda_init (void)
835{
836 int retval;
837 retval = usb_serial_register(&keyspan_pda_device);
838 if (retval)
839 goto failed_pda_register;
840#ifdef KEYSPAN
841 retval = usb_serial_register(&keyspan_pda_fake_device);
842 if (retval)
843 goto failed_pda_fake_register;
844#endif
845#ifdef XIRCOM
846 retval = usb_serial_register(&xircom_pgs_fake_device);
847 if (retval)
848 goto failed_xircom_register;
849#endif
850 retval = usb_register(&keyspan_pda_driver);
851 if (retval)
852 goto failed_usb_register;
853 info(DRIVER_DESC " " DRIVER_VERSION);
854 return 0;
855failed_usb_register:
856#ifdef XIRCOM
857 usb_serial_deregister(&xircom_pgs_fake_device);
858failed_xircom_register:
859#endif /* XIRCOM */
860#ifdef KEYSPAN
861 usb_serial_deregister(&keyspan_pda_fake_device);
862#endif
863#ifdef KEYSPAN
864failed_pda_fake_register:
865#endif
866 usb_serial_deregister(&keyspan_pda_device);
867failed_pda_register:
868 return retval;
869}
870
871
872static void __exit keyspan_pda_exit (void)
873{
874 usb_deregister (&keyspan_pda_driver);
875 usb_serial_deregister (&keyspan_pda_device);
876#ifdef KEYSPAN
877 usb_serial_deregister (&keyspan_pda_fake_device);
878#endif
879#ifdef XIRCOM
880 usb_serial_deregister (&xircom_pgs_fake_device);
881#endif
882}
883
884
885module_init(keyspan_pda_init);
886module_exit(keyspan_pda_exit);
887
888MODULE_AUTHOR( DRIVER_AUTHOR );
889MODULE_DESCRIPTION( DRIVER_DESC );
890MODULE_LICENSE("GPL");
891
892module_param(debug, bool, S_IRUGO | S_IWUSR);
893MODULE_PARM_DESC(debug, "Debug enabled or not");
894