[flashrom] [PATCH] serprog: flush stream in sp_docommand
Urja Rannikko
urjaman at gmail.com
Mon Oct 14 16:26:57 CEST 2013
This is to prevent bugs in the future - currently sp_docommand
is not called with operations in flight, but this makes it safe.
Signed-off-by: Urja Rannikko <urjaman at gmail.com>
-----
The patch also moves sp_flush_stream above sp_docommand...
---
serprog.c | 51 ++++++++++++++++++++++++++++-----------------------
1 file changed, 28 insertions(+), 23 deletions(-)
diff --git a/serprog.c b/serprog.c
index d7483cf..03963ec 100644
--- a/serprog.c
+++ b/serprog.c
@@ -204,12 +204,40 @@ static int sp_automatic_cmdcheck(uint8_t cmd)
return 0;
}
+static int sp_flush_stream(void)
+{
+ if (sp_streamed_transmit_ops)
+ do {
+ unsigned char c;
+ if (serialport_read(&c, 1) != 0) {
+ msg_perr("Error: cannot read from device (flushing stream)");
+ return 1;
+ }
+ if (c == S_NAK) {
+ msg_perr("Error: NAK to a stream buffer operation\n");
+ return 1;
+ }
+ if (c != S_ACK) {
+ msg_perr("Error: Invalid reply 0x%02X from device\n", c);
+ return 1;
+ }
+ } while (--sp_streamed_transmit_ops);
+ sp_streamed_transmit_ops = 0;
+ sp_streamed_transmit_bytes = 0;
+ return 0;
+}
+
static int sp_docommand(uint8_t command, uint32_t parmlen,
uint8_t *params, uint32_t retlen, void *retparms)
{
unsigned char c;
if (sp_automatic_cmdcheck(command))
return 1;
+
+ if (sp_flush_stream() != 0) {
+ return 1;
+ }
+
if (serialport_write(&command, 1) != 0) {
msg_perr("Error: cannot write op code: %s\n", strerror(errno));
return 1;
@@ -237,29 +265,6 @@ static int sp_docommand(uint8_t command, uint32_t parmlen,
return 0;
}
-static int sp_flush_stream(void)
-{
- if (sp_streamed_transmit_ops)
- do {
- unsigned char c;
- if (serialport_read(&c, 1) != 0) {
- msg_perr("Error: cannot read from device (flushing stream)");
- return 1;
- }
- if (c == S_NAK) {
- msg_perr("Error: NAK to a stream buffer operation\n");
- return 1;
- }
- if (c != S_ACK) {
- msg_perr("Error: Invalid reply 0x%02X from device\n", c);
- return 1;
- }
- } while (--sp_streamed_transmit_ops);
- sp_streamed_transmit_ops = 0;
- sp_streamed_transmit_bytes = 0;
- return 0;
-}
-
static int sp_stream_buffer_op(uint8_t cmd, uint32_t parmlen, uint8_t *parms)
{
uint8_t *sp;
--
1.8.4
More information about the flashrom
mailing list