1 /* 2 * spcp8x5 USB to serial adaptor driver 3 * 4 * Copyright (C) 2006 Linxb (xubin.lin@worldplus.com.cn) 5 * Copyright (C) 2006 S1 Corp. 6 * 7 * Original driver for 2.6.10 pl2303 driver by 8 * Greg Kroah-Hartman (greg@kroah.com) 9 * Changes for 2.6.20 by Harald Klein <hari@vt100.at> 10 * 11 * This program is free software; you can redistribute it and/or modify 12 * it under the terms of the GNU General Public License as published by 13 * the Free Software Foundation; either version 2 of the License, or 14 * (at your option) any later version. 15 * 16 * 17 */ 18 #include <linux/kernel.h> 19 #include <linux/errno.h> 20 #include <linux/init.h> 21 #include <linux/slab.h> 22 #include <linux/tty.h> 23 #include <linux/tty_driver.h> 24 #include <linux/tty_flip.h> 25 #include <linux/module.h> 26 #include <linux/spinlock.h> 27 #include <linux/usb.h> 28 #include <linux/usb/serial.h> 29 30 31 /* Version Information */ 32 #define DRIVER_VERSION "v0.04" 33 #define DRIVER_DESC "SPCP8x5 USB to serial adaptor driver" 34 35 static int debug; 36 37 #define SPCP8x5_007_VID 0x04FC 38 #define SPCP8x5_007_PID 0x0201 39 #define SPCP8x5_008_VID 0x04fc 40 #define SPCP8x5_008_PID 0x0235 41 #define SPCP8x5_PHILIPS_VID 0x0471 42 #define SPCP8x5_PHILIPS_PID 0x081e 43 #define SPCP8x5_INTERMATIC_VID 0x04FC 44 #define SPCP8x5_INTERMATIC_PID 0x0204 45 #define SPCP8x5_835_VID 0x04fc 46 #define SPCP8x5_835_PID 0x0231 47 48 static struct usb_device_id id_table [] = { 49 { USB_DEVICE(SPCP8x5_PHILIPS_VID , SPCP8x5_PHILIPS_PID)}, 50 { USB_DEVICE(SPCP8x5_INTERMATIC_VID, SPCP8x5_INTERMATIC_PID)}, 51 { USB_DEVICE(SPCP8x5_835_VID, SPCP8x5_835_PID)}, 52 { USB_DEVICE(SPCP8x5_008_VID, SPCP8x5_008_PID)}, 53 { USB_DEVICE(SPCP8x5_007_VID, SPCP8x5_007_PID)}, 54 { } /* Terminating entry */ 55 }; 56 MODULE_DEVICE_TABLE(usb, id_table); 57 58 struct spcp8x5_usb_ctrl_arg { 59 u8 type; 60 u8 cmd; 61 u8 cmd_type; 62 u16 value; 63 u16 index; 64 u16 length; 65 }; 66 67 /* wait 30s before close */ 68 #define SPCP8x5_CLOSING_WAIT (30*HZ) 69 70 #define SPCP8x5_BUF_SIZE 1024 71 72 73 /* spcp8x5 spec register define */ 74 #define MCR_CONTROL_LINE_RTS 0x02 75 #define MCR_CONTROL_LINE_DTR 0x01 76 #define MCR_DTR 0x01 77 #define MCR_RTS 0x02 78 79 #define MSR_STATUS_LINE_DCD 0x80 80 #define MSR_STATUS_LINE_RI 0x40 81 #define MSR_STATUS_LINE_DSR 0x20 82 #define MSR_STATUS_LINE_CTS 0x10 83 84 /* verdor command here , we should define myself */ 85 #define SET_DEFAULT 0x40 86 #define SET_DEFAULT_TYPE 0x20 87 88 #define SET_UART_FORMAT 0x40 89 #define SET_UART_FORMAT_TYPE 0x21 90 #define SET_UART_FORMAT_SIZE_5 0x00 91 #define SET_UART_FORMAT_SIZE_6 0x01 92 #define SET_UART_FORMAT_SIZE_7 0x02 93 #define SET_UART_FORMAT_SIZE_8 0x03 94 #define SET_UART_FORMAT_STOP_1 0x00 95 #define SET_UART_FORMAT_STOP_2 0x04 96 #define SET_UART_FORMAT_PAR_NONE 0x00 97 #define SET_UART_FORMAT_PAR_ODD 0x10 98 #define SET_UART_FORMAT_PAR_EVEN 0x30 99 #define SET_UART_FORMAT_PAR_MASK 0xD0 100 #define SET_UART_FORMAT_PAR_SPACE 0x90 101 102 #define GET_UART_STATUS_TYPE 0xc0 103 #define GET_UART_STATUS 0x22 104 #define GET_UART_STATUS_MSR 0x06 105 106 #define SET_UART_STATUS 0x40 107 #define SET_UART_STATUS_TYPE 0x23 108 #define SET_UART_STATUS_MCR 0x0004 109 #define SET_UART_STATUS_MCR_DTR 0x01 110 #define SET_UART_STATUS_MCR_RTS 0x02 111 #define SET_UART_STATUS_MCR_LOOP 0x10 112 113 #define SET_WORKING_MODE 0x40 114 #define SET_WORKING_MODE_TYPE 0x24 115 #define SET_WORKING_MODE_U2C 0x00 116 #define SET_WORKING_MODE_RS485 0x01 117 #define SET_WORKING_MODE_PDMA 0x02 118 #define SET_WORKING_MODE_SPP 0x03 119 120 #define SET_FLOWCTL_CHAR 0x40 121 #define SET_FLOWCTL_CHAR_TYPE 0x25 122 123 #define GET_VERSION 0xc0 124 #define GET_VERSION_TYPE 0x26 125 126 #define SET_REGISTER 0x40 127 #define SET_REGISTER_TYPE 0x27 128 129 #define GET_REGISTER 0xc0 130 #define GET_REGISTER_TYPE 0x28 131 132 #define SET_RAM 0x40 133 #define SET_RAM_TYPE 0x31 134 135 #define GET_RAM 0xc0 136 #define GET_RAM_TYPE 0x32 137 138 /* how come ??? */ 139 #define UART_STATE 0x08 140 #define UART_STATE_TRANSIENT_MASK 0x74 141 #define UART_DCD 0x01 142 #define UART_DSR 0x02 143 #define UART_BREAK_ERROR 0x04 144 #define UART_RING 0x08 145 #define UART_FRAME_ERROR 0x10 146 #define UART_PARITY_ERROR 0x20 147 #define UART_OVERRUN_ERROR 0x40 148 #define UART_CTS 0x80 149 150 enum spcp8x5_type { 151 SPCP825_007_TYPE, 152 SPCP825_008_TYPE, 153 SPCP825_PHILIP_TYPE, 154 SPCP825_INTERMATIC_TYPE, 155 SPCP835_TYPE, 156 }; 157 158 /* 1st in 1st out buffer 4 driver */ 159 struct ringbuf { 160 unsigned int buf_size; 161 char *buf_buf; 162 char *buf_get; 163 char *buf_put; 164 }; 165 166 /* alloc the ring buf and alloc the buffer itself */ 167 static inline struct ringbuf *alloc_ringbuf(unsigned int size) 168 { 169 struct ringbuf *pb; 170 171 if (size == 0) 172 return NULL; 173 174 pb = kmalloc(sizeof(*pb), GFP_KERNEL); 175 if (pb == NULL) 176 return NULL; 177 178 pb->buf_buf = kmalloc(size, GFP_KERNEL); 179 if (pb->buf_buf == NULL) { 180 kfree(pb); 181 return NULL; 182 } 183 184 pb->buf_size = size; 185 pb->buf_get = pb->buf_put = pb->buf_buf; 186 187 return pb; 188 } 189 190 /* free the ring buf and the buffer itself */ 191 static inline void free_ringbuf(struct ringbuf *pb) 192 { 193 if (pb != NULL) { 194 kfree(pb->buf_buf); 195 kfree(pb); 196 } 197 } 198 199 /* clear pipo , juest repoint the pointer here */ 200 static inline void clear_ringbuf(struct ringbuf *pb) 201 { 202 if (pb != NULL) 203 pb->buf_get = pb->buf_put; 204 } 205 206 /* get the number of data in the pipo */ 207 static inline unsigned int ringbuf_avail_data(struct ringbuf *pb) 208 { 209 if (pb == NULL) 210 return 0; 211 return (pb->buf_size + pb->buf_put - pb->buf_get) % pb->buf_size; 212 } 213 214 /* get the number of space in the pipo */ 215 static inline unsigned int ringbuf_avail_space(struct ringbuf *pb) 216 { 217 if (pb == NULL) 218 return 0; 219 return (pb->buf_size + pb->buf_get - pb->buf_put - 1) % pb->buf_size; 220 } 221 222 /* put count data into pipo */ 223 static unsigned int put_ringbuf(struct ringbuf *pb, const char *buf, 224 unsigned int count) 225 { 226 unsigned int len; 227 228 if (pb == NULL) 229 return 0; 230 231 len = ringbuf_avail_space(pb); 232 if (count > len) 233 count = len; 234 235 if (count == 0) 236 return 0; 237 238 len = pb->buf_buf + pb->buf_size - pb->buf_put; 239 if (count > len) { 240 memcpy(pb->buf_put, buf, len); 241 memcpy(pb->buf_buf, buf+len, count - len); 242 pb->buf_put = pb->buf_buf + count - len; 243 } else { 244 memcpy(pb->buf_put, buf, count); 245 if (count < len) 246 pb->buf_put += count; 247 else /* count == len */ 248 pb->buf_put = pb->buf_buf; 249 } 250 return count; 251 } 252 253 /* get count data from pipo */ 254 static unsigned int get_ringbuf(struct ringbuf *pb, char *buf, 255 unsigned int count) 256 { 257 unsigned int len; 258 259 if (pb == NULL || buf == NULL) 260 return 0; 261 262 len = ringbuf_avail_data(pb); 263 if (count > len) 264 count = len; 265 266 if (count == 0) 267 return 0; 268 269 len = pb->buf_buf + pb->buf_size - pb->buf_get; 270 if (count > len) { 271 memcpy(buf, pb->buf_get, len); 272 memcpy(buf+len, pb->buf_buf, count - len); 273 pb->buf_get = pb->buf_buf + count - len; 274 } else { 275 memcpy(buf, pb->buf_get, count); 276 if (count < len) 277 pb->buf_get += count; 278 else /* count == len */ 279 pb->buf_get = pb->buf_buf; 280 } 281 282 return count; 283 } 284 285 static struct usb_driver spcp8x5_driver = { 286 .name = "spcp8x5", 287 .probe = usb_serial_probe, 288 .disconnect = usb_serial_disconnect, 289 .id_table = id_table, 290 .no_dynamic_id = 1, 291 }; 292 293 294 struct spcp8x5_private { 295 spinlock_t lock; 296 struct ringbuf *buf; 297 int write_urb_in_use; 298 enum spcp8x5_type type; 299 wait_queue_head_t delta_msr_wait; 300 u8 line_control; 301 u8 line_status; 302 u8 termios_initialized; 303 }; 304 305 /* desc : when device plug in,this function would be called. 306 * thanks to usb_serial subsystem,then do almost every things for us. And what 307 * we should do just alloc the buffer */ 308 static int spcp8x5_startup(struct usb_serial *serial) 309 { 310 struct spcp8x5_private *priv; 311 int i; 312 enum spcp8x5_type type = SPCP825_007_TYPE; 313 u16 product = le16_to_cpu(serial->dev->descriptor.idProduct); 314 315 if (product == 0x0201) 316 type = SPCP825_007_TYPE; 317 else if (product == 0x0231) 318 type = SPCP835_TYPE; 319 else if (product == 0x0235) 320 type = SPCP825_008_TYPE; 321 else if (product == 0x0204) 322 type = SPCP825_INTERMATIC_TYPE; 323 else if (product == 0x0471 && 324 serial->dev->descriptor.idVendor == cpu_to_le16(0x081e)) 325 type = SPCP825_PHILIP_TYPE; 326 dev_dbg(&serial->dev->dev, "device type = %d\n", (int)type); 327 328 for (i = 0; i < serial->num_ports; ++i) { 329 priv = kzalloc(sizeof(struct spcp8x5_private), GFP_KERNEL); 330 if (!priv) 331 goto cleanup; 332 333 spin_lock_init(&priv->lock); 334 priv->buf = alloc_ringbuf(SPCP8x5_BUF_SIZE); 335 if (priv->buf == NULL) 336 goto cleanup2; 337 338 init_waitqueue_head(&priv->delta_msr_wait); 339 priv->type = type; 340 usb_set_serial_port_data(serial->port[i] , priv); 341 342 } 343 344 return 0; 345 346 cleanup2: 347 kfree(priv); 348 cleanup: 349 for (--i; i >= 0; --i) { 350 priv = usb_get_serial_port_data(serial->port[i]); 351 free_ringbuf(priv->buf); 352 kfree(priv); 353 usb_set_serial_port_data(serial->port[i] , NULL); 354 } 355 return -ENOMEM; 356 } 357 358 /* call when the device plug out. free all the memory alloced by probe */ 359 static void spcp8x5_shutdown(struct usb_serial *serial) 360 { 361 int i; 362 struct spcp8x5_private *priv; 363 364 for (i = 0; i < serial->num_ports; i++) { 365 priv = usb_get_serial_port_data(serial->port[i]); 366 if (priv) { 367 free_ringbuf(priv->buf); 368 kfree(priv); 369 usb_set_serial_port_data(serial->port[i] , NULL); 370 } 371 } 372 } 373 374 /* set the modem control line of the device. 375 * NOTE spcp825-007 not supported this */ 376 static int spcp8x5_set_ctrlLine(struct usb_device *dev, u8 value, 377 enum spcp8x5_type type) 378 { 379 int retval; 380 u8 mcr = 0 ; 381 382 if (type == SPCP825_007_TYPE) 383 return -EPERM; 384 385 mcr = (unsigned short)value; 386 retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 387 SET_UART_STATUS_TYPE, SET_UART_STATUS, 388 mcr, 0x04, NULL, 0, 100); 389 if (retval != 0) 390 dev_dbg(&dev->dev, "usb_control_msg return %#x\n", retval); 391 return retval; 392 } 393 394 /* get the modem status register of the device 395 * NOTE spcp825-007 not supported this */ 396 static int spcp8x5_get_msr(struct usb_device *dev, u8 *status, 397 enum spcp8x5_type type) 398 { 399 u8 *status_buffer; 400 int ret; 401 402 /* I return Permited not support here but seem inval device 403 * is more fix */ 404 if (type == SPCP825_007_TYPE) 405 return -EPERM; 406 if (status == NULL) 407 return -EINVAL; 408 409 status_buffer = kmalloc(1, GFP_KERNEL); 410 if (!status_buffer) 411 return -ENOMEM; 412 status_buffer[0] = status[0]; 413 414 ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), 415 GET_UART_STATUS, GET_UART_STATUS_TYPE, 416 0, GET_UART_STATUS_MSR, status_buffer, 1, 100); 417 if (ret < 0) 418 dev_dbg(&dev->dev, "Get MSR = 0x%p failed (error = %d)", 419 status_buffer, ret); 420 421 dev_dbg(&dev->dev, "0xc0:0x22:0:6 %d - 0x%p ", ret, status_buffer); 422 status[0] = status_buffer[0]; 423 kfree(status_buffer); 424 425 return ret; 426 } 427 428 /* select the work mode. 429 * NOTE this function not supported by spcp825-007 */ 430 static void spcp8x5_set_workMode(struct usb_device *dev, u16 value, 431 u16 index, enum spcp8x5_type type) 432 { 433 int ret; 434 435 /* I return Permited not support here but seem inval device 436 * is more fix */ 437 if (type == SPCP825_007_TYPE) 438 return; 439 440 ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 441 SET_WORKING_MODE_TYPE, SET_WORKING_MODE, 442 value, index, NULL, 0, 100); 443 dev_dbg(&dev->dev, "value = %#x , index = %#x\n", value, index); 444 if (ret < 0) 445 dev_dbg(&dev->dev, 446 "RTSCTS usb_control_msg(enable flowctrl) = %d\n", ret); 447 } 448 449 static int spcp8x5_carrier_raised(struct usb_serial_port *port) 450 { 451 struct spcp8x5_private *priv = usb_get_serial_port_data(port); 452 if (priv->line_status & MSR_STATUS_LINE_DCD) 453 return 1; 454 return 0; 455 } 456 457 static void spcp8x5_dtr_rts(struct usb_serial_port *port, int on) 458 { 459 struct spcp8x5_private *priv = usb_get_serial_port_data(port); 460 unsigned long flags; 461 u8 control; 462 463 spin_lock_irqsave(&priv->lock, flags); 464 if (on) 465 priv->line_control = MCR_CONTROL_LINE_DTR 466 | MCR_CONTROL_LINE_RTS; 467 else 468 priv->line_control &= ~ (MCR_CONTROL_LINE_DTR 469 | MCR_CONTROL_LINE_RTS); 470 control = priv->line_control; 471 spin_unlock_irqrestore(&priv->lock, flags); 472 spcp8x5_set_ctrlLine(port->serial->dev, control , priv->type); 473 } 474 475 /* close the serial port. We should wait for data sending to device 1st and 476 * then kill all urb. */ 477 static void spcp8x5_close(struct usb_serial_port *port) 478 { 479 struct spcp8x5_private *priv = usb_get_serial_port_data(port); 480 unsigned long flags; 481 int result; 482 483 dbg("%s - port %d", __func__, port->number); 484 485 spin_lock_irqsave(&priv->lock, flags); 486 /* clear out any remaining data in the buffer */ 487 clear_ringbuf(priv->buf); 488 spin_unlock_irqrestore(&priv->lock, flags); 489 490 /* kill urb */ 491 if (port->write_urb != NULL) { 492 result = usb_unlink_urb(port->write_urb); 493 if (result) 494 dev_dbg(&port->dev, 495 "usb_unlink_urb(write_urb) = %d\n", result); 496 } 497 result = usb_unlink_urb(port->read_urb); 498 if (result) 499 dev_dbg(&port->dev, "usb_unlink_urb(read_urb) = %d\n", result); 500 } 501 502 /* set the serial param for transfer. we should check if we really need to 503 * transfer. if we set flow control we should do this too. */ 504 static void spcp8x5_set_termios(struct tty_struct *tty, 505 struct usb_serial_port *port, struct ktermios *old_termios) 506 { 507 struct usb_serial *serial = port->serial; 508 struct spcp8x5_private *priv = usb_get_serial_port_data(port); 509 unsigned long flags; 510 unsigned int cflag = tty->termios->c_cflag; 511 unsigned int old_cflag = old_termios->c_cflag; 512 unsigned short uartdata; 513 unsigned char buf[2] = {0, 0}; 514 int baud; 515 int i; 516 u8 control; 517 518 /* for the 1st time call this function */ 519 spin_lock_irqsave(&priv->lock, flags); 520 if (!priv->termios_initialized) { 521 *(tty->termios) = tty_std_termios; 522 tty->termios->c_cflag = B115200 | CS8 | CREAD | HUPCL | CLOCAL; 523 tty->termios->c_ispeed = 115200; 524 tty->termios->c_ospeed = 115200; 525 priv->termios_initialized = 1; 526 } 527 spin_unlock_irqrestore(&priv->lock, flags); 528 529 /* check that they really want us to change something */ 530 if (!tty_termios_hw_change(tty->termios, old_termios)) 531 return; 532 533 /* set DTR/RTS active */ 534 spin_lock_irqsave(&priv->lock, flags); 535 control = priv->line_control; 536 if ((old_cflag & CBAUD) == B0) { 537 priv->line_control |= MCR_DTR; 538 if (!(old_cflag & CRTSCTS)) 539 priv->line_control |= MCR_RTS; 540 } 541 if (control != priv->line_control) { 542 control = priv->line_control; 543 spin_unlock_irqrestore(&priv->lock, flags); 544 spcp8x5_set_ctrlLine(serial->dev, control , priv->type); 545 } else { 546 spin_unlock_irqrestore(&priv->lock, flags); 547 } 548 549 /* Set Baud Rate */ 550 baud = tty_get_baud_rate(tty);; 551 switch (baud) { 552 case 300: buf[0] = 0x00; break; 553 case 600: buf[0] = 0x01; break; 554 case 1200: buf[0] = 0x02; break; 555 case 2400: buf[0] = 0x03; break; 556 case 4800: buf[0] = 0x04; break; 557 case 9600: buf[0] = 0x05; break; 558 case 19200: buf[0] = 0x07; break; 559 case 38400: buf[0] = 0x09; break; 560 case 57600: buf[0] = 0x0a; break; 561 case 115200: buf[0] = 0x0b; break; 562 case 230400: buf[0] = 0x0c; break; 563 case 460800: buf[0] = 0x0d; break; 564 case 921600: buf[0] = 0x0e; break; 565 /* case 1200000: buf[0] = 0x0f; break; */ 566 /* case 2400000: buf[0] = 0x10; break; */ 567 case 3000000: buf[0] = 0x11; break; 568 /* case 6000000: buf[0] = 0x12; break; */ 569 case 0: 570 case 1000000: 571 buf[0] = 0x0b; break; 572 default: 573 dev_err(&port->dev, "spcp825 driver does not support the " 574 "baudrate requested, using default of 9600.\n"); 575 } 576 577 /* Set Data Length : 00:5bit, 01:6bit, 10:7bit, 11:8bit */ 578 if (cflag & CSIZE) { 579 switch (cflag & CSIZE) { 580 case CS5: 581 buf[1] |= SET_UART_FORMAT_SIZE_5; 582 break; 583 case CS6: 584 buf[1] |= SET_UART_FORMAT_SIZE_6; 585 break; 586 case CS7: 587 buf[1] |= SET_UART_FORMAT_SIZE_7; 588 break; 589 default: 590 case CS8: 591 buf[1] |= SET_UART_FORMAT_SIZE_8; 592 break; 593 } 594 } 595 596 /* Set Stop bit2 : 0:1bit 1:2bit */ 597 buf[1] |= (cflag & CSTOPB) ? SET_UART_FORMAT_STOP_2 : 598 SET_UART_FORMAT_STOP_1; 599 600 /* Set Parity bit3-4 01:Odd 11:Even */ 601 if (cflag & PARENB) { 602 buf[1] |= (cflag & PARODD) ? 603 SET_UART_FORMAT_PAR_ODD : SET_UART_FORMAT_PAR_EVEN ; 604 } else 605 buf[1] |= SET_UART_FORMAT_PAR_NONE; 606 607 uartdata = buf[0] | buf[1]<<8; 608 609 i = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), 610 SET_UART_FORMAT_TYPE, SET_UART_FORMAT, 611 uartdata, 0, NULL, 0, 100); 612 if (i < 0) 613 dev_err(&port->dev, "Set UART format %#x failed (error = %d)\n", 614 uartdata, i); 615 dbg("0x21:0x40:0:0 %d\n", i); 616 617 if (cflag & CRTSCTS) { 618 /* enable hardware flow control */ 619 spcp8x5_set_workMode(serial->dev, 0x000a, 620 SET_WORKING_MODE_U2C, priv->type); 621 } 622 return; 623 } 624 625 /* open the serial port. do some usb system call. set termios and get the line 626 * status of the device. then submit the read urb */ 627 static int spcp8x5_open(struct tty_struct *tty, 628 struct usb_serial_port *port, struct file *filp) 629 { 630 struct ktermios tmp_termios; 631 struct usb_serial *serial = port->serial; 632 struct spcp8x5_private *priv = usb_get_serial_port_data(port); 633 int ret; 634 unsigned long flags; 635 u8 status = 0x30; 636 /* status 0x30 means DSR and CTS = 1 other CDC RI and delta = 0 */ 637 638 dbg("%s - port %d", __func__, port->number); 639 640 usb_clear_halt(serial->dev, port->write_urb->pipe); 641 usb_clear_halt(serial->dev, port->read_urb->pipe); 642 643 ret = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), 644 0x09, 0x00, 645 0x01, 0x00, NULL, 0x00, 100); 646 if (ret) 647 return ret; 648 649 spcp8x5_set_ctrlLine(serial->dev, priv->line_control , priv->type); 650 651 /* Setup termios */ 652 if (tty) 653 spcp8x5_set_termios(tty, port, &tmp_termios); 654 655 spcp8x5_get_msr(serial->dev, &status, priv->type); 656 657 /* may be we should update uart status here but now we did not do */ 658 spin_lock_irqsave(&priv->lock, flags); 659 priv->line_status = status & 0xf0 ; 660 spin_unlock_irqrestore(&priv->lock, flags); 661 662 /* FIXME: need to assert RTS and DTR if CRTSCTS off */ 663 664 dbg("%s - submitting read urb", __func__); 665 port->read_urb->dev = serial->dev; 666 ret = usb_submit_urb(port->read_urb, GFP_KERNEL); 667 if (ret) { 668 spcp8x5_close(port); 669 return -EPROTO; 670 } 671 port->port.drain_delay = 256; 672 return 0; 673 } 674 675 /* bulk read call back function. check the status of the urb. if transfer 676 * failed return. then update the status and the tty send data to tty subsys. 677 * submit urb again. 678 */ 679 static void spcp8x5_read_bulk_callback(struct urb *urb) 680 { 681 struct usb_serial_port *port = urb->context; 682 struct spcp8x5_private *priv = usb_get_serial_port_data(port); 683 struct tty_struct *tty; 684 unsigned char *data = urb->transfer_buffer; 685 unsigned long flags; 686 int i; 687 int result = urb->status; 688 u8 status; 689 char tty_flag; 690 691 dev_dbg(&port->dev, "start, result = %d, urb->actual_length = %d\n,", 692 result, urb->actual_length); 693 694 /* check the urb status */ 695 if (result) { 696 if (!port->port.count) 697 return; 698 if (result == -EPROTO) { 699 /* spcp8x5 mysteriously fails with -EPROTO */ 700 /* reschedule the read */ 701 urb->dev = port->serial->dev; 702 result = usb_submit_urb(urb , GFP_ATOMIC); 703 if (result) 704 dev_dbg(&port->dev, 705 "failed submitting read urb %d\n", 706 result); 707 return; 708 } 709 dev_dbg(&port->dev, "unable to handle the error, exiting.\n"); 710 return; 711 } 712 713 /* get tty_flag from status */ 714 tty_flag = TTY_NORMAL; 715 716 spin_lock_irqsave(&priv->lock, flags); 717 status = priv->line_status; 718 priv->line_status &= ~UART_STATE_TRANSIENT_MASK; 719 spin_unlock_irqrestore(&priv->lock, flags); 720 /* wake up the wait for termios */ 721 wake_up_interruptible(&priv->delta_msr_wait); 722 723 /* break takes precedence over parity, which takes precedence over 724 * framing errors */ 725 if (status & UART_BREAK_ERROR) 726 tty_flag = TTY_BREAK; 727 else if (status & UART_PARITY_ERROR) 728 tty_flag = TTY_PARITY; 729 else if (status & UART_FRAME_ERROR) 730 tty_flag = TTY_FRAME; 731 dev_dbg(&port->dev, "tty_flag = %d\n", tty_flag); 732 733 tty = tty_port_tty_get(&port->port); 734 if (tty && urb->actual_length) { 735 tty_buffer_request_room(tty, urb->actual_length + 1); 736 /* overrun is special, not associated with a char */ 737 if (status & UART_OVERRUN_ERROR) 738 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 739 for (i = 0; i < urb->actual_length; ++i) 740 tty_insert_flip_char(tty, data[i], tty_flag); 741 tty_flip_buffer_push(tty); 742 } 743 tty_kref_put(tty); 744 745 /* Schedule the next read _if_ we are still open */ 746 if (port->port.count) { 747 urb->dev = port->serial->dev; 748 result = usb_submit_urb(urb , GFP_ATOMIC); 749 if (result) 750 dev_dbg(&port->dev, "failed submitting read urb %d\n", 751 result); 752 } 753 754 return; 755 } 756 757 /* get data from ring buffer and then write to usb bus */ 758 static void spcp8x5_send(struct usb_serial_port *port) 759 { 760 int count, result; 761 struct spcp8x5_private *priv = usb_get_serial_port_data(port); 762 unsigned long flags; 763 764 spin_lock_irqsave(&priv->lock, flags); 765 766 if (priv->write_urb_in_use) { 767 dev_dbg(&port->dev, "write urb still used\n"); 768 spin_unlock_irqrestore(&priv->lock, flags); 769 return; 770 } 771 772 /* send the 1st urb for writting */ 773 memset(port->write_urb->transfer_buffer , 0x00 , port->bulk_out_size); 774 count = get_ringbuf(priv->buf, port->write_urb->transfer_buffer, 775 port->bulk_out_size); 776 777 if (count == 0) { 778 spin_unlock_irqrestore(&priv->lock, flags); 779 return; 780 } 781 782 /* update the urb status */ 783 priv->write_urb_in_use = 1; 784 785 spin_unlock_irqrestore(&priv->lock, flags); 786 787 port->write_urb->transfer_buffer_length = count; 788 port->write_urb->dev = port->serial->dev; 789 790 result = usb_submit_urb(port->write_urb, GFP_ATOMIC); 791 if (result) { 792 dev_dbg(&port->dev, "failed submitting write urb, error %d\n", 793 result); 794 priv->write_urb_in_use = 0; 795 /* TODO: reschedule spcp8x5_send */ 796 } 797 798 799 schedule_work(&port->work); 800 } 801 802 /* this is the call back function for write urb. NOTE we should not sleep in 803 * this routine. check the urb return code and then submit the write urb again 804 * to hold the write loop */ 805 static void spcp8x5_write_bulk_callback(struct urb *urb) 806 { 807 struct usb_serial_port *port = urb->context; 808 struct spcp8x5_private *priv = usb_get_serial_port_data(port); 809 int result; 810 int status = urb->status; 811 812 switch (status) { 813 case 0: 814 /* success */ 815 break; 816 case -ECONNRESET: 817 case -ENOENT: 818 case -ESHUTDOWN: 819 /* this urb is terminated, clean up */ 820 dev_dbg(&port->dev, "urb shutting down with status: %d\n", 821 status); 822 priv->write_urb_in_use = 0; 823 return; 824 default: 825 /* error in the urb, so we have to resubmit it */ 826 dbg("%s - Overflow in write", __func__); 827 dbg("%s - nonzero write bulk status received: %d", 828 __func__, status); 829 port->write_urb->transfer_buffer_length = 1; 830 port->write_urb->dev = port->serial->dev; 831 result = usb_submit_urb(port->write_urb, GFP_ATOMIC); 832 if (result) 833 dev_dbg(&port->dev, 834 "failed resubmitting write urb %d\n", result); 835 else 836 return; 837 } 838 839 priv->write_urb_in_use = 0; 840 841 /* send any buffered data */ 842 spcp8x5_send(port); 843 } 844 845 /* write data to ring buffer. and then start the write transfer */ 846 static int spcp8x5_write(struct tty_struct *tty, struct usb_serial_port *port, 847 const unsigned char *buf, int count) 848 { 849 struct spcp8x5_private *priv = usb_get_serial_port_data(port); 850 unsigned long flags; 851 852 dev_dbg(&port->dev, "%d bytes\n", count); 853 854 if (!count) 855 return count; 856 857 spin_lock_irqsave(&priv->lock, flags); 858 count = put_ringbuf(priv->buf, buf, count); 859 spin_unlock_irqrestore(&priv->lock, flags); 860 861 spcp8x5_send(port); 862 863 return count; 864 } 865 866 static int spcp8x5_wait_modem_info(struct usb_serial_port *port, 867 unsigned int arg) 868 { 869 struct spcp8x5_private *priv = usb_get_serial_port_data(port); 870 unsigned long flags; 871 unsigned int prevstatus; 872 unsigned int status; 873 unsigned int changed; 874 875 spin_lock_irqsave(&priv->lock, flags); 876 prevstatus = priv->line_status; 877 spin_unlock_irqrestore(&priv->lock, flags); 878 879 while (1) { 880 /* wake up in bulk read */ 881 interruptible_sleep_on(&priv->delta_msr_wait); 882 883 /* see if a signal did it */ 884 if (signal_pending(current)) 885 return -ERESTARTSYS; 886 887 spin_lock_irqsave(&priv->lock, flags); 888 status = priv->line_status; 889 spin_unlock_irqrestore(&priv->lock, flags); 890 891 changed = prevstatus^status; 892 893 if (((arg & TIOCM_RNG) && (changed & MSR_STATUS_LINE_RI)) || 894 ((arg & TIOCM_DSR) && (changed & MSR_STATUS_LINE_DSR)) || 895 ((arg & TIOCM_CD) && (changed & MSR_STATUS_LINE_DCD)) || 896 ((arg & TIOCM_CTS) && (changed & MSR_STATUS_LINE_CTS))) 897 return 0; 898 899 prevstatus = status; 900 } 901 /* NOTREACHED */ 902 return 0; 903 } 904 905 static int spcp8x5_ioctl(struct tty_struct *tty, struct file *file, 906 unsigned int cmd, unsigned long arg) 907 { 908 struct usb_serial_port *port = tty->driver_data; 909 dbg("%s (%d) cmd = 0x%04x", __func__, port->number, cmd); 910 911 switch (cmd) { 912 case TIOCMIWAIT: 913 dbg("%s (%d) TIOCMIWAIT", __func__, port->number); 914 return spcp8x5_wait_modem_info(port, arg); 915 916 default: 917 dbg("%s not supported = 0x%04x", __func__, cmd); 918 break; 919 } 920 921 return -ENOIOCTLCMD; 922 } 923 924 static int spcp8x5_tiocmset(struct tty_struct *tty, struct file *file, 925 unsigned int set, unsigned int clear) 926 { 927 struct usb_serial_port *port = tty->driver_data; 928 struct spcp8x5_private *priv = usb_get_serial_port_data(port); 929 unsigned long flags; 930 u8 control; 931 932 spin_lock_irqsave(&priv->lock, flags); 933 if (set & TIOCM_RTS) 934 priv->line_control |= MCR_RTS; 935 if (set & TIOCM_DTR) 936 priv->line_control |= MCR_DTR; 937 if (clear & TIOCM_RTS) 938 priv->line_control &= ~MCR_RTS; 939 if (clear & TIOCM_DTR) 940 priv->line_control &= ~MCR_DTR; 941 control = priv->line_control; 942 spin_unlock_irqrestore(&priv->lock, flags); 943 944 return spcp8x5_set_ctrlLine(port->serial->dev, control , priv->type); 945 } 946 947 static int spcp8x5_tiocmget(struct tty_struct *tty, struct file *file) 948 { 949 struct usb_serial_port *port = tty->driver_data; 950 struct spcp8x5_private *priv = usb_get_serial_port_data(port); 951 unsigned long flags; 952 unsigned int mcr; 953 unsigned int status; 954 unsigned int result; 955 956 spin_lock_irqsave(&priv->lock, flags); 957 mcr = priv->line_control; 958 status = priv->line_status; 959 spin_unlock_irqrestore(&priv->lock, flags); 960 961 result = ((mcr & MCR_DTR) ? TIOCM_DTR : 0) 962 | ((mcr & MCR_RTS) ? TIOCM_RTS : 0) 963 | ((status & MSR_STATUS_LINE_CTS) ? TIOCM_CTS : 0) 964 | ((status & MSR_STATUS_LINE_DSR) ? TIOCM_DSR : 0) 965 | ((status & MSR_STATUS_LINE_RI) ? TIOCM_RI : 0) 966 | ((status & MSR_STATUS_LINE_DCD) ? TIOCM_CD : 0); 967 968 return result; 969 } 970 971 /* get the avail space room in ring buffer */ 972 static int spcp8x5_write_room(struct tty_struct *tty) 973 { 974 struct usb_serial_port *port = tty->driver_data; 975 struct spcp8x5_private *priv = usb_get_serial_port_data(port); 976 int room = 0; 977 unsigned long flags; 978 979 spin_lock_irqsave(&priv->lock, flags); 980 room = ringbuf_avail_space(priv->buf); 981 spin_unlock_irqrestore(&priv->lock, flags); 982 983 return room; 984 } 985 986 /* get the number of avail data in write ring buffer */ 987 static int spcp8x5_chars_in_buffer(struct tty_struct *tty) 988 { 989 struct usb_serial_port *port = tty->driver_data; 990 struct spcp8x5_private *priv = usb_get_serial_port_data(port); 991 int chars = 0; 992 unsigned long flags; 993 994 spin_lock_irqsave(&priv->lock, flags); 995 chars = ringbuf_avail_data(priv->buf); 996 spin_unlock_irqrestore(&priv->lock, flags); 997 998 return chars; 999 } 1000 1001 /* All of the device info needed for the spcp8x5 SIO serial converter */ 1002 static struct usb_serial_driver spcp8x5_device = { 1003 .driver = { 1004 .owner = THIS_MODULE, 1005 .name = "SPCP8x5", 1006 }, 1007 .id_table = id_table, 1008 .num_ports = 1, 1009 .open = spcp8x5_open, 1010 .close = spcp8x5_close, 1011 .dtr_rts = spcp8x5_dtr_rts, 1012 .carrier_raised = spcp8x5_carrier_raised, 1013 .write = spcp8x5_write, 1014 .set_termios = spcp8x5_set_termios, 1015 .ioctl = spcp8x5_ioctl, 1016 .tiocmget = spcp8x5_tiocmget, 1017 .tiocmset = spcp8x5_tiocmset, 1018 .write_room = spcp8x5_write_room, 1019 .read_bulk_callback = spcp8x5_read_bulk_callback, 1020 .write_bulk_callback = spcp8x5_write_bulk_callback, 1021 .chars_in_buffer = spcp8x5_chars_in_buffer, 1022 .attach = spcp8x5_startup, 1023 .shutdown = spcp8x5_shutdown, 1024 }; 1025 1026 static int __init spcp8x5_init(void) 1027 { 1028 int retval; 1029 retval = usb_serial_register(&spcp8x5_device); 1030 if (retval) 1031 goto failed_usb_serial_register; 1032 retval = usb_register(&spcp8x5_driver); 1033 if (retval) 1034 goto failed_usb_register; 1035 printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" 1036 DRIVER_DESC "\n"); 1037 return 0; 1038 failed_usb_register: 1039 usb_serial_deregister(&spcp8x5_device); 1040 failed_usb_serial_register: 1041 return retval; 1042 } 1043 1044 static void __exit spcp8x5_exit(void) 1045 { 1046 usb_deregister(&spcp8x5_driver); 1047 usb_serial_deregister(&spcp8x5_device); 1048 } 1049 1050 module_init(spcp8x5_init); 1051 module_exit(spcp8x5_exit); 1052 1053 MODULE_DESCRIPTION(DRIVER_DESC); 1054 MODULE_VERSION(DRIVER_VERSION); 1055 MODULE_LICENSE("GPL"); 1056 1057 module_param(debug, bool, S_IRUGO | S_IWUSR); 1058 MODULE_PARM_DESC(debug, "Debug enabled or not"); 1059