Merge branches 'x86/xen', 'x86/build', 'x86/microcode', 'x86/mm-debug-v2', 'x86/memor...
[deliverable/linux.git] / drivers / usb / serial / usb-serial.c
CommitLineData
1da177e4
LT
1/*
2 * USB Serial Converter driver
3 *
502b95c1 4 * Copyright (C) 1999 - 2005 Greg Kroah-Hartman (greg@kroah.com)
1da177e4
LT
5 * Copyright (C) 2000 Peter Berger (pberger@brimson.com)
6 * Copyright (C) 2000 Al Borchers (borchers@steinerpoint.com)
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License version
10 * 2 as published by the Free Software Foundation.
11 *
502b95c1 12 * This driver was originally based on the ACM driver by Armin Fuerst (which was
1da177e4
LT
13 * based on a driver by Brad Keryan)
14 *
a8d6f0a9
AC
15 * See Documentation/usb/usb-serial.txt for more information on using this
16 * driver
1da177e4 17 *
1da177e4
LT
18 */
19
1da177e4
LT
20#include <linux/kernel.h>
21#include <linux/errno.h>
22#include <linux/init.h>
23#include <linux/slab.h>
24#include <linux/tty.h>
25#include <linux/tty_driver.h>
26#include <linux/tty_flip.h>
27#include <linux/module.h>
28#include <linux/moduleparam.h>
29#include <linux/spinlock.h>
1ce7dd26 30#include <linux/mutex.h>
1da177e4 31#include <linux/list.h>
a8d6f0a9 32#include <linux/uaccess.h>
1da177e4 33#include <linux/usb.h>
a969888c 34#include <linux/usb/serial.h>
1da177e4
LT
35#include "pl2303.h"
36
37/*
38 * Version Information
39 */
1da177e4
LT
40#define DRIVER_AUTHOR "Greg Kroah-Hartman, greg@kroah.com, http://www.kroah.com/linux/"
41#define DRIVER_DESC "USB Serial Driver core"
42
34f8e761
PZ
43static void port_free(struct usb_serial_port *port);
44
1da177e4
LT
45/* Driver structure we register with the USB core */
46static struct usb_driver usb_serial_driver = {
1da177e4
LT
47 .name = "usbserial",
48 .probe = usb_serial_probe,
49 .disconnect = usb_serial_disconnect,
ec22559e
ON
50 .suspend = usb_serial_suspend,
51 .resume = usb_serial_resume,
ba9dc657 52 .no_dynamic_id = 1,
1da177e4
LT
53};
54
55/* There is no MODULE_DEVICE_TABLE for usbserial.c. Instead
56 the MODULE_DEVICE_TABLE declarations in each serial driver
57 cause the "hotplug" program to pull in whatever module is necessary
58 via modprobe, and modprobe will load usbserial because the serial
59 drivers depend on it.
60*/
61
62static int debug;
a8d6f0a9
AC
63/* initially all NULL */
64static struct usb_serial *serial_table[SERIAL_TTY_MINORS];
3ddad823 65static DEFINE_MUTEX(table_lock);
1da177e4
LT
66static LIST_HEAD(usb_serial_driver_list);
67
68struct usb_serial *usb_serial_get_by_index(unsigned index)
69{
34ef50e5
ON
70 struct usb_serial *serial;
71
3ddad823 72 mutex_lock(&table_lock);
34ef50e5 73 serial = serial_table[index];
1da177e4
LT
74
75 if (serial)
76 kref_get(&serial->kref);
3ddad823 77 mutex_unlock(&table_lock);
1da177e4
LT
78 return serial;
79}
80
a8d6f0a9
AC
81static struct usb_serial *get_free_serial(struct usb_serial *serial,
82 int num_ports, unsigned int *minor)
1da177e4
LT
83{
84 unsigned int i, j;
85 int good_spot;
86
441b62c1 87 dbg("%s %d", __func__, num_ports);
1da177e4
LT
88
89 *minor = 0;
3ddad823 90 mutex_lock(&table_lock);
1da177e4
LT
91 for (i = 0; i < SERIAL_TTY_MINORS; ++i) {
92 if (serial_table[i])
93 continue;
94
95 good_spot = 1;
96 for (j = 1; j <= num_ports-1; ++j)
97 if ((i+j >= SERIAL_TTY_MINORS) || (serial_table[i+j])) {
98 good_spot = 0;
99 i += j;
100 break;
101 }
102 if (good_spot == 0)
103 continue;
104
105 *minor = i;
a1f721c8 106 j = 0;
441b62c1 107 dbg("%s - minor base = %d", __func__, *minor);
a1f721c8 108 for (i = *minor; (i < (*minor + num_ports)) && (i < SERIAL_TTY_MINORS); ++i) {
1da177e4 109 serial_table[i] = serial;
a1f721c8
ON
110 serial->port[j++]->number = i;
111 }
3ddad823 112 mutex_unlock(&table_lock);
1da177e4
LT
113 return serial;
114 }
3ddad823 115 mutex_unlock(&table_lock);
1da177e4
LT
116 return NULL;
117}
118
119static void return_serial(struct usb_serial *serial)
120{
121 int i;
122
441b62c1 123 dbg("%s", __func__);
1da177e4 124
a8d6f0a9 125 for (i = 0; i < serial->num_ports; ++i)
1da177e4 126 serial_table[serial->minor + i] = NULL;
1da177e4
LT
127}
128
129static void destroy_serial(struct kref *kref)
130{
131 struct usb_serial *serial;
132 struct usb_serial_port *port;
133 int i;
134
135 serial = to_usb_serial(kref);
136
441b62c1 137 dbg("%s - %s", __func__, serial->type->description);
1da177e4 138
521b85ae
JR
139 serial->type->shutdown(serial);
140
141 /* return the minor range that this device had */
0282b7f2
AS
142 if (serial->minor != SERIAL_TTY_NO_MINOR)
143 return_serial(serial);
521b85ae 144
1da177e4 145 for (i = 0; i < serial->num_ports; ++i)
95da310e 146 serial->port[i]->port.count = 0;
1da177e4
LT
147
148 /* the ports are cleaned up and released in port_release() */
149 for (i = 0; i < serial->num_ports; ++i)
150 if (serial->port[i]->dev.parent != NULL) {
151 device_unregister(&serial->port[i]->dev);
152 serial->port[i] = NULL;
153 }
154
155 /* If this is a "fake" port, we have to clean it up here, as it will
156 * not get cleaned up in port_release() as it was never registered with
157 * the driver core */
158 if (serial->num_ports < serial->num_port_pointers) {
a8d6f0a9
AC
159 for (i = serial->num_ports;
160 i < serial->num_port_pointers; ++i) {
1da177e4
LT
161 port = serial->port[i];
162 if (!port)
163 continue;
34f8e761 164 port_free(port);
1da177e4
LT
165 }
166 }
167
168 usb_put_dev(serial->dev);
169
170 /* free up any memory that we allocated */
a8d6f0a9 171 kfree(serial);
1da177e4
LT
172}
173
73e487fd
GL
174void usb_serial_put(struct usb_serial *serial)
175{
3ddad823 176 mutex_lock(&table_lock);
73e487fd 177 kref_put(&serial->kref, destroy_serial);
3ddad823 178 mutex_unlock(&table_lock);
73e487fd
GL
179}
180
1da177e4
LT
181/*****************************************************************************
182 * Driver tty interface functions
183 *****************************************************************************/
a8d6f0a9 184static int serial_open (struct tty_struct *tty, struct file *filp)
1da177e4
LT
185{
186 struct usb_serial *serial;
187 struct usb_serial_port *port;
188 unsigned int portNumber;
189 int retval;
a8d6f0a9 190
441b62c1 191 dbg("%s", __func__);
1da177e4
LT
192
193 /* get the serial object associated with this tty pointer */
194 serial = usb_serial_get_by_index(tty->index);
195 if (!serial) {
196 tty->driver_data = NULL;
197 return -ENODEV;
198 }
199
200 portNumber = tty->index - serial->minor;
201 port = serial->port[portNumber];
71a84163
LFC
202 if (!port) {
203 retval = -ENODEV;
204 goto bailout_kref_put;
205 }
8a4613f0 206
71a84163
LFC
207 if (mutex_lock_interruptible(&port->mutex)) {
208 retval = -ERESTARTSYS;
209 goto bailout_kref_put;
210 }
a8d6f0a9 211
95da310e 212 ++port->port.count;
1da177e4 213
ca85485c
PF
214 /* set up our port structure making the tty driver
215 * remember our port object, and us it */
216 tty->driver_data = port;
95da310e 217 port->port.tty = tty;
1da177e4 218
95da310e 219 if (port->port.count == 1) {
1da177e4
LT
220
221 /* lock this module before we call it
222 * this may fail, which means we must bail out,
223 * safe because we are called with BKL held */
18fcac35 224 if (!try_module_get(serial->type->driver.owner)) {
1da177e4 225 retval = -ENODEV;
71a84163 226 goto bailout_mutex_unlock;
1da177e4
LT
227 }
228
f0fbd5b9
SS
229 retval = usb_autopm_get_interface(serial->interface);
230 if (retval)
231 goto bailout_module_put;
a8d6f0a9 232 /* only call the device specific open if this
1da177e4 233 * is the first time the port is opened */
95da310e 234 retval = serial->type->open(tty, port, filp);
1da177e4 235 if (retval)
f0fbd5b9 236 goto bailout_interface_put;
1da177e4
LT
237 }
238
1ce7dd26 239 mutex_unlock(&port->mutex);
1da177e4
LT
240 return 0;
241
f0fbd5b9
SS
242bailout_interface_put:
243 usb_autopm_put_interface(serial->interface);
1da177e4 244bailout_module_put:
18fcac35 245 module_put(serial->type->driver.owner);
71a84163 246bailout_mutex_unlock:
95da310e 247 port->port.count = 0;
b059c81a 248 tty->driver_data = NULL;
95da310e 249 port->port.tty = NULL;
1ce7dd26 250 mutex_unlock(&port->mutex);
71a84163 251bailout_kref_put:
73e487fd 252 usb_serial_put(serial);
1da177e4
LT
253 return retval;
254}
255
a8d6f0a9 256static void serial_close(struct tty_struct *tty, struct file *filp)
1da177e4 257{
81671ddb 258 struct usb_serial_port *port = tty->driver_data;
1da177e4
LT
259
260 if (!port)
261 return;
262
441b62c1 263 dbg("%s - port %d", __func__, port->number);
1da177e4 264
1ce7dd26 265 mutex_lock(&port->mutex);
8a4613f0 266
95da310e 267 if (port->port.count == 0) {
1ce7dd26 268 mutex_unlock(&port->mutex);
91c0bce2
GKH
269 return;
270 }
1da177e4 271
95da310e
AC
272 --port->port.count;
273 if (port->port.count == 0)
a8d6f0a9 274 /* only call the device specific close if this
1da177e4 275 * port is being closed by the last owner */
95da310e 276 port->serial->type->close(tty, port, filp);
1da177e4 277
95da310e
AC
278 if (port->port.count == (port->console? 1 : 0)) {
279 if (port->port.tty) {
280 if (port->port.tty->driver_data)
281 port->port.tty->driver_data = NULL;
282 port->port.tty = NULL;
1da177e4 283 }
9a6b1efa 284 }
1da177e4 285
95da310e 286 if (port->port.count == 0) {
62ad296b
ON
287 mutex_lock(&port->serial->disc_mutex);
288 if (!port->serial->disconnected)
289 usb_autopm_put_interface(port->serial->interface);
290 mutex_unlock(&port->serial->disc_mutex);
18fcac35 291 module_put(port->serial->type->driver.owner);
f0fbd5b9 292 }
1da177e4 293
1ce7dd26 294 mutex_unlock(&port->mutex);
73e487fd 295 usb_serial_put(port->serial);
1da177e4
LT
296}
297
a8d6f0a9
AC
298static int serial_write(struct tty_struct *tty, const unsigned char *buf,
299 int count)
1da177e4 300{
81671ddb 301 struct usb_serial_port *port = tty->driver_data;
3ff4fd94 302 int retval = -ENODEV;
1da177e4 303
f34d7a5b 304 if (port->serial->dev->state == USB_STATE_NOTATTACHED)
487f9c67
LFC
305 goto exit;
306
441b62c1 307 dbg("%s - port %d, %d byte(s)", __func__, port->number, count);
1da177e4 308
95da310e 309 /* count is managed under the mutex lock for the tty so cannot
a8d6f0a9 310 drop to zero until after the last close completes */
95da310e 311 WARN_ON(!port->port.count);
1da177e4
LT
312
313 /* pass on to the driver specific version of this function */
95da310e 314 retval = port->serial->type->write(tty, port, buf, count);
1da177e4
LT
315
316exit:
317 return retval;
318}
319
a8d6f0a9 320static int serial_write_room(struct tty_struct *tty)
1da177e4 321{
81671ddb 322 struct usb_serial_port *port = tty->driver_data;
441b62c1 323 dbg("%s - port %d", __func__, port->number);
95da310e 324 WARN_ON(!port->port.count);
1da177e4 325 /* pass on to the driver specific version of this function */
95da310e 326 return port->serial->type->write_room(tty);
1da177e4
LT
327}
328
a8d6f0a9 329static int serial_chars_in_buffer(struct tty_struct *tty)
1da177e4 330{
81671ddb 331 struct usb_serial_port *port = tty->driver_data;
441b62c1 332 dbg("%s = port %d", __func__, port->number);
1da177e4 333
95da310e 334 WARN_ON(!port->port.count);
1da177e4 335 /* pass on to the driver specific version of this function */
95da310e 336 return port->serial->type->chars_in_buffer(tty);
1da177e4
LT
337}
338
a8d6f0a9 339static void serial_throttle(struct tty_struct *tty)
1da177e4 340{
81671ddb 341 struct usb_serial_port *port = tty->driver_data;
441b62c1 342 dbg("%s - port %d", __func__, port->number);
1da177e4 343
95da310e 344 WARN_ON(!port->port.count);
1da177e4
LT
345 /* pass on to the driver specific version of this function */
346 if (port->serial->type->throttle)
95da310e 347 port->serial->type->throttle(tty);
1da177e4
LT
348}
349
a8d6f0a9 350static void serial_unthrottle(struct tty_struct *tty)
1da177e4 351{
81671ddb 352 struct usb_serial_port *port = tty->driver_data;
441b62c1 353 dbg("%s - port %d", __func__, port->number);
1da177e4 354
95da310e 355 WARN_ON(!port->port.count);
1da177e4
LT
356 /* pass on to the driver specific version of this function */
357 if (port->serial->type->unthrottle)
95da310e 358 port->serial->type->unthrottle(tty);
1da177e4
LT
359}
360
a8d6f0a9
AC
361static int serial_ioctl(struct tty_struct *tty, struct file *file,
362 unsigned int cmd, unsigned long arg)
1da177e4 363{
81671ddb 364 struct usb_serial_port *port = tty->driver_data;
1da177e4
LT
365 int retval = -ENODEV;
366
441b62c1 367 dbg("%s - port %d, cmd 0x%.4x", __func__, port->number, cmd);
1da177e4 368
95da310e 369 WARN_ON(!port->port.count);
1da177e4 370
a8d6f0a9
AC
371 /* pass on to the driver specific version of this function
372 if it is available */
f34d7a5b
AC
373 if (port->serial->type->ioctl) {
374 lock_kernel();
95da310e 375 retval = port->serial->type->ioctl(tty, file, cmd, arg);
f34d7a5b 376 unlock_kernel();
a8d6f0a9 377 } else
1da177e4 378 retval = -ENOIOCTLCMD;
1da177e4
LT
379 return retval;
380}
381
a8d6f0a9 382static void serial_set_termios(struct tty_struct *tty, struct ktermios *old)
1da177e4 383{
81671ddb 384 struct usb_serial_port *port = tty->driver_data;
441b62c1 385 dbg("%s - port %d", __func__, port->number);
1da177e4 386
95da310e 387 WARN_ON(!port->port.count);
a8d6f0a9
AC
388 /* pass on to the driver specific version of this function
389 if it is available */
1da177e4 390 if (port->serial->type->set_termios)
95da310e 391 port->serial->type->set_termios(tty, port, old);
33785091
AC
392 else
393 tty_termios_copy_hw(tty->termios, old);
1da177e4
LT
394}
395
9e98966c 396static int serial_break(struct tty_struct *tty, int break_state)
1da177e4 397{
81671ddb 398 struct usb_serial_port *port = tty->driver_data;
1da177e4 399
441b62c1 400 dbg("%s - port %d", __func__, port->number);
1da177e4 401
95da310e 402 WARN_ON(!port->port.count);
a8d6f0a9
AC
403 /* pass on to the driver specific version of this function
404 if it is available */
f34d7a5b
AC
405 if (port->serial->type->break_ctl) {
406 lock_kernel();
95da310e 407 port->serial->type->break_ctl(tty, break_state);
f34d7a5b
AC
408 unlock_kernel();
409 }
9e98966c 410 return 0;
1da177e4
LT
411}
412
a8d6f0a9
AC
413static int serial_read_proc(char *page, char **start, off_t off, int count,
414 int *eof, void *data)
1da177e4
LT
415{
416 struct usb_serial *serial;
417 int length = 0;
418 int i;
419 off_t begin = 0;
420 char tmp[40];
421
441b62c1 422 dbg("%s", __func__);
a8d6f0a9 423 length += sprintf(page, "usbserinfo:1.0 driver:2.0\n");
1da177e4
LT
424 for (i = 0; i < SERIAL_TTY_MINORS && length < PAGE_SIZE; ++i) {
425 serial = usb_serial_get_by_index(i);
426 if (serial == NULL)
427 continue;
428
a8d6f0a9 429 length += sprintf(page+length, "%d:", i);
18fcac35 430 if (serial->type->driver.owner)
a8d6f0a9
AC
431 length += sprintf(page+length, " module:%s",
432 module_name(serial->type->driver.owner));
433 length += sprintf(page+length, " name:\"%s\"",
434 serial->type->description);
435 length += sprintf(page+length, " vendor:%04x product:%04x",
436 le16_to_cpu(serial->dev->descriptor.idVendor),
437 le16_to_cpu(serial->dev->descriptor.idProduct));
438 length += sprintf(page+length, " num_ports:%d",
439 serial->num_ports);
440 length += sprintf(page+length, " port:%d",
441 i - serial->minor + 1);
1da177e4 442 usb_make_path(serial->dev, tmp, sizeof(tmp));
a8d6f0a9
AC
443 length += sprintf(page+length, " path:%s", tmp);
444
445 length += sprintf(page+length, "\n");
59925838
MU
446 if ((length + begin) > (off + count)) {
447 usb_serial_put(serial);
1da177e4 448 goto done;
59925838 449 }
1da177e4
LT
450 if ((length + begin) < off) {
451 begin += length;
452 length = 0;
453 }
73e487fd 454 usb_serial_put(serial);
1da177e4
LT
455 }
456 *eof = 1;
457done:
458 if (off >= (length + begin))
459 return 0;
460 *start = page + (off-begin);
a8d6f0a9 461 return (count < begin+length-off) ? count : begin+length-off;
1da177e4
LT
462}
463
a8d6f0a9 464static int serial_tiocmget(struct tty_struct *tty, struct file *file)
1da177e4 465{
81671ddb 466 struct usb_serial_port *port = tty->driver_data;
1da177e4 467
441b62c1 468 dbg("%s - port %d", __func__, port->number);
1da177e4 469
95da310e 470 WARN_ON(!port->port.count);
1da177e4 471 if (port->serial->type->tiocmget)
95da310e 472 return port->serial->type->tiocmget(tty, file);
1da177e4
LT
473 return -EINVAL;
474}
475
a8d6f0a9 476static int serial_tiocmset(struct tty_struct *tty, struct file *file,
1da177e4
LT
477 unsigned int set, unsigned int clear)
478{
81671ddb 479 struct usb_serial_port *port = tty->driver_data;
1da177e4 480
441b62c1 481 dbg("%s - port %d", __func__, port->number);
1da177e4 482
95da310e 483 WARN_ON(!port->port.count);
1da177e4 484 if (port->serial->type->tiocmset)
95da310e 485 return port->serial->type->tiocmset(tty, file, set, clear);
1da177e4
LT
486 return -EINVAL;
487}
488
cf2c7481
PZ
489/*
490 * We would be calling tty_wakeup here, but unfortunately some line
491 * disciplines have an annoying habit of calling tty->write from
492 * the write wakeup callback (e.g. n_hdlc.c).
493 */
494void usb_serial_port_softint(struct usb_serial_port *port)
495{
496 schedule_work(&port->work);
497}
a8d6f0a9 498EXPORT_SYMBOL_GPL(usb_serial_port_softint);
cf2c7481 499
c4028958 500static void usb_serial_port_work(struct work_struct *work)
1da177e4 501{
c4028958
DH
502 struct usb_serial_port *port =
503 container_of(work, struct usb_serial_port, work);
1da177e4
LT
504 struct tty_struct *tty;
505
441b62c1 506 dbg("%s - port %d", __func__, port->number);
a8d6f0a9 507
1da177e4
LT
508 if (!port)
509 return;
510
95da310e 511 tty = port->port.tty;
1da177e4
LT
512 if (!tty)
513 return;
514
515 tty_wakeup(tty);
516}
517
518static void port_release(struct device *dev)
519{
520 struct usb_serial_port *port = to_usb_serial_port(dev);
521
7071a3ce 522 dbg ("%s - %s", __func__, dev_name(dev));
34f8e761
PZ
523 port_free(port);
524}
525
34ef50e5 526static void kill_traffic(struct usb_serial_port *port)
34f8e761 527{
1da177e4 528 usb_kill_urb(port->read_urb);
1da177e4 529 usb_kill_urb(port->write_urb);
5adceac5
ON
530 /*
531 * This is tricky.
532 * Some drivers submit the read_urb in the
533 * handler for the write_urb or vice versa
534 * this order determines the order in which
535 * usb_kill_urb() must be used to reliably
536 * kill the URBs. As it is unknown here,
537 * both orders must be used in turn.
538 * The call below is not redundant.
539 */
540 usb_kill_urb(port->read_urb);
1da177e4 541 usb_kill_urb(port->interrupt_in_urb);
1da177e4 542 usb_kill_urb(port->interrupt_out_urb);
34ef50e5
ON
543}
544
545static void port_free(struct usb_serial_port *port)
546{
547 kill_traffic(port);
548 usb_free_urb(port->read_urb);
549 usb_free_urb(port->write_urb);
550 usb_free_urb(port->interrupt_in_urb);
1da177e4
LT
551 usb_free_urb(port->interrupt_out_urb);
552 kfree(port->bulk_in_buffer);
553 kfree(port->bulk_out_buffer);
554 kfree(port->interrupt_in_buffer);
555 kfree(port->interrupt_out_buffer);
34f8e761 556 flush_scheduled_work(); /* port->work */
1da177e4
LT
557 kfree(port);
558}
559
a8d6f0a9
AC
560static struct usb_serial *create_serial(struct usb_device *dev,
561 struct usb_interface *interface,
562 struct usb_serial_driver *driver)
1da177e4
LT
563{
564 struct usb_serial *serial;
565
80b6ca48 566 serial = kzalloc(sizeof(*serial), GFP_KERNEL);
1da177e4 567 if (!serial) {
441b62c1 568 dev_err(&dev->dev, "%s - out of memory\n", __func__);
1da177e4
LT
569 return NULL;
570 }
1da177e4 571 serial->dev = usb_get_dev(dev);
ea65370d 572 serial->type = driver;
1da177e4
LT
573 serial->interface = interface;
574 kref_init(&serial->kref);
a1cd7e99 575 mutex_init(&serial->disc_mutex);
0282b7f2 576 serial->minor = SERIAL_TTY_NO_MINOR;
1da177e4
LT
577
578 return serial;
579}
580
93bacefc 581static const struct usb_device_id *match_dynamic_id(struct usb_interface *intf,
a8d6f0a9 582 struct usb_serial_driver *drv)
93bacefc
GKH
583{
584 struct usb_dynid *dynid;
585
586 spin_lock(&drv->dynids.lock);
587 list_for_each_entry(dynid, &drv->dynids.list, node) {
588 if (usb_match_one_id(intf, &dynid->id)) {
589 spin_unlock(&drv->dynids.lock);
590 return &dynid->id;
591 }
592 }
593 spin_unlock(&drv->dynids.lock);
594 return NULL;
595}
596
597static const struct usb_device_id *get_iface_id(struct usb_serial_driver *drv,
598 struct usb_interface *intf)
599{
600 const struct usb_device_id *id;
601
602 id = usb_match_id(intf, drv->id_table);
603 if (id) {
604 dbg("static descriptor matches");
605 goto exit;
606 }
607 id = match_dynamic_id(intf, drv);
608 if (id)
609 dbg("dynamic descriptor matches");
610exit:
611 return id;
612}
613
a8d6f0a9
AC
614static struct usb_serial_driver *search_serial_device(
615 struct usb_interface *iface)
1da177e4 616{
1da177e4 617 const struct usb_device_id *id;
063a2da8 618 struct usb_serial_driver *drv;
1da177e4 619
93b1fae4 620 /* Check if the usb id matches a known device */
063a2da8
AS
621 list_for_each_entry(drv, &usb_serial_driver_list, driver_list) {
622 id = get_iface_id(drv, iface);
93bacefc 623 if (id)
063a2da8 624 return drv;
1da177e4
LT
625 }
626
627 return NULL;
628}
629
630int usb_serial_probe(struct usb_interface *interface,
631 const struct usb_device_id *id)
632{
a8d6f0a9 633 struct usb_device *dev = interface_to_usbdev(interface);
1da177e4
LT
634 struct usb_serial *serial = NULL;
635 struct usb_serial_port *port;
636 struct usb_host_interface *iface_desc;
637 struct usb_endpoint_descriptor *endpoint;
638 struct usb_endpoint_descriptor *interrupt_in_endpoint[MAX_NUM_PORTS];
639 struct usb_endpoint_descriptor *interrupt_out_endpoint[MAX_NUM_PORTS];
640 struct usb_endpoint_descriptor *bulk_in_endpoint[MAX_NUM_PORTS];
641 struct usb_endpoint_descriptor *bulk_out_endpoint[MAX_NUM_PORTS];
ea65370d 642 struct usb_serial_driver *type = NULL;
1da177e4 643 int retval;
dd9ca5d9 644 unsigned int minor;
1da177e4
LT
645 int buffer_size;
646 int i;
647 int num_interrupt_in = 0;
648 int num_interrupt_out = 0;
649 int num_bulk_in = 0;
650 int num_bulk_out = 0;
651 int num_ports = 0;
652 int max_endpoints;
653
4b10f0f3 654 lock_kernel(); /* guard against unloading a serial driver module */
1da177e4
LT
655 type = search_serial_device(interface);
656 if (!type) {
4b10f0f3 657 unlock_kernel();
1da177e4
LT
658 dbg("none matched");
659 return -ENODEV;
660 }
661
a8d6f0a9 662 serial = create_serial(dev, interface, type);
1da177e4 663 if (!serial) {
4b10f0f3 664 unlock_kernel();
441b62c1 665 dev_err(&interface->dev, "%s - out of memory\n", __func__);
1da177e4
LT
666 return -ENOMEM;
667 }
668
669 /* if this device type has a probe function, call it */
670 if (type->probe) {
671 const struct usb_device_id *id;
672
18fcac35 673 if (!try_module_get(type->driver.owner)) {
4b10f0f3 674 unlock_kernel();
a8d6f0a9
AC
675 dev_err(&interface->dev,
676 "module get failed, exiting\n");
677 kfree(serial);
1da177e4
LT
678 return -EIO;
679 }
680
93bacefc 681 id = get_iface_id(type, interface);
1da177e4 682 retval = type->probe(serial, id);
18fcac35 683 module_put(type->driver.owner);
1da177e4
LT
684
685 if (retval) {
4b10f0f3 686 unlock_kernel();
a8d6f0a9
AC
687 dbg("sub driver rejected device");
688 kfree(serial);
1da177e4
LT
689 return retval;
690 }
691 }
692
693 /* descriptor matches, let's find the endpoints needed */
694 /* check out the endpoints */
695 iface_desc = interface->cur_altsetting;
696 for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
697 endpoint = &iface_desc->endpoint[i].desc;
4fa1bbf5
LFC
698
699 if (usb_endpoint_is_bulk_in(endpoint)) {
1da177e4
LT
700 /* we found a bulk in endpoint */
701 dbg("found bulk in on endpoint %d", i);
702 bulk_in_endpoint[num_bulk_in] = endpoint;
703 ++num_bulk_in;
704 }
705
4fa1bbf5 706 if (usb_endpoint_is_bulk_out(endpoint)) {
1da177e4
LT
707 /* we found a bulk out endpoint */
708 dbg("found bulk out on endpoint %d", i);
709 bulk_out_endpoint[num_bulk_out] = endpoint;
710 ++num_bulk_out;
711 }
4fa1bbf5
LFC
712
713 if (usb_endpoint_is_int_in(endpoint)) {
1da177e4
LT
714 /* we found a interrupt in endpoint */
715 dbg("found interrupt in on endpoint %d", i);
716 interrupt_in_endpoint[num_interrupt_in] = endpoint;
717 ++num_interrupt_in;
718 }
719
4fa1bbf5 720 if (usb_endpoint_is_int_out(endpoint)) {
1da177e4
LT
721 /* we found an interrupt out endpoint */
722 dbg("found interrupt out on endpoint %d", i);
723 interrupt_out_endpoint[num_interrupt_out] = endpoint;
724 ++num_interrupt_out;
725 }
726 }
727
728#if defined(CONFIG_USB_SERIAL_PL2303) || defined(CONFIG_USB_SERIAL_PL2303_MODULE)
a8d6f0a9 729 /* BEGIN HORRIBLE HACK FOR PL2303 */
1da177e4
LT
730 /* this is needed due to the looney way its endpoints are set up */
731 if (((le16_to_cpu(dev->descriptor.idVendor) == PL2303_VENDOR_ID) &&
732 (le16_to_cpu(dev->descriptor.idProduct) == PL2303_PRODUCT_ID)) ||
733 ((le16_to_cpu(dev->descriptor.idVendor) == ATEN_VENDOR_ID) &&
8fd80133
JS
734 (le16_to_cpu(dev->descriptor.idProduct) == ATEN_PRODUCT_ID)) ||
735 ((le16_to_cpu(dev->descriptor.idVendor) == ALCOR_VENDOR_ID) &&
ce816cf9
AB
736 (le16_to_cpu(dev->descriptor.idProduct) == ALCOR_PRODUCT_ID)) ||
737 ((le16_to_cpu(dev->descriptor.idVendor) == SIEMENS_VENDOR_ID) &&
738 (le16_to_cpu(dev->descriptor.idProduct) == SIEMENS_PRODUCT_ID_EF81))) {
1da177e4
LT
739 if (interface != dev->actconfig->interface[0]) {
740 /* check out the endpoints of the other interface*/
741 iface_desc = dev->actconfig->interface[0]->cur_altsetting;
742 for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
743 endpoint = &iface_desc->endpoint[i].desc;
4fa1bbf5 744 if (usb_endpoint_is_int_in(endpoint)) {
1da177e4
LT
745 /* we found a interrupt in endpoint */
746 dbg("found interrupt in for Prolific device on separate interface");
747 interrupt_in_endpoint[num_interrupt_in] = endpoint;
748 ++num_interrupt_in;
749 }
750 }
751 }
752
753 /* Now make sure the PL-2303 is configured correctly.
754 * If not, give up now and hope this hack will work
755 * properly during a later invocation of usb_serial_probe
756 */
757 if (num_bulk_in == 0 || num_bulk_out == 0) {
4b10f0f3 758 unlock_kernel();
1da177e4 759 dev_info(&interface->dev, "PL-2303 hack: descriptors matched but endpoints did not\n");
a8d6f0a9 760 kfree(serial);
1da177e4
LT
761 return -ENODEV;
762 }
763 }
764 /* END HORRIBLE HACK FOR PL2303 */
765#endif
766
1da177e4
LT
767#ifdef CONFIG_USB_SERIAL_GENERIC
768 if (type == &usb_serial_generic_device) {
769 num_ports = num_bulk_out;
770 if (num_ports == 0) {
4b10f0f3 771 unlock_kernel();
a8d6f0a9
AC
772 dev_err(&interface->dev,
773 "Generic device with no bulk out, not allowed.\n");
774 kfree(serial);
1da177e4
LT
775 return -EIO;
776 }
777 }
778#endif
779 if (!num_ports) {
780 /* if this device type has a calc_num_ports function, call it */
781 if (type->calc_num_ports) {
18fcac35 782 if (!try_module_get(type->driver.owner)) {
4b10f0f3 783 unlock_kernel();
a8d6f0a9
AC
784 dev_err(&interface->dev,
785 "module get failed, exiting\n");
786 kfree(serial);
1da177e4
LT
787 return -EIO;
788 }
a8d6f0a9 789 num_ports = type->calc_num_ports(serial);
18fcac35 790 module_put(type->driver.owner);
1da177e4
LT
791 }
792 if (!num_ports)
793 num_ports = type->num_ports;
794 }
795
1da177e4
LT
796 serial->num_ports = num_ports;
797 serial->num_bulk_in = num_bulk_in;
798 serial->num_bulk_out = num_bulk_out;
799 serial->num_interrupt_in = num_interrupt_in;
800 serial->num_interrupt_out = num_interrupt_out;
801
063a2da8
AS
802 /* found all that we need */
803 dev_info(&interface->dev, "%s converter detected\n",
804 type->description);
805
1da177e4 806 /* create our ports, we need as many as the max endpoints */
a8d6f0a9
AC
807 /* we don't use num_ports here because some devices have more
808 endpoint pairs than ports */
1da177e4
LT
809 max_endpoints = max(num_bulk_in, num_bulk_out);
810 max_endpoints = max(max_endpoints, num_interrupt_in);
811 max_endpoints = max(max_endpoints, num_interrupt_out);
812 max_endpoints = max(max_endpoints, (int)serial->num_ports);
813 serial->num_port_pointers = max_endpoints;
4b10f0f3
ON
814 unlock_kernel();
815
a8d6f0a9
AC
816 dbg("%s - setting up %d port structures for this device",
817 __func__, max_endpoints);
1da177e4 818 for (i = 0; i < max_endpoints; ++i) {
80b6ca48 819 port = kzalloc(sizeof(struct usb_serial_port), GFP_KERNEL);
1da177e4
LT
820 if (!port)
821 goto probe_error;
1da177e4 822 port->serial = serial;
507ca9bc 823 spin_lock_init(&port->lock);
1ce7dd26 824 mutex_init(&port->mutex);
c4028958 825 INIT_WORK(&port->work, usb_serial_port_work);
1da177e4
LT
826 serial->port[i] = port;
827 }
828
829 /* set up the endpoint information */
830 for (i = 0; i < num_bulk_in; ++i) {
831 endpoint = bulk_in_endpoint[i];
832 port = serial->port[i];
a8d6f0a9 833 port->read_urb = usb_alloc_urb(0, GFP_KERNEL);
1da177e4
LT
834 if (!port->read_urb) {
835 dev_err(&interface->dev, "No free urbs available\n");
836 goto probe_error;
837 }
838 buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
839 port->bulk_in_size = buffer_size;
840 port->bulk_in_endpointAddress = endpoint->bEndpointAddress;
a8d6f0a9 841 port->bulk_in_buffer = kmalloc(buffer_size, GFP_KERNEL);
1da177e4 842 if (!port->bulk_in_buffer) {
a8d6f0a9
AC
843 dev_err(&interface->dev,
844 "Couldn't allocate bulk_in_buffer\n");
1da177e4
LT
845 goto probe_error;
846 }
a8d6f0a9
AC
847 usb_fill_bulk_urb(port->read_urb, dev,
848 usb_rcvbulkpipe(dev,
849 endpoint->bEndpointAddress),
850 port->bulk_in_buffer, buffer_size,
851 serial->type->read_bulk_callback, port);
1da177e4
LT
852 }
853
854 for (i = 0; i < num_bulk_out; ++i) {
855 endpoint = bulk_out_endpoint[i];
856 port = serial->port[i];
857 port->write_urb = usb_alloc_urb(0, GFP_KERNEL);
858 if (!port->write_urb) {
859 dev_err(&interface->dev, "No free urbs available\n");
860 goto probe_error;
861 }
862 buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
863 port->bulk_out_size = buffer_size;
864 port->bulk_out_endpointAddress = endpoint->bEndpointAddress;
a8d6f0a9 865 port->bulk_out_buffer = kmalloc(buffer_size, GFP_KERNEL);
1da177e4 866 if (!port->bulk_out_buffer) {
a8d6f0a9
AC
867 dev_err(&interface->dev,
868 "Couldn't allocate bulk_out_buffer\n");
1da177e4
LT
869 goto probe_error;
870 }
a8d6f0a9
AC
871 usb_fill_bulk_urb(port->write_urb, dev,
872 usb_sndbulkpipe(dev,
873 endpoint->bEndpointAddress),
874 port->bulk_out_buffer, buffer_size,
875 serial->type->write_bulk_callback, port);
1da177e4
LT
876 }
877
878 if (serial->type->read_int_callback) {
879 for (i = 0; i < num_interrupt_in; ++i) {
880 endpoint = interrupt_in_endpoint[i];
881 port = serial->port[i];
882 port->interrupt_in_urb = usb_alloc_urb(0, GFP_KERNEL);
883 if (!port->interrupt_in_urb) {
a8d6f0a9
AC
884 dev_err(&interface->dev,
885 "No free urbs available\n");
1da177e4
LT
886 goto probe_error;
887 }
888 buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
a8d6f0a9
AC
889 port->interrupt_in_endpointAddress =
890 endpoint->bEndpointAddress;
891 port->interrupt_in_buffer = kmalloc(buffer_size,
892 GFP_KERNEL);
1da177e4 893 if (!port->interrupt_in_buffer) {
a8d6f0a9
AC
894 dev_err(&interface->dev,
895 "Couldn't allocate interrupt_in_buffer\n");
1da177e4
LT
896 goto probe_error;
897 }
a8d6f0a9
AC
898 usb_fill_int_urb(port->interrupt_in_urb, dev,
899 usb_rcvintpipe(dev,
900 endpoint->bEndpointAddress),
901 port->interrupt_in_buffer, buffer_size,
902 serial->type->read_int_callback, port,
903 endpoint->bInterval);
1da177e4
LT
904 }
905 } else if (num_interrupt_in) {
906 dbg("the device claims to support interrupt in transfers, but read_int_callback is not defined");
907 }
a8d6f0a9 908
1da177e4
LT
909 if (serial->type->write_int_callback) {
910 for (i = 0; i < num_interrupt_out; ++i) {
911 endpoint = interrupt_out_endpoint[i];
912 port = serial->port[i];
913 port->interrupt_out_urb = usb_alloc_urb(0, GFP_KERNEL);
914 if (!port->interrupt_out_urb) {
a8d6f0a9
AC
915 dev_err(&interface->dev,
916 "No free urbs available\n");
1da177e4
LT
917 goto probe_error;
918 }
919 buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
920 port->interrupt_out_size = buffer_size;
a8d6f0a9
AC
921 port->interrupt_out_endpointAddress =
922 endpoint->bEndpointAddress;
923 port->interrupt_out_buffer = kmalloc(buffer_size,
924 GFP_KERNEL);
1da177e4 925 if (!port->interrupt_out_buffer) {
a8d6f0a9
AC
926 dev_err(&interface->dev,
927 "Couldn't allocate interrupt_out_buffer\n");
1da177e4
LT
928 goto probe_error;
929 }
a8d6f0a9
AC
930 usb_fill_int_urb(port->interrupt_out_urb, dev,
931 usb_sndintpipe(dev,
932 endpoint->bEndpointAddress),
933 port->interrupt_out_buffer, buffer_size,
934 serial->type->write_int_callback, port,
935 endpoint->bInterval);
1da177e4
LT
936 }
937 } else if (num_interrupt_out) {
938 dbg("the device claims to support interrupt out transfers, but write_int_callback is not defined");
939 }
a8d6f0a9 940
1da177e4
LT
941 /* if this device type has an attach function, call it */
942 if (type->attach) {
18fcac35 943 if (!try_module_get(type->driver.owner)) {
a8d6f0a9
AC
944 dev_err(&interface->dev,
945 "module get failed, exiting\n");
1da177e4
LT
946 goto probe_error;
947 }
a8d6f0a9 948 retval = type->attach(serial);
18fcac35 949 module_put(type->driver.owner);
1da177e4
LT
950 if (retval < 0)
951 goto probe_error;
952 if (retval > 0) {
a8d6f0a9
AC
953 /* quietly accept this device, but don't bind to a
954 serial port as it's about to disappear */
1da177e4
LT
955 goto exit;
956 }
957 }
958
a8d6f0a9 959 if (get_free_serial(serial, num_ports, &minor) == NULL) {
34ef50e5
ON
960 dev_err(&interface->dev, "No more free serial devices\n");
961 goto probe_error;
962 }
c744f99e 963 serial->minor = minor;
34ef50e5 964
1da177e4
LT
965 /* register all of the individual ports with the driver core */
966 for (i = 0; i < num_ports; ++i) {
967 port = serial->port[i];
968 port->dev.parent = &interface->dev;
969 port->dev.driver = NULL;
970 port->dev.bus = &usb_serial_bus_type;
971 port->dev.release = &port_release;
972
0031a06e 973 dev_set_name(&port->dev, "ttyUSB%d", port->number);
7071a3ce 974 dbg ("%s - registering %s", __func__, dev_name(&port->dev));
13f4db9e
GKH
975 retval = device_register(&port->dev);
976 if (retval)
977 dev_err(&port->dev, "Error registering port device, "
978 "continuing\n");
1da177e4
LT
979 }
980
a8d6f0a9 981 usb_serial_console_init(debug, minor);
1da177e4
LT
982
983exit:
984 /* success */
a8d6f0a9 985 usb_set_intfdata(interface, serial);
1da177e4
LT
986 return 0;
987
988probe_error:
989 for (i = 0; i < num_bulk_in; ++i) {
990 port = serial->port[i];
991 if (!port)
992 continue;
95d43166 993 usb_free_urb(port->read_urb);
1da177e4
LT
994 kfree(port->bulk_in_buffer);
995 }
996 for (i = 0; i < num_bulk_out; ++i) {
997 port = serial->port[i];
998 if (!port)
999 continue;
95d43166 1000 usb_free_urb(port->write_urb);
1da177e4
LT
1001 kfree(port->bulk_out_buffer);
1002 }
1003 for (i = 0; i < num_interrupt_in; ++i) {
1004 port = serial->port[i];
1005 if (!port)
1006 continue;
95d43166 1007 usb_free_urb(port->interrupt_in_urb);
1da177e4
LT
1008 kfree(port->interrupt_in_buffer);
1009 }
1010 for (i = 0; i < num_interrupt_out; ++i) {
1011 port = serial->port[i];
1012 if (!port)
1013 continue;
95d43166 1014 usb_free_urb(port->interrupt_out_urb);
1da177e4
LT
1015 kfree(port->interrupt_out_buffer);
1016 }
1017
1da177e4
LT
1018 /* free up any memory that we allocated */
1019 for (i = 0; i < serial->num_port_pointers; ++i)
1020 kfree(serial->port[i]);
a8d6f0a9 1021 kfree(serial);
1da177e4
LT
1022 return -EIO;
1023}
a8d6f0a9 1024EXPORT_SYMBOL_GPL(usb_serial_probe);
1da177e4
LT
1025
1026void usb_serial_disconnect(struct usb_interface *interface)
1027{
1028 int i;
a8d6f0a9 1029 struct usb_serial *serial = usb_get_intfdata(interface);
1da177e4
LT
1030 struct device *dev = &interface->dev;
1031 struct usb_serial_port *port;
1032
73e487fd 1033 usb_serial_console_disconnect(serial);
a8d6f0a9 1034 dbg("%s", __func__);
1da177e4 1035
a1cd7e99 1036 mutex_lock(&serial->disc_mutex);
a8d6f0a9 1037 usb_set_intfdata(interface, NULL);
a1cd7e99
ON
1038 /* must set a flag, to signal subdrivers */
1039 serial->disconnected = 1;
1040 for (i = 0; i < serial->num_ports; ++i) {
1041 port = serial->port[i];
1042 if (port) {
95da310e
AC
1043 if (port->port.tty)
1044 tty_hangup(port->port.tty);
a1cd7e99 1045 kill_traffic(port);
1da177e4 1046 }
1da177e4 1047 }
a1cd7e99
ON
1048 /* let the last holder of this object
1049 * cause it to be cleaned up */
1050 mutex_unlock(&serial->disc_mutex);
1051 usb_serial_put(serial);
1da177e4
LT
1052 dev_info(dev, "device disconnected\n");
1053}
a8d6f0a9 1054EXPORT_SYMBOL_GPL(usb_serial_disconnect);
1da177e4 1055
ec22559e
ON
1056int usb_serial_suspend(struct usb_interface *intf, pm_message_t message)
1057{
1058 struct usb_serial *serial = usb_get_intfdata(intf);
1059 struct usb_serial_port *port;
1060 int i, r = 0;
1061
e31c1880
ON
1062 for (i = 0; i < serial->num_ports; ++i) {
1063 port = serial->port[i];
1064 if (port)
1065 kill_traffic(port);
ec22559e
ON
1066 }
1067
1068 if (serial->type->suspend)
e31c1880 1069 r = serial->type->suspend(serial, message);
ec22559e
ON
1070
1071 return r;
1072}
1073EXPORT_SYMBOL(usb_serial_suspend);
1074
1075int usb_serial_resume(struct usb_interface *intf)
1076{
1077 struct usb_serial *serial = usb_get_intfdata(intf);
1078
8abaee23
SS
1079 if (serial->type->resume)
1080 return serial->type->resume(serial);
1081 return 0;
ec22559e
ON
1082}
1083EXPORT_SYMBOL(usb_serial_resume);
1084
b68e31d0 1085static const struct tty_operations serial_ops = {
1da177e4
LT
1086 .open = serial_open,
1087 .close = serial_close,
1088 .write = serial_write,
1089 .write_room = serial_write_room,
1090 .ioctl = serial_ioctl,
1091 .set_termios = serial_set_termios,
1092 .throttle = serial_throttle,
1093 .unthrottle = serial_unthrottle,
1094 .break_ctl = serial_break,
1095 .chars_in_buffer = serial_chars_in_buffer,
1096 .read_proc = serial_read_proc,
1097 .tiocmget = serial_tiocmget,
1098 .tiocmset = serial_tiocmset,
1099};
1100
1101struct tty_driver *usb_serial_tty_driver;
1102
1103static int __init usb_serial_init(void)
1104{
1105 int i;
1106 int result;
1107
1108 usb_serial_tty_driver = alloc_tty_driver(SERIAL_TTY_MINORS);
1109 if (!usb_serial_tty_driver)
1110 return -ENOMEM;
1111
1112 /* Initialize our global data */
a8d6f0a9 1113 for (i = 0; i < SERIAL_TTY_MINORS; ++i)
1da177e4 1114 serial_table[i] = NULL;
1da177e4
LT
1115
1116 result = bus_register(&usb_serial_bus_type);
1117 if (result) {
441b62c1 1118 err("%s - registering bus driver failed", __func__);
1da177e4
LT
1119 goto exit_bus;
1120 }
1121
1da177e4
LT
1122 usb_serial_tty_driver->owner = THIS_MODULE;
1123 usb_serial_tty_driver->driver_name = "usbserial";
1da177e4
LT
1124 usb_serial_tty_driver->name = "ttyUSB";
1125 usb_serial_tty_driver->major = SERIAL_TTY_MAJOR;
1126 usb_serial_tty_driver->minor_start = 0;
1127 usb_serial_tty_driver->type = TTY_DRIVER_TYPE_SERIAL;
1128 usb_serial_tty_driver->subtype = SERIAL_TYPE_NORMAL;
a8d6f0a9
AC
1129 usb_serial_tty_driver->flags = TTY_DRIVER_REAL_RAW |
1130 TTY_DRIVER_DYNAMIC_DEV;
1da177e4 1131 usb_serial_tty_driver->init_termios = tty_std_termios;
a8d6f0a9
AC
1132 usb_serial_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD
1133 | HUPCL | CLOCAL;
a5b6f60c
AC
1134 usb_serial_tty_driver->init_termios.c_ispeed = 9600;
1135 usb_serial_tty_driver->init_termios.c_ospeed = 9600;
1da177e4
LT
1136 tty_set_operations(usb_serial_tty_driver, &serial_ops);
1137 result = tty_register_driver(usb_serial_tty_driver);
1138 if (result) {
441b62c1 1139 err("%s - tty_register_driver failed", __func__);
1da177e4
LT
1140 goto exit_reg_driver;
1141 }
1142
1143 /* register the USB driver */
1144 result = usb_register(&usb_serial_driver);
1145 if (result < 0) {
441b62c1 1146 err("%s - usb_register failed", __func__);
1da177e4
LT
1147 goto exit_tty;
1148 }
1149
06299db3
GKH
1150 /* register the generic driver, if we should */
1151 result = usb_serial_generic_register(debug);
1152 if (result < 0) {
441b62c1 1153 err("%s - registering generic driver failed", __func__);
06299db3
GKH
1154 goto exit_generic;
1155 }
1156
17a882fc 1157 info(DRIVER_DESC);
1da177e4
LT
1158
1159 return result;
1160
06299db3
GKH
1161exit_generic:
1162 usb_deregister(&usb_serial_driver);
1163
1da177e4
LT
1164exit_tty:
1165 tty_unregister_driver(usb_serial_tty_driver);
1166
1167exit_reg_driver:
1da177e4
LT
1168 bus_unregister(&usb_serial_bus_type);
1169
1170exit_bus:
a8d6f0a9 1171 err("%s - returning with error %d", __func__, result);
1da177e4
LT
1172 put_tty_driver(usb_serial_tty_driver);
1173 return result;
1174}
1175
1176
1177static void __exit usb_serial_exit(void)
1178{
1179 usb_serial_console_exit();
1180
1181 usb_serial_generic_deregister();
1182
1183 usb_deregister(&usb_serial_driver);
1184 tty_unregister_driver(usb_serial_tty_driver);
1185 put_tty_driver(usb_serial_tty_driver);
1186 bus_unregister(&usb_serial_bus_type);
1187}
1188
1189
1190module_init(usb_serial_init);
1191module_exit(usb_serial_exit);
1192
1193#define set_to_generic_if_null(type, function) \
1194 do { \
1195 if (!type->function) { \
1196 type->function = usb_serial_generic_##function; \
1197 dbg("Had to override the " #function \
a8d6f0a9 1198 " usb serial operation with the generic one.");\
1da177e4
LT
1199 } \
1200 } while (0)
1201
ea65370d 1202static void fixup_generic(struct usb_serial_driver *device)
1da177e4
LT
1203{
1204 set_to_generic_if_null(device, open);
1205 set_to_generic_if_null(device, write);
1206 set_to_generic_if_null(device, close);
1207 set_to_generic_if_null(device, write_room);
1208 set_to_generic_if_null(device, chars_in_buffer);
1209 set_to_generic_if_null(device, read_bulk_callback);
1210 set_to_generic_if_null(device, write_bulk_callback);
1211 set_to_generic_if_null(device, shutdown);
f0fbd5b9 1212 set_to_generic_if_null(device, resume);
1da177e4
LT
1213}
1214
a8d6f0a9 1215int usb_serial_register(struct usb_serial_driver *driver)
1da177e4 1216{
a8d6f0a9 1217 /* must be called with BKL held */
1da177e4
LT
1218 int retval;
1219
ea65370d 1220 fixup_generic(driver);
1da177e4 1221
269bda1c
GKH
1222 if (!driver->description)
1223 driver->description = driver->driver.name;
1224
1da177e4 1225 /* Add this device to our list of devices */
ea65370d 1226 list_add(&driver->driver_list, &usb_serial_driver_list);
1da177e4 1227
ea65370d 1228 retval = usb_serial_bus_register(driver);
1da177e4 1229 if (retval) {
a8d6f0a9
AC
1230 err("problem %d when registering driver %s",
1231 retval, driver->description);
ea65370d 1232 list_del(&driver->driver_list);
a8d6f0a9
AC
1233 } else
1234 info("USB Serial support registered for %s",
1235 driver->description);
1da177e4
LT
1236
1237 return retval;
1238}
a8d6f0a9 1239EXPORT_SYMBOL_GPL(usb_serial_register);
1da177e4
LT
1240
1241
a8d6f0a9 1242void usb_serial_deregister(struct usb_serial_driver *device)
1da177e4 1243{
a8d6f0a9 1244 /* must be called with BKL held */
269bda1c 1245 info("USB Serial deregistering driver %s", device->description);
1da177e4
LT
1246 list_del(&device->driver_list);
1247 usb_serial_bus_deregister(device);
1248}
1da177e4 1249EXPORT_SYMBOL_GPL(usb_serial_deregister);
1da177e4
LT
1250
1251/* Module information */
a8d6f0a9
AC
1252MODULE_AUTHOR(DRIVER_AUTHOR);
1253MODULE_DESCRIPTION(DRIVER_DESC);
1da177e4
LT
1254MODULE_LICENSE("GPL");
1255
1256module_param(debug, bool, S_IRUGO | S_IWUSR);
1257MODULE_PARM_DESC(debug, "Debug enabled or not");
This page took 1.058654 seconds and 5 git commands to generate.