aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/bluetooth/btusb.c
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2014-07-02 06:06:45 -0400
committerMarcel Holtmann <marcel@holtmann.org>2014-07-03 11:42:56 -0400
commit40cb0984150e118141a1b1a42f67f6d921ea8e09 (patch)
treeb4f8c896fb0129bde1f0a9d91009161bef00978a /drivers/bluetooth/btusb.c
parent96c2103a57c5c6498138f38df926af6b86ea4e86 (diff)
Bluetooth: Check for default address of Intel USB controllers
Some Intel Bluetooth controllers come with a default address. If this address is found, print an error to warn the user about it. The controller is fully operational, but the danger of duplicate Bluetooth addresses might causes issues. At least with a clear error it becomes easier to debug these cases. Signed-off-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Diffstat (limited to 'drivers/bluetooth/btusb.c')
-rw-r--r--drivers/bluetooth/btusb.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index 66966b9c4244..32aabea731f2 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -1182,6 +1182,49 @@ static int btusb_setup_intel_patching(struct hci_dev *hdev,
1182 return 0; 1182 return 0;
1183} 1183}
1184 1184
1185#define BDADDR_INTEL (&(bdaddr_t) {{0x00, 0x8b, 0x9e, 0x19, 0x03, 0x00}})
1186
1187static int btusb_check_bdaddr_intel(struct hci_dev *hdev)
1188{
1189 struct sk_buff *skb;
1190 struct hci_rp_read_bd_addr *rp;
1191
1192 skb = __hci_cmd_sync(hdev, HCI_OP_READ_BD_ADDR, 0, NULL,
1193 HCI_INIT_TIMEOUT);
1194 if (IS_ERR(skb)) {
1195 BT_ERR("%s reading Intel device address failed (%ld)",
1196 hdev->name, PTR_ERR(skb));
1197 return PTR_ERR(skb);
1198 }
1199
1200 if (skb->len != sizeof(*rp)) {
1201 BT_ERR("%s Intel device address length mismatch", hdev->name);
1202 kfree_skb(skb);
1203 return -EIO;
1204 }
1205
1206 rp = (struct hci_rp_read_bd_addr *) skb->data;
1207 if (rp->status) {
1208 BT_ERR("%s Intel device address result failed (%02x)",
1209 hdev->name, rp->status);
1210 kfree_skb(skb);
1211 return -bt_to_errno(rp->status);
1212 }
1213
1214 /* For some Intel based controllers, the default Bluetooth device
1215 * address 00:03:19:9E:8B:00 can be found. These controllers are
1216 * fully operational, but have the danger of duplicate addresses
1217 * and that in turn can cause problems with Bluetooth operation.
1218 */
1219 if (!bacmp(&rp->bdaddr, BDADDR_INTEL))
1220 BT_ERR("%s found Intel default device address (%pMR)",
1221 hdev->name, &rp->bdaddr);
1222
1223 kfree_skb(skb);
1224
1225 return 0;
1226}
1227
1185static int btusb_setup_intel(struct hci_dev *hdev) 1228static int btusb_setup_intel(struct hci_dev *hdev)
1186{ 1229{
1187 struct sk_buff *skb; 1230 struct sk_buff *skb;
@@ -1254,6 +1297,7 @@ static int btusb_setup_intel(struct hci_dev *hdev)
1254 BT_INFO("%s: Intel device is already patched. patch num: %02x", 1297 BT_INFO("%s: Intel device is already patched. patch num: %02x",
1255 hdev->name, ver->fw_patch_num); 1298 hdev->name, ver->fw_patch_num);
1256 kfree_skb(skb); 1299 kfree_skb(skb);
1300 btusb_check_bdaddr_intel(hdev);
1257 return 0; 1301 return 0;
1258 } 1302 }
1259 1303
@@ -1266,6 +1310,7 @@ static int btusb_setup_intel(struct hci_dev *hdev)
1266 fw = btusb_setup_intel_get_fw(hdev, ver); 1310 fw = btusb_setup_intel_get_fw(hdev, ver);
1267 if (!fw) { 1311 if (!fw) {
1268 kfree_skb(skb); 1312 kfree_skb(skb);
1313 btusb_check_bdaddr_intel(hdev);
1269 return 0; 1314 return 0;
1270 } 1315 }
1271 fw_ptr = fw->data; 1316 fw_ptr = fw->data;
@@ -1345,6 +1390,7 @@ static int btusb_setup_intel(struct hci_dev *hdev)
1345 BT_INFO("%s: Intel Bluetooth firmware patch completed and activated", 1390 BT_INFO("%s: Intel Bluetooth firmware patch completed and activated",
1346 hdev->name); 1391 hdev->name);
1347 1392
1393 btusb_check_bdaddr_intel(hdev);
1348 return 0; 1394 return 0;
1349 1395
1350exit_mfg_disable: 1396exit_mfg_disable:
@@ -1359,6 +1405,8 @@ exit_mfg_disable:
1359 kfree_skb(skb); 1405 kfree_skb(skb);
1360 1406
1361 BT_INFO("%s: Intel Bluetooth firmware patch completed", hdev->name); 1407 BT_INFO("%s: Intel Bluetooth firmware patch completed", hdev->name);
1408
1409 btusb_check_bdaddr_intel(hdev);
1362 return 0; 1410 return 0;
1363 1411
1364exit_mfg_deactivate: 1412exit_mfg_deactivate:
@@ -1379,6 +1427,7 @@ exit_mfg_deactivate:
1379 BT_INFO("%s: Intel Bluetooth firmware patch completed and deactivated", 1427 BT_INFO("%s: Intel Bluetooth firmware patch completed and deactivated",
1380 hdev->name); 1428 hdev->name);
1381 1429
1430 btusb_check_bdaddr_intel(hdev);
1382 return 0; 1431 return 0;
1383} 1432}
1384 1433