lib: detach and reattach kernel driver if needed

Signed-off-by: Steve Markgraf <steve@steve-m.de>
This commit is contained in:
Steve Markgraf 2013-02-26 23:11:33 +01:00
parent 698a8a152e
commit 3c4aa46f5a
1 changed files with 19 additions and 0 deletions

View File

@ -90,6 +90,7 @@ struct rtlsdr_dev {
int gain; /* tenth dB */
struct e4k_state e4k_s;
int dev_lost;
int driver_active;
unsigned int xfer_errors;
};
@ -1347,6 +1348,16 @@ int rtlsdr_open(rtlsdr_dev_t **out_dev, uint32_t index)
libusb_free_device_list(list, 1);
if (libusb_kernel_driver_active(dev->devh, 0) == 1) {
dev->driver_active = 1;
if (!libusb_detach_kernel_driver(dev->devh, 0)) {
fprintf(stderr, "Detached kernel driver\n");
} else {
fprintf(stderr, "Detaching kernel driver failed!");
goto err;
}
}
r = libusb_claim_interface(dev->devh, 0);
if (r < 0) {
fprintf(stderr, "usb_claim_interface error %d\n", r);
@ -1471,6 +1482,14 @@ int rtlsdr_close(rtlsdr_dev_t *dev)
}
libusb_release_interface(dev->devh, 0);
if (dev->driver_active) {
if (!libusb_attach_kernel_driver(dev->devh, 0))
fprintf(stderr, "Reattached kernel driver\n");
else
fprintf(stderr, "Reattaching kernel driver failed!\n");
}
libusb_close(dev->devh);
libusb_exit(dev->ctx);