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/init.h>
  43#include <linux/slab.h>
  44#include <linux/tty.h>
  45#include <linux/tty_driver.h>
  46#include <linux/tty_flip.h>
  47#include <linux/serial.h>
  48#include <linux/module.h>
  49#include <linux/moduleparam.h>
  50#include <linux/spinlock.h>
  51#include <linux/usb.h>
  52#include <linux/usb/serial.h>
  53#include <linux/uaccess.h>
  54#include <linux/kfifo.h>
  55#include "oti6858.h"
  56
  57#define OTI6858_DESCRIPTION \
  58        "Ours Technology Inc. OTi-6858 USB to serial adapter driver"
  59#define OTI6858_AUTHOR "Tomasz Michal Lukaszewski <FIXME@FIXME>"
  60#define OTI6858_VERSION "0.2"
  61
  62static const struct usb_device_id id_table[] = {
  63        { USB_DEVICE(OTI6858_VENDOR_ID, OTI6858_PRODUCT_ID) },
  64        { }
  65};
  66
  67MODULE_DEVICE_TABLE(usb, id_table);
  68
  69static struct usb_driver oti6858_driver = {
  70        .name =         "oti6858",
  71        .probe =        usb_serial_probe,
  72        .disconnect =   usb_serial_disconnect,
  73        .id_table =     id_table,
  74        .no_dynamic_id =        1,
  75};
  76
  77static int debug;
  78
  79/* requests */
  80#define OTI6858_REQ_GET_STATUS          (USB_DIR_IN | USB_TYPE_VENDOR | 0x00)
  81#define OTI6858_REQ_T_GET_STATUS        0x01
  82
  83#define OTI6858_REQ_SET_LINE            (USB_DIR_OUT | USB_TYPE_VENDOR | 0x00)
  84#define OTI6858_REQ_T_SET_LINE          0x00
  85
  86#define OTI6858_REQ_CHECK_TXBUFF        (USB_DIR_IN | USB_TYPE_VENDOR | 0x01)
  87#define OTI6858_REQ_T_CHECK_TXBUFF      0x00
  88
  89/* format of the control packet */
  90struct oti6858_control_pkt {
  91        __le16  divisor;        /* baud rate = 96000000 / (16 * divisor), LE */
  92#define OTI6858_MAX_BAUD_RATE   3000000
  93        u8      frame_fmt;
  94#define FMT_STOP_BITS_MASK      0xc0
  95#define FMT_STOP_BITS_1         0x00
  96#define FMT_STOP_BITS_2         0x40    /* 1.5 stop bits if FMT_DATA_BITS_5 */
  97#define FMT_PARITY_MASK         0x38
  98#define FMT_PARITY_NONE         0x00
  99#define FMT_PARITY_ODD          0x08
 100#define FMT_PARITY_EVEN         0x18
 101#define FMT_PARITY_MARK         0x28
 102#define FMT_PARITY_SPACE        0x38
 103#define FMT_DATA_BITS_MASK      0x03
 104#define FMT_DATA_BITS_5         0x00
 105#define FMT_DATA_BITS_6         0x01
 106#define FMT_DATA_BITS_7         0x02
 107#define FMT_DATA_BITS_8         0x03
 108        u8      something;      /* always equals 0x43 */
 109        u8      control;        /* settings of flow control lines */
 110#define CONTROL_MASK            0x0c
 111#define CONTROL_DTR_HIGH        0x08
 112#define CONTROL_RTS_HIGH        0x04
 113        u8      tx_status;
 114#define TX_BUFFER_EMPTIED       0x09
 115        u8      pin_state;
 116#define PIN_MASK                0x3f
 117#define PIN_RTS                 0x20    /* output pin */
 118#define PIN_CTS                 0x10    /* input pin, active low */
 119#define PIN_DSR                 0x08    /* input pin, active low */
 120#define PIN_DTR                 0x04    /* output pin */
 121#define PIN_RI                  0x02    /* input pin, active low */
 122#define PIN_DCD                 0x01    /* input pin, active low */
 123        u8      rx_bytes_avail;         /* number of bytes in rx buffer */;
 124};
 125
 126#define OTI6858_CTRL_PKT_SIZE   sizeof(struct oti6858_control_pkt)
 127#define OTI6858_CTRL_EQUALS_PENDING(a, priv) \
 128        (((a)->divisor == (priv)->pending_setup.divisor) \
 129          && ((a)->control == (priv)->pending_setup.control) \
 130          && ((a)->frame_fmt == (priv)->pending_setup.frame_fmt))
 131
 132/* function prototypes */
 133static int oti6858_open(struct tty_struct *tty, struct usb_serial_port *port);
 134static void oti6858_close(struct usb_serial_port *port);
 135static void oti6858_set_termios(struct tty_struct *tty,
 136                        struct usb_serial_port *port, struct ktermios *old);
 137static void oti6858_init_termios(struct tty_struct *tty);
 138static int oti6858_ioctl(struct tty_struct *tty,
 139                        unsigned int cmd, unsigned long arg);
 140static void oti6858_read_int_callback(struct urb *urb);
 141static void oti6858_read_bulk_callback(struct urb *urb);
 142static void oti6858_write_bulk_callback(struct urb *urb);
 143static int oti6858_write(struct tty_struct *tty, struct usb_serial_port *port,
 144                        const unsigned char *buf, int count);
 145static int oti6858_write_room(struct tty_struct *tty);
 146static int oti6858_chars_in_buffer(struct tty_struct *tty);
 147static int oti6858_tiocmget(struct tty_struct *tty);
 148static int oti6858_tiocmset(struct tty_struct *tty,
 149                                unsigned int set, unsigned int clear);
 150static int oti6858_startup(struct usb_serial *serial);
 151static void oti6858_release(struct usb_serial *serial);
 152
 153/* device info */
 154static struct usb_serial_driver oti6858_device = {
 155        .driver = {
 156                .owner =        THIS_MODULE,
 157                .name =         "oti6858",
 158        },
 159        .id_table =             id_table,
 160        .usb_driver =           &oti6858_driver,
 161        .num_ports =            1,
 162        .open =                 oti6858_open,
 163        .close =                oti6858_close,
 164        .write =                oti6858_write,
 165        .ioctl =                oti6858_ioctl,
 166        .set_termios =          oti6858_set_termios,
 167        .init_termios =         oti6858_init_termios,
 168        .tiocmget =             oti6858_tiocmget,
 169        .tiocmset =             oti6858_tiocmset,
 170        .read_bulk_callback =   oti6858_read_bulk_callback,
 171        .read_int_callback =    oti6858_read_int_callback,
 172        .write_bulk_callback =  oti6858_write_bulk_callback,
 173        .write_room =           oti6858_write_room,
 174        .chars_in_buffer =      oti6858_chars_in_buffer,
 175        .attach =               oti6858_startup,
 176        .release =              oti6858_release,
 177};
 178
 179struct oti6858_private {
 180        spinlock_t lock;
 181
 182        struct oti6858_control_pkt status;
 183
 184        struct {
 185                u8 read_urb_in_use;
 186                u8 write_urb_in_use;
 187        } flags;
 188        struct delayed_work delayed_write_work;
 189
 190        struct {
 191                __le16 divisor;
 192                u8 frame_fmt;
 193                u8 control;
 194        } pending_setup;
 195        u8 transient;
 196        u8 setup_done;
 197        struct delayed_work delayed_setup_work;
 198
 199        wait_queue_head_t intr_wait;
 200        struct usb_serial_port *port;   /* USB port with which associated */
 201};
 202
 203static void setup_line(struct work_struct *work)
 204{
 205        struct oti6858_private *priv = container_of(work,
 206                        struct oti6858_private, delayed_setup_work.work);
 207        struct usb_serial_port *port = priv->port;
 208        struct oti6858_control_pkt *new_setup;
 209        unsigned long flags;
 210        int result;
 211
 212        dbg("%s(port = %d)", __func__, port->number);
 213
 214        new_setup = kmalloc(OTI6858_CTRL_PKT_SIZE, GFP_KERNEL);
 215        if (new_setup == NULL) {
 216                dev_err(&port->dev, "%s(): out of memory!\n", __func__);
 217                /* we will try again */
 218                schedule_delayed_work(&priv->delayed_setup_work,
 219                                                msecs_to_jiffies(2));
 220                return;
 221        }
 222
 223        result = usb_control_msg(port->serial->dev,
 224                                usb_rcvctrlpipe(port->serial->dev, 0),
 225                                OTI6858_REQ_T_GET_STATUS,
 226                                OTI6858_REQ_GET_STATUS,
 227                                0, 0,
 228                                new_setup, OTI6858_CTRL_PKT_SIZE,
 229                                100);
 230
 231        if (result != OTI6858_CTRL_PKT_SIZE) {
 232                dev_err(&port->dev, "%s(): error reading status\n", __func__);
 233                kfree(new_setup);
 234                /* we will try again */
 235                schedule_delayed_work(&priv->delayed_setup_work,
 236                                                        msecs_to_jiffies(2));
 237                return;
 238        }
 239
 240        spin_lock_irqsave(&priv->lock, flags);
 241        if (!OTI6858_CTRL_EQUALS_PENDING(new_setup, priv)) {
 242                new_setup->divisor = priv->pending_setup.divisor;
 243                new_setup->control = priv->pending_setup.control;
 244                new_setup->frame_fmt = priv->pending_setup.frame_fmt;
 245
 246                spin_unlock_irqrestore(&priv->lock, flags);
 247                result = usb_control_msg(port->serial->dev,
 248                                        usb_sndctrlpipe(port->serial->dev, 0),
 249                                        OTI6858_REQ_T_SET_LINE,
 250                                        OTI6858_REQ_SET_LINE,
 251                                        0, 0,
 252                                        new_setup, OTI6858_CTRL_PKT_SIZE,
 253                                        100);
 254        } else {
 255                spin_unlock_irqrestore(&priv->lock, flags);
 256                result = 0;
 257        }
 258        kfree(new_setup);
 259
 260        spin_lock_irqsave(&priv->lock, flags);
 261        if (result != OTI6858_CTRL_PKT_SIZE)
 262                priv->transient = 0;
 263        priv->setup_done = 1;
 264        spin_unlock_irqrestore(&priv->lock, flags);
 265
 266        dbg("%s(): submitting interrupt urb", __func__);
 267        port->interrupt_in_urb->dev = port->serial->dev;
 268        result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
 269        if (result != 0) {
 270                dev_err(&port->dev, "%s(): usb_submit_urb() failed"
 271                                " with error %d\n", __func__, result);
 272        }
 273}
 274
 275static void send_data(struct work_struct *work)
 276{
 277        struct oti6858_private *priv = container_of(work,
 278                        struct oti6858_private, delayed_write_work.work);
 279        struct usb_serial_port *port = priv->port;
 280        int count = 0, result;
 281        unsigned long flags;
 282        u8 *allow;
 283
 284        dbg("%s(port = %d)", __func__, port->number);
 285
 286        spin_lock_irqsave(&priv->lock, flags);
 287        if (priv->flags.write_urb_in_use) {
 288                spin_unlock_irqrestore(&priv->lock, flags);
 289                schedule_delayed_work(&priv->delayed_write_work,
 290                                                msecs_to_jiffies(2));
 291                return;
 292        }
 293        priv->flags.write_urb_in_use = 1;
 294        spin_unlock_irqrestore(&priv->lock, flags);
 295
 296        spin_lock_irqsave(&port->lock, flags);
 297        count = kfifo_len(&port->write_fifo);
 298        spin_unlock_irqrestore(&port->lock, flags);
 299
 300        if (count > port->bulk_out_size)
 301                count = port->bulk_out_size;
 302
 303        if (count != 0) {
 304                allow = kmalloc(1, GFP_KERNEL);
 305                if (!allow) {
 306                        dev_err(&port->dev, "%s(): kmalloc failed\n",
 307                                        __func__);
 308                        return;
 309                }
 310                result = usb_control_msg(port->serial->dev,
 311                                usb_rcvctrlpipe(port->serial->dev, 0),
 312                                OTI6858_REQ_T_CHECK_TXBUFF,
 313                                OTI6858_REQ_CHECK_TXBUFF,
 314                                count, 0, allow, 1, 100);
 315                if (result != 1 || *allow != 0)
 316                        count = 0;
 317                kfree(allow);
 318        }
 319
 320        if (count == 0) {
 321                priv->flags.write_urb_in_use = 0;
 322
 323                dbg("%s(): submitting interrupt urb", __func__);
 324                port->interrupt_in_urb->dev = port->serial->dev;
 325                result = usb_submit_urb(port->interrupt_in_urb, GFP_NOIO);
 326                if (result != 0) {
 327                        dev_err(&port->dev, "%s(): usb_submit_urb() failed"
 328                                " with error %d\n", __func__, result);
 329                }
 330                return;
 331        }
 332
 333        count = kfifo_out_locked(&port->write_fifo,
 334                                        port->write_urb->transfer_buffer,
 335                                        count, &port->lock);
 336        port->write_urb->transfer_buffer_length = count;
 337        port->write_urb->dev = port->serial->dev;
 338        result = usb_submit_urb(port->write_urb, GFP_NOIO);
 339        if (result != 0) {
 340                dev_err(&port->dev, "%s(): usb_submit_urb() failed"
 341                               " with error %d\n", __func__, result);
 342                priv->flags.write_urb_in_use = 0;
 343        }
 344
 345        usb_serial_port_softint(port);
 346}
 347
 348static int oti6858_startup(struct usb_serial *serial)
 349{
 350        struct usb_serial_port *port = serial->port[0];
 351        struct oti6858_private *priv;
 352        int i;
 353
 354        for (i = 0; i < serial->num_ports; ++i) {
 355                priv = kzalloc(sizeof(struct oti6858_private), GFP_KERNEL);
 356                if (!priv)
 357                        break;
 358
 359                spin_lock_init(&priv->lock);
 360                init_waitqueue_head(&priv->intr_wait);
 361/*              INIT_WORK(&priv->setup_work, setup_line, serial->port[i]); */
 362/*              INIT_WORK(&priv->write_work, send_data, serial->port[i]); */
 363                priv->port = port;
 364                INIT_DELAYED_WORK(&priv->delayed_setup_work, setup_line);
 365                INIT_DELAYED_WORK(&priv->delayed_write_work, send_data);
 366
 367                usb_set_serial_port_data(serial->port[i], priv);
 368        }
 369        if (i == serial->num_ports)
 370                return 0;
 371
 372        for (--i; i >= 0; --i) {
 373                priv = usb_get_serial_port_data(serial->port[i]);
 374                kfree(priv);
 375                usb_set_serial_port_data(serial->port[i], NULL);
 376        }
 377        return -ENOMEM;
 378}
 379
 380static int oti6858_write(struct tty_struct *tty, struct usb_serial_port *port,
 381                        const unsigned char *buf, int count)
 382{
 383        dbg("%s(port = %d, count = %d)", __func__, port->number, count);
 384
 385        if (!count)
 386                return count;
 387
 388        count = kfifo_in_locked(&port->write_fifo, buf, count, &port->lock);
 389
 390        return count;
 391}
 392
 393static int oti6858_write_room(struct tty_struct *tty)
 394{
 395        struct usb_serial_port *port = tty->driver_data;
 396        int room = 0;
 397        unsigned long flags;
 398
 399        dbg("%s(port = %d)", __func__, port->number);
 400
 401        spin_lock_irqsave(&port->lock, flags);
 402        room = kfifo_avail(&port->write_fifo);
 403        spin_unlock_irqrestore(&port->lock, flags);
 404
 405        return room;
 406}
 407
 408static int oti6858_chars_in_buffer(struct tty_struct *tty)
 409{
 410        struct usb_serial_port *port = tty->driver_data;
 411        int chars = 0;
 412        unsigned long flags;
 413
 414        dbg("%s(port = %d)", __func__, port->number);
 415
 416        spin_lock_irqsave(&port->lock, flags);
 417        chars = kfifo_len(&port->write_fifo);
 418        spin_unlock_irqrestore(&port->lock, flags);
 419
 420        return chars;
 421}
 422
 423static void oti6858_init_termios(struct tty_struct *tty)
 424{
 425        *(tty->termios) = tty_std_termios;
 426        tty->termios->c_cflag = B38400 | CS8 | CREAD | HUPCL | CLOCAL;
 427        tty->termios->c_ispeed = 38400;
 428        tty->termios->c_ospeed = 38400;
 429}
 430
 431static void oti6858_set_termios(struct tty_struct *tty,
 432                struct usb_serial_port *port, struct ktermios *old_termios)
 433{
 434        struct oti6858_private *priv = usb_get_serial_port_data(port);
 435        unsigned long flags;
 436        unsigned int cflag;
 437        u8 frame_fmt, control;
 438        __le16 divisor;
 439        int br;
 440
 441        dbg("%s(port = %d)", __func__, port->number);
 442
 443        if (!tty) {
 444                dbg("%s(): no tty structures", __func__);
 445                return;
 446        }
 447
 448        cflag = tty->termios->c_cflag;
 449
 450        spin_lock_irqsave(&priv->lock, flags);
 451        divisor = priv->pending_setup.divisor;
 452        frame_fmt = priv->pending_setup.frame_fmt;
 453        control = priv->pending_setup.control;
 454        spin_unlock_irqrestore(&priv->lock, flags);
 455
 456        frame_fmt &= ~FMT_DATA_BITS_MASK;
 457        switch (cflag & CSIZE) {
 458        case CS5:
 459                frame_fmt |= FMT_DATA_BITS_5;
 460                break;
 461        case CS6:
 462                frame_fmt |= FMT_DATA_BITS_6;
 463                break;
 464        case CS7:
 465                frame_fmt |= FMT_DATA_BITS_7;
 466                break;
 467        default:
 468        case CS8:
 469                frame_fmt |= FMT_DATA_BITS_8;
 470                break;
 471        }
 472
 473        /* manufacturer claims that this device can work with baud rates
 474         * up to 3 Mbps; I've tested it only on 115200 bps, so I can't
 475         * guarantee that any other baud rate will work (especially
 476         * the higher ones)
 477         */
 478        br = tty_get_baud_rate(tty);
 479        if (br == 0) {
 480                divisor = 0;
 481        } else {
 482                int real_br;
 483                int new_divisor;
 484                br = min(br, OTI6858_MAX_BAUD_RATE);
 485
 486                new_divisor = (96000000 + 8 * br) / (16 * br);
 487                real_br = 96000000 / (16 * new_divisor);
 488                divisor = cpu_to_le16(new_divisor);
 489                tty_encode_baud_rate(tty, real_br, real_br);
 490        }
 491
 492        frame_fmt &= ~FMT_STOP_BITS_MASK;
 493        if ((cflag & CSTOPB) != 0)
 494                frame_fmt |= FMT_STOP_BITS_2;
 495        else
 496                frame_fmt |= FMT_STOP_BITS_1;
 497
 498        frame_fmt &= ~FMT_PARITY_MASK;
 499        if ((cflag & PARENB) != 0) {
 500                if ((cflag & PARODD) != 0)
 501                        frame_fmt |= FMT_PARITY_ODD;
 502                else
 503                        frame_fmt |= FMT_PARITY_EVEN;
 504        } else {
 505                frame_fmt |= FMT_PARITY_NONE;
 506        }
 507
 508        control &= ~CONTROL_MASK;
 509        if ((cflag & CRTSCTS) != 0)
 510                control |= (CONTROL_DTR_HIGH | CONTROL_RTS_HIGH);
 511
 512        /* change control lines if we are switching to or from B0 */
 513        /* FIXME:
 514        spin_lock_irqsave(&priv->lock, flags);
 515        control = priv->line_control;
 516        if ((cflag & CBAUD) == B0)
 517                priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
 518        else
 519                priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
 520        if (control != priv->line_control) {
 521                control = priv->line_control;
 522                spin_unlock_irqrestore(&priv->lock, flags);
 523                set_control_lines(serial->dev, control);
 524        } else {
 525                spin_unlock_irqrestore(&priv->lock, flags);
 526        }
 527        */
 528
 529        spin_lock_irqsave(&priv->lock, flags);
 530        if (divisor != priv->pending_setup.divisor
 531                        || control != priv->pending_setup.control
 532                        || frame_fmt != priv->pending_setup.frame_fmt) {
 533                priv->pending_setup.divisor = divisor;
 534                priv->pending_setup.control = control;
 535                priv->pending_setup.frame_fmt = frame_fmt;
 536        }
 537        spin_unlock_irqrestore(&priv->lock, flags);
 538}
 539
 540static int oti6858_open(struct tty_struct *tty, struct usb_serial_port *port)
 541{
 542        struct oti6858_private *priv = usb_get_serial_port_data(port);
 543        struct ktermios tmp_termios;
 544        struct usb_serial *serial = port->serial;
 545        struct oti6858_control_pkt *buf;
 546        unsigned long flags;
 547        int result;
 548
 549        dbg("%s(port = %d)", __func__, port->number);
 550
 551        usb_clear_halt(serial->dev, port->write_urb->pipe);
 552        usb_clear_halt(serial->dev, port->read_urb->pipe);
 553
 554        buf = kmalloc(OTI6858_CTRL_PKT_SIZE, GFP_KERNEL);
 555        if (buf == NULL) {
 556                dev_err(&port->dev, "%s(): out of memory!\n", __func__);
 557                return -ENOMEM;
 558        }
 559
 560        result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
 561                                OTI6858_REQ_T_GET_STATUS,
 562                                OTI6858_REQ_GET_STATUS,
 563                                0, 0,
 564                                buf, OTI6858_CTRL_PKT_SIZE,
 565                                100);
 566        if (result != OTI6858_CTRL_PKT_SIZE) {
 567                /* assume default (after power-on reset) values */
 568                buf->divisor = cpu_to_le16(0x009c);     /* 38400 bps */
 569                buf->frame_fmt = 0x03;  /* 8N1 */
 570                buf->something = 0x43;
 571                buf->control = 0x4c;    /* DTR, RTS */
 572                buf->tx_status = 0x00;
 573                buf->pin_state = 0x5b;  /* RTS, CTS, DSR, DTR, RI, DCD */
 574                buf->rx_bytes_avail = 0x00;
 575        }
 576
 577        spin_lock_irqsave(&priv->lock, flags);
 578        memcpy(&priv->status, buf, OTI6858_CTRL_PKT_SIZE);
 579        priv->pending_setup.divisor = buf->divisor;
 580        priv->pending_setup.frame_fmt = buf->frame_fmt;
 581        priv->pending_setup.control = buf->control;
 582        spin_unlock_irqrestore(&priv->lock, flags);
 583        kfree(buf);
 584
 585        dbg("%s(): submitting interrupt urb", __func__);
 586        port->interrupt_in_urb->dev = serial->dev;
 587        result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
 588        if (result != 0) {
 589                dev_err(&port->dev, "%s(): usb_submit_urb() failed"
 590                               " with error %d\n", __func__, result);
 591                oti6858_close(port);
 592                return -EPROTO;
 593        }
 594
 595        /* setup termios */
 596        if (tty)
 597                oti6858_set_termios(tty, port, &tmp_termios);
 598        port->port.drain_delay = 256;   /* FIXME: check the FIFO length */
 599        return 0;
 600}
 601
 602static void oti6858_close(struct usb_serial_port *port)
 603{
 604        struct oti6858_private *priv = usb_get_serial_port_data(port);
 605        unsigned long flags;
 606
 607        dbg("%s(port = %d)", __func__, port->number);
 608
 609        spin_lock_irqsave(&port->lock, flags);
 610        /* clear out any remaining data in the buffer */
 611        kfifo_reset_out(&port->write_fifo);
 612        spin_unlock_irqrestore(&port->lock, flags);
 613
 614        dbg("%s(): after buf_clear()", __func__);
 615
 616        /* cancel scheduled setup */
 617        cancel_delayed_work_sync(&priv->delayed_setup_work);
 618        cancel_delayed_work_sync(&priv->delayed_write_work);
 619
 620        /* shutdown our urbs */
 621        dbg("%s(): shutting down urbs", __func__);
 622        usb_kill_urb(port->write_urb);
 623        usb_kill_urb(port->read_urb);
 624        usb_kill_urb(port->interrupt_in_urb);
 625}
 626
 627static int oti6858_tiocmset(struct tty_struct *tty,
 628                                unsigned int set, unsigned int clear)
 629{
 630        struct usb_serial_port *port = tty->driver_data;
 631        struct oti6858_private *priv = usb_get_serial_port_data(port);
 632        unsigned long flags;
 633        u8 control;
 634
 635        dbg("%s(port = %d, set = 0x%08x, clear = 0x%08x)",
 636                                __func__, port->number, set, clear);
 637
 638        if (!usb_get_intfdata(port->serial->interface))
 639                return -ENODEV;
 640
 641        /* FIXME: check if this is correct (active high/low) */
 642        spin_lock_irqsave(&priv->lock, flags);
 643        control = priv->pending_setup.control;
 644        if ((set & TIOCM_RTS) != 0)
 645                control |= CONTROL_RTS_HIGH;
 646        if ((set & TIOCM_DTR) != 0)
 647                control |= CONTROL_DTR_HIGH;
 648        if ((clear & TIOCM_RTS) != 0)
 649                control &= ~CONTROL_RTS_HIGH;
 650        if ((clear & TIOCM_DTR) != 0)
 651                control &= ~CONTROL_DTR_HIGH;
 652
 653        if (control != priv->pending_setup.control)
 654                priv->pending_setup.control = control;
 655
 656        spin_unlock_irqrestore(&priv->lock, flags);
 657        return 0;
 658}
 659
 660static int oti6858_tiocmget(struct tty_struct *tty)
 661{
 662        struct usb_serial_port *port = tty->driver_data;
 663        struct oti6858_private *priv = usb_get_serial_port_data(port);
 664        unsigned long flags;
 665        unsigned pin_state;
 666        unsigned result = 0;
 667
 668        dbg("%s(port = %d)", __func__, port->number);
 669
 670        if (!usb_get_intfdata(port->serial->interface))
 671                return -ENODEV;
 672
 673        spin_lock_irqsave(&priv->lock, flags);
 674        pin_state = priv->status.pin_state & PIN_MASK;
 675        spin_unlock_irqrestore(&priv->lock, flags);
 676
 677        /* FIXME: check if this is correct (active high/low) */
 678        if ((pin_state & PIN_RTS) != 0)
 679                result |= TIOCM_RTS;
 680        if ((pin_state & PIN_CTS) != 0)
 681                result |= TIOCM_CTS;
 682        if ((pin_state & PIN_DSR) != 0)
 683                result |= TIOCM_DSR;
 684        if ((pin_state & PIN_DTR) != 0)
 685                result |= TIOCM_DTR;
 686        if ((pin_state & PIN_RI) != 0)
 687                result |= TIOCM_RI;
 688        if ((pin_state & PIN_DCD) != 0)
 689                result |= TIOCM_CD;
 690
 691        dbg("%s() = 0x%08x", __func__, result);
 692
 693        return result;
 694}
 695
 696static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
 697{
 698        struct oti6858_private *priv = usb_get_serial_port_data(port);
 699        unsigned long flags;
 700        unsigned int prev, status;
 701        unsigned int changed;
 702
 703        spin_lock_irqsave(&priv->lock, flags);
 704        prev = priv->status.pin_state;
 705        spin_unlock_irqrestore(&priv->lock, flags);
 706
 707        while (1) {
 708                wait_event_interruptible(priv->intr_wait,
 709                                        priv->status.pin_state != prev);
 710                if (signal_pending(current))
 711                        return -ERESTARTSYS;
 712
 713                spin_lock_irqsave(&priv->lock, flags);
 714                status = priv->status.pin_state & PIN_MASK;
 715                spin_unlock_irqrestore(&priv->lock, flags);
 716
 717                changed = prev ^ status;
 718                /* FIXME: check if this is correct (active high/low) */
 719                if (((arg & TIOCM_RNG) && (changed & PIN_RI)) ||
 720                    ((arg & TIOCM_DSR) && (changed & PIN_DSR)) ||
 721                    ((arg & TIOCM_CD)  && (changed & PIN_DCD)) ||
 722                    ((arg & TIOCM_CTS) && (changed & PIN_CTS)))
 723                        return 0;
 724                prev = status;
 725        }
 726
 727        /* NOTREACHED */
 728        return 0;
 729}
 730
 731static int oti6858_ioctl(struct tty_struct *tty,
 732                        unsigned int cmd, unsigned long arg)
 733{
 734        struct usb_serial_port *port = tty->driver_data;
 735
 736        dbg("%s(port = %d, cmd = 0x%04x, arg = 0x%08lx)",
 737                                __func__, port->number, cmd, arg);
 738
 739        switch (cmd) {
 740        case TIOCMIWAIT:
 741                dbg("%s(): TIOCMIWAIT", __func__);
 742                return wait_modem_info(port, arg);
 743        default:
 744                dbg("%s(): 0x%04x not supported", __func__, cmd);
 745                break;
 746        }
 747        return -ENOIOCTLCMD;
 748}
 749
 750
 751static void oti6858_release(struct usb_serial *serial)
 752{
 753        int i;
 754
 755        dbg("%s()", __func__);
 756
 757        for (i = 0; i < serial->num_ports; ++i)
 758                kfree(usb_get_serial_port_data(serial->port[i]));
 759}
 760
 761static void oti6858_read_int_callback(struct urb *urb)
 762{
 763        struct usb_serial_port *port =  urb->context;
 764        struct oti6858_private *priv = usb_get_serial_port_data(port);
 765        int transient = 0, can_recv = 0, resubmit = 1;
 766        int status = urb->status;
 767
 768        dbg("%s(port = %d, status = %d)",
 769                                __func__, port->number, status);
 770
 771        switch (status) {
 772        case 0:
 773                /* success */
 774                break;
 775        case -ECONNRESET:
 776        case -ENOENT:
 777        case -ESHUTDOWN:
 778                /* this urb is terminated, clean up */
 779                dbg("%s(): urb shutting down with status: %d",
 780                                        __func__, status);
 781                return;
 782        default:
 783                dbg("%s(): nonzero urb status received: %d",
 784                                        __func__, status);
 785                break;
 786        }
 787
 788        if (status == 0 && urb->actual_length == OTI6858_CTRL_PKT_SIZE) {
 789                struct oti6858_control_pkt *xs = urb->transfer_buffer;
 790                unsigned long flags;
 791
 792                spin_lock_irqsave(&priv->lock, flags);
 793
 794                if (!priv->transient) {
 795                        if (!OTI6858_CTRL_EQUALS_PENDING(xs, priv)) {
 796                                if (xs->rx_bytes_avail == 0) {
 797                                        priv->transient = 4;
 798                                        priv->setup_done = 0;
 799                                        resubmit = 0;
 800                                        dbg("%s(): scheduling setup_line()",
 801                                            __func__);
 802                                        schedule_delayed_work(&priv->delayed_setup_work, 0);
 803                                }
 804                        }
 805                } else {
 806                        if (OTI6858_CTRL_EQUALS_PENDING(xs, priv)) {
 807                                priv->transient = 0;
 808                        } else if (!priv->setup_done) {
 809                                resubmit = 0;
 810                        } else if (--priv->transient == 0) {
 811                                if (xs->rx_bytes_avail == 0) {
 812                                        priv->transient = 4;
 813                                        priv->setup_done = 0;
 814                                        resubmit = 0;
 815                                        dbg("%s(): scheduling setup_line()",
 816                                            __func__);
 817                                        schedule_delayed_work(&priv->delayed_setup_work, 0);
 818                                }
 819                        }
 820                }
 821
 822                if (!priv->transient) {
 823                        if (xs->pin_state != priv->status.pin_state)
 824                                wake_up_interruptible(&priv->intr_wait);
 825                        memcpy(&priv->status, xs, OTI6858_CTRL_PKT_SIZE);
 826                }
 827
 828                if (!priv->transient && xs->rx_bytes_avail != 0) {
 829                        can_recv = xs->rx_bytes_avail;
 830                        priv->flags.read_urb_in_use = 1;
 831                }
 832
 833                transient = priv->transient;
 834                spin_unlock_irqrestore(&priv->lock, flags);
 835        }
 836
 837        if (can_recv) {
 838                int result;
 839
 840                port->read_urb->dev = port->serial->dev;
 841                result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
 842                if (result != 0) {
 843                        priv->flags.read_urb_in_use = 0;
 844                        dev_err(&port->dev, "%s(): usb_submit_urb() failed,"
 845                                        " error %d\n", __func__, result);
 846                } else {
 847                        resubmit = 0;
 848                }
 849        } else if (!transient) {
 850                unsigned long flags;
 851                int count;
 852
 853                spin_lock_irqsave(&port->lock, flags);
 854                count = kfifo_len(&port->write_fifo);
 855                spin_unlock_irqrestore(&port->lock, flags);
 856
 857                spin_lock_irqsave(&priv->lock, flags);
 858                if (priv->flags.write_urb_in_use == 0 && count != 0) {
 859                        schedule_delayed_work(&priv->delayed_write_work, 0);
 860                        resubmit = 0;
 861                }
 862                spin_unlock_irqrestore(&priv->lock, flags);
 863        }
 864
 865        if (resubmit) {
 866                int result;
 867
 868/*              dbg("%s(): submitting interrupt urb", __func__); */
 869                urb->dev = port->serial->dev;
 870                result = usb_submit_urb(urb, GFP_ATOMIC);
 871                if (result != 0) {
 872                        dev_err(&urb->dev->dev,
 873                                        "%s(): usb_submit_urb() failed with"
 874                                        " error %d\n", __func__, result);
 875                }
 876        }
 877}
 878
 879static void oti6858_read_bulk_callback(struct urb *urb)
 880{
 881        struct usb_serial_port *port =  urb->context;
 882        struct oti6858_private *priv = usb_get_serial_port_data(port);
 883        struct tty_struct *tty;
 884        unsigned char *data = urb->transfer_buffer;
 885        unsigned long flags;
 886        int status = urb->status;
 887        int result;
 888
 889        dbg("%s(port = %d, status = %d)",
 890                                __func__, port->number, status);
 891
 892        spin_lock_irqsave(&priv->lock, flags);
 893        priv->flags.read_urb_in_use = 0;
 894        spin_unlock_irqrestore(&priv->lock, flags);
 895
 896        if (status != 0) {
 897                /*
 898                if (status == -EPROTO) {
 899                        * PL2303 mysteriously fails with -EPROTO reschedule
 900                           the read *
 901                        dbg("%s - caught -EPROTO, resubmitting the urb",
 902                                                                __func__);
 903                        result = usb_submit_urb(urb, GFP_ATOMIC);
 904                        if (result)
 905                                dev_err(&urb->dev->dev, "%s - failed resubmitting read urb, error %d\n", __func__, result);
 906                        return;
 907                }
 908                */
 909                dbg("%s(): unable to handle the error, exiting", __func__);
 910                return;
 911        }
 912
 913        tty = tty_port_tty_get(&port->port);
 914        if (tty != NULL && urb->actual_length > 0) {
 915                tty_insert_flip_string(tty, data, urb->actual_length);
 916                tty_flip_buffer_push(tty);
 917        }
 918        tty_kref_put(tty);
 919
 920        /* schedule the interrupt urb */
 921        port->interrupt_in_urb->dev = port->serial->dev;
 922        result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
 923        if (result != 0 && result != -EPERM) {
 924                dev_err(&port->dev, "%s(): usb_submit_urb() failed,"
 925                                " error %d\n", __func__, result);
 926        }
 927}
 928
 929static void oti6858_write_bulk_callback(struct urb *urb)
 930{
 931        struct usb_serial_port *port =  urb->context;
 932        struct oti6858_private *priv = usb_get_serial_port_data(port);
 933        int status = urb->status;
 934        int result;
 935
 936        dbg("%s(port = %d, status = %d)",
 937                                __func__, port->number, status);
 938
 939        switch (status) {
 940        case 0:
 941                /* success */
 942                break;
 943        case -ECONNRESET:
 944        case -ENOENT:
 945        case -ESHUTDOWN:
 946                /* this urb is terminated, clean up */
 947                dbg("%s(): urb shutting down with status: %d",
 948                                        __func__, status);
 949                priv->flags.write_urb_in_use = 0;
 950                return;
 951        default:
 952                /* error in the urb, so we have to resubmit it */
 953                dbg("%s(): nonzero write bulk status received: %d",
 954                                        __func__, status);
 955                dbg("%s(): overflow in write", __func__);
 956
 957                port->write_urb->transfer_buffer_length = 1;
 958                port->write_urb->dev = port->serial->dev;
 959                result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
 960                if (result) {
 961                        dev_err(&port->dev, "%s(): usb_submit_urb() failed,"
 962                                        " error %d\n", __func__, result);
 963                } else {
 964                        return;
 965                }
 966        }
 967
 968        priv->flags.write_urb_in_use = 0;
 969
 970        /* schedule the interrupt urb if we are still open */
 971        port->interrupt_in_urb->dev = port->serial->dev;
 972        dbg("%s(): submitting interrupt urb", __func__);
 973        result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
 974        if (result != 0) {
 975                dev_err(&port->dev, "%s(): failed submitting int urb,"
 976                                        " error %d\n", __func__, result);
 977        }
 978}
 979
 980/* module description and (de)initialization */
 981
 982static int __init oti6858_init(void)
 983{
 984        int retval;
 985
 986        retval = usb_serial_register(&oti6858_device);
 987        if (retval == 0) {
 988                retval = usb_register(&oti6858_driver);
 989                if (retval)
 990                        usb_serial_deregister(&oti6858_device);
 991        }
 992        return retval;
 993}
 994
 995static void __exit oti6858_exit(void)
 996{
 997        usb_deregister(&oti6858_driver);
 998        usb_serial_deregister(&oti6858_device);
 999}
1000
1001module_init(oti6858_init);
1002module_exit(oti6858_exit);
1003
1004MODULE_DESCRIPTION(OTI6858_DESCRIPTION);
1005MODULE_AUTHOR(OTI6858_AUTHOR);
1006MODULE_VERSION(OTI6858_VERSION);
1007MODULE_LICENSE("GPL");
1008
1009module_param(debug, bool, S_IRUGO | S_IWUSR);
1010MODULE_PARM_DESC(debug, "enable debug output");
1011
1012