|
@@ -264,10 +264,36 @@ static int hci_uart_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
|
|
|
static int hci_uart_setup(struct hci_dev *hdev)
|
|
|
{
|
|
|
struct hci_uart *hu = hci_get_drvdata(hdev);
|
|
|
+ struct hci_rp_read_local_version *ver;
|
|
|
+ struct sk_buff *skb;
|
|
|
|
|
|
if (hu->proto->setup)
|
|
|
return hu->proto->setup(hu);
|
|
|
|
|
|
+ if (!test_bit(HCI_UART_VND_DETECT, &hu->hdev_flags))
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ skb = __hci_cmd_sync(hdev, HCI_OP_READ_LOCAL_VERSION, 0, NULL,
|
|
|
+ HCI_INIT_TIMEOUT);
|
|
|
+ if (IS_ERR(skb)) {
|
|
|
+ BT_ERR("%s: Reading local version information failed (%ld)",
|
|
|
+ hdev->name, PTR_ERR(skb));
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (skb->len != sizeof(*ver)) {
|
|
|
+ BT_ERR("%s: Event length mismatch for version information",
|
|
|
+ hdev->name);
|
|
|
+ goto done;
|
|
|
+ }
|
|
|
+
|
|
|
+ ver = (struct hci_rp_read_local_version *)skb->data;
|
|
|
+
|
|
|
+ switch (le16_to_cpu(ver->manufacturer)) {
|
|
|
+ }
|
|
|
+
|
|
|
+done:
|
|
|
+ kfree_skb(skb);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -497,7 +523,8 @@ static int hci_uart_set_flags(struct hci_uart *hu, unsigned long flags)
|
|
|
BIT(HCI_UART_RESET_ON_INIT) |
|
|
|
BIT(HCI_UART_CREATE_AMP) |
|
|
|
BIT(HCI_UART_INIT_PENDING) |
|
|
|
- BIT(HCI_UART_EXT_CONFIG);
|
|
|
+ BIT(HCI_UART_EXT_CONFIG) |
|
|
|
+ BIT(HCI_UART_VND_DETECT);
|
|
|
|
|
|
if (flags & ~valid_flags)
|
|
|
return -EINVAL;
|