diff options
author | Johan Hedberg <johan.hedberg@intel.com> | 2013-09-13 01:58:17 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-10-13 19:08:32 -0400 |
commit | ddc650c1b220e15a831ebc1624504a590ee0e8d9 (patch) | |
tree | b360a37713f6a9bc19e7001772277ab8a7622adf | |
parent | a7905fb906f2d43fbbdf2bd45c860ad0ee6c9465 (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.h | 1 | ||||
-rw-r--r-- | net/bluetooth/hci_core.c | 15 |
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 { | |||
104 | enum { | 104 | enum { |
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) |