Lines Matching refs:acm
64 static struct acm *acm_get_by_minor(unsigned int minor) in acm_get_by_minor()
66 struct acm *acm; in acm_get_by_minor() local
69 acm = idr_find(&acm_minors, minor); in acm_get_by_minor()
70 if (acm) { in acm_get_by_minor()
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()
74 acm = NULL; 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()
81 return acm; in acm_get_by_minor()
87 static int acm_alloc_minor(struct acm *acm) in acm_alloc_minor() argument
92 minor = idr_alloc(&acm_minors, acm, 0, ACM_TTY_MINORS, GFP_KERNEL); in acm_alloc_minor()
99 static void acm_release_minor(struct acm *acm) in acm_release_minor() argument
102 idr_remove(&acm_minors, acm->minor); in acm_release_minor()
110 static int acm_ctrl_msg(struct acm *acm, int request, int value, in acm_ctrl_msg() argument
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()
128 usb_autopm_put_interface(acm->control); in acm_ctrl_msg()
136 static inline int acm_set_control(struct acm *acm, int control) in acm_set_control() argument
138 if (acm->quirks & QUIRK_CONTROL_LINE_STATE) in acm_set_control()
141 return acm_ctrl_msg(acm, USB_CDC_REQ_SET_CONTROL_LINE_STATE, in acm_set_control()
145 #define acm_set_line(acm, line) \ argument
146 acm_ctrl_msg(acm, USB_CDC_REQ_SET_LINE_CODING, 0, line, sizeof *(line))
147 #define acm_send_break(acm, ms) \ argument
148 acm_ctrl_msg(acm, USB_CDC_REQ_SEND_BREAK, ms, NULL, 0)
150 static void acm_kill_urbs(struct acm *acm) in acm_kill_urbs() argument
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()
166 static int acm_wb_alloc(struct acm *acm) in acm_wb_alloc() argument
174 wb = &acm->wb[wbn]; in acm_wb_alloc()
186 static int acm_wb_is_avail(struct acm *acm) in acm_wb_is_avail() argument
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()
202 static void acm_write_done(struct acm *acm, struct acm_wb *wb) in acm_write_done() argument
205 acm->transmitting--; in acm_write_done()
206 usb_autopm_put_interface_async(acm->control); in acm_write_done()
215 static int acm_start_wb(struct acm *acm, struct acm_wb *wb) in acm_start_wb() argument
219 acm->transmitting++; in acm_start_wb()
224 wb->urb->dev = acm->dev; in acm_start_wb()
228 dev_err(&acm->data->dev, in acm_start_wb()
231 acm_write_done(acm, wb); in acm_start_wb()
243 struct acm *acm = usb_get_intfdata(intf); in bmCapabilities_show() local
245 return sprintf(buf, "%d", acm->ctrl_caps); in bmCapabilities_show()
253 struct acm *acm = usb_get_intfdata(intf); in wCountryCodes_show() local
255 memcpy(buf, acm->country_codes, acm->country_code_size); in wCountryCodes_show()
256 return acm->country_code_size; in wCountryCodes_show()
265 struct acm *acm = usb_get_intfdata(intf); in iCountryCodeRelDate_show() local
267 return sprintf(buf, "%d", acm->country_rel_date); in iCountryCodeRelDate_show()
275 static void acm_process_notification(struct acm *acm, unsigned char *buf) in acm_process_notification() argument
285 dev_dbg(&acm->control->dev, in acm_process_notification()
291 dev_dbg(&acm->control->dev, in acm_process_notification()
297 dev_dbg(&acm->control->dev, 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()
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()
343 struct acm *acm = urb->context; in acm_ctrl_irq() local
358 dev_dbg(&acm->control->dev, in acm_ctrl_irq()
363 dev_dbg(&acm->control->dev, 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()
380 if (acm->nb_size < expected_size) { in acm_ctrl_irq()
381 if (acm->nb_size) { in acm_ctrl_irq()
382 kfree(acm->notification_buffer); in acm_ctrl_irq()
383 acm->nb_size = 0; in acm_ctrl_irq()
391 acm->notification_buffer = in acm_ctrl_irq()
393 if (!acm->notification_buffer) in acm_ctrl_irq()
395 acm->nb_size = alloc_size; in acm_ctrl_irq()
399 expected_size - acm->nb_index); in acm_ctrl_irq()
401 memcpy(&acm->notification_buffer[acm->nb_index], in acm_ctrl_irq()
403 acm->nb_index += copy_size; in acm_ctrl_irq()
404 current_size = acm->nb_index; in acm_ctrl_irq()
409 acm_process_notification(acm, (unsigned char *)dr); in acm_ctrl_irq()
410 acm->nb_index = 0; in acm_ctrl_irq()
416 dev_err(&acm->control->dev, in acm_ctrl_irq()
420 static int acm_submit_read_urb(struct acm *acm, int index, gfp_t mem_flags) in acm_submit_read_urb() argument
424 if (!test_and_clear_bit(index, &acm->read_urbs_free)) in acm_submit_read_urb()
427 res = usb_submit_urb(acm->read_urbs[index], mem_flags); in acm_submit_read_urb()
430 dev_err(&acm->data->dev, in acm_submit_read_urb()
434 set_bit(index, &acm->read_urbs_free); in acm_submit_read_urb()
437 dev_vdbg(&acm->data->dev, "submitted urb %d\n", index); in acm_submit_read_urb()
443 static int acm_submit_read_urbs(struct acm *acm, gfp_t mem_flags) in acm_submit_read_urbs() argument
448 for (i = 0; i < acm->rx_buflimit; ++i) { in acm_submit_read_urbs()
449 res = acm_submit_read_urb(acm, i, mem_flags); in acm_submit_read_urbs()
457 static void acm_process_read_urb(struct acm *acm, struct urb *urb) in acm_process_read_urb() argument
462 tty_insert_flip_string(&acm->port, urb->transfer_buffer, in acm_process_read_urb()
464 tty_flip_buffer_push(&acm->port); in acm_process_read_urb()
470 struct acm *acm = rb->instance; in acm_read_bulk_callback() local
475 dev_vdbg(&acm->data->dev, "got urb %d, len %d, status %d\n", in acm_read_bulk_callback()
478 if (!acm->dev) { in acm_read_bulk_callback()
479 dev_dbg(&acm->data->dev, "%s - disconnected\n", __func__); in acm_read_bulk_callback()
485 usb_mark_last_busy(acm->dev); in acm_read_bulk_callback()
486 acm_process_read_urb(acm, urb); in acm_read_bulk_callback()
489 set_bit(EVENT_RX_STALL, &acm->flags); in acm_read_bulk_callback()
495 dev_dbg(&acm->data->dev, in acm_read_bulk_callback()
501 dev_dbg(&acm->data->dev, in acm_read_bulk_callback()
513 set_bit(rb->index, &acm->read_urbs_free); in acm_read_bulk_callback()
523 schedule_work(&acm->work); in acm_read_bulk_callback()
527 if (test_bit(ACM_THROTTLED, &acm->flags)) in acm_read_bulk_callback()
530 acm_submit_read_urb(acm, rb->index, GFP_ATOMIC); in acm_read_bulk_callback()
537 struct acm *acm = wb->instance; in acm_write_bulk() local
542 dev_vdbg(&acm->data->dev, "wrote len %d/%d, status %d\n", in acm_write_bulk()
547 spin_lock_irqsave(&acm->write_lock, flags); in acm_write_bulk()
548 acm_write_done(acm, wb); in acm_write_bulk()
549 spin_unlock_irqrestore(&acm->write_lock, flags); in acm_write_bulk()
550 set_bit(EVENT_TTY_WAKEUP, &acm->flags); in acm_write_bulk()
551 schedule_work(&acm->work); in acm_write_bulk()
557 struct acm *acm = container_of(work, struct acm, work); in acm_softint() local
559 if (test_bit(EVENT_RX_STALL, &acm->flags)) { in acm_softint()
560 if (!(usb_autopm_get_interface(acm->data))) { in acm_softint()
561 for (i = 0; i < acm->rx_buflimit; i++) in acm_softint()
562 usb_kill_urb(acm->read_urbs[i]); in acm_softint()
563 usb_clear_halt(acm->dev, acm->in); in acm_softint()
564 acm_submit_read_urbs(acm, GFP_KERNEL); in acm_softint()
565 usb_autopm_put_interface(acm->data); in acm_softint()
567 clear_bit(EVENT_RX_STALL, &acm->flags); in acm_softint()
570 if (test_and_clear_bit(EVENT_TTY_WAKEUP, &acm->flags)) in acm_softint()
571 tty_port_tty_wakeup(&acm->port); in acm_softint()
580 struct acm *acm; in acm_tty_install() local
583 acm = acm_get_by_minor(tty->index); in acm_tty_install()
584 if (!acm) in acm_tty_install()
595 if (acm->quirks & DISABLE_ECHO) in acm_tty_install()
598 tty->driver_data = acm; in acm_tty_install()
603 tty_port_put(&acm->port); in acm_tty_install()
609 struct acm *acm = tty->driver_data; in acm_tty_open() local
611 return tty_port_open(&acm->port, tty, filp); in acm_tty_open()
616 struct acm *acm = container_of(port, struct acm, port); in acm_port_dtr_rts() local
626 acm->ctrlout = val; in acm_port_dtr_rts()
628 res = acm_set_control(acm, val); in acm_port_dtr_rts()
629 if (res && (acm->ctrl_caps & USB_CDC_CAP_LINE)) in acm_port_dtr_rts()
630 dev_err(&acm->control->dev, "failed to set dtr/rts\n"); in acm_port_dtr_rts()
635 struct acm *acm = container_of(port, struct acm, port); in acm_port_activate() local
639 mutex_lock(&acm->mutex); in acm_port_activate()
640 if (acm->disconnected) in acm_port_activate()
643 retval = usb_autopm_get_interface(acm->control); in acm_port_activate()
652 acm->control->needs_remote_wakeup = 1; in acm_port_activate()
654 acm->ctrlurb->dev = acm->dev; in acm_port_activate()
655 retval = usb_submit_urb(acm->ctrlurb, GFP_KERNEL); in acm_port_activate()
657 dev_err(&acm->control->dev, in acm_port_activate()
667 clear_bit(ACM_THROTTLED, &acm->flags); in acm_port_activate()
669 retval = acm_submit_read_urbs(acm, GFP_KERNEL); in acm_port_activate()
673 usb_autopm_put_interface(acm->control); in acm_port_activate()
675 mutex_unlock(&acm->mutex); in acm_port_activate()
680 for (i = 0; i < acm->rx_buflimit; i++) in acm_port_activate()
681 usb_kill_urb(acm->read_urbs[i]); in acm_port_activate()
682 usb_kill_urb(acm->ctrlurb); in acm_port_activate()
684 usb_autopm_put_interface(acm->control); in acm_port_activate()
687 mutex_unlock(&acm->mutex); in acm_port_activate()
694 struct acm *acm = container_of(port, struct acm, port); in acm_port_destruct() local
696 acm_release_minor(acm); in acm_port_destruct()
697 usb_put_intf(acm->control); in acm_port_destruct()
698 kfree(acm->country_codes); in acm_port_destruct()
699 kfree(acm); in acm_port_destruct()
704 struct acm *acm = container_of(port, struct acm, port); in acm_port_shutdown() local
712 spin_lock_irq(&acm->write_lock); in acm_port_shutdown()
713 spin_unlock_irq(&acm->write_lock); in acm_port_shutdown()
715 usb_autopm_get_interface_no_resume(acm->control); in acm_port_shutdown()
716 acm->control->needs_remote_wakeup = 0; in acm_port_shutdown()
717 usb_autopm_put_interface(acm->control); in acm_port_shutdown()
720 urb = usb_get_from_anchor(&acm->delayed); in acm_port_shutdown()
725 usb_autopm_put_interface_async(acm->control); in acm_port_shutdown()
728 acm_kill_urbs(acm); in acm_port_shutdown()
733 struct acm *acm = tty->driver_data; in acm_tty_cleanup() local
735 tty_port_put(&acm->port); in acm_tty_cleanup()
740 struct acm *acm = tty->driver_data; in acm_tty_hangup() local
742 tty_port_hangup(&acm->port); in acm_tty_hangup()
747 struct acm *acm = tty->driver_data; in acm_tty_close() local
749 tty_port_close(&acm->port, tty, filp); in acm_tty_close()
755 struct acm *acm = tty->driver_data; in acm_tty_write() local
764 dev_vdbg(&acm->data->dev, "%d bytes from tty layer\n", count); in acm_tty_write()
766 spin_lock_irqsave(&acm->write_lock, flags); in acm_tty_write()
767 wbn = acm_wb_alloc(acm); in acm_tty_write()
769 spin_unlock_irqrestore(&acm->write_lock, flags); in acm_tty_write()
772 wb = &acm->wb[wbn]; in acm_tty_write()
774 if (!acm->dev) { in acm_tty_write()
776 spin_unlock_irqrestore(&acm->write_lock, flags); in acm_tty_write()
780 count = (count > acm->writesize) ? acm->writesize : count; in acm_tty_write()
781 dev_vdbg(&acm->data->dev, "writing %d bytes\n", count); in acm_tty_write()
785 stat = usb_autopm_get_interface_async(acm->control); in acm_tty_write()
788 spin_unlock_irqrestore(&acm->write_lock, flags); in acm_tty_write()
792 if (acm->susp_count) { in acm_tty_write()
793 usb_anchor_urb(wb->urb, &acm->delayed); in acm_tty_write()
794 spin_unlock_irqrestore(&acm->write_lock, flags); in acm_tty_write()
798 stat = acm_start_wb(acm, wb); in acm_tty_write()
799 spin_unlock_irqrestore(&acm->write_lock, flags); in acm_tty_write()
808 struct acm *acm = tty->driver_data; in acm_tty_write_room() local
813 return acm_wb_is_avail(acm) ? acm->writesize : 0; in acm_tty_write_room()
818 struct acm *acm = tty->driver_data; in acm_tty_chars_in_buffer() local
823 if (acm->disconnected) in acm_tty_chars_in_buffer()
828 return (ACM_NW - acm_wb_is_avail(acm)) * acm->writesize; in acm_tty_chars_in_buffer()
833 struct acm *acm = tty->driver_data; in acm_tty_throttle() local
835 set_bit(ACM_THROTTLED, &acm->flags); in acm_tty_throttle()
840 struct acm *acm = tty->driver_data; in acm_tty_unthrottle() local
842 clear_bit(ACM_THROTTLED, &acm->flags); in acm_tty_unthrottle()
847 acm_submit_read_urbs(acm, GFP_KERNEL); in acm_tty_unthrottle()
852 struct acm *acm = tty->driver_data; in acm_tty_break_ctl() local
855 retval = acm_send_break(acm, state ? 0xffff : 0); in acm_tty_break_ctl()
857 dev_dbg(&acm->control->dev, in acm_tty_break_ctl()
864 struct acm *acm = tty->driver_data; in acm_tty_tiocmget() local
866 return (acm->ctrlout & ACM_CTRL_DTR ? TIOCM_DTR : 0) | in acm_tty_tiocmget()
867 (acm->ctrlout & ACM_CTRL_RTS ? TIOCM_RTS : 0) | in acm_tty_tiocmget()
868 (acm->ctrlin & ACM_CTRL_DSR ? TIOCM_DSR : 0) | in acm_tty_tiocmget()
869 (acm->ctrlin & ACM_CTRL_RI ? TIOCM_RI : 0) | in acm_tty_tiocmget()
870 (acm->ctrlin & ACM_CTRL_DCD ? TIOCM_CD : 0) | in acm_tty_tiocmget()
877 struct acm *acm = tty->driver_data; in acm_tty_tiocmset() local
880 newctrl = acm->ctrlout; in acm_tty_tiocmset()
888 if (acm->ctrlout == newctrl) in acm_tty_tiocmset()
890 return acm_set_control(acm, acm->ctrlout = newctrl); in acm_tty_tiocmset()
895 struct acm *acm = tty->driver_data; in get_serial_info() local
897 ss->xmit_fifo_size = acm->writesize; in get_serial_info()
898 ss->baud_base = le32_to_cpu(acm->line.dwDTERate); in get_serial_info()
899 ss->close_delay = acm->port.close_delay / 10; in get_serial_info()
900 ss->closing_wait = acm->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ? in get_serial_info()
902 acm->port.closing_wait / 10; in get_serial_info()
908 struct acm *acm = tty->driver_data; in set_serial_info() local
916 mutex_lock(&acm->port.mutex); in set_serial_info()
919 if ((close_delay != acm->port.close_delay) || in set_serial_info()
920 (closing_wait != acm->port.closing_wait)) in set_serial_info()
925 acm->port.close_delay = close_delay; in set_serial_info()
926 acm->port.closing_wait = closing_wait; in set_serial_info()
929 mutex_unlock(&acm->port.mutex); in set_serial_info()
933 static int wait_serial_change(struct acm *acm, unsigned long arg) in wait_serial_change() argument
940 spin_lock_irq(&acm->read_lock); in wait_serial_change()
941 old = acm->oldcount; in wait_serial_change()
942 new = acm->iocount; in wait_serial_change()
943 acm->oldcount = new; in wait_serial_change()
944 spin_unlock_irq(&acm->read_lock); in wait_serial_change()
956 add_wait_queue(&acm->wioctl, &wait); in wait_serial_change()
959 remove_wait_queue(&acm->wioctl, &wait); in wait_serial_change()
960 if (acm->disconnected) { in wait_serial_change()
979 struct acm *acm = tty->driver_data; in acm_tty_get_icount() local
981 icount->dsr = acm->iocount.dsr; in acm_tty_get_icount()
982 icount->rng = acm->iocount.rng; in acm_tty_get_icount()
983 icount->dcd = acm->iocount.dcd; in acm_tty_get_icount()
984 icount->frame = acm->iocount.frame; in acm_tty_get_icount()
985 icount->overrun = acm->iocount.overrun; in acm_tty_get_icount()
986 icount->parity = acm->iocount.parity; in acm_tty_get_icount()
987 icount->brk = acm->iocount.brk; in acm_tty_get_icount()
995 struct acm *acm = tty->driver_data; in acm_tty_ioctl() local
1000 rv = usb_autopm_get_interface(acm->control); in acm_tty_ioctl()
1005 rv = wait_serial_change(acm, arg); in acm_tty_ioctl()
1006 usb_autopm_put_interface(acm->control); in acm_tty_ioctl()
1016 struct acm *acm = tty->driver_data; in acm_tty_set_termios() local
1019 int newctrl = acm->ctrlout; in acm_tty_set_termios()
1042 acm->clocal = ((termios->c_cflag & CLOCAL) != 0); in acm_tty_set_termios()
1045 newline.dwDTERate = acm->line.dwDTERate; in acm_tty_set_termios()
1051 if (newctrl != acm->ctrlout) in acm_tty_set_termios()
1052 acm_set_control(acm, acm->ctrlout = newctrl); in acm_tty_set_termios()
1054 if (memcmp(&acm->line, &newline, sizeof newline)) { in acm_tty_set_termios()
1055 memcpy(&acm->line, &newline, sizeof newline); in acm_tty_set_termios()
1056 dev_dbg(&acm->control->dev, "%s - set line: %d %d %d %d\n", in acm_tty_set_termios()
1061 acm_set_line(acm, &acm->line); in acm_tty_set_termios()
1077 static void acm_write_buffers_free(struct acm *acm) in acm_write_buffers_free() argument
1082 for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++) in acm_write_buffers_free()
1083 usb_free_coherent(acm->dev, acm->writesize, wb->buf, wb->dmah); in acm_write_buffers_free()
1086 static void acm_read_buffers_free(struct acm *acm) in acm_read_buffers_free() argument
1090 for (i = 0; i < acm->rx_buflimit; i++) in acm_read_buffers_free()
1091 usb_free_coherent(acm->dev, acm->readsize, in acm_read_buffers_free()
1092 acm->read_buffers[i].base, acm->read_buffers[i].dma); in acm_read_buffers_free()
1096 static int acm_write_buffers_alloc(struct acm *acm) in acm_write_buffers_alloc() argument
1101 for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++) { in acm_write_buffers_alloc()
1102 wb->buf = usb_alloc_coherent(acm->dev, acm->writesize, GFP_KERNEL, in acm_write_buffers_alloc()
1108 usb_free_coherent(acm->dev, acm->writesize, in acm_write_buffers_alloc()
1131 struct acm *acm; in acm_probe() local
1297 acm = kzalloc(sizeof(struct acm), GFP_KERNEL); in acm_probe()
1298 if (acm == NULL) in acm_probe()
1301 tty_port_init(&acm->port); in acm_probe()
1302 acm->port.ops = &acm_port_ops; in acm_probe()
1307 acm->combined_interfaces = combined_interfaces; in acm_probe()
1308 acm->writesize = usb_endpoint_maxp(epwrite) * 20; in acm_probe()
1309 acm->control = control_interface; in acm_probe()
1310 acm->data = data_interface; in acm_probe()
1312 usb_get_intf(acm->control); /* undone in destruct() */ in acm_probe()
1314 minor = acm_alloc_minor(acm); in acm_probe()
1318 acm->minor = minor; in acm_probe()
1319 acm->dev = usb_dev; in acm_probe()
1321 acm->ctrl_caps = h.usb_cdc_acm_descriptor->bmCapabilities; in acm_probe()
1323 acm->ctrl_caps &= ~USB_CDC_CAP_LINE; in acm_probe()
1324 acm->ctrlsize = ctrlsize; in acm_probe()
1325 acm->readsize = readsize; in acm_probe()
1326 acm->rx_buflimit = num_rx_buf; in acm_probe()
1327 INIT_WORK(&acm->work, acm_softint); in acm_probe()
1328 init_waitqueue_head(&acm->wioctl); in acm_probe()
1329 spin_lock_init(&acm->write_lock); in acm_probe()
1330 spin_lock_init(&acm->read_lock); in acm_probe()
1331 mutex_init(&acm->mutex); in acm_probe()
1333 acm->bInterval = epread->bInterval; in acm_probe()
1334 acm->in = usb_rcvintpipe(usb_dev, epread->bEndpointAddress); in acm_probe()
1336 acm->in = usb_rcvbulkpipe(usb_dev, epread->bEndpointAddress); in acm_probe()
1339 acm->out = usb_sndintpipe(usb_dev, epwrite->bEndpointAddress); in acm_probe()
1341 acm->out = usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress); in acm_probe()
1342 init_usb_anchor(&acm->delayed); in acm_probe()
1343 acm->quirks = quirks; in acm_probe()
1345 buf = usb_alloc_coherent(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma); in acm_probe()
1348 acm->ctrl_buffer = buf; in acm_probe()
1350 if (acm_write_buffers_alloc(acm) < 0) in acm_probe()
1353 acm->ctrlurb = usb_alloc_urb(0, GFP_KERNEL); in acm_probe()
1354 if (!acm->ctrlurb) in acm_probe()
1358 struct acm_rb *rb = &(acm->read_buffers[i]); in acm_probe()
1361 rb->base = usb_alloc_coherent(acm->dev, readsize, GFP_KERNEL, in acm_probe()
1366 rb->instance = acm; in acm_probe()
1375 usb_fill_int_urb(urb, acm->dev, acm->in, rb->base, in acm_probe()
1376 acm->readsize, in acm_probe()
1378 acm->bInterval); in acm_probe()
1380 usb_fill_bulk_urb(urb, acm->dev, acm->in, rb->base, in acm_probe()
1381 acm->readsize, in acm_probe()
1384 acm->read_urbs[i] = urb; in acm_probe()
1385 __set_bit(i, &acm->read_urbs_free); in acm_probe()
1388 struct acm_wb *snd = &(acm->wb[i]); in acm_probe()
1395 usb_fill_int_urb(snd->urb, usb_dev, acm->out, in acm_probe()
1396 NULL, acm->writesize, acm_write_bulk, snd, epwrite->bInterval); in acm_probe()
1398 usb_fill_bulk_urb(snd->urb, usb_dev, acm->out, in acm_probe()
1399 NULL, acm->writesize, acm_write_bulk, snd); in acm_probe()
1403 snd->instance = acm; in acm_probe()
1406 usb_set_intfdata(intf, acm); in acm_probe()
1416 acm->country_codes = kmalloc(cfd->bLength - 4, GFP_KERNEL); in acm_probe()
1417 if (!acm->country_codes) in acm_probe()
1419 acm->country_code_size = cfd->bLength - 4; in acm_probe()
1420 memcpy(acm->country_codes, (u8 *)&cfd->wCountyCode0, in acm_probe()
1422 acm->country_rel_date = cfd->iCountryCodeRelDate; in acm_probe()
1426 kfree(acm->country_codes); in acm_probe()
1427 acm->country_codes = NULL; in acm_probe()
1428 acm->country_code_size = 0; in acm_probe()
1436 kfree(acm->country_codes); in acm_probe()
1437 acm->country_codes = NULL; in acm_probe()
1438 acm->country_code_size = 0; in acm_probe()
1444 usb_fill_int_urb(acm->ctrlurb, usb_dev, in acm_probe()
1446 acm->ctrl_buffer, ctrlsize, acm_ctrl_irq, acm, in acm_probe()
1449 acm->ctrlurb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; in acm_probe()
1450 acm->ctrlurb->transfer_dma = acm->ctrl_dma; in acm_probe()
1451 acm->notification_buffer = NULL; in acm_probe()
1452 acm->nb_index = 0; in acm_probe()
1453 acm->nb_size = 0; in acm_probe()
1457 acm->line.dwDTERate = cpu_to_le32(9600); in acm_probe()
1458 acm->line.bDataBits = 8; in acm_probe()
1459 acm_set_line(acm, &acm->line); in acm_probe()
1461 usb_driver_claim_interface(&acm_driver, data_interface, acm); in acm_probe()
1462 usb_set_intfdata(data_interface, acm); in acm_probe()
1464 tty_dev = tty_port_register_device(&acm->port, acm_tty_driver, minor, in acm_probe()
1472 usb_clear_halt(usb_dev, acm->in); in acm_probe()
1473 usb_clear_halt(usb_dev, acm->out); in acm_probe()
1478 if (acm->country_codes) { in acm_probe()
1479 device_remove_file(&acm->control->dev, in acm_probe()
1481 device_remove_file(&acm->control->dev, in acm_probe()
1483 kfree(acm->country_codes); in acm_probe()
1485 device_remove_file(&acm->control->dev, &dev_attr_bmCapabilities); in acm_probe()
1489 usb_free_urb(acm->wb[i].urb); in acm_probe()
1492 usb_free_urb(acm->read_urbs[i]); in acm_probe()
1493 acm_read_buffers_free(acm); in acm_probe()
1494 usb_free_urb(acm->ctrlurb); in acm_probe()
1496 acm_write_buffers_free(acm); in acm_probe()
1498 usb_free_coherent(usb_dev, ctrlsize, acm->ctrl_buffer, acm->ctrl_dma); in acm_probe()
1500 tty_port_put(&acm->port); in acm_probe()
1507 struct acm *acm = usb_get_intfdata(intf); in acm_disconnect() local
1512 if (!acm) in acm_disconnect()
1515 mutex_lock(&acm->mutex); in acm_disconnect()
1516 acm->disconnected = true; in acm_disconnect()
1517 if (acm->country_codes) { in acm_disconnect()
1518 device_remove_file(&acm->control->dev, in acm_disconnect()
1520 device_remove_file(&acm->control->dev, in acm_disconnect()
1523 wake_up_all(&acm->wioctl); in acm_disconnect()
1524 device_remove_file(&acm->control->dev, &dev_attr_bmCapabilities); in acm_disconnect()
1525 usb_set_intfdata(acm->control, NULL); in acm_disconnect()
1526 usb_set_intfdata(acm->data, NULL); in acm_disconnect()
1527 mutex_unlock(&acm->mutex); in acm_disconnect()
1529 tty = tty_port_tty_get(&acm->port); in acm_disconnect()
1535 acm_kill_urbs(acm); in acm_disconnect()
1536 cancel_work_sync(&acm->work); in acm_disconnect()
1538 tty_unregister_device(acm_tty_driver, acm->minor); in acm_disconnect()
1540 usb_free_urb(acm->ctrlurb); in acm_disconnect()
1542 usb_free_urb(acm->wb[i].urb); in acm_disconnect()
1543 for (i = 0; i < acm->rx_buflimit; i++) in acm_disconnect()
1544 usb_free_urb(acm->read_urbs[i]); in acm_disconnect()
1545 acm_write_buffers_free(acm); in acm_disconnect()
1546 usb_free_coherent(acm->dev, acm->ctrlsize, acm->ctrl_buffer, acm->ctrl_dma); in acm_disconnect()
1547 acm_read_buffers_free(acm); in acm_disconnect()
1549 kfree(acm->notification_buffer); in acm_disconnect()
1551 if (!acm->combined_interfaces) in acm_disconnect()
1552 usb_driver_release_interface(&acm_driver, intf == acm->control ? in acm_disconnect()
1553 acm->data : acm->control); in acm_disconnect()
1555 tty_port_put(&acm->port); in acm_disconnect()
1561 struct acm *acm = usb_get_intfdata(intf); in acm_suspend() local
1564 spin_lock_irq(&acm->write_lock); in acm_suspend()
1566 if (acm->transmitting) { in acm_suspend()
1567 spin_unlock_irq(&acm->write_lock); in acm_suspend()
1571 cnt = acm->susp_count++; in acm_suspend()
1572 spin_unlock_irq(&acm->write_lock); in acm_suspend()
1577 acm_kill_urbs(acm); in acm_suspend()
1578 cancel_work_sync(&acm->work); in acm_suspend()
1585 struct acm *acm = usb_get_intfdata(intf); in acm_resume() local
1589 spin_lock_irq(&acm->write_lock); in acm_resume()
1591 if (--acm->susp_count) in acm_resume()
1594 if (tty_port_initialized(&acm->port)) { in acm_resume()
1595 rv = usb_submit_urb(acm->ctrlurb, GFP_ATOMIC); in acm_resume()
1598 urb = usb_get_from_anchor(&acm->delayed); in acm_resume()
1602 acm_start_wb(acm, urb->context); in acm_resume()
1612 rv = acm_submit_read_urbs(acm, GFP_ATOMIC); in acm_resume()
1615 spin_unlock_irq(&acm->write_lock); in acm_resume()
1622 struct acm *acm = usb_get_intfdata(intf); in acm_reset_resume() local
1624 if (tty_port_initialized(&acm->port)) in acm_reset_resume()
1625 tty_port_tty_hangup(&acm->port, false); in acm_reset_resume()
1634 struct acm *acm = usb_get_intfdata(intf); in acm_pre_reset() local
1636 clear_bit(EVENT_RX_STALL, &acm->flags); in acm_pre_reset()
1637 acm->nb_index = 0; /* pending control transfers are lost */ in acm_pre_reset()