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