diff options
| author | Ingo Molnar <mingo@kernel.org> | 2013-11-06 06:39:45 +0100 | 
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2013-11-06 06:39:45 +0100 | 
| commit | 97c53b402fcadb50201c23914f614bf8430d9c20 (patch) | |
| tree | 3c9b94e866d150c3a2d8ac853e388c38fade8b45 /net/bluetooth/hci_core.c | |
| parent | 6a716c90a51338009c3bc1f460829afaed8f922d (diff) | |
| parent | 5e01dc7b26d9f24f39abace5da98ccbd6a5ceb52 (diff) | |
Merge tag 'v3.12' into core/locking to pick up mutex upates
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'net/bluetooth/hci_core.c')
| -rw-r--r-- | net/bluetooth/hci_core.c | 26 | 
1 files changed, 20 insertions, 6 deletions
| diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 634debab4d54..fb7356fcfe51 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c @@ -1146,7 +1146,11 @@ int hci_dev_open(__u16 dev)  		goto done;  	} -	if (hdev->rfkill && rfkill_blocked(hdev->rfkill)) { +	/* Check for rfkill but allow the HCI setup stage to proceed +	 * (which in itself doesn't cause any RF activity). +	 */ +	if (test_bit(HCI_RFKILLED, &hdev->dev_flags) && +	    !test_bit(HCI_SETUP, &hdev->dev_flags)) {  		ret = -ERFKILL;  		goto done;  	} @@ -1566,10 +1570,13 @@ static int hci_rfkill_set_block(void *data, bool blocked)  	BT_DBG("%p name %s blocked %d", hdev, hdev->name, blocked); -	if (!blocked) -		return 0; - -	hci_dev_do_close(hdev); +	if (blocked) { +		set_bit(HCI_RFKILLED, &hdev->dev_flags); +		if (!test_bit(HCI_SETUP, &hdev->dev_flags)) +			hci_dev_do_close(hdev); +	} else { +		clear_bit(HCI_RFKILLED, &hdev->dev_flags); +	}  	return 0;  } @@ -1591,9 +1598,13 @@ static void hci_power_on(struct work_struct *work)  		return;  	} -	if (test_bit(HCI_AUTO_OFF, &hdev->dev_flags)) +	if (test_bit(HCI_RFKILLED, &hdev->dev_flags)) { +		clear_bit(HCI_AUTO_OFF, &hdev->dev_flags); +		hci_dev_do_close(hdev); +	} else if (test_bit(HCI_AUTO_OFF, &hdev->dev_flags)) {  		queue_delayed_work(hdev->req_workqueue, &hdev->power_off,  				   HCI_AUTO_OFF_TIMEOUT); +	}  	if (test_and_clear_bit(HCI_SETUP, &hdev->dev_flags))  		mgmt_index_added(hdev); @@ -2209,6 +2220,9 @@ int hci_register_dev(struct hci_dev *hdev)  		}  	} +	if (hdev->rfkill && rfkill_blocked(hdev->rfkill)) +		set_bit(HCI_RFKILLED, &hdev->dev_flags); +  	set_bit(HCI_SETUP, &hdev->dev_flags);  	if (hdev->dev_type != HCI_AMP) | 
