[nRF52840] allow direct transition from TX to SLEEP state (#2095)

Currently SEDs perform this transition on ACK timeout.
This commit is contained in:
Hubert Miś
2017-08-14 09:17:42 -07:00
committed by Jonathan Hui
parent f1cd0ce491
commit 8649a040ce
2 changed files with 14 additions and 5 deletions
@@ -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;
@@ -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;