Bluetooth: Fix HCI command sending when powering on LE-only adapters
authorJohan Hedberg <johan.hedberg@intel.com>
Wed, 24 Oct 2012 18:11:57 +0000 (21:11 +0300)
committerGustavo Padovan <gustavo.padovan@collabora.co.uk>
Thu, 1 Nov 2012 22:26:55 +0000 (20:26 -0200)
This patch makes sure that we don't send BR/EDR-only commands for
LE-only adapters when they get powered on. Doing this would just cause
command errors.

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>
net/bluetooth/mgmt.c

index 399e5024b5bdb70e1b4c9ff4c409a0cc9d9b435a..e86d08731b4e2aa52badc87bf2b6359869f15420 100644 (file)
@@ -2871,6 +2871,21 @@ static void settings_rsp(struct pending_cmd *cmd, void *data)
        mgmt_pending_free(cmd);
 }
 
+static int set_bredr_scan(struct hci_dev *hdev)
+{
+       u8 scan = 0;
+
+       if (test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
+               scan |= SCAN_PAGE;
+       if (test_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
+               scan |= SCAN_INQUIRY;
+
+       if (!scan)
+               return 0;
+
+       return hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
+}
+
 int mgmt_powered(struct hci_dev *hdev, u8 powered)
 {
        struct cmd_lookup match = { NULL, hdev };
@@ -2882,16 +2897,6 @@ int mgmt_powered(struct hci_dev *hdev, u8 powered)
        mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match);
 
        if (powered) {
-               u8 scan = 0;
-
-               if (test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
-                       scan |= SCAN_PAGE;
-               if (test_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
-                       scan |= SCAN_INQUIRY;
-
-               if (scan)
-                       hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
-
                if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags)) {
                        u8 ssp = 1;
 
@@ -2908,9 +2913,12 @@ int mgmt_powered(struct hci_dev *hdev, u8 powered)
                                     sizeof(cp), &cp);
                }
 
-               update_class(hdev);
-               update_name(hdev, hdev->dev_name);
-               update_eir(hdev);
+               if (lmp_bredr_capable(hdev)) {
+                       set_bredr_scan(hdev);
+                       update_class(hdev);
+                       update_name(hdev, hdev->dev_name);
+                       update_eir(hdev);
+               }
        } else {
                u8 status = MGMT_STATUS_NOT_POWERED;
                mgmt_pending_foreach(0, hdev, cmd_status_rsp, &status);