Commit 4185a0f5 authored by Marcel Holtmann's avatar Marcel Holtmann

Bluetooth: btusb: Use generic Intel support for address support

The Bluetooth address handling for Intel devices is provided by a generic
module now. Start using that module instead of relying it being included
in the driver.
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
Signed-off-by: default avatarJohan Hedberg <johan.hedberg@intel.com>
parent 48f0ed1b
...@@ -12,6 +12,7 @@ config BT_BCM ...@@ -12,6 +12,7 @@ config BT_BCM
config BT_HCIBTUSB config BT_HCIBTUSB
tristate "HCI USB driver" tristate "HCI USB driver"
depends on USB depends on USB
select BT_INTEL
help help
Bluetooth HCI USB driver. Bluetooth HCI USB driver.
This driver is required if you want to use Bluetooth devices with This driver is required if you want to use Bluetooth devices with
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include <net/bluetooth/bluetooth.h> #include <net/bluetooth/bluetooth.h>
#include <net/bluetooth/hci_core.h> #include <net/bluetooth/hci_core.h>
#include "btintel.h"
#include "btbcm.h" #include "btbcm.h"
#define VERSION "0.8" #define VERSION "0.8"
...@@ -1533,51 +1534,6 @@ static int btusb_setup_intel_patching(struct hci_dev *hdev, ...@@ -1533,51 +1534,6 @@ static int btusb_setup_intel_patching(struct hci_dev *hdev,
return 0; return 0;
} }
#define BDADDR_INTEL (&(bdaddr_t) {{0x00, 0x8b, 0x9e, 0x19, 0x03, 0x00}})
static int btusb_check_bdaddr_intel(struct hci_dev *hdev)
{
struct sk_buff *skb;
struct hci_rp_read_bd_addr *rp;
skb = __hci_cmd_sync(hdev, HCI_OP_READ_BD_ADDR, 0, NULL,
HCI_INIT_TIMEOUT);
if (IS_ERR(skb)) {
BT_ERR("%s reading Intel device address failed (%ld)",
hdev->name, PTR_ERR(skb));
return PTR_ERR(skb);
}
if (skb->len != sizeof(*rp)) {
BT_ERR("%s Intel device address length mismatch", hdev->name);
kfree_skb(skb);
return -EIO;
}
rp = (struct hci_rp_read_bd_addr *)skb->data;
if (rp->status) {
BT_ERR("%s Intel device address result failed (%02x)",
hdev->name, rp->status);
kfree_skb(skb);
return -bt_to_errno(rp->status);
}
/* For some Intel based controllers, the default Bluetooth device
* address 00:03:19:9E:8B:00 can be found. These controllers are
* fully operational, but have the danger of duplicate addresses
* and that in turn can cause problems with Bluetooth operation.
*/
if (!bacmp(&rp->bdaddr, BDADDR_INTEL)) {
BT_ERR("%s found Intel default device address (%pMR)",
hdev->name, &rp->bdaddr);
set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks);
}
kfree_skb(skb);
return 0;
}
static int btusb_setup_intel(struct hci_dev *hdev) static int btusb_setup_intel(struct hci_dev *hdev)
{ {
struct sk_buff *skb; struct sk_buff *skb;
...@@ -1650,7 +1606,7 @@ static int btusb_setup_intel(struct hci_dev *hdev) ...@@ -1650,7 +1606,7 @@ static int btusb_setup_intel(struct hci_dev *hdev)
BT_INFO("%s: Intel device is already patched. patch num: %02x", BT_INFO("%s: Intel device is already patched. patch num: %02x",
hdev->name, ver->fw_patch_num); hdev->name, ver->fw_patch_num);
kfree_skb(skb); kfree_skb(skb);
btusb_check_bdaddr_intel(hdev); btintel_check_bdaddr(hdev);
return 0; return 0;
} }
...@@ -1663,7 +1619,7 @@ static int btusb_setup_intel(struct hci_dev *hdev) ...@@ -1663,7 +1619,7 @@ static int btusb_setup_intel(struct hci_dev *hdev)
fw = btusb_setup_intel_get_fw(hdev, ver); fw = btusb_setup_intel_get_fw(hdev, ver);
if (!fw) { if (!fw) {
kfree_skb(skb); kfree_skb(skb);
btusb_check_bdaddr_intel(hdev); btintel_check_bdaddr(hdev);
return 0; return 0;
} }
fw_ptr = fw->data; fw_ptr = fw->data;
...@@ -1744,7 +1700,7 @@ static int btusb_setup_intel(struct hci_dev *hdev) ...@@ -1744,7 +1700,7 @@ static int btusb_setup_intel(struct hci_dev *hdev)
BT_INFO("%s: Intel Bluetooth firmware patch completed and activated", BT_INFO("%s: Intel Bluetooth firmware patch completed and activated",
hdev->name); hdev->name);
btusb_check_bdaddr_intel(hdev); btintel_check_bdaddr(hdev);
return 0; return 0;
exit_mfg_disable: exit_mfg_disable:
...@@ -1760,7 +1716,7 @@ static int btusb_setup_intel(struct hci_dev *hdev) ...@@ -1760,7 +1716,7 @@ static int btusb_setup_intel(struct hci_dev *hdev)
BT_INFO("%s: Intel Bluetooth firmware patch completed", hdev->name); BT_INFO("%s: Intel Bluetooth firmware patch completed", hdev->name);
btusb_check_bdaddr_intel(hdev); btintel_check_bdaddr(hdev);
return 0; return 0;
exit_mfg_deactivate: exit_mfg_deactivate:
...@@ -1781,7 +1737,7 @@ static int btusb_setup_intel(struct hci_dev *hdev) ...@@ -1781,7 +1737,7 @@ static int btusb_setup_intel(struct hci_dev *hdev)
BT_INFO("%s: Intel Bluetooth firmware patch completed and deactivated", BT_INFO("%s: Intel Bluetooth firmware patch completed and deactivated",
hdev->name); hdev->name);
btusb_check_bdaddr_intel(hdev); btintel_check_bdaddr(hdev);
return 0; return 0;
} }
...@@ -2057,7 +2013,7 @@ static int btusb_setup_intel_new(struct hci_dev *hdev) ...@@ -2057,7 +2013,7 @@ static int btusb_setup_intel_new(struct hci_dev *hdev)
if (ver->fw_variant == 0x23) { if (ver->fw_variant == 0x23) {
kfree_skb(skb); kfree_skb(skb);
clear_bit(BTUSB_BOOTLOADER, &data->flags); clear_bit(BTUSB_BOOTLOADER, &data->flags);
btusb_check_bdaddr_intel(hdev); btintel_check_bdaddr(hdev);
return 0; return 0;
} }
...@@ -2341,23 +2297,6 @@ static void btusb_hw_error_intel(struct hci_dev *hdev, u8 code) ...@@ -2341,23 +2297,6 @@ static void btusb_hw_error_intel(struct hci_dev *hdev, u8 code)
kfree_skb(skb); kfree_skb(skb);
} }
static int btusb_set_bdaddr_intel(struct hci_dev *hdev, const bdaddr_t *bdaddr)
{
struct sk_buff *skb;
long ret;
skb = __hci_cmd_sync(hdev, 0xfc31, 6, bdaddr, HCI_INIT_TIMEOUT);
if (IS_ERR(skb)) {
ret = PTR_ERR(skb);
BT_ERR("%s: changing Intel device address failed (%ld)",
hdev->name, ret);
return ret;
}
kfree_skb(skb);
return 0;
}
static int btusb_shutdown_intel(struct hci_dev *hdev) static int btusb_shutdown_intel(struct hci_dev *hdev)
{ {
struct sk_buff *skb; struct sk_buff *skb;
...@@ -2808,7 +2747,7 @@ static int btusb_probe(struct usb_interface *intf, ...@@ -2808,7 +2747,7 @@ static int btusb_probe(struct usb_interface *intf,
if (id->driver_info & BTUSB_INTEL) { if (id->driver_info & BTUSB_INTEL) {
hdev->setup = btusb_setup_intel; hdev->setup = btusb_setup_intel;
hdev->shutdown = btusb_shutdown_intel; hdev->shutdown = btusb_shutdown_intel;
hdev->set_bdaddr = btusb_set_bdaddr_intel; hdev->set_bdaddr = btintel_set_bdaddr;
set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks); set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks); set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
} }
...@@ -2817,7 +2756,7 @@ static int btusb_probe(struct usb_interface *intf, ...@@ -2817,7 +2756,7 @@ static int btusb_probe(struct usb_interface *intf,
hdev->send = btusb_send_frame_intel; hdev->send = btusb_send_frame_intel;
hdev->setup = btusb_setup_intel_new; hdev->setup = btusb_setup_intel_new;
hdev->hw_error = btusb_hw_error_intel; hdev->hw_error = btusb_hw_error_intel;
hdev->set_bdaddr = btusb_set_bdaddr_intel; hdev->set_bdaddr = btintel_set_bdaddr;
set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks); set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment