Bluetooth: controller: split: Refactor to reuse common ISR code
Refactor to reuse common repeated code in ISR that reset status, and performed abort, done and cleanup. Signed-off-by: Vinayak Kariappa Chettimada <vich@nordicsemi.no>
This commit is contained in:
parent
f0174527f9
commit
bb720d68ce
17 changed files with 191 additions and 304 deletions
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -15,12 +15,10 @@
|
|||
#include <soc.h>
|
||||
#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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
@ -31,10 +31,6 @@
|
|||
#include <soc.h>
|
||||
#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();
|
||||
}
|
||||
|
|
|
@ -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 <soc.h>
|
||||
#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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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++) {
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue