0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/errno.h>
0010 #include <linux/slab.h>
0011 #include <linux/tty.h>
0012 #include <linux/tty_driver.h>
0013 #include <linux/tty_flip.h>
0014 #include <linux/module.h>
0015 #include <linux/serial.h>
0016 #include <linux/usb.h>
0017 #include <linux/usb/serial.h>
0018 #include <linux/serial_reg.h>
0019 #include <linux/uaccess.h>
0020
0021 #define QT_OPEN_CLOSE_CHANNEL 0xca
0022 #define QT_SET_GET_DEVICE 0xc2
0023 #define QT_SET_GET_REGISTER 0xc0
0024 #define QT_GET_SET_PREBUF_TRIG_LVL 0xcc
0025 #define QT_SET_ATF 0xcd
0026 #define QT_GET_SET_UART 0xc1
0027 #define QT_TRANSFER_IN 0xc0
0028 #define QT_HW_FLOW_CONTROL_MASK 0xc5
0029 #define QT_SW_FLOW_CONTROL_MASK 0xc6
0030
0031 #define SERIAL_MSR_MASK 0xf0
0032
0033 #define SERIAL_CRTSCTS ((UART_MCR_RTS << 8) | UART_MSR_CTS)
0034
0035 #define SERIAL_EVEN_PARITY (UART_LCR_PARITY | UART_LCR_EPAR)
0036
0037 #define MAX_BAUD_RATE 460800
0038
0039 #define ATC_DISABLED 0x00
0040 #define DUPMODE_BITS 0xc0
0041 #define RR_BITS 0x03
0042 #define LOOPMODE_BITS 0x41
0043 #define RS232_MODE 0x00
0044 #define RTSCTS_TO_CONNECTOR 0x40
0045 #define CLKS_X4 0x02
0046 #define FULLPWRBIT 0x00000080
0047 #define NEXT_BOARD_POWER_BIT 0x00000004
0048
0049 #define DRIVER_DESC "Quatech SSU-100 USB to Serial Driver"
0050
0051 #define USB_VENDOR_ID_QUATECH 0x061d
0052 #define QUATECH_SSU100 0xC020
0053
0054 static const struct usb_device_id id_table[] = {
0055 {USB_DEVICE(USB_VENDOR_ID_QUATECH, QUATECH_SSU100)},
0056 {}
0057 };
0058 MODULE_DEVICE_TABLE(usb, id_table);
0059
0060 struct ssu100_port_private {
0061 spinlock_t status_lock;
0062 u8 shadowLSR;
0063 u8 shadowMSR;
0064 };
0065
0066 static inline int ssu100_control_msg(struct usb_device *dev,
0067 u8 request, u16 data, u16 index)
0068 {
0069 return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
0070 request, 0x40, data, index,
0071 NULL, 0, 300);
0072 }
0073
0074 static inline int ssu100_setdevice(struct usb_device *dev, u8 *data)
0075 {
0076 u16 x = ((u16)(data[1] << 8) | (u16)(data[0]));
0077
0078 return ssu100_control_msg(dev, QT_SET_GET_DEVICE, x, 0);
0079 }
0080
0081
0082 static inline int ssu100_getdevice(struct usb_device *dev, u8 *data)
0083 {
0084 int ret;
0085
0086 ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
0087 QT_SET_GET_DEVICE, 0xc0, 0, 0,
0088 data, 3, 300);
0089 if (ret < 3) {
0090 if (ret >= 0)
0091 ret = -EIO;
0092 }
0093
0094 return ret;
0095 }
0096
0097 static inline int ssu100_getregister(struct usb_device *dev,
0098 unsigned short uart,
0099 unsigned short reg,
0100 u8 *data)
0101 {
0102 int ret;
0103
0104 ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
0105 QT_SET_GET_REGISTER, 0xc0, reg,
0106 uart, data, sizeof(*data), 300);
0107 if (ret < (int)sizeof(*data)) {
0108 if (ret >= 0)
0109 ret = -EIO;
0110 }
0111
0112 return ret;
0113 }
0114
0115
0116 static inline int ssu100_setregister(struct usb_device *dev,
0117 unsigned short uart,
0118 unsigned short reg,
0119 u16 data)
0120 {
0121 u16 value = (data << 8) | reg;
0122
0123 return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
0124 QT_SET_GET_REGISTER, 0x40, value, uart,
0125 NULL, 0, 300);
0126
0127 }
0128
0129 #define set_mctrl(dev, set) update_mctrl((dev), (set), 0)
0130 #define clear_mctrl(dev, clear) update_mctrl((dev), 0, (clear))
0131
0132
0133 static inline int update_mctrl(struct usb_device *dev, unsigned int set,
0134 unsigned int clear)
0135 {
0136 unsigned urb_value;
0137 int result;
0138
0139 if (((set | clear) & (TIOCM_DTR | TIOCM_RTS)) == 0) {
0140 dev_dbg(&dev->dev, "%s - DTR|RTS not being set|cleared\n", __func__);
0141 return 0;
0142 }
0143
0144 clear &= ~set;
0145 urb_value = 0;
0146 if (set & TIOCM_DTR)
0147 urb_value |= UART_MCR_DTR;
0148 if (set & TIOCM_RTS)
0149 urb_value |= UART_MCR_RTS;
0150
0151 result = ssu100_setregister(dev, 0, UART_MCR, urb_value);
0152 if (result < 0)
0153 dev_dbg(&dev->dev, "%s Error from MODEM_CTRL urb\n", __func__);
0154
0155 return result;
0156 }
0157
0158 static int ssu100_initdevice(struct usb_device *dev)
0159 {
0160 u8 *data;
0161 int result = 0;
0162
0163 data = kzalloc(3, GFP_KERNEL);
0164 if (!data)
0165 return -ENOMEM;
0166
0167 result = ssu100_getdevice(dev, data);
0168 if (result < 0) {
0169 dev_dbg(&dev->dev, "%s - get_device failed %i\n", __func__, result);
0170 goto out;
0171 }
0172
0173 data[1] &= ~FULLPWRBIT;
0174
0175 result = ssu100_setdevice(dev, data);
0176 if (result < 0) {
0177 dev_dbg(&dev->dev, "%s - setdevice failed %i\n", __func__, result);
0178 goto out;
0179 }
0180
0181 result = ssu100_control_msg(dev, QT_GET_SET_PREBUF_TRIG_LVL, 128, 0);
0182 if (result < 0) {
0183 dev_dbg(&dev->dev, "%s - set prebuffer level failed %i\n", __func__, result);
0184 goto out;
0185 }
0186
0187 result = ssu100_control_msg(dev, QT_SET_ATF, ATC_DISABLED, 0);
0188 if (result < 0) {
0189 dev_dbg(&dev->dev, "%s - set ATFprebuffer level failed %i\n", __func__, result);
0190 goto out;
0191 }
0192
0193 result = ssu100_getdevice(dev, data);
0194 if (result < 0) {
0195 dev_dbg(&dev->dev, "%s - get_device failed %i\n", __func__, result);
0196 goto out;
0197 }
0198
0199 data[0] &= ~(RR_BITS | DUPMODE_BITS);
0200 data[0] |= CLKS_X4;
0201 data[1] &= ~(LOOPMODE_BITS);
0202 data[1] |= RS232_MODE;
0203
0204 result = ssu100_setdevice(dev, data);
0205 if (result < 0) {
0206 dev_dbg(&dev->dev, "%s - setdevice failed %i\n", __func__, result);
0207 goto out;
0208 }
0209
0210 out: kfree(data);
0211 return result;
0212
0213 }
0214
0215
0216 static void ssu100_set_termios(struct tty_struct *tty,
0217 struct usb_serial_port *port,
0218 struct ktermios *old_termios)
0219 {
0220 struct usb_device *dev = port->serial->dev;
0221 struct ktermios *termios = &tty->termios;
0222 u16 baud, divisor, remainder;
0223 unsigned int cflag = termios->c_cflag;
0224 u16 urb_value = 0;
0225 int result;
0226
0227 if (cflag & PARENB) {
0228 if (cflag & PARODD)
0229 urb_value |= UART_LCR_PARITY;
0230 else
0231 urb_value |= SERIAL_EVEN_PARITY;
0232 }
0233
0234 urb_value |= UART_LCR_WLEN(tty_get_char_size(cflag));
0235
0236 baud = tty_get_baud_rate(tty);
0237 if (!baud)
0238 baud = 9600;
0239
0240 dev_dbg(&port->dev, "%s - got baud = %d\n", __func__, baud);
0241
0242
0243 divisor = MAX_BAUD_RATE / baud;
0244 remainder = MAX_BAUD_RATE % baud;
0245 if (((remainder * 2) >= baud) && (baud != 110))
0246 divisor++;
0247
0248 urb_value = urb_value << 8;
0249
0250 result = ssu100_control_msg(dev, QT_GET_SET_UART, divisor, urb_value);
0251 if (result < 0)
0252 dev_dbg(&port->dev, "%s - set uart failed\n", __func__);
0253
0254 if (cflag & CRTSCTS)
0255 result = ssu100_control_msg(dev, QT_HW_FLOW_CONTROL_MASK,
0256 SERIAL_CRTSCTS, 0);
0257 else
0258 result = ssu100_control_msg(dev, QT_HW_FLOW_CONTROL_MASK,
0259 0, 0);
0260 if (result < 0)
0261 dev_dbg(&port->dev, "%s - set HW flow control failed\n", __func__);
0262
0263 if (I_IXOFF(tty) || I_IXON(tty)) {
0264 u16 x = ((u16)(START_CHAR(tty) << 8) | (u16)(STOP_CHAR(tty)));
0265
0266 result = ssu100_control_msg(dev, QT_SW_FLOW_CONTROL_MASK,
0267 x, 0);
0268 } else
0269 result = ssu100_control_msg(dev, QT_SW_FLOW_CONTROL_MASK,
0270 0, 0);
0271
0272 if (result < 0)
0273 dev_dbg(&port->dev, "%s - set SW flow control failed\n", __func__);
0274
0275 }
0276
0277
0278 static int ssu100_open(struct tty_struct *tty, struct usb_serial_port *port)
0279 {
0280 struct usb_device *dev = port->serial->dev;
0281 struct ssu100_port_private *priv = usb_get_serial_port_data(port);
0282 u8 *data;
0283 int result;
0284 unsigned long flags;
0285
0286 data = kzalloc(2, GFP_KERNEL);
0287 if (!data)
0288 return -ENOMEM;
0289
0290 result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
0291 QT_OPEN_CLOSE_CHANNEL,
0292 QT_TRANSFER_IN, 0x01,
0293 0, data, 2, 300);
0294 if (result < 2) {
0295 dev_dbg(&port->dev, "%s - open failed %i\n", __func__, result);
0296 if (result >= 0)
0297 result = -EIO;
0298 kfree(data);
0299 return result;
0300 }
0301
0302 spin_lock_irqsave(&priv->status_lock, flags);
0303 priv->shadowLSR = data[0];
0304 priv->shadowMSR = data[1];
0305 spin_unlock_irqrestore(&priv->status_lock, flags);
0306
0307 kfree(data);
0308
0309
0310 result = ssu100_control_msg(dev, QT_GET_SET_UART, 0x30, 0x0300);
0311 if (result < 0)
0312 dev_dbg(&port->dev, "%s - set uart failed\n", __func__);
0313
0314 if (tty)
0315 ssu100_set_termios(tty, port, &tty->termios);
0316
0317 return usb_serial_generic_open(tty, port);
0318 }
0319
0320 static int ssu100_attach(struct usb_serial *serial)
0321 {
0322 return ssu100_initdevice(serial->dev);
0323 }
0324
0325 static int ssu100_port_probe(struct usb_serial_port *port)
0326 {
0327 struct ssu100_port_private *priv;
0328
0329 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
0330 if (!priv)
0331 return -ENOMEM;
0332
0333 spin_lock_init(&priv->status_lock);
0334
0335 usb_set_serial_port_data(port, priv);
0336
0337 return 0;
0338 }
0339
0340 static void ssu100_port_remove(struct usb_serial_port *port)
0341 {
0342 struct ssu100_port_private *priv;
0343
0344 priv = usb_get_serial_port_data(port);
0345 kfree(priv);
0346 }
0347
0348 static int ssu100_tiocmget(struct tty_struct *tty)
0349 {
0350 struct usb_serial_port *port = tty->driver_data;
0351 struct usb_device *dev = port->serial->dev;
0352 u8 *d;
0353 int r;
0354
0355 d = kzalloc(2, GFP_KERNEL);
0356 if (!d)
0357 return -ENOMEM;
0358
0359 r = ssu100_getregister(dev, 0, UART_MCR, d);
0360 if (r < 0)
0361 goto mget_out;
0362
0363 r = ssu100_getregister(dev, 0, UART_MSR, d+1);
0364 if (r < 0)
0365 goto mget_out;
0366
0367 r = (d[0] & UART_MCR_DTR ? TIOCM_DTR : 0) |
0368 (d[0] & UART_MCR_RTS ? TIOCM_RTS : 0) |
0369 (d[1] & UART_MSR_CTS ? TIOCM_CTS : 0) |
0370 (d[1] & UART_MSR_DCD ? TIOCM_CAR : 0) |
0371 (d[1] & UART_MSR_RI ? TIOCM_RI : 0) |
0372 (d[1] & UART_MSR_DSR ? TIOCM_DSR : 0);
0373
0374 mget_out:
0375 kfree(d);
0376 return r;
0377 }
0378
0379 static int ssu100_tiocmset(struct tty_struct *tty,
0380 unsigned int set, unsigned int clear)
0381 {
0382 struct usb_serial_port *port = tty->driver_data;
0383 struct usb_device *dev = port->serial->dev;
0384
0385 return update_mctrl(dev, set, clear);
0386 }
0387
0388 static void ssu100_dtr_rts(struct usb_serial_port *port, int on)
0389 {
0390 struct usb_device *dev = port->serial->dev;
0391
0392
0393 if (!on) {
0394 if (ssu100_setregister(dev, 0, UART_MCR, 0) < 0)
0395 dev_err(&port->dev, "error from flowcontrol urb\n");
0396 }
0397
0398 if (on)
0399 set_mctrl(dev, TIOCM_DTR | TIOCM_RTS);
0400 else
0401 clear_mctrl(dev, TIOCM_DTR | TIOCM_RTS);
0402 }
0403
0404 static void ssu100_update_msr(struct usb_serial_port *port, u8 msr)
0405 {
0406 struct ssu100_port_private *priv = usb_get_serial_port_data(port);
0407 unsigned long flags;
0408
0409 spin_lock_irqsave(&priv->status_lock, flags);
0410 priv->shadowMSR = msr;
0411 spin_unlock_irqrestore(&priv->status_lock, flags);
0412
0413 if (msr & UART_MSR_ANY_DELTA) {
0414
0415 if (msr & UART_MSR_DCTS)
0416 port->icount.cts++;
0417 if (msr & UART_MSR_DDSR)
0418 port->icount.dsr++;
0419 if (msr & UART_MSR_DDCD)
0420 port->icount.dcd++;
0421 if (msr & UART_MSR_TERI)
0422 port->icount.rng++;
0423 wake_up_interruptible(&port->port.delta_msr_wait);
0424 }
0425 }
0426
0427 static void ssu100_update_lsr(struct usb_serial_port *port, u8 lsr,
0428 char *tty_flag)
0429 {
0430 struct ssu100_port_private *priv = usb_get_serial_port_data(port);
0431 unsigned long flags;
0432
0433 spin_lock_irqsave(&priv->status_lock, flags);
0434 priv->shadowLSR = lsr;
0435 spin_unlock_irqrestore(&priv->status_lock, flags);
0436
0437 *tty_flag = TTY_NORMAL;
0438 if (lsr & UART_LSR_BRK_ERROR_BITS) {
0439
0440
0441 if (lsr & UART_LSR_BI) {
0442 port->icount.brk++;
0443 *tty_flag = TTY_BREAK;
0444 usb_serial_handle_break(port);
0445 }
0446 if (lsr & UART_LSR_PE) {
0447 port->icount.parity++;
0448 if (*tty_flag == TTY_NORMAL)
0449 *tty_flag = TTY_PARITY;
0450 }
0451 if (lsr & UART_LSR_FE) {
0452 port->icount.frame++;
0453 if (*tty_flag == TTY_NORMAL)
0454 *tty_flag = TTY_FRAME;
0455 }
0456 if (lsr & UART_LSR_OE) {
0457 port->icount.overrun++;
0458 tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
0459 }
0460 }
0461
0462 }
0463
0464 static void ssu100_process_read_urb(struct urb *urb)
0465 {
0466 struct usb_serial_port *port = urb->context;
0467 char *packet = urb->transfer_buffer;
0468 char flag = TTY_NORMAL;
0469 u32 len = urb->actual_length;
0470 int i;
0471 char *ch;
0472
0473 if ((len >= 4) &&
0474 (packet[0] == 0x1b) && (packet[1] == 0x1b) &&
0475 ((packet[2] == 0x00) || (packet[2] == 0x01))) {
0476 if (packet[2] == 0x00)
0477 ssu100_update_lsr(port, packet[3], &flag);
0478 if (packet[2] == 0x01)
0479 ssu100_update_msr(port, packet[3]);
0480
0481 len -= 4;
0482 ch = packet + 4;
0483 } else
0484 ch = packet;
0485
0486 if (!len)
0487 return;
0488
0489 if (port->sysrq) {
0490 for (i = 0; i < len; i++, ch++) {
0491 if (!usb_serial_handle_sysrq_char(port, *ch))
0492 tty_insert_flip_char(&port->port, *ch, flag);
0493 }
0494 } else {
0495 tty_insert_flip_string_fixed_flag(&port->port, ch, flag, len);
0496 }
0497
0498 tty_flip_buffer_push(&port->port);
0499 }
0500
0501 static struct usb_serial_driver ssu100_device = {
0502 .driver = {
0503 .owner = THIS_MODULE,
0504 .name = "ssu100",
0505 },
0506 .description = DRIVER_DESC,
0507 .id_table = id_table,
0508 .num_ports = 1,
0509 .open = ssu100_open,
0510 .attach = ssu100_attach,
0511 .port_probe = ssu100_port_probe,
0512 .port_remove = ssu100_port_remove,
0513 .dtr_rts = ssu100_dtr_rts,
0514 .process_read_urb = ssu100_process_read_urb,
0515 .tiocmget = ssu100_tiocmget,
0516 .tiocmset = ssu100_tiocmset,
0517 .tiocmiwait = usb_serial_generic_tiocmiwait,
0518 .get_icount = usb_serial_generic_get_icount,
0519 .set_termios = ssu100_set_termios,
0520 };
0521
0522 static struct usb_serial_driver * const serial_drivers[] = {
0523 &ssu100_device, NULL
0524 };
0525
0526 module_usb_serial_driver(serial_drivers, id_table);
0527
0528 MODULE_DESCRIPTION(DRIVER_DESC);
0529 MODULE_LICENSE("GPL v2");