[flashrom] [PATCH] Combine serialport_write and serialport_read into serialport_rw.
Stefan Tauner
stefan.tauner at student.tuwien.ac.at
Mon Apr 1 03:14:44 CEST 2013
Because they share almost all code, combine them into serialport_rw
and export the old functions as wrappers. This makes reads "empty reads"-
aware and programmers able to detect such problems even on "blocking"
reads.
Signed-off-by: Stefan Tauner <stefan.tauner at student.tuwien.ac.at>
---
serial.c | 72 ++++++++++++++++++++++++++++----------------------------------
1 file changed, 33 insertions(+), 39 deletions(-)
diff --git a/serial.c b/serial.c
index 49484f5..6679b7c 100644
--- a/serial.c
+++ b/serial.c
@@ -28,6 +28,7 @@
#include <sys/stat.h>
#include <errno.h>
#include <inttypes.h>
+#include <stdbool.h>
#ifdef _WIN32
#include <conio.h>
#else
@@ -328,68 +329,61 @@ int serialport_shutdown(void *data)
return 0;
}
-int serialport_write(unsigned char *buf, unsigned int writecnt)
+/* Writes (if \c outdir is true) or reads \c todo bytes from/into \c buf.
+ * Tries up to 10 times with a timeout of \c ms ms between each try. */
+static int serialport_rw(unsigned char *buf, unsigned int todo, bool outdir, unsigned int ms)
{
+ const char * const op = outdir ? "write" : "read";
#ifdef _WIN32
- DWORD tmp = 0;
+ DWORD cur = 0;
#else
- ssize_t tmp = 0;
+ ssize_t cur = 0;
#endif
- unsigned int empty_writes = 250; /* results in a ca. 125ms timeout */
+ unsigned int empty_tries = 10;
- while (writecnt > 0) {
+ while (todo > 0) {
#ifdef _WIN32
- WriteFile(sp_fd, buf, writecnt, &tmp, NULL);
+ if (outdir)
+ WriteFile(sp_fd, buf, todo, &cur, NULL);
+ else
+ ReadFile(sp_fd, buf, todo, &cur, NULL);
#else
- tmp = write(sp_fd, buf, writecnt);
+ if (outdir)
+ cur = write(sp_fd, buf, todo);
+ else
+ cur = read(sp_fd, buf, todo);
#endif
- if (tmp == -1) {
- msg_perr("Serial port write error!\n");
+ if (cur == -1) {
+ msg_perr("Serial port %s error!\n", op);
return 1;
}
- if (!tmp) {
- msg_pdbg2("Empty write\n");
- empty_writes--;
- programmer_delay(500);
- if (empty_writes == 0) {
+ if (cur == 0) {
+ msg_pdbg2("Empty %s.\n", op);
+ empty_tries--;
+ programmer_delay(ms * 1000);
+ if (empty_tries == 0) {
msg_perr("Serial port is unresponsive!\n");
return 1;
}
}
- writecnt -= tmp;
- buf += tmp;
+ todo -= cur;
+ buf += cur;
}
return 0;
}
-int serialport_read(unsigned char *buf, unsigned int readcnt)
+int serialport_write(unsigned char *buf, unsigned int writecnt)
{
-#ifdef _WIN32
- DWORD tmp = 0;
-#else
- ssize_t tmp = 0;
-#endif
-
- while (readcnt > 0) {
-#ifdef _WIN32
- ReadFile(sp_fd, buf, readcnt, &tmp, NULL);
-#else
- tmp = read(sp_fd, buf, readcnt);
-#endif
- if (tmp == -1) {
- msg_perr("Serial port read error!\n");
- return 1;
- }
- if (!tmp)
- msg_pdbg2("Empty read\n");
- readcnt -= tmp;
- buf += tmp;
- }
+ return serialport_rw(buf, writecnt, true, 1);
+}
- return 0;
+int serialport_read(unsigned char *buf, unsigned int readcnt)
+{
+ return serialport_rw(buf, readcnt, false, 10);
}
+
/* Tries up to timeout ms to read readcnt characters and places them into the array starting at c. Returns
* 0 on success, positive values on temporary errors (e.g. timeouts) and negative ones on permanent errors.
* If really_read is not NULL, this function sets its contents to the number of bytes read successfully. */
--
Kind regards, Stefan Tauner
More information about the flashrom
mailing list