Bluetooth: Add new state HCI_POWERING_DOWN
[linux-2.6-microblaze.git] / net / bluetooth / mgmt.c
index 688890f..3fe6db8 100644 (file)
@@ -1390,6 +1390,14 @@ static int set_powered(struct sock *sk, struct hci_dev *hdev, void *data,
 
        hci_dev_lock(hdev);
 
+       if (!cp->val) {
+               if (hci_dev_test_flag(hdev, HCI_POWERING_DOWN)) {
+                       err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
+                                             MGMT_STATUS_BUSY);
+                       goto failed;
+               }
+       }
+
        if (pending_find(MGMT_OP_SET_POWERED, hdev)) {
                err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
                                      MGMT_STATUS_BUSY);
@@ -9748,6 +9756,9 @@ bool mgmt_powering_down(struct hci_dev *hdev)
        struct mgmt_pending_cmd *cmd;
        struct mgmt_mode *cp;
 
+       if (hci_dev_test_flag(hdev, HCI_POWERING_DOWN))
+               return true;
+
        cmd = pending_find(MGMT_OP_SET_POWERED, hdev);
        if (!cmd)
                return false;
@@ -10055,6 +10066,9 @@ void mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status)
                /* If this is a HCI command related to powering on the
                 * HCI dev don't send any mgmt signals.
                 */
+               if (hci_dev_test_flag(hdev, HCI_POWERING_DOWN))
+                       return;
+
                if (pending_find(MGMT_OP_SET_POWERED, hdev))
                        return;
        }