8 #include <linux/errno.h>
10 #include <linux/slab.h>
11 #include <linux/tty.h>
14 #include <linux/module.h>
15 #include <linux/serial.h>
21 #define QT_OPEN_CLOSE_CHANNEL 0xca
22 #define QT_SET_GET_DEVICE 0xc2
23 #define QT_SET_GET_REGISTER 0xc0
24 #define QT_GET_SET_PREBUF_TRIG_LVL 0xcc
25 #define QT_SET_ATF 0xcd
26 #define QT_GET_SET_UART 0xc1
27 #define QT_TRANSFER_IN 0xc0
28 #define QT_HW_FLOW_CONTROL_MASK 0xc5
29 #define QT_SW_FLOW_CONTROL_MASK 0xc6
31 #define SERIAL_MSR_MASK 0xf0
33 #define SERIAL_CRTSCTS ((UART_MCR_RTS << 8) | UART_MSR_CTS)
35 #define SERIAL_EVEN_PARITY (UART_LCR_PARITY | UART_LCR_EPAR)
37 #define MAX_BAUD_RATE 460800
39 #define ATC_DISABLED 0x00
40 #define DUPMODE_BITS 0xc0
42 #define LOOPMODE_BITS 0x41
43 #define RS232_MODE 0x00
44 #define RTSCTS_TO_CONNECTOR 0x40
46 #define FULLPWRBIT 0x00000080
47 #define NEXT_BOARD_POWER_BIT 0x00000004
50 #define DRIVER_VERSION "v0.1"
51 #define DRIVER_DESC "Quatech SSU-100 USB to Serial Driver"
53 #define USB_VENDOR_ID_QUATECH 0x061d
54 #define QUATECH_SSU100 0xC020
70 static inline int ssu100_control_msg(
struct usb_device *
dev,
74 request, 0x40, data, index,
78 static inline int ssu100_setdevice(
struct usb_device *dev,
u8 *data)
80 u16 x = ((
u16)(data[1] << 8) | (
u16)(data[0]));
86 static inline int ssu100_getdevice(
struct usb_device *dev,
u8 *data)
93 static inline int ssu100_getregister(
struct usb_device *dev,
100 uart, data,
sizeof(*data), 300);
105 static inline int ssu100_setregister(
struct usb_device *dev,
118 #define set_mctrl(dev, set) update_mctrl((dev), (set), 0)
119 #define clear_mctrl(dev, clear) update_mctrl((dev), 0, (clear))
122 static inline int update_mctrl(
struct usb_device *dev,
unsigned int set,
129 dev_dbg(&dev->dev,
"%s - DTR|RTS not being set|cleared\n", __func__);
140 result = ssu100_setregister(dev, 0,
UART_MCR, urb_value);
142 dev_dbg(&dev->dev,
"%s Error from MODEM_CTRL urb\n", __func__);
147 static int ssu100_initdevice(
struct usb_device *dev)
156 result = ssu100_getdevice(dev, data);
158 dev_dbg(&dev->dev,
"%s - get_device failed %i\n", __func__, result);
164 result = ssu100_setdevice(dev, data);
166 dev_dbg(&dev->dev,
"%s - setdevice failed %i\n", __func__, result);
172 dev_dbg(&dev->dev,
"%s - set prebuffer level failed %i\n", __func__, result);
178 dev_dbg(&dev->dev,
"%s - set ATFprebuffer level failed %i\n", __func__, result);
182 result = ssu100_getdevice(dev, data);
184 dev_dbg(&dev->dev,
"%s - get_device failed %i\n", __func__, result);
193 result = ssu100_setdevice(dev, data);
195 dev_dbg(&dev->dev,
"%s - setdevice failed %i\n", __func__, result);
205 static void ssu100_set_termios(
struct tty_struct *tty,
209 struct usb_device *dev = port->
serial->dev;
223 switch (cflag &
CSIZE) {
243 dev_dbg(&port->
dev,
"%s - got baud = %d\n", __func__, baud);
248 if (((remainder * 2) >= baud) && (baud != 110))
251 urb_value = urb_value << 8;
255 dev_dbg(&port->
dev,
"%s - set uart failed\n", __func__);
264 dev_dbg(&port->
dev,
"%s - set HW flow control failed\n", __func__);
276 dev_dbg(&port->
dev,
"%s - set SW flow control failed\n", __func__);
283 struct usb_device *dev = port->
serial->dev;
298 dev_dbg(&port->
dev,
"%s - open failed %i\n", __func__, result);
313 dev_dbg(&port->
dev,
"%s - set uart failed\n", __func__);
316 ssu100_set_termios(tty, port, &tty->termios);
340 tmp.baud_base = 9600;
341 tmp.close_delay = 5*
HZ;
342 tmp.closing_wait = 30*
HZ;
388 static int ssu100_get_icount(
struct tty_struct *tty,
399 icount->
rx = cnow.
rx;
400 icount->
tx = cnow.
tx;
412 static int ssu100_ioctl(
struct tty_struct *tty,
413 unsigned int cmd,
unsigned long arg)
417 dev_dbg(&port->
dev,
"%s cmd 0x%04x\n", __func__, cmd);
421 return get_serial_info(port,
425 return wait_modem_info(port, arg);
431 dev_dbg(&port->
dev,
"%s arg not supported\n", __func__);
438 return ssu100_initdevice(serial->
dev);
452 usb_set_serial_port_data(port, priv);
461 priv = usb_get_serial_port_data(port);
467 static int ssu100_tiocmget(
struct tty_struct *tty)
470 struct usb_device *dev = port->
serial->dev;
478 r = ssu100_getregister(dev, 0,
UART_MCR, d);
482 r = ssu100_getregister(dev, 0,
UART_MSR, d+1);
498 static int ssu100_tiocmset(
struct tty_struct *tty,
499 unsigned int set,
unsigned int clear)
502 struct usb_device *dev = port->
serial->dev;
504 return update_mctrl(dev,
set, clear);
509 struct usb_device *dev = port->
serial->dev;
512 if (!port->
serial->disconnected) {
515 ssu100_setregister(dev, 0,
UART_MCR, 0) < 0)
516 dev_err(&port->
dev,
"error from flowcontrol urb\n");
587 static int ssu100_process_packet(
struct urb *
urb,
591 char *
packet = (
char *)urb->transfer_buffer;
593 u32 len = urb->actual_length;
598 (packet[0] == 0x1b) && (packet[1] == 0x1b) &&
599 ((packet[2] == 0x00) || (packet[2] == 0x01))) {
600 if (packet[2] == 0x00) {
601 ssu100_update_lsr(port, packet[3], &
flag);
605 if (packet[2] == 0x01)
606 ssu100_update_msr(port, packet[3]);
617 for (
i = 0;
i <
len;
i++, ch++) {
619 tty_insert_flip_char(tty, *ch,
flag);
627 static void ssu100_process_read_urb(
struct urb *urb)
637 count = ssu100_process_packet(urb, tty);
653 .close = ssu100_close,
654 .attach = ssu100_attach,
655 .port_probe = ssu100_port_probe,
656 .port_remove = ssu100_port_remove,
657 .dtr_rts = ssu100_dtr_rts,
658 .process_read_urb = ssu100_process_read_urb,
659 .tiocmget = ssu100_tiocmget,
660 .tiocmset = ssu100_tiocmset,
661 .get_icount = ssu100_get_icount,
662 .ioctl = ssu100_ioctl,
663 .set_termios = ssu100_set_termios,