aboutsummaryrefslogtreecommitdiffstats
path: root/net/bluetooth/hci_core.c
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2014-07-06 06:11:14 -0400
committerJohan Hedberg <johan.hedberg@intel.com>2014-07-06 06:41:51 -0400
commitd603b76b0c18c5adf4a3164dff50bb15948cd7bd (patch)
tree0bce0af1355d27fa8658d81875c3602cf3332475 /net/bluetooth/hci_core.c
parent19de0825cd8acb1de6fa6a135b1f059446781049 (diff)
Bluetooth: Run controller setup after external configuration
When the external configuration triggers the switch to a configured controller, it means the setup needs to be run. Controllers that start out unconfigured have only run limited set of HCI commands. This is not enough for complete operation and thus run the setup procedure before announcing the new controller index. This introduces HCI_CONFIG flag as companion to HCI_SETUP flag. The HCI_SETUP flag is only used once for the initial setup procedure. And during that procedure hdev->setup driver callback is called. With the new HCI_CONFIG the switch from unconfigured to configured state is triggering the same setup procedure just without hdev->setup. This is required since bringing a controller back to unconfigured state from configured state is possible. Signed-off-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Diffstat (limited to 'net/bluetooth/hci_core.c')
-rw-r--r--net/bluetooth/hci_core.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index d01bd043c231..bf7cf512df88 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -2232,7 +2232,8 @@ static int hci_dev_do_open(struct hci_dev *hdev)
2232 goto done; 2232 goto done;
2233 } 2233 }
2234 2234
2235 if (!test_bit(HCI_SETUP, &hdev->dev_flags)) { 2235 if (!test_bit(HCI_SETUP, &hdev->dev_flags) &&
2236 !test_bit(HCI_CONFIG, &hdev->dev_flags)) {
2236 /* Check for rfkill but allow the HCI setup stage to 2237 /* Check for rfkill but allow the HCI setup stage to
2237 * proceed (which in itself doesn't cause any RF activity). 2238 * proceed (which in itself doesn't cause any RF activity).
2238 */ 2239 */
@@ -2326,6 +2327,7 @@ static int hci_dev_do_open(struct hci_dev *hdev)
2326 set_bit(HCI_UP, &hdev->flags); 2327 set_bit(HCI_UP, &hdev->flags);
2327 hci_notify(hdev, HCI_DEV_UP); 2328 hci_notify(hdev, HCI_DEV_UP);
2328 if (!test_bit(HCI_SETUP, &hdev->dev_flags) && 2329 if (!test_bit(HCI_SETUP, &hdev->dev_flags) &&
2330 !test_bit(HCI_CONFIG, &hdev->dev_flags) &&
2329 !test_bit(HCI_UNCONFIGURED, &hdev->dev_flags) && 2331 !test_bit(HCI_UNCONFIGURED, &hdev->dev_flags) &&
2330 !test_bit(HCI_USER_CHANNEL, &hdev->dev_flags) && 2332 !test_bit(HCI_USER_CHANNEL, &hdev->dev_flags) &&
2331 hdev->dev_type == HCI_BREDR) { 2333 hdev->dev_type == HCI_BREDR) {
@@ -2824,7 +2826,8 @@ static int hci_rfkill_set_block(void *data, bool blocked)
2824 2826
2825 if (blocked) { 2827 if (blocked) {
2826 set_bit(HCI_RFKILLED, &hdev->dev_flags); 2828 set_bit(HCI_RFKILLED, &hdev->dev_flags);
2827 if (!test_bit(HCI_SETUP, &hdev->dev_flags)) 2829 if (!test_bit(HCI_SETUP, &hdev->dev_flags) &&
2830 !test_bit(HCI_CONFIG, &hdev->dev_flags))
2828 hci_dev_do_close(hdev); 2831 hci_dev_do_close(hdev);
2829 } else { 2832 } else {
2830 clear_bit(HCI_RFKILLED, &hdev->dev_flags); 2833 clear_bit(HCI_RFKILLED, &hdev->dev_flags);
@@ -2881,6 +2884,12 @@ static void hci_power_on(struct work_struct *work)
2881 * and no event will be send. 2884 * and no event will be send.
2882 */ 2885 */
2883 mgmt_index_added(hdev); 2886 mgmt_index_added(hdev);
2887 } else if (test_and_clear_bit(HCI_CONFIG, &hdev->dev_flags)) {
2888 /* Powering on the controller with HCI_CONFIG set only
2889 * happens with the transition from unconfigured to
2890 * configured. This will send the Index Added event.
2891 */
2892 mgmt_index_added(hdev);
2884 } 2893 }
2885} 2894}
2886 2895
@@ -4045,7 +4054,8 @@ void hci_unregister_dev(struct hci_dev *hdev)
4045 cancel_work_sync(&hdev->power_on); 4054 cancel_work_sync(&hdev->power_on);
4046 4055
4047 if (!test_bit(HCI_INIT, &hdev->flags) && 4056 if (!test_bit(HCI_INIT, &hdev->flags) &&
4048 !test_bit(HCI_SETUP, &hdev->dev_flags)) { 4057 !test_bit(HCI_SETUP, &hdev->dev_flags) &&
4058 !test_bit(HCI_CONFIG, &hdev->dev_flags)) {
4049 hci_dev_lock(hdev); 4059 hci_dev_lock(hdev);
4050 mgmt_index_removed(hdev); 4060 mgmt_index_removed(hdev);
4051 hci_dev_unlock(hdev); 4061 hci_dev_unlock(hdev);
@@ -5370,6 +5380,7 @@ void hci_update_background_scan(struct hci_dev *hdev)
5370 if (!test_bit(HCI_UP, &hdev->flags) || 5380 if (!test_bit(HCI_UP, &hdev->flags) ||
5371 test_bit(HCI_INIT, &hdev->flags) || 5381 test_bit(HCI_INIT, &hdev->flags) ||
5372 test_bit(HCI_SETUP, &hdev->dev_flags) || 5382 test_bit(HCI_SETUP, &hdev->dev_flags) ||
5383 test_bit(HCI_CONFIG, &hdev->dev_flags) ||
5373 test_bit(HCI_AUTO_OFF, &hdev->dev_flags) || 5384 test_bit(HCI_AUTO_OFF, &hdev->dev_flags) ||
5374 test_bit(HCI_UNREGISTER, &hdev->dev_flags)) 5385 test_bit(HCI_UNREGISTER, &hdev->dev_flags))
5375 return; 5386 return;