Bluetooth: Controller: Add PDU time calculation for S2 Coded PHY

Add PDU time calculation macro for S2 and S8 Coded PHY.
Rename PKT_AC_US to PDU_AC_MAX_US.

Signed-off-by: Vinayak Kariappa Chettimada <vich@nordicsemi.no>
This commit is contained in:
Vinayak Kariappa Chettimada 2021-08-07 15:56:22 +05:30 committed by Anas Nashif
commit 1ce46fd7a6
8 changed files with 82 additions and 48 deletions

View file

@ -236,8 +236,8 @@ void lll_scan_prepare_connect_req(struct lll_scan *lll, struct pdu_adv *pdu_tx,
conn_interval_us = (uint32_t)lll_conn->interval * CONN_INT_UNIT_US;
conn_offset_us = radio_tmr_end_get() + EVENT_IFS_US +
PKT_AC_US(sizeof(struct pdu_adv_connect_ind),
phy == PHY_LEGACY ? PHY_1M : phy);
PDU_AC_MAX_US(sizeof(struct pdu_adv_connect_ind),
(phy == PHY_LEGACY) ? PHY_1M : phy);
/* Add transmitWindowDelay to default calculated connection offset:
* 1.25ms for a legacy PDU, 2.5ms for an LE Uncoded PHY and 3.75ms for

View file

@ -772,9 +772,9 @@ static int isr_rx_pdu(struct lll_scan *lll, struct lll_scan_aux *lll_aux,
ull = HDR_LLL2ULL(lll);
if (pdu_end_us > (HAL_TICKER_TICKS_TO_US(ull->ticks_slot) -
EVENT_IFS_US -
PKT_AC_US(aux_connect_req_len, phy_aux) -
PDU_AC_MAX_US(aux_connect_req_len, phy_aux) -
EVENT_IFS_US -
PKT_AC_US(aux_connect_rsp_len, phy_aux) -
PDU_AC_MAX_US(aux_connect_rsp_len, phy_aux) -
EVENT_OVERHEAD_START_US -
EVENT_TICKER_RES_MARGIN_US)) {
return -ETIME;

View file

@ -124,6 +124,8 @@
#define PHY_1M BIT(0)
#define PHY_2M BIT(1)
#define PHY_CODED BIT(2)
#define PHY_FLAGS_S2 0
#define PHY_FLAGS_S8 BIT(0)
#if defined(CONFIG_BT_CTLR_PHY_CODED)
#define CODED_PHY_PREAMBLE_TIME_US 80
@ -133,40 +135,58 @@
#define CODED_PHY_CRC_SIZE 24
#define CODED_PHY_TERM2_SIZE 3
#define FEC_BLOCK1_TIME_US ((CODED_PHY_ACCESS_ADDRESS_TIME_US) + \
#define FEC_BLOCK1_US ((CODED_PHY_ACCESS_ADDRESS_TIME_US) + \
(CODED_PHY_CI_TIME_US) + \
(CODED_PHY_TERM1_TIME_US))
#define FEC_BLOCK2_TIME_US(octets, mic) (((((PDU_HEADER_SIZE) + \
(octets) + \
(mic))<<3) + \
(CODED_PHY_CRC_SIZE) + \
(CODED_PHY_TERM2_SIZE))<<3)
#define PDU_MAX_US(octets, mic, phy) (((phy) & PHY_CODED) ? \
/* cs = 0, S2 coding scheme, use PHY_FLAGS_S2
* cs = 1, S8 coding scheme, use PHY_FLAGS_S8
*
* Not using the term CI, Coding Indicator, where in the Spec its defined value
* of 0 is S8 encoding, 1 is S2 encoding.
*/
#define FEC_BLOCK2_US(octets, mic, cs) (((((PDU_HEADER_SIZE) + \
(octets) + \
(mic)) << 3) + \
(CODED_PHY_CRC_SIZE) + \
(CODED_PHY_TERM2_SIZE)) << \
(1 + (((cs) & 0x01) << 1)))
#define PDU_US(octets, mic, phy, cs) (((phy) & PHY_CODED) ? \
((CODED_PHY_PREAMBLE_TIME_US) + \
(FEC_BLOCK1_TIME_US) + \
FEC_BLOCK2_TIME_US((octets), (mic))) : \
(FEC_BLOCK1_US) + \
FEC_BLOCK2_US((octets), (mic), \
(cs))) : \
(((PDU_PREAMBLE_SIZE(phy) + \
(PDU_ACCESS_ADDR_SIZE) + \
(PDU_HEADER_SIZE) + \
(octets) + \
(mic) + \
(PDU_CRC_SIZE))<<3) / \
(PDU_CRC_SIZE)) << 3) / \
BIT(((phy) & 0x03) >> 1)))
#define PDU_MAX_US(octets, mic, phy) PDU_US((octets), (mic), (phy), \
PHY_FLAGS_S8)
#else /* !CONFIG_BT_CTLR_PHY_CODED */
#define PDU_MAX_US(octets, mic, phy) (((PDU_PREAMBLE_SIZE(phy) + \
#define PDU_US(octets, mic, phy, cs) (((PDU_PREAMBLE_SIZE(phy) + \
(PDU_ACCESS_ADDR_SIZE) + \
(PDU_HEADER_SIZE) + \
(octets) + \
(mic) + \
(PDU_CRC_SIZE))<<3) / \
(PDU_CRC_SIZE)) << 3) / \
BIT(((phy) & 0x03) >> 1))
#define PDU_MAX_US(octets, mic, phy) PDU_US((octets), (mic), (phy), 0)
#endif /* !CONFIG_BT_CTLR_PHY_CODED */
#define PDU_DC_MAX_US(octets, phy) PDU_MAX_US((octets), (PDU_MIC_SIZE), (phy))
#define PKT_AC_US(octets, phy) PDU_MAX_US((octets), 0, (phy))
#define PDU_DC_US(octets, mic, phy, cs) PDU_US((octets), (mic), (phy), (cs))
#define PDU_AC_MAX_US(octets, phy) PDU_MAX_US((octets), 0, (phy))
#define PDU_AC_US(octets, phy, cs) PDU_US((octets), 0, (phy), (cs))
#define PKT_BIS_US(octets, mic, phy) PDU_MAX_US((octets), (mic), (phy))

View file

@ -1942,15 +1942,26 @@ uint8_t ull_adv_time_update(struct ll_adv_set *adv, struct pdu_adv *pdu,
uint32_t ticks_plus;
struct lll_adv *lll;
uint32_t time_ticks;
uint8_t phy_flags;
uint16_t time_us;
uint8_t chan_map;
uint8_t chan_cnt;
uint32_t ret;
uint8_t phy;
lll = &adv->lll;
#if defined(CONFIG_BT_CTLR_ADV_EXT)
phy = lll->phy_p;
phy_flags = lll->phy_flags;
#else
phy = PHY_1M;
phy_flags = 0U;
#endif
chan_map = lll->chan_map;
chan_cnt = util_ones_count_get(&chan_map, sizeof(chan_map));
time_us = adv_time_get(pdu, pdu_scan, chan_cnt, PHY_1M);
time_us = adv_time_get(pdu, pdu_scan, chan_cnt, phy, phy_flags);
time_ticks = HAL_TICKER_US_TO_TICKS(time_us);
if (adv->ull.ticks_slot > time_ticks) {
ticks_minus = adv->ull.ticks_slot - time_ticks;

View file

@ -1135,7 +1135,7 @@ static uint16_t aux_time_get(struct ll_adv_aux_set *aux, struct pdu_adv *pdu,
if ((pdu->adv_ext_ind.adv_mode & BT_HCI_LE_ADV_PROP_CONN) ==
BT_HCI_LE_ADV_PROP_CONN) {
const uint16_t conn_req_us =
PKT_AC_US((INITA_SIZE + ADVA_SIZE + LLDATA_SIZE),
PDU_AC_MAX_US((INITA_SIZE + ADVA_SIZE + LLDATA_SIZE),
lll->phy_s);
const uint16_t conn_rsp_us =
PKT_AC_US((PDU_AC_EXT_HEADER_SIZE_MIN + ADVA_SIZE +
@ -1145,7 +1145,7 @@ static uint16_t aux_time_get(struct ll_adv_aux_set *aux, struct pdu_adv *pdu,
} else if ((pdu->adv_ext_ind.adv_mode & BT_HCI_LE_ADV_PROP_SCAN) ==
BT_HCI_LE_ADV_PROP_SCAN) {
const uint16_t scan_req_us =
PKT_AC_US((SCANA_SIZE + ADVA_SIZE), lll->phy_s);
PDU_AC_MAX_US((SCANA_SIZE + ADVA_SIZE), lll->phy_s);
const uint16_t scan_rsp_us =
PKT_AC_US(pdu_scan->len, lll->phy_s);

View file

@ -7029,13 +7029,16 @@ static uint8_t force_md_cnt_calc(struct lll_conn *lll_conn, uint32_t tx_rate)
{
uint32_t time_incoming, time_outgoing;
uint8_t force_md_cnt;
uint8_t phy_flags;
uint8_t mic_size;
uint8_t phy;
#if defined(CONFIG_BT_CTLR_PHY)
phy = lll_conn->phy_tx;
phy_flags = lll_conn->phy_flags;
#else /* !CONFIG_BT_CTLR_PHY */
phy = PHY_1M;
phy_flags = 0U;
#endif /* !CONFIG_BT_CTLR_PHY */
#if defined(CONFIG_BT_CTLR_LE_ENC)
@ -7046,8 +7049,9 @@ static uint8_t force_md_cnt_calc(struct lll_conn *lll_conn, uint32_t tx_rate)
time_incoming = (LL_LENGTH_OCTETS_RX_MAX << 3) *
1000000UL / tx_rate;
time_outgoing = PDU_MAX_US(LL_LENGTH_OCTETS_RX_MAX, mic_size, phy) +
PDU_MAX_US(0U, 0U, phy) +
time_outgoing = PDU_DC_US(LL_LENGTH_OCTETS_RX_MAX, mic_size, phy,
phy_flags) +
PDU_DC_US(0U, 0U, phy, PHY_FLAGS_S8) +
(EVENT_IFS_US << 1);
force_md_cnt = 0U;
@ -7056,7 +7060,8 @@ static uint8_t force_md_cnt_calc(struct lll_conn *lll_conn, uint32_t tx_rate)
uint32_t time_keep_alive;
delta = (time_incoming << 1) - time_outgoing;
time_keep_alive = (PDU_MAX_US(0U, 0U, phy) + EVENT_IFS_US) << 1;
time_keep_alive = (PDU_DC_US(0U, 0U, phy, PHY_FLAGS_S8) +
EVENT_IFS_US) << 1;
force_md_cnt = (delta + (time_keep_alive - 1)) /
time_keep_alive;
BT_DBG("Time: incoming= %u, expected outgoing= %u, delta= %u, "

View file

@ -382,7 +382,7 @@ void ull_scan_aux_setup(memq_link_t *link, struct node_rx_hdr *rx)
aux->ull.ticks_slot =
HAL_TICKER_US_TO_TICKS(EVENT_OVERHEAD_START_US +
ready_delay_us +
PKT_AC_US(PDU_AC_EXT_PAYLOAD_SIZE_MAX,
PDU_AC_MAX_US(PDU_AC_EXT_PAYLOAD_SIZE_MAX,
lll_aux->phy) +
EVENT_OVERHEAD_END_US);

View file

@ -467,11 +467,9 @@ void ull_sync_setup(struct ll_scan_set *scan, struct ll_scan_aux_set *aux,
HAL_TICKER_US_TO_TICKS(EVENT_OVERHEAD_XTAL_US);
sync->ull.ticks_preempt_to_start =
HAL_TICKER_US_TO_TICKS(EVENT_OVERHEAD_PREEMPT_MIN_US);
sync->ull.ticks_slot =
HAL_TICKER_US_TO_TICKS(EVENT_OVERHEAD_START_US +
ready_delay_us +
PKT_AC_US(PDU_AC_EXT_PAYLOAD_SIZE_MAX,
lll->phy) +
sync->ull.ticks_slot = HAL_TICKER_US_TO_TICKS(
EVENT_OVERHEAD_START_US + ready_delay_us +
PDU_AC_MAX_US(PDU_AC_EXT_PAYLOAD_SIZE_MAX, lll->phy) +
EVENT_OVERHEAD_END_US);
ticks_slot_offset = MAX(sync->ull.ticks_active_to_start,