Root/target/linux/brcm-2.4/patches/014-sierra_support.patch

1--- /dev/null
2+++ b/drivers/usb/serial/sierra.c
3@@ -0,0 +1,1446 @@
4+/*
5+ * Sierra Wireless CDMA Wireless Serial USB drive
6+ *
7+ * Current Copy modified by: Kevin Lloyd <linux@sierrawireless.com>
8+ * Original Copy written by: 2005 Greg Kroah-Hartman <gregkh <at> suse.de>
9+ *
10+ *
11+ * This program is free software; you can redistribute it and/or
12+ * modify it under the terms of the GNU General Public License version
13+ * 2 as published by the Free Software Foundation.
14+ *
15+ * Version history:
16+ Version 1.03 (Lloyd):
17+ Included support for DTR control and enhanced buffering (should help
18+ speed).
19+ */
20+
21+#include <linux/config.h>
22+#include <linux/kernel.h>
23+#include <linux/init.h>
24+#include <linux/slab.h>
25+#include <linux/tty.h>
26+#include <linux/tty_driver.h>
27+#include <linux/tty_flip.h>
28+#include <linux/module.h>
29+#include <linux/usb.h>
30+#include <linux/mm.h>
31+#include <asm/uaccess.h>
32+#include <linux/errno.h>
33+#include <linux/list.h>
34+#include <linux/spinlock.h>
35+#include <linux/smp_lock.h>
36+
37+#ifdef CONFIG_USB_SERIAL_DEBUG
38+ static int debug = 1;
39+#else
40+ static int debug;
41+#endif
42+
43+#include "usb-serial.h"
44+#include "sierra.h"
45+#if defined(CONFIG_USB_SERIAL_PL2303) || defined(CONFIG_USB_SERIAL_PL2303_MODULE)
46+#include "pl2303.h" // see /* BEGIN HORRIBLE HACK FOR PL2303 */ below
47+#endif
48+
49+#define DRIVER_VERSION "v1.03"
50+
51+#if 0
52+#define USB_VENDER_REQUEST_SET_DEVICE_POWER_STATE 0
53+
54+#define USB_DEVICE_POWER_STATE_D0 0x0000
55+#define USB_DEVICE_POWER_STATE_D1 0x0001
56+#define USB_DEVICE_POWER_STATE_D2 0x0002
57+#define USB_DEVICE_POWER_STATE_D3 0x0003
58+
59+#define SET_CONTROL_LINE_STATE 0x22
60+/*
61+ * Output control lines.
62+ */
63+
64+#define ACM_CTRL_DTR 0x01
65+#define ACM_CTRL_RTS 0x02
66+#endif
67+
68+//static int sw_attach(struct usb_serial *serial);
69+static void sw_usb_serial_generic_shutdown(struct usb_serial *serial);
70+
71+static int sw_usb_serial_generic_open(struct usb_serial_port *port, struct file *filp);
72+static void sw_usb_serial_generic_close(struct usb_serial_port *port, struct file *filp);
73+
74+#if 1
75+/*-----------------------------------------------------------*/
76+static int serial_refcount;
77+static struct tty_driver serial_tty_driver;
78+static struct tty_struct * serial_tty[SERIAL_TTY_MINORS];
79+static struct termios * serial_termios[SERIAL_TTY_MINORS];
80+static struct termios * serial_termios_locked[SERIAL_TTY_MINORS];
81+static struct usb_serial *serial_table[SERIAL_TTY_MINORS]; /* initially all NULL */
82+
83+static LIST_HEAD(usb_serial_driver_list);
84+static struct usb_serial *get_free_serial (int num_ports, int *minor);
85+static void generic_write_bulk_callback (struct urb *urb);
86+static void * usb_serial_probe(struct usb_device *dev, unsigned int ifnum,const struct usb_device_id *id);
87+static void usb_serial_disconnect(struct usb_device *dev, void *ptr);
88+static void sw_usb_serial_generic_read_bulk_callback (struct urb *urb);
89+static void port_softint(void *private);
90+static void return_serial (struct usb_serial *serial);
91+static struct usb_serial *get_free_serial (int num_ports, int *minor);
92+static int serial_read_proc (char *page, char **start, off_t off, int count, int *eof, void *data);
93+/*-----------------------------------------------------------*/
94+
95+#endif
96+
97+
98+static struct usb_device_id id_table [] = {
99+ { USB_DEVICE(0x1199, 0x0017) }, /* Sierra Wireless EM5625 */
100+ { USB_DEVICE(0x1199, 0x0018) }, /* Sierra Wireless MC5720 */
101+ { USB_DEVICE(0x1199, 0x0218) }, /* Sierra Wireless MC5720 */
102+ { USB_DEVICE(0x0f30, 0x1b1d) }, /* Sierra Wireless MC5720 */
103+ { USB_DEVICE(0x1199, 0x0020) }, /* Sierra Wireless MC5725 */
104+ { USB_DEVICE(0x1199, 0x0220) }, /* Sierra Wireless MC5725 */
105+ { USB_DEVICE(0x1199, 0x0019) }, /* Sierra Wireless AirCard 595 */
106+ { USB_DEVICE(0x1199, 0x0021) }, /* Sierra Wireless AirCard 597E */
107+ { USB_DEVICE(0x1199, 0x0120) }, /* Sierra Wireless USB Dongle 595U */
108+ { USB_DEVICE(0x1199, 0x0023) }, /* Sierra Wireless C597 */
109+
110+ { USB_DEVICE(0x1199, 0x6802) }, /* Sierra Wireless MC8755 */
111+ { USB_DEVICE(0x1199, 0x6804) }, /* Sierra Wireless MC8755 */
112+ { USB_DEVICE(0x1199, 0x6803) }, /* Sierra Wireless MC8765 */
113+ { USB_DEVICE(0x1199, 0x6812) }, /* Sierra Wireless MC8775 & AC 875U */
114+ { USB_DEVICE(0x1199, 0x6813) }, /* Sierra Wireless MC8775 (Thinkpad internal) */
115+ { USB_DEVICE(0x1199, 0x6815) }, /* Sierra Wireless MC8775 */
116+ { USB_DEVICE(0x03f0, 0x1e1d) }, /* HP hs2300 a.k.a MC8775 */
117+ { USB_DEVICE(0x1199, 0x6820) }, /* Sierra Wireless AirCard 875 */
118+ { USB_DEVICE(0x1199, 0x6821) }, /* Sierra Wireless AirCard 875U */
119+ { USB_DEVICE(0x1199, 0x6832) }, /* Sierra Wireless MC8780*/
120+ { USB_DEVICE(0x1199, 0x6833) }, /* Sierra Wireless MC8781*/
121+ { USB_DEVICE(0x1199, 0x683B) }, /* Sierra Wireless MC8785 Composite*/
122+ { USB_DEVICE(0x1199, 0x6850) }, /* Sierra Wireless AirCard 880 */
123+ { USB_DEVICE(0x1199, 0x6851) }, /* Sierra Wireless AirCard 881 */
124+ { USB_DEVICE(0x1199, 0x6852) }, /* Sierra Wireless AirCard 880 E */
125+ { USB_DEVICE(0x1199, 0x6853) }, /* Sierra Wireless AirCard 881 E */
126+ { USB_DEVICE(0x1199, 0x6855) }, /* Sierra Wireless AirCard 880 U */
127+ { USB_DEVICE(0x1199, 0x6856) }, /* Sierra Wireless AirCard 881 U */
128+ { USB_DEVICE(0x1199, 0x6859) }, /* Sierra Wireless AirCard 885 E */
129+ { USB_DEVICE(0x1199, 0x685A) }, /* Sierra Wireless AirCard 885 E */
130+
131+ { USB_DEVICE(0x1199, 0x6468) }, /* Sierra Wireless MP3G - EVDO */
132+ { USB_DEVICE(0x1199, 0x6469) }, /* Sierra Wireless MP3G - UMTS/HSPA */
133+
134+ { USB_DEVICE(0x1199, 0x0112) }, /* Sierra Wireless AirCard 580 */
135+ { USB_DEVICE(0x0F3D, 0x0112) }, /* AirPrime/Sierra Wireless PC 5220 */
136+ { USB_DEVICE(0x05C6, 0x6613) }, /* Onda H600/ZTE MF330 */
137+ { }
138+};
139+
140+MODULE_DEVICE_TABLE(usb, id_table);
141+
142+static struct usb_driver sierra_driver = {
143+// .owner = THIS_MODULE,
144+ .name = "Sierra wireless",
145+ .probe = usb_serial_probe,
146+ .disconnect = usb_serial_disconnect,
147+ .id_table = id_table,
148+};
149+
150+static struct usb_serial_device_type sierra_device = {
151+// .driver = {
152+ .owner = THIS_MODULE,
153+ .name = "Sierra Wireless",
154+// },
155+ .id_table = id_table,
156+ .num_interrupt_in = NUM_DONT_CARE,
157+ .num_bulk_in = NUM_DONT_CARE,
158+ .num_bulk_out = NUM_DONT_CARE,
159+ .num_ports = 3,
160+ //.startup = sw_attach,
161+ .shutdown = sw_usb_serial_generic_shutdown,
162+ .open = sw_usb_serial_generic_open,
163+ .close = sw_usb_serial_generic_close,
164+};
165+
166+#define MAX_NUM_PORTS 8
167+
168+/* local function prototypes */
169+static int serial_open (struct tty_struct *tty, struct file * filp);
170+static void serial_close (struct tty_struct *tty, struct file * filp);
171+static int serial_write (struct tty_struct * tty, int from_user, const unsigned char *buf, int count);
172+static int serial_write_room (struct tty_struct *tty);
173+static int serial_chars_in_buffer (struct tty_struct *tty);
174+static void serial_throttle (struct tty_struct * tty);
175+static void serial_unthrottle (struct tty_struct * tty);
176+static int serial_ioctl (struct tty_struct *tty, struct file * file, unsigned int cmd, unsigned long arg);
177+static void serial_set_termios (struct tty_struct *tty, struct termios * old);
178+//static void serial_shutdown (struct usb_serial *serial);
179+static void serial_break (struct tty_struct *tty, int break_state);
180+static int generic_write (struct usb_serial_port *port, int from_user, const unsigned char *buf, int count);
181+static int generic_write_room (struct usb_serial_port *port);
182+static void generic_cleanup (struct usb_serial_port *port);
183+static int generic_chars_in_buffer (struct usb_serial_port *port);
184+//static void generic_shutdown (struct usb_serial *serial);
185+
186+#if 1
187+static struct tty_driver serial_tty_driver = {
188+ .magic = TTY_DRIVER_MAGIC,
189+ .driver_name = "usb-serial",
190+#ifndef CONFIG_DEVFS_FS
191+ .name = "ttyUSB",
192+#else
193+ .name = "usb/tts/%d",
194+#endif
195+ .major = SERIAL_TTY_MAJOR,
196+ .minor_start = 0,
197+ .num = SERIAL_TTY_MINORS,
198+ .type = TTY_DRIVER_TYPE_SERIAL,
199+ .subtype = SERIAL_TYPE_NORMAL,
200+ .flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS,
201+
202+ .refcount = &serial_refcount,
203+ .table = serial_tty,
204+ .termios = serial_termios,
205+ .termios_locked = serial_termios_locked,
206+
207+ .open = serial_open,
208+ .close = serial_close,
209+ .write = serial_write,
210+ .write_room = serial_write_room,
211+ .ioctl = serial_ioctl,
212+ .set_termios = serial_set_termios,
213+ .throttle = serial_throttle,
214+ .unthrottle = serial_unthrottle,
215+ .break_ctl = serial_break,
216+ .chars_in_buffer = serial_chars_in_buffer,
217+ .read_proc = serial_read_proc,
218+};
219+#endif
220+
221+
222+/*****************************************************************************
223+ * Driver tty interface functions
224+ *****************************************************************************/
225+static struct usb_serial *get_serial_by_minor (unsigned int minor)
226+{
227+ return serial_table[minor];
228+}
229+
230+static int serial_open (struct tty_struct *tty, struct file * filp)
231+{
232+ struct usb_serial *serial;
233+ struct usb_serial_port *port;
234+ unsigned int portNumber;
235+ int retval = 0;
236+
237+ dbg("%s", __FUNCTION__);
238+
239+ /* initialize the pointer incase something fails */
240+ tty->driver_data = NULL;
241+
242+ /* get the serial object associated with this tty pointer */
243+ serial = get_serial_by_minor (MINOR(tty->device));
244+
245+ if (serial_paranoia_check (serial, __FUNCTION__))
246+ return -ENODEV;
247+
248+ /* set up our port structure making the tty driver remember our port object, and us it */
249+ portNumber = MINOR(tty->device) - serial->minor;
250+ port = &serial->port[portNumber];
251+ tty->driver_data = port;
252+
253+ down (&port->sem);
254+ port->tty = tty;
255+
256+ /* lock this module before we call it */
257+ if (serial->type->owner)
258+ __MOD_INC_USE_COUNT(serial->type->owner);
259+
260+ ++port->open_count;
261+ if (port->open_count == 1) {
262+ /* only call the device specific open if this
263+ * is the first time the port is opened */
264+ if (serial->type->open)
265+ retval = serial->type->open(port, filp);
266+ else
267+ retval = sw_usb_serial_generic_open(port, filp);//@.@
268+ }
269+
270+ if (retval) {
271+ port->open_count = 0;
272+ if (serial->type->owner)
273+ __MOD_DEC_USE_COUNT(serial->type->owner);
274+ }
275+
276+ up (&port->sem);
277+ return retval;
278+}
279+
280+static void __serial_close(struct usb_serial_port *port, struct file *filp)
281+{
282+ if (!port->open_count) {
283+ dbg ("%s - port not opened", __FUNCTION__);
284+ return;
285+ }
286+
287+ --port->open_count;
288+ if (port->open_count <= 0) {
289+ /* only call the device specific close if this
290+ * port is being closed by the last owner */
291+ if (port->serial->type->close)
292+ port->serial->type->close(port, filp);
293+ else
294+ //generic_close(port, filp);
295+ sw_usb_serial_generic_close(port, filp);
296+ port->open_count = 0;
297+ }
298+
299+ if (port->serial->type->owner)
300+ __MOD_DEC_USE_COUNT(port->serial->type->owner);
301+}
302+
303+static void serial_close(struct tty_struct *tty, struct file * filp)
304+{
305+ struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
306+ struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
307+
308+ if (!serial)
309+ return;
310+
311+ down (&port->sem);
312+
313+ dbg("%s - port %d", __FUNCTION__, port->number);
314+
315+ /* if disconnect beat us to the punch here, there's nothing to do */
316+ if (tty->driver_data) {
317+ __serial_close(port, filp);
318+ }
319+
320+ up (&port->sem);
321+}
322+
323+static int serial_write (struct tty_struct * tty, int from_user, const unsigned char *buf, int count)
324+{
325+ struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
326+ struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
327+ int retval = -EINVAL;
328+
329+ if (!serial)
330+ return -ENODEV;
331+
332+ down (&port->sem);
333+
334+ dbg("%s - port %d, %d byte(s)", __FUNCTION__, port->number, count);
335+
336+ if (!port->open_count) {
337+ dbg("%s - port not opened", __FUNCTION__);
338+ goto exit;
339+ }
340+
341+ /* pass on to the driver specific version of this function if it is available */
342+ if (serial->type->write)
343+ retval = serial->type->write(port, from_user, buf, count);
344+ else
345+ retval = generic_write(port, from_user, buf, count);
346+
347+exit:
348+ up (&port->sem);
349+ return retval;
350+}
351+
352+static int serial_write_room (struct tty_struct *tty)
353+{
354+ struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
355+ struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
356+ int retval = -EINVAL;
357+
358+ if (!serial)
359+ return -ENODEV;
360+
361+ down (&port->sem);
362+
363+ dbg("%s - port %d", __FUNCTION__, port->number);
364+
365+ if (!port->open_count) {
366+ dbg("%s - port not open", __FUNCTION__);
367+ goto exit;
368+ }
369+
370+ /* pass on to the driver specific version of this function if it is available */
371+ if (serial->type->write_room)
372+ retval = serial->type->write_room(port);
373+ else
374+ retval = generic_write_room(port);
375+
376+exit:
377+ up (&port->sem);
378+ return retval;
379+}
380+
381+static int serial_chars_in_buffer (struct tty_struct *tty)
382+{
383+ struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
384+ struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
385+ int retval = -EINVAL;
386+
387+ if (!serial)
388+ return -ENODEV;
389+
390+ down (&port->sem);
391+
392+ dbg("%s = port %d", __FUNCTION__, port->number);
393+
394+ if (!port->open_count) {
395+ dbg("%s - port not open", __FUNCTION__);
396+ goto exit;
397+ }
398+
399+ /* pass on to the driver specific version of this function if it is available */
400+ if (serial->type->chars_in_buffer)
401+ retval = serial->type->chars_in_buffer(port);
402+ else
403+ retval = generic_chars_in_buffer(port);
404+
405+exit:
406+ up (&port->sem);
407+ return retval;
408+}
409+
410+static void serial_throttle (struct tty_struct * tty)
411+{
412+ struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
413+ struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
414+
415+ if (!serial)
416+ return;
417+
418+ down (&port->sem);
419+
420+ dbg("%s - port %d", __FUNCTION__, port->number);
421+
422+ if (!port->open_count) {
423+ dbg ("%s - port not open", __FUNCTION__);
424+ goto exit;
425+ }
426+
427+ /* pass on to the driver specific version of this function */
428+ if (serial->type->throttle)
429+ serial->type->throttle(port);
430+
431+exit:
432+ up (&port->sem);
433+}
434+
435+static void serial_unthrottle (struct tty_struct * tty)
436+{
437+ struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
438+ struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
439+
440+ if (!serial)
441+ return;
442+
443+ down (&port->sem);
444+
445+ dbg("%s - port %d", __FUNCTION__, port->number);
446+
447+ if (!port->open_count) {
448+ dbg("%s - port not open", __FUNCTION__);
449+ goto exit;
450+ }
451+
452+ /* pass on to the driver specific version of this function */
453+ if (serial->type->unthrottle)
454+ serial->type->unthrottle(port);
455+
456+exit:
457+ up (&port->sem);
458+}
459+
460+static int serial_ioctl (struct tty_struct *tty, struct file * file, unsigned int cmd, unsigned long arg)
461+{
462+ struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
463+ struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
464+ int retval = -ENODEV;
465+
466+ if (!serial)
467+ return -ENODEV;
468+
469+ down (&port->sem);
470+
471+ dbg("%s - port %d, cmd 0x%.4x", __FUNCTION__, port->number, cmd);
472+
473+ if (!port->open_count) {
474+ dbg ("%s - port not open", __FUNCTION__);
475+ goto exit;
476+ }
477+
478+ /* pass on to the driver specific version of this function if it is available */
479+ if (serial->type->ioctl)
480+ retval = serial->type->ioctl(port, file, cmd, arg);
481+ else
482+ retval = -ENOIOCTLCMD;
483+
484+exit:
485+ up (&port->sem);
486+ return retval;
487+}
488+
489+static void serial_set_termios (struct tty_struct *tty, struct termios * old)
490+{
491+ struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
492+ struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
493+
494+ if (!serial)
495+ return;
496+
497+ down (&port->sem);
498+
499+ dbg("%s - port %d", __FUNCTION__, port->number);
500+
501+ if (!port->open_count) {
502+ dbg("%s - port not open", __FUNCTION__);
503+ goto exit;
504+ }
505+
506+ /* pass on to the driver specific version of this function if it is available */
507+ if (serial->type->set_termios)
508+ serial->type->set_termios(port, old);
509+
510+exit:
511+ up (&port->sem);
512+}
513+
514+static void serial_break (struct tty_struct *tty, int break_state)
515+{
516+ struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
517+ struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
518+
519+ if (!serial)
520+ return;
521+
522+ down (&port->sem);
523+
524+ dbg("%s - port %d", __FUNCTION__, port->number);
525+
526+ if (!port->open_count) {
527+ dbg("%s - port not open", __FUNCTION__);
528+ goto exit;
529+ }
530+
531+ /* pass on to the driver specific version of this function if it is available */
532+ if (serial->type->break_ctl)
533+ serial->type->break_ctl(port, break_state);
534+
535+exit:
536+ up (&port->sem);
537+}
538+#if 0
539+static void serial_shutdown (struct usb_serial *serial)
540+{
541+ dbg ("%s", __FUNCTION__);
542+
543+ if (serial->type->shutdown)
544+ serial->type->shutdown(serial);
545+ else
546+ generic_shutdown(serial);
547+}
548+#endif
549+static int serial_read_proc (char *page, char **start, off_t off, int count, int *eof, void *data)
550+{
551+ struct usb_serial *serial;
552+ int length = 0;
553+ int i;
554+ off_t begin = 0;
555+ char tmp[40];
556+
557+ dbg("%s", __FUNCTION__);
558+ length += sprintf (page, "usbserinfo:1.0 driver:%s\n", DRIVER_VERSION);
559+ for (i = 0; i < SERIAL_TTY_MINORS && length < PAGE_SIZE; ++i) {
560+ serial = get_serial_by_minor(i);
561+ if (serial == NULL)
562+ continue;
563+
564+ length += sprintf (page+length, "%d:", i);
565+ if (serial->type->owner)
566+ length += sprintf (page+length, " module:%s", serial->type->owner->name);
567+ length += sprintf (page+length, " name:\"%s\"", serial->type->name);
568+ length += sprintf (page+length, " vendor:%04x product:%04x", serial->vendor, serial->product);
569+ length += sprintf (page+length, " num_ports:%d", serial->num_ports);
570+ length += sprintf (page+length, " port:%d", i - serial->minor + 1);
571+
572+ usb_make_path(serial->dev, tmp, sizeof(tmp));
573+ length += sprintf (page+length, " path:%s", tmp);
574+
575+ length += sprintf (page+length, "\n");
576+ if ((length + begin) > (off + count))
577+ goto done;
578+ if ((length + begin) < off) {
579+ begin += length;
580+ length = 0;
581+ }
582+ }
583+ *eof = 1;
584+done:
585+ if (off >= (length + begin))
586+ return 0;
587+ *start = page + (off-begin);
588+ return ((count < begin+length-off) ? count : begin+length-off);
589+}
590+
591+
592+/*-----------------------------------------------------------*/
593+static int generic_write (struct usb_serial_port *port, int from_user, const unsigned char *buf, int count)
594+{
595+ struct usb_serial *serial = port->serial;
596+ int result;
597+
598+ dbg("%s - port %d", __FUNCTION__, port->number);
599+
600+ if (count == 0) {
601+ dbg("%s - write request of 0 bytes", __FUNCTION__);
602+ return (0);
603+ }
604+
605+ /* only do something if we have a bulk out endpoint */
606+ if (serial->num_bulk_out) {
607+ if (port->write_urb->status == -EINPROGRESS) {
608+ dbg("%s - already writing", __FUNCTION__);
609+ return (0);
610+ }
611+
612+ count = (count > port->bulk_out_size) ? port->bulk_out_size : count;
613+
614+ if (from_user) {
615+ if (copy_from_user(port->write_urb->transfer_buffer, buf, count))
616+ return -EFAULT;
617+ }
618+ else {
619+ memcpy (port->write_urb->transfer_buffer, buf, count);
620+ }
621+
622+ usb_serial_debug_data (__FILE__, __FUNCTION__, count, port->write_urb->transfer_buffer);
623+
624+ /* set up our urb */
625+ usb_fill_bulk_urb (port->write_urb, serial->dev,
626+ usb_sndbulkpipe (serial->dev,
627+ port->bulk_out_endpointAddress),
628+ port->write_urb->transfer_buffer, count,
629+ ((serial->type->write_bulk_callback) ?
630+ serial->type->write_bulk_callback :
631+ generic_write_bulk_callback), port);
632+
633+ /* send the data out the bulk port */
634+ result = usb_submit_urb(port->write_urb);
635+ if (result)
636+ err("%s - failed submitting write urb, error %d", __FUNCTION__, result);
637+ else
638+ result = count;
639+
640+ return result;
641+ }
642+
643+ /* no bulk out, so return 0 bytes written */
644+ return (0);
645+}
646+
647+static int generic_write_room (struct usb_serial_port *port)
648+{
649+ struct usb_serial *serial = port->serial;
650+ int room = 0;
651+
652+ dbg("%s - port %d", __FUNCTION__, port->number);
653+
654+ if (serial->num_bulk_out) {
655+ if (port->write_urb->status != -EINPROGRESS)
656+ room = port->bulk_out_size;
657+ }
658+
659+ dbg("%s - returns %d", __FUNCTION__, room);
660+ return (room);
661+}
662+
663+static int generic_chars_in_buffer (struct usb_serial_port *port)
664+{
665+ struct usb_serial *serial = port->serial;
666+ int chars = 0;
667+
668+ dbg("%s - port %d", __FUNCTION__, port->number);
669+
670+ if (serial->num_bulk_out) {
671+ if (port->write_urb->status == -EINPROGRESS)
672+ chars = port->write_urb->transfer_buffer_length;
673+ }
674+
675+ dbg("%s - returns %d", __FUNCTION__, chars);
676+ return (chars);
677+}
678+#if 0
679+static void generic_shutdown (struct usb_serial *serial)
680+{
681+ int i;
682+
683+ dbg("%s", __FUNCTION__);
684+
685+ /* stop reads and writes on all ports */
686+ for (i=0; i < serial->num_ports; ++i) {
687+ generic_cleanup (&serial->port[i]);
688+ }
689+}
690+static void generic_cleanup (struct usb_serial_port *port)
691+{
692+ struct usb_serial *serial = port->serial;
693+
694+ dbg("%s - port %d", __FUNCTION__, port->number);
695+
696+ if (serial->dev) {
697+ /* shutdown any bulk reads that might be going on */
698+ if (serial->num_bulk_out)
699+ usb_unlink_urb (port->write_urb);
700+ if (serial->num_bulk_in)
701+ usb_unlink_urb (port->read_urb);
702+ }
703+}
704+#endif
705+/*----------------------------------------------------------*/
706+static void generic_write_bulk_callback (struct urb *urb)
707+{
708+ struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
709+ struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
710+
711+ dbg("%s - port %d", __FUNCTION__, port->number);
712+
713+ if (!serial) {
714+ dbg("%s - bad serial pointer, exiting", __FUNCTION__);
715+ return;
716+ }
717+
718+ if (urb->status) {
719+ dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status);
720+ return;
721+ }
722+
723+ queue_task(&port->tqueue, &tq_immediate);
724+ mark_bh(IMMEDIATE_BH);
725+
726+ return;
727+}
728+
729+static struct usb_serial *get_free_serial (int num_ports, int *minor)
730+{
731+ struct usb_serial *serial = NULL;
732+ int i, j;
733+ int good_spot;
734+
735+ dbg("%s %d", __FUNCTION__, num_ports);
736+
737+ *minor = 0;
738+ for (i = 0; i < SERIAL_TTY_MINORS; ++i) {
739+ if (serial_table[i])
740+ continue;
741+
742+ good_spot = 1;
743+ for (j = 1; j <= num_ports-1; ++j)
744+ if (serial_table[i+j])
745+ good_spot = 0;
746+ if (good_spot == 0)
747+ continue;
748+
749+ if (!(serial = kmalloc(sizeof(struct usb_serial), GFP_KERNEL))) {
750+ err("%s - Out of memory", __FUNCTION__);
751+ return NULL;
752+ }
753+ memset(serial, 0, sizeof(struct usb_serial));
754+ serial->magic = USB_SERIAL_MAGIC;
755+ serial_table[i] = serial;
756+ *minor = i;
757+ dbg("%s - minor base = %d", __FUNCTION__, *minor);
758+ for (i = *minor+1; (i < (*minor + num_ports)) && (i < SERIAL_TTY_MINORS); ++i)
759+ serial_table[i] = serial;
760+ return serial;
761+ }
762+ return NULL;
763+}
764+
765+static void return_serial (struct usb_serial *serial)
766+{
767+ int i;
768+
769+ dbg("%s", __FUNCTION__);
770+
771+ if (serial == NULL)
772+ return;
773+
774+ for (i = 0; i < serial->num_ports; ++i) {
775+ serial_table[serial->minor + i] = NULL;
776+ }
777+
778+ return;
779+}
780+
781+static void port_softint(void *private)
782+{
783+ struct usb_serial_port *port = (struct usb_serial_port *)private;
784+ struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
785+ struct tty_struct *tty;
786+
787+ dbg("%s - port %d", __FUNCTION__, port->number);
788+
789+ if (!serial)
790+ return;
791+
792+ tty = port->tty;
793+ if (!tty)
794+ return;
795+
796+ if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && tty->ldisc.write_wakeup) {
797+ dbg("%s - write wakeup call.", __FUNCTION__);
798+ (tty->ldisc.write_wakeup)(tty);
799+ }
800+
801+ wake_up_interruptible(&tty->write_wait);
802+}
803+
804+
805+static void * usb_serial_probe(struct usb_device *dev, unsigned int ifnum,
806+ const struct usb_device_id *id)
807+{
808+ struct usb_serial *serial = NULL;
809+ struct usb_serial_port *port;
810+ struct usb_interface *interface;
811+ struct usb_interface_descriptor *iface_desc;
812+ struct usb_endpoint_descriptor *endpoint;
813+ struct usb_endpoint_descriptor *interrupt_in_endpoint[MAX_NUM_PORTS];
814+ struct usb_endpoint_descriptor *bulk_in_endpoint[MAX_NUM_PORTS];
815+ struct usb_endpoint_descriptor *bulk_out_endpoint[MAX_NUM_PORTS];
816+ struct usb_serial_device_type *type = NULL;
817+ struct list_head *tmp;
818+ int found;
819+ int minor;
820+ int buffer_size;
821+ int i;
822+ int num_interrupt_in = 0;
823+ int num_bulk_in = 0;
824+ int num_bulk_out = 0;
825+ int num_ports;
826+ int max_endpoints;
827+ const struct usb_device_id *id_pattern = NULL;
828+
829+ /* loop through our list of known serial converters, and see if this
830+ device matches. */
831+ found = 0;
832+ interface = &dev->actconfig->interface[ifnum];
833+ list_for_each (tmp, &usb_serial_driver_list) {
834+ type = list_entry(tmp, struct usb_serial_device_type, driver_list);
835+ id_pattern = usb_match_id(dev, interface, type->id_table);
836+ if (id_pattern != NULL) {
837+ dbg("descriptor matches");
838+ found = 1;
839+ break;
840+ }
841+ }
842+ if (!found) {
843+ /* no match */
844+ dbg("none matched");
845+ return(NULL);
846+ }
847+ /* descriptor matches, let's find the endpoints needed */
848+ /* check out the endpoints */
849+ iface_desc = &interface->altsetting[0];
850+ for (i = 0; i < iface_desc->bNumEndpoints; ++i) {
851+ endpoint = &iface_desc->endpoint[i];
852+
853+ if ((endpoint->bEndpointAddress & 0x80) &&
854+ ((endpoint->bmAttributes & 3) == 0x02)) {
855+ /* we found a bulk in endpoint */
856+ dbg("found bulk in");
857+ bulk_in_endpoint[num_bulk_in] = endpoint;
858+ ++num_bulk_in;
859+ }
860+
861+ if (((endpoint->bEndpointAddress & 0x80) == 0x00) &&
862+ ((endpoint->bmAttributes & 3) == 0x02)) {
863+ /* we found a bulk out endpoint */
864+ dbg("found bulk out");
865+ bulk_out_endpoint[num_bulk_out] = endpoint;
866+ ++num_bulk_out;
867+ }
868+
869+ if ((endpoint->bEndpointAddress & 0x80) &&
870+ ((endpoint->bmAttributes & 3) == 0x03)) {
871+ /* we found a interrupt in endpoint */
872+ dbg("found interrupt in");
873+ interrupt_in_endpoint[num_interrupt_in] = endpoint;
874+ ++num_interrupt_in;
875+ }
876+ }
877+
878+#if defined(CONFIG_USB_SERIAL_PL2303) || defined(CONFIG_USB_SERIAL_PL2303_MODULE)
879+ /* BEGIN HORRIBLE HACK FOR PL2303 */
880+ /* this is needed due to the looney way its endpoints are set up */
881+ if (((dev->descriptor.idVendor == PL2303_VENDOR_ID) &&
882+ (dev->descriptor.idProduct == PL2303_PRODUCT_ID)) ||
883+ ((dev->descriptor.idVendor == ATEN_VENDOR_ID) &&
884+ (dev->descriptor.idProduct == ATEN_PRODUCT_ID))) {
885+ if (ifnum == 1) {
886+ /* check out the endpoints of the other interface*/
887+ interface = &dev->actconfig->interface[ifnum ^ 1];
888+ iface_desc = &interface->altsetting[0];
889+ for (i = 0; i < iface_desc->bNumEndpoints; ++i) {
890+ endpoint = &iface_desc->endpoint[i];
891+ if ((endpoint->bEndpointAddress & 0x80) &&
892+ ((endpoint->bmAttributes & 3) == 0x03)) {
893+ /* we found a interrupt in endpoint */
894+ dbg("found interrupt in for Prolific device on separate interface");
895+ interrupt_in_endpoint[num_interrupt_in] = endpoint;
896+ ++num_interrupt_in;
897+ }
898+ }
899+ }
900+
901+ /* Now make sure the PL-2303 is configured correctly.
902+ * If not, give up now and hope this hack will work
903+ * properly during a later invocation of usb_serial_probe
904+ */
905+ if (num_bulk_in == 0 || num_bulk_out == 0) {
906+ info("PL-2303 hack: descriptors matched but endpoints did not");
907+ return NULL;
908+ }
909+ }
910+ /* END HORRIBLE HACK FOR PL2303 */
911+#endif
912+
913+ /* found all that we need */
914+ info("%s converter detected", type->name);
915+
916+#ifdef CONFIG_USB_SERIAL_SIERRAWIRELESS
917+ if (type == &sierra_driver) {
918+ num_ports = num_bulk_out;
919+ if (num_ports == 0) {
920+ err("Sierra 3G device with no bulk out, not allowed.");
921+ return NULL;
922+ }
923+ } else
924+#endif
925+ num_ports = type->num_ports;
926+
927+ serial = get_free_serial (num_ports, &minor);
928+ if (serial == NULL) {
929+ err("No more free serial devices");
930+ return NULL;
931+ }
932+
933+ serial->dev = dev;
934+ serial->type = type;
935+ serial->interface = interface;
936+ serial->minor = minor;
937+ serial->num_ports = num_ports;
938+ serial->num_bulk_in = num_bulk_in;
939+ serial->num_bulk_out = num_bulk_out;
940+ serial->num_interrupt_in = num_interrupt_in;
941+ serial->vendor = dev->descriptor.idVendor;
942+ serial->product = dev->descriptor.idProduct;
943+
944+ /* set up the endpoint information */
945+ for (i = 0; i < num_bulk_in; ++i) {
946+ endpoint = bulk_in_endpoint[i];
947+ port = &serial->port[i];
948+ port->read_urb = usb_alloc_urb (0);
949+ if (!port->read_urb) {
950+ err("No free urbs available");
951+ goto probe_error;
952+ }
953+//Amin marked buffer_size = endpoint->wMaxPacketSize;
954+// ===> 20060310 Amin modify for improve EVDO and HSDPA Card
955+ buffer_size = 2048;
956+ printk("KERNEL DEBUG => USBSERIAL.O buffer_size = 2048\n");
957+// <=== 20060310 Amin modify for improve EVDO and HSDPA Card
958+ port->bulk_in_endpointAddress = endpoint->bEndpointAddress;
959+ port->bulk_in_buffer = kmalloc (buffer_size, GFP_KERNEL);
960+ if (!port->bulk_in_buffer) {
961+ err("Couldn't allocate bulk_in_buffer");
962+ goto probe_error;
963+ }
964+ usb_fill_bulk_urb (port->read_urb, dev,
965+ usb_rcvbulkpipe (dev,
966+ endpoint->bEndpointAddress),
967+ port->bulk_in_buffer, buffer_size,
968+ ((serial->type->read_bulk_callback) ?
969+ serial->type->read_bulk_callback :
970+ sw_usb_serial_generic_read_bulk_callback),
971+ port);
972+ }
973+
974+ for (i = 0; i < num_bulk_out; ++i) {
975+ endpoint = bulk_out_endpoint[i];
976+ port = &serial->port[i];
977+ port->write_urb = usb_alloc_urb(0);
978+ if (!port->write_urb) {
979+ err("No free urbs available");
980+ goto probe_error;
981+ }
982+ buffer_size = endpoint->wMaxPacketSize;
983+ port->bulk_out_size = buffer_size;
984+ port->bulk_out_endpointAddress = endpoint->bEndpointAddress;
985+ port->bulk_out_buffer = kmalloc (buffer_size, GFP_KERNEL);
986+ if (!port->bulk_out_buffer) {
987+ err("Couldn't allocate bulk_out_buffer");
988+ goto probe_error;
989+ }
990+ usb_fill_bulk_urb (port->write_urb, dev,
991+ usb_sndbulkpipe (dev,
992+ endpoint->bEndpointAddress),
993+ port->bulk_out_buffer, buffer_size,
994+ ((serial->type->write_bulk_callback) ?
995+ serial->type->write_bulk_callback :
996+ generic_write_bulk_callback),
997+ port);
998+ }
999+
1000+ for (i = 0; i < num_interrupt_in; ++i) {
1001+ endpoint = interrupt_in_endpoint[i];
1002+ port = &serial->port[i];
1003+ port->interrupt_in_urb = usb_alloc_urb(0);
1004+ if (!port->interrupt_in_urb) {
1005+ err("No free urbs available");
1006+ goto probe_error;
1007+ }
1008+ buffer_size = endpoint->wMaxPacketSize;
1009+ port->interrupt_in_endpointAddress = endpoint->bEndpointAddress;
1010+ port->interrupt_in_buffer = kmalloc (buffer_size, GFP_KERNEL);
1011+ if (!port->interrupt_in_buffer) {
1012+ err("Couldn't allocate interrupt_in_buffer");
1013+ goto probe_error;
1014+ }
1015+ usb_fill_int_urb (port->interrupt_in_urb, dev,
1016+ usb_rcvintpipe (dev,
1017+ endpoint->bEndpointAddress),
1018+ port->interrupt_in_buffer, buffer_size,
1019+ serial->type->read_int_callback, port,
1020+ endpoint->bInterval);
1021+ }
1022+
1023+ /* initialize some parts of the port structures */
1024+ /* we don't use num_ports here cauz some devices have more endpoint pairs than ports */
1025+ max_endpoints = max(num_bulk_in, num_bulk_out);
1026+ max_endpoints = max(max_endpoints, num_interrupt_in);
1027+ max_endpoints = max(max_endpoints, (int)serial->num_ports);
1028+ dbg("%s - setting up %d port structures for this device", __FUNCTION__, max_endpoints);
1029+ for (i = 0; i < max_endpoints; ++i) {
1030+ port = &serial->port[i];
1031+ port->number = i + serial->minor;
1032+ port->serial = serial;
1033+ port->magic = USB_SERIAL_PORT_MAGIC;
1034+ port->tqueue.routine = port_softint;
1035+ port->tqueue.data = port;
1036+ init_MUTEX (&port->sem);
1037+ }
1038+
1039+ /* if this device type has a startup function, call it */
1040+ if (type->startup) {
1041+ i = type->startup (serial);
1042+ if (i < 0)
1043+ goto probe_error;
1044+ if (i > 0)
1045+ return serial;
1046+ }
1047+
1048+ /* initialize the devfs nodes for this device and let the user know what ports we are bound to */
1049+ for (i = 0; i < serial->num_ports; ++i) {
1050+ tty_register_devfs (&serial_tty_driver, 0, serial->port[i].number);
1051+ info("%s converter now attached to ttyUSB%d (or usb/tts/%d for devfs)",
1052+ type->name, serial->port[i].number, serial->port[i].number);
1053+ }
1054+
1055+ return serial; /* success */
1056+
1057+
1058+probe_error:
1059+ for (i = 0; i < num_bulk_in; ++i) {
1060+ port = &serial->port[i];
1061+ if (port->read_urb)
1062+ usb_free_urb (port->read_urb);
1063+ if (port->bulk_in_buffer)
1064+ kfree (port->bulk_in_buffer);
1065+ }
1066+ for (i = 0; i < num_bulk_out; ++i) {
1067+ port = &serial->port[i];
1068+ if (port->write_urb)
1069+ usb_free_urb (port->write_urb);
1070+ if (port->bulk_out_buffer)
1071+ kfree (port->bulk_out_buffer);
1072+ }
1073+ for (i = 0; i < num_interrupt_in; ++i) {
1074+ port = &serial->port[i];
1075+ if (port->interrupt_in_urb)
1076+ usb_free_urb (port->interrupt_in_urb);
1077+ if (port->interrupt_in_buffer)
1078+ kfree (port->interrupt_in_buffer);
1079+ }
1080+
1081+ /* return the minor range that this device had */
1082+ return_serial (serial);
1083+
1084+ /* free up any memory that we allocated */
1085+ kfree (serial);
1086+ return NULL;
1087+}
1088+
1089+static void usb_serial_disconnect(struct usb_device *dev, void *ptr)
1090+{
1091+ struct usb_serial *serial = (struct usb_serial *) ptr;
1092+ struct usb_serial_port *port;
1093+ int i;
1094+
1095+ dbg ("%s", __FUNCTION__);
1096+ if (serial) {
1097+ /* fail all future close/read/write/ioctl/etc calls */
1098+ for (i = 0; i < serial->num_ports; ++i) {
1099+ port = &serial->port[i];
1100+ down (&port->sem);
1101+ if (port->tty != NULL) {
1102+ while (port->open_count > 0) {
1103+ //__serial_close(port, NULL);
1104+ sw_usb_serial_generic_close(port,NULL);
1105+ }
1106+ port->tty->driver_data = NULL;
1107+ }
1108+ up (&port->sem);
1109+ }
1110+
1111+ serial->dev = NULL;
1112+ //serial_shutdown (serial);
1113+ sw_usb_serial_generic_shutdown(serial);
1114+
1115+ for (i = 0; i < serial->num_ports; ++i)
1116+ serial->port[i].open_count = 0;
1117+
1118+ for (i = 0; i < serial->num_bulk_in; ++i) {
1119+ port = &serial->port[i];
1120+ if (port->read_urb) {
1121+ usb_unlink_urb (port->read_urb);
1122+ usb_free_urb (port->read_urb);
1123+ }
1124+ if (port->bulk_in_buffer)
1125+ kfree (port->bulk_in_buffer);
1126+ }
1127+ for (i = 0; i < serial->num_bulk_out; ++i) {
1128+ port = &serial->port[i];
1129+ if (port->write_urb) {
1130+ usb_unlink_urb (port->write_urb);
1131+ usb_free_urb (port->write_urb);
1132+ }
1133+ if (port->bulk_out_buffer)
1134+ kfree (port->bulk_out_buffer);
1135+ }
1136+ for (i = 0; i < serial->num_interrupt_in; ++i) {
1137+ port = &serial->port[i];
1138+ if (port->interrupt_in_urb) {
1139+ usb_unlink_urb (port->interrupt_in_urb);
1140+ usb_free_urb (port->interrupt_in_urb);
1141+ }
1142+ if (port->interrupt_in_buffer)
1143+ kfree (port->interrupt_in_buffer);
1144+ }
1145+
1146+ for (i = 0; i < serial->num_ports; ++i) {
1147+ tty_unregister_devfs (&serial_tty_driver, serial->port[i].number);
1148+ info("%s converter now disconnected from ttyUSB%d", serial->type->name, serial->port[i].number);
1149+ }
1150+
1151+ /* return the minor range that this device had */
1152+ return_serial (serial);
1153+
1154+ /* free up any memory that we allocated */
1155+ kfree (serial);
1156+
1157+ } else {
1158+ info("device disconnected");
1159+ }
1160+
1161+}
1162+
1163+#if 0
1164+static int sw_attach(struct usb_serial *serial)
1165+{
1166+ struct usb_device *hdev = serial->dev;
1167+ int rc;
1168+
1169+ dbg("%s - serial(0x%p)", __FUNCTION__, serial);
1170+
1171+ rc = usb_control_msg(
1172+ hdev,
1173+ usb_sndctrlpipe(hdev, 0),
1174+ USB_VENDER_REQUEST_SET_DEVICE_POWER_STATE, /* bRequest */
1175+ USB_TYPE_VENDOR|USB_RECIP_DEVICE, /* bmRequestType */
1176+ USB_DEVICE_POWER_STATE_D0, /* wValue */
1177+ 0, /* wIndex */
1178+ NULL, /* Data */
1179+ 0, /* wLength */
1180+ 1000); /* Timeout */
1181+
1182+ err("%s - rc(%d)", __FUNCTION__, rc);
1183+ return rc;
1184+}
1185+#endif
1186+//void sw_usb_serial_generic_read_bulk_callback (struct urb *urb, struct pt_regs *regs)
1187+static void sw_usb_serial_generic_read_bulk_callback (struct urb *urb)
1188+{
1189+ struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
1190+ struct usb_serial *serial = port->serial;
1191+ struct tty_struct *tty;
1192+ unsigned char *data = urb->transfer_buffer;
1193+ int result;
1194+ int i;
1195+
1196+ dbg("%s - port %d", __FUNCTION__, port->number);
1197+
1198+ if (urb->status) {
1199+ dbg("%s - nonzero read bulk status received: %d", __FUNCTION__, urb->status);
1200+ return;
1201+ }
1202+
1203+ //usb_serial_dbg_data(__FILE__, __FUNCTION__, urb->actual_length, data);
1204+
1205+ tty = port->tty;
1206+ if (tty && urb->actual_length) {
1207+ #if 0
1208+ tty_buffer_request_room(tty, urb->actual_length);
1209+ tty_insert_flip_string(tty, data, urb->actual_length);
1210+ tty_flip_buffer_push(tty);
1211+ #endif
1212+ #if 1
1213+ for (i = 0; i < urb->actual_length ; ++i) {
1214+ /* if we insert more than TTY_FLIPBUF_SIZE characters, we drop them. */
1215+ if(tty->flip.count >= TTY_FLIPBUF_SIZE) {
1216+ tty_flip_buffer_push(tty);
1217+ }
1218+ /* this doesn't actually push the data through unless tty->low_latency is set */
1219+ tty_insert_flip_char(tty, data[i], 0);
1220+ }
1221+ tty_flip_buffer_push(tty);
1222+ #endif
1223+
1224+ }
1225+ else
1226+ dbg("%s: empty read urb received", __FUNCTION__);
1227+
1228+ /* Continue trying to always read */
1229+ usb_fill_bulk_urb (port->read_urb, serial->dev,
1230+ usb_rcvbulkpipe (serial->dev,
1231+ port->bulk_in_endpointAddress),
1232+ port->read_urb->transfer_buffer,
1233+ port->read_urb->transfer_buffer_length,
1234+ ((serial->type->read_bulk_callback) ?
1235+ serial->type->read_bulk_callback :
1236+ sw_usb_serial_generic_read_bulk_callback), port);
1237+ result = usb_submit_urb(port->read_urb);
1238+ //result = usb_submit_urb(port->read_urb, GFP_ATOMIC); //for kernel 2.6
1239+ if (result)
1240+ dbg("%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result);
1241+}
1242+#if 1
1243+static int generic_open (struct usb_serial_port *port, struct file *filp)
1244+{
1245+ struct usb_serial *serial = port->serial;
1246+ int result = 0;
1247+
1248+ dbg("%s - port %d", __FUNCTION__, port->number);
1249+
1250+ /* force low_latency on so that our tty_push actually forces the data through,
1251+ otherwise it is scheduled, and with high data rates (like with OHCI) data
1252+ can get lost. */
1253+ if (port->tty)
1254+ port->tty->low_latency = 1;
1255+
1256+ /* if we have a bulk interrupt, start reading from it */
1257+ if (serial->num_bulk_in) {
1258+ /* Start reading from the device */
1259+ usb_fill_bulk_urb (port->read_urb, serial->dev,
1260+ usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress),
1261+ port->read_urb->transfer_buffer,
1262+ port->read_urb->transfer_buffer_length,
1263+ ((serial->type->read_bulk_callback) ?
1264+ serial->type->read_bulk_callback :
1265+ sw_usb_serial_generic_read_bulk_callback),
1266+ port);
1267+ result = usb_submit_urb(port->read_urb); //, GFP_KERNEL);
1268+ if (result)
1269+ //dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result);
1270+ dbg("%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result);
1271+
1272+ }
1273+
1274+ return result;
1275+}
1276+#endif
1277+int sw_usb_serial_generic_open (struct usb_serial_port *port, struct file *filp)
1278+{
1279+ int rc;
1280+ struct usb_serial *serial = port->serial;
1281+ struct usb_device *hdev = serial->dev;
1282+
1283+ dbg("%s - port %d", __FUNCTION__, port->number);
1284+
1285+ rc = generic_open(port, filp);
1286+ err("%s - rc(%d)", __FUNCTION__, rc);
1287+
1288+ if(0 == rc)
1289+ {
1290+ rc = usb_control_msg(
1291+ hdev,
1292+ usb_sndctrlpipe(hdev, 0),
1293+ SET_CONTROL_LINE_STATE, /* bRequest */
1294+ USB_TYPE_CLASS|USB_RECIP_INTERFACE, /* bmRequestType */
1295+ ACM_CTRL_DTR|ACM_CTRL_RTS, /* wValue */
1296+ 0, /* wIndex */
1297+ NULL, /* Data */
1298+ 0, /* wLength */
1299+ 1000); /* Timeout */
1300+ err("%s - usb_control_msg: rc(%d)", __FUNCTION__, rc);
1301+ }
1302+
1303+ return rc;
1304+}
1305+
1306+static void generic_cleanup (struct usb_serial_port *port)
1307+{
1308+ struct usb_serial *serial = port->serial;
1309+
1310+ dbg("%s - port %d", __FUNCTION__, port->number);
1311+
1312+ if (serial->dev) {
1313+ /* shutdown any bulk reads that might be going on */
1314+ if (serial->num_bulk_out)
1315+ usb_unlink_urb(port->write_urb);
1316+ //usb_kill_urb(port->write_urb);
1317+ if (serial->num_bulk_in)
1318+ usb_unlink_urb(port->read_urb);
1319+ //usb_kill_urb(port->read_urb);
1320+ }
1321+}
1322+
1323+static void sw_usb_serial_generic_close (struct usb_serial_port *port, struct file * filp)
1324+{
1325+ int rc;
1326+ struct usb_serial *serial = port->serial;
1327+ struct usb_device *hdev = serial->dev;
1328+
1329+ dbg("%s - port %d", __FUNCTION__, port->number);
1330+
1331+ rc = usb_control_msg(
1332+ hdev,
1333+ usb_sndctrlpipe(hdev, 0),
1334+ SET_CONTROL_LINE_STATE, /* bRequest */
1335+ USB_TYPE_CLASS|USB_RECIP_INTERFACE, /* bmRequestType */
1336+ 0, /* wValue */
1337+ 0, /* wIndex */
1338+ NULL, /* Data */
1339+ 0, /* wLength */
1340+ 1000); /* Timeout */
1341+ err("%s - rc(%d)", __FUNCTION__, rc);
1342+
1343+ generic_cleanup (port);
1344+}
1345+
1346+static void sw_usb_serial_generic_shutdown(struct usb_serial *serial)
1347+{
1348+ int i, rc;
1349+ struct usb_device *hdev = serial->dev;
1350+
1351+ dbg("%s serial(0x%p)", __FUNCTION__, serial);
1352+
1353+ if(hdev)
1354+ {
1355+ rc = usb_control_msg(
1356+ hdev,
1357+ usb_sndctrlpipe(hdev, 0),
1358+ USB_VENDER_REQUEST_SET_DEVICE_POWER_STATE, /* bRequest */
1359+ USB_TYPE_VENDOR|USB_RECIP_DEVICE, /* bmRequestType */
1360+ USB_DEVICE_POWER_STATE_D3, /* wValue */
1361+ 0, /* wIndex */
1362+ NULL, /* Data */
1363+ 0, /* wLength */
1364+ 1000); /* Timeout */
1365+ err("%s - rc(%d)", __FUNCTION__, rc);
1366+ }
1367+
1368+ /* stop reads and writes on all ports */
1369+ for (i=0; i < serial->num_ports; ++i) {
1370+ generic_cleanup(&serial->port[i]);
1371+ }
1372+}
1373+int usb_serial_register(struct usb_serial_device_type *new_device)
1374+{
1375+ /* Add this device to our list of devices */
1376+ list_add(&new_device->driver_list, &usb_serial_driver_list);
1377+
1378+ info ("USB Serial support registered for %s", new_device->name);
1379+
1380+ usb_scan_devices();
1381+
1382+ return 0;
1383+}
1384+
1385+
1386+void usb_serial_deregister(struct usb_serial_device_type *device)
1387+{
1388+ struct usb_serial *serial;
1389+ int i;
1390+
1391+ info("USB Serial deregistering driver %s", device->name);
1392+
1393+ /* clear out the serial_table if the device is attached to a port */
1394+ for(i = 0; i < SERIAL_TTY_MINORS; ++i) {
1395+ serial = serial_table[i];
1396+ if ((serial != NULL) && (serial->type == device)) {
1397+ usb_driver_release_interface (&sierra_driver, serial->interface);
1398+ usb_serial_disconnect (NULL, serial);
1399+ }
1400+ }
1401+
1402+ list_del(&device->driver_list);
1403+}
1404+
1405+static int __init sierra_init(void)
1406+{
1407+ int retval;
1408+ int i;
1409+
1410+ /* Initalize our global data */
1411+ for (i = 0; i < SERIAL_TTY_MINORS; ++i) {
1412+ serial_table[i] = NULL;
1413+ }
1414+
1415+ /* register the tty driver */
1416+ serial_tty_driver.init_termios = tty_std_termios;
1417+ serial_tty_driver.init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
1418+ if (tty_register_driver (&serial_tty_driver)) {
1419+ err("%s - failed to register tty driver", __FUNCTION__);
1420+ return -1;
1421+ }
1422+
1423+ retval = usb_serial_register(&sierra_device);
1424+ if (retval)
1425+ {
1426+ tty_unregister_driver(&serial_tty_driver);
1427+ printk("%s return usb_serial_register. retval=[%d].\n",__FUNCTION__, retval);
1428+ return retval;
1429+ }
1430+ retval = usb_register(&sierra_driver);
1431+ if (retval){
1432+ usb_serial_deregister(&sierra_device);
1433+ tty_unregister_driver(&serial_tty_driver);
1434+ err("usb_register failed for the Sierra 3G USB-Serial driver. Error number %d\n", retval);
1435+ return -1;
1436+ }
1437+
1438+ return retval;
1439+}
1440+
1441+static void __exit sierra_exit(void)
1442+{
1443+ usb_deregister(&sierra_driver);
1444+ usb_serial_deregister(&sierra_device);
1445+}
1446+
1447+module_init(sierra_init);
1448+module_exit(sierra_exit);
1449+MODULE_LICENSE("GPL");
1450--- /dev/null
1451+++ b/drivers/usb/serial/sierra.h
1452@@ -0,0 +1,32 @@
1453+/*
1454+ * Sierra Wireless CDMA Wireless Serial USB drive
1455+ *
1456+ * Current Copy modified by: Kevin Lloyd <linux@sierrawireless.com>
1457+ * Original Copy written by: 2005 Greg Kroah-Hartman <gregkh <at> suse.de>
1458+ *
1459+ *
1460+ * This program is free software; you can redistribute it and/or
1461+ * modify it under the terms of the GNU General Public License version
1462+ * 2 as published by the Free Software Foundation.
1463+ *
1464+ * Version history:
1465+ Version 1.03 (Lloyd):
1466+ Included support for DTR control and enhanced buffering (should help
1467+ speed).
1468+ */
1469+
1470+#define USB_VENDER_REQUEST_SET_DEVICE_POWER_STATE 0
1471+
1472+#define USB_DEVICE_POWER_STATE_D0 0x0000
1473+#define USB_DEVICE_POWER_STATE_D1 0x0001
1474+#define USB_DEVICE_POWER_STATE_D2 0x0002
1475+#define USB_DEVICE_POWER_STATE_D3 0x0003
1476+
1477+#define SET_CONTROL_LINE_STATE 0x22
1478+/*
1479+ * Output control lines.
1480+ */
1481+
1482+#define ACM_CTRL_DTR 0x01
1483+#define ACM_CTRL_RTS 0x02
1484+
1485

Archive Download this file



interactive