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