Lines Matching refs:port
99 struct tty_port port; member
132 struct gs_port *port; member
203 gs_send_packet(struct gs_port *port, char *packet, unsigned size) in gs_send_packet() argument
207 len = kfifo_len(&port->port_write_buf); in gs_send_packet()
211 size = kfifo_out(&port->port_write_buf, packet, size); in gs_send_packet()
226 static int gs_start_tx(struct gs_port *port) in gs_start_tx() argument
232 struct list_head *pool = &port->write_pool; in gs_start_tx()
237 if (!port->port_usb) in gs_start_tx()
240 in = port->port_usb->in; in gs_start_tx()
242 while (!port->write_busy && !list_empty(pool)) { in gs_start_tx()
246 if (port->write_started >= QUEUE_SIZE) in gs_start_tx()
250 len = gs_send_packet(port, req->buf, in->maxpacket); in gs_start_tx()
252 wake_up_interruptible(&port->drain_wait); in gs_start_tx()
259 req->zero = kfifo_is_empty(&port->port_write_buf); in gs_start_tx()
262 port->port_num, len, *((u8 *)req->buf), in gs_start_tx()
272 port->write_busy = true; in gs_start_tx()
273 spin_unlock(&port->port_lock); in gs_start_tx()
275 spin_lock(&port->port_lock); in gs_start_tx()
276 port->write_busy = false; in gs_start_tx()
285 port->write_started++; in gs_start_tx()
288 if (!port->port_usb) in gs_start_tx()
292 if (do_tty_wake && port->port.tty) in gs_start_tx()
293 tty_wakeup(port->port.tty); in gs_start_tx()
300 static unsigned gs_start_rx(struct gs_port *port) in gs_start_rx() argument
306 struct list_head *pool = &port->read_pool; in gs_start_rx()
307 struct usb_ep *out = port->port_usb->out; in gs_start_rx()
315 tty = port->port.tty; in gs_start_rx()
319 if (port->read_started >= QUEUE_SIZE) in gs_start_rx()
329 spin_unlock(&port->port_lock); in gs_start_rx()
331 spin_lock(&port->port_lock); in gs_start_rx()
339 port->read_started++; in gs_start_rx()
342 if (!port->port_usb) in gs_start_rx()
345 return port->read_started; in gs_start_rx()
361 struct gs_port *port = container_of(w, struct gs_port, push); in gs_rx_push() local
363 struct list_head *queue = &port->read_queue; in gs_rx_push()
368 spin_lock_irq(&port->port_lock); in gs_rx_push()
369 tty = port->port.tty; in gs_rx_push()
382 pr_vdebug("ttyGS%d: shutdown\n", port->port_num); in gs_rx_push()
388 port->port_num, req->status); in gs_rx_push()
403 n = port->n_read; in gs_rx_push()
409 count = tty_insert_flip_string(&port->port, packet, in gs_rx_push()
415 port->n_read += count; in gs_rx_push()
417 port->port_num, count, req->actual); in gs_rx_push()
420 port->n_read = 0; in gs_rx_push()
423 list_move(&req->list, &port->read_pool); in gs_rx_push()
424 port->read_started--; in gs_rx_push()
431 tty_flip_buffer_push(&port->port); in gs_rx_push()
442 schedule_delayed_work(&port->push, 1); in gs_rx_push()
445 if (!disconnect && port->port_usb) in gs_rx_push()
446 gs_start_rx(port); in gs_rx_push()
448 spin_unlock_irq(&port->port_lock); in gs_rx_push()
453 struct gs_port *port = ep->driver_data; in gs_read_complete() local
456 spin_lock(&port->port_lock); in gs_read_complete()
457 list_add_tail(&req->list, &port->read_queue); in gs_read_complete()
458 schedule_delayed_work(&port->push, 0); in gs_read_complete()
459 spin_unlock(&port->port_lock); in gs_read_complete()
464 struct gs_port *port = ep->driver_data; in gs_write_complete() local
466 spin_lock(&port->port_lock); in gs_write_complete()
467 list_add(&req->list, &port->write_pool); in gs_write_complete()
468 port->write_started--; in gs_write_complete()
478 gs_start_tx(port); in gs_write_complete()
487 spin_unlock(&port->port_lock); in gs_write_complete()
537 static int gs_start_io(struct gs_port *port) in gs_start_io() argument
539 struct list_head *head = &port->read_pool; in gs_start_io()
540 struct usb_ep *ep = port->port_usb->out; in gs_start_io()
551 &port->read_allocated); in gs_start_io()
555 status = gs_alloc_requests(port->port_usb->in, &port->write_pool, in gs_start_io()
556 gs_write_complete, &port->write_allocated); in gs_start_io()
558 gs_free_requests(ep, head, &port->read_allocated); in gs_start_io()
563 port->n_read = 0; in gs_start_io()
564 started = gs_start_rx(port); in gs_start_io()
567 gs_start_tx(port); in gs_start_io()
570 tty_wakeup(port->port.tty); in gs_start_io()
572 gs_free_requests(ep, head, &port->read_allocated); in gs_start_io()
573 gs_free_requests(port->port_usb->in, &port->write_pool, in gs_start_io()
574 &port->write_allocated); in gs_start_io()
593 struct gs_port *port; in gs_open() local
597 port = ports[port_num].port; in gs_open()
598 if (!port) { in gs_open()
603 spin_lock_irq(&port->port_lock); in gs_open()
606 if (!kfifo_initialized(&port->port_write_buf)) { in gs_open()
608 spin_unlock_irq(&port->port_lock); in gs_open()
615 status = kfifo_alloc(&port->port_write_buf, in gs_open()
623 spin_lock_irq(&port->port_lock); in gs_open()
627 if (port->port.count++) in gs_open()
630 tty->driver_data = port; in gs_open()
631 port->port.tty = tty; in gs_open()
634 if (port->port_usb) { in gs_open()
636 if (!port->suspended) { in gs_open()
637 struct gserial *gser = port->port_usb; in gs_open()
639 pr_debug("gs_open: start ttyGS%d\n", port->port_num); in gs_open()
640 gs_start_io(port); in gs_open()
645 pr_debug("delay start of ttyGS%d\n", port->port_num); in gs_open()
646 port->start_delayed = true; in gs_open()
650 pr_debug("gs_open: ttyGS%d (%p,%p)\n", port->port_num, tty, file); in gs_open()
653 spin_unlock_irq(&port->port_lock); in gs_open()
666 p->port.count > 1; in gs_close_flush_done()
674 struct gs_port *port = tty->driver_data; in gs_close() local
677 spin_lock_irq(&port->port_lock); in gs_close()
679 if (port->port.count != 1) { in gs_close()
681 if (port->port.count == 0) in gs_close()
684 --port->port.count; in gs_close()
688 pr_debug("gs_close: ttyGS%d (%p,%p) ...\n", port->port_num, tty, file); in gs_close()
690 gser = port->port_usb; in gs_close()
691 if (gser && !port->suspended && gser->disconnect) in gs_close()
697 if (kfifo_len(&port->port_write_buf) > 0 && gser) { in gs_close()
698 spin_unlock_irq(&port->port_lock); in gs_close()
699 wait_event_interruptible_timeout(port->drain_wait, in gs_close()
700 gs_close_flush_done(port), in gs_close()
702 spin_lock_irq(&port->port_lock); in gs_close()
704 if (port->port.count != 1) in gs_close()
707 gser = port->port_usb; in gs_close()
715 kfifo_free(&port->port_write_buf); in gs_close()
717 kfifo_reset(&port->port_write_buf); in gs_close()
719 port->start_delayed = false; in gs_close()
720 port->port.count = 0; in gs_close()
721 port->port.tty = NULL; in gs_close()
724 port->port_num, tty, file); in gs_close()
726 wake_up(&port->close_wait); in gs_close()
728 spin_unlock_irq(&port->port_lock); in gs_close()
733 struct gs_port *port = tty->driver_data; in gs_write() local
737 port->port_num, tty, count); in gs_write()
739 spin_lock_irqsave(&port->port_lock, flags); in gs_write()
741 count = kfifo_in(&port->port_write_buf, buf, count); in gs_write()
743 if (port->port_usb) in gs_write()
744 gs_start_tx(port); in gs_write()
745 spin_unlock_irqrestore(&port->port_lock, flags); in gs_write()
752 struct gs_port *port = tty->driver_data; in gs_put_char() local
757 port->port_num, tty, ch, __builtin_return_address(0)); in gs_put_char()
759 spin_lock_irqsave(&port->port_lock, flags); in gs_put_char()
760 status = kfifo_put(&port->port_write_buf, ch); in gs_put_char()
761 spin_unlock_irqrestore(&port->port_lock, flags); in gs_put_char()
768 struct gs_port *port = tty->driver_data; in gs_flush_chars() local
771 pr_vdebug("gs_flush_chars: (%d,%p)\n", port->port_num, tty); in gs_flush_chars()
773 spin_lock_irqsave(&port->port_lock, flags); in gs_flush_chars()
774 if (port->port_usb) in gs_flush_chars()
775 gs_start_tx(port); in gs_flush_chars()
776 spin_unlock_irqrestore(&port->port_lock, flags); in gs_flush_chars()
781 struct gs_port *port = tty->driver_data; in gs_write_room() local
785 spin_lock_irqsave(&port->port_lock, flags); in gs_write_room()
786 if (port->port_usb) in gs_write_room()
787 room = kfifo_avail(&port->port_write_buf); in gs_write_room()
788 spin_unlock_irqrestore(&port->port_lock, flags); in gs_write_room()
791 port->port_num, tty, room); in gs_write_room()
798 struct gs_port *port = tty->driver_data; in gs_chars_in_buffer() local
802 spin_lock_irqsave(&port->port_lock, flags); in gs_chars_in_buffer()
803 chars = kfifo_len(&port->port_write_buf); in gs_chars_in_buffer()
804 spin_unlock_irqrestore(&port->port_lock, flags); in gs_chars_in_buffer()
807 port->port_num, tty, chars); in gs_chars_in_buffer()
815 struct gs_port *port = tty->driver_data; in gs_unthrottle() local
818 spin_lock_irqsave(&port->port_lock, flags); in gs_unthrottle()
819 if (port->port_usb) { in gs_unthrottle()
824 pr_vdebug("ttyGS%d: unthrottle\n", port->port_num); in gs_unthrottle()
825 schedule_delayed_work(&port->push, 0); in gs_unthrottle()
827 spin_unlock_irqrestore(&port->port_lock, flags); in gs_unthrottle()
832 struct gs_port *port = tty->driver_data; in gs_break_ctl() local
837 port->port_num, duration); in gs_break_ctl()
839 spin_lock_irq(&port->port_lock); in gs_break_ctl()
840 gser = port->port_usb; in gs_break_ctl()
843 spin_unlock_irq(&port->port_lock); in gs_break_ctl()
957 static int gs_console_connect(struct gs_port *port) in gs_console_connect() argument
959 struct gs_console *cons = port->console; in gs_console_connect()
966 ep = port->port_usb->in; in gs_console_connect()
979 pr_debug("ttyGS%d: console connected!\n", port->port_num); in gs_console_connect()
986 static void gs_console_disconnect(struct gs_port *port) in gs_console_disconnect() argument
988 struct gs_console *cons = port->console; in gs_console_disconnect()
1010 static int gs_console_init(struct gs_port *port) in gs_console_init() argument
1015 if (port->console) in gs_console_init()
1018 cons = kzalloc(sizeof(*port->console), GFP_KERNEL); in gs_console_init()
1026 cons->console.index = port->port_num; in gs_console_init()
1033 pr_err("ttyGS%d: allocate console buffer failed\n", port->port_num); in gs_console_init()
1038 port->console = cons; in gs_console_init()
1041 spin_lock_irq(&port->port_lock); in gs_console_init()
1042 if (port->port_usb) in gs_console_init()
1043 gs_console_connect(port); in gs_console_init()
1044 spin_unlock_irq(&port->port_lock); in gs_console_init()
1049 static void gs_console_exit(struct gs_port *port) in gs_console_exit() argument
1051 struct gs_console *cons = port->console; in gs_console_exit()
1058 spin_lock_irq(&port->port_lock); in gs_console_exit()
1060 gs_console_disconnect(port); in gs_console_exit()
1061 spin_unlock_irq(&port->port_lock); in gs_console_exit()
1066 port->console = NULL; in gs_console_exit()
1071 struct gs_port *port; in gserial_set_console() local
1080 port = ports[port_num].port; in gserial_set_console()
1082 if (WARN_ON(port == NULL)) { in gserial_set_console()
1088 ret = gs_console_init(port); in gserial_set_console()
1090 gs_console_exit(port); in gserial_set_console()
1100 struct gs_port *port; in gserial_get_console() local
1104 port = ports[port_num].port; in gserial_get_console()
1106 if (WARN_ON(port == NULL)) in gserial_get_console()
1109 ret = sprintf(page, "%u\n", !!port->console); in gserial_get_console()
1119 static int gs_console_connect(struct gs_port *port) in gs_console_connect() argument
1124 static void gs_console_disconnect(struct gs_port *port) in gs_console_disconnect() argument
1128 static int gs_console_init(struct gs_port *port) in gs_console_init() argument
1133 static void gs_console_exit(struct gs_port *port) in gs_console_exit() argument
1142 struct gs_port *port; in gs_port_alloc() local
1146 if (ports[port_num].port) { in gs_port_alloc()
1151 port = kzalloc(sizeof(struct gs_port), GFP_KERNEL); in gs_port_alloc()
1152 if (port == NULL) { in gs_port_alloc()
1157 tty_port_init(&port->port); in gs_port_alloc()
1158 spin_lock_init(&port->port_lock); in gs_port_alloc()
1159 init_waitqueue_head(&port->drain_wait); in gs_port_alloc()
1160 init_waitqueue_head(&port->close_wait); in gs_port_alloc()
1162 INIT_DELAYED_WORK(&port->push, gs_rx_push); in gs_port_alloc()
1164 INIT_LIST_HEAD(&port->read_pool); in gs_port_alloc()
1165 INIT_LIST_HEAD(&port->read_queue); in gs_port_alloc()
1166 INIT_LIST_HEAD(&port->write_pool); in gs_port_alloc()
1168 port->port_num = port_num; in gs_port_alloc()
1169 port->port_line_coding = *coding; in gs_port_alloc()
1171 ports[port_num].port = port; in gs_port_alloc()
1177 static int gs_closed(struct gs_port *port) in gs_closed() argument
1181 spin_lock_irq(&port->port_lock); in gs_closed()
1182 cond = port->port.count == 0; in gs_closed()
1183 spin_unlock_irq(&port->port_lock); in gs_closed()
1188 static void gserial_free_port(struct gs_port *port) in gserial_free_port() argument
1190 cancel_delayed_work_sync(&port->push); in gserial_free_port()
1192 wait_event(port->close_wait, gs_closed(port)); in gserial_free_port()
1193 WARN_ON(port->port_usb != NULL); in gserial_free_port()
1194 tty_port_destroy(&port->port); in gserial_free_port()
1195 kfree(port); in gserial_free_port()
1200 struct gs_port *port; in gserial_free_line() local
1203 if (WARN_ON(!ports[port_num].port)) { in gserial_free_line()
1207 port = ports[port_num].port; in gserial_free_line()
1208 gs_console_exit(port); in gserial_free_line()
1209 ports[port_num].port = NULL; in gserial_free_line()
1212 gserial_free_port(port); in gserial_free_line()
1220 struct gs_port *port; in gserial_alloc_line_no_console() local
1243 port = ports[port_num].port; in gserial_alloc_line_no_console()
1244 tty_dev = tty_port_register_device(&port->port, in gserial_alloc_line_no_console()
1252 ports[port_num].port = NULL; in gserial_alloc_line_no_console()
1254 gserial_free_port(port); in gserial_alloc_line_no_console()
1268 gs_console_init(ports[*line_num].port); in gserial_alloc_line()
1297 struct gs_port *port; in gserial_connect() local
1304 port = ports[port_num].port; in gserial_connect()
1305 if (!port) { in gserial_connect()
1309 if (port->port_usb) { in gserial_connect()
1318 gser->in->driver_data = port; in gserial_connect()
1323 gser->out->driver_data = port; in gserial_connect()
1326 spin_lock_irqsave(&port->port_lock, flags); in gserial_connect()
1327 gser->ioport = port; in gserial_connect()
1328 port->port_usb = gser; in gserial_connect()
1333 gser->port_line_coding = port->port_line_coding; in gserial_connect()
1340 if (port->port.count) { in gserial_connect()
1341 pr_debug("gserial_connect: start ttyGS%d\n", port->port_num); in gserial_connect()
1342 gs_start_io(port); in gserial_connect()
1350 status = gs_console_connect(port); in gserial_connect()
1351 spin_unlock_irqrestore(&port->port_lock, flags); in gserial_connect()
1373 struct gs_port *port = gser->ioport; in gserial_disconnect() local
1376 if (!port) in gserial_disconnect()
1380 spin_lock_irqsave(&port->port_lock, flags); in gserial_disconnect()
1382 gs_console_disconnect(port); in gserial_disconnect()
1385 port->port_line_coding = gser->port_line_coding; in gserial_disconnect()
1387 port->port_usb = NULL; in gserial_disconnect()
1389 if (port->port.count > 0) { in gserial_disconnect()
1390 wake_up_interruptible(&port->drain_wait); in gserial_disconnect()
1391 if (port->port.tty) in gserial_disconnect()
1392 tty_hangup(port->port.tty); in gserial_disconnect()
1394 port->suspended = false; in gserial_disconnect()
1395 spin_unlock_irqrestore(&port->port_lock, flags); in gserial_disconnect()
1402 spin_lock_irqsave(&port->port_lock, flags); in gserial_disconnect()
1403 if (port->port.count == 0) in gserial_disconnect()
1404 kfifo_free(&port->port_write_buf); in gserial_disconnect()
1405 gs_free_requests(gser->out, &port->read_pool, NULL); in gserial_disconnect()
1406 gs_free_requests(gser->out, &port->read_queue, NULL); in gserial_disconnect()
1407 gs_free_requests(gser->in, &port->write_pool, NULL); in gserial_disconnect()
1409 port->read_allocated = port->read_started = in gserial_disconnect()
1410 port->write_allocated = port->write_started = 0; in gserial_disconnect()
1412 spin_unlock_irqrestore(&port->port_lock, flags); in gserial_disconnect()
1418 struct gs_port *port = gser->ioport; in gserial_suspend() local
1421 spin_lock_irqsave(&port->port_lock, flags); in gserial_suspend()
1422 port->suspended = true; in gserial_suspend()
1423 spin_unlock_irqrestore(&port->port_lock, flags); in gserial_suspend()
1429 struct gs_port *port = gser->ioport; in gserial_resume() local
1432 spin_lock_irqsave(&port->port_lock, flags); in gserial_resume()
1433 port->suspended = false; in gserial_resume()
1434 if (!port->start_delayed) { in gserial_resume()
1435 spin_unlock_irqrestore(&port->port_lock, flags); in gserial_resume()
1439 pr_debug("delayed start ttyGS%d\n", port->port_num); in gserial_resume()
1440 gs_start_io(port); in gserial_resume()
1443 port->start_delayed = false; in gserial_resume()
1444 spin_unlock_irqrestore(&port->port_lock, flags); in gserial_resume()