+static GSList *default_scan(GSList *options)
+{
+ GSList *l, *devices;
+ struct sr_hwopt *opt;
+ const char *conn, *serialcomm;
+
+ devices = NULL;
+ conn = serialcomm = NULL;
+ for (l = options; l; l = l->next) {
+ opt = l->data;
+ switch (opt->hwopt) {
+ case SR_HWOPT_CONN:
+ conn = opt->value;
+ break;
+ case SR_HWOPT_SERIALCOMM:
+ serialcomm = opt->value;
+ break;
+ }
+ }
+ if (conn)
+ devices = genericdmm_connect(conn, serialcomm);
+
+ return devices;
+}
+
+static int open_usb(struct sr_dev_inst *sdi)
+{
+ libusb_device **devlist;
+ struct libusb_device_descriptor des;
+ struct dev_context *devc;
+ int ret, tmp, cnt, i;
+
+ devc = sdi->priv;
+
+ if (sdi->status == SR_ST_ACTIVE)
+ /* already in use */
+ return SR_ERR;
+
+ cnt = libusb_get_device_list(genericdmm_usb_context, &devlist);
+ if (cnt < 0) {
+ sr_err("genericdmm: Failed to retrieve device list (%d)", cnt);
+ return SR_ERR;
+ }
+
+ ret = SR_ERR;
+ for (i = 0; i < cnt; i++) {
+ if ((tmp = libusb_get_device_descriptor(devlist[i], &des))) {
+ sr_err("genericdmm: Failed to get device descriptor: %d.", tmp);
+ continue;
+ }
+
+ if (libusb_get_bus_number(devlist[i]) != devc->usb->bus
+ || libusb_get_device_address(devlist[i]) != devc->usb->address)
+ /* this is not the one */
+ continue;
+
+ if ((tmp = libusb_open(devlist[i], &devc->usb->devhdl))) {
+ sr_err("genericdmm: Failed to open device: %d.", tmp);
+ break;
+ }
+
+ sr_info("genericdmm: Opened device %s on %d.%d ", devc->profile->modelid,
+ devc->usb->bus, devc->usb->address);
+ ret = SR_OK;
+ break;
+ }
+ libusb_free_device_list(devlist, 1);
+
+ return ret;
+}
+
+static int clear_instances(void)
+{
+ GSList *l;
+ struct sr_dev_inst *sdi;
+ struct dev_context *devc;
+ struct drv_context *drvc;
+
+ if (!(drvc = gdi->priv))
+ return SR_OK;
+
+ /* Properly close and free all devices. */
+ for (l = drvc->instances; l; l = l->next) {
+ if (!(sdi = l->data)) {
+ /* Log error, but continue cleaning up the rest. */
+ sr_err("genericdmm: sdi was NULL, continuing.");
+ continue;
+ }
+ if (!(devc = sdi->priv)) {
+ /* Log error, but continue cleaning up the rest. */
+ sr_err("genericdmm: sdi->priv was NULL, continuing.");
+ continue;
+ }
+
+ if (devc->profile) {
+ switch (devc->profile->transport) {
+ case DMM_TRANSPORT_USBHID:
+ sr_usb_dev_inst_free(devc->usb);
+ break;
+ case DMM_TRANSPORT_SERIAL:
+ if (devc->serial && devc->serial->fd != -1)
+ serial_close(devc->serial->fd);
+ sr_serial_dev_inst_free(devc->serial);
+ break;
+ }
+ }
+
+ sr_dev_inst_free(sdi);
+ }
+
+ g_slist_free(drvc->instances);
+ drvc->instances = NULL;
+
+ return SR_OK;
+}
+