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