diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2012-11-12 14:02:15 +0900 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@intel.com> | 2013-04-04 19:28:10 +0300 |
commit | 936009976497e1e123f3223bedca25312ee20f08 (patch) | |
tree | d98744b01d0caf3dfdde4135d2da8e5d325fb844 /drivers | |
parent | f41c70c4d5e3f6c2a7f9e5dfc10af452591a2484 (diff) |
Bluetooth: Convert BCM92035 support to driver setup callback
With the early init stage during setup, this quirk can be simplified
and kept fully inside the driver.
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/bluetooth/btusb.c | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index b82c0964dc54..35c967f5b9fc 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c @@ -246,6 +246,7 @@ struct btusb_data { struct usb_endpoint_descriptor *isoc_rx_ep; __u8 cmdreq_type; + unsigned long driver_info; unsigned int sco_num; int isoc_altsetting; @@ -699,6 +700,26 @@ static int btusb_flush(struct hci_dev *hdev) return 0; } +static int btusb_setup(struct hci_dev *hdev) +{ + struct btusb_data *data = hci_get_drvdata(hdev); + + BT_DBG("%s", hdev->name); + + if (data->driver_info & BTUSB_BCM92035) { + struct sk_buff *skb; + __u8 val = 0x00; + + skb = __hci_cmd_sync(hdev, 0xfc3b, 1, &val, HCI_INIT_TIMEOUT); + if (IS_ERR(skb)) + BT_ERR("BCM92035 command failed (%ld)", -PTR_ERR(skb)); + else + kfree_skb(skb); + } + + return 0; +} + static int btusb_send_frame(struct sk_buff *skb) { struct hci_dev *hdev = (struct hci_dev *) skb->dev; @@ -996,6 +1017,7 @@ static int btusb_probe(struct usb_interface *intf, return -ENODEV; data->cmdreq_type = USB_TYPE_CLASS; + data->driver_info = id->driver_info; data->udev = interface_to_usbdev(intf); data->intf = intf; @@ -1026,6 +1048,7 @@ static int btusb_probe(struct usb_interface *intf, hdev->open = btusb_open; hdev->close = btusb_close; hdev->flush = btusb_flush; + hdev->setup = btusb_setup; hdev->send = btusb_send_frame; hdev->notify = btusb_notify; @@ -1066,17 +1089,6 @@ static int btusb_probe(struct usb_interface *intf, data->isoc = NULL; } - if (id->driver_info & BTUSB_BCM92035) { - unsigned char cmd[] = { 0x3b, 0xfc, 0x01, 0x00 }; - struct sk_buff *skb; - - skb = bt_skb_alloc(sizeof(cmd), GFP_KERNEL); - if (skb) { - memcpy(skb_put(skb, sizeof(cmd)), cmd, sizeof(cmd)); - skb_queue_tail(&hdev->driver_init, skb); - } - } - if (data->isoc) { err = usb_driver_claim_interface(&btusb_driver, data->isoc, data); |