Bluetooth: Controller: Relax radio packet pointer assignment deadline

Relax the radio packet pointer assignment deadline assertion
until access address being transmitted. The PDU buffer is
probably only needed just after access address is being
transmitted or received by the radio. This will give some
more breathing room for slow CPUs like in nRF51x SoCs.

Signed-off-by: Vinayak Kariappa Chettimada <vich@nordicsemi.no>
This commit is contained in:
Vinayak Kariappa Chettimada 2024-06-28 14:19:47 +02:00 committed by Fabio Baltieri
commit 4dbfb22a7e
3 changed files with 11 additions and 4 deletions

View file

@ -596,6 +596,7 @@ void radio_status_reset(void)
* EVENT_* registers are not reset to save code and CPU time. * EVENT_* registers are not reset to save code and CPU time.
*/ */
nrf_radio_event_clear(NRF_RADIO, NRF_RADIO_EVENT_READY); nrf_radio_event_clear(NRF_RADIO, NRF_RADIO_EVENT_READY);
nrf_radio_event_clear(NRF_RADIO, NRF_RADIO_EVENT_ADDRESS);
nrf_radio_event_clear(NRF_RADIO, NRF_RADIO_EVENT_END); nrf_radio_event_clear(NRF_RADIO, NRF_RADIO_EVENT_END);
#if defined(CONFIG_BT_CTLR_DF_SUPPORT) && !defined(CONFIG_ZTEST) #if defined(CONFIG_BT_CTLR_DF_SUPPORT) && !defined(CONFIG_ZTEST)
/* Clear it only for SoCs supporting DF extension */ /* Clear it only for SoCs supporting DF extension */
@ -616,6 +617,11 @@ uint32_t radio_is_ready(void)
return (NRF_RADIO->EVENTS_READY != 0); return (NRF_RADIO->EVENTS_READY != 0);
} }
uint32_t radio_is_address(void)
{
return (NRF_RADIO->EVENTS_ADDRESS != 0);
}
#if defined(CONFIG_BT_CTLR_SW_SWITCH_SINGLE_TIMER) #if defined(CONFIG_BT_CTLR_SW_SWITCH_SINGLE_TIMER)
static uint32_t last_pdu_end_us; static uint32_t last_pdu_end_us;

View file

@ -84,6 +84,7 @@ void radio_disable(void);
void radio_status_reset(void); void radio_status_reset(void);
uint32_t radio_is_ready(void); uint32_t radio_is_ready(void);
uint32_t radio_is_address(void);
uint32_t radio_is_done(void); uint32_t radio_is_done(void);
uint32_t radio_has_disabled(void); uint32_t radio_has_disabled(void);
uint32_t radio_is_idle(void); uint32_t radio_is_idle(void);

View file

@ -397,10 +397,10 @@ void lll_conn_isr_rx(void *param)
/* assert if radio packet ptr is not set and radio started tx */ /* assert if radio packet ptr is not set and radio started tx */
if (IS_ENABLED(CONFIG_BT_CTLR_PROFILE_ISR)) { if (IS_ENABLED(CONFIG_BT_CTLR_PROFILE_ISR)) {
LL_ASSERT_MSG(!radio_is_ready(), "%s: Radio ISR latency: %u", __func__, LL_ASSERT_MSG(!radio_is_address(), "%s: Radio ISR latency: %u", __func__,
lll_prof_latency_get()); lll_prof_latency_get());
} else { } else {
LL_ASSERT(!radio_is_ready()); LL_ASSERT(!radio_is_address());
} }
lll_conn_isr_rx_exit: lll_conn_isr_rx_exit:
@ -576,10 +576,10 @@ void lll_conn_isr_tx(void *param)
/* assert if radio packet ptr is not set and radio started rx */ /* assert if radio packet ptr is not set and radio started rx */
if (IS_ENABLED(CONFIG_BT_CTLR_PROFILE_ISR)) { if (IS_ENABLED(CONFIG_BT_CTLR_PROFILE_ISR)) {
LL_ASSERT_MSG(!radio_is_ready(), "%s: Radio ISR latency: %u", __func__, LL_ASSERT_MSG(!radio_is_address(), "%s: Radio ISR latency: %u", __func__,
lll_prof_latency_get()); lll_prof_latency_get());
} else { } else {
LL_ASSERT(!radio_is_ready()); LL_ASSERT(!radio_is_address());
} }
#if defined(CONFIG_BT_CTLR_DF_CONN_CTE_TX) #if defined(CONFIG_BT_CTLR_DF_CONN_CTE_TX)