linux/drivers/usb/serial/visor.c
<<
>>
Prefs
   1/*
   2 * USB HandSpring Visor, Palm m50x, and Sony Clie driver
   3 * (supports all of the Palm OS USB devices)
   4 *
   5 *      Copyright (C) 1999 - 2004
   6 *          Greg Kroah-Hartman (greg@kroah.com)
   7 *
   8 *      This program is free software; you can redistribute it and/or
   9 *      modify it under the terms of the GNU General Public License version
  10 *      2 as published by the Free Software Foundation.
  11 *
  12 * See Documentation/usb/usb-serial.txt for more information on using this
  13 * driver
  14 *
  15 */
  16
  17#include <linux/kernel.h>
  18#include <linux/errno.h>
  19#include <linux/init.h>
  20#include <linux/slab.h>
  21#include <linux/tty.h>
  22#include <linux/tty_driver.h>
  23#include <linux/tty_flip.h>
  24#include <linux/module.h>
  25#include <linux/moduleparam.h>
  26#include <linux/spinlock.h>
  27#include <linux/uaccess.h>
  28#include <linux/usb.h>
  29#include <linux/usb/serial.h>
  30#include "visor.h"
  31
  32/*
  33 * Version Information
  34 */
  35#define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>"
  36#define DRIVER_DESC "USB HandSpring Visor / Palm OS driver"
  37
  38/* function prototypes for a handspring visor */
  39static int  visor_open(struct tty_struct *tty, struct usb_serial_port *port,
  40                                        struct file *filp);
  41static void visor_close(struct tty_struct *tty, struct usb_serial_port *port,
  42                                        struct file *filp);
  43static int  visor_write(struct tty_struct *tty, struct usb_serial_port *port,
  44                                        const unsigned char *buf, int count);
  45static int  visor_write_room(struct tty_struct *tty);
  46static void visor_throttle(struct tty_struct *tty);
  47static void visor_unthrottle(struct tty_struct *tty);
  48static int  visor_probe(struct usb_serial *serial,
  49                                        const struct usb_device_id *id);
  50static int  visor_calc_num_ports(struct usb_serial *serial);
  51static void visor_release(struct usb_serial *serial);
  52static void visor_write_bulk_callback(struct urb *urb);
  53static void visor_read_bulk_callback(struct urb *urb);
  54static void visor_read_int_callback(struct urb *urb);
  55static int  clie_3_5_startup(struct usb_serial *serial);
  56static int  treo_attach(struct usb_serial *serial);
  57static int clie_5_attach(struct usb_serial *serial);
  58static int palm_os_3_probe(struct usb_serial *serial,
  59                                        const struct usb_device_id *id);
  60static int palm_os_4_probe(struct usb_serial *serial,
  61                                        const struct usb_device_id *id);
  62
  63/* Parameters that may be passed into the module. */
  64static int debug;
  65static __u16 vendor;
  66static __u16 product;
  67
  68static struct usb_device_id id_table [] = {
  69        { USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_VISOR_ID),
  70                .driver_info = (kernel_ulong_t)&palm_os_3_probe },
  71        { USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_TREO_ID),
  72                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
  73        { USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_TREO600_ID),
  74                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
  75        { USB_DEVICE(GSPDA_VENDOR_ID, GSPDA_XPLORE_M68_ID),
  76                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
  77        { USB_DEVICE(PALM_VENDOR_ID, PALM_M500_ID),
  78                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
  79        { USB_DEVICE(PALM_VENDOR_ID, PALM_M505_ID),
  80                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
  81        { USB_DEVICE(PALM_VENDOR_ID, PALM_M515_ID),
  82                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
  83        { USB_DEVICE(PALM_VENDOR_ID, PALM_I705_ID),
  84                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
  85        { USB_DEVICE(PALM_VENDOR_ID, PALM_M100_ID),
  86                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
  87        { USB_DEVICE(PALM_VENDOR_ID, PALM_M125_ID),
  88                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
  89        { USB_DEVICE(PALM_VENDOR_ID, PALM_M130_ID),
  90                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
  91        { USB_DEVICE(PALM_VENDOR_ID, PALM_TUNGSTEN_T_ID),
  92                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
  93        { USB_DEVICE(PALM_VENDOR_ID, PALM_TREO_650),
  94                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
  95        { USB_DEVICE(PALM_VENDOR_ID, PALM_TUNGSTEN_Z_ID),
  96                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
  97        { USB_DEVICE(PALM_VENDOR_ID, PALM_ZIRE_ID),
  98                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
  99        { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_4_0_ID),
 100                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
 101        { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_S360_ID),
 102                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
 103        { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_4_1_ID),
 104                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
 105        { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_NX60_ID),
 106                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
 107        { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_NZ90V_ID),
 108                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
 109        { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_TJ25_ID),
 110                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
 111        { USB_DEVICE(ACER_VENDOR_ID, ACER_S10_ID),
 112                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
 113        { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_SCH_I330_ID),
 114                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
 115        { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_SPH_I500_ID),
 116                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
 117        { USB_DEVICE(TAPWAVE_VENDOR_ID, TAPWAVE_ZODIAC_ID),
 118                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
 119        { USB_DEVICE(GARMIN_VENDOR_ID, GARMIN_IQUE_3600_ID),
 120                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
 121        { USB_DEVICE(ACEECA_VENDOR_ID, ACEECA_MEZ1000_ID),
 122                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
 123        { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_7135_ID),
 124                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
 125        { USB_DEVICE(FOSSIL_VENDOR_ID, FOSSIL_ABACUS_ID),
 126                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
 127        { },                                    /* optional parameter entry */
 128        { }                                     /* Terminating entry */
 129};
 130
 131static struct usb_device_id clie_id_5_table [] = {
 132        { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_UX50_ID),
 133                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
 134        { },                                    /* optional parameter entry */
 135        { }                                     /* Terminating entry */
 136};
 137
 138static struct usb_device_id clie_id_3_5_table [] = {
 139        { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_3_5_ID) },
 140        { }                                     /* Terminating entry */
 141};
 142
 143static struct usb_device_id id_table_combined [] = {
 144        { USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_VISOR_ID) },
 145        { USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_TREO_ID) },
 146        { USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_TREO600_ID) },
 147        { USB_DEVICE(GSPDA_VENDOR_ID, GSPDA_XPLORE_M68_ID) },
 148        { USB_DEVICE(PALM_VENDOR_ID, PALM_M500_ID) },
 149        { USB_DEVICE(PALM_VENDOR_ID, PALM_M505_ID) },
 150        { USB_DEVICE(PALM_VENDOR_ID, PALM_M515_ID) },
 151        { USB_DEVICE(PALM_VENDOR_ID, PALM_I705_ID) },
 152        { USB_DEVICE(PALM_VENDOR_ID, PALM_M100_ID) },
 153        { USB_DEVICE(PALM_VENDOR_ID, PALM_M125_ID) },
 154        { USB_DEVICE(PALM_VENDOR_ID, PALM_M130_ID) },
 155        { USB_DEVICE(PALM_VENDOR_ID, PALM_TUNGSTEN_T_ID) },
 156        { USB_DEVICE(PALM_VENDOR_ID, PALM_TREO_650) },
 157        { USB_DEVICE(PALM_VENDOR_ID, PALM_TUNGSTEN_Z_ID) },
 158        { USB_DEVICE(PALM_VENDOR_ID, PALM_ZIRE_ID) },
 159        { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_3_5_ID) },
 160        { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_4_0_ID) },
 161        { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_S360_ID) },
 162        { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_4_1_ID) },
 163        { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_NX60_ID) },
 164        { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_NZ90V_ID) },
 165        { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_UX50_ID) },
 166        { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_TJ25_ID) },
 167        { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_SCH_I330_ID) },
 168        { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_SPH_I500_ID) },
 169        { USB_DEVICE(TAPWAVE_VENDOR_ID, TAPWAVE_ZODIAC_ID) },
 170        { USB_DEVICE(GARMIN_VENDOR_ID, GARMIN_IQUE_3600_ID) },
 171        { USB_DEVICE(ACEECA_VENDOR_ID, ACEECA_MEZ1000_ID) },
 172        { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_7135_ID) },
 173        { USB_DEVICE(FOSSIL_VENDOR_ID, FOSSIL_ABACUS_ID) },
 174        { },                                    /* optional parameter entry */
 175        { }                                     /* Terminating entry */
 176};
 177
 178MODULE_DEVICE_TABLE(usb, id_table_combined);
 179
 180static struct usb_driver visor_driver = {
 181        .name =         "visor",
 182        .probe =        usb_serial_probe,
 183        .disconnect =   usb_serial_disconnect,
 184        .id_table =     id_table_combined,
 185        .no_dynamic_id =        1,
 186};
 187
 188/* All of the device info needed for the Handspring Visor,
 189   and Palm 4.0 devices */
 190static struct usb_serial_driver handspring_device = {
 191        .driver = {
 192                .owner =        THIS_MODULE,
 193                .name =         "visor",
 194        },
 195        .description =          "Handspring Visor / Palm OS",
 196        .usb_driver =           &visor_driver,
 197        .id_table =             id_table,
 198        .num_ports =            2,
 199        .open =                 visor_open,
 200        .close =                visor_close,
 201        .throttle =             visor_throttle,
 202        .unthrottle =           visor_unthrottle,
 203        .attach =               treo_attach,
 204        .probe =                visor_probe,
 205        .calc_num_ports =       visor_calc_num_ports,
 206        .release =              visor_release,
 207        .write =                visor_write,
 208        .write_room =           visor_write_room,
 209        .write_bulk_callback =  visor_write_bulk_callback,
 210        .read_bulk_callback =   visor_read_bulk_callback,
 211        .read_int_callback =    visor_read_int_callback,
 212};
 213
 214/* All of the device info needed for the Clie UX50, TH55 Palm 5.0 devices */
 215static struct usb_serial_driver clie_5_device = {
 216        .driver = {
 217                .owner =        THIS_MODULE,
 218                .name =         "clie_5",
 219        },
 220        .description =          "Sony Clie 5.0",
 221        .usb_driver =           &visor_driver,
 222        .id_table =             clie_id_5_table,
 223        .num_ports =            2,
 224        .open =                 visor_open,
 225        .close =                visor_close,
 226        .throttle =             visor_throttle,
 227        .unthrottle =           visor_unthrottle,
 228        .attach =               clie_5_attach,
 229        .probe =                visor_probe,
 230        .calc_num_ports =       visor_calc_num_ports,
 231        .release =              visor_release,
 232        .write =                visor_write,
 233        .write_room =           visor_write_room,
 234        .write_bulk_callback =  visor_write_bulk_callback,
 235        .read_bulk_callback =   visor_read_bulk_callback,
 236        .read_int_callback =    visor_read_int_callback,
 237};
 238
 239/* device info for the Sony Clie OS version 3.5 */
 240static struct usb_serial_driver clie_3_5_device = {
 241        .driver = {
 242                .owner =        THIS_MODULE,
 243                .name =         "clie_3.5",
 244        },
 245        .description =          "Sony Clie 3.5",
 246        .usb_driver =           &visor_driver,
 247        .id_table =             clie_id_3_5_table,
 248        .num_ports =            1,
 249        .open =                 visor_open,
 250        .close =                visor_close,
 251        .throttle =             visor_throttle,
 252        .unthrottle =           visor_unthrottle,
 253        .attach =               clie_3_5_startup,
 254        .write =                visor_write,
 255        .write_room =           visor_write_room,
 256        .write_bulk_callback =  visor_write_bulk_callback,
 257        .read_bulk_callback =   visor_read_bulk_callback,
 258};
 259
 260struct visor_private {
 261        spinlock_t lock;
 262        int bytes_in;
 263        int bytes_out;
 264        int outstanding_urbs;
 265        unsigned char throttled;
 266        unsigned char actually_throttled;
 267};
 268
 269/* number of outstanding urbs to prevent userspace DoS from happening */
 270#define URB_UPPER_LIMIT 42
 271
 272static int stats;
 273
 274/******************************************************************************
 275 * Handspring Visor specific driver functions
 276 ******************************************************************************/
 277static int visor_open(struct tty_struct *tty, struct usb_serial_port *port,
 278                                                        struct file *filp)
 279{
 280        struct usb_serial *serial = port->serial;
 281        struct visor_private *priv = usb_get_serial_port_data(port);
 282        unsigned long flags;
 283        int result = 0;
 284
 285        dbg("%s - port %d", __func__, port->number);
 286
 287        if (!port->read_urb) {
 288                /* this is needed for some brain dead Sony devices */
 289                dev_err(&port->dev, "Device lied about number of ports, please use a lower one.\n");
 290                return -ENODEV;
 291        }
 292
 293        spin_lock_irqsave(&priv->lock, flags);
 294        priv->bytes_in = 0;
 295        priv->bytes_out = 0;
 296        priv->throttled = 0;
 297        spin_unlock_irqrestore(&priv->lock, flags);
 298
 299        /* Start reading from the device */
 300        usb_fill_bulk_urb(port->read_urb, serial->dev,
 301                           usb_rcvbulkpipe(serial->dev,
 302                                            port->bulk_in_endpointAddress),
 303                           port->read_urb->transfer_buffer,
 304                           port->read_urb->transfer_buffer_length,
 305                           visor_read_bulk_callback, port);
 306        result = usb_submit_urb(port->read_urb, GFP_KERNEL);
 307        if (result) {
 308                dev_err(&port->dev,
 309                        "%s - failed submitting read urb, error %d\n",
 310                                                        __func__, result);
 311                goto exit;
 312        }
 313
 314        if (port->interrupt_in_urb) {
 315                dbg("%s - adding interrupt input for treo", __func__);
 316                result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
 317                if (result)
 318                        dev_err(&port->dev,
 319                            "%s - failed submitting interrupt urb, error %d\n",
 320                                                        __func__, result);
 321        }
 322exit:
 323        return result;
 324}
 325
 326
 327static void visor_close(struct tty_struct *tty,
 328                        struct usb_serial_port *port, struct file *filp)
 329{
 330        struct visor_private *priv = usb_get_serial_port_data(port);
 331        unsigned char *transfer_buffer;
 332
 333        dbg("%s - port %d", __func__, port->number);
 334
 335        /* shutdown our urbs */
 336        usb_kill_urb(port->read_urb);
 337        usb_kill_urb(port->interrupt_in_urb);
 338
 339        mutex_lock(&port->serial->disc_mutex);
 340        if (!port->serial->disconnected) {
 341                /* Try to send shutdown message, unless the device is gone */
 342                transfer_buffer =  kmalloc(0x12, GFP_KERNEL);
 343                if (transfer_buffer) {
 344                        usb_control_msg(port->serial->dev,
 345                                         usb_rcvctrlpipe(port->serial->dev, 0),
 346                                         VISOR_CLOSE_NOTIFICATION, 0xc2,
 347                                         0x0000, 0x0000,
 348                                         transfer_buffer, 0x12, 300);
 349                        kfree(transfer_buffer);
 350                }
 351        }
 352        mutex_unlock(&port->serial->disc_mutex);
 353
 354        if (stats)
 355                dev_info(&port->dev, "Bytes In = %d  Bytes Out = %d\n",
 356                         priv->bytes_in, priv->bytes_out);
 357}
 358
 359
 360static int visor_write(struct tty_struct *tty, struct usb_serial_port *port,
 361                                        const unsigned char *buf, int count)
 362{
 363        struct visor_private *priv = usb_get_serial_port_data(port);
 364        struct usb_serial *serial = port->serial;
 365        struct urb *urb;
 366        unsigned char *buffer;
 367        unsigned long flags;
 368        int status;
 369
 370        dbg("%s - port %d", __func__, port->number);
 371
 372        spin_lock_irqsave(&priv->lock, flags);
 373        if (priv->outstanding_urbs > URB_UPPER_LIMIT) {
 374                spin_unlock_irqrestore(&priv->lock, flags);
 375                dbg("%s - write limit hit\n", __func__);
 376                return 0;
 377        }
 378        priv->outstanding_urbs++;
 379        spin_unlock_irqrestore(&priv->lock, flags);
 380
 381        buffer = kmalloc(count, GFP_ATOMIC);
 382        if (!buffer) {
 383                dev_err(&port->dev, "out of memory\n");
 384                count = -ENOMEM;
 385                goto error_no_buffer;
 386        }
 387
 388        urb = usb_alloc_urb(0, GFP_ATOMIC);
 389        if (!urb) {
 390                dev_err(&port->dev, "no more free urbs\n");
 391                count = -ENOMEM;
 392                goto error_no_urb;
 393        }
 394
 395        memcpy(buffer, buf, count);
 396
 397        usb_serial_debug_data(debug, &port->dev, __func__, count, buffer);
 398
 399        usb_fill_bulk_urb(urb, serial->dev,
 400                           usb_sndbulkpipe(serial->dev,
 401                                            port->bulk_out_endpointAddress),
 402                           buffer, count,
 403                           visor_write_bulk_callback, port);
 404
 405        /* send it down the pipe */
 406        status = usb_submit_urb(urb, GFP_ATOMIC);
 407        if (status) {
 408                dev_err(&port->dev,
 409                   "%s - usb_submit_urb(write bulk) failed with status = %d\n",
 410                                                        __func__, status);
 411                count = status;
 412                goto error;
 413        } else {
 414                spin_lock_irqsave(&priv->lock, flags);
 415                priv->bytes_out += count;
 416                spin_unlock_irqrestore(&priv->lock, flags);
 417        }
 418
 419        /* we are done with this urb, so let the host driver
 420         * really free it when it is finished with it */
 421        usb_free_urb(urb);
 422
 423        return count;
 424error:
 425        usb_free_urb(urb);
 426error_no_urb:
 427        kfree(buffer);
 428error_no_buffer:
 429        spin_lock_irqsave(&priv->lock, flags);
 430        --priv->outstanding_urbs;
 431        spin_unlock_irqrestore(&priv->lock, flags);
 432        return count;
 433}
 434
 435
 436static int visor_write_room(struct tty_struct *tty)
 437{
 438        struct usb_serial_port *port = tty->driver_data;
 439        struct visor_private *priv = usb_get_serial_port_data(port);
 440        unsigned long flags;
 441
 442        dbg("%s - port %d", __func__, port->number);
 443
 444        /*
 445         * We really can take anything the user throws at us
 446         * but let's pick a nice big number to tell the tty
 447         * layer that we have lots of free space, unless we don't.
 448         */
 449
 450        spin_lock_irqsave(&priv->lock, flags);
 451        if (priv->outstanding_urbs > URB_UPPER_LIMIT * 2 / 3) {
 452                spin_unlock_irqrestore(&priv->lock, flags);
 453                dbg("%s - write limit hit\n", __func__);
 454                return 0;
 455        }
 456        spin_unlock_irqrestore(&priv->lock, flags);
 457
 458        return 2048;
 459}
 460
 461
 462static void visor_write_bulk_callback(struct urb *urb)
 463{
 464        struct usb_serial_port *port = urb->context;
 465        struct visor_private *priv = usb_get_serial_port_data(port);
 466        int status = urb->status;
 467        unsigned long flags;
 468
 469        /* free up the transfer buffer, as usb_free_urb() does not do this */
 470        kfree(urb->transfer_buffer);
 471
 472        dbg("%s - port %d", __func__, port->number);
 473
 474        if (status)
 475                dbg("%s - nonzero write bulk status received: %d",
 476                    __func__, status);
 477
 478        spin_lock_irqsave(&priv->lock, flags);
 479        --priv->outstanding_urbs;
 480        spin_unlock_irqrestore(&priv->lock, flags);
 481
 482        usb_serial_port_softint(port);
 483}
 484
 485
 486static void visor_read_bulk_callback(struct urb *urb)
 487{
 488        struct usb_serial_port *port = urb->context;
 489        struct visor_private *priv = usb_get_serial_port_data(port);
 490        unsigned char *data = urb->transfer_buffer;
 491        int status = urb->status;
 492        struct tty_struct *tty;
 493        int result;
 494        int available_room;
 495
 496        dbg("%s - port %d", __func__, port->number);
 497
 498        if (status) {
 499                dbg("%s - nonzero read bulk status received: %d",
 500                    __func__, status);
 501                return;
 502        }
 503
 504        usb_serial_debug_data(debug, &port->dev, __func__,
 505                                                urb->actual_length, data);
 506
 507        tty = port->port.tty;
 508        if (tty && urb->actual_length) {
 509                available_room = tty_buffer_request_room(tty,
 510                                                        urb->actual_length);
 511                if (available_room) {
 512                        tty_insert_flip_string(tty, data, available_room);
 513                        tty_flip_buffer_push(tty);
 514                }
 515                spin_lock(&priv->lock);
 516                priv->bytes_in += available_room;
 517
 518        } else {
 519                spin_lock(&priv->lock);
 520        }
 521
 522        /* Continue trying to always read if we should */
 523        if (!priv->throttled) {
 524                usb_fill_bulk_urb(port->read_urb, port->serial->dev,
 525                                   usb_rcvbulkpipe(port->serial->dev,
 526                                           port->bulk_in_endpointAddress),
 527                                   port->read_urb->transfer_buffer,
 528                                   port->read_urb->transfer_buffer_length,
 529                                   visor_read_bulk_callback, port);
 530                result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
 531                if (result)
 532                        dev_err(&port->dev,
 533                            "%s - failed resubmitting read urb, error %d\n",
 534                                                        __func__, result);
 535        } else
 536                priv->actually_throttled = 1;
 537        spin_unlock(&priv->lock);
 538}
 539
 540static void visor_read_int_callback(struct urb *urb)
 541{
 542        struct usb_serial_port *port = urb->context;
 543        int status = urb->status;
 544        int result;
 545
 546        switch (status) {
 547        case 0:
 548                /* success */
 549                break;
 550        case -ECONNRESET:
 551        case -ENOENT:
 552        case -ESHUTDOWN:
 553                /* this urb is terminated, clean up */
 554                dbg("%s - urb shutting down with status: %d",
 555                    __func__, status);
 556                return;
 557        default:
 558                dbg("%s - nonzero urb status received: %d",
 559                    __func__, status);
 560                goto exit;
 561        }
 562
 563        /*
 564         * This information is still unknown what it can be used for.
 565         * If anyone has an idea, please let the author know...
 566         *
 567         * Rumor has it this endpoint is used to notify when data
 568         * is ready to be read from the bulk ones.
 569         */
 570        usb_serial_debug_data(debug, &port->dev, __func__,
 571                              urb->actual_length, urb->transfer_buffer);
 572
 573exit:
 574        result = usb_submit_urb(urb, GFP_ATOMIC);
 575        if (result)
 576                dev_err(&urb->dev->dev,
 577                                "%s - Error %d submitting interrupt urb\n",
 578                                                        __func__, result);
 579}
 580
 581static void visor_throttle(struct tty_struct *tty)
 582{
 583        struct usb_serial_port *port = tty->driver_data;
 584        struct visor_private *priv = usb_get_serial_port_data(port);
 585        unsigned long flags;
 586
 587        dbg("%s - port %d", __func__, port->number);
 588        spin_lock_irqsave(&priv->lock, flags);
 589        priv->throttled = 1;
 590        spin_unlock_irqrestore(&priv->lock, flags);
 591}
 592
 593
 594static void visor_unthrottle(struct tty_struct *tty)
 595{
 596        struct usb_serial_port *port = tty->driver_data;
 597        struct visor_private *priv = usb_get_serial_port_data(port);
 598        unsigned long flags;
 599        int result;
 600
 601        dbg("%s - port %d", __func__, port->number);
 602        spin_lock_irqsave(&priv->lock, flags);
 603        priv->throttled = 0;
 604        priv->actually_throttled = 0;
 605        spin_unlock_irqrestore(&priv->lock, flags);
 606
 607        port->read_urb->dev = port->serial->dev;
 608        result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
 609        if (result)
 610                dev_err(&port->dev,
 611                        "%s - failed submitting read urb, error %d\n",
 612                                                        __func__, result);
 613}
 614
 615static int palm_os_3_probe(struct usb_serial *serial,
 616                                                const struct usb_device_id *id)
 617{
 618        struct device *dev = &serial->dev->dev;
 619        struct visor_connection_info *connection_info;
 620        unsigned char *transfer_buffer;
 621        char *string;
 622        int retval = 0;
 623        int i;
 624        int num_ports = 0;
 625
 626        dbg("%s", __func__);
 627
 628        transfer_buffer = kmalloc(sizeof(*connection_info), GFP_KERNEL);
 629        if (!transfer_buffer) {
 630                dev_err(dev, "%s - kmalloc(%Zd) failed.\n", __func__,
 631                        sizeof(*connection_info));
 632                return -ENOMEM;
 633        }
 634
 635        /* send a get connection info request */
 636        retval = usb_control_msg(serial->dev,
 637                                  usb_rcvctrlpipe(serial->dev, 0),
 638                                  VISOR_GET_CONNECTION_INFORMATION,
 639                                  0xc2, 0x0000, 0x0000, transfer_buffer,
 640                                  sizeof(*connection_info), 300);
 641        if (retval < 0) {
 642                dev_err(dev, "%s - error %d getting connection information\n",
 643                        __func__, retval);
 644                goto exit;
 645        }
 646
 647        if (retval == sizeof(*connection_info)) {
 648                        connection_info = (struct visor_connection_info *)
 649                                                        transfer_buffer;
 650
 651                num_ports = le16_to_cpu(connection_info->num_ports);
 652                for (i = 0; i < num_ports; ++i) {
 653                        switch (
 654                           connection_info->connections[i].port_function_id) {
 655                        case VISOR_FUNCTION_GENERIC:
 656                                string = "Generic";
 657                                break;
 658                        case VISOR_FUNCTION_DEBUGGER:
 659                                string = "Debugger";
 660                                break;
 661                        case VISOR_FUNCTION_HOTSYNC:
 662                                string = "HotSync";
 663                                break;
 664                        case VISOR_FUNCTION_CONSOLE:
 665                                string = "Console";
 666                                break;
 667                        case VISOR_FUNCTION_REMOTE_FILE_SYS:
 668                                string = "Remote File System";
 669                                break;
 670                        default:
 671                                string = "unknown";
 672                                break;
 673                        }
 674                        dev_info(dev, "%s: port %d, is for %s use\n",
 675                                serial->type->description,
 676                                connection_info->connections[i].port, string);
 677                }
 678        }
 679        /*
 680        * Handle devices that report invalid stuff here.
 681        */
 682        if (num_ports == 0 || num_ports > 2) {
 683                dev_warn(dev, "%s: No valid connect info available\n",
 684                        serial->type->description);
 685                num_ports = 2;
 686        }
 687
 688        dev_info(dev, "%s: Number of ports: %d\n", serial->type->description,
 689                num_ports);
 690
 691        /*
 692         * save off our num_ports info so that we can use it in the
 693         * calc_num_ports callback
 694         */
 695        usb_set_serial_data(serial, (void *)(long)num_ports);
 696
 697        /* ask for the number of bytes available, but ignore the
 698           response as it is broken */
 699        retval = usb_control_msg(serial->dev,
 700                                  usb_rcvctrlpipe(serial->dev, 0),
 701                                  VISOR_REQUEST_BYTES_AVAILABLE,
 702                                  0xc2, 0x0000, 0x0005, transfer_buffer,
 703                                  0x02, 300);
 704        if (retval < 0)
 705                dev_err(dev, "%s - error %d getting bytes available request\n",
 706                        __func__, retval);
 707        retval = 0;
 708
 709exit:
 710        kfree(transfer_buffer);
 711
 712        return retval;
 713}
 714
 715static int palm_os_4_probe(struct usb_serial *serial,
 716                                                const struct usb_device_id *id)
 717{
 718        struct device *dev = &serial->dev->dev;
 719        struct palm_ext_connection_info *connection_info;
 720        unsigned char *transfer_buffer;
 721        int retval;
 722
 723        dbg("%s", __func__);
 724
 725        transfer_buffer =  kmalloc(sizeof(*connection_info), GFP_KERNEL);
 726        if (!transfer_buffer) {
 727                dev_err(dev, "%s - kmalloc(%Zd) failed.\n", __func__,
 728                        sizeof(*connection_info));
 729                return -ENOMEM;
 730        }
 731
 732        retval = usb_control_msg(serial->dev,
 733                                  usb_rcvctrlpipe(serial->dev, 0),
 734                                  PALM_GET_EXT_CONNECTION_INFORMATION,
 735                                  0xc2, 0x0000, 0x0000, transfer_buffer,
 736                                  sizeof(*connection_info), 300);
 737        if (retval < 0)
 738                dev_err(dev, "%s - error %d getting connection info\n",
 739                        __func__, retval);
 740        else
 741                usb_serial_debug_data(debug, &serial->dev->dev, __func__,
 742                                      retval, transfer_buffer);
 743
 744        kfree(transfer_buffer);
 745        return 0;
 746}
 747
 748
 749static int visor_probe(struct usb_serial *serial,
 750                                        const struct usb_device_id *id)
 751{
 752        int retval = 0;
 753        int (*startup)(struct usb_serial *serial,
 754                                        const struct usb_device_id *id);
 755
 756        dbg("%s", __func__);
 757
 758        if (serial->dev->actconfig->desc.bConfigurationValue != 1) {
 759                err("active config #%d != 1 ??",
 760                        serial->dev->actconfig->desc.bConfigurationValue);
 761                return -ENODEV;
 762        }
 763
 764        if (id->driver_info) {
 765                startup = (void *)id->driver_info;
 766                retval = startup(serial, id);
 767        }
 768
 769        return retval;
 770}
 771
 772static int visor_calc_num_ports(struct usb_serial *serial)
 773{
 774        int num_ports = (int)(long)(usb_get_serial_data(serial));
 775
 776        if (num_ports)
 777                usb_set_serial_data(serial, NULL);
 778
 779        return num_ports;
 780}
 781
 782static int generic_startup(struct usb_serial *serial)
 783{
 784        struct usb_serial_port **ports = serial->port;
 785        struct visor_private *priv;
 786        int i;
 787
 788        for (i = 0; i < serial->num_ports; ++i) {
 789                priv = kzalloc(sizeof(*priv), GFP_KERNEL);
 790                if (!priv) {
 791                        while (i-- != 0) {
 792                                priv = usb_get_serial_port_data(ports[i]);
 793                                usb_set_serial_port_data(ports[i], NULL);
 794                                kfree(priv);
 795                        }
 796                        return -ENOMEM;
 797                }
 798                spin_lock_init(&priv->lock);
 799                usb_set_serial_port_data(ports[i], priv);
 800        }
 801        return 0;
 802}
 803
 804static int clie_3_5_startup(struct usb_serial *serial)
 805{
 806        struct device *dev = &serial->dev->dev;
 807        int result;
 808        u8 data;
 809
 810        dbg("%s", __func__);
 811
 812        /*
 813         * Note that PEG-300 series devices expect the following two calls.
 814         */
 815
 816        /* get the config number */
 817        result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
 818                                  USB_REQ_GET_CONFIGURATION, USB_DIR_IN,
 819                                  0, 0, &data, 1, 3000);
 820        if (result < 0) {
 821                dev_err(dev, "%s: get config number failed: %d\n",
 822                                                        __func__, result);
 823                return result;
 824        }
 825        if (result != 1) {
 826                dev_err(dev, "%s: get config number bad return length: %d\n",
 827                                                        __func__, result);
 828                return -EIO;
 829        }
 830
 831        /* get the interface number */
 832        result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
 833                                  USB_REQ_GET_INTERFACE,
 834                                  USB_DIR_IN | USB_RECIP_INTERFACE,
 835                                  0, 0, &data, 1, 3000);
 836        if (result < 0) {
 837                dev_err(dev, "%s: get interface number failed: %d\n",
 838                                                        __func__, result);
 839                return result;
 840        }
 841        if (result != 1) {
 842                dev_err(dev,
 843                        "%s: get interface number bad return length: %d\n",
 844                                                        __func__, result);
 845                return -EIO;
 846        }
 847
 848        return generic_startup(serial);
 849}
 850
 851static int treo_attach(struct usb_serial *serial)
 852{
 853        struct usb_serial_port *swap_port;
 854
 855        /* Only do this endpoint hack for the Handspring devices with
 856         * interrupt in endpoints, which for now are the Treo devices. */
 857        if (!((le16_to_cpu(serial->dev->descriptor.idVendor)
 858                                                == HANDSPRING_VENDOR_ID) ||
 859                (le16_to_cpu(serial->dev->descriptor.idVendor)
 860                                                == KYOCERA_VENDOR_ID)) ||
 861                (serial->num_interrupt_in == 0))
 862                goto generic_startup;
 863
 864        dbg("%s", __func__);
 865
 866        /*
 867        * It appears that Treos and Kyoceras want to use the
 868        * 1st bulk in endpoint to communicate with the 2nd bulk out endpoint,
 869        * so let's swap the 1st and 2nd bulk in and interrupt endpoints.
 870        * Note that swapping the bulk out endpoints would break lots of
 871        * apps that want to communicate on the second port.
 872        */
 873#define COPY_PORT(dest, src)                                            \
 874        do { \
 875                dest->read_urb = src->read_urb;                         \
 876                dest->bulk_in_endpointAddress = src->bulk_in_endpointAddress;\
 877                dest->bulk_in_buffer = src->bulk_in_buffer;             \
 878                dest->interrupt_in_urb = src->interrupt_in_urb;         \
 879                dest->interrupt_in_endpointAddress = \
 880                                        src->interrupt_in_endpointAddress;\
 881                dest->interrupt_in_buffer = src->interrupt_in_buffer;   \
 882        } while (0);
 883
 884        swap_port = kmalloc(sizeof(*swap_port), GFP_KERNEL);
 885        if (!swap_port)
 886                return -ENOMEM;
 887        COPY_PORT(swap_port, serial->port[0]);
 888        COPY_PORT(serial->port[0], serial->port[1]);
 889        COPY_PORT(serial->port[1], swap_port);
 890        kfree(swap_port);
 891
 892generic_startup:
 893        return generic_startup(serial);
 894}
 895
 896static int clie_5_attach(struct usb_serial *serial)
 897{
 898        dbg("%s", __func__);
 899
 900        /* TH55 registers 2 ports.
 901           Communication in from the UX50/TH55 uses bulk_in_endpointAddress
 902           from port 0. Communication out to the UX50/TH55 uses
 903           bulk_out_endpointAddress from port 1
 904
 905           Lets do a quick and dirty mapping
 906         */
 907
 908        /* some sanity check */
 909        if (serial->num_ports < 2)
 910                return -1;
 911
 912        /* port 0 now uses the modified endpoint Address */
 913        serial->port[0]->bulk_out_endpointAddress =
 914                                serial->port[1]->bulk_out_endpointAddress;
 915
 916        return generic_startup(serial);
 917}
 918
 919static void visor_release(struct usb_serial *serial)
 920{
 921        struct visor_private *priv;
 922        int i;
 923
 924        dbg("%s", __func__);
 925
 926        for (i = 0; i < serial->num_ports; i++) {
 927                priv = usb_get_serial_port_data(serial->port[i]);
 928                kfree(priv);
 929        }
 930}
 931
 932static int __init visor_init(void)
 933{
 934        int i, retval;
 935        /* Only if parameters were passed to us */
 936        if (vendor > 0 && product > 0) {
 937                struct usb_device_id usb_dev_temp[] = {
 938                        {
 939                                USB_DEVICE(vendor, product),
 940                                .driver_info =
 941                                        (kernel_ulong_t) &palm_os_4_probe
 942                        }
 943                };
 944
 945                /* Find the last entry in id_table */
 946                for (i = 0;; i++) {
 947                        if (id_table[i].idVendor == 0) {
 948                                id_table[i] = usb_dev_temp[0];
 949                                break;
 950                        }
 951                }
 952                /* Find the last entry in id_table_combined */
 953                for (i = 0;; i++) {
 954                        if (id_table_combined[i].idVendor == 0) {
 955                                id_table_combined[i] = usb_dev_temp[0];
 956                                break;
 957                        }
 958                }
 959                info(
 960                  "Untested USB device specified at time of module insertion");
 961                info("Warning: This is not guaranteed to work");
 962                info("Using a newer kernel is preferred to this method");
 963                info("Adding Palm OS protocol 4.x support for unknown device: 0x%x/0x%x",
 964                        vendor, product);
 965        }
 966        retval = usb_serial_register(&handspring_device);
 967        if (retval)
 968                goto failed_handspring_register;
 969        retval = usb_serial_register(&clie_3_5_device);
 970        if (retval)
 971                goto failed_clie_3_5_register;
 972        retval = usb_serial_register(&clie_5_device);
 973        if (retval)
 974                goto failed_clie_5_register;
 975        retval = usb_register(&visor_driver);
 976        if (retval)
 977                goto failed_usb_register;
 978        info(DRIVER_DESC);
 979
 980        return 0;
 981failed_usb_register:
 982        usb_serial_deregister(&clie_5_device);
 983failed_clie_5_register:
 984        usb_serial_deregister(&clie_3_5_device);
 985failed_clie_3_5_register:
 986        usb_serial_deregister(&handspring_device);
 987failed_handspring_register:
 988        return retval;
 989}
 990
 991
 992static void __exit visor_exit (void)
 993{
 994        usb_deregister(&visor_driver);
 995        usb_serial_deregister(&handspring_device);
 996        usb_serial_deregister(&clie_3_5_device);
 997        usb_serial_deregister(&clie_5_device);
 998}
 999
1000
1001module_init(visor_init);
1002module_exit(visor_exit);
1003
1004MODULE_AUTHOR(DRIVER_AUTHOR);
1005MODULE_DESCRIPTION(DRIVER_DESC);
1006MODULE_LICENSE("GPL");
1007
1008module_param(debug, bool, S_IRUGO | S_IWUSR);
1009MODULE_PARM_DESC(debug, "Debug enabled or not");
1010module_param(stats, bool, S_IRUGO | S_IWUSR);
1011MODULE_PARM_DESC(stats, "Enables statistics or not");
1012
1013module_param(vendor, ushort, 0);
1014MODULE_PARM_DESC(vendor, "User specified vendor ID");
1015module_param(product, ushort, 0);
1016MODULE_PARM_DESC(product, "User specified product ID");
1017
1018
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.