return SR_ERR_ARG;
}
+ /* No log message here, too verbose and not very useful. */
+
if ((ret = driver->init(driver, ctx)) < 0)
sr_err("Failed to initialize the driver: %d.", ret);
l = driver->scan(driver, options);
- sr_spew("Scan of '%s' found %d devices.", driver->name,
- g_slist_length(l));
+ sr_spew("Scan found %d devices (%s).", g_slist_length(l), driver->name);
return l;
}
if (!ctx)
return;
+ sr_dbg("Cleaning up all drivers.");
+
drivers = sr_driver_list(ctx);
for (i = 0; drivers[i]; i++) {
if (drivers[i]->cleanup)
*/
SR_PRIV void sr_config_free(struct sr_config *src)
{
-
if (!src || !src->data) {
sr_err("%s: invalid data!", __func__);
return;
g_variant_unref(src->data);
g_free(src);
-
}
/** @private */
ret = SR_ERR;
else if (!sdi->driver->config_commit)
ret = SR_OK;
- else
+ else if (sdi->status != SR_ST_ACTIVE) {
+ sr_err("%s: Device instance not active, can't commit config.",
+ sdi->driver->name);
+ ret = SR_ERR_DEV_CLOSED;
+ } else
ret = sdi->driver->config_commit(sdi);
return ret;
* List all possible values for a configuration key.
*
* @param[in] driver The sr_dev_driver struct to query. Must not be NULL.
- * @param[in] sdi (optional) If the key is specific to a device, this must
- * contain a pointer to the struct sr_dev_inst to be checked.
+ * @param[in] sdi (optional) If the key is specific to a device instance, this
+ * must contain a pointer to the struct sr_dev_inst to be checked.
* Otherwise it must be NULL. If sdi is != NULL, sdi->priv must
* also be != NULL.
- * @param[in] cg The channel group on the device for which to list the
- * values, or NULL.
+ * @param[in] cg The channel group on the device instance for which to list
+ * the values, or NULL. If this device instance doesn't
+ * have channel groups, this must not be != NULL.
* @param[in] key The configuration key (SR_CONF_*).
* @param[in,out] data A pointer to a GVariant where the list will be stored.
- * The caller is given ownership of the GVariant and must thus
- * unref the GVariant after use. However if this function
- * returns an error code, the field should be considered
- * unused, and should not be unreferenced.
+ * The caller is given ownership of the GVariant and must thus
+ * unref the GVariant after use. However if this function
+ * returns an error code, the field should be considered
+ * unused, and should not be unreferenced.
*
* @retval SR_OK Success.
* @retval SR_ERR Error.
if (!driver || !data)
return SR_ERR;
- else if (!driver->config_list)
+
+ if (!driver->config_list)
return SR_ERR_ARG;
- else if (key != SR_CONF_SCAN_OPTIONS && key != SR_CONF_DEVICE_OPTIONS) {
+
+ if (key != SR_CONF_SCAN_OPTIONS && key != SR_CONF_DEVICE_OPTIONS) {
if (check_key(driver, sdi, cg, key, SR_CONF_LIST, NULL) != SR_OK)
return SR_ERR_ARG;
}
+
if (sdi && !sdi->priv) {
sr_err("Can't list config (sdi != NULL, sdi->priv == NULL).");
return SR_ERR;
}
+
+ if (key != SR_CONF_SCAN_OPTIONS && key != SR_CONF_DEVICE_OPTIONS && !sdi) {
+ sr_err("Config keys other than SR_CONF_SCAN_OPTIONS and "
+ "SR_CONF_DEVICE_OPTIONS always need an sdi.");
+ return SR_ERR_ARG;
+ }
+
+ if (cg && sdi && !sdi->channel_groups) {
+ sr_err("Can't list config for channel group, there are none.");
+ return SR_ERR_ARG;
+ }
+
+ if (cg && sdi && !g_slist_find(sdi->channel_groups, cg)) {
+ sr_err("If a channel group is specified, it must be a valid one.");
+ return SR_ERR_ARG;
+ }
+
+ if (cg && !sdi) {
+ sr_err("Need sdi when a channel group is specified.");
+ return SR_ERR_ARG;
+ }
+
if ((ret = driver->config_list(key, data, sdi, cg)) == SR_OK) {
log_key(sdi, cg, key, SR_CONF_LIST, *data);
g_variant_ref_sink(*data);
}
+ if (ret == SR_ERR_CHANNEL_GROUP)
+ sr_err("%s: No channel group specified.",
+ (sdi) ? sdi->driver->name : "unknown");
+
return ret;
}