Bluetooth: Fix clearing flags on power off before notifying mgmt
authorJohan Hedberg <johan.hedberg@intel.com>
Fri, 15 Mar 2013 22:06:59 +0000 (17:06 -0500)
committerGustavo Padovan <gustavo.padovan@collabora.co.uk>
Mon, 18 Mar 2013 17:02:03 +0000 (14:02 -0300)
When powering off the device the hdev->flags and hdev->dev_flags need to
be cleared before calling mgmt_powered(). If this is not done the
resulting events sent to user space may contain incorrect values.

Note that the HCI_AUTO_OFF flag accessed right after this is part of the
persistent flags, so it's unchanged by the hdev->dev_flags reset.

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/hci_core.c

index 059bbae..9e87a91 100644 (file)
@@ -1130,6 +1130,10 @@ static int hci_dev_do_close(struct hci_dev *hdev)
         * and no tasks are scheduled. */
        hdev->close(hdev);
 
+       /* Clear flags */
+       hdev->flags = 0;
+       hdev->dev_flags &= ~HCI_PERSISTENT_MASK;
+
        if (!test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags) &&
            mgmt_valid_hdev(hdev)) {
                hci_dev_lock(hdev);
@@ -1137,10 +1141,6 @@ static int hci_dev_do_close(struct hci_dev *hdev)
                hci_dev_unlock(hdev);
        }
 
-       /* Clear flags */
-       hdev->flags = 0;
-       hdev->dev_flags &= ~HCI_PERSISTENT_MASK;
-
        /* Controller radio is available but is currently powered down */
        hdev->amp_status = 0;