Apply patch for setting bluetooth mac address.
Change-Id: I76568d0643927d279f22d2d2b1067885745fc529
diff --git a/drivers/bluetooth/btbcm.c b/drivers/bluetooth/btbcm.c
index 728fce3..9039b47 100644
--- a/drivers/bluetooth/btbcm.c
+++ b/drivers/bluetooth/btbcm.c
@@ -23,6 +23,8 @@
#include <linux/module.h>
#include <linux/firmware.h>
+#include <linux/kernel.h>
+#include <linux/ctype.h>
#include <asm/unaligned.h>
#include <net/bluetooth/bluetooth.h>
@@ -34,6 +36,8 @@
#define BDADDR_BCM20702A0 (&(bdaddr_t) {{0x00, 0xa0, 0x02, 0x70, 0x20, 0x00}})
+static char *bdaddr_base;
+
int btbcm_check_bdaddr(struct hci_dev *hdev)
{
struct hci_rp_read_bd_addr *bda;
@@ -262,6 +266,62 @@
{ }
};
+static int bachk(const char *str)
+{
+ if (!str)
+ return -1;
+
+ if (strlen(str) != 17)
+ return -1;
+
+ while (*str) {
+ if (!isxdigit(*str++))
+ return -1;
+
+ if (!isxdigit(*str++))
+ return -1;
+
+ if (*str == 0)
+ break;
+
+ if (*str++ != ':')
+ return -1;
+ }
+
+ return 0;
+}
+
+static int str2ba(const char *str, bdaddr_t *ba)
+{
+ int i;
+
+ if (bachk(str) < 0) {
+ memset(ba, 0, sizeof(*ba));
+ return -1;
+ }
+
+ for (i = 5; i >= 0; i--, str += 3)
+ ba->b[i] = simple_strtol(str, NULL, 16);
+
+ return 0;
+}
+
+static void btbcm_set_bdaddr_base(struct hci_dev *hdev)
+{
+ bdaddr_t addr;
+
+ if (!bdaddr_base)
+ return;
+
+ if (str2ba(bdaddr_base, &addr) < 0) {
+ BT_ERR("bdaddr_base is invalid");
+ return;
+ }
+
+ btbcm_set_bdaddr(hdev, &addr);
+ btbcm_reset(hdev);
+}
+
int btbcm_setup_patchram(struct hci_dev *hdev)
{
char fw_name[64];
@@ -358,6 +418,8 @@
hw_name ? : "BCM", (subver & 0x7000) >> 13,
(subver & 0x1f00) >> 8, (subver & 0x00ff), rev & 0x0fff);
+ btbcm_set_bdaddr_base(hdev);
+
btbcm_check_bdaddr(hdev);
set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
@@ -385,6 +447,9 @@
}
EXPORT_SYMBOL_GPL(btbcm_setup_apple);
+module_param(bdaddr_base, charp, 0644);
+MODULE_PARM_DESC(bdaddr_base, "Bluetooth adapter base address");
+
MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
MODULE_DESCRIPTION("Bluetooth support for Broadcom devices ver " VERSION);
MODULE_VERSION(VERSION);