linux/drivers/usb/serial/keyspan.c
<<
>>
Prefs
   1/*
   2  Keyspan USB to Serial Converter driver
   3 
   4  (C) Copyright (C) 2000-2001   Hugh Blemings <hugh@blemings.org>
   5  (C) Copyright (C) 2002        Greg Kroah-Hartman <greg@kroah.com>
   6   
   7  This program is free software; you can redistribute it and/or modify
   8  it under the terms of the GNU General Public License as published by
   9  the Free Software Foundation; either version 2 of the License, or
  10  (at your option) any later version.
  11
  12  See http://misc.nu/hugh/keyspan.html for more information.
  13  
  14  Code in this driver inspired by and in a number of places taken
  15  from Brian Warner's original Keyspan-PDA driver.
  16
  17  This driver has been put together with the support of Innosys, Inc.
  18  and Keyspan, Inc the manufacturers of the Keyspan USB-serial products.
  19  Thanks Guys :)
  20  
  21  Thanks to Paulus for miscellaneous tidy ups, some largish chunks
  22  of much nicer and/or completely new code and (perhaps most uniquely)
  23  having the patience to sit down and explain why and where he'd changed
  24  stuff. 
  25  
  26  Tip 'o the hat to IBM (and previously Linuxcare :) for supporting 
  27  staff in their work on open source projects.
  28
  29  Change History
  30
  31    2003sep04   LPM (Keyspan) add support for new single port product USA19HS.
  32                                Improve setup message handling for all devices.
  33
  34    Wed Feb 19 22:00:00 PST 2003 (Jeffrey S. Laing <keyspan@jsl.com>)
  35      Merged the current (1/31/03) Keyspan code with the current (2.4.21-pre4)
  36      Linux source tree.  The Linux tree lacked support for the 49WLC and
  37      others.  The Keyspan patches didn't work with the current kernel.
  38
  39    2003jan30   LPM     add support for the 49WLC and MPR
  40
  41    Wed Apr 25 12:00:00 PST 2002 (Keyspan)
  42      Started with Hugh Blemings' code dated Jan 17, 2002.  All adapters
  43      now supported (including QI and QW).  Modified port open, port
  44      close, and send setup() logic to fix various data and endpoint
  45      synchronization bugs and device LED status bugs.  Changed keyspan_
  46      write_room() to accurately return transmit buffer availability.
  47      Changed forwardingLength from 1 to 16 for all adapters.
  48
  49    Fri Oct 12 16:45:00 EST 2001
  50      Preliminary USA-19QI and USA-28 support (both test OK for me, YMMV)
  51
  52    Wed Apr 25 12:00:00 PST 2002 (Keyspan)
  53      Started with Hugh Blemings' code dated Jan 17, 2002.  All adapters
  54      now supported (including QI and QW).  Modified port open, port
  55      close, and send setup() logic to fix various data and endpoint
  56      synchronization bugs and device LED status bugs.  Changed keyspan_
  57      write_room() to accurately return transmit buffer availability.
  58      Changed forwardingLength from 1 to 16 for all adapters.
  59
  60    Fri Oct 12 16:45:00 EST 2001
  61      Preliminary USA-19QI and USA-28 support (both test OK for me, YMMV)
  62
  63    Mon Oct  8 14:29:00 EST 2001 hugh
  64      Fixed bug that prevented mulitport devices operating correctly
  65      if they weren't the first unit attached.
  66
  67    Sat Oct  6 12:31:21 EST 2001 hugh
  68      Added support for USA-28XA and -28XB, misc cleanups, break support
  69      for usa26 based models thanks to David Gibson.
  70
  71    Thu May 31 11:56:42 PDT 2001 gkh
  72      switched from using spinlock to a semaphore
  73   
  74    (04/08/2001) gb
  75        Identify version on module load.
  76   
  77    (11/01/2000) Adam J. Richter
  78        usb_device_id table support.
  79   
  80    Tue Oct 10 23:15:33 EST 2000 Hugh
  81      Merged Paul's changes with my USA-49W mods.  Work in progress
  82      still...
  83  
  84    Wed Jul 19 14:00:42 EST 2000 gkh
  85      Added module_init and module_exit functions to handle the fact that
  86      this driver is a loadable module now.
  87 
  88    Tue Jul 18 16:14:52 EST 2000 Hugh
  89      Basic character input/output for USA-19 now mostly works,
  90      fixed at 9600 baud for the moment.
  91
  92    Sat Jul  8 11:11:48 EST 2000 Hugh
  93      First public release - nothing works except the firmware upload.
  94      Tested on PPC and x86 architectures, seems to behave...
  95*/
  96
  97
  98#include <linux/kernel.h>
  99#include <linux/jiffies.h>
 100#include <linux/errno.h>
 101#include <linux/init.h>
 102#include <linux/slab.h>
 103#include <linux/tty.h>
 104#include <linux/tty_driver.h>
 105#include <linux/tty_flip.h>
 106#include <linux/module.h>
 107#include <linux/spinlock.h>
 108#include <asm/uaccess.h>
 109#include <linux/usb.h>
 110#include <linux/usb/serial.h>
 111#include "keyspan.h"
 112
 113static int debug;
 114
 115/*
 116 * Version Information
 117 */
 118#define DRIVER_VERSION "v1.1.5"
 119#define DRIVER_AUTHOR "Hugh Blemings <hugh@misc.nu"
 120#define DRIVER_DESC "Keyspan USB to Serial Converter Driver"
 121
 122#define INSTAT_BUFLEN   32
 123#define GLOCONT_BUFLEN  64
 124#define INDAT49W_BUFLEN 512
 125
 126        /* Per device and per port private data */
 127struct keyspan_serial_private {
 128        const struct keyspan_device_details     *device_details;
 129
 130        struct urb      *instat_urb;
 131        char            instat_buf[INSTAT_BUFLEN];
 132
 133        /* added to support 49wg, where data from all 4 ports comes in on 1 EP */
 134        /* and high-speed supported */
 135        struct urb      *indat_urb;
 136        char            indat_buf[INDAT49W_BUFLEN];
 137
 138        /* XXX this one probably will need a lock */
 139        struct urb      *glocont_urb;
 140        char            glocont_buf[GLOCONT_BUFLEN];
 141        char            ctrl_buf[8];                    // for EP0 control message
 142};
 143
 144struct keyspan_port_private {
 145        /* Keep track of which input & output endpoints to use */
 146        int             in_flip;
 147        int             out_flip;
 148
 149        /* Keep duplicate of device details in each port
 150           structure as well - simplifies some of the
 151           callback functions etc. */
 152        const struct keyspan_device_details     *device_details;
 153
 154        /* Input endpoints and buffer for this port */
 155        struct urb      *in_urbs[2];
 156        char            in_buffer[2][64];
 157        /* Output endpoints and buffer for this port */
 158        struct urb      *out_urbs[2];
 159        char            out_buffer[2][64];
 160
 161        /* Input ack endpoint */
 162        struct urb      *inack_urb;
 163        char            inack_buffer[1];
 164
 165        /* Output control endpoint */
 166        struct urb      *outcont_urb;
 167        char            outcont_buffer[64];
 168
 169        /* Settings for the port */
 170        int             baud;
 171        int             old_baud;
 172        unsigned int    cflag;
 173        unsigned int    old_cflag;
 174        enum            {flow_none, flow_cts, flow_xon} flow_control;
 175        int             rts_state;      /* Handshaking pins (outputs) */
 176        int             dtr_state;
 177        int             cts_state;      /* Handshaking pins (inputs) */
 178        int             dsr_state;
 179        int             dcd_state;
 180        int             ri_state;
 181        int             break_on;
 182
 183        unsigned long   tx_start_time[2];
 184        int             resend_cont;    /* need to resend control packet */
 185};
 186
 187        
 188/* Include Keyspan message headers.  All current Keyspan Adapters
 189   make use of one of five message formats which are referred
 190   to as USA-26, USA-28, USA-49, USA-90, USA-67 by Keyspan and within this driver. */
 191#include "keyspan_usa26msg.h"
 192#include "keyspan_usa28msg.h"
 193#include "keyspan_usa49msg.h"
 194#include "keyspan_usa90msg.h"
 195#include "keyspan_usa67msg.h"
 196        
 197
 198/* Functions used by new usb-serial code. */
 199static int __init keyspan_init (void)
 200{
 201        int retval;
 202        retval = usb_serial_register(&keyspan_pre_device);
 203        if (retval)
 204                goto failed_pre_device_register;
 205        retval = usb_serial_register(&keyspan_1port_device);
 206        if (retval)
 207                goto failed_1port_device_register;
 208        retval = usb_serial_register(&keyspan_2port_device);
 209        if (retval)
 210                goto failed_2port_device_register;
 211        retval = usb_serial_register(&keyspan_4port_device);
 212        if (retval)
 213                goto failed_4port_device_register;
 214        retval = usb_register(&keyspan_driver);
 215        if (retval) 
 216                goto failed_usb_register;
 217
 218        info(DRIVER_VERSION ":" DRIVER_DESC);
 219
 220        return 0;
 221failed_usb_register:
 222        usb_serial_deregister(&keyspan_4port_device);
 223failed_4port_device_register:
 224        usb_serial_deregister(&keyspan_2port_device);
 225failed_2port_device_register:
 226        usb_serial_deregister(&keyspan_1port_device);
 227failed_1port_device_register:
 228        usb_serial_deregister(&keyspan_pre_device);
 229failed_pre_device_register:
 230        return retval;
 231}
 232
 233static void __exit keyspan_exit (void)
 234{
 235        usb_deregister (&keyspan_driver);
 236        usb_serial_deregister (&keyspan_pre_device);
 237        usb_serial_deregister (&keyspan_1port_device);
 238        usb_serial_deregister (&keyspan_2port_device);
 239        usb_serial_deregister (&keyspan_4port_device);
 240}
 241
 242module_init(keyspan_init);
 243module_exit(keyspan_exit);
 244
 245static void keyspan_rx_throttle (struct usb_serial_port *port)
 246{
 247        dbg("%s - port %d", __FUNCTION__, port->number);
 248}
 249
 250
 251static void keyspan_rx_unthrottle (struct usb_serial_port *port)
 252{
 253        dbg("%s - port %d", __FUNCTION__, port->number);
 254}
 255
 256
 257static void keyspan_break_ctl (struct usb_serial_port *port, int break_state)
 258{
 259        struct keyspan_port_private     *p_priv;
 260
 261        dbg("%s", __FUNCTION__);
 262
 263        p_priv = usb_get_serial_port_data(port);
 264
 265        if (break_state == -1)
 266                p_priv->break_on = 1;
 267        else
 268                p_priv->break_on = 0;
 269
 270        keyspan_send_setup(port, 0);
 271}
 272
 273
 274static void keyspan_set_termios (struct usb_serial_port *port, 
 275                                     struct ktermios *old_termios)
 276{
 277        int                             baud_rate, device_port;
 278        struct keyspan_port_private     *p_priv;
 279        const struct keyspan_device_details     *d_details;
 280        unsigned int                    cflag;
 281        struct tty_struct               *tty = port->tty;
 282
 283        dbg("%s", __FUNCTION__); 
 284
 285        p_priv = usb_get_serial_port_data(port);
 286        d_details = p_priv->device_details;
 287        cflag = tty->termios->c_cflag;
 288        device_port = port->number - port->serial->minor;
 289
 290        /* Baud rate calculation takes baud rate as an integer
 291           so other rates can be generated if desired. */
 292        baud_rate = tty_get_baud_rate(tty);
 293        /* If no match or invalid, don't change */              
 294        if (d_details->calculate_baud_rate(baud_rate, d_details->baudclk,
 295                                NULL, NULL, NULL, device_port) == KEYSPAN_BAUD_RATE_OK) {
 296                /* FIXME - more to do here to ensure rate changes cleanly */
 297                /* FIXME - calcuate exact rate from divisor ? */
 298                p_priv->baud = baud_rate;
 299        } else
 300                baud_rate = tty_termios_baud_rate(old_termios);
 301
 302        tty_encode_baud_rate(tty, baud_rate, baud_rate);
 303        /* set CTS/RTS handshake etc. */
 304        p_priv->cflag = cflag;
 305        p_priv->flow_control = (cflag & CRTSCTS)? flow_cts: flow_none;
 306
 307        /* Mark/Space not supported */
 308        tty->termios->c_cflag &= ~CMSPAR;
 309
 310        keyspan_send_setup(port, 0);
 311}
 312
 313static int keyspan_tiocmget(struct usb_serial_port *port, struct file *file)
 314{
 315        unsigned int                    value;
 316        struct keyspan_port_private     *p_priv;
 317
 318        p_priv = usb_get_serial_port_data(port);
 319        
 320        value = ((p_priv->rts_state) ? TIOCM_RTS : 0) |
 321                ((p_priv->dtr_state) ? TIOCM_DTR : 0) |
 322                ((p_priv->cts_state) ? TIOCM_CTS : 0) |
 323                ((p_priv->dsr_state) ? TIOCM_DSR : 0) |
 324                ((p_priv->dcd_state) ? TIOCM_CAR : 0) |
 325                ((p_priv->ri_state) ? TIOCM_RNG : 0); 
 326
 327        return value;
 328}
 329
 330static int keyspan_tiocmset(struct usb_serial_port *port, struct file *file,
 331                            unsigned int set, unsigned int clear)
 332{
 333        struct keyspan_port_private     *p_priv;
 334
 335        p_priv = usb_get_serial_port_data(port);
 336        
 337        if (set & TIOCM_RTS)
 338                p_priv->rts_state = 1;
 339        if (set & TIOCM_DTR)
 340                p_priv->dtr_state = 1;
 341
 342        if (clear & TIOCM_RTS)
 343                p_priv->rts_state = 0;
 344        if (clear & TIOCM_DTR)
 345                p_priv->dtr_state = 0;
 346        keyspan_send_setup(port, 0);
 347        return 0;
 348}
 349
 350static int keyspan_ioctl(struct usb_serial_port *port, struct file *file,
 351                             unsigned int cmd, unsigned long arg)
 352{
 353        return -ENOIOCTLCMD;
 354}
 355
 356        /* Write function is similar for the four protocols used
 357           with only a minor change for usa90 (usa19hs) required */
 358static int keyspan_write(struct usb_serial_port *port, 
 359                         const unsigned char *buf, int count)
 360{
 361        struct keyspan_port_private     *p_priv;
 362        const struct keyspan_device_details     *d_details;
 363        int                             flip;
 364        int                             left, todo;
 365        struct urb                      *this_urb;
 366        int                             err, maxDataLen, dataOffset;
 367
 368        p_priv = usb_get_serial_port_data(port);
 369        d_details = p_priv->device_details;
 370
 371        if (d_details->msg_format == msg_usa90) {
 372                maxDataLen = 64;
 373                dataOffset = 0;
 374        } else {
 375                maxDataLen = 63;
 376                dataOffset = 1;
 377        }
 378        
 379        dbg("%s - for port %d (%d chars), flip=%d",
 380            __FUNCTION__, port->number, count, p_priv->out_flip);
 381
 382        for (left = count; left > 0; left -= todo) {
 383                todo = left;
 384                if (todo > maxDataLen)
 385                        todo = maxDataLen;
 386
 387                flip = p_priv->out_flip;
 388        
 389                /* Check we have a valid urb/endpoint before we use it... */
 390                if ((this_urb = p_priv->out_urbs[flip]) == NULL) {
 391                        /* no bulk out, so return 0 bytes written */
 392                        dbg("%s - no output urb :(", __FUNCTION__);
 393                        return count;
 394                }
 395
 396                dbg("%s - endpoint %d flip %d", __FUNCTION__, usb_pipeendpoint(this_urb->pipe), flip);
 397
 398                if (this_urb->status == -EINPROGRESS) {
 399                        if (time_before(jiffies, p_priv->tx_start_time[flip] + 10 * HZ))
 400                                break;
 401                        usb_unlink_urb(this_urb);
 402                        break;
 403                }
 404
 405                /* First byte in buffer is "last flag" (except for usa19hx) - unused so
 406                   for now so set to zero */
 407                ((char *)this_urb->transfer_buffer)[0] = 0;
 408
 409                memcpy (this_urb->transfer_buffer + dataOffset, buf, todo);
 410                buf += todo;
 411
 412                /* send the data out the bulk port */
 413                this_urb->transfer_buffer_length = todo + dataOffset;
 414
 415                this_urb->dev = port->serial->dev;
 416                if ((err = usb_submit_urb(this_urb, GFP_ATOMIC)) != 0) {
 417                        dbg("usb_submit_urb(write bulk) failed (%d)", err);
 418                }
 419                p_priv->tx_start_time[flip] = jiffies;
 420
 421                /* Flip for next time if usa26 or usa28 interface
 422                   (not used on usa49) */
 423                p_priv->out_flip = (flip + 1) & d_details->outdat_endp_flip;
 424        }
 425
 426        return count - left;
 427}
 428
 429static void     usa26_indat_callback(struct urb *urb)
 430{
 431        int                     i, err;
 432        int                     endpoint;
 433        struct usb_serial_port  *port;
 434        struct tty_struct       *tty;
 435        unsigned char           *data = urb->transfer_buffer;
 436        int status = urb->status;
 437
 438        dbg ("%s", __FUNCTION__); 
 439
 440        endpoint = usb_pipeendpoint(urb->pipe);
 441
 442        if (status) {
 443                dbg("%s - nonzero status: %x on endpoint %d.",
 444                    __FUNCTION__, status, endpoint);
 445                return;
 446        }
 447
 448        port = (struct usb_serial_port *) urb->context;
 449        tty = port->tty;
 450        if (tty && urb->actual_length) {
 451                /* 0x80 bit is error flag */
 452                if ((data[0] & 0x80) == 0) {
 453                        /* no errors on individual bytes, only possible overrun err*/
 454                        if (data[0] & RXERROR_OVERRUN)
 455                                        err = TTY_OVERRUN;
 456                        else err = 0;
 457                        for (i = 1; i < urb->actual_length ; ++i) {
 458                                tty_insert_flip_char(tty, data[i], err);
 459                        }
 460                } else {
 461                        /* some bytes had errors, every byte has status */
 462                        dbg("%s - RX error!!!!", __FUNCTION__);
 463                        for (i = 0; i + 1 < urb->actual_length; i += 2) {
 464                                int stat = data[i], flag = 0;
 465                                if (stat & RXERROR_OVERRUN)
 466                                        flag |= TTY_OVERRUN;
 467                                if (stat & RXERROR_FRAMING)
 468                                        flag |= TTY_FRAME;
 469                                if (stat & RXERROR_PARITY)
 470                                        flag |= TTY_PARITY;
 471                                /* XXX should handle break (0x10) */
 472                                tty_insert_flip_char(tty, data[i+1], flag);
 473                        }
 474                }
 475                tty_flip_buffer_push(tty);
 476        }
 477                                
 478                /* Resubmit urb so we continue receiving */
 479        urb->dev = port->serial->dev;
 480        if (port->open_count)
 481                if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
 482                        dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);
 483                }
 484        return;
 485}
 486
 487        /* Outdat handling is common for all devices */
 488static void     usa2x_outdat_callback(struct urb *urb)
 489{
 490        struct usb_serial_port *port;
 491        struct keyspan_port_private *p_priv;
 492
 493        port = (struct usb_serial_port *) urb->context;
 494        p_priv = usb_get_serial_port_data(port);
 495        dbg ("%s - urb %d", __FUNCTION__, urb == p_priv->out_urbs[1]); 
 496
 497        if (port->open_count)
 498                usb_serial_port_softint(port);
 499}
 500
 501static void     usa26_inack_callback(struct urb *urb)
 502{
 503        dbg ("%s", __FUNCTION__); 
 504        
 505}
 506
 507static void     usa26_outcont_callback(struct urb *urb)
 508{
 509        struct usb_serial_port *port;
 510        struct keyspan_port_private *p_priv;
 511
 512        port = (struct usb_serial_port *) urb->context;
 513        p_priv = usb_get_serial_port_data(port);
 514
 515        if (p_priv->resend_cont) {
 516                dbg ("%s - sending setup", __FUNCTION__); 
 517                keyspan_usa26_send_setup(port->serial, port, p_priv->resend_cont - 1);
 518        }
 519}
 520
 521static void     usa26_instat_callback(struct urb *urb)
 522{
 523        unsigned char                           *data = urb->transfer_buffer;
 524        struct keyspan_usa26_portStatusMessage  *msg;
 525        struct usb_serial                       *serial;
 526        struct usb_serial_port                  *port;
 527        struct keyspan_port_private             *p_priv;
 528        int old_dcd_state, err;
 529        int status = urb->status;
 530
 531        serial = (struct usb_serial *) urb->context;
 532
 533        if (status) {
 534                dbg("%s - nonzero status: %x", __FUNCTION__, status);
 535                return;
 536        }
 537        if (urb->actual_length != 9) {
 538                dbg("%s - %d byte report??", __FUNCTION__, urb->actual_length);
 539                goto exit;
 540        }
 541
 542        msg = (struct keyspan_usa26_portStatusMessage *)data;
 543
 544#if 0
 545        dbg("%s - port status: port %d cts %d dcd %d dsr %d ri %d toff %d txoff %d rxen %d cr %d",
 546            __FUNCTION__, msg->port, msg->hskia_cts, msg->gpia_dcd, msg->dsr, msg->ri, msg->_txOff,
 547            msg->_txXoff, msg->rxEnabled, msg->controlResponse);
 548#endif
 549
 550        /* Now do something useful with the data */
 551
 552
 553        /* Check port number from message and retrieve private data */  
 554        if (msg->port >= serial->num_ports) {
 555                dbg ("%s - Unexpected port number %d", __FUNCTION__, msg->port);
 556                goto exit;
 557        }
 558        port = serial->port[msg->port];
 559        p_priv = usb_get_serial_port_data(port);
 560        
 561        /* Update handshaking pin state information */
 562        old_dcd_state = p_priv->dcd_state;
 563        p_priv->cts_state = ((msg->hskia_cts) ? 1 : 0);
 564        p_priv->dsr_state = ((msg->dsr) ? 1 : 0);
 565        p_priv->dcd_state = ((msg->gpia_dcd) ? 1 : 0);
 566        p_priv->ri_state = ((msg->ri) ? 1 : 0);
 567
 568        if (port->tty && !C_CLOCAL(port->tty)
 569            && old_dcd_state != p_priv->dcd_state) {
 570                if (old_dcd_state)
 571                        tty_hangup(port->tty);
 572                /*  else */
 573                /*      wake_up_interruptible(&p_priv->open_wait); */
 574        }
 575        
 576        /* Resubmit urb so we continue receiving */
 577        urb->dev = serial->dev;
 578        if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
 579                dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);
 580        }
 581exit: ;
 582}
 583
 584static void     usa26_glocont_callback(struct urb *urb)
 585{
 586        dbg ("%s", __FUNCTION__);
 587        
 588}
 589
 590
 591static void usa28_indat_callback(struct urb *urb)
 592{
 593        int                     i, err;
 594        struct usb_serial_port  *port;
 595        struct tty_struct       *tty;
 596        unsigned char           *data;
 597        struct keyspan_port_private             *p_priv;
 598        int status = urb->status;
 599
 600        dbg ("%s", __FUNCTION__);
 601
 602        port = (struct usb_serial_port *) urb->context;
 603        p_priv = usb_get_serial_port_data(port);
 604        data = urb->transfer_buffer;
 605
 606        if (urb != p_priv->in_urbs[p_priv->in_flip])
 607                return;
 608
 609        do {
 610                if (status) {
 611                        dbg("%s - nonzero status: %x on endpoint %d.",
 612                            __FUNCTION__, status, usb_pipeendpoint(urb->pipe));
 613                        return;
 614                }
 615
 616                port = (struct usb_serial_port *) urb->context;
 617                p_priv = usb_get_serial_port_data(port);
 618                data = urb->transfer_buffer;
 619
 620                tty = port->tty;
 621                if (urb->actual_length) {
 622                        for (i = 0; i < urb->actual_length ; ++i) {
 623                                tty_insert_flip_char(tty, data[i], 0);
 624                        }
 625                        tty_flip_buffer_push(tty);
 626                }
 627
 628                /* Resubmit urb so we continue receiving */
 629                urb->dev = port->serial->dev;
 630                if (port->open_count)
 631                        if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
 632                                dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);
 633                        }
 634                p_priv->in_flip ^= 1;
 635
 636                urb = p_priv->in_urbs[p_priv->in_flip];
 637        } while (urb->status != -EINPROGRESS);
 638}
 639
 640static void     usa28_inack_callback(struct urb *urb)
 641{
 642        dbg ("%s", __FUNCTION__);
 643}
 644
 645static void     usa28_outcont_callback(struct urb *urb)
 646{
 647        struct usb_serial_port *port;
 648        struct keyspan_port_private *p_priv;
 649
 650        port = (struct usb_serial_port *) urb->context;
 651        p_priv = usb_get_serial_port_data(port);
 652
 653        if (p_priv->resend_cont) {
 654                dbg ("%s - sending setup", __FUNCTION__);
 655                keyspan_usa28_send_setup(port->serial, port, p_priv->resend_cont - 1);
 656        }
 657}
 658
 659static void     usa28_instat_callback(struct urb *urb)
 660{
 661        int                                     err;
 662        unsigned char                           *data = urb->transfer_buffer;
 663        struct keyspan_usa28_portStatusMessage  *msg;
 664        struct usb_serial                       *serial;
 665        struct usb_serial_port                  *port;
 666        struct keyspan_port_private             *p_priv;
 667        int old_dcd_state;
 668        int status = urb->status;
 669
 670        serial = (struct usb_serial *) urb->context;
 671
 672        if (status) {
 673                dbg("%s - nonzero status: %x", __FUNCTION__, status);
 674                return;
 675        }
 676
 677        if (urb->actual_length != sizeof(struct keyspan_usa28_portStatusMessage)) {
 678                dbg("%s - bad length %d", __FUNCTION__, urb->actual_length);
 679                goto exit;
 680        }
 681
 682        /*dbg("%s %x %x %x %x %x %x %x %x %x %x %x %x", __FUNCTION__
 683            data[0], data[1], data[2], data[3], data[4], data[5],
 684            data[6], data[7], data[8], data[9], data[10], data[11]);*/
 685        
 686                /* Now do something useful with the data */
 687        msg = (struct keyspan_usa28_portStatusMessage *)data;
 688
 689
 690                /* Check port number from message and retrieve private data */  
 691        if (msg->port >= serial->num_ports) {
 692                dbg ("%s - Unexpected port number %d", __FUNCTION__, msg->port);
 693                goto exit;
 694        }
 695        port = serial->port[msg->port];
 696        p_priv = usb_get_serial_port_data(port);
 697        
 698        /* Update handshaking pin state information */
 699        old_dcd_state = p_priv->dcd_state;
 700        p_priv->cts_state = ((msg->cts) ? 1 : 0);
 701        p_priv->dsr_state = ((msg->dsr) ? 1 : 0);
 702        p_priv->dcd_state = ((msg->dcd) ? 1 : 0);
 703        p_priv->ri_state = ((msg->ri) ? 1 : 0);
 704
 705        if (port->tty && !C_CLOCAL(port->tty)
 706            && old_dcd_state != p_priv->dcd_state) {
 707                if (old_dcd_state)
 708                        tty_hangup(port->tty);
 709                /*  else */
 710                /*      wake_up_interruptible(&p_priv->open_wait); */
 711        }
 712
 713                /* Resubmit urb so we continue receiving */
 714        urb->dev = serial->dev;
 715        if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
 716                dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);
 717        }
 718exit: ;
 719}
 720
 721static void     usa28_glocont_callback(struct urb *urb)
 722{
 723        dbg ("%s", __FUNCTION__);
 724}
 725
 726
 727static void     usa49_glocont_callback(struct urb *urb)
 728{
 729        struct usb_serial *serial;
 730        struct usb_serial_port *port;
 731        struct keyspan_port_private *p_priv;
 732        int i;
 733
 734        dbg ("%s", __FUNCTION__);
 735
 736        serial = (struct usb_serial *) urb->context;
 737        for (i = 0; i < serial->num_ports; ++i) {
 738                port = serial->port[i];
 739                p_priv = usb_get_serial_port_data(port);
 740
 741                if (p_priv->resend_cont) {
 742                        dbg ("%s - sending setup", __FUNCTION__); 
 743                        keyspan_usa49_send_setup(serial, port, p_priv->resend_cont - 1);
 744                        break;
 745                }
 746        }
 747}
 748
 749        /* This is actually called glostat in the Keyspan
 750           doco */
 751static void     usa49_instat_callback(struct urb *urb)
 752{
 753        int                                     err;
 754        unsigned char                           *data = urb->transfer_buffer;
 755        struct keyspan_usa49_portStatusMessage  *msg;
 756        struct usb_serial                       *serial;
 757        struct usb_serial_port                  *port;
 758        struct keyspan_port_private             *p_priv;
 759        int old_dcd_state;
 760        int status = urb->status;
 761
 762        dbg ("%s", __FUNCTION__);
 763
 764        serial = (struct usb_serial *) urb->context;
 765
 766        if (status) {
 767                dbg("%s - nonzero status: %x", __FUNCTION__, status);
 768                return;
 769        }
 770
 771        if (urb->actual_length != sizeof(struct keyspan_usa49_portStatusMessage)) {
 772                dbg("%s - bad length %d", __FUNCTION__, urb->actual_length);
 773                goto exit;
 774        }
 775
 776        /*dbg(" %x %x %x %x %x %x %x %x %x %x %x", __FUNCTION__, 
 777            data[0], data[1], data[2], data[3], data[4], data[5],
 778            data[6], data[7], data[8], data[9], data[10]);*/
 779        
 780                /* Now do something useful with the data */
 781        msg = (struct keyspan_usa49_portStatusMessage *)data;
 782
 783                /* Check port number from message and retrieve private data */  
 784        if (msg->portNumber >= serial->num_ports) {
 785                dbg ("%s - Unexpected port number %d", __FUNCTION__, msg->portNumber);
 786                goto exit;
 787        }
 788        port = serial->port[msg->portNumber];
 789        p_priv = usb_get_serial_port_data(port);
 790        
 791        /* Update handshaking pin state information */
 792        old_dcd_state = p_priv->dcd_state;
 793        p_priv->cts_state = ((msg->cts) ? 1 : 0);
 794        p_priv->dsr_state = ((msg->dsr) ? 1 : 0);
 795        p_priv->dcd_state = ((msg->dcd) ? 1 : 0);
 796        p_priv->ri_state = ((msg->ri) ? 1 : 0);
 797
 798        if (port->tty && !C_CLOCAL(port->tty)
 799            && old_dcd_state != p_priv->dcd_state) {
 800                if (old_dcd_state)
 801                        tty_hangup(port->tty);
 802                /*  else */
 803                /*      wake_up_interruptible(&p_priv->open_wait); */
 804        }
 805
 806                /* Resubmit urb so we continue receiving */
 807        urb->dev = serial->dev;
 808
 809        if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
 810                dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);
 811        }
 812exit:   ;
 813}
 814
 815static void     usa49_inack_callback(struct urb *urb)
 816{
 817        dbg ("%s", __FUNCTION__);
 818}
 819
 820static void     usa49_indat_callback(struct urb *urb)
 821{
 822        int                     i, err;
 823        int                     endpoint;
 824        struct usb_serial_port  *port;
 825        struct tty_struct       *tty;
 826        unsigned char           *data = urb->transfer_buffer;
 827        int status = urb->status;
 828
 829        dbg ("%s", __FUNCTION__);
 830
 831        endpoint = usb_pipeendpoint(urb->pipe);
 832
 833        if (status) {
 834                dbg("%s - nonzero status: %x on endpoint %d.", __FUNCTION__,
 835                    status, endpoint);
 836                return;
 837        }
 838
 839        port = (struct usb_serial_port *) urb->context;
 840        tty = port->tty;
 841        if (urb->actual_length) {
 842                /* 0x80 bit is error flag */
 843                if ((data[0] & 0x80) == 0) {
 844                        /* no error on any byte */
 845                        for (i = 1; i < urb->actual_length ; ++i) {
 846                                tty_insert_flip_char(tty, data[i], 0);
 847                        }
 848                } else {
 849                        /* some bytes had errors, every byte has status */
 850                        for (i = 0; i + 1 < urb->actual_length; i += 2) {
 851                                int stat = data[i], flag = 0;
 852                                if (stat & RXERROR_OVERRUN)
 853                                        flag |= TTY_OVERRUN;
 854                                if (stat & RXERROR_FRAMING)
 855                                        flag |= TTY_FRAME;
 856                                if (stat & RXERROR_PARITY)
 857                                        flag |= TTY_PARITY;
 858                                /* XXX should handle break (0x10) */
 859                                tty_insert_flip_char(tty, data[i+1], flag);
 860                        }
 861                }
 862                tty_flip_buffer_push(tty);
 863        }
 864                                
 865                /* Resubmit urb so we continue receiving */
 866        urb->dev = port->serial->dev;
 867        if (port->open_count)
 868                if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
 869                        dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);
 870                }
 871}
 872
 873static void usa49wg_indat_callback(struct urb *urb)
 874{
 875        int                     i, len, x, err;
 876        struct usb_serial       *serial;
 877        struct usb_serial_port  *port;
 878        struct tty_struct       *tty;
 879        unsigned char           *data = urb->transfer_buffer;
 880        int status = urb->status;
 881
 882        dbg ("%s", __FUNCTION__);
 883
 884        serial = urb->context;
 885
 886        if (status) {
 887                dbg("%s - nonzero status: %x", __FUNCTION__, status);
 888                return;
 889        }
 890
 891        /* inbound data is in the form P#, len, status, data */
 892        i = 0;
 893        len = 0;
 894
 895        if (urb->actual_length) {
 896                while (i < urb->actual_length) {
 897
 898                        /* Check port number from message*/
 899                        if (data[i] >= serial->num_ports) {
 900                                dbg ("%s - Unexpected port number %d",
 901                                        __FUNCTION__, data[i]);
 902                                return;
 903                        }
 904                        port = serial->port[data[i++]];
 905                        tty = port->tty;
 906                        len = data[i++];
 907
 908                        /* 0x80 bit is error flag */
 909                        if ((data[i] & 0x80) == 0) {
 910                                /* no error on any byte */
 911                                i++;
 912                                for (x = 1; x < len ; ++x)
 913                                        if (port->open_count)
 914                                                tty_insert_flip_char(tty,
 915                                                                data[i++], 0);
 916                                        else
 917                                                i++;
 918                        } else {
 919                                /*
 920                                 * some bytes had errors, every byte has status
 921                                 */
 922                                for (x = 0; x + 1 < len; x += 2) {
 923                                        int stat = data[i], flag = 0;
 924                                        if (stat & RXERROR_OVERRUN)
 925                                                flag |= TTY_OVERRUN;
 926                                        if (stat & RXERROR_FRAMING)
 927                                                flag |= TTY_FRAME;
 928                                        if (stat & RXERROR_PARITY)
 929                                                flag |= TTY_PARITY;
 930                                        /* XXX should handle break (0x10) */
 931                                        if (port->open_count)
 932                                                tty_insert_flip_char(tty,
 933                                                        data[i+1], flag);
 934                                        i += 2;
 935                                }
 936                        }
 937                        if (port->open_count)
 938                                tty_flip_buffer_push(tty);
 939                }
 940        }
 941
 942        /* Resubmit urb so we continue receiving */
 943        urb->dev = serial->dev;
 944
 945        err = usb_submit_urb(urb, GFP_ATOMIC);
 946        if (err != 0)
 947                dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);
 948}
 949
 950/* not used, usa-49 doesn't have per-port control endpoints */
 951static void usa49_outcont_callback(struct urb *urb)
 952{
 953        dbg ("%s", __FUNCTION__);
 954}
 955
 956static void usa90_indat_callback(struct urb *urb)
 957{
 958        int                     i, err;
 959        int                     endpoint;
 960        struct usb_serial_port  *port;
 961        struct keyspan_port_private             *p_priv;
 962        struct tty_struct       *tty;
 963        unsigned char           *data = urb->transfer_buffer;
 964        int status = urb->status;
 965
 966        dbg ("%s", __FUNCTION__); 
 967
 968        endpoint = usb_pipeendpoint(urb->pipe);
 969
 970        if (status) {
 971                dbg("%s - nonzero status: %x on endpoint %d.",
 972                    __FUNCTION__, status, endpoint);
 973                return;
 974        }
 975
 976        port = (struct usb_serial_port *) urb->context;
 977        p_priv = usb_get_serial_port_data(port);
 978
 979        tty = port->tty;
 980        if (urb->actual_length) {
 981        
 982                /* if current mode is DMA, looks like usa28 format
 983                        otherwise looks like usa26 data format */
 984
 985                if (p_priv->baud > 57600) {
 986                        for (i = 0; i < urb->actual_length ; ++i) 
 987                                tty_insert_flip_char(tty, data[i], 0);
 988                }
 989                else {
 990                        
 991                        /* 0x80 bit is error flag */
 992                        if ((data[0] & 0x80) == 0) {
 993                                /* no errors on individual bytes, only possible overrun err*/
 994                                if (data[0] & RXERROR_OVERRUN)
 995                                                err = TTY_OVERRUN;
 996                                else err = 0;
 997                                for (i = 1; i < urb->actual_length ; ++i) 
 998                                        tty_insert_flip_char(tty, data[i], err);
 999                        
1000                        } 
1001                        else {
1002                        /* some bytes had errors, every byte has status */
1003                                dbg("%s - RX error!!!!", __FUNCTION__);
1004                                for (i = 0; i + 1 < urb->actual_length; i += 2) {
1005                                        int stat = data[i], flag = 0;
1006                                        if (stat & RXERROR_OVERRUN)
1007                                                flag |= TTY_OVERRUN;
1008                                        if (stat & RXERROR_FRAMING)
1009                                                flag |= TTY_FRAME;
1010                                        if (stat & RXERROR_PARITY)
1011                                                flag |= TTY_PARITY;
1012                                        /* XXX should handle break (0x10) */
1013                                        tty_insert_flip_char(tty, data[i+1], flag);
1014                                }
1015                        }
1016                }
1017                tty_flip_buffer_push(tty);
1018        }
1019                                
1020        /* Resubmit urb so we continue receiving */
1021        urb->dev = port->serial->dev;
1022        if (port->open_count)
1023                if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
1024                        dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);
1025                }
1026        return;
1027}
1028
1029
1030static void     usa90_instat_callback(struct urb *urb)
1031{
1032        unsigned char                           *data = urb->transfer_buffer;
1033        struct keyspan_usa90_portStatusMessage  *msg;
1034        struct usb_serial                       *serial;
1035        struct usb_serial_port                  *port;
1036        struct keyspan_port_private             *p_priv;
1037        int old_dcd_state, err;
1038        int status = urb->status;
1039
1040        serial = (struct usb_serial *) urb->context;
1041
1042        if (status) {
1043                dbg("%s - nonzero status: %x", __FUNCTION__, status);
1044                return;
1045        }
1046        if (urb->actual_length < 14) {
1047                dbg("%s - %d byte report??", __FUNCTION__, urb->actual_length);
1048                goto exit;
1049        }
1050
1051        msg = (struct keyspan_usa90_portStatusMessage *)data;
1052
1053        /* Now do something useful with the data */
1054
1055        port = serial->port[0];
1056        p_priv = usb_get_serial_port_data(port);
1057        
1058        /* Update handshaking pin state information */
1059        old_dcd_state = p_priv->dcd_state;
1060        p_priv->cts_state = ((msg->cts) ? 1 : 0);
1061        p_priv->dsr_state = ((msg->dsr) ? 1 : 0);
1062        p_priv->dcd_state = ((msg->dcd) ? 1 : 0);
1063        p_priv->ri_state = ((msg->ri) ? 1 : 0);
1064
1065        if (port->tty && !C_CLOCAL(port->tty)
1066            && old_dcd_state != p_priv->dcd_state) {
1067                if (old_dcd_state)
1068                        tty_hangup(port->tty);
1069                /*  else */
1070                /*      wake_up_interruptible(&p_priv->open_wait); */
1071        }
1072        
1073        /* Resubmit urb so we continue receiving */
1074        urb->dev = serial->dev;
1075        if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
1076                dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);
1077        }
1078exit:
1079        ;
1080}
1081
1082static void     usa90_outcont_callback(struct urb *urb)
1083{
1084        struct usb_serial_port *port;
1085        struct keyspan_port_private *p_priv;
1086
1087        port = (struct usb_serial_port *) urb->context;
1088        p_priv = usb_get_serial_port_data(port);
1089
1090        if (p_priv->resend_cont) {
1091                dbg ("%s - sending setup", __FUNCTION__); 
1092                keyspan_usa90_send_setup(port->serial, port, p_priv->resend_cont - 1);
1093        }
1094}
1095
1096/* Status messages from the 28xg */
1097static void     usa67_instat_callback(struct urb *urb)
1098{
1099        int                                     err;
1100        unsigned char                           *data = urb->transfer_buffer;
1101        struct keyspan_usa67_portStatusMessage  *msg;
1102        struct usb_serial                       *serial;
1103        struct usb_serial_port                  *port;
1104        struct keyspan_port_private             *p_priv;
1105        int old_dcd_state;
1106        int status = urb->status;
1107
1108        dbg ("%s", __FUNCTION__);
1109
1110        serial = urb->context;
1111
1112        if (status) {
1113                dbg("%s - nonzero status: %x", __FUNCTION__, status);
1114                return;
1115        }
1116
1117        if (urb->actual_length != sizeof(struct keyspan_usa67_portStatusMessage)) {
1118                dbg("%s - bad length %d", __FUNCTION__, urb->actual_length);
1119                return;
1120        }
1121
1122
1123        /* Now do something useful with the data */
1124        msg = (struct keyspan_usa67_portStatusMessage *)data;
1125
1126        /* Check port number from message and retrieve private data */
1127        if (msg->port >= serial->num_ports) {
1128                dbg ("%s - Unexpected port number %d", __FUNCTION__, msg->port);
1129                return;
1130        }
1131
1132        port = serial->port[msg->port];
1133        p_priv = usb_get_serial_port_data(port);
1134
1135        /* Update handshaking pin state information */
1136        old_dcd_state = p_priv->dcd_state;
1137        p_priv->cts_state = ((msg->hskia_cts) ? 1 : 0);
1138        p_priv->dcd_state = ((msg->gpia_dcd) ? 1 : 0);
1139
1140        if (port->tty && !C_CLOCAL(port->tty)
1141            && old_dcd_state != p_priv->dcd_state) {
1142                if (old_dcd_state)
1143                        tty_hangup(port->tty);
1144                /*  else */
1145                /*      wake_up_interruptible(&p_priv->open_wait); */
1146        }
1147
1148        /* Resubmit urb so we continue receiving */
1149        urb->dev = serial->dev;
1150        err = usb_submit_urb(urb, GFP_ATOMIC);
1151        if (err != 0)
1152                dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);
1153}
1154
1155static void usa67_glocont_callback(struct urb *urb)
1156{
1157        struct usb_serial *serial;
1158        struct usb_serial_port *port;
1159        struct keyspan_port_private *p_priv;
1160        int i;
1161
1162        dbg ("%s", __FUNCTION__);
1163
1164        serial = urb->context;
1165        for (i = 0; i < serial->num_ports; ++i) {
1166                port = serial->port[i];
1167                p_priv = usb_get_serial_port_data(port);
1168
1169                if (p_priv->resend_cont) {
1170                        dbg ("%s - sending setup", __FUNCTION__);
1171                        keyspan_usa67_send_setup(serial, port,
1172                                                p_priv->resend_cont - 1);
1173                        break;
1174                }
1175        }
1176}
1177
1178static int keyspan_write_room (struct usb_serial_port *port)
1179{
1180        struct keyspan_port_private     *p_priv;
1181        const struct keyspan_device_details     *d_details;
1182        int                             flip;
1183        int                             data_len;
1184        struct urb                      *this_urb;
1185
1186        dbg("%s", __FUNCTION__);
1187        p_priv = usb_get_serial_port_data(port);
1188        d_details = p_priv->device_details;
1189
1190        if (d_details->msg_format == msg_usa90)
1191                data_len = 64;
1192        else
1193                data_len = 63;
1194
1195        flip = p_priv->out_flip;
1196
1197        /* Check both endpoints to see if any are available. */
1198        if ((this_urb = p_priv->out_urbs[flip]) != NULL) {
1199                if (this_urb->status != -EINPROGRESS)
1200                        return (data_len);
1201                flip = (flip + 1) & d_details->outdat_endp_flip;        
1202                if ((this_urb = p_priv->out_urbs[flip]) != NULL) 
1203                        if (this_urb->status != -EINPROGRESS)
1204                                return (data_len);
1205        }
1206        return (0);
1207}
1208
1209
1210static int keyspan_chars_in_buffer (struct usb_serial_port *port)
1211{
1212        return (0);
1213}
1214
1215
1216static int keyspan_open (struct usb_serial_port *port, struct file *filp)
1217{
1218        struct keyspan_port_private     *p_priv;
1219        struct keyspan_serial_private   *s_priv;
1220        struct usb_serial               *serial = port->serial;
1221        const struct keyspan_device_details     *d_details;
1222        int                             i, err;
1223        int                             baud_rate, device_port;
1224        struct urb                      *urb;
1225        unsigned int                    cflag;
1226
1227        s_priv = usb_get_serial_data(serial);
1228        p_priv = usb_get_serial_port_data(port);
1229        d_details = p_priv->device_details;
1230
1231        dbg("%s - port%d.", __FUNCTION__, port->number);
1232
1233        /* Set some sane defaults */
1234        p_priv->rts_state = 1;
1235        p_priv->dtr_state = 1;
1236        p_priv->baud = 9600;
1237
1238        /* force baud and lcr to be set on open */
1239        p_priv->old_baud = 0;
1240        p_priv->old_cflag = 0;
1241
1242        p_priv->out_flip = 0;
1243        p_priv->in_flip = 0;
1244
1245        /* Reset low level data toggle and start reading from endpoints */
1246        for (i = 0; i < 2; i++) {
1247                if ((urb = p_priv->in_urbs[i]) == NULL)
1248                        continue;
1249                urb->dev = serial->dev;
1250
1251                /* make sure endpoint data toggle is synchronized with the device */
1252
1253                usb_clear_halt(urb->dev, urb->pipe);
1254
1255                if ((err = usb_submit_urb(urb, GFP_KERNEL)) != 0) {
1256                        dbg("%s - submit urb %d failed (%d)", __FUNCTION__, i, err);
1257                }
1258        }
1259
1260        /* Reset low level data toggle on out endpoints */
1261        for (i = 0; i < 2; i++) {
1262                if ((urb = p_priv->out_urbs[i]) == NULL)
1263                        continue;
1264                urb->dev = serial->dev;
1265                /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), usb_pipeout(urb->pipe), 0); */
1266        }
1267
1268        /* get the terminal config for the setup message now so we don't
1269         * need to send 2 of them */
1270
1271        cflag = port->tty->termios->c_cflag;
1272        device_port = port->number - port->serial->minor;
1273
1274        /* Baud rate calculation takes baud rate as an integer
1275           so other rates can be generated if desired. */
1276        baud_rate = tty_get_baud_rate(port->tty);
1277        /* If no match or invalid, leave as default */
1278        if (baud_rate >= 0
1279            && d_details->calculate_baud_rate(baud_rate, d_details->baudclk,
1280                                NULL, NULL, NULL, device_port) == KEYSPAN_BAUD_RATE_OK) {
1281                p_priv->baud = baud_rate;
1282        }
1283
1284        /* set CTS/RTS handshake etc. */
1285        p_priv->cflag = cflag;
1286        p_priv->flow_control = (cflag & CRTSCTS)? flow_cts: flow_none;
1287
1288        keyspan_send_setup(port, 1);
1289        //mdelay(100);
1290        //keyspan_set_termios(port, NULL);
1291
1292        return (0);
1293}
1294
1295static inline void stop_urb(struct urb *urb)
1296{
1297        if (urb && urb->status == -EINPROGRESS)
1298                usb_kill_urb(urb);
1299}
1300
1301static void keyspan_close(struct usb_serial_port *port, struct file *filp)
1302{
1303        int                     i;
1304        struct usb_serial       *serial = port->serial;
1305        struct keyspan_serial_private   *s_priv;
1306        struct keyspan_port_private     *p_priv;
1307
1308        dbg("%s", __FUNCTION__);
1309        s_priv = usb_get_serial_data(serial);
1310        p_priv = usb_get_serial_port_data(port);
1311        
1312        p_priv->rts_state = 0;
1313        p_priv->dtr_state = 0;
1314        
1315        if (serial->dev) {
1316                keyspan_send_setup(port, 2);
1317                /* pilot-xfer seems to work best with this delay */
1318                mdelay(100);
1319                // keyspan_set_termios(port, NULL);
1320        }
1321
1322        /*while (p_priv->outcont_urb->status == -EINPROGRESS) {
1323                dbg("%s - urb in progress", __FUNCTION__);
1324        }*/
1325
1326        p_priv->out_flip = 0;
1327        p_priv->in_flip = 0;
1328
1329        if (serial->dev) {
1330                /* Stop reading/writing urbs */
1331                stop_urb(p_priv->inack_urb);
1332                /* stop_urb(p_priv->outcont_urb); */
1333                for (i = 0; i < 2; i++) {
1334                        stop_urb(p_priv->in_urbs[i]);
1335                        stop_urb(p_priv->out_urbs[i]);
1336                }
1337        }
1338        port->tty = NULL;
1339}
1340
1341
1342        /* download the firmware to a pre-renumeration device */
1343static int keyspan_fake_startup (struct usb_serial *serial)
1344{
1345        int                             response;
1346        const struct ezusb_hex_record   *record;
1347        char                            *fw_name;
1348
1349        dbg("Keyspan startup version %04x product %04x",
1350            le16_to_cpu(serial->dev->descriptor.bcdDevice),
1351            le16_to_cpu(serial->dev->descriptor.idProduct));
1352        
1353        if ((le16_to_cpu(serial->dev->descriptor.bcdDevice) & 0x8000) != 0x8000) {
1354                dbg("Firmware already loaded.  Quitting.");
1355                return(1);
1356        }
1357
1358                /* Select firmware image on the basis of idProduct */
1359        switch (le16_to_cpu(serial->dev->descriptor.idProduct)) {
1360        case keyspan_usa28_pre_product_id:
1361                record = &keyspan_usa28_firmware[0];
1362                fw_name = "USA28";
1363                break;
1364
1365        case keyspan_usa28x_pre_product_id:
1366                record = &keyspan_usa28x_firmware[0];
1367                fw_name = "USA28X";
1368                break;
1369
1370        case keyspan_usa28xa_pre_product_id:
1371                record = &keyspan_usa28xa_firmware[0];
1372                fw_name = "USA28XA";
1373                break;
1374
1375        case keyspan_usa28xb_pre_product_id:
1376                record = &keyspan_usa28xb_firmware[0];
1377                fw_name = "USA28XB";
1378                break;
1379
1380        case keyspan_usa19_pre_product_id:
1381                record = &keyspan_usa19_firmware[0];
1382                fw_name = "USA19";
1383                break;
1384                             
1385        case keyspan_usa19qi_pre_product_id:
1386                record = &keyspan_usa19qi_firmware[0];
1387                fw_name = "USA19QI";
1388                break;
1389                             
1390        case keyspan_mpr_pre_product_id:
1391                record = &keyspan_mpr_firmware[0];
1392                fw_name = "MPR";
1393                break;
1394
1395        case keyspan_usa19qw_pre_product_id:
1396                record = &keyspan_usa19qw_firmware[0];
1397                fw_name = "USA19QI";
1398                break;
1399                             
1400        case keyspan_usa18x_pre_product_id:
1401                record = &keyspan_usa18x_firmware[0];
1402                fw_name = "USA18X";
1403                break;
1404                             
1405        case keyspan_usa19w_pre_product_id:
1406                record = &keyspan_usa19w_firmware[0];
1407                fw_name = "USA19W";
1408                break;
1409                
1410        case keyspan_usa49w_pre_product_id:
1411                record = &keyspan_usa49w_firmware[0];
1412                fw_name = "USA49W";
1413                break;
1414
1415        case keyspan_usa49wlc_pre_product_id:
1416                record = &keyspan_usa49wlc_firmware[0];
1417                fw_name = "USA49WLC";
1418                break;
1419
1420        default:
1421                record = NULL;
1422                fw_name = "Unknown";
1423                break;
1424        }
1425
1426        if (record == NULL) {
1427                dev_err(&serial->dev->dev, "Required keyspan firmware image (%s) unavailable.\n", fw_name);
1428                return(1);
1429        }
1430
1431        dbg("Uploading Keyspan %s firmware.", fw_name);
1432
1433                /* download the firmware image */
1434        response = ezusb_set_reset(serial, 1);
1435
1436        while(record->address != 0xffff) {
1437                response = ezusb_writememory(serial, record->address,
1438                                             (unsigned char *)record->data,
1439                                             record->data_size, 0xa0);
1440                if (response < 0) {
1441                        dev_err(&serial->dev->dev, "ezusb_writememory failed for Keyspan"
1442                                "firmware (%d %04X %p %d)\n",
1443                                response, 
1444                                record->address, record->data, record->data_size);
1445                        break;
1446                }
1447                record++;
1448        }
1449                /* bring device out of reset. Renumeration will occur in a
1450                   moment and the new device will bind to the real driver */
1451        response = ezusb_set_reset(serial, 0);
1452
1453        /* we don't want this device to have a driver assigned to it. */
1454        return (1);
1455}
1456
1457/* Helper functions used by keyspan_setup_urbs */
1458static struct usb_endpoint_descriptor const *find_ep(struct usb_serial const *serial,
1459                                                     int endpoint)
1460{
1461        struct usb_host_interface *iface_desc;
1462        struct usb_endpoint_descriptor *ep;
1463        int i;
1464
1465        iface_desc = serial->interface->cur_altsetting;
1466        for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
1467                ep = &iface_desc->endpoint[i].desc;
1468                if (ep->bEndpointAddress == endpoint)
1469                        return ep;
1470        }
1471        dev_warn(&serial->interface->dev, "found no endpoint descriptor for "
1472                 "endpoint %x\n", endpoint);
1473        return NULL;
1474}
1475
1476static struct urb *keyspan_setup_urb (struct usb_serial *serial, int endpoint,
1477                                      int dir, void *ctx, char *buf, int len,
1478                                      void (*callback)(struct urb *))
1479{
1480        struct urb *urb;
1481        struct usb_endpoint_descriptor const *ep_desc;
1482        char const *ep_type_name;
1483
1484        if (endpoint == -1)
1485                return NULL;            /* endpoint not needed */
1486
1487        dbg ("%s - alloc for endpoint %d.", __FUNCTION__, endpoint);
1488        urb = usb_alloc_urb(0, GFP_KERNEL);             /* No ISO */
1489        if (urb == NULL) {
1490                dbg ("%s - alloc for endpoint %d failed.", __FUNCTION__, endpoint);
1491                return NULL;
1492        }
1493
1494        if (endpoint == 0) {
1495                /* control EP filled in when used */
1496                return urb;
1497        }
1498
1499        ep_desc = find_ep(serial, endpoint);
1500        if (!ep_desc) {
1501                /* leak the urb, something's wrong and the callers don't care */
1502                return urb;
1503        }
1504        if (usb_endpoint_xfer_int(ep_desc)) {
1505                ep_type_name = "INT";
1506                usb_fill_int_urb(urb, serial->dev,
1507                                 usb_sndintpipe(serial->dev, endpoint) | dir,
1508                                 buf, len, callback, ctx,
1509                                 ep_desc->bInterval);
1510        } else if (usb_endpoint_xfer_bulk(ep_desc)) {
1511                ep_type_name = "BULK";
1512                usb_fill_bulk_urb(urb, serial->dev,
1513                                  usb_sndbulkpipe(serial->dev, endpoint) | dir,
1514                                  buf, len, callback, ctx);
1515        } else {
1516                dev_warn(&serial->interface->dev,
1517                         "unsupported endpoint type %x\n",
1518                         ep_desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK);
1519                usb_free_urb(urb);
1520                return NULL;
1521        }
1522
1523        dbg("%s - using urb %p for %s endpoint %x",
1524            __func__, urb, ep_type_name, endpoint);
1525        return urb;
1526}
1527
1528static struct callbacks {
1529        void    (*instat_callback)(struct urb *);
1530        void    (*glocont_callback)(struct urb *);
1531        void    (*indat_callback)(struct urb *);
1532        void    (*outdat_callback)(struct urb *);
1533        void    (*inack_callback)(struct urb *);
1534        void    (*outcont_callback)(struct urb *);
1535} keyspan_callbacks[] = {
1536        {
1537                /* msg_usa26 callbacks */
1538                .instat_callback =      usa26_instat_callback,
1539                .glocont_callback =     usa26_glocont_callback,
1540                .indat_callback =       usa26_indat_callback,
1541                .outdat_callback =      usa2x_outdat_callback,
1542                .inack_callback =       usa26_inack_callback,
1543                .outcont_callback =     usa26_outcont_callback,
1544        }, {
1545                /* msg_usa28 callbacks */
1546                .instat_callback =      usa28_instat_callback,
1547                .glocont_callback =     usa28_glocont_callback,
1548                .indat_callback =       usa28_indat_callback,
1549                .outdat_callback =      usa2x_outdat_callback,
1550                .inack_callback =       usa28_inack_callback,
1551                .outcont_callback =     usa28_outcont_callback,
1552        }, {
1553                /* msg_usa49 callbacks */
1554                .instat_callback =      usa49_instat_callback,
1555                .glocont_callback =     usa49_glocont_callback,
1556                .indat_callback =       usa49_indat_callback,
1557                .outdat_callback =      usa2x_outdat_callback,
1558                .inack_callback =       usa49_inack_callback,
1559                .outcont_callback =     usa49_outcont_callback,
1560        }, {
1561                /* msg_usa90 callbacks */
1562                .instat_callback =      usa90_instat_callback,
1563                .glocont_callback =     usa28_glocont_callback,         
1564                .indat_callback =       usa90_indat_callback,
1565                .outdat_callback =      usa2x_outdat_callback,
1566                .inack_callback =       usa28_inack_callback,
1567                .outcont_callback =     usa90_outcont_callback,
1568        }, {
1569                /* msg_usa67 callbacks */
1570                .instat_callback =      usa67_instat_callback,
1571                .glocont_callback =     usa67_glocont_callback,
1572                .indat_callback =       usa26_indat_callback,
1573                .outdat_callback =      usa2x_outdat_callback,
1574                .inack_callback =       usa26_inack_callback,
1575                .outcont_callback =     usa26_outcont_callback,
1576        }
1577};
1578
1579        /* Generic setup urbs function that uses
1580           data in device_details */
1581static void keyspan_setup_urbs(struct usb_serial *serial)
1582{
1583        int                             i, j;
1584        struct keyspan_serial_private   *s_priv;
1585        const struct keyspan_device_details     *d_details;
1586        struct usb_serial_port          *port;
1587        struct keyspan_port_private     *p_priv;
1588        struct callbacks                *cback;
1589        int                             endp;
1590
1591        dbg ("%s", __FUNCTION__);
1592
1593        s_priv = usb_get_serial_data(serial);
1594        d_details = s_priv->device_details;
1595
1596                /* Setup values for the various callback routines */
1597        cback = &keyspan_callbacks[d_details->msg_format];
1598
1599                /* Allocate and set up urbs for each one that is in use, 
1600                   starting with instat endpoints */
1601        s_priv->instat_urb = keyspan_setup_urb
1602                (serial, d_details->instat_endpoint, USB_DIR_IN,
1603                 serial, s_priv->instat_buf, INSTAT_BUFLEN,
1604                 cback->instat_callback);
1605
1606        s_priv->indat_urb = keyspan_setup_urb
1607                (serial, d_details->indat_endpoint, USB_DIR_IN,
1608                 serial, s_priv->indat_buf, INDAT49W_BUFLEN,
1609                 usa49wg_indat_callback);
1610
1611        s_priv->glocont_urb = keyspan_setup_urb
1612                (serial, d_details->glocont_endpoint, USB_DIR_OUT,
1613                 serial, s_priv->glocont_buf, GLOCONT_BUFLEN,
1614                 cback->glocont_callback);
1615
1616                /* Setup endpoints for each port specific thing */
1617        for (i = 0; i < d_details->num_ports; i ++) {
1618                port = serial->port[i];
1619                p_priv = usb_get_serial_port_data(port);
1620
1621                /* Do indat endpoints first, once for each flip */
1622                endp = d_details->indat_endpoints[i];
1623                for (j = 0; j <= d_details->indat_endp_flip; ++j, ++endp) {
1624                        p_priv->in_urbs[j] = keyspan_setup_urb
1625                                (serial, endp, USB_DIR_IN, port,
1626                                 p_priv->in_buffer[j], 64,
1627                                 cback->indat_callback);
1628                }
1629                for (; j < 2; ++j)
1630                        p_priv->in_urbs[j] = NULL;
1631
1632                /* outdat endpoints also have flip */
1633                endp = d_details->outdat_endpoints[i];
1634                for (j = 0; j <= d_details->outdat_endp_flip; ++j, ++endp) {
1635                        p_priv->out_urbs[j] = keyspan_setup_urb
1636                                (serial, endp, USB_DIR_OUT, port,
1637                                 p_priv->out_buffer[j], 64,
1638                                 cback->outdat_callback);
1639                }
1640                for (; j < 2; ++j)
1641                        p_priv->out_urbs[j] = NULL;
1642
1643                /* inack endpoint */
1644                p_priv->inack_urb = keyspan_setup_urb
1645                        (serial, d_details->inack_endpoints[i], USB_DIR_IN,
1646                         port, p_priv->inack_buffer, 1, cback->inack_callback);
1647
1648                /* outcont endpoint */
1649                p_priv->outcont_urb = keyspan_setup_urb
1650                        (serial, d_details->outcont_endpoints[i], USB_DIR_OUT,
1651                         port, p_priv->outcont_buffer, 64,
1652                         cback->outcont_callback);
1653        }       
1654
1655}
1656
1657/* usa19 function doesn't require prescaler */
1658static int keyspan_usa19_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi,
1659                                   u8 *rate_low, u8 *prescaler, int portnum)
1660{
1661        u32     b16,    /* baud rate times 16 (actual rate used internally) */
1662                div,    /* divisor */   
1663                cnt;    /* inverse of divisor (programmed into 8051) */
1664                
1665        dbg ("%s - %d.", __FUNCTION__, baud_rate);
1666
1667                /* prevent divide by zero...  */
1668        if( (b16 = (baud_rate * 16L)) == 0) {
1669                return (KEYSPAN_INVALID_BAUD_RATE);
1670        }
1671
1672                /* Any "standard" rate over 57k6 is marginal on the USA-19
1673                   as we run out of divisor resolution. */
1674        if (baud_rate > 57600) {
1675                return (KEYSPAN_INVALID_BAUD_RATE);
1676        }
1677
1678                /* calculate the divisor and the counter (its inverse) */
1679        if( (div = (baudclk / b16)) == 0) {
1680                return (KEYSPAN_INVALID_BAUD_RATE);
1681        }
1682        else {
1683                cnt = 0 - div;
1684        }
1685
1686        if(div > 0xffff) {
1687                return (KEYSPAN_INVALID_BAUD_RATE);
1688        }
1689
1690                /* return the counter values if non-null */
1691        if (rate_low) {
1692                *rate_low = (u8) (cnt & 0xff);
1693        }
1694        if (rate_hi) {
1695                *rate_hi = (u8) ((cnt >> 8) & 0xff);
1696        }
1697        if (rate_low && rate_hi) {
1698                dbg ("%s - %d %02x %02x.", __FUNCTION__, baud_rate, *rate_hi, *rate_low);
1699        }
1700        
1701        return (KEYSPAN_BAUD_RATE_OK);
1702}
1703
1704/* usa19hs function doesn't require prescaler */
1705static int keyspan_usa19hs_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi,
1706                                   u8 *rate_low, u8 *prescaler, int portnum)
1707{
1708        u32     b16,    /* baud rate times 16 (actual rate used internally) */
1709                        div;    /* divisor */   
1710                
1711        dbg ("%s - %d.", __FUNCTION__, baud_rate);
1712
1713                /* prevent divide by zero...  */
1714        if( (b16 = (baud_rate * 16L)) == 0) 
1715                return (KEYSPAN_INVALID_BAUD_RATE);
1716        
1717
1718
1719                /* calculate the divisor */
1720        if( (div = (baudclk / b16)) == 0) 
1721                return (KEYSPAN_INVALID_BAUD_RATE);
1722
1723        if(div > 0xffff) 
1724                return (KEYSPAN_INVALID_BAUD_RATE);
1725
1726                /* return the counter values if non-null */
1727        if (rate_low) 
1728                *rate_low = (u8) (div & 0xff);
1729        
1730        if (rate_hi) 
1731                *rate_hi = (u8) ((div >> 8) & 0xff);
1732        
1733        if (rate_low && rate_hi) 
1734                dbg ("%s - %d %02x %02x.", __FUNCTION__, baud_rate, *rate_hi, *rate_low);
1735        
1736        return (KEYSPAN_BAUD_RATE_OK);
1737}
1738
1739static int keyspan_usa19w_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi,
1740                                    u8 *rate_low, u8 *prescaler, int portnum)
1741{
1742        u32     b16,    /* baud rate times 16 (actual rate used internally) */
1743                clk,    /* clock with 13/8 prescaler */
1744                div,    /* divisor using 13/8 prescaler */      
1745                res,    /* resulting baud rate using 13/8 prescaler */
1746                diff,   /* error using 13/8 prescaler */
1747                smallest_diff;
1748        u8      best_prescaler;
1749        int     i;
1750
1751        dbg ("%s - %d.", __FUNCTION__, baud_rate);
1752
1753                /* prevent divide by zero */
1754        if( (b16 = baud_rate * 16L) == 0) {
1755                return (KEYSPAN_INVALID_BAUD_RATE);
1756        }
1757
1758                /* Calculate prescaler by trying them all and looking
1759                   for best fit */
1760                
1761                /* start with largest possible difference */
1762        smallest_diff = 0xffffffff;
1763
1764                /* 0 is an invalid prescaler, used as a flag */
1765        best_prescaler = 0;
1766
1767        for(i = 8; i <= 0xff; ++i) {
1768                clk = (baudclk * 8) / (u32) i;
1769                
1770                if( (div = clk / b16) == 0) {
1771                        continue;
1772                }
1773
1774                res = clk / div;
1775                diff= (res > b16) ? (res-b16) : (b16-res);
1776
1777                if(diff < smallest_diff) {
1778                        best_prescaler = i;
1779                        smallest_diff = diff;
1780                }
1781        }
1782
1783        if(best_prescaler == 0) {
1784                return (KEYSPAN_INVALID_BAUD_RATE);
1785        }
1786
1787        clk = (baudclk * 8) / (u32) best_prescaler;
1788        div = clk / b16;
1789
1790                /* return the divisor and prescaler if non-null */
1791        if (rate_low) {
1792                *rate_low = (u8) (div & 0xff);
1793        }
1794        if (rate_hi) {
1795                *rate_hi = (u8) ((div >> 8) & 0xff);
1796        }
1797        if (prescaler) {
1798                *prescaler = best_prescaler;
1799                /*  dbg("%s - %d %d", __FUNCTION__, *prescaler, div); */
1800        }
1801        return (KEYSPAN_BAUD_RATE_OK);
1802}
1803
1804        /* USA-28 supports different maximum baud rates on each port */
1805static int keyspan_usa28_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi,
1806                                    u8 *rate_low, u8 *prescaler, int portnum)
1807{
1808        u32     b16,    /* baud rate times 16 (actual rate used internally) */
1809                div,    /* divisor */   
1810                cnt;    /* inverse of divisor (programmed into 8051) */
1811
1812        dbg ("%s - %d.", __FUNCTION__, baud_rate);
1813
1814                /* prevent divide by zero */
1815        if ((b16 = baud_rate * 16L) == 0)
1816                return (KEYSPAN_INVALID_BAUD_RATE);
1817
1818                /* calculate the divisor and the counter (its inverse) */
1819        if ((div = (KEYSPAN_USA28_BAUDCLK / b16)) == 0) {
1820                return (KEYSPAN_INVALID_BAUD_RATE);
1821        }
1822        else {
1823                cnt = 0 - div;
1824        }
1825
1826                /* check for out of range, based on portnum, 
1827                   and return result */
1828        if(portnum == 0) {
1829                if(div > 0xffff)
1830                        return (KEYSPAN_INVALID_BAUD_RATE);
1831        }
1832        else {
1833                if(portnum == 1) {
1834                        if(div > 0xff) {
1835                                return (KEYSPAN_INVALID_BAUD_RATE);
1836                        }
1837                }
1838                else {
1839                        return (KEYSPAN_INVALID_BAUD_RATE);
1840                }
1841        }
1842
1843                /* return the counter values if not NULL
1844                   (port 1 will ignore retHi) */
1845        if (rate_low) {
1846                *rate_low = (u8) (cnt & 0xff);
1847        }
1848        if (rate_hi) {
1849                *rate_hi = (u8) ((cnt >> 8) & 0xff);
1850        }
1851        dbg ("%s - %d OK.", __FUNCTION__, baud_rate);
1852        return (KEYSPAN_BAUD_RATE_OK);
1853}
1854
1855static int keyspan_usa26_send_setup(struct usb_serial *serial,
1856                                    struct usb_serial_port *port,
1857                                    int reset_port)
1858{
1859        struct keyspan_usa26_portControlMessage msg;            
1860        struct keyspan_serial_private           *s_priv;
1861        struct keyspan_port_private             *p_priv;
1862        const struct keyspan_device_details     *d_details;
1863        int                                     outcont_urb;
1864        struct urb                              *this_urb;
1865        int                                     device_port, err;
1866
1867        dbg ("%s reset=%d", __FUNCTION__, reset_port); 
1868
1869        s_priv = usb_get_serial_data(serial);
1870        p_priv = usb_get_serial_port_data(port);
1871        d_details = s_priv->device_details;
1872        device_port = port->number - port->serial->minor;
1873
1874        outcont_urb = d_details->outcont_endpoints[port->number];
1875        this_urb = p_priv->outcont_urb;
1876
1877        dbg("%s - endpoint %d", __FUNCTION__, usb_pipeendpoint(this_urb->pipe));
1878
1879                /* Make sure we have an urb then send the message */
1880        if (this_urb == NULL) {
1881                dbg("%s - oops no urb.", __FUNCTION__);
1882                return -1;
1883        }
1884
1885        /* Save reset port val for resend.
1886           Don't overwrite resend for open/close condition. */
1887        if ((reset_port + 1) > p_priv->resend_cont)
1888                p_priv->resend_cont = reset_port + 1;
1889        if (this_urb->status == -EINPROGRESS) {
1890                /*  dbg ("%s - already writing", __FUNCTION__); */
1891                mdelay(5);
1892                return(-1);
1893        }
1894
1895        memset(&msg, 0, sizeof (struct keyspan_usa26_portControlMessage));
1896        
1897                /* Only set baud rate if it's changed */        
1898        if (p_priv->old_baud != p_priv->baud) {
1899                p_priv->old_baud = p_priv->baud;
1900                msg.setClocking = 0xff;
1901                if (d_details->calculate_baud_rate
1902                    (p_priv->baud, d_details->baudclk, &msg.baudHi,
1903                     &msg.baudLo, &msg.prescaler, device_port) == KEYSPAN_INVALID_BAUD_RATE ) {
1904                        dbg("%s - Invalid baud rate %d requested, using 9600.", __FUNCTION__,
1905                            p_priv->baud);
1906                        msg.baudLo = 0;
1907                        msg.baudHi = 125;       /* Values for 9600 baud */
1908                        msg.prescaler = 10;
1909                }
1910                msg.setPrescaler = 0xff;
1911        }
1912
1913        msg.lcr = (p_priv->cflag & CSTOPB)? STOPBITS_678_2: STOPBITS_5678_1;
1914        switch (p_priv->cflag & CSIZE) {
1915        case CS5:
1916                msg.lcr |= USA_DATABITS_5;
1917                break;
1918        case CS6:
1919                msg.lcr |= USA_DATABITS_6;
1920                break;
1921        case CS7:
1922                msg.lcr |= USA_DATABITS_7;
1923                break;
1924        case CS8:
1925                msg.lcr |= USA_DATABITS_8;
1926                break;
1927        }
1928        if (p_priv->cflag & PARENB) {
1929                /* note USA_PARITY_NONE == 0 */
1930                msg.lcr |= (p_priv->cflag & PARODD)?
1931                        USA_PARITY_ODD: USA_PARITY_EVEN;
1932        }
1933        msg.setLcr = 0xff;
1934
1935        msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
1936        msg.xonFlowControl = 0;
1937        msg.setFlowControl = 0xff;
1938        msg.forwardingLength = 16;
1939        msg.xonChar = 17;
1940        msg.xoffChar = 19;
1941
1942        /* Opening port */
1943        if (reset_port == 1) {
1944                msg._txOn = 1;
1945                msg._txOff = 0;
1946                msg.txFlush = 0;
1947                msg.txBreak = 0;
1948                msg.rxOn = 1;
1949                msg.rxOff = 0;
1950                msg.rxFlush = 1;
1951                msg.rxForward = 0;
1952                msg.returnStatus = 0;
1953                msg.resetDataToggle = 0xff;
1954        }
1955
1956        /* Closing port */
1957        else if (reset_port == 2) {
1958                msg._txOn = 0;
1959                msg._txOff = 1;
1960                msg.txFlush = 0;
1961                msg.txBreak = 0;
1962                msg.rxOn = 0;
1963                msg.rxOff = 1;
1964                msg.rxFlush = 1;
1965                msg.rxForward = 0;
1966                msg.returnStatus = 0;
1967                msg.resetDataToggle = 0;
1968        }
1969
1970        /* Sending intermediate configs */
1971        else {
1972                msg._txOn = (! p_priv->break_on);
1973                msg._txOff = 0;
1974                msg.txFlush = 0;
1975                msg.txBreak = (p_priv->break_on);
1976                msg.rxOn = 0;
1977                msg.rxOff = 0;
1978                msg.rxFlush = 0;
1979                msg.rxForward = 0;
1980                msg.returnStatus = 0;
1981                msg.resetDataToggle = 0x0;
1982        }
1983
1984                /* Do handshaking outputs */    
1985        msg.setTxTriState_setRts = 0xff;
1986        msg.txTriState_rts = p_priv->rts_state;
1987
1988        msg.setHskoa_setDtr = 0xff;
1989        msg.hskoa_dtr = p_priv->dtr_state;
1990                
1991        p_priv->resend_cont = 0;
1992        memcpy (this_urb->transfer_buffer, &msg, sizeof(msg));
1993        
1994        /* send the data out the device on control endpoint */
1995        this_urb->transfer_buffer_length = sizeof(msg);
1996
1997        this_urb->dev = serial->dev;
1998        if ((err = usb_submit_urb(this_urb, GFP_ATOMIC)) != 0) {
1999                dbg("%s - usb_submit_urb(setup) failed (%d)", __FUNCTION__, err);
2000        }
2001#if 0
2002        else {
2003                dbg("%s - usb_submit_urb(%d) OK %d bytes (end %d)", __FUNCTION__
2004                    outcont_urb, this_urb->transfer_buffer_length,
2005                    usb_pipeendpoint(this_urb->pipe));
2006        }
2007#endif
2008
2009        return (0);
2010}
2011
2012static int keyspan_usa28_send_setup(struct usb_serial *serial,
2013                                    struct usb_serial_port *port,
2014                                    int reset_port)
2015{
2016        struct keyspan_usa28_portControlMessage msg;            
2017        struct keyspan_serial_private           *s_priv;
2018        struct keyspan_port_private             *p_priv;
2019        const struct keyspan_device_details     *d_details;
2020        struct urb                              *this_urb;
2021        int                                     device_port, err;
2022
2023        dbg ("%s", __FUNCTION__);
2024
2025        s_priv = usb_get_serial_data(serial);
2026        p_priv = usb_get_serial_port_data(port);
2027        d_details = s_priv->device_details;
2028        device_port = port->number - port->serial->minor;
2029
2030        /* only do something if we have a bulk out endpoint */
2031        if ((this_urb = p_priv->outcont_urb) == NULL) {
2032                dbg("%s - oops no urb.", __FUNCTION__);
2033                return -1;
2034        }
2035
2036        /* Save reset port val for resend.
2037           Don't overwrite resend for open/close condition. */
2038        if ((reset_port + 1) > p_priv->resend_cont)
2039                p_priv->resend_cont = reset_port + 1;
2040        if (this_urb->status == -EINPROGRESS) {
2041                dbg ("%s already writing", __FUNCTION__);
2042                mdelay(5);
2043                return(-1);
2044        }
2045
2046        memset(&msg, 0, sizeof (struct keyspan_usa28_portControlMessage));
2047
2048        msg.setBaudRate = 1;
2049        if (d_details->calculate_baud_rate(p_priv->baud, d_details->baudclk,
2050                &msg.baudHi, &msg.baudLo, NULL, device_port) == KEYSPAN_INVALID_BAUD_RATE ) {
2051                dbg("%s - Invalid baud rate requested %d.", __FUNCTION__, p_priv->baud);
2052                msg.baudLo = 0xff;
2053                msg.baudHi = 0xb2;      /* Values for 9600 baud */
2054        }
2055
2056        /* If parity is enabled, we must calculate it ourselves. */
2057        msg.parity = 0;         /* XXX for now */
2058
2059        msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
2060        msg.xonFlowControl = 0;
2061
2062        /* Do handshaking outputs, DTR is inverted relative to RTS */   
2063        msg.rts = p_priv->rts_state;
2064        msg.dtr = p_priv->dtr_state;
2065
2066        msg.forwardingLength = 16;
2067        msg.forwardMs = 10;
2068        msg.breakThreshold = 45;
2069        msg.xonChar = 17;
2070        msg.xoffChar = 19;
2071
2072        /*msg.returnStatus = 1;
2073        msg.resetDataToggle = 0xff;*/
2074        /* Opening port */
2075        if (reset_port == 1) {
2076                msg._txOn = 1;
2077                msg._txOff = 0;
2078                msg.txFlush = 0;
2079                msg.txForceXoff = 0;
2080                msg.txBreak = 0;
2081                msg.rxOn = 1;
2082                msg.rxOff = 0;
2083                msg.rxFlush = 1;
2084                msg.rxForward = 0;
2085                msg.returnStatus = 0;
2086                msg.resetDataToggle = 0xff;
2087        }
2088        /* Closing port */
2089        else if (reset_port == 2) {
2090                msg._txOn = 0;
2091                msg._txOff = 1;
2092                msg.txFlush = 0;
2093                msg.txForceXoff = 0;
2094                msg.txBreak = 0;
2095                msg.rxOn = 0;
2096                msg.rxOff = 1;
2097                msg.rxFlush = 1;
2098                msg.rxForward = 0;
2099                msg.returnStatus = 0;
2100                msg.resetDataToggle = 0;
2101        }
2102        /* Sending intermediate configs */
2103        else {
2104                msg._txOn = (! p_priv->break_on);
2105                msg._txOff = 0;
2106                msg.txFlush = 0;
2107                msg.txForceXoff = 0;
2108                msg.txBreak = (p_priv->break_on);
2109                msg.rxOn = 0;
2110                msg.rxOff = 0;
2111                msg.rxFlush = 0;
2112                msg.rxForward = 0;
2113                msg.returnStatus = 0;
2114                msg.resetDataToggle = 0x0;
2115        }
2116
2117        p_priv->resend_cont = 0;
2118        memcpy (this_urb->transfer_buffer, &msg, sizeof(msg));
2119
2120        /* send the data out the device on control endpoint */
2121        this_urb->transfer_buffer_length = sizeof(msg);
2122
2123        this_urb->dev = serial->dev;
2124        if ((err = usb_submit_urb(this_urb, GFP_ATOMIC)) != 0) {
2125                dbg("%s - usb_submit_urb(setup) failed", __FUNCTION__);
2126        }
2127#if 0
2128        else {
2129                dbg("%s - usb_submit_urb(setup) OK %d bytes", __FUNCTION__,
2130                    this_urb->transfer_buffer_length);
2131        }
2132#endif
2133
2134        return (0);
2135}
2136
2137static int keyspan_usa49_send_setup(struct usb_serial *serial,
2138                                    struct usb_serial_port *port,
2139                                    int reset_port)
2140{
2141        struct keyspan_usa49_portControlMessage msg;
2142        struct usb_ctrlrequest                  *dr = NULL;
2143        struct keyspan_serial_private           *s_priv;
2144        struct keyspan_port_private             *p_priv;
2145        const struct keyspan_device_details     *d_details;
2146        struct urb                              *this_urb;
2147        int                                     err, device_port;
2148
2149        dbg ("%s", __FUNCTION__);
2150
2151        s_priv = usb_get_serial_data(serial);
2152        p_priv = usb_get_serial_port_data(port);
2153        d_details = s_priv->device_details;
2154
2155        this_urb = s_priv->glocont_urb;
2156
2157        /* Work out which port within the device is being setup */
2158        device_port = port->number - port->serial->minor;
2159
2160        dbg("%s - endpoint %d port %d (%d)",__FUNCTION__, usb_pipeendpoint(this_urb->pipe), port->number, device_port);
2161
2162                /* Make sure we have an urb then send the message */
2163        if (this_urb == NULL) {
2164                dbg("%s - oops no urb for port %d.", __FUNCTION__, port->number);
2165                return -1;
2166        }
2167
2168        /* Save reset port val for resend.
2169           Don't overwrite resend for open/close condition. */
2170        if ((reset_port + 1) > p_priv->resend_cont)
2171                p_priv->resend_cont = reset_port + 1;
2172
2173        if (this_urb->status == -EINPROGRESS) {
2174                /*  dbg ("%s - already writing", __FUNCTION__); */
2175                mdelay(5);
2176                return(-1);
2177        }
2178
2179        memset(&msg, 0, sizeof (struct keyspan_usa49_portControlMessage));
2180
2181        /*msg.portNumber = port->number;*/
2182        msg.portNumber = device_port;
2183        
2184                /* Only set baud rate if it's changed */        
2185        if (p_priv->old_baud != p_priv->baud) {
2186                p_priv->old_baud = p_priv->baud;
2187                msg.setClocking = 0xff;
2188                if (d_details->calculate_baud_rate
2189                    (p_priv->baud, d_details->baudclk, &msg.baudHi,
2190                     &msg.baudLo, &msg.prescaler, device_port) == KEYSPAN_INVALID_BAUD_RATE ) {
2191                        dbg("%s - Invalid baud rate %d requested, using 9600.", __FUNCTION__,
2192                            p_priv->baud);
2193                        msg.baudLo = 0;
2194                        msg.baudHi = 125;       /* Values for 9600 baud */
2195                        msg.prescaler = 10;
2196                }
2197                //msg.setPrescaler = 0xff;
2198        }
2199
2200        msg.lcr = (p_priv->cflag & CSTOPB)? STOPBITS_678_2: STOPBITS_5678_1;
2201        switch (p_priv->cflag & CSIZE) {
2202        case CS5:
2203                msg.lcr |= USA_DATABITS_5;
2204                break;
2205        case CS6:
2206                msg.lcr |= USA_DATABITS_6;
2207                break;
2208        case CS7:
2209                msg.lcr |= USA_DATABITS_7;
2210                break;
2211        case CS8:
2212                msg.lcr |= USA_DATABITS_8;
2213                break;
2214        }
2215        if (p_priv->cflag & PARENB) {
2216                /* note USA_PARITY_NONE == 0 */
2217                msg.lcr |= (p_priv->cflag & PARODD)?
2218                        USA_PARITY_ODD: USA_PARITY_EVEN;
2219        }
2220        msg.setLcr = 0xff;
2221
2222        msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
2223        msg.xonFlowControl = 0;
2224        msg.setFlowControl = 0xff;
2225        
2226        msg.forwardingLength = 16;
2227        msg.xonChar = 17;
2228        msg.xoffChar = 19;
2229
2230        /* Opening port */ 
2231        if (reset_port == 1) {
2232                msg._txOn = 1;
2233                msg._txOff = 0;
2234                msg.txFlush = 0;
2235                msg.txBreak = 0;
2236                msg.rxOn = 1;
2237                msg.rxOff = 0;
2238                msg.rxFlush = 1;
2239                msg.rxForward = 0;
2240                msg.returnStatus = 0;
2241                msg.resetDataToggle = 0xff;
2242                msg.enablePort = 1;
2243                msg.disablePort = 0;
2244        }
2245        /* Closing port */
2246        else if (reset_port == 2) {
2247                msg._txOn = 0;
2248                msg._txOff = 1;
2249                msg.txFlush = 0;
2250                msg.txBreak = 0;
2251                msg.rxOn = 0;
2252                msg.rxOff = 1;
2253                msg.rxFlush = 1;
2254                msg.rxForward = 0;
2255                msg.returnStatus = 0;
2256                msg.resetDataToggle = 0;
2257                msg.enablePort = 0;
2258                msg.disablePort = 1;
2259        }
2260        /* Sending intermediate configs */
2261        else {
2262                msg._txOn = (! p_priv->break_on);
2263                msg._txOff = 0;
2264                msg.txFlush = 0;
2265                msg.txBreak = (p_priv->break_on);
2266                msg.rxOn = 0;
2267                msg.rxOff = 0;
2268                msg.rxFlush = 0;
2269                msg.rxForward = 0;
2270                msg.returnStatus = 0;
2271                msg.resetDataToggle = 0x0;
2272                msg.enablePort = 0;
2273                msg.disablePort = 0;
2274        }
2275
2276                /* Do handshaking outputs */    
2277        msg.setRts = 0xff;
2278        msg.rts = p_priv->rts_state;
2279
2280        msg.setDtr = 0xff;
2281        msg.dtr = p_priv->dtr_state;
2282                
2283        p_priv->resend_cont = 0;
2284
2285        /* if the device is a 49wg, we send control message on usb control EP 0 */
2286
2287        if (d_details->product_id == keyspan_usa49wg_product_id) {
2288                dr = (void *)(s_priv->ctrl_buf);
2289                dr->bRequestType = USB_TYPE_VENDOR | USB_DIR_OUT;
2290                dr->bRequest = 0xB0;    /* 49wg control message */;
2291                dr->wValue = 0;
2292                dr->wIndex = 0;
2293                dr->wLength = cpu_to_le16(sizeof(msg));
2294
2295                memcpy (s_priv->glocont_buf, &msg, sizeof(msg));
2296
2297                usb_fill_control_urb(this_urb, serial->dev, usb_sndctrlpipe(serial->dev, 0),
2298                             (unsigned char *)dr, s_priv->glocont_buf, sizeof(msg),
2299                             usa49_glocont_callback, serial);
2300
2301        } else {
2302                memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
2303        
2304                /* send the data out the device on control endpoint */
2305                this_urb->transfer_buffer_length = sizeof(msg);
2306
2307                this_urb->dev = serial->dev;
2308        }
2309        if ((err = usb_submit_urb(this_urb, GFP_ATOMIC)) != 0) {
2310                dbg("%s - usb_submit_urb(setup) failed (%d)", __FUNCTION__, err);
2311        }
2312#if 0
2313        else {
2314                dbg("%s - usb_submit_urb(%d) OK %d bytes (end %d)", __FUNCTION__,
2315                           outcont_urb, this_urb->transfer_buffer_length,
2316                           usb_pipeendpoint(this_urb->pipe));
2317        }
2318#endif
2319
2320        return (0);
2321}
2322
2323static int keyspan_usa90_send_setup(struct usb_serial *serial,
2324                                    struct usb_serial_port *port,
2325                                    int reset_port)
2326{
2327        struct keyspan_usa90_portControlMessage msg;            
2328        struct keyspan_serial_private           *s_priv;
2329        struct keyspan_port_private             *p_priv;
2330        const struct keyspan_device_details     *d_details;
2331        struct urb                              *this_urb;
2332        int                                     err;
2333        u8                                              prescaler;
2334
2335        dbg ("%s", __FUNCTION__);
2336
2337        s_priv = usb_get_serial_data(serial);
2338        p_priv = usb_get_serial_port_data(port);
2339        d_details = s_priv->device_details;
2340
2341        /* only do something if we have a bulk out endpoint */
2342        if ((this_urb = p_priv->outcont_urb) == NULL) {
2343                dbg("%s - oops no urb.", __FUNCTION__);
2344                return -1;
2345        }
2346
2347        /* Save reset port val for resend.
2348           Don't overwrite resend for open/close condition. */
2349        if ((reset_port + 1) > p_priv->resend_cont)
2350                p_priv->resend_cont = reset_port + 1;
2351        if (this_urb->status == -EINPROGRESS) {
2352                dbg ("%s already writing", __FUNCTION__);
2353                mdelay(5);
2354                return(-1);
2355        }
2356
2357        memset(&msg, 0, sizeof (struct keyspan_usa90_portControlMessage));
2358
2359        /* Only set baud rate if it's changed */        
2360        if (p_priv->old_baud != p_priv->baud) {
2361                p_priv->old_baud = p_priv->baud;
2362                msg.setClocking = 0x01;
2363                if (d_details->calculate_baud_rate
2364                    (p_priv->baud, d_details->baudclk, &msg.baudHi,
2365                     &msg.baudLo, &prescaler, 0) == KEYSPAN_INVALID_BAUD_RATE ) {
2366                        dbg("%s - Invalid baud rate %d requested, using 9600.", __FUNCTION__,
2367                            p_priv->baud);
2368                        p_priv->baud = 9600;
2369                        d_details->calculate_baud_rate (p_priv->baud, d_details->baudclk, 
2370                                &msg.baudHi, &msg.baudLo, &prescaler, 0);
2371                }
2372                msg.setRxMode = 1;
2373                msg.setTxMode = 1;
2374        }
2375
2376        /* modes must always be correctly specified */
2377        if (p_priv->baud > 57600)
2378        {
2379                msg.rxMode = RXMODE_DMA;
2380                msg.txMode = TXMODE_DMA;
2381        }
2382        else
2383        {
2384                msg.rxMode = RXMODE_BYHAND;
2385                msg.txMode = TXMODE_BYHAND;
2386        }
2387
2388        msg.lcr = (p_priv->cflag & CSTOPB)? STOPBITS_678_2: STOPBITS_5678_1;
2389        switch (p_priv->cflag & CSIZE) {
2390        case CS5:
2391                msg.lcr |= USA_DATABITS_5;
2392                break;
2393        case CS6:
2394                msg.lcr |= USA_DATABITS_6;
2395                break;
2396        case CS7:
2397                msg.lcr |= USA_DATABITS_7;
2398                break;
2399        case CS8:
2400                msg.lcr |= USA_DATABITS_8;
2401                break;
2402        }
2403        if (p_priv->cflag & PARENB) {
2404                /* note USA_PARITY_NONE == 0 */
2405                msg.lcr |= (p_priv->cflag & PARODD)?
2406                        USA_PARITY_ODD: USA_PARITY_EVEN;
2407        }
2408        if (p_priv->old_cflag != p_priv->cflag) {
2409                p_priv->old_cflag = p_priv->cflag;
2410                msg.setLcr = 0x01;
2411        }
2412
2413        if (p_priv->flow_control == flow_cts)
2414                msg.txFlowControl = TXFLOW_CTS;
2415        msg.setTxFlowControl = 0x01;
2416        msg.setRxFlowControl = 0x01;
2417        
2418        msg.rxForwardingLength = 16;
2419        msg.rxForwardingTimeout = 16;   
2420        msg.txAckSetting = 0;
2421        msg.xonChar = 17;
2422        msg.xoffChar = 19;
2423
2424        /* Opening port */ 
2425        if (reset_port == 1) {
2426                msg.portEnabled = 1;
2427                msg.rxFlush = 1;
2428                msg.txBreak = (p_priv->break_on);
2429        }
2430        /* Closing port */
2431        else if (reset_port == 2) {
2432                msg.portEnabled = 0;
2433        }
2434        /* Sending intermediate configs */
2435        else {
2436                if (port->open_count)
2437                        msg.portEnabled = 1;
2438                msg.txBreak = (p_priv->break_on);
2439        }
2440
2441        /* Do handshaking outputs */    
2442        msg.setRts = 0x01;
2443        msg.rts = p_priv->rts_state;
2444
2445        msg.setDtr = 0x01;
2446        msg.dtr = p_priv->dtr_state;
2447                
2448        p_priv->resend_cont = 0;
2449        memcpy (this_urb->transfer_buffer, &msg, sizeof(msg));
2450        
2451        /* send the data out the device on control endpoint */
2452        this_urb->transfer_buffer_length = sizeof(msg);
2453
2454        this_urb->dev = serial->dev;
2455        if ((err = usb_submit_urb(this_urb, GFP_ATOMIC)) != 0) {
2456                dbg("%s - usb_submit_urb(setup) failed (%d)", __FUNCTION__, err);
2457        }
2458        return (0);
2459}
2460
2461static int keyspan_usa67_send_setup(struct usb_serial *serial,
2462                                    struct usb_serial_port *port,
2463                                    int reset_port)
2464{
2465        struct keyspan_usa67_portControlMessage msg;
2466        struct keyspan_serial_private           *s_priv;
2467        struct keyspan_port_private             *p_priv;
2468        const struct keyspan_device_details     *d_details;
2469        struct urb                              *this_urb;
2470        int                                     err, device_port;
2471
2472        dbg ("%s", __FUNCTION__);
2473
2474        s_priv = usb_get_serial_data(serial);
2475        p_priv = usb_get_serial_port_data(port);
2476        d_details = s_priv->device_details;
2477
2478        this_urb = s_priv->glocont_urb;
2479
2480        /* Work out which port within the device is being setup */
2481        device_port = port->number - port->serial->minor;
2482
2483        /* Make sure we have an urb then send the message */
2484        if (this_urb == NULL) {
2485                dbg("%s - oops no urb for port %d.", __FUNCTION__,
2486                        port->number);
2487                return -1;
2488        }
2489
2490        /* Save reset port val for resend.
2491           Don't overwrite resend for open/close condition. */
2492        if ((reset_port + 1) > p_priv->resend_cont)
2493                p_priv->resend_cont = reset_port + 1;
2494        if (this_urb->status == -EINPROGRESS) {
2495                /*  dbg ("%s - already writing", __FUNCTION__); */
2496                mdelay(5);
2497                return(-1);
2498        }
2499
2500        memset(&msg, 0, sizeof(struct keyspan_usa67_portControlMessage));
2501
2502        msg.port = device_port;
2503
2504        /* Only set baud rate if it's changed */
2505        if (p_priv->old_baud != p_priv->baud) {
2506                p_priv->old_baud = p_priv->baud;
2507                msg.setClocking = 0xff;
2508                if (d_details->calculate_baud_rate
2509                    (p_priv->baud, d_details->baudclk, &msg.baudHi,
2510                     &msg.baudLo, &msg.prescaler, device_port) == KEYSPAN_INVALID_BAUD_RATE ) {
2511                        dbg("%s - Invalid baud rate %d requested, using 9600.", __FUNCTION__,
2512                            p_priv->baud);
2513                        msg.baudLo = 0;
2514                        msg.baudHi = 125;       /* Values for 9600 baud */
2515                        msg.prescaler = 10;
2516                }
2517                msg.setPrescaler = 0xff;
2518        }
2519
2520        msg.lcr = (p_priv->cflag & CSTOPB) ? STOPBITS_678_2 : STOPBITS_5678_1;
2521        switch (p_priv->cflag & CSIZE) {
2522        case CS5:
2523                msg.lcr |= USA_DATABITS_5;
2524                break;
2525        case CS6:
2526                msg.lcr |= USA_DATABITS_6;
2527                break;
2528        case CS7:
2529                msg.lcr |= USA_DATABITS_7;
2530                break;
2531        case CS8:
2532                msg.lcr |= USA_DATABITS_8;
2533                break;
2534        }
2535        if (p_priv->cflag & PARENB) {
2536                /* note USA_PARITY_NONE == 0 */
2537                msg.lcr |= (p_priv->cflag & PARODD)?
2538                        USA_PARITY_ODD: USA_PARITY_EVEN;
2539        }
2540        msg.setLcr = 0xff;
2541
2542        msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
2543        msg.xonFlowControl = 0;
2544        msg.setFlowControl = 0xff;
2545        msg.forwardingLength = 16;
2546        msg.xonChar = 17;
2547        msg.xoffChar = 19;
2548
2549        if (reset_port == 1) {
2550                /* Opening port */
2551                msg._txOn = 1;
2552                msg._txOff = 0;
2553                msg.txFlush = 0;
2554                msg.txBreak = 0;
2555                msg.rxOn = 1;
2556                msg.rxOff = 0;
2557                msg.rxFlush = 1;
2558                msg.rxForward = 0;
2559                msg.returnStatus = 0;
2560                msg.resetDataToggle = 0xff;
2561        } else if (reset_port == 2) {
2562                /* Closing port */
2563                msg._txOn = 0;
2564                msg._txOff = 1;
2565                msg.txFlush = 0;
2566                msg.txBreak = 0;
2567                msg.rxOn = 0;
2568                msg.rxOff = 1;
2569                msg.rxFlush = 1;
2570                msg.rxForward = 0;
2571                msg.returnStatus = 0;
2572                msg.resetDataToggle = 0;
2573        } else {
2574                /* Sending intermediate configs */
2575                msg._txOn = (! p_priv->break_on);
2576                msg._txOff = 0;
2577                msg.txFlush = 0;
2578                msg.txBreak = (p_priv->break_on);
2579                msg.rxOn = 0;
2580                msg.rxOff = 0;
2581                msg.rxFlush = 0;
2582                msg.rxForward = 0;
2583                msg.returnStatus = 0;
2584                msg.resetDataToggle = 0x0;
2585        }
2586
2587        /* Do handshaking outputs */
2588        msg.setTxTriState_setRts = 0xff;
2589        msg.txTriState_rts = p_priv->rts_state;
2590
2591        msg.setHskoa_setDtr = 0xff;
2592        msg.hskoa_dtr = p_priv->dtr_state;
2593
2594        p_priv->resend_cont = 0;
2595
2596        memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
2597
2598        /* send the data out the device on control endpoint */
2599        this_urb->transfer_buffer_length = sizeof(msg);
2600        this_urb->dev = serial->dev;
2601
2602        err = usb_submit_urb(this_urb, GFP_ATOMIC);
2603        if (err != 0)
2604                dbg("%s - usb_submit_urb(setup) failed (%d)", __FUNCTION__,
2605                                err);
2606        return (0);
2607}
2608
2609static void keyspan_send_setup(struct usb_serial_port *port, int reset_port)
2610{
2611        struct usb_serial *serial = port->serial;
2612        struct keyspan_serial_private *s_priv;
2613        const struct keyspan_device_details *d_details;
2614
2615        dbg ("%s", __FUNCTION__);
2616
2617        s_priv = usb_get_serial_data(serial);
2618        d_details = s_priv->device_details;
2619
2620        switch (d_details->msg_format) {
2621        case msg_usa26:
2622                keyspan_usa26_send_setup(serial, port, reset_port);
2623                break;
2624        case msg_usa28:
2625                keyspan_usa28_send_setup(serial, port, reset_port);
2626                break;
2627        case msg_usa49:
2628                keyspan_usa49_send_setup(serial, port, reset_port);
2629                break;
2630        case msg_usa90:
2631                keyspan_usa90_send_setup(serial, port, reset_port);
2632                break;
2633        case msg_usa67:
2634                keyspan_usa67_send_setup(serial, port, reset_port);
2635                break;
2636        }
2637}
2638
2639
2640/* Gets called by the "real" driver (ie once firmware is loaded
2641   and renumeration has taken place. */
2642static int keyspan_startup (struct usb_serial *serial)
2643{
2644        int                             i, err;
2645        struct usb_serial_port          *port;
2646        struct keyspan_serial_private   *s_priv;
2647        struct keyspan_port_private     *p_priv;
2648        const struct keyspan_device_details     *d_details;
2649
2650        dbg("%s", __FUNCTION__);
2651
2652        for (i = 0; (d_details = keyspan_devices[i]) != NULL; ++i)
2653                if (d_details->product_id == le16_to_cpu(serial->dev->descriptor.idProduct))
2654                        break;
2655        if (d_details == NULL) {
2656                dev_err(&serial->dev->dev, "%s - unknown product id %x\n", __FUNCTION__, le16_to_cpu(serial->dev->descriptor.idProduct));
2657                return 1;
2658        }
2659
2660        /* Setup private data for serial driver */
2661        s_priv = kzalloc(sizeof(struct keyspan_serial_private), GFP_KERNEL);
2662        if (!s_priv) {
2663                dbg("%s - kmalloc for keyspan_serial_private failed.", __FUNCTION__);
2664                return -ENOMEM;
2665        }
2666
2667        s_priv->device_details = d_details;
2668        usb_set_serial_data(serial, s_priv);
2669
2670        /* Now setup per port private data */
2671        for (i = 0; i < serial->num_ports; i++) {
2672                port = serial->port[i];
2673                p_priv = kzalloc(sizeof(struct keyspan_port_private), GFP_KERNEL);
2674                if (!p_priv) {
2675                        dbg("%s - kmalloc for keyspan_port_private (%d) failed!.", __FUNCTION__, i);
2676                        return (1);
2677                }
2678                p_priv->device_details = d_details;
2679                usb_set_serial_port_data(port, p_priv);
2680        }
2681
2682        keyspan_setup_urbs(serial);
2683
2684        if (s_priv->instat_urb != NULL) {
2685                s_priv->instat_urb->dev = serial->dev;
2686                err = usb_submit_urb(s_priv->instat_urb, GFP_KERNEL);
2687                if (err != 0)
2688                        dbg("%s - submit instat urb failed %d", __FUNCTION__,
2689                                err);
2690        }
2691        if (s_priv->indat_urb != NULL) {
2692                s_priv->indat_urb->dev = serial->dev;
2693                err = usb_submit_urb(s_priv->indat_urb, GFP_KERNEL);
2694                if (err != 0)
2695                        dbg("%s - submit indat urb failed %d", __FUNCTION__,
2696                                err);
2697        }
2698                        
2699        return (0);
2700}
2701
2702static void keyspan_shutdown (struct usb_serial *serial)
2703{
2704        int                             i, j;
2705        struct usb_serial_port          *port;
2706        struct keyspan_serial_private   *s_priv;
2707        struct keyspan_port_private     *p_priv;
2708
2709        dbg("%s", __FUNCTION__);
2710
2711        s_priv = usb_get_serial_data(serial);
2712
2713        /* Stop reading/writing urbs */
2714        stop_urb(s_priv->instat_urb);
2715        stop_urb(s_priv->glocont_urb);
2716        stop_urb(s_priv->indat_urb);
2717        for (i = 0; i < serial->num_ports; ++i) {
2718                port = serial->port[i];
2719                p_priv = usb_get_serial_port_data(port);
2720                stop_urb(p_priv->inack_urb);
2721                stop_urb(p_priv->outcont_urb);
2722                for (j = 0; j < 2; j++) {
2723                        stop_urb(p_priv->in_urbs[j]);
2724                        stop_urb(p_priv->out_urbs[j]);
2725                }
2726        }
2727
2728        /* Now free them */
2729        usb_free_urb(s_priv->instat_urb);
2730        usb_free_urb(s_priv->indat_urb);
2731        usb_free_urb(s_priv->glocont_urb);
2732        for (i = 0; i < serial->num_ports; ++i) {
2733                port = serial->port[i];
2734                p_priv = usb_get_serial_port_data(port);
2735                usb_free_urb(p_priv->inack_urb);
2736                usb_free_urb(p_priv->outcont_urb);
2737                for (j = 0; j < 2; j++) {
2738                        usb_free_urb(p_priv->in_urbs[j]);
2739                        usb_free_urb(p_priv->out_urbs[j]);
2740                }
2741        }
2742
2743        /*  dbg("Freeing serial->private."); */
2744        kfree(s_priv);
2745
2746        /*  dbg("Freeing port->private."); */
2747        /* Now free per port private data */
2748        for (i = 0; i < serial->num_ports; i++) {
2749                port = serial->port[i];
2750                kfree(usb_get_serial_port_data(port));
2751        }
2752}
2753
2754MODULE_AUTHOR( DRIVER_AUTHOR );
2755MODULE_DESCRIPTION( DRIVER_DESC );
2756MODULE_LICENSE("GPL");
2757
2758module_param(debug, bool, S_IRUGO | S_IWUSR);
2759MODULE_PARM_DESC(debug, "Debug enabled or not");
2760
2761