From: Gerhard Sittig Date: Sat, 1 Aug 2020 12:55:20 +0000 (+0200) Subject: serial: make failed flush() in open() non-fatal, CP2110 flush() return X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=commitdiff_plain;h=0dc27cd1dbc961366d14607526e54992078e9d5c serial: make failed flush() in open() non-fatal, CP2110 flush() return Commit cb828f1b3e00 introduced an unconditional flush() call in the open() routine's body, and passed its return value in verbatim form to open() callers. Some of the transports/cables for serial communication yield the SR_ERR_NA return value. Consider this a non-fatal condition. Unbreak the CP2110 HID chip's flush() implementation. Don't expect a return value of 0 from HID write calls, instead expect to see the number of written bytes for successful calls. This was tested with ch9325 (UT-D04), cp2110 (UT-D09) and bu86x. --- diff --git a/src/serial.c b/src/serial.c index fe39effc..7f1f1eea 100644 --- a/src/serial.c +++ b/src/serial.c @@ -128,7 +128,18 @@ SR_PRIV int serial_open(struct sr_serial_dev_inst *serial, int flags) return ret; } - return serial_flush(serial); + /* + * Flush potentially dangling RX data. Availability of the + * flush primitive depends on the transport/cable, absense + * is non-fatal. + */ + ret = serial_flush(serial); + if (ret == SR_ERR_NA) + ret = SR_OK; + if (ret != SR_OK) + return ret; + + return SR_OK; } /** diff --git a/src/serial_hid_cp2110.c b/src/serial_hid_cp2110.c index 72a7aa98..bdc58664 100644 --- a/src/serial_hid_cp2110.c +++ b/src/serial_hid_cp2110.c @@ -280,7 +280,7 @@ static int cp2110_flush(struct sr_serial_dev_inst *serial) buffer[0] = CP2110_FIFO_PURGE; buffer[1] = CP2110_FIFO_PURGE_TX | CP2110_FIFO_PURGE_RX; rc = ser_hid_hidapi_set_data(serial, 0, buffer, sizeof(buffer), 0); - if (rc != 0) + if (rc != sizeof(buffer)) return SR_ERR; return SR_OK; }