DLE doesn't seem to be working in hci_uart sample

Hi there

I'm using the HCI UART bridge from NCS v3.2.1 in zephyr/samples/bluetooth/hci_uart with the provided overlay-all-bt_ll_sw_split.conf on an nRF54L15Dk and our Bluetooth Host stack: https://github.com/bluekitchen/btstack/)

While doing throughput tests with a 200 bytes MTU over GATT against the PTS / BL654 with PacketCraft Controller,  I've wondered about the lower-than-expected data-rate.

Inspection of the HCI log of the nRF54l15 as Peripheral shows that the DLE is enabled in general as the SoftDevice reports TX Len 251 and TX Time 2704 us for the HCI Read Maximum Data Length.

We then use the LE Write Suggested Default Data Length with these values to set them as default. However, there's no HCI Event Data Length Change event later when the connection gets established.

Following the https://academy.nordicsemi.com/courses/bluetooth-low-energy-fundamentals/lessons/lesson-3-bluetooth-le-connections/topic/blefund-lesson-3-exercise-2/ I was also sending the HCI LE Set Data Length Command although that should not be necessary due to the earlier LE Write Suggested Default Data Length.

As a comparison, I've replaced the nRF54L15 with a second PTS dongle, where DLE gets activated as expected.

I've attached two zips with logs: one with PTS -> PTS and one with PTS -> nRF54L15. In the zips are the HCI trace as .pklg for Wireshark as well as the console log which also shows how to compile and run our examples. I've also include the .config File from the west built. 

Why is DLE not working here? Do you have an HCI trace that shows a working DLE setup for comparison?

Thanks & best regards,

 Matthias

2026-01-26-DLE-PTS-nRF54L15-SoftDevice.zip

2026-01-26-DLE-PTS-PTS.zip

Parents
  • Hi Matthias, 

    Could you explain why you use overlay-all-bt_ll_sw_split.conf when you want to use softdevice controller? My understanding is that CONFIG_BT_LL_SW_SPLIT=y will select Zephyr controller, not softdevice controller. 

    My suggestion is to test the nRF54L as a stand alone BLE device first and verify that it can do DLE before you move to the hci_uart. 
    Have you tried the sample \nrf\samples\bluetooth\throughput ? I believe it should have the DLE covered. 

  • Thanks for your quick reply.

    ---

    I have tested the Throughput example and made two observations:

    1. DLE works as expected (at least according to throughput numbers and the callback)
    2.  the le_data_len_updated callback is not called on the peripheral side.

    I see this on central

    ==== Starting throughput test ====
    PHY update pending
    LE PHY updated: TX PHY LE 1M, RX PHY LE 1M
    LE Data length update pending
    LE data len updated: TX (len: 27 time: 2120) RX (len: 27 time: 2120)

    And this on peripheral

    LE PHY updated: TX PHY LE 1M, RX PHY LE 1M

    ==============...


    While this doesn't have an effect on the throughput, it makes debugging the DLE setup harder.
    It looks like the missing callback might be an issue in the SoftDevice Controller.

    Please check attached log files. Do you agree that the callback should have been called?

    2026-01-29-Throughput.zip

    ---

    Back to the HCI UART example. I did use overlay-all-bt_ll_sw_split.conf in the hope to enable all features. Let's ignore this configuration for now.

    We use an extended version of the HCI UART example that supports an additional command for time sync between the Host and the Controller. The project is here: https://github.com/bluekitchen/hci_uart_iso_timesync

    I've attached new log files as well as the .config file from build/hci_uart_iso_timesync/.config which shows that 

    CONFIG_BT_CTLR_DATA_LENGTH_MAX=251
    CONFIG_BT_CTLR_DATA_LENGTH=y


    2026-01-29-DLE-PTS-nRF54L15-SoftDevice.zip

    During stack startup, DLE seems to be supported, but nothing happens. What's wrong / missing?
    Any suggestions to get more insight or how to find the difference between your Throughput example and our tests using HCI UART?

    Thanks, 
    Matthias


      

  • Hi Matthias, 
    Could you try with CONFIG_BT_USER_DATA_LEN_UPDATE=y  ? 
    I have made a blog with example here: Building a Bluetooth application on nRF Connect SDK - Part 3 Optimizing the connection 
    In the example we request data length update from the device's side. 

    It's a bit out of date (SDKv2.5.2) but if you have a nRF52 DK you can test with that. Or you can port it to NCS v3.x to test. 

  • Hi Hung

    1. I've tried adding CONFIG_BT_USER_DATA_LEN_UPDATE=y and got the following error/warning:

    warning: BT_USER_DATA_LEN_UPDATE (defined at subsys/bluetooth/host/Kconfig:407,
    subsys/bluetooth/host/Kconfig:407) was assigned the value 'y' but got the value 'n'. Check these
    unsatisfied dependencies: ((BT_DATA_LEN_UPDATE && BT_CONN && BT_HCI_HOST && BT_RPC_STACK) ||
    (BT_DATA_LEN_UPDATE && BT_CONN && BT_HCI_HOST && BT_HCI && BT)) (=n). See
    docs.zephyrproject.org/.../kconfig.html and/or look up
    BT_USER_DATA_LEN_UPDATE in the menuconfig/guiconfig interface. 

    This matches my expectation as we don't use Zephyr Bluetooth Host. Instead, in the HCI UART bridge,  BT_HCI_RAW is defined for direct HCI access..

    --

    2. Thanks for the link to your older blog post. It's also from the view of an application using Zephyr's host stack like the one I've linked to Nordic academy.  As reported, DLE works with the Throughput example, but not with similar KConfig flags in the HCI UART project.

    Going back to my previous question: is my observation correct that there's no DLE update callback when the device in peripheral role?

    --

    3. How can we debug the SoftDevice controller to find out why it isn't starting and/or responding to DLE updates when used in the HCI UART or our "hci_uart_iso_timesync" project?

    Thanks,
     Matthias

Reply
  • Hi Hung

    1. I've tried adding CONFIG_BT_USER_DATA_LEN_UPDATE=y and got the following error/warning:

    warning: BT_USER_DATA_LEN_UPDATE (defined at subsys/bluetooth/host/Kconfig:407,
    subsys/bluetooth/host/Kconfig:407) was assigned the value 'y' but got the value 'n'. Check these
    unsatisfied dependencies: ((BT_DATA_LEN_UPDATE && BT_CONN && BT_HCI_HOST && BT_RPC_STACK) ||
    (BT_DATA_LEN_UPDATE && BT_CONN && BT_HCI_HOST && BT_HCI && BT)) (=n). See
    docs.zephyrproject.org/.../kconfig.html and/or look up
    BT_USER_DATA_LEN_UPDATE in the menuconfig/guiconfig interface. 

    This matches my expectation as we don't use Zephyr Bluetooth Host. Instead, in the HCI UART bridge,  BT_HCI_RAW is defined for direct HCI access..

    --

    2. Thanks for the link to your older blog post. It's also from the view of an application using Zephyr's host stack like the one I've linked to Nordic academy.  As reported, DLE works with the Throughput example, but not with similar KConfig flags in the HCI UART project.

    Going back to my previous question: is my observation correct that there's no DLE update callback when the device in peripheral role?

    --

    3. How can we debug the SoftDevice controller to find out why it isn't starting and/or responding to DLE updates when used in the HCI UART or our "hci_uart_iso_timesync" project?

    Thanks,
     Matthias

Children
Related