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