Date: Thu, 20 Aug 2020 17:11:42 -0700 From: Shrikanth Kamath <shrikanth07@gmail.com> To: freebsd-hackers@freebsd.org Subject: Implementing 'tcflush()' support for ns8250 UART driver Message-ID: <CAEOAkMUD%2BzBesiz8y24TRJDoX%2BnWM0NfukNUy4-QcSSgz_njiQ@mail.gmail.com>
next in thread | raw e-mail | index | archive | help
--000000000000995abc05ad5815a1 Content-Type: text/plain; charset="UTF-8" A user has a need to flush UART FIFO buffers to get out of a framing error reported by the register REG_LSR and attempted to do a tcflush assuming it would ioctl 'TIOCFLUSH' command to the UART but ns8250 does not seem to have the support or is there another alternative? Below was the submitted change from the user, wanted to clarify with the experts on this (image based on stable/11 and hardware is a Juniper MX x86/64 custom routing engine control board) diff --git a/sys/dev/uart/uart_bus.h b/sys/dev/uart/uart_bus.h index a4bcf3d..5697c66 100644 --- a/sys/dev/uart/uart_bus.h +++ b/sys/dev/uart/uart_bus.h @@ -57,6 +57,7 @@ #define UART_IOCTL_IFLOW 2 #define UART_IOCTL_OFLOW 3 #define UART_IOCTL_BAUD 4 +#define UART_IOCTL_FLUSH 5 /* * UART class & instance (=softc) diff --git a/sys/dev/uart/uart_dev_ns8250.c b/sys/dev/uart/uart_dev_ns8250.c index 7dd331e..492f902 100755 --- a/sys/dev/uart/uart_dev_ns8250.c +++ b/sys/dev/uart/uart_dev_ns8250.c @@ -36,6 +36,7 @@ #include <sys/conf.h> #include <sys/kernel.h> #include <sys/sysctl.h> +#include <sys/fcntl.h> #include <machine/bus.h> #ifdef FDT @@ -608,6 +609,7 @@ struct uart_bas *bas; int baudrate, divisor, error; uint8_t efr, lcr; + int which = 0; bas = &sc->sc_bas; error = 0; @@ -667,6 +669,14 @@ else error = ENXIO; break; + case UART_IOCTL_FLUSH: + if (data & FREAD) + which |= UART_FLUSH_RECEIVER; + if (data & FWRITE) + which |= UART_FLUSH_TRANSMITTER; + + ns8250_flush(bas, which); + break; default: error = EINVAL; break; diff --git a/sys/dev/uart/uart_tty.c b/sys/dev/uart/uart_tty.c index e9b2baf..452a34c 100644 --- a/sys/dev/uart/uart_tty.c +++ b/sys/dev/uart/uart_tty.c @@ -312,6 +312,8 @@ *(uint32_t*)data = sc->sc_clk_mode; mtx_unlock(&sc->sc_clk_mutex); return 0; + case TIOCFLUSH: + return UART_IOCTL(sc, UART_IOCTL_FLUSH, *(int *)data); default: return pps_ioctl(cmd, data, &sc->sc_pps); } -- Shrikanth R K --000000000000995abc05ad5815a1 Content-Type: application/octet-stream; name="012f4a2.diff" Content-Disposition: attachment; filename="012f4a2.diff" Content-Transfer-Encoding: base64 Content-ID: <f_ke3gki7d0> X-Attachment-Id: f_ke3gki7d0 ZGlmZiAtLWdpdCBhL3N5cy9kZXYvdWFydC91YXJ0X2J1cy5oIGIvc3lzL2Rldi91YXJ0L3VhcnRf YnVzLmgKaW5kZXggYTRiY2YzZC4uNTY5N2M2NiAxMDA2NDQKLS0tIGEvc3lzL2Rldi91YXJ0L3Vh cnRfYnVzLmgKKysrIGIvc3lzL2Rldi91YXJ0L3VhcnRfYnVzLmgKQEAgLTU3LDYgKzU3LDcgQEAK ICNkZWZpbmUJVUFSVF9JT0NUTF9JRkxPVwkyCiAjZGVmaW5lCVVBUlRfSU9DVExfT0ZMT1cJMwog I2RlZmluZQlVQVJUX0lPQ1RMX0JBVUQJCTQKKyNkZWZpbmUJVUFSVF9JT0NUTF9GTFVTSAk1CiAK IC8qCiAgKiBVQVJUIGNsYXNzICYgaW5zdGFuY2UgKD1zb2Z0YykKZGlmZiAtLWdpdCBhL3N5cy9k ZXYvdWFydC91YXJ0X2Rldl9uczgyNTAuYyBiL3N5cy9kZXYvdWFydC91YXJ0X2Rldl9uczgyNTAu YwppbmRleCA3ZGQzMzFlLi40OTJmOTAyIDEwMDc1NQotLS0gYS9zeXMvZGV2L3VhcnQvdWFydF9k ZXZfbnM4MjUwLmMKKysrIGIvc3lzL2Rldi91YXJ0L3VhcnRfZGV2X25zODI1MC5jCkBAIC0zNiw2 ICszNiw3IEBACiAjaW5jbHVkZSA8c3lzL2NvbmYuaD4KICNpbmNsdWRlIDxzeXMva2VybmVsLmg+ CiAjaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgorI2luY2x1ZGUgPHN5cy9mY250bC5oPgogI2luY2x1 ZGUgPG1hY2hpbmUvYnVzLmg+CiAKICNpZmRlZiBGRFQKQEAgLTYwOCw2ICs2MDksNyBAQAogCXN0 cnVjdCB1YXJ0X2JhcyAqYmFzOwogCWludCBiYXVkcmF0ZSwgZGl2aXNvciwgZXJyb3I7CiAJdWlu dDhfdCBlZnIsIGxjcjsKKwlpbnQgd2hpY2ggPSAwOwogCiAJYmFzID0gJnNjLT5zY19iYXM7CiAJ ZXJyb3IgPSAwOwpAQCAtNjY3LDYgKzY2OSwxNCBAQAogCQllbHNlCiAJCQllcnJvciA9IEVOWElP OwogCQlicmVhazsKKyAgICAgICAgY2FzZSBVQVJUX0lPQ1RMX0ZMVVNIOgorCQlpZiAoZGF0YSAm IEZSRUFEKQorCQkJd2hpY2ggfD0gVUFSVF9GTFVTSF9SRUNFSVZFUjsKKwkJaWYgKGRhdGEgJiBG V1JJVEUpCisJCQl3aGljaCB8PSBVQVJUX0ZMVVNIX1RSQU5TTUlUVEVSOworCisJCW5zODI1MF9m bHVzaChiYXMsIHdoaWNoKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZXJyb3IgPSBFSU5WQUw7 CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvc3lzL2Rldi91YXJ0L3VhcnRfdHR5LmMgYi9zeXMvZGV2 L3VhcnQvdWFydF90dHkuYwppbmRleCBlOWIyYmFmLi40NTJhMzRjIDEwMDY0NAotLS0gYS9zeXMv ZGV2L3VhcnQvdWFydF90dHkuYworKysgYi9zeXMvZGV2L3VhcnQvdWFydF90dHkuYwpAQCAtMzEy LDYgKzMxMiw4IEBACiAJCSoodWludDMyX3QqKWRhdGEgPSBzYy0+c2NfY2xrX21vZGU7CiAJCW10 eF91bmxvY2soJnNjLT5zY19jbGtfbXV0ZXgpOwogCQlyZXR1cm4gMDsKKwljYXNlIFRJT0NGTFVT SDoKKwkJcmV0dXJuIFVBUlRfSU9DVEwoc2MsIFVBUlRfSU9DVExfRkxVU0gsICooaW50ICopZGF0 YSk7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIHBwc19pb2N0bChjbWQsIGRhdGEsICZzYy0+c2NfcHBz KTsKIAl9Cg== --000000000000995abc05ad5815a1--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAEOAkMUD%2BzBesiz8y24TRJDoX%2BnWM0NfukNUy4-QcSSgz_njiQ>