Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
belkin_sa.c
Go to the documentation of this file.
1 /*
2  * Belkin USB Serial Adapter Driver
3  *
4  * Copyright (C) 2000 William Greathouse ([email protected])
5  * Copyright (C) 2000-2001 Greg Kroah-Hartman ([email protected])
6  * Copyright (C) 2010 Johan Hovold ([email protected])
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 <[email protected]>"
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) },
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 
101  unsigned long control_state;
102  unsigned char last_lsr;
103  unsigned char last_msr;
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)
170 
171  return retval;
172 }
173 
174 static void belkin_sa_close(struct usb_serial_port *port)
175 {
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);
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);
328  dev_err(&port->dev, "Set DTR error\n");
329  /* don't set RTS if using hardware flow control */
330  if (!(old_cflag & CRTSCTS))
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 */
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);
358  dev_err(&port->dev, "DTR LOW error\n");
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
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);
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 
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 
513 MODULE_LICENSE("GPL");