+/**
+ * Get amount of queued RX data. Internal to the serial subsystem,
+ * coordination between common and transport specific support code.
+ *
+ * @param[in] serial Previously opened serial port instance.
+ *
+ * @private
+ */
+SR_PRIV size_t sr_ser_has_queued_data(struct sr_serial_dev_inst *serial)
+{
+ if (!serial || !serial->rcv_buffer)
+ return 0;
+
+ return serial->rcv_buffer->len;
+}
+
+/**
+ * Queue received data. Internal to the serial subsystem, coordination
+ * between common and transport specific support code.
+ *
+ * @param[in] serial Previously opened serial port instance.
+ * @param[in] data Pointer to data bytes to queue.
+ * @param[in] len Number of data bytes to queue.
+ *
+ * @private
+ */
+SR_PRIV void sr_ser_queue_rx_data(struct sr_serial_dev_inst *serial,
+ const uint8_t *data, size_t len)
+{
+ if (!serial || !data || !len)
+ return;
+
+ if (serial->rx_chunk_cb_func)
+ serial->rx_chunk_cb_func(serial, serial->rx_chunk_cb_data, data, len);
+ else if (serial->rcv_buffer)
+ g_string_append_len(serial->rcv_buffer, (const gchar *)data, len);
+}
+
+/**
+ * Retrieve previously queued RX data. Internal to the serial subsystem,
+ * coordination between common and transport specific support code.
+ *
+ * @param[in] serial Previously opened serial port instance.
+ * @param[out] data Pointer to store retrieved data bytes into.
+ * @param[in] len Number of data bytes to retrieve.
+ *
+ * @private
+ */
+SR_PRIV size_t sr_ser_unqueue_rx_data(struct sr_serial_dev_inst *serial,
+ uint8_t *data, size_t len)
+{
+ size_t qlen;
+ GString *buf;
+
+ if (!serial || !data || !len)
+ return 0;
+
+ qlen = sr_ser_has_queued_data(serial);
+ if (!qlen)
+ return 0;
+
+ buf = serial->rcv_buffer;
+ if (len > buf->len)
+ len = buf->len;
+ if (len) {
+ memcpy(data, buf->str, len);
+ g_string_erase(buf, 0, len);