Comments
Patch
@@ -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;
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@gmail.com> ----- The patch also moves sp_flush_stream above sp_docommand... --- serprog.c | 51 ++++++++++++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 23 deletions(-)