diff --git a/drivers/include/mrf24j40.h b/drivers/include/mrf24j40.h index 740d6afcf9d3356adea050756b196a9c0ce86cae..cb7fe79e1598bf25545efd9f7cd2607ccbe6048a 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 da21295ebd1b7c2e468f3f3e11da173a326bacd2..cc5d3c6828a181ac935e5c815d695ef4a8576503 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 a910599e27b2ebbf5f11ca4a831ae17e486af4a6..29b9abbebe47f634dc71e931e9152c22688ac6aa 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 */