Преглед на файлове

lib: detach and reattach kernel driver if needed

Signed-off-by: Steve Markgraf <steve@steve-m.de>
Steve Markgraf преди 12 години
родител
ревизия
3c4aa46f5a
променени са 1 файла, в които са добавени 19 реда и са изтрити 0 реда
  1. 19 0
      src/librtlsdr.c

+ 19 - 0
src/librtlsdr.c

@@ -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);