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