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