+/* Check whether we can receive responses of more than 64 bytes.
+ * The FX2 firmware of the LWLA1016 has a bug in the reset logic which
+ * sometimes causes the response endpoint to be limited to transfers of
+ * 64 bytes at a time, instead of the expected 2*512 bytes. The problem
+ * can be worked around by never requesting more than 64 bytes.
+ * This quirk manifests itself only under certain conditions, and some
+ * users seem to see it more frequently than others. Detect it here in
+ * order to avoid paying the penalty unnecessarily.
+ */
+static int test_read_memory(const struct sr_dev_inst *sdi,
+ unsigned int start, unsigned int count)
+{
+ struct dev_context *devc;
+ struct sr_usb_dev_inst *usb;
+ unsigned int i;
+ int xfer_len, ret;
+ uint16_t command[5];
+ unsigned char reply[512];
+
+ devc = sdi->priv;
+ usb = sdi->conn;
+
+ command[0] = LWLA_WORD(CMD_READ_MEM32);
+ command[1] = LWLA_WORD_0(start);
+ command[2] = LWLA_WORD_1(start);
+ command[3] = LWLA_WORD_0(count);
+ command[4] = LWLA_WORD_1(count);
+
+ ret = lwla_send_command(usb, command, ARRAY_SIZE(command));
+ if (ret != SR_OK)
+ return ret;
+
+ ret = lwla_receive_reply(usb, reply, sizeof(reply), &xfer_len);
+ if (ret != SR_OK)
+ return ret;
+
+ devc->short_transfer_quirk = (xfer_len == 64);
+
+ for (i = xfer_len; i < 4 * count && xfer_len == 64; i += xfer_len) {
+ ret = lwla_receive_reply(usb, reply, sizeof(reply), &xfer_len);
+ if (ret != SR_OK)
+ return ret;
+ }
+ if (i != 4 * count) {
+ sr_err("Invalid read response of unexpected length %d.",
+ xfer_len);
+ return SR_ERR;
+ }
+
+ return SR_OK;
+}
+