Merge branch 'for-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next
Johan Hedberg says: ==================== pull request: bluetooth-next 2020-09-29 Here's the main bluetooth-next pull request for 5.10: - Multiple fixes to suspend/resume handling - Added mgmt events for controller suspend/resume state - Improved extended advertising support - btintel: Enhanced support for next generation controllers - Added Qualcomm Bluetooth SoC WCN6855 support - Several other smaller fixes & improvements ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@ -2963,7 +2963,7 @@ int hci_add_adv_instance(struct hci_dev *hdev, u8 instance, u32 flags,
|
||||
sizeof(adv_instance->scan_rsp_data));
|
||||
} else {
|
||||
if (hdev->adv_instance_cnt >= hdev->le_num_of_adv_sets ||
|
||||
instance < 1 || instance > HCI_MAX_ADV_INSTANCES)
|
||||
instance < 1 || instance > hdev->le_num_of_adv_sets)
|
||||
return -EOVERFLOW;
|
||||
|
||||
adv_instance = kzalloc(sizeof(*adv_instance), GFP_KERNEL);
|
||||
@ -3061,6 +3061,7 @@ static int free_adv_monitor(int id, void *ptr, void *data)
|
||||
|
||||
idr_remove(&hdev->adv_monitors_idr, monitor->handle);
|
||||
hci_free_adv_monitor(monitor);
|
||||
hdev->adv_monitors_cnt--;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -3077,6 +3078,7 @@ int hci_remove_adv_monitor(struct hci_dev *hdev, u16 handle)
|
||||
|
||||
idr_remove(&hdev->adv_monitors_idr, monitor->handle);
|
||||
hci_free_adv_monitor(monitor);
|
||||
hdev->adv_monitors_cnt--;
|
||||
} else {
|
||||
/* Remove all monitors if handle is 0. */
|
||||
idr_for_each(&hdev->adv_monitors_idr, &free_adv_monitor, hdev);
|
||||
@ -3442,6 +3444,16 @@ void hci_copy_identity_address(struct hci_dev *hdev, bdaddr_t *bdaddr,
|
||||
}
|
||||
}
|
||||
|
||||
static void hci_suspend_clear_tasks(struct hci_dev *hdev)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < __SUSPEND_NUM_TASKS; i++)
|
||||
clear_bit(i, hdev->suspend_tasks);
|
||||
|
||||
wake_up(&hdev->suspend_wait_q);
|
||||
}
|
||||
|
||||
static int hci_suspend_wait_event(struct hci_dev *hdev)
|
||||
{
|
||||
#define WAKE_COND \
|
||||
@ -3487,12 +3499,24 @@ static int hci_change_suspend_state(struct hci_dev *hdev,
|
||||
return hci_suspend_wait_event(hdev);
|
||||
}
|
||||
|
||||
static void hci_clear_wake_reason(struct hci_dev *hdev)
|
||||
{
|
||||
hci_dev_lock(hdev);
|
||||
|
||||
hdev->wake_reason = 0;
|
||||
bacpy(&hdev->wake_addr, BDADDR_ANY);
|
||||
hdev->wake_addr_type = 0;
|
||||
|
||||
hci_dev_unlock(hdev);
|
||||
}
|
||||
|
||||
static int hci_suspend_notifier(struct notifier_block *nb, unsigned long action,
|
||||
void *data)
|
||||
{
|
||||
struct hci_dev *hdev =
|
||||
container_of(nb, struct hci_dev, suspend_notifier);
|
||||
int ret = 0;
|
||||
u8 state = BT_RUNNING;
|
||||
|
||||
/* If powering down, wait for completion. */
|
||||
if (mgmt_powering_down(hdev)) {
|
||||
@ -3513,15 +3537,27 @@ static int hci_suspend_notifier(struct notifier_block *nb, unsigned long action,
|
||||
* - Second, program event filter/whitelist and enable scan
|
||||
*/
|
||||
ret = hci_change_suspend_state(hdev, BT_SUSPEND_DISCONNECT);
|
||||
if (!ret)
|
||||
state = BT_SUSPEND_DISCONNECT;
|
||||
|
||||
/* Only configure whitelist if disconnect succeeded and wake
|
||||
* isn't being prevented.
|
||||
*/
|
||||
if (!ret && !(hdev->prevent_wake && hdev->prevent_wake(hdev)))
|
||||
if (!ret && !(hdev->prevent_wake && hdev->prevent_wake(hdev))) {
|
||||
ret = hci_change_suspend_state(hdev,
|
||||
BT_SUSPEND_CONFIGURE_WAKE);
|
||||
if (!ret)
|
||||
state = BT_SUSPEND_CONFIGURE_WAKE;
|
||||
}
|
||||
|
||||
hci_clear_wake_reason(hdev);
|
||||
mgmt_suspending(hdev, state);
|
||||
|
||||
} else if (action == PM_POST_SUSPEND) {
|
||||
ret = hci_change_suspend_state(hdev, BT_RUNNING);
|
||||
|
||||
mgmt_resuming(hdev, hdev->wake_reason, &hdev->wake_addr,
|
||||
hdev->wake_addr_type);
|
||||
}
|
||||
|
||||
done:
|
||||
@ -3784,6 +3820,7 @@ void hci_unregister_dev(struct hci_dev *hdev)
|
||||
|
||||
cancel_work_sync(&hdev->power_on);
|
||||
|
||||
hci_suspend_clear_tasks(hdev);
|
||||
unregister_pm_notifier(&hdev->suspend_notifier);
|
||||
cancel_work_sync(&hdev->suspend_prepare);
|
||||
|
||||
|
Reference in New Issue
Block a user