linux/drivers/usb/serial/sierra.c
<<
>>
Prefs
   1/*
   2  USB Driver for Sierra Wireless
   3
   4  Copyright (C) 2006, 2007, 2008  Kevin Lloyd <klloyd@sierrawireless.com>,
   5
   6  Copyright (C) 2008, 2009  Elina Pasheva, Matthew Safar, Rory Filer
   7                        <linux@sierrawireless.com>
   8
   9  IMPORTANT DISCLAIMER: This driver is not commercially supported by
  10  Sierra Wireless. Use at your own risk.
  11
  12  This driver is free software; you can redistribute it and/or modify
  13  it under the terms of Version 2 of the GNU General Public License as
  14  published by the Free Software Foundation.
  15
  16  Portions based on the option driver by Matthias Urlichs <smurf@smurf.noris.de>
  17  Whom based his on the Keyspan driver by Hugh Blemings <hugh@blemings.org>
  18*/
  19/* Uncomment to log function calls */
  20/* #define DEBUG */
  21#define DRIVER_VERSION "v.1.7.16"
  22#define DRIVER_AUTHOR "Kevin Lloyd, Elina Pasheva, Matthew Safar, Rory Filer"
  23#define DRIVER_DESC "USB Driver for Sierra Wireless USB modems"
  24
  25#include <linux/kernel.h>
  26#include <linux/jiffies.h>
  27#include <linux/errno.h>
  28#include <linux/tty.h>
  29#include <linux/slab.h>
  30#include <linux/tty_flip.h>
  31#include <linux/module.h>
  32#include <linux/usb.h>
  33#include <linux/usb/serial.h>
  34
  35#define SWIMS_USB_REQUEST_SetPower      0x00
  36#define SWIMS_USB_REQUEST_SetNmea       0x07
  37
  38#define N_IN_URB_HM     8
  39#define N_OUT_URB_HM    64
  40#define N_IN_URB        4
  41#define N_OUT_URB       4
  42#define IN_BUFLEN       4096
  43
  44#define MAX_TRANSFER            (PAGE_SIZE - 512)
  45/* MAX_TRANSFER is chosen so that the VM is not stressed by
  46   allocations > PAGE_SIZE and the number of packets in a page
  47   is an integer 512 is the largest possible packet on EHCI */
  48
  49static int debug;
  50static int nmea;
  51
  52/* Used in interface blacklisting */
  53struct sierra_iface_info {
  54        const u32 infolen;      /* number of interface numbers on blacklist */
  55        const u8  *ifaceinfo;   /* pointer to the array holding the numbers */
  56};
  57
  58struct sierra_intf_private {
  59        spinlock_t susp_lock;
  60        unsigned int suspended:1;
  61        int in_flight;
  62};
  63
  64static int sierra_set_power_state(struct usb_device *udev, __u16 swiState)
  65{
  66        int result;
  67        dev_dbg(&udev->dev, "%s\n", __func__);
  68        result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
  69                        SWIMS_USB_REQUEST_SetPower,     /* __u8 request      */
  70                        USB_TYPE_VENDOR,                /* __u8 request type */
  71                        swiState,                       /* __u16 value       */
  72                        0,                              /* __u16 index       */
  73                        NULL,                           /* void *data        */
  74                        0,                              /* __u16 size        */
  75                        USB_CTRL_SET_TIMEOUT);          /* int timeout       */
  76        return result;
  77}
  78
  79static int sierra_vsc_set_nmea(struct usb_device *udev, __u16 enable)
  80{
  81        int result;
  82        dev_dbg(&udev->dev, "%s\n", __func__);
  83        result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
  84                        SWIMS_USB_REQUEST_SetNmea,      /* __u8 request      */
  85                        USB_TYPE_VENDOR,                /* __u8 request type */
  86                        enable,                         /* __u16 value       */
  87                        0x0000,                         /* __u16 index       */
  88                        NULL,                           /* void *data        */
  89                        0,                              /* __u16 size        */
  90                        USB_CTRL_SET_TIMEOUT);          /* int timeout       */
  91        return result;
  92}
  93
  94static int sierra_calc_num_ports(struct usb_serial *serial)
  95{
  96        int num_ports = 0;
  97        u8 ifnum, numendpoints;
  98
  99        dev_dbg(&serial->dev->dev, "%s\n", __func__);
 100
 101        ifnum = serial->interface->cur_altsetting->desc.bInterfaceNumber;
 102        numendpoints = serial->interface->cur_altsetting->desc.bNumEndpoints;
 103
 104        /* Dummy interface present on some SKUs should be ignored */
 105        if (ifnum == 0x99)
 106                num_ports = 0;
 107        else if (numendpoints <= 3)
 108                num_ports = 1;
 109        else
 110                num_ports = (numendpoints-1)/2;
 111        return num_ports;
 112}
 113
 114static int is_blacklisted(const u8 ifnum,
 115                                const struct sierra_iface_info *blacklist)
 116{
 117        const u8  *info;
 118        int i;
 119
 120        if (blacklist) {
 121                info = blacklist->ifaceinfo;
 122
 123                for (i = 0; i < blacklist->infolen; i++) {
 124                        if (info[i] == ifnum)
 125                                return 1;
 126                }
 127        }
 128        return 0;
 129}
 130
 131static int is_himemory(const u8 ifnum,
 132                                const struct sierra_iface_info *himemorylist)
 133{
 134        const u8  *info;
 135        int i;
 136
 137        if (himemorylist) {
 138                info = himemorylist->ifaceinfo;
 139
 140                for (i=0; i < himemorylist->infolen; i++) {
 141                        if (info[i] == ifnum)
 142                                return 1;
 143                }
 144        }
 145        return 0;
 146}
 147
 148static int sierra_calc_interface(struct usb_serial *serial)
 149{
 150        int interface;
 151        struct usb_interface *p_interface;
 152        struct usb_host_interface *p_host_interface;
 153        dev_dbg(&serial->dev->dev, "%s\n", __func__);
 154
 155        /* Get the interface structure pointer from the serial struct */
 156        p_interface = serial->interface;
 157
 158        /* Get a pointer to the host interface structure */
 159        p_host_interface = p_interface->cur_altsetting;
 160
 161        /* read the interface descriptor for this active altsetting
 162         * to find out the interface number we are on
 163        */
 164        interface = p_host_interface->desc.bInterfaceNumber;
 165
 166        return interface;
 167}
 168
 169static int sierra_probe(struct usb_serial *serial,
 170                        const struct usb_device_id *id)
 171{
 172        int result = 0;
 173        struct usb_device *udev;
 174        struct sierra_intf_private *data;
 175        u8 ifnum;
 176
 177        udev = serial->dev;
 178        dev_dbg(&udev->dev, "%s\n", __func__);
 179
 180        ifnum = sierra_calc_interface(serial);
 181        /*
 182         * If this interface supports more than 1 alternate
 183         * select the 2nd one
 184         */
 185        if (serial->interface->num_altsetting == 2) {
 186                dev_dbg(&udev->dev, "Selecting alt setting for interface %d\n",
 187                        ifnum);
 188                /* We know the alternate setting is 1 for the MC8785 */
 189                usb_set_interface(udev, ifnum, 1);
 190        }
 191
 192        /* ifnum could have changed - by calling usb_set_interface */
 193        ifnum = sierra_calc_interface(serial);
 194
 195        if (is_blacklisted(ifnum,
 196                                (struct sierra_iface_info *)id->driver_info)) {
 197                dev_dbg(&serial->dev->dev,
 198                        "Ignoring blacklisted interface #%d\n", ifnum);
 199                return -ENODEV;
 200        }
 201
 202        data = serial->private = kzalloc(sizeof(struct sierra_intf_private), GFP_KERNEL);
 203        if (!data)
 204                return -ENOMEM;
 205        spin_lock_init(&data->susp_lock);
 206
 207        return result;
 208}
 209
 210/* interfaces with higher memory requirements */
 211static const u8 hi_memory_typeA_ifaces[] = { 0, 2 };
 212static const struct sierra_iface_info typeA_interface_list = {
 213        .infolen = ARRAY_SIZE(hi_memory_typeA_ifaces),
 214        .ifaceinfo = hi_memory_typeA_ifaces,
 215};
 216
 217static const u8 hi_memory_typeB_ifaces[] = { 3, 4, 5, 6 };
 218static const struct sierra_iface_info typeB_interface_list = {
 219        .infolen = ARRAY_SIZE(hi_memory_typeB_ifaces),
 220        .ifaceinfo = hi_memory_typeB_ifaces,
 221};
 222
 223/* 'blacklist' of interfaces not served by this driver */
 224static const u8 direct_ip_non_serial_ifaces[] = { 7, 8, 9, 10, 11 };
 225static const struct sierra_iface_info direct_ip_interface_blacklist = {
 226        .infolen = ARRAY_SIZE(direct_ip_non_serial_ifaces),
 227        .ifaceinfo = direct_ip_non_serial_ifaces,
 228};
 229
 230static const struct usb_device_id id_table[] = {
 231        { USB_DEVICE(0x0F3D, 0x0112) }, /* Airprime/Sierra PC 5220 */
 232        { USB_DEVICE(0x03F0, 0x1B1D) }, /* HP ev2200 a.k.a MC5720 */
 233        { USB_DEVICE(0x03F0, 0x211D) }, /* HP ev2210 a.k.a MC5725 */
 234        { USB_DEVICE(0x03F0, 0x1E1D) }, /* HP hs2300 a.k.a MC8775 */
 235
 236        { USB_DEVICE(0x1199, 0x0017) }, /* Sierra Wireless EM5625 */
 237        { USB_DEVICE(0x1199, 0x0018) }, /* Sierra Wireless MC5720 */
 238        { USB_DEVICE(0x1199, 0x0218) }, /* Sierra Wireless MC5720 */
 239        { USB_DEVICE(0x1199, 0x0020) }, /* Sierra Wireless MC5725 */
 240        { USB_DEVICE(0x1199, 0x0220) }, /* Sierra Wireless MC5725 */
 241        { USB_DEVICE(0x1199, 0x0022) }, /* Sierra Wireless EM5725 */
 242        { USB_DEVICE(0x1199, 0x0024) }, /* Sierra Wireless MC5727 */
 243        { USB_DEVICE(0x1199, 0x0224) }, /* Sierra Wireless MC5727 */
 244        { USB_DEVICE(0x1199, 0x0019) }, /* Sierra Wireless AirCard 595 */
 245        { USB_DEVICE(0x1199, 0x0021) }, /* Sierra Wireless AirCard 597E */
 246        { USB_DEVICE(0x1199, 0x0112) }, /* Sierra Wireless AirCard 580 */
 247        { USB_DEVICE(0x1199, 0x0120) }, /* Sierra Wireless USB Dongle 595U */
 248        { USB_DEVICE(0x1199, 0x0301) }, /* Sierra Wireless USB Dongle 250U */
 249        /* Sierra Wireless C597 */
 250        { USB_DEVICE_AND_INTERFACE_INFO(0x1199, 0x0023, 0xFF, 0xFF, 0xFF) },
 251        /* Sierra Wireless T598 */
 252        { USB_DEVICE_AND_INTERFACE_INFO(0x1199, 0x0025, 0xFF, 0xFF, 0xFF) },
 253        { USB_DEVICE(0x1199, 0x0026) }, /* Sierra Wireless T11 */
 254        { USB_DEVICE(0x1199, 0x0027) }, /* Sierra Wireless AC402 */
 255        { USB_DEVICE(0x1199, 0x0028) }, /* Sierra Wireless MC5728 */
 256        { USB_DEVICE(0x1199, 0x0029) }, /* Sierra Wireless Device */
 257
 258        { USB_DEVICE(0x1199, 0x6802) }, /* Sierra Wireless MC8755 */
 259        { USB_DEVICE(0x1199, 0x6803) }, /* Sierra Wireless MC8765 */
 260        { USB_DEVICE(0x1199, 0x6804) }, /* Sierra Wireless MC8755 */
 261        { USB_DEVICE(0x1199, 0x6805) }, /* Sierra Wireless MC8765 */
 262        { USB_DEVICE(0x1199, 0x6808) }, /* Sierra Wireless MC8755 */
 263        { USB_DEVICE(0x1199, 0x6809) }, /* Sierra Wireless MC8765 */
 264        { USB_DEVICE(0x1199, 0x6812) }, /* Sierra Wireless MC8775 & AC 875U */
 265        { USB_DEVICE(0x1199, 0x6813) }, /* Sierra Wireless MC8775 */
 266        { USB_DEVICE(0x1199, 0x6815) }, /* Sierra Wireless MC8775 */
 267        { USB_DEVICE(0x1199, 0x6816) }, /* Sierra Wireless MC8775 */
 268        { USB_DEVICE(0x1199, 0x6820) }, /* Sierra Wireless AirCard 875 */
 269        { USB_DEVICE(0x1199, 0x6821) }, /* Sierra Wireless AirCard 875U */
 270        { USB_DEVICE(0x1199, 0x6822) }, /* Sierra Wireless AirCard 875E */
 271        { USB_DEVICE(0x1199, 0x6832) }, /* Sierra Wireless MC8780 */
 272        { USB_DEVICE(0x1199, 0x6833) }, /* Sierra Wireless MC8781 */
 273        { USB_DEVICE(0x1199, 0x6834) }, /* Sierra Wireless MC8780 */
 274        { USB_DEVICE(0x1199, 0x6835) }, /* Sierra Wireless MC8781 */
 275        { USB_DEVICE(0x1199, 0x6838) }, /* Sierra Wireless MC8780 */
 276        { USB_DEVICE(0x1199, 0x6839) }, /* Sierra Wireless MC8781 */
 277        { USB_DEVICE(0x1199, 0x683A) }, /* Sierra Wireless MC8785 */
 278        { USB_DEVICE(0x1199, 0x683B) }, /* Sierra Wireless MC8785 Composite */
 279        /* Sierra Wireless MC8790, MC8791, MC8792 Composite */
 280        { USB_DEVICE(0x1199, 0x683C) },
 281        { USB_DEVICE(0x1199, 0x683D) }, /* Sierra Wireless MC8791 Composite */
 282        /* Sierra Wireless MC8790, MC8791, MC8792 */
 283        { USB_DEVICE(0x1199, 0x683E) },
 284        { USB_DEVICE(0x1199, 0x6850) }, /* Sierra Wireless AirCard 880 */
 285        { USB_DEVICE(0x1199, 0x6851) }, /* Sierra Wireless AirCard 881 */
 286        { USB_DEVICE(0x1199, 0x6852) }, /* Sierra Wireless AirCard 880 E */
 287        { USB_DEVICE(0x1199, 0x6853) }, /* Sierra Wireless AirCard 881 E */
 288        { USB_DEVICE(0x1199, 0x6855) }, /* Sierra Wireless AirCard 880 U */
 289        { USB_DEVICE(0x1199, 0x6856) }, /* Sierra Wireless AirCard 881 U */
 290        { USB_DEVICE(0x1199, 0x6859) }, /* Sierra Wireless AirCard 885 E */
 291        { USB_DEVICE(0x1199, 0x685A) }, /* Sierra Wireless AirCard 885 E */
 292        /* Sierra Wireless C885 */
 293        { USB_DEVICE_AND_INTERFACE_INFO(0x1199, 0x6880, 0xFF, 0xFF, 0xFF)},
 294        /* Sierra Wireless C888, Air Card 501, USB 303, USB 304 */
 295        { USB_DEVICE_AND_INTERFACE_INFO(0x1199, 0x6890, 0xFF, 0xFF, 0xFF)},
 296        /* Sierra Wireless C22/C33 */
 297        { USB_DEVICE_AND_INTERFACE_INFO(0x1199, 0x6891, 0xFF, 0xFF, 0xFF)},
 298        /* Sierra Wireless HSPA Non-Composite Device */
 299        { USB_DEVICE_AND_INTERFACE_INFO(0x1199, 0x6892, 0xFF, 0xFF, 0xFF)},
 300        { USB_DEVICE(0x1199, 0x6893) }, /* Sierra Wireless Device */
 301        { USB_DEVICE(0x1199, 0x68A3),   /* Sierra Wireless Direct IP modems */
 302          .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist
 303        },
 304        { USB_DEVICE(0x0f3d, 0x68A3),   /* Airprime/Sierra Wireless Direct IP modems */
 305          .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist
 306        },
 307       { USB_DEVICE(0x413C, 0x08133) }, /* Dell Computer Corp. Wireless 5720 VZW Mobile Broadband (EVDO Rev-A) Minicard GPS Port */
 308
 309        { }
 310};
 311MODULE_DEVICE_TABLE(usb, id_table);
 312
 313
 314struct sierra_port_private {
 315        spinlock_t lock;        /* lock the structure */
 316        int outstanding_urbs;   /* number of out urbs in flight */
 317        struct usb_anchor active;
 318        struct usb_anchor delayed;
 319
 320        int num_out_urbs;
 321        int num_in_urbs;
 322        /* Input endpoints and buffers for this port */
 323        struct urb *in_urbs[N_IN_URB_HM];
 324
 325        /* Settings for the port */
 326        int rts_state;  /* Handshaking pins (outputs) */
 327        int dtr_state;
 328        int cts_state;  /* Handshaking pins (inputs) */
 329        int dsr_state;
 330        int dcd_state;
 331        int ri_state;
 332        unsigned int opened:1;
 333};
 334
 335static int sierra_send_setup(struct usb_serial_port *port)
 336{
 337        struct usb_serial *serial = port->serial;
 338        struct sierra_port_private *portdata;
 339        __u16 interface = 0;
 340        int val = 0;
 341        int do_send = 0;
 342        int retval;
 343
 344        dev_dbg(&port->dev, "%s\n", __func__);
 345
 346        portdata = usb_get_serial_port_data(port);
 347
 348        if (portdata->dtr_state)
 349                val |= 0x01;
 350        if (portdata->rts_state)
 351                val |= 0x02;
 352
 353        /* If composite device then properly report interface */
 354        if (serial->num_ports == 1) {
 355                interface = sierra_calc_interface(serial);
 356                /* Control message is sent only to interfaces with
 357                 * interrupt_in endpoints
 358                 */
 359                if (port->interrupt_in_urb) {
 360                        /* send control message */
 361                        do_send = 1;
 362                }
 363        }
 364
 365        /* Otherwise the need to do non-composite mapping */
 366        else {
 367                if (port->bulk_out_endpointAddress == 2)
 368                        interface = 0;
 369                else if (port->bulk_out_endpointAddress == 4)
 370                        interface = 1;
 371                else if (port->bulk_out_endpointAddress == 5)
 372                        interface = 2;
 373
 374                do_send = 1;
 375        }
 376        if (!do_send)
 377                return 0;
 378
 379        retval = usb_autopm_get_interface(serial->interface);
 380        if (retval < 0)
 381                return retval;
 382
 383        retval = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
 384                0x22, 0x21, val, interface, NULL, 0, USB_CTRL_SET_TIMEOUT);
 385        usb_autopm_put_interface(serial->interface);
 386
 387        return retval;
 388}
 389
 390static void sierra_set_termios(struct tty_struct *tty,
 391                struct usb_serial_port *port, struct ktermios *old_termios)
 392{
 393        dev_dbg(&port->dev, "%s\n", __func__);
 394        tty_termios_copy_hw(tty->termios, old_termios);
 395        sierra_send_setup(port);
 396}
 397
 398static int sierra_tiocmget(struct tty_struct *tty)
 399{
 400        struct usb_serial_port *port = tty->driver_data;
 401        unsigned int value;
 402        struct sierra_port_private *portdata;
 403
 404        dev_dbg(&port->dev, "%s\n", __func__);
 405        portdata = usb_get_serial_port_data(port);
 406
 407        value = ((portdata->rts_state) ? TIOCM_RTS : 0) |
 408                ((portdata->dtr_state) ? TIOCM_DTR : 0) |
 409                ((portdata->cts_state) ? TIOCM_CTS : 0) |
 410                ((portdata->dsr_state) ? TIOCM_DSR : 0) |
 411                ((portdata->dcd_state) ? TIOCM_CAR : 0) |
 412                ((portdata->ri_state) ? TIOCM_RNG : 0);
 413
 414        return value;
 415}
 416
 417static int sierra_tiocmset(struct tty_struct *tty,
 418                        unsigned int set, unsigned int clear)
 419{
 420        struct usb_serial_port *port = tty->driver_data;
 421        struct sierra_port_private *portdata;
 422
 423        portdata = usb_get_serial_port_data(port);
 424
 425        if (set & TIOCM_RTS)
 426                portdata->rts_state = 1;
 427        if (set & TIOCM_DTR)
 428                portdata->dtr_state = 1;
 429
 430        if (clear & TIOCM_RTS)
 431                portdata->rts_state = 0;
 432        if (clear & TIOCM_DTR)
 433                portdata->dtr_state = 0;
 434        return sierra_send_setup(port);
 435}
 436
 437static void sierra_release_urb(struct urb *urb)
 438{
 439        struct usb_serial_port *port;
 440        if (urb) {
 441                port =  urb->context;
 442                dev_dbg(&port->dev, "%s: %p\n", __func__, urb);
 443                kfree(urb->transfer_buffer);
 444                usb_free_urb(urb);
 445        }
 446}
 447
 448static void sierra_outdat_callback(struct urb *urb)
 449{
 450        struct usb_serial_port *port = urb->context;
 451        struct sierra_port_private *portdata = usb_get_serial_port_data(port);
 452        struct sierra_intf_private *intfdata;
 453        int status = urb->status;
 454
 455        dev_dbg(&port->dev, "%s - port %d\n", __func__, port->number);
 456        intfdata = port->serial->private;
 457
 458        /* free up the transfer buffer, as usb_free_urb() does not do this */
 459        kfree(urb->transfer_buffer);
 460        usb_autopm_put_interface_async(port->serial->interface);
 461        if (status)
 462                dev_dbg(&port->dev, "%s - nonzero write bulk status "
 463                    "received: %d\n", __func__, status);
 464
 465        spin_lock(&portdata->lock);
 466        --portdata->outstanding_urbs;
 467        spin_unlock(&portdata->lock);
 468        spin_lock(&intfdata->susp_lock);
 469        --intfdata->in_flight;
 470        spin_unlock(&intfdata->susp_lock);
 471
 472        usb_serial_port_softint(port);
 473}
 474
 475/* Write */
 476static int sierra_write(struct tty_struct *tty, struct usb_serial_port *port,
 477                                        const unsigned char *buf, int count)
 478{
 479        struct sierra_port_private *portdata;
 480        struct sierra_intf_private *intfdata;
 481        struct usb_serial *serial = port->serial;
 482        unsigned long flags;
 483        unsigned char *buffer;
 484        struct urb *urb;
 485        size_t writesize = min((size_t)count, (size_t)MAX_TRANSFER);
 486        int retval = 0;
 487
 488        /* verify that we actually have some data to write */
 489        if (count == 0)
 490                return 0;
 491
 492        portdata = usb_get_serial_port_data(port);
 493        intfdata = serial->private;
 494
 495        dev_dbg(&port->dev, "%s: write (%zd bytes)\n", __func__, writesize);
 496        spin_lock_irqsave(&portdata->lock, flags);
 497        dev_dbg(&port->dev, "%s - outstanding_urbs: %d\n", __func__,
 498                portdata->outstanding_urbs);
 499        if (portdata->outstanding_urbs > portdata->num_out_urbs) {
 500                spin_unlock_irqrestore(&portdata->lock, flags);
 501                dev_dbg(&port->dev, "%s - write limit hit\n", __func__);
 502                return 0;
 503        }
 504        portdata->outstanding_urbs++;
 505        dev_dbg(&port->dev, "%s - 1, outstanding_urbs: %d\n", __func__,
 506                portdata->outstanding_urbs);
 507        spin_unlock_irqrestore(&portdata->lock, flags);
 508
 509        retval = usb_autopm_get_interface_async(serial->interface);
 510        if (retval < 0) {
 511                spin_lock_irqsave(&portdata->lock, flags);
 512                portdata->outstanding_urbs--;
 513                spin_unlock_irqrestore(&portdata->lock, flags);
 514                goto error_simple;
 515        }
 516
 517        buffer = kmalloc(writesize, GFP_ATOMIC);
 518        if (!buffer) {
 519                dev_err(&port->dev, "out of memory\n");
 520                retval = -ENOMEM;
 521                goto error_no_buffer;
 522        }
 523
 524        urb = usb_alloc_urb(0, GFP_ATOMIC);
 525        if (!urb) {
 526                dev_err(&port->dev, "no more free urbs\n");
 527                retval = -ENOMEM;
 528                goto error_no_urb;
 529        }
 530
 531        memcpy(buffer, buf, writesize);
 532
 533        usb_serial_debug_data(debug, &port->dev, __func__, writesize, buffer);
 534
 535        usb_fill_bulk_urb(urb, serial->dev,
 536                          usb_sndbulkpipe(serial->dev,
 537                                          port->bulk_out_endpointAddress),
 538                          buffer, writesize, sierra_outdat_callback, port);
 539
 540        /* Handle the need to send a zero length packet */
 541        urb->transfer_flags |= URB_ZERO_PACKET;
 542
 543        spin_lock_irqsave(&intfdata->susp_lock, flags);
 544
 545        if (intfdata->suspended) {
 546                usb_anchor_urb(urb, &portdata->delayed);
 547                spin_unlock_irqrestore(&intfdata->susp_lock, flags);
 548                goto skip_power;
 549        } else {
 550                usb_anchor_urb(urb, &portdata->active);
 551        }
 552        /* send it down the pipe */
 553        retval = usb_submit_urb(urb, GFP_ATOMIC);
 554        if (retval) {
 555                usb_unanchor_urb(urb);
 556                spin_unlock_irqrestore(&intfdata->susp_lock, flags);
 557                dev_err(&port->dev, "%s - usb_submit_urb(write bulk) failed "
 558                        "with status = %d\n", __func__, retval);
 559                goto error;
 560        } else {
 561                intfdata->in_flight++;
 562                spin_unlock_irqrestore(&intfdata->susp_lock, flags);
 563        }
 564
 565skip_power:
 566        /* we are done with this urb, so let the host driver
 567         * really free it when it is finished with it */
 568        usb_free_urb(urb);
 569
 570        return writesize;
 571error:
 572        usb_free_urb(urb);
 573error_no_urb:
 574        kfree(buffer);
 575error_no_buffer:
 576        spin_lock_irqsave(&portdata->lock, flags);
 577        --portdata->outstanding_urbs;
 578        dev_dbg(&port->dev, "%s - 2. outstanding_urbs: %d\n", __func__,
 579                portdata->outstanding_urbs);
 580        spin_unlock_irqrestore(&portdata->lock, flags);
 581        usb_autopm_put_interface_async(serial->interface);
 582error_simple:
 583        return retval;
 584}
 585
 586static void sierra_indat_callback(struct urb *urb)
 587{
 588        int err;
 589        int endpoint;
 590        struct usb_serial_port *port;
 591        struct tty_struct *tty;
 592        unsigned char *data = urb->transfer_buffer;
 593        int status = urb->status;
 594
 595        endpoint = usb_pipeendpoint(urb->pipe);
 596        port = urb->context;
 597
 598        dev_dbg(&port->dev, "%s: %p\n", __func__, urb);
 599
 600        if (status) {
 601                dev_dbg(&port->dev, "%s: nonzero status: %d on"
 602                        " endpoint %02x\n", __func__, status, endpoint);
 603        } else {
 604                if (urb->actual_length) {
 605                        tty = tty_port_tty_get(&port->port);
 606                        if (tty) {
 607                                tty_insert_flip_string(tty, data,
 608                                        urb->actual_length);
 609                                tty_flip_buffer_push(tty);
 610
 611                                tty_kref_put(tty);
 612                                usb_serial_debug_data(debug, &port->dev,
 613                                        __func__, urb->actual_length, data);
 614                        }
 615                } else {
 616                        dev_dbg(&port->dev, "%s: empty read urb"
 617                                " received\n", __func__);
 618                }
 619        }
 620
 621        /* Resubmit urb so we continue receiving */
 622        if (status != -ESHUTDOWN && status != -EPERM) {
 623                usb_mark_last_busy(port->serial->dev);
 624                err = usb_submit_urb(urb, GFP_ATOMIC);
 625                if (err && err != -EPERM)
 626                        dev_err(&port->dev, "resubmit read urb failed."
 627                                "(%d)\n", err);
 628        }
 629}
 630
 631static void sierra_instat_callback(struct urb *urb)
 632{
 633        int err;
 634        int status = urb->status;
 635        struct usb_serial_port *port =  urb->context;
 636        struct sierra_port_private *portdata = usb_get_serial_port_data(port);
 637        struct usb_serial *serial = port->serial;
 638
 639        dev_dbg(&port->dev, "%s: urb %p port %p has data %p\n", __func__,
 640                urb, port, portdata);
 641
 642        if (status == 0) {
 643                struct usb_ctrlrequest *req_pkt =
 644                                (struct usb_ctrlrequest *)urb->transfer_buffer;
 645
 646                if (!req_pkt) {
 647                        dev_dbg(&port->dev, "%s: NULL req_pkt\n",
 648                                __func__);
 649                        return;
 650                }
 651                if ((req_pkt->bRequestType == 0xA1) &&
 652                                (req_pkt->bRequest == 0x20)) {
 653                        int old_dcd_state;
 654                        unsigned char signals = *((unsigned char *)
 655                                        urb->transfer_buffer +
 656                                        sizeof(struct usb_ctrlrequest));
 657                        struct tty_struct *tty;
 658
 659                        dev_dbg(&port->dev, "%s: signal x%x\n", __func__,
 660                                signals);
 661
 662                        old_dcd_state = portdata->dcd_state;
 663                        portdata->cts_state = 1;
 664                        portdata->dcd_state = ((signals & 0x01) ? 1 : 0);
 665                        portdata->dsr_state = ((signals & 0x02) ? 1 : 0);
 666                        portdata->ri_state = ((signals & 0x08) ? 1 : 0);
 667
 668                        tty = tty_port_tty_get(&port->port);
 669                        if (tty && !C_CLOCAL(tty) &&
 670                                        old_dcd_state && !portdata->dcd_state)
 671                                tty_hangup(tty);
 672                        tty_kref_put(tty);
 673                } else {
 674                        dev_dbg(&port->dev, "%s: type %x req %x\n",
 675                                __func__, req_pkt->bRequestType,
 676                                req_pkt->bRequest);
 677                }
 678        } else
 679                dev_dbg(&port->dev, "%s: error %d\n", __func__, status);
 680
 681        /* Resubmit urb so we continue receiving IRQ data */
 682        if (status != -ESHUTDOWN && status != -ENOENT) {
 683                usb_mark_last_busy(serial->dev);
 684                urb->dev = serial->dev;
 685                err = usb_submit_urb(urb, GFP_ATOMIC);
 686                if (err && err != -EPERM)
 687                        dev_err(&port->dev, "%s: resubmit intr urb "
 688                                "failed. (%d)\n", __func__, err);
 689        }
 690}
 691
 692static int sierra_write_room(struct tty_struct *tty)
 693{
 694        struct usb_serial_port *port = tty->driver_data;
 695        struct sierra_port_private *portdata = usb_get_serial_port_data(port);
 696        unsigned long flags;
 697
 698        dev_dbg(&port->dev, "%s - port %d\n", __func__, port->number);
 699
 700        /* try to give a good number back based on if we have any free urbs at
 701         * this point in time */
 702        spin_lock_irqsave(&portdata->lock, flags);
 703        if (portdata->outstanding_urbs > (portdata->num_out_urbs * 2) / 3) {
 704                spin_unlock_irqrestore(&portdata->lock, flags);
 705                dev_dbg(&port->dev, "%s - write limit hit\n", __func__);
 706                return 0;
 707        }
 708        spin_unlock_irqrestore(&portdata->lock, flags);
 709
 710        return 2048;
 711}
 712
 713static void sierra_stop_rx_urbs(struct usb_serial_port *port)
 714{
 715        int i;
 716        struct sierra_port_private *portdata = usb_get_serial_port_data(port);
 717
 718        for (i = 0; i < portdata->num_in_urbs; i++)
 719                usb_kill_urb(portdata->in_urbs[i]);
 720
 721        usb_kill_urb(port->interrupt_in_urb);
 722}
 723
 724static int sierra_submit_rx_urbs(struct usb_serial_port *port, gfp_t mem_flags)
 725{
 726        int ok_cnt;
 727        int err = -EINVAL;
 728        int i;
 729        struct urb *urb;
 730        struct sierra_port_private *portdata = usb_get_serial_port_data(port);
 731
 732        ok_cnt = 0;
 733        for (i = 0; i < portdata->num_in_urbs; i++) {
 734                urb = portdata->in_urbs[i];
 735                if (!urb)
 736                        continue;
 737                err = usb_submit_urb(urb, mem_flags);
 738                if (err) {
 739                        dev_err(&port->dev, "%s: submit urb failed: %d\n",
 740                                __func__, err);
 741                } else {
 742                        ok_cnt++;
 743                }
 744        }
 745
 746        if (ok_cnt && port->interrupt_in_urb) {
 747                err = usb_submit_urb(port->interrupt_in_urb, mem_flags);
 748                if (err) {
 749                        dev_err(&port->dev, "%s: submit intr urb failed: %d\n",
 750                                __func__, err);
 751                }
 752        }
 753
 754        if (ok_cnt > 0) /* at least one rx urb submitted */
 755                return 0;
 756        else
 757                return err;
 758}
 759
 760static struct urb *sierra_setup_urb(struct usb_serial *serial, int endpoint,
 761                                        int dir, void *ctx, int len,
 762                                        gfp_t mem_flags,
 763                                        usb_complete_t callback)
 764{
 765        struct urb      *urb;
 766        u8              *buf;
 767
 768        if (endpoint == -1)
 769                return NULL;
 770
 771        urb = usb_alloc_urb(0, mem_flags);
 772        if (urb == NULL) {
 773                dev_dbg(&serial->dev->dev, "%s: alloc for endpoint %d failed\n",
 774                        __func__, endpoint);
 775                return NULL;
 776        }
 777
 778        buf = kmalloc(len, mem_flags);
 779        if (buf) {
 780                /* Fill URB using supplied data */
 781                usb_fill_bulk_urb(urb, serial->dev,
 782                        usb_sndbulkpipe(serial->dev, endpoint) | dir,
 783                        buf, len, callback, ctx);
 784
 785                /* debug */
 786                dev_dbg(&serial->dev->dev, "%s %c u : %p d:%p\n", __func__,
 787                                dir == USB_DIR_IN ? 'i' : 'o', urb, buf);
 788        } else {
 789                dev_dbg(&serial->dev->dev, "%s %c u:%p d:%p\n", __func__,
 790                                dir == USB_DIR_IN ? 'i' : 'o', urb, buf);
 791
 792                sierra_release_urb(urb);
 793                urb = NULL;
 794        }
 795
 796        return urb;
 797}
 798
 799static void sierra_close(struct usb_serial_port *port)
 800{
 801        int i;
 802        struct usb_serial *serial = port->serial;
 803        struct sierra_port_private *portdata;
 804        struct sierra_intf_private *intfdata = port->serial->private;
 805
 806
 807        dev_dbg(&port->dev, "%s\n", __func__);
 808        portdata = usb_get_serial_port_data(port);
 809
 810        portdata->rts_state = 0;
 811        portdata->dtr_state = 0;
 812
 813        if (serial->dev) {
 814                mutex_lock(&serial->disc_mutex);
 815                if (!serial->disconnected) {
 816                        serial->interface->needs_remote_wakeup = 0;
 817                        /* odd error handling due to pm counters */
 818                        if (!usb_autopm_get_interface(serial->interface))
 819                                sierra_send_setup(port);
 820                        else
 821                                usb_autopm_get_interface_no_resume(serial->interface);
 822                                
 823                }
 824                mutex_unlock(&serial->disc_mutex);
 825                spin_lock_irq(&intfdata->susp_lock);
 826                portdata->opened = 0;
 827                spin_unlock_irq(&intfdata->susp_lock);
 828
 829
 830                /* Stop reading urbs */
 831                sierra_stop_rx_urbs(port);
 832                /* .. and release them */
 833                for (i = 0; i < portdata->num_in_urbs; i++) {
 834                        sierra_release_urb(portdata->in_urbs[i]);
 835                        portdata->in_urbs[i] = NULL;
 836                }
 837        }
 838}
 839
 840static int sierra_open(struct tty_struct *tty, struct usb_serial_port *port)
 841{
 842        struct sierra_port_private *portdata;
 843        struct usb_serial *serial = port->serial;
 844        struct sierra_intf_private *intfdata = serial->private;
 845        int i;
 846        int err;
 847        int endpoint;
 848        struct urb *urb;
 849
 850        portdata = usb_get_serial_port_data(port);
 851
 852        dev_dbg(&port->dev, "%s\n", __func__);
 853
 854        /* Set some sane defaults */
 855        portdata->rts_state = 1;
 856        portdata->dtr_state = 1;
 857
 858
 859        endpoint = port->bulk_in_endpointAddress;
 860        for (i = 0; i < portdata->num_in_urbs; i++) {
 861                urb = sierra_setup_urb(serial, endpoint, USB_DIR_IN, port,
 862                                        IN_BUFLEN, GFP_KERNEL,
 863                                        sierra_indat_callback);
 864                portdata->in_urbs[i] = urb;
 865        }
 866        /* clear halt condition */
 867        usb_clear_halt(serial->dev,
 868                        usb_sndbulkpipe(serial->dev, endpoint) | USB_DIR_IN);
 869
 870        err = sierra_submit_rx_urbs(port, GFP_KERNEL);
 871        if (err) {
 872                /* get rid of everything as in close */
 873                sierra_close(port);
 874                /* restore balance for autopm */
 875                if (!serial->disconnected)
 876                        usb_autopm_put_interface(serial->interface);
 877                return err;
 878        }
 879        sierra_send_setup(port);
 880
 881        serial->interface->needs_remote_wakeup = 1;
 882        spin_lock_irq(&intfdata->susp_lock);
 883        portdata->opened = 1;
 884        spin_unlock_irq(&intfdata->susp_lock);
 885        usb_autopm_put_interface(serial->interface);
 886
 887        return 0;
 888}
 889
 890
 891static void sierra_dtr_rts(struct usb_serial_port *port, int on)
 892{
 893        struct usb_serial *serial = port->serial;
 894        struct sierra_port_private *portdata;
 895
 896        portdata = usb_get_serial_port_data(port);
 897        portdata->rts_state = on;
 898        portdata->dtr_state = on;
 899
 900        if (serial->dev) {
 901                mutex_lock(&serial->disc_mutex);
 902                if (!serial->disconnected)
 903                        sierra_send_setup(port);
 904                mutex_unlock(&serial->disc_mutex);
 905        }
 906}
 907
 908static int sierra_startup(struct usb_serial *serial)
 909{
 910        struct usb_serial_port *port;
 911        struct sierra_port_private *portdata;
 912        struct sierra_iface_info *himemoryp = NULL;
 913        int i;
 914        u8 ifnum;
 915
 916        dev_dbg(&serial->dev->dev, "%s\n", __func__);
 917
 918        /* Set Device mode to D0 */
 919        sierra_set_power_state(serial->dev, 0x0000);
 920
 921        /* Check NMEA and set */
 922        if (nmea)
 923                sierra_vsc_set_nmea(serial->dev, 1);
 924
 925        /* Now setup per port private data */
 926        for (i = 0; i < serial->num_ports; i++) {
 927                port = serial->port[i];
 928                portdata = kzalloc(sizeof(*portdata), GFP_KERNEL);
 929                if (!portdata) {
 930                        dev_dbg(&port->dev, "%s: kmalloc for "
 931                                "sierra_port_private (%d) failed!\n",
 932                                __func__, i);
 933                        return -ENOMEM;
 934                }
 935                spin_lock_init(&portdata->lock);
 936                init_usb_anchor(&portdata->active);
 937                init_usb_anchor(&portdata->delayed);
 938                ifnum = i;
 939                /* Assume low memory requirements */
 940                portdata->num_out_urbs = N_OUT_URB;
 941                portdata->num_in_urbs  = N_IN_URB;
 942
 943                /* Determine actual memory requirements */
 944                if (serial->num_ports == 1) {
 945                        /* Get interface number for composite device */
 946                        ifnum = sierra_calc_interface(serial);
 947                        himemoryp =
 948                            (struct sierra_iface_info *)&typeB_interface_list;
 949                        if (is_himemory(ifnum, himemoryp)) {
 950                                portdata->num_out_urbs = N_OUT_URB_HM;
 951                                portdata->num_in_urbs  = N_IN_URB_HM;
 952                        }
 953                }
 954                else {
 955                        himemoryp =
 956                            (struct sierra_iface_info *)&typeA_interface_list;
 957                        if (is_himemory(i, himemoryp)) {
 958                                portdata->num_out_urbs = N_OUT_URB_HM;
 959                                portdata->num_in_urbs  = N_IN_URB_HM;
 960                        }
 961                }
 962                dev_dbg(&serial->dev->dev,
 963                        "Memory usage (urbs) interface #%d, in=%d, out=%d\n",
 964                        ifnum,portdata->num_in_urbs, portdata->num_out_urbs );
 965                /* Set the port private data pointer */
 966                usb_set_serial_port_data(port, portdata);
 967        }
 968
 969        return 0;
 970}
 971
 972static void sierra_release(struct usb_serial *serial)
 973{
 974        int i;
 975        struct usb_serial_port *port;
 976        struct sierra_port_private *portdata;
 977
 978        dev_dbg(&serial->dev->dev, "%s\n", __func__);
 979
 980        for (i = 0; i < serial->num_ports; ++i) {
 981                port = serial->port[i];
 982                if (!port)
 983                        continue;
 984                portdata = usb_get_serial_port_data(port);
 985                if (!portdata)
 986                        continue;
 987                kfree(portdata);
 988        }
 989}
 990
 991#ifdef CONFIG_PM
 992static void stop_read_write_urbs(struct usb_serial *serial)
 993{
 994        int i;
 995        struct usb_serial_port *port;
 996        struct sierra_port_private *portdata;
 997
 998        /* Stop reading/writing urbs */
 999        for (i = 0; i < serial->num_ports; ++i) {
1000                port = serial->port[i];
1001                portdata = usb_get_serial_port_data(port);
1002                sierra_stop_rx_urbs(port);
1003                usb_kill_anchored_urbs(&portdata->active);
1004        }
1005}
1006
1007static int sierra_suspend(struct usb_serial *serial, pm_message_t message)
1008{
1009        struct sierra_intf_private *intfdata;
1010        int b;
1011
1012        if (PMSG_IS_AUTO(message)) {
1013                intfdata = serial->private;
1014                spin_lock_irq(&intfdata->susp_lock);
1015                b = intfdata->in_flight;
1016
1017                if (b) {
1018                        spin_unlock_irq(&intfdata->susp_lock);
1019                        return -EBUSY;
1020                } else {
1021                        intfdata->suspended = 1;
1022                        spin_unlock_irq(&intfdata->susp_lock);
1023                }
1024        }
1025        stop_read_write_urbs(serial);
1026
1027        return 0;
1028}
1029
1030static int sierra_resume(struct usb_serial *serial)
1031{
1032        struct usb_serial_port *port;
1033        struct sierra_intf_private *intfdata = serial->private;
1034        struct sierra_port_private *portdata;
1035        struct urb *urb;
1036        int ec = 0;
1037        int i, err;
1038
1039        spin_lock_irq(&intfdata->susp_lock);
1040        for (i = 0; i < serial->num_ports; i++) {
1041                port = serial->port[i];
1042                portdata = usb_get_serial_port_data(port);
1043
1044                while ((urb = usb_get_from_anchor(&portdata->delayed))) {
1045                        usb_anchor_urb(urb, &portdata->active);
1046                        intfdata->in_flight++;
1047                        err = usb_submit_urb(urb, GFP_ATOMIC);
1048                        if (err < 0) {
1049                                intfdata->in_flight--;
1050                                usb_unanchor_urb(urb);
1051                                usb_scuttle_anchored_urbs(&portdata->delayed);
1052                                break;
1053                        }
1054                }
1055
1056                if (portdata->opened) {
1057                        err = sierra_submit_rx_urbs(port, GFP_ATOMIC);
1058                        if (err)
1059                                ec++;
1060                }
1061        }
1062        intfdata->suspended = 0;
1063        spin_unlock_irq(&intfdata->susp_lock);
1064
1065        return ec ? -EIO : 0;
1066}
1067
1068static int sierra_reset_resume(struct usb_interface *intf)
1069{
1070        struct usb_serial *serial = usb_get_intfdata(intf);
1071        dev_err(&serial->dev->dev, "%s\n", __func__);
1072        return usb_serial_resume(intf);
1073}
1074#else
1075#define sierra_suspend NULL
1076#define sierra_resume NULL
1077#define sierra_reset_resume NULL
1078#endif
1079
1080static struct usb_driver sierra_driver = {
1081        .name       = "sierra",
1082        .probe      = usb_serial_probe,
1083        .disconnect = usb_serial_disconnect,
1084        .suspend    = usb_serial_suspend,
1085        .resume     = usb_serial_resume,
1086        .reset_resume = sierra_reset_resume,
1087        .id_table   = id_table,
1088        .no_dynamic_id =        1,
1089        .supports_autosuspend = 1,
1090};
1091
1092static struct usb_serial_driver sierra_device = {
1093        .driver = {
1094                .owner =        THIS_MODULE,
1095                .name =         "sierra",
1096        },
1097        .description       = "Sierra USB modem",
1098        .id_table          = id_table,
1099        .usb_driver        = &sierra_driver,
1100        .calc_num_ports    = sierra_calc_num_ports,
1101        .probe             = sierra_probe,
1102        .open              = sierra_open,
1103        .close             = sierra_close,
1104        .dtr_rts           = sierra_dtr_rts,
1105        .write             = sierra_write,
1106        .write_room        = sierra_write_room,
1107        .set_termios       = sierra_set_termios,
1108        .tiocmget          = sierra_tiocmget,
1109        .tiocmset          = sierra_tiocmset,
1110        .attach            = sierra_startup,
1111        .release           = sierra_release,
1112        .suspend           = sierra_suspend,
1113        .resume            = sierra_resume,
1114        .read_int_callback = sierra_instat_callback,
1115};
1116
1117/* Functions used by new usb-serial code. */
1118static int __init sierra_init(void)
1119{
1120        int retval;
1121        retval = usb_serial_register(&sierra_device);
1122        if (retval)
1123                goto failed_device_register;
1124
1125
1126        retval = usb_register(&sierra_driver);
1127        if (retval)
1128                goto failed_driver_register;
1129
1130        printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":"
1131               DRIVER_DESC "\n");
1132
1133        return 0;
1134
1135failed_driver_register:
1136        usb_serial_deregister(&sierra_device);
1137failed_device_register:
1138        return retval;
1139}
1140
1141static void __exit sierra_exit(void)
1142{
1143        usb_deregister(&sierra_driver);
1144        usb_serial_deregister(&sierra_device);
1145}
1146
1147module_init(sierra_init);
1148module_exit(sierra_exit);
1149
1150MODULE_AUTHOR(DRIVER_AUTHOR);
1151MODULE_DESCRIPTION(DRIVER_DESC);
1152MODULE_VERSION(DRIVER_VERSION);
1153MODULE_LICENSE("GPL");
1154
1155module_param(nmea, bool, S_IRUGO | S_IWUSR);
1156MODULE_PARM_DESC(nmea, "NMEA streaming");
1157
1158module_param(debug, bool, S_IRUGO | S_IWUSR);
1159MODULE_PARM_DESC(debug, "Debug messages");
1160
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.