From a2d790c92463eb1db7415e2d962c5caa8befd65f Mon Sep 17 00:00:00 2001 From: Koen Zandberg <koen@bergzand.net> Date: Thu, 3 Aug 2017 00:27:39 +0200 Subject: [PATCH] mrf24j40: Add tx_retries_needed netopt --- drivers/include/mrf24j40.h | 1 + drivers/mrf24j40/include/mrf24j40_registers.h | 8 ++++++++ drivers/mrf24j40/mrf24j40_netdev.c | 10 ++++++++++ 3 files changed, 19 insertions(+) diff --git a/drivers/include/mrf24j40.h b/drivers/include/mrf24j40.h index 740d6afcf9..cb7fe79e15 100644 --- a/drivers/include/mrf24j40.h +++ b/drivers/include/mrf24j40.h @@ -139,6 +139,7 @@ typedef struct { uint8_t header_len; /**< length of the header */ uint8_t pending; /**< Flags for pending tasks */ uint8_t irq_flag; /**< Flags for IRQs */ + uint8_t tx_retries; /**< Number of retries needed for last transmission */ } mrf24j40_t; /** diff --git a/drivers/mrf24j40/include/mrf24j40_registers.h b/drivers/mrf24j40/include/mrf24j40_registers.h index da21295ebd..cc5d3c6828 100644 --- a/drivers/mrf24j40/include/mrf24j40_registers.h +++ b/drivers/mrf24j40/include/mrf24j40_registers.h @@ -267,6 +267,14 @@ extern "C" { #define MRF24J40_TXSTAT_TXNSTAT (0x01) /** @} */ +/** + * @name Shift offsets for TXSTAT register (0x24) + * @{ + */ +#define MRF24J40_TXSTAT_MAX_FRAME_RETRIES_SHIFT (6U) +#define MRF24J40_TXSTAT_CCAFAIL_SHIFT (5U) +/** @} */ + /** * @name Bitfield definitions for the SOFTRST register (0x2A) * @{ diff --git a/drivers/mrf24j40/mrf24j40_netdev.c b/drivers/mrf24j40/mrf24j40_netdev.c index a910599e27..29b9abbebe 100644 --- a/drivers/mrf24j40/mrf24j40_netdev.c +++ b/drivers/mrf24j40/mrf24j40_netdev.c @@ -319,6 +319,15 @@ static int _get(netdev_t *netdev, netopt_t opt, void *val, size_t max_len) res = sizeof(int8_t); } break; + case NETOPT_TX_RETRIES_NEEDED: + if (max_len < sizeof(uint8_t)) { + res = -EOVERFLOW; + } + else { + *((uint8_t *)val) = dev->tx_retries; + res = sizeof(int8_t); + } + break; default: /* try netdev settings */ @@ -538,6 +547,7 @@ static void _isr(netdev_t *netdev) #ifdef MODULE_NETSTATS_L2 if (netdev->event_callback && (dev->netdev.flags & MRF24J40_OPT_TELL_TX_END)) { uint8_t txstat = mrf24j40_reg_read_short(dev, MRF24J40_REG_TXSTAT); + dev->tx_retries = (txstat >> MRF24J40_TXSTAT_MAX_FRAME_RETRIES_SHIFT); /* transmision failed */ if (txstat & MRF24J40_TXSTAT_TXNSTAT) { /* TX_NOACK - CCAFAIL */ -- GitLab