From 8649a040ce9c449461e4496ce86a23557c0e47ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hubert=20Mi=C5=9B?= Date: Mon, 14 Aug 2017 18:17:42 +0200 Subject: [PATCH] [nRF52840] allow direct transition from TX to SLEEP state (#2095) Currently SEDs perform this transition on ACK timeout. --- .../drivers/radio/nrf_drv_radio802154.c | 3 +++ .../drivers/radio/nrf_drv_radio802154_fsm.c | 16 +++++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/third_party/NordicSemiconductor/drivers/radio/nrf_drv_radio802154.c b/third_party/NordicSemiconductor/drivers/radio/nrf_drv_radio802154.c index 9b8b4b0d2..13b53c737 100644 --- a/third_party/NordicSemiconductor/drivers/radio/nrf_drv_radio802154.c +++ b/third_party/NordicSemiconductor/drivers/radio/nrf_drv_radio802154.c @@ -184,6 +184,9 @@ bool nrf_drv_radio802154_sleep(void) case RADIO_STATE_RX_HEADER: case RADIO_STATE_RX_FRAME: case RADIO_STATE_TX_ACK: + case RADIO_STATE_CCA_BEFORE_TX: + case RADIO_STATE_TX_FRAME: + case RADIO_STATE_RX_ACK: result = nrf_drv_radio802154_request_sleep(); break; diff --git a/third_party/NordicSemiconductor/drivers/radio/nrf_drv_radio802154_fsm.c b/third_party/NordicSemiconductor/drivers/radio/nrf_drv_radio802154_fsm.c index c5bce5d96..432ac75f3 100644 --- a/third_party/NordicSemiconductor/drivers/radio/nrf_drv_radio802154_fsm.c +++ b/third_party/NordicSemiconductor/drivers/radio/nrf_drv_radio802154_fsm.c @@ -1617,14 +1617,14 @@ static inline void irq_handler(void) * * This function is called when MAC layer requests transition from transmit to receive state. */ -static inline void tx_procedure_abort(void) +static inline void tx_procedure_abort(radio_state_t state) { shorts_disable(); assert(nrf_radio_shorts_get() == SHORTS_IDLE); assert(m_mutex); - state_set(RADIO_STATE_WAITING_RX_FRAME); + state_set(state); switch (nrf_radio_state_get()) { @@ -1638,8 +1638,7 @@ static inline void tx_procedure_abort(void) nrf_radio_task_trigger(NRF_RADIO_TASK_DISABLE); } - nrf_radio_mhmu_search_pattern_set(0); - nrf_radio_event_clear(NRF_RADIO_EVENT_MHRMATCH); + ack_matching_disable(); // Clear events that could have happened in critical section due to receiving frame. nrf_radio_event_clear(NRF_RADIO_EVENT_READY); @@ -1712,6 +1711,13 @@ bool nrf_drv_radio802154_fsm_sleep(void) case RADIO_STATE_TX_ACK: break; + case RADIO_STATE_CCA_BEFORE_TX: + case RADIO_STATE_TX_FRAME: + case RADIO_STATE_RX_ACK: + tx_procedure_abort(RADIO_STATE_DISABLING); + result = true; + break; + default: assert(false); // This should not happen. } @@ -1749,7 +1755,7 @@ bool nrf_drv_radio802154_fsm_receive(void) case RADIO_STATE_CCA_BEFORE_TX: case RADIO_STATE_TX_FRAME: case RADIO_STATE_RX_ACK: - tx_procedure_abort(); + tx_procedure_abort(RADIO_STATE_WAITING_RX_FRAME); result = true; break;