This is an automated email from the ASF dual-hosted git repository.

andk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git

commit 7b97e1d5c64cf50912db3b6716f5073b874ebb0e
Author: Andrzej Kaczmarek <[email protected]>
AuthorDate: Tue Oct 4 09:47:41 2022 +0200

    nimble/phy/nrf5x: Fix variable tifs
    
    We need to first read current tifs, the reset it to default value,
    otherwise handlers will always use default tifs value.
---
 nimble/drivers/nrf5x/src/ble_phy.c | 46 +++++++++++++++++++++-----------------
 1 file changed, 26 insertions(+), 20 deletions(-)

diff --git a/nimble/drivers/nrf5x/src/ble_phy.c 
b/nimble/drivers/nrf5x/src/ble_phy.c
index df610c93..9e6316d2 100644
--- a/nimble/drivers/nrf5x/src/ble_phy.c
+++ b/nimble/drivers/nrf5x/src/ble_phy.c
@@ -590,23 +590,11 @@ nrf_wait_disabled(void)
 }
 
 #if MYNEWT_VAL(BLE_PHY_VARIABLE_TIFS)
-static uint16_t
-ble_phy_tifs_get(void)
-{
-    return g_ble_phy_data.tifs;
-}
-
 void
 ble_phy_tifs_set(uint16_t tifs)
 {
     g_ble_phy_data.tifs = tifs;
 }
-#else
-static uint16_t
-ble_phy_tifs_get(void)
-{
-    return BLE_LL_IFS;
-}
 #endif
 
 /**
@@ -831,12 +819,19 @@ ble_phy_wfr_enable(int txrx, uint8_t tx_phy_mode, 
uint32_t wfr_usecs)
 {
     uint32_t end_time;
     uint8_t phy;
+    uint16_t tifs;
 
     phy = g_ble_phy_data.phy_cur_phy_mode;
 
+#if MYNEWT_VAL(BLE_PHY_VARIABLE_TIFS)
+    tifs = g_ble_phy_data.tifs;
+#else
+    tifs = BLE_LL_IFS;
+#endif
+
     if (txrx == BLE_PHY_WFR_ENABLE_TXRX) {
         /* RX shall start exactly T_IFS after TX end captured in CC[2] */
-        end_time = NRF_TIMER0->CC[2] + ble_phy_tifs_get();
+        end_time = NRF_TIMER0->CC[2] + tifs;
         /* Adjust for delay between EVENT_END and actual TX end time */
         end_time += g_ble_phy_t_txenddelay[tx_phy_mode];
         /* Wait a bit longer due to allowed active clock accuracy */
@@ -1023,6 +1018,7 @@ ble_phy_tx_end_isr(void)
     uint32_t fem_time;
 #endif
     uint32_t radio_time;
+    uint16_t tifs;
 
     /* Store PHY on which we've just transmitted smth */
     tx_phy_mode = g_ble_phy_data.phy_cur_phy_mode;
@@ -1047,6 +1043,12 @@ ble_phy_tx_end_isr(void)
     }
 #endif
 
+#if MYNEWT_VAL(BLE_PHY_VARIABLE_TIFS)
+    tifs = g_ble_phy_data.tifs;
+    g_ble_phy_data.tifs = BLE_LL_IFS;
+#else
+    tifs = BLE_LL_IFS;
+#endif
     transition = g_ble_phy_data.phy_transition;
 
     if (g_ble_phy_data.txend_cb) {
@@ -1064,7 +1066,7 @@ ble_phy_tx_end_isr(void)
         ble_phy_wfr_enable(BLE_PHY_WFR_ENABLE_TXRX, tx_phy_mode, 0);
 
         /* Schedule RX exactly T_IFS after TX end captured in CC[2] */
-        rx_time = NRF_TIMER0->CC[2] + ble_phy_tifs_get();
+        rx_time = NRF_TIMER0->CC[2] + tifs;
         /* Adjust for delay between EVENT_END and actual TX end time */
         rx_time += g_ble_phy_t_txenddelay[tx_phy_mode];
         /* Start listening a bit earlier due to allowed active clock accuracy 
*/
@@ -1091,7 +1093,7 @@ ble_phy_tx_end_isr(void)
          */
     } else if (transition == BLE_PHY_TRANSITION_TX_TX) {
         /* Schedule TX exactly T_IFS after TX end captured in CC[2] */
-        tx_time = NRF_TIMER0->CC[2] + ble_phy_tifs_get();
+        tx_time = NRF_TIMER0->CC[2] + tifs;
         /* Adjust for delay between EVENT_END and actual TX end time */
         tx_time += g_ble_phy_t_txenddelay[tx_phy_mode];
         /* Adjust for delay between EVENT_READY and actual TX start time */
@@ -1159,6 +1161,7 @@ ble_phy_rx_end_isr(void)
     uint32_t fem_time;
 #endif
     uint32_t radio_time;
+    uint16_t tifs;
     struct ble_mbuf_hdr *ble_hdr;
     bool is_late;
 
@@ -1223,8 +1226,15 @@ ble_phy_rx_end_isr(void)
      * enough.
      */
 
+#if MYNEWT_VAL(BLE_PHY_VARIABLE_TIFS)
+    tifs = g_ble_phy_data.tifs;
+    g_ble_phy_data.tifs = BLE_LL_IFS;
+#else
+    tifs = BLE_LL_IFS;
+#endif
+
     /* Schedule TX exactly T_IFS after RX end captured in CC[2] */
-    tx_time = NRF_TIMER0->CC[2] + ble_phy_tifs_get();
+    tx_time = NRF_TIMER0->CC[2] + tifs;
     /* Adjust for delay between actual RX end time and EVENT_END */
     tx_time -= g_ble_phy_t_rxenddelay[ble_hdr->rxinfo.phy_mode];
 
@@ -1449,10 +1459,6 @@ ble_phy_isr(void)
         NRF_RADIO->EVENTS_DISABLED = 0;
         nrf_radio_int_disable(NRF_RADIO, RADIO_INTENCLR_DISABLED_Msk);
 
-#if MYNEWT_VAL(BLE_PHY_VARIABLE_TIFS)
-        g_ble_phy_data.tifs = BLE_LL_IFS;
-#endif
-
         switch (g_ble_phy_data.phy_state) {
         case BLE_PHY_STATE_RX:
 #if MYNEWT_VAL(BLE_FEM_LNA)

Reply via email to