* [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
* [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
* [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 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 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
* 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
* 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).