1 /* 2 * MCT (Magic Control Technology Corp.) USB RS232 Converter Driver 3 * 4 * Copyright (C) 2000 Wolfgang Grandegger (wolfgang@ces.ch) 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is largely derived from the Belkin USB Serial Adapter Driver 12 * (see belkin_sa.[ch]). All of the information about the device was acquired 13 * by using SniffUSB on Windows98. For technical details see mct_u232.h. 14 * 15 * William G. Greathouse and Greg Kroah-Hartman provided great help on how to 16 * do the reverse engineering and how to write a USB serial device driver. 17 * 18 * TO BE DONE, TO BE CHECKED: 19 * DTR/RTS signal handling may be incomplete or incorrect. I have mainly 20 * implemented what I have seen with SniffUSB or found in belkin_sa.c. 21 * For further TODOs check also belkin_sa.c. 22 */ 23 24 #include <linux/kernel.h> 25 #include <linux/errno.h> 26 #include <linux/init.h> 27 #include <linux/slab.h> 28 #include <linux/tty.h> 29 #include <linux/tty_driver.h> 30 #include <linux/tty_flip.h> 31 #include <linux/module.h> 32 #include <linux/spinlock.h> 33 #include <linux/uaccess.h> 34 #include <asm/unaligned.h> 35 #include <linux/usb.h> 36 #include <linux/usb/serial.h> 37 #include <linux/serial.h> 38 #include <linux/ioctl.h> 39 #include "mct_u232.h" 40 41 #define DRIVER_AUTHOR "Wolfgang Grandegger <wolfgang@ces.ch>" 42 #define DRIVER_DESC "Magic Control Technology USB-RS232 converter driver" 43 44 /* 45 * Function prototypes 46 */ 47 static int mct_u232_startup(struct usb_serial *serial); 48 static int mct_u232_port_probe(struct usb_serial_port *port); 49 static int mct_u232_port_remove(struct usb_serial_port *remove); 50 static int mct_u232_open(struct tty_struct *tty, struct usb_serial_port *port); 51 static void mct_u232_close(struct usb_serial_port *port); 52 static void mct_u232_dtr_rts(struct usb_serial_port *port, int on); 53 static void mct_u232_read_int_callback(struct urb *urb); 54 static void mct_u232_set_termios(struct tty_struct *tty, 55 struct usb_serial_port *port, struct ktermios *old); 56 static void mct_u232_break_ctl(struct tty_struct *tty, int break_state); 57 static int mct_u232_tiocmget(struct tty_struct *tty); 58 static int mct_u232_tiocmset(struct tty_struct *tty, 59 unsigned int set, unsigned int clear); 60 static int mct_u232_ioctl(struct tty_struct *tty, 61 unsigned int cmd, unsigned long arg); 62 static int mct_u232_get_icount(struct tty_struct *tty, 63 struct serial_icounter_struct *icount); 64 static void mct_u232_throttle(struct tty_struct *tty); 65 static void mct_u232_unthrottle(struct tty_struct *tty); 66 67 68 /* 69 * All of the device info needed for the MCT USB-RS232 converter. 70 */ 71 static const struct usb_device_id id_table[] = { 72 { USB_DEVICE(MCT_U232_VID, MCT_U232_PID) }, 73 { USB_DEVICE(MCT_U232_VID, MCT_U232_SITECOM_PID) }, 74 { USB_DEVICE(MCT_U232_VID, MCT_U232_DU_H3SP_PID) }, 75 { USB_DEVICE(MCT_U232_BELKIN_F5U109_VID, MCT_U232_BELKIN_F5U109_PID) }, 76 { } /* Terminating entry */ 77 }; 78 MODULE_DEVICE_TABLE(usb, id_table); 79 80 static struct usb_serial_driver mct_u232_device = { 81 .driver = { 82 .owner = THIS_MODULE, 83 .name = "mct_u232", 84 }, 85 .description = "MCT U232", 86 .id_table = id_table, 87 .num_ports = 1, 88 .open = mct_u232_open, 89 .close = mct_u232_close, 90 .dtr_rts = mct_u232_dtr_rts, 91 .throttle = mct_u232_throttle, 92 .unthrottle = mct_u232_unthrottle, 93 .read_int_callback = mct_u232_read_int_callback, 94 .set_termios = mct_u232_set_termios, 95 .break_ctl = mct_u232_break_ctl, 96 .tiocmget = mct_u232_tiocmget, 97 .tiocmset = mct_u232_tiocmset, 98 .attach = mct_u232_startup, 99 .port_probe = mct_u232_port_probe, 100 .port_remove = mct_u232_port_remove, 101 .ioctl = mct_u232_ioctl, 102 .get_icount = mct_u232_get_icount, 103 }; 104 105 static struct usb_serial_driver * const serial_drivers[] = { 106 &mct_u232_device, NULL 107 }; 108 109 struct mct_u232_private { 110 spinlock_t lock; 111 unsigned int control_state; /* Modem Line Setting (TIOCM) */ 112 unsigned char last_lcr; /* Line Control Register */ 113 unsigned char last_lsr; /* Line Status Register */ 114 unsigned char last_msr; /* Modem Status Register */ 115 unsigned int rx_flags; /* Throttling flags */ 116 struct async_icount icount; 117 wait_queue_head_t msr_wait; /* for handling sleeping while waiting 118 for msr change to happen */ 119 }; 120 121 #define THROTTLED 0x01 122 123 /* 124 * Handle vendor specific USB requests 125 */ 126 127 #define WDR_TIMEOUT 5000 /* default urb timeout */ 128 129 /* 130 * Later day 2.6.0-test kernels have new baud rates like B230400 which 131 * we do not know how to support. We ignore them for the moment. 132 */ 133 static int mct_u232_calculate_baud_rate(struct usb_serial *serial, 134 speed_t value, speed_t *result) 135 { 136 *result = value; 137 138 if (le16_to_cpu(serial->dev->descriptor.idProduct) == MCT_U232_SITECOM_PID 139 || le16_to_cpu(serial->dev->descriptor.idProduct) == MCT_U232_BELKIN_F5U109_PID) { 140 switch (value) { 141 case 300: 142 return 0x01; 143 case 600: 144 return 0x02; /* this one not tested */ 145 case 1200: 146 return 0x03; 147 case 2400: 148 return 0x04; 149 case 4800: 150 return 0x06; 151 case 9600: 152 return 0x08; 153 case 19200: 154 return 0x09; 155 case 38400: 156 return 0x0a; 157 case 57600: 158 return 0x0b; 159 case 115200: 160 return 0x0c; 161 default: 162 *result = 9600; 163 return 0x08; 164 } 165 } else { 166 /* FIXME: Can we use any divider - should we do 167 divider = 115200/value; 168 real baud = 115200/divider */ 169 switch (value) { 170 case 300: break; 171 case 600: break; 172 case 1200: break; 173 case 2400: break; 174 case 4800: break; 175 case 9600: break; 176 case 19200: break; 177 case 38400: break; 178 case 57600: break; 179 case 115200: break; 180 default: 181 value = 9600; 182 *result = 9600; 183 } 184 return 115200/value; 185 } 186 } 187 188 static int mct_u232_set_baud_rate(struct tty_struct *tty, 189 struct usb_serial *serial, struct usb_serial_port *port, speed_t value) 190 { 191 unsigned int divisor; 192 int rc; 193 unsigned char *buf; 194 unsigned char cts_enable_byte = 0; 195 speed_t speed; 196 197 buf = kmalloc(MCT_U232_MAX_SIZE, GFP_KERNEL); 198 if (buf == NULL) 199 return -ENOMEM; 200 201 divisor = mct_u232_calculate_baud_rate(serial, value, &speed); 202 put_unaligned_le32(cpu_to_le32(divisor), buf); 203 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), 204 MCT_U232_SET_BAUD_RATE_REQUEST, 205 MCT_U232_SET_REQUEST_TYPE, 206 0, 0, buf, MCT_U232_SET_BAUD_RATE_SIZE, 207 WDR_TIMEOUT); 208 if (rc < 0) /*FIXME: What value speed results */ 209 dev_err(&port->dev, "Set BAUD RATE %d failed (error = %d)\n", 210 value, rc); 211 else 212 tty_encode_baud_rate(tty, speed, speed); 213 dev_dbg(&port->dev, "set_baud_rate: value: 0x%x, divisor: 0x%x\n", value, divisor); 214 215 /* Mimic the MCT-supplied Windows driver (version 1.21P.0104), which 216 always sends two extra USB 'device request' messages after the 217 'baud rate change' message. The actual functionality of the 218 request codes in these messages is not fully understood but these 219 particular codes are never seen in any operation besides a baud 220 rate change. Both of these messages send a single byte of data. 221 In the first message, the value of this byte is always zero. 222 223 The second message has been determined experimentally to control 224 whether data will be transmitted to a device which is not asserting 225 the 'CTS' signal. If the second message's data byte is zero, data 226 will be transmitted even if 'CTS' is not asserted (i.e. no hardware 227 flow control). if the second message's data byte is nonzero (a 228 value of 1 is used by this driver), data will not be transmitted to 229 a device which is not asserting 'CTS'. 230 */ 231 232 buf[0] = 0; 233 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), 234 MCT_U232_SET_UNKNOWN1_REQUEST, 235 MCT_U232_SET_REQUEST_TYPE, 236 0, 0, buf, MCT_U232_SET_UNKNOWN1_SIZE, 237 WDR_TIMEOUT); 238 if (rc < 0) 239 dev_err(&port->dev, "Sending USB device request code %d " 240 "failed (error = %d)\n", MCT_U232_SET_UNKNOWN1_REQUEST, 241 rc); 242 243 if (port && C_CRTSCTS(tty)) 244 cts_enable_byte = 1; 245 246 dev_dbg(&port->dev, "set_baud_rate: send second control message, data = %02X\n", 247 cts_enable_byte); 248 buf[0] = cts_enable_byte; 249 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), 250 MCT_U232_SET_CTS_REQUEST, 251 MCT_U232_SET_REQUEST_TYPE, 252 0, 0, buf, MCT_U232_SET_CTS_SIZE, 253 WDR_TIMEOUT); 254 if (rc < 0) 255 dev_err(&port->dev, "Sending USB device request code %d " 256 "failed (error = %d)\n", MCT_U232_SET_CTS_REQUEST, rc); 257 258 kfree(buf); 259 return rc; 260 } /* mct_u232_set_baud_rate */ 261 262 static int mct_u232_set_line_ctrl(struct usb_serial_port *port, 263 unsigned char lcr) 264 { 265 int rc; 266 unsigned char *buf; 267 268 buf = kmalloc(MCT_U232_MAX_SIZE, GFP_KERNEL); 269 if (buf == NULL) 270 return -ENOMEM; 271 272 buf[0] = lcr; 273 rc = usb_control_msg(port->serial->dev, usb_sndctrlpipe(port->serial->dev, 0), 274 MCT_U232_SET_LINE_CTRL_REQUEST, 275 MCT_U232_SET_REQUEST_TYPE, 276 0, 0, buf, MCT_U232_SET_LINE_CTRL_SIZE, 277 WDR_TIMEOUT); 278 if (rc < 0) 279 dev_err(&port->dev, "Set LINE CTRL 0x%x failed (error = %d)\n", lcr, rc); 280 dev_dbg(&port->dev, "set_line_ctrl: 0x%x\n", lcr); 281 kfree(buf); 282 return rc; 283 } /* mct_u232_set_line_ctrl */ 284 285 static int mct_u232_set_modem_ctrl(struct usb_serial_port *port, 286 unsigned int control_state) 287 { 288 int rc; 289 unsigned char mcr; 290 unsigned char *buf; 291 292 buf = kmalloc(MCT_U232_MAX_SIZE, GFP_KERNEL); 293 if (buf == NULL) 294 return -ENOMEM; 295 296 mcr = MCT_U232_MCR_NONE; 297 if (control_state & TIOCM_DTR) 298 mcr |= MCT_U232_MCR_DTR; 299 if (control_state & TIOCM_RTS) 300 mcr |= MCT_U232_MCR_RTS; 301 302 buf[0] = mcr; 303 rc = usb_control_msg(port->serial->dev, usb_sndctrlpipe(port->serial->dev, 0), 304 MCT_U232_SET_MODEM_CTRL_REQUEST, 305 MCT_U232_SET_REQUEST_TYPE, 306 0, 0, buf, MCT_U232_SET_MODEM_CTRL_SIZE, 307 WDR_TIMEOUT); 308 kfree(buf); 309 310 dev_dbg(&port->dev, "set_modem_ctrl: state=0x%x ==> mcr=0x%x\n", control_state, mcr); 311 312 if (rc < 0) { 313 dev_err(&port->dev, "Set MODEM CTRL 0x%x failed (error = %d)\n", mcr, rc); 314 return rc; 315 } 316 return 0; 317 } /* mct_u232_set_modem_ctrl */ 318 319 static int mct_u232_get_modem_stat(struct usb_serial_port *port, 320 unsigned char *msr) 321 { 322 int rc; 323 unsigned char *buf; 324 325 buf = kmalloc(MCT_U232_MAX_SIZE, GFP_KERNEL); 326 if (buf == NULL) { 327 *msr = 0; 328 return -ENOMEM; 329 } 330 rc = usb_control_msg(port->serial->dev, usb_rcvctrlpipe(port->serial->dev, 0), 331 MCT_U232_GET_MODEM_STAT_REQUEST, 332 MCT_U232_GET_REQUEST_TYPE, 333 0, 0, buf, MCT_U232_GET_MODEM_STAT_SIZE, 334 WDR_TIMEOUT); 335 if (rc < 0) { 336 dev_err(&port->dev, "Get MODEM STATus failed (error = %d)\n", rc); 337 *msr = 0; 338 } else { 339 *msr = buf[0]; 340 } 341 dev_dbg(&port->dev, "get_modem_stat: 0x%x\n", *msr); 342 kfree(buf); 343 return rc; 344 } /* mct_u232_get_modem_stat */ 345 346 static void mct_u232_msr_to_icount(struct async_icount *icount, 347 unsigned char msr) 348 { 349 /* Translate Control Line states */ 350 if (msr & MCT_U232_MSR_DDSR) 351 icount->dsr++; 352 if (msr & MCT_U232_MSR_DCTS) 353 icount->cts++; 354 if (msr & MCT_U232_MSR_DRI) 355 icount->rng++; 356 if (msr & MCT_U232_MSR_DCD) 357 icount->dcd++; 358 } /* mct_u232_msr_to_icount */ 359 360 static void mct_u232_msr_to_state(struct usb_serial_port *port, 361 unsigned int *control_state, unsigned char msr) 362 { 363 /* Translate Control Line states */ 364 if (msr & MCT_U232_MSR_DSR) 365 *control_state |= TIOCM_DSR; 366 else 367 *control_state &= ~TIOCM_DSR; 368 if (msr & MCT_U232_MSR_CTS) 369 *control_state |= TIOCM_CTS; 370 else 371 *control_state &= ~TIOCM_CTS; 372 if (msr & MCT_U232_MSR_RI) 373 *control_state |= TIOCM_RI; 374 else 375 *control_state &= ~TIOCM_RI; 376 if (msr & MCT_U232_MSR_CD) 377 *control_state |= TIOCM_CD; 378 else 379 *control_state &= ~TIOCM_CD; 380 dev_dbg(&port->dev, "msr_to_state: msr=0x%x ==> state=0x%x\n", msr, *control_state); 381 } /* mct_u232_msr_to_state */ 382 383 /* 384 * Driver's tty interface functions 385 */ 386 387 static int mct_u232_startup(struct usb_serial *serial) 388 { 389 struct usb_serial_port *port, *rport; 390 391 /* Puh, that's dirty */ 392 port = serial->port[0]; 393 rport = serial->port[1]; 394 /* No unlinking, it wasn't submitted yet. */ 395 usb_free_urb(port->read_urb); 396 port->read_urb = rport->interrupt_in_urb; 397 rport->interrupt_in_urb = NULL; 398 port->read_urb->context = port; 399 400 return 0; 401 } /* mct_u232_startup */ 402 403 static int mct_u232_port_probe(struct usb_serial_port *port) 404 { 405 struct mct_u232_private *priv; 406 407 priv = kzalloc(sizeof(*priv), GFP_KERNEL); 408 if (!priv) 409 return -ENOMEM; 410 411 spin_lock_init(&priv->lock); 412 init_waitqueue_head(&priv->msr_wait); 413 414 usb_set_serial_port_data(port, priv); 415 416 return 0; 417 } 418 419 static int mct_u232_port_remove(struct usb_serial_port *port) 420 { 421 struct mct_u232_private *priv; 422 423 priv = usb_get_serial_port_data(port); 424 kfree(priv); 425 426 return 0; 427 } 428 429 static int mct_u232_open(struct tty_struct *tty, struct usb_serial_port *port) 430 { 431 struct usb_serial *serial = port->serial; 432 struct mct_u232_private *priv = usb_get_serial_port_data(port); 433 int retval = 0; 434 unsigned int control_state; 435 unsigned long flags; 436 unsigned char last_lcr; 437 unsigned char last_msr; 438 439 /* Compensate for a hardware bug: although the Sitecom U232-P25 440 * device reports a maximum output packet size of 32 bytes, 441 * it seems to be able to accept only 16 bytes (and that's what 442 * SniffUSB says too...) 443 */ 444 if (le16_to_cpu(serial->dev->descriptor.idProduct) 445 == MCT_U232_SITECOM_PID) 446 port->bulk_out_size = 16; 447 448 /* Do a defined restart: the normal serial device seems to 449 * always turn on DTR and RTS here, so do the same. I'm not 450 * sure if this is really necessary. But it should not harm 451 * either. 452 */ 453 spin_lock_irqsave(&priv->lock, flags); 454 if (tty && (tty->termios.c_cflag & CBAUD)) 455 priv->control_state = TIOCM_DTR | TIOCM_RTS; 456 else 457 priv->control_state = 0; 458 459 priv->last_lcr = (MCT_U232_DATA_BITS_8 | 460 MCT_U232_PARITY_NONE | 461 MCT_U232_STOP_BITS_1); 462 control_state = priv->control_state; 463 last_lcr = priv->last_lcr; 464 spin_unlock_irqrestore(&priv->lock, flags); 465 mct_u232_set_modem_ctrl(port, control_state); 466 mct_u232_set_line_ctrl(port, last_lcr); 467 468 /* Read modem status and update control state */ 469 mct_u232_get_modem_stat(port, &last_msr); 470 spin_lock_irqsave(&priv->lock, flags); 471 priv->last_msr = last_msr; 472 mct_u232_msr_to_state(port, &priv->control_state, priv->last_msr); 473 spin_unlock_irqrestore(&priv->lock, flags); 474 475 retval = usb_submit_urb(port->read_urb, GFP_KERNEL); 476 if (retval) { 477 dev_err(&port->dev, 478 "usb_submit_urb(read bulk) failed pipe 0x%x err %d\n", 479 port->read_urb->pipe, retval); 480 goto error; 481 } 482 483 retval = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); 484 if (retval) { 485 usb_kill_urb(port->read_urb); 486 dev_err(&port->dev, 487 "usb_submit_urb(read int) failed pipe 0x%x err %d", 488 port->interrupt_in_urb->pipe, retval); 489 goto error; 490 } 491 return 0; 492 493 error: 494 return retval; 495 } /* mct_u232_open */ 496 497 static void mct_u232_dtr_rts(struct usb_serial_port *port, int on) 498 { 499 unsigned int control_state; 500 struct mct_u232_private *priv = usb_get_serial_port_data(port); 501 502 mutex_lock(&port->serial->disc_mutex); 503 if (!port->serial->disconnected) { 504 /* drop DTR and RTS */ 505 spin_lock_irq(&priv->lock); 506 if (on) 507 priv->control_state |= TIOCM_DTR | TIOCM_RTS; 508 else 509 priv->control_state &= ~(TIOCM_DTR | TIOCM_RTS); 510 control_state = priv->control_state; 511 spin_unlock_irq(&priv->lock); 512 mct_u232_set_modem_ctrl(port, control_state); 513 } 514 mutex_unlock(&port->serial->disc_mutex); 515 } 516 517 static void mct_u232_close(struct usb_serial_port *port) 518 { 519 /* 520 * Must kill the read urb as it is actually an interrupt urb, which 521 * generic close thus fails to kill. 522 */ 523 usb_kill_urb(port->read_urb); 524 usb_kill_urb(port->interrupt_in_urb); 525 526 usb_serial_generic_close(port); 527 } /* mct_u232_close */ 528 529 530 static void mct_u232_read_int_callback(struct urb *urb) 531 { 532 struct usb_serial_port *port = urb->context; 533 struct mct_u232_private *priv = usb_get_serial_port_data(port); 534 struct tty_struct *tty; 535 unsigned char *data = urb->transfer_buffer; 536 int retval; 537 int status = urb->status; 538 unsigned long flags; 539 540 switch (status) { 541 case 0: 542 /* success */ 543 break; 544 case -ECONNRESET: 545 case -ENOENT: 546 case -ESHUTDOWN: 547 /* this urb is terminated, clean up */ 548 dev_dbg(&port->dev, "%s - urb shutting down with status: %d\n", 549 __func__, status); 550 return; 551 default: 552 dev_dbg(&port->dev, "%s - nonzero urb status received: %d\n", 553 __func__, status); 554 goto exit; 555 } 556 557 usb_serial_debug_data(&port->dev, __func__, urb->actual_length, data); 558 559 /* 560 * Work-a-round: handle the 'usual' bulk-in pipe here 561 */ 562 if (urb->transfer_buffer_length > 2) { 563 if (urb->actual_length) { 564 tty = tty_port_tty_get(&port->port); 565 if (tty) { 566 tty_insert_flip_string(tty, data, 567 urb->actual_length); 568 tty_flip_buffer_push(tty); 569 } 570 tty_kref_put(tty); 571 } 572 goto exit; 573 } 574 575 /* 576 * The interrupt-in pipe signals exceptional conditions (modem line 577 * signal changes and errors). data[0] holds MSR, data[1] holds LSR. 578 */ 579 spin_lock_irqsave(&priv->lock, flags); 580 priv->last_msr = data[MCT_U232_MSR_INDEX]; 581 582 /* Record Control Line states */ 583 mct_u232_msr_to_state(port, &priv->control_state, priv->last_msr); 584 585 mct_u232_msr_to_icount(&priv->icount, priv->last_msr); 586 587 #if 0 588 /* Not yet handled. See belkin_sa.c for further information */ 589 /* Now to report any errors */ 590 priv->last_lsr = data[MCT_U232_LSR_INDEX]; 591 /* 592 * fill in the flip buffer here, but I do not know the relation 593 * to the current/next receive buffer or characters. I need 594 * to look in to this before committing any code. 595 */ 596 if (priv->last_lsr & MCT_U232_LSR_ERR) { 597 tty = tty_port_tty_get(&port->port); 598 /* Overrun Error */ 599 if (priv->last_lsr & MCT_U232_LSR_OE) { 600 } 601 /* Parity Error */ 602 if (priv->last_lsr & MCT_U232_LSR_PE) { 603 } 604 /* Framing Error */ 605 if (priv->last_lsr & MCT_U232_LSR_FE) { 606 } 607 /* Break Indicator */ 608 if (priv->last_lsr & MCT_U232_LSR_BI) { 609 } 610 tty_kref_put(tty); 611 } 612 #endif 613 wake_up_interruptible(&priv->msr_wait); 614 spin_unlock_irqrestore(&priv->lock, flags); 615 exit: 616 retval = usb_submit_urb(urb, GFP_ATOMIC); 617 if (retval) 618 dev_err(&port->dev, 619 "%s - usb_submit_urb failed with result %d\n", 620 __func__, retval); 621 } /* mct_u232_read_int_callback */ 622 623 static void mct_u232_set_termios(struct tty_struct *tty, 624 struct usb_serial_port *port, 625 struct ktermios *old_termios) 626 { 627 struct usb_serial *serial = port->serial; 628 struct mct_u232_private *priv = usb_get_serial_port_data(port); 629 struct ktermios *termios = &tty->termios; 630 unsigned int cflag = termios->c_cflag; 631 unsigned int old_cflag = old_termios->c_cflag; 632 unsigned long flags; 633 unsigned int control_state; 634 unsigned char last_lcr; 635 636 /* get a local copy of the current port settings */ 637 spin_lock_irqsave(&priv->lock, flags); 638 control_state = priv->control_state; 639 spin_unlock_irqrestore(&priv->lock, flags); 640 last_lcr = 0; 641 642 /* 643 * Update baud rate. 644 * Do not attempt to cache old rates and skip settings, 645 * disconnects screw such tricks up completely. 646 * Premature optimization is the root of all evil. 647 */ 648 649 /* reassert DTR and RTS on transition from B0 */ 650 if ((old_cflag & CBAUD) == B0) { 651 dev_dbg(&port->dev, "%s: baud was B0\n", __func__); 652 control_state |= TIOCM_DTR | TIOCM_RTS; 653 mct_u232_set_modem_ctrl(port, control_state); 654 } 655 656 mct_u232_set_baud_rate(tty, serial, port, tty_get_baud_rate(tty)); 657 658 if ((cflag & CBAUD) == B0) { 659 dev_dbg(&port->dev, "%s: baud is B0\n", __func__); 660 /* Drop RTS and DTR */ 661 control_state &= ~(TIOCM_DTR | TIOCM_RTS); 662 mct_u232_set_modem_ctrl(port, control_state); 663 } 664 665 /* 666 * Update line control register (LCR) 667 */ 668 669 /* set the parity */ 670 if (cflag & PARENB) 671 last_lcr |= (cflag & PARODD) ? 672 MCT_U232_PARITY_ODD : MCT_U232_PARITY_EVEN; 673 else 674 last_lcr |= MCT_U232_PARITY_NONE; 675 676 /* set the number of data bits */ 677 switch (cflag & CSIZE) { 678 case CS5: 679 last_lcr |= MCT_U232_DATA_BITS_5; break; 680 case CS6: 681 last_lcr |= MCT_U232_DATA_BITS_6; break; 682 case CS7: 683 last_lcr |= MCT_U232_DATA_BITS_7; break; 684 case CS8: 685 last_lcr |= MCT_U232_DATA_BITS_8; break; 686 default: 687 dev_err(&port->dev, 688 "CSIZE was not CS5-CS8, using default of 8\n"); 689 last_lcr |= MCT_U232_DATA_BITS_8; 690 break; 691 } 692 693 termios->c_cflag &= ~CMSPAR; 694 695 /* set the number of stop bits */ 696 last_lcr |= (cflag & CSTOPB) ? 697 MCT_U232_STOP_BITS_2 : MCT_U232_STOP_BITS_1; 698 699 mct_u232_set_line_ctrl(port, last_lcr); 700 701 /* save off the modified port settings */ 702 spin_lock_irqsave(&priv->lock, flags); 703 priv->control_state = control_state; 704 priv->last_lcr = last_lcr; 705 spin_unlock_irqrestore(&priv->lock, flags); 706 } /* mct_u232_set_termios */ 707 708 static void mct_u232_break_ctl(struct tty_struct *tty, int break_state) 709 { 710 struct usb_serial_port *port = tty->driver_data; 711 struct mct_u232_private *priv = usb_get_serial_port_data(port); 712 unsigned char lcr; 713 unsigned long flags; 714 715 spin_lock_irqsave(&priv->lock, flags); 716 lcr = priv->last_lcr; 717 718 if (break_state) 719 lcr |= MCT_U232_SET_BREAK; 720 spin_unlock_irqrestore(&priv->lock, flags); 721 722 mct_u232_set_line_ctrl(port, lcr); 723 } /* mct_u232_break_ctl */ 724 725 726 static int mct_u232_tiocmget(struct tty_struct *tty) 727 { 728 struct usb_serial_port *port = tty->driver_data; 729 struct mct_u232_private *priv = usb_get_serial_port_data(port); 730 unsigned int control_state; 731 unsigned long flags; 732 733 spin_lock_irqsave(&priv->lock, flags); 734 control_state = priv->control_state; 735 spin_unlock_irqrestore(&priv->lock, flags); 736 737 return control_state; 738 } 739 740 static int mct_u232_tiocmset(struct tty_struct *tty, 741 unsigned int set, unsigned int clear) 742 { 743 struct usb_serial_port *port = tty->driver_data; 744 struct mct_u232_private *priv = usb_get_serial_port_data(port); 745 unsigned int control_state; 746 unsigned long flags; 747 748 spin_lock_irqsave(&priv->lock, flags); 749 control_state = priv->control_state; 750 751 if (set & TIOCM_RTS) 752 control_state |= TIOCM_RTS; 753 if (set & TIOCM_DTR) 754 control_state |= TIOCM_DTR; 755 if (clear & TIOCM_RTS) 756 control_state &= ~TIOCM_RTS; 757 if (clear & TIOCM_DTR) 758 control_state &= ~TIOCM_DTR; 759 760 priv->control_state = control_state; 761 spin_unlock_irqrestore(&priv->lock, flags); 762 return mct_u232_set_modem_ctrl(port, control_state); 763 } 764 765 static void mct_u232_throttle(struct tty_struct *tty) 766 { 767 struct usb_serial_port *port = tty->driver_data; 768 struct mct_u232_private *priv = usb_get_serial_port_data(port); 769 unsigned int control_state; 770 771 spin_lock_irq(&priv->lock); 772 priv->rx_flags |= THROTTLED; 773 if (C_CRTSCTS(tty)) { 774 priv->control_state &= ~TIOCM_RTS; 775 control_state = priv->control_state; 776 spin_unlock_irq(&priv->lock); 777 mct_u232_set_modem_ctrl(port, control_state); 778 } else { 779 spin_unlock_irq(&priv->lock); 780 } 781 } 782 783 static void mct_u232_unthrottle(struct tty_struct *tty) 784 { 785 struct usb_serial_port *port = tty->driver_data; 786 struct mct_u232_private *priv = usb_get_serial_port_data(port); 787 unsigned int control_state; 788 789 spin_lock_irq(&priv->lock); 790 if ((priv->rx_flags & THROTTLED) && C_CRTSCTS(tty)) { 791 priv->rx_flags &= ~THROTTLED; 792 priv->control_state |= TIOCM_RTS; 793 control_state = priv->control_state; 794 spin_unlock_irq(&priv->lock); 795 mct_u232_set_modem_ctrl(port, control_state); 796 } else { 797 spin_unlock_irq(&priv->lock); 798 } 799 } 800 801 static int mct_u232_ioctl(struct tty_struct *tty, 802 unsigned int cmd, unsigned long arg) 803 { 804 DEFINE_WAIT(wait); 805 struct usb_serial_port *port = tty->driver_data; 806 struct mct_u232_private *mct_u232_port = usb_get_serial_port_data(port); 807 struct async_icount cnow, cprev; 808 unsigned long flags; 809 810 dev_dbg(&port->dev, "%s - cmd = 0x%x\n", __func__, cmd); 811 812 switch (cmd) { 813 814 case TIOCMIWAIT: 815 816 dev_dbg(&port->dev, "%s TIOCMIWAIT", __func__); 817 818 spin_lock_irqsave(&mct_u232_port->lock, flags); 819 cprev = mct_u232_port->icount; 820 spin_unlock_irqrestore(&mct_u232_port->lock, flags); 821 for ( ; ; ) { 822 prepare_to_wait(&mct_u232_port->msr_wait, 823 &wait, TASK_INTERRUPTIBLE); 824 schedule(); 825 finish_wait(&mct_u232_port->msr_wait, &wait); 826 /* see if a signal did it */ 827 if (signal_pending(current)) 828 return -ERESTARTSYS; 829 spin_lock_irqsave(&mct_u232_port->lock, flags); 830 cnow = mct_u232_port->icount; 831 spin_unlock_irqrestore(&mct_u232_port->lock, flags); 832 if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && 833 cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) 834 return -EIO; /* no change => error */ 835 if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) || 836 ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) || 837 ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) || 838 ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts))) { 839 return 0; 840 } 841 cprev = cnow; 842 } 843 844 } 845 return -ENOIOCTLCMD; 846 } 847 848 static int mct_u232_get_icount(struct tty_struct *tty, 849 struct serial_icounter_struct *icount) 850 { 851 struct usb_serial_port *port = tty->driver_data; 852 struct mct_u232_private *mct_u232_port = usb_get_serial_port_data(port); 853 struct async_icount *ic = &mct_u232_port->icount; 854 unsigned long flags; 855 856 spin_lock_irqsave(&mct_u232_port->lock, flags); 857 858 icount->cts = ic->cts; 859 icount->dsr = ic->dsr; 860 icount->rng = ic->rng; 861 icount->dcd = ic->dcd; 862 icount->rx = ic->rx; 863 icount->tx = ic->tx; 864 icount->frame = ic->frame; 865 icount->overrun = ic->overrun; 866 icount->parity = ic->parity; 867 icount->brk = ic->brk; 868 icount->buf_overrun = ic->buf_overrun; 869 870 spin_unlock_irqrestore(&mct_u232_port->lock, flags); 871 872 dev_dbg(&port->dev, "%s TIOCGICOUNT RX=%d, TX=%d\n", 873 __func__, icount->rx, icount->tx); 874 return 0; 875 } 876 877 module_usb_serial_driver(serial_drivers, id_table); 878 879 MODULE_AUTHOR(DRIVER_AUTHOR); 880 MODULE_DESCRIPTION(DRIVER_DESC); 881 MODULE_LICENSE("GPL"); 882