linux/drivers/net/usb/hso.c
<<
>>
Prefs
   1/******************************************************************************
   2 *
   3 * Driver for Option High Speed Mobile Devices.
   4 *
   5 *  Copyright (C) 2008 Option International
   6 *                     Filip Aben <f.aben@option.com>
   7 *                     Denis Joseph Barrow <d.barow@option.com>
   8 *                     Jan Dumon <j.dumon@option.com>
   9 *  Copyright (C) 2007 Andrew Bird (Sphere Systems Ltd)
  10 *                      <ajb@spheresystems.co.uk>
  11 *  Copyright (C) 2008 Greg Kroah-Hartman <gregkh@suse.de>
  12 *  Copyright (C) 2008 Novell, Inc.
  13 *
  14 *  This program is free software; you can redistribute it and/or modify
  15 *  it under the terms of the GNU General Public License version 2 as
  16 *  published by the Free Software Foundation.
  17 *
  18 *  This program is distributed in the hope that it will be useful,
  19 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  20 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21 *  GNU General Public License for more details.
  22 *
  23 *  You should have received a copy of the GNU General Public License
  24 *  along with this program; if not, write to the Free Software
  25 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
  26 *  USA
  27 *
  28 *
  29 *****************************************************************************/
  30
  31/******************************************************************************
  32 *
  33 * Description of the device:
  34 *
  35 * Interface 0: Contains the IP network interface on the bulk end points.
  36 *              The multiplexed serial ports are using the interrupt and
  37 *              control endpoints.
  38 *              Interrupt contains a bitmap telling which multiplexed
  39 *              serialport needs servicing.
  40 *
  41 * Interface 1: Diagnostics port, uses bulk only, do not submit urbs until the
  42 *              port is opened, as this have a huge impact on the network port
  43 *              throughput.
  44 *
  45 * Interface 2: Standard modem interface - circuit switched interface, this
  46 *              can be used to make a standard ppp connection however it
  47 *              should not be used in conjunction with the IP network interface
  48 *              enabled for USB performance reasons i.e. if using this set
  49 *              ideally disable_net=1.
  50 *
  51 *****************************************************************************/
  52
  53#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  54
  55#include <linux/sched.h>
  56#include <linux/slab.h>
  57#include <linux/init.h>
  58#include <linux/delay.h>
  59#include <linux/netdevice.h>
  60#include <linux/module.h>
  61#include <linux/ethtool.h>
  62#include <linux/usb.h>
  63#include <linux/tty.h>
  64#include <linux/tty_driver.h>
  65#include <linux/tty_flip.h>
  66#include <linux/kmod.h>
  67#include <linux/rfkill.h>
  68#include <linux/ip.h>
  69#include <linux/uaccess.h>
  70#include <linux/usb/cdc.h>
  71#include <net/arp.h>
  72#include <asm/byteorder.h>
  73#include <linux/serial_core.h>
  74#include <linux/serial.h>
  75
  76
  77#define MOD_AUTHOR                      "Option Wireless"
  78#define MOD_DESCRIPTION                 "USB High Speed Option driver"
  79#define MOD_LICENSE                     "GPL"
  80
  81#define HSO_MAX_NET_DEVICES             10
  82#define HSO__MAX_MTU                    2048
  83#define DEFAULT_MTU                     1500
  84#define DEFAULT_MRU                     1500
  85
  86#define CTRL_URB_RX_SIZE                1024
  87#define CTRL_URB_TX_SIZE                64
  88
  89#define BULK_URB_RX_SIZE                4096
  90#define BULK_URB_TX_SIZE                8192
  91
  92#define MUX_BULK_RX_BUF_SIZE            HSO__MAX_MTU
  93#define MUX_BULK_TX_BUF_SIZE            HSO__MAX_MTU
  94#define MUX_BULK_RX_BUF_COUNT           4
  95#define USB_TYPE_OPTION_VENDOR          0x20
  96
  97/* These definitions are used with the struct hso_net flags element */
  98/* - use *_bit operations on it. (bit indices not values.) */
  99#define HSO_NET_RUNNING                 0
 100
 101#define HSO_NET_TX_TIMEOUT              (HZ*10)
 102
 103#define HSO_SERIAL_MAGIC                0x48534f31
 104
 105/* Number of ttys to handle */
 106#define HSO_SERIAL_TTY_MINORS           256
 107
 108#define MAX_RX_URBS                     2
 109
 110/*****************************************************************************/
 111/* Debugging functions                                                       */
 112/*****************************************************************************/
 113#define hso_dbg(lvl, fmt, ...)                                          \
 114do {                                                                    \
 115        if ((lvl) & debug)                                              \
 116                pr_info("[%d:%s] " fmt,                                 \
 117                        __LINE__, __func__, ##__VA_ARGS__);             \
 118} while (0)
 119
 120/*****************************************************************************/
 121/* Enumerators                                                               */
 122/*****************************************************************************/
 123enum pkt_parse_state {
 124        WAIT_IP,
 125        WAIT_DATA,
 126        WAIT_SYNC
 127};
 128
 129/*****************************************************************************/
 130/* Structs                                                                   */
 131/*****************************************************************************/
 132
 133struct hso_shared_int {
 134        struct usb_endpoint_descriptor *intr_endp;
 135        void *shared_intr_buf;
 136        struct urb *shared_intr_urb;
 137        struct usb_device *usb;
 138        int use_count;
 139        int ref_count;
 140        struct mutex shared_int_lock;
 141};
 142
 143struct hso_net {
 144        struct hso_device *parent;
 145        struct net_device *net;
 146        struct rfkill *rfkill;
 147        char name[24];
 148
 149        struct usb_endpoint_descriptor *in_endp;
 150        struct usb_endpoint_descriptor *out_endp;
 151
 152        struct urb *mux_bulk_rx_urb_pool[MUX_BULK_RX_BUF_COUNT];
 153        struct urb *mux_bulk_tx_urb;
 154        void *mux_bulk_rx_buf_pool[MUX_BULK_RX_BUF_COUNT];
 155        void *mux_bulk_tx_buf;
 156
 157        struct sk_buff *skb_rx_buf;
 158        struct sk_buff *skb_tx_buf;
 159
 160        enum pkt_parse_state rx_parse_state;
 161        spinlock_t net_lock;
 162
 163        unsigned short rx_buf_size;
 164        unsigned short rx_buf_missing;
 165        struct iphdr rx_ip_hdr;
 166
 167        unsigned long flags;
 168};
 169
 170enum rx_ctrl_state{
 171        RX_IDLE,
 172        RX_SENT,
 173        RX_PENDING
 174};
 175
 176#define BM_REQUEST_TYPE (0xa1)
 177#define B_NOTIFICATION  (0x20)
 178#define W_VALUE         (0x0)
 179#define W_LENGTH        (0x2)
 180
 181#define B_OVERRUN       (0x1<<6)
 182#define B_PARITY        (0x1<<5)
 183#define B_FRAMING       (0x1<<4)
 184#define B_RING_SIGNAL   (0x1<<3)
 185#define B_BREAK         (0x1<<2)
 186#define B_TX_CARRIER    (0x1<<1)
 187#define B_RX_CARRIER    (0x1<<0)
 188
 189struct hso_serial_state_notification {
 190        u8 bmRequestType;
 191        u8 bNotification;
 192        u16 wValue;
 193        u16 wIndex;
 194        u16 wLength;
 195        u16 UART_state_bitmap;
 196} __packed;
 197
 198struct hso_tiocmget {
 199        struct mutex mutex;
 200        wait_queue_head_t waitq;
 201        int    intr_completed;
 202        struct usb_endpoint_descriptor *endp;
 203        struct urb *urb;
 204        struct hso_serial_state_notification serial_state_notification;
 205        u16    prev_UART_state_bitmap;
 206        struct uart_icount icount;
 207};
 208
 209
 210struct hso_serial {
 211        struct hso_device *parent;
 212        int magic;
 213        u8 minor;
 214
 215        struct hso_shared_int *shared_int;
 216
 217        /* rx/tx urb could be either a bulk urb or a control urb depending
 218           on which serial port it is used on. */
 219        struct urb *rx_urb[MAX_RX_URBS];
 220        u8 num_rx_urbs;
 221        u8 *rx_data[MAX_RX_URBS];
 222        u16 rx_data_length;     /* should contain allocated length */
 223
 224        struct urb *tx_urb;
 225        u8 *tx_data;
 226        u8 *tx_buffer;
 227        u16 tx_data_length;     /* should contain allocated length */
 228        u16 tx_data_count;
 229        u16 tx_buffer_count;
 230        struct usb_ctrlrequest ctrl_req_tx;
 231        struct usb_ctrlrequest ctrl_req_rx;
 232
 233        struct usb_endpoint_descriptor *in_endp;
 234        struct usb_endpoint_descriptor *out_endp;
 235
 236        enum rx_ctrl_state rx_state;
 237        u8 rts_state;
 238        u8 dtr_state;
 239        unsigned tx_urb_used:1;
 240
 241        struct tty_port port;
 242        /* from usb_serial_port */
 243        spinlock_t serial_lock;
 244
 245        int (*write_data) (struct hso_serial *serial);
 246        struct hso_tiocmget  *tiocmget;
 247        /* Hacks required to get flow control
 248         * working on the serial receive buffers
 249         * so as not to drop characters on the floor.
 250         */
 251        int  curr_rx_urb_idx;
 252        u8   rx_urb_filled[MAX_RX_URBS];
 253        struct tasklet_struct unthrottle_tasklet;
 254};
 255
 256struct hso_device {
 257        union {
 258                struct hso_serial *dev_serial;
 259                struct hso_net *dev_net;
 260        } port_data;
 261
 262        u32 port_spec;
 263
 264        u8 is_active;
 265        u8 usb_gone;
 266        struct work_struct async_get_intf;
 267        struct work_struct async_put_intf;
 268
 269        struct usb_device *usb;
 270        struct usb_interface *interface;
 271
 272        struct device *dev;
 273        struct kref ref;
 274        struct mutex mutex;
 275};
 276
 277/* Type of interface */
 278#define HSO_INTF_MASK           0xFF00
 279#define HSO_INTF_MUX            0x0100
 280#define HSO_INTF_BULK           0x0200
 281
 282/* Type of port */
 283#define HSO_PORT_MASK           0xFF
 284#define HSO_PORT_NO_PORT        0x0
 285#define HSO_PORT_CONTROL        0x1
 286#define HSO_PORT_APP            0x2
 287#define HSO_PORT_GPS            0x3
 288#define HSO_PORT_PCSC           0x4
 289#define HSO_PORT_APP2           0x5
 290#define HSO_PORT_GPS_CONTROL    0x6
 291#define HSO_PORT_MSD            0x7
 292#define HSO_PORT_VOICE          0x8
 293#define HSO_PORT_DIAG2          0x9
 294#define HSO_PORT_DIAG           0x10
 295#define HSO_PORT_MODEM          0x11
 296#define HSO_PORT_NETWORK        0x12
 297
 298/* Additional device info */
 299#define HSO_INFO_MASK           0xFF000000
 300#define HSO_INFO_CRC_BUG        0x01000000
 301
 302/*****************************************************************************/
 303/* Prototypes                                                                */
 304/*****************************************************************************/
 305/* Serial driver functions */
 306static int hso_serial_tiocmset(struct tty_struct *tty,
 307                               unsigned int set, unsigned int clear);
 308static void ctrl_callback(struct urb *urb);
 309static int put_rxbuf_data(struct urb *urb, struct hso_serial *serial);
 310static void hso_kick_transmit(struct hso_serial *serial);
 311/* Helper functions */
 312static int hso_mux_submit_intr_urb(struct hso_shared_int *mux_int,
 313                                   struct usb_device *usb, gfp_t gfp);
 314static void handle_usb_error(int status, const char *function,
 315                             struct hso_device *hso_dev);
 316static struct usb_endpoint_descriptor *hso_get_ep(struct usb_interface *intf,
 317                                                  int type, int dir);
 318static int hso_get_mux_ports(struct usb_interface *intf, unsigned char *ports);
 319static void hso_free_interface(struct usb_interface *intf);
 320static int hso_start_serial_device(struct hso_device *hso_dev, gfp_t flags);
 321static int hso_stop_serial_device(struct hso_device *hso_dev);
 322static int hso_start_net_device(struct hso_device *hso_dev);
 323static void hso_free_shared_int(struct hso_shared_int *shared_int);
 324static int hso_stop_net_device(struct hso_device *hso_dev);
 325static void hso_serial_ref_free(struct kref *ref);
 326static void hso_std_serial_read_bulk_callback(struct urb *urb);
 327static int hso_mux_serial_read(struct hso_serial *serial);
 328static void async_get_intf(struct work_struct *data);
 329static void async_put_intf(struct work_struct *data);
 330static int hso_put_activity(struct hso_device *hso_dev);
 331static int hso_get_activity(struct hso_device *hso_dev);
 332static void tiocmget_intr_callback(struct urb *urb);
 333/*****************************************************************************/
 334/* Helping functions                                                         */
 335/*****************************************************************************/
 336
 337/* #define DEBUG */
 338
 339static inline struct hso_net *dev2net(struct hso_device *hso_dev)
 340{
 341        return hso_dev->port_data.dev_net;
 342}
 343
 344static inline struct hso_serial *dev2ser(struct hso_device *hso_dev)
 345{
 346        return hso_dev->port_data.dev_serial;
 347}
 348
 349/* Debugging functions */
 350#ifdef DEBUG
 351static void dbg_dump(int line_count, const char *func_name, unsigned char *buf,
 352                     unsigned int len)
 353{
 354        static char name[255];
 355
 356        sprintf(name, "hso[%d:%s]", line_count, func_name);
 357        print_hex_dump_bytes(name, DUMP_PREFIX_NONE, buf, len);
 358}
 359
 360#define DUMP(buf_, len_)        \
 361        dbg_dump(__LINE__, __func__, (unsigned char *)buf_, len_)
 362
 363#define DUMP1(buf_, len_)                       \
 364        do {                                    \
 365                if (0x01 & debug)               \
 366                        DUMP(buf_, len_);       \
 367        } while (0)
 368#else
 369#define DUMP(buf_, len_)
 370#define DUMP1(buf_, len_)
 371#endif
 372
 373/* module parameters */
 374static int debug;
 375static int tty_major;
 376static int disable_net;
 377
 378/* driver info */
 379static const char driver_name[] = "hso";
 380static const char tty_filename[] = "ttyHS";
 381static const char *version = __FILE__ ": " MOD_AUTHOR;
 382/* the usb driver itself (registered in hso_init) */
 383static struct usb_driver hso_driver;
 384/* serial structures */
 385static struct tty_driver *tty_drv;
 386static struct hso_device *serial_table[HSO_SERIAL_TTY_MINORS];
 387static struct hso_device *network_table[HSO_MAX_NET_DEVICES];
 388static spinlock_t serial_table_lock;
 389
 390static const s32 default_port_spec[] = {
 391        HSO_INTF_MUX | HSO_PORT_NETWORK,
 392        HSO_INTF_BULK | HSO_PORT_DIAG,
 393        HSO_INTF_BULK | HSO_PORT_MODEM,
 394        0
 395};
 396
 397static const s32 icon321_port_spec[] = {
 398        HSO_INTF_MUX | HSO_PORT_NETWORK,
 399        HSO_INTF_BULK | HSO_PORT_DIAG2,
 400        HSO_INTF_BULK | HSO_PORT_MODEM,
 401        HSO_INTF_BULK | HSO_PORT_DIAG,
 402        0
 403};
 404
 405#define default_port_device(vendor, product)    \
 406        USB_DEVICE(vendor, product),    \
 407                .driver_info = (kernel_ulong_t)default_port_spec
 408
 409#define icon321_port_device(vendor, product)    \
 410        USB_DEVICE(vendor, product),    \
 411                .driver_info = (kernel_ulong_t)icon321_port_spec
 412
 413/* list of devices we support */
 414static const struct usb_device_id hso_ids[] = {
 415        {default_port_device(0x0af0, 0x6711)},
 416        {default_port_device(0x0af0, 0x6731)},
 417        {default_port_device(0x0af0, 0x6751)},
 418        {default_port_device(0x0af0, 0x6771)},
 419        {default_port_device(0x0af0, 0x6791)},
 420        {default_port_device(0x0af0, 0x6811)},
 421        {default_port_device(0x0af0, 0x6911)},
 422        {default_port_device(0x0af0, 0x6951)},
 423        {default_port_device(0x0af0, 0x6971)},
 424        {default_port_device(0x0af0, 0x7011)},
 425        {default_port_device(0x0af0, 0x7031)},
 426        {default_port_device(0x0af0, 0x7051)},
 427        {default_port_device(0x0af0, 0x7071)},
 428        {default_port_device(0x0af0, 0x7111)},
 429        {default_port_device(0x0af0, 0x7211)},
 430        {default_port_device(0x0af0, 0x7251)},
 431        {default_port_device(0x0af0, 0x7271)},
 432        {default_port_device(0x0af0, 0x7311)},
 433        {default_port_device(0x0af0, 0xc031)},  /* Icon-Edge */
 434        {icon321_port_device(0x0af0, 0xd013)},  /* Module HSxPA */
 435        {icon321_port_device(0x0af0, 0xd031)},  /* Icon-321 */
 436        {icon321_port_device(0x0af0, 0xd033)},  /* Icon-322 */
 437        {USB_DEVICE(0x0af0, 0x7301)},           /* GE40x */
 438        {USB_DEVICE(0x0af0, 0x7361)},           /* GE40x */
 439        {USB_DEVICE(0x0af0, 0x7381)},           /* GE40x */
 440        {USB_DEVICE(0x0af0, 0x7401)},           /* GI 0401 */
 441        {USB_DEVICE(0x0af0, 0x7501)},           /* GTM 382 */
 442        {USB_DEVICE(0x0af0, 0x7601)},           /* GE40x */
 443        {USB_DEVICE(0x0af0, 0x7701)},
 444        {USB_DEVICE(0x0af0, 0x7706)},
 445        {USB_DEVICE(0x0af0, 0x7801)},
 446        {USB_DEVICE(0x0af0, 0x7901)},
 447        {USB_DEVICE(0x0af0, 0x7A01)},
 448        {USB_DEVICE(0x0af0, 0x7A05)},
 449        {USB_DEVICE(0x0af0, 0x8200)},
 450        {USB_DEVICE(0x0af0, 0x8201)},
 451        {USB_DEVICE(0x0af0, 0x8300)},
 452        {USB_DEVICE(0x0af0, 0x8302)},
 453        {USB_DEVICE(0x0af0, 0x8304)},
 454        {USB_DEVICE(0x0af0, 0x8400)},
 455        {USB_DEVICE(0x0af0, 0x8600)},
 456        {USB_DEVICE(0x0af0, 0x8800)},
 457        {USB_DEVICE(0x0af0, 0x8900)},
 458        {USB_DEVICE(0x0af0, 0x9000)},
 459        {USB_DEVICE(0x0af0, 0x9200)},           /* Option GTM671WFS */
 460        {USB_DEVICE(0x0af0, 0xd035)},
 461        {USB_DEVICE(0x0af0, 0xd055)},
 462        {USB_DEVICE(0x0af0, 0xd155)},
 463        {USB_DEVICE(0x0af0, 0xd255)},
 464        {USB_DEVICE(0x0af0, 0xd057)},
 465        {USB_DEVICE(0x0af0, 0xd157)},
 466        {USB_DEVICE(0x0af0, 0xd257)},
 467        {USB_DEVICE(0x0af0, 0xd357)},
 468        {USB_DEVICE(0x0af0, 0xd058)},
 469        {USB_DEVICE(0x0af0, 0xc100)},
 470        {}
 471};
 472MODULE_DEVICE_TABLE(usb, hso_ids);
 473
 474/* Sysfs attribute */
 475static ssize_t hso_sysfs_show_porttype(struct device *dev,
 476                                       struct device_attribute *attr,
 477                                       char *buf)
 478{
 479        struct hso_device *hso_dev = dev_get_drvdata(dev);
 480        char *port_name;
 481
 482        if (!hso_dev)
 483                return 0;
 484
 485        switch (hso_dev->port_spec & HSO_PORT_MASK) {
 486        case HSO_PORT_CONTROL:
 487                port_name = "Control";
 488                break;
 489        case HSO_PORT_APP:
 490                port_name = "Application";
 491                break;
 492        case HSO_PORT_APP2:
 493                port_name = "Application2";
 494                break;
 495        case HSO_PORT_GPS:
 496                port_name = "GPS";
 497                break;
 498        case HSO_PORT_GPS_CONTROL:
 499                port_name = "GPS Control";
 500                break;
 501        case HSO_PORT_PCSC:
 502                port_name = "PCSC";
 503                break;
 504        case HSO_PORT_DIAG:
 505                port_name = "Diagnostic";
 506                break;
 507        case HSO_PORT_DIAG2:
 508                port_name = "Diagnostic2";
 509                break;
 510        case HSO_PORT_MODEM:
 511                port_name = "Modem";
 512                break;
 513        case HSO_PORT_NETWORK:
 514                port_name = "Network";
 515                break;
 516        default:
 517                port_name = "Unknown";
 518                break;
 519        }
 520
 521        return sprintf(buf, "%s\n", port_name);
 522}
 523static DEVICE_ATTR(hsotype, S_IRUGO, hso_sysfs_show_porttype, NULL);
 524
 525static struct attribute *hso_serial_dev_attrs[] = {
 526        &dev_attr_hsotype.attr,
 527        NULL
 528};
 529
 530ATTRIBUTE_GROUPS(hso_serial_dev);
 531
 532static int hso_urb_to_index(struct hso_serial *serial, struct urb *urb)
 533{
 534        int idx;
 535
 536        for (idx = 0; idx < serial->num_rx_urbs; idx++)
 537                if (serial->rx_urb[idx] == urb)
 538                        return idx;
 539        dev_err(serial->parent->dev, "hso_urb_to_index failed\n");
 540        return -1;
 541}
 542
 543/* converts mux value to a port spec value */
 544static u32 hso_mux_to_port(int mux)
 545{
 546        u32 result;
 547
 548        switch (mux) {
 549        case 0x1:
 550                result = HSO_PORT_CONTROL;
 551                break;
 552        case 0x2:
 553                result = HSO_PORT_APP;
 554                break;
 555        case 0x4:
 556                result = HSO_PORT_PCSC;
 557                break;
 558        case 0x8:
 559                result = HSO_PORT_GPS;
 560                break;
 561        case 0x10:
 562                result = HSO_PORT_APP2;
 563                break;
 564        default:
 565                result = HSO_PORT_NO_PORT;
 566        }
 567        return result;
 568}
 569
 570/* converts port spec value to a mux value */
 571static u32 hso_port_to_mux(int port)
 572{
 573        u32 result;
 574
 575        switch (port & HSO_PORT_MASK) {
 576        case HSO_PORT_CONTROL:
 577                result = 0x0;
 578                break;
 579        case HSO_PORT_APP:
 580                result = 0x1;
 581                break;
 582        case HSO_PORT_PCSC:
 583                result = 0x2;
 584                break;
 585        case HSO_PORT_GPS:
 586                result = 0x3;
 587                break;
 588        case HSO_PORT_APP2:
 589                result = 0x4;
 590                break;
 591        default:
 592                result = 0x0;
 593        }
 594        return result;
 595}
 596
 597static struct hso_serial *get_serial_by_shared_int_and_type(
 598                                        struct hso_shared_int *shared_int,
 599                                        int mux)
 600{
 601        int i, port;
 602
 603        port = hso_mux_to_port(mux);
 604
 605        for (i = 0; i < HSO_SERIAL_TTY_MINORS; i++) {
 606                if (serial_table[i] &&
 607                    (dev2ser(serial_table[i])->shared_int == shared_int) &&
 608                    ((serial_table[i]->port_spec & HSO_PORT_MASK) == port)) {
 609                        return dev2ser(serial_table[i]);
 610                }
 611        }
 612
 613        return NULL;
 614}
 615
 616static struct hso_serial *get_serial_by_index(unsigned index)
 617{
 618        struct hso_serial *serial = NULL;
 619        unsigned long flags;
 620
 621        spin_lock_irqsave(&serial_table_lock, flags);
 622        if (serial_table[index])
 623                serial = dev2ser(serial_table[index]);
 624        spin_unlock_irqrestore(&serial_table_lock, flags);
 625
 626        return serial;
 627}
 628
 629static int get_free_serial_index(void)
 630{
 631        int index;
 632        unsigned long flags;
 633
 634        spin_lock_irqsave(&serial_table_lock, flags);
 635        for (index = 0; index < HSO_SERIAL_TTY_MINORS; index++) {
 636                if (serial_table[index] == NULL) {
 637                        spin_unlock_irqrestore(&serial_table_lock, flags);
 638                        return index;
 639                }
 640        }
 641        spin_unlock_irqrestore(&serial_table_lock, flags);
 642
 643        pr_err("%s: no free serial devices in table\n", __func__);
 644        return -1;
 645}
 646
 647static void set_serial_by_index(unsigned index, struct hso_serial *serial)
 648{
 649        unsigned long flags;
 650
 651        spin_lock_irqsave(&serial_table_lock, flags);
 652        if (serial)
 653                serial_table[index] = serial->parent;
 654        else
 655                serial_table[index] = NULL;
 656        spin_unlock_irqrestore(&serial_table_lock, flags);
 657}
 658
 659static void handle_usb_error(int status, const char *function,
 660                             struct hso_device *hso_dev)
 661{
 662        char *explanation;
 663
 664        switch (status) {
 665        case -ENODEV:
 666                explanation = "no device";
 667                break;
 668        case -ENOENT:
 669                explanation = "endpoint not enabled";
 670                break;
 671        case -EPIPE:
 672                explanation = "endpoint stalled";
 673                break;
 674        case -ENOSPC:
 675                explanation = "not enough bandwidth";
 676                break;
 677        case -ESHUTDOWN:
 678                explanation = "device disabled";
 679                break;
 680        case -EHOSTUNREACH:
 681                explanation = "device suspended";
 682                break;
 683        case -EINVAL:
 684        case -EAGAIN:
 685        case -EFBIG:
 686        case -EMSGSIZE:
 687                explanation = "internal error";
 688                break;
 689        case -EILSEQ:
 690        case -EPROTO:
 691        case -ETIME:
 692        case -ETIMEDOUT:
 693                explanation = "protocol error";
 694                if (hso_dev)
 695                        usb_queue_reset_device(hso_dev->interface);
 696                break;
 697        default:
 698                explanation = "unknown status";
 699                break;
 700        }
 701
 702        /* log a meaningful explanation of an USB status */
 703        hso_dbg(0x1, "%s: received USB status - %s (%d)\n",
 704                function, explanation, status);
 705}
 706
 707/* Network interface functions */
 708
 709/* called when net interface is brought up by ifconfig */
 710static int hso_net_open(struct net_device *net)
 711{
 712        struct hso_net *odev = netdev_priv(net);
 713        unsigned long flags = 0;
 714
 715        if (!odev) {
 716                dev_err(&net->dev, "No net device !\n");
 717                return -ENODEV;
 718        }
 719
 720        odev->skb_tx_buf = NULL;
 721
 722        /* setup environment */
 723        spin_lock_irqsave(&odev->net_lock, flags);
 724        odev->rx_parse_state = WAIT_IP;
 725        odev->rx_buf_size = 0;
 726        odev->rx_buf_missing = sizeof(struct iphdr);
 727        spin_unlock_irqrestore(&odev->net_lock, flags);
 728
 729        /* We are up and running. */
 730        set_bit(HSO_NET_RUNNING, &odev->flags);
 731        hso_start_net_device(odev->parent);
 732
 733        /* Tell the kernel we are ready to start receiving from it */
 734        netif_start_queue(net);
 735
 736        return 0;
 737}
 738
 739/* called when interface is brought down by ifconfig */
 740static int hso_net_close(struct net_device *net)
 741{
 742        struct hso_net *odev = netdev_priv(net);
 743
 744        /* we don't need the queue anymore */
 745        netif_stop_queue(net);
 746        /* no longer running */
 747        clear_bit(HSO_NET_RUNNING, &odev->flags);
 748
 749        hso_stop_net_device(odev->parent);
 750
 751        /* done */
 752        return 0;
 753}
 754
 755/* USB tells is xmit done, we should start the netqueue again */
 756static void write_bulk_callback(struct urb *urb)
 757{
 758        struct hso_net *odev = urb->context;
 759        int status = urb->status;
 760
 761        /* Sanity check */
 762        if (!odev || !test_bit(HSO_NET_RUNNING, &odev->flags)) {
 763                dev_err(&urb->dev->dev, "%s: device not running\n", __func__);
 764                return;
 765        }
 766
 767        /* Do we still have a valid kernel network device? */
 768        if (!netif_device_present(odev->net)) {
 769                dev_err(&urb->dev->dev, "%s: net device not present\n",
 770                        __func__);
 771                return;
 772        }
 773
 774        /* log status, but don't act on it, we don't need to resubmit anything
 775         * anyhow */
 776        if (status)
 777                handle_usb_error(status, __func__, odev->parent);
 778
 779        hso_put_activity(odev->parent);
 780
 781        /* Tell the network interface we are ready for another frame */
 782        netif_wake_queue(odev->net);
 783}
 784
 785/* called by kernel when we need to transmit a packet */
 786static netdev_tx_t hso_net_start_xmit(struct sk_buff *skb,
 787                                            struct net_device *net)
 788{
 789        struct hso_net *odev = netdev_priv(net);
 790        int result;
 791
 792        /* Tell the kernel, "No more frames 'til we are done with this one." */
 793        netif_stop_queue(net);
 794        if (hso_get_activity(odev->parent) == -EAGAIN) {
 795                odev->skb_tx_buf = skb;
 796                return NETDEV_TX_OK;
 797        }
 798
 799        /* log if asked */
 800        DUMP1(skb->data, skb->len);
 801        /* Copy it from kernel memory to OUR memory */
 802        memcpy(odev->mux_bulk_tx_buf, skb->data, skb->len);
 803        hso_dbg(0x1, "len: %d/%d\n", skb->len, MUX_BULK_TX_BUF_SIZE);
 804
 805        /* Fill in the URB for shipping it out. */
 806        usb_fill_bulk_urb(odev->mux_bulk_tx_urb,
 807                          odev->parent->usb,
 808                          usb_sndbulkpipe(odev->parent->usb,
 809                                          odev->out_endp->
 810                                          bEndpointAddress & 0x7F),
 811                          odev->mux_bulk_tx_buf, skb->len, write_bulk_callback,
 812                          odev);
 813
 814        /* Deal with the Zero Length packet problem, I hope */
 815        odev->mux_bulk_tx_urb->transfer_flags |= URB_ZERO_PACKET;
 816
 817        /* Send the URB on its merry way. */
 818        result = usb_submit_urb(odev->mux_bulk_tx_urb, GFP_ATOMIC);
 819        if (result) {
 820                dev_warn(&odev->parent->interface->dev,
 821                        "failed mux_bulk_tx_urb %d\n", result);
 822                net->stats.tx_errors++;
 823                netif_start_queue(net);
 824        } else {
 825                net->stats.tx_packets++;
 826                net->stats.tx_bytes += skb->len;
 827        }
 828        dev_kfree_skb(skb);
 829        /* we're done */
 830        return NETDEV_TX_OK;
 831}
 832
 833static const struct ethtool_ops ops = {
 834        .get_link = ethtool_op_get_link
 835};
 836
 837/* called when a packet did not ack after watchdogtimeout */
 838static void hso_net_tx_timeout(struct net_device *net)
 839{
 840        struct hso_net *odev = netdev_priv(net);
 841
 842        if (!odev)
 843                return;
 844
 845        /* Tell syslog we are hosed. */
 846        dev_warn(&net->dev, "Tx timed out.\n");
 847
 848        /* Tear the waiting frame off the list */
 849        if (odev->mux_bulk_tx_urb &&
 850            (odev->mux_bulk_tx_urb->status == -EINPROGRESS))
 851                usb_unlink_urb(odev->mux_bulk_tx_urb);
 852
 853        /* Update statistics */
 854        net->stats.tx_errors++;
 855}
 856
 857/* make a real packet from the received USB buffer */
 858static void packetizeRx(struct hso_net *odev, unsigned char *ip_pkt,
 859                        unsigned int count, unsigned char is_eop)
 860{
 861        unsigned short temp_bytes;
 862        unsigned short buffer_offset = 0;
 863        unsigned short frame_len;
 864        unsigned char *tmp_rx_buf;
 865
 866        /* log if needed */
 867        hso_dbg(0x1, "Rx %d bytes\n", count);
 868        DUMP(ip_pkt, min(128, (int)count));
 869
 870        while (count) {
 871                switch (odev->rx_parse_state) {
 872                case WAIT_IP:
 873                        /* waiting for IP header. */
 874                        /* wanted bytes - size of ip header */
 875                        temp_bytes =
 876                            (count <
 877                             odev->rx_buf_missing) ? count : odev->
 878                            rx_buf_missing;
 879
 880                        memcpy(((unsigned char *)(&odev->rx_ip_hdr)) +
 881                               odev->rx_buf_size, ip_pkt + buffer_offset,
 882                               temp_bytes);
 883
 884                        odev->rx_buf_size += temp_bytes;
 885                        buffer_offset += temp_bytes;
 886                        odev->rx_buf_missing -= temp_bytes;
 887                        count -= temp_bytes;
 888
 889                        if (!odev->rx_buf_missing) {
 890                                /* header is complete allocate an sk_buffer and
 891                                 * continue to WAIT_DATA */
 892                                frame_len = ntohs(odev->rx_ip_hdr.tot_len);
 893
 894                                if ((frame_len > DEFAULT_MRU) ||
 895                                    (frame_len < sizeof(struct iphdr))) {
 896                                        dev_err(&odev->net->dev,
 897                                                "Invalid frame (%d) length\n",
 898                                                frame_len);
 899                                        odev->rx_parse_state = WAIT_SYNC;
 900                                        continue;
 901                                }
 902                                /* Allocate an sk_buff */
 903                                odev->skb_rx_buf = netdev_alloc_skb(odev->net,
 904                                                                    frame_len);
 905                                if (!odev->skb_rx_buf) {
 906                                        /* We got no receive buffer. */
 907                                        hso_dbg(0x1, "could not allocate memory\n");
 908                                        odev->rx_parse_state = WAIT_SYNC;
 909                                        continue;
 910                                }
 911
 912                                /* Copy what we got so far. make room for iphdr
 913                                 * after tail. */
 914                                tmp_rx_buf =
 915                                    skb_put(odev->skb_rx_buf,
 916                                            sizeof(struct iphdr));
 917                                memcpy(tmp_rx_buf, (char *)&(odev->rx_ip_hdr),
 918                                       sizeof(struct iphdr));
 919
 920                                /* ETH_HLEN */
 921                                odev->rx_buf_size = sizeof(struct iphdr);
 922
 923                                /* Filip actually use .tot_len */
 924                                odev->rx_buf_missing =
 925                                    frame_len - sizeof(struct iphdr);
 926                                odev->rx_parse_state = WAIT_DATA;
 927                        }
 928                        break;
 929
 930                case WAIT_DATA:
 931                        temp_bytes = (count < odev->rx_buf_missing)
 932                                        ? count : odev->rx_buf_missing;
 933
 934                        /* Copy the rest of the bytes that are left in the
 935                         * buffer into the waiting sk_buf. */
 936                        /* Make room for temp_bytes after tail. */
 937                        tmp_rx_buf = skb_put(odev->skb_rx_buf, temp_bytes);
 938                        memcpy(tmp_rx_buf, ip_pkt + buffer_offset, temp_bytes);
 939
 940                        odev->rx_buf_missing -= temp_bytes;
 941                        count -= temp_bytes;
 942                        buffer_offset += temp_bytes;
 943                        odev->rx_buf_size += temp_bytes;
 944                        if (!odev->rx_buf_missing) {
 945                                /* Packet is complete. Inject into stack. */
 946                                /* We have IP packet here */
 947                                odev->skb_rx_buf->protocol = cpu_to_be16(ETH_P_IP);
 948                                skb_reset_mac_header(odev->skb_rx_buf);
 949
 950                                /* Ship it off to the kernel */
 951                                netif_rx(odev->skb_rx_buf);
 952                                /* No longer our buffer. */
 953                                odev->skb_rx_buf = NULL;
 954
 955                                /* update out statistics */
 956                                odev->net->stats.rx_packets++;
 957
 958                                odev->net->stats.rx_bytes += odev->rx_buf_size;
 959
 960                                odev->rx_buf_size = 0;
 961                                odev->rx_buf_missing = sizeof(struct iphdr);
 962                                odev->rx_parse_state = WAIT_IP;
 963                        }
 964                        break;
 965
 966                case WAIT_SYNC:
 967                        hso_dbg(0x1, " W_S\n");
 968                        count = 0;
 969                        break;
 970                default:
 971                        hso_dbg(0x1, "\n");
 972                        count--;
 973                        break;
 974                }
 975        }
 976
 977        /* Recovery mechanism for WAIT_SYNC state. */
 978        if (is_eop) {
 979                if (odev->rx_parse_state == WAIT_SYNC) {
 980                        odev->rx_parse_state = WAIT_IP;
 981                        odev->rx_buf_size = 0;
 982                        odev->rx_buf_missing = sizeof(struct iphdr);
 983                }
 984        }
 985}
 986
 987static void fix_crc_bug(struct urb *urb, __le16 max_packet_size)
 988{
 989        static const u8 crc_check[4] = { 0xDE, 0xAD, 0xBE, 0xEF };
 990        u32 rest = urb->actual_length % le16_to_cpu(max_packet_size);
 991
 992        if (((rest == 5) || (rest == 6)) &&
 993            !memcmp(((u8 *)urb->transfer_buffer) + urb->actual_length - 4,
 994                    crc_check, 4)) {
 995                urb->actual_length -= 4;
 996        }
 997}
 998
 999/* Moving data from usb to kernel (in interrupt state) */
1000static void read_bulk_callback(struct urb *urb)
1001{
1002        struct hso_net *odev = urb->context;
1003        struct net_device *net;
1004        int result;
1005        int status = urb->status;
1006
1007        /* is al ok?  (Filip: Who's Al ?) */
1008        if (status) {
1009                handle_usb_error(status, __func__, odev->parent);
1010                return;
1011        }
1012
1013        /* Sanity check */
1014        if (!odev || !test_bit(HSO_NET_RUNNING, &odev->flags)) {
1015                hso_dbg(0x1, "BULK IN callback but driver is not active!\n");
1016                return;
1017        }
1018        usb_mark_last_busy(urb->dev);
1019
1020        net = odev->net;
1021
1022        if (!netif_device_present(net)) {
1023                /* Somebody killed our network interface... */
1024                return;
1025        }
1026
1027        if (odev->parent->port_spec & HSO_INFO_CRC_BUG)
1028                fix_crc_bug(urb, odev->in_endp->wMaxPacketSize);
1029
1030        /* do we even have a packet? */
1031        if (urb->actual_length) {
1032                /* Handle the IP stream, add header and push it onto network
1033                 * stack if the packet is complete. */
1034                spin_lock(&odev->net_lock);
1035                packetizeRx(odev, urb->transfer_buffer, urb->actual_length,
1036                            (urb->transfer_buffer_length >
1037                             urb->actual_length) ? 1 : 0);
1038                spin_unlock(&odev->net_lock);
1039        }
1040
1041        /* We are done with this URB, resubmit it. Prep the USB to wait for
1042         * another frame. Reuse same as received. */
1043        usb_fill_bulk_urb(urb,
1044                          odev->parent->usb,
1045                          usb_rcvbulkpipe(odev->parent->usb,
1046                                          odev->in_endp->
1047                                          bEndpointAddress & 0x7F),
1048                          urb->transfer_buffer, MUX_BULK_RX_BUF_SIZE,
1049                          read_bulk_callback, odev);
1050
1051        /* Give this to the USB subsystem so it can tell us when more data
1052         * arrives. */
1053        result = usb_submit_urb(urb, GFP_ATOMIC);
1054        if (result)
1055                dev_warn(&odev->parent->interface->dev,
1056                         "%s failed submit mux_bulk_rx_urb %d\n", __func__,
1057                         result);
1058}
1059
1060/* Serial driver functions */
1061
1062static void hso_init_termios(struct ktermios *termios)
1063{
1064        /*
1065         * The default requirements for this device are:
1066         */
1067        termios->c_iflag &=
1068                ~(IGNBRK        /* disable ignore break */
1069                | BRKINT        /* disable break causes interrupt */
1070                | PARMRK        /* disable mark parity errors */
1071                | ISTRIP        /* disable clear high bit of input characters */
1072                | INLCR         /* disable translate NL to CR */
1073                | IGNCR         /* disable ignore CR */
1074                | ICRNL         /* disable translate CR to NL */
1075                | IXON);        /* disable enable XON/XOFF flow control */
1076
1077        /* disable postprocess output characters */
1078        termios->c_oflag &= ~OPOST;
1079
1080        termios->c_lflag &=
1081                ~(ECHO          /* disable echo input characters */
1082                | ECHONL        /* disable echo new line */
1083                | ICANON        /* disable erase, kill, werase, and rprnt
1084                                   special characters */
1085                | ISIG          /* disable interrupt, quit, and suspend special
1086                                   characters */
1087                | IEXTEN);      /* disable non-POSIX special characters */
1088
1089        termios->c_cflag &=
1090                ~(CSIZE         /* no size */
1091                | PARENB        /* disable parity bit */
1092                | CBAUD         /* clear current baud rate */
1093                | CBAUDEX);     /* clear current buad rate */
1094
1095        termios->c_cflag |= CS8;        /* character size 8 bits */
1096
1097        /* baud rate 115200 */
1098        tty_termios_encode_baud_rate(termios, 115200, 115200);
1099}
1100
1101static void _hso_serial_set_termios(struct tty_struct *tty,
1102                                    struct ktermios *old)
1103{
1104        struct hso_serial *serial = tty->driver_data;
1105
1106        if (!serial) {
1107                pr_err("%s: no tty structures", __func__);
1108                return;
1109        }
1110
1111        hso_dbg(0x8, "port %d\n", serial->minor);
1112
1113        /*
1114         *      Fix up unsupported bits
1115         */
1116        tty->termios.c_iflag &= ~IXON; /* disable enable XON/XOFF flow control */
1117
1118        tty->termios.c_cflag &=
1119                ~(CSIZE         /* no size */
1120                | PARENB        /* disable parity bit */
1121                | CBAUD         /* clear current baud rate */
1122                | CBAUDEX);     /* clear current buad rate */
1123
1124        tty->termios.c_cflag |= CS8;    /* character size 8 bits */
1125
1126        /* baud rate 115200 */
1127        tty_encode_baud_rate(tty, 115200, 115200);
1128}
1129
1130static void hso_resubmit_rx_bulk_urb(struct hso_serial *serial, struct urb *urb)
1131{
1132        int result;
1133        /* We are done with this URB, resubmit it. Prep the USB to wait for
1134         * another frame */
1135        usb_fill_bulk_urb(urb, serial->parent->usb,
1136                          usb_rcvbulkpipe(serial->parent->usb,
1137                                          serial->in_endp->
1138                                          bEndpointAddress & 0x7F),
1139                          urb->transfer_buffer, serial->rx_data_length,
1140                          hso_std_serial_read_bulk_callback, serial);
1141        /* Give this to the USB subsystem so it can tell us when more data
1142         * arrives. */
1143        result = usb_submit_urb(urb, GFP_ATOMIC);
1144        if (result) {
1145                dev_err(&urb->dev->dev, "%s failed submit serial rx_urb %d\n",
1146                        __func__, result);
1147        }
1148}
1149
1150
1151
1152
1153static void put_rxbuf_data_and_resubmit_bulk_urb(struct hso_serial *serial)
1154{
1155        int count;
1156        struct urb *curr_urb;
1157
1158        while (serial->rx_urb_filled[serial->curr_rx_urb_idx]) {
1159                curr_urb = serial->rx_urb[serial->curr_rx_urb_idx];
1160                count = put_rxbuf_data(curr_urb, serial);
1161                if (count == -1)
1162                        return;
1163                if (count == 0) {
1164                        serial->curr_rx_urb_idx++;
1165                        if (serial->curr_rx_urb_idx >= serial->num_rx_urbs)
1166                                serial->curr_rx_urb_idx = 0;
1167                        hso_resubmit_rx_bulk_urb(serial, curr_urb);
1168                }
1169        }
1170}
1171
1172static void put_rxbuf_data_and_resubmit_ctrl_urb(struct hso_serial *serial)
1173{
1174        int count = 0;
1175        struct urb *urb;
1176
1177        urb = serial->rx_urb[0];
1178        if (serial->port.count > 0) {
1179                count = put_rxbuf_data(urb, serial);
1180                if (count == -1)
1181                        return;
1182        }
1183        /* Re issue a read as long as we receive data. */
1184
1185        if (count == 0 && ((urb->actual_length != 0) ||
1186                           (serial->rx_state == RX_PENDING))) {
1187                serial->rx_state = RX_SENT;
1188                hso_mux_serial_read(serial);
1189        } else
1190                serial->rx_state = RX_IDLE;
1191}
1192
1193
1194/* read callback for Diag and CS port */
1195static void hso_std_serial_read_bulk_callback(struct urb *urb)
1196{
1197        struct hso_serial *serial = urb->context;
1198        int status = urb->status;
1199
1200        hso_dbg(0x8, "--- Got serial_read_bulk callback %02x ---\n", status);
1201
1202        /* sanity check */
1203        if (!serial) {
1204                hso_dbg(0x1, "serial == NULL\n");
1205                return;
1206        }
1207        if (status) {
1208                handle_usb_error(status, __func__, serial->parent);
1209                return;
1210        }
1211
1212        hso_dbg(0x1, "Actual length = %d\n", urb->actual_length);
1213        DUMP1(urb->transfer_buffer, urb->actual_length);
1214
1215        /* Anyone listening? */
1216        if (serial->port.count == 0)
1217                return;
1218
1219        if (serial->parent->port_spec & HSO_INFO_CRC_BUG)
1220                fix_crc_bug(urb, serial->in_endp->wMaxPacketSize);
1221        /* Valid data, handle RX data */
1222        spin_lock(&serial->serial_lock);
1223        serial->rx_urb_filled[hso_urb_to_index(serial, urb)] = 1;
1224        put_rxbuf_data_and_resubmit_bulk_urb(serial);
1225        spin_unlock(&serial->serial_lock);
1226}
1227
1228/*
1229 * This needs to be a tasklet otherwise we will
1230 * end up recursively calling this function.
1231 */
1232static void hso_unthrottle_tasklet(struct hso_serial *serial)
1233{
1234        unsigned long flags;
1235
1236        spin_lock_irqsave(&serial->serial_lock, flags);
1237        if ((serial->parent->port_spec & HSO_INTF_MUX))
1238                put_rxbuf_data_and_resubmit_ctrl_urb(serial);
1239        else
1240                put_rxbuf_data_and_resubmit_bulk_urb(serial);
1241        spin_unlock_irqrestore(&serial->serial_lock, flags);
1242}
1243
1244static  void hso_unthrottle(struct tty_struct *tty)
1245{
1246        struct hso_serial *serial = tty->driver_data;
1247
1248        tasklet_hi_schedule(&serial->unthrottle_tasklet);
1249}
1250
1251/* open the requested serial port */
1252static int hso_serial_open(struct tty_struct *tty, struct file *filp)
1253{
1254        struct hso_serial *serial = get_serial_by_index(tty->index);
1255        int result;
1256
1257        /* sanity check */
1258        if (serial == NULL || serial->magic != HSO_SERIAL_MAGIC) {
1259                WARN_ON(1);
1260                tty->driver_data = NULL;
1261                hso_dbg(0x1, "Failed to open port\n");
1262                return -ENODEV;
1263        }
1264
1265        mutex_lock(&serial->parent->mutex);
1266        result = usb_autopm_get_interface(serial->parent->interface);
1267        if (result < 0)
1268                goto err_out;
1269
1270        hso_dbg(0x1, "Opening %d\n", serial->minor);
1271
1272        /* setup */
1273        tty->driver_data = serial;
1274        tty_port_tty_set(&serial->port, tty);
1275
1276        /* check for port already opened, if not set the termios */
1277        serial->port.count++;
1278        if (serial->port.count == 1) {
1279                serial->rx_state = RX_IDLE;
1280                /* Force default termio settings */
1281                _hso_serial_set_termios(tty, NULL);
1282                tasklet_init(&serial->unthrottle_tasklet,
1283                             (void (*)(unsigned long))hso_unthrottle_tasklet,
1284                             (unsigned long)serial);
1285                result = hso_start_serial_device(serial->parent, GFP_KERNEL);
1286                if (result) {
1287                        hso_stop_serial_device(serial->parent);
1288                        serial->port.count--;
1289                } else {
1290                        kref_get(&serial->parent->ref);
1291                }
1292        } else {
1293                hso_dbg(0x1, "Port was already open\n");
1294        }
1295
1296        usb_autopm_put_interface(serial->parent->interface);
1297
1298        /* done */
1299        if (result)
1300                hso_serial_tiocmset(tty, TIOCM_RTS | TIOCM_DTR, 0);
1301err_out:
1302        mutex_unlock(&serial->parent->mutex);
1303        return result;
1304}
1305
1306/* close the requested serial port */
1307static void hso_serial_close(struct tty_struct *tty, struct file *filp)
1308{
1309        struct hso_serial *serial = tty->driver_data;
1310        u8 usb_gone;
1311
1312        hso_dbg(0x1, "Closing serial port\n");
1313
1314        /* Open failed, no close cleanup required */
1315        if (serial == NULL)
1316                return;
1317
1318        mutex_lock(&serial->parent->mutex);
1319        usb_gone = serial->parent->usb_gone;
1320
1321        if (!usb_gone)
1322                usb_autopm_get_interface(serial->parent->interface);
1323
1324        /* reset the rts and dtr */
1325        /* do the actual close */
1326        serial->port.count--;
1327
1328        if (serial->port.count <= 0) {
1329                serial->port.count = 0;
1330                tty_port_tty_set(&serial->port, NULL);
1331                if (!usb_gone)
1332                        hso_stop_serial_device(serial->parent);
1333                tasklet_kill(&serial->unthrottle_tasklet);
1334        }
1335
1336        if (!usb_gone)
1337                usb_autopm_put_interface(serial->parent->interface);
1338
1339        mutex_unlock(&serial->parent->mutex);
1340}
1341
1342/* close the requested serial port */
1343static int hso_serial_write(struct tty_struct *tty, const unsigned char *buf,
1344                            int count)
1345{
1346        struct hso_serial *serial = tty->driver_data;
1347        int space, tx_bytes;
1348        unsigned long flags;
1349
1350        /* sanity check */
1351        if (serial == NULL) {
1352                pr_err("%s: serial is NULL\n", __func__);
1353                return -ENODEV;
1354        }
1355
1356        spin_lock_irqsave(&serial->serial_lock, flags);
1357
1358        space = serial->tx_data_length - serial->tx_buffer_count;
1359        tx_bytes = (count < space) ? count : space;
1360
1361        if (!tx_bytes)
1362                goto out;
1363
1364        memcpy(serial->tx_buffer + serial->tx_buffer_count, buf, tx_bytes);
1365        serial->tx_buffer_count += tx_bytes;
1366
1367out:
1368        spin_unlock_irqrestore(&serial->serial_lock, flags);
1369
1370        hso_kick_transmit(serial);
1371        /* done */
1372        return tx_bytes;
1373}
1374
1375/* how much room is there for writing */
1376static int hso_serial_write_room(struct tty_struct *tty)
1377{
1378        struct hso_serial *serial = tty->driver_data;
1379        int room;
1380        unsigned long flags;
1381
1382        spin_lock_irqsave(&serial->serial_lock, flags);
1383        room = serial->tx_data_length - serial->tx_buffer_count;
1384        spin_unlock_irqrestore(&serial->serial_lock, flags);
1385
1386        /* return free room */
1387        return room;
1388}
1389
1390static void hso_serial_cleanup(struct tty_struct *tty)
1391{
1392        struct hso_serial *serial = tty->driver_data;
1393
1394        if (!serial)
1395                return;
1396
1397        kref_put(&serial->parent->ref, hso_serial_ref_free);
1398}
1399
1400/* setup the term */
1401static void hso_serial_set_termios(struct tty_struct *tty, struct ktermios *old)
1402{
1403        struct hso_serial *serial = tty->driver_data;
1404        unsigned long flags;
1405
1406        if (old)
1407                hso_dbg(0x16, "Termios called with: cflags new[%d] - old[%d]\n",
1408                        tty->termios.c_cflag, old->c_cflag);
1409
1410        /* the actual setup */
1411        spin_lock_irqsave(&serial->serial_lock, flags);
1412        if (serial->port.count)
1413                _hso_serial_set_termios(tty, old);
1414        else
1415                tty->termios = *old;
1416        spin_unlock_irqrestore(&serial->serial_lock, flags);
1417
1418        /* done */
1419}
1420
1421/* how many characters in the buffer */
1422static int hso_serial_chars_in_buffer(struct tty_struct *tty)
1423{
1424        struct hso_serial *serial = tty->driver_data;
1425        int chars;
1426        unsigned long flags;
1427
1428        /* sanity check */
1429        if (serial == NULL)
1430                return 0;
1431
1432        spin_lock_irqsave(&serial->serial_lock, flags);
1433        chars = serial->tx_buffer_count;
1434        spin_unlock_irqrestore(&serial->serial_lock, flags);
1435
1436        return chars;
1437}
1438static int tiocmget_submit_urb(struct hso_serial *serial,
1439                               struct hso_tiocmget *tiocmget,
1440                               struct usb_device *usb)
1441{
1442        int result;
1443
1444        if (serial->parent->usb_gone)
1445                return -ENODEV;
1446        usb_fill_int_urb(tiocmget->urb, usb,
1447                         usb_rcvintpipe(usb,
1448                                        tiocmget->endp->
1449                                        bEndpointAddress & 0x7F),
1450                         &tiocmget->serial_state_notification,
1451                         sizeof(struct hso_serial_state_notification),
1452                         tiocmget_intr_callback, serial,
1453                         tiocmget->endp->bInterval);
1454        result = usb_submit_urb(tiocmget->urb, GFP_ATOMIC);
1455        if (result) {
1456                dev_warn(&usb->dev, "%s usb_submit_urb failed %d\n", __func__,
1457                         result);
1458        }
1459        return result;
1460
1461}
1462
1463static void tiocmget_intr_callback(struct urb *urb)
1464{
1465        struct hso_serial *serial = urb->context;
1466        struct hso_tiocmget *tiocmget;
1467        int status = urb->status;
1468        u16 UART_state_bitmap, prev_UART_state_bitmap;
1469        struct uart_icount *icount;
1470        struct hso_serial_state_notification *serial_state_notification;
1471        struct usb_device *usb;
1472        struct usb_interface *interface;
1473        int if_num;
1474
1475        /* Sanity checks */
1476        if (!serial)
1477                return;
1478        if (status) {
1479                handle_usb_error(status, __func__, serial->parent);
1480                return;
1481        }
1482
1483        /* tiocmget is only supported on HSO_PORT_MODEM */
1484        tiocmget = serial->tiocmget;
1485        if (!tiocmget)
1486                return;
1487        BUG_ON((serial->parent->port_spec & HSO_PORT_MASK) != HSO_PORT_MODEM);
1488
1489        usb = serial->parent->usb;
1490        interface = serial->parent->interface;
1491
1492        if_num = interface->cur_altsetting->desc.bInterfaceNumber;
1493
1494        /* wIndex should be the USB interface number of the port to which the
1495         * notification applies, which should always be the Modem port.
1496         */
1497        serial_state_notification = &tiocmget->serial_state_notification;
1498        if (serial_state_notification->bmRequestType != BM_REQUEST_TYPE ||
1499            serial_state_notification->bNotification != B_NOTIFICATION ||
1500            le16_to_cpu(serial_state_notification->wValue) != W_VALUE ||
1501            le16_to_cpu(serial_state_notification->wIndex) != if_num ||
1502            le16_to_cpu(serial_state_notification->wLength) != W_LENGTH) {
1503                dev_warn(&usb->dev,
1504                         "hso received invalid serial state notification\n");
1505                DUMP(serial_state_notification,
1506                     sizeof(struct hso_serial_state_notification));
1507        } else {
1508
1509                UART_state_bitmap = le16_to_cpu(serial_state_notification->
1510                                                UART_state_bitmap);
1511                prev_UART_state_bitmap = tiocmget->prev_UART_state_bitmap;
1512                icount = &tiocmget->icount;
1513                spin_lock(&serial->serial_lock);
1514                if ((UART_state_bitmap & B_OVERRUN) !=
1515                   (prev_UART_state_bitmap & B_OVERRUN))
1516                        icount->parity++;
1517                if ((UART_state_bitmap & B_PARITY) !=
1518                   (prev_UART_state_bitmap & B_PARITY))
1519                        icount->parity++;
1520                if ((UART_state_bitmap & B_FRAMING) !=
1521                   (prev_UART_state_bitmap & B_FRAMING))
1522                        icount->frame++;
1523                if ((UART_state_bitmap & B_RING_SIGNAL) &&
1524                   !(prev_UART_state_bitmap & B_RING_SIGNAL))
1525                        icount->rng++;
1526                if ((UART_state_bitmap & B_BREAK) !=
1527                   (prev_UART_state_bitmap & B_BREAK))
1528                        icount->brk++;
1529                if ((UART_state_bitmap & B_TX_CARRIER) !=
1530                   (prev_UART_state_bitmap & B_TX_CARRIER))
1531                        icount->dsr++;
1532                if ((UART_state_bitmap & B_RX_CARRIER) !=
1533                   (prev_UART_state_bitmap & B_RX_CARRIER))
1534                        icount->dcd++;
1535                tiocmget->prev_UART_state_bitmap = UART_state_bitmap;
1536                spin_unlock(&serial->serial_lock);
1537                tiocmget->intr_completed = 1;
1538                wake_up_interruptible(&tiocmget->waitq);
1539        }
1540        memset(serial_state_notification, 0,
1541               sizeof(struct hso_serial_state_notification));
1542        tiocmget_submit_urb(serial,
1543                            tiocmget,
1544                            serial->parent->usb);
1545}
1546
1547/*
1548 * next few functions largely stolen from drivers/serial/serial_core.c
1549 */
1550/* Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change
1551 * - mask passed in arg for lines of interest
1552 *   (use |'ed TIOCM_RNG/DSR/CD/CTS for masking)
1553 * Caller should use TIOCGICOUNT to see which one it was
1554 */
1555static int
1556hso_wait_modem_status(struct hso_serial *serial, unsigned long arg)
1557{
1558        DECLARE_WAITQUEUE(wait, current);
1559        struct uart_icount cprev, cnow;
1560        struct hso_tiocmget  *tiocmget;
1561        int ret;
1562
1563        tiocmget = serial->tiocmget;
1564        if (!tiocmget)
1565                return -ENOENT;
1566        /*
1567         * note the counters on entry
1568         */
1569        spin_lock_irq(&serial->serial_lock);
1570        memcpy(&cprev, &tiocmget->icount, sizeof(struct uart_icount));
1571        spin_unlock_irq(&serial->serial_lock);
1572        add_wait_queue(&tiocmget->waitq, &wait);
1573        for (;;) {
1574                spin_lock_irq(&serial->serial_lock);
1575                memcpy(&cnow, &tiocmget->icount, sizeof(struct uart_icount));
1576                spin_unlock_irq(&serial->serial_lock);
1577                set_current_state(TASK_INTERRUPTIBLE);
1578                if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
1579                    ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
1580                    ((arg & TIOCM_CD)  && (cnow.dcd != cprev.dcd))) {
1581                        ret = 0;
1582                        break;
1583                }
1584                schedule();
1585                /* see if a signal did it */
1586                if (signal_pending(current)) {
1587                        ret = -ERESTARTSYS;
1588                        break;
1589                }
1590                cprev = cnow;
1591        }
1592        __set_current_state(TASK_RUNNING);
1593        remove_wait_queue(&tiocmget->waitq, &wait);
1594
1595        return ret;
1596}
1597
1598/*
1599 * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
1600 * Return: write counters to the user passed counter struct
1601 * NB: both 1->0 and 0->1 transitions are counted except for
1602 *     RI where only 0->1 is counted.
1603 */
1604static int hso_get_count(struct tty_struct *tty,
1605                  struct serial_icounter_struct *icount)
1606{
1607        struct uart_icount cnow;
1608        struct hso_serial *serial = tty->driver_data;
1609        struct hso_tiocmget  *tiocmget = serial->tiocmget;
1610
1611        memset(icount, 0, sizeof(struct serial_icounter_struct));
1612
1613        if (!tiocmget)
1614                 return -ENOENT;
1615        spin_lock_irq(&serial->serial_lock);
1616        memcpy(&cnow, &tiocmget->icount, sizeof(struct uart_icount));
1617        spin_unlock_irq(&serial->serial_lock);
1618
1619        icount->cts         = cnow.cts;
1620        icount->dsr         = cnow.dsr;
1621        icount->rng         = cnow.rng;
1622        icount->dcd         = cnow.dcd;
1623        icount->rx          = cnow.rx;
1624        icount->tx          = cnow.tx;
1625        icount->frame       = cnow.frame;
1626        icount->overrun     = cnow.overrun;
1627        icount->parity      = cnow.parity;
1628        icount->brk         = cnow.brk;
1629        icount->buf_overrun = cnow.buf_overrun;
1630
1631        return 0;
1632}
1633
1634
1635static int hso_serial_tiocmget(struct tty_struct *tty)
1636{
1637        int retval;
1638        struct hso_serial *serial = tty->driver_data;
1639        struct hso_tiocmget  *tiocmget;
1640        u16 UART_state_bitmap;
1641
1642        /* sanity check */
1643        if (!serial) {
1644                hso_dbg(0x1, "no tty structures\n");
1645                return -EINVAL;
1646        }
1647        spin_lock_irq(&serial->serial_lock);
1648        retval = ((serial->rts_state) ? TIOCM_RTS : 0) |
1649            ((serial->dtr_state) ? TIOCM_DTR : 0);
1650        tiocmget = serial->tiocmget;
1651        if (tiocmget) {
1652
1653                UART_state_bitmap = le16_to_cpu(
1654                        tiocmget->prev_UART_state_bitmap);
1655                if (UART_state_bitmap & B_RING_SIGNAL)
1656                        retval |=  TIOCM_RNG;
1657                if (UART_state_bitmap & B_RX_CARRIER)
1658                        retval |=  TIOCM_CD;
1659                if (UART_state_bitmap & B_TX_CARRIER)
1660                        retval |=  TIOCM_DSR;
1661        }
1662        spin_unlock_irq(&serial->serial_lock);
1663        return retval;
1664}
1665
1666static int hso_serial_tiocmset(struct tty_struct *tty,
1667                               unsigned int set, unsigned int clear)
1668{
1669        int val = 0;
1670        unsigned long flags;
1671        int if_num;
1672        struct hso_serial *serial = tty->driver_data;
1673        struct usb_interface *interface;
1674
1675        /* sanity check */
1676        if (!serial) {
1677                hso_dbg(0x1, "no tty structures\n");
1678                return -EINVAL;
1679        }
1680
1681        if ((serial->parent->port_spec & HSO_PORT_MASK) != HSO_PORT_MODEM)
1682                return -EINVAL;
1683
1684        interface = serial->parent->interface;
1685        if_num = interface->cur_altsetting->desc.bInterfaceNumber;
1686
1687        spin_lock_irqsave(&serial->serial_lock, flags);
1688        if (set & TIOCM_RTS)
1689                serial->rts_state = 1;
1690        if (set & TIOCM_DTR)
1691                serial->dtr_state = 1;
1692
1693        if (clear & TIOCM_RTS)
1694                serial->rts_state = 0;
1695        if (clear & TIOCM_DTR)
1696                serial->dtr_state = 0;
1697
1698        if (serial->dtr_state)
1699                val |= 0x01;
1700        if (serial->rts_state)
1701                val |= 0x02;
1702
1703        spin_unlock_irqrestore(&serial->serial_lock, flags);
1704
1705        return usb_control_msg(serial->parent->usb,
1706                               usb_rcvctrlpipe(serial->parent->usb, 0), 0x22,
1707                               0x21, val, if_num, NULL, 0,
1708                               USB_CTRL_SET_TIMEOUT);
1709}
1710
1711static int hso_serial_ioctl(struct tty_struct *tty,
1712                            unsigned int cmd, unsigned long arg)
1713{
1714        struct hso_serial *serial = tty->driver_data;
1715        int ret = 0;
1716        hso_dbg(0x8, "IOCTL cmd: %d, arg: %ld\n", cmd, arg);
1717
1718        if (!serial)
1719                return -ENODEV;
1720        switch (cmd) {
1721        case TIOCMIWAIT:
1722                ret = hso_wait_modem_status(serial, arg);
1723                break;
1724        default:
1725                ret = -ENOIOCTLCMD;
1726                break;
1727        }
1728        return ret;
1729}
1730
1731
1732/* starts a transmit */
1733static void hso_kick_transmit(struct hso_serial *serial)
1734{
1735        u8 *temp;
1736        unsigned long flags;
1737        int res;
1738
1739        spin_lock_irqsave(&serial->serial_lock, flags);
1740        if (!serial->tx_buffer_count)
1741                goto out;
1742
1743        if (serial->tx_urb_used)
1744                goto out;
1745
1746        /* Wakeup USB interface if necessary */
1747        if (hso_get_activity(serial->parent) == -EAGAIN)
1748                goto out;
1749
1750        /* Switch pointers around to avoid memcpy */
1751        temp = serial->tx_buffer;
1752        serial->tx_buffer = serial->tx_data;
1753        serial->tx_data = temp;
1754        serial->tx_data_count = serial->tx_buffer_count;
1755        serial->tx_buffer_count = 0;
1756
1757        /* If temp is set, it means we switched buffers */
1758        if (temp && serial->write_data) {
1759                res = serial->write_data(serial);
1760                if (res >= 0)
1761                        serial->tx_urb_used = 1;
1762        }
1763out:
1764        spin_unlock_irqrestore(&serial->serial_lock, flags);
1765}
1766
1767/* make a request (for reading and writing data to muxed serial port) */
1768static int mux_device_request(struct hso_serial *serial, u8 type, u16 port,
1769                              struct urb *ctrl_urb,
1770                              struct usb_ctrlrequest *ctrl_req,
1771                              u8 *ctrl_urb_data, u32 size)
1772{
1773        int result;
1774        int pipe;
1775
1776        /* Sanity check */
1777        if (!serial || !ctrl_urb || !ctrl_req) {
1778                pr_err("%s: Wrong arguments\n", __func__);
1779                return -EINVAL;
1780        }
1781
1782        /* initialize */
1783        ctrl_req->wValue = 0;
1784        ctrl_req->wIndex = cpu_to_le16(hso_port_to_mux(port));
1785        ctrl_req->wLength = cpu_to_le16(size);
1786
1787        if (type == USB_CDC_GET_ENCAPSULATED_RESPONSE) {
1788                /* Reading command */
1789                ctrl_req->bRequestType = USB_DIR_IN |
1790                                         USB_TYPE_OPTION_VENDOR |
1791                                         USB_RECIP_INTERFACE;
1792                ctrl_req->bRequest = USB_CDC_GET_ENCAPSULATED_RESPONSE;
1793                pipe = usb_rcvctrlpipe(serial->parent->usb, 0);
1794        } else {
1795                /* Writing command */
1796                ctrl_req->bRequestType = USB_DIR_OUT |
1797                                         USB_TYPE_OPTION_VENDOR |
1798                                         USB_RECIP_INTERFACE;
1799                ctrl_req->bRequest = USB_CDC_SEND_ENCAPSULATED_COMMAND;
1800                pipe = usb_sndctrlpipe(serial->parent->usb, 0);
1801        }
1802        /* syslog */
1803        hso_dbg(0x2, "%s command (%02x) len: %d, port: %d\n",
1804                type == USB_CDC_GET_ENCAPSULATED_RESPONSE ? "Read" : "Write",
1805                ctrl_req->bRequestType, ctrl_req->wLength, port);
1806
1807        /* Load ctrl urb */
1808        ctrl_urb->transfer_flags = 0;
1809        usb_fill_control_urb(ctrl_urb,
1810                             serial->parent->usb,
1811                             pipe,
1812                             (u8 *) ctrl_req,
1813                             ctrl_urb_data, size, ctrl_callback, serial);
1814        /* Send it on merry way */
1815        result = usb_submit_urb(ctrl_urb, GFP_ATOMIC);
1816        if (result) {
1817                dev_err(&ctrl_urb->dev->dev,
1818                        "%s failed submit ctrl_urb %d type %d\n", __func__,
1819                        result, type);
1820                return result;
1821        }
1822
1823        /* done */
1824        return size;
1825}
1826
1827/* called by intr_callback when read occurs */
1828static int hso_mux_serial_read(struct hso_serial *serial)
1829{
1830        if (!serial)
1831                return -EINVAL;
1832
1833        /* clean data */
1834        memset(serial->rx_data[0], 0, CTRL_URB_RX_SIZE);
1835        /* make the request */
1836
1837        if (serial->num_rx_urbs != 1) {
1838                dev_err(&serial->parent->interface->dev,
1839                        "ERROR: mux'd reads with multiple buffers "
1840                        "not possible\n");
1841                return 0;
1842        }
1843        return mux_device_request(serial,
1844                                  USB_CDC_GET_ENCAPSULATED_RESPONSE,
1845                                  serial->parent->port_spec & HSO_PORT_MASK,
1846                                  serial->rx_urb[0],
1847                                  &serial->ctrl_req_rx,
1848                                  serial->rx_data[0], serial->rx_data_length);
1849}
1850
1851/* used for muxed serial port callback (muxed serial read) */
1852static void intr_callback(struct urb *urb)
1853{
1854        struct hso_shared_int *shared_int = urb->context;
1855        struct hso_serial *serial;
1856        unsigned char *port_req;
1857        int status = urb->status;
1858        int i;
1859
1860        usb_mark_last_busy(urb->dev);
1861
1862        /* sanity check */
1863        if (!shared_int)
1864                return;
1865
1866        /* status check */
1867        if (status) {
1868                handle_usb_error(status, __func__, NULL);
1869                return;
1870        }
1871        hso_dbg(0x8, "--- Got intr callback 0x%02X ---\n", status);
1872
1873        /* what request? */
1874        port_req = urb->transfer_buffer;
1875        hso_dbg(0x8, "port_req = 0x%.2X\n", *port_req);
1876        /* loop over all muxed ports to find the one sending this */
1877        for (i = 0; i < 8; i++) {
1878                /* max 8 channels on MUX */
1879                if (*port_req & (1 << i)) {
1880                        serial = get_serial_by_shared_int_and_type(shared_int,
1881                                                                   (1 << i));
1882                        if (serial != NULL) {
1883                                hso_dbg(0x1, "Pending read interrupt on port %d\n",
1884                                        i);
1885                                spin_lock(&serial->serial_lock);
1886                                if (serial->rx_state == RX_IDLE &&
1887                                        serial->port.count > 0) {
1888                                        /* Setup and send a ctrl req read on
1889                                         * port i */
1890                                        if (!serial->rx_urb_filled[0]) {
1891                                                serial->rx_state = RX_SENT;
1892                                                hso_mux_serial_read(serial);
1893                                        } else
1894                                                serial->rx_state = RX_PENDING;
1895                                } else {
1896                                        hso_dbg(0x1, "Already a read pending on port %d or port not open\n",
1897                                                i);
1898                                }
1899                                spin_unlock(&serial->serial_lock);
1900                        }
1901                }
1902        }
1903        /* Resubmit interrupt urb */
1904        hso_mux_submit_intr_urb(shared_int, urb->dev, GFP_ATOMIC);
1905}
1906
1907/* called for writing to muxed serial port */
1908static int hso_mux_serial_write_data(struct hso_serial *serial)
1909{
1910        if (NULL == serial)
1911                return -EINVAL;
1912
1913        return mux_device_request(serial,
1914                                  USB_CDC_SEND_ENCAPSULATED_COMMAND,
1915                                  serial->parent->port_spec & HSO_PORT_MASK,
1916                                  serial->tx_urb,
1917                                  &serial->ctrl_req_tx,
1918                                  serial->tx_data, serial->tx_data_count);
1919}
1920
1921/* write callback for Diag and CS port */
1922static void hso_std_serial_write_bulk_callback(struct urb *urb)
1923{
1924        struct hso_serial *serial = urb->context;
1925        int status = urb->status;
1926
1927        /* sanity check */
1928        if (!serial) {
1929                hso_dbg(0x1, "serial == NULL\n");
1930                return;
1931        }
1932
1933        spin_lock(&serial->serial_lock);
1934        serial->tx_urb_used = 0;
1935        spin_unlock(&serial->serial_lock);
1936        if (status) {
1937                handle_usb_error(status, __func__, serial->parent);
1938                return;
1939        }
1940        hso_put_activity(serial->parent);
1941        tty_port_tty_wakeup(&serial->port);
1942        hso_kick_transmit(serial);
1943
1944        hso_dbg(0x1, "\n");
1945}
1946
1947/* called for writing diag or CS serial port */
1948static int hso_std_serial_write_data(struct hso_serial *serial)
1949{
1950        int count = serial->tx_data_count;
1951        int result;
1952
1953        usb_fill_bulk_urb(serial->tx_urb,
1954                          serial->parent->usb,
1955                          usb_sndbulkpipe(serial->parent->usb,
1956                                          serial->out_endp->
1957                                          bEndpointAddress & 0x7F),
1958                          serial->tx_data, serial->tx_data_count,
1959                          hso_std_serial_write_bulk_callback, serial);
1960
1961        result = usb_submit_urb(serial->tx_urb, GFP_ATOMIC);
1962        if (result) {
1963                dev_warn(&serial->parent->usb->dev,
1964                         "Failed to submit urb - res %d\n", result);
1965                return result;
1966        }
1967
1968        return count;
1969}
1970
1971/* callback after read or write on muxed serial port */
1972static void ctrl_callback(struct urb *urb)
1973{
1974        struct hso_serial *serial = urb->context;
1975        struct usb_ctrlrequest *req;
1976        int status = urb->status;
1977
1978        /* sanity check */
1979        if (!serial)
1980                return;
1981
1982        spin_lock(&serial->serial_lock);
1983        serial->tx_urb_used = 0;
1984        spin_unlock(&serial->serial_lock);
1985        if (status) {
1986                handle_usb_error(status, __func__, serial->parent);
1987                return;
1988        }
1989
1990        /* what request? */
1991        req = (struct usb_ctrlrequest *)(urb->setup_packet);
1992        hso_dbg(0x8, "--- Got muxed ctrl callback 0x%02X ---\n", status);
1993        hso_dbg(0x8, "Actual length of urb = %d\n", urb->actual_length);
1994        DUMP1(urb->transfer_buffer, urb->actual_length);
1995
1996        if (req->bRequestType ==
1997            (USB_DIR_IN | USB_TYPE_OPTION_VENDOR | USB_RECIP_INTERFACE)) {
1998                /* response to a read command */
1999                serial->rx_urb_filled[0] = 1;
2000                spin_lock(&serial->serial_lock);
2001                put_rxbuf_data_and_resubmit_ctrl_urb(serial);
2002                spin_unlock(&serial->serial_lock);
2003        } else {
2004                hso_put_activity(serial->parent);
2005                tty_port_tty_wakeup(&serial->port);
2006                /* response to a write command */
2007                hso_kick_transmit(serial);
2008        }
2009}
2010
2011/* handle RX data for serial port */
2012static int put_rxbuf_data(struct urb *urb, struct hso_serial *serial)
2013{
2014        struct tty_struct *tty;
2015        int count;
2016
2017        /* Sanity check */
2018        if (urb == NULL || serial == NULL) {
2019                hso_dbg(0x1, "serial = NULL\n");
2020                return -2;
2021        }
2022
2023        tty = tty_port_tty_get(&serial->port);
2024
2025        if (tty && tty_throttled(tty)) {
2026                tty_kref_put(tty);
2027                return -1;
2028        }
2029
2030        /* Push data to tty */
2031        hso_dbg(0x1, "data to push to tty\n");
2032        count = tty_buffer_request_room(&serial->port, urb->actual_length);
2033        if (count >= urb->actual_length) {
2034                tty_insert_flip_string(&serial->port, urb->transfer_buffer,
2035                                       urb->actual_length);
2036                tty_flip_buffer_push(&serial->port);
2037        } else {
2038                dev_warn(&serial->parent->usb->dev,
2039                         "dropping data, %d bytes lost\n", urb->actual_length);
2040        }
2041
2042        tty_kref_put(tty);
2043
2044        serial->rx_urb_filled[hso_urb_to_index(serial, urb)] = 0;
2045
2046        return 0;
2047}
2048
2049
2050/* Base driver functions */
2051
2052static void hso_log_port(struct hso_device *hso_dev)
2053{
2054        char *port_type;
2055        char port_dev[20];
2056
2057        switch (hso_dev->port_spec & HSO_PORT_MASK) {
2058        case HSO_PORT_CONTROL:
2059                port_type = "Control";
2060                break;
2061        case HSO_PORT_APP:
2062                port_type = "Application";
2063                break;
2064        case HSO_PORT_GPS:
2065                port_type = "GPS";
2066                break;
2067        case HSO_PORT_GPS_CONTROL:
2068                port_type = "GPS control";
2069                break;
2070        case HSO_PORT_APP2:
2071                port_type = "Application2";
2072                break;
2073        case HSO_PORT_PCSC:
2074                port_type = "PCSC";
2075                break;
2076        case HSO_PORT_DIAG:
2077                port_type = "Diagnostic";
2078                break;
2079        case HSO_PORT_DIAG2:
2080                port_type = "Diagnostic2";
2081                break;
2082        case HSO_PORT_MODEM:
2083                port_type = "Modem";
2084                break;
2085        case HSO_PORT_NETWORK:
2086                port_type = "Network";
2087                break;
2088        default:
2089                port_type = "Unknown";
2090                break;
2091        }
2092        if ((hso_dev->port_spec & HSO_PORT_MASK) == HSO_PORT_NETWORK) {
2093                sprintf(port_dev, "%s", dev2net(hso_dev)->net->name);
2094        } else
2095                sprintf(port_dev, "/dev/%s%d", tty_filename,
2096                        dev2ser(hso_dev)->minor);
2097
2098        dev_dbg(&hso_dev->interface->dev, "HSO: Found %s port %s\n",
2099                port_type, port_dev);
2100}
2101
2102static int hso_start_net_device(struct hso_device *hso_dev)
2103{
2104        int i, result = 0;
2105        struct hso_net *hso_net = dev2net(hso_dev);
2106
2107        if (!hso_net)
2108                return -ENODEV;
2109
2110        /* send URBs for all read buffers */
2111        for (i = 0; i < MUX_BULK_RX_BUF_COUNT; i++) {
2112
2113                /* Prep a receive URB */
2114                usb_fill_bulk_urb(hso_net->mux_bulk_rx_urb_pool[i],
2115                                  hso_dev->usb,
2116                                  usb_rcvbulkpipe(hso_dev->usb,
2117                                                  hso_net->in_endp->
2118                                                  bEndpointAddress & 0x7F),
2119                                  hso_net->mux_bulk_rx_buf_pool[i],
2120                                  MUX_BULK_RX_BUF_SIZE, read_bulk_callback,
2121                                  hso_net);
2122
2123                /* Put it out there so the device can send us stuff */
2124                result = usb_submit_urb(hso_net->mux_bulk_rx_urb_pool[i],
2125                                        GFP_NOIO);
2126                if (result)
2127                        dev_warn(&hso_dev->usb->dev,
2128                                "%s failed mux_bulk_rx_urb[%d] %d\n", __func__,
2129                                i, result);
2130        }
2131
2132        return result;
2133}
2134
2135static int hso_stop_net_device(struct hso_device *hso_dev)
2136{
2137        int i;
2138        struct hso_net *hso_net = dev2net(hso_dev);
2139
2140        if (!hso_net)
2141                return -ENODEV;
2142
2143        for (i = 0; i < MUX_BULK_RX_BUF_COUNT; i++) {
2144                if (hso_net->mux_bulk_rx_urb_pool[i])
2145                        usb_kill_urb(hso_net->mux_bulk_rx_urb_pool[i]);
2146
2147        }
2148        if (hso_net->mux_bulk_tx_urb)
2149                usb_kill_urb(hso_net->mux_bulk_tx_urb);
2150
2151        return 0;
2152}
2153
2154static int hso_start_serial_device(struct hso_device *hso_dev, gfp_t flags)
2155{
2156        int i, result = 0;
2157        struct hso_serial *serial = dev2ser(hso_dev);
2158
2159        if (!serial)
2160                return -ENODEV;
2161
2162        /* If it is not the MUX port fill in and submit a bulk urb (already
2163         * allocated in hso_serial_start) */
2164        if (!(serial->parent->port_spec & HSO_INTF_MUX)) {
2165                for (i = 0; i < serial->num_rx_urbs; i++) {
2166                        usb_fill_bulk_urb(serial->rx_urb[i],
2167                                          serial->parent->usb,
2168                                          usb_rcvbulkpipe(serial->parent->usb,
2169                                                          serial->in_endp->
2170                                                          bEndpointAddress &
2171                                                          0x7F),
2172                                          serial->rx_data[i],
2173                                          serial->rx_data_length,
2174                                          hso_std_serial_read_bulk_callback,
2175                                          serial);
2176                        result = usb_submit_urb(serial->rx_urb[i], flags);
2177                        if (result) {
2178                                dev_warn(&serial->parent->usb->dev,
2179                                         "Failed to submit urb - res %d\n",
2180                                         result);
2181                                break;
2182                        }
2183                }
2184        } else {
2185                mutex_lock(&serial->shared_int->shared_int_lock);
2186                if (!serial->shared_int->use_count) {
2187                        result =
2188                            hso_mux_submit_intr_urb(serial->shared_int,
2189                                                    hso_dev->usb, flags);
2190                }
2191                serial->shared_int->use_count++;
2192                mutex_unlock(&serial->shared_int->shared_int_lock);
2193        }
2194        if (serial->tiocmget)
2195                tiocmget_submit_urb(serial,
2196                                    serial->tiocmget,
2197                                    serial->parent->usb);
2198        return result;
2199}
2200
2201static int hso_stop_serial_device(struct hso_device *hso_dev)
2202{
2203        int i;
2204        struct hso_serial *serial = dev2ser(hso_dev);
2205        struct hso_tiocmget  *tiocmget;
2206
2207        if (!serial)
2208                return -ENODEV;
2209
2210        for (i = 0; i < serial->num_rx_urbs; i++) {
2211                if (serial->rx_urb[i]) {
2212                        usb_kill_urb(serial->rx_urb[i]);
2213                        serial->rx_urb_filled[i] = 0;
2214                }
2215        }
2216        serial->curr_rx_urb_idx = 0;
2217
2218        if (serial->tx_urb)
2219                usb_kill_urb(serial->tx_urb);
2220
2221        if (serial->shared_int) {
2222                mutex_lock(&serial->shared_int->shared_int_lock);
2223                if (serial->shared_int->use_count &&
2224                    (--serial->shared_int->use_count == 0)) {
2225                        struct urb *urb;
2226
2227                        urb = serial->shared_int->shared_intr_urb;
2228                        if (urb)
2229                                usb_kill_urb(urb);
2230                }
2231                mutex_unlock(&serial->shared_int->shared_int_lock);
2232        }
2233        tiocmget = serial->tiocmget;
2234        if (tiocmget) {
2235                wake_up_interruptible(&tiocmget->waitq);
2236                usb_kill_urb(tiocmget->urb);
2237        }
2238
2239        return 0;
2240}
2241
2242static void hso_serial_tty_unregister(struct hso_serial *serial)
2243{
2244        tty_unregister_device(tty_drv, serial->minor);
2245}
2246
2247static void hso_serial_common_free(struct hso_serial *serial)
2248{
2249        int i;
2250
2251        for (i = 0; i < serial->num_rx_urbs; i++) {
2252                /* unlink and free RX URB */
2253                usb_free_urb(serial->rx_urb[i]);
2254                /* free the RX buffer */
2255                kfree(serial->rx_data[i]);
2256        }
2257
2258        /* unlink and free TX URB */
2259        usb_free_urb(serial->tx_urb);
2260        kfree(serial->tx_buffer);
2261        kfree(serial->tx_data);
2262        tty_port_destroy(&serial->port);
2263}
2264
2265static int hso_serial_common_create(struct hso_serial *serial, int num_urbs,
2266                                    int rx_size, int tx_size)
2267{
2268        struct device *dev;
2269        int minor;
2270        int i;
2271
2272        tty_port_init(&serial->port);
2273
2274        minor = get_free_serial_index();
2275        if (minor < 0)
2276                goto exit;
2277
2278        /* register our minor number */
2279        serial->parent->dev = tty_port_register_device_attr(&serial->port,
2280                        tty_drv, minor, &serial->parent->interface->dev,
2281                        serial->parent, hso_serial_dev_groups);
2282        dev = serial->parent->dev;
2283
2284        /* fill in specific data for later use */
2285        serial->minor = minor;
2286        serial->magic = HSO_SERIAL_MAGIC;
2287        spin_lock_init(&serial->serial_lock);
2288        serial->num_rx_urbs = num_urbs;
2289
2290        /* RX, allocate urb and initialize */
2291
2292        /* prepare our RX buffer */
2293        serial->rx_data_length = rx_size;
2294        for (i = 0; i < serial->num_rx_urbs; i++) {
2295                serial->rx_urb[i] = usb_alloc_urb(0, GFP_KERNEL);
2296                if (!serial->rx_urb[i])
2297                        goto exit;
2298                serial->rx_urb[i]->transfer_buffer = NULL;
2299                serial->rx_urb[i]->transfer_buffer_length = 0;
2300                serial->rx_data[i] = kzalloc(serial->rx_data_length,
2301                                             GFP_KERNEL);
2302                if (!serial->rx_data[i])
2303                        goto exit;
2304        }
2305
2306        /* TX, allocate urb and initialize */
2307        serial->tx_urb = usb_alloc_urb(0, GFP_KERNEL);
2308        if (!serial->tx_urb)
2309                goto exit;
2310        serial->tx_urb->transfer_buffer = NULL;
2311        serial->tx_urb->transfer_buffer_length = 0;
2312        /* prepare our TX buffer */
2313        serial->tx_data_count = 0;
2314        serial->tx_buffer_count = 0;
2315        serial->tx_data_length = tx_size;
2316        serial->tx_data = kzalloc(serial->tx_data_length, GFP_KERNEL);
2317        if (!serial->tx_data)
2318                goto exit;
2319
2320        serial->tx_buffer = kzalloc(serial->tx_data_length, GFP_KERNEL);
2321        if (!serial->tx_buffer)
2322                goto exit;
2323
2324        return 0;
2325exit:
2326        hso_serial_tty_unregister(serial);
2327        hso_serial_common_free(serial);
2328        return -1;
2329}
2330
2331/* Creates a general hso device */
2332static struct hso_device *hso_create_device(struct usb_interface *intf,
2333                                            int port_spec)
2334{
2335        struct hso_device *hso_dev;
2336
2337        hso_dev = kzalloc(sizeof(*hso_dev), GFP_ATOMIC);
2338        if (!hso_dev)
2339                return NULL;
2340
2341        hso_dev->port_spec = port_spec;
2342        hso_dev->usb = interface_to_usbdev(intf);
2343        hso_dev->interface = intf;
2344        kref_init(&hso_dev->ref);
2345        mutex_init(&hso_dev->mutex);
2346
2347        INIT_WORK(&hso_dev->async_get_intf, async_get_intf);
2348        INIT_WORK(&hso_dev->async_put_intf, async_put_intf);
2349
2350        return hso_dev;
2351}
2352
2353/* Removes a network device in the network device table */
2354static int remove_net_device(struct hso_device *hso_dev)
2355{
2356        int i;
2357
2358        for (i = 0; i < HSO_MAX_NET_DEVICES; i++) {
2359                if (network_table[i] == hso_dev) {
2360                        network_table[i] = NULL;
2361                        break;
2362                }
2363        }
2364        if (i == HSO_MAX_NET_DEVICES)
2365                return -1;
2366        return 0;
2367}
2368
2369/* Frees our network device */
2370static void hso_free_net_device(struct hso_device *hso_dev)
2371{
2372        int i;
2373        struct hso_net *hso_net = dev2net(hso_dev);
2374
2375        if (!hso_net)
2376                return;
2377
2378        remove_net_device(hso_net->parent);
2379
2380        if (hso_net->net)
2381                unregister_netdev(hso_net->net);
2382
2383        /* start freeing */
2384        for (i = 0; i < MUX_BULK_RX_BUF_COUNT; i++) {
2385                usb_free_urb(hso_net->mux_bulk_rx_urb_pool[i]);
2386                kfree(hso_net->mux_bulk_rx_buf_pool[i]);
2387                hso_net->mux_bulk_rx_buf_pool[i] = NULL;
2388        }
2389        usb_free_urb(hso_net->mux_bulk_tx_urb);
2390        kfree(hso_net->mux_bulk_tx_buf);
2391        hso_net->mux_bulk_tx_buf = NULL;
2392
2393        if (hso_net->net)
2394                free_netdev(hso_net->net);
2395
2396        kfree(hso_dev);
2397}
2398
2399static const struct net_device_ops hso_netdev_ops = {
2400        .ndo_open       = hso_net_open,
2401        .ndo_stop       = hso_net_close,
2402        .ndo_start_xmit = hso_net_start_xmit,
2403        .ndo_tx_timeout = hso_net_tx_timeout,
2404};
2405
2406/* initialize the network interface */
2407static void hso_net_init(struct net_device *net)
2408{
2409        struct hso_net *hso_net = netdev_priv(net);
2410
2411        hso_dbg(0x1, "sizeof hso_net is %zu\n", sizeof(*hso_net));
2412
2413        /* fill in the other fields */
2414        net->netdev_ops = &hso_netdev_ops;
2415        net->watchdog_timeo = HSO_NET_TX_TIMEOUT;
2416        net->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST;
2417        net->type = ARPHRD_NONE;
2418        net->mtu = DEFAULT_MTU - 14;
2419        net->tx_queue_len = 10;
2420        net->ethtool_ops = &ops;
2421
2422        /* and initialize the semaphore */
2423        spin_lock_init(&hso_net->net_lock);
2424}
2425
2426/* Adds a network device in the network device table */
2427static int add_net_device(struct hso_device *hso_dev)
2428{
2429        int i;
2430
2431        for (i = 0; i < HSO_MAX_NET_DEVICES; i++) {
2432                if (network_table[i] == NULL) {
2433                        network_table[i] = hso_dev;
2434                        break;
2435                }
2436        }
2437        if (i == HSO_MAX_NET_DEVICES)
2438                return -1;
2439        return 0;
2440}
2441
2442static int hso_rfkill_set_block(void *data, bool blocked)
2443{
2444        struct hso_device *hso_dev = data;
2445        int enabled = !blocked;
2446        int rv;
2447
2448        mutex_lock(&hso_dev->mutex);
2449        if (hso_dev->usb_gone)
2450                rv = 0;
2451        else
2452                rv = usb_control_msg(hso_dev->usb, usb_rcvctrlpipe(hso_dev->usb, 0),
2453                                       enabled ? 0x82 : 0x81, 0x40, 0, 0, NULL, 0,
2454                                       USB_CTRL_SET_TIMEOUT);
2455        mutex_unlock(&hso_dev->mutex);
2456        return rv;
2457}
2458
2459static const struct rfkill_ops hso_rfkill_ops = {
2460        .set_block = hso_rfkill_set_block,
2461};
2462
2463/* Creates and sets up everything for rfkill */
2464static void hso_create_rfkill(struct hso_device *hso_dev,
2465                             struct usb_interface *interface)
2466{
2467        struct hso_net *hso_net = dev2net(hso_dev);
2468        struct device *dev = &hso_net->net->dev;
2469        static u32 rfkill_counter;
2470
2471        snprintf(hso_net->name, sizeof(hso_net->name), "hso-%d",
2472                 rfkill_counter++);
2473
2474        hso_net->rfkill = rfkill_alloc(hso_net->name,
2475                                       &interface_to_usbdev(interface)->dev,
2476                                       RFKILL_TYPE_WWAN,
2477                                       &hso_rfkill_ops, hso_dev);
2478        if (!hso_net->rfkill) {
2479                dev_err(dev, "%s - Out of memory\n", __func__);
2480                return;
2481        }
2482        if (rfkill_register(hso_net->rfkill) < 0) {
2483                rfkill_destroy(hso_net->rfkill);
2484                hso_net->rfkill = NULL;
2485                dev_err(dev, "%s - Failed to register rfkill\n", __func__);
2486                return;
2487        }
2488}
2489
2490static struct device_type hso_type = {
2491        .name   = "wwan",
2492};
2493
2494/* Creates our network device */
2495static struct hso_device *hso_create_net_device(struct usb_interface *interface,
2496                                                int port_spec)
2497{
2498        int result, i;
2499        struct net_device *net;
2500        struct hso_net *hso_net;
2501        struct hso_device *hso_dev;
2502
2503        hso_dev = hso_create_device(interface, port_spec);
2504        if (!hso_dev)
2505                return NULL;
2506
2507        /* allocate our network device, then we can put in our private data */
2508        /* call hso_net_init to do the basic initialization */
2509        net = alloc_netdev(sizeof(struct hso_net), "hso%d", hso_net_init);
2510        if (!net) {
2511                dev_err(&interface->dev, "Unable to create ethernet device\n");
2512                goto exit;
2513        }
2514
2515        hso_net = netdev_priv(net);
2516
2517        hso_dev->port_data.dev_net = hso_net;
2518        hso_net->net = net;
2519        hso_net->parent = hso_dev;
2520
2521        hso_net->in_endp = hso_get_ep(interface, USB_ENDPOINT_XFER_BULK,
2522                                      USB_DIR_IN);
2523        if (!hso_net->in_endp) {
2524                dev_err(&interface->dev, "Can't find BULK IN endpoint\n");
2525                goto exit;
2526        }
2527        hso_net->out_endp = hso_get_ep(interface, USB_ENDPOINT_XFER_BULK,
2528                                       USB_DIR_OUT);
2529        if (!hso_net->out_endp) {
2530                dev_err(&interface->dev, "Can't find BULK OUT endpoint\n");
2531                goto exit;
2532        }
2533        SET_NETDEV_DEV(net, &interface->dev);
2534        SET_NETDEV_DEVTYPE(net, &hso_type);
2535
2536        /* start allocating */
2537        for (i = 0; i < MUX_BULK_RX_BUF_COUNT; i++) {
2538                hso_net->mux_bulk_rx_urb_pool[i] = usb_alloc_urb(0, GFP_KERNEL);
2539                if (!hso_net->mux_bulk_rx_urb_pool[i])
2540                        goto exit;
2541                hso_net->mux_bulk_rx_buf_pool[i] = kzalloc(MUX_BULK_RX_BUF_SIZE,
2542                                                           GFP_KERNEL);
2543                if (!hso_net->mux_bulk_rx_buf_pool[i])
2544                        goto exit;
2545        }
2546        hso_net->mux_bulk_tx_urb = usb_alloc_urb(0, GFP_KERNEL);
2547        if (!hso_net->mux_bulk_tx_urb)
2548                goto exit;
2549        hso_net->mux_bulk_tx_buf = kzalloc(MUX_BULK_TX_BUF_SIZE, GFP_KERNEL);
2550        if (!hso_net->mux_bulk_tx_buf)
2551                goto exit;
2552
2553        add_net_device(hso_dev);
2554
2555        /* registering our net device */
2556        result = register_netdev(net);
2557        if (result) {
2558                dev_err(&interface->dev, "Failed to register device\n");
2559                goto exit;
2560        }
2561
2562        hso_log_port(hso_dev);
2563
2564        hso_create_rfkill(hso_dev, interface);
2565
2566        return hso_dev;
2567exit:
2568        hso_free_net_device(hso_dev);
2569        return NULL;
2570}
2571
2572static void hso_free_tiomget(struct hso_serial *serial)
2573{
2574        struct hso_tiocmget *tiocmget;
2575        if (!serial)
2576                return;
2577        tiocmget = serial->tiocmget;
2578        if (tiocmget) {
2579                usb_free_urb(tiocmget->urb);
2580                tiocmget->urb = NULL;
2581                serial->tiocmget = NULL;
2582                kfree(tiocmget);
2583        }
2584}
2585
2586/* Frees an AT channel ( goes for both mux and non-mux ) */
2587static void hso_free_serial_device(struct hso_device *hso_dev)
2588{
2589        struct hso_serial *serial = dev2ser(hso_dev);
2590
2591        if (!serial)
2592                return;
2593
2594        hso_serial_common_free(serial);
2595
2596        if (serial->shared_int) {
2597                mutex_lock(&serial->shared_int->shared_int_lock);
2598                if (--serial->shared_int->ref_count == 0)
2599                        hso_free_shared_int(serial->shared_int);
2600                else
2601                        mutex_unlock(&serial->shared_int->shared_int_lock);
2602        }
2603        hso_free_tiomget(serial);
2604        kfree(serial);
2605        kfree(hso_dev);
2606}
2607
2608/* Creates a bulk AT channel */
2609static struct hso_device *hso_create_bulk_serial_device(
2610                        struct usb_interface *interface, int port)
2611{
2612        struct hso_device *hso_dev;
2613        struct hso_serial *serial;
2614        int num_urbs;
2615        struct hso_tiocmget *tiocmget;
2616
2617        hso_dev = hso_create_device(interface, port);
2618        if (!hso_dev)
2619                return NULL;
2620
2621        serial = kzalloc(sizeof(*serial), GFP_KERNEL);
2622        if (!serial)
2623                goto exit;
2624
2625        serial->parent = hso_dev;
2626        hso_dev->port_data.dev_serial = serial;
2627
2628        if ((port & HSO_PORT_MASK) == HSO_PORT_MODEM) {
2629                num_urbs = 2;
2630                serial->tiocmget = kzalloc(sizeof(struct hso_tiocmget),
2631                                           GFP_KERNEL);
2632                /* it isn't going to break our heart if serial->tiocmget
2633                 *  allocation fails don't bother checking this.
2634                 */
2635                if (serial->tiocmget) {
2636                        tiocmget = serial->tiocmget;
2637                        tiocmget->urb = usb_alloc_urb(0, GFP_KERNEL);
2638                        if (tiocmget->urb) {
2639                                mutex_init(&tiocmget->mutex);
2640                                init_waitqueue_head(&tiocmget->waitq);
2641                                tiocmget->endp = hso_get_ep(
2642                                        interface,
2643                                        USB_ENDPOINT_XFER_INT,
2644                                        USB_DIR_IN);
2645                        } else
2646                                hso_free_tiomget(serial);
2647                }
2648        }
2649        else
2650                num_urbs = 1;
2651
2652        if (hso_serial_common_create(serial, num_urbs, BULK_URB_RX_SIZE,
2653                                     BULK_URB_TX_SIZE))
2654                goto exit;
2655
2656        serial->in_endp = hso_get_ep(interface, USB_ENDPOINT_XFER_BULK,
2657                                     USB_DIR_IN);
2658        if (!serial->in_endp) {
2659                dev_err(&interface->dev, "Failed to find BULK IN ep\n");
2660                goto exit2;
2661        }
2662
2663        if (!
2664            (serial->out_endp =
2665             hso_get_ep(interface, USB_ENDPOINT_XFER_BULK, USB_DIR_OUT))) {
2666                dev_err(&interface->dev, "Failed to find BULK IN ep\n");
2667                goto exit2;
2668        }
2669
2670        serial->write_data = hso_std_serial_write_data;
2671
2672        /* and record this serial */
2673        set_serial_by_index(serial->minor, serial);
2674
2675        /* setup the proc dirs and files if needed */
2676        hso_log_port(hso_dev);
2677
2678        /* done, return it */
2679        return hso_dev;
2680
2681exit2:
2682        hso_serial_tty_unregister(serial);
2683        hso_serial_common_free(serial);
2684exit:
2685        hso_free_tiomget(serial);
2686        kfree(serial);
2687        kfree(hso_dev);
2688        return NULL;
2689}
2690
2691/* Creates a multiplexed AT channel */
2692static
2693struct hso_device *hso_create_mux_serial_device(struct usb_interface *interface,
2694                                                int port,
2695                                                struct hso_shared_int *mux)
2696{
2697        struct hso_device *hso_dev;
2698        struct hso_serial *serial;
2699        int port_spec;
2700
2701        port_spec = HSO_INTF_MUX;
2702        port_spec &= ~HSO_PORT_MASK;
2703
2704        port_spec |= hso_mux_to_port(port);
2705        if ((port_spec & HSO_PORT_MASK) == HSO_PORT_NO_PORT)
2706                return NULL;
2707
2708        hso_dev = hso_create_device(interface, port_spec);
2709        if (!hso_dev)
2710                return NULL;
2711
2712        serial = kzalloc(sizeof(*serial), GFP_KERNEL);
2713        if (!serial)
2714                goto exit;
2715
2716        hso_dev->port_data.dev_serial = serial;
2717        serial->parent = hso_dev;
2718
2719        if (hso_serial_common_create
2720            (serial, 1, CTRL_URB_RX_SIZE, CTRL_URB_TX_SIZE))
2721                goto exit;
2722
2723        serial->tx_data_length--;
2724        serial->write_data = hso_mux_serial_write_data;
2725
2726        serial->shared_int = mux;
2727        mutex_lock(&serial->shared_int->shared_int_lock);
2728        serial->shared_int->ref_count++;
2729        mutex_unlock(&serial->shared_int->shared_int_lock);
2730
2731        /* and record this serial */
2732        set_serial_by_index(serial->minor, serial);
2733
2734        /* setup the proc dirs and files if needed */
2735        hso_log_port(hso_dev);
2736
2737        /* done, return it */
2738        return hso_dev;
2739
2740exit:
2741        if (serial) {
2742                tty_unregister_device(tty_drv, serial->minor);
2743                kfree(serial);
2744        }
2745        kfree(hso_dev);
2746        return NULL;
2747
2748}
2749
2750static void hso_free_shared_int(struct hso_shared_int *mux)
2751{
2752        usb_free_urb(mux->shared_intr_urb);
2753        kfree(mux->shared_intr_buf);
2754        mutex_unlock(&mux->shared_int_lock);
2755        kfree(mux);
2756}
2757
2758static
2759struct hso_shared_int *hso_create_shared_int(struct usb_interface *interface)
2760{
2761        struct hso_shared_int *mux = kzalloc(sizeof(*mux), GFP_KERNEL);
2762
2763        if (!mux)
2764                return NULL;
2765
2766        mux->intr_endp = hso_get_ep(interface, USB_ENDPOINT_XFER_INT,
2767                                    USB_DIR_IN);
2768        if (!mux->intr_endp) {
2769                dev_err(&interface->dev, "Can't find INT IN endpoint\n");
2770                goto exit;
2771        }
2772
2773        mux->shared_intr_urb = usb_alloc_urb(0, GFP_KERNEL);
2774        if (!mux->shared_intr_urb)
2775                goto exit;
2776        mux->shared_intr_buf =
2777                kzalloc(le16_to_cpu(mux->intr_endp->wMaxPacketSize),
2778                        GFP_KERNEL);
2779        if (!mux->shared_intr_buf)
2780                goto exit;
2781
2782        mutex_init(&mux->shared_int_lock);
2783
2784        return mux;
2785
2786exit:
2787        kfree(mux->shared_intr_buf);
2788        usb_free_urb(mux->shared_intr_urb);
2789        kfree(mux);
2790        return NULL;
2791}
2792
2793/* Gets the port spec for a certain interface */
2794static int hso_get_config_data(struct usb_interface *interface)
2795{
2796        struct usb_device *usbdev = interface_to_usbdev(interface);
2797        u8 *config_data = kmalloc(17, GFP_KERNEL);
2798        u32 if_num = interface->cur_altsetting->desc.bInterfaceNumber;
2799        s32 result;
2800
2801        if (!config_data)
2802                return -ENOMEM;
2803        if (usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0),
2804                            0x86, 0xC0, 0, 0, config_data, 17,
2805                            USB_CTRL_SET_TIMEOUT) != 0x11) {
2806                kfree(config_data);
2807                return -EIO;
2808        }
2809
2810        switch (config_data[if_num]) {
2811        case 0x0:
2812                result = 0;
2813                break;
2814        case 0x1:
2815                result = HSO_PORT_DIAG;
2816                break;
2817        case 0x2:
2818                result = HSO_PORT_GPS;
2819                break;
2820        case 0x3:
2821                result = HSO_PORT_GPS_CONTROL;
2822                break;
2823        case 0x4:
2824                result = HSO_PORT_APP;
2825                break;
2826        case 0x5:
2827                result = HSO_PORT_APP2;
2828                break;
2829        case 0x6:
2830                result = HSO_PORT_CONTROL;
2831                break;
2832        case 0x7:
2833                result = HSO_PORT_NETWORK;
2834                break;
2835        case 0x8:
2836                result = HSO_PORT_MODEM;
2837                break;
2838        case 0x9:
2839                result = HSO_PORT_MSD;
2840                break;
2841        case 0xa:
2842                result = HSO_PORT_PCSC;
2843                break;
2844        case 0xb:
2845                result = HSO_PORT_VOICE;
2846                break;
2847        default:
2848                result = 0;
2849        }
2850
2851        if (result)
2852                result |= HSO_INTF_BULK;
2853
2854        if (config_data[16] & 0x1)
2855                result |= HSO_INFO_CRC_BUG;
2856
2857        kfree(config_data);
2858        return result;
2859}
2860
2861/* called once for each interface upon device insertion */
2862static int hso_probe(struct usb_interface *interface,
2863                     const struct usb_device_id *id)
2864{
2865        int mux, i, if_num, port_spec;
2866        unsigned char port_mask;
2867        struct hso_device *hso_dev = NULL;
2868        struct hso_shared_int *shared_int;
2869        struct hso_device *tmp_dev = NULL;
2870
2871        if (interface->cur_altsetting->desc.bInterfaceClass != 0xFF) {
2872                dev_err(&interface->dev, "Not our interface\n");
2873                return -ENODEV;
2874        }
2875
2876        if_num = interface->cur_altsetting->desc.bInterfaceNumber;
2877
2878        /* Get the interface/port specification from either driver_info or from
2879         * the device itself */
2880        if (id->driver_info)
2881                port_spec = ((u32 *)(id->driver_info))[if_num];
2882        else
2883                port_spec = hso_get_config_data(interface);
2884
2885        /* Check if we need to switch to alt interfaces prior to port
2886         * configuration */
2887        if (interface->num_altsetting > 1)
2888                usb_set_interface(interface_to_usbdev(interface), if_num, 1);
2889        interface->needs_remote_wakeup = 1;
2890
2891        /* Allocate new hso device(s) */
2892        switch (port_spec & HSO_INTF_MASK) {
2893        case HSO_INTF_MUX:
2894                if ((port_spec & HSO_PORT_MASK) == HSO_PORT_NETWORK) {
2895                        /* Create the network device */
2896                        if (!disable_net) {
2897                                hso_dev = hso_create_net_device(interface,
2898                                                                port_spec);
2899                                if (!hso_dev)
2900                                        goto exit;
2901                                tmp_dev = hso_dev;
2902                        }
2903                }
2904
2905                if (hso_get_mux_ports(interface, &port_mask))
2906                        /* TODO: de-allocate everything */
2907                        goto exit;
2908
2909                shared_int = hso_create_shared_int(interface);
2910                if (!shared_int)
2911                        goto exit;
2912
2913                for (i = 1, mux = 0; i < 0x100; i = i << 1, mux++) {
2914                        if (port_mask & i) {
2915                                hso_dev = hso_create_mux_serial_device(
2916                                                interface, i, shared_int);
2917                                if (!hso_dev)
2918                                        goto exit;
2919                        }
2920                }
2921
2922                if (tmp_dev)
2923                        hso_dev = tmp_dev;
2924                break;
2925
2926        case HSO_INTF_BULK:
2927                /* It's a regular bulk interface */
2928                if ((port_spec & HSO_PORT_MASK) == HSO_PORT_NETWORK) {
2929                        if (!disable_net)
2930                                hso_dev =
2931                                    hso_create_net_device(interface, port_spec);
2932                } else {
2933                        hso_dev =
2934                            hso_create_bulk_serial_device(interface, port_spec);
2935                }
2936                if (!hso_dev)
2937                        goto exit;
2938                break;
2939        default:
2940                goto exit;
2941        }
2942
2943        /* save our data pointer in this device */
2944        usb_set_intfdata(interface, hso_dev);
2945
2946        /* done */
2947        return 0;
2948exit:
2949        hso_free_interface(interface);
2950        return -ENODEV;
2951}
2952
2953/* device removed, cleaning up */
2954static void hso_disconnect(struct usb_interface *interface)
2955{
2956        hso_free_interface(interface);
2957
2958        /* remove reference of our private data */
2959        usb_set_intfdata(interface, NULL);
2960}
2961
2962static void async_get_intf(struct work_struct *data)
2963{
2964        struct hso_device *hso_dev =
2965            container_of(data, struct hso_device, async_get_intf);
2966        usb_autopm_get_interface(hso_dev->interface);
2967}
2968
2969static void async_put_intf(struct work_struct *data)
2970{
2971        struct hso_device *hso_dev =
2972            container_of(data, struct hso_device, async_put_intf);
2973        usb_autopm_put_interface(hso_dev->interface);
2974}
2975
2976static int hso_get_activity(struct hso_device *hso_dev)
2977{
2978        if (hso_dev->usb->state == USB_STATE_SUSPENDED) {
2979                if (!hso_dev->is_active) {
2980                        hso_dev->is_active = 1;
2981                        schedule_work(&hso_dev->async_get_intf);
2982                }
2983        }
2984
2985        if (hso_dev->usb->state != USB_STATE_CONFIGURED)
2986                return -EAGAIN;
2987
2988        usb_mark_last_busy(hso_dev->usb);
2989
2990        return 0;
2991}
2992
2993static int hso_put_activity(struct hso_device *hso_dev)
2994{
2995        if (hso_dev->usb->state != USB_STATE_SUSPENDED) {
2996                if (hso_dev->is_active) {
2997                        hso_dev->is_active = 0;
2998                        schedule_work(&hso_dev->async_put_intf);
2999                        return -EAGAIN;
3000                }
3001        }
3002        hso_dev->is_active = 0;
3003        return 0;
3004}
3005
3006/* called by kernel when we need to suspend device */
3007static int hso_suspend(struct usb_interface *iface, pm_message_t message)
3008{
3009        int i, result;
3010
3011        /* Stop all serial ports */
3012        for (i = 0; i < HSO_SERIAL_TTY_MINORS; i++) {
3013                if (serial_table[i] && (serial_table[i]->interface == iface)) {
3014                        result = hso_stop_serial_device(serial_table[i]);
3015                        if (result)
3016                                goto out;
3017                }
3018        }
3019
3020        /* Stop all network ports */
3021        for (i = 0; i < HSO_MAX_NET_DEVICES; i++) {
3022                if (network_table[i] &&
3023                    (network_table[i]->interface == iface)) {
3024                        result = hso_stop_net_device(network_table[i]);
3025                        if (result)
3026                                goto out;
3027                }
3028        }
3029
3030out:
3031        return 0;
3032}
3033
3034/* called by kernel when we need to resume device */
3035static int hso_resume(struct usb_interface *iface)
3036{
3037        int i, result = 0;
3038        struct hso_net *hso_net;
3039
3040        /* Start all serial ports */
3041        for (i = 0; i < HSO_SERIAL_TTY_MINORS; i++) {
3042                if (serial_table[i] && (serial_table[i]->interface == iface)) {
3043                        if (dev2ser(serial_table[i])->port.count) {
3044                                result =
3045                                    hso_start_serial_device(serial_table[i], GFP_NOIO);
3046                                hso_kick_transmit(dev2ser(serial_table[i]));
3047                                if (result)
3048                                        goto out;
3049                        }
3050                }
3051        }
3052
3053        /* Start all network ports */
3054        for (i = 0; i < HSO_MAX_NET_DEVICES; i++) {
3055                if (network_table[i] &&
3056                    (network_table[i]->interface == iface)) {
3057                        hso_net = dev2net(network_table[i]);
3058                        if (hso_net->flags & IFF_UP) {
3059                                /* First transmit any lingering data,
3060                                   then restart the device. */
3061                                if (hso_net->skb_tx_buf) {
3062                                        dev_dbg(&iface->dev,
3063                                                "Transmitting"
3064                                                " lingering data\n");
3065                                        hso_net_start_xmit(hso_net->skb_tx_buf,
3066                                                           hso_net->net);
3067                                        hso_net->skb_tx_buf = NULL;
3068                                }
3069                                result = hso_start_net_device(network_table[i]);
3070                                if (result)
3071                                        goto out;
3072                        }
3073                }
3074        }
3075
3076out:
3077        return result;
3078}
3079
3080static void hso_serial_ref_free(struct kref *ref)
3081{
3082        struct hso_device *hso_dev = container_of(ref, struct hso_device, ref);
3083
3084        hso_free_serial_device(hso_dev);
3085}
3086
3087static void hso_free_interface(struct usb_interface *interface)
3088{
3089        struct hso_serial *serial;
3090        int i;
3091
3092        for (i = 0; i < HSO_SERIAL_TTY_MINORS; i++) {
3093                if (serial_table[i] &&
3094                    (serial_table[i]->interface == interface)) {
3095                        serial = dev2ser(serial_table[i]);
3096                        tty_port_tty_hangup(&serial->port, false);
3097                        mutex_lock(&serial->parent->mutex);
3098                        serial->parent->usb_gone = 1;
3099                        mutex_unlock(&serial->parent->mutex);
3100                        cancel_work_sync(&serial_table[i]->async_put_intf);
3101                        cancel_work_sync(&serial_table[i]->async_get_intf);
3102                        hso_serial_tty_unregister(serial);
3103                        kref_put(&serial_table[i]->ref, hso_serial_ref_free);
3104                        set_serial_by_index(i, NULL);
3105                }
3106        }
3107
3108        for (i = 0; i < HSO_MAX_NET_DEVICES; i++) {
3109                if (network_table[i] &&
3110                    (network_table[i]->interface == interface)) {
3111                        struct rfkill *rfk = dev2net(network_table[i])->rfkill;
3112                        /* hso_stop_net_device doesn't stop the net queue since
3113                         * traffic needs to start it again when suspended */
3114                        netif_stop_queue(dev2net(network_table[i])->net);
3115                        hso_stop_net_device(network_table[i]);
3116                        cancel_work_sync(&network_table[i]->async_put_intf);
3117                        cancel_work_sync(&network_table[i]->async_get_intf);
3118                        if (rfk) {
3119                                rfkill_unregister(rfk);
3120                                rfkill_destroy(rfk);
3121                        }
3122                        hso_free_net_device(network_table[i]);
3123                }
3124        }
3125}
3126
3127/* Helper functions */
3128
3129/* Get the endpoint ! */
3130static struct usb_endpoint_descriptor *hso_get_ep(struct usb_interface *intf,
3131                                                  int type, int dir)
3132{
3133        int i;
3134        struct usb_host_interface *iface = intf->cur_altsetting;
3135        struct usb_endpoint_descriptor *endp;
3136
3137        for (i = 0; i < iface->desc.bNumEndpoints; i++) {
3138                endp = &iface->endpoint[i].desc;
3139                if (((endp->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == dir) &&
3140                    (usb_endpoint_type(endp) == type))
3141                        return endp;
3142        }
3143
3144        return NULL;
3145}
3146
3147/* Get the byte that describes which ports are enabled */
3148static int hso_get_mux_ports(struct usb_interface *intf, unsigned char *ports)
3149{
3150        int i;
3151        struct usb_host_interface *iface = intf->cur_altsetting;
3152
3153        if (iface->extralen == 3) {
3154                *ports = iface->extra[2];
3155                return 0;
3156        }
3157
3158        for (i = 0; i < iface->desc.bNumEndpoints; i++) {
3159                if (iface->endpoint[i].extralen == 3) {
3160                        *ports = iface->endpoint[i].extra[2];
3161                        return 0;
3162                }
3163        }
3164
3165        return -1;
3166}
3167
3168/* interrupt urb needs to be submitted, used for serial read of muxed port */
3169static int hso_mux_submit_intr_urb(struct hso_shared_int *shared_int,
3170                                   struct usb_device *usb, gfp_t gfp)
3171{
3172        int result;
3173
3174        usb_fill_int_urb(shared_int->shared_intr_urb, usb,
3175                         usb_rcvintpipe(usb,
3176                                shared_int->intr_endp->bEndpointAddress & 0x7F),
3177                         shared_int->shared_intr_buf,
3178                         1,
3179                         intr_callback, shared_int,
3180                         shared_int->intr_endp->bInterval);
3181
3182        result = usb_submit_urb(shared_int->shared_intr_urb, gfp);
3183        if (result)
3184                dev_warn(&usb->dev, "%s failed mux_intr_urb %d\n", __func__,
3185                        result);
3186
3187        return result;
3188}
3189
3190/* operations setup of the serial interface */
3191static const struct tty_operations hso_serial_ops = {
3192        .open = hso_serial_open,
3193        .close = hso_serial_close,
3194        .write = hso_serial_write,
3195        .write_room = hso_serial_write_room,
3196        .cleanup = hso_serial_cleanup,
3197        .ioctl = hso_serial_ioctl,
3198        .set_termios = hso_serial_set_termios,
3199        .chars_in_buffer = hso_serial_chars_in_buffer,
3200        .tiocmget = hso_serial_tiocmget,
3201        .tiocmset = hso_serial_tiocmset,
3202        .get_icount = hso_get_count,
3203        .unthrottle = hso_unthrottle
3204};
3205
3206static struct usb_driver hso_driver = {
3207        .name = driver_name,
3208        .probe = hso_probe,
3209        .disconnect = hso_disconnect,
3210        .id_table = hso_ids,
3211        .suspend = hso_suspend,
3212        .resume = hso_resume,
3213        .reset_resume = hso_resume,
3214        .supports_autosuspend = 1,
3215        .disable_hub_initiated_lpm = 1,
3216};
3217
3218static int __init hso_init(void)
3219{
3220        int i;
3221        int result;
3222
3223        /* put it in the log */
3224        pr_info("%s\n", version);
3225
3226        /* Initialise the serial table semaphore and table */
3227        spin_lock_init(&serial_table_lock);
3228        for (i = 0; i < HSO_SERIAL_TTY_MINORS; i++)
3229                serial_table[i] = NULL;
3230
3231        /* allocate our driver using the proper amount of supported minors */
3232        tty_drv = alloc_tty_driver(HSO_SERIAL_TTY_MINORS);
3233        if (!tty_drv)
3234                return -ENOMEM;
3235
3236        /* fill in all needed values */
3237        tty_drv->driver_name = driver_name;
3238        tty_drv->name = tty_filename;
3239
3240        /* if major number is provided as parameter, use that one */
3241        if (tty_major)
3242                tty_drv->major = tty_major;
3243
3244        tty_drv->minor_start = 0;
3245        tty_drv->type = TTY_DRIVER_TYPE_SERIAL;
3246        tty_drv->subtype = SERIAL_TYPE_NORMAL;
3247        tty_drv->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
3248        tty_drv->init_termios = tty_std_termios;
3249        hso_init_termios(&tty_drv->init_termios);
3250        tty_set_operations(tty_drv, &hso_serial_ops);
3251
3252        /* register the tty driver */
3253        result = tty_register_driver(tty_drv);
3254        if (result) {
3255                pr_err("%s - tty_register_driver failed(%d)\n",
3256                       __func__, result);
3257                goto err_free_tty;
3258        }
3259
3260        /* register this module as an usb driver */
3261        result = usb_register(&hso_driver);
3262        if (result) {
3263                pr_err("Could not register hso driver - error: %d\n", result);
3264                goto err_unreg_tty;
3265        }
3266
3267        /* done */
3268        return 0;
3269err_unreg_tty:
3270        tty_unregister_driver(tty_drv);
3271err_free_tty:
3272        put_tty_driver(tty_drv);
3273        return result;
3274}
3275
3276static void __exit hso_exit(void)
3277{
3278        pr_info("unloaded\n");
3279
3280        tty_unregister_driver(tty_drv);
3281        /* deregister the usb driver */
3282        usb_deregister(&hso_driver);
3283        put_tty_driver(tty_drv);
3284}
3285
3286/* Module definitions */
3287module_init(hso_init);
3288module_exit(hso_exit);
3289
3290MODULE_AUTHOR(MOD_AUTHOR);
3291MODULE_DESCRIPTION(MOD_DESCRIPTION);
3292MODULE_LICENSE(MOD_LICENSE);
3293
3294/* change the debug level (eg: insmod hso.ko debug=0x04) */
3295MODULE_PARM_DESC(debug, "debug level mask [0x01 | 0x02 | 0x04 | 0x08 | 0x10]");
3296module_param(debug, int, S_IRUGO | S_IWUSR);
3297
3298/* set the major tty number (eg: insmod hso.ko tty_major=245) */
3299MODULE_PARM_DESC(tty_major, "Set the major tty number");
3300module_param(tty_major, int, S_IRUGO | S_IWUSR);
3301
3302/* disable network interface (eg: insmod hso.ko disable_net=1) */
3303MODULE_PARM_DESC(disable_net, "Disable the network interface");
3304module_param(disable_net, int, S_IRUGO | S_IWUSR);
3305