Lines Matching +full:fifo +full:- +full:size

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
64 struct fifo { struct
68 int num; /* number of characters in the fifo */ argument
69 int size; /* size of the fifo */ argument
74 struct fifo rxfifo;
101 tcgetattr(tf->rfd, &orig); in ttyopen()
105 tcsetattr(tf->rfd, TCSANOW, &new); in ttyopen()
119 len = read(tf->rfd, &rb, 1); in ttyread()
129 return (write(tf->wfd, &wb, 1)); in ttywrite()
135 return (sc->rxfifo.num < sc->rxfifo.size); in rxfifo_available()
141 struct fifo *fifo; in uart_rxfifo_getchar() local
145 fifo = &sc->rxfifo; in uart_rxfifo_getchar()
146 if (fifo->num > 0) { in uart_rxfifo_getchar()
149 c = fifo->buf[fifo->rindex]; in uart_rxfifo_getchar()
150 fifo->rindex = (fifo->rindex + 1) % fifo->size; in uart_rxfifo_getchar()
151 fifo->num--; in uart_rxfifo_getchar()
153 if (sc->tty.opened) { in uart_rxfifo_getchar()
154 error = mevent_enable(sc->mev); in uart_rxfifo_getchar()
160 return (-1); in uart_rxfifo_getchar()
166 return (sc->rxfifo.num); in uart_rxfifo_numchars()
172 struct fifo *fifo; in rxfifo_putchar() local
175 fifo = &sc->rxfifo; in rxfifo_putchar()
177 if (fifo->num < fifo->size) { in rxfifo_putchar()
178 fifo->buf[fifo->windex] = ch; in rxfifo_putchar()
179 fifo->windex = (fifo->windex + 1) % fifo->size; in rxfifo_putchar()
180 fifo->num++; in rxfifo_putchar()
182 if (sc->tty.opened) { in rxfifo_putchar()
184 * Disable mevent callback if the FIFO is full. in rxfifo_putchar()
186 error = mevent_disable(sc->mev); in rxfifo_putchar()
192 return (-1); in rxfifo_putchar()
202 if (ttyread(&sc->tty, &ch) == 0 && sc->tty.is_socket) in uart_rxfifo_drain()
206 len = ttyread(&sc->tty, &ch); in uart_rxfifo_drain()
209 if (len == 0 && sc->tty.is_socket) in uart_rxfifo_drain()
224 } else if (sc->tty.opened) { in uart_rxfifo_putchar()
225 /* write returning -1 means disconnected. */ in uart_rxfifo_putchar()
226 if (ttywrite(&sc->tty, ch) == -1 && sc->tty.is_socket) in uart_rxfifo_putchar()
236 uart_rxfifo_reset(struct uart_softc *sc, int size) in uart_rxfifo_reset() argument
239 struct fifo *fifo; in uart_rxfifo_reset() local
243 fifo = &sc->rxfifo; in uart_rxfifo_reset()
244 bzero(fifo, sizeof(struct fifo)); in uart_rxfifo_reset()
245 fifo->size = size; in uart_rxfifo_reset()
247 if (sc->tty.opened) { in uart_rxfifo_reset()
252 nread = read(sc->tty.rfd, flushbuf, sizeof(flushbuf)); in uart_rxfifo_reset()
261 error = mevent_enable(sc->mev); in uart_rxfifo_reset()
278 SNAPSHOT_VAR_OR_LEAVE(sc->rxfifo.rindex, meta, ret, done); in uart_rxfifo_snapshot()
279 SNAPSHOT_VAR_OR_LEAVE(sc->rxfifo.windex, meta, ret, done); in uart_rxfifo_snapshot()
280 SNAPSHOT_VAR_OR_LEAVE(sc->rxfifo.num, meta, ret, done); in uart_rxfifo_snapshot()
281 SNAPSHOT_VAR_OR_LEAVE(sc->rxfifo.size, meta, ret, done); in uart_rxfifo_snapshot()
282 SNAPSHOT_BUF_OR_LEAVE(sc->rxfifo.buf, sizeof(sc->rxfifo.buf), in uart_rxfifo_snapshot()
299 struct uart_softc *sc = socket_softc->softc; in uart_tcp_listener()
303 if (conn_fd == -1) in uart_tcp_listener()
309 pthread_mutex_lock(&sc->mtx); in uart_tcp_listener()
311 if (sc->tty.opened) { in uart_tcp_listener()
313 pthread_mutex_unlock(&sc->mtx); in uart_tcp_listener()
316 sc->tty.rfd = sc->tty.wfd = conn_fd; in uart_tcp_listener()
317 sc->tty.opened = true; in uart_tcp_listener()
318 sc->mev = mevent_add(sc->tty.rfd, EVF_READ, socket_softc->drain, in uart_tcp_listener()
319 socket_softc->arg); in uart_tcp_listener()
322 pthread_mutex_unlock(&sc->mtx); in uart_tcp_listener()
326 if (conn_fd != -1) in uart_tcp_listener()
331 * When a connection-oriented protocol disconnects, this handler is used to
340 mevent_delete_close(sc->mev); in uart_tcp_disconnect()
341 sc->mev = NULL; in uart_tcp_disconnect()
342 sc->tty.opened = false; in uart_tcp_disconnect()
343 sc->tty.rfd = sc->tty.wfd = -1; in uart_tcp_disconnect()
355 return (-1); in uart_stdio_backend()
357 sc->tty.rfd = STDIN_FILENO; in uart_stdio_backend()
358 sc->tty.wfd = STDOUT_FILENO; in uart_stdio_backend()
359 sc->tty.opened = true; in uart_stdio_backend()
361 if (fcntl(sc->tty.rfd, F_SETFL, O_NONBLOCK) != 0) in uart_stdio_backend()
362 return (-1); in uart_stdio_backend()
363 if (fcntl(sc->tty.wfd, F_SETFL, O_NONBLOCK) != 0) in uart_stdio_backend()
364 return (-1); in uart_stdio_backend()
368 if (caph_rights_limit(sc->tty.rfd, &rights) == -1) in uart_stdio_backend()
370 if (caph_ioctls_limit(sc->tty.rfd, cmds, nitems(cmds)) == -1) in uart_stdio_backend()
390 return (-1); in uart_tty_backend()
394 return (-1); in uart_tty_backend()
397 sc->tty.rfd = sc->tty.wfd = fd; in uart_tty_backend()
398 sc->tty.opened = true; in uart_tty_backend()
402 if (caph_rights_limit(fd, &rights) == -1) in uart_tty_backend()
404 if (caph_ioctls_limit(fd, cmds, nitems(cmds)) == -1) in uart_tty_backend()
425 int bind_fd = -1; in uart_tcp_backend()
454 if (bind(bind_fd, src_addr->ai_addr, src_addr->ai_addrlen) == -1) { in uart_tcp_backend()
464 if (fcntl(bind_fd, F_SETFL, O_NONBLOCK) == -1) in uart_tcp_backend()
467 if (listen(bind_fd, 1) == -1) { in uart_tcp_backend()
480 sc->tty.is_socket = true; in uart_tcp_backend()
482 socket_softc->softc = sc; in uart_tcp_backend()
483 socket_softc->drain = drain; in uart_tcp_backend()
484 socket_softc->arg = arg; in uart_tcp_backend()
489 if (caph_rights_limit(bind_fd, &rights) == -1) in uart_tcp_backend()
491 if (caph_ioctls_limit(bind_fd, cmds, nitems(cmds)) == -1) in uart_tcp_backend()
493 if (caph_fcntls_limit(bind_fd, CAP_FCNTL_SETFL) == -1) in uart_tcp_backend()
497 if ((sc->mev = mevent_add(bind_fd, EVF_READ, uart_tcp_listener, in uart_tcp_backend()
504 if (bind_fd != -1) in uart_tcp_backend()
510 return (-1); in uart_tcp_backend()
520 pthread_mutex_init(&sc->mtx, NULL); in uart_init()
539 * A connection-oriented protocol should wait for a connection, in uart_tty_open()
542 if (retval == 0 && !sc->tty.is_socket) { in uart_tty_open()
543 ttyopen(&sc->tty); in uart_tty_open()
544 sc->mev = mevent_add(sc->tty.rfd, EVF_READ, drain, arg); in uart_tty_open()
545 assert(sc->mev != NULL); in uart_tty_open()
554 pthread_mutex_lock(&sc->mtx); in uart_softc_lock()
560 pthread_mutex_unlock(&sc->mtx); in uart_softc_unlock()