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