nRF54L15 SDC ASSERT 131,1143 (sdc_assertion_handler) on Channel Sounding reflector when procedure uses antenna config A2_B1 (2:1)


Environment
- SoC / board: nRF54L15 on Ezurio BL54L15U DVK (board target bl54l15u_dvk/nrf54l15/cpuapp)
- nRF Connect SDK: v3.3.1
- SoftDevice Controller build: v252.31313
- Samples: nrf/samples/bluetooth/channel_sounding/ras_initiator (central) and ras_reflector (peripheral), lightly modified for 2 antennas.

Summary
With an asymmetric Channel Sounding antenna configuration A2_B1 (initiator = 2 antennas, reflector = 1 antenna, N_AP = 2 paths), the reflector's SoftDevice Controller periodically hits an internal assertion and the device hard-faults / reboots:

    SoftDevice Controller ASSERT: 131, 1143
    ***** HARD FAULT *****
    >>> ZEPHYR FATAL ERROR 3: Kernel oops on CPU 0
    Fault during interrupt handling
addr2line on the faulting PC resolves to sdc_assertion_handler() (nrf/subsys/bluetooth/controller/hci_driver.c:357), i.e. the SDC's own assertion callback, so the assert originates inside the SDC. After the reflector reboots it stops responding on the ACL; ~10 s later the initiator hits the LE supervision timeout and disconnects with reason 0x08. Time-to-crash has high run-to-run variance (~50 s typical; adding deferred RRSP debug logging on the reflector stretches it to ~4 min but does not prevent it). The symmetric configuration A2_B2 (2:2, N_AP = 4), with everything else identical, runs indefinitely (5 min, 0 crashes, 0 disconnects in our tests). What we ruled out (by measurement) - Timing: the controller-negotiated schedule reported by procedure_enable_complete is byte-identical for A2_B1 and A2_B2 (subevent_len 18000 us, subevents_per_event 1, event_interval 2, procedure_interval 12, max_procedure_len 528). - ACL/RAS throughput: the reflector logged 633 successful "All segments sent" and 0 send failures right up to the crash instant. Procedure parameters used by the initiator (bt_le_cs_set_procedure_parameters) - max_subevent_len = min_subevent_len = 18000 - procedure_interval = 12, max_procedure_len = 528 - phy = 2M, tone_antenna_config_selection = A2_B1 - preferred_peer_antenna = ANTENNA_1 (single bit; peer reflector has 1 antenna) Reflector declares CTLR_SDC_CS_NUM_ANTENNAS=1 and does not set its own procedure parameters (initiator is sole source of truth). Note on configuration: the reflector path settings match the documented ras_reflector/android_ranging.conf fragment for the "initiator has 2 antennas" case (BT_RAS_MAX_ANTENNA_PATHS=2, BT_CTLR_SDC_CS_MAX_ANTENNA_PATHS=2, NUM_ANTENNAS left at default 1). UPDATE - reproduced on latest main: we rebuilt the same A2_B1 setup on NCS main (VERSION 3.3.99, nrfxlib/SDC @ dd8a2e1, Zephyr SDK 1.0.1) and the SAME assert reproduces: 14x "SoftDevice Controller ASSERT: 131, 1143" -> reflector reboot -> initiator reason 0x08, over a 6-minute run. So the defect is NOT fixed on the current development branch. Questions 1. Is A2_B1 (asymmetric 2:1) expected to be supported on nRF54L15 with SDC v252.31313? (The SDK's ras_reflector/android_ranging.conf documents the "initiator has 2 antennas" case.) 2. What do SDC assert id 131 / line 1143 correspond to, and is there a known fix / newer SDC build? We can provide full dual-console logs, the merged timeline, and the exact build config on request.
Parents
  • Hi! 

    We fixed a bug in the SDC here https://github.com/nrfconnect/sdk-nrfxlib/commit/ea8eba6d5d5792e2f48a4d9dd56d90a9d912f1ea#diff-794dbd2613fe781e716b96b313b0fe1528ab53a619a9bce0472999878c513fcb which I think is the same issue that you are seeing. This is a newer nrfxlib version compared with what you were using. Can you please update to the latest nrfxlib and see if this fixes the issue?

  •  Thanks — I can confirm your fix resolves the issue.

     I checked out nrfxlib at commit ea8eba6d5 (SDC rev c368565, Version 195.22120) in my v3.3.0 workspace and re-ran the native A1_B2 configuration that was previously asserting — initiator CONFIG_BT_CTLR_SDC_CS_NUM_ANTENNAS=1, reflector =2, tone_antenna_config_selection = A1_B2 (ACI 4 / N_AP=2) — on two BL54L15u DVKs.

     Result: fixed. Previously the reflector hit SoftDevice Controller ASSERT: 131, 1141 every ~15–21 s and entered a reboot loop. With the new SDC it ran 78 s with 0 asserts, 0 reboots, 0 disconnects, and produced clean two-antenna-path ranging (two distinct antenna paths, ~756 estimates each). So the N_AP=2 reflector regression is resolved by this SDC build.

     One note for anyone testing on the NCS v3.3.0 tag: updating only nrfxlib isn't enough to build. The new SDC removed the combined symbols sdc_support_channel_sounding_initiator_role() and sdc_support_channel_sounding_reflector_role() (they're now __attribute__((deprecated)) declarations, split into _central() / _peripheral() variants). v3.3.0's sdk-nrf hci_driver.c (~lines 948 and 953) still calls the combined functions, so it fails to link with an undefined reference. I forward-ported those two call sites to call the _central() and _peripheral() variants and it built and ran fine. A matching sdk-nrf revision presumably already has this — flagging it in case the intent was to test against the v3.3.0 SDK tag.

     Versions for reference:
     - Before: SDC Version 39.32003 (v3.3.0 tag) — asserts.
     - After: SDC Version 195.22120, Build 372161370, revision c368565 — works.

     Is this SDC scheduled for a tagged nrfxlib/NCS release I can pin to?

Reply
  •  Thanks — I can confirm your fix resolves the issue.

     I checked out nrfxlib at commit ea8eba6d5 (SDC rev c368565, Version 195.22120) in my v3.3.0 workspace and re-ran the native A1_B2 configuration that was previously asserting — initiator CONFIG_BT_CTLR_SDC_CS_NUM_ANTENNAS=1, reflector =2, tone_antenna_config_selection = A1_B2 (ACI 4 / N_AP=2) — on two BL54L15u DVKs.

     Result: fixed. Previously the reflector hit SoftDevice Controller ASSERT: 131, 1141 every ~15–21 s and entered a reboot loop. With the new SDC it ran 78 s with 0 asserts, 0 reboots, 0 disconnects, and produced clean two-antenna-path ranging (two distinct antenna paths, ~756 estimates each). So the N_AP=2 reflector regression is resolved by this SDC build.

     One note for anyone testing on the NCS v3.3.0 tag: updating only nrfxlib isn't enough to build. The new SDC removed the combined symbols sdc_support_channel_sounding_initiator_role() and sdc_support_channel_sounding_reflector_role() (they're now __attribute__((deprecated)) declarations, split into _central() / _peripheral() variants). v3.3.0's sdk-nrf hci_driver.c (~lines 948 and 953) still calls the combined functions, so it fails to link with an undefined reference. I forward-ported those two call sites to call the _central() and _peripheral() variants and it built and ran fine. A matching sdk-nrf revision presumably already has this — flagging it in case the intent was to test against the v3.3.0 SDK tag.

     Versions for reference:
     - Before: SDC Version 39.32003 (v3.3.0 tag) — asserts.
     - After: SDC Version 195.22120, Build 372161370, revision c368565 — works.

     Is this SDC scheduled for a tagged nrfxlib/NCS release I can pin to?

Children
No Data
Related