aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/serial/quatech2.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-05-22 18:50:46 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-05-22 18:50:46 -0400
commita481991467d38afb43c3921d5b5b59ccb61b04ba (patch)
treea4b0b9a14da6fd5ef7b9b512bb32dbfcfcf2cd71 /drivers/usb/serial/quatech2.c
parentf6a26ae7699416d86bea8cb68ce413571e9cab3c (diff)
parentcda4db53e9c28061c100400e1a4d273ea61dfba9 (diff)
Merge tag 'usb-3.5-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
Pull USB 3.5-rc1 changes from Greg Kroah-Hartman: "Here is the big USB 3.5-rc1 pull request for the 3.5-rc1 merge window. It's touches a lot of different parts of the kernel, all USB drivers, due to some API cleanups (getting rid of the ancient err() macro) and some changes that are needed for USB 3.0 power management updates. There are also lots of new drivers, pimarily gadget, but others as well. We deleted a staging driver, which was nice, and finally dropped the obsolete usbfs code, which will make Al happy to never have to touch that again. There were some build errors in the tree that linux-next found a few days ago, but those were fixed by the most recent changes (all were due to us not building with CONFIG_PM disabled.) Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>" * tag 'usb-3.5-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (477 commits) xhci: Fix DIV_ROUND_UP compile error. xhci: Fix compile with CONFIG_USB_SUSPEND=n USB: Fix core compile with CONFIG_USB_SUSPEND=n brcm80211: Fix compile error for .disable_hub_initiated_lpm. Revert "USB: EHCI: work around bug in the Philips ISP1562 controller" MAINTAINERS: Add myself as maintainer to the USB PHY Layer USB: EHCI: fix command register configuration lost problem USB: Remove races in devio.c USB: ehci-platform: remove update_device USB: Disable hub-initiated LPM for comms devices. xhci: Add Intel U1/U2 timeout policy. xhci: Add infrastructure for host-specific LPM policies. USB: Add macros for interrupt endpoint types. xhci: Reserve one command for USB3 LPM disable. xhci: Some Evaluate Context commands must succeed. USB: Disable USB 3.0 LPM in critical sections. USB: Add support to enable/disable USB3 link states. USB: Allow drivers to disable hub-initiated LPM. USB: Calculate USB 3.0 exit latencies for LPM. USB: Refactor code to set LPM support flag. ... Conflicts: arch/arm/mach-exynos/mach-nuri.c arch/arm/mach-exynos/mach-universal_c210.c drivers/net/wireless/ath/ath6kl/usb.c
Diffstat (limited to 'drivers/usb/serial/quatech2.c')
-rw-r--r--drivers/usb/serial/quatech2.c1155
1 files changed, 1155 insertions, 0 deletions
diff --git a/drivers/usb/serial/quatech2.c b/drivers/usb/serial/quatech2.c
new file mode 100644
index 000000000000..8dd88ebe9863
--- /dev/null
+++ b/drivers/usb/serial/quatech2.c
@@ -0,0 +1,1155 @@
1/*
2 * usb-serial driver for Quatech USB 2 devices
3 *
4 * Copyright (C) 2012 Bill Pemberton (wfp5p@virginia.edu)
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License version 2
8 * as published by the Free Software Foundation.
9 *
10 *
11 * These devices all have only 1 bulk in and 1 bulk out that is shared
12 * for all serial ports.
13 *
14 */
15
16#include <asm/unaligned.h>
17#include <linux/errno.h>
18#include <linux/init.h>
19#include <linux/slab.h>
20#include <linux/tty.h>
21#include <linux/tty_driver.h>
22#include <linux/tty_flip.h>
23#include <linux/module.h>
24#include <linux/serial.h>
25#include <linux/usb.h>
26#include <linux/usb/serial.h>
27#include <linux/serial_reg.h>
28#include <linux/uaccess.h>
29
30static bool debug;
31
32/* default urb timeout for usb operations */
33#define QT2_USB_TIMEOUT USB_CTRL_SET_TIMEOUT
34
35#define QT_OPEN_CLOSE_CHANNEL 0xca
36#define QT_SET_GET_DEVICE 0xc2
37#define QT_SET_GET_REGISTER 0xc0
38#define QT_GET_SET_PREBUF_TRIG_LVL 0xcc
39#define QT_SET_ATF 0xcd
40#define QT_TRANSFER_IN 0xc0
41#define QT_HW_FLOW_CONTROL_MASK 0xc5
42#define QT_SW_FLOW_CONTROL_MASK 0xc6
43#define QT2_BREAK_CONTROL 0xc8
44#define QT2_GET_SET_UART 0xc1
45#define QT2_FLUSH_DEVICE 0xc4
46#define QT2_GET_SET_QMCR 0xe1
47#define QT2_QMCR_RS232 0x40
48#define QT2_QMCR_RS422 0x10
49
50#define SERIAL_CRTSCTS ((UART_MCR_RTS << 8) | UART_MSR_CTS)
51
52#define SERIAL_EVEN_PARITY (UART_LCR_PARITY | UART_LCR_EPAR)
53
54/* status bytes for the device */
55#define QT2_CONTROL_BYTE 0x1b
56#define QT2_LINE_STATUS 0x00 /* following 1 byte is line status */
57#define QT2_MODEM_STATUS 0x01 /* following 1 byte is modem status */
58#define QT2_XMIT_HOLD 0x02 /* following 2 bytes are ?? */
59#define QT2_CHANGE_PORT 0x03 /* following 1 byte is port to change to */
60#define QT2_REC_FLUSH 0x04 /* no following info */
61#define QT2_XMIT_FLUSH 0x05 /* no following info */
62#define QT2_CONTROL_ESCAPE 0xff /* pass through previous 2 control bytes */
63
64#define MAX_BAUD_RATE 921600
65#define DEFAULT_BAUD_RATE 9600
66
67#define QT2_WRITE_BUFFER_SIZE 512 /* size of write buffer */
68#define QT2_WRITE_CONTROL_SIZE 5 /* control bytes used for a write */
69
70/* Version Information */
71#define DRIVER_VERSION "v0.1"
72#define DRIVER_DESC "Quatech 2nd gen USB to Serial Driver"
73
74#define USB_VENDOR_ID_QUATECH 0x061d
75#define QUATECH_SSU2_100 0xC120 /* RS232 single port */
76#define QUATECH_DSU2_100 0xC140 /* RS232 dual port */
77#define QUATECH_DSU2_400 0xC150 /* RS232/422/485 dual port */
78#define QUATECH_QSU2_100 0xC160 /* RS232 four port */
79#define QUATECH_QSU2_400 0xC170 /* RS232/422/485 four port */
80#define QUATECH_ESU2_100 0xC1A0 /* RS232 eight port */
81#define QUATECH_ESU2_400 0xC180 /* RS232/422/485 eight port */
82
83struct qt2_device_detail {
84 int product_id;
85 int num_ports;
86};
87
88#define QT_DETAILS(prod, ports) \
89 .product_id = (prod), \
90 .num_ports = (ports)
91
92static const struct qt2_device_detail qt2_device_details[] = {
93 {QT_DETAILS(QUATECH_SSU2_100, 1)},
94 {QT_DETAILS(QUATECH_DSU2_400, 2)},
95 {QT_DETAILS(QUATECH_DSU2_100, 2)},
96 {QT_DETAILS(QUATECH_QSU2_400, 4)},
97 {QT_DETAILS(QUATECH_QSU2_100, 4)},
98 {QT_DETAILS(QUATECH_ESU2_400, 8)},
99 {QT_DETAILS(QUATECH_ESU2_100, 8)},
100 {QT_DETAILS(0, 0)} /* Terminating entry */
101};
102
103static const struct usb_device_id id_table[] = {
104 {USB_DEVICE(USB_VENDOR_ID_QUATECH, QUATECH_SSU2_100)},
105 {USB_DEVICE(USB_VENDOR_ID_QUATECH, QUATECH_DSU2_100)},
106 {USB_DEVICE(USB_VENDOR_ID_QUATECH, QUATECH_DSU2_400)},
107 {USB_DEVICE(USB_VENDOR_ID_QUATECH, QUATECH_QSU2_100)},
108 {USB_DEVICE(USB_VENDOR_ID_QUATECH, QUATECH_QSU2_400)},
109 {USB_DEVICE(USB_VENDOR_ID_QUATECH, QUATECH_ESU2_100)},
110 {USB_DEVICE(USB_VENDOR_ID_QUATECH, QUATECH_ESU2_400)},
111 {} /* Terminating entry */
112};
113MODULE_DEVICE_TABLE(usb, id_table);
114
115struct qt2_serial_private {
116 unsigned char current_port; /* current port for incoming data */
117
118 struct urb *read_urb; /* shared among all ports */
119 char read_buffer[512];
120};
121
122struct qt2_port_private {
123 bool is_open;
124 u8 device_port;
125
126 spinlock_t urb_lock;
127 bool urb_in_use;
128 struct urb *write_urb;
129 char write_buffer[QT2_WRITE_BUFFER_SIZE];
130
131 spinlock_t lock;
132 u8 shadowLSR;
133 u8 shadowMSR;
134
135 wait_queue_head_t delta_msr_wait; /* Used for TIOCMIWAIT */
136 struct async_icount icount;
137
138 struct usb_serial_port *port;
139};
140
141static void qt2_update_lsr(struct usb_serial_port *port, unsigned char *ch);
142static void qt2_update_msr(struct usb_serial_port *port, unsigned char *ch);
143static void qt2_write_bulk_callback(struct urb *urb);
144static void qt2_read_bulk_callback(struct urb *urb);
145
146static void qt2_release(struct usb_serial *serial)
147{
148 int i;
149
150 kfree(usb_get_serial_data(serial));
151
152 for (i = 0; i < serial->num_ports; i++)
153 kfree(usb_get_serial_port_data(serial->port[i]));
154}
155
156static inline int calc_baud_divisor(int baudrate)
157{
158 int divisor, rem;
159
160 divisor = MAX_BAUD_RATE / baudrate;
161 rem = MAX_BAUD_RATE % baudrate;
162 /* Round to nearest divisor */
163 if (((rem * 2) >= baudrate) && (baudrate != 110))
164 divisor++;
165
166 return divisor;
167}
168
169static inline int qt2_set_port_config(struct usb_device *dev,
170 unsigned char port_number,
171 u16 baudrate, u16 lcr)
172{
173 int divisor = calc_baud_divisor(baudrate);
174 u16 index = ((u16) (lcr << 8) | (u16) (port_number));
175
176 return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
177 QT2_GET_SET_UART, 0x40,
178 divisor, index, NULL, 0, QT2_USB_TIMEOUT);
179}
180
181static inline int qt2_control_msg(struct usb_device *dev,
182 u8 request, u16 data, u16 index)
183{
184 return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
185 request, 0x40, data, index,
186 NULL, 0, QT2_USB_TIMEOUT);
187}
188
189static inline int qt2_setdevice(struct usb_device *dev, u8 *data)
190{
191 u16 x = ((u16) (data[1] << 8) | (u16) (data[0]));
192
193 return qt2_control_msg(dev, QT_SET_GET_DEVICE, x, 0);
194}
195
196
197static inline int qt2_getdevice(struct usb_device *dev, u8 *data)
198{
199 return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
200 QT_SET_GET_DEVICE, 0xc0, 0, 0,
201 data, 3, QT2_USB_TIMEOUT);
202}
203
204static inline int qt2_getregister(struct usb_device *dev,
205 u8 uart,
206 u8 reg,
207 u8 *data)
208{
209 return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
210 QT_SET_GET_REGISTER, 0xc0, reg,
211 uart, data, sizeof(*data), QT2_USB_TIMEOUT);
212
213}
214
215static inline int qt2_setregister(struct usb_device *dev,
216 u8 uart, u8 reg, u16 data)
217{
218 u16 value = (data << 8) | reg;
219
220 return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
221 QT_SET_GET_REGISTER, 0x40, value, uart,
222 NULL, 0, QT2_USB_TIMEOUT);
223}
224
225static inline int update_mctrl(struct qt2_port_private *port_priv,
226 unsigned int set, unsigned int clear)
227{
228 struct usb_serial_port *port = port_priv->port;
229 struct usb_device *dev = port->serial->dev;
230 unsigned urb_value;
231 int status;
232
233 if (((set | clear) & (TIOCM_DTR | TIOCM_RTS)) == 0) {
234 dev_dbg(&port->dev,
235 "update_mctrl - DTR|RTS not being set|cleared\n");
236 return 0; /* no change */
237 }
238
239 clear &= ~set; /* 'set' takes precedence over 'clear' */
240 urb_value = 0;
241 if (set & TIOCM_DTR)
242 urb_value |= UART_MCR_DTR;
243 if (set & TIOCM_RTS)
244 urb_value |= UART_MCR_RTS;
245
246 status = qt2_setregister(dev, port_priv->device_port, UART_MCR,
247 urb_value);
248 if (status < 0)
249 dev_err(&port->dev,
250 "update_mctrl - Error from MODEM_CTRL urb: %i\n",
251 status);
252 return status;
253}
254
255static int qt2_calc_num_ports(struct usb_serial *serial)
256{
257 struct qt2_device_detail d;
258 int i;
259
260 for (i = 0; d = qt2_device_details[i], d.product_id != 0; i++) {
261 if (d.product_id == le16_to_cpu(serial->dev->descriptor.idProduct))
262 return d.num_ports;
263 }
264
265 /* we didn't recognize the device */
266 dev_err(&serial->dev->dev,
267 "don't know the number of ports, assuming 1\n");
268
269 return 1;
270}
271
272static void qt2_set_termios(struct tty_struct *tty,
273 struct usb_serial_port *port,
274 struct ktermios *old_termios)
275{
276 struct usb_device *dev = port->serial->dev;
277 struct qt2_port_private *port_priv;
278 struct ktermios *termios = tty->termios;
279 u16 baud;
280 unsigned int cflag = termios->c_cflag;
281 u16 new_lcr = 0;
282 int status;
283
284 port_priv = usb_get_serial_port_data(port);
285
286 if (cflag & PARENB) {
287 if (cflag & PARODD)
288 new_lcr |= UART_LCR_PARITY;
289 else
290 new_lcr |= SERIAL_EVEN_PARITY;
291 }
292
293 switch (cflag & CSIZE) {
294 case CS5:
295 new_lcr |= UART_LCR_WLEN5;
296 break;
297 case CS6:
298 new_lcr |= UART_LCR_WLEN6;
299 break;
300 case CS7:
301 new_lcr |= UART_LCR_WLEN7;
302 break;
303 default:
304 case CS8:
305 new_lcr |= UART_LCR_WLEN8;
306 break;
307 }
308
309 baud = tty_get_baud_rate(tty);
310 if (!baud)
311 baud = 9600;
312
313 status = qt2_set_port_config(dev, port_priv->device_port, baud,
314 new_lcr);
315 if (status < 0)
316 dev_err(&port->dev, "%s - qt2_set_port_config failed: %i\n",
317 __func__, status);
318
319 if (cflag & CRTSCTS)
320 status = qt2_control_msg(dev, QT_HW_FLOW_CONTROL_MASK,
321 SERIAL_CRTSCTS,
322 port_priv->device_port);
323 else
324 status = qt2_control_msg(dev, QT_HW_FLOW_CONTROL_MASK,
325 0, port_priv->device_port);
326 if (status < 0)
327 dev_err(&port->dev, "%s - set HW flow control failed: %i\n",
328 __func__, status);
329
330 if (I_IXOFF(tty) || I_IXON(tty)) {
331 u16 x = ((u16) (START_CHAR(tty) << 8) | (u16) (STOP_CHAR(tty)));
332
333 status = qt2_control_msg(dev, QT_SW_FLOW_CONTROL_MASK,
334 x, port_priv->device_port);
335 } else
336 status = qt2_control_msg(dev, QT_SW_FLOW_CONTROL_MASK,
337 0, port_priv->device_port);
338
339 if (status < 0)
340 dev_err(&port->dev, "%s - set SW flow control failed: %i\n",
341 __func__, status);
342
343}
344
345static int qt2_open(struct tty_struct *tty, struct usb_serial_port *port)
346{
347 struct usb_serial *serial;
348 struct qt2_serial_private *serial_priv;
349 struct qt2_port_private *port_priv;
350 u8 *data;
351 u16 device_port;
352 int status;
353 unsigned long flags;
354
355 device_port = (u16) (port->number - port->serial->minor);
356
357 serial = port->serial;
358
359 port_priv = usb_get_serial_port_data(port);
360 serial_priv = usb_get_serial_data(serial);
361
362 /* set the port to RS232 mode */
363 status = qt2_control_msg(serial->dev, QT2_GET_SET_QMCR,
364 QT2_QMCR_RS232, device_port);
365 if (status < 0) {
366 dev_err(&port->dev,
367 "%s failed to set RS232 mode for port %i error %i\n",
368 __func__, device_port, status);
369 return status;
370 }
371
372 data = kzalloc(2, GFP_KERNEL);
373 if (!data)
374 return -ENOMEM;
375
376 /* open the port */
377 status = usb_control_msg(serial->dev,
378 usb_rcvctrlpipe(serial->dev, 0),
379 QT_OPEN_CLOSE_CHANNEL,
380 0xc0, 0,
381 device_port, data, 2, QT2_USB_TIMEOUT);
382
383 if (status < 0) {
384 dev_err(&port->dev, "%s - open port failed %i", __func__,
385 status);
386 kfree(data);
387 return status;
388 }
389
390 spin_lock_irqsave(&port_priv->lock, flags);
391 port_priv->shadowLSR = data[0];
392 port_priv->shadowMSR = data[1];
393 spin_unlock_irqrestore(&port_priv->lock, flags);
394
395 kfree(data);
396
397 /* set to default speed and 8bit word size */
398 status = qt2_set_port_config(serial->dev, device_port,
399 DEFAULT_BAUD_RATE, UART_LCR_WLEN8);
400 if (status < 0) {
401 dev_err(&port->dev,
402 "%s - initial setup failed for port %i (%i)\n",
403 __func__, port->number, device_port);
404 return status;
405 }
406
407 port_priv->is_open = true;
408 port_priv->device_port = (u8) device_port;
409
410 if (tty)
411 qt2_set_termios(tty, port, tty->termios);
412
413 return 0;
414
415}
416
417static void qt2_close(struct usb_serial_port *port)
418{
419 struct usb_serial *serial;
420 struct qt2_serial_private *serial_priv;
421 struct qt2_port_private *port_priv;
422 unsigned long flags;
423 int i;
424
425 serial = port->serial;
426 serial_priv = usb_get_serial_data(serial);
427 port_priv = usb_get_serial_port_data(port);
428
429 port_priv->is_open = false;
430
431 spin_lock_irqsave(&port_priv->urb_lock, flags);
432 if (port_priv->write_urb->status == -EINPROGRESS)
433 usb_kill_urb(port_priv->write_urb);
434 port_priv->urb_in_use = false;
435 spin_unlock_irqrestore(&port_priv->urb_lock, flags);
436
437 /* flush the port transmit buffer */
438 i = usb_control_msg(serial->dev,
439 usb_rcvctrlpipe(serial->dev, 0),
440 QT2_FLUSH_DEVICE, 0x40, 1,
441 port_priv->device_port, NULL, 0, QT2_USB_TIMEOUT);
442
443 if (i < 0)
444 dev_err(&port->dev, "%s - transmit buffer flush failed: %i\n",
445 __func__, i);
446
447 /* flush the port receive buffer */
448 i = usb_control_msg(serial->dev,
449 usb_rcvctrlpipe(serial->dev, 0),
450 QT2_FLUSH_DEVICE, 0x40, 0,
451 port_priv->device_port, NULL, 0, QT2_USB_TIMEOUT);
452
453 if (i < 0)
454 dev_err(&port->dev, "%s - receive buffer flush failed: %i\n",
455 __func__, i);
456
457 /* close the port */
458 i = usb_control_msg(serial->dev,
459 usb_sndctrlpipe(serial->dev, 0),
460 QT_OPEN_CLOSE_CHANNEL,
461 0x40, 0,
462 port_priv->device_port, NULL, 0, QT2_USB_TIMEOUT);
463
464 if (i < 0)
465 dev_err(&port->dev, "%s - close port failed %i\n",
466 __func__, i);
467
468}
469
470static void qt2_disconnect(struct usb_serial *serial)
471{
472 struct qt2_serial_private *serial_priv = usb_get_serial_data(serial);
473 struct qt2_port_private *port_priv;
474 int i;
475
476 if (serial_priv->read_urb->status == -EINPROGRESS)
477 usb_kill_urb(serial_priv->read_urb);
478
479 usb_free_urb(serial_priv->read_urb);
480
481 for (i = 0; i < serial->num_ports; i++) {
482 port_priv = usb_get_serial_port_data(serial->port[i]);
483
484 if (port_priv->write_urb->status == -EINPROGRESS)
485 usb_kill_urb(port_priv->write_urb);
486 usb_free_urb(port_priv->write_urb);
487 }
488}
489
490static int get_serial_info(struct usb_serial_port *port,
491 struct serial_struct __user *retinfo)
492{
493 struct serial_struct tmp;
494
495 if (!retinfo)
496 return -EFAULT;
497
498 memset(&tmp, 0, sizeof(tmp));
499 tmp.line = port->serial->minor;
500 tmp.port = 0;
501 tmp.irq = 0;
502 tmp.flags = ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ;
503 tmp.xmit_fifo_size = port->bulk_out_size;
504 tmp.baud_base = 9600;
505 tmp.close_delay = 5*HZ;
506 tmp.closing_wait = 30*HZ;
507
508 if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
509 return -EFAULT;
510 return 0;
511}
512
513static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
514{
515 struct qt2_port_private *priv = usb_get_serial_port_data(port);
516 struct async_icount prev, cur;
517 unsigned long flags;
518
519 spin_lock_irqsave(&priv->lock, flags);
520 prev = priv->icount;
521 spin_unlock_irqrestore(&priv->lock, flags);
522
523 while (1) {
524 wait_event_interruptible(priv->delta_msr_wait,
525 ((priv->icount.rng != prev.rng) ||
526 (priv->icount.dsr != prev.dsr) ||
527 (priv->icount.dcd != prev.dcd) ||
528 (priv->icount.cts != prev.cts)));
529
530 if (signal_pending(current))
531 return -ERESTARTSYS;
532
533 spin_lock_irqsave(&priv->lock, flags);
534 cur = priv->icount;
535 spin_unlock_irqrestore(&priv->lock, flags);
536
537 if ((prev.rng == cur.rng) &&
538 (prev.dsr == cur.dsr) &&
539 (prev.dcd == cur.dcd) &&
540 (prev.cts == cur.cts))
541 return -EIO;
542
543 if ((arg & TIOCM_RNG && (prev.rng != cur.rng)) ||
544 (arg & TIOCM_DSR && (prev.dsr != cur.dsr)) ||
545 (arg & TIOCM_CD && (prev.dcd != cur.dcd)) ||
546 (arg & TIOCM_CTS && (prev.cts != cur.cts)))
547 return 0;
548 }
549 return 0;
550}
551
552static int qt2_get_icount(struct tty_struct *tty,
553 struct serial_icounter_struct *icount)
554{
555 struct usb_serial_port *port = tty->driver_data;
556 struct qt2_port_private *priv = usb_get_serial_port_data(port);
557 struct async_icount cnow = priv->icount;
558
559 icount->cts = cnow.cts;
560 icount->dsr = cnow.dsr;
561 icount->rng = cnow.rng;
562 icount->dcd = cnow.dcd;
563 icount->rx = cnow.rx;
564 icount->tx = cnow.tx;
565 icount->frame = cnow.frame;
566 icount->overrun = cnow.overrun;
567 icount->parity = cnow.parity;
568 icount->brk = cnow.brk;
569 icount->buf_overrun = cnow.buf_overrun;
570
571 return 0;
572}
573
574static int qt2_ioctl(struct tty_struct *tty,
575 unsigned int cmd, unsigned long arg)
576{
577 struct usb_serial_port *port = tty->driver_data;
578
579 switch (cmd) {
580 case TIOCGSERIAL:
581 return get_serial_info(port,
582 (struct serial_struct __user *)arg);
583
584 case TIOCMIWAIT:
585 return wait_modem_info(port, arg);
586
587 default:
588 break;
589 }
590
591 return -ENOIOCTLCMD;
592}
593
594static void qt2_process_status(struct usb_serial_port *port, unsigned char *ch)
595{
596 switch (*ch) {
597 case QT2_LINE_STATUS:
598 qt2_update_lsr(port, ch + 1);
599 break;
600 case QT2_MODEM_STATUS:
601 qt2_update_msr(port, ch + 1);
602 break;
603 }
604}
605
606/* not needed, kept to document functionality */
607static void qt2_process_xmit_empty(struct usb_serial_port *port,
608 unsigned char *ch)
609{
610 int bytes_written;
611
612 bytes_written = (int)(*ch) + (int)(*(ch + 1) << 4);
613}
614
615/* not needed, kept to document functionality */
616static void qt2_process_flush(struct usb_serial_port *port, unsigned char *ch)
617{
618 return;
619}
620
621void qt2_process_read_urb(struct urb *urb)
622{
623 struct usb_serial *serial;
624 struct qt2_serial_private *serial_priv;
625 struct usb_serial_port *port;
626 struct qt2_port_private *port_priv;
627 struct tty_struct *tty;
628 bool escapeflag;
629 unsigned char *ch;
630 int i;
631 unsigned char newport;
632 int len = urb->actual_length;
633
634 if (!len)
635 return;
636
637 ch = urb->transfer_buffer;
638 tty = NULL;
639 serial = urb->context;
640 serial_priv = usb_get_serial_data(serial);
641 port = serial->port[serial_priv->current_port];
642 port_priv = usb_get_serial_port_data(port);
643
644 if (port_priv->is_open)
645 tty = tty_port_tty_get(&port->port);
646
647 for (i = 0; i < urb->actual_length; i++) {
648 ch = (unsigned char *)urb->transfer_buffer + i;
649 if ((i <= (len - 3)) &&
650 (*ch == QT2_CONTROL_BYTE) &&
651 (*(ch + 1) == QT2_CONTROL_BYTE)) {
652 escapeflag = false;
653 switch (*(ch + 2)) {
654 case QT2_LINE_STATUS:
655 case QT2_MODEM_STATUS:
656 if (i > (len - 4)) {
657 dev_warn(&port->dev,
658 "%s - status message too short\n",
659 __func__);
660 break;
661 }
662 qt2_process_status(port, ch + 2);
663 i += 3;
664 escapeflag = true;
665 break;
666 case QT2_XMIT_HOLD:
667 if (i > (len - 5)) {
668 dev_warn(&port->dev,
669 "%s - xmit_empty message too short\n",
670 __func__);
671 break;
672 }
673 qt2_process_xmit_empty(port, ch + 3);
674 i += 4;
675 escapeflag = true;
676 break;
677 case QT2_CHANGE_PORT:
678 if (i > (len - 4)) {
679 dev_warn(&port->dev,
680 "%s - change_port message too short\n",
681 __func__);
682 break;
683 }
684 if (tty) {
685 tty_flip_buffer_push(tty);
686 tty_kref_put(tty);
687 }
688
689 newport = *(ch + 3);
690
691 if (newport > serial->num_ports) {
692 dev_err(&port->dev,
693 "%s - port change to invalid port: %i\n",
694 __func__, newport);
695 break;
696 }
697
698 serial_priv->current_port = newport;
699 port = serial->port[serial_priv->current_port];
700 port_priv = usb_get_serial_port_data(port);
701 if (port_priv->is_open)
702 tty = tty_port_tty_get(&port->port);
703 else
704 tty = NULL;
705 i += 3;
706 escapeflag = true;
707 break;
708 case QT2_REC_FLUSH:
709 case QT2_XMIT_FLUSH:
710 qt2_process_flush(port, ch + 2);
711 i += 2;
712 escapeflag = true;
713 break;
714 case QT2_CONTROL_ESCAPE:
715 tty_buffer_request_room(tty, 2);
716 tty_insert_flip_string(tty, ch, 2);
717 i += 2;
718 escapeflag = true;
719 break;
720 default:
721 dev_warn(&port->dev,
722 "%s - unsupported command %i\n",
723 __func__, *(ch + 2));
724 break;
725 }
726 if (escapeflag)
727 continue;
728 }
729
730 if (tty) {
731 tty_buffer_request_room(tty, 1);
732 tty_insert_flip_string(tty, ch, 1);
733 }
734 }
735
736 if (tty) {
737 tty_flip_buffer_push(tty);
738 tty_kref_put(tty);
739 }
740}
741
742static void qt2_write_bulk_callback(struct urb *urb)
743{
744 struct usb_serial_port *port;
745 struct qt2_port_private *port_priv;
746
747 port = urb->context;
748 port_priv = usb_get_serial_port_data(port);
749
750 spin_lock(&port_priv->urb_lock);
751
752 port_priv->urb_in_use = false;
753 usb_serial_port_softint(port);
754
755 spin_unlock(&port_priv->urb_lock);
756
757}
758
759static void qt2_read_bulk_callback(struct urb *urb)
760{
761 struct usb_serial *serial = urb->context;
762 int status;
763
764 if (urb->status) {
765 dev_warn(&serial->dev->dev,
766 "%s - non-zero urb status: %i\n", __func__,
767 urb->status);
768 return;
769 }
770
771 qt2_process_read_urb(urb);
772
773 status = usb_submit_urb(urb, GFP_ATOMIC);
774 if (status != 0)
775 dev_err(&serial->dev->dev,
776 "%s - resubmit read urb failed: %i\n",
777 __func__, status);
778}
779
780static int qt2_setup_urbs(struct usb_serial *serial)
781{
782 struct usb_serial_port *port;
783 struct usb_serial_port *port0;
784 struct qt2_serial_private *serial_priv;
785 struct qt2_port_private *port_priv;
786 int pcount, status;
787
788 port0 = serial->port[0];
789
790 serial_priv = usb_get_serial_data(serial);
791 serial_priv->read_urb = usb_alloc_urb(0, GFP_KERNEL);
792 if (!serial_priv->read_urb) {
793 dev_err(&serial->dev->dev, "No free urbs available\n");
794 return -ENOMEM;
795 }
796
797 usb_fill_bulk_urb(serial_priv->read_urb, serial->dev,
798 usb_rcvbulkpipe(serial->dev,
799 port0->bulk_in_endpointAddress),
800 serial_priv->read_buffer,
801 sizeof(serial_priv->read_buffer),
802 qt2_read_bulk_callback, serial);
803
804 /* setup write_urb for each port */
805 for (pcount = 0; pcount < serial->num_ports; pcount++) {
806
807 port = serial->port[pcount];
808 port_priv = usb_get_serial_port_data(port);
809
810 port_priv->write_urb = usb_alloc_urb(0, GFP_KERNEL);
811 if (!port_priv->write_urb) {
812 dev_err(&serial->dev->dev,
813 "failed to alloc write_urb for port %i\n",
814 pcount);
815 return -ENOMEM;
816 }
817
818 usb_fill_bulk_urb(port_priv->write_urb,
819 serial->dev,
820 usb_sndbulkpipe(serial->dev,
821 port0->
822 bulk_out_endpointAddress),
823 port_priv->write_buffer,
824 sizeof(port_priv->write_buffer),
825 qt2_write_bulk_callback, port);
826 }
827
828 status = usb_submit_urb(serial_priv->read_urb, GFP_KERNEL);
829 if (status != 0) {
830 dev_err(&serial->dev->dev,
831 "%s - submit read urb failed %i\n", __func__, status);
832 return status;
833 }
834
835 return 0;
836
837}
838
839static int qt2_attach(struct usb_serial *serial)
840{
841 struct qt2_serial_private *serial_priv;
842 struct qt2_port_private *port_priv;
843 int status, pcount;
844
845 /* power on unit */
846 status = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
847 0xc2, 0x40, 0x8000, 0, NULL, 0,
848 QT2_USB_TIMEOUT);
849 if (status < 0) {
850 dev_err(&serial->dev->dev,
851 "%s - failed to power on unit: %i\n", __func__, status);
852 return status;
853 }
854
855 serial_priv = kzalloc(sizeof(*serial_priv), GFP_KERNEL);
856 if (!serial_priv) {
857 dev_err(&serial->dev->dev, "%s - Out of memory\n", __func__);
858 return -ENOMEM;
859 }
860
861 usb_set_serial_data(serial, serial_priv);
862
863 for (pcount = 0; pcount < serial->num_ports; pcount++) {
864 port_priv = kzalloc(sizeof(*port_priv), GFP_KERNEL);
865 if (!port_priv) {
866 dev_err(&serial->dev->dev,
867 "%s- kmalloc(%Zd) failed.\n", __func__,
868 sizeof(*port_priv));
869 pcount--;
870 status = -ENOMEM;
871 goto attach_failed;
872 }
873
874 spin_lock_init(&port_priv->lock);
875 spin_lock_init(&port_priv->urb_lock);
876 init_waitqueue_head(&port_priv->delta_msr_wait);
877
878 port_priv->port = serial->port[pcount];
879
880 usb_set_serial_port_data(serial->port[pcount], port_priv);
881 }
882
883 status = qt2_setup_urbs(serial);
884 if (status != 0)
885 goto attach_failed;
886
887 return 0;
888
889attach_failed:
890 for (/* empty */; pcount >= 0; pcount--) {
891 port_priv = usb_get_serial_port_data(serial->port[pcount]);
892 kfree(port_priv);
893 }
894 kfree(serial_priv);
895 return status;
896}
897
898static int qt2_tiocmget(struct tty_struct *tty)
899{
900 struct usb_serial_port *port = tty->driver_data;
901 struct usb_device *dev = port->serial->dev;
902 struct qt2_port_private *port_priv = usb_get_serial_port_data(port);
903 u8 *d;
904 int r;
905
906 d = kzalloc(2, GFP_KERNEL);
907 if (!d)
908 return -ENOMEM;
909
910 r = qt2_getregister(dev, port_priv->device_port, UART_MCR, d);
911 if (r < 0)
912 goto mget_out;
913
914 r = qt2_getregister(dev, port_priv->device_port, UART_MSR, d + 1);
915 if (r < 0)
916 goto mget_out;
917
918 r = (d[0] & UART_MCR_DTR ? TIOCM_DTR : 0) |
919 (d[0] & UART_MCR_RTS ? TIOCM_RTS : 0) |
920 (d[1] & UART_MSR_CTS ? TIOCM_CTS : 0) |
921 (d[1] & UART_MSR_DCD ? TIOCM_CAR : 0) |
922 (d[1] & UART_MSR_RI ? TIOCM_RI : 0) |
923 (d[1] & UART_MSR_DSR ? TIOCM_DSR : 0);
924
925mget_out:
926 kfree(d);
927 return r;
928}
929
930static int qt2_tiocmset(struct tty_struct *tty,
931 unsigned int set, unsigned int clear)
932{
933 struct qt2_port_private *port_priv;
934
935 port_priv = usb_get_serial_port_data(tty->driver_data);
936 return update_mctrl(port_priv, set, clear);
937}
938
939static void qt2_break_ctl(struct tty_struct *tty, int break_state)
940{
941 struct usb_serial_port *port = tty->driver_data;
942 struct qt2_port_private *port_priv;
943 int status;
944 u16 val;
945
946 port_priv = usb_get_serial_port_data(port);
947
948 if (!port_priv->is_open) {
949 dev_err(&port->dev,
950 "%s - port is not open\n", __func__);
951 return;
952 }
953
954 val = (break_state == -1) ? 1 : 0;
955
956 status = qt2_control_msg(port->serial->dev, QT2_BREAK_CONTROL,
957 val, port_priv->device_port);
958 if (status < 0)
959 dev_warn(&port->dev,
960 "%s - failed to send control message: %i\n", __func__,
961 status);
962}
963
964
965
966static void qt2_dtr_rts(struct usb_serial_port *port, int on)
967{
968 struct usb_device *dev = port->serial->dev;
969 struct qt2_port_private *port_priv = usb_get_serial_port_data(port);
970
971 mutex_lock(&port->serial->disc_mutex);
972 if (!port->serial->disconnected) {
973 /* Disable flow control */
974 if (!on && qt2_setregister(dev, port_priv->device_port,
975 UART_MCR, 0) < 0)
976 dev_warn(&port->dev, "error from flowcontrol urb\n");
977 /* drop RTS and DTR */
978 if (on)
979 update_mctrl(port_priv, TIOCM_DTR | TIOCM_RTS, 0);
980 else
981 update_mctrl(port_priv, 0, TIOCM_DTR | TIOCM_RTS);
982 }
983 mutex_unlock(&port->serial->disc_mutex);
984}
985
986static void qt2_update_msr(struct usb_serial_port *port, unsigned char *ch)
987{
988 struct qt2_port_private *port_priv;
989 u8 newMSR = (u8) *ch;
990 unsigned long flags;
991
992 port_priv = usb_get_serial_port_data(port);
993
994 spin_lock_irqsave(&port_priv->lock, flags);
995 port_priv->shadowMSR = newMSR;
996 spin_unlock_irqrestore(&port_priv->lock, flags);
997
998 if (newMSR & UART_MSR_ANY_DELTA) {
999 /* update input line counters */
1000 if (newMSR & UART_MSR_DCTS)
1001 port_priv->icount.cts++;
1002
1003 if (newMSR & UART_MSR_DDSR)
1004 port_priv->icount.dsr++;
1005
1006 if (newMSR & UART_MSR_DDCD)
1007 port_priv->icount.dcd++;
1008
1009 if (newMSR & UART_MSR_TERI)
1010 port_priv->icount.rng++;
1011
1012 wake_up_interruptible(&port_priv->delta_msr_wait);
1013 }
1014}
1015
1016static void qt2_update_lsr(struct usb_serial_port *port, unsigned char *ch)
1017{
1018 struct qt2_port_private *port_priv;
1019 struct async_icount *icount;
1020 unsigned long flags;
1021 u8 newLSR = (u8) *ch;
1022
1023 port_priv = usb_get_serial_port_data(port);
1024
1025 if (newLSR & UART_LSR_BI)
1026 newLSR &= (u8) (UART_LSR_OE | UART_LSR_BI);
1027
1028 spin_lock_irqsave(&port_priv->lock, flags);
1029 port_priv->shadowLSR = newLSR;
1030 spin_unlock_irqrestore(&port_priv->lock, flags);
1031
1032 icount = &port_priv->icount;
1033
1034 if (newLSR & UART_LSR_BRK_ERROR_BITS) {
1035
1036 if (newLSR & UART_LSR_BI)
1037 icount->brk++;
1038
1039 if (newLSR & UART_LSR_OE)
1040 icount->overrun++;
1041
1042 if (newLSR & UART_LSR_PE)
1043 icount->parity++;
1044
1045 if (newLSR & UART_LSR_FE)
1046 icount->frame++;
1047 }
1048
1049}
1050
1051static int qt2_write_room(struct tty_struct *tty)
1052{
1053 struct usb_serial_port *port = tty->driver_data;
1054 struct qt2_port_private *port_priv;
1055 unsigned long flags = 0;
1056 int r;
1057
1058 port_priv = usb_get_serial_port_data(port);
1059
1060 spin_lock_irqsave(&port_priv->urb_lock, flags);
1061
1062 if (port_priv->urb_in_use)
1063 r = 0;
1064 else
1065 r = QT2_WRITE_BUFFER_SIZE - QT2_WRITE_CONTROL_SIZE;
1066
1067 spin_unlock_irqrestore(&port_priv->urb_lock, flags);
1068
1069 return r;
1070}
1071
1072static int qt2_write(struct tty_struct *tty,
1073 struct usb_serial_port *port,
1074 const unsigned char *buf, int count)
1075{
1076 struct qt2_port_private *port_priv;
1077 struct urb *write_urb;
1078 unsigned char *data;
1079 unsigned long flags;
1080 int status;
1081 int bytes_out = 0;
1082
1083 port_priv = usb_get_serial_port_data(port);
1084
1085 if (port_priv->write_urb == NULL) {
1086 dev_err(&port->dev, "%s - no output urb\n", __func__);
1087 return 0;
1088 }
1089 write_urb = port_priv->write_urb;
1090
1091 count = min(count, QT2_WRITE_BUFFER_SIZE - QT2_WRITE_CONTROL_SIZE);
1092
1093 data = write_urb->transfer_buffer;
1094 spin_lock_irqsave(&port_priv->urb_lock, flags);
1095 if (port_priv->urb_in_use == true) {
1096 printk(KERN_INFO "qt2_write - urb is in use\n");
1097 goto write_out;
1098 }
1099
1100 *data++ = QT2_CONTROL_BYTE;
1101 *data++ = QT2_CONTROL_BYTE;
1102 *data++ = port_priv->device_port;
1103 put_unaligned_le16(count, data);
1104 data += 2;
1105 memcpy(data, buf, count);
1106
1107 write_urb->transfer_buffer_length = count + QT2_WRITE_CONTROL_SIZE;
1108
1109 status = usb_submit_urb(write_urb, GFP_ATOMIC);
1110 if (status == 0) {
1111 port_priv->urb_in_use = true;
1112 bytes_out += count;
1113 }
1114
1115write_out:
1116 spin_unlock_irqrestore(&port_priv->urb_lock, flags);
1117 return bytes_out;
1118}
1119
1120
1121static struct usb_serial_driver qt2_device = {
1122 .driver = {
1123 .owner = THIS_MODULE,
1124 .name = "quatech-serial",
1125 },
1126 .description = DRIVER_DESC,
1127 .id_table = id_table,
1128 .open = qt2_open,
1129 .close = qt2_close,
1130 .write = qt2_write,
1131 .write_room = qt2_write_room,
1132 .calc_num_ports = qt2_calc_num_ports,
1133 .attach = qt2_attach,
1134 .release = qt2_release,
1135 .disconnect = qt2_disconnect,
1136 .dtr_rts = qt2_dtr_rts,
1137 .break_ctl = qt2_break_ctl,
1138 .tiocmget = qt2_tiocmget,
1139 .tiocmset = qt2_tiocmset,
1140 .get_icount = qt2_get_icount,
1141 .ioctl = qt2_ioctl,
1142 .set_termios = qt2_set_termios,
1143};
1144
1145static struct usb_serial_driver *const serial_drivers[] = {
1146 &qt2_device, NULL
1147};
1148
1149module_usb_serial_driver(serial_drivers, id_table);
1150
1151MODULE_DESCRIPTION(DRIVER_DESC);
1152MODULE_LICENSE("GPL");
1153
1154module_param(debug, bool, S_IRUGO | S_IWUSR);
1155MODULE_PARM_DESC(debug, "Debug enabled or not");