Lines Matching +full:overrun +full:- +full:throttle +full:- +full:ms
1 // SPDX-License-Identifier: GPL-2.0+
3 * cdc-acm.c
41 #include "cdc-acm.h"
71 mutex_lock(&acm->mutex); in acm_get_by_minor()
72 if (acm->disconnected) { in acm_get_by_minor()
73 mutex_unlock(&acm->mutex); in acm_get_by_minor()
76 tty_port_get(&acm->port); in acm_get_by_minor()
77 mutex_unlock(&acm->mutex); in acm_get_by_minor()
102 idr_remove(&acm_minors, acm->minor); in acm_release_minor()
115 retval = usb_autopm_get_interface(acm->control); in acm_ctrl_msg()
119 retval = usb_control_msg(acm->dev, usb_sndctrlpipe(acm->dev, 0), in acm_ctrl_msg()
121 acm->control->altsetting[0].desc.bInterfaceNumber, in acm_ctrl_msg()
124 dev_dbg(&acm->control->dev, in acm_ctrl_msg()
125 "%s - rq 0x%02x, val %#x, len %#x, result %d\n", in acm_ctrl_msg()
128 usb_autopm_put_interface(acm->control); in acm_ctrl_msg()
138 if (acm->quirks & QUIRK_CONTROL_LINE_STATE) in acm_set_control()
139 return -EOPNOTSUPP; in acm_set_control()
147 #define acm_send_break(acm, ms) \ argument
148 acm_ctrl_msg(acm, USB_CDC_REQ_SEND_BREAK, ms, NULL, 0)
154 usb_kill_urb(acm->ctrlurb); in acm_kill_urbs()
156 usb_kill_urb(acm->wb[i].urb); in acm_kill_urbs()
157 for (i = 0; i < acm->rx_buflimit; i++) in acm_kill_urbs()
158 usb_kill_urb(acm->read_urbs[i]); in acm_kill_urbs()
174 wb = &acm->wb[wbn]; in acm_wb_alloc()
175 if (!wb->use) { in acm_wb_alloc()
176 wb->use = 1; in acm_wb_alloc()
177 wb->len = 0; in acm_wb_alloc()
182 return -1; in acm_wb_alloc()
192 spin_lock_irqsave(&acm->write_lock, flags); in acm_wb_is_avail()
194 n -= acm->wb[i].use; in acm_wb_is_avail()
195 spin_unlock_irqrestore(&acm->write_lock, flags); in acm_wb_is_avail()
200 * Finish write. Caller must hold acm->write_lock
204 wb->use = 0; in acm_write_done()
205 acm->transmitting--; in acm_write_done()
206 usb_autopm_put_interface_async(acm->control); in acm_write_done()
219 acm->transmitting++; in acm_start_wb()
221 wb->urb->transfer_buffer = wb->buf; in acm_start_wb()
222 wb->urb->transfer_dma = wb->dmah; in acm_start_wb()
223 wb->urb->transfer_buffer_length = wb->len; in acm_start_wb()
224 wb->urb->dev = acm->dev; in acm_start_wb()
226 rc = usb_submit_urb(wb->urb, GFP_ATOMIC); in acm_start_wb()
228 dev_err(&acm->data->dev, in acm_start_wb()
229 "%s - usb_submit_urb(write bulk) failed: %d\n", in acm_start_wb()
245 return sprintf(buf, "%d", acm->ctrl_caps); in bmCapabilities_show()
255 memcpy(buf, acm->country_codes, acm->country_code_size); in wCountryCodes_show()
256 return acm->country_code_size; in wCountryCodes_show()
267 return sprintf(buf, "%d", acm->country_rel_date); in iCountryCodeRelDate_show()
283 switch (dr->bNotificationType) { in acm_process_notification()
285 dev_dbg(&acm->control->dev, in acm_process_notification()
286 "%s - network connection: %d\n", __func__, dr->wValue); in acm_process_notification()
290 if (le16_to_cpu(dr->wLength) != 2) { in acm_process_notification()
291 dev_dbg(&acm->control->dev, in acm_process_notification()
292 "%s - malformed serial state\n", __func__); in acm_process_notification()
297 dev_dbg(&acm->control->dev, in acm_process_notification()
298 "%s - serial state: 0x%x\n", __func__, newctrl); in acm_process_notification()
300 if (!acm->clocal && (acm->ctrlin & ~newctrl & ACM_CTRL_DCD)) { in acm_process_notification()
301 dev_dbg(&acm->control->dev, in acm_process_notification()
302 "%s - calling hangup\n", __func__); in acm_process_notification()
303 tty_port_tty_hangup(&acm->port, false); in acm_process_notification()
306 difference = acm->ctrlin ^ newctrl; in acm_process_notification()
307 spin_lock_irqsave(&acm->read_lock, flags); in acm_process_notification()
308 acm->ctrlin = newctrl; in acm_process_notification()
309 acm->oldcount = acm->iocount; in acm_process_notification()
312 acm->iocount.dsr++; in acm_process_notification()
314 acm->iocount.dcd++; in acm_process_notification()
316 acm->iocount.brk++; in acm_process_notification()
318 acm->iocount.rng++; in acm_process_notification()
320 acm->iocount.frame++; in acm_process_notification()
322 acm->iocount.parity++; in acm_process_notification()
324 acm->iocount.overrun++; in acm_process_notification()
325 spin_unlock_irqrestore(&acm->read_lock, flags); in acm_process_notification()
328 wake_up_all(&acm->wioctl); in acm_process_notification()
333 dev_dbg(&acm->control->dev, in acm_process_notification()
334 "%s - unknown notification %d received: index %d len %d\n", in acm_process_notification()
336 dr->bNotificationType, dr->wIndex, dr->wLength); in acm_process_notification()
343 struct acm *acm = urb->context; in acm_ctrl_irq()
344 struct usb_cdc_notification *dr = urb->transfer_buffer; in acm_ctrl_irq()
345 unsigned int current_size = urb->actual_length; in acm_ctrl_irq()
348 int status = urb->status; in acm_ctrl_irq()
354 case -ECONNRESET: in acm_ctrl_irq()
355 case -ENOENT: in acm_ctrl_irq()
356 case -ESHUTDOWN: in acm_ctrl_irq()
358 dev_dbg(&acm->control->dev, in acm_ctrl_irq()
359 "%s - urb shutting down with status: %d\n", in acm_ctrl_irq()
363 dev_dbg(&acm->control->dev, in acm_ctrl_irq()
364 "%s - nonzero urb status received: %d\n", in acm_ctrl_irq()
369 usb_mark_last_busy(acm->dev); in acm_ctrl_irq()
371 if (acm->nb_index) in acm_ctrl_irq()
372 dr = (struct usb_cdc_notification *)acm->notification_buffer; in acm_ctrl_irq()
374 /* size = notification-header + (optional) data */ in acm_ctrl_irq()
376 le16_to_cpu(dr->wLength); in acm_ctrl_irq()
380 if (acm->nb_size < expected_size) { in acm_ctrl_irq()
384 new_buffer = krealloc(acm->notification_buffer, in acm_ctrl_irq()
387 acm->nb_index = 0; in acm_ctrl_irq()
391 acm->notification_buffer = new_buffer; in acm_ctrl_irq()
392 acm->nb_size = alloc_size; in acm_ctrl_irq()
393 dr = (struct usb_cdc_notification *)acm->notification_buffer; in acm_ctrl_irq()
397 expected_size - acm->nb_index); in acm_ctrl_irq()
399 memcpy(&acm->notification_buffer[acm->nb_index], in acm_ctrl_irq()
400 urb->transfer_buffer, copy_size); in acm_ctrl_irq()
401 acm->nb_index += copy_size; in acm_ctrl_irq()
402 current_size = acm->nb_index; in acm_ctrl_irq()
408 acm->nb_index = 0; in acm_ctrl_irq()
413 if (retval && retval != -EPERM && retval != -ENODEV) in acm_ctrl_irq()
414 dev_err(&acm->control->dev, in acm_ctrl_irq()
415 "%s - usb_submit_urb failed: %d\n", __func__, retval); in acm_ctrl_irq()
417 dev_vdbg(&acm->control->dev, in acm_ctrl_irq()
425 if (!test_and_clear_bit(index, &acm->read_urbs_free)) in acm_submit_read_urb()
428 res = usb_submit_urb(acm->read_urbs[index], mem_flags); in acm_submit_read_urb()
430 if (res != -EPERM && res != -ENODEV) { in acm_submit_read_urb()
431 dev_err(&acm->data->dev, in acm_submit_read_urb()
435 dev_vdbg(&acm->data->dev, "intended failure %d\n", res); in acm_submit_read_urb()
437 set_bit(index, &acm->read_urbs_free); in acm_submit_read_urb()
440 dev_vdbg(&acm->data->dev, "submitted urb %d\n", index); in acm_submit_read_urb()
451 for (i = 0; i < acm->rx_buflimit; ++i) { in acm_submit_read_urbs()
462 if (!urb->actual_length) in acm_process_read_urb()
465 tty_insert_flip_string(&acm->port, urb->transfer_buffer, in acm_process_read_urb()
466 urb->actual_length); in acm_process_read_urb()
467 tty_flip_buffer_push(&acm->port); in acm_process_read_urb()
472 struct acm_rb *rb = urb->context; in acm_read_bulk_callback()
473 struct acm *acm = rb->instance; in acm_read_bulk_callback()
475 int status = urb->status; in acm_read_bulk_callback()
480 dev_vdbg(&acm->data->dev, "got urb %d, len %d, status %d\n", in acm_read_bulk_callback()
481 rb->index, urb->actual_length, status); in acm_read_bulk_callback()
483 if (!acm->dev) { in acm_read_bulk_callback()
484 dev_dbg(&acm->data->dev, "%s - disconnected\n", __func__); in acm_read_bulk_callback()
490 usb_mark_last_busy(acm->dev); in acm_read_bulk_callback()
493 case -EPIPE: in acm_read_bulk_callback()
494 set_bit(EVENT_RX_STALL, &acm->flags); in acm_read_bulk_callback()
497 case -ENOENT: in acm_read_bulk_callback()
498 case -ECONNRESET: in acm_read_bulk_callback()
499 case -ESHUTDOWN: in acm_read_bulk_callback()
500 dev_dbg(&acm->data->dev, in acm_read_bulk_callback()
501 "%s - urb shutting down with status: %d\n", in acm_read_bulk_callback()
505 case -EOVERFLOW: in acm_read_bulk_callback()
506 case -EPROTO: in acm_read_bulk_callback()
507 dev_dbg(&acm->data->dev, in acm_read_bulk_callback()
508 "%s - cooling babbling device\n", __func__); in acm_read_bulk_callback()
509 usb_mark_last_busy(acm->dev); in acm_read_bulk_callback()
510 set_bit(rb->index, &acm->urbs_in_error_delay); in acm_read_bulk_callback()
511 set_bit(ACM_ERROR_DELAY, &acm->flags); in acm_read_bulk_callback()
515 dev_dbg(&acm->data->dev, in acm_read_bulk_callback()
516 "%s - nonzero urb status received: %d\n", in acm_read_bulk_callback()
527 set_bit(rb->index, &acm->read_urbs_free); in acm_read_bulk_callback()
537 schedule_delayed_work(&acm->dwork, 0); in acm_read_bulk_callback()
539 schedule_delayed_work(&acm->dwork, HZ / 2); in acm_read_bulk_callback()
543 /* throttle device if requested by tty */ in acm_read_bulk_callback()
544 spin_lock_irqsave(&acm->read_lock, flags); in acm_read_bulk_callback()
545 acm->throttled = acm->throttle_req; in acm_read_bulk_callback()
546 if (!acm->throttled) { in acm_read_bulk_callback()
547 spin_unlock_irqrestore(&acm->read_lock, flags); in acm_read_bulk_callback()
548 acm_submit_read_urb(acm, rb->index, GFP_ATOMIC); in acm_read_bulk_callback()
550 spin_unlock_irqrestore(&acm->read_lock, flags); in acm_read_bulk_callback()
557 struct acm_wb *wb = urb->context; in acm_write_bulk()
558 struct acm *acm = wb->instance; in acm_write_bulk()
560 int status = urb->status; in acm_write_bulk()
562 if (status || (urb->actual_length != urb->transfer_buffer_length)) in acm_write_bulk()
563 dev_vdbg(&acm->data->dev, "wrote len %d/%d, status %d\n", in acm_write_bulk()
564 urb->actual_length, in acm_write_bulk()
565 urb->transfer_buffer_length, in acm_write_bulk()
568 spin_lock_irqsave(&acm->write_lock, flags); in acm_write_bulk()
570 spin_unlock_irqrestore(&acm->write_lock, flags); in acm_write_bulk()
571 set_bit(EVENT_TTY_WAKEUP, &acm->flags); in acm_write_bulk()
572 schedule_delayed_work(&acm->dwork, 0); in acm_write_bulk()
580 if (test_bit(EVENT_RX_STALL, &acm->flags)) { in acm_softint()
582 if (!acm->susp_count) { in acm_softint()
583 for (i = 0; i < acm->rx_buflimit; i++) in acm_softint()
584 usb_kill_urb(acm->read_urbs[i]); in acm_softint()
585 usb_clear_halt(acm->dev, acm->in); in acm_softint()
587 clear_bit(EVENT_RX_STALL, &acm->flags); in acm_softint()
591 if (test_and_clear_bit(ACM_ERROR_DELAY, &acm->flags)) { in acm_softint()
592 for (i = 0; i < acm->rx_buflimit; i++) in acm_softint()
593 if (test_and_clear_bit(i, &acm->urbs_in_error_delay)) in acm_softint()
597 if (test_and_clear_bit(EVENT_TTY_WAKEUP, &acm->flags)) in acm_softint()
598 tty_port_tty_wakeup(&acm->port); in acm_softint()
610 acm = acm_get_by_minor(tty->index); in acm_tty_install()
612 return -ENODEV; in acm_tty_install()
622 if (acm->quirks & DISABLE_ECHO) in acm_tty_install()
623 tty->termios.c_lflag &= ~ECHO; in acm_tty_install()
625 tty->driver_data = acm; in acm_tty_install()
630 tty_port_put(&acm->port); in acm_tty_install()
636 struct acm *acm = tty->driver_data; in acm_tty_open()
638 return tty_port_open(&acm->port, tty, filp); in acm_tty_open()
653 acm->ctrlout = val; in acm_port_dtr_rts()
656 if (res && (acm->ctrl_caps & USB_CDC_CAP_LINE)) in acm_port_dtr_rts()
657 dev_err(&acm->control->dev, "failed to set dtr/rts\n"); in acm_port_dtr_rts()
663 int retval = -ENODEV; in acm_port_activate()
666 mutex_lock(&acm->mutex); in acm_port_activate()
667 if (acm->disconnected) in acm_port_activate()
670 retval = usb_autopm_get_interface(acm->control); in acm_port_activate()
678 set_bit(TTY_NO_WRITE_SPLIT, &tty->flags); in acm_port_activate()
679 acm->control->needs_remote_wakeup = 1; in acm_port_activate()
681 acm->ctrlurb->dev = acm->dev; in acm_port_activate()
682 retval = usb_submit_urb(acm->ctrlurb, GFP_KERNEL); in acm_port_activate()
684 dev_err(&acm->control->dev, in acm_port_activate()
685 "%s - usb_submit_urb(ctrl irq) failed\n", __func__); in acm_port_activate()
694 spin_lock_irq(&acm->read_lock); in acm_port_activate()
695 acm->throttled = 0; in acm_port_activate()
696 acm->throttle_req = 0; in acm_port_activate()
697 spin_unlock_irq(&acm->read_lock); in acm_port_activate()
703 usb_autopm_put_interface(acm->control); in acm_port_activate()
705 mutex_unlock(&acm->mutex); in acm_port_activate()
710 for (i = 0; i < acm->rx_buflimit; i++) in acm_port_activate()
711 usb_kill_urb(acm->read_urbs[i]); in acm_port_activate()
712 usb_kill_urb(acm->ctrlurb); in acm_port_activate()
714 usb_autopm_put_interface(acm->control); in acm_port_activate()
717 mutex_unlock(&acm->mutex); in acm_port_activate()
727 usb_put_intf(acm->control); in acm_port_destruct()
728 kfree(acm->country_codes); in acm_port_destruct()
740 * hold it due to the tty-port initialised flag. in acm_port_shutdown()
742 spin_lock_irq(&acm->write_lock); in acm_port_shutdown()
743 spin_unlock_irq(&acm->write_lock); in acm_port_shutdown()
745 usb_autopm_get_interface_no_resume(acm->control); in acm_port_shutdown()
746 acm->control->needs_remote_wakeup = 0; in acm_port_shutdown()
747 usb_autopm_put_interface(acm->control); in acm_port_shutdown()
750 urb = usb_get_from_anchor(&acm->delayed); in acm_port_shutdown()
753 wb = urb->context; in acm_port_shutdown()
754 wb->use = 0; in acm_port_shutdown()
755 usb_autopm_put_interface_async(acm->control); in acm_port_shutdown()
763 struct acm *acm = tty->driver_data; in acm_tty_cleanup()
765 tty_port_put(&acm->port); in acm_tty_cleanup()
770 struct acm *acm = tty->driver_data; in acm_tty_hangup()
772 tty_port_hangup(&acm->port); in acm_tty_hangup()
777 struct acm *acm = tty->driver_data; in acm_tty_close()
779 tty_port_close(&acm->port, tty, filp); in acm_tty_close()
785 struct acm *acm = tty->driver_data; in acm_tty_write()
794 dev_vdbg(&acm->data->dev, "%d bytes from tty layer\n", count); in acm_tty_write()
796 spin_lock_irqsave(&acm->write_lock, flags); in acm_tty_write()
799 spin_unlock_irqrestore(&acm->write_lock, flags); in acm_tty_write()
802 wb = &acm->wb[wbn]; in acm_tty_write()
804 if (!acm->dev) { in acm_tty_write()
805 wb->use = 0; in acm_tty_write()
806 spin_unlock_irqrestore(&acm->write_lock, flags); in acm_tty_write()
807 return -ENODEV; in acm_tty_write()
810 count = (count > acm->writesize) ? acm->writesize : count; in acm_tty_write()
811 dev_vdbg(&acm->data->dev, "writing %d bytes\n", count); in acm_tty_write()
812 memcpy(wb->buf, buf, count); in acm_tty_write()
813 wb->len = count; in acm_tty_write()
815 stat = usb_autopm_get_interface_async(acm->control); in acm_tty_write()
817 wb->use = 0; in acm_tty_write()
818 spin_unlock_irqrestore(&acm->write_lock, flags); in acm_tty_write()
822 if (acm->susp_count) { in acm_tty_write()
823 usb_anchor_urb(wb->urb, &acm->delayed); in acm_tty_write()
824 spin_unlock_irqrestore(&acm->write_lock, flags); in acm_tty_write()
829 spin_unlock_irqrestore(&acm->write_lock, flags); in acm_tty_write()
838 struct acm *acm = tty->driver_data; in acm_tty_write_room()
843 return acm_wb_is_avail(acm) ? acm->writesize : 0; in acm_tty_write_room()
848 struct acm *acm = tty->driver_data; in acm_tty_chars_in_buffer()
853 if (acm->disconnected) in acm_tty_chars_in_buffer()
858 return (ACM_NW - acm_wb_is_avail(acm)) * acm->writesize; in acm_tty_chars_in_buffer()
863 struct acm *acm = tty->driver_data; in acm_tty_throttle()
865 spin_lock_irq(&acm->read_lock); in acm_tty_throttle()
866 acm->throttle_req = 1; in acm_tty_throttle()
867 spin_unlock_irq(&acm->read_lock); in acm_tty_throttle()
872 struct acm *acm = tty->driver_data; in acm_tty_unthrottle()
875 spin_lock_irq(&acm->read_lock); in acm_tty_unthrottle()
876 was_throttled = acm->throttled; in acm_tty_unthrottle()
877 acm->throttled = 0; in acm_tty_unthrottle()
878 acm->throttle_req = 0; in acm_tty_unthrottle()
879 spin_unlock_irq(&acm->read_lock); in acm_tty_unthrottle()
890 struct acm *acm = tty->driver_data; in acm_tty_break_ctl()
895 dev_dbg(&acm->control->dev, in acm_tty_break_ctl()
896 "%s - send break failed\n", __func__); in acm_tty_break_ctl()
902 struct acm *acm = tty->driver_data; in acm_tty_tiocmget()
904 return (acm->ctrlout & ACM_CTRL_DTR ? TIOCM_DTR : 0) | in acm_tty_tiocmget()
905 (acm->ctrlout & ACM_CTRL_RTS ? TIOCM_RTS : 0) | in acm_tty_tiocmget()
906 (acm->ctrlin & ACM_CTRL_DSR ? TIOCM_DSR : 0) | in acm_tty_tiocmget()
907 (acm->ctrlin & ACM_CTRL_RI ? TIOCM_RI : 0) | in acm_tty_tiocmget()
908 (acm->ctrlin & ACM_CTRL_DCD ? TIOCM_CD : 0) | in acm_tty_tiocmget()
915 struct acm *acm = tty->driver_data; in acm_tty_tiocmset()
918 newctrl = acm->ctrlout; in acm_tty_tiocmset()
926 if (acm->ctrlout == newctrl) in acm_tty_tiocmset()
928 return acm_set_control(acm, acm->ctrlout = newctrl); in acm_tty_tiocmset()
936 tmp.xmit_fifo_size = acm->writesize; in get_serial_info()
937 tmp.baud_base = le32_to_cpu(acm->line.dwDTERate); in get_serial_info()
938 tmp.close_delay = jiffies_to_msecs(acm->port.close_delay) / 10; in get_serial_info()
939 tmp.closing_wait = acm->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ? in get_serial_info()
941 jiffies_to_msecs(acm->port.closing_wait) / 10; in get_serial_info()
944 return -EFAULT; in get_serial_info()
958 return -EFAULT; in set_serial_info()
966 old_close_delay = jiffies_to_msecs(acm->port.close_delay) / 10; in set_serial_info()
967 old_closing_wait = acm->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ? in set_serial_info()
969 jiffies_to_msecs(acm->port.closing_wait) / 10; in set_serial_info()
971 mutex_lock(&acm->port.mutex); in set_serial_info()
976 retval = -EPERM; in set_serial_info()
978 retval = -EOPNOTSUPP; in set_serial_info()
980 acm->port.close_delay = close_delay; in set_serial_info()
981 acm->port.closing_wait = closing_wait; in set_serial_info()
984 mutex_unlock(&acm->port.mutex); in set_serial_info()
995 spin_lock_irq(&acm->read_lock); in wait_serial_change()
996 old = acm->oldcount; in wait_serial_change()
997 new = acm->iocount; in wait_serial_change()
998 acm->oldcount = new; in wait_serial_change()
999 spin_unlock_irq(&acm->read_lock); in wait_serial_change()
1011 add_wait_queue(&acm->wioctl, &wait); in wait_serial_change()
1014 remove_wait_queue(&acm->wioctl, &wait); in wait_serial_change()
1015 if (acm->disconnected) { in wait_serial_change()
1019 rv = -ENODEV; in wait_serial_change()
1022 rv = -ERESTARTSYS; in wait_serial_change()
1034 struct acm *acm = tty->driver_data; in acm_tty_get_icount()
1036 icount->dsr = acm->iocount.dsr; in acm_tty_get_icount()
1037 icount->rng = acm->iocount.rng; in acm_tty_get_icount()
1038 icount->dcd = acm->iocount.dcd; in acm_tty_get_icount()
1039 icount->frame = acm->iocount.frame; in acm_tty_get_icount()
1040 icount->overrun = acm->iocount.overrun; in acm_tty_get_icount()
1041 icount->parity = acm->iocount.parity; in acm_tty_get_icount()
1042 icount->brk = acm->iocount.brk; in acm_tty_get_icount()
1050 struct acm *acm = tty->driver_data; in acm_tty_ioctl()
1051 int rv = -ENOIOCTLCMD; in acm_tty_ioctl()
1061 rv = usb_autopm_get_interface(acm->control); in acm_tty_ioctl()
1063 rv = -EIO; in acm_tty_ioctl()
1067 usb_autopm_put_interface(acm->control); in acm_tty_ioctl()
1077 struct acm *acm = tty->driver_data; in acm_tty_set_termios()
1078 struct ktermios *termios = &tty->termios; in acm_tty_set_termios()
1080 int newctrl = acm->ctrlout; in acm_tty_set_termios()
1083 newline.bCharFormat = termios->c_cflag & CSTOPB ? 2 : 0; in acm_tty_set_termios()
1084 newline.bParityType = termios->c_cflag & PARENB ? in acm_tty_set_termios()
1085 (termios->c_cflag & PARODD ? 1 : 2) + in acm_tty_set_termios()
1086 (termios->c_cflag & CMSPAR ? 2 : 0) : 0; in acm_tty_set_termios()
1087 switch (termios->c_cflag & CSIZE) { in acm_tty_set_termios()
1103 acm->clocal = ((termios->c_cflag & CLOCAL) != 0); in acm_tty_set_termios()
1106 newline.dwDTERate = acm->line.dwDTERate; in acm_tty_set_termios()
1108 } else if (termios_old && (termios_old->c_cflag & CBAUD) == B0) { in acm_tty_set_termios()
1112 if (newctrl != acm->ctrlout) in acm_tty_set_termios()
1113 acm_set_control(acm, acm->ctrlout = newctrl); in acm_tty_set_termios()
1115 if (memcmp(&acm->line, &newline, sizeof newline)) { in acm_tty_set_termios()
1116 memcpy(&acm->line, &newline, sizeof newline); in acm_tty_set_termios()
1117 dev_dbg(&acm->control->dev, "%s - set line: %d %d %d %d\n", in acm_tty_set_termios()
1122 acm_set_line(acm, &acm->line); in acm_tty_set_termios()
1143 for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++) in acm_write_buffers_free()
1144 usb_free_coherent(acm->dev, acm->writesize, wb->buf, wb->dmah); in acm_write_buffers_free()
1151 for (i = 0; i < acm->rx_buflimit; i++) in acm_read_buffers_free()
1152 usb_free_coherent(acm->dev, acm->readsize, in acm_read_buffers_free()
1153 acm->read_buffers[i].base, acm->read_buffers[i].dma); in acm_read_buffers_free()
1162 for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++) { in acm_write_buffers_alloc()
1163 wb->buf = usb_alloc_coherent(acm->dev, acm->writesize, GFP_KERNEL, in acm_write_buffers_alloc()
1164 &wb->dmah); in acm_write_buffers_alloc()
1165 if (!wb->buf) { in acm_write_buffers_alloc()
1167 --i; in acm_write_buffers_alloc()
1168 --wb; in acm_write_buffers_alloc()
1169 usb_free_coherent(acm->dev, acm->writesize, in acm_write_buffers_alloc()
1170 wb->buf, wb->dmah); in acm_write_buffers_alloc()
1172 return -ENOMEM; in acm_write_buffers_alloc()
1183 unsigned char *buffer = intf->altsetting->extra; in acm_probe()
1184 int buflen = intf->altsetting->extralen; in acm_probe()
1196 int call_intf_num = -1; in acm_probe()
1197 int data_intf_num = -1; in acm_probe()
1203 int rv = -ENOMEM; in acm_probe()
1207 quirks = (unsigned long)id->driver_info; in acm_probe()
1210 return -ENODEV; in acm_probe()
1222 return -ENODEV; in acm_probe()
1228 dev_err(&intf->dev, "Weird descriptor references\n"); in acm_probe()
1229 return -EINVAL; in acm_probe()
1232 if (!intf->cur_altsetting) in acm_probe()
1233 return -EINVAL; in acm_probe()
1236 if (intf->cur_altsetting->endpoint && in acm_probe()
1237 intf->cur_altsetting->endpoint->extralen && in acm_probe()
1238 intf->cur_altsetting->endpoint->extra) { in acm_probe()
1239 dev_dbg(&intf->dev, in acm_probe()
1241 buflen = intf->cur_altsetting->endpoint->extralen; in acm_probe()
1242 buffer = intf->cur_altsetting->endpoint->extra; in acm_probe()
1244 dev_err(&intf->dev, in acm_probe()
1246 return -EINVAL; in acm_probe()
1254 call_intf_num = cmgmd->bDataInterface; in acm_probe()
1258 dev_dbg(&intf->dev, "No union descriptor, using call management descriptor\n"); in acm_probe()
1268 if (intf->cur_altsetting->desc.bNumEndpoints != 3) { in acm_probe()
1269 dev_dbg(&intf->dev,"No union descriptor, giving up\n"); in acm_probe()
1270 return -ENODEV; in acm_probe()
1272 dev_warn(&intf->dev,"No union descriptor, testing for castrated device\n"); in acm_probe()
1279 int class = -1; in acm_probe()
1281 data_intf_num = union_header->bSlaveInterface0; in acm_probe()
1282 control_interface = usb_ifnum_to_if(usb_dev, union_header->bMasterInterface0); in acm_probe()
1286 class = control_interface->cur_altsetting->desc.bInterfaceClass; in acm_probe()
1289 dev_dbg(&intf->dev, "Broken union descriptor, assuming single interface\n"); in acm_probe()
1297 dev_dbg(&intf->dev, "no interfaces\n"); in acm_probe()
1298 return -ENODEV; in acm_probe()
1300 if (!data_interface->cur_altsetting || !control_interface->cur_altsetting) in acm_probe()
1301 return -ENODEV; in acm_probe()
1304 dev_dbg(&intf->dev, "Separate call control interface. That is not fully supported.\n"); in acm_probe()
1308 dev_warn(&intf->dev,"Control and data interfaces are not separated!\n"); in acm_probe()
1312 if (data_interface->cur_altsetting->desc.bNumEndpoints != 3) { in acm_probe()
1313 dev_err(&intf->dev, "This needs exactly 3 endpoints\n"); in acm_probe()
1314 return -EINVAL; in acm_probe()
1317 res = usb_find_common_endpoints(data_interface->cur_altsetting, in acm_probe()
1328 if (data_interface->cur_altsetting->desc.bInterfaceClass in acm_probe()
1330 if (control_interface->cur_altsetting->desc.bInterfaceClass in acm_probe()
1332 dev_dbg(&intf->dev, in acm_probe()
1336 return -EINVAL; in acm_probe()
1342 return -ENODEV; in acm_probe()
1346 dev_dbg(&intf->dev, "The data interface isn't available\n"); in acm_probe()
1347 return -EBUSY; in acm_probe()
1351 if (data_interface->cur_altsetting->desc.bNumEndpoints < 2 || in acm_probe()
1352 control_interface->cur_altsetting->desc.bNumEndpoints == 0) in acm_probe()
1353 return -EINVAL; in acm_probe()
1355 epctrl = &control_interface->cur_altsetting->endpoint[0].desc; in acm_probe()
1356 epread = &data_interface->cur_altsetting->endpoint[0].desc; in acm_probe()
1357 epwrite = &data_interface->cur_altsetting->endpoint[1].desc; in acm_probe()
1363 dev_dbg(&intf->dev, in acm_probe()
1368 dev_dbg(&intf->dev, "interfaces are valid\n"); in acm_probe()
1374 tty_port_init(&acm->port); in acm_probe()
1375 acm->port.ops = &acm_port_ops; in acm_probe()
1380 acm->combined_interfaces = combined_interfaces; in acm_probe()
1381 acm->writesize = usb_endpoint_maxp(epwrite) * 20; in acm_probe()
1382 acm->control = control_interface; in acm_probe()
1383 acm->data = data_interface; in acm_probe()
1385 usb_get_intf(acm->control); /* undone in destruct() */ in acm_probe()
1391 acm->minor = minor; in acm_probe()
1392 acm->dev = usb_dev; in acm_probe()
1394 acm->ctrl_caps = h.usb_cdc_acm_descriptor->bmCapabilities; in acm_probe()
1396 acm->ctrl_caps &= ~USB_CDC_CAP_LINE; in acm_probe()
1397 acm->ctrlsize = ctrlsize; in acm_probe()
1398 acm->readsize = readsize; in acm_probe()
1399 acm->rx_buflimit = num_rx_buf; in acm_probe()
1400 INIT_DELAYED_WORK(&acm->dwork, acm_softint); in acm_probe()
1401 init_waitqueue_head(&acm->wioctl); in acm_probe()
1402 spin_lock_init(&acm->write_lock); in acm_probe()
1403 spin_lock_init(&acm->read_lock); in acm_probe()
1404 mutex_init(&acm->mutex); in acm_probe()
1406 acm->bInterval = epread->bInterval; in acm_probe()
1407 acm->in = usb_rcvintpipe(usb_dev, epread->bEndpointAddress); in acm_probe()
1409 acm->in = usb_rcvbulkpipe(usb_dev, epread->bEndpointAddress); in acm_probe()
1412 acm->out = usb_sndintpipe(usb_dev, epwrite->bEndpointAddress); in acm_probe()
1414 acm->out = usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress); in acm_probe()
1415 init_usb_anchor(&acm->delayed); in acm_probe()
1416 acm->quirks = quirks; in acm_probe()
1418 buf = usb_alloc_coherent(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma); in acm_probe()
1421 acm->ctrl_buffer = buf; in acm_probe()
1426 acm->ctrlurb = usb_alloc_urb(0, GFP_KERNEL); in acm_probe()
1427 if (!acm->ctrlurb) in acm_probe()
1431 struct acm_rb *rb = &(acm->read_buffers[i]); in acm_probe()
1434 rb->base = usb_alloc_coherent(acm->dev, readsize, GFP_KERNEL, in acm_probe()
1435 &rb->dma); in acm_probe()
1436 if (!rb->base) in acm_probe()
1438 rb->index = i; in acm_probe()
1439 rb->instance = acm; in acm_probe()
1445 urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; in acm_probe()
1446 urb->transfer_dma = rb->dma; in acm_probe()
1448 usb_fill_int_urb(urb, acm->dev, acm->in, rb->base, in acm_probe()
1449 acm->readsize, in acm_probe()
1451 acm->bInterval); in acm_probe()
1453 usb_fill_bulk_urb(urb, acm->dev, acm->in, rb->base, in acm_probe()
1454 acm->readsize, in acm_probe()
1457 acm->read_urbs[i] = urb; in acm_probe()
1458 __set_bit(i, &acm->read_urbs_free); in acm_probe()
1461 struct acm_wb *snd = &(acm->wb[i]); in acm_probe()
1463 snd->urb = usb_alloc_urb(0, GFP_KERNEL); in acm_probe()
1464 if (snd->urb == NULL) in acm_probe()
1468 usb_fill_int_urb(snd->urb, usb_dev, acm->out, in acm_probe()
1469 NULL, acm->writesize, acm_write_bulk, snd, epwrite->bInterval); in acm_probe()
1471 usb_fill_bulk_urb(snd->urb, usb_dev, acm->out, in acm_probe()
1472 NULL, acm->writesize, acm_write_bulk, snd); in acm_probe()
1473 snd->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; in acm_probe()
1475 snd->urb->transfer_flags |= URB_ZERO_PACKET; in acm_probe()
1476 snd->instance = acm; in acm_probe()
1481 i = device_create_file(&intf->dev, &dev_attr_bmCapabilities); in acm_probe()
1489 acm->country_codes = kmalloc(cfd->bLength - 4, GFP_KERNEL); in acm_probe()
1490 if (!acm->country_codes) in acm_probe()
1492 acm->country_code_size = cfd->bLength - 4; in acm_probe()
1493 memcpy(acm->country_codes, (u8 *)&cfd->wCountyCode0, in acm_probe()
1494 cfd->bLength - 4); in acm_probe()
1495 acm->country_rel_date = cfd->iCountryCodeRelDate; in acm_probe()
1497 i = device_create_file(&intf->dev, &dev_attr_wCountryCodes); in acm_probe()
1499 kfree(acm->country_codes); in acm_probe()
1500 acm->country_codes = NULL; in acm_probe()
1501 acm->country_code_size = 0; in acm_probe()
1505 i = device_create_file(&intf->dev, in acm_probe()
1508 device_remove_file(&intf->dev, &dev_attr_wCountryCodes); in acm_probe()
1509 kfree(acm->country_codes); in acm_probe()
1510 acm->country_codes = NULL; in acm_probe()
1511 acm->country_code_size = 0; in acm_probe()
1517 usb_fill_int_urb(acm->ctrlurb, usb_dev, in acm_probe()
1518 usb_rcvintpipe(usb_dev, epctrl->bEndpointAddress), in acm_probe()
1519 acm->ctrl_buffer, ctrlsize, acm_ctrl_irq, acm, in acm_probe()
1521 epctrl->bInterval ? epctrl->bInterval : 16); in acm_probe()
1522 acm->ctrlurb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; in acm_probe()
1523 acm->ctrlurb->transfer_dma = acm->ctrl_dma; in acm_probe()
1524 acm->notification_buffer = NULL; in acm_probe()
1525 acm->nb_index = 0; in acm_probe()
1526 acm->nb_size = 0; in acm_probe()
1528 dev_info(&intf->dev, "ttyACM%d: USB ACM device\n", minor); in acm_probe()
1530 acm->line.dwDTERate = cpu_to_le32(9600); in acm_probe()
1531 acm->line.bDataBits = 8; in acm_probe()
1532 acm_set_line(acm, &acm->line); in acm_probe()
1537 tty_dev = tty_port_register_device(&acm->port, acm_tty_driver, minor, in acm_probe()
1538 &control_interface->dev); in acm_probe()
1545 usb_clear_halt(usb_dev, acm->in); in acm_probe()
1546 usb_clear_halt(usb_dev, acm->out); in acm_probe()
1551 if (acm->country_codes) { in acm_probe()
1552 device_remove_file(&acm->control->dev, in acm_probe()
1554 device_remove_file(&acm->control->dev, in acm_probe()
1556 kfree(acm->country_codes); in acm_probe()
1558 device_remove_file(&acm->control->dev, &dev_attr_bmCapabilities); in acm_probe()
1562 usb_free_urb(acm->wb[i].urb); in acm_probe()
1565 usb_free_urb(acm->read_urbs[i]); in acm_probe()
1567 usb_free_urb(acm->ctrlurb); in acm_probe()
1571 usb_free_coherent(usb_dev, ctrlsize, acm->ctrl_buffer, acm->ctrl_dma); in acm_probe()
1573 tty_port_put(&acm->port); in acm_probe()
1588 mutex_lock(&acm->mutex); in acm_disconnect()
1589 acm->disconnected = true; in acm_disconnect()
1590 if (acm->country_codes) { in acm_disconnect()
1591 device_remove_file(&acm->control->dev, in acm_disconnect()
1593 device_remove_file(&acm->control->dev, in acm_disconnect()
1596 wake_up_all(&acm->wioctl); in acm_disconnect()
1597 device_remove_file(&acm->control->dev, &dev_attr_bmCapabilities); in acm_disconnect()
1598 usb_set_intfdata(acm->control, NULL); in acm_disconnect()
1599 usb_set_intfdata(acm->data, NULL); in acm_disconnect()
1600 mutex_unlock(&acm->mutex); in acm_disconnect()
1602 tty = tty_port_tty_get(&acm->port); in acm_disconnect()
1609 cancel_delayed_work_sync(&acm->dwork); in acm_disconnect()
1611 tty_unregister_device(acm_tty_driver, acm->minor); in acm_disconnect()
1613 usb_free_urb(acm->ctrlurb); in acm_disconnect()
1615 usb_free_urb(acm->wb[i].urb); in acm_disconnect()
1616 for (i = 0; i < acm->rx_buflimit; i++) in acm_disconnect()
1617 usb_free_urb(acm->read_urbs[i]); in acm_disconnect()
1619 usb_free_coherent(acm->dev, acm->ctrlsize, acm->ctrl_buffer, acm->ctrl_dma); in acm_disconnect()
1622 kfree(acm->notification_buffer); in acm_disconnect()
1624 if (!acm->combined_interfaces) in acm_disconnect()
1625 usb_driver_release_interface(&acm_driver, intf == acm->control ? in acm_disconnect()
1626 acm->data : acm->control); in acm_disconnect()
1628 tty_port_put(&acm->port); in acm_disconnect()
1637 spin_lock_irq(&acm->write_lock); in acm_suspend()
1639 if (acm->transmitting) { in acm_suspend()
1640 spin_unlock_irq(&acm->write_lock); in acm_suspend()
1641 return -EBUSY; in acm_suspend()
1644 cnt = acm->susp_count++; in acm_suspend()
1645 spin_unlock_irq(&acm->write_lock); in acm_suspend()
1651 cancel_delayed_work_sync(&acm->dwork); in acm_suspend()
1652 acm->urbs_in_error_delay = 0; in acm_suspend()
1663 spin_lock_irq(&acm->write_lock); in acm_resume()
1665 if (--acm->susp_count) 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()
1689 spin_unlock_irq(&acm->write_lock); in acm_resume()
1698 if (tty_port_initialized(&acm->port)) in acm_reset_resume()
1699 tty_port_tty_hangup(&acm->port, false); in acm_reset_resume()
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 */
1750 { USB_DEVICE(0x0482, 0x0203), /* KYOCERA AH-K3001V */
1753 { USB_DEVICE(0x079b, 0x000f), /* BT On-Air USB MODEM */
1762 { USB_DEVICE(0x0ace, 0x1611), /* ZyDAS 56K USB MODEM - new version */
1780 { USB_DEVICE(0x0572, 0x1324), /* Conexant USB MODEM RD02-D400 */
1783 { USB_DEVICE(0x0572, 0x1328), /* Shiro / Aztech USB MODEM UM-3100 */
1791 { USB_DEVICE(0x2184, 0x001c) }, /* GW Instek AFG-2225 */
1792 { USB_DEVICE(0x2184, 0x0036) }, /* GW Instek AFG-125 */
1826 { USB_DEVICE(0x0572, 0x1340), /* Conexant CX93010-2x UCMxx */
1832 { USB_DEVICE(0x1bbb, 0x0003), /* Alcatel OT-I650 */
1838 { USB_DEVICE(0xfff0, 0x0100), /* DATECS FP-2000 */
1853 * a modem and is picked up by the standard AT-command
1854 * information below. The second is 'vendor-specific' but
1887 { NOKIA_PCSUITE_ACM_INFO(0x04F0), }, /* Nokia N95 & N95-3 NAM */
1890 { NOKIA_PCSUITE_ACM_INFO(0x0099), }, /* Nokia 6210 Navigator, RM-367 */
1891 { NOKIA_PCSUITE_ACM_INFO(0x0128), }, /* Nokia 6210 Navigator, RM-419 */
1896 { NOKIA_PCSUITE_ACM_INFO(0x003a), }, /* Nokia N96 & N96-3 */
1899 { NOKIA_PCSUITE_ACM_INFO(0x01f5), }, /* Nokia N97, RM-505 */
1900 { NOKIA_PCSUITE_ACM_INFO(0x02e3), }, /* Nokia 5230, RM-588 */
1919 /* NOTE: non-Nokia COMM/ACM/0xff is likely MSFT RNDIS... NOT a modem! */
1967 /* control interfaces with various AT-command sets */
2020 .throttle = acm_tty_throttle,
2039 return -ENOMEM; in acm_init()
2040 acm_tty_driver->driver_name = "acm", in acm_init()
2041 acm_tty_driver->name = "ttyACM", in acm_init()
2042 acm_tty_driver->major = ACM_TTY_MAJOR, in acm_init()
2043 acm_tty_driver->minor_start = 0, in acm_init()
2044 acm_tty_driver->type = TTY_DRIVER_TYPE_SERIAL, in acm_init()
2045 acm_tty_driver->subtype = SERIAL_TYPE_NORMAL, in acm_init()
2046 acm_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV; in acm_init()
2047 acm_tty_driver->init_termios = tty_std_termios; in acm_init()
2048 acm_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | in acm_init()