aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/bluetooth
diff options
context:
space:
mode:
authorDavid Herrmann <dh.herrmann@googlemail.com>2012-01-07 09:47:15 -0500
committerJohan Hedberg <johan.hedberg@intel.com>2012-02-13 10:01:23 -0500
commit1a609a0a9375cc1fc2097dc697d08fb278a4c764 (patch)
tree217b7a2d5d7cb707de6ed9826e2cd2fafeed3a66 /drivers/bluetooth
parentbf18c7118cf83ad4b9aa476354b4a06bcb9d0c4f (diff)
Bluetooth: bfusb: Free driver_data on USB shutdown
This frees the private driver data on USB shutdown instead of using the hci-destruct callback. We already call usb_set_intfdata(intf, NULL) but we do not do the same with the hci object. This would be totally safe, though. After calling hci_unregister_dev()/hci_free_dev() the hdev object will never call any callback of us again except the destruct callback. Therefore, we can safely set the destruct callback to NULL and free the driver data right away. This allows to unload the module without waiting for the hdev device to be released. Signed-off-by: David Herrmann <dh.herrmann@googlemail.com> Acked-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Diffstat (limited to 'drivers/bluetooth')
-rw-r--r--drivers/bluetooth/bfusb.c11
1 files changed, 1 insertions, 10 deletions
diff --git a/drivers/bluetooth/bfusb.c b/drivers/bluetooth/bfusb.c
index a323baee51b0..e99ce89e1cad 100644
--- a/drivers/bluetooth/bfusb.c
+++ b/drivers/bluetooth/bfusb.c
@@ -544,15 +544,6 @@ static int bfusb_send_frame(struct sk_buff *skb)
544 return 0; 544 return 0;
545} 545}
546 546
547static void bfusb_destruct(struct hci_dev *hdev)
548{
549 struct bfusb_data *data = hdev->driver_data;
550
551 BT_DBG("hdev %p bfusb %p", hdev, data);
552
553 kfree(data);
554}
555
556static int bfusb_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned long arg) 547static int bfusb_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned long arg)
557{ 548{
558 return -ENOIOCTLCMD; 549 return -ENOIOCTLCMD;
@@ -712,7 +703,6 @@ static int bfusb_probe(struct usb_interface *intf, const struct usb_device_id *i
712 hdev->close = bfusb_close; 703 hdev->close = bfusb_close;
713 hdev->flush = bfusb_flush; 704 hdev->flush = bfusb_flush;
714 hdev->send = bfusb_send_frame; 705 hdev->send = bfusb_send_frame;
715 hdev->destruct = bfusb_destruct;
716 hdev->ioctl = bfusb_ioctl; 706 hdev->ioctl = bfusb_ioctl;
717 707
718 hdev->owner = THIS_MODULE; 708 hdev->owner = THIS_MODULE;
@@ -753,6 +743,7 @@ static void bfusb_disconnect(struct usb_interface *intf)
753 743
754 hci_unregister_dev(hdev); 744 hci_unregister_dev(hdev);
755 hci_free_dev(hdev); 745 hci_free_dev(hdev);
746 kfree(data);
756} 747}
757 748
758static struct usb_driver bfusb_driver = { 749static struct usb_driver bfusb_driver = {