From 898d0edbf47acebb54487a028e5847573ba432d6 Mon Sep 17 00:00:00 2001 From: oxygene Date: Wed, 6 Jan 2010 19:09:40 +0000 Subject: - replace the hand written serial input flush routine with the termios one. - serialport_discard_read isn't necessary anymore - it just wrapped sp_flush_incoming with no extra value. - serialport_read and serialport_write would misbehave if read or write didn't process everything in one go. - sp_flush_incoming should be #define'd out for FAKE_COMMUNICATION like serialport_discard_read was Signed-off-by: Patrick Georgi Acked-by: Sean Nelson git-svn-id: https://code.coreboot.org/svn/flashrom/trunk@831 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1 --- serial.c | 38 +++++++++----------------------------- 1 file changed, 9 insertions(+), 29 deletions(-) (limited to 'serial.c') diff --git a/serial.c b/serial.c index be88166..754dff9 100644 --- a/serial.c +++ b/serial.c @@ -129,16 +129,7 @@ int sp_openserport(char *dev, unsigned int baud) void sp_flush_incoming(void) { - int i; - for (i=0;i<100;i++) { /* In case the device doesnt do EAGAIN, just read 0 */ - unsigned char flush[16]; - ssize_t rv; - rv = read(sp_fd, flush, sizeof(flush)); - if ((rv == -1) && (errno == EAGAIN)) - break; - if (rv == -1) - sp_die("flush read"); - } + tcflush(sp_fd, TCIFLUSH); return; } @@ -152,12 +143,14 @@ int serialport_write(unsigned char *buf, unsigned int writecnt) { int tmp = 0; - while (tmp != writecnt) { - tmp = write(sp_fd, buf + tmp, writecnt - tmp); + while (writecnt > 0) { + tmp = write(sp_fd, buf, writecnt); if (tmp == -1) return 1; if (!tmp) printf_debug("Empty write\n"); + writecnt -= tmp; + buf += tmp; } return 0; @@ -167,28 +160,15 @@ int serialport_read(unsigned char *buf, unsigned int readcnt) { int tmp = 0; - while (tmp != readcnt) { - tmp = read(sp_fd, buf + tmp, readcnt - tmp); + while (readcnt > 0) { + tmp = read(sp_fd, buf, readcnt); if (tmp == -1) return 1; if (!tmp) printf_debug("Empty read\n"); + readcnt -= tmp; + buf += tmp; } return 0; } - -int serialport_discard_read(void) -{ - int flags; - - printf_debug("%s\n", __func__); - flags = fcntl(sp_fd, F_GETFL); - flags |= O_NONBLOCK; - fcntl(sp_fd, F_SETFL, flags); - sp_flush_incoming(); - flags &= ~O_NONBLOCK; - fcntl(sp_fd, F_SETFL, flags); - - return 0; -} -- cgit v1.2.1