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/signal.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
 865        /* log if needed */
 866        hso_dbg(0x1, "Rx %d bytes\n", count);
 867        DUMP(ip_pkt, min(128, (int)count));
 868
 869        while (count) {
 870                switch (odev->rx_parse_state) {
 871                case WAIT_IP:
 872                        /* waiting for IP header. */
 873                        /* wanted bytes - size of ip header */
 874                        temp_bytes =
 875                            (count <
 876                             odev->rx_buf_missing) ? count : odev->
 877                            rx_buf_missing;
 878
 879                        memcpy(((unsigned char *)(&odev->rx_ip_hdr)) +
 880                               odev->rx_buf_size, ip_pkt + buffer_offset,
 881                               temp_bytes);
 882
 883                        odev->rx_buf_size += temp_bytes;
 884                        buffer_offset += temp_bytes;
 885                        odev->rx_buf_missing -= temp_bytes;
 886                        count -= temp_bytes;
 887
 888                        if (!odev->rx_buf_missing) {
 889                                /* header is complete allocate an sk_buffer and
 890                                 * continue to WAIT_DATA */
 891                                frame_len = ntohs(odev->rx_ip_hdr.tot_len);
 892
 893                                if ((frame_len > DEFAULT_MRU) ||
 894                                    (frame_len < sizeof(struct iphdr))) {
 895                                        dev_err(&odev->net->dev,
 896                                                "Invalid frame (%d) length\n",
 897                                                frame_len);
 898                                        odev->rx_parse_state = WAIT_SYNC;
 899                                        continue;
 900                                }
 901                                /* Allocate an sk_buff */
 902                                odev->skb_rx_buf = netdev_alloc_skb(odev->net,
 903                                                                    frame_len);
 904                                if (!odev->skb_rx_buf) {
 905                                        /* We got no receive buffer. */
 906                                        hso_dbg(0x1, "could not allocate memory\n");
 907                                        odev->rx_parse_state = WAIT_SYNC;
 908                                        continue;
 909                                }
 910
 911                                /* Copy what we got so far. make room for iphdr
 912                                 * after tail. */
 913                                skb_put_data(odev->skb_rx_buf,
 914                                             (char *)&(odev->rx_ip_hdr),
 915                                             sizeof(struct iphdr));
 916
 917                                /* ETH_HLEN */
 918                                odev->rx_buf_size = sizeof(struct iphdr);
 919
 920                                /* Filip actually use .tot_len */
 921                                odev->rx_buf_missing =
 922                                    frame_len - sizeof(struct iphdr);
 923                                odev->rx_parse_state = WAIT_DATA;
 924                        }
 925                        break;
 926
 927                case WAIT_DATA:
 928                        temp_bytes = (count < odev->rx_buf_missing)
 929                                        ? count : odev->rx_buf_missing;
 930
 931                        /* Copy the rest of the bytes that are left in the
 932                         * buffer into the waiting sk_buf. */
 933                        /* Make room for temp_bytes after tail. */
 934                        skb_put_data(odev->skb_rx_buf,
 935                                     ip_pkt + buffer_offset,
 936                                     temp_bytes);
 937
 938                        odev->rx_buf_missing -= temp_bytes;
 939                        count -= temp_bytes;
 940                        buffer_offset += temp_bytes;
 941                        odev->rx_buf_size += temp_bytes;
 942                        if (!odev->rx_buf_missing) {
 943                                /* Packet is complete. Inject into stack. */
 944                                /* We have IP packet here */
 945                                odev->skb_rx_buf->protocol = cpu_to_be16(ETH_P_IP);
 946                                skb_reset_mac_header(odev->skb_rx_buf);
 947
 948                                /* Ship it off to the kernel */
 949                                netif_rx(odev->skb_rx_buf);
 950                                /* No longer our buffer. */
 951                                odev->skb_rx_buf = NULL;
 952
 953                                /* update out statistics */
 954                                odev->net->stats.rx_packets++;
 955
 956                                odev->net->stats.rx_bytes += odev->rx_buf_size;
 957
 958                                odev->rx_buf_size = 0;
 959                                odev->rx_buf_missing = sizeof(struct iphdr);
 960                                odev->rx_parse_state = WAIT_IP;
 961                        }
 962                        break;
 963
 964                case WAIT_SYNC:
 965                        hso_dbg(0x1, " W_S\n");
 966                        count = 0;
 967                        break;
 968                default:
 969                        hso_dbg(0x1, "\n");
 970                        count--;
 971                        break;
 972                }
 973        }
 974
 975        /* Recovery mechanism for WAIT_SYNC state. */
 976        if (is_eop) {
 977                if (odev->rx_parse_state == WAIT_SYNC) {
 978                        odev->rx_parse_state = WAIT_IP;
 979                        odev->rx_buf_size = 0;
 980                        odev->rx_buf_missing = sizeof(struct iphdr);
 981                }
 982        }
 983}
 984
 985static void fix_crc_bug(struct urb *urb, __le16 max_packet_size)
 986{
 987        static const u8 crc_check[4] = { 0xDE, 0xAD, 0xBE, 0xEF };
 988        u32 rest = urb->actual_length % le16_to_cpu(max_packet_size);
 989
 990        if (((rest == 5) || (rest == 6)) &&
 991            !memcmp(((u8 *)urb->transfer_buffer) + urb->actual_length - 4,
 992                    crc_check, 4)) {
 993                urb->actual_length -= 4;
 994        }
 995}
 996
 997/* Moving data from usb to kernel (in interrupt state) */
 998static void read_bulk_callback(struct urb *urb)
 999{
1000        struct hso_net *odev = urb->context;
1001        struct net_device *net;
1002        int result;
1003        int status = urb->status;
1004
1005        /* is al ok?  (Filip: Who's Al ?) */
1006        if (status) {
1007                handle_usb_error(status, __func__, odev->parent);
1008                return;
1009        }
1010
1011        /* Sanity check */
1012        if (!odev || !test_bit(HSO_NET_RUNNING, &odev->flags)) {
1013                hso_dbg(0x1, "BULK IN callback but driver is not active!\n");
1014                return;
1015        }
1016        usb_mark_last_busy(urb->dev);
1017
1018        net = odev->net;
1019
1020        if (!netif_device_present(net)) {
1021                /* Somebody killed our network interface... */
1022                return;
1023        }
1024
1025        if (odev->parent->port_spec & HSO_INFO_CRC_BUG)
1026                fix_crc_bug(urb, odev->in_endp->wMaxPacketSize);
1027
1028        /* do we even have a packet? */
1029        if (urb->actual_length) {
1030                /* Handle the IP stream, add header and push it onto network
1031                 * stack if the packet is complete. */
1032                spin_lock(&odev->net_lock);
1033                packetizeRx(odev, urb->transfer_buffer, urb->actual_length,
1034                            (urb->transfer_buffer_length >
1035                             urb->actual_length) ? 1 : 0);
1036                spin_unlock(&odev->net_lock);
1037        }
1038
1039        /* We are done with this URB, resubmit it. Prep the USB to wait for
1040         * another frame. Reuse same as received. */
1041        usb_fill_bulk_urb(urb,
1042                          odev->parent->usb,
1043                          usb_rcvbulkpipe(odev->parent->usb,
1044                                          odev->in_endp->
1045                                          bEndpointAddress & 0x7F),
1046                          urb->transfer_buffer, MUX_BULK_RX_BUF_SIZE,
1047                          read_bulk_callback, odev);
1048
1049        /* Give this to the USB subsystem so it can tell us when more data
1050         * arrives. */
1051        result = usb_submit_urb(urb, GFP_ATOMIC);
1052        if (result)
1053                dev_warn(&odev->parent->interface->dev,
1054                         "%s failed submit mux_bulk_rx_urb %d\n", __func__,
1055                         result);
1056}
1057
1058/* Serial driver functions */
1059
1060static void hso_init_termios(struct ktermios *termios)
1061{
1062        /*
1063         * The default requirements for this device are:
1064         */
1065        termios->c_iflag &=
1066                ~(IGNBRK        /* disable ignore break */
1067                | BRKINT        /* disable break causes interrupt */
1068                | PARMRK        /* disable mark parity errors */
1069                | ISTRIP        /* disable clear high bit of input characters */
1070                | INLCR         /* disable translate NL to CR */
1071                | IGNCR         /* disable ignore CR */
1072                | ICRNL         /* disable translate CR to NL */
1073                | IXON);        /* disable enable XON/XOFF flow control */
1074
1075        /* disable postprocess output characters */
1076        termios->c_oflag &= ~OPOST;
1077
1078        termios->c_lflag &=
1079                ~(ECHO          /* disable echo input characters */
1080                | ECHONL        /* disable echo new line */
1081                | ICANON        /* disable erase, kill, werase, and rprnt
1082                                   special characters */
1083                | ISIG          /* disable interrupt, quit, and suspend special
1084                                   characters */
1085                | IEXTEN);      /* disable non-POSIX special characters */
1086
1087        termios->c_cflag &=
1088                ~(CSIZE         /* no size */
1089                | PARENB        /* disable parity bit */
1090                | CBAUD         /* clear current baud rate */
1091                | CBAUDEX);     /* clear current buad rate */
1092
1093        termios->c_cflag |= CS8;        /* character size 8 bits */
1094
1095        /* baud rate 115200 */
1096        tty_termios_encode_baud_rate(termios, 115200, 115200);
1097}
1098
1099static void _hso_serial_set_termios(struct tty_struct *tty,
1100                                    struct ktermios *old)
1101{
1102        struct hso_serial *serial = tty->driver_data;
1103
1104        if (!serial) {
1105                pr_err("%s: no tty structures", __func__);
1106                return;
1107        }
1108
1109        hso_dbg(0x8, "port %d\n", serial->minor);
1110
1111        /*
1112         *      Fix up unsupported bits
1113         */
1114        tty->termios.c_iflag &= ~IXON; /* disable enable XON/XOFF flow control */
1115
1116        tty->termios.c_cflag &=
1117                ~(CSIZE         /* no size */
1118                | PARENB        /* disable parity bit */
1119                | CBAUD         /* clear current baud rate */
1120                | CBAUDEX);     /* clear current buad rate */
1121
1122        tty->termios.c_cflag |= CS8;    /* character size 8 bits */
1123
1124        /* baud rate 115200 */
1125        tty_encode_baud_rate(tty, 115200, 115200);
1126}
1127
1128static void hso_resubmit_rx_bulk_urb(struct hso_serial *serial, struct urb *urb)
1129{
1130        int result;
1131        /* We are done with this URB, resubmit it. Prep the USB to wait for
1132         * another frame */
1133        usb_fill_bulk_urb(urb, serial->parent->usb,
1134                          usb_rcvbulkpipe(serial->parent->usb,
1135                                          serial->in_endp->
1136                                          bEndpointAddress & 0x7F),
1137                          urb->transfer_buffer, serial->rx_data_length,
1138                          hso_std_serial_read_bulk_callback, serial);
1139        /* Give this to the USB subsystem so it can tell us when more data
1140         * arrives. */
1141        result = usb_submit_urb(urb, GFP_ATOMIC);
1142        if (result) {
1143                dev_err(&urb->dev->dev, "%s failed submit serial rx_urb %d\n",
1144                        __func__, result);
1145        }
1146}
1147
1148
1149
1150
1151static void put_rxbuf_data_and_resubmit_bulk_urb(struct hso_serial *serial)
1152{
1153        int count;
1154        struct urb *curr_urb;
1155
1156        while (serial->rx_urb_filled[serial->curr_rx_urb_idx]) {
1157                curr_urb = serial->rx_urb[serial->curr_rx_urb_idx];
1158                count = put_rxbuf_data(curr_urb, serial);
1159                if (count == -1)
1160                        return;
1161                if (count == 0) {
1162                        serial->curr_rx_urb_idx++;
1163                        if (serial->curr_rx_urb_idx >= serial->num_rx_urbs)
1164                                serial->curr_rx_urb_idx = 0;
1165                        hso_resubmit_rx_bulk_urb(serial, curr_urb);
1166                }
1167        }
1168}
1169
1170static void put_rxbuf_data_and_resubmit_ctrl_urb(struct hso_serial *serial)
1171{
1172        int count = 0;
1173        struct urb *urb;
1174
1175        urb = serial->rx_urb[0];
1176        if (serial->port.count > 0) {
1177                count = put_rxbuf_data(urb, serial);
1178                if (count == -1)
1179                        return;
1180        }
1181        /* Re issue a read as long as we receive data. */
1182
1183        if (count == 0 && ((urb->actual_length != 0) ||
1184                           (serial->rx_state == RX_PENDING))) {
1185                serial->rx_state = RX_SENT;
1186                hso_mux_serial_read(serial);
1187        } else
1188                serial->rx_state = RX_IDLE;
1189}
1190
1191
1192/* read callback for Diag and CS port */
1193static void hso_std_serial_read_bulk_callback(struct urb *urb)
1194{
1195        struct hso_serial *serial = urb->context;
1196        int status = urb->status;
1197
1198        hso_dbg(0x8, "--- Got serial_read_bulk callback %02x ---\n", status);
1199
1200        /* sanity check */
1201        if (!serial) {
1202                hso_dbg(0x1, "serial == NULL\n");
1203                return;
1204        }
1205        if (status) {
1206                handle_usb_error(status, __func__, serial->parent);
1207                return;
1208        }
1209
1210        hso_dbg(0x1, "Actual length = %d\n", urb->actual_length);
1211        DUMP1(urb->transfer_buffer, urb->actual_length);
1212
1213        /* Anyone listening? */
1214        if (serial->port.count == 0)
1215                return;
1216
1217        if (serial->parent->port_spec & HSO_INFO_CRC_BUG)
1218                fix_crc_bug(urb, serial->in_endp->wMaxPacketSize);
1219        /* Valid data, handle RX data */
1220        spin_lock(&serial->serial_lock);
1221        serial->rx_urb_filled[hso_urb_to_index(serial, urb)] = 1;
1222        put_rxbuf_data_and_resubmit_bulk_urb(serial);
1223        spin_unlock(&serial->serial_lock);
1224}
1225
1226/*
1227 * This needs to be a tasklet otherwise we will
1228 * end up recursively calling this function.
1229 */
1230static void hso_unthrottle_tasklet(struct hso_serial *serial)
1231{
1232        unsigned long flags;
1233
1234        spin_lock_irqsave(&serial->serial_lock, flags);
1235        if ((serial->parent->port_spec & HSO_INTF_MUX))
1236                put_rxbuf_data_and_resubmit_ctrl_urb(serial);
1237        else
1238                put_rxbuf_data_and_resubmit_bulk_urb(serial);
1239        spin_unlock_irqrestore(&serial->serial_lock, flags);
1240}
1241
1242static  void hso_unthrottle(struct tty_struct *tty)
1243{
1244        struct hso_serial *serial = tty->driver_data;
1245
1246        tasklet_hi_schedule(&serial->unthrottle_tasklet);
1247}
1248
1249/* open the requested serial port */
1250static int hso_serial_open(struct tty_struct *tty, struct file *filp)
1251{
1252        struct hso_serial *serial = get_serial_by_index(tty->index);
1253        int result;
1254
1255        /* sanity check */
1256        if (serial == NULL || serial->magic != HSO_SERIAL_MAGIC) {
1257                WARN_ON(1);
1258                tty->driver_data = NULL;
1259                hso_dbg(0x1, "Failed to open port\n");
1260                return -ENODEV;
1261        }
1262
1263        mutex_lock(&serial->parent->mutex);
1264        result = usb_autopm_get_interface(serial->parent->interface);
1265        if (result < 0)
1266                goto err_out;
1267
1268        hso_dbg(0x1, "Opening %d\n", serial->minor);
1269
1270        /* setup */
1271        tty->driver_data = serial;
1272        tty_port_tty_set(&serial->port, tty);
1273
1274        /* check for port already opened, if not set the termios */
1275        serial->port.count++;
1276        if (serial->port.count == 1) {
1277                serial->rx_state = RX_IDLE;
1278                /* Force default termio settings */
1279                _hso_serial_set_termios(tty, NULL);
1280                tasklet_init(&serial->unthrottle_tasklet,
1281                             (void (*)(unsigned long))hso_unthrottle_tasklet,
1282                             (unsigned long)serial);
1283                result = hso_start_serial_device(serial->parent, GFP_KERNEL);
1284                if (result) {
1285                        hso_stop_serial_device(serial->parent);
1286                        serial->port.count--;
1287                } else {
1288                        kref_get(&serial->parent->ref);
1289                }
1290        } else {
1291                hso_dbg(0x1, "Port was already open\n");
1292        }
1293
1294        usb_autopm_put_interface(serial->parent->interface);
1295
1296        /* done */
1297        if (result)
1298                hso_serial_tiocmset(tty, TIOCM_RTS | TIOCM_DTR, 0);
1299err_out:
1300        mutex_unlock(&serial->parent->mutex);
1301        return result;
1302}
1303
1304/* close the requested serial port */
1305static void hso_serial_close(struct tty_struct *tty, struct file *filp)
1306{
1307        struct hso_serial *serial = tty->driver_data;
1308        u8 usb_gone;
1309
1310        hso_dbg(0x1, "Closing serial port\n");
1311
1312        /* Open failed, no close cleanup required */
1313        if (serial == NULL)
1314                return;
1315
1316        mutex_lock(&serial->parent->mutex);
1317        usb_gone = serial->parent->usb_gone;
1318
1319        if (!usb_gone)
1320                usb_autopm_get_interface(serial->parent->interface);
1321
1322        /* reset the rts and dtr */
1323        /* do the actual close */
1324        serial->port.count--;
1325
1326        if (serial->port.count <= 0) {
1327                serial->port.count = 0;
1328                tty_port_tty_set(&serial->port, NULL);
1329                if (!usb_gone)
1330                        hso_stop_serial_device(serial->parent);
1331                tasklet_kill(&serial->unthrottle_tasklet);
1332        }
1333
1334        if (!usb_gone)
1335                usb_autopm_put_interface(serial->parent->interface);
1336
1337        mutex_unlock(&serial->parent->mutex);
1338}
1339
1340/* close the requested serial port */
1341static int hso_serial_write(struct tty_struct *tty, const unsigned char *buf,
1342                            int count)
1343{
1344        struct hso_serial *serial = tty->driver_data;
1345        int space, tx_bytes;
1346        unsigned long flags;
1347
1348        /* sanity check */
1349        if (serial == NULL) {
1350                pr_err("%s: serial is NULL\n", __func__);
1351                return -ENODEV;
1352        }
1353
1354        spin_lock_irqsave(&serial->serial_lock, flags);
1355
1356        space = serial->tx_data_length - serial->tx_buffer_count;
1357        tx_bytes = (count < space) ? count : space;
1358
1359        if (!tx_bytes)
1360                goto out;
1361
1362        memcpy(serial->tx_buffer + serial->tx_buffer_count, buf, tx_bytes);
1363        serial->tx_buffer_count += tx_bytes;
1364
1365out:
1366        spin_unlock_irqrestore(&serial->serial_lock, flags);
1367
1368        hso_kick_transmit(serial);
1369        /* done */
1370        return tx_bytes;
1371}
1372
1373/* how much room is there for writing */
1374static int hso_serial_write_room(struct tty_struct *tty)
1375{
1376        struct hso_serial *serial = tty->driver_data;
1377        int room;
1378        unsigned long flags;
1379
1380        spin_lock_irqsave(&serial->serial_lock, flags);
1381        room = serial->tx_data_length - serial->tx_buffer_count;
1382        spin_unlock_irqrestore(&serial->serial_lock, flags);
1383
1384        /* return free room */
1385        return room;
1386}
1387
1388static void hso_serial_cleanup(struct tty_struct *tty)
1389{
1390        struct hso_serial *serial = tty->driver_data;
1391
1392        if (!serial)
1393                return;
1394
1395        kref_put(&serial->parent->ref, hso_serial_ref_free);
1396}
1397
1398/* setup the term */
1399static void hso_serial_set_termios(struct tty_struct *tty, struct ktermios *old)
1400{
1401        struct hso_serial *serial = tty->driver_data;
1402        unsigned long flags;
1403
1404        if (old)
1405                hso_dbg(0x16, "Termios called with: cflags new[%d] - old[%d]\n",
1406                        tty->termios.c_cflag, old->c_cflag);
1407
1408        /* the actual setup */
1409        spin_lock_irqsave(&serial->serial_lock, flags);
1410        if (serial->port.count)
1411                _hso_serial_set_termios(tty, old);
1412        else
1413                tty->termios = *old;
1414        spin_unlock_irqrestore(&serial->serial_lock, flags);
1415
1416        /* done */
1417}
1418
1419/* how many characters in the buffer */
1420static int hso_serial_chars_in_buffer(struct tty_struct *tty)
1421{
1422        struct hso_serial *serial = tty->driver_data;
1423        int chars;
1424        unsigned long flags;
1425
1426        /* sanity check */
1427        if (serial == NULL)
1428                return 0;
1429
1430        spin_lock_irqsave(&serial->serial_lock, flags);
1431        chars = serial->tx_buffer_count;
1432        spin_unlock_irqrestore(&serial->serial_lock, flags);
1433
1434        return chars;
1435}
1436static int tiocmget_submit_urb(struct hso_serial *serial,
1437                               struct hso_tiocmget *tiocmget,
1438                               struct usb_device *usb)
1439{
1440        int result;
1441
1442        if (serial->parent->usb_gone)
1443                return -ENODEV;
1444        usb_fill_int_urb(tiocmget->urb, usb,
1445                         usb_rcvintpipe(usb,
1446                                        tiocmget->endp->
1447                                        bEndpointAddress & 0x7F),
1448                         &tiocmget->serial_state_notification,
1449                         sizeof(struct hso_serial_state_notification),
1450                         tiocmget_intr_callback, serial,
1451                         tiocmget->endp->bInterval);
1452        result = usb_submit_urb(tiocmget->urb, GFP_ATOMIC);
1453        if (result) {
1454                dev_warn(&usb->dev, "%s usb_submit_urb failed %d\n", __func__,
1455                         result);
1456        }
1457        return result;
1458
1459}
1460
1461static void tiocmget_intr_callback(struct urb *urb)
1462{
1463        struct hso_serial *serial = urb->context;
1464        struct hso_tiocmget *tiocmget;
1465        int status = urb->status;
1466        u16 UART_state_bitmap, prev_UART_state_bitmap;
1467        struct uart_icount *icount;
1468        struct hso_serial_state_notification *serial_state_notification;
1469        struct usb_device *usb;
1470        struct usb_interface *interface;
1471        int if_num;
1472
1473        /* Sanity checks */
1474        if (!serial)
1475                return;
1476        if (status) {
1477                handle_usb_error(status, __func__, serial->parent);
1478                return;
1479        }
1480
1481        /* tiocmget is only supported on HSO_PORT_MODEM */
1482        tiocmget = serial->tiocmget;
1483        if (!tiocmget)
1484                return;
1485        BUG_ON((serial->parent->port_spec & HSO_PORT_MASK) != HSO_PORT_MODEM);
1486
1487        usb = serial->parent->usb;
1488        interface = serial->parent->interface;
1489
1490        if_num = interface->cur_altsetting->desc.bInterfaceNumber;
1491
1492        /* wIndex should be the USB interface number of the port to which the
1493         * notification applies, which should always be the Modem port.
1494         */
1495        serial_state_notification = &tiocmget->serial_state_notification;
1496        if (serial_state_notification->bmRequestType != BM_REQUEST_TYPE ||
1497            serial_state_notification->bNotification != B_NOTIFICATION ||
1498            le16_to_cpu(serial_state_notification->wValue) != W_VALUE ||
1499            le16_to_cpu(serial_state_notification->wIndex) != if_num ||
1500            le16_to_cpu(serial_state_notification->wLength) != W_LENGTH) {
1501                dev_warn(&usb->dev,
1502                         "hso received invalid serial state notification\n");
1503                DUMP(serial_state_notification,
1504                     sizeof(struct hso_serial_state_notification));
1505        } else {
1506
1507                UART_state_bitmap = le16_to_cpu(serial_state_notification->
1508                                                UART_state_bitmap);
1509                prev_UART_state_bitmap = tiocmget->prev_UART_state_bitmap;
1510                icount = &tiocmget->icount;
1511                spin_lock(&serial->serial_lock);
1512                if ((UART_state_bitmap & B_OVERRUN) !=
1513                   (prev_UART_state_bitmap & B_OVERRUN))
1514                        icount->parity++;
1515                if ((UART_state_bitmap & B_PARITY) !=
1516                   (prev_UART_state_bitmap & B_PARITY))
1517                        icount->parity++;
1518                if ((UART_state_bitmap & B_FRAMING) !=
1519                   (prev_UART_state_bitmap & B_FRAMING))
1520                        icount->frame++;
1521                if ((UART_state_bitmap & B_RING_SIGNAL) &&
1522                   !(prev_UART_state_bitmap & B_RING_SIGNAL))
1523                        icount->rng++;
1524                if ((UART_state_bitmap & B_BREAK) !=
1525                   (prev_UART_state_bitmap & B_BREAK))
1526                        icount->brk++;
1527                if ((UART_state_bitmap & B_TX_CARRIER) !=
1528                   (prev_UART_state_bitmap & B_TX_CARRIER))
1529                        icount->dsr++;
1530                if ((UART_state_bitmap & B_RX_CARRIER) !=
1531                   (prev_UART_state_bitmap & B_RX_CARRIER))
1532                        icount->dcd++;
1533                tiocmget->prev_UART_state_bitmap = UART_state_bitmap;
1534                spin_unlock(&serial->serial_lock);
1535                tiocmget->intr_completed = 1;
1536                wake_up_interruptible(&tiocmget->waitq);
1537        }
1538        memset(serial_state_notification, 0,
1539               sizeof(struct hso_serial_state_notification));
1540        tiocmget_submit_urb(serial,
1541                            tiocmget,
1542                            serial->parent->usb);
1543}
1544
1545/*
1546 * next few functions largely stolen from drivers/serial/serial_core.c
1547 */
1548/* Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change
1549 * - mask passed in arg for lines of interest
1550 *   (use |'ed TIOCM_RNG/DSR/CD/CTS for masking)
1551 * Caller should use TIOCGICOUNT to see which one it was
1552 */
1553static int
1554hso_wait_modem_status(struct hso_serial *serial, unsigned long arg)
1555{
1556        DECLARE_WAITQUEUE(wait, current);
1557        struct uart_icount cprev, cnow;
1558        struct hso_tiocmget  *tiocmget;
1559        int ret;
1560
1561        tiocmget = serial->tiocmget;
1562        if (!tiocmget)
1563                return -ENOENT;
1564        /*
1565         * note the counters on entry
1566         */
1567        spin_lock_irq(&serial->serial_lock);
1568        memcpy(&cprev, &tiocmget->icount, sizeof(struct uart_icount));
1569        spin_unlock_irq(&serial->serial_lock);
1570        add_wait_queue(&tiocmget->waitq, &wait);
1571        for (;;) {
1572                spin_lock_irq(&serial->serial_lock);
1573                memcpy(&cnow, &tiocmget->icount, sizeof(struct uart_icount));
1574                spin_unlock_irq(&serial->serial_lock);
1575                set_current_state(TASK_INTERRUPTIBLE);
1576                if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
1577                    ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
1578                    ((arg & TIOCM_CD)  && (cnow.dcd != cprev.dcd))) {
1579                        ret = 0;
1580                        break;
1581                }
1582                schedule();
1583                /* see if a signal did it */
1584                if (signal_pending(current)) {
1585                        ret = -ERESTARTSYS;
1586                        break;
1587                }
1588                cprev = cnow;
1589        }
1590        __set_current_state(TASK_RUNNING);
1591        remove_wait_queue(&tiocmget->waitq, &wait);
1592
1593        return ret;
1594}
1595
1596/*
1597 * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
1598 * Return: write counters to the user passed counter struct
1599 * NB: both 1->0 and 0->1 transitions are counted except for
1600 *     RI where only 0->1 is counted.
1601 */
1602static int hso_get_count(struct tty_struct *tty,
1603                  struct serial_icounter_struct *icount)
1604{
1605        struct uart_icount cnow;
1606        struct hso_serial *serial = tty->driver_data;
1607        struct hso_tiocmget  *tiocmget = serial->tiocmget;
1608
1609        memset(icount, 0, sizeof(struct serial_icounter_struct));
1610
1611        if (!tiocmget)
1612                 return -ENOENT;
1613        spin_lock_irq(&serial->serial_lock);
1614        memcpy(&cnow, &tiocmget->icount, sizeof(struct uart_icount));
1615        spin_unlock_irq(&serial->serial_lock);
1616
1617        icount->cts         = cnow.cts;
1618        icount->dsr         = cnow.dsr;
1619        icount->rng         = cnow.rng;
1620        icount->dcd         = cnow.dcd;
1621        icount->rx          = cnow.rx;
1622        icount->tx          = cnow.tx;
1623        icount->frame       = cnow.frame;
1624        icount->overrun     = cnow.overrun;
1625        icount->parity      = cnow.parity;
1626        icount->brk         = cnow.brk;
1627        icount->buf_overrun = cnow.buf_overrun;
1628
1629        return 0;
1630}
1631
1632
1633static int hso_serial_tiocmget(struct tty_struct *tty)
1634{
1635        int retval;
1636        struct hso_serial *serial = tty->driver_data;
1637        struct hso_tiocmget  *tiocmget;
1638        u16 UART_state_bitmap;
1639
1640        /* sanity check */
1641        if (!serial) {
1642                hso_dbg(0x1, "no tty structures\n");
1643                return -EINVAL;
1644        }
1645        spin_lock_irq(&serial->serial_lock);
1646        retval = ((serial->rts_state) ? TIOCM_RTS : 0) |
1647            ((serial->dtr_state) ? TIOCM_DTR : 0);
1648        tiocmget = serial->tiocmget;
1649        if (tiocmget) {
1650
1651                UART_state_bitmap = le16_to_cpu(
1652                        tiocmget->prev_UART_state_bitmap);
1653                if (UART_state_bitmap & B_RING_SIGNAL)
1654                        retval |=  TIOCM_RNG;
1655                if (UART_state_bitmap & B_RX_CARRIER)
1656                        retval |=  TIOCM_CD;
1657                if (UART_state_bitmap & B_TX_CARRIER)
1658                        retval |=  TIOCM_DSR;
1659        }
1660        spin_unlock_irq(&serial->serial_lock);
1661        return retval;
1662}
1663
1664static int hso_serial_tiocmset(struct tty_struct *tty,
1665                               unsigned int set, unsigned int clear)
1666{
1667        int val = 0;
1668        unsigned long flags;
1669        int if_num;
1670        struct hso_serial *serial = tty->driver_data;
1671        struct usb_interface *interface;
1672
1673        /* sanity check */
1674        if (!serial) {
1675                hso_dbg(0x1, "no tty structures\n");
1676                return -EINVAL;
1677        }
1678
1679        if ((serial->parent->port_spec & HSO_PORT_MASK) != HSO_PORT_MODEM)
1680                return -EINVAL;
1681
1682        interface = serial->parent->interface;
1683        if_num = interface->cur_altsetting->desc.bInterfaceNumber;
1684
1685        spin_lock_irqsave(&serial->serial_lock, flags);
1686        if (set & TIOCM_RTS)
1687                serial->rts_state = 1;
1688        if (set & TIOCM_DTR)
1689                serial->dtr_state = 1;
1690
1691        if (clear & TIOCM_RTS)
1692                serial->rts_state = 0;
1693        if (clear & TIOCM_DTR)
1694                serial->dtr_state = 0;
1695
1696        if (serial->dtr_state)
1697                val |= 0x01;
1698        if (serial->rts_state)
1699                val |= 0x02;
1700
1701        spin_unlock_irqrestore(&serial->serial_lock, flags);
1702
1703        return usb_control_msg(serial->parent->usb,
1704                               usb_rcvctrlpipe(serial->parent->usb, 0), 0x22,
1705                               0x21, val, if_num, NULL, 0,
1706                               USB_CTRL_SET_TIMEOUT);
1707}
1708
1709static int hso_serial_ioctl(struct tty_struct *tty,
1710                            unsigned int cmd, unsigned long arg)
1711{
1712        struct hso_serial *serial = tty->driver_data;
1713        int ret = 0;
1714        hso_dbg(0x8, "IOCTL cmd: %d, arg: %ld\n", cmd, arg);
1715
1716        if (!serial)
1717                return -ENODEV;
1718        switch (cmd) {
1719        case TIOCMIWAIT:
1720                ret = hso_wait_modem_status(serial, arg);
1721                break;
1722        default:
1723                ret = -ENOIOCTLCMD;
1724                break;
1725        }
1726        return ret;
1727}
1728
1729
1730/* starts a transmit */
1731static void hso_kick_transmit(struct hso_serial *serial)
1732{
1733        u8 *temp;
1734        unsigned long flags;
1735        int res;
1736
1737        spin_lock_irqsave(&serial->serial_lock, flags);
1738        if (!serial->tx_buffer_count)
1739                goto out;
1740
1741        if (serial->tx_urb_used)
1742                goto out;
1743
1744        /* Wakeup USB interface if necessary */
1745        if (hso_get_activity(serial->parent) == -EAGAIN)
1746                goto out;
1747
1748        /* Switch pointers around to avoid memcpy */
1749        temp = serial->tx_buffer;
1750        serial->tx_buffer = serial->tx_data;
1751        serial->tx_data = temp;
1752        serial->tx_data_count = serial->tx_buffer_count;
1753        serial->tx_buffer_count = 0;
1754
1755        /* If temp is set, it means we switched buffers */
1756        if (temp && serial->write_data) {
1757                res = serial->write_data(serial);
1758                if (res >= 0)
1759                        serial->tx_urb_used = 1;
1760        }
1761out:
1762        spin_unlock_irqrestore(&serial->serial_lock, flags);
1763}
1764
1765/* make a request (for reading and writing data to muxed serial port) */
1766static int mux_device_request(struct hso_serial *serial, u8 type, u16 port,
1767                              struct urb *ctrl_urb,
1768                              struct usb_ctrlrequest *ctrl_req,
1769                              u8 *ctrl_urb_data, u32 size)
1770{
1771        int result;
1772        int pipe;
1773
1774        /* Sanity check */
1775        if (!serial || !ctrl_urb || !ctrl_req) {
1776                pr_err("%s: Wrong arguments\n", __func__);
1777                return -EINVAL;
1778        }
1779
1780        /* initialize */
1781        ctrl_req->wValue = 0;
1782        ctrl_req->wIndex = cpu_to_le16(hso_port_to_mux(port));
1783        ctrl_req->wLength = cpu_to_le16(size);
1784
1785        if (type == USB_CDC_GET_ENCAPSULATED_RESPONSE) {
1786                /* Reading command */
1787                ctrl_req->bRequestType = USB_DIR_IN |
1788                                         USB_TYPE_OPTION_VENDOR |
1789                                         USB_RECIP_INTERFACE;
1790                ctrl_req->bRequest = USB_CDC_GET_ENCAPSULATED_RESPONSE;
1791                pipe = usb_rcvctrlpipe(serial->parent->usb, 0);
1792        } else {
1793                /* Writing command */
1794                ctrl_req->bRequestType = USB_DIR_OUT |
1795                                         USB_TYPE_OPTION_VENDOR |
1796                                         USB_RECIP_INTERFACE;
1797                ctrl_req->bRequest = USB_CDC_SEND_ENCAPSULATED_COMMAND;
1798                pipe = usb_sndctrlpipe(serial->parent->usb, 0);
1799        }
1800        /* syslog */
1801        hso_dbg(0x2, "%s command (%02x) len: %d, port: %d\n",
1802                type == USB_CDC_GET_ENCAPSULATED_RESPONSE ? "Read" : "Write",
1803                ctrl_req->bRequestType, ctrl_req->wLength, port);
1804
1805        /* Load ctrl urb */
1806        ctrl_urb->transfer_flags = 0;
1807        usb_fill_control_urb(ctrl_urb,
1808                             serial->parent->usb,
1809                             pipe,
1810                             (u8 *) ctrl_req,
1811                             ctrl_urb_data, size, ctrl_callback, serial);
1812        /* Send it on merry way */
1813        result = usb_submit_urb(ctrl_urb, GFP_ATOMIC);
1814        if (result) {
1815                dev_err(&ctrl_urb->dev->dev,
1816                        "%s failed submit ctrl_urb %d type %d\n", __func__,
1817                        result, type);
1818                return result;
1819        }
1820
1821        /* done */
1822        return size;
1823}
1824
1825/* called by intr_callback when read occurs */
1826static int hso_mux_serial_read(struct hso_serial *serial)
1827{
1828        if (!serial)
1829                return -EINVAL;
1830
1831        /* clean data */
1832        memset(serial->rx_data[0], 0, CTRL_URB_RX_SIZE);
1833        /* make the request */
1834
1835        if (serial->num_rx_urbs != 1) {
1836                dev_err(&serial->parent->interface->dev,
1837                        "ERROR: mux'd reads with multiple buffers "
1838                        "not possible\n");
1839                return 0;
1840        }
1841        return mux_device_request(serial,
1842                                  USB_CDC_GET_ENCAPSULATED_RESPONSE,
1843                                  serial->parent->port_spec & HSO_PORT_MASK,
1844                                  serial->rx_urb[0],
1845                                  &serial->ctrl_req_rx,
1846                                  serial->rx_data[0], serial->rx_data_length);
1847}
1848
1849/* used for muxed serial port callback (muxed serial read) */
1850static void intr_callback(struct urb *urb)
1851{
1852        struct hso_shared_int *shared_int = urb->context;
1853        struct hso_serial *serial;
1854        unsigned char *port_req;
1855        int status = urb->status;
1856        int i;
1857
1858        usb_mark_last_busy(urb->dev);
1859
1860        /* sanity check */
1861        if (!shared_int)
1862                return;
1863
1864        /* status check */
1865        if (status) {
1866                handle_usb_error(status, __func__, NULL);
1867                return;
1868        }
1869        hso_dbg(0x8, "--- Got intr callback 0x%02X ---\n", status);
1870
1871        /* what request? */
1872        port_req = urb->transfer_buffer;
1873        hso_dbg(0x8, "port_req = 0x%.2X\n", *port_req);
1874        /* loop over all muxed ports to find the one sending this */
1875        for (i = 0; i < 8; i++) {
1876                /* max 8 channels on MUX */
1877                if (*port_req & (1 << i)) {
1878                        serial = get_serial_by_shared_int_and_type(shared_int,
1879                                                                   (1 << i));
1880                        if (serial != NULL) {
1881                                hso_dbg(0x1, "Pending read interrupt on port %d\n",
1882                                        i);
1883                                spin_lock(&serial->serial_lock);
1884                                if (serial->rx_state == RX_IDLE &&
1885                                        serial->port.count > 0) {
1886                                        /* Setup and send a ctrl req read on
1887                                         * port i */
1888                                        if (!serial->rx_urb_filled[0]) {
1889                                                serial->rx_state = RX_SENT;
1890                                                hso_mux_serial_read(serial);
1891                                        } else
1892                                                serial->rx_state = RX_PENDING;
1893                                } else {
1894                                        hso_dbg(0x1, "Already a read pending on port %d or port not open\n",
1895                                                i);
1896                                }
1897                                spin_unlock(&serial->serial_lock);
1898                        }
1899                }
1900        }
1901        /* Resubmit interrupt urb */
1902        hso_mux_submit_intr_urb(shared_int, urb->dev, GFP_ATOMIC);
1903}
1904
1905/* called for writing to muxed serial port */
1906static int hso_mux_serial_write_data(struct hso_serial *serial)
1907{
1908        if (NULL == serial)
1909                return -EINVAL;
1910
1911        return mux_device_request(serial,
1912                                  USB_CDC_SEND_ENCAPSULATED_COMMAND,
1913                                  serial->parent->port_spec & HSO_PORT_MASK,
1914                                  serial->tx_urb,
1915                                  &serial->ctrl_req_tx,
1916                                  serial->tx_data, serial->tx_data_count);
1917}
1918
1919/* write callback for Diag and CS port */
1920static void hso_std_serial_write_bulk_callback(struct urb *urb)
1921{
1922        struct hso_serial *serial = urb->context;
1923        int status = urb->status;
1924
1925        /* sanity check */
1926        if (!serial) {
1927                hso_dbg(0x1, "serial == NULL\n");
1928                return;
1929        }
1930
1931        spin_lock(&serial->serial_lock);
1932        serial->tx_urb_used = 0;
1933        spin_unlock(&serial->serial_lock);
1934        if (status) {
1935                handle_usb_error(status, __func__, serial->parent);
1936                return;
1937        }
1938        hso_put_activity(serial->parent);
1939        tty_port_tty_wakeup(&serial->port);
1940        hso_kick_transmit(serial);
1941
1942        hso_dbg(0x1, "\n");
1943}
1944
1945/* called for writing diag or CS serial port */
1946static int hso_std_serial_write_data(struct hso_serial *serial)
1947{
1948        int count = serial->tx_data_count;
1949        int result;
1950
1951        usb_fill_bulk_urb(serial->tx_urb,
1952                          serial->parent->usb,
1953                          usb_sndbulkpipe(serial->parent->usb,
1954                                          serial->out_endp->
1955                                          bEndpointAddress & 0x7F),
1956                          serial->tx_data, serial->tx_data_count,
1957                          hso_std_serial_write_bulk_callback, serial);
1958
1959        result = usb_submit_urb(serial->tx_urb, GFP_ATOMIC);
1960        if (result) {
1961                dev_warn(&serial->parent->usb->dev,
1962                         "Failed to submit urb - res %d\n", result);
1963                return result;
1964        }
1965
1966        return count;
1967}
1968
1969/* callback after read or write on muxed serial port */
1970static void ctrl_callback(struct urb *urb)
1971{
1972        struct hso_serial *serial = urb->context;
1973        struct usb_ctrlrequest *req;
1974        int status = urb->status;
1975
1976        /* sanity check */
1977        if (!serial)
1978                return;
1979
1980        spin_lock(&serial->serial_lock);
1981        serial->tx_urb_used = 0;
1982        spin_unlock(&serial->serial_lock);
1983        if (status) {
1984                handle_usb_error(status, __func__, serial->parent);
1985                return;
1986        }
1987
1988        /* what request? */
1989        req = (struct usb_ctrlrequest *)(urb->setup_packet);
1990        hso_dbg(0x8, "--- Got muxed ctrl callback 0x%02X ---\n", status);
1991        hso_dbg(0x8, "Actual length of urb = %d\n", urb->actual_length);
1992        DUMP1(urb->transfer_buffer, urb->actual_length);
1993
1994        if (req->bRequestType ==
1995            (USB_DIR_IN | USB_TYPE_OPTION_VENDOR | USB_RECIP_INTERFACE)) {
1996                /* response to a read command */
1997                serial->rx_urb_filled[0] = 1;
1998                spin_lock(&serial->serial_lock);
1999                put_rxbuf_data_and_resubmit_ctrl_urb(serial);
2000                spin_unlock(&serial->serial_lock);
2001        } else {
2002                hso_put_activity(serial->parent);
2003                tty_port_tty_wakeup(&serial->port);
2004                /* response to a write command */
2005                hso_kick_transmit(serial);
2006        }
2007}
2008
2009/* handle RX data for serial port */
2010static int put_rxbuf_data(struct urb *urb, struct hso_serial *serial)
2011{
2012        struct tty_struct *tty;
2013        int count;
2014
2015        /* Sanity check */
2016        if (urb == NULL || serial == NULL) {
2017                hso_dbg(0x1, "serial = NULL\n");
2018                return -2;
2019        }
2020
2021        tty = tty_port_tty_get(&serial->port);
2022
2023        if (tty && tty_throttled(tty)) {
2024                tty_kref_put(tty);
2025                return -1;
2026        }
2027
2028        /* Push data to tty */
2029        hso_dbg(0x1, "data to push to tty\n");
2030        count = tty_buffer_request_room(&serial->port, urb->actual_length);
2031        if (count >= urb->actual_length) {
2032                tty_insert_flip_string(&serial->port, urb->transfer_buffer,
2033                                       urb->actual_length);
2034                tty_flip_buffer_push(&serial->port);
2035        } else {
2036                dev_warn(&serial->parent->usb->dev,
2037                         "dropping data, %d bytes lost\n", urb->actual_length);
2038        }
2039
2040        tty_kref_put(tty);
2041
2042        serial->rx_urb_filled[hso_urb_to_index(serial, urb)] = 0;
2043
2044        return 0;
2045}
2046
2047
2048/* Base driver functions */
2049
2050static void hso_log_port(struct hso_device *hso_dev)
2051{
2052        char *port_type;
2053        char port_dev[20];
2054
2055        switch (hso_dev->port_spec & HSO_PORT_MASK) {
2056        case HSO_PORT_CONTROL:
2057                port_type = "Control";
2058                break;
2059        case HSO_PORT_APP:
2060                port_type = "Application";
2061                break;
2062        case HSO_PORT_GPS:
2063                port_type = "GPS";
2064                break;
2065        case HSO_PORT_GPS_CONTROL:
2066                port_type = "GPS control";
2067                break;
2068        case HSO_PORT_APP2:
2069                port_type = "Application2";
2070                break;
2071        case HSO_PORT_PCSC:
2072                port_type = "PCSC";
2073                break;
2074        case HSO_PORT_DIAG:
2075                port_type = "Diagnostic";
2076                break;
2077        case HSO_PORT_DIAG2:
2078                port_type = "Diagnostic2";
2079                break;
2080        case HSO_PORT_MODEM:
2081                port_type = "Modem";
2082                break;
2083        case HSO_PORT_NETWORK:
2084                port_type = "Network";
2085                break;
2086        default:
2087                port_type = "Unknown";
2088                break;
2089        }
2090        if ((hso_dev->port_spec & HSO_PORT_MASK) == HSO_PORT_NETWORK) {
2091                sprintf(port_dev, "%s", dev2net(hso_dev)->net->name);
2092        } else
2093                sprintf(port_dev, "/dev/%s%d", tty_filename,
2094                        dev2ser(hso_dev)->minor);
2095
2096        dev_dbg(&hso_dev->interface->dev, "HSO: Found %s port %s\n",
2097                port_type, port_dev);
2098}
2099
2100static int hso_start_net_device(struct hso_device *hso_dev)
2101{
2102        int i, result = 0;
2103        struct hso_net *hso_net = dev2net(hso_dev);
2104
2105        if (!hso_net)
2106                return -ENODEV;
2107
2108        /* send URBs for all read buffers */
2109        for (i = 0; i < MUX_BULK_RX_BUF_COUNT; i++) {
2110
2111                /* Prep a receive URB */
2112                usb_fill_bulk_urb(hso_net->mux_bulk_rx_urb_pool[i],
2113                                  hso_dev->usb,
2114                                  usb_rcvbulkpipe(hso_dev->usb,
2115                                                  hso_net->in_endp->
2116                                                  bEndpointAddress & 0x7F),
2117                                  hso_net->mux_bulk_rx_buf_pool[i],
2118                                  MUX_BULK_RX_BUF_SIZE, read_bulk_callback,
2119                                  hso_net);
2120
2121                /* Put it out there so the device can send us stuff */
2122                result = usb_submit_urb(hso_net->mux_bulk_rx_urb_pool[i],
2123                                        GFP_NOIO);
2124                if (result)
2125                        dev_warn(&hso_dev->usb->dev,
2126                                "%s failed mux_bulk_rx_urb[%d] %d\n", __func__,
2127                                i, result);
2128        }
2129
2130        return result;
2131}
2132
2133static int hso_stop_net_device(struct hso_device *hso_dev)
2134{
2135        int i;
2136        struct hso_net *hso_net = dev2net(hso_dev);
2137
2138        if (!hso_net)
2139                return -ENODEV;
2140
2141        for (i = 0; i < MUX_BULK_RX_BUF_COUNT; i++) {
2142                if (hso_net->mux_bulk_rx_urb_pool[i])
2143                        usb_kill_urb(hso_net->mux_bulk_rx_urb_pool[i]);
2144
2145        }
2146        if (hso_net->mux_bulk_tx_urb)
2147                usb_kill_urb(hso_net->mux_bulk_tx_urb);
2148
2149        return 0;
2150}
2151
2152static int hso_start_serial_device(struct hso_device *hso_dev, gfp_t flags)
2153{
2154        int i, result = 0;
2155        struct hso_serial *serial = dev2ser(hso_dev);
2156
2157        if (!serial)
2158                return -ENODEV;
2159
2160        /* If it is not the MUX port fill in and submit a bulk urb (already
2161         * allocated in hso_serial_start) */
2162        if (!(serial->parent->port_spec & HSO_INTF_MUX)) {
2163                for (i = 0; i < serial->num_rx_urbs; i++) {
2164                        usb_fill_bulk_urb(serial->rx_urb[i],
2165                                          serial->parent->usb,
2166                                          usb_rcvbulkpipe(serial->parent->usb,
2167                                                          serial->in_endp->
2168                                                          bEndpointAddress &
2169                                                          0x7F),
2170                                          serial->rx_data[i],
2171                                          serial->rx_data_length,
2172                                          hso_std_serial_read_bulk_callback,
2173                                          serial);
2174                        result = usb_submit_urb(serial->rx_urb[i], flags);
2175                        if (result) {
2176                                dev_warn(&serial->parent->usb->dev,
2177                                         "Failed to submit urb - res %d\n",
2178                                         result);
2179                                break;
2180                        }
2181                }
2182        } else {
2183                mutex_lock(&serial->shared_int->shared_int_lock);
2184                if (!serial->shared_int->use_count) {
2185                        result =
2186                            hso_mux_submit_intr_urb(serial->shared_int,
2187                                                    hso_dev->usb, flags);
2188                }
2189                serial->shared_int->use_count++;
2190                mutex_unlock(&serial->shared_int->shared_int_lock);
2191        }
2192        if (serial->tiocmget)
2193                tiocmget_submit_urb(serial,
2194                                    serial->tiocmget,
2195                                    serial->parent->usb);
2196        return result;
2197}
2198
2199static int hso_stop_serial_device(struct hso_device *hso_dev)
2200{
2201        int i;
2202        struct hso_serial *serial = dev2ser(hso_dev);
2203        struct hso_tiocmget  *tiocmget;
2204
2205        if (!serial)
2206                return -ENODEV;
2207
2208        for (i = 0; i < serial->num_rx_urbs; i++) {
2209                if (serial->rx_urb[i]) {
2210                        usb_kill_urb(serial->rx_urb[i]);
2211                        serial->rx_urb_filled[i] = 0;
2212                }
2213        }
2214        serial->curr_rx_urb_idx = 0;
2215
2216        if (serial->tx_urb)
2217                usb_kill_urb(serial->tx_urb);
2218
2219        if (serial->shared_int) {
2220                mutex_lock(&serial->shared_int->shared_int_lock);
2221                if (serial->shared_int->use_count &&
2222                    (--serial->shared_int->use_count == 0)) {
2223                        struct urb *urb;
2224
2225                        urb = serial->shared_int->shared_intr_urb;
2226                        if (urb)
2227                                usb_kill_urb(urb);
2228                }
2229                mutex_unlock(&serial->shared_int->shared_int_lock);
2230        }
2231        tiocmget = serial->tiocmget;
2232        if (tiocmget) {
2233                wake_up_interruptible(&tiocmget->waitq);
2234                usb_kill_urb(tiocmget->urb);
2235        }
2236
2237        return 0;
2238}
2239
2240static void hso_serial_tty_unregister(struct hso_serial *serial)
2241{
2242        tty_unregister_device(tty_drv, serial->minor);
2243}
2244
2245static void hso_serial_common_free(struct hso_serial *serial)
2246{
2247        int i;
2248
2249        for (i = 0; i < serial->num_rx_urbs; i++) {
2250                /* unlink and free RX URB */
2251                usb_free_urb(serial->rx_urb[i]);
2252                /* free the RX buffer */
2253                kfree(serial->rx_data[i]);
2254        }
2255
2256        /* unlink and free TX URB */
2257        usb_free_urb(serial->tx_urb);
2258        kfree(serial->tx_buffer);
2259        kfree(serial->tx_data);
2260        tty_port_destroy(&serial->port);
2261}
2262
2263static int hso_serial_common_create(struct hso_serial *serial, int num_urbs,
2264                                    int rx_size, int tx_size)
2265{
2266        struct device *dev;
2267        int minor;
2268        int i;
2269
2270        tty_port_init(&serial->port);
2271
2272        minor = get_free_serial_index();
2273        if (minor < 0)
2274                goto exit;
2275
2276        /* register our minor number */
2277        serial->parent->dev = tty_port_register_device_attr(&serial->port,
2278                        tty_drv, minor, &serial->parent->interface->dev,
2279                        serial->parent, hso_serial_dev_groups);
2280        dev = serial->parent->dev;
2281
2282        /* fill in specific data for later use */
2283        serial->minor = minor;
2284        serial->magic = HSO_SERIAL_MAGIC;
2285        spin_lock_init(&serial->serial_lock);
2286        serial->num_rx_urbs = num_urbs;
2287
2288        /* RX, allocate urb and initialize */
2289
2290        /* prepare our RX buffer */
2291        serial->rx_data_length = rx_size;
2292        for (i = 0; i < serial->num_rx_urbs; i++) {
2293                serial->rx_urb[i] = usb_alloc_urb(0, GFP_KERNEL);
2294                if (!serial->rx_urb[i])
2295                        goto exit;
2296                serial->rx_urb[i]->transfer_buffer = NULL;
2297                serial->rx_urb[i]->transfer_buffer_length = 0;
2298                serial->rx_data[i] = kzalloc(serial->rx_data_length,
2299                                             GFP_KERNEL);
2300                if (!serial->rx_data[i])
2301                        goto exit;
2302        }
2303
2304        /* TX, allocate urb and initialize */
2305        serial->tx_urb = usb_alloc_urb(0, GFP_KERNEL);
2306        if (!serial->tx_urb)
2307                goto exit;
2308        serial->tx_urb->transfer_buffer = NULL;
2309        serial->tx_urb->transfer_buffer_length = 0;
2310        /* prepare our TX buffer */
2311        serial->tx_data_count = 0;
2312        serial->tx_buffer_count = 0;
2313        serial->tx_data_length = tx_size;
2314        serial->tx_data = kzalloc(serial->tx_data_length, GFP_KERNEL);
2315        if (!serial->tx_data)
2316                goto exit;
2317
2318        serial->tx_buffer = kzalloc(serial->tx_data_length, GFP_KERNEL);
2319        if (!serial->tx_buffer)
2320                goto exit;
2321
2322        return 0;
2323exit:
2324        hso_serial_tty_unregister(serial);
2325        hso_serial_common_free(serial);
2326        return -1;
2327}
2328
2329/* Creates a general hso device */
2330static struct hso_device *hso_create_device(struct usb_interface *intf,
2331                                            int port_spec)
2332{
2333        struct hso_device *hso_dev;
2334
2335        hso_dev = kzalloc(sizeof(*hso_dev), GFP_ATOMIC);
2336        if (!hso_dev)
2337                return NULL;
2338
2339        hso_dev->port_spec = port_spec;
2340        hso_dev->usb = interface_to_usbdev(intf);
2341        hso_dev->interface = intf;
2342        kref_init(&hso_dev->ref);
2343        mutex_init(&hso_dev->mutex);
2344
2345        INIT_WORK(&hso_dev->async_get_intf, async_get_intf);
2346        INIT_WORK(&hso_dev->async_put_intf, async_put_intf);
2347
2348        return hso_dev;
2349}
2350
2351/* Removes a network device in the network device table */
2352static int remove_net_device(struct hso_device *hso_dev)
2353{
2354        int i;
2355
2356        for (i = 0; i < HSO_MAX_NET_DEVICES; i++) {
2357                if (network_table[i] == hso_dev) {
2358                        network_table[i] = NULL;
2359                        break;
2360                }
2361        }
2362        if (i == HSO_MAX_NET_DEVICES)
2363                return -1;
2364        return 0;
2365}
2366
2367/* Frees our network device */
2368static void hso_free_net_device(struct hso_device *hso_dev)
2369{
2370        int i;
2371        struct hso_net *hso_net = dev2net(hso_dev);
2372
2373        if (!hso_net)
2374                return;
2375
2376        remove_net_device(hso_net->parent);
2377
2378        if (hso_net->net)
2379                unregister_netdev(hso_net->net);
2380
2381        /* start freeing */
2382        for (i = 0; i < MUX_BULK_RX_BUF_COUNT; i++) {
2383                usb_free_urb(hso_net->mux_bulk_rx_urb_pool[i]);
2384                kfree(hso_net->mux_bulk_rx_buf_pool[i]);
2385                hso_net->mux_bulk_rx_buf_pool[i] = NULL;
2386        }
2387        usb_free_urb(hso_net->mux_bulk_tx_urb);
2388        kfree(hso_net->mux_bulk_tx_buf);
2389        hso_net->mux_bulk_tx_buf = NULL;
2390
2391        if (hso_net->net)
2392                free_netdev(hso_net->net);
2393
2394        kfree(hso_dev);
2395}
2396
2397static const struct net_device_ops hso_netdev_ops = {
2398        .ndo_open       = hso_net_open,
2399        .ndo_stop       = hso_net_close,
2400        .ndo_start_xmit = hso_net_start_xmit,
2401        .ndo_tx_timeout = hso_net_tx_timeout,
2402};
2403
2404/* initialize the network interface */
2405static void hso_net_init(struct net_device *net)
2406{
2407        struct hso_net *hso_net = netdev_priv(net);
2408
2409        hso_dbg(0x1, "sizeof hso_net is %zu\n", sizeof(*hso_net));
2410
2411        /* fill in the other fields */
2412        net->netdev_ops = &hso_netdev_ops;
2413        net->watchdog_timeo = HSO_NET_TX_TIMEOUT;
2414        net->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST;
2415        net->type = ARPHRD_NONE;
2416        net->mtu = DEFAULT_MTU - 14;
2417        net->tx_queue_len = 10;
2418        net->ethtool_ops = &ops;
2419
2420        /* and initialize the semaphore */
2421        spin_lock_init(&hso_net->net_lock);
2422}
2423
2424/* Adds a network device in the network device table */
2425static int add_net_device(struct hso_device *hso_dev)
2426{
2427        int i;
2428
2429        for (i = 0; i < HSO_MAX_NET_DEVICES; i++) {
2430                if (network_table[i] == NULL) {
2431                        network_table[i] = hso_dev;
2432                        break;
2433                }
2434        }
2435        if (i == HSO_MAX_NET_DEVICES)
2436                return -1;
2437        return 0;
2438}
2439
2440static int hso_rfkill_set_block(void *data, bool blocked)
2441{
2442        struct hso_device *hso_dev = data;
2443        int enabled = !blocked;
2444        int rv;
2445
2446        mutex_lock(&hso_dev->mutex);
2447        if (hso_dev->usb_gone)
2448                rv = 0;
2449        else
2450                rv = usb_control_msg(hso_dev->usb, usb_rcvctrlpipe(hso_dev->usb, 0),
2451                                       enabled ? 0x82 : 0x81, 0x40, 0, 0, NULL, 0,
2452                                       USB_CTRL_SET_TIMEOUT);
2453        mutex_unlock(&hso_dev->mutex);
2454        return rv;
2455}
2456
2457static const struct rfkill_ops hso_rfkill_ops = {
2458        .set_block = hso_rfkill_set_block,
2459};
2460
2461/* Creates and sets up everything for rfkill */
2462static void hso_create_rfkill(struct hso_device *hso_dev,
2463                             struct usb_interface *interface)
2464{
2465        struct hso_net *hso_net = dev2net(hso_dev);
2466        struct device *dev = &hso_net->net->dev;
2467        static u32 rfkill_counter;
2468
2469        snprintf(hso_net->name, sizeof(hso_net->name), "hso-%d",
2470                 rfkill_counter++);
2471
2472        hso_net->rfkill = rfkill_alloc(hso_net->name,
2473                                       &interface_to_usbdev(interface)->dev,
2474                                       RFKILL_TYPE_WWAN,
2475                                       &hso_rfkill_ops, hso_dev);
2476        if (!hso_net->rfkill) {
2477                dev_err(dev, "%s - Out of memory\n", __func__);
2478                return;
2479        }
2480        if (rfkill_register(hso_net->rfkill) < 0) {
2481                rfkill_destroy(hso_net->rfkill);
2482                hso_net->rfkill = NULL;
2483                dev_err(dev, "%s - Failed to register rfkill\n", __func__);
2484                return;
2485        }
2486}
2487
2488static struct device_type hso_type = {
2489        .name   = "wwan",
2490};
2491
2492/* Creates our network device */
2493static struct hso_device *hso_create_net_device(struct usb_interface *interface,
2494                                                int port_spec)
2495{
2496        int result, i;
2497        struct net_device *net;
2498        struct hso_net *hso_net;
2499        struct hso_device *hso_dev;
2500
2501        hso_dev = hso_create_device(interface, port_spec);
2502        if (!hso_dev)
2503                return NULL;
2504
2505        /* allocate our network device, then we can put in our private data */
2506        /* call hso_net_init to do the basic initialization */
2507        net = alloc_netdev(sizeof(struct hso_net), "hso%d", NET_NAME_UNKNOWN,
2508                           hso_net_init);
2509        if (!net) {
2510                dev_err(&interface->dev, "Unable to create ethernet device\n");
2511                goto exit;
2512        }
2513
2514        hso_net = netdev_priv(net);
2515
2516        hso_dev->port_data.dev_net = hso_net;
2517        hso_net->net = net;
2518        hso_net->parent = hso_dev;
2519
2520        hso_net->in_endp = hso_get_ep(interface, USB_ENDPOINT_XFER_BULK,
2521                                      USB_DIR_IN);
2522        if (!hso_net->in_endp) {
2523                dev_err(&interface->dev, "Can't find BULK IN endpoint\n");
2524                goto exit;
2525        }
2526        hso_net->out_endp = hso_get_ep(interface, USB_ENDPOINT_XFER_BULK,
2527                                       USB_DIR_OUT);
2528        if (!hso_net->out_endp) {
2529                dev_err(&interface->dev, "Can't find BULK OUT endpoint\n");
2530                goto exit;
2531        }
2532        SET_NETDEV_DEV(net, &interface->dev);
2533        SET_NETDEV_DEVTYPE(net, &hso_type);
2534
2535        /* start allocating */
2536        for (i = 0; i < MUX_BULK_RX_BUF_COUNT; i++) {
2537                hso_net->mux_bulk_rx_urb_pool[i] = usb_alloc_urb(0, GFP_KERNEL);
2538                if (!hso_net->mux_bulk_rx_urb_pool[i])
2539                        goto exit;
2540                hso_net->mux_bulk_rx_buf_pool[i] = kzalloc(MUX_BULK_RX_BUF_SIZE,
2541                                                           GFP_KERNEL);
2542                if (!hso_net->mux_bulk_rx_buf_pool[i])
2543                        goto exit;
2544        }
2545        hso_net->mux_bulk_tx_urb = usb_alloc_urb(0, GFP_KERNEL);
2546        if (!hso_net->mux_bulk_tx_urb)
2547                goto exit;
2548        hso_net->mux_bulk_tx_buf = kzalloc(MUX_BULK_TX_BUF_SIZE, GFP_KERNEL);
2549        if (!hso_net->mux_bulk_tx_buf)
2550                goto exit;
2551
2552        add_net_device(hso_dev);
2553
2554        /* registering our net device */
2555        result = register_netdev(net);
2556        if (result) {
2557                dev_err(&interface->dev, "Failed to register device\n");
2558                goto exit;
2559        }
2560
2561        hso_log_port(hso_dev);
2562
2563        hso_create_rfkill(hso_dev, interface);
2564
2565        return hso_dev;
2566exit:
2567        hso_free_net_device(hso_dev);
2568        return NULL;
2569}
2570
2571static void hso_free_tiomget(struct hso_serial *serial)
2572{
2573        struct hso_tiocmget *tiocmget;
2574        if (!serial)
2575                return;
2576        tiocmget = serial->tiocmget;
2577        if (tiocmget) {
2578                usb_free_urb(tiocmget->urb);
2579                tiocmget->urb = NULL;
2580                serial->tiocmget = NULL;
2581                kfree(tiocmget);
2582        }
2583}
2584
2585/* Frees an AT channel ( goes for both mux and non-mux ) */
2586static void hso_free_serial_device(struct hso_device *hso_dev)
2587{
2588        struct hso_serial *serial = dev2ser(hso_dev);
2589
2590        if (!serial)
2591                return;
2592
2593        hso_serial_common_free(serial);
2594
2595        if (serial->shared_int) {
2596                mutex_lock(&serial->shared_int->shared_int_lock);
2597                if (--serial->shared_int->ref_count == 0)
2598                        hso_free_shared_int(serial->shared_int);
2599                else
2600                        mutex_unlock(&serial->shared_int->shared_int_lock);
2601        }
2602        hso_free_tiomget(serial);
2603        kfree(serial);
2604        kfree(hso_dev);
2605}
2606
2607/* Creates a bulk AT channel */
2608static struct hso_device *hso_create_bulk_serial_device(
2609                        struct usb_interface *interface, int port)
2610{
2611        struct hso_device *hso_dev;
2612        struct hso_serial *serial;
2613        int num_urbs;
2614        struct hso_tiocmget *tiocmget;
2615
2616        hso_dev = hso_create_device(interface, port);
2617        if (!hso_dev)
2618                return NULL;
2619
2620        serial = kzalloc(sizeof(*serial), GFP_KERNEL);
2621        if (!serial)
2622                goto exit;
2623
2624        serial->parent = hso_dev;
2625        hso_dev->port_data.dev_serial = serial;
2626
2627        if ((port & HSO_PORT_MASK) == HSO_PORT_MODEM) {
2628                num_urbs = 2;
2629                serial->tiocmget = kzalloc(sizeof(struct hso_tiocmget),
2630                                           GFP_KERNEL);
2631                /* it isn't going to break our heart if serial->tiocmget
2632                 *  allocation fails don't bother checking this.
2633                 */
2634                if (serial->tiocmget) {
2635                        tiocmget = serial->tiocmget;
2636                        tiocmget->urb = usb_alloc_urb(0, GFP_KERNEL);
2637                        if (tiocmget->urb) {
2638                                mutex_init(&tiocmget->mutex);
2639                                init_waitqueue_head(&tiocmget->waitq);
2640                                tiocmget->endp = hso_get_ep(
2641                                        interface,
2642                                        USB_ENDPOINT_XFER_INT,
2643                                        USB_DIR_IN);
2644                        } else
2645                                hso_free_tiomget(serial);
2646                }
2647        }
2648        else
2649                num_urbs = 1;
2650
2651        if (hso_serial_common_create(serial, num_urbs, BULK_URB_RX_SIZE,
2652                                     BULK_URB_TX_SIZE))
2653                goto exit;
2654
2655        serial->in_endp = hso_get_ep(interface, USB_ENDPOINT_XFER_BULK,
2656                                     USB_DIR_IN);
2657        if (!serial->in_endp) {
2658                dev_err(&interface->dev, "Failed to find BULK IN ep\n");
2659                goto exit2;
2660        }
2661
2662        if (!
2663            (serial->out_endp =
2664             hso_get_ep(interface, USB_ENDPOINT_XFER_BULK, USB_DIR_OUT))) {
2665                dev_err(&interface->dev, "Failed to find BULK IN ep\n");
2666                goto exit2;
2667        }
2668
2669        serial->write_data = hso_std_serial_write_data;
2670
2671        /* and record this serial */
2672        set_serial_by_index(serial->minor, serial);
2673
2674        /* setup the proc dirs and files if needed */
2675        hso_log_port(hso_dev);
2676
2677        /* done, return it */
2678        return hso_dev;
2679
2680exit2:
2681        hso_serial_tty_unregister(serial);
2682        hso_serial_common_free(serial);
2683exit:
2684        hso_free_tiomget(serial);
2685        kfree(serial);
2686        kfree(hso_dev);
2687        return NULL;
2688}
2689
2690/* Creates a multiplexed AT channel */
2691static
2692struct hso_device *hso_create_mux_serial_device(struct usb_interface *interface,
2693                                                int port,
2694                                                struct hso_shared_int *mux)
2695{
2696        struct hso_device *hso_dev;
2697        struct hso_serial *serial;
2698        int port_spec;
2699
2700        port_spec = HSO_INTF_MUX;
2701        port_spec &= ~HSO_PORT_MASK;
2702
2703        port_spec |= hso_mux_to_port(port);
2704        if ((port_spec & HSO_PORT_MASK) == HSO_PORT_NO_PORT)
2705                return NULL;
2706
2707        hso_dev = hso_create_device(interface, port_spec);
2708        if (!hso_dev)
2709                return NULL;
2710
2711        serial = kzalloc(sizeof(*serial), GFP_KERNEL);
2712        if (!serial)
2713                goto exit;
2714
2715        hso_dev->port_data.dev_serial = serial;
2716        serial->parent = hso_dev;
2717
2718        if (hso_serial_common_create
2719            (serial, 1, CTRL_URB_RX_SIZE, CTRL_URB_TX_SIZE))
2720                goto exit;
2721
2722        serial->tx_data_length--;
2723        serial->write_data = hso_mux_serial_write_data;
2724
2725        serial->shared_int = mux;
2726        mutex_lock(&serial->shared_int->shared_int_lock);
2727        serial->shared_int->ref_count++;
2728        mutex_unlock(&serial->shared_int->shared_int_lock);
2729
2730        /* and record this serial */
2731        set_serial_by_index(serial->minor, serial);
2732
2733        /* setup the proc dirs and files if needed */
2734        hso_log_port(hso_dev);
2735
2736        /* done, return it */
2737        return hso_dev;
2738
2739exit:
2740        if (serial) {
2741                tty_unregister_device(tty_drv, serial->minor);
2742                kfree(serial);
2743        }
2744        kfree(hso_dev);
2745        return NULL;
2746
2747}
2748
2749static void hso_free_shared_int(struct hso_shared_int *mux)
2750{
2751        usb_free_urb(mux->shared_intr_urb);
2752        kfree(mux->shared_intr_buf);
2753        mutex_unlock(&mux->shared_int_lock);
2754        kfree(mux);
2755}
2756
2757static
2758struct hso_shared_int *hso_create_shared_int(struct usb_interface *interface)
2759{
2760        struct hso_shared_int *mux = kzalloc(sizeof(*mux), GFP_KERNEL);
2761
2762        if (!mux)
2763                return NULL;
2764
2765        mux->intr_endp = hso_get_ep(interface, USB_ENDPOINT_XFER_INT,
2766                                    USB_DIR_IN);
2767        if (!mux->intr_endp) {
2768                dev_err(&interface->dev, "Can't find INT IN endpoint\n");
2769                goto exit;
2770        }
2771
2772        mux->shared_intr_urb = usb_alloc_urb(0, GFP_KERNEL);
2773        if (!mux->shared_intr_urb)
2774                goto exit;
2775        mux->shared_intr_buf =
2776                kzalloc(le16_to_cpu(mux->intr_endp->wMaxPacketSize),
2777                        GFP_KERNEL);
2778        if (!mux->shared_intr_buf)
2779                goto exit;
2780
2781        mutex_init(&mux->shared_int_lock);
2782
2783        return mux;
2784
2785exit:
2786        kfree(mux->shared_intr_buf);
2787        usb_free_urb(mux->shared_intr_urb);
2788        kfree(mux);
2789        return NULL;
2790}
2791
2792/* Gets the port spec for a certain interface */
2793static int hso_get_config_data(struct usb_interface *interface)
2794{
2795        struct usb_device *usbdev = interface_to_usbdev(interface);
2796        u8 *config_data = kmalloc(17, GFP_KERNEL);
2797        u32 if_num = interface->cur_altsetting->desc.bInterfaceNumber;
2798        s32 result;
2799
2800        if (!config_data)
2801                return -ENOMEM;
2802        if (usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0),
2803                            0x86, 0xC0, 0, 0, config_data, 17,
2804                            USB_CTRL_SET_TIMEOUT) != 0x11) {
2805                kfree(config_data);
2806                return -EIO;
2807        }
2808
2809        switch (config_data[if_num]) {
2810        case 0x0:
2811                result = 0;
2812                break;
2813        case 0x1:
2814                result = HSO_PORT_DIAG;
2815                break;
2816        case 0x2:
2817                result = HSO_PORT_GPS;
2818                break;
2819        case 0x3:
2820                result = HSO_PORT_GPS_CONTROL;
2821                break;
2822        case 0x4:
2823                result = HSO_PORT_APP;
2824                break;
2825        case 0x5:
2826                result = HSO_PORT_APP2;
2827                break;
2828        case 0x6:
2829                result = HSO_PORT_CONTROL;
2830                break;
2831        case 0x7:
2832                result = HSO_PORT_NETWORK;
2833                break;
2834        case 0x8:
2835                result = HSO_PORT_MODEM;
2836                break;
2837        case 0x9:
2838                result = HSO_PORT_MSD;
2839                break;
2840        case 0xa:
2841                result = HSO_PORT_PCSC;
2842                break;
2843        case 0xb:
2844                result = HSO_PORT_VOICE;
2845                break;
2846        default:
2847                result = 0;
2848        }
2849
2850        if (result)
2851                result |= HSO_INTF_BULK;
2852
2853        if (config_data[16] & 0x1)
2854                result |= HSO_INFO_CRC_BUG;
2855
2856        kfree(config_data);
2857        return result;
2858}
2859
2860/* called once for each interface upon device insertion */
2861static int hso_probe(struct usb_interface *interface,
2862                     const struct usb_device_id *id)
2863{
2864        int mux, i, if_num, port_spec;
2865        unsigned char port_mask;
2866        struct hso_device *hso_dev = NULL;
2867        struct hso_shared_int *shared_int;
2868        struct hso_device *tmp_dev = NULL;
2869
2870        if (interface->cur_altsetting->desc.bInterfaceClass != 0xFF) {
2871                dev_err(&interface->dev, "Not our interface\n");
2872                return -ENODEV;
2873        }
2874
2875        if_num = interface->cur_altsetting->desc.bInterfaceNumber;
2876
2877        /* Get the interface/port specification from either driver_info or from
2878         * the device itself */
2879        if (id->driver_info)
2880                port_spec = ((u32 *)(id->driver_info))[if_num];
2881        else
2882                port_spec = hso_get_config_data(interface);
2883
2884        /* Check if we need to switch to alt interfaces prior to port
2885         * configuration */
2886        if (interface->num_altsetting > 1)
2887                usb_set_interface(interface_to_usbdev(interface), if_num, 1);
2888        interface->needs_remote_wakeup = 1;
2889
2890        /* Allocate new hso device(s) */
2891        switch (port_spec & HSO_INTF_MASK) {
2892        case HSO_INTF_MUX:
2893                if ((port_spec & HSO_PORT_MASK) == HSO_PORT_NETWORK) {
2894                        /* Create the network device */
2895                        if (!disable_net) {
2896                                hso_dev = hso_create_net_device(interface,
2897                                                                port_spec);
2898                                if (!hso_dev)
2899                                        goto exit;
2900                                tmp_dev = hso_dev;
2901                        }
2902                }
2903
2904                if (hso_get_mux_ports(interface, &port_mask))
2905                        /* TODO: de-allocate everything */
2906                        goto exit;
2907
2908                shared_int = hso_create_shared_int(interface);
2909                if (!shared_int)
2910                        goto exit;
2911
2912                for (i = 1, mux = 0; i < 0x100; i = i << 1, mux++) {
2913                        if (port_mask & i) {
2914                                hso_dev = hso_create_mux_serial_device(
2915                                                interface, i, shared_int);
2916                                if (!hso_dev)
2917                                        goto exit;
2918                        }
2919                }
2920
2921                if (tmp_dev)
2922                        hso_dev = tmp_dev;
2923                break;
2924
2925        case HSO_INTF_BULK:
2926                /* It's a regular bulk interface */
2927                if ((port_spec & HSO_PORT_MASK) == HSO_PORT_NETWORK) {
2928                        if (!disable_net)
2929                                hso_dev =
2930                                    hso_create_net_device(interface, port_spec);
2931                } else {
2932                        hso_dev =
2933                            hso_create_bulk_serial_device(interface, port_spec);
2934                }
2935                if (!hso_dev)
2936                        goto exit;
2937                break;
2938        default:
2939                goto exit;
2940        }
2941
2942        /* save our data pointer in this device */
2943        usb_set_intfdata(interface, hso_dev);
2944
2945        /* done */
2946        return 0;
2947exit:
2948        hso_free_interface(interface);
2949        return -ENODEV;
2950}
2951
2952/* device removed, cleaning up */
2953static void hso_disconnect(struct usb_interface *interface)
2954{
2955        hso_free_interface(interface);
2956
2957        /* remove reference of our private data */
2958        usb_set_intfdata(interface, NULL);
2959}
2960
2961static void async_get_intf(struct work_struct *data)
2962{
2963        struct hso_device *hso_dev =
2964            container_of(data, struct hso_device, async_get_intf);
2965        usb_autopm_get_interface(hso_dev->interface);
2966}
2967
2968static void async_put_intf(struct work_struct *data)
2969{
2970        struct hso_device *hso_dev =
2971            container_of(data, struct hso_device, async_put_intf);
2972        usb_autopm_put_interface(hso_dev->interface);
2973}
2974
2975static int hso_get_activity(struct hso_device *hso_dev)
2976{
2977        if (hso_dev->usb->state == USB_STATE_SUSPENDED) {
2978                if (!hso_dev->is_active) {
2979                        hso_dev->is_active = 1;
2980                        schedule_work(&hso_dev->async_get_intf);
2981                }
2982        }
2983
2984        if (hso_dev->usb->state != USB_STATE_CONFIGURED)
2985                return -EAGAIN;
2986
2987        usb_mark_last_busy(hso_dev->usb);
2988
2989        return 0;
2990}
2991
2992static int hso_put_activity(struct hso_device *hso_dev)
2993{
2994        if (hso_dev->usb->state != USB_STATE_SUSPENDED) {
2995                if (hso_dev->is_active) {
2996                        hso_dev->is_active = 0;
2997                        schedule_work(&hso_dev->async_put_intf);
2998                        return -EAGAIN;
2999                }
3000        }
3001        hso_dev->is_active = 0;
3002        return 0;
3003}
3004
3005/* called by kernel when we need to suspend device */
3006static int hso_suspend(struct usb_interface *iface, pm_message_t message)
3007{
3008        int i, result;
3009
3010        /* Stop all serial ports */
3011        for (i = 0; i < HSO_SERIAL_TTY_MINORS; i++) {
3012                if (serial_table[i] && (serial_table[i]->interface == iface)) {
3013                        result = hso_stop_serial_device(serial_table[i]);
3014                        if (result)
3015                                goto out;
3016                }
3017        }
3018
3019        /* Stop all network ports */
3020        for (i = 0; i < HSO_MAX_NET_DEVICES; i++) {
3021                if (network_table[i] &&
3022                    (network_table[i]->interface == iface)) {
3023                        result = hso_stop_net_device(network_table[i]);
3024                        if (result)
3025                                goto out;
3026                }
3027        }
3028
3029out:
3030        return 0;
3031}
3032
3033/* called by kernel when we need to resume device */
3034static int hso_resume(struct usb_interface *iface)
3035{
3036        int i, result = 0;
3037        struct hso_net *hso_net;
3038
3039        /* Start all serial ports */
3040        for (i = 0; i < HSO_SERIAL_TTY_MINORS; i++) {
3041                if (serial_table[i] && (serial_table[i]->interface == iface)) {
3042                        if (dev2ser(serial_table[i])->port.count) {
3043                                result =
3044                                    hso_start_serial_device(serial_table[i], GFP_NOIO);
3045                                hso_kick_transmit(dev2ser(serial_table[i]));
3046                                if (result)
3047                                        goto out;
3048                        }
3049                }
3050        }
3051
3052        /* Start all network ports */
3053        for (i = 0; i < HSO_MAX_NET_DEVICES; i++) {
3054                if (network_table[i] &&
3055                    (network_table[i]->interface == iface)) {
3056                        hso_net = dev2net(network_table[i]);
3057                        if (hso_net->flags & IFF_UP) {
3058                                /* First transmit any lingering data,
3059                                   then restart the device. */
3060                                if (hso_net->skb_tx_buf) {
3061                                        dev_dbg(&iface->dev,
3062                                                "Transmitting"
3063                                                " lingering data\n");
3064                                        hso_net_start_xmit(hso_net->skb_tx_buf,
3065                                                           hso_net->net);
3066                                        hso_net->skb_tx_buf = NULL;
3067                                }
3068                                result = hso_start_net_device(network_table[i]);
3069                                if (result)
3070                                        goto out;
3071                        }
3072                }
3073        }
3074
3075out:
3076        return result;
3077}
3078
3079static void hso_serial_ref_free(struct kref *ref)
3080{
3081        struct hso_device *hso_dev = container_of(ref, struct hso_device, ref);
3082
3083        hso_free_serial_device(hso_dev);
3084}
3085
3086static void hso_free_interface(struct usb_interface *interface)
3087{
3088        struct hso_serial *serial;
3089        int i;
3090
3091        for (i = 0; i < HSO_SERIAL_TTY_MINORS; i++) {
3092                if (serial_table[i] &&
3093                    (serial_table[i]->interface == interface)) {
3094                        serial = dev2ser(serial_table[i]);
3095                        tty_port_tty_hangup(&serial->port, false);
3096                        mutex_lock(&serial->parent->mutex);
3097                        serial->parent->usb_gone = 1;
3098                        mutex_unlock(&serial->parent->mutex);
3099                        cancel_work_sync(&serial_table[i]->async_put_intf);
3100                        cancel_work_sync(&serial_table[i]->async_get_intf);
3101                        hso_serial_tty_unregister(serial);
3102                        kref_put(&serial_table[i]->ref, hso_serial_ref_free);
3103                        set_serial_by_index(i, NULL);
3104                }
3105        }
3106
3107        for (i = 0; i < HSO_MAX_NET_DEVICES; i++) {
3108                if (network_table[i] &&
3109                    (network_table[i]->interface == interface)) {
3110                        struct rfkill *rfk = dev2net(network_table[i])->rfkill;
3111                        /* hso_stop_net_device doesn't stop the net queue since
3112                         * traffic needs to start it again when suspended */
3113                        netif_stop_queue(dev2net(network_table[i])->net);
3114                        hso_stop_net_device(network_table[i]);
3115                        cancel_work_sync(&network_table[i]->async_put_intf);
3116                        cancel_work_sync(&network_table[i]->async_get_intf);
3117                        if (rfk) {
3118                                rfkill_unregister(rfk);
3119                                rfkill_destroy(rfk);
3120                        }
3121                        hso_free_net_device(network_table[i]);
3122                }
3123        }
3124}
3125
3126/* Helper functions */
3127
3128/* Get the endpoint ! */
3129static struct usb_endpoint_descriptor *hso_get_ep(struct usb_interface *intf,
3130                                                  int type, int dir)
3131{
3132        int i;
3133        struct usb_host_interface *iface = intf->cur_altsetting;
3134        struct usb_endpoint_descriptor *endp;
3135
3136        for (i = 0; i < iface->desc.bNumEndpoints; i++) {
3137                endp = &iface->endpoint[i].desc;
3138                if (((endp->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == dir) &&
3139                    (usb_endpoint_type(endp) == type))
3140                        return endp;
3141        }
3142
3143        return NULL;
3144}
3145
3146/* Get the byte that describes which ports are enabled */
3147static int hso_get_mux_ports(struct usb_interface *intf, unsigned char *ports)
3148{
3149        int i;
3150        struct usb_host_interface *iface = intf->cur_altsetting;
3151
3152        if (iface->extralen == 3) {
3153                *ports = iface->extra[2];
3154                return 0;
3155        }
3156
3157        for (i = 0; i < iface->desc.bNumEndpoints; i++) {
3158                if (iface->endpoint[i].extralen == 3) {
3159                        *ports = iface->endpoint[i].extra[2];
3160                        return 0;
3161                }
3162        }
3163
3164        return -1;
3165}
3166
3167/* interrupt urb needs to be submitted, used for serial read of muxed port */
3168static int hso_mux_submit_intr_urb(struct hso_shared_int *shared_int,
3169                                   struct usb_device *usb, gfp_t gfp)
3170{
3171        int result;
3172
3173        usb_fill_int_urb(shared_int->shared_intr_urb, usb,
3174                         usb_rcvintpipe(usb,
3175                                shared_int->intr_endp->bEndpointAddress & 0x7F),
3176                         shared_int->shared_intr_buf,
3177                         1,
3178                         intr_callback, shared_int,
3179                         shared_int->intr_endp->bInterval);
3180
3181        result = usb_submit_urb(shared_int->shared_intr_urb, gfp);
3182        if (result)
3183                dev_warn(&usb->dev, "%s failed mux_intr_urb %d\n", __func__,
3184                        result);
3185
3186        return result;
3187}
3188
3189/* operations setup of the serial interface */
3190static const struct tty_operations hso_serial_ops = {
3191        .open = hso_serial_open,
3192        .close = hso_serial_close,
3193        .write = hso_serial_write,
3194        .write_room = hso_serial_write_room,
3195        .cleanup = hso_serial_cleanup,
3196        .ioctl = hso_serial_ioctl,
3197        .set_termios = hso_serial_set_termios,
3198        .chars_in_buffer = hso_serial_chars_in_buffer,
3199        .tiocmget = hso_serial_tiocmget,
3200        .tiocmset = hso_serial_tiocmset,
3201        .get_icount = hso_get_count,
3202        .unthrottle = hso_unthrottle
3203};
3204
3205static struct usb_driver hso_driver = {
3206        .name = driver_name,
3207        .probe = hso_probe,
3208        .disconnect = hso_disconnect,
3209        .id_table = hso_ids,
3210        .suspend = hso_suspend,
3211        .resume = hso_resume,
3212        .reset_resume = hso_resume,
3213        .supports_autosuspend = 1,
3214        .disable_hub_initiated_lpm = 1,
3215};
3216
3217static int __init hso_init(void)
3218{
3219        int i;
3220        int result;
3221
3222        /* put it in the log */
3223        pr_info("%s\n", version);
3224
3225        /* Initialise the serial table semaphore and table */
3226        spin_lock_init(&serial_table_lock);
3227        for (i = 0; i < HSO_SERIAL_TTY_MINORS; i++)
3228                serial_table[i] = NULL;
3229
3230        /* allocate our driver using the proper amount of supported minors */
3231        tty_drv = alloc_tty_driver(HSO_SERIAL_TTY_MINORS);
3232        if (!tty_drv)
3233                return -ENOMEM;
3234
3235        /* fill in all needed values */
3236        tty_drv->driver_name = driver_name;
3237        tty_drv->name = tty_filename;
3238
3239        /* if major number is provided as parameter, use that one */
3240        if (tty_major)
3241                tty_drv->major = tty_major;
3242
3243        tty_drv->minor_start = 0;
3244        tty_drv->type = TTY_DRIVER_TYPE_SERIAL;
3245        tty_drv->subtype = SERIAL_TYPE_NORMAL;
3246        tty_drv->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
3247        tty_drv->init_termios = tty_std_termios;
3248        hso_init_termios(&tty_drv->init_termios);
3249        tty_set_operations(tty_drv, &hso_serial_ops);
3250
3251        /* register the tty driver */
3252        result = tty_register_driver(tty_drv);
3253        if (result) {
3254                pr_err("%s - tty_register_driver failed(%d)\n",
3255                       __func__, result);
3256                goto err_free_tty;
3257        }
3258
3259        /* register this module as an usb driver */
3260        result = usb_register(&hso_driver);
3261        if (result) {
3262                pr_err("Could not register hso driver - error: %d\n", result);
3263                goto err_unreg_tty;
3264        }
3265
3266        /* done */
3267        return 0;
3268err_unreg_tty:
3269        tty_unregister_driver(tty_drv);
3270err_free_tty:
3271        put_tty_driver(tty_drv);
3272        return result;
3273}
3274
3275static void __exit hso_exit(void)
3276{
3277        pr_info("unloaded\n");
3278
3279        tty_unregister_driver(tty_drv);
3280        /* deregister the usb driver */
3281        usb_deregister(&hso_driver);
3282        put_tty_driver(tty_drv);
3283}
3284
3285/* Module definitions */
3286module_init(hso_init);
3287module_exit(hso_exit);
3288
3289MODULE_AUTHOR(MOD_AUTHOR);
3290MODULE_DESCRIPTION(MOD_DESCRIPTION);
3291MODULE_LICENSE(MOD_LICENSE);
3292
3293/* change the debug level (eg: insmod hso.ko debug=0x04) */
3294MODULE_PARM_DESC(debug, "debug level mask [0x01 | 0x02 | 0x04 | 0x08 | 0x10]");
3295module_param(debug, int, S_IRUGO | S_IWUSR);
3296
3297/* set the major tty number (eg: insmod hso.ko tty_major=245) */
3298MODULE_PARM_DESC(tty_major, "Set the major tty number");
3299module_param(tty_major, int, S_IRUGO | S_IWUSR);
3300
3301/* disable network interface (eg: insmod hso.ko disable_net=1) */
3302MODULE_PARM_DESC(disable_net, "Disable the network interface");
3303module_param(disable_net, int, S_IRUGO | S_IWUSR);
3304