]> err.no Git - linux-2.6/blob - drivers/usb/serial/sierra.c
7aea2de4161eda36e167bf9b5ead84517c1a36f6
[linux-2.6] / drivers / usb / serial / sierra.c
1 /*
2   USB Driver for Sierra Wireless
3
4   Copyright (C) 2006, 2007  Kevin Lloyd <linux@sierrawireless.com>
5
6   IMPORTANT DISCLAIMER: This driver is not commercially supported by
7   Sierra Wireless. Use at your own risk.
8
9   This driver is free software; you can redistribute it and/or modify
10   it under the terms of Version 2 of the GNU General Public License as
11   published by the Free Software Foundation.
12
13   Portions based on the option driver by Matthias Urlichs <smurf@smurf.noris.de>
14   Whom based his on the Keyspan driver by Hugh Blemings <hugh@blemings.org>
15 */
16
17 #define DRIVER_VERSION "v.1.2.5b"
18 #define DRIVER_AUTHOR "Kevin Lloyd <linux@sierrawireless.com>"
19 #define DRIVER_DESC "USB Driver for Sierra Wireless USB modems"
20
21 #include <linux/kernel.h>
22 #include <linux/jiffies.h>
23 #include <linux/errno.h>
24 #include <linux/tty.h>
25 #include <linux/tty_flip.h>
26 #include <linux/module.h>
27 #include <linux/usb.h>
28 #include <linux/usb/serial.h>
29
30 #define SWIMS_USB_REQUEST_SetMode       0x0B
31 #define SWIMS_USB_REQUEST_TYPE_SetMode  0x40
32 #define SWIMS_USB_INDEX_SetMode         0x0000
33 #define SWIMS_SET_MODE_Modem            0x0001
34
35 /* per port private data */
36 #define N_IN_URB        4
37 #define N_OUT_URB       4
38 #define IN_BUFLEN       4096
39
40 static int debug;
41
42 enum devicetype {
43         DEVICE_3_PORT =         0,
44         DEVICE_1_PORT =         1,
45         DEVICE_INSTALLER =      2,
46 };
47
48 static int sierra_set_power_state(struct usb_device *udev, __u16 swiState)
49 {
50         int result;
51         dev_dbg(&udev->dev, "%s", "SET POWER STATE\n");
52         result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
53                         0x00,                   /* __u8 request      */
54                         0x40,                   /* __u8 request type */
55                         swiState,               /* __u16 value       */
56                         0,                      /* __u16 index       */
57                         NULL,                   /* void *data        */
58                         0,                      /* __u16 size        */
59                         USB_CTRL_SET_TIMEOUT);  /* int timeout       */
60         return result;
61 }
62
63 static int sierra_set_ms_mode(struct usb_device *udev, __u16 eSocMode)
64 {
65         int result;
66         dev_dbg(&udev->dev, "%s", "DEVICE MODE SWITCH\n");
67         result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
68                         SWIMS_USB_REQUEST_SetMode,      /* __u8 request      */
69                         SWIMS_USB_REQUEST_TYPE_SetMode, /* __u8 request type */
70                         eSocMode,                       /* __u16 value       */
71                         SWIMS_USB_INDEX_SetMode,        /* __u16 index       */
72                         NULL,                           /* void *data        */
73                         0,                              /* __u16 size        */
74                         USB_CTRL_SET_TIMEOUT);          /* int timeout       */
75         return result;
76 }
77
78 static int sierra_probe(struct usb_interface *iface,
79                         const struct usb_device_id *id)
80 {
81         int result;
82         struct usb_device *udev;
83
84         udev = usb_get_dev(interface_to_usbdev(iface));
85
86         /* Check if in installer mode */
87         if (id->driver_info == DEVICE_INSTALLER) {
88                 dev_dbg(&udev->dev, "%s", "FOUND DEVICE(SW)\n");
89                 result = sierra_set_ms_mode(udev, SWIMS_SET_MODE_Modem);
90                 /*We do not want to bind to the device when in installer mode*/
91                 return -EIO;
92         }
93
94         return usb_serial_probe(iface, id);
95 }
96
97 static struct usb_device_id id_table [] = {
98         { USB_DEVICE(0x1199, 0x0017) }, /* Sierra Wireless EM5625 */
99         { USB_DEVICE(0x1199, 0x0018) }, /* Sierra Wireless MC5720 */
100         { USB_DEVICE(0x1199, 0x0218) }, /* Sierra Wireless MC5720 */
101         { USB_DEVICE(0x0f30, 0x1b1d) }, /* Sierra Wireless MC5720 */
102         { USB_DEVICE(0x1199, 0x0020) }, /* Sierra Wireless MC5725 */
103         { USB_DEVICE(0x1199, 0x0220) }, /* Sierra Wireless MC5725 */
104         { USB_DEVICE(0x1199, 0x0019) }, /* Sierra Wireless AirCard 595 */
105         { USB_DEVICE(0x1199, 0x0021) }, /* Sierra Wireless AirCard 597E */
106         { USB_DEVICE(0x1199, 0x0120) }, /* Sierra Wireless USB Dongle 595U */
107
108         { USB_DEVICE(0x1199, 0x6802) }, /* Sierra Wireless MC8755 */
109         { USB_DEVICE(0x1199, 0x6804) }, /* Sierra Wireless MC8755 */
110         { USB_DEVICE(0x1199, 0x6803) }, /* Sierra Wireless MC8765 */
111         { USB_DEVICE(0x1199, 0x6812) }, /* Sierra Wireless MC8775 & AC 875U */
112         { USB_DEVICE(0x1199, 0x6813) }, /* Sierra Wireless MC8775 (Thinkpad internal) */
113         { USB_DEVICE(0x1199, 0x6820) }, /* Sierra Wireless AirCard 875 */
114         { USB_DEVICE(0x1199, 0x6832) }, /* Sierra Wireless MC8780*/
115         { USB_DEVICE(0x1199, 0x6833) }, /* Sierra Wireless MC8781*/
116         { USB_DEVICE(0x1199, 0x6850) }, /* Sierra Wireless AirCard 880 */
117         { USB_DEVICE(0x1199, 0x6851) }, /* Sierra Wireless AirCard 881 */
118         { USB_DEVICE(0x1199, 0x6852) }, /* Sierra Wireless AirCard 880 E */
119         { USB_DEVICE(0x1199, 0x6853) }, /* Sierra Wireless AirCard 881 E */
120         { USB_DEVICE(0x1199, 0x6856) }, /* Sierra Wireless AirCard 881 U */
121
122         { USB_DEVICE(0x1199, 0x0112), .driver_info = DEVICE_1_PORT }, /* Sierra Wireless AirCard 580 */
123         { USB_DEVICE(0x0F3D, 0x0112), .driver_info = DEVICE_1_PORT }, /* Airprime/Sierra PC 5220 */
124
125         { USB_DEVICE(0x1199, 0x0FFF), .driver_info = DEVICE_INSTALLER},
126         { }
127 };
128 MODULE_DEVICE_TABLE(usb, id_table);
129
130 static struct usb_device_id id_table_1port [] = {
131         { USB_DEVICE(0x1199, 0x0112) }, /* Sierra Wireless AirCard 580 */
132         { USB_DEVICE(0x0F3D, 0x0112) }, /* AirPrime/Sierra PC 5220 */
133         { }
134 };
135
136 static struct usb_device_id id_table_3port [] = {
137         { USB_DEVICE(0x1199, 0x0017) }, /* Sierra Wireless EM5625 */
138         { USB_DEVICE(0x1199, 0x0018) }, /* Sierra Wireless MC5720 */
139         { USB_DEVICE(0x0f30, 0x1b1d) }, /* Sierra Wireless MC5720 */
140         { USB_DEVICE(0x1199, 0x0218) }, /* Sierra Wireless MC5720 */
141         { USB_DEVICE(0x1199, 0x0020) }, /* Sierra Wireless MC5725 */
142         { USB_DEVICE(0x1199, 0x0220) }, /* Sierra Wireless MC5725 */
143         { USB_DEVICE(0x1199, 0x0019) }, /* Sierra Wireless AirCard 595 */
144         { USB_DEVICE(0x1199, 0x0021) }, /* Sierra Wireless AirCard 597E */
145         { USB_DEVICE(0x1199, 0x0120) }, /* Sierra Wireless USB Dongle 595U*/
146
147         { USB_DEVICE(0x1199, 0x6802) }, /* Sierra Wireless MC8755 */
148         { USB_DEVICE(0x1199, 0x6804) }, /* Sierra Wireless MC8755 */
149         { USB_DEVICE(0x1199, 0x6803) }, /* Sierra Wireless MC8765 */
150         { USB_DEVICE(0x1199, 0x6812) }, /* Sierra Wireless MC8775 & AC 875U */
151         { USB_DEVICE(0x1199, 0x6813) }, /* Sierra Wireless MC8775 (Thinkpad internal) */
152         { USB_DEVICE(0x1199, 0x6820) }, /* Sierra Wireless AirCard 875 */
153         { USB_DEVICE(0x1199, 0x6832) }, /* Sierra Wireless MC8780*/
154         { USB_DEVICE(0x1199, 0x6833) }, /* Sierra Wireless MC8781*/
155         { USB_DEVICE(0x1199, 0x6850) }, /* Sierra Wireless AirCard 880 */
156         { USB_DEVICE(0x1199, 0x6851) }, /* Sierra Wireless AirCard 881 */
157         { USB_DEVICE(0x1199, 0x6852) }, /* Sierra Wireless AirCard 880E */
158         { USB_DEVICE(0x1199, 0x6853) }, /* Sierra Wireless AirCard 881E */
159         { USB_DEVICE(0x1199, 0x6856) }, /* Sierra Wireless AirCard 881U */
160         { }
161 };
162
163 static struct usb_driver sierra_driver = {
164         .name       = "sierra",
165         .probe      = sierra_probe,
166         .disconnect = usb_serial_disconnect,
167         .id_table   = id_table,
168         .no_dynamic_id =        1,
169 };
170
171
172 struct sierra_port_private {
173         spinlock_t lock;        /* lock the structure */
174         int outstanding_urbs;   /* number of out urbs in flight */
175
176         /* Input endpoints and buffer for this port */
177         struct urb *in_urbs[N_IN_URB];
178         char in_buffer[N_IN_URB][IN_BUFLEN];
179
180         /* Settings for the port */
181         int rts_state;  /* Handshaking pins (outputs) */
182         int dtr_state;
183         int cts_state;  /* Handshaking pins (inputs) */
184         int dsr_state;
185         int dcd_state;
186         int ri_state;
187 };
188
189 static int sierra_send_setup(struct usb_serial_port *port)
190 {
191         struct usb_serial *serial = port->serial;
192         struct sierra_port_private *portdata;
193
194         dbg("%s", __FUNCTION__);
195
196         portdata = usb_get_serial_port_data(port);
197
198         if (port->tty) {
199                 int val = 0;
200                 if (portdata->dtr_state)
201                         val |= 0x01;
202                 if (portdata->rts_state)
203                         val |= 0x02;
204
205                 return usb_control_msg(serial->dev,
206                                 usb_rcvctrlpipe(serial->dev, 0),
207                                 0x22,0x21,val,0,NULL,0,USB_CTRL_SET_TIMEOUT);
208         }
209
210         return 0;
211 }
212
213 static void sierra_rx_throttle(struct usb_serial_port *port)
214 {
215         dbg("%s", __FUNCTION__);
216 }
217
218 static void sierra_rx_unthrottle(struct usb_serial_port *port)
219 {
220         dbg("%s", __FUNCTION__);
221 }
222
223 static void sierra_break_ctl(struct usb_serial_port *port, int break_state)
224 {
225         /* Unfortunately, I don't know how to send a break */
226         dbg("%s", __FUNCTION__);
227 }
228
229 static void sierra_set_termios(struct usb_serial_port *port,
230                         struct ktermios *old_termios)
231 {
232         dbg("%s", __FUNCTION__);
233         tty_termios_copy_hw(port->tty->termios, old_termios);
234         sierra_send_setup(port);
235 }
236
237 static int sierra_tiocmget(struct usb_serial_port *port, struct file *file)
238 {
239         unsigned int value;
240         struct sierra_port_private *portdata;
241
242         portdata = usb_get_serial_port_data(port);
243
244         value = ((portdata->rts_state) ? TIOCM_RTS : 0) |
245                 ((portdata->dtr_state) ? TIOCM_DTR : 0) |
246                 ((portdata->cts_state) ? TIOCM_CTS : 0) |
247                 ((portdata->dsr_state) ? TIOCM_DSR : 0) |
248                 ((portdata->dcd_state) ? TIOCM_CAR : 0) |
249                 ((portdata->ri_state) ? TIOCM_RNG : 0);
250
251         return value;
252 }
253
254 static int sierra_tiocmset(struct usb_serial_port *port, struct file *file,
255                         unsigned int set, unsigned int clear)
256 {
257         struct sierra_port_private *portdata;
258
259         portdata = usb_get_serial_port_data(port);
260
261         if (set & TIOCM_RTS)
262                 portdata->rts_state = 1;
263         if (set & TIOCM_DTR)
264                 portdata->dtr_state = 1;
265
266         if (clear & TIOCM_RTS)
267                 portdata->rts_state = 0;
268         if (clear & TIOCM_DTR)
269                 portdata->dtr_state = 0;
270         return sierra_send_setup(port);
271 }
272
273 static int sierra_ioctl(struct usb_serial_port *port, struct file *file,
274                         unsigned int cmd, unsigned long arg)
275 {
276         return -ENOIOCTLCMD;
277 }
278
279 static void sierra_outdat_callback(struct urb *urb)
280 {
281         struct usb_serial_port *port = urb->context;
282         struct sierra_port_private *portdata = usb_get_serial_port_data(port);
283         int status = urb->status;
284         unsigned long flags;
285
286         dbg("%s - port %d", __FUNCTION__, port->number);
287
288         /* free up the transfer buffer, as usb_free_urb() does not do this */
289         kfree(urb->transfer_buffer);
290
291         if (status)
292                 dbg("%s - nonzero write bulk status received: %d",
293                     __FUNCTION__, status);
294
295         spin_lock_irqsave(&portdata->lock, flags);
296         --portdata->outstanding_urbs;
297         spin_unlock_irqrestore(&portdata->lock, flags);
298
299         usb_serial_port_softint(port);
300 }
301
302 /* Write */
303 static int sierra_write(struct usb_serial_port *port,
304                         const unsigned char *buf, int count)
305 {
306         struct sierra_port_private *portdata = usb_get_serial_port_data(port);
307         struct usb_serial *serial = port->serial;
308         unsigned long flags;
309         unsigned char *buffer;
310         struct urb *urb;
311         int status;
312
313         portdata = usb_get_serial_port_data(port);
314
315         dbg("%s: write (%d chars)", __FUNCTION__, count);
316
317         spin_lock_irqsave(&portdata->lock, flags);
318         if (portdata->outstanding_urbs > N_OUT_URB) {
319                 spin_unlock_irqrestore(&portdata->lock, flags);
320                 dbg("%s - write limit hit\n", __FUNCTION__);
321                 return 0;
322         }
323         portdata->outstanding_urbs++;
324         spin_unlock_irqrestore(&portdata->lock, flags);
325
326         buffer = kmalloc(count, GFP_ATOMIC);
327         if (!buffer) {
328                 dev_err(&port->dev, "out of memory\n");
329                 count = -ENOMEM;
330                 goto error_no_buffer;
331         }
332
333         urb = usb_alloc_urb(0, GFP_ATOMIC);
334         if (!urb) {
335                 dev_err(&port->dev, "no more free urbs\n");
336                 count = -ENOMEM;
337                 goto error_no_urb;
338         }
339
340         memcpy(buffer, buf, count);
341
342         usb_serial_debug_data(debug, &port->dev, __FUNCTION__, count, buffer);
343
344         usb_fill_bulk_urb(urb, serial->dev,
345                           usb_sndbulkpipe(serial->dev,
346                                           port->bulk_out_endpointAddress),
347                           buffer, count, sierra_outdat_callback, port);
348
349         /* send it down the pipe */
350         status = usb_submit_urb(urb, GFP_ATOMIC);
351         if (status) {
352                 dev_err(&port->dev, "%s - usb_submit_urb(write bulk) failed "
353                         "with status = %d\n", __FUNCTION__, status);
354                 count = status;
355                 goto error;
356         }
357
358         /* we are done with this urb, so let the host driver
359          * really free it when it is finished with it */
360         usb_free_urb(urb);
361
362         return count;
363 error:
364         usb_free_urb(urb);
365 error_no_urb:
366         kfree(buffer);
367 error_no_buffer:
368         spin_lock_irqsave(&portdata->lock, flags);
369         --portdata->outstanding_urbs;
370         spin_unlock_irqrestore(&portdata->lock, flags);
371         return count;
372 }
373
374 static void sierra_indat_callback(struct urb *urb)
375 {
376         int err;
377         int endpoint;
378         struct usb_serial_port *port;
379         struct tty_struct *tty;
380         unsigned char *data = urb->transfer_buffer;
381         int status = urb->status;
382
383         dbg("%s: %p", __FUNCTION__, urb);
384
385         endpoint = usb_pipeendpoint(urb->pipe);
386         port = (struct usb_serial_port *) urb->context;
387
388         if (status) {
389                 dbg("%s: nonzero status: %d on endpoint %02x.",
390                     __FUNCTION__, status, endpoint);
391         } else {
392                 tty = port->tty;
393                 if (urb->actual_length) {
394                         tty_buffer_request_room(tty, urb->actual_length);
395                         tty_insert_flip_string(tty, data, urb->actual_length);
396                         tty_flip_buffer_push(tty);
397                 } else {
398                         dbg("%s: empty read urb received", __FUNCTION__);
399                 }
400
401                 /* Resubmit urb so we continue receiving */
402                 if (port->open_count && status != -ESHUTDOWN) {
403                         err = usb_submit_urb(urb, GFP_ATOMIC);
404                         if (err)
405                                 dev_err(&port->dev, "resubmit read urb failed."
406                                         "(%d)\n", err);
407                 }
408         }
409         return;
410 }
411
412 static void sierra_instat_callback(struct urb *urb)
413 {
414         int err;
415         int status = urb->status;
416         struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
417         struct sierra_port_private *portdata = usb_get_serial_port_data(port);
418         struct usb_serial *serial = port->serial;
419
420         dbg("%s", __FUNCTION__);
421         dbg("%s: urb %p port %p has data %p", __FUNCTION__,urb,port,portdata);
422
423         if (status == 0) {
424                 struct usb_ctrlrequest *req_pkt =
425                                 (struct usb_ctrlrequest *)urb->transfer_buffer;
426
427                 if (!req_pkt) {
428                         dbg("%s: NULL req_pkt\n", __FUNCTION__);
429                         return;
430                 }
431                 if ((req_pkt->bRequestType == 0xA1) &&
432                                 (req_pkt->bRequest == 0x20)) {
433                         int old_dcd_state;
434                         unsigned char signals = *((unsigned char *)
435                                         urb->transfer_buffer +
436                                         sizeof(struct usb_ctrlrequest));
437
438                         dbg("%s: signal x%x", __FUNCTION__, signals);
439
440                         old_dcd_state = portdata->dcd_state;
441                         portdata->cts_state = 1;
442                         portdata->dcd_state = ((signals & 0x01) ? 1 : 0);
443                         portdata->dsr_state = ((signals & 0x02) ? 1 : 0);
444                         portdata->ri_state = ((signals & 0x08) ? 1 : 0);
445
446                         if (port->tty && !C_CLOCAL(port->tty) &&
447                                         old_dcd_state && !portdata->dcd_state)
448                                 tty_hangup(port->tty);
449                 } else {
450                         dbg("%s: type %x req %x", __FUNCTION__,
451                                 req_pkt->bRequestType,req_pkt->bRequest);
452                 }
453         } else
454                 dbg("%s: error %d", __FUNCTION__, status);
455
456         /* Resubmit urb so we continue receiving IRQ data */
457         if (status != -ESHUTDOWN) {
458                 urb->dev = serial->dev;
459                 err = usb_submit_urb(urb, GFP_ATOMIC);
460                 if (err)
461                         dbg("%s: resubmit intr urb failed. (%d)",
462                                 __FUNCTION__, err);
463         }
464 }
465
466 static int sierra_write_room(struct usb_serial_port *port)
467 {
468         struct sierra_port_private *portdata = usb_get_serial_port_data(port);
469         unsigned long flags;
470
471         dbg("%s - port %d", __FUNCTION__, port->number);
472
473         /* try to give a good number back based on if we have any free urbs at
474          * this point in time */
475         spin_lock_irqsave(&portdata->lock, flags);
476         if (portdata->outstanding_urbs > N_OUT_URB * 2 / 3) {
477                 spin_unlock_irqrestore(&portdata->lock, flags);
478                 dbg("%s - write limit hit\n", __FUNCTION__);
479                 return 0;
480         }
481         spin_unlock_irqrestore(&portdata->lock, flags);
482
483         return 2048;
484 }
485
486 static int sierra_chars_in_buffer(struct usb_serial_port *port)
487 {
488         dbg("%s - port %d", __FUNCTION__, port->number);
489
490         /*
491          * We can't really account for how much data we
492          * have sent out, but hasn't made it through to the
493          * device as we can't see the backend here, so just
494          * tell the tty layer that everything is flushed.
495          */
496         return 0;
497 }
498
499 static int sierra_open(struct usb_serial_port *port, struct file *filp)
500 {
501         struct sierra_port_private *portdata;
502         struct usb_serial *serial = port->serial;
503         int i;
504         struct urb *urb;
505         int result;
506
507         portdata = usb_get_serial_port_data(port);
508
509         dbg("%s", __FUNCTION__);
510
511         /* Set some sane defaults */
512         portdata->rts_state = 1;
513         portdata->dtr_state = 1;
514
515         /* Reset low level data toggle and start reading from endpoints */
516         for (i = 0; i < N_IN_URB; i++) {
517                 urb = portdata->in_urbs[i];
518                 if (!urb)
519                         continue;
520                 if (urb->dev != serial->dev) {
521                         dbg("%s: dev %p != %p", __FUNCTION__,
522                                 urb->dev, serial->dev);
523                         continue;
524                 }
525
526                 /*
527                  * make sure endpoint data toggle is synchronized with the
528                  * device
529                  */
530                 usb_clear_halt(urb->dev, urb->pipe);
531
532                 result = usb_submit_urb(urb, GFP_KERNEL);
533                 if (result) {
534                         dev_err(&port->dev, "submit urb %d failed (%d) %d\n",
535                                 i, result, urb->transfer_buffer_length);
536                 }
537         }
538
539         port->tty->low_latency = 1;
540
541         sierra_send_setup(port);
542
543         /* start up the interrupt endpoint if we have one */
544         if (port->interrupt_in_urb) {
545                 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
546                 if (result)
547                         dev_err(&port->dev, "submit irq_in urb failed %d\n",
548                                 result);
549         }
550         return 0;
551 }
552
553 static void sierra_close(struct usb_serial_port *port, struct file *filp)
554 {
555         int i;
556         struct usb_serial *serial = port->serial;
557         struct sierra_port_private *portdata;
558
559         dbg("%s", __FUNCTION__);
560         portdata = usb_get_serial_port_data(port);
561
562         portdata->rts_state = 0;
563         portdata->dtr_state = 0;
564
565         if (serial->dev) {
566                 sierra_send_setup(port);
567
568                 /* Stop reading/writing urbs */
569                 for (i = 0; i < N_IN_URB; i++)
570                         usb_kill_urb(portdata->in_urbs[i]);
571         }
572
573         usb_kill_urb(port->interrupt_in_urb);
574
575         port->tty = NULL;
576 }
577
578 static int sierra_startup(struct usb_serial *serial)
579 {
580         struct usb_serial_port *port;
581         struct sierra_port_private *portdata;
582         struct urb *urb;
583         int i;
584         int j;
585
586         dbg("%s", __FUNCTION__);
587
588         /*Set Device mode to D0 */
589         sierra_set_power_state(serial->dev, 0x0000);
590
591         /* Now setup per port private data */
592         for (i = 0; i < serial->num_ports; i++) {
593                 port = serial->port[i];
594                 portdata = kzalloc(sizeof(*portdata), GFP_KERNEL);
595                 if (!portdata) {
596                         dbg("%s: kmalloc for sierra_port_private (%d) failed!.",
597                                         __FUNCTION__, i);
598                         return -ENOMEM;
599                 }
600                 spin_lock_init(&portdata->lock);
601
602                 usb_set_serial_port_data(port, portdata);
603
604                 /* initialize the in urbs */
605                 for (j = 0; j < N_IN_URB; ++j) {
606                         urb = usb_alloc_urb(0, GFP_KERNEL);
607                         if (urb == NULL) {
608                                 dbg("%s: alloc for in port failed.",
609                                     __FUNCTION__);
610                                 continue;
611                         }
612                         /* Fill URB using supplied data. */
613                         usb_fill_bulk_urb(urb, serial->dev,
614                                           usb_rcvbulkpipe(serial->dev,
615                                                 port->bulk_in_endpointAddress),
616                                           portdata->in_buffer[j], IN_BUFLEN,
617                                           sierra_indat_callback, port);
618                         portdata->in_urbs[j] = urb;
619                 }
620         }
621
622         return 0;
623 }
624
625 static void sierra_shutdown(struct usb_serial *serial)
626 {
627         int i, j;
628         struct usb_serial_port *port;
629         struct sierra_port_private *portdata;
630
631         dbg("%s", __FUNCTION__);
632
633         for (i = 0; i < serial->num_ports; ++i) {
634                 port = serial->port[i];
635                 if (!port)
636                         continue;
637                 portdata = usb_get_serial_port_data(port);
638                 if (!portdata)
639                         continue;
640
641                 for (j = 0; j < N_IN_URB; j++) {
642                         usb_kill_urb(portdata->in_urbs[j]);
643                         usb_free_urb(portdata->in_urbs[j]);
644                         portdata->in_urbs[j] = NULL;
645                 }
646                 kfree(portdata);
647                 usb_set_serial_port_data(port, NULL);
648         }
649 }
650
651 static struct usb_serial_driver sierra_1port_device = {
652         .driver = {
653                 .owner =        THIS_MODULE,
654                 .name =         "sierra1",
655         },
656         .description       = "Sierra USB modem (1 port)",
657         .id_table          = id_table_1port,
658         .usb_driver        = &sierra_driver,
659         .num_interrupt_in  = NUM_DONT_CARE,
660         .num_bulk_in       = 1,
661         .num_bulk_out      = 1,
662         .num_ports         = 1,
663         .open              = sierra_open,
664         .close             = sierra_close,
665         .write             = sierra_write,
666         .write_room        = sierra_write_room,
667         .chars_in_buffer   = sierra_chars_in_buffer,
668         .throttle          = sierra_rx_throttle,
669         .unthrottle        = sierra_rx_unthrottle,
670         .ioctl             = sierra_ioctl,
671         .set_termios       = sierra_set_termios,
672         .break_ctl         = sierra_break_ctl,
673         .tiocmget          = sierra_tiocmget,
674         .tiocmset          = sierra_tiocmset,
675         .attach            = sierra_startup,
676         .shutdown          = sierra_shutdown,
677         .read_int_callback = sierra_instat_callback,
678 };
679
680 static struct usb_serial_driver sierra_3port_device = {
681         .driver = {
682                 .owner =        THIS_MODULE,
683                 .name =         "sierra3",
684         },
685         .description       = "Sierra USB modem (3 port)",
686         .id_table          = id_table_3port,
687         .usb_driver        = &sierra_driver,
688         .num_interrupt_in  = NUM_DONT_CARE,
689         .num_bulk_in       = 3,
690         .num_bulk_out      = 3,
691         .num_ports         = 3,
692         .open              = sierra_open,
693         .close             = sierra_close,
694         .write             = sierra_write,
695         .write_room        = sierra_write_room,
696         .chars_in_buffer   = sierra_chars_in_buffer,
697         .throttle          = sierra_rx_throttle,
698         .unthrottle        = sierra_rx_unthrottle,
699         .ioctl             = sierra_ioctl,
700         .set_termios       = sierra_set_termios,
701         .break_ctl         = sierra_break_ctl,
702         .tiocmget          = sierra_tiocmget,
703         .tiocmset          = sierra_tiocmset,
704         .attach            = sierra_startup,
705         .shutdown          = sierra_shutdown,
706         .read_int_callback = sierra_instat_callback,
707 };
708
709 /* Functions used by new usb-serial code. */
710 static int __init sierra_init(void)
711 {
712         int retval;
713         retval = usb_serial_register(&sierra_1port_device);
714         if (retval)
715                 goto failed_1port_device_register;
716         retval = usb_serial_register(&sierra_3port_device);
717         if (retval)
718                 goto failed_3port_device_register;
719
720
721         retval = usb_register(&sierra_driver);
722         if (retval)
723                 goto failed_driver_register;
724
725         info(DRIVER_DESC ": " DRIVER_VERSION);
726
727         return 0;
728
729 failed_driver_register:
730         usb_serial_deregister(&sierra_3port_device);
731 failed_3port_device_register:
732         usb_serial_deregister(&sierra_1port_device);
733 failed_1port_device_register:
734         return retval;
735 }
736
737 static void __exit sierra_exit(void)
738 {
739         usb_deregister (&sierra_driver);
740         usb_serial_deregister(&sierra_1port_device);
741         usb_serial_deregister(&sierra_3port_device);
742 }
743
744 module_init(sierra_init);
745 module_exit(sierra_exit);
746
747 MODULE_AUTHOR(DRIVER_AUTHOR);
748 MODULE_DESCRIPTION(DRIVER_DESC);
749 MODULE_VERSION(DRIVER_VERSION);
750 MODULE_LICENSE("GPL");
751
752 #ifdef CONFIG_USB_DEBUG
753 module_param(debug, bool, S_IRUGO | S_IWUSR);
754 MODULE_PARM_DESC(debug, "Debug messages");
755 #endif
756