Bluetooth: controller: split: SCAN_RSP for ADV_IND or SCAN_IND
Added implementation to differentiate SCAN_RSP received for ADV_IND or SCAN_IND PDU. Signed-off-by: Vinayak Kariappa Chettimada <vich@nordicsemi.no>
This commit is contained in:
parent
60a117c6ca
commit
d9523c5005
3 changed files with 24 additions and 4 deletions
|
@ -75,7 +75,6 @@ static inline bool isr_scan_rsp_adva_matches(struct pdu_adv *srsp);
|
|||
static uint32_t isr_rx_scan_report(struct lll_scan *lll, uint8_t rssi_ready,
|
||||
uint8_t rl_idx, bool dir_report);
|
||||
|
||||
|
||||
int lll_scan_init(void)
|
||||
{
|
||||
int err;
|
||||
|
@ -147,6 +146,7 @@ static int prepare_cb(struct lll_prepare_param *p)
|
|||
lll->state = 0U;
|
||||
|
||||
radio_reset();
|
||||
|
||||
#if defined(CONFIG_BT_CTLR_TX_PWR_DYNAMIC_CONTROL)
|
||||
radio_tx_power_set(lll->tx_pwr_lvl);
|
||||
#else
|
||||
|
@ -157,6 +157,8 @@ static int prepare_cb(struct lll_prepare_param *p)
|
|||
/* TODO: if coded we use S8? */
|
||||
radio_phy_set(lll->phy, 1);
|
||||
radio_pkt_configure(8, PDU_AC_PAYLOAD_SIZE_MAX, (lll->phy << 1));
|
||||
|
||||
lll->is_adv_ind = 0U;
|
||||
#else /* !CONFIG_BT_CTLR_ADV_EXT */
|
||||
radio_phy_set(0, 0);
|
||||
radio_pkt_configure(8, PDU_AC_PAYLOAD_SIZE_MAX, 0);
|
||||
|
@ -525,6 +527,10 @@ static void isr_done(void *param)
|
|||
|
||||
lll->state = 0U;
|
||||
|
||||
#if defined(CONFIG_BT_CTLR_ADV_EXT)
|
||||
lll->is_adv_ind = 0U;
|
||||
#endif /* CONFIG_BT_CTLR_ADV_EXT */
|
||||
|
||||
#if defined(CONFIG_BT_CTLR_GPIO_LNA_PIN)
|
||||
start_us = radio_tmr_start_now(0);
|
||||
|
||||
|
@ -930,6 +936,13 @@ static inline uint32_t isr_rx_pdu(struct lll_scan *lll, uint8_t devmatch_ok,
|
|||
|
||||
/* switch scanner state to active */
|
||||
lll->state = 1U;
|
||||
|
||||
#if defined(CONFIG_BT_CTLR_ADV_EXT)
|
||||
if (pdu_adv_rx->type == PDU_ADV_TYPE_ADV_IND) {
|
||||
lll->is_adv_ind = 1U;
|
||||
}
|
||||
#endif /* CONFIG_BT_CTLR_ADV_EXT */
|
||||
|
||||
radio_isr_set(isr_tx, lll);
|
||||
|
||||
return 0;
|
||||
|
@ -1061,7 +1074,6 @@ static uint32_t isr_rx_scan_report(struct lll_scan *lll, uint8_t rssi_ready,
|
|||
uint8_t rl_idx, bool dir_report)
|
||||
{
|
||||
struct node_rx_pdu *node_rx;
|
||||
struct pdu_adv *pdu_adv_rx;
|
||||
|
||||
node_rx = ull_pdu_rx_alloc_peek(3);
|
||||
if (!node_rx) {
|
||||
|
@ -1081,6 +1093,8 @@ static uint32_t isr_rx_scan_report(struct lll_scan *lll, uint8_t rssi_ready,
|
|||
|
||||
#if defined(CONFIG_BT_CTLR_ADV_EXT)
|
||||
} else if (lll->phy) {
|
||||
struct pdu_adv *pdu_adv_rx;
|
||||
|
||||
switch (lll->phy) {
|
||||
case BIT(0):
|
||||
node_rx->hdr.type = NODE_RX_TYPE_EXT_1M_REPORT;
|
||||
|
@ -1094,13 +1108,17 @@ static uint32_t isr_rx_scan_report(struct lll_scan *lll, uint8_t rssi_ready,
|
|||
LL_ASSERT(0);
|
||||
break;
|
||||
}
|
||||
|
||||
pdu_adv_rx = (void *)node_rx->pdu;
|
||||
if ((pdu_adv_rx->type == PDU_ADV_TYPE_SCAN_RSP) &&
|
||||
lll->is_adv_ind) {
|
||||
pdu_adv_rx->type = PDU_ADV_TYPE_ADV_IND_SCAN_RSP;
|
||||
}
|
||||
#endif /* CONFIG_BT_CTLR_ADV_EXT */
|
||||
} else {
|
||||
node_rx->hdr.type = NODE_RX_TYPE_REPORT;
|
||||
}
|
||||
|
||||
pdu_adv_rx = (void *)node_rx->pdu;
|
||||
|
||||
node_rx->hdr.rx_ftr.rssi = (rssi_ready) ?
|
||||
(radio_rssi_get() & 0x7f)
|
||||
: 0x7f;
|
||||
|
|
|
@ -24,6 +24,7 @@ struct lll_scan {
|
|||
|
||||
#if defined(CONFIG_BT_CTLR_ADV_EXT)
|
||||
uint8_t phy:3;
|
||||
uint8_t is_adv_ind:1;
|
||||
#endif /* CONFIG_BT_CTLR_ADV_EXT */
|
||||
|
||||
#if defined(CONFIG_BT_CTLR_PRIVACY)
|
||||
|
|
|
@ -239,6 +239,7 @@ enum pdu_adv_type {
|
|||
PDU_ADV_TYPE_SCAN_REQ = 0x03,
|
||||
PDU_ADV_TYPE_AUX_SCAN_REQ = PDU_ADV_TYPE_SCAN_REQ,
|
||||
PDU_ADV_TYPE_SCAN_RSP = 0x04,
|
||||
PDU_ADV_TYPE_ADV_IND_SCAN_RSP = 0x05,
|
||||
PDU_ADV_TYPE_CONNECT_IND = 0x05,
|
||||
PDU_ADV_TYPE_AUX_CONNECT_REQ = PDU_ADV_TYPE_CONNECT_IND,
|
||||
PDU_ADV_TYPE_SCAN_IND = 0x06,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue