oti6858.c (23988B)
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Ours Technology Inc. OTi-6858 USB to serial adapter driver. 4 * 5 * Copyleft (C) 2007 Kees Lemmens (adapted for kernel 2.6.20) 6 * Copyright (C) 2006 Tomasz Michal Lukaszewski (FIXME: add e-mail) 7 * Copyright (C) 2001-2004 Greg Kroah-Hartman (greg@kroah.com) 8 * Copyright (C) 2003 IBM Corp. 9 * 10 * Many thanks to the authors of pl2303 driver: all functions in this file 11 * are heavily based on pl2303 code, buffering code is a 1-to-1 copy. 12 * 13 * Warning! You use this driver on your own risk! The only official 14 * description of this device I have is datasheet from manufacturer, 15 * and it doesn't contain almost any information needed to write a driver. 16 * Almost all knowlegde used while writing this driver was gathered by: 17 * - analyzing traffic between device and the M$ Windows 2000 driver, 18 * - trying different bit combinations and checking pin states 19 * with a voltmeter, 20 * - receiving malformed frames and producing buffer overflows 21 * to learn how errors are reported, 22 * So, THIS CODE CAN DESTROY OTi-6858 AND ANY OTHER DEVICES, THAT ARE 23 * CONNECTED TO IT! 24 * 25 * See Documentation/usb/usb-serial.rst for more information on using this 26 * driver 27 * 28 * TODO: 29 * - implement correct flushing for ioctls and oti6858_close() 30 * - check how errors (rx overflow, parity error, framing error) are reported 31 * - implement oti6858_break_ctl() 32 * - implement more ioctls 33 * - test/implement flow control 34 * - allow setting custom baud rates 35 */ 36 37#include <linux/kernel.h> 38#include <linux/errno.h> 39#include <linux/slab.h> 40#include <linux/tty.h> 41#include <linux/tty_driver.h> 42#include <linux/tty_flip.h> 43#include <linux/serial.h> 44#include <linux/module.h> 45#include <linux/moduleparam.h> 46#include <linux/spinlock.h> 47#include <linux/usb.h> 48#include <linux/usb/serial.h> 49#include <linux/uaccess.h> 50#include <linux/kfifo.h> 51#include "oti6858.h" 52 53#define OTI6858_DESCRIPTION \ 54 "Ours Technology Inc. OTi-6858 USB to serial adapter driver" 55#define OTI6858_AUTHOR "Tomasz Michal Lukaszewski <FIXME@FIXME>" 56 57static const struct usb_device_id id_table[] = { 58 { USB_DEVICE(OTI6858_VENDOR_ID, OTI6858_PRODUCT_ID) }, 59 { } 60}; 61 62MODULE_DEVICE_TABLE(usb, id_table); 63 64/* requests */ 65#define OTI6858_REQ_GET_STATUS (USB_DIR_IN | USB_TYPE_VENDOR | 0x00) 66#define OTI6858_REQ_T_GET_STATUS 0x01 67 68#define OTI6858_REQ_SET_LINE (USB_DIR_OUT | USB_TYPE_VENDOR | 0x00) 69#define OTI6858_REQ_T_SET_LINE 0x00 70 71#define OTI6858_REQ_CHECK_TXBUFF (USB_DIR_IN | USB_TYPE_VENDOR | 0x01) 72#define OTI6858_REQ_T_CHECK_TXBUFF 0x00 73 74/* format of the control packet */ 75struct oti6858_control_pkt { 76 __le16 divisor; /* baud rate = 96000000 / (16 * divisor), LE */ 77#define OTI6858_MAX_BAUD_RATE 3000000 78 u8 frame_fmt; 79#define FMT_STOP_BITS_MASK 0xc0 80#define FMT_STOP_BITS_1 0x00 81#define FMT_STOP_BITS_2 0x40 /* 1.5 stop bits if FMT_DATA_BITS_5 */ 82#define FMT_PARITY_MASK 0x38 83#define FMT_PARITY_NONE 0x00 84#define FMT_PARITY_ODD 0x08 85#define FMT_PARITY_EVEN 0x18 86#define FMT_PARITY_MARK 0x28 87#define FMT_PARITY_SPACE 0x38 88#define FMT_DATA_BITS_MASK 0x03 89#define FMT_DATA_BITS_5 0x00 90#define FMT_DATA_BITS_6 0x01 91#define FMT_DATA_BITS_7 0x02 92#define FMT_DATA_BITS_8 0x03 93 u8 something; /* always equals 0x43 */ 94 u8 control; /* settings of flow control lines */ 95#define CONTROL_MASK 0x0c 96#define CONTROL_DTR_HIGH 0x08 97#define CONTROL_RTS_HIGH 0x04 98 u8 tx_status; 99#define TX_BUFFER_EMPTIED 0x09 100 u8 pin_state; 101#define PIN_MASK 0x3f 102#define PIN_MSR_MASK 0x1b 103#define PIN_RTS 0x20 /* output pin */ 104#define PIN_CTS 0x10 /* input pin, active low */ 105#define PIN_DSR 0x08 /* input pin, active low */ 106#define PIN_DTR 0x04 /* output pin */ 107#define PIN_RI 0x02 /* input pin, active low */ 108#define PIN_DCD 0x01 /* input pin, active low */ 109 u8 rx_bytes_avail; /* number of bytes in rx buffer */; 110}; 111 112#define OTI6858_CTRL_PKT_SIZE sizeof(struct oti6858_control_pkt) 113#define OTI6858_CTRL_EQUALS_PENDING(a, priv) \ 114 (((a)->divisor == (priv)->pending_setup.divisor) \ 115 && ((a)->control == (priv)->pending_setup.control) \ 116 && ((a)->frame_fmt == (priv)->pending_setup.frame_fmt)) 117 118/* function prototypes */ 119static int oti6858_open(struct tty_struct *tty, struct usb_serial_port *port); 120static void oti6858_close(struct usb_serial_port *port); 121static void oti6858_set_termios(struct tty_struct *tty, 122 struct usb_serial_port *port, struct ktermios *old); 123static void oti6858_init_termios(struct tty_struct *tty); 124static void oti6858_read_int_callback(struct urb *urb); 125static void oti6858_read_bulk_callback(struct urb *urb); 126static void oti6858_write_bulk_callback(struct urb *urb); 127static int oti6858_write(struct tty_struct *tty, struct usb_serial_port *port, 128 const unsigned char *buf, int count); 129static unsigned int oti6858_write_room(struct tty_struct *tty); 130static unsigned int oti6858_chars_in_buffer(struct tty_struct *tty); 131static int oti6858_tiocmget(struct tty_struct *tty); 132static int oti6858_tiocmset(struct tty_struct *tty, 133 unsigned int set, unsigned int clear); 134static int oti6858_port_probe(struct usb_serial_port *port); 135static void oti6858_port_remove(struct usb_serial_port *port); 136 137/* device info */ 138static struct usb_serial_driver oti6858_device = { 139 .driver = { 140 .owner = THIS_MODULE, 141 .name = "oti6858", 142 }, 143 .id_table = id_table, 144 .num_ports = 1, 145 .num_bulk_in = 1, 146 .num_bulk_out = 1, 147 .num_interrupt_in = 1, 148 .open = oti6858_open, 149 .close = oti6858_close, 150 .write = oti6858_write, 151 .set_termios = oti6858_set_termios, 152 .init_termios = oti6858_init_termios, 153 .tiocmget = oti6858_tiocmget, 154 .tiocmset = oti6858_tiocmset, 155 .tiocmiwait = usb_serial_generic_tiocmiwait, 156 .read_bulk_callback = oti6858_read_bulk_callback, 157 .read_int_callback = oti6858_read_int_callback, 158 .write_bulk_callback = oti6858_write_bulk_callback, 159 .write_room = oti6858_write_room, 160 .chars_in_buffer = oti6858_chars_in_buffer, 161 .port_probe = oti6858_port_probe, 162 .port_remove = oti6858_port_remove, 163}; 164 165static struct usb_serial_driver * const serial_drivers[] = { 166 &oti6858_device, NULL 167}; 168 169struct oti6858_private { 170 spinlock_t lock; 171 172 struct oti6858_control_pkt status; 173 174 struct { 175 u8 read_urb_in_use; 176 u8 write_urb_in_use; 177 } flags; 178 struct delayed_work delayed_write_work; 179 180 struct { 181 __le16 divisor; 182 u8 frame_fmt; 183 u8 control; 184 } pending_setup; 185 u8 transient; 186 u8 setup_done; 187 struct delayed_work delayed_setup_work; 188 189 struct usb_serial_port *port; /* USB port with which associated */ 190}; 191 192static void setup_line(struct work_struct *work) 193{ 194 struct oti6858_private *priv = container_of(work, 195 struct oti6858_private, delayed_setup_work.work); 196 struct usb_serial_port *port = priv->port; 197 struct oti6858_control_pkt *new_setup; 198 unsigned long flags; 199 int result; 200 201 new_setup = kmalloc(OTI6858_CTRL_PKT_SIZE, GFP_KERNEL); 202 if (!new_setup) { 203 /* we will try again */ 204 schedule_delayed_work(&priv->delayed_setup_work, 205 msecs_to_jiffies(2)); 206 return; 207 } 208 209 result = usb_control_msg(port->serial->dev, 210 usb_rcvctrlpipe(port->serial->dev, 0), 211 OTI6858_REQ_T_GET_STATUS, 212 OTI6858_REQ_GET_STATUS, 213 0, 0, 214 new_setup, OTI6858_CTRL_PKT_SIZE, 215 100); 216 217 if (result != OTI6858_CTRL_PKT_SIZE) { 218 dev_err(&port->dev, "%s(): error reading status\n", __func__); 219 kfree(new_setup); 220 /* we will try again */ 221 schedule_delayed_work(&priv->delayed_setup_work, 222 msecs_to_jiffies(2)); 223 return; 224 } 225 226 spin_lock_irqsave(&priv->lock, flags); 227 if (!OTI6858_CTRL_EQUALS_PENDING(new_setup, priv)) { 228 new_setup->divisor = priv->pending_setup.divisor; 229 new_setup->control = priv->pending_setup.control; 230 new_setup->frame_fmt = priv->pending_setup.frame_fmt; 231 232 spin_unlock_irqrestore(&priv->lock, flags); 233 result = usb_control_msg(port->serial->dev, 234 usb_sndctrlpipe(port->serial->dev, 0), 235 OTI6858_REQ_T_SET_LINE, 236 OTI6858_REQ_SET_LINE, 237 0, 0, 238 new_setup, OTI6858_CTRL_PKT_SIZE, 239 100); 240 } else { 241 spin_unlock_irqrestore(&priv->lock, flags); 242 result = 0; 243 } 244 kfree(new_setup); 245 246 spin_lock_irqsave(&priv->lock, flags); 247 if (result != OTI6858_CTRL_PKT_SIZE) 248 priv->transient = 0; 249 priv->setup_done = 1; 250 spin_unlock_irqrestore(&priv->lock, flags); 251 252 dev_dbg(&port->dev, "%s(): submitting interrupt urb\n", __func__); 253 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); 254 if (result != 0) { 255 dev_err(&port->dev, "%s(): usb_submit_urb() failed with error %d\n", 256 __func__, result); 257 } 258} 259 260static void send_data(struct work_struct *work) 261{ 262 struct oti6858_private *priv = container_of(work, 263 struct oti6858_private, delayed_write_work.work); 264 struct usb_serial_port *port = priv->port; 265 int count = 0, result; 266 unsigned long flags; 267 u8 *allow; 268 269 spin_lock_irqsave(&priv->lock, flags); 270 if (priv->flags.write_urb_in_use) { 271 spin_unlock_irqrestore(&priv->lock, flags); 272 schedule_delayed_work(&priv->delayed_write_work, 273 msecs_to_jiffies(2)); 274 return; 275 } 276 priv->flags.write_urb_in_use = 1; 277 spin_unlock_irqrestore(&priv->lock, flags); 278 279 spin_lock_irqsave(&port->lock, flags); 280 count = kfifo_len(&port->write_fifo); 281 spin_unlock_irqrestore(&port->lock, flags); 282 283 if (count > port->bulk_out_size) 284 count = port->bulk_out_size; 285 286 if (count != 0) { 287 allow = kmalloc(1, GFP_KERNEL); 288 if (!allow) 289 return; 290 291 result = usb_control_msg(port->serial->dev, 292 usb_rcvctrlpipe(port->serial->dev, 0), 293 OTI6858_REQ_T_CHECK_TXBUFF, 294 OTI6858_REQ_CHECK_TXBUFF, 295 count, 0, allow, 1, 100); 296 if (result != 1 || *allow != 0) 297 count = 0; 298 kfree(allow); 299 } 300 301 if (count == 0) { 302 priv->flags.write_urb_in_use = 0; 303 304 dev_dbg(&port->dev, "%s(): submitting interrupt urb\n", __func__); 305 result = usb_submit_urb(port->interrupt_in_urb, GFP_NOIO); 306 if (result != 0) { 307 dev_err(&port->dev, "%s(): usb_submit_urb() failed with error %d\n", 308 __func__, result); 309 } 310 return; 311 } 312 313 count = kfifo_out_locked(&port->write_fifo, 314 port->write_urb->transfer_buffer, 315 count, &port->lock); 316 port->write_urb->transfer_buffer_length = count; 317 result = usb_submit_urb(port->write_urb, GFP_NOIO); 318 if (result != 0) { 319 dev_err_console(port, "%s(): usb_submit_urb() failed with error %d\n", 320 __func__, result); 321 priv->flags.write_urb_in_use = 0; 322 } 323 324 usb_serial_port_softint(port); 325} 326 327static int oti6858_port_probe(struct usb_serial_port *port) 328{ 329 struct oti6858_private *priv; 330 331 priv = kzalloc(sizeof(*priv), GFP_KERNEL); 332 if (!priv) 333 return -ENOMEM; 334 335 spin_lock_init(&priv->lock); 336 priv->port = port; 337 INIT_DELAYED_WORK(&priv->delayed_setup_work, setup_line); 338 INIT_DELAYED_WORK(&priv->delayed_write_work, send_data); 339 340 usb_set_serial_port_data(port, priv); 341 342 port->port.drain_delay = 256; /* FIXME: check the FIFO length */ 343 344 return 0; 345} 346 347static void oti6858_port_remove(struct usb_serial_port *port) 348{ 349 struct oti6858_private *priv; 350 351 priv = usb_get_serial_port_data(port); 352 kfree(priv); 353} 354 355static int oti6858_write(struct tty_struct *tty, struct usb_serial_port *port, 356 const unsigned char *buf, int count) 357{ 358 if (!count) 359 return count; 360 361 count = kfifo_in_locked(&port->write_fifo, buf, count, &port->lock); 362 363 return count; 364} 365 366static unsigned int oti6858_write_room(struct tty_struct *tty) 367{ 368 struct usb_serial_port *port = tty->driver_data; 369 unsigned int room; 370 unsigned long flags; 371 372 spin_lock_irqsave(&port->lock, flags); 373 room = kfifo_avail(&port->write_fifo); 374 spin_unlock_irqrestore(&port->lock, flags); 375 376 return room; 377} 378 379static unsigned int oti6858_chars_in_buffer(struct tty_struct *tty) 380{ 381 struct usb_serial_port *port = tty->driver_data; 382 unsigned int chars; 383 unsigned long flags; 384 385 spin_lock_irqsave(&port->lock, flags); 386 chars = kfifo_len(&port->write_fifo); 387 spin_unlock_irqrestore(&port->lock, flags); 388 389 return chars; 390} 391 392static void oti6858_init_termios(struct tty_struct *tty) 393{ 394 tty_encode_baud_rate(tty, 38400, 38400); 395} 396 397static void oti6858_set_termios(struct tty_struct *tty, 398 struct usb_serial_port *port, struct ktermios *old_termios) 399{ 400 struct oti6858_private *priv = usb_get_serial_port_data(port); 401 unsigned long flags; 402 unsigned int cflag; 403 u8 frame_fmt, control; 404 __le16 divisor; 405 int br; 406 407 cflag = tty->termios.c_cflag; 408 409 spin_lock_irqsave(&priv->lock, flags); 410 divisor = priv->pending_setup.divisor; 411 frame_fmt = priv->pending_setup.frame_fmt; 412 control = priv->pending_setup.control; 413 spin_unlock_irqrestore(&priv->lock, flags); 414 415 frame_fmt &= ~FMT_DATA_BITS_MASK; 416 switch (cflag & CSIZE) { 417 case CS5: 418 frame_fmt |= FMT_DATA_BITS_5; 419 break; 420 case CS6: 421 frame_fmt |= FMT_DATA_BITS_6; 422 break; 423 case CS7: 424 frame_fmt |= FMT_DATA_BITS_7; 425 break; 426 default: 427 case CS8: 428 frame_fmt |= FMT_DATA_BITS_8; 429 break; 430 } 431 432 /* manufacturer claims that this device can work with baud rates 433 * up to 3 Mbps; I've tested it only on 115200 bps, so I can't 434 * guarantee that any other baud rate will work (especially 435 * the higher ones) 436 */ 437 br = tty_get_baud_rate(tty); 438 if (br == 0) { 439 divisor = 0; 440 } else { 441 int real_br; 442 int new_divisor; 443 br = min(br, OTI6858_MAX_BAUD_RATE); 444 445 new_divisor = (96000000 + 8 * br) / (16 * br); 446 real_br = 96000000 / (16 * new_divisor); 447 divisor = cpu_to_le16(new_divisor); 448 tty_encode_baud_rate(tty, real_br, real_br); 449 } 450 451 frame_fmt &= ~FMT_STOP_BITS_MASK; 452 if ((cflag & CSTOPB) != 0) 453 frame_fmt |= FMT_STOP_BITS_2; 454 else 455 frame_fmt |= FMT_STOP_BITS_1; 456 457 frame_fmt &= ~FMT_PARITY_MASK; 458 if ((cflag & PARENB) != 0) { 459 if ((cflag & PARODD) != 0) 460 frame_fmt |= FMT_PARITY_ODD; 461 else 462 frame_fmt |= FMT_PARITY_EVEN; 463 } else { 464 frame_fmt |= FMT_PARITY_NONE; 465 } 466 467 control &= ~CONTROL_MASK; 468 if ((cflag & CRTSCTS) != 0) 469 control |= (CONTROL_DTR_HIGH | CONTROL_RTS_HIGH); 470 471 /* change control lines if we are switching to or from B0 */ 472 /* FIXME: 473 spin_lock_irqsave(&priv->lock, flags); 474 control = priv->line_control; 475 if ((cflag & CBAUD) == B0) 476 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS); 477 else 478 priv->line_control |= (CONTROL_DTR | CONTROL_RTS); 479 if (control != priv->line_control) { 480 control = priv->line_control; 481 spin_unlock_irqrestore(&priv->lock, flags); 482 set_control_lines(serial->dev, control); 483 } else { 484 spin_unlock_irqrestore(&priv->lock, flags); 485 } 486 */ 487 488 spin_lock_irqsave(&priv->lock, flags); 489 if (divisor != priv->pending_setup.divisor 490 || control != priv->pending_setup.control 491 || frame_fmt != priv->pending_setup.frame_fmt) { 492 priv->pending_setup.divisor = divisor; 493 priv->pending_setup.control = control; 494 priv->pending_setup.frame_fmt = frame_fmt; 495 } 496 spin_unlock_irqrestore(&priv->lock, flags); 497} 498 499static int oti6858_open(struct tty_struct *tty, struct usb_serial_port *port) 500{ 501 struct oti6858_private *priv = usb_get_serial_port_data(port); 502 struct usb_serial *serial = port->serial; 503 struct oti6858_control_pkt *buf; 504 unsigned long flags; 505 int result; 506 507 usb_clear_halt(serial->dev, port->write_urb->pipe); 508 usb_clear_halt(serial->dev, port->read_urb->pipe); 509 510 buf = kmalloc(OTI6858_CTRL_PKT_SIZE, GFP_KERNEL); 511 if (!buf) 512 return -ENOMEM; 513 514 result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), 515 OTI6858_REQ_T_GET_STATUS, 516 OTI6858_REQ_GET_STATUS, 517 0, 0, 518 buf, OTI6858_CTRL_PKT_SIZE, 519 100); 520 if (result != OTI6858_CTRL_PKT_SIZE) { 521 /* assume default (after power-on reset) values */ 522 buf->divisor = cpu_to_le16(0x009c); /* 38400 bps */ 523 buf->frame_fmt = 0x03; /* 8N1 */ 524 buf->something = 0x43; 525 buf->control = 0x4c; /* DTR, RTS */ 526 buf->tx_status = 0x00; 527 buf->pin_state = 0x5b; /* RTS, CTS, DSR, DTR, RI, DCD */ 528 buf->rx_bytes_avail = 0x00; 529 } 530 531 spin_lock_irqsave(&priv->lock, flags); 532 memcpy(&priv->status, buf, OTI6858_CTRL_PKT_SIZE); 533 priv->pending_setup.divisor = buf->divisor; 534 priv->pending_setup.frame_fmt = buf->frame_fmt; 535 priv->pending_setup.control = buf->control; 536 spin_unlock_irqrestore(&priv->lock, flags); 537 kfree(buf); 538 539 dev_dbg(&port->dev, "%s(): submitting interrupt urb\n", __func__); 540 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); 541 if (result != 0) { 542 dev_err(&port->dev, "%s(): usb_submit_urb() failed with error %d\n", 543 __func__, result); 544 oti6858_close(port); 545 return result; 546 } 547 548 /* setup termios */ 549 if (tty) 550 oti6858_set_termios(tty, port, NULL); 551 552 return 0; 553} 554 555static void oti6858_close(struct usb_serial_port *port) 556{ 557 struct oti6858_private *priv = usb_get_serial_port_data(port); 558 unsigned long flags; 559 560 spin_lock_irqsave(&port->lock, flags); 561 /* clear out any remaining data in the buffer */ 562 kfifo_reset_out(&port->write_fifo); 563 spin_unlock_irqrestore(&port->lock, flags); 564 565 dev_dbg(&port->dev, "%s(): after buf_clear()\n", __func__); 566 567 /* cancel scheduled setup */ 568 cancel_delayed_work_sync(&priv->delayed_setup_work); 569 cancel_delayed_work_sync(&priv->delayed_write_work); 570 571 /* shutdown our urbs */ 572 dev_dbg(&port->dev, "%s(): shutting down urbs\n", __func__); 573 usb_kill_urb(port->write_urb); 574 usb_kill_urb(port->read_urb); 575 usb_kill_urb(port->interrupt_in_urb); 576} 577 578static int oti6858_tiocmset(struct tty_struct *tty, 579 unsigned int set, unsigned int clear) 580{ 581 struct usb_serial_port *port = tty->driver_data; 582 struct oti6858_private *priv = usb_get_serial_port_data(port); 583 unsigned long flags; 584 u8 control; 585 586 dev_dbg(&port->dev, "%s(set = 0x%08x, clear = 0x%08x)\n", 587 __func__, set, clear); 588 589 /* FIXME: check if this is correct (active high/low) */ 590 spin_lock_irqsave(&priv->lock, flags); 591 control = priv->pending_setup.control; 592 if ((set & TIOCM_RTS) != 0) 593 control |= CONTROL_RTS_HIGH; 594 if ((set & TIOCM_DTR) != 0) 595 control |= CONTROL_DTR_HIGH; 596 if ((clear & TIOCM_RTS) != 0) 597 control &= ~CONTROL_RTS_HIGH; 598 if ((clear & TIOCM_DTR) != 0) 599 control &= ~CONTROL_DTR_HIGH; 600 601 if (control != priv->pending_setup.control) 602 priv->pending_setup.control = control; 603 604 spin_unlock_irqrestore(&priv->lock, flags); 605 return 0; 606} 607 608static int oti6858_tiocmget(struct tty_struct *tty) 609{ 610 struct usb_serial_port *port = tty->driver_data; 611 struct oti6858_private *priv = usb_get_serial_port_data(port); 612 unsigned long flags; 613 unsigned pin_state; 614 unsigned result = 0; 615 616 spin_lock_irqsave(&priv->lock, flags); 617 pin_state = priv->status.pin_state & PIN_MASK; 618 spin_unlock_irqrestore(&priv->lock, flags); 619 620 /* FIXME: check if this is correct (active high/low) */ 621 if ((pin_state & PIN_RTS) != 0) 622 result |= TIOCM_RTS; 623 if ((pin_state & PIN_CTS) != 0) 624 result |= TIOCM_CTS; 625 if ((pin_state & PIN_DSR) != 0) 626 result |= TIOCM_DSR; 627 if ((pin_state & PIN_DTR) != 0) 628 result |= TIOCM_DTR; 629 if ((pin_state & PIN_RI) != 0) 630 result |= TIOCM_RI; 631 if ((pin_state & PIN_DCD) != 0) 632 result |= TIOCM_CD; 633 634 dev_dbg(&port->dev, "%s() = 0x%08x\n", __func__, result); 635 636 return result; 637} 638 639static void oti6858_read_int_callback(struct urb *urb) 640{ 641 struct usb_serial_port *port = urb->context; 642 struct oti6858_private *priv = usb_get_serial_port_data(port); 643 int transient = 0, can_recv = 0, resubmit = 1; 644 int status = urb->status; 645 646 switch (status) { 647 case 0: 648 /* success */ 649 break; 650 case -ECONNRESET: 651 case -ENOENT: 652 case -ESHUTDOWN: 653 /* this urb is terminated, clean up */ 654 dev_dbg(&urb->dev->dev, "%s(): urb shutting down with status: %d\n", 655 __func__, status); 656 return; 657 default: 658 dev_dbg(&urb->dev->dev, "%s(): nonzero urb status received: %d\n", 659 __func__, status); 660 break; 661 } 662 663 if (status == 0 && urb->actual_length == OTI6858_CTRL_PKT_SIZE) { 664 struct oti6858_control_pkt *xs = urb->transfer_buffer; 665 unsigned long flags; 666 667 spin_lock_irqsave(&priv->lock, flags); 668 669 if (!priv->transient) { 670 if (!OTI6858_CTRL_EQUALS_PENDING(xs, priv)) { 671 if (xs->rx_bytes_avail == 0) { 672 priv->transient = 4; 673 priv->setup_done = 0; 674 resubmit = 0; 675 dev_dbg(&port->dev, "%s(): scheduling setup_line()\n", __func__); 676 schedule_delayed_work(&priv->delayed_setup_work, 0); 677 } 678 } 679 } else { 680 if (OTI6858_CTRL_EQUALS_PENDING(xs, priv)) { 681 priv->transient = 0; 682 } else if (!priv->setup_done) { 683 resubmit = 0; 684 } else if (--priv->transient == 0) { 685 if (xs->rx_bytes_avail == 0) { 686 priv->transient = 4; 687 priv->setup_done = 0; 688 resubmit = 0; 689 dev_dbg(&port->dev, "%s(): scheduling setup_line()\n", __func__); 690 schedule_delayed_work(&priv->delayed_setup_work, 0); 691 } 692 } 693 } 694 695 if (!priv->transient) { 696 u8 delta = xs->pin_state ^ priv->status.pin_state; 697 698 if (delta & PIN_MSR_MASK) { 699 if (delta & PIN_CTS) 700 port->icount.cts++; 701 if (delta & PIN_DSR) 702 port->icount.dsr++; 703 if (delta & PIN_RI) 704 port->icount.rng++; 705 if (delta & PIN_DCD) 706 port->icount.dcd++; 707 708 wake_up_interruptible(&port->port.delta_msr_wait); 709 } 710 711 memcpy(&priv->status, xs, OTI6858_CTRL_PKT_SIZE); 712 } 713 714 if (!priv->transient && xs->rx_bytes_avail != 0) { 715 can_recv = xs->rx_bytes_avail; 716 priv->flags.read_urb_in_use = 1; 717 } 718 719 transient = priv->transient; 720 spin_unlock_irqrestore(&priv->lock, flags); 721 } 722 723 if (can_recv) { 724 int result; 725 726 result = usb_submit_urb(port->read_urb, GFP_ATOMIC); 727 if (result != 0) { 728 priv->flags.read_urb_in_use = 0; 729 dev_err(&port->dev, "%s(): usb_submit_urb() failed," 730 " error %d\n", __func__, result); 731 } else { 732 resubmit = 0; 733 } 734 } else if (!transient) { 735 unsigned long flags; 736 int count; 737 738 spin_lock_irqsave(&port->lock, flags); 739 count = kfifo_len(&port->write_fifo); 740 spin_unlock_irqrestore(&port->lock, flags); 741 742 spin_lock_irqsave(&priv->lock, flags); 743 if (priv->flags.write_urb_in_use == 0 && count != 0) { 744 schedule_delayed_work(&priv->delayed_write_work, 0); 745 resubmit = 0; 746 } 747 spin_unlock_irqrestore(&priv->lock, flags); 748 } 749 750 if (resubmit) { 751 int result; 752 753/* dev_dbg(&urb->dev->dev, "%s(): submitting interrupt urb\n", __func__); */ 754 result = usb_submit_urb(urb, GFP_ATOMIC); 755 if (result != 0) { 756 dev_err(&urb->dev->dev, 757 "%s(): usb_submit_urb() failed with" 758 " error %d\n", __func__, result); 759 } 760 } 761} 762 763static void oti6858_read_bulk_callback(struct urb *urb) 764{ 765 struct usb_serial_port *port = urb->context; 766 struct oti6858_private *priv = usb_get_serial_port_data(port); 767 unsigned char *data = urb->transfer_buffer; 768 unsigned long flags; 769 int status = urb->status; 770 int result; 771 772 spin_lock_irqsave(&priv->lock, flags); 773 priv->flags.read_urb_in_use = 0; 774 spin_unlock_irqrestore(&priv->lock, flags); 775 776 if (status != 0) { 777 dev_dbg(&urb->dev->dev, "%s(): unable to handle the error, exiting\n", __func__); 778 return; 779 } 780 781 if (urb->actual_length > 0) { 782 tty_insert_flip_string(&port->port, data, urb->actual_length); 783 tty_flip_buffer_push(&port->port); 784 } 785 786 /* schedule the interrupt urb */ 787 result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC); 788 if (result != 0 && result != -EPERM) { 789 dev_err(&port->dev, "%s(): usb_submit_urb() failed," 790 " error %d\n", __func__, result); 791 } 792} 793 794static void oti6858_write_bulk_callback(struct urb *urb) 795{ 796 struct usb_serial_port *port = urb->context; 797 struct oti6858_private *priv = usb_get_serial_port_data(port); 798 int status = urb->status; 799 int result; 800 801 switch (status) { 802 case 0: 803 /* success */ 804 break; 805 case -ECONNRESET: 806 case -ENOENT: 807 case -ESHUTDOWN: 808 /* this urb is terminated, clean up */ 809 dev_dbg(&urb->dev->dev, "%s(): urb shutting down with status: %d\n", __func__, status); 810 priv->flags.write_urb_in_use = 0; 811 return; 812 default: 813 /* error in the urb, so we have to resubmit it */ 814 dev_dbg(&urb->dev->dev, "%s(): nonzero write bulk status received: %d\n", __func__, status); 815 dev_dbg(&urb->dev->dev, "%s(): overflow in write\n", __func__); 816 817 port->write_urb->transfer_buffer_length = 1; 818 result = usb_submit_urb(port->write_urb, GFP_ATOMIC); 819 if (result) { 820 dev_err_console(port, "%s(): usb_submit_urb() failed," 821 " error %d\n", __func__, result); 822 } else { 823 return; 824 } 825 } 826 827 priv->flags.write_urb_in_use = 0; 828 829 /* schedule the interrupt urb if we are still open */ 830 dev_dbg(&port->dev, "%s(): submitting interrupt urb\n", __func__); 831 result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC); 832 if (result != 0) { 833 dev_err(&port->dev, "%s(): failed submitting int urb," 834 " error %d\n", __func__, result); 835 } 836} 837 838module_usb_serial_driver(serial_drivers, id_table); 839 840MODULE_DESCRIPTION(OTI6858_DESCRIPTION); 841MODULE_AUTHOR(OTI6858_AUTHOR); 842MODULE_LICENSE("GPL v2");