]> sigrok.org Git - libsigrok.git/blobdiff - hardware/common/scpi_usbtmc_libusb.c
build: Portability fixes.
[libsigrok.git] / hardware / common / scpi_usbtmc_libusb.c
index 9d96bcca7f2220aedfff5533e586833abfa37524..c4470b5db6dee0d98b4983a8a79b2627bf9e5f08 100644 (file)
@@ -43,6 +43,7 @@ struct scpi_usbtmc_libusb {
        int response_length;
        int response_bytes_read;
        int remaining_length;
+       int rigol_ds1000;
 };
 
 /* Some USBTMC-specific enums, as defined in the USBTMC standard. */
@@ -109,16 +110,16 @@ static GSList *scpi_usbtmc_libusb_scan(struct drv_context *drvc)
                return NULL;
        }
        for (i = 0; devlist[i]; i++) {
-               if ((ret = libusb_get_device_descriptor(devlist[i], &des))) {
+               if ((ret = libusb_get_device_descriptor(devlist[i], &des)) < 0) {
                        sr_err("Failed to get device descriptor: %s.",
                               libusb_error_name(ret));
                        continue;
                }
 
                for (confidx = 0; confidx < des.bNumConfigurations; confidx++) {
-                       if (libusb_get_config_descriptor(devlist[i], confidx, &confdes) != 0) {
-                               sr_err("Failed to get configuration descriptor: %s.",
-                                      libusb_error_name(ret));
+                       if ((ret = libusb_get_config_descriptor(devlist[i], confidx, &confdes)) < 0) {
+                               sr_dbg("Failed to get configuration descriptor: %s, "
+                                      "ignoring device.", libusb_error_name(ret));
                                break;
                        }
                        for (intfidx = 0; intfidx < confdes->bNumInterfaces; intfidx++) {
@@ -193,16 +194,16 @@ static int scpi_usbtmc_libusb_open(void *priv)
                return SR_ERR;
 
        dev = libusb_get_device(usb->devhdl);
-       if ((ret = libusb_get_device_descriptor(dev, &des))) {
+       if ((ret = libusb_get_device_descriptor(dev, &des)) < 0) {
                sr_err("Failed to get device descriptor: %s.",
                       libusb_error_name(ret));
                return SR_ERR;
        }
 
        for (confidx = 0; confidx < des.bNumConfigurations; confidx++) {
-               if (libusb_get_config_descriptor(dev, confidx, &confdes) != 0) {
-                       sr_err("Failed to get configuration descriptor: %s.",
-                              libusb_error_name(ret));
+               if ((ret = libusb_get_config_descriptor(dev, confidx, &confdes)) < 0) {
+                       sr_dbg("Failed to get configuration descriptor: %s, "
+                              "ignoring device.", libusb_error_name(ret));
                        continue;
                }
                for (intfidx = 0; intfidx < confdes->bNumInterfaces; intfidx++) {
@@ -234,6 +235,8 @@ static int scpi_usbtmc_libusb_open(void *priv)
                                }
                        }
                        found = 1;
+                       uscpi->rigol_ds1000 = des.idVendor  == 0x1ab1 &&
+                                             des.idProduct == 0x0588;
                }
                libusb_free_config_descriptor(confdes);
                if (found)
@@ -255,18 +258,19 @@ static int scpi_usbtmc_libusb_open(void *priv)
                uscpi->detached_kernel_driver = 1;
        }
 
-       if ((ret = libusb_set_configuration(usb->devhdl, config))) {
+       if ((ret = libusb_set_configuration(usb->devhdl, config)) < 0) {
                sr_err("Failed to set configuration: %s.",
                       libusb_error_name(ret));
                return SR_ERR;
        }
 
-       if ((ret = libusb_claim_interface(usb->devhdl, uscpi->interface))) {
+       if ((ret = libusb_claim_interface(usb->devhdl, uscpi->interface)) < 0) {
                sr_err("Failed to claim interface: %s.",
                       libusb_error_name(ret));
                return SR_ERR;
        }
 
+       if (!uscpi->rigol_ds1000) {
        if ((ret = libusb_clear_halt(usb->devhdl, uscpi->bulk_in_ep)) < 0) {
                sr_err("Failed to clear halt/stall condition for EP %d: %s.",
                       uscpi->bulk_in_ep, libusb_error_name(ret));
@@ -282,6 +286,7 @@ static int scpi_usbtmc_libusb_open(void *priv)
                       uscpi->interrupt_ep, libusb_error_name(ret));
                return SR_ERR;
        }
+       }
 
        /* Get capabilities. */
        ret = libusb_control_transfer(usb->devhdl,
@@ -311,18 +316,20 @@ static int scpi_usbtmc_libusb_open(void *priv)
        return SR_OK;
 }
 
-static int scpi_usbtmc_libusb_source_add(void *priv, int events, int timeout,
-                       sr_receive_data_callback_t cb, void *cb_data)
+static int scpi_usbtmc_libusb_source_add(struct sr_session *session,
+               void *priv, int events, int timeout, sr_receive_data_callback cb,
+               void *cb_data)
 {
        struct scpi_usbtmc_libusb *uscpi = priv;
        (void)events;
-       return usb_source_add(uscpi->ctx, timeout, cb, cb_data);
+       return usb_source_add(session, uscpi->ctx, timeout, cb, cb_data);
 }
 
-static int scpi_usbtmc_libusb_source_remove(void *priv)
+static int scpi_usbtmc_libusb_source_remove(struct sr_session *session,
+               void *priv)
 {
        struct scpi_usbtmc_libusb *uscpi = priv;
-       return usb_source_remove(uscpi->ctx);
+       return usb_source_remove(session, uscpi->ctx);
 }
 
 static void usbtmc_bulk_out_header_write(void *header, uint8_t MsgID,
@@ -385,7 +392,7 @@ static int scpi_usbtmc_bulkout(struct scpi_usbtmc_libusb *uscpi,
        ret = libusb_bulk_transfer(usb->devhdl, uscpi->bulk_out_ep,
                                   uscpi->buffer, padded_size, &transferred,
                                   TRANSFER_TIMEOUT);
-       if (ret) {
+       if (ret < 0) {
                sr_err("USBTMC bulk out transfer error: %s.",
                       libusb_error_name(ret));
                return SR_ERR;
@@ -409,7 +416,7 @@ static int scpi_usbtmc_bulkin_start(struct scpi_usbtmc_libusb *uscpi,
 
        ret = libusb_bulk_transfer(usb->devhdl, uscpi->bulk_in_ep, data, size,
                                   &transferred, TRANSFER_TIMEOUT);
-       if (ret) {
+       if (ret < 0) {
                sr_err("USBTMC bulk in transfer error: %s.",
                       libusb_error_name(ret));
                return SR_ERR;
@@ -437,7 +444,7 @@ static int scpi_usbtmc_bulkin_continue(struct scpi_usbtmc_libusb *uscpi,
 
        ret = libusb_bulk_transfer(usb->devhdl, uscpi->bulk_in_ep, data, size,
                                   &transferred, TRANSFER_TIMEOUT);
-       if (ret) {
+       if (ret < 0) {
                sr_err("USBTMC bulk in transfer error: %s.",
                       libusb_error_name(ret));
                return SR_ERR;
@@ -524,6 +531,7 @@ static int scpi_usbtmc_libusb_close(void *priv)
        if (!usb->devhdl)
                return SR_ERR;
 
+       if (!uscpi->rigol_ds1000) {
        if ((ret = libusb_clear_halt(usb->devhdl, uscpi->bulk_in_ep)) < 0)
                sr_err("Failed to clear halt/stall condition for EP %d: %s.",
                       uscpi->bulk_in_ep, libusb_error_name(ret));
@@ -533,6 +541,7 @@ static int scpi_usbtmc_libusb_close(void *priv)
        if ((ret = libusb_clear_halt(usb->devhdl, uscpi->interrupt_ep)) < 0)
                sr_err("Failed to clear halt/stall condition for EP %d: %s.",
                       uscpi->interrupt_ep, libusb_error_name(ret));
+       }
 
        if ((ret = libusb_release_interface(usb->devhdl, uscpi->interface)) < 0)
                sr_err("Failed to release interface: %s.",