]> Pileus Git - ~andy/linux/blob - drivers/usb/serial/belkin_sa.c
Merge branch 'maintainers' of git://git.kernel.org/pub/scm/linux/kernel/git/horms...
[~andy/linux] / drivers / usb / serial / belkin_sa.c
1 /*
2  * Belkin USB Serial Adapter Driver
3  *
4  *  Copyright (C) 2000          William Greathouse (wgreathouse@smva.com)
5  *  Copyright (C) 2000-2001     Greg Kroah-Hartman (greg@kroah.com)
6  *  Copyright (C) 2010          Johan Hovold (jhovold@gmail.com)
7  *
8  *  This program is largely derived from work by the linux-usb group
9  *  and associated source files.  Please see the usb/serial files for
10  *  individual credits and copyrights.
11  *
12  *      This program is free software; you can redistribute it and/or modify
13  *      it under the terms of the GNU General Public License as published by
14  *      the Free Software Foundation; either version 2 of the License, or
15  *      (at your option) any later version.
16  *
17  * See Documentation/usb/usb-serial.txt for more information on using this
18  * driver
19  *
20  * TODO:
21  * -- Add true modem contol line query capability.  Currently we track the
22  *    states reported by the interrupt and the states we request.
23  * -- Add support for flush commands
24  */
25
26 #include <linux/kernel.h>
27 #include <linux/errno.h>
28 #include <linux/init.h>
29 #include <linux/slab.h>
30 #include <linux/tty.h>
31 #include <linux/tty_driver.h>
32 #include <linux/tty_flip.h>
33 #include <linux/module.h>
34 #include <linux/spinlock.h>
35 #include <linux/uaccess.h>
36 #include <linux/usb.h>
37 #include <linux/usb/serial.h>
38 #include "belkin_sa.h"
39
40 /*
41  * Version Information
42  */
43 #define DRIVER_VERSION "v1.3"
44 #define DRIVER_AUTHOR "William Greathouse <wgreathouse@smva.com>"
45 #define DRIVER_DESC "USB Belkin Serial converter driver"
46
47 /* function prototypes for a Belkin USB Serial Adapter F5U103 */
48 static int belkin_sa_port_probe(struct usb_serial_port *port);
49 static int belkin_sa_port_remove(struct usb_serial_port *port);
50 static int  belkin_sa_open(struct tty_struct *tty,
51                         struct usb_serial_port *port);
52 static void belkin_sa_close(struct usb_serial_port *port);
53 static void belkin_sa_read_int_callback(struct urb *urb);
54 static void belkin_sa_process_read_urb(struct urb *urb);
55 static void belkin_sa_set_termios(struct tty_struct *tty,
56                         struct usb_serial_port *port, struct ktermios * old);
57 static void belkin_sa_break_ctl(struct tty_struct *tty, int break_state);
58 static int  belkin_sa_tiocmget(struct tty_struct *tty);
59 static int  belkin_sa_tiocmset(struct tty_struct *tty,
60                                         unsigned int set, unsigned int clear);
61
62
63 static const struct usb_device_id id_table[] = {
64         { USB_DEVICE(BELKIN_SA_VID, BELKIN_SA_PID) },
65         { USB_DEVICE(BELKIN_OLD_VID, BELKIN_OLD_PID) },
66         { USB_DEVICE(PERACOM_VID, PERACOM_PID) },
67         { USB_DEVICE(GOHUBS_VID, GOHUBS_PID) },
68         { USB_DEVICE(GOHUBS_VID, HANDYLINK_PID) },
69         { USB_DEVICE(BELKIN_DOCKSTATION_VID, BELKIN_DOCKSTATION_PID) },
70         { }     /* Terminating entry */
71 };
72 MODULE_DEVICE_TABLE(usb, id_table);
73
74 /* All of the device info needed for the serial converters */
75 static struct usb_serial_driver belkin_device = {
76         .driver = {
77                 .owner =        THIS_MODULE,
78                 .name =         "belkin",
79         },
80         .description =          "Belkin / Peracom / GoHubs USB Serial Adapter",
81         .id_table =             id_table,
82         .num_ports =            1,
83         .open =                 belkin_sa_open,
84         .close =                belkin_sa_close,
85         .read_int_callback =    belkin_sa_read_int_callback,
86         .process_read_urb =     belkin_sa_process_read_urb,
87         .set_termios =          belkin_sa_set_termios,
88         .break_ctl =            belkin_sa_break_ctl,
89         .tiocmget =             belkin_sa_tiocmget,
90         .tiocmset =             belkin_sa_tiocmset,
91         .port_probe =           belkin_sa_port_probe,
92         .port_remove =          belkin_sa_port_remove,
93 };
94
95 static struct usb_serial_driver * const serial_drivers[] = {
96         &belkin_device, NULL
97 };
98
99 struct belkin_sa_private {
100         spinlock_t              lock;
101         unsigned long           control_state;
102         unsigned char           last_lsr;
103         unsigned char           last_msr;
104         int                     bad_flow_control;
105 };
106
107
108 /*
109  * ***************************************************************************
110  * Belkin USB Serial Adapter F5U103 specific driver functions
111  * ***************************************************************************
112  */
113
114 #define WDR_TIMEOUT 5000 /* default urb timeout */
115
116 /* assumes that struct usb_serial *serial is available */
117 #define BSA_USB_CMD(c, v) usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), \
118                                             (c), BELKIN_SA_SET_REQUEST_TYPE, \
119                                             (v), 0, NULL, 0, WDR_TIMEOUT)
120
121 static int belkin_sa_port_probe(struct usb_serial_port *port)
122 {
123         struct usb_device *dev = port->serial->dev;
124         struct belkin_sa_private *priv;
125
126         priv = kmalloc(sizeof(struct belkin_sa_private), GFP_KERNEL);
127         if (!priv)
128                 return -ENOMEM;
129
130         spin_lock_init(&priv->lock);
131         priv->control_state = 0;
132         priv->last_lsr = 0;
133         priv->last_msr = 0;
134         /* see comments at top of file */
135         priv->bad_flow_control =
136                 (le16_to_cpu(dev->descriptor.bcdDevice) <= 0x0206) ? 1 : 0;
137         dev_info(&dev->dev, "bcdDevice: %04x, bfc: %d\n",
138                                         le16_to_cpu(dev->descriptor.bcdDevice),
139                                         priv->bad_flow_control);
140
141         usb_set_serial_port_data(port, priv);
142
143         return 0;
144 }
145
146 static int belkin_sa_port_remove(struct usb_serial_port *port)
147 {
148         struct belkin_sa_private *priv;
149
150         priv = usb_get_serial_port_data(port);
151         kfree(priv);
152
153         return 0;
154 }
155
156 static int belkin_sa_open(struct tty_struct *tty,
157                                         struct usb_serial_port *port)
158 {
159         int retval;
160
161         retval = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
162         if (retval) {
163                 dev_err(&port->dev, "usb_submit_urb(read int) failed\n");
164                 return retval;
165         }
166
167         retval = usb_serial_generic_open(tty, port);
168         if (retval)
169                 usb_kill_urb(port->interrupt_in_urb);
170
171         return retval;
172 }
173
174 static void belkin_sa_close(struct usb_serial_port *port)
175 {
176         usb_serial_generic_close(port);
177         usb_kill_urb(port->interrupt_in_urb);
178 }
179
180 static void belkin_sa_read_int_callback(struct urb *urb)
181 {
182         struct usb_serial_port *port = urb->context;
183         struct belkin_sa_private *priv;
184         unsigned char *data = urb->transfer_buffer;
185         int retval;
186         int status = urb->status;
187         unsigned long flags;
188
189         switch (status) {
190         case 0:
191                 /* success */
192                 break;
193         case -ECONNRESET:
194         case -ENOENT:
195         case -ESHUTDOWN:
196                 /* this urb is terminated, clean up */
197                 dev_dbg(&port->dev, "%s - urb shutting down with status: %d\n",
198                         __func__, status);
199                 return;
200         default:
201                 dev_dbg(&port->dev, "%s - nonzero urb status received: %d\n",
202                         __func__, status);
203                 goto exit;
204         }
205
206         usb_serial_debug_data(&port->dev, __func__, urb->actual_length, data);
207
208         /* Handle known interrupt data */
209         /* ignore data[0] and data[1] */
210
211         priv = usb_get_serial_port_data(port);
212         spin_lock_irqsave(&priv->lock, flags);
213         priv->last_msr = data[BELKIN_SA_MSR_INDEX];
214
215         /* Record Control Line states */
216         if (priv->last_msr & BELKIN_SA_MSR_DSR)
217                 priv->control_state |= TIOCM_DSR;
218         else
219                 priv->control_state &= ~TIOCM_DSR;
220
221         if (priv->last_msr & BELKIN_SA_MSR_CTS)
222                 priv->control_state |= TIOCM_CTS;
223         else
224                 priv->control_state &= ~TIOCM_CTS;
225
226         if (priv->last_msr & BELKIN_SA_MSR_RI)
227                 priv->control_state |= TIOCM_RI;
228         else
229                 priv->control_state &= ~TIOCM_RI;
230
231         if (priv->last_msr & BELKIN_SA_MSR_CD)
232                 priv->control_state |= TIOCM_CD;
233         else
234                 priv->control_state &= ~TIOCM_CD;
235
236         priv->last_lsr = data[BELKIN_SA_LSR_INDEX];
237         spin_unlock_irqrestore(&priv->lock, flags);
238 exit:
239         retval = usb_submit_urb(urb, GFP_ATOMIC);
240         if (retval)
241                 dev_err(&port->dev, "%s - usb_submit_urb failed with "
242                         "result %d\n", __func__, retval);
243 }
244
245 static void belkin_sa_process_read_urb(struct urb *urb)
246 {
247         struct usb_serial_port *port = urb->context;
248         struct belkin_sa_private *priv = usb_get_serial_port_data(port);
249         struct tty_struct *tty;
250         unsigned char *data = urb->transfer_buffer;
251         unsigned long flags;
252         unsigned char status;
253         char tty_flag;
254
255         /* Update line status */
256         tty_flag = TTY_NORMAL;
257
258         spin_lock_irqsave(&priv->lock, flags);
259         status = priv->last_lsr;
260         priv->last_lsr &= ~BELKIN_SA_LSR_ERR;
261         spin_unlock_irqrestore(&priv->lock, flags);
262
263         if (!urb->actual_length)
264                 return;
265
266         tty = tty_port_tty_get(&port->port);
267         if (!tty)
268                 return;
269
270         if (status & BELKIN_SA_LSR_ERR) {
271                 /* Break takes precedence over parity, which takes precedence
272                  * over framing errors. */
273                 if (status & BELKIN_SA_LSR_BI)
274                         tty_flag = TTY_BREAK;
275                 else if (status & BELKIN_SA_LSR_PE)
276                         tty_flag = TTY_PARITY;
277                 else if (status & BELKIN_SA_LSR_FE)
278                         tty_flag = TTY_FRAME;
279                 dev_dbg(&port->dev, "tty_flag = %d\n", tty_flag);
280
281                 /* Overrun is special, not associated with a char. */
282                 if (status & BELKIN_SA_LSR_OE)
283                         tty_insert_flip_char(tty, 0, TTY_OVERRUN);
284         }
285
286         tty_insert_flip_string_fixed_flag(tty, data, tty_flag,
287                                                         urb->actual_length);
288         tty_flip_buffer_push(tty);
289         tty_kref_put(tty);
290 }
291
292 static void belkin_sa_set_termios(struct tty_struct *tty,
293                 struct usb_serial_port *port, struct ktermios *old_termios)
294 {
295         struct usb_serial *serial = port->serial;
296         struct belkin_sa_private *priv = usb_get_serial_port_data(port);
297         unsigned int iflag;
298         unsigned int cflag;
299         unsigned int old_iflag = 0;
300         unsigned int old_cflag = 0;
301         __u16 urb_value = 0; /* Will hold the new flags */
302         unsigned long flags;
303         unsigned long control_state;
304         int bad_flow_control;
305         speed_t baud;
306         struct ktermios *termios = &tty->termios;
307
308         iflag = termios->c_iflag;
309         cflag = termios->c_cflag;
310
311         termios->c_cflag &= ~CMSPAR;
312
313         /* get a local copy of the current port settings */
314         spin_lock_irqsave(&priv->lock, flags);
315         control_state = priv->control_state;
316         bad_flow_control = priv->bad_flow_control;
317         spin_unlock_irqrestore(&priv->lock, flags);
318
319         old_iflag = old_termios->c_iflag;
320         old_cflag = old_termios->c_cflag;
321
322         /* Set the baud rate */
323         if ((cflag & CBAUD) != (old_cflag & CBAUD)) {
324                 /* reassert DTR and (maybe) RTS on transition from B0 */
325                 if ((old_cflag & CBAUD) == B0) {
326                         control_state |= (TIOCM_DTR|TIOCM_RTS);
327                         if (BSA_USB_CMD(BELKIN_SA_SET_DTR_REQUEST, 1) < 0)
328                                 dev_err(&port->dev, "Set DTR error\n");
329                         /* don't set RTS if using hardware flow control */
330                         if (!(old_cflag & CRTSCTS))
331                                 if (BSA_USB_CMD(BELKIN_SA_SET_RTS_REQUEST
332                                                                 , 1) < 0)
333                                         dev_err(&port->dev, "Set RTS error\n");
334                 }
335         }
336
337         baud = tty_get_baud_rate(tty);
338         if (baud) {
339                 urb_value = BELKIN_SA_BAUD(baud);
340                 /* Clip to maximum speed */
341                 if (urb_value == 0)
342                         urb_value = 1;
343                 /* Turn it back into a resulting real baud rate */
344                 baud = BELKIN_SA_BAUD(urb_value);
345
346                 /* Report the actual baud rate back to the caller */
347                 tty_encode_baud_rate(tty, baud, baud);
348                 if (BSA_USB_CMD(BELKIN_SA_SET_BAUDRATE_REQUEST, urb_value) < 0)
349                         dev_err(&port->dev, "Set baudrate error\n");
350         } else {
351                 /* Disable flow control */
352                 if (BSA_USB_CMD(BELKIN_SA_SET_FLOW_CTRL_REQUEST,
353                                                 BELKIN_SA_FLOW_NONE) < 0)
354                         dev_err(&port->dev, "Disable flowcontrol error\n");
355                 /* Drop RTS and DTR */
356                 control_state &= ~(TIOCM_DTR | TIOCM_RTS);
357                 if (BSA_USB_CMD(BELKIN_SA_SET_DTR_REQUEST, 0) < 0)
358                         dev_err(&port->dev, "DTR LOW error\n");
359                 if (BSA_USB_CMD(BELKIN_SA_SET_RTS_REQUEST, 0) < 0)
360                         dev_err(&port->dev, "RTS LOW error\n");
361         }
362
363         /* set the parity */
364         if ((cflag ^ old_cflag) & (PARENB | PARODD)) {
365                 if (cflag & PARENB)
366                         urb_value = (cflag & PARODD) ?  BELKIN_SA_PARITY_ODD
367                                                 : BELKIN_SA_PARITY_EVEN;
368                 else
369                         urb_value = BELKIN_SA_PARITY_NONE;
370                 if (BSA_USB_CMD(BELKIN_SA_SET_PARITY_REQUEST, urb_value) < 0)
371                         dev_err(&port->dev, "Set parity error\n");
372         }
373
374         /* set the number of data bits */
375         if ((cflag & CSIZE) != (old_cflag & CSIZE)) {
376                 switch (cflag & CSIZE) {
377                 case CS5:
378                         urb_value = BELKIN_SA_DATA_BITS(5);
379                         break;
380                 case CS6:
381                         urb_value = BELKIN_SA_DATA_BITS(6);
382                         break;
383                 case CS7:
384                         urb_value = BELKIN_SA_DATA_BITS(7);
385                         break;
386                 case CS8:
387                         urb_value = BELKIN_SA_DATA_BITS(8);
388                         break;
389                 default:
390                         dev_dbg(&port->dev,
391                                 "CSIZE was not CS5-CS8, using default of 8\n");
392                         urb_value = BELKIN_SA_DATA_BITS(8);
393                         break;
394                 }
395                 if (BSA_USB_CMD(BELKIN_SA_SET_DATA_BITS_REQUEST, urb_value) < 0)
396                         dev_err(&port->dev, "Set data bits error\n");
397         }
398
399         /* set the number of stop bits */
400         if ((cflag & CSTOPB) != (old_cflag & CSTOPB)) {
401                 urb_value = (cflag & CSTOPB) ? BELKIN_SA_STOP_BITS(2)
402                                                 : BELKIN_SA_STOP_BITS(1);
403                 if (BSA_USB_CMD(BELKIN_SA_SET_STOP_BITS_REQUEST,
404                                                         urb_value) < 0)
405                         dev_err(&port->dev, "Set stop bits error\n");
406         }
407
408         /* Set flow control */
409         if (((iflag ^ old_iflag) & (IXOFF | IXON)) ||
410                 ((cflag ^ old_cflag) & CRTSCTS)) {
411                 urb_value = 0;
412                 if ((iflag & IXOFF) || (iflag & IXON))
413                         urb_value |= (BELKIN_SA_FLOW_OXON | BELKIN_SA_FLOW_IXON);
414                 else
415                         urb_value &= ~(BELKIN_SA_FLOW_OXON | BELKIN_SA_FLOW_IXON);
416
417                 if (cflag & CRTSCTS)
418                         urb_value |=  (BELKIN_SA_FLOW_OCTS | BELKIN_SA_FLOW_IRTS);
419                 else
420                         urb_value &= ~(BELKIN_SA_FLOW_OCTS | BELKIN_SA_FLOW_IRTS);
421
422                 if (bad_flow_control)
423                         urb_value &= ~(BELKIN_SA_FLOW_IRTS);
424
425                 if (BSA_USB_CMD(BELKIN_SA_SET_FLOW_CTRL_REQUEST, urb_value) < 0)
426                         dev_err(&port->dev, "Set flow control error\n");
427         }
428
429         /* save off the modified port settings */
430         spin_lock_irqsave(&priv->lock, flags);
431         priv->control_state = control_state;
432         spin_unlock_irqrestore(&priv->lock, flags);
433 }
434
435 static void belkin_sa_break_ctl(struct tty_struct *tty, int break_state)
436 {
437         struct usb_serial_port *port = tty->driver_data;
438         struct usb_serial *serial = port->serial;
439
440         if (BSA_USB_CMD(BELKIN_SA_SET_BREAK_REQUEST, break_state ? 1 : 0) < 0)
441                 dev_err(&port->dev, "Set break_ctl %d\n", break_state);
442 }
443
444 static int belkin_sa_tiocmget(struct tty_struct *tty)
445 {
446         struct usb_serial_port *port = tty->driver_data;
447         struct belkin_sa_private *priv = usb_get_serial_port_data(port);
448         unsigned long control_state;
449         unsigned long flags;
450
451         spin_lock_irqsave(&priv->lock, flags);
452         control_state = priv->control_state;
453         spin_unlock_irqrestore(&priv->lock, flags);
454
455         return control_state;
456 }
457
458 static int belkin_sa_tiocmset(struct tty_struct *tty,
459                                unsigned int set, unsigned int clear)
460 {
461         struct usb_serial_port *port = tty->driver_data;
462         struct usb_serial *serial = port->serial;
463         struct belkin_sa_private *priv = usb_get_serial_port_data(port);
464         unsigned long control_state;
465         unsigned long flags;
466         int retval;
467         int rts = 0;
468         int dtr = 0;
469
470         spin_lock_irqsave(&priv->lock, flags);
471         control_state = priv->control_state;
472
473         if (set & TIOCM_RTS) {
474                 control_state |= TIOCM_RTS;
475                 rts = 1;
476         }
477         if (set & TIOCM_DTR) {
478                 control_state |= TIOCM_DTR;
479                 dtr = 1;
480         }
481         if (clear & TIOCM_RTS) {
482                 control_state &= ~TIOCM_RTS;
483                 rts = 0;
484         }
485         if (clear & TIOCM_DTR) {
486                 control_state &= ~TIOCM_DTR;
487                 dtr = 0;
488         }
489
490         priv->control_state = control_state;
491         spin_unlock_irqrestore(&priv->lock, flags);
492
493         retval = BSA_USB_CMD(BELKIN_SA_SET_RTS_REQUEST, rts);
494         if (retval < 0) {
495                 dev_err(&port->dev, "Set RTS error %d\n", retval);
496                 goto exit;
497         }
498
499         retval = BSA_USB_CMD(BELKIN_SA_SET_DTR_REQUEST, dtr);
500         if (retval < 0) {
501                 dev_err(&port->dev, "Set DTR error %d\n", retval);
502                 goto exit;
503         }
504 exit:
505         return retval;
506 }
507
508 module_usb_serial_driver(serial_drivers, id_table);
509
510 MODULE_AUTHOR(DRIVER_AUTHOR);
511 MODULE_DESCRIPTION(DRIVER_DESC);
512 MODULE_VERSION(DRIVER_VERSION);
513 MODULE_LICENSE("GPL");