===== include/net/bluetooth/hci_core.h 1.31 vs edited ===== --- 1.31/include/net/bluetooth/hci_core.h 2004-12-26 11:58:47 +01:00 +++ edited/include/net/bluetooth/hci_core.h 2005-02-02 05:05:57 +01:00 @@ -119,6 +119,8 @@ struct hci_dev_stats stat; + struct sk_buff_head driver_init; + void *driver_data; void *core_data; ===== net/bluetooth/hci_core.c 1.35 vs edited ===== --- 1.35/net/bluetooth/hci_core.c 2005-01-29 03:27:20 +01:00 +++ edited/net/bluetooth/hci_core.c 2005-02-02 05:08:45 +01:00 @@ -183,10 +183,22 @@ static void hci_init_req(struct hci_dev *hdev, unsigned long opt) { + struct sk_buff *skb; __u16 param; BT_DBG("%s %ld", hdev->name, opt); + /* Driver initialization */ + + /* Special commands */ + while ((skb = skb_dequeue(&hdev->driver_init))) { + skb->pkt_type = HCI_COMMAND_PKT; + skb->dev = (void *) hdev; + skb_queue_tail(&hdev->cmd_q, skb); + hci_sched_cmd(hdev); + } + skb_queue_purge(&hdev->driver_init); + /* Mandatory initialization */ /* Reset */ @@ -792,6 +804,8 @@ memset(hdev, 0, sizeof(struct hci_dev)); + skb_queue_head_init(&hdev->driver_init); + return hdev; } EXPORT_SYMBOL(hci_alloc_dev); @@ -799,6 +813,8 @@ /* Free HCI device */ void hci_free_dev(struct hci_dev *hdev) { + skb_queue_purge(&hdev->driver_init); + /* will free via class release */ class_device_put(&hdev->class_dev); } ===== drivers/bluetooth/hci_usb.h 1.15 vs edited ===== --- 1.15/drivers/bluetooth/hci_usb.h 2005-01-29 03:32:12 +01:00 +++ edited/drivers/bluetooth/hci_usb.h 2005-02-01 01:54:30 +01:00 @@ -33,6 +33,7 @@ #define HCI_DIGIANSWER 0x04 #define HCI_SNIFFER 0x08 #define HCI_BROKEN_ISOC 0x10 +#define HCI_BCM92035 0x20 #define HCI_MAX_IFACE_NUM 3 ===== drivers/bluetooth/hci_usb.c 1.65 vs edited ===== --- 1.65/drivers/bluetooth/hci_usb.c 2005-01-29 03:32:51 +01:00 +++ edited/drivers/bluetooth/hci_usb.c 2005-02-02 05:09:09 +01:00 @@ -73,7 +73,7 @@ static int isoc = 2; #endif -#define VERSION "2.7" +#define VERSION "2.8" static struct usb_driver hci_usb_driver; @@ -104,11 +104,11 @@ { USB_DEVICE(0x0a5c, 0x2033), .driver_info = HCI_IGNORE }, /* Broadcom BCM2035 */ - { USB_DEVICE(0x0a5c, 0x2009), .driver_info = HCI_RESET | HCI_BROKEN_ISOC }, + { USB_DEVICE(0x0a5c, 0x2009), .driver_info = HCI_BCM92035 }, { USB_DEVICE(0x0a5c, 0x200a), .driver_info = HCI_RESET | HCI_BROKEN_ISOC }, /* Microsoft Wireless Transceiver for Bluetooth 2.0 */ - { USB_DEVICE(0x045e, 0x009c), .driver_info = HCI_RESET | HCI_BROKEN_ISOC }, + { USB_DEVICE(0x045e, 0x009c), .driver_info = HCI_BCM92035 }, /* ISSC Bluetooth Adapter v3.1 */ { USB_DEVICE(0x1131, 0x1001), .driver_info = HCI_RESET }, @@ -975,6 +975,17 @@ if (id->driver_info & HCI_SNIFFER) { if (le16_to_cpu(udev->descriptor.bcdDevice) > 0x997) set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks); + } + + if (id->driver_info & HCI_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 (hci_register_dev(hdev) < 0) {