@@ -660,8 +660,16 @@ at86rf230_tx_trac_check(void *context)
{
struct at86rf230_state_change *ctx = context;
struct at86rf230_local *lp = ctx->lp;
+ u8 trac = TRAC_MASK(ctx->buf[1]);
- at86rf230_async_state_change(lp, ctx, STATE_TX_ON, at86rf230_tx_on);
+ switch (trac) {
+ case TRAC_SUCCESS:
+ case TRAC_SUCCESS_DATA_PENDING:
+ at86rf230_async_state_change(lp, ctx, STATE_TX_ON, at86rf230_tx_on);
+ break;
+ default:
+ at86rf230_async_error(lp, ctx, -EIO);
+ }
}
static void
@@ -208,5 +208,13 @@
#define STATE_TRANSITION_IN_PROGRESS 0x1F
#define TRX_STATE_MASK (0x1F)
+#define TRAC_MASK(x) ((x & 0xe0) >> 5)
+
+#define TRAC_SUCCESS 0
+#define TRAC_SUCCESS_DATA_PENDING 1
+#define TRAC_SUCCESS_WAIT_FOR_ACK 2
+#define TRAC_CHANNEL_ACCESS_FAILURE 3
+#define TRAC_NO_ACK 5
+#define TRAC_INVALID 7
#endif /* !_AT86RF230_H */
Let's parse the TRAC register in the Tx path in order to know if the offloaded transmission was successful. If not, let's return early with an error code. Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> --- drivers/net/ieee802154/at86rf230.c | 10 +++++++++- drivers/net/ieee802154/at86rf230.h | 8 ++++++++ 2 files changed, 17 insertions(+), 1 deletion(-)