Check return code for bitfury_open and release resources properly on failed initialisation.
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
diff --git a/driver-bitfury.c b/driver-bitfury.c
index 23a0274..4026bb8 100644
--- a/driver-bitfury.c
+++ b/driver-bitfury.c
@@ -35,12 +35,16 @@ static void bitfury_empty_intbuf(struct cgpu_info *bitfury)
usb_read_ii(bitfury, 0, buf, 8, &amount, C_BF1_IFLUSH);
}
-static void bitfury_open(struct cgpu_info *bitfury)
+static bool bitfury_open(struct cgpu_info *bitfury)
{
+ int err;
+
bitfury_empty_intbuf(bitfury);
/* Magic open sequence */
- usb_transfer(bitfury, 0x21, 0x22, 0x0003, 0, C_BF1_OPEN);
- bitfury_empty_buffer(bitfury);
+ err = usb_transfer(bitfury, 0x21, 0x22, 0x0003, 0, C_BF1_OPEN);
+ if (!err)
+ bitfury_empty_buffer(bitfury);
+ return !err;
}
static void bitfury_close(struct cgpu_info *bitfury)
@@ -109,10 +113,8 @@ static bool bitfury_detect_one(struct libusb_device *dev, struct usb_find_device
bitfury = usb_alloc_cgpu(&bitfury_drv, 1);
- if (!usb_init(bitfury, dev, found)) {
- bitfury = usb_free_cgpu(bitfury);
+ if (!usb_init(bitfury, dev, found))
goto out;
- }
applog(LOG_INFO, "%s %d: Found at %s", bitfury->drv->name,
bitfury->device_id, bitfury->device_path);
@@ -123,7 +125,11 @@ static bool bitfury_detect_one(struct libusb_device *dev, struct usb_find_device
usb_buffer_enable(bitfury);
- bitfury_open(bitfury);
+ if (!bitfury_open(bitfury)) {
+ applog(LOG_INFO, "%s %d: Failed to open", bitfury->drv->name,
+ bitfury->device_id);
+ goto out_close;
+ }
/* Send getinfo request */
if (!bitfury_getinfo(bitfury, info))
@@ -145,7 +151,9 @@ static bool bitfury_detect_one(struct libusb_device *dev, struct usb_find_device
return true;
out_close:
bitfury_close(bitfury);
+ usb_uninit(bitfury);
out:
+ bitfury = usb_free_cgpu(bitfury);
return false;
}