Bluetooth: Don't send New Settings event during setup power down
authorMarcel Holtmann <marcel@holtmann.org>
Tue, 21 Feb 2012 11:33:48 +0000 (12:33 +0100)
committerJohan Hedberg <johan.hedberg@intel.com>
Tue, 21 Feb 2012 11:58:47 +0000 (13:58 +0200)
When the controller gets brought up for initial setup, it will be brought
back down after a timeout. In that case, don't send a New Settings event.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
net/bluetooth/hci_core.c

index a7439aeb1f9bb2fb13ec9df9dad0255b9069f515..a787c9c9d4cd36a861406d7e0948343ba0a631bb 100644 (file)
@@ -739,9 +739,6 @@ static int hci_dev_do_close(struct hci_dev *hdev)
                hdev->discov_timeout = 0;
        }
 
-       if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags))
-               cancel_delayed_work(&hdev->power_off);
-
        if (test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
                cancel_delayed_work(&hdev->service_cache);
 
@@ -787,9 +784,11 @@ static int hci_dev_do_close(struct hci_dev *hdev)
         * and no tasks are scheduled. */
        hdev->close(hdev);
 
-       hci_dev_lock(hdev);
-       mgmt_powered(hdev, 0);
-       hci_dev_unlock(hdev);
+       if (!test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags)) {
+               hci_dev_lock(hdev);
+               mgmt_powered(hdev, 0);
+               hci_dev_unlock(hdev);
+       }
 
        /* Clear flags */
        hdev->flags = 0;
@@ -808,7 +807,12 @@ int hci_dev_close(__u16 dev)
        hdev = hci_dev_get(dev);
        if (!hdev)
                return -ENODEV;
+
+       if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags))
+               cancel_delayed_work(&hdev->power_off);
+
        err = hci_dev_do_close(hdev);
+
        hci_dev_put(hdev);
        return err;
 }
@@ -1102,9 +1106,7 @@ static void hci_power_off(struct work_struct *work)
 
        BT_DBG("%s", hdev->name);
 
-       clear_bit(HCI_AUTO_OFF, &hdev->dev_flags);
-
-       hci_dev_close(hdev->id);
+       hci_dev_do_close(hdev);
 }
 
 static void hci_discov_off(struct work_struct *work)