+ drvc = di->priv;
+ devc = sdi->priv;
+ usb = sdi->conn;
+
+ /* Configures devc->cur_channels. */
+ if (configure_channels(sdi) != SR_OK) {
+ sr_err("Failed to configure channels.");
+ return SR_ERR;
+ }
+
+ devc->cb_data = cb_data;
+ devc->num_samples = 0;
+ devc->empty_transfer_count = 0;
+ devc->cur_channel = 0;
+ memset(devc->channel_data, 0, sizeof(devc->channel_data));
+
+ timeout = get_timeout(devc);
+ num_transfers = get_number_of_transfers(devc);
+ size = get_buffer_size(devc);
+ convsize = (size / devc->num_channels + 2) * 16;
+ devc->submitted_transfers = 0;
+
+ devc->convbuffer_size = convsize;
+ if (!(devc->convbuffer = g_try_malloc(convsize))) {
+ sr_err("Conversion buffer malloc failed.");
+ return SR_ERR_MALLOC;
+ }
+
+ devc->transfers = g_try_malloc0(sizeof(*devc->transfers) * num_transfers);
+ if (!devc->transfers) {
+ sr_err("USB transfers malloc failed.");
+ g_free(devc->convbuffer);
+ return SR_ERR_MALLOC;
+ }
+
+ if ((ret = logic16_setup_acquisition(sdi, devc->cur_samplerate,
+ devc->cur_channels)) != SR_OK) {
+ g_free(devc->transfers);
+ g_free(devc->convbuffer);
+ return ret;
+ }
+
+ devc->num_transfers = num_transfers;
+ for (i = 0; i < num_transfers; i++) {
+ if (!(buf = g_try_malloc(size))) {
+ sr_err("USB transfer buffer malloc failed.");
+ if (devc->submitted_transfers)
+ abort_acquisition(devc);
+ else {
+ g_free(devc->transfers);
+ g_free(devc->convbuffer);
+ }
+ return SR_ERR_MALLOC;
+ }
+ transfer = libusb_alloc_transfer(0);
+ libusb_fill_bulk_transfer(transfer, usb->devhdl,
+ 2 | LIBUSB_ENDPOINT_IN, buf, size,
+ logic16_receive_transfer, devc, timeout);
+ if ((ret = libusb_submit_transfer(transfer)) != 0) {
+ sr_err("Failed to submit transfer: %s.",
+ libusb_error_name(ret));
+ libusb_free_transfer(transfer);
+ g_free(buf);
+ abort_acquisition(devc);
+ return SR_ERR;
+ }
+ devc->transfers[i] = transfer;
+ devc->submitted_transfers++;
+ }
+
+ devc->ctx = drvc->sr_ctx;
+
+ usb_source_add(devc->ctx, timeout, receive_data, (void *)sdi);
+
+ /* Send header packet to the session bus. */
+ std_session_send_df_header(cb_data, LOG_PREFIX);
+
+ if ((ret = logic16_start_acquisition(sdi)) != SR_OK) {
+ abort_acquisition(devc);
+ return ret;
+ }