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