aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@intel.com>2013-09-13 01:58:17 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-10-13 19:08:32 -0400
commitddc650c1b220e15a831ebc1624504a590ee0e8d9 (patch)
treeb360a37713f6a9bc19e7001772277ab8a7622adf
parenta7905fb906f2d43fbbdf2bd45c860ad0ee6c9465 (diff)
Bluetooth: Introduce a new HCI_RFKILLED flag
commit 5e130367d43ff22836bbae380d197d600fe8ddbb upstream. This makes it more convenient to check for rfkill (no need to check for dev->rfkill before calling rfkill_blocked()) and also avoids potential races if the RFKILL state needs to be checked from within the rfkill callback. 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> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--include/net/bluetooth/hci.h1
-rw-r--r--net/bluetooth/hci_core.c15
2 files changed, 11 insertions, 5 deletions
diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h
index e0512aaef4b8..0ef00066dae8 100644
--- a/include/net/bluetooth/hci.h
+++ b/include/net/bluetooth/hci.h
@@ -104,6 +104,7 @@ enum {
104enum { 104enum {
105 HCI_SETUP, 105 HCI_SETUP,
106 HCI_AUTO_OFF, 106 HCI_AUTO_OFF,
107 HCI_RFKILLED,
107 HCI_MGMT, 108 HCI_MGMT,
108 HCI_PAIRABLE, 109 HCI_PAIRABLE,
109 HCI_SERVICE_CACHE, 110 HCI_SERVICE_CACHE,
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index ace5e55fe5a3..45c91b27d9d1 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -1123,7 +1123,7 @@ int hci_dev_open(__u16 dev)
1123 goto done; 1123 goto done;
1124 } 1124 }
1125 1125
1126 if (hdev->rfkill && rfkill_blocked(hdev->rfkill)) { 1126 if (test_bit(HCI_RFKILLED, &hdev->dev_flags)) {
1127 ret = -ERFKILL; 1127 ret = -ERFKILL;
1128 goto done; 1128 goto done;
1129 } 1129 }
@@ -1545,10 +1545,12 @@ static int hci_rfkill_set_block(void *data, bool blocked)
1545 1545
1546 BT_DBG("%p name %s blocked %d", hdev, hdev->name, blocked); 1546 BT_DBG("%p name %s blocked %d", hdev, hdev->name, blocked);
1547 1547
1548 if (!blocked) 1548 if (blocked) {
1549 return 0; 1549 set_bit(HCI_RFKILLED, &hdev->dev_flags);
1550 1550 hci_dev_do_close(hdev);
1551 hci_dev_do_close(hdev); 1551 } else {
1552 clear_bit(HCI_RFKILLED, &hdev->dev_flags);
1553}
1552 1554
1553 return 0; 1555 return 0;
1554} 1556}
@@ -2241,6 +2243,9 @@ int hci_register_dev(struct hci_dev *hdev)
2241 } 2243 }
2242 } 2244 }
2243 2245
2246 if (hdev->rfkill && rfkill_blocked(hdev->rfkill))
2247 set_bit(HCI_RFKILLED, &hdev->dev_flags);
2248
2244 set_bit(HCI_SETUP, &hdev->dev_flags); 2249 set_bit(HCI_SETUP, &hdev->dev_flags);
2245 2250
2246 if (hdev->dev_type != HCI_AMP) 2251 if (hdev->dev_type != HCI_AMP)