Lines Matching +full:cdc +full:- +full:acm

1 // SPDX-License-Identifier: GPL-2.0+
3 * cdc-acm.c
36 #include <linux/usb/cdc.h>
42 #include "cdc-acm.h"
62 * Look up an ACM structure by minor. If found and not disconnected, increment
65 static struct acm *acm_get_by_minor(unsigned int minor) in acm_get_by_minor()
67 struct acm *acm; in acm_get_by_minor() local
70 acm = idr_find(&acm_minors, minor); in acm_get_by_minor()
71 if (acm) { in acm_get_by_minor()
72 mutex_lock(&acm->mutex); in acm_get_by_minor()
73 if (acm->disconnected) { in acm_get_by_minor()
74 mutex_unlock(&acm->mutex); in acm_get_by_minor()
75 acm = NULL; in acm_get_by_minor()
77 tty_port_get(&acm->port); in acm_get_by_minor()
78 mutex_unlock(&acm->mutex); in acm_get_by_minor()
82 return acm; in acm_get_by_minor()
86 * Try to find an available minor number and if found, associate it with 'acm'.
88 static int acm_alloc_minor(struct acm *acm) in acm_alloc_minor() argument
93 minor = idr_alloc(&acm_minors, acm, 0, ACM_TTY_MINORS, GFP_KERNEL); in acm_alloc_minor()
99 /* Release the minor number associated with 'acm'. */
100 static void acm_release_minor(struct acm *acm) in acm_release_minor() argument
103 idr_remove(&acm_minors, acm->minor); in acm_release_minor()
108 * Functions for ACM control messages.
111 static int acm_ctrl_msg(struct acm *acm, int request, int value, in acm_ctrl_msg() argument
116 retval = usb_autopm_get_interface(acm->control); in acm_ctrl_msg()
120 retval = usb_control_msg(acm->dev, usb_sndctrlpipe(acm->dev, 0), in acm_ctrl_msg()
122 acm->control->altsetting[0].desc.bInterfaceNumber, in acm_ctrl_msg()
125 dev_dbg(&acm->control->dev, in acm_ctrl_msg()
126 "%s - rq 0x%02x, val %#x, len %#x, result %d\n", in acm_ctrl_msg()
129 usb_autopm_put_interface(acm->control); in acm_ctrl_msg()
135 * the cdc acm descriptor tells whether they do...
137 static inline int acm_set_control(struct acm *acm, int control) in acm_set_control() argument
139 if (acm->quirks & QUIRK_CONTROL_LINE_STATE) in acm_set_control()
140 return -EOPNOTSUPP; in acm_set_control()
142 return acm_ctrl_msg(acm, USB_CDC_REQ_SET_CONTROL_LINE_STATE, in acm_set_control()
146 #define acm_set_line(acm, line) \ argument
147 acm_ctrl_msg(acm, USB_CDC_REQ_SET_LINE_CODING, 0, line, sizeof *(line))
148 #define acm_send_break(acm, ms) \ argument
149 acm_ctrl_msg(acm, USB_CDC_REQ_SEND_BREAK, ms, NULL, 0)
151 static void acm_poison_urbs(struct acm *acm) in acm_poison_urbs() argument
155 usb_poison_urb(acm->ctrlurb); in acm_poison_urbs()
157 usb_poison_urb(acm->wb[i].urb); in acm_poison_urbs()
158 for (i = 0; i < acm->rx_buflimit; i++) in acm_poison_urbs()
159 usb_poison_urb(acm->read_urbs[i]); in acm_poison_urbs()
162 static void acm_unpoison_urbs(struct acm *acm) in acm_unpoison_urbs() argument
166 for (i = 0; i < acm->rx_buflimit; i++) in acm_unpoison_urbs()
167 usb_unpoison_urb(acm->read_urbs[i]); in acm_unpoison_urbs()
169 usb_unpoison_urb(acm->wb[i].urb); in acm_unpoison_urbs()
170 usb_unpoison_urb(acm->ctrlurb); in acm_unpoison_urbs()
179 static int acm_wb_alloc(struct acm *acm) in acm_wb_alloc() argument
187 wb = &acm->wb[wbn]; in acm_wb_alloc()
188 if (!wb->use) { in acm_wb_alloc()
189 wb->use = true; in acm_wb_alloc()
190 wb->len = 0; in acm_wb_alloc()
195 return -1; in acm_wb_alloc()
199 static int acm_wb_is_avail(struct acm *acm) in acm_wb_is_avail() argument
205 spin_lock_irqsave(&acm->write_lock, flags); in acm_wb_is_avail()
207 if(acm->wb[i].use) in acm_wb_is_avail()
208 n--; in acm_wb_is_avail()
209 spin_unlock_irqrestore(&acm->write_lock, flags); in acm_wb_is_avail()
214 * Finish write. Caller must hold acm->write_lock
216 static void acm_write_done(struct acm *acm, struct acm_wb *wb) in acm_write_done() argument
218 wb->use = false; in acm_write_done()
219 acm->transmitting--; in acm_write_done()
220 usb_autopm_put_interface_async(acm->control); in acm_write_done()
229 static int acm_start_wb(struct acm *acm, struct acm_wb *wb) in acm_start_wb() argument
233 acm->transmitting++; in acm_start_wb()
235 wb->urb->transfer_buffer = wb->buf; in acm_start_wb()
236 wb->urb->transfer_dma = wb->dmah; in acm_start_wb()
237 wb->urb->transfer_buffer_length = wb->len; in acm_start_wb()
238 wb->urb->dev = acm->dev; in acm_start_wb()
240 rc = usb_submit_urb(wb->urb, GFP_ATOMIC); in acm_start_wb()
242 if (rc != -EPERM) in acm_start_wb()
243 dev_err(&acm->data->dev, in acm_start_wb()
244 "%s - usb_submit_urb(write bulk) failed: %d\n", in acm_start_wb()
246 acm_write_done(acm, wb); in acm_start_wb()
258 struct acm *acm = usb_get_intfdata(intf); in bmCapabilities_show() local
260 return sprintf(buf, "%d", acm->ctrl_caps); in bmCapabilities_show()
268 struct acm *acm = usb_get_intfdata(intf); in wCountryCodes_show() local
270 memcpy(buf, acm->country_codes, acm->country_code_size); in wCountryCodes_show()
271 return acm->country_code_size; in wCountryCodes_show()
280 struct acm *acm = usb_get_intfdata(intf); in iCountryCodeRelDate_show() local
282 return sprintf(buf, "%d", acm->country_rel_date); in iCountryCodeRelDate_show()
287 * Interrupt handlers for various ACM device responses
290 static void acm_process_notification(struct acm *acm, unsigned char *buf) in acm_process_notification() argument
298 switch (dr->bNotificationType) { in acm_process_notification()
300 dev_dbg(&acm->control->dev, in acm_process_notification()
301 "%s - network connection: %d\n", __func__, dr->wValue); in acm_process_notification()
305 if (le16_to_cpu(dr->wLength) != 2) { in acm_process_notification()
306 dev_dbg(&acm->control->dev, in acm_process_notification()
307 "%s - malformed serial state\n", __func__); in acm_process_notification()
312 dev_dbg(&acm->control->dev, in acm_process_notification()
313 "%s - serial state: 0x%x\n", __func__, newctrl); in acm_process_notification()
315 if (!acm->clocal && (acm->ctrlin & ~newctrl & USB_CDC_SERIAL_STATE_DCD)) { in acm_process_notification()
316 dev_dbg(&acm->control->dev, in acm_process_notification()
317 "%s - calling hangup\n", __func__); in acm_process_notification()
318 tty_port_tty_hangup(&acm->port, false); in acm_process_notification()
321 difference = acm->ctrlin ^ newctrl; in acm_process_notification()
323 if ((difference & USB_CDC_SERIAL_STATE_DCD) && acm->port.tty) { in acm_process_notification()
324 struct tty_ldisc *ld = tty_ldisc_ref(acm->port.tty); in acm_process_notification()
326 if (ld->ops->dcd_change) in acm_process_notification()
327 ld->ops->dcd_change(acm->port.tty, newctrl & USB_CDC_SERIAL_STATE_DCD); in acm_process_notification()
332 spin_lock_irqsave(&acm->read_lock, flags); in acm_process_notification()
333 acm->ctrlin = newctrl; in acm_process_notification()
334 acm->oldcount = acm->iocount; in acm_process_notification()
337 acm->iocount.dsr++; in acm_process_notification()
339 acm->iocount.dcd++; in acm_process_notification()
341 acm->iocount.brk++; in acm_process_notification()
342 tty_insert_flip_char(&acm->port, 0, TTY_BREAK); in acm_process_notification()
345 acm->iocount.rng++; in acm_process_notification()
347 acm->iocount.frame++; in acm_process_notification()
349 acm->iocount.parity++; in acm_process_notification()
351 acm->iocount.overrun++; in acm_process_notification()
352 spin_unlock_irqrestore(&acm->read_lock, flags); in acm_process_notification()
355 tty_flip_buffer_push(&acm->port); in acm_process_notification()
358 wake_up_all(&acm->wioctl); in acm_process_notification()
363 dev_dbg(&acm->control->dev, in acm_process_notification()
364 "%s - unknown notification %d received: index %d len %d\n", in acm_process_notification()
366 dr->bNotificationType, dr->wIndex, dr->wLength); in acm_process_notification()
373 struct acm *acm = urb->context; in acm_ctrl_irq() local
375 unsigned int current_size = urb->actual_length; in acm_ctrl_irq()
378 int status = urb->status; in acm_ctrl_irq()
384 case -ECONNRESET: in acm_ctrl_irq()
385 case -ENOENT: in acm_ctrl_irq()
386 case -ESHUTDOWN: in acm_ctrl_irq()
388 dev_dbg(&acm->control->dev, in acm_ctrl_irq()
389 "%s - urb shutting down with status: %d\n", in acm_ctrl_irq()
393 dev_dbg(&acm->control->dev, in acm_ctrl_irq()
394 "%s - nonzero urb status received: %d\n", in acm_ctrl_irq()
399 usb_mark_last_busy(acm->dev); in acm_ctrl_irq()
401 if (acm->nb_index == 0) { in acm_ctrl_irq()
408 dev_dbg(&acm->control->dev, "urb too short\n"); in acm_ctrl_irq()
411 dr = urb->transfer_buffer; in acm_ctrl_irq()
413 dr = (struct usb_cdc_notification *)acm->notification_buffer; in acm_ctrl_irq()
415 /* size = notification-header + (optional) data */ in acm_ctrl_irq()
417 le16_to_cpu(dr->wLength); in acm_ctrl_irq()
419 if (acm->nb_index != 0 || current_size < expected_size) { in acm_ctrl_irq()
421 if (acm->nb_size < expected_size) { in acm_ctrl_irq()
425 new_buffer = krealloc(acm->notification_buffer, in acm_ctrl_irq()
428 acm->nb_index = 0; in acm_ctrl_irq()
432 acm->notification_buffer = new_buffer; in acm_ctrl_irq()
433 acm->nb_size = alloc_size; in acm_ctrl_irq()
434 dr = (struct usb_cdc_notification *)acm->notification_buffer; in acm_ctrl_irq()
438 expected_size - acm->nb_index); in acm_ctrl_irq()
440 memcpy(&acm->notification_buffer[acm->nb_index], in acm_ctrl_irq()
441 urb->transfer_buffer, copy_size); in acm_ctrl_irq()
442 acm->nb_index += copy_size; in acm_ctrl_irq()
443 current_size = acm->nb_index; in acm_ctrl_irq()
448 acm_process_notification(acm, (unsigned char *)dr); in acm_ctrl_irq()
449 acm->nb_index = 0; in acm_ctrl_irq()
454 if (retval && retval != -EPERM && retval != -ENODEV) in acm_ctrl_irq()
455 dev_err(&acm->control->dev, in acm_ctrl_irq()
456 "%s - usb_submit_urb failed: %d\n", __func__, retval); in acm_ctrl_irq()
458 dev_vdbg(&acm->control->dev, in acm_ctrl_irq()
462 static int acm_submit_read_urb(struct acm *acm, int index, gfp_t mem_flags) in acm_submit_read_urb() argument
466 if (!test_and_clear_bit(index, &acm->read_urbs_free)) in acm_submit_read_urb()
469 res = usb_submit_urb(acm->read_urbs[index], mem_flags); in acm_submit_read_urb()
471 if (res != -EPERM && res != -ENODEV) { in acm_submit_read_urb()
472 dev_err(&acm->data->dev, in acm_submit_read_urb()
476 dev_vdbg(&acm->data->dev, "intended failure %d\n", res); in acm_submit_read_urb()
478 set_bit(index, &acm->read_urbs_free); in acm_submit_read_urb()
481 dev_vdbg(&acm->data->dev, "submitted urb %d\n", index); in acm_submit_read_urb()
487 static int acm_submit_read_urbs(struct acm *acm, gfp_t mem_flags) in acm_submit_read_urbs() argument
492 for (i = 0; i < acm->rx_buflimit; ++i) { in acm_submit_read_urbs()
493 res = acm_submit_read_urb(acm, i, mem_flags); in acm_submit_read_urbs()
501 static void acm_process_read_urb(struct acm *acm, struct urb *urb) in acm_process_read_urb() argument
505 if (!urb->actual_length) in acm_process_read_urb()
508 spin_lock_irqsave(&acm->read_lock, flags); in acm_process_read_urb()
509 tty_insert_flip_string(&acm->port, urb->transfer_buffer, in acm_process_read_urb()
510 urb->actual_length); in acm_process_read_urb()
511 spin_unlock_irqrestore(&acm->read_lock, flags); in acm_process_read_urb()
513 tty_flip_buffer_push(&acm->port); in acm_process_read_urb()
518 struct acm_rb *rb = urb->context; in acm_read_bulk_callback()
519 struct acm *acm = rb->instance; in acm_read_bulk_callback() local
520 int status = urb->status; in acm_read_bulk_callback()
525 dev_vdbg(&acm->data->dev, "got urb %d, len %d, status %d\n", in acm_read_bulk_callback()
526 rb->index, urb->actual_length, status); in acm_read_bulk_callback()
530 usb_mark_last_busy(acm->dev); in acm_read_bulk_callback()
531 acm_process_read_urb(acm, urb); in acm_read_bulk_callback()
533 case -EPIPE: in acm_read_bulk_callback()
534 set_bit(EVENT_RX_STALL, &acm->flags); in acm_read_bulk_callback()
537 case -ENOENT: in acm_read_bulk_callback()
538 case -ECONNRESET: in acm_read_bulk_callback()
539 case -ESHUTDOWN: in acm_read_bulk_callback()
540 dev_dbg(&acm->data->dev, in acm_read_bulk_callback()
541 "%s - urb shutting down with status: %d\n", in acm_read_bulk_callback()
545 case -EOVERFLOW: in acm_read_bulk_callback()
546 case -EPROTO: in acm_read_bulk_callback()
547 dev_dbg(&acm->data->dev, in acm_read_bulk_callback()
548 "%s - cooling babbling device\n", __func__); in acm_read_bulk_callback()
549 usb_mark_last_busy(acm->dev); in acm_read_bulk_callback()
550 set_bit(rb->index, &acm->urbs_in_error_delay); in acm_read_bulk_callback()
551 set_bit(ACM_ERROR_DELAY, &acm->flags); in acm_read_bulk_callback()
555 dev_dbg(&acm->data->dev, in acm_read_bulk_callback()
556 "%s - nonzero urb status received: %d\n", in acm_read_bulk_callback()
567 set_bit(rb->index, &acm->read_urbs_free); in acm_read_bulk_callback()
577 schedule_delayed_work(&acm->dwork, 0); in acm_read_bulk_callback()
579 schedule_delayed_work(&acm->dwork, HZ / 2); in acm_read_bulk_callback()
583 if (test_bit(ACM_THROTTLED, &acm->flags)) in acm_read_bulk_callback()
586 acm_submit_read_urb(acm, rb->index, GFP_ATOMIC); in acm_read_bulk_callback()
592 struct acm_wb *wb = urb->context; in acm_write_bulk()
593 struct acm *acm = wb->instance; in acm_write_bulk() local
595 int status = urb->status; in acm_write_bulk()
597 if (status || (urb->actual_length != urb->transfer_buffer_length)) in acm_write_bulk()
598 dev_vdbg(&acm->data->dev, "wrote len %d/%d, status %d\n", in acm_write_bulk()
599 urb->actual_length, in acm_write_bulk()
600 urb->transfer_buffer_length, in acm_write_bulk()
603 spin_lock_irqsave(&acm->write_lock, flags); in acm_write_bulk()
604 acm_write_done(acm, wb); in acm_write_bulk()
605 spin_unlock_irqrestore(&acm->write_lock, flags); in acm_write_bulk()
606 set_bit(EVENT_TTY_WAKEUP, &acm->flags); in acm_write_bulk()
607 schedule_delayed_work(&acm->dwork, 0); in acm_write_bulk()
613 struct acm *acm = container_of(work, struct acm, dwork.work); in acm_softint() local
615 if (test_bit(EVENT_RX_STALL, &acm->flags)) { in acm_softint()
617 if (!acm->susp_count) { in acm_softint()
618 for (i = 0; i < acm->rx_buflimit; i++) in acm_softint()
619 usb_kill_urb(acm->read_urbs[i]); in acm_softint()
620 usb_clear_halt(acm->dev, acm->in); in acm_softint()
621 acm_submit_read_urbs(acm, GFP_KERNEL); in acm_softint()
622 clear_bit(EVENT_RX_STALL, &acm->flags); in acm_softint()
626 if (test_and_clear_bit(ACM_ERROR_DELAY, &acm->flags)) { in acm_softint()
627 for (i = 0; i < acm->rx_buflimit; i++) in acm_softint()
628 if (test_and_clear_bit(i, &acm->urbs_in_error_delay)) in acm_softint()
629 acm_submit_read_urb(acm, i, GFP_KERNEL); in acm_softint()
632 if (test_and_clear_bit(EVENT_TTY_WAKEUP, &acm->flags)) in acm_softint()
633 tty_port_tty_wakeup(&acm->port); in acm_softint()
642 struct acm *acm; in acm_tty_install() local
645 acm = acm_get_by_minor(tty->index); in acm_tty_install()
646 if (!acm) in acm_tty_install()
647 return -ENODEV; in acm_tty_install()
655 * immediately after acm driver has been installed. in acm_tty_install()
657 if (acm->quirks & DISABLE_ECHO) in acm_tty_install()
658 tty->termios.c_lflag &= ~ECHO; in acm_tty_install()
660 tty->driver_data = acm; in acm_tty_install()
665 tty_port_put(&acm->port); in acm_tty_install()
671 struct acm *acm = tty->driver_data; in acm_tty_open() local
673 return tty_port_open(&acm->port, tty, filp); in acm_tty_open()
678 struct acm *acm = container_of(port, struct acm, port); in acm_port_dtr_rts() local
688 acm->ctrlout = val; in acm_port_dtr_rts()
690 res = acm_set_control(acm, val); in acm_port_dtr_rts()
691 if (res && (acm->ctrl_caps & USB_CDC_CAP_LINE)) in acm_port_dtr_rts()
693 dev_dbg(&acm->control->dev, "failed to set dtr/rts\n"); in acm_port_dtr_rts()
698 struct acm *acm = container_of(port, struct acm, port); in acm_port_activate() local
699 int retval = -ENODEV; in acm_port_activate()
702 mutex_lock(&acm->mutex); in acm_port_activate()
703 if (acm->disconnected) in acm_port_activate()
706 retval = usb_autopm_get_interface(acm->control); in acm_port_activate()
710 set_bit(TTY_NO_WRITE_SPLIT, &tty->flags); in acm_port_activate()
711 acm->control->needs_remote_wakeup = 1; in acm_port_activate()
713 acm->ctrlurb->dev = acm->dev; in acm_port_activate()
714 retval = usb_submit_urb(acm->ctrlurb, GFP_KERNEL); in acm_port_activate()
716 dev_err(&acm->control->dev, in acm_port_activate()
717 "%s - usb_submit_urb(ctrl irq) failed\n", __func__); in acm_port_activate()
726 clear_bit(ACM_THROTTLED, &acm->flags); in acm_port_activate()
728 retval = acm_submit_read_urbs(acm, GFP_KERNEL); in acm_port_activate()
732 usb_autopm_put_interface(acm->control); in acm_port_activate()
734 mutex_unlock(&acm->mutex); in acm_port_activate()
739 for (i = 0; i < acm->rx_buflimit; i++) in acm_port_activate()
740 usb_kill_urb(acm->read_urbs[i]); in acm_port_activate()
741 usb_kill_urb(acm->ctrlurb); in acm_port_activate()
743 usb_autopm_put_interface(acm->control); in acm_port_activate()
746 mutex_unlock(&acm->mutex); in acm_port_activate()
753 struct acm *acm = container_of(port, struct acm, port); in acm_port_destruct() local
755 if (acm->minor != ACM_MINOR_INVALID) in acm_port_destruct()
756 acm_release_minor(acm); in acm_port_destruct()
757 usb_put_intf(acm->control); in acm_port_destruct()
758 kfree(acm->country_codes); in acm_port_destruct()
759 kfree(acm); in acm_port_destruct()
764 struct acm *acm = container_of(port, struct acm, port); in acm_port_shutdown() local
770 * hold it due to the tty-port initialised flag. in acm_port_shutdown()
772 acm_poison_urbs(acm); in acm_port_shutdown()
773 spin_lock_irq(&acm->write_lock); in acm_port_shutdown()
774 spin_unlock_irq(&acm->write_lock); in acm_port_shutdown()
776 usb_autopm_get_interface_no_resume(acm->control); in acm_port_shutdown()
777 acm->control->needs_remote_wakeup = 0; in acm_port_shutdown()
778 usb_autopm_put_interface(acm->control); in acm_port_shutdown()
781 urb = usb_get_from_anchor(&acm->delayed); in acm_port_shutdown()
784 wb = urb->context; in acm_port_shutdown()
785 wb->use = false; in acm_port_shutdown()
786 usb_autopm_put_interface_async(acm->control); in acm_port_shutdown()
789 acm_unpoison_urbs(acm); in acm_port_shutdown()
795 struct acm *acm = tty->driver_data; in acm_tty_cleanup() local
797 tty_port_put(&acm->port); in acm_tty_cleanup()
802 struct acm *acm = tty->driver_data; in acm_tty_hangup() local
804 tty_port_hangup(&acm->port); in acm_tty_hangup()
809 struct acm *acm = tty->driver_data; in acm_tty_close() local
811 tty_port_close(&acm->port, tty, filp); in acm_tty_close()
817 struct acm *acm = tty->driver_data; in acm_tty_write() local
826 dev_vdbg(&acm->data->dev, "%zu bytes from tty layer\n", count); in acm_tty_write()
828 spin_lock_irqsave(&acm->write_lock, flags); in acm_tty_write()
829 wbn = acm_wb_alloc(acm); in acm_tty_write()
831 spin_unlock_irqrestore(&acm->write_lock, flags); in acm_tty_write()
834 wb = &acm->wb[wbn]; in acm_tty_write()
836 if (!acm->dev) { in acm_tty_write()
837 wb->use = false; in acm_tty_write()
838 spin_unlock_irqrestore(&acm->write_lock, flags); in acm_tty_write()
839 return -ENODEV; in acm_tty_write()
842 count = (count > acm->writesize) ? acm->writesize : count; in acm_tty_write()
843 dev_vdbg(&acm->data->dev, "writing %zu bytes\n", count); in acm_tty_write()
844 memcpy(wb->buf, buf, count); in acm_tty_write()
845 wb->len = count; in acm_tty_write()
847 stat = usb_autopm_get_interface_async(acm->control); in acm_tty_write()
849 wb->use = false; in acm_tty_write()
850 spin_unlock_irqrestore(&acm->write_lock, flags); in acm_tty_write()
854 if (acm->susp_count) { in acm_tty_write()
855 usb_anchor_urb(wb->urb, &acm->delayed); in acm_tty_write()
856 spin_unlock_irqrestore(&acm->write_lock, flags); in acm_tty_write()
860 stat = acm_start_wb(acm, wb); in acm_tty_write()
861 spin_unlock_irqrestore(&acm->write_lock, flags); in acm_tty_write()
870 struct acm *acm = tty->driver_data; in acm_tty_write_room() local
875 return acm_wb_is_avail(acm) ? acm->writesize : 0; in acm_tty_write_room()
880 struct acm *acm = tty->driver_data; in acm_tty_flush_buffer() local
884 spin_lock_irqsave(&acm->write_lock, flags); in acm_tty_flush_buffer()
886 if (acm->wb[i].use) in acm_tty_flush_buffer()
887 usb_unlink_urb(acm->wb[i].urb); in acm_tty_flush_buffer()
888 spin_unlock_irqrestore(&acm->write_lock, flags); in acm_tty_flush_buffer()
893 struct acm *acm = tty->driver_data; in acm_tty_chars_in_buffer() local
898 if (acm->disconnected) in acm_tty_chars_in_buffer()
903 return (ACM_NW - acm_wb_is_avail(acm)) * acm->writesize; in acm_tty_chars_in_buffer()
908 struct acm *acm = tty->driver_data; in acm_tty_throttle() local
910 set_bit(ACM_THROTTLED, &acm->flags); in acm_tty_throttle()
915 struct acm *acm = tty->driver_data; in acm_tty_unthrottle() local
917 clear_bit(ACM_THROTTLED, &acm->flags); in acm_tty_unthrottle()
922 acm_submit_read_urbs(acm, GFP_KERNEL); in acm_tty_unthrottle()
927 struct acm *acm = tty->driver_data; in acm_tty_break_ctl() local
930 if (!(acm->ctrl_caps & USB_CDC_CAP_BRK)) in acm_tty_break_ctl()
931 return -EOPNOTSUPP; in acm_tty_break_ctl()
933 retval = acm_send_break(acm, state ? 0xffff : 0); in acm_tty_break_ctl()
935 dev_dbg(&acm->control->dev, in acm_tty_break_ctl()
936 "%s - send break failed\n", __func__); in acm_tty_break_ctl()
942 struct acm *acm = tty->driver_data; in acm_tty_tiocmget() local
944 return (acm->ctrlout & USB_CDC_CTRL_DTR ? TIOCM_DTR : 0) | in acm_tty_tiocmget()
945 (acm->ctrlout & USB_CDC_CTRL_RTS ? TIOCM_RTS : 0) | in acm_tty_tiocmget()
946 (acm->ctrlin & USB_CDC_SERIAL_STATE_DSR ? TIOCM_DSR : 0) | in acm_tty_tiocmget()
947 (acm->ctrlin & USB_CDC_SERIAL_STATE_RING_SIGNAL ? TIOCM_RI : 0) | in acm_tty_tiocmget()
948 (acm->ctrlin & USB_CDC_SERIAL_STATE_DCD ? TIOCM_CD : 0) | in acm_tty_tiocmget()
955 struct acm *acm = tty->driver_data; in acm_tty_tiocmset() local
958 newctrl = acm->ctrlout; in acm_tty_tiocmset()
966 if (acm->ctrlout == newctrl) in acm_tty_tiocmset()
968 return acm_set_control(acm, acm->ctrlout = newctrl); in acm_tty_tiocmset()
973 struct acm *acm = tty->driver_data; in get_serial_info() local
975 ss->line = acm->minor; in get_serial_info()
976 mutex_lock(&acm->port.mutex); in get_serial_info()
977 ss->close_delay = jiffies_to_msecs(acm->port.close_delay) / 10; in get_serial_info()
978 ss->closing_wait = acm->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ? in get_serial_info()
980 jiffies_to_msecs(acm->port.closing_wait) / 10; in get_serial_info()
981 mutex_unlock(&acm->port.mutex); in get_serial_info()
987 struct acm *acm = tty->driver_data; in set_serial_info() local
991 close_delay = msecs_to_jiffies(ss->close_delay * 10); in set_serial_info()
992 closing_wait = ss->closing_wait == ASYNC_CLOSING_WAIT_NONE ? in set_serial_info()
994 msecs_to_jiffies(ss->closing_wait * 10); in set_serial_info()
996 mutex_lock(&acm->port.mutex); in set_serial_info()
999 if ((close_delay != acm->port.close_delay) || in set_serial_info()
1000 (closing_wait != acm->port.closing_wait)) in set_serial_info()
1001 retval = -EPERM; in set_serial_info()
1003 acm->port.close_delay = close_delay; in set_serial_info()
1004 acm->port.closing_wait = closing_wait; in set_serial_info()
1007 mutex_unlock(&acm->port.mutex); in set_serial_info()
1011 static int wait_serial_change(struct acm *acm, unsigned long arg) in wait_serial_change() argument
1018 spin_lock_irq(&acm->read_lock); in wait_serial_change()
1019 old = acm->oldcount; in wait_serial_change()
1020 new = acm->iocount; in wait_serial_change()
1021 acm->oldcount = new; in wait_serial_change()
1022 spin_unlock_irq(&acm->read_lock); in wait_serial_change()
1034 add_wait_queue(&acm->wioctl, &wait); in wait_serial_change()
1037 remove_wait_queue(&acm->wioctl, &wait); in wait_serial_change()
1038 if (acm->disconnected) { in wait_serial_change()
1042 rv = -ENODEV; in wait_serial_change()
1045 rv = -ERESTARTSYS; in wait_serial_change()
1057 struct acm *acm = tty->driver_data; in acm_tty_get_icount() local
1059 icount->dsr = acm->iocount.dsr; in acm_tty_get_icount()
1060 icount->rng = acm->iocount.rng; in acm_tty_get_icount()
1061 icount->dcd = acm->iocount.dcd; in acm_tty_get_icount()
1062 icount->frame = acm->iocount.frame; in acm_tty_get_icount()
1063 icount->overrun = acm->iocount.overrun; in acm_tty_get_icount()
1064 icount->parity = acm->iocount.parity; in acm_tty_get_icount()
1065 icount->brk = acm->iocount.brk; in acm_tty_get_icount()
1073 struct acm *acm = tty->driver_data; in acm_tty_ioctl() local
1074 int rv = -ENOIOCTLCMD; in acm_tty_ioctl()
1078 rv = usb_autopm_get_interface(acm->control); in acm_tty_ioctl()
1080 rv = -EIO; in acm_tty_ioctl()
1083 rv = wait_serial_change(acm, arg); in acm_tty_ioctl()
1084 usb_autopm_put_interface(acm->control); in acm_tty_ioctl()
1094 struct acm *acm = tty->driver_data; in acm_tty_set_termios() local
1095 struct ktermios *termios = &tty->termios; in acm_tty_set_termios()
1097 int newctrl = acm->ctrlout; in acm_tty_set_termios()
1100 newline.bCharFormat = termios->c_cflag & CSTOPB ? 2 : 0; in acm_tty_set_termios()
1101 newline.bParityType = termios->c_cflag & PARENB ? in acm_tty_set_termios()
1102 (termios->c_cflag & PARODD ? 1 : 2) + in acm_tty_set_termios()
1103 (termios->c_cflag & CMSPAR ? 2 : 0) : 0; in acm_tty_set_termios()
1104 newline.bDataBits = tty_get_char_size(termios->c_cflag); in acm_tty_set_termios()
1107 acm->clocal = ((termios->c_cflag & CLOCAL) != 0); in acm_tty_set_termios()
1110 newline.dwDTERate = acm->line.dwDTERate; in acm_tty_set_termios()
1112 } else if (termios_old && (termios_old->c_cflag & CBAUD) == B0) { in acm_tty_set_termios()
1116 if (newctrl != acm->ctrlout) in acm_tty_set_termios()
1117 acm_set_control(acm, acm->ctrlout = newctrl); in acm_tty_set_termios()
1119 if (memcmp(&acm->line, &newline, sizeof newline)) { in acm_tty_set_termios()
1120 memcpy(&acm->line, &newline, sizeof newline); in acm_tty_set_termios()
1121 dev_dbg(&acm->control->dev, "%s - set line: %d %d %d %d\n", in acm_tty_set_termios()
1126 acm_set_line(acm, &acm->line); in acm_tty_set_termios()
1142 static void acm_write_buffers_free(struct acm *acm) in acm_write_buffers_free() argument
1147 for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++) in acm_write_buffers_free()
1148 usb_free_coherent(acm->dev, acm->writesize, wb->buf, wb->dmah); in acm_write_buffers_free()
1151 static void acm_read_buffers_free(struct acm *acm) in acm_read_buffers_free() argument
1155 for (i = 0; i < acm->rx_buflimit; i++) in acm_read_buffers_free()
1156 usb_free_coherent(acm->dev, acm->readsize, in acm_read_buffers_free()
1157 acm->read_buffers[i].base, acm->read_buffers[i].dma); in acm_read_buffers_free()
1161 static int acm_write_buffers_alloc(struct acm *acm) in acm_write_buffers_alloc() argument
1166 for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++) { in acm_write_buffers_alloc()
1167 wb->buf = usb_alloc_coherent(acm->dev, acm->writesize, GFP_KERNEL, in acm_write_buffers_alloc()
1168 &wb->dmah); in acm_write_buffers_alloc()
1169 if (!wb->buf) { in acm_write_buffers_alloc()
1171 --i; in acm_write_buffers_alloc()
1172 --wb; in acm_write_buffers_alloc()
1173 usb_free_coherent(acm->dev, acm->writesize, in acm_write_buffers_alloc()
1174 wb->buf, wb->dmah); in acm_write_buffers_alloc()
1176 return -ENOMEM; in acm_write_buffers_alloc()
1187 unsigned char *buffer = intf->altsetting->extra; in acm_probe()
1188 int buflen = intf->altsetting->extralen; in acm_probe()
1196 struct acm *acm; in acm_probe() local
1200 int call_intf_num = -1; in acm_probe()
1201 int data_intf_num = -1; in acm_probe()
1207 int rv = -ENOMEM; in acm_probe()
1211 quirks = (unsigned long)id->driver_info; in acm_probe()
1214 return -ENODEV; in acm_probe()
1226 return -ENODEV; in acm_probe()
1232 dev_err(&intf->dev, "Weird descriptor references\n"); in acm_probe()
1233 return -EINVAL; in acm_probe()
1237 if (intf->cur_altsetting->endpoint && in acm_probe()
1238 intf->cur_altsetting->endpoint->extralen && in acm_probe()
1239 intf->cur_altsetting->endpoint->extra) { in acm_probe()
1240 dev_dbg(&intf->dev, in acm_probe()
1242 buflen = intf->cur_altsetting->endpoint->extralen; in acm_probe()
1243 buffer = intf->cur_altsetting->endpoint->extra; in acm_probe()
1245 dev_err(&intf->dev, in acm_probe()
1247 return -EINVAL; in acm_probe()
1255 call_intf_num = cmgmd->bDataInterface; in acm_probe()
1258 if (intf->cur_altsetting->desc.bNumEndpoints == 3) { in acm_probe()
1259 dev_dbg(&intf->dev, "No union descriptor, assuming single interface\n"); in acm_probe()
1264 dev_dbg(&intf->dev, "No union descriptor, using call management descriptor\n"); in acm_probe()
1269 dev_dbg(&intf->dev, "No union descriptor, giving up\n"); in acm_probe()
1270 return -ENODEV; in acm_probe()
1273 int class = -1; in acm_probe()
1275 data_intf_num = union_header->bSlaveInterface0; in acm_probe()
1276 control_interface = usb_ifnum_to_if(usb_dev, union_header->bMasterInterface0); in acm_probe()
1280 class = control_interface->cur_altsetting->desc.bInterfaceClass; in acm_probe()
1283 dev_dbg(&intf->dev, "Broken union descriptor, assuming single interface\n"); in acm_probe()
1291 dev_dbg(&intf->dev, "no interfaces\n"); in acm_probe()
1292 return -ENODEV; in acm_probe()
1296 dev_dbg(&intf->dev, "Separate call control interface. That is not fully supported.\n"); in acm_probe()
1300 dev_warn(&intf->dev,"Control and data interfaces are not separated!\n"); in acm_probe()
1304 if (data_interface->cur_altsetting->desc.bNumEndpoints != 3) { in acm_probe()
1305 dev_err(&intf->dev, "This needs exactly 3 endpoints\n"); in acm_probe()
1306 return -EINVAL; in acm_probe()
1309 res = usb_find_common_endpoints(data_interface->cur_altsetting, in acm_probe()
1320 if (data_interface->cur_altsetting->desc.bInterfaceClass != USB_CLASS_CDC_DATA) { in acm_probe()
1321 if (control_interface->cur_altsetting->desc.bInterfaceClass == USB_CLASS_CDC_DATA) { in acm_probe()
1322 dev_dbg(&intf->dev, in acm_probe()
1326 return -EINVAL; in acm_probe()
1332 return -ENODEV; in acm_probe()
1334 if (data_interface->cur_altsetting->desc.bNumEndpoints < 2 || in acm_probe()
1335 control_interface->cur_altsetting->desc.bNumEndpoints == 0) in acm_probe()
1336 return -EINVAL; in acm_probe()
1338 epctrl = &control_interface->cur_altsetting->endpoint[0].desc; in acm_probe()
1339 epread = &data_interface->cur_altsetting->endpoint[0].desc; in acm_probe()
1340 epwrite = &data_interface->cur_altsetting->endpoint[1].desc; in acm_probe()
1346 dev_dbg(&intf->dev, in acm_probe()
1351 dev_dbg(&intf->dev, "interfaces are valid\n"); in acm_probe()
1353 acm = kzalloc(sizeof(struct acm), GFP_KERNEL); in acm_probe()
1354 if (!acm) in acm_probe()
1355 return -ENOMEM; in acm_probe()
1357 tty_port_init(&acm->port); in acm_probe()
1358 acm->port.ops = &acm_port_ops; in acm_probe()
1363 acm->combined_interfaces = combined_interfaces; in acm_probe()
1364 acm->writesize = usb_endpoint_maxp(epwrite) * 20; in acm_probe()
1365 acm->control = control_interface; in acm_probe()
1366 acm->data = data_interface; in acm_probe()
1368 usb_get_intf(acm->control); /* undone in destruct() */ in acm_probe()
1370 minor = acm_alloc_minor(acm); in acm_probe()
1372 acm->minor = ACM_MINOR_INVALID; in acm_probe()
1376 acm->minor = minor; in acm_probe()
1377 acm->dev = usb_dev; in acm_probe()
1379 acm->ctrl_caps = h.usb_cdc_acm_descriptor->bmCapabilities; in acm_probe()
1381 acm->ctrl_caps &= ~USB_CDC_CAP_LINE; in acm_probe()
1382 acm->ctrlsize = ctrlsize; in acm_probe()
1383 acm->readsize = readsize; in acm_probe()
1384 acm->rx_buflimit = num_rx_buf; in acm_probe()
1385 INIT_DELAYED_WORK(&acm->dwork, acm_softint); in acm_probe()
1386 init_waitqueue_head(&acm->wioctl); in acm_probe()
1387 spin_lock_init(&acm->write_lock); in acm_probe()
1388 spin_lock_init(&acm->read_lock); in acm_probe()
1389 mutex_init(&acm->mutex); in acm_probe()
1391 acm->bInterval = epread->bInterval; in acm_probe()
1392 acm->in = usb_rcvintpipe(usb_dev, epread->bEndpointAddress); in acm_probe()
1394 acm->in = usb_rcvbulkpipe(usb_dev, epread->bEndpointAddress); in acm_probe()
1397 acm->out = usb_sndintpipe(usb_dev, epwrite->bEndpointAddress); in acm_probe()
1399 acm->out = usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress); in acm_probe()
1400 init_usb_anchor(&acm->delayed); in acm_probe()
1401 acm->quirks = quirks; in acm_probe()
1403 buf = usb_alloc_coherent(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma); in acm_probe()
1406 acm->ctrl_buffer = buf; in acm_probe()
1408 if (acm_write_buffers_alloc(acm) < 0) in acm_probe()
1411 acm->ctrlurb = usb_alloc_urb(0, GFP_KERNEL); in acm_probe()
1412 if (!acm->ctrlurb) in acm_probe()
1416 struct acm_rb *rb = &(acm->read_buffers[i]); in acm_probe()
1419 rb->base = usb_alloc_coherent(acm->dev, readsize, GFP_KERNEL, in acm_probe()
1420 &rb->dma); in acm_probe()
1421 if (!rb->base) in acm_probe()
1423 rb->index = i; in acm_probe()
1424 rb->instance = acm; in acm_probe()
1430 urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; in acm_probe()
1431 urb->transfer_dma = rb->dma; in acm_probe()
1433 usb_fill_int_urb(urb, acm->dev, acm->in, rb->base, in acm_probe()
1434 acm->readsize, in acm_probe()
1436 acm->bInterval); in acm_probe()
1438 usb_fill_bulk_urb(urb, acm->dev, acm->in, rb->base, in acm_probe()
1439 acm->readsize, in acm_probe()
1442 acm->read_urbs[i] = urb; in acm_probe()
1443 __set_bit(i, &acm->read_urbs_free); in acm_probe()
1446 struct acm_wb *snd = &(acm->wb[i]); in acm_probe()
1448 snd->urb = usb_alloc_urb(0, GFP_KERNEL); in acm_probe()
1449 if (!snd->urb) in acm_probe()
1453 usb_fill_int_urb(snd->urb, usb_dev, acm->out, in acm_probe()
1454 NULL, acm->writesize, acm_write_bulk, snd, epwrite->bInterval); in acm_probe()
1456 usb_fill_bulk_urb(snd->urb, usb_dev, acm->out, in acm_probe()
1457 NULL, acm->writesize, acm_write_bulk, snd); in acm_probe()
1458 snd->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; in acm_probe()
1460 snd->urb->transfer_flags |= URB_ZERO_PACKET; in acm_probe()
1461 snd->instance = acm; in acm_probe()
1464 usb_set_intfdata(intf, acm); in acm_probe()
1466 i = device_create_file(&intf->dev, &dev_attr_bmCapabilities); in acm_probe()
1474 acm->country_codes = kmalloc(cfd->bLength - 4, GFP_KERNEL); in acm_probe()
1475 if (!acm->country_codes) in acm_probe()
1477 acm->country_code_size = cfd->bLength - 4; in acm_probe()
1478 memcpy(acm->country_codes, (u8 *)&cfd->wCountyCode0, in acm_probe()
1479 cfd->bLength - 4); in acm_probe()
1480 acm->country_rel_date = cfd->iCountryCodeRelDate; in acm_probe()
1482 i = device_create_file(&intf->dev, &dev_attr_wCountryCodes); in acm_probe()
1484 kfree(acm->country_codes); in acm_probe()
1485 acm->country_codes = NULL; in acm_probe()
1486 acm->country_code_size = 0; in acm_probe()
1490 i = device_create_file(&intf->dev, in acm_probe()
1493 device_remove_file(&intf->dev, &dev_attr_wCountryCodes); in acm_probe()
1494 kfree(acm->country_codes); in acm_probe()
1495 acm->country_codes = NULL; in acm_probe()
1496 acm->country_code_size = 0; in acm_probe()
1502 usb_fill_int_urb(acm->ctrlurb, usb_dev, in acm_probe()
1503 usb_rcvintpipe(usb_dev, epctrl->bEndpointAddress), in acm_probe()
1504 acm->ctrl_buffer, ctrlsize, acm_ctrl_irq, acm, in acm_probe()
1506 epctrl->bInterval ? epctrl->bInterval : 16); in acm_probe()
1507 acm->ctrlurb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; in acm_probe()
1508 acm->ctrlurb->transfer_dma = acm->ctrl_dma; in acm_probe()
1509 acm->notification_buffer = NULL; in acm_probe()
1510 acm->nb_index = 0; in acm_probe()
1511 acm->nb_size = 0; in acm_probe()
1513 acm->line.dwDTERate = cpu_to_le32(9600); in acm_probe()
1514 acm->line.bDataBits = 8; in acm_probe()
1515 acm_set_line(acm, &acm->line); in acm_probe()
1517 if (!acm->combined_interfaces) { in acm_probe()
1518 rv = usb_driver_claim_interface(&acm_driver, data_interface, acm); in acm_probe()
1523 tty_dev = tty_port_register_device(&acm->port, acm_tty_driver, minor, in acm_probe()
1524 &control_interface->dev); in acm_probe()
1531 usb_clear_halt(usb_dev, acm->in); in acm_probe()
1532 usb_clear_halt(usb_dev, acm->out); in acm_probe()
1535 dev_info(&intf->dev, "ttyACM%d: USB ACM device\n", minor); in acm_probe()
1540 if (!acm->combined_interfaces) { in acm_probe()
1546 if (acm->country_codes) { in acm_probe()
1547 device_remove_file(&acm->control->dev, in acm_probe()
1549 device_remove_file(&acm->control->dev, in acm_probe()
1552 device_remove_file(&acm->control->dev, &dev_attr_bmCapabilities); in acm_probe()
1555 usb_free_urb(acm->wb[i].urb); in acm_probe()
1558 usb_free_urb(acm->read_urbs[i]); in acm_probe()
1559 acm_read_buffers_free(acm); in acm_probe()
1560 usb_free_urb(acm->ctrlurb); in acm_probe()
1562 acm_write_buffers_free(acm); in acm_probe()
1564 usb_free_coherent(usb_dev, ctrlsize, acm->ctrl_buffer, acm->ctrl_dma); in acm_probe()
1566 tty_port_put(&acm->port); in acm_probe()
1573 struct acm *acm = usb_get_intfdata(intf); in acm_disconnect() local
1578 if (!acm) in acm_disconnect()
1581 acm->disconnected = true; in acm_disconnect()
1587 acm_poison_urbs(acm); in acm_disconnect()
1588 mutex_lock(&acm->mutex); in acm_disconnect()
1589 if (acm->country_codes) { in acm_disconnect()
1590 device_remove_file(&acm->control->dev, in acm_disconnect()
1592 device_remove_file(&acm->control->dev, in acm_disconnect()
1595 wake_up_all(&acm->wioctl); in acm_disconnect()
1596 device_remove_file(&acm->control->dev, &dev_attr_bmCapabilities); in acm_disconnect()
1597 usb_set_intfdata(acm->control, NULL); in acm_disconnect()
1598 usb_set_intfdata(acm->data, NULL); in acm_disconnect()
1599 mutex_unlock(&acm->mutex); in acm_disconnect()
1601 tty = tty_port_tty_get(&acm->port); in acm_disconnect()
1607 cancel_delayed_work_sync(&acm->dwork); in acm_disconnect()
1609 tty_unregister_device(acm_tty_driver, acm->minor); in acm_disconnect()
1611 usb_free_urb(acm->ctrlurb); in acm_disconnect()
1613 usb_free_urb(acm->wb[i].urb); in acm_disconnect()
1614 for (i = 0; i < acm->rx_buflimit; i++) in acm_disconnect()
1615 usb_free_urb(acm->read_urbs[i]); in acm_disconnect()
1616 acm_write_buffers_free(acm); in acm_disconnect()
1617 usb_free_coherent(acm->dev, acm->ctrlsize, acm->ctrl_buffer, acm->ctrl_dma); in acm_disconnect()
1618 acm_read_buffers_free(acm); in acm_disconnect()
1620 kfree(acm->notification_buffer); in acm_disconnect()
1622 if (!acm->combined_interfaces) in acm_disconnect()
1623 usb_driver_release_interface(&acm_driver, intf == acm->control ? in acm_disconnect()
1624 acm->data : acm->control); in acm_disconnect()
1626 tty_port_put(&acm->port); in acm_disconnect()
1632 struct acm *acm = usb_get_intfdata(intf); in acm_suspend() local
1635 spin_lock_irq(&acm->write_lock); in acm_suspend()
1637 if (acm->transmitting) { in acm_suspend()
1638 spin_unlock_irq(&acm->write_lock); in acm_suspend()
1639 return -EBUSY; in acm_suspend()
1642 cnt = acm->susp_count++; in acm_suspend()
1643 spin_unlock_irq(&acm->write_lock); in acm_suspend()
1648 acm_poison_urbs(acm); in acm_suspend()
1649 cancel_delayed_work_sync(&acm->dwork); in acm_suspend()
1650 acm->urbs_in_error_delay = 0; in acm_suspend()
1657 struct acm *acm = usb_get_intfdata(intf); in acm_resume() local
1661 spin_lock_irq(&acm->write_lock); in acm_resume()
1663 if (--acm->susp_count) in acm_resume()
1666 acm_unpoison_urbs(acm); in acm_resume()
1668 if (tty_port_initialized(&acm->port)) { in acm_resume()
1669 rv = usb_submit_urb(acm->ctrlurb, GFP_ATOMIC); in acm_resume()
1672 urb = usb_get_from_anchor(&acm->delayed); in acm_resume()
1676 acm_start_wb(acm, urb->context); in acm_resume()
1686 rv = acm_submit_read_urbs(acm, GFP_ATOMIC); in acm_resume()
1689 spin_unlock_irq(&acm->write_lock); in acm_resume()
1696 struct acm *acm = usb_get_intfdata(intf); in acm_reset_resume() local
1698 if (tty_port_initialized(&acm->port)) in acm_reset_resume()
1699 tty_port_tty_hangup(&acm->port, false); in acm_reset_resume()
1708 struct acm *acm = usb_get_intfdata(intf); in acm_pre_reset() local
1710 clear_bit(EVENT_RX_STALL, &acm->flags); in acm_pre_reset()
1711 acm->nb_index = 0; /* pending control transfers are lost */ in acm_pre_reset()
1734 { USB_DEVICE(0x076d, 0x0006), /* Denso Cradle CU-321 */
1741 { USB_DEVICE(0x045b, 0x023c), /* Renesas R-Car H3 USB Download mode */
1744 { USB_DEVICE(0x045b, 0x0247), /* Renesas R-Car D3 USB Download mode */
1747 { USB_DEVICE(0x045b, 0x0248), /* Renesas R-Car M3-N USB Download mode */
1750 { USB_DEVICE(0x045b, 0x024D), /* Renesas R-Car E3 USB Download mode */
1762 { USB_DEVICE(0x0482, 0x0203), /* KYOCERA AH-K3001V */
1765 { USB_DEVICE(0x079b, 0x000f), /* BT On-Air USB MODEM */
1774 { USB_DEVICE(0x0ace, 0x1611), /* ZyDAS 56K USB MODEM - new version */
1795 { USB_DEVICE(0x0572, 0x1324), /* Conexant USB MODEM RD02-D400 */
1798 { USB_DEVICE(0x0572, 0x1328), /* Shiro / Aztech USB MODEM UM-3100 */
1806 { USB_DEVICE(0x2184, 0x001c) }, /* GW Instek AFG-2225 */
1807 { USB_DEVICE(0x2184, 0x0036) }, /* GW Instek AFG-125 */
1841 { USB_DEVICE(0x0572, 0x1340), /* Conexant CX93010-2x UCMxx */
1847 { USB_DEVICE(0x1bbb, 0x0003), /* Alcatel OT-I650 */
1853 { USB_DEVICE(0xfff0, 0x0100), /* DATECS FP-2000 */
1870 /* Nokia S60 phones expose two ACM channels. The first is
1871 * a modem and is picked up by the standard AT-command
1872 * information below. The second is 'vendor-specific' but
1905 { NOKIA_PCSUITE_ACM_INFO(0x04F0), }, /* Nokia N95 & N95-3 NAM */
1907 { NOKIA_PCSUITE_ACM_INFO(0x0099), }, /* Nokia 6210 Navigator, RM-367 */
1908 { NOKIA_PCSUITE_ACM_INFO(0x0128), }, /* Nokia 6210 Navigator, RM-419 */
1913 { NOKIA_PCSUITE_ACM_INFO(0x003a), }, /* Nokia N96 & N96-3 */
1916 { NOKIA_PCSUITE_ACM_INFO(0x01f5), }, /* Nokia N97, RM-505 */
1917 { NOKIA_PCSUITE_ACM_INFO(0x02e3), }, /* Nokia 5230, RM-588 */
1936 /* NOTE: non-Nokia COMM/ACM/0xff is likely MSFT RNDIS... NOT a modem! */
1992 { USB_DEVICE(0x1bc7, 0x0021), /* Telit 3G ACM only composition */
1995 { USB_DEVICE(0x1bc7, 0x0023), /* Telit 3G ACM + ECM composition */
2013 /* control interfaces with various AT-command sets */
2090 acm_tty_driver->driver_name = "acm", in acm_init()
2091 acm_tty_driver->name = "ttyACM", in acm_init()
2092 acm_tty_driver->major = ACM_TTY_MAJOR, in acm_init()
2093 acm_tty_driver->minor_start = 0, in acm_init()
2094 acm_tty_driver->type = TTY_DRIVER_TYPE_SERIAL, in acm_init()
2095 acm_tty_driver->subtype = SERIAL_TYPE_NORMAL, in acm_init()
2096 acm_tty_driver->init_termios = tty_std_termios; in acm_init()
2097 acm_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | in acm_init()