diff options
author | Johan Hedberg <johan.hedberg@intel.com> | 2012-10-19 13:57:45 -0400 |
---|---|---|
committer | Gustavo Padovan <gustavo.padovan@collabora.co.uk> | 2012-10-24 09:11:04 -0400 |
commit | e1171e8d9c50c38a9adba72bb23949d9b975335c (patch) | |
tree | ba32884946ac9cad44ebee3664e0da89d09301df /net/bluetooth/hci_event.c | |
parent | 2ad8f54bc86809c2a8de3830e3ed275fcc6401ed (diff) |
Bluetooth: Add initial support for LE-only controllers
This patch splits off most the HCI init sequence commands from a fixed
set into a conditional one that is sent once the HCI_Read_Local_Features
and HCI_Read_Local_Version_Information commands complete. This is
necessary since many of the current fixed commands are not allowed for
LE-only controllers.
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Acked-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Diffstat (limited to 'net/bluetooth/hci_event.c')
-rw-r--r-- | net/bluetooth/hci_event.c | 58 |
1 files changed, 53 insertions, 5 deletions
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 0383635f91fb..f4f0b8bfdee6 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c | |||
@@ -507,11 +507,13 @@ static void hci_setup_event_mask(struct hci_dev *hdev) | |||
507 | if (hdev->hci_ver < BLUETOOTH_VER_1_2) | 507 | if (hdev->hci_ver < BLUETOOTH_VER_1_2) |
508 | return; | 508 | return; |
509 | 509 | ||
510 | events[4] |= 0x01; /* Flow Specification Complete */ | 510 | if (lmp_bredr_capable(hdev)) { |
511 | events[4] |= 0x02; /* Inquiry Result with RSSI */ | 511 | events[4] |= 0x01; /* Flow Specification Complete */ |
512 | events[4] |= 0x04; /* Read Remote Extended Features Complete */ | 512 | events[4] |= 0x02; /* Inquiry Result with RSSI */ |
513 | events[5] |= 0x08; /* Synchronous Connection Complete */ | 513 | events[4] |= 0x04; /* Read Remote Extended Features Complete */ |
514 | events[5] |= 0x10; /* Synchronous Connection Changed */ | 514 | events[5] |= 0x08; /* Synchronous Connection Complete */ |
515 | events[5] |= 0x10; /* Synchronous Connection Changed */ | ||
516 | } | ||
515 | 517 | ||
516 | if (hdev->features[3] & LMP_RSSI_INQ) | 518 | if (hdev->features[3] & LMP_RSSI_INQ) |
517 | events[4] |= 0x02; /* Inquiry Result with RSSI */ | 519 | events[4] |= 0x02; /* Inquiry Result with RSSI */ |
@@ -550,11 +552,57 @@ static void hci_setup_event_mask(struct hci_dev *hdev) | |||
550 | hci_send_cmd(hdev, HCI_OP_SET_EVENT_MASK, sizeof(events), events); | 552 | hci_send_cmd(hdev, HCI_OP_SET_EVENT_MASK, sizeof(events), events); |
551 | } | 553 | } |
552 | 554 | ||
555 | static void bredr_init(struct hci_dev *hdev) | ||
556 | { | ||
557 | struct hci_cp_delete_stored_link_key cp; | ||
558 | __le16 param; | ||
559 | __u8 flt_type; | ||
560 | |||
561 | /* Read Buffer Size (ACL mtu, max pkt, etc.) */ | ||
562 | hci_send_cmd(hdev, HCI_OP_READ_BUFFER_SIZE, 0, NULL); | ||
563 | |||
564 | /* Read Class of Device */ | ||
565 | hci_send_cmd(hdev, HCI_OP_READ_CLASS_OF_DEV, 0, NULL); | ||
566 | |||
567 | /* Read Local Name */ | ||
568 | hci_send_cmd(hdev, HCI_OP_READ_LOCAL_NAME, 0, NULL); | ||
569 | |||
570 | /* Read Voice Setting */ | ||
571 | hci_send_cmd(hdev, HCI_OP_READ_VOICE_SETTING, 0, NULL); | ||
572 | |||
573 | /* Clear Event Filters */ | ||
574 | flt_type = HCI_FLT_CLEAR_ALL; | ||
575 | hci_send_cmd(hdev, HCI_OP_SET_EVENT_FLT, 1, &flt_type); | ||
576 | |||
577 | /* Connection accept timeout ~20 secs */ | ||
578 | param = __constant_cpu_to_le16(0x7d00); | ||
579 | hci_send_cmd(hdev, HCI_OP_WRITE_CA_TIMEOUT, 2, ¶m); | ||
580 | |||
581 | bacpy(&cp.bdaddr, BDADDR_ANY); | ||
582 | cp.delete_all = 1; | ||
583 | hci_send_cmd(hdev, HCI_OP_DELETE_STORED_LINK_KEY, sizeof(cp), &cp); | ||
584 | } | ||
585 | |||
586 | static void le_init(struct hci_dev *hdev) | ||
587 | { | ||
588 | /* Read LE Buffer Size */ | ||
589 | hci_send_cmd(hdev, HCI_OP_LE_READ_BUFFER_SIZE, 0, NULL); | ||
590 | } | ||
591 | |||
553 | static void hci_setup(struct hci_dev *hdev) | 592 | static void hci_setup(struct hci_dev *hdev) |
554 | { | 593 | { |
555 | if (hdev->dev_type != HCI_BREDR) | 594 | if (hdev->dev_type != HCI_BREDR) |
556 | return; | 595 | return; |
557 | 596 | ||
597 | /* Read BD Address */ | ||
598 | hci_send_cmd(hdev, HCI_OP_READ_BD_ADDR, 0, NULL); | ||
599 | |||
600 | if (lmp_bredr_capable(hdev)) | ||
601 | bredr_init(hdev); | ||
602 | |||
603 | if (lmp_le_capable(hdev)) | ||
604 | le_init(hdev); | ||
605 | |||
558 | hci_setup_event_mask(hdev); | 606 | hci_setup_event_mask(hdev); |
559 | 607 | ||
560 | if (hdev->hci_ver > BLUETOOTH_VER_1_1) | 608 | if (hdev->hci_ver > BLUETOOTH_VER_1_1) |