Lines Matching refs:port

96 	struct tty_port		port;  member
125 struct gs_port *port; member
334 gs_send_packet(struct gs_port *port, char *packet, unsigned size) in gs_send_packet() argument
338 len = gs_buf_data_avail(&port->port_write_buf); in gs_send_packet()
342 size = gs_buf_get(&port->port_write_buf, packet, size); in gs_send_packet()
357 static int gs_start_tx(struct gs_port *port) in gs_start_tx() argument
363 struct list_head *pool = &port->write_pool; in gs_start_tx()
364 struct usb_ep *in = port->port_usb->in; in gs_start_tx()
368 while (!port->write_busy && !list_empty(pool)) { in gs_start_tx()
372 if (port->write_started >= QUEUE_SIZE) in gs_start_tx()
376 len = gs_send_packet(port, req->buf, in->maxpacket); in gs_start_tx()
378 wake_up_interruptible(&port->drain_wait); in gs_start_tx()
385 req->zero = (gs_buf_data_avail(&port->port_write_buf) == 0); in gs_start_tx()
388 port->port_num, len, *((u8 *)req->buf), in gs_start_tx()
398 port->write_busy = true; in gs_start_tx()
399 spin_unlock(&port->port_lock); in gs_start_tx()
401 spin_lock(&port->port_lock); in gs_start_tx()
402 port->write_busy = false; in gs_start_tx()
411 port->write_started++; in gs_start_tx()
414 if (!port->port_usb) in gs_start_tx()
418 if (do_tty_wake && port->port.tty) in gs_start_tx()
419 tty_wakeup(port->port.tty); in gs_start_tx()
426 static unsigned gs_start_rx(struct gs_port *port) in gs_start_rx() argument
432 struct list_head *pool = &port->read_pool; in gs_start_rx()
433 struct usb_ep *out = port->port_usb->out; in gs_start_rx()
441 tty = port->port.tty; in gs_start_rx()
445 if (port->read_started >= QUEUE_SIZE) in gs_start_rx()
455 spin_unlock(&port->port_lock); in gs_start_rx()
457 spin_lock(&port->port_lock); in gs_start_rx()
465 port->read_started++; in gs_start_rx()
468 if (!port->port_usb) in gs_start_rx()
471 return port->read_started; in gs_start_rx()
486 struct gs_port *port = (void *)_port; in gs_rx_push() local
488 struct list_head *queue = &port->read_queue; in gs_rx_push()
493 spin_lock_irq(&port->port_lock); in gs_rx_push()
494 tty = port->port.tty; in gs_rx_push()
507 pr_vdebug("ttyGS%d: shutdown\n", port->port_num); in gs_rx_push()
513 port->port_num, req->status); in gs_rx_push()
528 n = port->n_read; in gs_rx_push()
534 count = tty_insert_flip_string(&port->port, packet, in gs_rx_push()
540 port->n_read += count; in gs_rx_push()
542 port->port_num, count, req->actual); in gs_rx_push()
545 port->n_read = 0; in gs_rx_push()
548 list_move(&req->list, &port->read_pool); in gs_rx_push()
549 port->read_started--; in gs_rx_push()
556 tty_flip_buffer_push(&port->port); in gs_rx_push()
570 tasklet_schedule(&port->push); in gs_rx_push()
573 port->port_num); in gs_rx_push()
578 if (!disconnect && port->port_usb) in gs_rx_push()
579 gs_start_rx(port); in gs_rx_push()
581 spin_unlock_irq(&port->port_lock); in gs_rx_push()
586 struct gs_port *port = ep->driver_data; in gs_read_complete() local
589 spin_lock(&port->port_lock); in gs_read_complete()
590 list_add_tail(&req->list, &port->read_queue); in gs_read_complete()
591 tasklet_schedule(&port->push); in gs_read_complete()
592 spin_unlock(&port->port_lock); in gs_read_complete()
597 struct gs_port *port = ep->driver_data; in gs_write_complete() local
599 spin_lock(&port->port_lock); in gs_write_complete()
600 list_add(&req->list, &port->write_pool); in gs_write_complete()
601 port->write_started--; in gs_write_complete()
611 gs_start_tx(port); in gs_write_complete()
620 spin_unlock(&port->port_lock); in gs_write_complete()
670 static int gs_start_io(struct gs_port *port) in gs_start_io() argument
672 struct list_head *head = &port->read_pool; in gs_start_io()
673 struct usb_ep *ep = port->port_usb->out; in gs_start_io()
684 &port->read_allocated); in gs_start_io()
688 status = gs_alloc_requests(port->port_usb->in, &port->write_pool, in gs_start_io()
689 gs_write_complete, &port->write_allocated); in gs_start_io()
691 gs_free_requests(ep, head, &port->read_allocated); in gs_start_io()
696 port->n_read = 0; in gs_start_io()
697 started = gs_start_rx(port); in gs_start_io()
701 tty_wakeup(port->port.tty); in gs_start_io()
703 gs_free_requests(ep, head, &port->read_allocated); in gs_start_io()
704 gs_free_requests(port->port_usb->in, &port->write_pool, in gs_start_io()
705 &port->write_allocated); in gs_start_io()
724 struct gs_port *port; in gs_open() local
729 port = ports[port_num].port; in gs_open()
730 if (!port) in gs_open()
733 spin_lock_irq(&port->port_lock); in gs_open()
736 if (port->port.count) { in gs_open()
738 port->port.count++; in gs_open()
741 } else if (port->openclose) { in gs_open()
747 port->openclose = true; in gs_open()
749 spin_unlock_irq(&port->port_lock); in gs_open()
771 spin_lock_irq(&port->port_lock); in gs_open()
774 if (port->port_write_buf.buf_buf == NULL) { in gs_open()
776 spin_unlock_irq(&port->port_lock); in gs_open()
777 status = gs_buf_alloc(&port->port_write_buf, WRITE_BUF_SIZE); in gs_open()
778 spin_lock_irq(&port->port_lock); in gs_open()
782 port->port_num, tty, file); in gs_open()
783 port->openclose = false; in gs_open()
794 tty->driver_data = port; in gs_open()
795 port->port.tty = tty; in gs_open()
797 port->port.count = 1; in gs_open()
798 port->openclose = false; in gs_open()
801 if (port->port_usb) { in gs_open()
802 struct gserial *gser = port->port_usb; in gs_open()
804 pr_debug("gs_open: start ttyGS%d\n", port->port_num); in gs_open()
805 gs_start_io(port); in gs_open()
811 pr_debug("gs_open: ttyGS%d (%p,%p)\n", port->port_num, tty, file); in gs_open()
816 spin_unlock_irq(&port->port_lock); in gs_open()
834 struct gs_port *port = tty->driver_data; in gs_close() local
837 spin_lock_irq(&port->port_lock); in gs_close()
839 if (port->port.count != 1) { in gs_close()
840 if (port->port.count == 0) in gs_close()
843 --port->port.count; in gs_close()
847 pr_debug("gs_close: ttyGS%d (%p,%p) ...\n", port->port_num, tty, file); in gs_close()
852 port->openclose = true; in gs_close()
853 port->port.count = 0; in gs_close()
855 gser = port->port_usb; in gs_close()
862 if (gs_buf_data_avail(&port->port_write_buf) > 0 && gser) { in gs_close()
863 spin_unlock_irq(&port->port_lock); in gs_close()
864 wait_event_interruptible_timeout(port->drain_wait, in gs_close()
865 gs_writes_finished(port), in gs_close()
867 spin_lock_irq(&port->port_lock); in gs_close()
868 gser = port->port_usb; in gs_close()
876 gs_buf_free(&port->port_write_buf); in gs_close()
878 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->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()
1047 init_waitqueue_head(&port->close_wait); in gs_port_alloc()
1049 tasklet_init(&port->push, gs_rx_push, (unsigned long) port); in gs_port_alloc()
1051 INIT_LIST_HEAD(&port->read_pool); in gs_port_alloc()
1052 INIT_LIST_HEAD(&port->read_queue); in gs_port_alloc()
1053 INIT_LIST_HEAD(&port->write_pool); in gs_port_alloc()
1055 port->port_num = port_num; in gs_port_alloc()
1056 port->port_line_coding = *coding; in gs_port_alloc()
1058 ports[port_num].port = port; in gs_port_alloc()
1064 static int gs_closed(struct gs_port *port) in gs_closed() argument
1068 spin_lock_irq(&port->port_lock); in gs_closed()
1069 cond = (port->port.count == 0) && !port->openclose; in gs_closed()
1070 spin_unlock_irq(&port->port_lock); in gs_closed()
1074 static void gserial_free_port(struct gs_port *port) in gserial_free_port() argument
1076 tasklet_kill(&port->push); in gserial_free_port()
1078 wait_event(port->close_wait, gs_closed(port)); in gserial_free_port()
1079 WARN_ON(port->port_usb != NULL); in gserial_free_port()
1080 tty_port_destroy(&port->port); in gserial_free_port()
1081 kfree(port); in gserial_free_port()
1086 struct gs_port *port; in gserial_free_line() local
1089 if (WARN_ON(!ports[port_num].port)) { in gserial_free_line()
1093 port = ports[port_num].port; in gserial_free_line()
1094 ports[port_num].port = NULL; in gserial_free_line()
1097 gserial_free_port(port); in gserial_free_line()
1127 tty_dev = tty_port_register_device(&ports[port_num].port->port, in gserial_alloc_line()
1130 struct gs_port *port; in gserial_alloc_line() local
1135 port = ports[port_num].port; in gserial_alloc_line()
1136 ports[port_num].port = NULL; in gserial_alloc_line()
1137 gserial_free_port(port); in gserial_alloc_line()
1169 struct gs_port *port; in gserial_connect() local
1176 port = ports[port_num].port; in gserial_connect()
1177 if (!port) { in gserial_connect()
1181 if (port->port_usb) { in gserial_connect()
1190 gser->in->driver_data = port; in gserial_connect()
1195 gser->out->driver_data = port; in gserial_connect()
1198 spin_lock_irqsave(&port->port_lock, flags); in gserial_connect()
1199 gser->ioport = port; in gserial_connect()
1200 port->port_usb = gser; in gserial_connect()
1205 gser->port_line_coding = port->port_line_coding; in gserial_connect()
1212 if (port->port.count) { in gserial_connect()
1213 pr_debug("gserial_connect: start ttyGS%d\n", port->port_num); in gserial_connect()
1214 gs_start_io(port); in gserial_connect()
1222 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()
1270 spin_lock_irqsave(&port->port_lock, flags); in gserial_disconnect()
1271 if (port->port.count == 0 && !port->openclose) in gserial_disconnect()
1272 gs_buf_free(&port->port_write_buf); in gserial_disconnect()
1273 gs_free_requests(gser->out, &port->read_pool, NULL); in gserial_disconnect()
1274 gs_free_requests(gser->out, &port->read_queue, NULL); in gserial_disconnect()
1275 gs_free_requests(gser->in, &port->write_pool, NULL); in gserial_disconnect()
1277 port->read_allocated = port->read_started = in gserial_disconnect()
1278 port->write_allocated = port->write_started = 0; in gserial_disconnect()
1280 spin_unlock_irqrestore(&port->port_lock, flags); in gserial_disconnect()