Lines Matching refs:acm

75 static struct acm *acm_get_by_minor(unsigned int minor)  in acm_get_by_minor()
77 struct acm *acm; in acm_get_by_minor() local
80 acm = idr_find(&acm_minors, minor); in acm_get_by_minor()
81 if (acm) { in acm_get_by_minor()
82 mutex_lock(&acm->mutex); in acm_get_by_minor()
83 if (acm->disconnected) { in acm_get_by_minor()
84 mutex_unlock(&acm->mutex); in acm_get_by_minor()
85 acm = NULL; in acm_get_by_minor()
87 tty_port_get(&acm->port); in acm_get_by_minor()
88 mutex_unlock(&acm->mutex); in acm_get_by_minor()
92 return acm; in acm_get_by_minor()
98 static int acm_alloc_minor(struct acm *acm) in acm_alloc_minor() argument
103 minor = idr_alloc(&acm_minors, acm, 0, ACM_TTY_MINORS, GFP_KERNEL); in acm_alloc_minor()
110 static void acm_release_minor(struct acm *acm) in acm_release_minor() argument
113 idr_remove(&acm_minors, acm->minor); in acm_release_minor()
121 static int acm_ctrl_msg(struct acm *acm, int request, int value, in acm_ctrl_msg() argument
126 retval = usb_autopm_get_interface(acm->control); in acm_ctrl_msg()
130 retval = usb_control_msg(acm->dev, usb_sndctrlpipe(acm->dev, 0), in acm_ctrl_msg()
132 acm->control->altsetting[0].desc.bInterfaceNumber, in acm_ctrl_msg()
135 dev_dbg(&acm->control->dev, in acm_ctrl_msg()
139 usb_autopm_put_interface(acm->control); in acm_ctrl_msg()
147 static inline int acm_set_control(struct acm *acm, int control) in acm_set_control() argument
149 if (acm->quirks & QUIRK_CONTROL_LINE_STATE) in acm_set_control()
152 return acm_ctrl_msg(acm, USB_CDC_REQ_SET_CONTROL_LINE_STATE, in acm_set_control()
156 #define acm_set_line(acm, line) \ argument
157 acm_ctrl_msg(acm, USB_CDC_REQ_SET_LINE_CODING, 0, line, sizeof *(line))
158 #define acm_send_break(acm, ms) \ argument
159 acm_ctrl_msg(acm, USB_CDC_REQ_SEND_BREAK, ms, NULL, 0)
166 static int acm_wb_alloc(struct acm *acm) in acm_wb_alloc() argument
174 wb = &acm->wb[wbn]; in acm_wb_alloc()
185 static int acm_wb_is_avail(struct acm *acm) in acm_wb_is_avail() argument
191 spin_lock_irqsave(&acm->write_lock, flags); in acm_wb_is_avail()
193 n -= acm->wb[i].use; in acm_wb_is_avail()
194 spin_unlock_irqrestore(&acm->write_lock, flags); in acm_wb_is_avail()
201 static void acm_write_done(struct acm *acm, struct acm_wb *wb) in acm_write_done() argument
204 acm->transmitting--; in acm_write_done()
205 usb_autopm_put_interface_async(acm->control); in acm_write_done()
214 static int acm_start_wb(struct acm *acm, struct acm_wb *wb) in acm_start_wb() argument
218 acm->transmitting++; in acm_start_wb()
223 wb->urb->dev = acm->dev; in acm_start_wb()
227 dev_err(&acm->data->dev, in acm_start_wb()
230 acm_write_done(acm, wb); in acm_start_wb()
242 struct acm *acm = usb_get_intfdata(intf); in show_caps() local
244 return sprintf(buf, "%d", acm->ctrl_caps); in show_caps()
252 struct acm *acm = usb_get_intfdata(intf); in show_country_codes() local
254 memcpy(buf, acm->country_codes, acm->country_code_size); in show_country_codes()
255 return acm->country_code_size; in show_country_codes()
264 struct acm *acm = usb_get_intfdata(intf); in show_country_rel_date() local
266 return sprintf(buf, "%d", acm->country_rel_date); in show_country_rel_date()
277 struct acm *acm = urb->context; in acm_ctrl_irq() local
293 dev_dbg(&acm->control->dev, in acm_ctrl_irq()
298 dev_dbg(&acm->control->dev, in acm_ctrl_irq()
304 usb_mark_last_busy(acm->dev); in acm_ctrl_irq()
309 dev_dbg(&acm->control->dev, "%s - network connection: %d\n", in acm_ctrl_irq()
316 if (!acm->clocal && (acm->ctrlin & ~newctrl & ACM_CTRL_DCD)) { in acm_ctrl_irq()
317 dev_dbg(&acm->control->dev, "%s - calling hangup\n", in acm_ctrl_irq()
319 tty_port_tty_hangup(&acm->port, false); in acm_ctrl_irq()
322 difference = acm->ctrlin ^ newctrl; in acm_ctrl_irq()
323 spin_lock(&acm->read_lock); in acm_ctrl_irq()
324 acm->ctrlin = newctrl; in acm_ctrl_irq()
325 acm->oldcount = acm->iocount; in acm_ctrl_irq()
328 acm->iocount.dsr++; in acm_ctrl_irq()
330 acm->iocount.brk++; in acm_ctrl_irq()
332 acm->iocount.rng++; in acm_ctrl_irq()
334 acm->iocount.dcd++; in acm_ctrl_irq()
336 acm->iocount.frame++; in acm_ctrl_irq()
338 acm->iocount.parity++; in acm_ctrl_irq()
340 acm->iocount.overrun++; in acm_ctrl_irq()
341 spin_unlock(&acm->read_lock); in acm_ctrl_irq()
344 wake_up_all(&acm->wioctl); in acm_ctrl_irq()
349 dev_dbg(&acm->control->dev, in acm_ctrl_irq()
360 dev_err(&acm->control->dev, "%s - usb_submit_urb failed: %d\n", in acm_ctrl_irq()
364 static int acm_submit_read_urb(struct acm *acm, int index, gfp_t mem_flags) in acm_submit_read_urb() argument
368 if (!test_and_clear_bit(index, &acm->read_urbs_free)) in acm_submit_read_urb()
371 dev_vdbg(&acm->data->dev, "%s - urb %d\n", __func__, index); in acm_submit_read_urb()
373 res = usb_submit_urb(acm->read_urbs[index], mem_flags); in acm_submit_read_urb()
376 dev_err(&acm->data->dev, in acm_submit_read_urb()
380 set_bit(index, &acm->read_urbs_free); in acm_submit_read_urb()
387 static int acm_submit_read_urbs(struct acm *acm, gfp_t mem_flags) in acm_submit_read_urbs() argument
392 for (i = 0; i < acm->rx_buflimit; ++i) { in acm_submit_read_urbs()
393 res = acm_submit_read_urb(acm, i, mem_flags); in acm_submit_read_urbs()
401 static void acm_process_read_urb(struct acm *acm, struct urb *urb) in acm_process_read_urb() argument
406 tty_insert_flip_string(&acm->port, urb->transfer_buffer, in acm_process_read_urb()
408 tty_flip_buffer_push(&acm->port); in acm_process_read_urb()
414 struct acm *acm = rb->instance; in acm_read_bulk_callback() local
418 dev_vdbg(&acm->data->dev, "%s - urb %d, len %d\n", __func__, in acm_read_bulk_callback()
421 if (!acm->dev) { in acm_read_bulk_callback()
422 set_bit(rb->index, &acm->read_urbs_free); in acm_read_bulk_callback()
423 dev_dbg(&acm->data->dev, "%s - disconnected\n", __func__); in acm_read_bulk_callback()
428 set_bit(rb->index, &acm->read_urbs_free); in acm_read_bulk_callback()
429 dev_dbg(&acm->data->dev, "%s - non-zero urb status: %d\n", in acm_read_bulk_callback()
435 usb_mark_last_busy(acm->dev); in acm_read_bulk_callback()
437 acm_process_read_urb(acm, urb); in acm_read_bulk_callback()
443 set_bit(rb->index, &acm->read_urbs_free); in acm_read_bulk_callback()
446 spin_lock_irqsave(&acm->read_lock, flags); in acm_read_bulk_callback()
447 acm->throttled = acm->throttle_req; in acm_read_bulk_callback()
448 if (!acm->throttled) { in acm_read_bulk_callback()
449 spin_unlock_irqrestore(&acm->read_lock, flags); in acm_read_bulk_callback()
450 acm_submit_read_urb(acm, rb->index, GFP_ATOMIC); in acm_read_bulk_callback()
452 spin_unlock_irqrestore(&acm->read_lock, flags); in acm_read_bulk_callback()
460 struct acm *acm = wb->instance; in acm_write_bulk() local
465 dev_vdbg(&acm->data->dev, "%s - len %d/%d, status %d\n", in acm_write_bulk()
471 spin_lock_irqsave(&acm->write_lock, flags); in acm_write_bulk()
472 acm_write_done(acm, wb); in acm_write_bulk()
473 spin_unlock_irqrestore(&acm->write_lock, flags); in acm_write_bulk()
474 schedule_work(&acm->work); in acm_write_bulk()
479 struct acm *acm = container_of(work, struct acm, work); in acm_softint() local
481 dev_vdbg(&acm->data->dev, "%s\n", __func__); in acm_softint()
483 tty_port_tty_wakeup(&acm->port); in acm_softint()
492 struct acm *acm; in acm_tty_install() local
497 acm = acm_get_by_minor(tty->index); in acm_tty_install()
498 if (!acm) in acm_tty_install()
505 tty->driver_data = acm; in acm_tty_install()
510 tty_port_put(&acm->port); in acm_tty_install()
516 struct acm *acm = tty->driver_data; in acm_tty_open() local
520 return tty_port_open(&acm->port, tty, filp); in acm_tty_open()
525 struct acm *acm = container_of(port, struct acm, port); in acm_port_dtr_rts() local
535 acm->ctrlout = val; in acm_port_dtr_rts()
537 res = acm_set_control(acm, val); in acm_port_dtr_rts()
538 if (res && (acm->ctrl_caps & USB_CDC_CAP_LINE)) in acm_port_dtr_rts()
539 dev_err(&acm->control->dev, "failed to set dtr/rts\n"); in acm_port_dtr_rts()
544 struct acm *acm = container_of(port, struct acm, port); in acm_port_activate() local
548 dev_dbg(&acm->control->dev, "%s\n", __func__); in acm_port_activate()
550 mutex_lock(&acm->mutex); in acm_port_activate()
551 if (acm->disconnected) in acm_port_activate()
554 retval = usb_autopm_get_interface(acm->control); in acm_port_activate()
563 acm->control->needs_remote_wakeup = 1; in acm_port_activate()
565 acm->ctrlurb->dev = acm->dev; in acm_port_activate()
566 retval = usb_submit_urb(acm->ctrlurb, GFP_KERNEL); in acm_port_activate()
568 dev_err(&acm->control->dev, in acm_port_activate()
578 spin_lock_irq(&acm->read_lock); in acm_port_activate()
579 acm->throttled = 0; in acm_port_activate()
580 acm->throttle_req = 0; in acm_port_activate()
581 spin_unlock_irq(&acm->read_lock); in acm_port_activate()
583 retval = acm_submit_read_urbs(acm, GFP_KERNEL); in acm_port_activate()
587 usb_autopm_put_interface(acm->control); in acm_port_activate()
589 mutex_unlock(&acm->mutex); in acm_port_activate()
594 for (i = 0; i < acm->rx_buflimit; i++) in acm_port_activate()
595 usb_kill_urb(acm->read_urbs[i]); in acm_port_activate()
596 usb_kill_urb(acm->ctrlurb); in acm_port_activate()
598 usb_autopm_put_interface(acm->control); in acm_port_activate()
601 mutex_unlock(&acm->mutex); in acm_port_activate()
608 struct acm *acm = container_of(port, struct acm, port); in acm_port_destruct() local
610 dev_dbg(&acm->control->dev, "%s\n", __func__); in acm_port_destruct()
612 acm_release_minor(acm); in acm_port_destruct()
613 usb_put_intf(acm->control); in acm_port_destruct()
614 kfree(acm->country_codes); in acm_port_destruct()
615 kfree(acm); in acm_port_destruct()
620 struct acm *acm = container_of(port, struct acm, port); in acm_port_shutdown() local
625 dev_dbg(&acm->control->dev, "%s\n", __func__); in acm_port_shutdown()
631 spin_lock_irq(&acm->write_lock); in acm_port_shutdown()
632 spin_unlock_irq(&acm->write_lock); in acm_port_shutdown()
634 usb_autopm_get_interface_no_resume(acm->control); in acm_port_shutdown()
635 acm->control->needs_remote_wakeup = 0; in acm_port_shutdown()
636 usb_autopm_put_interface(acm->control); in acm_port_shutdown()
639 urb = usb_get_from_anchor(&acm->delayed); in acm_port_shutdown()
644 usb_autopm_put_interface_async(acm->control); in acm_port_shutdown()
647 usb_kill_urb(acm->ctrlurb); in acm_port_shutdown()
649 usb_kill_urb(acm->wb[i].urb); in acm_port_shutdown()
650 for (i = 0; i < acm->rx_buflimit; i++) in acm_port_shutdown()
651 usb_kill_urb(acm->read_urbs[i]); in acm_port_shutdown()
656 struct acm *acm = tty->driver_data; in acm_tty_cleanup() local
657 dev_dbg(&acm->control->dev, "%s\n", __func__); in acm_tty_cleanup()
658 tty_port_put(&acm->port); in acm_tty_cleanup()
663 struct acm *acm = tty->driver_data; in acm_tty_hangup() local
664 dev_dbg(&acm->control->dev, "%s\n", __func__); in acm_tty_hangup()
665 tty_port_hangup(&acm->port); in acm_tty_hangup()
670 struct acm *acm = tty->driver_data; in acm_tty_close() local
671 dev_dbg(&acm->control->dev, "%s\n", __func__); in acm_tty_close()
672 tty_port_close(&acm->port, tty, filp); in acm_tty_close()
678 struct acm *acm = tty->driver_data; in acm_tty_write() local
687 dev_vdbg(&acm->data->dev, "%s - count %d\n", __func__, count); in acm_tty_write()
689 spin_lock_irqsave(&acm->write_lock, flags); in acm_tty_write()
690 wbn = acm_wb_alloc(acm); in acm_tty_write()
692 spin_unlock_irqrestore(&acm->write_lock, flags); in acm_tty_write()
695 wb = &acm->wb[wbn]; in acm_tty_write()
697 if (!acm->dev) { in acm_tty_write()
699 spin_unlock_irqrestore(&acm->write_lock, flags); in acm_tty_write()
703 count = (count > acm->writesize) ? acm->writesize : count; in acm_tty_write()
704 dev_vdbg(&acm->data->dev, "%s - write %d\n", __func__, count); in acm_tty_write()
708 stat = usb_autopm_get_interface_async(acm->control); in acm_tty_write()
711 spin_unlock_irqrestore(&acm->write_lock, flags); in acm_tty_write()
715 if (acm->susp_count) { in acm_tty_write()
716 usb_anchor_urb(wb->urb, &acm->delayed); in acm_tty_write()
717 spin_unlock_irqrestore(&acm->write_lock, flags); in acm_tty_write()
721 stat = acm_start_wb(acm, wb); in acm_tty_write()
722 spin_unlock_irqrestore(&acm->write_lock, flags); in acm_tty_write()
731 struct acm *acm = tty->driver_data; in acm_tty_write_room() local
736 return acm_wb_is_avail(acm) ? acm->writesize : 0; in acm_tty_write_room()
741 struct acm *acm = tty->driver_data; in acm_tty_chars_in_buffer() local
746 if (acm->disconnected) in acm_tty_chars_in_buffer()
751 return (ACM_NW - acm_wb_is_avail(acm)) * acm->writesize; in acm_tty_chars_in_buffer()
756 struct acm *acm = tty->driver_data; in acm_tty_throttle() local
758 spin_lock_irq(&acm->read_lock); in acm_tty_throttle()
759 acm->throttle_req = 1; in acm_tty_throttle()
760 spin_unlock_irq(&acm->read_lock); in acm_tty_throttle()
765 struct acm *acm = tty->driver_data; in acm_tty_unthrottle() local
768 spin_lock_irq(&acm->read_lock); in acm_tty_unthrottle()
769 was_throttled = acm->throttled; in acm_tty_unthrottle()
770 acm->throttled = 0; in acm_tty_unthrottle()
771 acm->throttle_req = 0; in acm_tty_unthrottle()
772 spin_unlock_irq(&acm->read_lock); in acm_tty_unthrottle()
775 acm_submit_read_urbs(acm, GFP_KERNEL); in acm_tty_unthrottle()
780 struct acm *acm = tty->driver_data; in acm_tty_break_ctl() local
783 retval = acm_send_break(acm, state ? 0xffff : 0); in acm_tty_break_ctl()
785 dev_dbg(&acm->control->dev, "%s - send break failed\n", in acm_tty_break_ctl()
792 struct acm *acm = tty->driver_data; in acm_tty_tiocmget() local
794 return (acm->ctrlout & ACM_CTRL_DTR ? TIOCM_DTR : 0) | in acm_tty_tiocmget()
795 (acm->ctrlout & ACM_CTRL_RTS ? TIOCM_RTS : 0) | in acm_tty_tiocmget()
796 (acm->ctrlin & ACM_CTRL_DSR ? TIOCM_DSR : 0) | in acm_tty_tiocmget()
797 (acm->ctrlin & ACM_CTRL_RI ? TIOCM_RI : 0) | in acm_tty_tiocmget()
798 (acm->ctrlin & ACM_CTRL_DCD ? TIOCM_CD : 0) | in acm_tty_tiocmget()
805 struct acm *acm = tty->driver_data; in acm_tty_tiocmset() local
808 newctrl = acm->ctrlout; in acm_tty_tiocmset()
816 if (acm->ctrlout == newctrl) in acm_tty_tiocmset()
818 return acm_set_control(acm, acm->ctrlout = newctrl); in acm_tty_tiocmset()
821 static int get_serial_info(struct acm *acm, struct serial_struct __user *info) in get_serial_info() argument
830 tmp.xmit_fifo_size = acm->writesize; in get_serial_info()
831 tmp.baud_base = le32_to_cpu(acm->line.dwDTERate); in get_serial_info()
832 tmp.close_delay = acm->port.close_delay / 10; in get_serial_info()
833 tmp.closing_wait = acm->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ? in get_serial_info()
835 acm->port.closing_wait / 10; in get_serial_info()
843 static int set_serial_info(struct acm *acm, in set_serial_info() argument
857 mutex_lock(&acm->port.mutex); in set_serial_info()
860 if ((close_delay != acm->port.close_delay) || in set_serial_info()
861 (closing_wait != acm->port.closing_wait)) in set_serial_info()
866 acm->port.close_delay = close_delay; in set_serial_info()
867 acm->port.closing_wait = closing_wait; in set_serial_info()
870 mutex_unlock(&acm->port.mutex); in set_serial_info()
874 static int wait_serial_change(struct acm *acm, unsigned long arg) in wait_serial_change() argument
883 spin_lock_irq(&acm->read_lock); in wait_serial_change()
884 old = acm->oldcount; in wait_serial_change()
885 new = acm->iocount; in wait_serial_change()
886 acm->oldcount = new; in wait_serial_change()
887 spin_unlock_irq(&acm->read_lock); in wait_serial_change()
899 add_wait_queue(&acm->wioctl, &wait); in wait_serial_change()
902 remove_wait_queue(&acm->wioctl, &wait); in wait_serial_change()
903 if (acm->disconnected) { in wait_serial_change()
919 static int get_serial_usage(struct acm *acm, in get_serial_usage() argument
926 icount.dsr = acm->iocount.dsr; in get_serial_usage()
927 icount.rng = acm->iocount.rng; in get_serial_usage()
928 icount.dcd = acm->iocount.dcd; in get_serial_usage()
929 icount.frame = acm->iocount.frame; in get_serial_usage()
930 icount.overrun = acm->iocount.overrun; in get_serial_usage()
931 icount.parity = acm->iocount.parity; in get_serial_usage()
932 icount.brk = acm->iocount.brk; in get_serial_usage()
943 struct acm *acm = tty->driver_data; in acm_tty_ioctl() local
948 rv = get_serial_info(acm, (struct serial_struct __user *) arg); in acm_tty_ioctl()
951 rv = set_serial_info(acm, (struct serial_struct __user *) arg); in acm_tty_ioctl()
954 rv = usb_autopm_get_interface(acm->control); in acm_tty_ioctl()
959 rv = wait_serial_change(acm, arg); in acm_tty_ioctl()
960 usb_autopm_put_interface(acm->control); in acm_tty_ioctl()
963 rv = get_serial_usage(acm, (struct serial_icounter_struct __user *) arg); in acm_tty_ioctl()
973 struct acm *acm = tty->driver_data; in acm_tty_set_termios() local
976 int newctrl = acm->ctrlout; in acm_tty_set_termios()
999 acm->clocal = ((termios->c_cflag & CLOCAL) != 0); in acm_tty_set_termios()
1002 newline.dwDTERate = acm->line.dwDTERate; in acm_tty_set_termios()
1008 if (newctrl != acm->ctrlout) in acm_tty_set_termios()
1009 acm_set_control(acm, acm->ctrlout = newctrl); in acm_tty_set_termios()
1011 if (memcmp(&acm->line, &newline, sizeof newline)) { in acm_tty_set_termios()
1012 memcpy(&acm->line, &newline, sizeof newline); in acm_tty_set_termios()
1013 dev_dbg(&acm->control->dev, "%s - set line: %d %d %d %d\n", in acm_tty_set_termios()
1018 acm_set_line(acm, &acm->line); in acm_tty_set_termios()
1034 static void acm_write_buffers_free(struct acm *acm) in acm_write_buffers_free() argument
1038 struct usb_device *usb_dev = interface_to_usbdev(acm->control); in acm_write_buffers_free()
1040 for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++) in acm_write_buffers_free()
1041 usb_free_coherent(usb_dev, acm->writesize, wb->buf, wb->dmah); in acm_write_buffers_free()
1044 static void acm_read_buffers_free(struct acm *acm) in acm_read_buffers_free() argument
1046 struct usb_device *usb_dev = interface_to_usbdev(acm->control); in acm_read_buffers_free()
1049 for (i = 0; i < acm->rx_buflimit; i++) in acm_read_buffers_free()
1050 usb_free_coherent(usb_dev, acm->readsize, in acm_read_buffers_free()
1051 acm->read_buffers[i].base, acm->read_buffers[i].dma); in acm_read_buffers_free()
1055 static int acm_write_buffers_alloc(struct acm *acm) in acm_write_buffers_alloc() argument
1060 for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++) { in acm_write_buffers_alloc()
1061 wb->buf = usb_alloc_coherent(acm->dev, acm->writesize, GFP_KERNEL, in acm_write_buffers_alloc()
1067 usb_free_coherent(acm->dev, acm->writesize, in acm_write_buffers_alloc()
1089 struct acm *acm; in acm_probe() local
1308 acm = kzalloc(sizeof(struct acm), GFP_KERNEL); in acm_probe()
1309 if (acm == NULL) in acm_probe()
1312 minor = acm_alloc_minor(acm); in acm_probe()
1315 kfree(acm); in acm_probe()
1322 acm->combined_interfaces = combined_interfaces; in acm_probe()
1323 acm->writesize = usb_endpoint_maxp(epwrite) * 20; in acm_probe()
1324 acm->control = control_interface; in acm_probe()
1325 acm->data = data_interface; in acm_probe()
1326 acm->minor = minor; in acm_probe()
1327 acm->dev = usb_dev; in acm_probe()
1328 acm->ctrl_caps = ac_management_function; in acm_probe()
1330 acm->ctrl_caps &= ~USB_CDC_CAP_LINE; in acm_probe()
1331 acm->ctrlsize = ctrlsize; in acm_probe()
1332 acm->readsize = readsize; in acm_probe()
1333 acm->rx_buflimit = num_rx_buf; in acm_probe()
1334 INIT_WORK(&acm->work, acm_softint); in acm_probe()
1335 init_waitqueue_head(&acm->wioctl); in acm_probe()
1336 spin_lock_init(&acm->write_lock); in acm_probe()
1337 spin_lock_init(&acm->read_lock); in acm_probe()
1338 mutex_init(&acm->mutex); in acm_probe()
1339 acm->rx_endpoint = usb_rcvbulkpipe(usb_dev, epread->bEndpointAddress); in acm_probe()
1340 acm->is_int_ep = usb_endpoint_xfer_int(epread); in acm_probe()
1341 if (acm->is_int_ep) in acm_probe()
1342 acm->bInterval = epread->bInterval; in acm_probe()
1343 tty_port_init(&acm->port); in acm_probe()
1344 acm->port.ops = &acm_port_ops; in acm_probe()
1345 init_usb_anchor(&acm->delayed); in acm_probe()
1346 acm->quirks = quirks; in acm_probe()
1348 buf = usb_alloc_coherent(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma); in acm_probe()
1351 acm->ctrl_buffer = buf; in acm_probe()
1353 if (acm_write_buffers_alloc(acm) < 0) in acm_probe()
1356 acm->ctrlurb = usb_alloc_urb(0, GFP_KERNEL); in acm_probe()
1357 if (!acm->ctrlurb) in acm_probe()
1361 struct acm_rb *rb = &(acm->read_buffers[i]); in acm_probe()
1364 rb->base = usb_alloc_coherent(acm->dev, readsize, GFP_KERNEL, in acm_probe()
1369 rb->instance = acm; in acm_probe()
1377 if (acm->is_int_ep) { in acm_probe()
1378 usb_fill_int_urb(urb, acm->dev, in acm_probe()
1379 acm->rx_endpoint, in acm_probe()
1381 acm->readsize, in acm_probe()
1383 acm->bInterval); in acm_probe()
1385 usb_fill_bulk_urb(urb, acm->dev, in acm_probe()
1386 acm->rx_endpoint, in acm_probe()
1388 acm->readsize, in acm_probe()
1392 acm->read_urbs[i] = urb; in acm_probe()
1393 __set_bit(i, &acm->read_urbs_free); in acm_probe()
1396 struct acm_wb *snd = &(acm->wb[i]); in acm_probe()
1405 NULL, acm->writesize, acm_write_bulk, snd, epwrite->bInterval); in acm_probe()
1409 NULL, acm->writesize, acm_write_bulk, snd); in acm_probe()
1413 snd->instance = acm; in acm_probe()
1416 usb_set_intfdata(intf, acm); in acm_probe()
1423 acm->country_codes = kmalloc(cfd->bLength - 4, GFP_KERNEL); in acm_probe()
1424 if (!acm->country_codes) in acm_probe()
1426 acm->country_code_size = cfd->bLength - 4; in acm_probe()
1427 memcpy(acm->country_codes, (u8 *)&cfd->wCountyCode0, in acm_probe()
1429 acm->country_rel_date = cfd->iCountryCodeRelDate; in acm_probe()
1433 kfree(acm->country_codes); in acm_probe()
1434 acm->country_codes = NULL; in acm_probe()
1435 acm->country_code_size = 0; in acm_probe()
1443 kfree(acm->country_codes); in acm_probe()
1444 acm->country_codes = NULL; in acm_probe()
1445 acm->country_code_size = 0; in acm_probe()
1451 usb_fill_int_urb(acm->ctrlurb, usb_dev, in acm_probe()
1453 acm->ctrl_buffer, ctrlsize, acm_ctrl_irq, acm, in acm_probe()
1456 acm->ctrlurb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; in acm_probe()
1457 acm->ctrlurb->transfer_dma = acm->ctrl_dma; in acm_probe()
1461 acm->line.dwDTERate = cpu_to_le32(9600); in acm_probe()
1462 acm->line.bDataBits = 8; in acm_probe()
1463 acm_set_line(acm, &acm->line); in acm_probe()
1465 usb_driver_claim_interface(&acm_driver, data_interface, acm); in acm_probe()
1466 usb_set_intfdata(data_interface, acm); in acm_probe()
1469 tty_dev = tty_port_register_device(&acm->port, acm_tty_driver, minor, in acm_probe()
1483 if (acm->country_codes) { in acm_probe()
1484 device_remove_file(&acm->control->dev, in acm_probe()
1486 device_remove_file(&acm->control->dev, in acm_probe()
1488 kfree(acm->country_codes); in acm_probe()
1490 device_remove_file(&acm->control->dev, &dev_attr_bmCapabilities); in acm_probe()
1494 usb_free_urb(acm->wb[i].urb); in acm_probe()
1497 usb_free_urb(acm->read_urbs[i]); in acm_probe()
1498 acm_read_buffers_free(acm); in acm_probe()
1499 usb_free_urb(acm->ctrlurb); in acm_probe()
1501 acm_write_buffers_free(acm); in acm_probe()
1503 usb_free_coherent(usb_dev, ctrlsize, acm->ctrl_buffer, acm->ctrl_dma); in acm_probe()
1505 acm_release_minor(acm); in acm_probe()
1506 kfree(acm); in acm_probe()
1511 static void stop_data_traffic(struct acm *acm) in stop_data_traffic() argument
1515 dev_dbg(&acm->control->dev, "%s\n", __func__); in stop_data_traffic()
1517 usb_kill_urb(acm->ctrlurb); in stop_data_traffic()
1519 usb_kill_urb(acm->wb[i].urb); in stop_data_traffic()
1520 for (i = 0; i < acm->rx_buflimit; i++) in stop_data_traffic()
1521 usb_kill_urb(acm->read_urbs[i]); in stop_data_traffic()
1523 cancel_work_sync(&acm->work); in stop_data_traffic()
1528 struct acm *acm = usb_get_intfdata(intf); in acm_disconnect() local
1536 if (!acm) in acm_disconnect()
1539 mutex_lock(&acm->mutex); in acm_disconnect()
1540 acm->disconnected = true; in acm_disconnect()
1541 if (acm->country_codes) { in acm_disconnect()
1542 device_remove_file(&acm->control->dev, in acm_disconnect()
1544 device_remove_file(&acm->control->dev, in acm_disconnect()
1547 wake_up_all(&acm->wioctl); in acm_disconnect()
1548 device_remove_file(&acm->control->dev, &dev_attr_bmCapabilities); in acm_disconnect()
1549 usb_set_intfdata(acm->control, NULL); in acm_disconnect()
1550 usb_set_intfdata(acm->data, NULL); in acm_disconnect()
1551 mutex_unlock(&acm->mutex); in acm_disconnect()
1553 tty = tty_port_tty_get(&acm->port); in acm_disconnect()
1559 stop_data_traffic(acm); in acm_disconnect()
1561 tty_unregister_device(acm_tty_driver, acm->minor); in acm_disconnect()
1563 usb_free_urb(acm->ctrlurb); in acm_disconnect()
1565 usb_free_urb(acm->wb[i].urb); in acm_disconnect()
1566 for (i = 0; i < acm->rx_buflimit; i++) in acm_disconnect()
1567 usb_free_urb(acm->read_urbs[i]); in acm_disconnect()
1568 acm_write_buffers_free(acm); in acm_disconnect()
1569 usb_free_coherent(usb_dev, acm->ctrlsize, acm->ctrl_buffer, acm->ctrl_dma); in acm_disconnect()
1570 acm_read_buffers_free(acm); in acm_disconnect()
1572 if (!acm->combined_interfaces) in acm_disconnect()
1573 usb_driver_release_interface(&acm_driver, intf == acm->control ? in acm_disconnect()
1574 acm->data : acm->control); in acm_disconnect()
1576 tty_port_put(&acm->port); in acm_disconnect()
1582 struct acm *acm = usb_get_intfdata(intf); in acm_suspend() local
1585 spin_lock_irq(&acm->write_lock); in acm_suspend()
1587 if (acm->transmitting) { in acm_suspend()
1588 spin_unlock_irq(&acm->write_lock); in acm_suspend()
1592 cnt = acm->susp_count++; in acm_suspend()
1593 spin_unlock_irq(&acm->write_lock); in acm_suspend()
1598 stop_data_traffic(acm); in acm_suspend()
1605 struct acm *acm = usb_get_intfdata(intf); in acm_resume() local
1609 spin_lock_irq(&acm->write_lock); in acm_resume()
1611 if (--acm->susp_count) in acm_resume()
1614 if (test_bit(ASYNCB_INITIALIZED, &acm->port.flags)) { in acm_resume()
1615 rv = usb_submit_urb(acm->ctrlurb, GFP_ATOMIC); in acm_resume()
1618 urb = usb_get_from_anchor(&acm->delayed); in acm_resume()
1622 acm_start_wb(acm, urb->context); in acm_resume()
1632 rv = acm_submit_read_urbs(acm, GFP_ATOMIC); in acm_resume()
1635 spin_unlock_irq(&acm->write_lock); in acm_resume()
1642 struct acm *acm = usb_get_intfdata(intf); in acm_reset_resume() local
1644 if (test_bit(ASYNCB_INITIALIZED, &acm->port.flags)) in acm_reset_resume()
1645 tty_port_tty_hangup(&acm->port, false); in acm_reset_resume()