Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1563490 > unrolled thread

[PATCH 1/3] btmrvl: avoid double-disable_irq() race

Started byJeffy Chen <jeffy.chen@rock-chips.com>
First post2017-01-20 12:30 +0100
Last post2017-01-20 20:30 +0100
Articles 6 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH 1/3] btmrvl: avoid double-disable_irq() race Jeffy Chen <jeffy.chen@rock-chips.com> - 2017-01-20 12:30 +0100
    [PATCH 3/3] btmrvl: use dt's irqflags for wakeup pin Jeffy Chen <jeffy.chen@rock-chips.com> - 2017-01-20 12:30 +0100
      Re: [PATCH 3/3] btmrvl: use dt's irqflags for wakeup pin Brian Norris <briannorris@chromium.org> - 2017-01-20 20:30 +0100
    [PATCH 2/3] btmrvl: set irq_bt to -1 when failed to parse it Jeffy Chen <jeffy.chen@rock-chips.com> - 2017-01-20 12:30 +0100
      Re: [PATCH 2/3] btmrvl: set irq_bt to -1 when failed to parse it Brian Norris <briannorris@chromium.org> - 2017-01-20 20:30 +0100
    Re: [PATCH 1/3] btmrvl: avoid double-disable_irq() race Brian Norris <briannorris@chromium.org> - 2017-01-20 20:30 +0100

#1563490 — [PATCH 1/3] btmrvl: avoid double-disable_irq() race

FromJeffy Chen <jeffy.chen@rock-chips.com>
Date2017-01-20 12:30 +0100
Subject[PATCH 1/3] btmrvl: avoid double-disable_irq() race
Message-ID<t1Fyh-6Cb-1@gated-at.bofh.it>
It's much the same as what we did for mwifiex in:
b9da4d2 mwifiex: avoid double-disable_irq() race

Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
---

 drivers/bluetooth/btmrvl_sdio.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/bluetooth/btmrvl_sdio.c b/drivers/bluetooth/btmrvl_sdio.c
index d02f2c1..c738bae 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;
-- 
2.1.4

[toc] | [next] | [standalone]


#1563500 — [PATCH 3/3] btmrvl: use dt's irqflags for wakeup pin

FromJeffy Chen <jeffy.chen@rock-chips.com>
Date2017-01-20 12:30 +0100
Subject[PATCH 3/3] btmrvl: use dt's irqflags for wakeup pin
Message-ID<t1Fyi-6Cb-25@gated-at.bofh.it>
In reply to#1563490
Use irqflags parsed from dt.

Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
---

 drivers/bluetooth/btmrvl_sdio.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/bluetooth/btmrvl_sdio.c b/drivers/bluetooth/btmrvl_sdio.c
index 796f719..23711fe 100644
--- a/drivers/bluetooth/btmrvl_sdio.c
+++ b/drivers/bluetooth/btmrvl_sdio.c
@@ -101,8 +101,7 @@ static int btmrvl_sdio_probe_of(struct device *dev,
 		} else {
 			ret = devm_request_irq(dev, cfg->irq_bt,
 					       btmrvl_wake_irq_bt,
-					       IRQF_TRIGGER_LOW,
-					       "bt_wake", cfg);
+					       0, "bt_wake", cfg);
 			if (ret) {
 				dev_err(dev,
 					"Failed to request irq_bt %d (%d)\n",
-- 
2.1.4

[toc] | [prev] | [next] | [standalone]


#1563879 — Re: [PATCH 3/3] btmrvl: use dt's irqflags for wakeup pin

FromBrian Norris <briannorris@chromium.org>
Date2017-01-20 20:30 +0100
SubjectRe: [PATCH 3/3] btmrvl: use dt's irqflags for wakeup pin
Message-ID<t1N2O-2Ry-37@gated-at.bofh.it>
In reply to#1563500
On Fri, Jan 20, 2017 at 07:14:20PM +0800, Jeffy Chen wrote:
> Use irqflags parsed from dt.
> 
> Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
> ---
> 
>  drivers/bluetooth/btmrvl_sdio.c | 3 +--
>  1 file changed, 1 insertion(+), 2 deletions(-)
> 
> diff --git a/drivers/bluetooth/btmrvl_sdio.c b/drivers/bluetooth/btmrvl_sdio.c
> index 796f719..23711fe 100644
> --- a/drivers/bluetooth/btmrvl_sdio.c
> +++ b/drivers/bluetooth/btmrvl_sdio.c
> @@ -101,8 +101,7 @@ static int btmrvl_sdio_probe_of(struct device *dev,
>  		} else {
>  			ret = devm_request_irq(dev, cfg->irq_bt,
>  					       btmrvl_wake_irq_bt,
> -					       IRQF_TRIGGER_LOW,

IRQF_TRIGGER_LOW is often accurate, since Marvell devices seem to always
physically use an active low signal here. But there could always be some
kind of inverter logic on the board, for instance, so it makes sense to
just let the device tree specify these flags for us.

Also, I don't actually see any in-tree users of this yet (at least, I
see no proper "marvell,sd*-bt" compatible properties), so I don't see
anyone who might have specified this incorrectly yet...

So:

Reviewed-by: Brian Norris <briannorris@chromium.org>

> -					       "bt_wake", cfg);
> +					       0, "bt_wake", cfg);
>  			if (ret) {
>  				dev_err(dev,
>  					"Failed to request irq_bt %d (%d)\n",
> -- 
> 2.1.4
> 
> 

[toc] | [prev] | [next] | [standalone]


#1563508 — [PATCH 2/3] btmrvl: set irq_bt to -1 when failed to parse it

FromJeffy Chen <jeffy.chen@rock-chips.com>
Date2017-01-20 12:30 +0100
Subject[PATCH 2/3] btmrvl: set irq_bt to -1 when failed to parse it
Message-ID<t1Fyj-6Cb-41@gated-at.bofh.it>
In reply to#1563490
The irq_of_parse_and_map will return 0 as a invalid irq.

Set irq_bt to -1 in this case, so that the btmrvl resume/suspend code
would not get confused.

Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
---

 drivers/bluetooth/btmrvl_sdio.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/bluetooth/btmrvl_sdio.c b/drivers/bluetooth/btmrvl_sdio.c
index c738bae..796f719 100644
--- a/drivers/bluetooth/btmrvl_sdio.c
+++ b/drivers/bluetooth/btmrvl_sdio.c
@@ -97,6 +97,7 @@ static int btmrvl_sdio_probe_of(struct device *dev,
 		cfg->irq_bt = irq_of_parse_and_map(card->plt_of_node, 0);
 		if (!cfg->irq_bt) {
 			dev_err(dev, "fail to parse irq_bt from device tree");
+			cfg->irq_bt = -1;
 		} else {
 			ret = devm_request_irq(dev, cfg->irq_bt,
 					       btmrvl_wake_irq_bt,
-- 
2.1.4

[toc] | [prev] | [next] | [standalone]


#1563875 — Re: [PATCH 2/3] btmrvl: set irq_bt to -1 when failed to parse it

FromBrian Norris <briannorris@chromium.org>
Date2017-01-20 20:30 +0100
SubjectRe: [PATCH 2/3] btmrvl: set irq_bt to -1 when failed to parse it
Message-ID<t1N2N-2Ry-15@gated-at.bofh.it>
In reply to#1563508
On Fri, Jan 20, 2017 at 07:14:19PM +0800, Jeffy Chen wrote:
> The irq_of_parse_and_map will return 0 as a invalid irq.

irq_of_parse_and_map() is weird to me. In general, Linux IRQ numbers
*can* be 0, but it looks like the OF framework understands that
device-tree based interrupts will not get mapped to a virtual IRQ number
of 0, so it's fine to use '0' as the error value?

In that case, I guess this is the most sensible solution...

> Set irq_bt to -1 in this case, so that the btmrvl resume/suspend code
> would not get confused.

More specifically: the suspend/resume code would have tried to
enable/disable IRQ 0.

> Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>

Reviewed-by: Brian Norris <briannorris@chromium.org>

> ---
> 
>  drivers/bluetooth/btmrvl_sdio.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/drivers/bluetooth/btmrvl_sdio.c b/drivers/bluetooth/btmrvl_sdio.c
> index c738bae..796f719 100644
> --- a/drivers/bluetooth/btmrvl_sdio.c
> +++ b/drivers/bluetooth/btmrvl_sdio.c
> @@ -97,6 +97,7 @@ static int btmrvl_sdio_probe_of(struct device *dev,
>  		cfg->irq_bt = irq_of_parse_and_map(card->plt_of_node, 0);
>  		if (!cfg->irq_bt) {
>  			dev_err(dev, "fail to parse irq_bt from device tree");
> +			cfg->irq_bt = -1;
>  		} else {
>  			ret = devm_request_irq(dev, cfg->irq_bt,
>  					       btmrvl_wake_irq_bt,
> -- 
> 2.1.4
> 
> 

[toc] | [prev] | [next] | [standalone]


#1563878

FromBrian Norris <briannorris@chromium.org>
Date2017-01-20 20:30 +0100
Message-ID<t1N2O-2Ry-49@gated-at.bofh.it>
In reply to#1563490
On Fri, Jan 20, 2017 at 07:14:18PM +0800, Jeffy Chen wrote:
> It's much the same as what we did for mwifiex in:
> b9da4d2 mwifiex: avoid double-disable_irq() race

You could still stand to borrow some of the explanation for your commit
message here...

> Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>

Fix looks good:

Reviewed-by: Brian Norris <briannorris@chromium.org>

> ---
> 
>  drivers/bluetooth/btmrvl_sdio.c | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/bluetooth/btmrvl_sdio.c b/drivers/bluetooth/btmrvl_sdio.c
> index d02f2c1..c738bae 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;
> -- 
> 2.1.4
> 
> 

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web