From: Gerhard Sittig Date: Sun, 25 Jun 2017 10:11:03 +0000 (+0200) Subject: asix-sigma: Only change number of channels after successful firmware upload X-Git-Url: http://sigrok.org/gitweb/?a=commitdiff_plain;h=ac9534f48a8656a52b1cfc504915531afd0b9f70;hp=7bcf21683e6b8f77d55eaab7da5ea0bbe2949a6b;p=libsigrok.git asix-sigma: Only change number of channels after successful firmware upload The asix-sigma driver supports different samplerates, which will involve different firmware images and will affect the number of available logic channels as well as their memory layout in downloaded sample data. Make sure to only store the configuration's parameters after the setup of that configuration has successfully completed, and make sure to store a consistent set of parameters. Specifically don't change the number of channels when the firmware upload failed. This fixes part of bug #471. Suggested-By: Marian Cingel --- diff --git a/src/hardware/asix-sigma/protocol.c b/src/hardware/asix-sigma/protocol.c index a81ec2f6..ee7ce022 100644 --- a/src/hardware/asix-sigma/protocol.c +++ b/src/hardware/asix-sigma/protocol.c @@ -554,6 +554,7 @@ SR_PRIV int sigma_set_samplerate(const struct sr_dev_inst *sdi, uint64_t sampler struct drv_context *drvc; size_t i; int ret; + int num_channels; devc = sdi->priv; drvc = sdi->driver->context; @@ -572,15 +573,16 @@ SR_PRIV int sigma_set_samplerate(const struct sr_dev_inst *sdi, uint64_t sampler * firmware is required and higher rates might limit the set * of available channels. */ + num_channels = devc->num_channels; if (samplerate <= SR_MHZ(50)) { ret = upload_firmware(drvc->sr_ctx, 0, devc); - devc->num_channels = 16; + num_channels = 16; } else if (samplerate == SR_MHZ(100)) { ret = upload_firmware(drvc->sr_ctx, 1, devc); - devc->num_channels = 8; + num_channels = 8; } else if (samplerate == SR_MHZ(200)) { ret = upload_firmware(drvc->sr_ctx, 2, devc); - devc->num_channels = 4; + num_channels = 4; } /* @@ -589,6 +591,7 @@ SR_PRIV int sigma_set_samplerate(const struct sr_dev_inst *sdi, uint64_t sampler * an "event" (memory organization internal to the device). */ if (ret == SR_OK) { + devc->num_channels = num_channels; devc->cur_samplerate = samplerate; devc->samples_per_event = 16 / devc->num_channels; devc->state.state = SIGMA_IDLE;