26 #include <linux/kernel.h>
27 #include <linux/errno.h>
29 #include <linux/slab.h>
30 #include <linux/tty.h>
33 #include <linux/module.h>
43 #define DRIVER_VERSION "v1.3"
45 #define DRIVER_DESC "USB Belkin Serial converter driver"
50 static int belkin_sa_open(
struct tty_struct *tty,
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,
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);
80 .description =
"Belkin / Peracom / GoHubs USB Serial Adapter",
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,
114 #define WDR_TIMEOUT 5000
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)
123 struct usb_device *
dev = port->
serial->dev;
136 (
le16_to_cpu(dev->descriptor.bcdDevice) <= 0x0206) ? 1 : 0;
137 dev_info(&dev->dev,
"bcdDevice: %04x, bfc: %d\n",
141 usb_set_serial_port_data(port, priv);
150 priv = usb_get_serial_port_data(port);
156 static int belkin_sa_open(
struct tty_struct *tty,
163 dev_err(&port->
dev,
"usb_submit_urb(read int) failed\n");
180 static void belkin_sa_read_int_callback(
struct urb *
urb)
184 unsigned char *
data = urb->transfer_buffer;
197 dev_dbg(&port->
dev,
"%s - urb shutting down with status: %d\n",
201 dev_dbg(&port->
dev,
"%s - nonzero urb status received: %d\n",
206 usb_serial_debug_data(&port->
dev, __func__, urb->actual_length, data);
211 priv = usb_get_serial_port_data(port);
237 spin_unlock_irqrestore(&priv->
lock, flags);
241 dev_err(&port->
dev,
"%s - usb_submit_urb failed with "
242 "result %d\n", __func__, retval);
245 static void belkin_sa_process_read_urb(
struct urb *urb)
250 unsigned char *data = urb->transfer_buffer;
261 spin_unlock_irqrestore(&priv->
lock, flags);
263 if (!urb->actual_length)
279 dev_dbg(&port->
dev,
"tty_flag = %d\n", tty_flag);
292 static void belkin_sa_set_termios(
struct tty_struct *tty,
299 unsigned int old_iflag = 0;
300 unsigned int old_cflag = 0;
317 spin_unlock_irqrestore(&priv->
lock, flags);
319 old_iflag = old_termios->
c_iflag;
320 old_cflag = old_termios->
c_cflag;
323 if ((cflag &
CBAUD) != (old_cflag & CBAUD)) {
325 if ((old_cflag & CBAUD) ==
B0) {
354 dev_err(&port->
dev,
"Disable flowcontrol error\n");
376 switch (cflag & CSIZE) {
391 "CSIZE was not CS5-CS8, using default of 8\n");
400 if ((cflag &
CSTOPB) != (old_cflag & CSTOPB)) {
409 if (((iflag ^ old_iflag) & (
IXOFF |
IXON)) ||
410 ((cflag ^ old_cflag) & CRTSCTS)) {
422 if (bad_flow_control)
426 dev_err(&port->
dev,
"Set flow control error\n");
432 spin_unlock_irqrestore(&priv->
lock, flags);
435 static void belkin_sa_break_ctl(
struct tty_struct *tty,
int break_state)
441 dev_err(&port->
dev,
"Set break_ctl %d\n", break_state);
444 static int belkin_sa_tiocmget(
struct tty_struct *tty)
453 spin_unlock_irqrestore(&priv->
lock, flags);
458 static int belkin_sa_tiocmset(
struct tty_struct *tty,
459 unsigned int set,
unsigned int clear)
482 control_state &= ~TIOCM_RTS;
486 control_state &= ~TIOCM_DTR;
491 spin_unlock_irqrestore(&priv->
lock, flags);
495 dev_err(&port->
dev,
"Set RTS error %d\n", retval);
501 dev_err(&port->
dev,
"Set DTR error %d\n", retval);