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