aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/bluetooth/btusb.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index b4756a6a3a68..29ae99817c60 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -172,6 +172,7 @@ static struct usb_device_id blacklist_table[] = {
172struct btusb_data { 172struct btusb_data {
173 struct hci_dev *hdev; 173 struct hci_dev *hdev;
174 struct usb_device *udev; 174 struct usb_device *udev;
175 struct usb_interface *intf;
175 struct usb_interface *isoc; 176 struct usb_interface *isoc;
176 177
177 spinlock_t lock; 178 spinlock_t lock;
@@ -826,6 +827,7 @@ static int btusb_probe(struct usb_interface *intf,
826 } 827 }
827 828
828 data->udev = interface_to_usbdev(intf); 829 data->udev = interface_to_usbdev(intf);
830 data->intf = intf;
829 831
830 spin_lock_init(&data->lock); 832 spin_lock_init(&data->lock);
831 833
@@ -894,7 +896,7 @@ static int btusb_probe(struct usb_interface *intf,
894 896
895 if (data->isoc) { 897 if (data->isoc) {
896 err = usb_driver_claim_interface(&btusb_driver, 898 err = usb_driver_claim_interface(&btusb_driver,
897 data->isoc, NULL); 899 data->isoc, data);
898 if (err < 0) { 900 if (err < 0) {
899 hci_free_dev(hdev); 901 hci_free_dev(hdev);
900 kfree(data); 902 kfree(data);
@@ -926,13 +928,22 @@ static void btusb_disconnect(struct usb_interface *intf)
926 928
927 hdev = data->hdev; 929 hdev = data->hdev;
928 930
929 if (data->isoc) 931 __hci_dev_hold(hdev);
930 usb_driver_release_interface(&btusb_driver, data->isoc);
931 932
932 usb_set_intfdata(intf, NULL); 933 usb_set_intfdata(data->intf, NULL);
934
935 if (data->isoc)
936 usb_set_intfdata(data->isoc, NULL);
933 937
934 hci_unregister_dev(hdev); 938 hci_unregister_dev(hdev);
935 939
940 if (intf == data->isoc)
941 usb_driver_release_interface(&btusb_driver, data->intf);
942 else if (data->isoc)
943 usb_driver_release_interface(&btusb_driver, data->isoc);
944
945 __hci_dev_put(hdev);
946
936 hci_free_dev(hdev); 947 hci_free_dev(hdev);
937} 948}
938 949