Bluetooth: btusb: add support for BCM20702A0 [0a5c:21e6]
[pandora-kernel.git] / drivers / bluetooth / btusb.c
index f00f596..22f695e 100644 (file)
@@ -102,6 +102,8 @@ static struct usb_device_id btusb_table[] = {
 
        /* Broadcom BCM20702A0 */
        { USB_DEVICE(0x0a5c, 0x21e3) },
+       { USB_DEVICE(0x0a5c, 0x21e6) },
+       { USB_DEVICE(0x0a5c, 0x21f3) },
        { USB_DEVICE(0x413c, 0x8197) },
 
        { }     /* Terminating entry */
@@ -120,6 +122,7 @@ static struct usb_device_id blacklist_table[] = {
        { USB_DEVICE(0x0cf3, 0x3002), .driver_info = BTUSB_IGNORE },
        { USB_DEVICE(0x13d3, 0x3304), .driver_info = BTUSB_IGNORE },
        { USB_DEVICE(0x0930, 0x0215), .driver_info = BTUSB_IGNORE },
+       { USB_DEVICE(0x0489, 0xe03d), .driver_info = BTUSB_IGNORE },
 
        /* Atheros AR9285 Malbec with sflash firmware */
        { USB_DEVICE(0x03f0, 0x311d), .driver_info = BTUSB_IGNORE },
@@ -242,7 +245,7 @@ static int inc_tx(struct btusb_data *data)
 static void btusb_intr_complete(struct urb *urb)
 {
        struct hci_dev *hdev = urb->context;
-       struct btusb_data *data = hdev->driver_data;
+       struct btusb_data *data = hci_get_drvdata(hdev);
        int err;
 
        BT_DBG("%s urb %p status %d count %d", hdev->name,
@@ -281,7 +284,7 @@ static void btusb_intr_complete(struct urb *urb)
 
 static int btusb_submit_intr_urb(struct hci_dev *hdev, gfp_t mem_flags)
 {
-       struct btusb_data *data = hdev->driver_data;
+       struct btusb_data *data = hci_get_drvdata(hdev);
        struct urb *urb;
        unsigned char *buf;
        unsigned int pipe;
@@ -330,7 +333,7 @@ static int btusb_submit_intr_urb(struct hci_dev *hdev, gfp_t mem_flags)
 static void btusb_bulk_complete(struct urb *urb)
 {
        struct hci_dev *hdev = urb->context;
-       struct btusb_data *data = hdev->driver_data;
+       struct btusb_data *data = hci_get_drvdata(hdev);
        int err;
 
        BT_DBG("%s urb %p status %d count %d", hdev->name,
@@ -369,7 +372,7 @@ static void btusb_bulk_complete(struct urb *urb)
 
 static int btusb_submit_bulk_urb(struct hci_dev *hdev, gfp_t mem_flags)
 {
-       struct btusb_data *data = hdev->driver_data;
+       struct btusb_data *data = hci_get_drvdata(hdev);
        struct urb *urb;
        unsigned char *buf;
        unsigned int pipe;
@@ -416,7 +419,7 @@ static int btusb_submit_bulk_urb(struct hci_dev *hdev, gfp_t mem_flags)
 static void btusb_isoc_complete(struct urb *urb)
 {
        struct hci_dev *hdev = urb->context;
-       struct btusb_data *data = hdev->driver_data;
+       struct btusb_data *data = hci_get_drvdata(hdev);
        int i, err;
 
        BT_DBG("%s urb %p status %d count %d", hdev->name,
@@ -483,7 +486,7 @@ static inline void __fill_isoc_descriptor(struct urb *urb, int len, int mtu)
 
 static int btusb_submit_isoc_urb(struct hci_dev *hdev, gfp_t mem_flags)
 {
-       struct btusb_data *data = hdev->driver_data;
+       struct btusb_data *data = hci_get_drvdata(hdev);
        struct urb *urb;
        unsigned char *buf;
        unsigned int pipe;
@@ -536,7 +539,7 @@ static void btusb_tx_complete(struct urb *urb)
 {
        struct sk_buff *skb = urb->context;
        struct hci_dev *hdev = (struct hci_dev *) skb->dev;
-       struct btusb_data *data = hdev->driver_data;
+       struct btusb_data *data = hci_get_drvdata(hdev);
 
        BT_DBG("%s urb %p status %d count %d", hdev->name,
                                        urb, urb->status, urb->actual_length);
@@ -583,7 +586,7 @@ done:
 
 static int btusb_open(struct hci_dev *hdev)
 {
-       struct btusb_data *data = hdev->driver_data;
+       struct btusb_data *data = hci_get_drvdata(hdev);
        int err;
 
        BT_DBG("%s", hdev->name);
@@ -633,7 +636,7 @@ static void btusb_stop_traffic(struct btusb_data *data)
 
 static int btusb_close(struct hci_dev *hdev)
 {
-       struct btusb_data *data = hdev->driver_data;
+       struct btusb_data *data = hci_get_drvdata(hdev);
        int err;
 
        BT_DBG("%s", hdev->name);
@@ -663,7 +666,7 @@ failed:
 
 static int btusb_flush(struct hci_dev *hdev)
 {
-       struct btusb_data *data = hdev->driver_data;
+       struct btusb_data *data = hci_get_drvdata(hdev);
 
        BT_DBG("%s", hdev->name);
 
@@ -675,7 +678,7 @@ static int btusb_flush(struct hci_dev *hdev)
 static int btusb_send_frame(struct sk_buff *skb)
 {
        struct hci_dev *hdev = (struct hci_dev *) skb->dev;
-       struct btusb_data *data = hdev->driver_data;
+       struct btusb_data *data = hci_get_drvdata(hdev);
        struct usb_ctrlrequest *dr;
        struct urb *urb;
        unsigned int pipe;
@@ -726,9 +729,6 @@ static int btusb_send_frame(struct sk_buff *skb)
                usb_fill_bulk_urb(urb, data->udev, pipe,
                                skb->data, skb->len, btusb_tx_complete, skb);
 
-               if (skb->priority >= HCI_PRIO_MAX - 1)
-                       urb->transfer_flags  = URB_ISO_ASAP;
-
                hdev->stat.acl_tx++;
                break;
 
@@ -786,18 +786,9 @@ done:
        return err;
 }
 
-static void btusb_destruct(struct hci_dev *hdev)
-{
-       struct btusb_data *data = hdev->driver_data;
-
-       BT_DBG("%s", hdev->name);
-
-       kfree(data);
-}
-
 static void btusb_notify(struct hci_dev *hdev, unsigned int evt)
 {
-       struct btusb_data *data = hdev->driver_data;
+       struct btusb_data *data = hci_get_drvdata(hdev);
 
        BT_DBG("%s evt %d", hdev->name, evt);
 
@@ -809,7 +800,7 @@ static void btusb_notify(struct hci_dev *hdev, unsigned int evt)
 
 static inline int __set_isoc_interface(struct hci_dev *hdev, int altsetting)
 {
-       struct btusb_data *data = hdev->driver_data;
+       struct btusb_data *data = hci_get_drvdata(hdev);
        struct usb_interface *intf = data->isoc;
        struct usb_endpoint_descriptor *ep_desc;
        int i, err;
@@ -997,7 +988,7 @@ static int btusb_probe(struct usb_interface *intf,
        }
 
        hdev->bus = HCI_USB;
-       hdev->driver_data = data;
+       hci_set_drvdata(hdev, data);
 
        data->hdev = hdev;
 
@@ -1007,11 +998,8 @@ static int btusb_probe(struct usb_interface *intf,
        hdev->close    = btusb_close;
        hdev->flush    = btusb_flush;
        hdev->send     = btusb_send_frame;
-       hdev->destruct = btusb_destruct;
        hdev->notify   = btusb_notify;
 
-       hdev->owner = THIS_MODULE;
-
        /* Interface numbers are hardcoded in the specification */
        data->isoc = usb_ifnum_to_if(data->udev, 1);
 
@@ -1093,9 +1081,6 @@ static void btusb_disconnect(struct usb_interface *intf)
                return;
 
        hdev = data->hdev;
-
-       __hci_dev_hold(hdev);
-
        usb_set_intfdata(data->intf, NULL);
 
        if (data->isoc)
@@ -1108,9 +1093,8 @@ static void btusb_disconnect(struct usb_interface *intf)
        else if (data->isoc)
                usb_driver_release_interface(&btusb_driver, data->isoc);
 
-       __hci_dev_put(hdev);
-
        hci_free_dev(hdev);
+       kfree(data);
 }
 
 #ifdef CONFIG_PM