OLD | NEW |
1 /* | 1 /* |
2 * cdc-acm.c | 2 * cdc-acm.c |
3 * | 3 * |
4 * Copyright (c) 1999 Armin Fuerst <fuerst@in.tum.de> | 4 * Copyright (c) 1999 Armin Fuerst <fuerst@in.tum.de> |
5 * Copyright (c) 1999 Pavel Machek <pavel@suse.cz> | 5 * Copyright (c) 1999 Pavel Machek <pavel@suse.cz> |
6 * Copyright (c) 1999 Johannes Erdfelt <johannes@erdfelt.com> | 6 * Copyright (c) 1999 Johannes Erdfelt <johannes@erdfelt.com> |
7 * Copyright (c) 2000 Vojtech Pavlik <vojtech@suse.cz> | 7 * Copyright (c) 2000 Vojtech Pavlik <vojtech@suse.cz> |
8 * Copyright (c) 2004 Oliver Neukum <oliver@neukum.name> | 8 * Copyright (c) 2004 Oliver Neukum <oliver@neukum.name> |
9 * Copyright (c) 2005 David Kubicek <dave@awk.cz> | 9 * Copyright (c) 2005 David Kubicek <dave@awk.cz> |
10 * | 10 * |
(...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
549 { | 549 { |
550 struct acm *acm; | 550 struct acm *acm; |
551 int rv = -ENODEV; | 551 int rv = -ENODEV; |
552 int i; | 552 int i; |
553 dbg("Entering acm_tty_open."); | 553 dbg("Entering acm_tty_open."); |
554 | 554 |
555 mutex_lock(&open_mutex); | 555 mutex_lock(&open_mutex); |
556 | 556 |
557 acm = acm_table[tty->index]; | 557 acm = acm_table[tty->index]; |
558 if (!acm || !acm->dev) | 558 if (!acm || !acm->dev) |
559 » » goto err_out; | 559 » » goto out; |
560 else | 560 else |
561 rv = 0; | 561 rv = 0; |
562 | 562 |
563 set_bit(TTY_NO_WRITE_SPLIT, &tty->flags); | 563 set_bit(TTY_NO_WRITE_SPLIT, &tty->flags); |
564 | 564 |
565 tty->driver_data = acm; | 565 tty->driver_data = acm; |
566 tty_port_tty_set(&acm->port, tty); | 566 tty_port_tty_set(&acm->port, tty); |
567 | 567 |
568 if (usb_autopm_get_interface(acm->control) < 0) | 568 if (usb_autopm_get_interface(acm->control) < 0) |
569 goto early_bail; | 569 goto early_bail; |
570 else | 570 else |
571 acm->control->needs_remote_wakeup = 1; | 571 acm->control->needs_remote_wakeup = 1; |
572 | 572 |
573 mutex_lock(&acm->mutex); | 573 mutex_lock(&acm->mutex); |
574 if (acm->port.count++) { | 574 if (acm->port.count++) { |
| 575 mutex_unlock(&acm->mutex); |
575 usb_autopm_put_interface(acm->control); | 576 usb_autopm_put_interface(acm->control); |
576 » » goto done; | 577 » » goto out; |
577 } | 578 } |
578 | 579 |
579 acm->ctrlurb->dev = acm->dev; | 580 acm->ctrlurb->dev = acm->dev; |
580 if (usb_submit_urb(acm->ctrlurb, GFP_KERNEL)) { | 581 if (usb_submit_urb(acm->ctrlurb, GFP_KERNEL)) { |
581 dbg("usb_submit_urb(ctrl irq) failed"); | 582 dbg("usb_submit_urb(ctrl irq) failed"); |
582 goto bail_out; | 583 goto bail_out; |
583 } | 584 } |
584 | 585 |
585 if (0 > acm_set_control(acm, acm->ctrlout = ACM_CTRL_DTR | ACM_CTRL_RTS)
&& | 586 if (0 > acm_set_control(acm, acm->ctrlout = ACM_CTRL_DTR | ACM_CTRL_RTS)
&& |
586 (acm->ctrl_caps & USB_CDC_CAP_LINE)) | 587 (acm->ctrl_caps & USB_CDC_CAP_LINE)) |
587 goto full_bailout; | 588 goto full_bailout; |
588 | 589 |
589 usb_autopm_put_interface(acm->control); | 590 usb_autopm_put_interface(acm->control); |
590 | 591 |
591 INIT_LIST_HEAD(&acm->spare_read_urbs); | 592 INIT_LIST_HEAD(&acm->spare_read_urbs); |
592 INIT_LIST_HEAD(&acm->spare_read_bufs); | 593 INIT_LIST_HEAD(&acm->spare_read_bufs); |
593 INIT_LIST_HEAD(&acm->filled_read_bufs); | 594 INIT_LIST_HEAD(&acm->filled_read_bufs); |
594 | 595 |
595 for (i = 0; i < acm->rx_buflimit; i++) | 596 for (i = 0; i < acm->rx_buflimit; i++) |
596 list_add(&(acm->ru[i].list), &acm->spare_read_urbs); | 597 list_add(&(acm->ru[i].list), &acm->spare_read_urbs); |
597 for (i = 0; i < acm->rx_buflimit; i++) | 598 for (i = 0; i < acm->rx_buflimit; i++) |
598 list_add(&(acm->rb[i].list), &acm->spare_read_bufs); | 599 list_add(&(acm->rb[i].list), &acm->spare_read_bufs); |
599 | 600 |
600 acm->throttle = 0; | 601 acm->throttle = 0; |
601 | 602 |
602 set_bit(ASYNCB_INITIALIZED, &acm->port.flags); | 603 set_bit(ASYNCB_INITIALIZED, &acm->port.flags); |
603 rv = tty_port_block_til_ready(&acm->port, tty, filp); | 604 rv = tty_port_block_til_ready(&acm->port, tty, filp); |
604 tasklet_schedule(&acm->urb_task); | 605 tasklet_schedule(&acm->urb_task); |
605 done: | 606 |
606 mutex_unlock(&acm->mutex); | 607 mutex_unlock(&acm->mutex); |
607 err_out: | 608 out: |
608 mutex_unlock(&open_mutex); | 609 mutex_unlock(&open_mutex); |
609 return rv; | 610 return rv; |
610 | 611 |
611 full_bailout: | 612 full_bailout: |
612 usb_kill_urb(acm->ctrlurb); | 613 usb_kill_urb(acm->ctrlurb); |
613 bail_out: | 614 bail_out: |
614 usb_autopm_put_interface(acm->control); | |
615 acm->port.count--; | 615 acm->port.count--; |
616 mutex_unlock(&acm->mutex); | 616 mutex_unlock(&acm->mutex); |
| 617 usb_autopm_put_interface(acm->control); |
617 early_bail: | 618 early_bail: |
618 mutex_unlock(&open_mutex); | 619 mutex_unlock(&open_mutex); |
619 tty_port_tty_set(&acm->port, NULL); | 620 tty_port_tty_set(&acm->port, NULL); |
620 return -EIO; | 621 return -EIO; |
621 } | 622 } |
622 | 623 |
623 static void acm_tty_unregister(struct acm *acm) | 624 static void acm_tty_unregister(struct acm *acm) |
624 { | 625 { |
625 int i, nr; | 626 int i, nr; |
626 | 627 |
(...skipping 1084 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1711 put_tty_driver(acm_tty_driver); | 1712 put_tty_driver(acm_tty_driver); |
1712 } | 1713 } |
1713 | 1714 |
1714 module_init(acm_init); | 1715 module_init(acm_init); |
1715 module_exit(acm_exit); | 1716 module_exit(acm_exit); |
1716 | 1717 |
1717 MODULE_AUTHOR(DRIVER_AUTHOR); | 1718 MODULE_AUTHOR(DRIVER_AUTHOR); |
1718 MODULE_DESCRIPTION(DRIVER_DESC); | 1719 MODULE_DESCRIPTION(DRIVER_DESC); |
1719 MODULE_LICENSE("GPL"); | 1720 MODULE_LICENSE("GPL"); |
1720 MODULE_ALIAS_CHARDEV_MAJOR(ACM_TTY_MAJOR); | 1721 MODULE_ALIAS_CHARDEV_MAJOR(ACM_TTY_MAJOR); |
OLD | NEW |