Skip site navigation (1)Skip section navigation (2)
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>