Lines Matching refs:port
96 struct tty_port port; member
124 struct gs_port *port; member
333 gs_send_packet(struct gs_port *port, char *packet, unsigned size) in gs_send_packet() argument
337 len = gs_buf_data_avail(&port->port_write_buf); in gs_send_packet()
341 size = gs_buf_get(&port->port_write_buf, packet, size); in gs_send_packet()
356 static int gs_start_tx(struct gs_port *port) in gs_start_tx() argument
362 struct list_head *pool = &port->write_pool; in gs_start_tx()
363 struct usb_ep *in = port->port_usb->in; in gs_start_tx()
367 while (!port->write_busy && !list_empty(pool)) { in gs_start_tx()
371 if (port->write_started >= QUEUE_SIZE) in gs_start_tx()
375 len = gs_send_packet(port, req->buf, in->maxpacket); in gs_start_tx()
377 wake_up_interruptible(&port->drain_wait); in gs_start_tx()
384 req->zero = (gs_buf_data_avail(&port->port_write_buf) == 0); in gs_start_tx()
387 port->port_num, len, *((u8 *)req->buf), in gs_start_tx()
397 port->write_busy = true; in gs_start_tx()
398 spin_unlock(&port->port_lock); in gs_start_tx()
400 spin_lock(&port->port_lock); in gs_start_tx()
401 port->write_busy = false; in gs_start_tx()
410 port->write_started++; in gs_start_tx()
413 if (!port->port_usb) in gs_start_tx()
417 if (do_tty_wake && port->port.tty) in gs_start_tx()
418 tty_wakeup(port->port.tty); in gs_start_tx()
425 static unsigned gs_start_rx(struct gs_port *port) in gs_start_rx() argument
431 struct list_head *pool = &port->read_pool; in gs_start_rx()
432 struct usb_ep *out = port->port_usb->out; in gs_start_rx()
440 tty = port->port.tty; in gs_start_rx()
444 if (port->read_started >= QUEUE_SIZE) in gs_start_rx()
454 spin_unlock(&port->port_lock); in gs_start_rx()
456 spin_lock(&port->port_lock); in gs_start_rx()
464 port->read_started++; in gs_start_rx()
467 if (!port->port_usb) in gs_start_rx()
470 return port->read_started; in gs_start_rx()
485 struct gs_port *port = (void *)_port; in gs_rx_push() local
487 struct list_head *queue = &port->read_queue; in gs_rx_push()
492 spin_lock_irq(&port->port_lock); in gs_rx_push()
493 tty = port->port.tty; in gs_rx_push()
506 pr_vdebug("ttyGS%d: shutdown\n", port->port_num); in gs_rx_push()
512 port->port_num, req->status); in gs_rx_push()
527 n = port->n_read; in gs_rx_push()
533 count = tty_insert_flip_string(&port->port, packet, in gs_rx_push()
539 port->n_read += count; in gs_rx_push()
541 port->port_num, count, req->actual); in gs_rx_push()
544 port->n_read = 0; in gs_rx_push()
547 list_move(&req->list, &port->read_pool); in gs_rx_push()
548 port->read_started--; in gs_rx_push()
555 tty_flip_buffer_push(&port->port); in gs_rx_push()
569 tasklet_schedule(&port->push); in gs_rx_push()
572 port->port_num); in gs_rx_push()
577 if (!disconnect && port->port_usb) in gs_rx_push()
578 gs_start_rx(port); in gs_rx_push()
580 spin_unlock_irq(&port->port_lock); in gs_rx_push()
585 struct gs_port *port = ep->driver_data; in gs_read_complete() local
588 spin_lock(&port->port_lock); in gs_read_complete()
589 list_add_tail(&req->list, &port->read_queue); in gs_read_complete()
590 tasklet_schedule(&port->push); in gs_read_complete()
591 spin_unlock(&port->port_lock); in gs_read_complete()
596 struct gs_port *port = ep->driver_data; in gs_write_complete() local
598 spin_lock(&port->port_lock); in gs_write_complete()
599 list_add(&req->list, &port->write_pool); in gs_write_complete()
600 port->write_started--; in gs_write_complete()
610 gs_start_tx(port); in gs_write_complete()
619 spin_unlock(&port->port_lock); in gs_write_complete()
669 static int gs_start_io(struct gs_port *port) in gs_start_io() argument
671 struct list_head *head = &port->read_pool; in gs_start_io()
672 struct usb_ep *ep = port->port_usb->out; in gs_start_io()
683 &port->read_allocated); in gs_start_io()
687 status = gs_alloc_requests(port->port_usb->in, &port->write_pool, in gs_start_io()
688 gs_write_complete, &port->write_allocated); in gs_start_io()
690 gs_free_requests(ep, head, &port->read_allocated); in gs_start_io()
695 port->n_read = 0; in gs_start_io()
696 started = gs_start_rx(port); in gs_start_io()
700 tty_wakeup(port->port.tty); in gs_start_io()
702 gs_free_requests(ep, head, &port->read_allocated); in gs_start_io()
703 gs_free_requests(port->port_usb->in, &port->write_pool, in gs_start_io()
704 &port->write_allocated); in gs_start_io()
723 struct gs_port *port; in gs_open() local
728 port = ports[port_num].port; in gs_open()
729 if (!port) in gs_open()
732 spin_lock_irq(&port->port_lock); in gs_open()
735 if (port->port.count) { in gs_open()
737 port->port.count++; in gs_open()
740 } else if (port->openclose) { in gs_open()
746 port->openclose = true; in gs_open()
748 spin_unlock_irq(&port->port_lock); in gs_open()
770 spin_lock_irq(&port->port_lock); in gs_open()
773 if (port->port_write_buf.buf_buf == NULL) { in gs_open()
775 spin_unlock_irq(&port->port_lock); in gs_open()
776 status = gs_buf_alloc(&port->port_write_buf, WRITE_BUF_SIZE); in gs_open()
777 spin_lock_irq(&port->port_lock); in gs_open()
781 port->port_num, tty, file); in gs_open()
782 port->openclose = false; in gs_open()
793 tty->driver_data = port; in gs_open()
794 port->port.tty = tty; in gs_open()
796 port->port.count = 1; in gs_open()
797 port->openclose = false; in gs_open()
800 if (port->port_usb) { in gs_open()
801 struct gserial *gser = port->port_usb; in gs_open()
803 pr_debug("gs_open: start ttyGS%d\n", port->port_num); in gs_open()
804 gs_start_io(port); in gs_open()
810 pr_debug("gs_open: ttyGS%d (%p,%p)\n", port->port_num, tty, file); in gs_open()
815 spin_unlock_irq(&port->port_lock); in gs_open()
833 struct gs_port *port = tty->driver_data; in gs_close() local
836 spin_lock_irq(&port->port_lock); in gs_close()
838 if (port->port.count != 1) { in gs_close()
839 if (port->port.count == 0) in gs_close()
842 --port->port.count; in gs_close()
846 pr_debug("gs_close: ttyGS%d (%p,%p) ...\n", port->port_num, tty, file); in gs_close()
851 port->openclose = true; in gs_close()
852 port->port.count = 0; in gs_close()
854 gser = port->port_usb; in gs_close()
861 if (gs_buf_data_avail(&port->port_write_buf) > 0 && gser) { in gs_close()
862 spin_unlock_irq(&port->port_lock); in gs_close()
863 wait_event_interruptible_timeout(port->drain_wait, in gs_close()
864 gs_writes_finished(port), in gs_close()
866 spin_lock_irq(&port->port_lock); in gs_close()
867 gser = port->port_usb; in gs_close()
875 gs_buf_free(&port->port_write_buf); in gs_close()
877 gs_buf_clear(&port->port_write_buf); in gs_close()
880 port->port.tty = NULL; in gs_close()
882 port->openclose = false; in gs_close()
885 port->port_num, tty, file); in gs_close()
887 wake_up(&port->port.close_wait); in gs_close()
889 spin_unlock_irq(&port->port_lock); in gs_close()
894 struct gs_port *port = tty->driver_data; in gs_write() local
899 port->port_num, tty, count); in gs_write()
901 spin_lock_irqsave(&port->port_lock, flags); in gs_write()
903 count = gs_buf_put(&port->port_write_buf, buf, count); in gs_write()
905 if (port->port_usb) in gs_write()
906 status = gs_start_tx(port); in gs_write()
907 spin_unlock_irqrestore(&port->port_lock, flags); in gs_write()
914 struct gs_port *port = tty->driver_data; in gs_put_char() local
919 port->port_num, tty, ch, __builtin_return_address(0)); in gs_put_char()
921 spin_lock_irqsave(&port->port_lock, flags); in gs_put_char()
922 status = gs_buf_put(&port->port_write_buf, &ch, 1); in gs_put_char()
923 spin_unlock_irqrestore(&port->port_lock, flags); in gs_put_char()
930 struct gs_port *port = tty->driver_data; in gs_flush_chars() local
933 pr_vdebug("gs_flush_chars: (%d,%p)\n", port->port_num, tty); in gs_flush_chars()
935 spin_lock_irqsave(&port->port_lock, flags); in gs_flush_chars()
936 if (port->port_usb) in gs_flush_chars()
937 gs_start_tx(port); in gs_flush_chars()
938 spin_unlock_irqrestore(&port->port_lock, flags); in gs_flush_chars()
943 struct gs_port *port = tty->driver_data; in gs_write_room() local
947 spin_lock_irqsave(&port->port_lock, flags); in gs_write_room()
948 if (port->port_usb) in gs_write_room()
949 room = gs_buf_space_avail(&port->port_write_buf); in gs_write_room()
950 spin_unlock_irqrestore(&port->port_lock, flags); in gs_write_room()
953 port->port_num, tty, room); in gs_write_room()
960 struct gs_port *port = tty->driver_data; in gs_chars_in_buffer() local
964 spin_lock_irqsave(&port->port_lock, flags); in gs_chars_in_buffer()
965 chars = gs_buf_data_avail(&port->port_write_buf); in gs_chars_in_buffer()
966 spin_unlock_irqrestore(&port->port_lock, flags); in gs_chars_in_buffer()
969 port->port_num, tty, chars); in gs_chars_in_buffer()
977 struct gs_port *port = tty->driver_data; in gs_unthrottle() local
980 spin_lock_irqsave(&port->port_lock, flags); in gs_unthrottle()
981 if (port->port_usb) { in gs_unthrottle()
986 tasklet_schedule(&port->push); in gs_unthrottle()
987 pr_vdebug("ttyGS%d: unthrottle\n", port->port_num); in gs_unthrottle()
989 spin_unlock_irqrestore(&port->port_lock, flags); in gs_unthrottle()
994 struct gs_port *port = tty->driver_data; in gs_break_ctl() local
999 port->port_num, duration); in gs_break_ctl()
1001 spin_lock_irq(&port->port_lock); in gs_break_ctl()
1002 gser = port->port_usb; in gs_break_ctl()
1005 spin_unlock_irq(&port->port_lock); in gs_break_ctl()
1029 struct gs_port *port; in gs_port_alloc() local
1033 if (ports[port_num].port) { in gs_port_alloc()
1038 port = kzalloc(sizeof(struct gs_port), GFP_KERNEL); in gs_port_alloc()
1039 if (port == NULL) { in gs_port_alloc()
1044 tty_port_init(&port->port); in gs_port_alloc()
1045 spin_lock_init(&port->port_lock); in gs_port_alloc()
1046 init_waitqueue_head(&port->drain_wait); in gs_port_alloc()
1048 tasklet_init(&port->push, gs_rx_push, (unsigned long) port); in gs_port_alloc()
1050 INIT_LIST_HEAD(&port->read_pool); in gs_port_alloc()
1051 INIT_LIST_HEAD(&port->read_queue); in gs_port_alloc()
1052 INIT_LIST_HEAD(&port->write_pool); in gs_port_alloc()
1054 port->port_num = port_num; in gs_port_alloc()
1055 port->port_line_coding = *coding; in gs_port_alloc()
1057 ports[port_num].port = port; in gs_port_alloc()
1063 static int gs_closed(struct gs_port *port) in gs_closed() argument
1067 spin_lock_irq(&port->port_lock); in gs_closed()
1068 cond = (port->port.count == 0) && !port->openclose; in gs_closed()
1069 spin_unlock_irq(&port->port_lock); in gs_closed()
1073 static void gserial_free_port(struct gs_port *port) in gserial_free_port() argument
1075 tasklet_kill(&port->push); in gserial_free_port()
1077 wait_event(port->port.close_wait, gs_closed(port)); in gserial_free_port()
1078 WARN_ON(port->port_usb != NULL); in gserial_free_port()
1079 tty_port_destroy(&port->port); in gserial_free_port()
1080 kfree(port); in gserial_free_port()
1085 struct gs_port *port; in gserial_free_line() local
1088 if (WARN_ON(!ports[port_num].port)) { in gserial_free_line()
1092 port = ports[port_num].port; in gserial_free_line()
1093 ports[port_num].port = NULL; in gserial_free_line()
1096 gserial_free_port(port); in gserial_free_line()
1126 tty_dev = tty_port_register_device(&ports[port_num].port->port, in gserial_alloc_line()
1129 struct gs_port *port; in gserial_alloc_line() local
1134 port = ports[port_num].port; in gserial_alloc_line()
1135 ports[port_num].port = NULL; in gserial_alloc_line()
1136 gserial_free_port(port); in gserial_alloc_line()
1168 struct gs_port *port; in gserial_connect() local
1175 port = ports[port_num].port; in gserial_connect()
1176 if (!port) { in gserial_connect()
1180 if (port->port_usb) { in gserial_connect()
1189 gser->in->driver_data = port; in gserial_connect()
1194 gser->out->driver_data = port; in gserial_connect()
1197 spin_lock_irqsave(&port->port_lock, flags); in gserial_connect()
1198 gser->ioport = port; in gserial_connect()
1199 port->port_usb = gser; in gserial_connect()
1204 gser->port_line_coding = port->port_line_coding; in gserial_connect()
1211 if (port->port.count) { in gserial_connect()
1212 pr_debug("gserial_connect: start ttyGS%d\n", port->port_num); in gserial_connect()
1213 gs_start_io(port); in gserial_connect()
1221 spin_unlock_irqrestore(&port->port_lock, flags); in gserial_connect()
1244 struct gs_port *port = gser->ioport; in gserial_disconnect() local
1247 if (!port) in gserial_disconnect()
1251 spin_lock_irqsave(&port->port_lock, flags); in gserial_disconnect()
1254 port->port_line_coding = gser->port_line_coding; in gserial_disconnect()
1256 port->port_usb = NULL; in gserial_disconnect()
1258 if (port->port.count > 0 || port->openclose) { in gserial_disconnect()
1259 wake_up_interruptible(&port->drain_wait); in gserial_disconnect()
1260 if (port->port.tty) in gserial_disconnect()
1261 tty_hangup(port->port.tty); in gserial_disconnect()
1263 spin_unlock_irqrestore(&port->port_lock, flags); in gserial_disconnect()
1273 spin_lock_irqsave(&port->port_lock, flags); in gserial_disconnect()
1274 if (port->port.count == 0 && !port->openclose) in gserial_disconnect()
1275 gs_buf_free(&port->port_write_buf); in gserial_disconnect()
1276 gs_free_requests(gser->out, &port->read_pool, NULL); in gserial_disconnect()
1277 gs_free_requests(gser->out, &port->read_queue, NULL); in gserial_disconnect()
1278 gs_free_requests(gser->in, &port->write_pool, NULL); in gserial_disconnect()
1280 port->read_allocated = port->read_started = in gserial_disconnect()
1281 port->write_allocated = port->write_started = 0; in gserial_disconnect()
1283 spin_unlock_irqrestore(&port->port_lock, flags); in gserial_disconnect()