diff options
author | Jeffy Chen <jeffy.chen@rock-chips.com> | 2017-01-23 05:18:51 +0100 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2017-02-16 17:25:19 +0100 |
commit | 9af02d86e11dc409e5c3de46e81c0a492ba58905 (patch) | |
tree | 38011e4b264787cb48fa3086cd41fadb452b8727 /drivers/bluetooth | |
parent | Bluetooth: Fix NULL pointer dereference in bt_sock_recvmsg (diff) | |
download | linux-9af02d86e11dc409e5c3de46e81c0a492ba58905.tar.xz linux-9af02d86e11dc409e5c3de46e81c0a492ba58905.zip |
btmrvl: avoid double-disable_irq() race
It's much the same as what we did for mwifiex in:
b9da4d2 mwifiex: avoid double-disable_irq() race
"We have a race where the wakeup IRQ might be in flight while we're
calling mwifiex_disable_wake() from resume(). This can leave us
disabling the IRQ twice.
Let's disable the IRQ and enable it in case if we have double-disabled
it."
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
Reviewed-by: Brian Norris <briannorris@chromium.org>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'drivers/bluetooth')
-rw-r--r-- | drivers/bluetooth/btmrvl_sdio.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/bluetooth/btmrvl_sdio.c b/drivers/bluetooth/btmrvl_sdio.c index d02f2c14df32..c738baeb6d45 100644 --- a/drivers/bluetooth/btmrvl_sdio.c +++ b/drivers/bluetooth/btmrvl_sdio.c @@ -1682,8 +1682,12 @@ static int btmrvl_sdio_resume(struct device *dev) /* Disable platform specific wakeup interrupt */ if (card->plt_wake_cfg && card->plt_wake_cfg->irq_bt >= 0) { disable_irq_wake(card->plt_wake_cfg->irq_bt); - if (!card->plt_wake_cfg->wake_by_bt) - disable_irq(card->plt_wake_cfg->irq_bt); + disable_irq(card->plt_wake_cfg->irq_bt); + if (card->plt_wake_cfg->wake_by_bt) + /* Undo our disable, since interrupt handler already + * did this. + */ + enable_irq(card->plt_wake_cfg->irq_bt); } return 0; |