usbutils - in init only change the config if needed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
diff --git a/usbutils.c b/usbutils.c
index fe2e0a5..f42c7d4 100644
--- a/usbutils.c
+++ b/usbutils.c
@@ -1485,6 +1485,7 @@ static int _usb_init(struct cgpu_info *cgpu, struct libusb_device *dev, struct u
char devstr[STRBUFLEN+1];
int err, i, j, k, pstate;
int bad = USB_INIT_FAIL;
+ int cfg;
DEVLOCK(cgpu, pstate);
@@ -1606,20 +1607,28 @@ static int _usb_init(struct cgpu_info *cgpu, struct libusb_device *dev, struct u
}
}
- err = libusb_set_configuration(cgusb->handle, found->config);
- if (err) {
- switch(err) {
- case LIBUSB_ERROR_BUSY:
- applog(LOG_WARNING,
- "USB init, set config %d in use %s",
- found->config, devstr);
- break;
- default:
- applog(LOG_DEBUG,
- "USB init, failed to set config to %d, err %d %s",
- found->config, err, devstr);
+ cfg = -1;
+ err = libusb_get_configuration(cgusb->handle, &cfg);
+ if (err)
+ cfg = -1;
+
+ // Try to set it if we can't read it or it's different
+ if (cfg != found->config) {
+ err = libusb_set_configuration(cgusb->handle, found->config);
+ if (err) {
+ switch(err) {
+ case LIBUSB_ERROR_BUSY:
+ applog(LOG_WARNING,
+ "USB init, set config %d in use %s",
+ found->config, devstr);
+ break;
+ default:
+ applog(LOG_DEBUG,
+ "USB init, failed to set config to %d, err %d %s",
+ found->config, err, devstr);
+ }
+ goto cldame;
}
- goto cldame;
}
err = libusb_get_active_config_descriptor(dev, &config);
@@ -1681,6 +1690,17 @@ static int _usb_init(struct cgpu_info *cgpu, struct libusb_device *dev, struct u
goto cldame;
}
+ cfg = -1;
+ err = libusb_get_configuration(cgusb->handle, &cfg);
+ if (err)
+ cfg = -1;
+ if (cfg != found->config) {
+ applog(LOG_WARNING,
+ "USB init, incorrect config (%d!=%d) after claim of %s",
+ cfg, found->config, devstr);
+ goto reldame;
+ }
+
cgusb->usbver = cgusb->descriptor->bcdUSB;
// TODO: allow this with the right version of the libusb include and running library
@@ -1732,6 +1752,10 @@ static int _usb_init(struct cgpu_info *cgpu, struct libusb_device *dev, struct u
bad = USB_INIT_OK;
goto out_unlock;
+reldame:
+
+ libusb_release_interface(cgusb->handle, found->interface);
+
cldame:
cg_wlock(&cgusb_fd_lock);
@@ -1897,6 +1921,8 @@ void usb_detect(struct device_drv *drv, bool (*device_detect)(struct libusb_devi
if (count == 0)
applog(LOG_DEBUG, "USB scan devices: found no devices");
+ else
+ nmsleep(166);
for (i = 0; i < count; i++) {
if (total_count >= total_limit) {