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