• Home
  • Raw
  • Download

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()
368 if (!port->port_usb) in gs_start_tx()
371 in = port->port_usb->in; in gs_start_tx()
373 while (!port->write_busy && !list_empty(pool)) { in gs_start_tx()
377 if (port->write_started >= QUEUE_SIZE) in gs_start_tx()
381 len = gs_send_packet(port, req->buf, in->maxpacket); in gs_start_tx()
383 wake_up_interruptible(&port->drain_wait); in gs_start_tx()
390 req->zero = (gs_buf_data_avail(&port->port_write_buf) == 0); in gs_start_tx()
393 port->port_num, len, *((u8 *)req->buf), in gs_start_tx()
403 port->write_busy = true; in gs_start_tx()
404 spin_unlock(&port->port_lock); in gs_start_tx()
406 spin_lock(&port->port_lock); in gs_start_tx()
407 port->write_busy = false; in gs_start_tx()
416 port->write_started++; in gs_start_tx()
419 if (!port->port_usb) in gs_start_tx()
423 if (do_tty_wake && port->port.tty) in gs_start_tx()
424 tty_wakeup(port->port.tty); in gs_start_tx()
431 static unsigned gs_start_rx(struct gs_port *port) in gs_start_rx() argument
437 struct list_head *pool = &port->read_pool; in gs_start_rx()
438 struct usb_ep *out = port->port_usb->out; in gs_start_rx()
446 tty = port->port.tty; in gs_start_rx()
450 if (port->read_started >= QUEUE_SIZE) in gs_start_rx()
460 spin_unlock(&port->port_lock); in gs_start_rx()
462 spin_lock(&port->port_lock); in gs_start_rx()
470 port->read_started++; in gs_start_rx()
473 if (!port->port_usb) in gs_start_rx()
476 return port->read_started; in gs_start_rx()
491 struct gs_port *port = (void *)_port; in gs_rx_push() local
493 struct list_head *queue = &port->read_queue; in gs_rx_push()
498 spin_lock_irq(&port->port_lock); in gs_rx_push()
499 tty = port->port.tty; in gs_rx_push()
512 pr_vdebug("ttyGS%d: shutdown\n", port->port_num); in gs_rx_push()
518 port->port_num, req->status); in gs_rx_push()
533 n = port->n_read; in gs_rx_push()
539 count = tty_insert_flip_string(&port->port, packet, in gs_rx_push()
545 port->n_read += count; in gs_rx_push()
547 port->port_num, count, req->actual); in gs_rx_push()
550 port->n_read = 0; in gs_rx_push()
553 list_move(&req->list, &port->read_pool); in gs_rx_push()
554 port->read_started--; in gs_rx_push()
561 tty_flip_buffer_push(&port->port); in gs_rx_push()
575 tasklet_schedule(&port->push); in gs_rx_push()
578 port->port_num); in gs_rx_push()
583 if (!disconnect && port->port_usb) in gs_rx_push()
584 gs_start_rx(port); in gs_rx_push()
586 spin_unlock_irq(&port->port_lock); in gs_rx_push()
591 struct gs_port *port = ep->driver_data; in gs_read_complete() local
594 spin_lock(&port->port_lock); in gs_read_complete()
595 list_add_tail(&req->list, &port->read_queue); in gs_read_complete()
596 tasklet_schedule(&port->push); in gs_read_complete()
597 spin_unlock(&port->port_lock); in gs_read_complete()
602 struct gs_port *port = ep->driver_data; in gs_write_complete() local
604 spin_lock(&port->port_lock); in gs_write_complete()
605 list_add(&req->list, &port->write_pool); in gs_write_complete()
606 port->write_started--; in gs_write_complete()
616 gs_start_tx(port); in gs_write_complete()
625 spin_unlock(&port->port_lock); in gs_write_complete()
675 static int gs_start_io(struct gs_port *port) in gs_start_io() argument
677 struct list_head *head = &port->read_pool; in gs_start_io()
678 struct usb_ep *ep = port->port_usb->out; in gs_start_io()
689 &port->read_allocated); in gs_start_io()
693 status = gs_alloc_requests(port->port_usb->in, &port->write_pool, in gs_start_io()
694 gs_write_complete, &port->write_allocated); in gs_start_io()
696 gs_free_requests(ep, head, &port->read_allocated); in gs_start_io()
701 port->n_read = 0; in gs_start_io()
702 started = gs_start_rx(port); in gs_start_io()
705 gs_start_tx(port); in gs_start_io()
708 tty_wakeup(port->port.tty); in gs_start_io()
710 gs_free_requests(ep, head, &port->read_allocated); in gs_start_io()
711 gs_free_requests(port->port_usb->in, &port->write_pool, in gs_start_io()
712 &port->write_allocated); in gs_start_io()
731 struct gs_port *port; in gs_open() local
736 port = ports[port_num].port; in gs_open()
737 if (!port) in gs_open()
740 spin_lock_irq(&port->port_lock); in gs_open()
743 if (port->port.count) { in gs_open()
745 port->port.count++; in gs_open()
748 } else if (port->openclose) { in gs_open()
754 port->openclose = true; in gs_open()
756 spin_unlock_irq(&port->port_lock); in gs_open()
778 spin_lock_irq(&port->port_lock); in gs_open()
781 if (port->port_write_buf.buf_buf == NULL) { in gs_open()
783 spin_unlock_irq(&port->port_lock); in gs_open()
784 status = gs_buf_alloc(&port->port_write_buf, WRITE_BUF_SIZE); in gs_open()
785 spin_lock_irq(&port->port_lock); in gs_open()
789 port->port_num, tty, file); in gs_open()
790 port->openclose = false; in gs_open()
801 tty->driver_data = port; in gs_open()
802 port->port.tty = tty; in gs_open()
804 port->port.count = 1; in gs_open()
805 port->openclose = false; in gs_open()
808 if (port->port_usb) { in gs_open()
809 struct gserial *gser = port->port_usb; in gs_open()
811 pr_debug("gs_open: start ttyGS%d\n", port->port_num); in gs_open()
812 gs_start_io(port); in gs_open()
818 pr_debug("gs_open: ttyGS%d (%p,%p)\n", port->port_num, tty, file); in gs_open()
823 spin_unlock_irq(&port->port_lock); in gs_open()
841 struct gs_port *port = tty->driver_data; in gs_close() local
844 spin_lock_irq(&port->port_lock); in gs_close()
846 if (port->port.count != 1) { in gs_close()
847 if (port->port.count == 0) in gs_close()
850 --port->port.count; in gs_close()
854 pr_debug("gs_close: ttyGS%d (%p,%p) ...\n", port->port_num, tty, file); in gs_close()
859 port->openclose = true; in gs_close()
860 port->port.count = 0; in gs_close()
862 gser = port->port_usb; in gs_close()
869 if (gs_buf_data_avail(&port->port_write_buf) > 0 && gser) { in gs_close()
870 spin_unlock_irq(&port->port_lock); in gs_close()
871 wait_event_interruptible_timeout(port->drain_wait, in gs_close()
872 gs_writes_finished(port), in gs_close()
874 spin_lock_irq(&port->port_lock); in gs_close()
875 gser = port->port_usb; in gs_close()
883 gs_buf_free(&port->port_write_buf); in gs_close()
885 gs_buf_clear(&port->port_write_buf); in gs_close()
887 port->port.tty = NULL; in gs_close()
889 port->openclose = false; in gs_close()
892 port->port_num, tty, file); in gs_close()
894 wake_up(&port->close_wait); in gs_close()
896 spin_unlock_irq(&port->port_lock); in gs_close()
901 struct gs_port *port = tty->driver_data; in gs_write() local
906 port->port_num, tty, count); in gs_write()
908 spin_lock_irqsave(&port->port_lock, flags); in gs_write()
910 count = gs_buf_put(&port->port_write_buf, buf, count); in gs_write()
912 if (port->port_usb) in gs_write()
913 status = gs_start_tx(port); in gs_write()
914 spin_unlock_irqrestore(&port->port_lock, flags); in gs_write()
921 struct gs_port *port = tty->driver_data; in gs_put_char() local
926 port->port_num, tty, ch, __builtin_return_address(0)); in gs_put_char()
928 spin_lock_irqsave(&port->port_lock, flags); in gs_put_char()
929 status = gs_buf_put(&port->port_write_buf, &ch, 1); in gs_put_char()
930 spin_unlock_irqrestore(&port->port_lock, flags); in gs_put_char()
937 struct gs_port *port = tty->driver_data; in gs_flush_chars() local
940 pr_vdebug("gs_flush_chars: (%d,%p)\n", port->port_num, tty); in gs_flush_chars()
942 spin_lock_irqsave(&port->port_lock, flags); in gs_flush_chars()
943 if (port->port_usb) in gs_flush_chars()
944 gs_start_tx(port); in gs_flush_chars()
945 spin_unlock_irqrestore(&port->port_lock, flags); in gs_flush_chars()
950 struct gs_port *port = tty->driver_data; in gs_write_room() local
954 spin_lock_irqsave(&port->port_lock, flags); in gs_write_room()
955 if (port->port_usb) in gs_write_room()
956 room = gs_buf_space_avail(&port->port_write_buf); in gs_write_room()
957 spin_unlock_irqrestore(&port->port_lock, flags); in gs_write_room()
960 port->port_num, tty, room); in gs_write_room()
967 struct gs_port *port = tty->driver_data; in gs_chars_in_buffer() local
971 spin_lock_irqsave(&port->port_lock, flags); in gs_chars_in_buffer()
972 chars = gs_buf_data_avail(&port->port_write_buf); in gs_chars_in_buffer()
973 spin_unlock_irqrestore(&port->port_lock, flags); in gs_chars_in_buffer()
976 port->port_num, tty, chars); in gs_chars_in_buffer()
984 struct gs_port *port = tty->driver_data; in gs_unthrottle() local
987 spin_lock_irqsave(&port->port_lock, flags); in gs_unthrottle()
988 if (port->port_usb) { in gs_unthrottle()
993 tasklet_schedule(&port->push); in gs_unthrottle()
994 pr_vdebug("ttyGS%d: unthrottle\n", port->port_num); in gs_unthrottle()
996 spin_unlock_irqrestore(&port->port_lock, flags); in gs_unthrottle()
1001 struct gs_port *port = tty->driver_data; in gs_break_ctl() local
1006 port->port_num, duration); in gs_break_ctl()
1008 spin_lock_irq(&port->port_lock); in gs_break_ctl()
1009 gser = port->port_usb; in gs_break_ctl()
1012 spin_unlock_irq(&port->port_lock); in gs_break_ctl()
1036 struct gs_port *port; in gs_port_alloc() local
1040 if (ports[port_num].port) { in gs_port_alloc()
1045 port = kzalloc(sizeof(struct gs_port), GFP_KERNEL); in gs_port_alloc()
1046 if (port == NULL) { in gs_port_alloc()
1051 tty_port_init(&port->port); in gs_port_alloc()
1052 spin_lock_init(&port->port_lock); in gs_port_alloc()
1053 init_waitqueue_head(&port->drain_wait); in gs_port_alloc()
1054 init_waitqueue_head(&port->close_wait); in gs_port_alloc()
1056 tasklet_init(&port->push, gs_rx_push, (unsigned long) port); in gs_port_alloc()
1058 INIT_LIST_HEAD(&port->read_pool); in gs_port_alloc()
1059 INIT_LIST_HEAD(&port->read_queue); in gs_port_alloc()
1060 INIT_LIST_HEAD(&port->write_pool); in gs_port_alloc()
1062 port->port_num = port_num; in gs_port_alloc()
1063 port->port_line_coding = *coding; in gs_port_alloc()
1065 ports[port_num].port = port; in gs_port_alloc()
1071 static int gs_closed(struct gs_port *port) in gs_closed() argument
1075 spin_lock_irq(&port->port_lock); in gs_closed()
1076 cond = (port->port.count == 0) && !port->openclose; in gs_closed()
1077 spin_unlock_irq(&port->port_lock); in gs_closed()
1081 static void gserial_free_port(struct gs_port *port) in gserial_free_port() argument
1083 tasklet_kill(&port->push); in gserial_free_port()
1085 wait_event(port->close_wait, gs_closed(port)); in gserial_free_port()
1086 WARN_ON(port->port_usb != NULL); in gserial_free_port()
1087 tty_port_destroy(&port->port); in gserial_free_port()
1088 kfree(port); in gserial_free_port()
1093 struct gs_port *port; in gserial_free_line() local
1096 if (WARN_ON(!ports[port_num].port)) { in gserial_free_line()
1100 port = ports[port_num].port; in gserial_free_line()
1101 ports[port_num].port = NULL; in gserial_free_line()
1104 gserial_free_port(port); in gserial_free_line()
1134 tty_dev = tty_port_register_device(&ports[port_num].port->port, in gserial_alloc_line()
1137 struct gs_port *port; in gserial_alloc_line() local
1143 port = ports[port_num].port; in gserial_alloc_line()
1144 ports[port_num].port = NULL; in gserial_alloc_line()
1146 gserial_free_port(port); in gserial_alloc_line()
1178 struct gs_port *port; in gserial_connect() local
1185 port = ports[port_num].port; in gserial_connect()
1186 if (!port) { in gserial_connect()
1190 if (port->port_usb) { in gserial_connect()
1199 gser->in->driver_data = port; in gserial_connect()
1204 gser->out->driver_data = port; in gserial_connect()
1207 spin_lock_irqsave(&port->port_lock, flags); in gserial_connect()
1208 gser->ioport = port; in gserial_connect()
1209 port->port_usb = gser; in gserial_connect()
1214 gser->port_line_coding = port->port_line_coding; in gserial_connect()
1221 if (port->port.count) { in gserial_connect()
1222 pr_debug("gserial_connect: start ttyGS%d\n", port->port_num); in gserial_connect()
1223 gs_start_io(port); in gserial_connect()
1231 spin_unlock_irqrestore(&port->port_lock, flags); in gserial_connect()
1253 struct gs_port *port = gser->ioport; in gserial_disconnect() local
1256 if (!port) in gserial_disconnect()
1260 spin_lock_irqsave(&port->port_lock, flags); in gserial_disconnect()
1263 port->port_line_coding = gser->port_line_coding; in gserial_disconnect()
1265 port->port_usb = NULL; in gserial_disconnect()
1267 if (port->port.count > 0 || port->openclose) { in gserial_disconnect()
1268 wake_up_interruptible(&port->drain_wait); in gserial_disconnect()
1269 if (port->port.tty) in gserial_disconnect()
1270 tty_hangup(port->port.tty); in gserial_disconnect()
1272 spin_unlock_irqrestore(&port->port_lock, flags); in gserial_disconnect()
1279 spin_lock_irqsave(&port->port_lock, flags); in gserial_disconnect()
1280 if (port->port.count == 0 && !port->openclose) in gserial_disconnect()
1281 gs_buf_free(&port->port_write_buf); in gserial_disconnect()
1282 gs_free_requests(gser->out, &port->read_pool, NULL); in gserial_disconnect()
1283 gs_free_requests(gser->out, &port->read_queue, NULL); in gserial_disconnect()
1284 gs_free_requests(gser->in, &port->write_pool, NULL); in gserial_disconnect()
1286 port->read_allocated = port->read_started = in gserial_disconnect()
1287 port->write_allocated = port->write_started = 0; in gserial_disconnect()
1289 spin_unlock_irqrestore(&port->port_lock, flags); in gserial_disconnect()