aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/bluetooth
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2015-04-06 01:52:11 -0400
committerMarcel Holtmann <marcel@holtmann.org>2015-04-07 12:47:11 -0400
commit1df1f5910825821ebac5eb1a74da2af8fdcaebf3 (patch)
tree14f1461a25ab621e422041ac2ddf2a909ac04429 /drivers/bluetooth
parent4fba30f07f51617438835f75b58e37fb610b2d8d (diff)
Bluetooth: btusb: Use generic functionality by Broadcom module
The new Broadcom Bluetooth support module provides generic functionality for changing and checking the Bluetooth device address. Use these new features instead of keeping a duplicate in the driver. Signed-off-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Diffstat (limited to 'drivers/bluetooth')
-rw-r--r--drivers/bluetooth/Kconfig1
-rw-r--r--drivers/bluetooth/btusb.c62
2 files changed, 5 insertions, 58 deletions
diff --git a/drivers/bluetooth/Kconfig b/drivers/bluetooth/Kconfig
index 4fbe067cd33a..b593e5f766df 100644
--- a/drivers/bluetooth/Kconfig
+++ b/drivers/bluetooth/Kconfig
@@ -8,6 +8,7 @@ config BT_BCM
8config BT_HCIBTUSB 8config BT_HCIBTUSB
9 tristate "HCI USB driver" 9 tristate "HCI USB driver"
10 depends on USB 10 depends on USB
11 select BT_BCM
11 help 12 help
12 Bluetooth HCI USB driver. 13 Bluetooth HCI USB driver.
13 This driver is required if you want to use Bluetooth devices with 14 This driver is required if you want to use Bluetooth devices with
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index 6e4ff16e487b..08561ad7a638 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -29,6 +29,8 @@
29#include <net/bluetooth/bluetooth.h> 29#include <net/bluetooth/bluetooth.h>
30#include <net/bluetooth/hci_core.h> 30#include <net/bluetooth/hci_core.h>
31 31
32#include "btbcm.h"
33
32#define VERSION "0.7" 34#define VERSION "0.7"
33 35
34static bool disable_scofix; 36static bool disable_scofix;
@@ -2418,8 +2420,6 @@ static const struct {
2418 { } 2420 { }
2419}; 2421};
2420 2422
2421#define BDADDR_BCM20702A0 (&(bdaddr_t) {{0x00, 0xa0, 0x02, 0x70, 0x20, 0x00}})
2422
2423static int btusb_setup_bcm_patchram(struct hci_dev *hdev) 2423static int btusb_setup_bcm_patchram(struct hci_dev *hdev)
2424{ 2424{
2425 struct btusb_data *data = hci_get_drvdata(hdev); 2425 struct btusb_data *data = hci_get_drvdata(hdev);
@@ -2434,7 +2434,6 @@ static int btusb_setup_bcm_patchram(struct hci_dev *hdev)
2434 const char *hw_name = NULL; 2434 const char *hw_name = NULL;
2435 struct sk_buff *skb; 2435 struct sk_buff *skb;
2436 struct hci_rp_read_local_version *ver; 2436 struct hci_rp_read_local_version *ver;
2437 struct hci_rp_read_bd_addr *bda;
2438 long ret; 2437 long ret;
2439 int i; 2438 int i;
2440 2439
@@ -2572,43 +2571,7 @@ reset_fw:
2572 hw_name ? : "BCM", (subver & 0x7000) >> 13, 2571 hw_name ? : "BCM", (subver & 0x7000) >> 13,
2573 (subver & 0x1f00) >> 8, (subver & 0x00ff), rev & 0x0fff); 2572 (subver & 0x1f00) >> 8, (subver & 0x00ff), rev & 0x0fff);
2574 2573
2575 /* Read BD Address */ 2574 btbcm_check_bdaddr(hdev);
2576 skb = __hci_cmd_sync(hdev, HCI_OP_READ_BD_ADDR, 0, NULL,
2577 HCI_INIT_TIMEOUT);
2578 if (IS_ERR(skb)) {
2579 ret = PTR_ERR(skb);
2580 BT_ERR("%s: HCI_OP_READ_BD_ADDR failed (%ld)",
2581 hdev->name, ret);
2582 goto done;
2583 }
2584
2585 if (skb->len != sizeof(*bda)) {
2586 BT_ERR("%s: HCI_OP_READ_BD_ADDR event length mismatch",
2587 hdev->name);
2588 kfree_skb(skb);
2589 ret = -EIO;
2590 goto done;
2591 }
2592
2593 bda = (struct hci_rp_read_bd_addr *)skb->data;
2594 if (bda->status) {
2595 BT_ERR("%s: HCI_OP_READ_BD_ADDR error status (%02x)",
2596 hdev->name, bda->status);
2597 kfree_skb(skb);
2598 ret = -bt_to_errno(bda->status);
2599 goto done;
2600 }
2601
2602 /* The address 00:20:70:02:A0:00 indicates a BCM20702A0 controller
2603 * with no configured address.
2604 */
2605 if (!bacmp(&bda->bdaddr, BDADDR_BCM20702A0)) {
2606 BT_INFO("%s: BCM: using default device address (%pMR)",
2607 hdev->name, &bda->bdaddr);
2608 set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks);
2609 }
2610
2611 kfree_skb(skb);
2612 2575
2613done: 2576done:
2614 release_firmware(fw); 2577 release_firmware(fw);
@@ -2616,23 +2579,6 @@ done:
2616 return ret; 2579 return ret;
2617} 2580}
2618 2581
2619static int btusb_set_bdaddr_bcm(struct hci_dev *hdev, const bdaddr_t *bdaddr)
2620{
2621 struct sk_buff *skb;
2622 long ret;
2623
2624 skb = __hci_cmd_sync(hdev, 0xfc01, 6, bdaddr, HCI_INIT_TIMEOUT);
2625 if (IS_ERR(skb)) {
2626 ret = PTR_ERR(skb);
2627 BT_ERR("%s: BCM: Change address command failed (%ld)",
2628 hdev->name, ret);
2629 return ret;
2630 }
2631 kfree_skb(skb);
2632
2633 return 0;
2634}
2635
2636static int btusb_setup_bcm_apple(struct hci_dev *hdev) 2582static int btusb_setup_bcm_apple(struct hci_dev *hdev)
2637{ 2583{
2638 struct sk_buff *skb; 2584 struct sk_buff *skb;
@@ -3056,7 +3002,7 @@ static int btusb_probe(struct usb_interface *intf,
3056 3002
3057 if (id->driver_info & BTUSB_BCM_PATCHRAM) { 3003 if (id->driver_info & BTUSB_BCM_PATCHRAM) {
3058 hdev->setup = btusb_setup_bcm_patchram; 3004 hdev->setup = btusb_setup_bcm_patchram;
3059 hdev->set_bdaddr = btusb_set_bdaddr_bcm; 3005 hdev->set_bdaddr = btbcm_set_bdaddr;
3060 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks); 3006 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
3061 } 3007 }
3062 3008