diff --git a/subsys/bluetooth/controller/Kconfig b/subsys/bluetooth/controller/Kconfig index 777bd1a7c4f..79b2c485d21 100644 --- a/subsys/bluetooth/controller/Kconfig +++ b/subsys/bluetooth/controller/Kconfig @@ -438,7 +438,7 @@ endif # BT_CONN config BT_CTLR_CHAN_SEL_2 bool "Channel Selection Algorithm #2" - depends on (BT_CONN || BT_CTLR_ADV_EXT) && BT_CTLR_CHAN_SEL_2_SUPPORT + depends on (BT_CONN || BT_CTLR_ADV_PERIODIC) && BT_CTLR_CHAN_SEL_2_SUPPORT default y help Enable support for Bluetooth 5.0 LE Channel Selection Algorithm #2 in @@ -448,7 +448,6 @@ config BT_CTLR_ADV_EXT bool "LE Advertising Extensions" depends on BT_CTLR_ADV_EXT_SUPPORT select BT_CTLR_SCAN_REQ_NOTIFY - select BT_CTLR_CHAN_SEL_2 help Enable support for Bluetooth 5.0 LE Advertising Extensions in the Controller. @@ -463,6 +462,7 @@ config BT_CTLR_ADV_SET config BT_CTLR_ADV_PERIODIC bool "LE Periodic Advertising" depends on BT_CTLR_ADV_EXT + select BT_CTLR_CHAN_SEL_2 help Enable support for Bluetooth 5.0 LE Periodic Advertising in the Controller. diff --git a/subsys/bluetooth/controller/ll_sw/lll.h b/subsys/bluetooth/controller/ll_sw/lll.h index 7a2ee95c0ac..3c0b640f1ba 100644 --- a/subsys/bluetooth/controller/ll_sw/lll.h +++ b/subsys/bluetooth/controller/ll_sw/lll.h @@ -304,18 +304,8 @@ static inline int lll_stop(void *lll) return ret; } -static inline int lll_is_stop(void *lll) -{ - struct lll_hdr *hdr = lll; - - return !!hdr->is_stop; -} - int lll_init(void); int lll_reset(void); -int lll_prepare(lll_is_abort_cb_t is_abort_cb, lll_abort_cb_t abort_cb, - lll_prepare_cb_t prepare_cb, int prio, - struct lll_prepare_param *prepare_param); void lll_resume(void *param); void lll_disable(void *param); uint32_t lll_radio_is_idle(void); diff --git a/subsys/bluetooth/controller/ll_sw/lll_chan.c b/subsys/bluetooth/controller/ll_sw/lll_chan.c index 5a51e33a44d..5ca84db7096 100644 --- a/subsys/bluetooth/controller/ll_sw/lll_chan.c +++ b/subsys/bluetooth/controller/ll_sw/lll_chan.c @@ -15,12 +15,10 @@ #include #include "hal/debug.h" -#if defined(CONFIG_BT_CONN) static uint8_t chan_sel_remap(uint8_t *chan_map, uint8_t chan_index); #if defined(CONFIG_BT_CTLR_CHAN_SEL_2) static uint16_t chan_prn(uint16_t counter, uint16_t chan_id); #endif /* CONFIG_BT_CTLR_CHAN_SEL_2 */ -#endif /* CONFIG_BT_CONN */ #if defined(CONFIG_BT_CONN) uint8_t lll_chan_sel_1(uint8_t *chan_use, uint8_t hop, uint16_t latency, uint8_t *chan_map, @@ -43,6 +41,7 @@ uint8_t lll_chan_sel_1(uint8_t *chan_use, uint8_t hop, uint16_t latency, uint8_t return chan_next; } +#endif /* CONFIG_BT_CONN */ #if defined(CONFIG_BT_CTLR_CHAN_SEL_2) uint8_t lll_chan_sel_2(uint16_t counter, uint16_t chan_id, uint8_t *chan_map, @@ -168,4 +167,3 @@ static uint16_t chan_prn(uint16_t counter, uint16_t chan_id) return prn_e; } #endif /* CONFIG_BT_CTLR_CHAN_SEL_2 */ -#endif /* CONFIG_BT_CONN */ diff --git a/subsys/bluetooth/controller/ll_sw/lll_conn.h b/subsys/bluetooth/controller/ll_sw/lll_conn.h index 48951eeec16..67ab0389afd 100644 --- a/subsys/bluetooth/controller/ll_sw/lll_conn.h +++ b/subsys/bluetooth/controller/ll_sw/lll_conn.h @@ -127,12 +127,9 @@ uint8_t lll_conn_sca_local_get(void); uint32_t lll_conn_ppm_local_get(void); uint32_t lll_conn_ppm_get(uint8_t sca); void lll_conn_prepare_reset(void); -int lll_conn_is_abort_cb(void *next, int prio, void *curr, - lll_prepare_cb_t *resume_cb, int *resume_prio); void lll_conn_abort_cb(struct lll_prepare_param *prepare_param, void *param); void lll_conn_isr_rx(void *param); void lll_conn_isr_tx(void *param); -void lll_conn_isr_abort(void *param); void lll_conn_rx_pkt_set(struct lll_conn *lll); void lll_conn_tx_pkt_set(struct lll_conn *lll, struct pdu_data *pdu_data_tx); void lll_conn_pdu_tx_prep(struct lll_conn *lll, struct pdu_data **pdu_data_tx); diff --git a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll.c b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll.c index 4ca263b8242..256f90402b5 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll.c +++ b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll.c @@ -56,6 +56,7 @@ static int prepare(lll_is_abort_cb_t is_abort_cb, lll_abort_cb_t abort_cb, lll_prepare_cb_t prepare_cb, int prio, struct lll_prepare_param *prepare_param, uint8_t is_resume); static int resume_enqueue(lll_prepare_cb_t resume_cb, int resume_prio); +static void isr_race(void *param); #if !defined(CONFIG_BT_CTLR_LOW_LAT) static void ticker_start_op_cb(uint32_t status, void *param); @@ -305,6 +306,12 @@ bool lll_is_done(void *param) return !event.curr.abort_cb; } +int lll_is_abort_cb(void *next, int prio, void *curr, + lll_prepare_cb_t *resume_cb, int *resume_prio) +{ + return -ECANCELED; +} + uint32_t lll_evt_offset_get(struct evt_hdr *evt) { if (0) { @@ -391,6 +398,71 @@ int8_t lll_radio_tx_pwr_floor(int8_t tx_pwr_lvl) return radio_tx_power_floor(tx_pwr_lvl); } +void lll_isr_tx_status_reset(void) +{ + radio_status_reset(); + radio_tmr_status_reset(); + + if (IS_ENABLED(CONFIG_BT_CTLR_GPIO_PA_PIN) || + IS_ENABLED(CONFIG_BT_CTLR_GPIO_LNA_PIN)) { + radio_gpio_pa_lna_disable(); + } +} + +void lll_isr_rx_status_reset(void) +{ + radio_status_reset(); + radio_tmr_status_reset(); + radio_rssi_status_reset(); + + if (IS_ENABLED(CONFIG_BT_CTLR_GPIO_PA_PIN) || + IS_ENABLED(CONFIG_BT_CTLR_GPIO_LNA_PIN)) { + radio_gpio_pa_lna_disable(); + } +} + +void lll_isr_status_reset(void) +{ + radio_status_reset(); + radio_tmr_status_reset(); + radio_filter_status_reset(); + radio_ar_status_reset(); + radio_rssi_status_reset(); + + if (IS_ENABLED(CONFIG_BT_CTLR_GPIO_PA_PIN) || + IS_ENABLED(CONFIG_BT_CTLR_GPIO_LNA_PIN)) { + radio_gpio_pa_lna_disable(); + } +} + +inline void lll_isr_abort(void *param) +{ + lll_isr_status_reset(); + lll_isr_cleanup(param); +} + +void lll_isr_done(void *param) +{ + lll_isr_abort(param); +} + +void lll_isr_cleanup(void *param) +{ + int err; + + radio_isr_set(isr_race, param); + if (!radio_is_idle()) { + radio_disable(); + } + + radio_tmr_stop(); + + err = lll_hfclock_off(); + LL_ASSERT(!err || err == -EBUSY); + + lll_done(NULL); +} + static int init_reset(void) { return 0; @@ -494,6 +566,12 @@ static int resume_enqueue(lll_prepare_cb_t resume_cb, int resume_prio) &prepare_param, resume_cb, resume_prio, 1); } +static void isr_race(void *param) +{ + /* NOTE: lll_disable could have a race with ... */ + radio_status_reset(); +} + #if !defined(CONFIG_BT_CTLR_LOW_LAT) static void ticker_start_op_cb(uint32_t status, void *param) { diff --git a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv.c b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv.c index 96b24d11197..4fddb827e7e 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv.c +++ b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv.c @@ -53,8 +53,6 @@ static void isr_tx(void *param); static void isr_rx(void *param); static void isr_done(void *param); static void isr_abort(void *param); -static void isr_cleanup(void *param); -static void isr_race(void *param); static struct pdu_adv *chan_prepare(struct lll_adv *lll); #if defined(CONFIG_BT_CTLR_ADV_EXT) @@ -335,20 +333,12 @@ static void isr_tx(void *param) { uint32_t hcto; - /* TODO: MOVE to a common interface, isr_lll_radio_status? */ if (IS_ENABLED(CONFIG_BT_CTLR_PROFILE_ISR)) { lll_prof_latency_capture(); } - /* Clear radio status and events */ - radio_status_reset(); - radio_tmr_status_reset(); - - if (IS_ENABLED(CONFIG_BT_CTLR_GPIO_PA_PIN) || - IS_ENABLED(CONFIG_BT_CTLR_GPIO_LNA_PIN)) { - radio_gpio_pa_lna_disable(); - } - /* TODO: MOVE ^^ */ + /* Clear radio tx status and events */ + lll_isr_tx_status_reset(); /* setup tIFS switching */ radio_tmr_tifs_set(EVENT_IFS_US); @@ -440,17 +430,9 @@ static void isr_rx(void *param) } /* Clear radio status and events */ - radio_status_reset(); - radio_tmr_status_reset(); - radio_filter_status_reset(); - radio_ar_status_reset(); - radio_rssi_status_reset(); - - if (IS_ENABLED(CONFIG_BT_CTLR_GPIO_PA_PIN) || - IS_ENABLED(CONFIG_BT_CTLR_GPIO_LNA_PIN)) { - radio_gpio_pa_lna_disable(); - } + lll_isr_status_reset(); + /* No Rx */ if (!trx_done) { goto isr_rx_do_close; } @@ -479,19 +461,8 @@ static void isr_done(void *param) struct node_rx_hdr *node_rx; struct lll_adv *lll = param; - /* TODO: MOVE to a common interface, isr_lll_radio_status? */ /* Clear radio status and events */ - radio_status_reset(); - radio_tmr_status_reset(); - radio_filter_status_reset(); - radio_ar_status_reset(); - radio_rssi_status_reset(); - - if (IS_ENABLED(CONFIG_BT_CTLR_GPIO_PA_PIN) || - IS_ENABLED(CONFIG_BT_CTLR_GPIO_LNA_PIN)) { - radio_gpio_pa_lna_disable(); - } - /* TODO: MOVE ^^ */ + lll_isr_status_reset(); #if defined(CONFIG_BT_HCI_MESH_EXT) if (_radio.advertiser.is_mesh && @@ -594,49 +565,17 @@ static void isr_done(void *param) ARG_UNUSED(node_rx); #endif /* !CONFIG_BT_CTLR_ADV_INDICATION */ - isr_cleanup(param); + lll_isr_cleanup(param); } static void isr_abort(void *param) { /* Clear radio status and events */ - radio_status_reset(); - radio_tmr_status_reset(); - radio_filter_status_reset(); - radio_ar_status_reset(); - radio_rssi_status_reset(); - - if (IS_ENABLED(CONFIG_BT_CTLR_GPIO_PA_PIN) || - IS_ENABLED(CONFIG_BT_CTLR_GPIO_LNA_PIN)) { - radio_gpio_pa_lna_disable(); - } + lll_isr_status_reset(); radio_filter_disable(); - isr_cleanup(param); -} - -static void isr_cleanup(void *param) -{ - int err; - - radio_isr_set(isr_race, param); - if (!radio_is_idle()) { - radio_disable(); - } - - radio_tmr_stop(); - - err = lll_hfclock_off(); - LL_ASSERT(!err || err == -EBUSY); - - lll_done(NULL); -} - -static void isr_race(void *param) -{ - /* NOTE: lll_disable could have a race with ... */ - radio_status_reset(); + lll_isr_cleanup(param); } static struct pdu_adv *chan_prepare(struct lll_adv *lll) diff --git a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv.h b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv.h index 3a9ff095a7e..30d52efe5ff 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv.h +++ b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv.h @@ -19,6 +19,14 @@ struct lll_adv_sync { uint8_t access_addr[4]; uint8_t crc_init[3]; + uint16_t latency_prepare; + uint16_t latency_event; + uint16_t event_counter; + + uint8_t data_chan_map[5]; + uint8_t data_chan_count:6; + uint16_t data_chan_id; + struct lll_adv_pdu data; }; diff --git a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv_aux.c b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv_aux.c index 47253a9ec14..d02dbc22a1c 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv_aux.c +++ b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv_aux.c @@ -31,10 +31,6 @@ #include #include "hal/debug.h" -static void isr_done(void *param); -static void isr_cleanup(void *param); -static void isr_race(void *param); - void lll_adv_aux_prepare(struct lll_adv *lll) { struct pdu_adv_com_ext_adv *p; @@ -72,7 +68,7 @@ void lll_adv_aux_prepare(struct lll_adv *lll) lll_chan_set(aux->chan_idx); /* TODO: Based on adv_mode switch to Rx, if needed */ - radio_isr_set(isr_done, lll); + radio_isr_set(lll_isr_done, lll); radio_switch_complete_and_disable(); start_us = 1000; @@ -88,41 +84,3 @@ void lll_adv_aux_prepare(struct lll_adv *lll) CONFIG_BT_CTLR_GPIO_PA_OFFSET); #endif /* !CONFIG_BT_CTLR_GPIO_PA_PIN */ } - -static void isr_done(void *param) -{ - /* TODO: MOVE to a common interface, isr_lll_radio_status? */ - /* Clear radio status and events */ - radio_status_reset(); - radio_tmr_status_reset(); - radio_filter_status_reset(); - radio_ar_status_reset(); - radio_rssi_status_reset(); - - if (IS_ENABLED(CONFIG_BT_CTLR_GPIO_PA_PIN) || - IS_ENABLED(CONFIG_BT_CTLR_GPIO_LNA_PIN)) { - radio_gpio_pa_lna_disable(); - } - /* TODO: MOVE ^^ */ - - isr_cleanup(param); -} - -static void isr_cleanup(void *param) -{ - int err; - - radio_isr_set(isr_race, param); - radio_tmr_stop(); - - err = lll_hfclock_off(); - LL_ASSERT(!err || err == -EBUSY); - - lll_done(NULL); -} - -static void isr_race(void *param) -{ - /* NOTE: lll_disable could have a race with ... */ - radio_status_reset(); -} diff --git a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv_sync.c b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv_sync.c index ab4f7491033..26f737b3c37 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv_sync.c +++ b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv_sync.c @@ -14,6 +14,7 @@ #include "hal/radio.h" #include "hal/ticker.h" +#include "util/util.h" #include "util/memq.h" #include "pdu.h" @@ -22,19 +23,22 @@ #include "lll_vendor.h" #include "lll_clock.h" #include "lll_chan.h" +#include "lll_adv.h" #include "lll_adv_sync.h" #include "lll_internal.h" +#include "lll_adv_internal.h" #include "lll_tim_internal.h" #define BT_DBG_ENABLED IS_ENABLED(CONFIG_BT_DEBUG_HCI_DRIVER) -#define LOG_MODULE_NAME bt_ctlr_lll_master +#define LOG_MODULE_NAME bt_ctlr_lll_adv_sync #include "common/log.h" #include #include "hal/debug.h" static int init_reset(void); static int prepare_cb(struct lll_prepare_param *prepare_param); +static void abort_cb(struct lll_prepare_param *prepare_param, void *param); int lll_adv_sync_init(void) { @@ -68,8 +72,7 @@ void lll_adv_sync_prepare(void *param) err = lll_hfclock_on(); LL_ASSERT(!err || err == -EINPROGRESS); - err = lll_prepare(lll_conn_is_abort_cb, lll_conn_abort_cb, prepare_cb, - 0, p); + err = lll_prepare(lll_is_abort_cb, abort_cb, prepare_cb, 0, p); LL_ASSERT(!err || err == -EINPROGRESS); } @@ -82,12 +85,14 @@ static int prepare_cb(struct lll_prepare_param *prepare_param) { struct lll_adv_sync *lll = prepare_param->param; uint32_t ticks_at_event, ticks_at_start; + struct pdu_adv *pdu; struct evt_hdr *evt; uint16_t event_counter; uint32_t remainder_us; uint8_t data_chan_use; uint32_t remainder; uint16_t lazy; + uint8_t upd; DEBUG_RADIO_START_A(1); @@ -102,12 +107,8 @@ static int prepare_cb(struct lll_prepare_param *prepare_param) /* store the next event counter value */ lll->event_counter = event_counter + 1; - /* TODO: Do the above in ULL ? */ - /* Reset connection event global variables */ - lll_conn_prepare_reset(); - /* TODO: can we do something in ULL? */ lll->latency_event = lll->latency_prepare; lll->latency_prepare = 0; @@ -132,18 +133,12 @@ static int prepare_cb(struct lll_prepare_param *prepare_param) ((uint32_t)lll->crc_init[0]))); lll_chan_set(data_chan_use); - /* setup the radio tx packet buffer */ - lll_conn_tx_pkt_set(lll, pdu_data_tx); + pdu = lll_adv_sync_data_latest_get(lll, &upd); + radio_pkt_tx_set(pdu); - radio_isr_set(lll_conn_isr_tx, lll); - - radio_tmr_tifs_set(EVENT_IFS_US); - -#if defined(CONFIG_BT_CTLR_PHY) - radio_switch_complete_and_rx(lll->phy_rx); -#else /* !CONFIG_BT_CTLR_PHY */ - radio_switch_complete_and_rx(0); -#endif /* !CONFIG_BT_CTLR_PHY */ + /* TODO: chaining */ + radio_isr_set(lll_isr_done, lll); + radio_switch_complete_and_disable(); ticks_at_event = prepare_param->ticks_at_expire; evt = HDR_LLL2EVT(lll); @@ -155,9 +150,6 @@ static int prepare_cb(struct lll_prepare_param *prepare_param) remainder = prepare_param->remainder; remainder_us = radio_tmr_start(1, ticks_at_start, remainder); - /* capture end of Tx-ed PDU, used to calculate HCTO. */ - radio_tmr_end_capture(); - #if defined(CONFIG_BT_CTLR_GPIO_PA_PIN) radio_gpio_pa_setup(); @@ -178,9 +170,10 @@ static int prepare_cb(struct lll_prepare_param *prepare_param) #if defined(CONFIG_BT_CTLR_XTAL_ADVANCED) && \ (EVENT_OVERHEAD_PREEMPT_US <= EVENT_OVERHEAD_PREEMPT_MIN_US) /* check if preempt to start has changed */ - if (lll_preempt_calc(evt, (TICKER_ID_CONN_BASE + lll->handle), + if (lll_preempt_calc(evt, (TICKER_ID_ADV_SYNC_BASE + + ull_adv_sync_lll_handle_get(lll)), ticks_at_event)) { - radio_isr_set(lll_conn_isr_abort, lll); + radio_isr_set(lll_isr_abort, lll); radio_disable(); } else #endif /* CONFIG_BT_CTLR_XTAL_ADVANCED */ @@ -191,7 +184,31 @@ static int prepare_cb(struct lll_prepare_param *prepare_param) LL_ASSERT(!ret); } - DEBUG_RADIO_START_M(1); + DEBUG_RADIO_START_A(1); return 0; } + +static void abort_cb(struct lll_prepare_param *prepare_param, void *param) +{ + int err; + + /* NOTE: This is not a prepare being cancelled */ + if (!prepare_param) { + /* Perform event abort here. + * After event has been cleanly aborted, clean up resources + * and dispatch event done. + */ + radio_isr_set(lll_isr_done, param); + radio_disable(); + return; + } + + /* NOTE: Else clean the top half preparations of the aborted event + * currently in preparation pipeline. + */ + err = lll_hfclock_off(); + LL_ASSERT(!err || err == -EBUSY); + + lll_done(param); +} diff --git a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv_sync.h b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv_sync.h index 020dd7ac8d4..25c46889d7f 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv_sync.h +++ b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv_sync.h @@ -7,3 +7,5 @@ int lll_adv_sync_init(void); int lll_adv_sync_reset(void); void lll_adv_sync_prepare(void *param); + +extern uint16_t ull_adv_sync_lll_handle_get(struct lll_adv_sync *lll); diff --git a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_conn.c b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_conn.c index 87f85ffa22a..3dc4b2e53ff 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_conn.c +++ b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_conn.c @@ -37,8 +37,6 @@ static int init_reset(void); static void isr_done(void *param); -static void isr_cleanup(void *param); -static void isr_race(void *param); static int isr_rx_pdu(struct lll_conn *lll, struct pdu_data *pdu_data_rx, struct node_tx **tx_release, uint8_t *is_rx_enqueue); static struct pdu_data *empty_tx_enqueue(struct lll_conn *lll); @@ -102,12 +100,6 @@ void lll_conn_prepare_reset(void) #endif /* CONFIG_BT_CTLR_LE_ENC */ } -int lll_conn_is_abort_cb(void *next, int prio, void *curr, - lll_prepare_cb_t *resume_cb, int *resume_prio) -{ - return -ECANCELED; -} - void lll_conn_abort_cb(struct lll_prepare_param *prepare_param, void *param) { int err; @@ -161,16 +153,10 @@ void lll_conn_isr_rx(void *param) crc_ok = rssi_ready = 0U; } - /* Clear radio status and events */ - radio_status_reset(); - radio_tmr_status_reset(); - radio_rssi_status_reset(); - -#if defined(CONFIG_BT_CTLR_GPIO_PA_PIN) || \ - defined(CONFIG_BT_CTLR_GPIO_LNA_PIN) - radio_gpio_pa_lna_disable(); -#endif /* CONFIG_BT_CTLR_GPIO_PA_PIN || CONFIG_BT_CTLR_GPIO_LNA_PIN */ + /* Clear radio rx status and events */ + lll_isr_rx_status_reset(); + /* No Rx */ if (!trx_done) { radio_isr_set(isr_done, param); radio_disable(); @@ -367,16 +353,8 @@ void lll_conn_isr_tx(void *param) struct lll_conn *lll = (void *)param; uint32_t hcto; - /* TODO: MOVE to a common interface, isr_lll_radio_status? */ - /* Clear radio status and events */ - radio_status_reset(); - radio_tmr_status_reset(); - -#if defined(CONFIG_BT_CTLR_GPIO_PA_PIN) || \ - defined(CONFIG_BT_CTLR_GPIO_LNA_PIN) - radio_gpio_pa_lna_disable(); -#endif /* CONFIG_BT_CTLR_GPIO_PA_PIN || CONFIG_BT_CTLR_GPIO_LNA_PIN */ - /* TODO: MOVE ^^ */ + /* Clear radio tx status and events */ + lll_isr_tx_status_reset(); /* setup tIFS switching */ radio_tmr_tifs_set(EVENT_IFS_US); @@ -436,23 +414,6 @@ void lll_conn_isr_tx(void *param) radio_isr_set(lll_conn_isr_rx, param); } -void lll_conn_isr_abort(void *param) -{ - /* Clear radio status and events */ - radio_status_reset(); - radio_tmr_status_reset(); - radio_filter_status_reset(); - radio_ar_status_reset(); - radio_rssi_status_reset(); - - if (IS_ENABLED(CONFIG_BT_CTLR_GPIO_PA_PIN) || - IS_ENABLED(CONFIG_BT_CTLR_GPIO_LNA_PIN)) { - radio_gpio_pa_lna_disable(); - } - - isr_cleanup(param); -} - void lll_conn_rx_pkt_set(struct lll_conn *lll) { struct node_rx_pdu *node_rx; @@ -595,19 +556,7 @@ static void isr_done(void *param) { struct event_done_extra *e; - /* TODO: MOVE to a common interface, isr_lll_radio_status? */ - /* Clear radio status and events */ - radio_status_reset(); - radio_tmr_status_reset(); - radio_filter_status_reset(); - radio_ar_status_reset(); - radio_rssi_status_reset(); - -#if defined(CONFIG_BT_CTLR_GPIO_PA_PIN) || \ - defined(CONFIG_BT_CTLR_GPIO_LNA_PIN) - radio_gpio_pa_lna_disable(); -#endif /* CONFIG_BT_CTLR_GPIO_PA_PIN || CONFIG_BT_CTLR_GPIO_LNA_PIN */ - /* TODO: MOVE ^^ */ + lll_isr_status_reset(); e = ull_event_done_extra_get(); LL_ASSERT(e); @@ -648,30 +597,7 @@ static void isr_done(void *param) } #endif /* CONFIG_BT_PERIPHERAL */ - isr_cleanup(param); -} - -static void isr_cleanup(void *param) -{ - int err; - - radio_isr_set(isr_race, param); - if (!radio_is_idle()) { - radio_disable(); - } - - radio_tmr_stop(); - - err = lll_hfclock_off(); - LL_ASSERT(!err || err == -EBUSY); - - lll_done(NULL); -} - -static void isr_race(void *param) -{ - /* NOTE: lll_disable could have a race with ... */ - radio_status_reset(); + lll_isr_cleanup(param); } static inline bool ctrl_pdu_len_check(uint8_t len) diff --git a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_internal.h b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_internal.h index 31a137d9212..1a9928d5c9c 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_internal.h +++ b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_internal.h @@ -4,11 +4,29 @@ * SPDX-License-Identifier: Apache-2.0 */ +int lll_prepare(lll_is_abort_cb_t is_abort_cb, lll_abort_cb_t abort_cb, + lll_prepare_cb_t prepare_cb, int prio, + struct lll_prepare_param *prepare_param); int lll_prepare_done(void *param); int lll_done(void *param); bool lll_is_done(void *param); +int lll_is_abort_cb(void *next, int prio, void *curr, + lll_prepare_cb_t *resume_cb, int *resume_prio); + +static inline int lll_is_stop(void *lll) +{ + struct lll_hdr *hdr = lll; + + return !!hdr->is_stop; +} uint32_t lll_evt_offset_get(struct evt_hdr *evt); uint32_t lll_preempt_calc(struct evt_hdr *evt, uint8_t ticker_id, uint32_t ticks_at_event); void lll_chan_set(uint32_t chan); uint8_t lll_entropy_get(uint8_t len, void *rand); +void lll_isr_tx_status_reset(void); +void lll_isr_rx_status_reset(void); +void lll_isr_status_reset(void); +void lll_isr_abort(void *param); +void lll_isr_done(void *param); +void lll_isr_cleanup(void *param); diff --git a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_master.c b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_master.c index 5eec4835bbb..f2e5918d7e8 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_master.c +++ b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_master.c @@ -78,7 +78,7 @@ void lll_master_prepare(void *param) lll->latency_prepare += elapsed; /* Invoke common pipeline handling of prepare */ - err = lll_prepare(lll_conn_is_abort_cb, lll_conn_abort_cb, prepare_cb, + err = lll_prepare(lll_is_abort_cb, lll_conn_abort_cb, prepare_cb, 0, p); LL_ASSERT(!err || err == -EINPROGRESS); } @@ -201,7 +201,7 @@ static int prepare_cb(struct lll_prepare_param *prepare_param) /* check if preempt to start has changed */ if (lll_preempt_calc(evt, (TICKER_ID_CONN_BASE + lll->handle), ticks_at_event)) { - radio_isr_set(lll_conn_isr_abort, lll); + radio_isr_set(lll_isr_abort, lll); radio_disable(); } else #endif /* CONFIG_BT_CTLR_XTAL_ADVANCED */ diff --git a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_scan.c b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_scan.c index 4fc30f74f8e..2e7c9895f0d 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_scan.c +++ b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_scan.c @@ -55,7 +55,6 @@ static void isr_done(void *param); static void isr_window(void *param); static void isr_abort(void *param); static void isr_cleanup(void *param); -static void isr_race(void *param); static inline bool isr_rx_scan_check(struct lll_scan *lll, uint8_t irkmatch_ok, uint8_t devmatch_ok, uint8_t rl_idx); @@ -404,17 +403,9 @@ static void isr_rx(void *param) } /* Clear radio status and events */ - radio_status_reset(); - radio_tmr_status_reset(); - radio_filter_status_reset(); - radio_ar_status_reset(); - radio_rssi_status_reset(); - - if (IS_ENABLED(CONFIG_BT_CTLR_GPIO_PA_PIN) || - IS_ENABLED(CONFIG_BT_CTLR_GPIO_LNA_PIN)) { - radio_gpio_pa_lna_disable(); - } + lll_isr_status_reset(); + /* No Rx */ if (!trx_done) { goto isr_rx_do_close; } @@ -453,16 +444,8 @@ static void isr_tx(void *param) struct node_rx_pdu *node_rx; uint32_t hcto; - /* TODO: MOVE to a common interface, isr_lll_radio_status? */ /* Clear radio status and events */ - radio_status_reset(); - radio_tmr_status_reset(); - - if (IS_ENABLED(CONFIG_BT_CTLR_GPIO_PA_PIN) || - IS_ENABLED(CONFIG_BT_CTLR_GPIO_LNA_PIN)) { - radio_gpio_pa_lna_disable(); - } - /* TODO: MOVE ^^ */ + lll_isr_tx_status_reset(); /* setup tIFS switching */ radio_tmr_tifs_set(EVENT_IFS_US); @@ -507,19 +490,8 @@ static void isr_common_done(void *param) { struct node_rx_pdu *node_rx; - /* TODO: MOVE to a common interface, isr_lll_radio_status? */ /* Clear radio status and events */ - radio_status_reset(); - radio_tmr_status_reset(); - radio_filter_status_reset(); - radio_ar_status_reset(); - radio_rssi_status_reset(); - - if (IS_ENABLED(CONFIG_BT_CTLR_GPIO_PA_PIN) || - IS_ENABLED(CONFIG_BT_CTLR_GPIO_LNA_PIN)) { - radio_gpio_pa_lna_disable(); - } - /* TODO: MOVE ^^ */ + lll_isr_status_reset(); /* setup tIFS switching */ radio_tmr_tifs_set(EVENT_IFS_US); @@ -595,16 +567,7 @@ static void isr_window(void *param) static void isr_abort(void *param) { /* Clear radio status and events */ - radio_status_reset(); - radio_tmr_status_reset(); - radio_filter_status_reset(); - radio_ar_status_reset(); - radio_rssi_status_reset(); - - if (IS_ENABLED(CONFIG_BT_CTLR_GPIO_PA_PIN) || - IS_ENABLED(CONFIG_BT_CTLR_GPIO_LNA_PIN)) { - radio_gpio_pa_lna_disable(); - } + lll_isr_status_reset(); /* Scanner stop can expire while here in this ISR. * Deferred attempt to stop can fail as it would have @@ -623,7 +586,6 @@ static void isr_cleanup(void *param) { struct lll_scan *lll = param; struct node_rx_hdr *node_rx; - int err; if (lll_is_done(param)) { return; @@ -657,23 +619,7 @@ static void isr_cleanup(void *param) ARG_UNUSED(node_rx); #endif /* !CONFIG_BT_CTLR_SCAN_INDICATION */ - radio_isr_set(isr_race, param); - if (!radio_is_idle()) { - radio_disable(); - } - - radio_tmr_stop(); - - err = lll_hfclock_off(); - LL_ASSERT(!err || err == -EBUSY); - - lll_done(NULL); -} - -static void isr_race(void *param) -{ - /* NOTE: lll_disable could have a race with ... */ - radio_status_reset(); + lll_isr_cleanup(param); } static inline bool isr_rx_scan_check(struct lll_scan *lll, uint8_t irkmatch_ok, diff --git a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_slave.c b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_slave.c index 4963d989f94..39422eb4fe3 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_slave.c +++ b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_slave.c @@ -243,7 +243,7 @@ static int prepare_cb(struct lll_prepare_param *prepare_param) /* check if preempt to start has changed */ if (lll_preempt_calc(evt, (TICKER_ID_CONN_BASE + lll->handle), ticks_at_event)) { - radio_isr_set(lll_conn_isr_abort, lll); + radio_isr_set(lll_isr_abort, lll); radio_disable(); } else #endif /* CONFIG_BT_CTLR_XTAL_ADVANCED */ diff --git a/subsys/bluetooth/controller/ll_sw/ull_adv.c b/subsys/bluetooth/controller/ll_sw/ull_adv.c index 0bda5961ac7..ba3a56763ef 100644 --- a/subsys/bluetooth/controller/ll_sw/ull_adv.c +++ b/subsys/bluetooth/controller/ll_sw/ull_adv.c @@ -1049,9 +1049,11 @@ int ull_adv_init(void) { int err; - err = ull_adv_sync_init(); - if (err) { - return err; + if (IS_ENABLED(CONFIG_BT_CTLR_ADV_PERIODIC)) { + err = ull_adv_sync_init(); + if (err) { + return err; + } } err = init_reset(); @@ -1067,9 +1069,11 @@ int ull_adv_reset(void) uint8_t handle; int err; - err = ull_adv_sync_reset(); - if (err) { - return err; + if (IS_ENABLED(CONFIG_BT_CTLR_ADV_PERIODIC)) { + err = ull_adv_sync_reset(); + if (err) { + return err; + } } for (handle = 0U; handle < BT_CTLR_ADV_MAX; handle++) { diff --git a/subsys/bluetooth/controller/ll_sw/ull_adv_sync.c b/subsys/bluetooth/controller/ll_sw/ull_adv_sync.c index 95d8dfae821..5099842a2f2 100644 --- a/subsys/bluetooth/controller/ll_sw/ull_adv_sync.c +++ b/subsys/bluetooth/controller/ll_sw/ull_adv_sync.c @@ -21,6 +21,7 @@ #include "lll.h" #include "lll_vendor.h" #include "lll_adv.h" +#include "lll_adv_sync.h" #include "ull_adv_types.h" @@ -162,6 +163,11 @@ int ull_adv_sync_reset(void) return 0; } +uint16_t ull_adv_sync_lll_handle_get(struct lll_adv_sync *lll) +{ + return sync_handle_get((void *)lll->hdr.parent); +} + uint32_t ull_adv_sync_start(struct ll_adv_sync_set *sync, uint32_t ticks_anchor, uint32_t volatile *ret_cb) {