diff --git a/subsys/bluetooth/controller/ll_sw/ctrl.c b/subsys/bluetooth/controller/ll_sw/ctrl.c index 1c7dc80f586..cbf98ac2b07 100644 --- a/subsys/bluetooth/controller/ll_sw/ctrl.c +++ b/subsys/bluetooth/controller/ll_sw/ctrl.c @@ -8253,6 +8253,10 @@ u32_t radio_adv_enable(u16_t interval, u8_t chl_map, u8_t filter_policy) if (ret_cb == TICKER_STATUS_SUCCESS) { _radio.advertiser.is_enabled = 1; + if (!_radio.scanner.is_enabled) { + ll_adv_scan_state_cb(BIT(0)); + } + return 0; } @@ -8278,6 +8282,10 @@ u32_t radio_adv_disable(void) _radio.advertiser.is_enabled = 0; + if (!_radio.scanner.is_enabled) { + ll_adv_scan_state_cb(0); + } + conn = _radio.advertiser.conn; if (conn) { _radio.advertiser.conn = NULL; @@ -8397,6 +8405,10 @@ u32_t radio_scan_enable(u8_t type, u8_t init_addr_type, u8_t *init_addr, _radio.scanner.is_enabled = 1; + if (!_radio.advertiser.is_enabled) { + ll_adv_scan_state_cb(BIT(1)); + } + return 0; } @@ -8411,6 +8423,10 @@ u32_t radio_scan_disable(void) _radio.scanner.is_enabled = 0; + if (!_radio.advertiser.is_enabled) { + ll_adv_scan_state_cb(0); + } + conn = _radio.scanner.conn; if (conn) { _radio.scanner.conn = NULL; @@ -9107,6 +9123,15 @@ void radio_rx_dequeue(void) LL_ASSERT(0); break; } + + if (radio_pdu_node_rx->hdr.type == NODE_RX_TYPE_CONNECTION) { + u8_t bm = ((u8_t)_radio.scanner.is_enabled << 1) | + _radio.advertiser.is_enabled; + + if (!bm) { + ll_adv_scan_state_cb(0); + } + } } void radio_rx_mem_release(struct radio_pdu_node_rx **radio_pdu_node_rx) @@ -9331,3 +9356,7 @@ u32_t radio_tx_mem_enqueue(u16_t handle, struct radio_pdu_node_tx *node_tx) return 0; } + +void __weak ll_adv_scan_state_cb(u8_t bm) +{ +} diff --git a/subsys/bluetooth/controller/ll_sw/ctrl.h b/subsys/bluetooth/controller/ll_sw/ctrl.h index a7af99cedc9..a8933cf6a6b 100644 --- a/subsys/bluetooth/controller/ll_sw/ctrl.h +++ b/subsys/bluetooth/controller/ll_sw/ctrl.h @@ -356,5 +356,6 @@ u32_t radio_tx_mem_enqueue(u16_t handle, /* Callbacks */ extern void radio_active_callback(u8_t active); extern void radio_event_callback(void); +extern void ll_adv_scan_state_cb(u8_t bm); #endif