Index: flashrom-buspirate_resilient_init/buspirate_spi.c
===================================================================
--- flashrom-buspirate_resilient_init/buspirate_spi.c	(Revision 1099)
+++ flashrom-buspirate_resilient_init/buspirate_spi.c	(Arbeitskopie)
@@ -22,6 +22,7 @@
 #include <string.h>
 #include <stdlib.h>
 #include <ctype.h>
+#include <unistd.h>
 #include "flash.h"
 #include "chipdrivers.h"
 #include "spi.h"
@@ -140,6 +141,20 @@
 		/* Read any response and discard it. */
 		sp_flush_incoming();
 	}
+	/* USB is slow. The Bus Pirate is even slower. Apparently the flush
+	 * action above is too fast or too early. Some stuff still remains in
+	 * the pipe after the flush above, and one additional flush is not
+	 * sufficient either. Use a 1.5 ms delay inside the loop to make
+	 * mostly sure that at least one USB frame had time to arrive.
+	 * Looping only 5 times is not sufficient and causes the
+	 * ocassional failure.
+	 * Folding the delay into the loop above is not reliable either.
+	 */
+	for (i = 0; i < 10; i++) {
+		usleep(1500);
+		/* Read any response and discard it. */
+		sp_flush_incoming();
+	}
 	/* Enter raw bitbang mode */
 	buf[0] = 0x00;
 	ret = buspirate_sendrecv(buf, 1, 5);
@@ -147,6 +162,8 @@
 		return ret;
 	if (memcmp(buf, "BBIO", 4)) {
 		msg_perr("Entering raw bitbang mode failed!\n");
+		msg_pdbg("Got %02x%02x%02x%02x%02x\n",
+			 buf[0], buf[1], buf[2], buf[3], buf[4]);
 		return 1;
 	}
 	msg_pdbg("Raw bitbang mode version %c\n", buf[4]);
@@ -158,8 +175,12 @@
 	/* Enter raw SPI mode */
 	buf[0] = 0x01;
 	ret = buspirate_sendrecv(buf, 1, 4);
+	if (ret)
+		return ret;
 	if (memcmp(buf, "SPI", 3)) {
 		msg_perr("Entering raw SPI mode failed!\n");
+		msg_pdbg("Got %02x%02x%02x%02x\n",
+			 buf[0], buf[1], buf[2], buf[3]);
 		return 1;
 	}
 	msg_pdbg("Raw SPI mode version %c\n", buf[3]);
Index: flashrom-buspirate_resilient_init/serial.c
===================================================================
--- flashrom-buspirate_resilient_init/serial.c	(Revision 1099)
+++ flashrom-buspirate_resilient_init/serial.c	(Arbeitskopie)
@@ -199,8 +199,10 @@
 #else
 		tmp = write(sp_fd, buf, writecnt);
 #endif
-		if (tmp == -1)
+		if (tmp == -1) {
+			msg_perr("Serial port write error!\n");
 			return 1;
+		}
 		if (!tmp)
 			msg_pdbg("Empty write\n");
 		writecnt -= tmp; 
@@ -220,8 +222,10 @@
 #else
 		tmp = read(sp_fd, buf, readcnt);
 #endif
-		if (tmp == -1)
+		if (tmp == -1) {
+			msg_perr("Serial port read error!\n");
 			return 1;
+		}
 		if (!tmp)
 			msg_pdbg("Empty read\n");
 		readcnt -= tmp;

