diff options
author | Andrey Smirnov <andrew.smirnov@gmail.com> | 2018-04-12 14:33:13 -0700 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2018-04-17 09:21:07 +0200 |
commit | 84fc6119d3aaa33344d154428ce37800a96a39b9 (patch) | |
tree | db1ac8850baf99e9ef022e28deefe832deafd98b /lib | |
parent | 6377d27b951bfddc67bba16e83f79ae1d9fa8eb9 (diff) | |
download | barebox-84fc6119d3aaa33344d154428ce37800a96a39b9.tar.gz barebox-84fc6119d3aaa33344d154428ce37800a96a39b9.tar.xz |
console: Introduce console_drain()
Generalize high baud rate UART polling code found in lib/xmodem.c and
expose it as a generic function in console API.
The usecase for this -- besides X/Y-mode data transfers where the code
originated -- is command/reply type of serial exchages at high baud
rates (~1Mbaud) with payloads exceeding inernal UART FIFOs in
size. Such interactions are not uncommon in serdev device and this
patch is done in preparation for serdev support code that will follow.
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/xymodem.c | 30 |
1 files changed, 5 insertions, 25 deletions
diff --git a/lib/xymodem.c b/lib/xymodem.c index 37202e6ae2..9e4ce58b60 100644 --- a/lib/xymodem.c +++ b/lib/xymodem.c @@ -144,36 +144,16 @@ static const char block_nack[MAX_PROTOS][MAX_CRCS] = { { 0, 0, 0 }, /* YMODEM-G */ }; -static int input_fifo_fill(struct console_device *cdev, struct kfifo *fifo) -{ - while (cdev->tstc(cdev) && kfifo_len(fifo) < INPUT_FIFO_SIZE) - kfifo_putc(fifo, (unsigned char)(cdev->getc(cdev))); - return kfifo_len(fifo); -} - -/* - * This function is optimized to : - * - maximize throughput (ie. read as much as is available in lower layer fifo) - * - minimize latencies (no delay or wait timeout if data available) - * - have a timeout - * This is why standard getc() is not used, and input_fifo_fill() exists. - */ static int xy_gets(struct console_device *cdev, struct kfifo *fifo, unsigned char *buf, int len, uint64_t timeout) { - int i, rc; - uint64_t start = get_time_ns(); + int rc; - for (i = 0, rc = 0; rc >= 0 && i < len; ) { - if (is_timeout(start, timeout)) { - rc = -ETIMEDOUT; - continue; - } - if (input_fifo_fill(cdev, fifo)) - kfifo_getc(fifo, &buf[i++]); - } + rc = console_drain(cdev, fifo, buf, len, timeout); + if (rc != len) + return -ETIMEDOUT; - return rc < 0 ? rc : i; + return len; } static void xy_putc(struct console_device *cdev, unsigned char c) |