|
|
@ -1485,6 +1485,7 @@ static int _usb_init(struct cgpu_info *cgpu, struct libusb_device *dev, struct u |
|
|
|
char devstr[STRBUFLEN+1]; |
|
|
|
char devstr[STRBUFLEN+1]; |
|
|
|
int err, i, j, k, pstate; |
|
|
|
int err, i, j, k, pstate; |
|
|
|
int bad = USB_INIT_FAIL; |
|
|
|
int bad = USB_INIT_FAIL; |
|
|
|
|
|
|
|
int cfg; |
|
|
|
|
|
|
|
|
|
|
|
DEVLOCK(cgpu, pstate); |
|
|
|
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); |
|
|
|
cfg = -1; |
|
|
|
if (err) { |
|
|
|
err = libusb_get_configuration(cgusb->handle, &cfg); |
|
|
|
switch(err) { |
|
|
|
if (err) |
|
|
|
case LIBUSB_ERROR_BUSY: |
|
|
|
cfg = -1; |
|
|
|
applog(LOG_WARNING, |
|
|
|
|
|
|
|
"USB init, set config %d in use %s", |
|
|
|
// Try to set it if we can't read it or it's different
|
|
|
|
found->config, devstr); |
|
|
|
if (cfg != found->config) { |
|
|
|
break; |
|
|
|
err = libusb_set_configuration(cgusb->handle, found->config); |
|
|
|
default: |
|
|
|
if (err) { |
|
|
|
applog(LOG_DEBUG, |
|
|
|
switch(err) { |
|
|
|
"USB init, failed to set config to %d, err %d %s", |
|
|
|
case LIBUSB_ERROR_BUSY: |
|
|
|
found->config, err, devstr); |
|
|
|
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); |
|
|
|
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; |
|
|
|
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; |
|
|
|
cgusb->usbver = cgusb->descriptor->bcdUSB; |
|
|
|
|
|
|
|
|
|
|
|
// TODO: allow this with the right version of the libusb include and running library
|
|
|
|
// 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; |
|
|
|
bad = USB_INIT_OK; |
|
|
|
goto out_unlock; |
|
|
|
goto out_unlock; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
reldame: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
libusb_release_interface(cgusb->handle, found->interface); |
|
|
|
|
|
|
|
|
|
|
|
cldame: |
|
|
|
cldame: |
|
|
|
|
|
|
|
|
|
|
|
cg_wlock(&cgusb_fd_lock); |
|
|
|
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) |
|
|
|
if (count == 0) |
|
|
|
applog(LOG_DEBUG, "USB scan devices: found no devices"); |
|
|
|
applog(LOG_DEBUG, "USB scan devices: found no devices"); |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
nmsleep(166); |
|
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < count; i++) { |
|
|
|
for (i = 0; i < count; i++) { |
|
|
|
if (total_count >= total_limit) { |
|
|
|
if (total_count >= total_limit) { |
|
|
|