* [PATCH bluetooth-next 0/9] at86rf230: various fixes and cleanups
@ 2014-10-07 8:38 Alexander Aring
2014-10-07 8:38 ` [PATCH bluetooth-next 1/9] at86rf230: fix errno on tx timeout handling Alexander Aring
` (9 more replies)
0 siblings, 10 replies; 15+ messages in thread
From: Alexander Aring @ 2014-10-07 8:38 UTC (permalink / raw)
To: linux-wpan; +Cc: m.olbrich, Alexander Aring
Hi,
this series fix a race condition when switching to RX_AACK_ON and irq is
enabled. Also contains correct handling of enable_irq if the irq was disabled
before. Additional we fix the handling of lifs/sifs timing in ARET mode.
- Alex
Alexander Aring (9):
at86rf230: fix errno on tx timeout handling
at86rf230: add missing error handling
at86rf230: correct aret lifs and sifs handling
at86rf230: correct at86rf2xx lifs timings
at86rf230: squash unnecessary dereferencing
at86rf230: add missing enable_irq
at86rf230: fix race condition
at86rf230: fix enable_irq handling on async spi
at86rf230: remove unnecessary print of async error
drivers/net/ieee802154/at86rf230.c | 180 +++++++++++++++++++------------------
1 file changed, 92 insertions(+), 88 deletions(-)
--
2.1.2
^ permalink raw reply [flat|nested] 15+ messages in thread* [PATCH bluetooth-next 1/9] at86rf230: fix errno on tx timeout handling 2014-10-07 8:38 [PATCH bluetooth-next 0/9] at86rf230: various fixes and cleanups Alexander Aring @ 2014-10-07 8:38 ` Alexander Aring 2014-10-07 8:54 ` Varka Bhadram 2014-10-07 8:38 ` [PATCH bluetooth-next 2/9] at86rf230: add missing error handling Alexander Aring ` (8 subsequent siblings) 9 siblings, 1 reply; 15+ messages in thread From: Alexander Aring @ 2014-10-07 8:38 UTC (permalink / raw) To: linux-wpan; +Cc: m.olbrich, Alexander Aring The rc variable is zero if we get a timeout. Instead of pass the rc variable to the async error handling function which try to recover the phy, we use a static -ETIMEOUT errno. Signed-off-by: Alexander Aring <alex.aring@gmail.com> --- drivers/net/ieee802154/at86rf230.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ieee802154/at86rf230.c b/drivers/net/ieee802154/at86rf230.c index c9d2a75..6857038 100644 --- a/drivers/net/ieee802154/at86rf230.c +++ b/drivers/net/ieee802154/at86rf230.c @@ -995,7 +995,7 @@ at86rf230_xmit(struct ieee802154_dev *dev, struct sk_buff *skb) rc = wait_for_completion_interruptible_timeout(&lp->tx_complete, msecs_to_jiffies(lp->data->t_tx_timeout)); if (!rc) { - at86rf230_async_error(lp, ctx, rc); + at86rf230_async_error(lp, ctx, -ETIMEDOUT); return -ETIMEDOUT; } -- 2.1.2 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH bluetooth-next 1/9] at86rf230: fix errno on tx timeout handling 2014-10-07 8:38 ` [PATCH bluetooth-next 1/9] at86rf230: fix errno on tx timeout handling Alexander Aring @ 2014-10-07 8:54 ` Varka Bhadram 0 siblings, 0 replies; 15+ messages in thread From: Varka Bhadram @ 2014-10-07 8:54 UTC (permalink / raw) To: Alexander Aring, linux-wpan; +Cc: m.olbrich On 10/07/2014 02:08 PM, Alexander Aring wrote: > The rc variable is zero if we get a timeout. Instead of pass the rc > variable to the async error handling function which try to recover the > phy, we use a static -ETIMEOUT errno. s/ETIMEOUT/ETIMEDOUT > Signed-off-by: Alexander Aring <alex.aring@gmail.com> > --- > drivers/net/ieee802154/at86rf230.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/net/ieee802154/at86rf230.c b/drivers/net/ieee802154/at86rf230.c > index c9d2a75..6857038 100644 > --- a/drivers/net/ieee802154/at86rf230.c > +++ b/drivers/net/ieee802154/at86rf230.c > @@ -995,7 +995,7 @@ at86rf230_xmit(struct ieee802154_dev *dev, struct sk_buff *skb) > rc = wait_for_completion_interruptible_timeout(&lp->tx_complete, > msecs_to_jiffies(lp->data->t_tx_timeout)); > if (!rc) { > - at86rf230_async_error(lp, ctx, rc); > + at86rf230_async_error(lp, ctx, -ETIMEDOUT); > return -ETIMEDOUT; > } > -- Regards, Varka Bhadram. ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH bluetooth-next 2/9] at86rf230: add missing error handling 2014-10-07 8:38 [PATCH bluetooth-next 0/9] at86rf230: various fixes and cleanups Alexander Aring 2014-10-07 8:38 ` [PATCH bluetooth-next 1/9] at86rf230: fix errno on tx timeout handling Alexander Aring @ 2014-10-07 8:38 ` Alexander Aring 2014-10-07 8:38 ` [PATCH bluetooth-next 3/9] at86rf230: correct aret lifs and sifs handling Alexander Aring ` (7 subsequent siblings) 9 siblings, 0 replies; 15+ messages in thread From: Alexander Aring @ 2014-10-07 8:38 UTC (permalink / raw) To: linux-wpan; +Cc: m.olbrich, Alexander Aring This patch adds an async error handling function if sync state change runs into a timeout. The async error handling function tries to recover the phy state machine into a valid state. Signed-off-by: Alexander Aring <alex.aring@gmail.com> --- drivers/net/ieee802154/at86rf230.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/net/ieee802154/at86rf230.c b/drivers/net/ieee802154/at86rf230.c index 6857038..44d2f1d 100644 --- a/drivers/net/ieee802154/at86rf230.c +++ b/drivers/net/ieee802154/at86rf230.c @@ -690,8 +690,10 @@ at86rf230_sync_state_change(struct at86rf230_local *lp, unsigned int state) rc = wait_for_completion_timeout(&lp->state_complete, msecs_to_jiffies(100)); - if (!rc) + if (!rc) { + at86rf230_async_error(lp, &lp->state, -ETIMEDOUT); return -ETIMEDOUT; + } return 0; } -- 2.1.2 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH bluetooth-next 3/9] at86rf230: correct aret lifs and sifs handling 2014-10-07 8:38 [PATCH bluetooth-next 0/9] at86rf230: various fixes and cleanups Alexander Aring 2014-10-07 8:38 ` [PATCH bluetooth-next 1/9] at86rf230: fix errno on tx timeout handling Alexander Aring 2014-10-07 8:38 ` [PATCH bluetooth-next 2/9] at86rf230: add missing error handling Alexander Aring @ 2014-10-07 8:38 ` Alexander Aring 2014-10-07 8:51 ` Varka Bhadram 2014-10-07 8:38 ` [PATCH bluetooth-next 4/9] at86rf230: correct at86rf2xx lifs timings Alexander Aring ` (6 subsequent siblings) 9 siblings, 1 reply; 15+ messages in thread From: Alexander Aring @ 2014-10-07 8:38 UTC (permalink / raw) To: linux-wpan; +Cc: m.olbrich, Alexander Aring This patch adds lifs/sifs handling only if max_frame_retries is above zero. The at86rf2xx datasheets says nothing about phy lifs/sifs handling. I asked the atmel support and they said lifs/sifs is done by phy when max_frame_retries is above zero. Signed-off-by: Alexander Aring <alex.aring@gmail.com> --- drivers/net/ieee802154/at86rf230.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/net/ieee802154/at86rf230.c b/drivers/net/ieee802154/at86rf230.c index 44d2f1d..2a25324 100644 --- a/drivers/net/ieee802154/at86rf230.c +++ b/drivers/net/ieee802154/at86rf230.c @@ -89,6 +89,7 @@ struct at86rf230_local { struct at86rf230_state_change irq; bool tx_aret; + s8 max_frame_retries; bool is_tx; /* spinlock for is_tx protection */ spinlock_t lock; @@ -1001,6 +1002,9 @@ at86rf230_xmit(struct ieee802154_dev *dev, struct sk_buff *skb) return -ETIMEDOUT; } + if (lp->max_frame_retries > 0) + return 0; + /* Interfame spacing time, which is phy depend. * TODO * Move this handling in MAC 802.15.4 layer. @@ -1230,6 +1234,7 @@ at86rf230_set_frame_retries(struct ieee802154_dev *dev, s8 retries) return -EINVAL; lp->tx_aret = retries >= 0; + lp->max_frame_retries = retries; if (retries >= 0) rc = at86rf230_write_subreg(lp, SR_MAX_FRAME_RETRIES, retries); -- 2.1.2 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH bluetooth-next 3/9] at86rf230: correct aret lifs and sifs handling 2014-10-07 8:38 ` [PATCH bluetooth-next 3/9] at86rf230: correct aret lifs and sifs handling Alexander Aring @ 2014-10-07 8:51 ` Varka Bhadram 2014-10-07 8:56 ` Alexander Aring 0 siblings, 1 reply; 15+ messages in thread From: Varka Bhadram @ 2014-10-07 8:51 UTC (permalink / raw) To: Alexander Aring, linux-wpan; +Cc: m.olbrich Hi Alex, On 10/07/2014 02:08 PM, Alexander Aring wrote: > This patch adds lifs/sifs handling only if max_frame_retries is above > zero. The at86rf2xx datasheets says nothing about phy lifs/sifs > handling. I asked the atmel support and they said lifs/sifs is done > by phy when max_frame_retries is above zero. > > Signed-off-by: Alexander Aring <alex.aring@gmail.com> > --- > drivers/net/ieee802154/at86rf230.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/drivers/net/ieee802154/at86rf230.c b/drivers/net/ieee802154/at86rf230.c > index 44d2f1d..2a25324 100644 > --- a/drivers/net/ieee802154/at86rf230.c > +++ b/drivers/net/ieee802154/at86rf230.c > @@ -89,6 +89,7 @@ struct at86rf230_local { > struct at86rf230_state_change irq; > > bool tx_aret; > + s8 max_frame_retries; Why s8 here..? Is there any reason.. > bool is_tx; > /* spinlock for is_tx protection */ > spinlock_t lock; > @@ -1001,6 +1002,9 @@ at86rf230_xmit(struct ieee802154_dev *dev, struct sk_buff *skb) > return -ETIMEDOUT; > } > > + if (lp->max_frame_retries > 0) > + return 0; > + > /* Interfame spacing time, which is phy depend. > * TODO > * Move this handling in MAC 802.15.4 layer. > @@ -1230,6 +1234,7 @@ at86rf230_set_frame_retries(struct ieee802154_dev *dev, s8 retries) > return -EINVAL; > > lp->tx_aret = retries >= 0; > + lp->max_frame_retries = retries; > > if (retries >= 0) > rc = at86rf230_write_subreg(lp, SR_MAX_FRAME_RETRIES, retries); -- Regards, Varka Bhadram. ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH bluetooth-next 3/9] at86rf230: correct aret lifs and sifs handling 2014-10-07 8:51 ` Varka Bhadram @ 2014-10-07 8:56 ` Alexander Aring 2014-10-07 9:00 ` Varka Bhadram 0 siblings, 1 reply; 15+ messages in thread From: Alexander Aring @ 2014-10-07 8:56 UTC (permalink / raw) To: Varka Bhadram; +Cc: linux-wpan, m.olbrich On Tue, Oct 07, 2014 at 02:21:44PM +0530, Varka Bhadram wrote: > Hi Alex, > > On 10/07/2014 02:08 PM, Alexander Aring wrote: > > >This patch adds lifs/sifs handling only if max_frame_retries is above > >zero. The at86rf2xx datasheets says nothing about phy lifs/sifs > >handling. I asked the atmel support and they said lifs/sifs is done > >by phy when max_frame_retries is above zero. > > > >Signed-off-by: Alexander Aring <alex.aring@gmail.com> > >--- > > drivers/net/ieee802154/at86rf230.c | 5 +++++ > > 1 file changed, 5 insertions(+) > > > >diff --git a/drivers/net/ieee802154/at86rf230.c b/drivers/net/ieee802154/at86rf230.c > >index 44d2f1d..2a25324 100644 > >--- a/drivers/net/ieee802154/at86rf230.c > >+++ b/drivers/net/ieee802154/at86rf230.c > >@@ -89,6 +89,7 @@ struct at86rf230_local { > > struct at86rf230_state_change irq; > > bool tx_aret; > >+ s8 max_frame_retries; > > Why s8 here..? Is there any reason.. > yep. > > bool is_tx; > > /* spinlock for is_tx protection */ > > spinlock_t lock; > >@@ -1001,6 +1002,9 @@ at86rf230_xmit(struct ieee802154_dev *dev, struct sk_buff *skb) > > return -ETIMEDOUT; > > } > >+ if (lp->max_frame_retries > 0) > >+ return 0; > >+ > > /* Interfame spacing time, which is phy depend. > > * TODO > > * Move this handling in MAC 802.15.4 layer. > >@@ -1230,6 +1234,7 @@ at86rf230_set_frame_retries(struct ieee802154_dev *dev, s8 retries) > > return -EINVAL; > > lp->tx_aret = retries >= 0; > >+ lp->max_frame_retries = retries; this parameter retries is s8. The value "-1" means no ARET handling here. If you do now u8 at max_frame_retries, then we get a overflow by setting "-1" here and have a invalid max_frame_retries setting of 255. Then checking via: if (lp->max_frame_retries > 0) doesn't work. - Alex ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH bluetooth-next 3/9] at86rf230: correct aret lifs and sifs handling 2014-10-07 8:56 ` Alexander Aring @ 2014-10-07 9:00 ` Varka Bhadram 0 siblings, 0 replies; 15+ messages in thread From: Varka Bhadram @ 2014-10-07 9:00 UTC (permalink / raw) To: Alexander Aring; +Cc: linux-wpan, m.olbrich On 10/07/2014 02:26 PM, Alexander Aring wrote: > On Tue, Oct 07, 2014 at 02:21:44PM +0530, Varka Bhadram wrote: >> Hi Alex, >> >> On 10/07/2014 02:08 PM, Alexander Aring wrote: >> >>> This patch adds lifs/sifs handling only if max_frame_retries is above >>> zero. The at86rf2xx datasheets says nothing about phy lifs/sifs >>> handling. I asked the atmel support and they said lifs/sifs is done >>> by phy when max_frame_retries is above zero. >>> >>> Signed-off-by: Alexander Aring <alex.aring@gmail.com> >>> --- >>> drivers/net/ieee802154/at86rf230.c | 5 +++++ >>> 1 file changed, 5 insertions(+) >>> >>> diff --git a/drivers/net/ieee802154/at86rf230.c b/drivers/net/ieee802154/at86rf230.c >>> index 44d2f1d..2a25324 100644 >>> --- a/drivers/net/ieee802154/at86rf230.c >>> +++ b/drivers/net/ieee802154/at86rf230.c >>> @@ -89,6 +89,7 @@ struct at86rf230_local { >>> struct at86rf230_state_change irq; >>> bool tx_aret; >>> + s8 max_frame_retries; >> Why s8 here..? Is there any reason.. >> > yep. > >>> bool is_tx; >>> /* spinlock for is_tx protection */ >>> spinlock_t lock; >>> @@ -1001,6 +1002,9 @@ at86rf230_xmit(struct ieee802154_dev *dev, struct sk_buff *skb) >>> return -ETIMEDOUT; >>> } >>> + if (lp->max_frame_retries > 0) >>> + return 0; >>> + >>> /* Interfame spacing time, which is phy depend. >>> * TODO >>> * Move this handling in MAC 802.15.4 layer. >>> @@ -1230,6 +1234,7 @@ at86rf230_set_frame_retries(struct ieee802154_dev *dev, s8 retries) >>> return -EINVAL; >>> lp->tx_aret = retries >= 0; >>> + lp->max_frame_retries = retries; > this parameter retries is s8. The value "-1" means no ARET handling here. > > If you do now u8 at max_frame_retries, then we get a overflow by setting > "-1" here and have a invalid max_frame_retries setting of 255. > > Then checking via: > > if (lp->max_frame_retries > 0) > > doesn't work. > > - Alex Thanks.. -- Regards, Varka Bhadram. ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH bluetooth-next 4/9] at86rf230: correct at86rf2xx lifs timings 2014-10-07 8:38 [PATCH bluetooth-next 0/9] at86rf230: various fixes and cleanups Alexander Aring ` (2 preceding siblings ...) 2014-10-07 8:38 ` [PATCH bluetooth-next 3/9] at86rf230: correct aret lifs and sifs handling Alexander Aring @ 2014-10-07 8:38 ` Alexander Aring 2014-10-07 8:38 ` [PATCH bluetooth-next 5/9] at86rf230: squash unnecessary dereferencing Alexander Aring ` (5 subsequent siblings) 9 siblings, 0 replies; 15+ messages in thread From: Alexander Aring @ 2014-10-07 8:38 UTC (permalink / raw) To: linux-wpan; +Cc: m.olbrich, Alexander Aring Symbol rate is 16 us. Lifs is 40 symbols. 16 * 40 = 640 us. Signed-off-by: Alexander Aring <alex.aring@gmail.com> --- drivers/net/ieee802154/at86rf230.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/net/ieee802154/at86rf230.c b/drivers/net/ieee802154/at86rf230.c index 2a25324..b26135f 100644 --- a/drivers/net/ieee802154/at86rf230.c +++ b/drivers/net/ieee802154/at86rf230.c @@ -1267,7 +1267,7 @@ static struct at86rf2xx_chip_data at86rf233_data = { .t_frame = 4096, .t_p_ack = 545, .t_sifs = 192, - .t_lifs = 480, + .t_lifs = 640, .t_tx_timeout = 2000, .rssi_base_val = -91, .set_channel = at86rf23x_set_channel, @@ -1283,7 +1283,7 @@ static struct at86rf2xx_chip_data at86rf231_data = { .t_frame = 4096, .t_p_ack = 545, .t_sifs = 192, - .t_lifs = 480, + .t_lifs = 640, .t_tx_timeout = 2000, .rssi_base_val = -91, .set_channel = at86rf23x_set_channel, @@ -1299,7 +1299,7 @@ static struct at86rf2xx_chip_data at86rf212_data = { .t_frame = 4096, .t_p_ack = 545, .t_sifs = 192, - .t_lifs = 480, + .t_lifs = 640, .t_tx_timeout = 2000, .rssi_base_val = -100, .set_channel = at86rf212_set_channel, -- 2.1.2 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH bluetooth-next 5/9] at86rf230: squash unnecessary dereferencing 2014-10-07 8:38 [PATCH bluetooth-next 0/9] at86rf230: various fixes and cleanups Alexander Aring ` (3 preceding siblings ...) 2014-10-07 8:38 ` [PATCH bluetooth-next 4/9] at86rf230: correct at86rf2xx lifs timings Alexander Aring @ 2014-10-07 8:38 ` Alexander Aring 2014-10-07 8:38 ` [PATCH bluetooth-next 6/9] at86rf230: add missing enable_irq Alexander Aring ` (4 subsequent siblings) 9 siblings, 0 replies; 15+ messages in thread From: Alexander Aring @ 2014-10-07 8:38 UTC (permalink / raw) To: linux-wpan; +Cc: m.olbrich, Alexander Aring This patch removes dereferencing irq number over spi struct. Instead we doing it directly over isr paramater. Signed-off-by: Alexander Aring <alex.aring@gmail.com> --- drivers/net/ieee802154/at86rf230.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ieee802154/at86rf230.c b/drivers/net/ieee802154/at86rf230.c index b26135f..09503fb 100644 --- a/drivers/net/ieee802154/at86rf230.c +++ b/drivers/net/ieee802154/at86rf230.c @@ -904,7 +904,7 @@ static irqreturn_t at86rf230_isr(int irq, void *data) u8 *buf = ctx->buf; int rc; - disable_irq_nosync(lp->spi->irq); + disable_irq_nosync(irq); buf[0] = (RG_IRQ_STATUS & CMD_REG_MASK) | CMD_REG; ctx->trx.len = 2; -- 2.1.2 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH bluetooth-next 6/9] at86rf230: add missing enable_irq 2014-10-07 8:38 [PATCH bluetooth-next 0/9] at86rf230: various fixes and cleanups Alexander Aring ` (4 preceding siblings ...) 2014-10-07 8:38 ` [PATCH bluetooth-next 5/9] at86rf230: squash unnecessary dereferencing Alexander Aring @ 2014-10-07 8:38 ` Alexander Aring 2014-10-07 8:38 ` [PATCH bluetooth-next 7/9] at86rf230: fix race condition Alexander Aring ` (3 subsequent siblings) 9 siblings, 0 replies; 15+ messages in thread From: Alexander Aring @ 2014-10-07 8:38 UTC (permalink / raw) To: linux-wpan; +Cc: m.olbrich, Alexander Aring This patch adds a missing enable_irq when spi_async in isr failed. Signed-off-by: Alexander Aring <alex.aring@gmail.com> --- drivers/net/ieee802154/at86rf230.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/net/ieee802154/at86rf230.c b/drivers/net/ieee802154/at86rf230.c index 09503fb..8754f15 100644 --- a/drivers/net/ieee802154/at86rf230.c +++ b/drivers/net/ieee802154/at86rf230.c @@ -911,6 +911,7 @@ static irqreturn_t at86rf230_isr(int irq, void *data) ctx->msg.complete = at86rf230_irq_status; rc = spi_async(lp->spi, &ctx->msg); if (rc) { + enable_irq(irq); at86rf230_async_error(lp, ctx, rc); return IRQ_NONE; } -- 2.1.2 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH bluetooth-next 7/9] at86rf230: fix race condition 2014-10-07 8:38 [PATCH bluetooth-next 0/9] at86rf230: various fixes and cleanups Alexander Aring ` (5 preceding siblings ...) 2014-10-07 8:38 ` [PATCH bluetooth-next 6/9] at86rf230: add missing enable_irq Alexander Aring @ 2014-10-07 8:38 ` Alexander Aring 2014-10-07 8:38 ` [PATCH bluetooth-next 8/9] at86rf230: fix enable_irq handling on async spi Alexander Aring ` (2 subsequent siblings) 9 siblings, 0 replies; 15+ messages in thread From: Alexander Aring @ 2014-10-07 8:38 UTC (permalink / raw) To: linux-wpan; +Cc: m.olbrich, Alexander Aring When the driver waits for a tx completion currently the driver direct enables the irq. When we switching to RX_AACK_ON some steps afterwards the driver could receive a new frame and request resources which are already in use, for example irq state change resource. To be sure there are no new interrupts when we switching to RX_AACK_ON, we enable the irq when state change to RX_AACK_ON was completed. Signed-off-by: Alexander Aring <alex.aring@gmail.com> --- drivers/net/ieee802154/at86rf230.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ieee802154/at86rf230.c b/drivers/net/ieee802154/at86rf230.c index 8754f15..5dbec64 100644 --- a/drivers/net/ieee802154/at86rf230.c +++ b/drivers/net/ieee802154/at86rf230.c @@ -705,6 +705,7 @@ at86rf230_tx_complete(void *context) struct at86rf230_state_change *ctx = context; struct at86rf230_local *lp = ctx->lp; + enable_irq(lp->spi->irq); complete(&lp->tx_complete); } @@ -860,7 +861,6 @@ at86rf230_irq_trx_end(struct at86rf230_local *lp) if (lp->is_tx) { lp->is_tx = 0; spin_unlock(&lp->lock); - enable_irq(lp->spi->irq); if (lp->tx_aret) return at86rf230_async_state_change(lp, &lp->irq, -- 2.1.2 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH bluetooth-next 8/9] at86rf230: fix enable_irq handling on async spi 2014-10-07 8:38 [PATCH bluetooth-next 0/9] at86rf230: various fixes and cleanups Alexander Aring ` (6 preceding siblings ...) 2014-10-07 8:38 ` [PATCH bluetooth-next 7/9] at86rf230: fix race condition Alexander Aring @ 2014-10-07 8:38 ` Alexander Aring 2014-10-07 8:38 ` [PATCH bluetooth-next 9/9] at86rf230: remove unnecessary print of async error Alexander Aring 2014-10-07 11:16 ` [PATCH bluetooth-next 0/9] at86rf230: various fixes and cleanups Marcel Holtmann 9 siblings, 0 replies; 15+ messages in thread From: Alexander Aring @ 2014-10-07 8:38 UTC (permalink / raw) To: linux-wpan; +Cc: m.olbrich, Alexander Aring Sometimes the async state function is call in an context where the spi irq is diabled. This patch fix the handling to enable the irq when spi_async failed in the async state change calling chain. We do this by a context parameter irq_enable and evaluate this parameter when spi_async failed instead of returning spi_async errno. Signed-off-by: Alexander Aring <alex.aring@gmail.com> --- drivers/net/ieee802154/at86rf230.c | 157 ++++++++++++++++++------------------- 1 file changed, 77 insertions(+), 80 deletions(-) diff --git a/drivers/net/ieee802154/at86rf230.c b/drivers/net/ieee802154/at86rf230.c index 5dbec64..7a1a8e3 100644 --- a/drivers/net/ieee802154/at86rf230.c +++ b/drivers/net/ieee802154/at86rf230.c @@ -74,6 +74,8 @@ struct at86rf230_state_change { void (*complete)(void *context); u8 from_state; u8 to_state; + + bool irq_enable; }; struct at86rf230_local { @@ -292,10 +294,11 @@ struct at86rf230_local { #define AT86RF2XX_NUMREGS 0x3F -static int +static void at86rf230_async_state_change(struct at86rf230_local *lp, struct at86rf230_state_change *ctx, - const u8 state, void (*complete)(void *context)); + const u8 state, void (*complete)(void *context), + const bool irq_enable); static inline int __at86rf230_write(struct at86rf230_local *lp, @@ -452,7 +455,7 @@ at86rf230_async_error_recover(void *context) struct at86rf230_state_change *ctx = context; struct at86rf230_local *lp = ctx->lp; - at86rf230_async_state_change(lp, ctx, STATE_RX_AACK_ON, NULL); + at86rf230_async_state_change(lp, ctx, STATE_RX_AACK_ON, NULL, false); } static void @@ -462,21 +465,31 @@ at86rf230_async_error(struct at86rf230_local *lp, dev_err(&lp->spi->dev, "spi_async error %d\n", rc); at86rf230_async_state_change(lp, ctx, STATE_FORCE_TRX_OFF, - at86rf230_async_error_recover); + at86rf230_async_error_recover, false); } /* Generic function to get some register value in async mode */ -static int +static void at86rf230_async_read_reg(struct at86rf230_local *lp, const u8 reg, struct at86rf230_state_change *ctx, - void (*complete)(void *context)) + void (*complete)(void *context), + const bool irq_enable) { + int rc; + u8 *tx_buf = ctx->buf; tx_buf[0] = (reg & CMD_REG_MASK) | CMD_REG; ctx->trx.len = 2; ctx->msg.complete = complete; - return spi_async(lp->spi, &ctx->msg); + ctx->irq_enable = irq_enable; + rc = spi_async(lp->spi, &ctx->msg); + if (rc) { + if (irq_enable) + enable_irq(lp->spi->irq); + + at86rf230_async_error(lp, ctx, rc); + } } static void @@ -513,7 +526,8 @@ at86rf230_async_state_assert(void *context) if (ctx->to_state == STATE_TX_ON) { at86rf230_async_state_change(lp, ctx, STATE_FORCE_TX_ON, - ctx->complete); + ctx->complete, + ctx->irq_enable); return; } } @@ -536,7 +550,6 @@ at86rf230_async_state_delay(void *context) struct at86rf230_local *lp = ctx->lp; struct at86rf2xx_chip_data *c = lp->data; bool force = false; - int rc; /* The force state changes are will show as normal states in the * state status subregister. We change the to_state to the @@ -605,10 +618,9 @@ at86rf230_async_state_delay(void *context) udelay(1); change: - rc = at86rf230_async_read_reg(lp, RG_TRX_STATUS, ctx, - at86rf230_async_state_assert); - if (rc) - dev_err(&lp->spi->dev, "spi_async error %d\n", rc); + at86rf230_async_read_reg(lp, RG_TRX_STATUS, ctx, + at86rf230_async_state_assert, + ctx->irq_enable); } static void @@ -623,10 +635,9 @@ at86rf230_async_state_change_start(void *context) /* Check for "possible" STATE_TRANSITION_IN_PROGRESS */ if (trx_state == STATE_TRANSITION_IN_PROGRESS) { udelay(1); - rc = at86rf230_async_read_reg(lp, RG_TRX_STATUS, ctx, - at86rf230_async_state_change_start); - if (rc) - dev_err(&lp->spi->dev, "spi_async error %d\n", rc); + at86rf230_async_read_reg(lp, RG_TRX_STATUS, ctx, + at86rf230_async_state_change_start, + ctx->irq_enable); return; } @@ -648,20 +659,28 @@ at86rf230_async_state_change_start(void *context) ctx->trx.len = 2; ctx->msg.complete = at86rf230_async_state_delay; rc = spi_async(lp->spi, &ctx->msg); - if (rc) + if (rc) { + if (ctx->irq_enable) + enable_irq(lp->spi->irq); + + at86rf230_async_error(lp, &lp->state, rc); dev_err(&lp->spi->dev, "spi_async error %d\n", rc); + } } -static int +static void at86rf230_async_state_change(struct at86rf230_local *lp, struct at86rf230_state_change *ctx, - const u8 state, void (*complete)(void *context)) + const u8 state, void (*complete)(void *context), + const bool irq_enable) { /* Initialization for the state change context */ ctx->to_state = state; ctx->complete = complete; - return at86rf230_async_read_reg(lp, RG_TRX_STATUS, ctx, - at86rf230_async_state_change_start); + ctx->irq_enable = irq_enable; + at86rf230_async_read_reg(lp, RG_TRX_STATUS, ctx, + at86rf230_async_state_change_start, + irq_enable); } static void @@ -682,12 +701,9 @@ at86rf230_sync_state_change(struct at86rf230_local *lp, unsigned int state) { int rc; - rc = at86rf230_async_state_change(lp, &lp->state, state, - at86rf230_sync_state_change_complete); - if (rc) { - at86rf230_async_error(lp, &lp->state, rc); - return rc; - } + at86rf230_async_state_change(lp, &lp->state, state, + at86rf230_sync_state_change_complete, + false); rc = wait_for_completion_timeout(&lp->state_complete, msecs_to_jiffies(100)); @@ -714,12 +730,9 @@ at86rf230_tx_on(void *context) { struct at86rf230_state_change *ctx = context; struct at86rf230_local *lp = ctx->lp; - int rc; - rc = at86rf230_async_state_change(lp, &lp->irq, STATE_RX_AACK_ON, - at86rf230_tx_complete); - if (rc) - at86rf230_async_error(lp, ctx, rc); + at86rf230_async_state_change(lp, &lp->irq, STATE_RX_AACK_ON, + at86rf230_tx_complete, true); } static void @@ -727,12 +740,9 @@ at86rf230_tx_trac_error(void *context) { struct at86rf230_state_change *ctx = context; struct at86rf230_local *lp = ctx->lp; - int rc; - rc = at86rf230_async_state_change(lp, ctx, STATE_TX_ON, - at86rf230_tx_on); - if (rc) - at86rf230_async_error(lp, ctx, rc); + at86rf230_async_state_change(lp, ctx, STATE_TX_ON, + at86rf230_tx_on, true); } static void @@ -742,17 +752,14 @@ at86rf230_tx_trac_check(void *context) struct at86rf230_local *lp = ctx->lp; const u8 *buf = ctx->buf; const u8 trac = (buf[1] & 0xe0) >> 5; - int rc; /* If trac status is different than zero we need to do a state change * to STATE_FORCE_TRX_OFF then STATE_TX_ON to recover the transceiver * state to TX_ON. */ if (trac) { - rc = at86rf230_async_state_change(lp, ctx, STATE_FORCE_TRX_OFF, - at86rf230_tx_trac_error); - if (rc) - at86rf230_async_error(lp, ctx, rc); + at86rf230_async_state_change(lp, ctx, STATE_FORCE_TRX_OFF, + at86rf230_tx_trac_error, true); return; } @@ -765,12 +772,9 @@ at86rf230_tx_trac_status(void *context) { struct at86rf230_state_change *ctx = context; struct at86rf230_local *lp = ctx->lp; - int rc; - rc = at86rf230_async_read_reg(lp, RG_TRX_STATE, ctx, - at86rf230_tx_trac_check); - if (rc) - at86rf230_async_error(lp, ctx, rc); + at86rf230_async_read_reg(lp, RG_TRX_STATE, ctx, + at86rf230_tx_trac_check, true); } static void @@ -823,15 +827,21 @@ at86rf230_rx_read_frame_complete(void *context) at86rf230_rx(lp, buf + 2, len); } -static int +static void at86rf230_rx_read_frame(struct at86rf230_local *lp) { + int rc; + u8 *buf = lp->irq.buf; buf[0] = CMD_FB; lp->irq.trx.len = AT86RF2XX_MAX_BUF; lp->irq.msg.complete = at86rf230_rx_read_frame_complete; - return spi_async(lp->spi, &lp->irq.msg); + rc = spi_async(lp->spi, &lp->irq.msg); + if (rc) { + enable_irq(lp->spi->irq); + at86rf230_async_error(lp, &lp->irq, rc); + } } static void @@ -839,7 +849,6 @@ at86rf230_rx_trac_check(void *context) { struct at86rf230_state_change *ctx = context; struct at86rf230_local *lp = ctx->lp; - int rc; /* Possible check on trac status here. This could be useful to make * some stats why receive is failed. Not used at the moment, but it's @@ -847,14 +856,10 @@ at86rf230_rx_trac_check(void *context) * The programming guide say do it so. */ - rc = at86rf230_rx_read_frame(lp); - if (rc) { - enable_irq(lp->spi->irq); - at86rf230_async_error(lp, ctx, rc); - } + at86rf230_rx_read_frame(lp); } -static int +static void at86rf230_irq_trx_end(struct at86rf230_local *lp) { spin_lock(&lp->lock); @@ -863,17 +868,19 @@ at86rf230_irq_trx_end(struct at86rf230_local *lp) spin_unlock(&lp->lock); if (lp->tx_aret) - return at86rf230_async_state_change(lp, &lp->irq, - STATE_FORCE_TX_ON, - at86rf230_tx_trac_status); + at86rf230_async_state_change(lp, &lp->irq, + STATE_FORCE_TX_ON, + at86rf230_tx_trac_status, + true); else - return at86rf230_async_state_change(lp, &lp->irq, - STATE_RX_AACK_ON, - at86rf230_tx_complete); + at86rf230_async_state_change(lp, &lp->irq, + STATE_RX_AACK_ON, + at86rf230_tx_complete, + true); } else { spin_unlock(&lp->lock); - return at86rf230_async_read_reg(lp, RG_TRX_STATE, &lp->irq, - at86rf230_rx_trac_check); + at86rf230_async_read_reg(lp, RG_TRX_STATE, &lp->irq, + at86rf230_rx_trac_check, true); } } @@ -884,12 +891,9 @@ at86rf230_irq_status(void *context) struct at86rf230_local *lp = ctx->lp; const u8 *buf = lp->irq.buf; const u8 irq = buf[1]; - int rc; if (irq & IRQ_TRX_END) { - rc = at86rf230_irq_trx_end(lp); - if (rc) - at86rf230_async_error(lp, ctx, rc); + at86rf230_irq_trx_end(lp); } else { enable_irq(lp->spi->irq); dev_err(&lp->spi->dev, "not supported irq %02x received\n", @@ -964,12 +968,9 @@ at86rf230_xmit_tx_on(void *context) { struct at86rf230_state_change *ctx = context; struct at86rf230_local *lp = ctx->lp; - int rc; - rc = at86rf230_async_state_change(lp, ctx, STATE_TX_ARET_ON, - at86rf230_write_frame); - if (rc) - at86rf230_async_error(lp, ctx, rc); + at86rf230_async_state_change(lp, ctx, STATE_TX_ARET_ON, + at86rf230_write_frame, false); } static int @@ -990,12 +991,8 @@ at86rf230_xmit(struct ieee802154_dev *dev, struct sk_buff *skb) if (lp->tx_aret) tx_complete = at86rf230_xmit_tx_on; - rc = at86rf230_async_state_change(lp, ctx, STATE_TX_ON, - tx_complete); - if (rc) { - at86rf230_async_error(lp, ctx, rc); - return rc; - } + at86rf230_async_state_change(lp, ctx, STATE_TX_ON, tx_complete, false); + rc = wait_for_completion_interruptible_timeout(&lp->tx_complete, msecs_to_jiffies(lp->data->t_tx_timeout)); if (!rc) { -- 2.1.2 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH bluetooth-next 9/9] at86rf230: remove unnecessary print of async error 2014-10-07 8:38 [PATCH bluetooth-next 0/9] at86rf230: various fixes and cleanups Alexander Aring ` (7 preceding siblings ...) 2014-10-07 8:38 ` [PATCH bluetooth-next 8/9] at86rf230: fix enable_irq handling on async spi Alexander Aring @ 2014-10-07 8:38 ` Alexander Aring 2014-10-07 11:16 ` [PATCH bluetooth-next 0/9] at86rf230: various fixes and cleanups Marcel Holtmann 9 siblings, 0 replies; 15+ messages in thread From: Alexander Aring @ 2014-10-07 8:38 UTC (permalink / raw) To: linux-wpan; +Cc: m.olbrich, Alexander Aring The async error function will already printout the errno over dev_err. Signed-off-by: Alexander Aring <alex.aring@gmail.com> --- drivers/net/ieee802154/at86rf230.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/net/ieee802154/at86rf230.c b/drivers/net/ieee802154/at86rf230.c index 7a1a8e3..6ebd665 100644 --- a/drivers/net/ieee802154/at86rf230.c +++ b/drivers/net/ieee802154/at86rf230.c @@ -664,7 +664,6 @@ at86rf230_async_state_change_start(void *context) enable_irq(lp->spi->irq); at86rf230_async_error(lp, &lp->state, rc); - dev_err(&lp->spi->dev, "spi_async error %d\n", rc); } } -- 2.1.2 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH bluetooth-next 0/9] at86rf230: various fixes and cleanups 2014-10-07 8:38 [PATCH bluetooth-next 0/9] at86rf230: various fixes and cleanups Alexander Aring ` (8 preceding siblings ...) 2014-10-07 8:38 ` [PATCH bluetooth-next 9/9] at86rf230: remove unnecessary print of async error Alexander Aring @ 2014-10-07 11:16 ` Marcel Holtmann 9 siblings, 0 replies; 15+ messages in thread From: Marcel Holtmann @ 2014-10-07 11:16 UTC (permalink / raw) To: Alexander Aring; +Cc: linux-wpan, m.olbrich Hi Alex, > this series fix a race condition when switching to RX_AACK_ON and irq is > enabled. Also contains correct handling of enable_irq if the irq was disabled > before. Additional we fix the handling of lifs/sifs timing in ARET mode. > > - Alex > > Alexander Aring (9): > at86rf230: fix errno on tx timeout handling > at86rf230: add missing error handling > at86rf230: correct aret lifs and sifs handling > at86rf230: correct at86rf2xx lifs timings > at86rf230: squash unnecessary dereferencing > at86rf230: add missing enable_irq > at86rf230: fix race condition > at86rf230: fix enable_irq handling on async spi > at86rf230: remove unnecessary print of async error > > drivers/net/ieee802154/at86rf230.c | 180 +++++++++++++++++++------------------ > 1 file changed, 92 insertions(+), 88 deletions(-) all 9 patches have been applied to bluetooth-next tree. Regards Marcel ^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2014-10-07 11:16 UTC | newest] Thread overview: 15+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-10-07 8:38 [PATCH bluetooth-next 0/9] at86rf230: various fixes and cleanups Alexander Aring 2014-10-07 8:38 ` [PATCH bluetooth-next 1/9] at86rf230: fix errno on tx timeout handling Alexander Aring 2014-10-07 8:54 ` Varka Bhadram 2014-10-07 8:38 ` [PATCH bluetooth-next 2/9] at86rf230: add missing error handling Alexander Aring 2014-10-07 8:38 ` [PATCH bluetooth-next 3/9] at86rf230: correct aret lifs and sifs handling Alexander Aring 2014-10-07 8:51 ` Varka Bhadram 2014-10-07 8:56 ` Alexander Aring 2014-10-07 9:00 ` Varka Bhadram 2014-10-07 8:38 ` [PATCH bluetooth-next 4/9] at86rf230: correct at86rf2xx lifs timings Alexander Aring 2014-10-07 8:38 ` [PATCH bluetooth-next 5/9] at86rf230: squash unnecessary dereferencing Alexander Aring 2014-10-07 8:38 ` [PATCH bluetooth-next 6/9] at86rf230: add missing enable_irq Alexander Aring 2014-10-07 8:38 ` [PATCH bluetooth-next 7/9] at86rf230: fix race condition Alexander Aring 2014-10-07 8:38 ` [PATCH bluetooth-next 8/9] at86rf230: fix enable_irq handling on async spi Alexander Aring 2014-10-07 8:38 ` [PATCH bluetooth-next 9/9] at86rf230: remove unnecessary print of async error Alexander Aring 2014-10-07 11:16 ` [PATCH bluetooth-next 0/9] at86rf230: various fixes and cleanups Marcel Holtmann
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).