option.c revision 7d12e780e003f93433d49ce78cfedf4b4c52adc5
1/* 2 USB Driver for GSM modems 3 4 Copyright (C) 2005 Matthias Urlichs <smurf@smurf.noris.de> 5 6 This driver is free software; you can redistribute it and/or modify 7 it under the terms of Version 2 of the GNU General Public License as 8 published by the Free Software Foundation. 9 10 Portions copied from the Keyspan driver by Hugh Blemings <hugh@blemings.org> 11 12 History: see the git log. 13 14 Work sponsored by: Sigos GmbH, Germany <info@sigos.de> 15 16 This driver exists because the "normal" serial driver doesn't work too well 17 with GSM modems. Issues: 18 - data loss -- one single Receive URB is not nearly enough 19 - nonstandard flow (Option devices) control 20 - controlling the baud rate doesn't make sense 21 22 This driver is named "option" because the most common device it's 23 used for is a PC-Card (with an internal OHCI-USB interface, behind 24 which the GSM interface sits), made by Option Inc. 25 26 Some of the "one port" devices actually exhibit multiple USB instances 27 on the USB bus. This is not a bug, these ports are used for different 28 device features. 29*/ 30 31#define DRIVER_VERSION "v0.7.1" 32#define DRIVER_AUTHOR "Matthias Urlichs <smurf@smurf.noris.de>" 33#define DRIVER_DESC "USB Driver for GSM modems" 34 35#include <linux/kernel.h> 36#include <linux/jiffies.h> 37#include <linux/errno.h> 38#include <linux/tty.h> 39#include <linux/tty_flip.h> 40#include <linux/module.h> 41#include <linux/usb.h> 42#include <linux/usb/serial.h> 43 44/* Function prototypes */ 45static int option_open(struct usb_serial_port *port, struct file *filp); 46static void option_close(struct usb_serial_port *port, struct file *filp); 47static int option_startup(struct usb_serial *serial); 48static void option_shutdown(struct usb_serial *serial); 49static void option_rx_throttle(struct usb_serial_port *port); 50static void option_rx_unthrottle(struct usb_serial_port *port); 51static int option_write_room(struct usb_serial_port *port); 52 53static void option_instat_callback(struct urb *urb); 54 55static int option_write(struct usb_serial_port *port, 56 const unsigned char *buf, int count); 57 58static int option_chars_in_buffer(struct usb_serial_port *port); 59static int option_ioctl(struct usb_serial_port *port, struct file *file, 60 unsigned int cmd, unsigned long arg); 61static void option_set_termios(struct usb_serial_port *port, 62 struct termios *old); 63static void option_break_ctl(struct usb_serial_port *port, int break_state); 64static int option_tiocmget(struct usb_serial_port *port, struct file *file); 65static int option_tiocmset(struct usb_serial_port *port, struct file *file, 66 unsigned int set, unsigned int clear); 67static int option_send_setup(struct usb_serial_port *port); 68 69/* Vendor and product IDs */ 70#define OPTION_VENDOR_ID 0x0AF0 71#define HUAWEI_VENDOR_ID 0x12D1 72#define AUDIOVOX_VENDOR_ID 0x0F3D 73#define NOVATELWIRELESS_VENDOR_ID 0x1410 74#define ANYDATA_VENDOR_ID 0x16d5 75 76#define OPTION_PRODUCT_OLD 0x5000 77#define OPTION_PRODUCT_FUSION 0x6000 78#define OPTION_PRODUCT_FUSION2 0x6300 79#define OPTION_PRODUCT_COBRA 0x6500 80#define OPTION_PRODUCT_COBRA2 0x6600 81#define HUAWEI_PRODUCT_E600 0x1001 82#define AUDIOVOX_PRODUCT_AIRCARD 0x0112 83#define NOVATELWIRELESS_PRODUCT_U740 0x1400 84#define ANYDATA_PRODUCT_ID 0x6501 85 86static struct usb_device_id option_ids[] = { 87 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_OLD) }, 88 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION) }, 89 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) }, 90 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) }, 91 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA2) }, 92 { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, 93 { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) }, 94 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID,NOVATELWIRELESS_PRODUCT_U740) }, 95 { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ID) }, 96 { } /* Terminating entry */ 97}; 98 99static struct usb_device_id option_ids1[] = { 100 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_OLD) }, 101 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION) }, 102 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) }, 103 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) }, 104 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA2) }, 105 { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, 106 { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) }, 107 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID,NOVATELWIRELESS_PRODUCT_U740) }, 108 { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ID) }, 109 { } /* Terminating entry */ 110}; 111 112MODULE_DEVICE_TABLE(usb, option_ids); 113 114static struct usb_driver option_driver = { 115 .name = "option", 116 .probe = usb_serial_probe, 117 .disconnect = usb_serial_disconnect, 118 .id_table = option_ids, 119 .no_dynamic_id = 1, 120}; 121 122/* The card has three separate interfaces, which the serial driver 123 * recognizes separately, thus num_port=1. 124 */ 125 126static struct usb_serial_driver option_1port_device = { 127 .driver = { 128 .owner = THIS_MODULE, 129 .name = "option1", 130 }, 131 .description = "GSM modem (1-port)", 132 .id_table = option_ids1, 133 .num_interrupt_in = NUM_DONT_CARE, 134 .num_bulk_in = NUM_DONT_CARE, 135 .num_bulk_out = NUM_DONT_CARE, 136 .num_ports = 1, 137 .open = option_open, 138 .close = option_close, 139 .write = option_write, 140 .write_room = option_write_room, 141 .chars_in_buffer = option_chars_in_buffer, 142 .throttle = option_rx_throttle, 143 .unthrottle = option_rx_unthrottle, 144 .ioctl = option_ioctl, 145 .set_termios = option_set_termios, 146 .break_ctl = option_break_ctl, 147 .tiocmget = option_tiocmget, 148 .tiocmset = option_tiocmset, 149 .attach = option_startup, 150 .shutdown = option_shutdown, 151 .read_int_callback = option_instat_callback, 152}; 153 154#ifdef CONFIG_USB_DEBUG 155static int debug; 156#else 157#define debug 0 158#endif 159 160/* per port private data */ 161 162#define N_IN_URB 4 163#define N_OUT_URB 1 164#define IN_BUFLEN 4096 165#define OUT_BUFLEN 128 166 167struct option_port_private { 168 /* Input endpoints and buffer for this port */ 169 struct urb *in_urbs[N_IN_URB]; 170 char in_buffer[N_IN_URB][IN_BUFLEN]; 171 /* Output endpoints and buffer for this port */ 172 struct urb *out_urbs[N_OUT_URB]; 173 char out_buffer[N_OUT_URB][OUT_BUFLEN]; 174 175 /* Settings for the port */ 176 int rts_state; /* Handshaking pins (outputs) */ 177 int dtr_state; 178 int cts_state; /* Handshaking pins (inputs) */ 179 int dsr_state; 180 int dcd_state; 181 int ri_state; 182 183 unsigned long tx_start_time[N_OUT_URB]; 184}; 185 186/* Functions used by new usb-serial code. */ 187static int __init option_init(void) 188{ 189 int retval; 190 retval = usb_serial_register(&option_1port_device); 191 if (retval) 192 goto failed_1port_device_register; 193 retval = usb_register(&option_driver); 194 if (retval) 195 goto failed_driver_register; 196 197 info(DRIVER_DESC ": " DRIVER_VERSION); 198 199 return 0; 200 201failed_driver_register: 202 usb_serial_deregister (&option_1port_device); 203failed_1port_device_register: 204 return retval; 205} 206 207static void __exit option_exit(void) 208{ 209 usb_deregister (&option_driver); 210 usb_serial_deregister (&option_1port_device); 211} 212 213module_init(option_init); 214module_exit(option_exit); 215 216static void option_rx_throttle(struct usb_serial_port *port) 217{ 218 dbg("%s", __FUNCTION__); 219} 220 221static void option_rx_unthrottle(struct usb_serial_port *port) 222{ 223 dbg("%s", __FUNCTION__); 224} 225 226static void option_break_ctl(struct usb_serial_port *port, int break_state) 227{ 228 /* Unfortunately, I don't know how to send a break */ 229 dbg("%s", __FUNCTION__); 230} 231 232static void option_set_termios(struct usb_serial_port *port, 233 struct termios *old_termios) 234{ 235 dbg("%s", __FUNCTION__); 236 237 option_send_setup(port); 238} 239 240static int option_tiocmget(struct usb_serial_port *port, struct file *file) 241{ 242 unsigned int value; 243 struct option_port_private *portdata; 244 245 portdata = usb_get_serial_port_data(port); 246 247 value = ((portdata->rts_state) ? TIOCM_RTS : 0) | 248 ((portdata->dtr_state) ? TIOCM_DTR : 0) | 249 ((portdata->cts_state) ? TIOCM_CTS : 0) | 250 ((portdata->dsr_state) ? TIOCM_DSR : 0) | 251 ((portdata->dcd_state) ? TIOCM_CAR : 0) | 252 ((portdata->ri_state) ? TIOCM_RNG : 0); 253 254 return value; 255} 256 257static int option_tiocmset(struct usb_serial_port *port, struct file *file, 258 unsigned int set, unsigned int clear) 259{ 260 struct option_port_private *portdata; 261 262 portdata = usb_get_serial_port_data(port); 263 264 if (set & TIOCM_RTS) 265 portdata->rts_state = 1; 266 if (set & TIOCM_DTR) 267 portdata->dtr_state = 1; 268 269 if (clear & TIOCM_RTS) 270 portdata->rts_state = 0; 271 if (clear & TIOCM_DTR) 272 portdata->dtr_state = 0; 273 return option_send_setup(port); 274} 275 276static int option_ioctl(struct usb_serial_port *port, struct file *file, 277 unsigned int cmd, unsigned long arg) 278{ 279 return -ENOIOCTLCMD; 280} 281 282/* Write */ 283static int option_write(struct usb_serial_port *port, 284 const unsigned char *buf, int count) 285{ 286 struct option_port_private *portdata; 287 int i; 288 int left, todo; 289 struct urb *this_urb = NULL; /* spurious */ 290 int err; 291 292 portdata = usb_get_serial_port_data(port); 293 294 dbg("%s: write (%d chars)", __FUNCTION__, count); 295 296 i = 0; 297 left = count; 298 for (i=0; left > 0 && i < N_OUT_URB; i++) { 299 todo = left; 300 if (todo > OUT_BUFLEN) 301 todo = OUT_BUFLEN; 302 303 this_urb = portdata->out_urbs[i]; 304 if (this_urb->status == -EINPROGRESS) { 305 if (time_before(jiffies, 306 portdata->tx_start_time[i] + 10 * HZ)) 307 continue; 308 usb_unlink_urb(this_urb); 309 continue; 310 } 311 if (this_urb->status != 0) 312 dbg("usb_write %p failed (err=%d)", 313 this_urb, this_urb->status); 314 315 dbg("%s: endpoint %d buf %d", __FUNCTION__, 316 usb_pipeendpoint(this_urb->pipe), i); 317 318 /* send the data */ 319 memcpy (this_urb->transfer_buffer, buf, todo); 320 this_urb->transfer_buffer_length = todo; 321 322 this_urb->dev = port->serial->dev; 323 err = usb_submit_urb(this_urb, GFP_ATOMIC); 324 if (err) { 325 dbg("usb_submit_urb %p (write bulk) failed " 326 "(%d, has %d)", this_urb, 327 err, this_urb->status); 328 continue; 329 } 330 portdata->tx_start_time[i] = jiffies; 331 buf += todo; 332 left -= todo; 333 } 334 335 count -= left; 336 dbg("%s: wrote (did %d)", __FUNCTION__, count); 337 return count; 338} 339 340static void option_indat_callback(struct urb *urb) 341{ 342 int err; 343 int endpoint; 344 struct usb_serial_port *port; 345 struct tty_struct *tty; 346 unsigned char *data = urb->transfer_buffer; 347 348 dbg("%s: %p", __FUNCTION__, urb); 349 350 endpoint = usb_pipeendpoint(urb->pipe); 351 port = (struct usb_serial_port *) urb->context; 352 353 if (urb->status) { 354 dbg("%s: nonzero status: %d on endpoint %02x.", 355 __FUNCTION__, urb->status, endpoint); 356 } else { 357 tty = port->tty; 358 if (urb->actual_length) { 359 tty_buffer_request_room(tty, urb->actual_length); 360 tty_insert_flip_string(tty, data, urb->actual_length); 361 tty_flip_buffer_push(tty); 362 } else { 363 dbg("%s: empty read urb received", __FUNCTION__); 364 } 365 366 /* Resubmit urb so we continue receiving */ 367 if (port->open_count && urb->status != -ESHUTDOWN) { 368 err = usb_submit_urb(urb, GFP_ATOMIC); 369 if (err) 370 printk(KERN_ERR "%s: resubmit read urb failed. " 371 "(%d)", __FUNCTION__, err); 372 } 373 } 374 return; 375} 376 377static void option_outdat_callback(struct urb *urb) 378{ 379 struct usb_serial_port *port; 380 381 dbg("%s", __FUNCTION__); 382 383 port = (struct usb_serial_port *) urb->context; 384 385 usb_serial_port_softint(port); 386} 387 388static void option_instat_callback(struct urb *urb) 389{ 390 int err; 391 struct usb_serial_port *port = (struct usb_serial_port *) urb->context; 392 struct option_port_private *portdata = usb_get_serial_port_data(port); 393 struct usb_serial *serial = port->serial; 394 395 dbg("%s", __FUNCTION__); 396 dbg("%s: urb %p port %p has data %p", __FUNCTION__,urb,port,portdata); 397 398 if (urb->status == 0) { 399 struct usb_ctrlrequest *req_pkt = 400 (struct usb_ctrlrequest *)urb->transfer_buffer; 401 402 if (!req_pkt) { 403 dbg("%s: NULL req_pkt\n", __FUNCTION__); 404 return; 405 } 406 if ((req_pkt->bRequestType == 0xA1) && 407 (req_pkt->bRequest == 0x20)) { 408 int old_dcd_state; 409 unsigned char signals = *((unsigned char *) 410 urb->transfer_buffer + 411 sizeof(struct usb_ctrlrequest)); 412 413 dbg("%s: signal x%x", __FUNCTION__, signals); 414 415 old_dcd_state = portdata->dcd_state; 416 portdata->cts_state = 1; 417 portdata->dcd_state = ((signals & 0x01) ? 1 : 0); 418 portdata->dsr_state = ((signals & 0x02) ? 1 : 0); 419 portdata->ri_state = ((signals & 0x08) ? 1 : 0); 420 421 if (port->tty && !C_CLOCAL(port->tty) && 422 old_dcd_state && !portdata->dcd_state) 423 tty_hangup(port->tty); 424 } else { 425 dbg("%s: type %x req %x", __FUNCTION__, 426 req_pkt->bRequestType,req_pkt->bRequest); 427 } 428 } else 429 dbg("%s: error %d", __FUNCTION__, urb->status); 430 431 /* Resubmit urb so we continue receiving IRQ data */ 432 if (urb->status != -ESHUTDOWN) { 433 urb->dev = serial->dev; 434 err = usb_submit_urb(urb, GFP_ATOMIC); 435 if (err) 436 dbg("%s: resubmit intr urb failed. (%d)", 437 __FUNCTION__, err); 438 } 439} 440 441static int option_write_room(struct usb_serial_port *port) 442{ 443 struct option_port_private *portdata; 444 int i; 445 int data_len = 0; 446 struct urb *this_urb; 447 448 portdata = usb_get_serial_port_data(port); 449 450 for (i=0; i < N_OUT_URB; i++) { 451 this_urb = portdata->out_urbs[i]; 452 if (this_urb && this_urb->status != -EINPROGRESS) 453 data_len += OUT_BUFLEN; 454 } 455 456 dbg("%s: %d", __FUNCTION__, data_len); 457 return data_len; 458} 459 460static int option_chars_in_buffer(struct usb_serial_port *port) 461{ 462 struct option_port_private *portdata; 463 int i; 464 int data_len = 0; 465 struct urb *this_urb; 466 467 portdata = usb_get_serial_port_data(port); 468 469 for (i=0; i < N_OUT_URB; i++) { 470 this_urb = portdata->out_urbs[i]; 471 if (this_urb && this_urb->status == -EINPROGRESS) 472 data_len += this_urb->transfer_buffer_length; 473 } 474 dbg("%s: %d", __FUNCTION__, data_len); 475 return data_len; 476} 477 478static int option_open(struct usb_serial_port *port, struct file *filp) 479{ 480 struct option_port_private *portdata; 481 struct usb_serial *serial = port->serial; 482 int i, err; 483 struct urb *urb; 484 485 portdata = usb_get_serial_port_data(port); 486 487 dbg("%s", __FUNCTION__); 488 489 /* Set some sane defaults */ 490 portdata->rts_state = 1; 491 portdata->dtr_state = 1; 492 493 /* Reset low level data toggle and start reading from endpoints */ 494 for (i = 0; i < N_IN_URB; i++) { 495 urb = portdata->in_urbs[i]; 496 if (! urb) 497 continue; 498 if (urb->dev != serial->dev) { 499 dbg("%s: dev %p != %p", __FUNCTION__, 500 urb->dev, serial->dev); 501 continue; 502 } 503 504 /* 505 * make sure endpoint data toggle is synchronized with the 506 * device 507 */ 508 usb_clear_halt(urb->dev, urb->pipe); 509 510 err = usb_submit_urb(urb, GFP_KERNEL); 511 if (err) { 512 dbg("%s: submit urb %d failed (%d) %d", 513 __FUNCTION__, i, err, 514 urb->transfer_buffer_length); 515 } 516 } 517 518 /* Reset low level data toggle on out endpoints */ 519 for (i = 0; i < N_OUT_URB; i++) { 520 urb = portdata->out_urbs[i]; 521 if (! urb) 522 continue; 523 urb->dev = serial->dev; 524 /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), 525 usb_pipeout(urb->pipe), 0); */ 526 } 527 528 port->tty->low_latency = 1; 529 530 option_send_setup(port); 531 532 return (0); 533} 534 535static inline void stop_urb(struct urb *urb) 536{ 537 if (urb && urb->status == -EINPROGRESS) 538 usb_kill_urb(urb); 539} 540 541static void option_close(struct usb_serial_port *port, struct file *filp) 542{ 543 int i; 544 struct usb_serial *serial = port->serial; 545 struct option_port_private *portdata; 546 547 dbg("%s", __FUNCTION__); 548 portdata = usb_get_serial_port_data(port); 549 550 portdata->rts_state = 0; 551 portdata->dtr_state = 0; 552 553 if (serial->dev) { 554 option_send_setup(port); 555 556 /* Stop reading/writing urbs */ 557 for (i = 0; i < N_IN_URB; i++) 558 stop_urb(portdata->in_urbs[i]); 559 for (i = 0; i < N_OUT_URB; i++) 560 stop_urb(portdata->out_urbs[i]); 561 } 562 port->tty = NULL; 563} 564 565/* Helper functions used by option_setup_urbs */ 566static struct urb *option_setup_urb(struct usb_serial *serial, int endpoint, 567 int dir, void *ctx, char *buf, int len, 568 void (*callback)(struct urb *)) 569{ 570 struct urb *urb; 571 572 if (endpoint == -1) 573 return NULL; /* endpoint not needed */ 574 575 urb = usb_alloc_urb(0, GFP_KERNEL); /* No ISO */ 576 if (urb == NULL) { 577 dbg("%s: alloc for endpoint %d failed.", __FUNCTION__, endpoint); 578 return NULL; 579 } 580 581 /* Fill URB using supplied data. */ 582 usb_fill_bulk_urb(urb, serial->dev, 583 usb_sndbulkpipe(serial->dev, endpoint) | dir, 584 buf, len, callback, ctx); 585 586 return urb; 587} 588 589/* Setup urbs */ 590static void option_setup_urbs(struct usb_serial *serial) 591{ 592 int i,j; 593 struct usb_serial_port *port; 594 struct option_port_private *portdata; 595 596 dbg("%s", __FUNCTION__); 597 598 for (i = 0; i < serial->num_ports; i++) { 599 port = serial->port[i]; 600 portdata = usb_get_serial_port_data(port); 601 602 /* Do indat endpoints first */ 603 for (j = 0; j < N_IN_URB; ++j) { 604 portdata->in_urbs[j] = option_setup_urb (serial, 605 port->bulk_in_endpointAddress, USB_DIR_IN, port, 606 portdata->in_buffer[j], IN_BUFLEN, option_indat_callback); 607 } 608 609 /* outdat endpoints */ 610 for (j = 0; j < N_OUT_URB; ++j) { 611 portdata->out_urbs[j] = option_setup_urb (serial, 612 port->bulk_out_endpointAddress, USB_DIR_OUT, port, 613 portdata->out_buffer[j], OUT_BUFLEN, option_outdat_callback); 614 } 615 } 616} 617 618static int option_send_setup(struct usb_serial_port *port) 619{ 620 struct usb_serial *serial = port->serial; 621 struct option_port_private *portdata; 622 623 dbg("%s", __FUNCTION__); 624 625 portdata = usb_get_serial_port_data(port); 626 627 if (port->tty) { 628 int val = 0; 629 if (portdata->dtr_state) 630 val |= 0x01; 631 if (portdata->rts_state) 632 val |= 0x02; 633 634 return usb_control_msg(serial->dev, 635 usb_rcvctrlpipe(serial->dev, 0), 636 0x22,0x21,val,0,NULL,0,USB_CTRL_SET_TIMEOUT); 637 } 638 639 return 0; 640} 641 642static int option_startup(struct usb_serial *serial) 643{ 644 int i, err; 645 struct usb_serial_port *port; 646 struct option_port_private *portdata; 647 648 dbg("%s", __FUNCTION__); 649 650 /* Now setup per port private data */ 651 for (i = 0; i < serial->num_ports; i++) { 652 port = serial->port[i]; 653 portdata = kzalloc(sizeof(*portdata), GFP_KERNEL); 654 if (!portdata) { 655 dbg("%s: kmalloc for option_port_private (%d) failed!.", 656 __FUNCTION__, i); 657 return (1); 658 } 659 660 usb_set_serial_port_data(port, portdata); 661 662 if (! port->interrupt_in_urb) 663 continue; 664 err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); 665 if (err) 666 dbg("%s: submit irq_in urb failed %d", 667 __FUNCTION__, err); 668 } 669 670 option_setup_urbs(serial); 671 672 return (0); 673} 674 675static void option_shutdown(struct usb_serial *serial) 676{ 677 int i, j; 678 struct usb_serial_port *port; 679 struct option_port_private *portdata; 680 681 dbg("%s", __FUNCTION__); 682 683 /* Stop reading/writing urbs */ 684 for (i = 0; i < serial->num_ports; ++i) { 685 port = serial->port[i]; 686 portdata = usb_get_serial_port_data(port); 687 for (j = 0; j < N_IN_URB; j++) 688 stop_urb(portdata->in_urbs[j]); 689 for (j = 0; j < N_OUT_URB; j++) 690 stop_urb(portdata->out_urbs[j]); 691 } 692 693 /* Now free them */ 694 for (i = 0; i < serial->num_ports; ++i) { 695 port = serial->port[i]; 696 portdata = usb_get_serial_port_data(port); 697 698 for (j = 0; j < N_IN_URB; j++) { 699 if (portdata->in_urbs[j]) { 700 usb_free_urb(portdata->in_urbs[j]); 701 portdata->in_urbs[j] = NULL; 702 } 703 } 704 for (j = 0; j < N_OUT_URB; j++) { 705 if (portdata->out_urbs[j]) { 706 usb_free_urb(portdata->out_urbs[j]); 707 portdata->out_urbs[j] = NULL; 708 } 709 } 710 } 711 712 /* Now free per port private data */ 713 for (i = 0; i < serial->num_ports; i++) { 714 port = serial->port[i]; 715 kfree(usb_get_serial_port_data(port)); 716 } 717} 718 719MODULE_AUTHOR(DRIVER_AUTHOR); 720MODULE_DESCRIPTION(DRIVER_DESC); 721MODULE_VERSION(DRIVER_VERSION); 722MODULE_LICENSE("GPL"); 723 724#ifdef CONFIG_USB_DEBUG 725module_param(debug, bool, S_IRUGO | S_IWUSR); 726MODULE_PARM_DESC(debug, "Debug messages"); 727#endif 728 729