aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/bluetooth/hci_core.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 45c91b27d9d1..7c88f5f83598 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -1123,7 +1123,11 @@ int hci_dev_open(__u16 dev)
1123 goto done; 1123 goto done;
1124 } 1124 }
1125 1125
1126 if (test_bit(HCI_RFKILLED, &hdev->dev_flags)) { 1126 /* Check for rfkill but allow the HCI setup stage to proceed
1127 * (which in itself doesn't cause any RF activity).
1128 */
1129 if (test_bit(HCI_RFKILLED, &hdev->dev_flags) &&
1130 !test_bit(HCI_SETUP, &hdev->dev_flags)) {
1127 ret = -ERFKILL; 1131 ret = -ERFKILL;
1128 goto done; 1132 goto done;
1129 } 1133 }
@@ -1547,7 +1551,8 @@ static int hci_rfkill_set_block(void *data, bool blocked)
1547 1551
1548 if (blocked) { 1552 if (blocked) {
1549 set_bit(HCI_RFKILLED, &hdev->dev_flags); 1553 set_bit(HCI_RFKILLED, &hdev->dev_flags);
1550 hci_dev_do_close(hdev); 1554 if (!test_bit(HCI_SETUP, &hdev->dev_flags))
1555 hci_dev_do_close(hdev);
1551 } else { 1556 } else {
1552 clear_bit(HCI_RFKILLED, &hdev->dev_flags); 1557 clear_bit(HCI_RFKILLED, &hdev->dev_flags);
1553} 1558}
@@ -1572,9 +1577,13 @@ static void hci_power_on(struct work_struct *work)
1572 return; 1577 return;
1573 } 1578 }
1574 1579
1575 if (test_bit(HCI_AUTO_OFF, &hdev->dev_flags)) 1580 if (test_bit(HCI_RFKILLED, &hdev->dev_flags)) {
1581 clear_bit(HCI_AUTO_OFF, &hdev->dev_flags);
1582 hci_dev_do_close(hdev);
1583 } else if (test_bit(HCI_AUTO_OFF, &hdev->dev_flags)) {
1576 queue_delayed_work(hdev->req_workqueue, &hdev->power_off, 1584 queue_delayed_work(hdev->req_workqueue, &hdev->power_off,
1577 HCI_AUTO_OFF_TIMEOUT); 1585 HCI_AUTO_OFF_TIMEOUT);
1586 }
1578 1587
1579 if (test_and_clear_bit(HCI_SETUP, &hdev->dev_flags)) 1588 if (test_and_clear_bit(HCI_SETUP, &hdev->dev_flags))
1580 mgmt_index_added(hdev); 1589 mgmt_index_added(hdev);