linux/drivers/usb/serial/keyspan_pda.c
<<
>>
Prefs
   1/*
   2 * USB Keyspan PDA / Xircom / Entregra Converter driver
   3 *
   4 * Copyright (C) 1999 - 2001 Greg Kroah-Hartman <greg@kroah.com>
   5 * Copyright (C) 1999, 2000 Brian Warner        <warner@lothar.com>
   6 * Copyright (C) 2000 Al Borchers               <borchers@steinerpoint.com>
   7 *
   8 *      This program is free software; you can redistribute it and/or modify
   9 *      it under the terms of the GNU General Public License as published by
  10 *      the Free Software Foundation; either version 2 of the License, or
  11 *      (at your option) any later version.
  12 *
  13 * See Documentation/usb/usb-serial.txt for more information on using this
  14 * driver
  15 *
  16 * (09/07/2001) gkh
  17 *      cleaned up the Xircom support.  Added ids for Entregra device which is
  18 *      the same as the Xircom device.  Enabled the code to be compiled for
  19 *      either Xircom or Keyspan devices.
  20 *
  21 * (08/11/2001) Cristian M. Craciunescu
  22 *      support for Xircom PGSDB9
  23 *
  24 * (05/31/2001) gkh
  25 *      switched from using spinlock to a semaphore, which fixes lots of
  26 *      problems.
  27 *
  28 * (04/08/2001) gb
  29 *      Identify version on module load.
  30 *
  31 * (11/01/2000) Adam J. Richter
  32 *      usb_device_id table support
  33 *
  34 * (10/05/2000) gkh
  35 *      Fixed bug with urb->dev not being set properly, now that the usb
  36 *      core needs it.
  37 *
  38 * (08/28/2000) gkh
  39 *      Added locks for SMP safeness.
  40 *      Fixed MOD_INC and MOD_DEC logic and the ability to open a port more
  41 *      than once.
  42 *
  43 * (07/20/2000) borchers
  44 *      - keyspan_pda_write no longer sleeps if it is called on interrupt time;
  45 *        PPP and the line discipline with stty echo on can call write on
  46 *        interrupt time and this would cause an oops if write slept
  47 *      - if keyspan_pda_write is in an interrupt, it will not call
  48 *        usb_control_msg (which sleeps) to query the room in the device
  49 *        buffer, it simply uses the current room value it has
  50 *      - if the urb is busy or if it is throttled keyspan_pda_write just
  51 *        returns 0, rather than sleeping to wait for this to change; the
  52 *        write_chan code in n_tty.c will sleep if needed before calling
  53 *        keyspan_pda_write again
  54 *      - if the device needs to be unthrottled, write now queues up the
  55 *        call to usb_control_msg (which sleeps) to unthrottle the device
  56 *      - the wakeups from keyspan_pda_write_bulk_callback are queued rather
  57 *        than done directly from the callback to avoid the race in write_chan
  58 *      - keyspan_pda_chars_in_buffer also indicates its buffer is full if the
  59 *        urb status is -EINPROGRESS, meaning it cannot write at the moment
  60 *
  61 * (07/19/2000) gkh
  62 *      Added module_init and module_exit functions to handle the fact that this
  63 *      driver is a loadable module now.
  64 *
  65 * (03/26/2000) gkh
  66 *      Split driver up into device specific pieces.
  67 *
  68 */
  69
  70
  71#include <linux/kernel.h>
  72#include <linux/errno.h>
  73#include <linux/init.h>
  74#include <linux/slab.h>
  75#include <linux/tty.h>
  76#include <linux/tty_driver.h>
  77#include <linux/tty_flip.h>
  78#include <linux/module.h>
  79#include <linux/spinlock.h>
  80#include <linux/workqueue.h>
  81#include <linux/firmware.h>
  82#include <linux/ihex.h>
  83#include <linux/uaccess.h>
  84#include <linux/usb.h>
  85#include <linux/usb/serial.h>
  86
  87static int debug;
  88
  89/* make a simple define to handle if we are compiling keyspan_pda or xircom support */
  90#if defined(CONFIG_USB_SERIAL_KEYSPAN_PDA) || defined(CONFIG_USB_SERIAL_KEYSPAN_PDA_MODULE)
  91        #define KEYSPAN
  92#else
  93        #undef KEYSPAN
  94#endif
  95#if defined(CONFIG_USB_SERIAL_XIRCOM) || defined(CONFIG_USB_SERIAL_XIRCOM_MODULE)
  96        #define XIRCOM
  97#else
  98        #undef XIRCOM
  99#endif
 100
 101/*
 102 * Version Information
 103 */
 104#define DRIVER_VERSION "v1.1"
 105#define DRIVER_AUTHOR "Brian Warner <warner@lothar.com>"
 106#define DRIVER_DESC "USB Keyspan PDA Converter driver"
 107
 108struct keyspan_pda_private {
 109        int                     tx_room;
 110        int                     tx_throttled;
 111        struct work_struct                      wakeup_work;
 112        struct work_struct                      unthrottle_work;
 113        struct usb_serial       *serial;
 114        struct usb_serial_port  *port;
 115};
 116
 117
 118#define KEYSPAN_VENDOR_ID               0x06cd
 119#define KEYSPAN_PDA_FAKE_ID             0x0103
 120#define KEYSPAN_PDA_ID                  0x0104 /* no clue */
 121
 122/* For Xircom PGSDB9 and older Entregra version of the same device */
 123#define XIRCOM_VENDOR_ID                0x085a
 124#define XIRCOM_FAKE_ID                  0x8027
 125#define ENTREGRA_VENDOR_ID              0x1645
 126#define ENTREGRA_FAKE_ID                0x8093
 127
 128static struct usb_device_id id_table_combined [] = {
 129#ifdef KEYSPAN
 130        { USB_DEVICE(KEYSPAN_VENDOR_ID, KEYSPAN_PDA_FAKE_ID) },
 131#endif
 132#ifdef XIRCOM
 133        { USB_DEVICE(XIRCOM_VENDOR_ID, XIRCOM_FAKE_ID) },
 134        { USB_DEVICE(ENTREGRA_VENDOR_ID, ENTREGRA_FAKE_ID) },
 135#endif
 136        { USB_DEVICE(KEYSPAN_VENDOR_ID, KEYSPAN_PDA_ID) },
 137        { }                                             /* Terminating entry */
 138};
 139
 140MODULE_DEVICE_TABLE(usb, id_table_combined);
 141
 142static struct usb_driver keyspan_pda_driver = {
 143        .name =         "keyspan_pda",
 144        .probe =        usb_serial_probe,
 145        .disconnect =   usb_serial_disconnect,
 146        .id_table =     id_table_combined,
 147        .no_dynamic_id =        1,
 148};
 149
 150static struct usb_device_id id_table_std [] = {
 151        { USB_DEVICE(KEYSPAN_VENDOR_ID, KEYSPAN_PDA_ID) },
 152        { }                                             /* Terminating entry */
 153};
 154
 155#ifdef KEYSPAN
 156static struct usb_device_id id_table_fake [] = {
 157        { USB_DEVICE(KEYSPAN_VENDOR_ID, KEYSPAN_PDA_FAKE_ID) },
 158        { }                                             /* Terminating entry */
 159};
 160#endif
 161
 162#ifdef XIRCOM
 163static struct usb_device_id id_table_fake_xircom [] = {
 164        { USB_DEVICE(XIRCOM_VENDOR_ID, XIRCOM_FAKE_ID) },
 165        { USB_DEVICE(ENTREGRA_VENDOR_ID, ENTREGRA_FAKE_ID) },
 166        { }
 167};
 168#endif
 169
 170static void keyspan_pda_wakeup_write(struct work_struct *work)
 171{
 172        struct keyspan_pda_private *priv =
 173                container_of(work, struct keyspan_pda_private, wakeup_work);
 174        struct usb_serial_port *port = priv->port;
 175
 176        tty_wakeup(port->port.tty);
 177}
 178
 179static void keyspan_pda_request_unthrottle(struct work_struct *work)
 180{
 181        struct keyspan_pda_private *priv =
 182                container_of(work, struct keyspan_pda_private, unthrottle_work);
 183        struct usb_serial *serial = priv->serial;
 184        int result;
 185
 186        dbg(" request_unthrottle");
 187        /* ask the device to tell us when the tx buffer becomes
 188           sufficiently empty */
 189        result = usb_control_msg(serial->dev,
 190                                 usb_sndctrlpipe(serial->dev, 0),
 191                                 7, /* request_unthrottle */
 192                                 USB_TYPE_VENDOR | USB_RECIP_INTERFACE
 193                                 | USB_DIR_OUT,
 194                                 16, /* value: threshold */
 195                                 0, /* index */
 196                                 NULL,
 197                                 0,
 198                                 2000);
 199        if (result < 0)
 200                dbg("%s - error %d from usb_control_msg",
 201                    __func__, result);
 202}
 203
 204
 205static void keyspan_pda_rx_interrupt(struct urb *urb)
 206{
 207        struct usb_serial_port *port = urb->context;
 208        struct tty_struct *tty = port->port.tty;
 209        unsigned char *data = urb->transfer_buffer;
 210        int retval;
 211        int status = urb->status;
 212        struct keyspan_pda_private *priv;
 213        priv = usb_get_serial_port_data(port);
 214
 215        switch (status) {
 216        case 0:
 217                /* success */
 218                break;
 219        case -ECONNRESET:
 220        case -ENOENT:
 221        case -ESHUTDOWN:
 222                /* this urb is terminated, clean up */
 223                dbg("%s - urb shutting down with status: %d",
 224                    __func__, status);
 225                return;
 226        default:
 227                dbg("%s - nonzero urb status received: %d",
 228                    __func__, status);
 229                goto exit;
 230        }
 231
 232        /* see if the message is data or a status interrupt */
 233        switch (data[0]) {
 234        case 0:
 235                /* rest of message is rx data */
 236                if (urb->actual_length) {
 237                        tty_insert_flip_string(tty, data + 1,
 238                                                urb->actual_length - 1);
 239                        tty_flip_buffer_push(tty);
 240                }
 241                break;
 242        case 1:
 243                /* status interrupt */
 244                dbg(" rx int, d1=%d, d2=%d", data[1], data[2]);
 245                switch (data[1]) {
 246                case 1: /* modemline change */
 247                        break;
 248                case 2: /* tx unthrottle interrupt */
 249                        priv->tx_throttled = 0;
 250                        /* queue up a wakeup at scheduler time */
 251                        schedule_work(&priv->wakeup_work);
 252                        break;
 253                default:
 254                        break;
 255                }
 256                break;
 257        default:
 258                break;
 259        }
 260
 261exit:
 262        retval = usb_submit_urb(urb, GFP_ATOMIC);
 263        if (retval)
 264                err("%s - usb_submit_urb failed with result %d",
 265                     __func__, retval);
 266}
 267
 268
 269static void keyspan_pda_rx_throttle(struct tty_struct *tty)
 270{
 271        /* stop receiving characters. We just turn off the URB request, and
 272           let chars pile up in the device. If we're doing hardware
 273           flowcontrol, the device will signal the other end when its buffer
 274           fills up. If we're doing XON/XOFF, this would be a good time to
 275           send an XOFF, although it might make sense to foist that off
 276           upon the device too. */
 277        struct usb_serial_port *port = tty->driver_data;
 278        dbg("keyspan_pda_rx_throttle port %d", port->number);
 279        usb_kill_urb(port->interrupt_in_urb);
 280}
 281
 282
 283static void keyspan_pda_rx_unthrottle(struct tty_struct *tty)
 284{
 285        struct usb_serial_port *port = tty->driver_data;
 286        /* just restart the receive interrupt URB */
 287        dbg("keyspan_pda_rx_unthrottle port %d", port->number);
 288        port->interrupt_in_urb->dev = port->serial->dev;
 289        if (usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC))
 290                dbg(" usb_submit_urb(read urb) failed");
 291        return;
 292}
 293
 294
 295static speed_t keyspan_pda_setbaud(struct usb_serial *serial, speed_t baud)
 296{
 297        int rc;
 298        int bindex;
 299
 300        switch (baud) {
 301        case 110:
 302                bindex = 0;
 303                break;
 304        case 300:
 305                bindex = 1;
 306                break;
 307        case 1200:
 308                bindex = 2;
 309                break;
 310        case 2400:
 311                bindex = 3;
 312                break;
 313        case 4800:
 314                bindex = 4;
 315                break;
 316        case 9600:
 317                bindex = 5;
 318                break;
 319        case 19200:
 320                bindex = 6;
 321                break;
 322        case 38400:
 323                bindex = 7;
 324                break;
 325        case 57600:
 326                bindex = 8;
 327                break;
 328        case 115200:
 329                bindex = 9;
 330                break;
 331        default:
 332                bindex = 5;     /* Default to 9600 */
 333                baud = 9600;
 334        }
 335
 336        /* rather than figure out how to sleep while waiting for this
 337           to complete, I just use the "legacy" API. */
 338        rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
 339                             0, /* set baud */
 340                             USB_TYPE_VENDOR
 341                             | USB_RECIP_INTERFACE
 342                             | USB_DIR_OUT, /* type */
 343                             bindex, /* value */
 344                             0, /* index */
 345                             NULL, /* &data */
 346                             0, /* size */
 347                             2000); /* timeout */
 348        if (rc < 0)
 349                return 0;
 350        return baud;
 351}
 352
 353
 354static void keyspan_pda_break_ctl(struct tty_struct *tty, int break_state)
 355{
 356        struct usb_serial_port *port = tty->driver_data;
 357        struct usb_serial *serial = port->serial;
 358        int value;
 359        int result;
 360
 361        if (break_state == -1)
 362                value = 1; /* start break */
 363        else
 364                value = 0; /* clear break */
 365        result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
 366                        4, /* set break */
 367                        USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT,
 368                        value, 0, NULL, 0, 2000);
 369        if (result < 0)
 370                dbg("%s - error %d from usb_control_msg",
 371                    __func__, result);
 372        /* there is something funky about this.. the TCSBRK that 'cu' performs
 373           ought to translate into a break_ctl(-1),break_ctl(0) pair HZ/4
 374           seconds apart, but it feels like the break sent isn't as long as it
 375           is on /dev/ttyS0 */
 376}
 377
 378
 379static void keyspan_pda_set_termios(struct tty_struct *tty,
 380                struct usb_serial_port *port, struct ktermios *old_termios)
 381{
 382        struct usb_serial *serial = port->serial;
 383        speed_t speed;
 384
 385        /* cflag specifies lots of stuff: number of stop bits, parity, number
 386           of data bits, baud. What can the device actually handle?:
 387           CSTOPB (1 stop bit or 2)
 388           PARENB (parity)
 389           CSIZE (5bit .. 8bit)
 390           There is minimal hw support for parity (a PSW bit seems to hold the
 391           parity of whatever is in the accumulator). The UART either deals
 392           with 10 bits (start, 8 data, stop) or 11 bits (start, 8 data,
 393           1 special, stop). So, with firmware changes, we could do:
 394           8N1: 10 bit
 395           8N2: 11 bit, extra bit always (mark?)
 396           8[EOMS]1: 11 bit, extra bit is parity
 397           7[EOMS]1: 10 bit, b0/b7 is parity
 398           7[EOMS]2: 11 bit, b0/b7 is parity, extra bit always (mark?)
 399
 400           HW flow control is dictated by the tty->termios->c_cflags & CRTSCTS
 401           bit.
 402
 403           For now, just do baud. */
 404
 405        speed = tty_get_baud_rate(tty);
 406        speed = keyspan_pda_setbaud(serial, speed);
 407
 408        if (speed == 0) {
 409                dbg("can't handle requested baud rate");
 410                /* It hasn't changed so.. */
 411                speed = tty_termios_baud_rate(old_termios);
 412        }
 413        /* Only speed can change so copy the old h/w parameters
 414           then encode the new speed */
 415        tty_termios_copy_hw(tty->termios, old_termios);
 416        tty_encode_baud_rate(tty, speed, speed);
 417}
 418
 419
 420/* modem control pins: DTR and RTS are outputs and can be controlled.
 421   DCD, RI, DSR, CTS are inputs and can be read. All outputs can also be
 422   read. The byte passed is: DTR(b7) DCD RI DSR CTS RTS(b2) unused unused */
 423
 424static int keyspan_pda_get_modem_info(struct usb_serial *serial,
 425                                      unsigned char *value)
 426{
 427        int rc;
 428        unsigned char data;
 429        rc = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
 430                             3, /* get pins */
 431                             USB_TYPE_VENDOR|USB_RECIP_INTERFACE|USB_DIR_IN,
 432                             0, 0, &data, 1, 2000);
 433        if (rc >= 0)
 434                *value = data;
 435        return rc;
 436}
 437
 438
 439static int keyspan_pda_set_modem_info(struct usb_serial *serial,
 440                                      unsigned char value)
 441{
 442        int rc;
 443        rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
 444                             3, /* set pins */
 445                             USB_TYPE_VENDOR|USB_RECIP_INTERFACE|USB_DIR_OUT,
 446                             value, 0, NULL, 0, 2000);
 447        return rc;
 448}
 449
 450static int keyspan_pda_tiocmget(struct tty_struct *tty, struct file *file)
 451{
 452        struct usb_serial_port *port = tty->driver_data;
 453        struct usb_serial *serial = port->serial;
 454        int rc;
 455        unsigned char status;
 456        int value;
 457
 458        rc = keyspan_pda_get_modem_info(serial, &status);
 459        if (rc < 0)
 460                return rc;
 461        value =
 462                ((status & (1<<7)) ? TIOCM_DTR : 0) |
 463                ((status & (1<<6)) ? TIOCM_CAR : 0) |
 464                ((status & (1<<5)) ? TIOCM_RNG : 0) |
 465                ((status & (1<<4)) ? TIOCM_DSR : 0) |
 466                ((status & (1<<3)) ? TIOCM_CTS : 0) |
 467                ((status & (1<<2)) ? TIOCM_RTS : 0);
 468        return value;
 469}
 470
 471static int keyspan_pda_tiocmset(struct tty_struct *tty, struct file *file,
 472                                unsigned int set, unsigned int clear)
 473{
 474        struct usb_serial_port *port = tty->driver_data;
 475        struct usb_serial *serial = port->serial;
 476        int rc;
 477        unsigned char status;
 478
 479        rc = keyspan_pda_get_modem_info(serial, &status);
 480        if (rc < 0)
 481                return rc;
 482
 483        if (set & TIOCM_RTS)
 484                status |= (1<<2);
 485        if (set & TIOCM_DTR)
 486                status |= (1<<7);
 487
 488        if (clear & TIOCM_RTS)
 489                status &= ~(1<<2);
 490        if (clear & TIOCM_DTR)
 491                status &= ~(1<<7);
 492        rc = keyspan_pda_set_modem_info(serial, status);
 493        return rc;
 494}
 495
 496static int keyspan_pda_write(struct tty_struct *tty,
 497        struct usb_serial_port *port, const unsigned char *buf, int count)
 498{
 499        struct usb_serial *serial = port->serial;
 500        int request_unthrottle = 0;
 501        int rc = 0;
 502        struct keyspan_pda_private *priv;
 503
 504        priv = usb_get_serial_port_data(port);
 505        /* guess how much room is left in the device's ring buffer, and if we
 506           want to send more than that, check first, updating our notion of
 507           what is left. If our write will result in no room left, ask the
 508           device to give us an interrupt when the room available rises above
 509           a threshold, and hold off all writers (eventually, those using
 510           select() or poll() too) until we receive that unthrottle interrupt.
 511           Block if we can't write anything at all, otherwise write as much as
 512           we can. */
 513        dbg("keyspan_pda_write(%d)", count);
 514        if (count == 0) {
 515                dbg(" write request of 0 bytes");
 516                return 0;
 517        }
 518
 519        /* we might block because of:
 520           the TX urb is in-flight (wait until it completes)
 521           the device is full (wait until it says there is room)
 522        */
 523        spin_lock_bh(&port->lock);
 524        if (port->write_urb_busy || priv->tx_throttled) {
 525                spin_unlock_bh(&port->lock);
 526                return 0;
 527        }
 528        port->write_urb_busy = 1;
 529        spin_unlock_bh(&port->lock);
 530
 531        /* At this point the URB is in our control, nobody else can submit it
 532           again (the only sudden transition was the one from EINPROGRESS to
 533           finished).  Also, the tx process is not throttled. So we are
 534           ready to write. */
 535
 536        count = (count > port->bulk_out_size) ? port->bulk_out_size : count;
 537
 538        /* Check if we might overrun the Tx buffer.   If so, ask the
 539           device how much room it really has.  This is done only on
 540           scheduler time, since usb_control_msg() sleeps. */
 541        if (count > priv->tx_room && !in_interrupt()) {
 542                unsigned char room;
 543                rc = usb_control_msg(serial->dev,
 544                                     usb_rcvctrlpipe(serial->dev, 0),
 545                                     6, /* write_room */
 546                                     USB_TYPE_VENDOR | USB_RECIP_INTERFACE
 547                                     | USB_DIR_IN,
 548                                     0, /* value: 0 means "remaining room" */
 549                                     0, /* index */
 550                                     &room,
 551                                     1,
 552                                     2000);
 553                if (rc < 0) {
 554                        dbg(" roomquery failed");
 555                        goto exit;
 556                }
 557                if (rc == 0) {
 558                        dbg(" roomquery returned 0 bytes");
 559                        rc = -EIO; /* device didn't return any data */
 560                        goto exit;
 561                }
 562                dbg(" roomquery says %d", room);
 563                priv->tx_room = room;
 564        }
 565        if (count > priv->tx_room) {
 566                /* we're about to completely fill the Tx buffer, so
 567                   we'll be throttled afterwards. */
 568                count = priv->tx_room;
 569                request_unthrottle = 1;
 570        }
 571
 572        if (count) {
 573                /* now transfer data */
 574                memcpy(port->write_urb->transfer_buffer, buf, count);
 575                /* send the data out the bulk port */
 576                port->write_urb->transfer_buffer_length = count;
 577
 578                priv->tx_room -= count;
 579
 580                port->write_urb->dev = port->serial->dev;
 581                rc = usb_submit_urb(port->write_urb, GFP_ATOMIC);
 582                if (rc) {
 583                        dbg(" usb_submit_urb(write bulk) failed");
 584                        goto exit;
 585                }
 586        } else {
 587                /* There wasn't any room left, so we are throttled until
 588                   the buffer empties a bit */
 589                request_unthrottle = 1;
 590        }
 591
 592        if (request_unthrottle) {
 593                priv->tx_throttled = 1; /* block writers */
 594                schedule_work(&priv->unthrottle_work);
 595        }
 596
 597        rc = count;
 598exit:
 599        if (rc < 0)
 600                port->write_urb_busy = 0;
 601        return rc;
 602}
 603
 604
 605static void keyspan_pda_write_bulk_callback(struct urb *urb)
 606{
 607        struct usb_serial_port *port = urb->context;
 608        struct keyspan_pda_private *priv;
 609
 610        port->write_urb_busy = 0;
 611        priv = usb_get_serial_port_data(port);
 612
 613        /* queue up a wakeup at scheduler time */
 614        schedule_work(&priv->wakeup_work);
 615}
 616
 617
 618static int keyspan_pda_write_room(struct tty_struct *tty)
 619{
 620        struct usb_serial_port *port = tty->driver_data;
 621        struct keyspan_pda_private *priv;
 622        priv = usb_get_serial_port_data(port);
 623        /* used by n_tty.c for processing of tabs and such. Giving it our
 624           conservative guess is probably good enough, but needs testing by
 625           running a console through the device. */
 626        return priv->tx_room;
 627}
 628
 629
 630static int keyspan_pda_chars_in_buffer(struct tty_struct *tty)
 631{
 632        struct usb_serial_port *port = tty->driver_data;
 633        struct keyspan_pda_private *priv;
 634        unsigned long flags;
 635        int ret = 0;
 636
 637        priv = usb_get_serial_port_data(port);
 638
 639        /* when throttled, return at least WAKEUP_CHARS to tell select() (via
 640           n_tty.c:normal_poll() ) that we're not writeable. */
 641
 642        spin_lock_irqsave(&port->lock, flags);
 643        if (port->write_urb_busy || priv->tx_throttled)
 644                ret = 256;
 645        spin_unlock_irqrestore(&port->lock, flags);
 646        return ret;
 647}
 648
 649
 650static int keyspan_pda_open(struct tty_struct *tty,
 651                        struct usb_serial_port *port, struct file *filp)
 652{
 653        struct usb_serial *serial = port->serial;
 654        unsigned char room;
 655        int rc = 0;
 656        struct keyspan_pda_private *priv;
 657
 658        /* find out how much room is in the Tx ring */
 659        rc = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
 660                             6, /* write_room */
 661                             USB_TYPE_VENDOR | USB_RECIP_INTERFACE
 662                             | USB_DIR_IN,
 663                             0, /* value */
 664                             0, /* index */
 665                             &room,
 666                             1,
 667                             2000);
 668        if (rc < 0) {
 669                dbg("%s - roomquery failed", __func__);
 670                goto error;
 671        }
 672        if (rc == 0) {
 673                dbg("%s - roomquery returned 0 bytes", __func__);
 674                rc = -EIO;
 675                goto error;
 676        }
 677        priv = usb_get_serial_port_data(port);
 678        priv->tx_room = room;
 679        priv->tx_throttled = room ? 0 : 1;
 680
 681        /* the normal serial device seems to always turn on DTR and RTS here,
 682           so do the same */
 683        if (tty && (tty->termios->c_cflag & CBAUD))
 684                keyspan_pda_set_modem_info(serial, (1<<7) | (1<<2));
 685        else
 686                keyspan_pda_set_modem_info(serial, 0);
 687
 688        /*Start reading from the device*/
 689        port->interrupt_in_urb->dev = serial->dev;
 690        rc = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
 691        if (rc) {
 692                dbg("%s - usb_submit_urb(read int) failed", __func__);
 693                goto error;
 694        }
 695
 696error:
 697        return rc;
 698}
 699
 700
 701static void keyspan_pda_close(struct tty_struct *tty,
 702                        struct usb_serial_port *port, struct file *filp)
 703{
 704        struct usb_serial *serial = port->serial;
 705
 706        if (serial->dev) {
 707                /* the normal serial device seems to always shut
 708                   off DTR and RTS now */
 709                if (tty->termios->c_cflag & HUPCL)
 710                        keyspan_pda_set_modem_info(serial, 0);
 711
 712                /* shutdown our bulk reads and writes */
 713                usb_kill_urb(port->write_urb);
 714                usb_kill_urb(port->interrupt_in_urb);
 715        }
 716}
 717
 718
 719/* download the firmware to a "fake" device (pre-renumeration) */
 720static int keyspan_pda_fake_startup(struct usb_serial *serial)
 721{
 722        int response;
 723        const char *fw_name;
 724        const struct ihex_binrec *record;
 725        const struct firmware *fw;
 726
 727        /* download the firmware here ... */
 728        response = ezusb_set_reset(serial, 1);
 729
 730        if (0) { ; }
 731#ifdef KEYSPAN
 732        else if (le16_to_cpu(serial->dev->descriptor.idVendor) == KEYSPAN_VENDOR_ID)
 733                fw_name = "keyspan_pda/keyspan_pda.fw";
 734#endif
 735#ifdef XIRCOM
 736        else if ((le16_to_cpu(serial->dev->descriptor.idVendor) == XIRCOM_VENDOR_ID) ||
 737                 (le16_to_cpu(serial->dev->descriptor.idVendor) == ENTREGRA_VENDOR_ID))
 738                fw_name = "keyspan_pda/xircom_pgs.fw";
 739#endif
 740        else {
 741                err("%s: unknown vendor, aborting.", __func__);
 742                return -ENODEV;
 743        }
 744        if (request_ihex_firmware(&fw, fw_name, &serial->dev->dev)) {
 745                err("failed to load firmware \"%s\"\n", fw_name);
 746                return -ENOENT;
 747        }
 748        record = (const struct ihex_binrec *)fw->data;
 749
 750        while (record) {
 751                response = ezusb_writememory(serial, be32_to_cpu(record->addr),
 752                                             (unsigned char *)record->data,
 753                                             be16_to_cpu(record->len), 0xa0);
 754                if (response < 0) {
 755                        err("ezusb_writememory failed for Keyspan PDA "
 756                            "firmware (%d %04X %p %d)",
 757                            response, be32_to_cpu(record->addr),
 758                            record->data, be16_to_cpu(record->len));
 759                        break;
 760                }
 761                record = ihex_next_binrec(record);
 762        }
 763        release_firmware(fw);
 764        /* bring device out of reset. Renumeration will occur in a moment
 765           and the new device will bind to the real driver */
 766        response = ezusb_set_reset(serial, 0);
 767
 768        /* we want this device to fail to have a driver assigned to it. */
 769        return 1;
 770}
 771
 772static int keyspan_pda_startup(struct usb_serial *serial)
 773{
 774
 775        struct keyspan_pda_private *priv;
 776
 777        /* allocate the private data structures for all ports. Well, for all
 778           one ports. */
 779
 780        priv = kmalloc(sizeof(struct keyspan_pda_private), GFP_KERNEL);
 781        if (!priv)
 782                return 1; /* error */
 783        usb_set_serial_port_data(serial->port[0], priv);
 784        init_waitqueue_head(&serial->port[0]->write_wait);
 785        INIT_WORK(&priv->wakeup_work, keyspan_pda_wakeup_write);
 786        INIT_WORK(&priv->unthrottle_work, keyspan_pda_request_unthrottle);
 787        priv->serial = serial;
 788        priv->port = serial->port[0];
 789        return 0;
 790}
 791
 792static void keyspan_pda_release(struct usb_serial *serial)
 793{
 794        dbg("%s", __func__);
 795
 796        kfree(usb_get_serial_port_data(serial->port[0]));
 797}
 798
 799#ifdef KEYSPAN
 800static struct usb_serial_driver keyspan_pda_fake_device = {
 801        .driver = {
 802                .owner =        THIS_MODULE,
 803                .name =         "keyspan_pda_pre",
 804        },
 805        .description =          "Keyspan PDA - (prerenumeration)",
 806        .usb_driver =           &keyspan_pda_driver,
 807        .id_table =             id_table_fake,
 808        .num_ports =            1,
 809        .attach =               keyspan_pda_fake_startup,
 810};
 811#endif
 812
 813#ifdef XIRCOM
 814static struct usb_serial_driver xircom_pgs_fake_device = {
 815        .driver = {
 816                .owner =        THIS_MODULE,
 817                .name =         "xircom_no_firm",
 818        },
 819        .description =          "Xircom / Entregra PGS - (prerenumeration)",
 820        .usb_driver =           &keyspan_pda_driver,
 821        .id_table =             id_table_fake_xircom,
 822        .num_ports =            1,
 823        .attach =               keyspan_pda_fake_startup,
 824};
 825#endif
 826
 827static struct usb_serial_driver keyspan_pda_device = {
 828        .driver = {
 829                .owner =        THIS_MODULE,
 830                .name =         "keyspan_pda",
 831        },
 832        .description =          "Keyspan PDA",
 833        .usb_driver =           &keyspan_pda_driver,
 834        .id_table =             id_table_std,
 835        .num_ports =            1,
 836        .open =                 keyspan_pda_open,
 837        .close =                keyspan_pda_close,
 838        .write =                keyspan_pda_write,
 839        .write_room =           keyspan_pda_write_room,
 840        .write_bulk_callback =  keyspan_pda_write_bulk_callback,
 841        .read_int_callback =    keyspan_pda_rx_interrupt,
 842        .chars_in_buffer =      keyspan_pda_chars_in_buffer,
 843        .throttle =             keyspan_pda_rx_throttle,
 844        .unthrottle =           keyspan_pda_rx_unthrottle,
 845        .set_termios =          keyspan_pda_set_termios,
 846        .break_ctl =            keyspan_pda_break_ctl,
 847        .tiocmget =             keyspan_pda_tiocmget,
 848        .tiocmset =             keyspan_pda_tiocmset,
 849        .attach =               keyspan_pda_startup,
 850        .release =              keyspan_pda_release,
 851};
 852
 853
 854static int __init keyspan_pda_init(void)
 855{
 856        int retval;
 857        retval = usb_serial_register(&keyspan_pda_device);
 858        if (retval)
 859                goto failed_pda_register;
 860#ifdef KEYSPAN
 861        retval = usb_serial_register(&keyspan_pda_fake_device);
 862        if (retval)
 863                goto failed_pda_fake_register;
 864#endif
 865#ifdef XIRCOM
 866        retval = usb_serial_register(&xircom_pgs_fake_device);
 867        if (retval)
 868                goto failed_xircom_register;
 869#endif
 870        retval = usb_register(&keyspan_pda_driver);
 871        if (retval)
 872                goto failed_usb_register;
 873        info(DRIVER_DESC " " DRIVER_VERSION);
 874        return 0;
 875failed_usb_register:
 876#ifdef XIRCOM
 877        usb_serial_deregister(&xircom_pgs_fake_device);
 878failed_xircom_register:
 879#endif /* XIRCOM */
 880#ifdef KEYSPAN
 881        usb_serial_deregister(&keyspan_pda_fake_device);
 882#endif
 883#ifdef KEYSPAN
 884failed_pda_fake_register:
 885#endif
 886        usb_serial_deregister(&keyspan_pda_device);
 887failed_pda_register:
 888        return retval;
 889}
 890
 891
 892static void __exit keyspan_pda_exit(void)
 893{
 894        usb_deregister(&keyspan_pda_driver);
 895        usb_serial_deregister(&keyspan_pda_device);
 896#ifdef KEYSPAN
 897        usb_serial_deregister(&keyspan_pda_fake_device);
 898#endif
 899#ifdef XIRCOM
 900        usb_serial_deregister(&xircom_pgs_fake_device);
 901#endif
 902}
 903
 904
 905module_init(keyspan_pda_init);
 906module_exit(keyspan_pda_exit);
 907
 908MODULE_AUTHOR(DRIVER_AUTHOR);
 909MODULE_DESCRIPTION(DRIVER_DESC);
 910MODULE_LICENSE("GPL");
 911
 912module_param(debug, bool, S_IRUGO | S_IWUSR);
 913MODULE_PARM_DESC(debug, "Debug enabled or not");
 914
 915
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.