[flashrom] [PATCH] serprog: stream SPI operations (speed improvement)

Urja Rannikko urjaman at gmail.com
Mon Oct 14 16:25:36 CEST 2013


this means less RTT waiting when you dont need to wait
for the ACK of a wren before write, etc.

Signed-off-by: Urja Rannikko <urjaman at gmail.com>
---
 serprog.c | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/serprog.c b/serprog.c
index 5b96e8a..d7483cf 100644
--- a/serprog.c
+++ b/serprog.c
@@ -907,8 +907,10 @@ static int serprog_spi_send_command(struct flashctx *flash,
 	unsigned char *parmbuf;
 	int ret;
 	msg_pspew("%s, writecnt=%i, readcnt=%i\n", __func__, writecnt, readcnt);
+
+	/* Stream the spi operation (as read-n above). */
 	if ((sp_opbuf_usage) || (sp_max_write_n && sp_write_n_bytes)) {
-		if (sp_execute_opbuf() != 0) {
+		if (sp_execute_opbuf_noflush() != 0) {
 			msg_perr("Error: could not execute command buffer before sending SPI commands.\n");
 			return 1;
 		}
@@ -926,8 +928,20 @@ static int serprog_spi_send_command(struct flashctx *flash,
 	parmbuf[4] = (readcnt >> 8) & 0xFF;
 	parmbuf[5] = (readcnt >> 16) & 0xFF;
 	memcpy(parmbuf + 6, writearr, writecnt);
-	ret = sp_docommand(S_CMD_O_SPIOP, writecnt + 6, parmbuf, readcnt,
-			   readarr);
+
+	ret = sp_stream_buffer_op(S_CMD_O_SPIOP, writecnt + 6, parmbuf);
+
+	if ((!ret)&&(readcnt)) {
+		if (sp_flush_stream() != 0) {
+			free(parmbuf);
+			return 1;
+		}
+		if (serialport_read(readarr, readcnt) != 0) {
+			free(parmbuf);
+			msg_perr(MSGHEADER "Error: cannot read spiop data");
+			return 1;
+		}
+	}
 	free(parmbuf);
 	return ret;
 }
-- 
1.8.4





More information about the flashrom mailing list