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