diff --git a/nimble/controller/src/ble_ll_conn.c b/nimble/controller/src/ble_ll_conn.c index 648d5c257..952ac886d 100644 --- a/nimble/controller/src/ble_ll_conn.c +++ b/nimble/controller/src/ble_ll_conn.c @@ -1704,6 +1704,23 @@ ble_ll_conn_master_init(struct ble_ll_conn_sm *connsm, } } +static void +ble_ll_update_max_tx_octets_phy_mode(struct ble_ll_conn_sm *connsm) +{ + uint32_t usecs; + + usecs = connsm->eff_max_tx_time; + + connsm->max_tx_octets_phy_mode[BLE_PHY_MODE_1M] = + ble_ll_pdu_max_tx_octets_get(usecs, BLE_PHY_MODE_1M); + connsm->max_tx_octets_phy_mode[BLE_PHY_MODE_2M] = + ble_ll_pdu_max_tx_octets_get(usecs, BLE_PHY_MODE_2M); + connsm->max_tx_octets_phy_mode[BLE_PHY_MODE_CODED_125KBPS] = + ble_ll_pdu_max_tx_octets_get(usecs, BLE_PHY_MODE_CODED_125KBPS); + connsm->max_tx_octets_phy_mode[BLE_PHY_MODE_CODED_500KBPS] = + ble_ll_pdu_max_tx_octets_get(usecs, BLE_PHY_MODE_CODED_500KBPS); +} + #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) void @@ -1740,13 +1757,45 @@ ble_ll_conn_set_phy(struct ble_ll_conn_sm *connsm, int tx_phy, int rx_phy) phy_data->cur_tx_phy = tx_phy; } + +static void +ble_ll_conn_init_phy(struct ble_ll_conn_sm *connsm, int phy) +{ + struct ble_ll_conn_global_params *conngp; + + /* Always initialize symmetric PHY - controller can change this later */ + ble_ll_conn_set_phy(connsm, phy, phy); + + /* Update data length management to match initial PHY */ + conngp = &g_ble_ll_conn_params; + connsm->max_tx_octets = conngp->conn_init_max_tx_octets; + connsm->max_rx_octets = conngp->supp_max_rx_octets; + if (phy == BLE_PHY_CODED) { + connsm->max_tx_time = conngp->conn_init_max_tx_time_coded; + connsm->max_rx_time = BLE_LL_CONN_SUPP_TIME_MAX_CODED; + connsm->rem_max_tx_time = BLE_LL_CONN_SUPP_TIME_MIN_CODED; + connsm->rem_max_rx_time = BLE_LL_CONN_SUPP_TIME_MIN_CODED; + } else { + connsm->max_tx_time = conngp->conn_init_max_tx_time_uncoded; + connsm->max_rx_time = BLE_LL_CONN_SUPP_TIME_MAX_UNCODED; + connsm->rem_max_tx_time = BLE_LL_CONN_SUPP_TIME_MIN_UNCODED; + connsm->rem_max_rx_time = BLE_LL_CONN_SUPP_TIME_MIN_UNCODED; + } + connsm->eff_max_tx_time = connsm->rem_max_tx_time; + connsm->eff_max_rx_time = connsm->rem_max_rx_time; + connsm->rem_max_tx_octets = BLE_LL_CONN_SUPP_BYTES_MIN; + connsm->rem_max_rx_octets = BLE_LL_CONN_SUPP_BYTES_MIN; + connsm->eff_max_tx_octets = BLE_LL_CONN_SUPP_BYTES_MIN; + connsm->eff_max_rx_octets = BLE_LL_CONN_SUPP_BYTES_MIN; + + ble_ll_update_max_tx_octets_phy_mode(connsm); +} + #endif void ble_ll_conn_ext_set_params(struct ble_ll_conn_sm *connsm, - struct hci_ext_conn_params *hcc_params, - int tx_phy, int tx_phy_ops, - int rx_phy, int rx_phy_ops) + struct hci_ext_conn_params *hcc_params, int phy) { /* Set slave latency and supervision timeout */ connsm->slave_latency = hcc_params->conn_latency; @@ -1772,7 +1821,7 @@ ble_ll_conn_ext_set_params(struct ble_ll_conn_sm *connsm, ble_ll_conn_calc_itvl_ticks(connsm); #if (BLE_LL_BT5_PHY_SUPPORTED == 1) - ble_ll_conn_set_phy(connsm, tx_phy, rx_phy); + ble_ll_conn_init_phy(connsm, phy); #endif } @@ -1800,23 +1849,6 @@ ble_ll_conn_set_csa(struct ble_ll_conn_sm *connsm, bool chsel) connsm->data_chan_index = ble_ll_conn_calc_dci(connsm, 1); } -static void -ble_ll_update_max_tx_octets_phy_mode(struct ble_ll_conn_sm *connsm) -{ - uint32_t usecs; - - usecs = connsm->eff_max_tx_time; - - connsm->max_tx_octets_phy_mode[BLE_PHY_MODE_1M] = - ble_ll_pdu_max_tx_octets_get(usecs, BLE_PHY_MODE_1M); - connsm->max_tx_octets_phy_mode[BLE_PHY_MODE_2M] = - ble_ll_pdu_max_tx_octets_get(usecs, BLE_PHY_MODE_2M); - connsm->max_tx_octets_phy_mode[BLE_PHY_MODE_CODED_125KBPS] = - ble_ll_pdu_max_tx_octets_get(usecs, BLE_PHY_MODE_CODED_125KBPS); - connsm->max_tx_octets_phy_mode[BLE_PHY_MODE_CODED_500KBPS] = - ble_ll_pdu_max_tx_octets_get(usecs, BLE_PHY_MODE_CODED_500KBPS); -} - /** * Create a new connection state machine. This is done once per * connection when the HCI command "create connection" is issued to the @@ -2831,7 +2863,7 @@ ble_ll_init_rx_pkt_in(uint8_t pdu_type, uint8_t *rxbuf, struct ble_mbuf_hdr *ble #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) #if (BLE_LL_BT5_PHY_SUPPORTED == 1) /* Lets take last used phy */ - ble_ll_conn_set_phy(connsm, ble_hdr->rxinfo.phy, ble_hdr->rxinfo.phy); + ble_ll_conn_init_phy(connsm, ble_hdr->rxinfo.phy); #endif #endif ble_ll_conn_created(connsm, NULL); @@ -3112,8 +3144,7 @@ ble_ll_init_rx_isr_end(uint8_t *rxbuf, uint8_t crcok, */ ble_ll_conn_ext_set_params(connsm, &connsm->initial_params.params[phy - 1], - phy, BLE_HCI_LE_PHY_CODED_ANY, - phy, BLE_HCI_LE_PHY_CODED_ANY); + phy); } #endif @@ -3911,8 +3942,8 @@ ble_ll_conn_slave_start(uint8_t *rxbuf, uint8_t pat, struct ble_mbuf_hdr *rxhdr, ble_ll_conn_sm_new(connsm); #if (BLE_LL_BT5_PHY_SUPPORTED == 1) - /* Lets take last used phy */ - ble_ll_conn_set_phy(connsm, rxhdr->rxinfo.phy, rxhdr->rxinfo.phy); + /* Use the same PHY as we received CONNECT_REQ on */ + ble_ll_conn_init_phy(connsm, rxhdr->rxinfo.phy); #endif ble_ll_conn_set_csa(connsm, @@ -3982,18 +4013,34 @@ ble_ll_conn_module_reset(void) /* NOTE: this all assumes that the default phy is 1Mbps */ maxbytes = min(MYNEWT_VAL(BLE_LL_SUPP_MAX_RX_BYTES), max_phy_pyld); conn_params->supp_max_rx_octets = maxbytes; +#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) + conn_params->supp_max_rx_time = + ble_ll_pdu_tx_time_get(maxbytes + BLE_LL_DATA_MIC_LEN, + BLE_PHY_MODE_CODED_125KBPS); +#else conn_params->supp_max_rx_time = ble_ll_pdu_tx_time_get(maxbytes + BLE_LL_DATA_MIC_LEN, BLE_PHY_MODE_1M); +#endif maxbytes = min(MYNEWT_VAL(BLE_LL_SUPP_MAX_TX_BYTES), max_phy_pyld); conn_params->supp_max_tx_octets = maxbytes; +#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) + conn_params->supp_max_tx_time = + ble_ll_pdu_tx_time_get(maxbytes + BLE_LL_DATA_MIC_LEN, + BLE_PHY_MODE_CODED_125KBPS); +#else conn_params->supp_max_tx_time = ble_ll_pdu_tx_time_get(maxbytes + BLE_LL_DATA_MIC_LEN, BLE_PHY_MODE_1M); +#endif maxbytes = min(MYNEWT_VAL(BLE_LL_CONN_INIT_MAX_TX_BYTES), max_phy_pyld); conn_params->conn_init_max_tx_octets = maxbytes; conn_params->conn_init_max_tx_time = ble_ll_pdu_tx_time_get(maxbytes + BLE_LL_DATA_MIC_LEN, BLE_PHY_MODE_1M); + conn_params->conn_init_max_tx_time_uncoded = + ble_ll_pdu_tx_time_get(maxbytes + BLE_LL_DATA_MIC_LEN, BLE_PHY_MODE_1M); + conn_params->conn_init_max_tx_time_coded = + ble_ll_pdu_tx_time_get(maxbytes + BLE_LL_DATA_MIC_LEN, BLE_PHY_MODE_CODED_125KBPS); conn_params->sugg_tx_octets = BLE_LL_CONN_SUPP_BYTES_MIN; conn_params->sugg_tx_time = BLE_LL_CONN_SUPP_TIME_MIN; diff --git a/nimble/controller/src/ble_ll_conn_priv.h b/nimble/controller/src/ble_ll_conn_priv.h index a2781663c..ddfce11d9 100644 --- a/nimble/controller/src/ble_ll_conn_priv.h +++ b/nimble/controller/src/ble_ll_conn_priv.h @@ -35,6 +35,10 @@ extern "C" { */ #define BLE_LL_CONN_SUPP_TIME_MIN (328) /* usecs */ #define BLE_LL_CONN_SUPP_TIME_MAX (2120) /* usecs */ +#define BLE_LL_CONN_SUPP_TIME_MIN_UNCODED (328) /* usecs */ +#define BLE_LL_CONN_SUPP_TIME_MAX_UNCODED (2120) /* usecs */ +#define BLE_LL_CONN_SUPP_TIME_MIN_CODED (2704) /* usecs */ +#define BLE_LL_CONN_SUPP_TIME_MAX_CODED (17040) /* usecs */ #define BLE_LL_CONN_SUPP_BYTES_MIN (27) /* bytes */ #define BLE_LL_CONN_SUPP_BYTES_MAX (251) /* bytes */ @@ -69,6 +73,8 @@ struct ble_ll_conn_global_params uint8_t sugg_tx_octets; uint16_t sugg_tx_time; uint16_t conn_init_max_tx_time; + uint16_t conn_init_max_tx_time_uncoded; + uint16_t conn_init_max_tx_time_coded; uint16_t supp_max_tx_time; uint16_t supp_max_rx_time; }; @@ -102,8 +108,7 @@ void ble_ll_conn_ext_master_init(struct ble_ll_conn_sm *connsm, void ble_ll_conn_ext_set_params(struct ble_ll_conn_sm *connsm, struct hci_ext_conn_params *hcc_params, - int tx_phy, int tx_phy_ops, - int rx_phy, int rx_phy_ops); + int phy); #endif struct ble_ll_conn_sm *ble_ll_conn_find_active_conn(uint16_t handle);