[Silabs]Update Submodules, API, gn files to use latest silabs sdks (#34073)

* add simplicity sdk as submodule. remove gecko_sdk. Change wifi sdk branch

* Reamove Heap_4_silabs, replace by sl_memory_manager

Update matter-platform.slcp for simplicity sdk

* Update 917 apis for wifi sdk 3.3.0

* Workflow to use latest silabs docker image

* Fix to leverage csl on thread libs

* bump matter support submodule

* Restyled by clang-format

* Restyled by autopep8

* fix linking issue with thread FTD lib

* clean up

* fix wifi ncp builds

* update linker script for mgm24 and si917

---------

Co-authored-by: Restyled.io <commits@restyled.io>
diff --git a/.github/workflows/examples-efr32.yaml b/.github/workflows/examples-efr32.yaml
index 7dab3f0..eaaedd2 100644
--- a/.github/workflows/examples-efr32.yaml
+++ b/.github/workflows/examples-efr32.yaml
@@ -40,7 +40,7 @@
     if: github.actor != 'restyled-io[bot]'
 
     container:
-      image: ghcr.io/project-chip/chip-build-efr32:54
+      image: ghcr.io/project-chip/chip-build-efr32:56
       volumes:
         - "/tmp/bloat_reports:/tmp/bloat_reports"
     steps:
diff --git a/.github/workflows/release_artifacts.yaml b/.github/workflows/release_artifacts.yaml
index 5504177..be86240 100644
--- a/.github/workflows/release_artifacts.yaml
+++ b/.github/workflows/release_artifacts.yaml
@@ -64,7 +64,7 @@
         runs-on: ubuntu-latest
 
         container:
-            image: ghcr.io/project-chip/chip-build-efr32:54
+            image: ghcr.io/project-chip/chip-build-efr32:56
         steps:
             - name: Checkout
               uses: actions/checkout@v4
diff --git a/.gitmodules b/.gitmodules
index b2e1bc8..dee55fa 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -231,10 +231,10 @@
 	url = https://github.com/SiliconLabs/sdk_support.git
 	branch = main
 	platforms = silabs,silabs_docker
-[submodule "third_party/silabs/gecko_sdk"]
-	path = third_party/silabs/gecko_sdk
-	url = https://github.com/SiliconLabs/gecko_sdk.git
-	branch = v4.4.2
+[submodule "third_party/silabs/simplicity_sdk"]
+	path = third_party/silabs/simplicity_sdk
+	url = https://github.com/SiliconLabs/simplicity_sdk.git
+	branch = v2024.6.0
 	platforms = silabs
 [submodule "third_party/silabs/wiseconnect-wifi-bt-sdk"]
 	path = third_party/silabs/wiseconnect-wifi-bt-sdk
@@ -244,7 +244,7 @@
 [submodule "third_party/silabs/wifi_sdk"]
 	path = third_party/silabs/wifi_sdk
 	url = https://github.com/SiliconLabs/wiseconnect.git
-	branch = v3.1.3-matter-hotfix.4
+	branch = v3.3.0
 	platforms = silabs
 [submodule "editline"]
 	path = third_party/editline/repo
diff --git a/examples/light-switch-app/silabs/.gn b/examples/light-switch-app/silabs/.gn
index b05216f..27aa6c7 100644
--- a/examples/light-switch-app/silabs/.gn
+++ b/examples/light-switch-app/silabs/.gn
@@ -23,7 +23,7 @@
 default_args = {
   target_cpu = "arm"
   target_os = "freertos"
-  chip_openthread_ftd = true
+  chip_openthread_ftd = false
 
   import("//openthread.gni")
 }
diff --git a/examples/platform/silabs/SiWx917/BUILD.gn b/examples/platform/silabs/SiWx917/BUILD.gn
index e8fce7e..0843397 100644
--- a/examples/platform/silabs/SiWx917/BUILD.gn
+++ b/examples/platform/silabs/SiWx917/BUILD.gn
@@ -59,13 +59,8 @@
   include_dirs = [ "project_include" ]
 
   # Link options that provide a replacement for dynamic memory operations in standard
-  # library with the FreeRTOS malloc in platform code.
+  # library with the sl_memory_manager in platform code.
   ldflags = [
-    # memory allocation -- these must be re-entrant and do locking
-    "-Wl,--wrap=malloc",
-    "-Wl,--wrap=free",
-    "-Wl,--wrap=realloc",
-    "-Wl,--wrap=calloc",
     "-Wl,--wrap=MemoryAlloc",
 
     # Wrap these in case internal newlib call them (e.g. strdup will)
@@ -234,7 +229,6 @@
     "${silabs_common_plat_dir}/LEDWidget.cpp",
     "${silabs_common_plat_dir}/MatterConfig.cpp",
     "${silabs_common_plat_dir}/SoftwareFaultReports.cpp",
-    "${silabs_common_plat_dir}/heap_4_silabs.c",
     "${silabs_common_plat_dir}/silabs_utils.cpp",
     "${silabs_common_plat_dir}/syscalls_stubs.cpp",
     "${silabs_plat_si91x_wifi_dir}/dhcp_client.cpp",
diff --git a/examples/platform/silabs/SiWx917/SiWx917/sl_wifi_if.cpp b/examples/platform/silabs/SiWx917/SiWx917/sl_wifi_if.cpp
index 741dc96..c89c676 100644
--- a/examples/platform/silabs/SiWx917/SiWx917/sl_wifi_if.cpp
+++ b/examples/platform/silabs/SiWx917/SiWx917/sl_wifi_if.cpp
@@ -21,6 +21,7 @@
 
 #include "silabs_utils.h"
 #include "sl_status.h"
+#include <app/icd/server/ICDServerConfig.h>
 
 #include "FreeRTOS.h"
 #include "event_groups.h"
@@ -39,9 +40,12 @@
 
 #include "ble_config.h"
 
-#if SL_ICD_ENABLED && SLI_SI91X_MCU_INTERFACE
+#if CHIP_CONFIG_ENABLE_ICD_SERVER && SLI_SI91X_MCU_INTERFACE
 #include "rsi_rom_power_save.h"
 #include "sl_si91x_button_pin_config.h"
+#if DISPLAY_ENABLED
+#include "sl_memlcd.h"
+#endif // DISPLAY_ENABLED
 extern "C" {
 #include "sl_si91x_driver.h"
 #include "sl_si91x_m4_ps.h"
@@ -50,7 +54,7 @@
 // TODO: should be removed once we are getting the press interrupt for button 0 with sleep
 #define BUTTON_PRESSED 1
 bool btn0_pressed = false;
-#endif // SL_ICD_ENABLED && SLI_SI91X_MCU_INTERFACE
+#endif // CHIP_CONFIG_ENABLE_ICD_SERVER && SLI_SI91X_MCU_INTERFACE
 
 #include "dhcp_client.h"
 #include "wfx_host_events.h"
@@ -70,19 +74,14 @@
 #include "sl_wifi.h"
 #include "sl_wifi_callback_framework.h"
 #include "wfx_host_events.h"
-#if TINYCRYPT_PRIMITIVES
+#if SLI_SI91X_MCU_INTERFACE
 #include "sl_si91x_trng.h"
 #define TRNGKEY_SIZE 4
-#endif // TINYCRYPT_PRIMITIVES
+#endif // SLI_SI91X_MCU_INTERFACE
 }
 
 WfxRsi_t wfx_rsi;
 
-// TODO: remove this. Added only to monitor how many watch dog reset have happened during testing.
-#ifdef SLI_SI91X_MCU_INTERFACE
-volatile uint32_t watchdog_reset = 0;
-#endif // SLI_SI91X_MCU_INTERFACE
-
 /* Declare a variable to hold the data associated with the created event group. */
 StaticEventGroup_t rsiDriverEventGroup;
 
@@ -246,10 +245,9 @@
     wfx_rsi.dev_state &= ~(WFX_RSI_ST_STA_CONNECTING);
     if (SL_WIFI_CHECK_IF_EVENT_FAILED(event))
     {
-        SILABS_LOG("F: Join Event received with %u bytes payload\n", result_length);
         callback_status = *(sl_status_t *) result;
+        SILABS_LOG("join_callback_handler: failed: 0x%X", callback_status);
         wfx_rsi.dev_state &= ~(WFX_RSI_ST_STA_CONNECTED);
-        is_wifi_disconnection_event = true;
         wfx_retry_interval_handler(is_wifi_disconnection_event, wfx_rsi.join_retries++);
         if (is_wifi_disconnection_event || wfx_rsi.join_retries <= WFX_RSI_CONFIG_MAX_JOIN)
         {
@@ -262,26 +260,22 @@
      * Join was complete - Do the DHCP
      */
     memset(&temp_reset, 0, sizeof(wfx_wifi_scan_ext_t));
-    SILABS_LOG("join_callback_handler: join completed.");
-    SILABS_LOG("%c: Join Event received with %u bytes payload\n", *result, result_length);
+    SILABS_LOG("join_callback_handler: success");
 
     WfxEvent.eventType = WFX_EVT_STA_CONN;
     WfxPostEvent(&WfxEvent);
     wfx_rsi.join_retries = 0;
     retryInterval        = WLAN_MIN_RETRY_TIMER_MS;
-    if (is_wifi_disconnection_event)
-    {
-        is_wifi_disconnection_event = false;
-    }
-    callback_status = SL_STATUS_OK;
+    // Once the join passes setting the disconnection event to true to differentiate between the first connection and reconnection
+    is_wifi_disconnection_event = true;
+    callback_status             = SL_STATUS_OK;
     return SL_STATUS_OK;
 }
 
-#if SL_ICD_ENABLED
-
-#if SI917_M4_SLEEP_ENABLED
+#if CHIP_CONFIG_ENABLE_ICD_SERVER
+#if SLI_SI91X_MCU_INTERFACE
 // Required to invoke button press event during sleep as falling edge is not detected
-void invoke_btn_press_event()
+void sl_si91x_invoke_btn_press_event()
 {
     // TODO: should be removed once we are getting the press interrupt for button 0 with sleep
     if (!RSI_NPSSGPIO_GetPin(SL_BUTTON_BTN0_PIN) && !btn0_pressed)
@@ -295,36 +289,28 @@
     }
 }
 
-/**
- * @brief Checks if the Wi-Fi module is ready for sleep.
- *
- * This function checks if the Wi-Fi module is ready to enter sleep mode.
- *
- * @return true if the Wi-Fi module is ready for sleep, false otherwise.
- */
-bool wfx_is_sleep_ready()
+/******************************************************************
+ * @fn   sl_app_sleep_ready()
+ * @brief
+ *       Called from the supress ticks from tickless to check if it
+ *       is ok to go to sleep
+ * @param[in] None
+ * @return
+ *        None
+ *********************************************************************/
+uint32_t sl_app_sleep_ready()
 {
-    // BRD4002A board BTN_PRESS is 0 when pressed, release is 1
-    // sli_si91x_is_sleep_ready requires OS Scheduler to be active
-    return ((RSI_NPSSGPIO_GetPin(SL_BUTTON_BTN0_PIN) != 0) && (wfx_rsi.dev_state & WFX_RSI_ST_SLEEP_READY) &&
-            sli_si91x_is_sleep_ready());
+    if (wfx_rsi.dev_state & WFX_RSI_ST_SLEEP_READY)
+    {
+#if DISPLAY_ENABLED
+        // Powering down the LCD
+        sl_memlcd_power_on(NULL, false);
+#endif /* DISPLAY_ENABLED */
+        return true;
+    }
+    return false;
 }
-
-/**
- * @brief Sleeps for a specified duration and then wakes up.
- *
- * This function puts the SI91x host into sleep mode for the specified duration
- * in milliseconds and then wakes it up.
- *
- * @param sleep_time_ms The duration in milliseconds to sleep.
- */
-void sl_wfx_host_si91x_sleep(uint16_t * sleep_time_ms)
-{
-    SL_ASSERT(sleep_time_ms != NULL);
-    sl_si91x_m4_sleep_wakeup(sleep_time_ms);
-}
-
-#endif // SI917_M4_SLEEP_ENABLED
+#endif // SLI_SI91X_MCU_INTERFACE
 
 /******************************************************************
  * @fn   wfx_rsi_power_save()
@@ -363,7 +349,7 @@
     }
     return status;
 }
-#endif /* SL_ICD_ENABLED */
+#endif /* CHIP_CONFIG_ENABLE_ICD_SERVER */
 
 /*************************************************************************************
  * @fn  static int32_t wfx_wifi_rsi_init(void)
@@ -378,13 +364,6 @@
     SILABS_LOG("wfx_wifi_rsi_init started");
     sl_status_t status;
     status = sl_wifi_init(&config, NULL, sl_wifi_default_event_handler);
-#ifdef SLI_SI91X_MCU_INTERFACE
-    // TODO: remove this. Added only to monitor how many watch dog reset have happened during testing.
-    if ((MCU_FSM->MCU_FSM_WAKEUP_STATUS_REG) & BIT(5))
-    {
-        watchdog_reset++;
-    }
-#endif // SLI_SI91X_MCU_INTERFACE
     if (status != SL_STATUS_OK)
     {
         return status;
@@ -449,7 +428,7 @@
         return status;
     }
 #else // For SoC
-#if SL_ICD_ENABLED
+#if CHIP_CONFIG_ENABLE_ICD_SERVER
     uint8_t xtal_enable = 1;
     status              = sl_si91x_m4_ta_secure_handshake(SL_SI91X_ENABLE_XTAL, 1, &xtal_enable, 0, NULL);
     if (status != SL_STATUS_OK)
@@ -457,7 +436,7 @@
         SILABS_LOG("Failed to bring m4_ta_secure_handshake: 0x%lx\r\n", status);
         return status;
     }
-#endif /* SL_ICD_ENABLED */
+#endif /* CHIP_CONFIG_ENABLE_ICD_SERVER */
 #endif /* SLI_SI91X_MCU_INTERFACE */
 
     sl_wifi_firmware_version_t version = { 0 };
@@ -477,7 +456,7 @@
         return status;
     }
 
-#ifdef TINYCRYPT_PRIMITIVES
+#ifdef SLI_SI91X_MCU_INTERFACE
     const uint32_t trngKey[TRNGKEY_SIZE] = { 0x16157E2B, 0xA6D2AE28, 0x8815F7AB, 0x3C4FCF09 };
 
     // To check the Entropy of TRNG and verify TRNG functioning.
@@ -495,7 +474,7 @@
         SILABS_LOG("TRNG Key Programming Failed");
         return status;
     }
-#endif // TINYCRYPT_PRIMITIVES
+#endif // SLI_SI91X_MCU_INTERFACE
 
     wfx_rsi.events = xEventGroupCreateStatic(&rsiDriverEventGroup);
     wfx_rsi.dev_state |= WFX_RSI_ST_DEV_READY;
@@ -520,12 +499,13 @@
 {
     if (SL_WIFI_CHECK_IF_EVENT_FAILED(event))
     {
-        callback_status       = *(sl_status_t *) scan_result;
+        callback_status = *(sl_status_t *) scan_result;
+        SILABS_LOG("scan_callback_handler: failed: 0x%X", callback_status);
         scan_results_complete = true;
 #if WIFI_ENABLE_SECURITY_WPA3_TRANSITION
         wfx_rsi.sec.security = WFX_SEC_WPA3;
 #else
-        wfx_rsi.sec.security = WFX_SEC_WPA2;
+        wfx_rsi.sec.security  = WFX_SEC_WPA2;
 #endif /* WIFI_ENABLE_SECURITY_WPA3_TRANSITION */
 
         osSemaphoreRelease(sScanSemaphore);
@@ -541,9 +521,9 @@
         break;
     case SL_WIFI_WPA:
     case SL_WIFI_WPA_ENTERPRISE:
-    case SL_WIFI_WPA_WPA2_MIXED:
         wfx_rsi.sec.security = WFX_SEC_WPA;
         break;
+    case SL_WIFI_WPA_WPA2_MIXED:
     case SL_WIFI_WPA2:
     case SL_WIFI_WPA2_ENTERPRISE:
         wfx_rsi.sec.security = WFX_SEC_WPA2;
@@ -556,7 +536,7 @@
     case SL_WIFI_WPA3:
         wfx_rsi.sec.security = WFX_SEC_WPA3;
 #else
-        wfx_rsi.sec.security = WFX_SEC_WPA2;
+        wfx_rsi.sec.security  = WFX_SEC_WPA2;
 #endif /* WIFI_ENABLE_SECURITY_WPA3_TRANSITION */
         break;
     default:
@@ -661,14 +641,18 @@
         connect_security_mode = SL_WIFI_WEP;
         break;
     case WFX_SEC_WPA:
-    case WFX_SEC_WPA2:
         connect_security_mode = SL_WIFI_WPA_WPA2_MIXED;
         break;
+    case WFX_SEC_WPA2:
 #if WIFI_ENABLE_SECURITY_WPA3_TRANSITION
-    case WFX_SEC_WPA3:
         connect_security_mode = SL_WIFI_WPA3_TRANSITION;
         break;
-#endif /*WIFI_ENABLE_SECURITY_WPA3_TRANSITION*/
+    case WFX_SEC_WPA3:
+        connect_security_mode = SL_WIFI_WPA3_TRANSITION;
+#else
+        connect_security_mode = SL_WIFI_WPA_WPA2_MIXED;
+#endif // WIFI_ENABLE_SECURITY_WPA3_TRANSITION
+        break;
     case WFX_SEC_NONE:
         connect_security_mode = SL_WIFI_OPEN;
         break;
@@ -695,14 +679,14 @@
 
         sl_wifi_set_join_callback(join_callback_handler, NULL);
 
-#if SL_ICD_ENABLED
+#if CHIP_CONFIG_ENABLE_ICD_SERVER
         // Setting the listen interval to 0 which will set it to DTIM interval
         sl_wifi_listen_interval_t sleep_interval = { .listen_interval = 0 };
         status                                   = sl_wifi_set_listen_interval(SL_WIFI_CLIENT_INTERFACE, sleep_interval);
 
         sl_wifi_advanced_client_configuration_t client_config = { .max_retry_attempts = 5 };
         sl_wifi_set_advanced_client_configuration(SL_WIFI_CLIENT_INTERFACE, &client_config);
-#endif // SL_ICD_ENABLED
+#endif // CHIP_CONFIG_ENABLE_ICD_SERVER
         /* Try to connect Wifi with given Credentials
          * untill there is a success or maximum number of tries allowed
          */
@@ -1006,47 +990,3 @@
     wfx_rsi.dev_state |= WFX_RSI_ST_STA_READY;
 }
 #endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */
-
-/********************************************************************************************
- * @fn   void wfx_rsi_pkt_add_data(void *p, uint8_t *buf, uint16_t len, uint16_t off)
- * @brief
- *       add the data into packet
- * @param[in]  p:
- * @param[in]  buf:
- * @param[in]  len:
- * @param[in]  off:
- * @return
- *        None
- **********************************************************************************************/
-void wfx_rsi_pkt_add_data(void * p, uint8_t * buf, uint16_t len, uint16_t off)
-{
-    sl_si91x_packet_t * pkt;
-    pkt = (sl_si91x_packet_t *) p;
-    memcpy(((char *) pkt->data) + off, buf, len);
-}
-
-#if !EXP_BOARD
-/********************************************************************************************
- * @fn   int32_t wfx_rsi_send_data(void *p, uint16_t len)
- * @brief
- *       Driver send a data
- * @param[in]  p:
- * @param[in]  len:
- * @return
- *        None
- **********************************************************************************************/
-int32_t wfx_rsi_send_data(void * p, uint16_t len)
-{
-    int32_t status;
-    sl_wifi_buffer_t * buffer;
-    buffer = (sl_wifi_buffer_t *) p;
-
-    if (sl_si91x_driver_send_data_packet(SI91X_WLAN_CMD_QUEUE, buffer, RSI_SEND_RAW_DATA_RESPONSE_WAIT_TIME))
-    {
-        SILABS_LOG("*ERR*EN-RSI:Send fail");
-        return ERR_IF;
-    }
-    return status;
-}
-
-#endif
diff --git a/examples/platform/silabs/display/lcd.cpp b/examples/platform/silabs/display/lcd.cpp
index bf40cd0..80cd5a1 100644
--- a/examples/platform/silabs/display/lcd.cpp
+++ b/examples/platform/silabs/display/lcd.cpp
@@ -26,7 +26,7 @@
 #include "glib.h"
 
 #if (SLI_SI91X_MCU_INTERFACE)
-#include "rsi_chip.h"
+#include "sl_memlcd.h"
 #endif
 
 #ifdef QR_CODE_ENABLED
@@ -67,10 +67,7 @@
 
     /* Enable the memory lcd */
 #if (SLI_SI91X_MCU_INTERFACE)
-    RSI_NPSSGPIO_InputBufferEn(SL_BOARD_ENABLE_DISPLAY_PIN, 1U);
-    RSI_NPSSGPIO_SetPinMux(SL_BOARD_ENABLE_DISPLAY_PIN, 0);
-    RSI_NPSSGPIO_SetDir(SL_BOARD_ENABLE_DISPLAY_PIN, 0);
-    RSI_NPSSGPIO_SetPin(SL_BOARD_ENABLE_DISPLAY_PIN, 1U);
+    sl_memlcd_display_enable();
 #else
     status = sl_board_enable_display();
     if (status != SL_STATUS_OK)
diff --git a/examples/platform/silabs/efr32/BUILD.gn b/examples/platform/silabs/efr32/BUILD.gn
index aa6c72a..20180ec 100644
--- a/examples/platform/silabs/efr32/BUILD.gn
+++ b/examples/platform/silabs/efr32/BUILD.gn
@@ -76,13 +76,8 @@
   include_dirs = [ "project_include" ]
 
   # Link options that provide a replacement for dynamic memory operations in standard
-  # library with the FreeRTOS malloc in platform code.
+  # library with the sl_memory_manager in platform code.
   ldflags = [
-    # memory allocation -- these must be re-entrant and do locking
-    "-Wl,--wrap=malloc",
-    "-Wl,--wrap=free",
-    "-Wl,--wrap=realloc",
-    "-Wl,--wrap=calloc",
     "-Wl,--wrap=MemoryAlloc",
 
     # Wrap these in case internal newlib call them (e.g. strdup will)
@@ -280,7 +275,6 @@
     "${silabs_common_plat_dir}/LEDWidget.cpp",
     "${silabs_common_plat_dir}/MatterConfig.cpp",
     "${silabs_common_plat_dir}/SoftwareFaultReports.cpp",
-    "${silabs_common_plat_dir}/heap_4_silabs.c",
     "${silabs_common_plat_dir}/silabs_utils.cpp",
     "${silabs_common_plat_dir}/syscalls_stubs.cpp",
   ]
diff --git a/examples/platform/silabs/efr32/project_include/OpenThreadConfig.h b/examples/platform/silabs/efr32/project_include/OpenThreadConfig.h
index d7492f4..ed56c7a 100644
--- a/examples/platform/silabs/efr32/project_include/OpenThreadConfig.h
+++ b/examples/platform/silabs/efr32/project_include/OpenThreadConfig.h
@@ -45,7 +45,7 @@
 // Timeout after 2 missed checkin or 4 mins if sleep interval is too short.
 #define OPENTHREAD_CONFIG_MLE_CHILD_TIMEOUT_DEFAULT ((SL_MLE_TIMEOUT_s < 120) ? 240 : ((SL_MLE_TIMEOUT_s * 2) + 1))
 
-#if defined(SL_CSL_ENABLE) && SL_CSL_ENABLE
+#if defined(SL_CSL_ENABLE) && SL_CSL_ENABLE || SL_CONFIG_OPENTHREAD_LIB
 
 #define OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE 1
 #define OPENTHREAD_CONFIG_MAC_CSL_AUTO_SYNC_ENABLE 1
@@ -55,7 +55,7 @@
 #define OPENTHREAD_CONFIG_CSL_TIMEOUT SL_CSL_TIMEOUT
 #define SL_OPENTHREAD_CSL_TX_UNCERTAINTY 200
 
-#endif // SL_CSL_ENABLE
+#endif // SL_CSL_ENABLE || SL_CONFIG_OPENTHREAD_LIB
 
 #endif // SL_ICD_ENABLED
 
diff --git a/examples/platform/silabs/efr32/rs911x/hal/rsi_hal_mcu_interrupt.c b/examples/platform/silabs/efr32/rs911x/hal/rsi_hal_mcu_interrupt.c
index 079a5e0..1cb5ddf 100644
--- a/examples/platform/silabs/efr32/rs911x/hal/rsi_hal_mcu_interrupt.c
+++ b/examples/platform/silabs/efr32/rs911x/hal/rsi_hal_mcu_interrupt.c
@@ -62,7 +62,7 @@
     if (irqnum != SL_WFX_HOST_PINOUT_SPI_IRQ)
         return;
 #if (SLI_SI91X_MCU_INTERFACE | EXP_BOARD)
-    sl_si91x_host_set_bus_event(NCP_HOST_BUS_RX_EVENT);
+    sl_si91x_host_set_bus_event(SL_SI91X_NCP_HOST_BUS_RX_EVENT);
 #else
     GPIO_IntClear(1 << SL_WFX_HOST_PINOUT_SPI_IRQ);
     if (call_back != NULL)
diff --git a/examples/platform/silabs/heap_4_silabs.c b/examples/platform/silabs/heap_4_silabs.c
deleted file mode 100644
index 8abb295..0000000
--- a/examples/platform/silabs/heap_4_silabs.c
+++ /dev/null
@@ -1,673 +0,0 @@
-/*
- * Copyright (c) 2021 Project CHIP Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * FreeRTOS Kernel V10.4.3
- * Copyright (C) 2020 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in
- * the Software without restriction, including without limitation the rights to
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
- * the Software, and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * https://www.FreeRTOS.org
- * https://github.com/FreeRTOS
- *
- */
-
-/*
- * A sample implementation of pvPortMalloc() and vPortFree() that combines
- * (coalescences) adjacent memory blocks as they are freed, and in so doing
- * limits memory fragmentation.
- *
- * See heap_1.c, heap_2.c and heap_3.c for alternative implementations, and the
- * memory management pages of https://www.FreeRTOS.org for more information.
- */
-#include <stdlib.h>
-
-/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining
-all the API functions to use the MPU wrappers.  That should only be done when
-task.h is included from an application file. */
-#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE
-
-#include "heap_4_silabs.h"
-#include "task.h"
-#include <AppConfig.h>
-#include <stdio.h>
-
-#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
-
-#if (configSUPPORT_DYNAMIC_ALLOCATION == 0)
-#error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0
-#endif
-
-/* Block sizes must not get too small. */
-#define heapMINIMUM_BLOCK_SIZE ((size_t) (xHeapStructSize << 1))
-
-/* Assumes 8bit bytes! */
-#define heapBITS_PER_BYTE ((size_t) 8)
-
-/* Allocate the memory for the heap. */
-#if (configAPPLICATION_ALLOCATED_HEAP == 1)
-/* The application writer has already defined the array used for the RTOS
-heap - probably so it can be placed in a special segment or address. */
-extern uint8_t ucHeap[configTOTAL_HEAP_SIZE];
-#else
-static uint8_t ucHeap[configTOTAL_HEAP_SIZE];
-#endif /* configAPPLICATION_ALLOCATED_HEAP */
-
-/* Define the linked list structure.  This is used to link free blocks in order
-of their memory address. */
-typedef struct A_BLOCK_LINK
-{
-    struct A_BLOCK_LINK * pxNextFreeBlock; /*<< The next free block in the list. */
-    size_t xBlockSize;                     /*<< The size of the free block. */
-} BlockLink_t;
-
-/*-----------------------------------------------------------*/
-
-/*
- * Inserts a block of memory that is being freed into the correct position in
- * the list of free memory blocks.  The block being freed will be merged with
- * the block in front it and/or the block behind it if the memory blocks are
- * adjacent to each other.
- */
-static void prvInsertBlockIntoFreeList(BlockLink_t * pxBlockToInsert);
-
-/*
- * Called automatically to setup the required heap structures the first time
- * pvPortMalloc() is called.
- */
-static void prvHeapInit(void);
-
-/*-----------------------------------------------------------*/
-
-/* The size of the structure placed at the beginning of each allocated memory
- * block must by correctly byte aligned. */
-static const size_t xHeapStructSize =
-    (sizeof(BlockLink_t) + ((size_t) (portBYTE_ALIGNMENT - 1))) & ~((size_t) portBYTE_ALIGNMENT_MASK);
-
-/* Create a couple of list links to mark the start and end of the list. */
-static BlockLink_t xStart, *pxEnd = NULL;
-
-/* Keeps track of the number of calls to allocate and free memory as well as the
- * number of free bytes remaining, but says nothing about fragmentation. */
-static size_t xFreeBytesRemaining            = 0U;
-static size_t xMinimumEverFreeBytesRemaining = 0U;
-static size_t xNumberOfSuccessfulAllocations = 0;
-static size_t xNumberOfSuccessfulFrees       = 0;
-
-/* Gets set to the top bit of an size_t type.  When this bit in the xBlockSize
- * member of an BlockLink_t structure is set then the block belongs to the
- * application.  When the bit is free the block is still part of the free heap
- * space. */
-static size_t xBlockAllocatedBit = 0;
-
-/**
- * @brief xPortPointerSize is based on the malloc implementation of heap_4
- * Returns the size of allocated block associated to the pointer
- *
- * @param pv pointer
- * @return size_t block size
- */
-size_t xPortPointerSize(void * pv)
-{
-    uint8_t * puc = (uint8_t *) pv;
-    BlockLink_t * pxLink;
-    void * voidp;
-    size_t sz = 0;
-
-    if (pv != NULL)
-    {
-        vTaskSuspendAll();
-        {
-            /* The memory being checked will have an BlockLink_t structure immediately
-            before it. */
-            puc -= xHeapStructSize;
-
-            /* This casting is to keep the compiler from issuing warnings. */
-            voidp  = (void *) puc;
-            pxLink = (BlockLink_t *) voidp;
-
-            /* Check if the block is actually allocated. */
-            configASSERT((pxLink->xBlockSize & xBlockAllocatedBit) != 0);
-            configASSERT(pxLink->pxNextFreeBlock == NULL);
-
-            sz = (pxLink->xBlockSize & ~xBlockAllocatedBit) - xHeapStructSize;
-        }
-        (void) xTaskResumeAll();
-    }
-
-    return sz;
-}
-
-/*-----------------------------------------------------------*/
-
-void * pvPortMalloc(size_t xWantedSize)
-{
-    BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink;
-    void * pvReturn = NULL;
-
-    vTaskSuspendAll();
-    {
-        /* If this is the first call to malloc then the heap will require
-         * initialisation to setup the list of free blocks. */
-        if (pxEnd == NULL)
-        {
-            prvHeapInit();
-        }
-        else
-        {
-            mtCOVERAGE_TEST_MARKER();
-        }
-
-        /* Check the requested block size is not so large that the top bit is
-         * set.  The top bit of the block size member of the BlockLink_t structure
-         * is used to determine who owns the block - the application or the
-         * kernel, so it must be free. */
-        if ((xWantedSize & xBlockAllocatedBit) == 0)
-        {
-            /* The wanted size must be increased so it can contain a BlockLink_t
-             * structure in addition to the requested amount of bytes. */
-            if ((xWantedSize > 0) && ((xWantedSize + xHeapStructSize) > xWantedSize)) /* Overflow check */
-            {
-                xWantedSize += xHeapStructSize;
-
-                /* Ensure that blocks are always aligned. */
-                if ((xWantedSize & portBYTE_ALIGNMENT_MASK) != 0x00)
-                {
-                    /* Byte alignment required. Check for overflow. */
-                    if ((xWantedSize + (portBYTE_ALIGNMENT - (xWantedSize & portBYTE_ALIGNMENT_MASK))) > xWantedSize)
-                    {
-                        xWantedSize += (portBYTE_ALIGNMENT - (xWantedSize & portBYTE_ALIGNMENT_MASK));
-                        configASSERT((xWantedSize & portBYTE_ALIGNMENT_MASK) == 0);
-                    }
-                    else
-                    {
-                        xWantedSize = 0;
-                    }
-                }
-                else
-                {
-                    mtCOVERAGE_TEST_MARKER();
-                }
-            }
-            else
-            {
-                xWantedSize = 0;
-            }
-
-            if ((xWantedSize > 0) && (xWantedSize <= xFreeBytesRemaining))
-            {
-                /* Traverse the list from the start	(lowest address) block until
-                 * one of adequate size is found. */
-                pxPreviousBlock = &xStart;
-                pxBlock         = xStart.pxNextFreeBlock;
-
-                while ((pxBlock->xBlockSize < xWantedSize) && (pxBlock->pxNextFreeBlock != NULL))
-                {
-                    pxPreviousBlock = pxBlock;
-                    pxBlock         = pxBlock->pxNextFreeBlock;
-                }
-
-                /* If the end marker was reached then a block of adequate size
-                 * was not found. */
-                if (pxBlock != pxEnd)
-                {
-                    /* Return the memory space pointed to - jumping over the
-                     * BlockLink_t structure at its start. */
-                    pvReturn = (void *) (((uint8_t *) pxPreviousBlock->pxNextFreeBlock) + xHeapStructSize);
-
-                    /* This block is being returned for use so must be taken out
-                     * of the list of free blocks. */
-                    pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock;
-
-                    /* If the block is larger than required it can be split into
-                     * two. */
-                    if ((pxBlock->xBlockSize - xWantedSize) > heapMINIMUM_BLOCK_SIZE)
-                    {
-                        /* This block is to be split into two.  Create a new
-                         * block following the number of bytes requested. The void
-                         * cast is used to prevent byte alignment warnings from the
-                         * compiler. */
-                        pxNewBlockLink = (void *) (((uint8_t *) pxBlock) + xWantedSize);
-                        configASSERT((((size_t) pxNewBlockLink) & portBYTE_ALIGNMENT_MASK) == 0);
-
-                        /* Calculate the sizes of two blocks split from the
-                         * single block. */
-                        pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize;
-                        pxBlock->xBlockSize        = xWantedSize;
-
-                        /* Insert the new block into the list of free blocks. */
-                        prvInsertBlockIntoFreeList(pxNewBlockLink);
-                    }
-                    else
-                    {
-                        mtCOVERAGE_TEST_MARKER();
-                    }
-
-                    xFreeBytesRemaining -= pxBlock->xBlockSize;
-
-                    if (xFreeBytesRemaining < xMinimumEverFreeBytesRemaining)
-                    {
-                        xMinimumEverFreeBytesRemaining = xFreeBytesRemaining;
-                    }
-                    else
-                    {
-                        mtCOVERAGE_TEST_MARKER();
-                    }
-
-                    /* The block is being returned - it is allocated and owned
-                     * by the application and has no "next" block. */
-                    pxBlock->xBlockSize |= xBlockAllocatedBit;
-                    pxBlock->pxNextFreeBlock = NULL;
-                    xNumberOfSuccessfulAllocations++;
-                }
-                else
-                {
-                    mtCOVERAGE_TEST_MARKER();
-                }
-            }
-            else
-            {
-                mtCOVERAGE_TEST_MARKER();
-            }
-        }
-        else
-        {
-            mtCOVERAGE_TEST_MARKER();
-        }
-
-        traceMALLOC(pvReturn, xWantedSize);
-    }
-    (void) xTaskResumeAll();
-
-#if (configUSE_MALLOC_FAILED_HOOK == 1)
-    {
-        if (pvReturn == NULL)
-        {
-            extern void vApplicationMallocFailedHook(void);
-            vApplicationMallocFailedHook();
-        }
-        else
-        {
-            mtCOVERAGE_TEST_MARKER();
-        }
-    }
-#endif /* if ( configUSE_MALLOC_FAILED_HOOK == 1 ) */
-
-    configASSERT((((size_t) pvReturn) & (size_t) portBYTE_ALIGNMENT_MASK) == 0);
-    return pvReturn;
-}
-/*-----------------------------------------------------------*/
-
-void * pvPortCalloc(size_t num, size_t size)
-{
-    size_t total = num * size;
-    // check for multiplication overflow
-    if ((size != 0) && ((total / size) != num))
-    {
-        return NULL;
-    }
-
-    void * ptr = pvPortMalloc(total);
-    if (ptr != NULL)
-    {
-        memset(ptr, 0, total);
-    }
-
-    return ptr;
-}
-
-void * pvPortRealloc(void * pv, size_t size)
-{
-    void * resized_ptr  = NULL;
-    size_t current_size = xPortPointerSize(pv);
-
-    if (current_size > 0) // pv is allocated
-    {
-        if (size) // New size is not 0
-        {
-            if (size == current_size) // if existing pointer is the same size
-            {
-                resized_ptr = pv;
-            }
-            else // New size is a different from current size
-            {
-                resized_ptr = pvPortCalloc(1, size);
-                if (resized_ptr != NULL)
-                {
-                    size_t smallest_size = size < current_size ? size : current_size;
-                    memcpy(resized_ptr, pv, smallest_size);
-
-                    vPortFree(pv);
-                }
-            }
-        }
-        else // If size if 0, free pointer
-        {
-            vPortFree(pv);
-        }
-    }
-    else // pv is not allocated, allocate a new pointer
-    {
-        resized_ptr = pvPortCalloc(1, size);
-    }
-
-    return resized_ptr;
-}
-
-/*-----------------------------------------------------------*/
-
-void vPortFree(void * pv)
-{
-    uint8_t * puc = (uint8_t *) pv;
-    BlockLink_t * pxLink;
-
-    if (pv != NULL)
-    {
-        /* The memory being freed will have an BlockLink_t structure immediately
-         * before it. */
-        puc -= xHeapStructSize;
-
-        /* This casting is to keep the compiler from issuing warnings. */
-        pxLink = (void *) puc;
-
-        /* Check the block is actually allocated. */
-        configASSERT((pxLink->xBlockSize & xBlockAllocatedBit) != 0);
-        configASSERT(pxLink->pxNextFreeBlock == NULL);
-
-        if ((pxLink->xBlockSize & xBlockAllocatedBit) != 0)
-        {
-            if (pxLink->pxNextFreeBlock == NULL)
-            {
-                /* The block is being returned to the heap - it is no longer
-                 * allocated. */
-                pxLink->xBlockSize &= ~xBlockAllocatedBit;
-
-                vTaskSuspendAll();
-                {
-                    /* Add this block to the list of free blocks. */
-                    xFreeBytesRemaining += pxLink->xBlockSize;
-                    traceFREE(pv, pxLink->xBlockSize);
-                    prvInsertBlockIntoFreeList(((BlockLink_t *) pxLink));
-                    xNumberOfSuccessfulFrees++;
-                }
-                (void) xTaskResumeAll();
-            }
-            else
-            {
-                mtCOVERAGE_TEST_MARKER();
-            }
-        }
-        else
-        {
-            mtCOVERAGE_TEST_MARKER();
-        }
-    }
-}
-/*-----------------------------------------------------------*/
-
-size_t xPortGetFreeHeapSize(void)
-{
-    return xFreeBytesRemaining;
-}
-/*-----------------------------------------------------------*/
-
-size_t xPortGetMinimumEverFreeHeapSize(void)
-{
-    return xMinimumEverFreeBytesRemaining;
-}
-
-void xPortResetHeapMinimumEverFreeHeapSize(void)
-{
-    taskENTER_CRITICAL();
-    {
-        xMinimumEverFreeBytesRemaining = xFreeBytesRemaining;
-    }
-    taskEXIT_CRITICAL();
-}
-
-/*-----------------------------------------------------------*/
-
-void vPortInitialiseBlocks(void)
-{
-    /* This just exists to keep the linker quiet. */
-}
-/*-----------------------------------------------------------*/
-
-static void prvHeapInit(void)
-{
-    BlockLink_t * pxFirstFreeBlock;
-    uint8_t * pucAlignedHeap;
-    size_t uxAddress;
-    size_t xTotalHeapSize = configTOTAL_HEAP_SIZE;
-
-    /* Ensure the heap starts on a correctly aligned boundary. */
-    uxAddress = (size_t) ucHeap;
-
-    if ((uxAddress & portBYTE_ALIGNMENT_MASK) != 0)
-    {
-        uxAddress += (portBYTE_ALIGNMENT - 1);
-        uxAddress &= ~((size_t) portBYTE_ALIGNMENT_MASK);
-        xTotalHeapSize -= uxAddress - (size_t) ucHeap;
-    }
-
-    pucAlignedHeap = (uint8_t *) uxAddress;
-
-    /* xStart is used to hold a pointer to the first item in the list of free
-     * blocks.  The void cast is used to prevent compiler warnings. */
-    xStart.pxNextFreeBlock = (void *) pucAlignedHeap;
-    xStart.xBlockSize      = (size_t) 0;
-
-    /* pxEnd is used to mark the end of the list of free blocks and is inserted
-     * at the end of the heap space. */
-    uxAddress = ((size_t) pucAlignedHeap) + xTotalHeapSize;
-    uxAddress -= xHeapStructSize;
-    uxAddress &= ~((size_t) portBYTE_ALIGNMENT_MASK);
-    pxEnd                  = (void *) uxAddress;
-    pxEnd->xBlockSize      = 0;
-    pxEnd->pxNextFreeBlock = NULL;
-
-    /* To start with there is a single free block that is sized to take up the
-     * entire heap space, minus the space taken by pxEnd. */
-    pxFirstFreeBlock                  = (void *) pucAlignedHeap;
-    pxFirstFreeBlock->xBlockSize      = uxAddress - (size_t) pxFirstFreeBlock;
-    pxFirstFreeBlock->pxNextFreeBlock = pxEnd;
-
-    /* Only one block exists - and it covers the entire usable heap space. */
-    xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
-    xFreeBytesRemaining            = pxFirstFreeBlock->xBlockSize;
-
-    /* Work out the position of the top bit in a size_t variable. */
-    xBlockAllocatedBit = ((size_t) 1) << ((sizeof(size_t) * heapBITS_PER_BYTE) - 1);
-}
-/*-----------------------------------------------------------*/
-
-static void prvInsertBlockIntoFreeList(BlockLink_t * pxBlockToInsert)
-{
-    BlockLink_t * pxIterator;
-    uint8_t * puc;
-
-    if (xStart.pxNextFreeBlock == 0)
-    {
-        // configASSERT( xStart.pxNextFreeBlock!=0);
-        HeapStats_t Stats;
-        vPortGetHeapStats(&Stats);
-    }
-    /* Iterate through the list until a block is found that has a higher address
-     * than the block being inserted. */
-    for (pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock)
-    {
-        /* Nothing to do here, just iterate to the right position. */
-    }
-
-    /* Do the block being inserted, and the block it is being inserted after
-     * make a contiguous block of memory? */
-    puc = (uint8_t *) pxIterator;
-
-    if ((puc + pxIterator->xBlockSize) == (uint8_t *) pxBlockToInsert)
-    {
-        pxIterator->xBlockSize += pxBlockToInsert->xBlockSize;
-        pxBlockToInsert = pxIterator;
-    }
-    else
-    {
-        mtCOVERAGE_TEST_MARKER();
-    }
-
-    /* Do the block being inserted, and the block it is being inserted before
-     * make a contiguous block of memory? */
-    puc = (uint8_t *) pxBlockToInsert;
-
-    if ((puc + pxBlockToInsert->xBlockSize) == (uint8_t *) pxIterator->pxNextFreeBlock)
-    {
-        if (pxIterator->pxNextFreeBlock != pxEnd)
-        {
-            /* Form one big block from the two blocks. */
-            pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize;
-            pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock;
-        }
-        else
-        {
-            pxBlockToInsert->pxNextFreeBlock = pxEnd;
-        }
-    }
-    else
-    {
-        pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock;
-    }
-
-    /* If the block being inserted plugged a gab, so was merged with the block
-     * before and the block after, then it's pxNextFreeBlock pointer will have
-     * already been set, and should not be set here as that would make it point
-     * to itself. */
-    if (pxIterator != pxBlockToInsert)
-    {
-        pxIterator->pxNextFreeBlock = pxBlockToInsert;
-    }
-    else
-    {
-        mtCOVERAGE_TEST_MARKER();
-    }
-}
-/*-----------------------------------------------------------*/
-
-void vPortGetHeapStats(HeapStats_t * pxHeapStats)
-{
-    BlockLink_t * pxBlock;
-    size_t xBlocks = 0, xMaxSize = 0,
-           xMinSize = portMAX_DELAY; /* portMAX_DELAY used as a portable way of getting the maximum value. */
-
-    vTaskSuspendAll();
-    {
-        pxBlock = xStart.pxNextFreeBlock;
-
-        /* pxBlock will be NULL if the heap has not been initialised.  The heap
-         * is initialised automatically when the first allocation is made. */
-        if (pxBlock != NULL)
-        {
-            do
-            {
-                /* Increment the number of blocks and record the largest block seen
-                 * so far. */
-                xBlocks++;
-
-                if (pxBlock->xBlockSize > xMaxSize)
-                {
-                    xMaxSize = pxBlock->xBlockSize;
-                }
-
-                if (pxBlock->xBlockSize < xMinSize)
-                {
-                    xMinSize = pxBlock->xBlockSize;
-                }
-
-                /* Move to the next block in the chain until the last block is
-                 * reached. */
-                pxBlock = pxBlock->pxNextFreeBlock;
-            } while (pxBlock != pxEnd);
-        }
-    }
-    (void) xTaskResumeAll();
-
-    pxHeapStats->xSizeOfLargestFreeBlockInBytes  = xMaxSize;
-    pxHeapStats->xSizeOfSmallestFreeBlockInBytes = xMinSize;
-    pxHeapStats->xNumberOfFreeBlocks             = xBlocks;
-
-    taskENTER_CRITICAL();
-    {
-        pxHeapStats->xAvailableHeapSpaceInBytes     = xFreeBytesRemaining;
-        pxHeapStats->xNumberOfSuccessfulAllocations = xNumberOfSuccessfulAllocations;
-        pxHeapStats->xNumberOfSuccessfulFrees       = xNumberOfSuccessfulFrees;
-        pxHeapStats->xMinimumEverFreeBytesRemaining = xMinimumEverFreeBytesRemaining;
-    }
-    taskEXIT_CRITICAL();
-}
-
-/*
- * Wrapper functions to override default memory allocation functions
- */
-void * __wrap_malloc(size_t size)
-{
-    return pvPortMalloc(size);
-}
-
-void __wrap_free(void * ptr)
-{
-    vPortFree(ptr);
-}
-
-void * __wrap_realloc(void * ptr, size_t new_size)
-{
-    return pvPortRealloc(ptr, new_size);
-}
-
-__attribute__((used)) void * __wrap_calloc(size_t num, size_t size)
-{
-    return pvPortCalloc(num, size);
-}
-
-void * __wrap__calloc_r(void * REENT, size_t num, size_t size)
-{
-    return __wrap_calloc(num, size);
-}
-
-void * __wrap__malloc_r(void * REENT, size_t size)
-{
-    return __wrap_malloc(size);
-}
-
-void __wrap__free_r(void * REENT, void * ptr)
-{
-    __wrap_free(ptr);
-}
-
-void * __wrap__realloc_r(void * REENT, void * ptr, size_t new_size)
-{
-    return __wrap_realloc(ptr, new_size);
-}
diff --git a/examples/platform/silabs/heap_4_silabs.h b/examples/platform/silabs/heap_4_silabs.h
deleted file mode 100644
index ed773f5..0000000
--- a/examples/platform/silabs/heap_4_silabs.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *
- *    Copyright (c) 2020 Project CHIP Authors
- *    All rights reserved.
- *
- *    Licensed under the Apache License, Version 2.0 (the "License");
- *    you may not use this file except in compliance with the License.
- *    You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *    Unless required by applicable law or agreed to in writing, software
- *    distributed under the License is distributed on an "AS IS" BASIS,
- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *    See the License for the specific language governing permissions and
- *    limitations under the License.
- */
-/*******************************************************************************
- * @file
- * @brief heap_4_silabs.h
- *******************************************************************************
- * # License
- * <b>Copyright 2018 Silicon Laboratories Inc. www.silabs.com</b>
- *******************************************************************************
- *
- * The licensor of this software is Silicon Laboratories Inc. Your use of this
- * software is governed by the terms of Silicon Labs Master Software License
- * Agreement (MSLA) available at
- * www.silabs.com/about-us/legal/master-software-license-agreement. This
- * software is distributed to you in Source Code format and is governed by the
- * sections of the MSLA applicable to Source Code.
- *
- ******************************************************************************/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "FreeRTOS.h"
-#include <string.h>
-
-void * pvPortCalloc(size_t num, size_t size);
-void * pvPortRealloc(void * pv, size_t size);
-
-void xPortResetHeapMinimumEverFreeHeapSize(void);
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/examples/platform/silabs/ldscripts/SiWx917-common.ld b/examples/platform/silabs/ldscripts/SiWx917-common.ld
index f23fecf..fcc5c97 100644
--- a/examples/platform/silabs/ldscripts/SiWx917-common.ld
+++ b/examples/platform/silabs/ldscripts/SiWx917-common.ld
@@ -39,8 +39,8 @@
 	.text :
 	{
 		KEEP(*(.isr_vector))
-        KEEP(*(.reset_handler))
-		*(EXCLUDE_FILE(*sl_si91x_bus.c.o *sl_si91x_driver.c.o *sli_si91x_multithreaded.c.o *rsi_hal_mcu_m4_ram.c.o *rsi_hal_mcu_m4_rom.c.o *rsi_deepsleep_soc.c.o *croutine.c.o *event_groups.c.o *list.c.o *queue.c.o *stream_buffer.c.o *tasks.c.o *timers.c.o *cmsis_os2.c.o *freertos_umm_malloc_host.c.o *malloc_buffers.c.o *sl_rsi_utility.c.o *port.c.o *heap_*.c.o *os_systick.c.o *sl_wifi_if.c.o *sl_si91x_m4_ps.c.o *sl_platform_wireless.c.o) .text*)
+     	KEEP(*(.reset_handler))
+		*(EXCLUDE_FILE(*sl_si91x_bus.o *sl_si91x_driver.o *sli_si91x_multithreaded.o *rsi_hal_mcu_m4_ram.o *rsi_hal_mcu_m4_rom.o *rsi_deepsleep_soc.o *croutine.o *event_groups.o *list.o *queue.o *stream_buffer.o *tasks.o *timers.o *cmsis_os2.o *freertos_umm_malloc_host.o *malloc_buffers.o *sl_rsi_utility.o *port.o *sl_sleeptimer.o *sl_sleeptimer_hal_si91x_sysrtc.o *rsi_sysrtc.o *sl_si91x_low_power_tickless_mode.o *heap_*.o *sl_core_cortexm.o) .text*)
 		
     /* .ctors */
     *crtbegin.o(.ctors)
@@ -127,29 +127,30 @@
 		*(.rodata*)
 		*(vtable)
 		*(.data*)
-		*sl_si91x_bus.c.o(.text*)
-		*sl_si91x_driver.c.o(.text*)
-		*sli_si91x_multithreaded.c.o(.text*)
-		*rsi_hal_mcu_m4_ram.c.o(.text*)
-		*rsi_hal_mcu_m4_rom.c.o(.text*)
-		*rsi_deepsleep_soc.c.o(.text*)
-		*croutine.c.o(.text*)
-		*event_groups.c.o(.text*)
-		*list.c.o(.text*)
-		*queue.c.o(.text*)
-		*cmsis_os2.c.o(.text*)
-		*stream_buffer.c.o(.text*)
-		*tasks.c.o(.text*)
-		*timers.c.o(.text*)
-		*freertos_umm_malloc_host.c.o(.text*)
-		*malloc_buffers.c.o(.text*)
-		*sl_rsi_utility.c.o(.text*)
-		*port.c.o(.text*)
-		*heap_*.c.o(.text*)
-		*os_systick.c.o(.text*)
-		*sl_wifi_if.c.o(.text*)
-		*sl_si91x_m4_ps.c.o(.text*)
-		*sl_platform_wireless.c.o(.text*)
+		*sl_si91x_bus.o(.text*)
+		*sl_si91x_driver.o(.text*)
+		*sli_si91x_multithreaded.o(.text*)
+		*rsi_hal_mcu_m4_ram.o(.text*)
+		*rsi_hal_mcu_m4_rom.o(.text*)
+  	    *rsi_deepsleep_soc.o(.text*)
+		*croutine.o(.text*)
+		*event_groups.o(.text*)
+		*list.o(.text*)
+		*queue.o(.text*)
+		*cmsis_os2.o(.text*)
+		*stream_buffer.o(.text*)
+		*tasks.o(.text*)
+		*timers.o(.text*)
+		*freertos_umm_malloc_host.o(.text*)
+		*malloc_buffers.o(.text*)
+		*sl_rsi_utility.o(.text*)
+		*port.o(.text*)
+		*heap_*.o(.text*)
+    *sl_sleeptimer.o(.text*)
+    *sl_sleeptimer_hal_si91x_sysrtc.o(.text*)
+    *rsi_sysrtc.o(.text*)
+    *sl_si91x_low_power_tickless_mode.o(.text*)
+    *sl_core_cortexm.o(.text*)
 
     . = ALIGN(4);
     /* preinit data */
diff --git a/examples/platform/silabs/ldscripts/efr32mg24.ld b/examples/platform/silabs/ldscripts/efr32mg24.ld
index b911b13..16066c2 100644
--- a/examples/platform/silabs/ldscripts/efr32mg24.ld
+++ b/examples/platform/silabs/ldscripts/efr32mg24.ld
@@ -1,43 +1,22 @@
-/*
- *
- *    Copyright (c) 2021 Project CHIP Authors
- *    All rights reserved.
- *
- *    Licensed under the Apache License, Version 2.0 (the "License");
- *    you may not use this file except in compliance with the License.
- *    You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *    Unless required by applicable law or agreed to in writing, software
- *    distributed under the License is distributed on an "AS IS" BASIS,
- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *    See the License for the specific language governing permissions and
- *    limitations under the License.
- */
 /***************************************************************************//**
- * @file     gcc_EFR32MG24.ld
- * @brief    GNU Linker Script for Cortex-M based device
- * @version  V2.2.0
- * @date     16. December 2020
- * Linker script for Silicon Labs EFR32MG24 devices
+ * GCC Linker script for Silicon Labs devices
  *******************************************************************************
  * # License
- * <b>Copyright 2022 Silicon Laboratories, Inc. www.silabs.com </b>
+ * <b>Copyright 2020 Silicon Laboratories Inc. www.silabs.com</b>
  *******************************************************************************
  *
  * SPDX-License-Identifier: Zlib
- * 
+ *
  * The licensor of this software is Silicon Laboratories Inc.
- * 
+ *
  * This software is provided 'as-is', without any express or implied
  * warranty. In no event will the authors be held liable for any damages
  * arising from the use of this software.
- * 
+ *
  * Permission is granted to anyone to use this software for any purpose,
  * including commercial applications, and to alter it and redistribute it
  * freely, subject to the following restrictions:
- * 
+ *
  * 1. The origin of this software must not be misrepresented; you must not
  *    claim that you wrote the original software. If you use this software
  *    in a product, an acknowledgment in the product documentation would be
@@ -48,52 +27,81 @@
  *
  ******************************************************************************/
 
-MEMORY
-{
-  FLASH (rx) : ORIGIN = 0x08006000, LENGTH = 0x17A000
-  RAM (rwx)  : ORIGIN = 0x20000000, LENGTH = 0x40000
-}
-
-/* Linker script to place sections and symbol values. Should be used together
- * with other linker script that defines memory regions FLASH and RAM.
- * It references following symbols, which must be defined in code:
- *   Reset_Handler : Entry of reset handler
- *
- * It defines following symbols, which code can use without definition:
- *   __exidx_start
- *   __exidx_end
- *   __copy_table_start__
- *   __copy_table_end__
- *   __zero_table_start__
- *   __zero_table_end__
- *   __etext
- *   __data_start__
- *   __preinit_array_start
- *   __preinit_array_end
- *   __init_array_start
- *   __init_array_end
- *   __fini_array_start
- *   __fini_array_end
- *   __data_end__
- *   __bss_start__
- *   __bss_end__
- *   __end__
- *   end
- *   __HeapLimit
- *   __StackLimit
- *   __StackTop
- *   __stack
- *   __StackSeal      (only if ARMv8-M stack sealing is used)
- */
+ MEMORY
+ {
+   FLASH      (rx)  : ORIGIN = 0x8006000, LENGTH = 0x178000
+   RAM        (rwx) : ORIGIN = 0x20000000, LENGTH = 0x40000
+ }
 
 ENTRY(Reset_Handler)
 
 SECTIONS
 {
+
+  .vectors :
+  {
+    linker_vectors_begin = .;
+    KEEP(*(.vectors))
+    linker_vectors_end = .;
+
+    __Vectors_End = .;
+    __Vectors_Size = __Vectors_End - __Vectors;
+    __lma_ramfuncs_start__ = .;
+  } > FLASH
+
+  .stack (NOLOAD):
+  {
+    . = ALIGN(8);
+    __StackLimit = .;
+    KEEP(*(.stack*))
+    . = ALIGN(4);
+    __StackTop = .;
+    PROVIDE(__stack = __StackTop);
+  } > RAM
+
+
+  .noinit (NOLOAD):
+  {
+    *(.noinit*);
+  } > RAM
+
+  .bss :
+  {
+    . = ALIGN(4);
+    __bss_start__ = .;
+    *(SORT_BY_ALIGNMENT(.bss*))
+    *(COMMON)
+    . = ALIGN(4);
+    __bss_end__ = .;
+  } > RAM
+
+  text_application_ram :
+  {
+    . = ALIGN(4);
+    __vma_ramfuncs_start__ = .;
+    __text_application_ram_start__ = .;
+
+    *(text_application_ram)
+
+    . = ALIGN(4);
+    __vma_ramfuncs_end__ = .;
+    __text_application_ram_end__ = .;
+  } > RAM AT > FLASH
+
+  .rodata :
+  {
+    __lma_ramfuncs_end__ = .;
+    __rodata_start__ = .;
+    __rodata_end__ = .;
+  } > FLASH
+
   .text :
   {
-    KEEP(*(.vectors))
-    *(.text*)
+    linker_code_begin = .;
+    *(SORT_BY_ALIGNMENT(.text*))
+    *(SORT_BY_ALIGNMENT(text_*))
+    . = ALIGN(32);
+    linker_code_end = .;
 
     KEEP(*(.init))
     KEEP(*(.fini))
@@ -111,16 +119,11 @@
     *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
     *(SORT(.dtors.*))
     *(.dtors)
-  
-    __code_classification_validator_start__ = .;
-    . = . + 0x20;
-    *(code_classification_validator)
-    . = ALIGN(32);
-    __code_classification_validator_end__ = .;
+
     *(.rodata*)
-  
-    KEEP(*(.eh_frame*))
+    *(.eh_frame*)
   } > FLASH
+
   .ARM.extab :
   {
     *(.ARM.extab* .gnu.linkonce.armextab.*)
@@ -142,6 +145,13 @@
     LONG (__data_start__)
     LONG ((__data_end__ - __data_start__) / 4)
 
+    /* Add each additional data section here */
+    /*
+    LONG (__etext2)
+    LONG (__data2_start__)
+    LONG ((__data2_end__ - __data2_start__) / 4)
+    */
+
     __copy_table_end__ = .;
   } > FLASH
 
@@ -149,19 +159,23 @@
   {
     . = ALIGN(4);
     __zero_table_start__ = .;
+    /* Add each additional bss section here */
+    /*
+    LONG (__bss2_start__)
+    LONG ((__bss2_end__ - __bss2_start__) / 4)
+    */
+
     __zero_table_end__ = .;
-    __etext = ALIGN(4);
+    __etext = .;
   } > FLASH
 
-  .data : AT (__etext)
+  .data :
   {
+    . = ALIGN(4);
     __data_start__ = .;
     *(vtable)
-    *(.data*)
-    . = ALIGN (4);
-    PROVIDE (__ram_func_section_start = .);
-    *(.ram)
-    PROVIDE (__ram_func_section_end = .);
+    *(SORT_BY_ALIGNMENT(.data*))
+    . = ALIGN(4);
 
     . = ALIGN(4);
     /* preinit data */
@@ -183,87 +197,49 @@
     KEEP(*(.fini_array))
     PROVIDE_HIDDEN (__fini_array_end = .);
 
-    KEEP(*(.jcr*))
     . = ALIGN(4);
     /* All data end */
     __data_end__ = .;
 
-  } > RAM
-
-  .bss :
+  } > RAM AT > FLASH
+  .memory_manager_heap (NOLOAD):
   {
-    . = ALIGN(4);
-    __bss_start__ = .;
-    *(.bss)
-    *(.bss.*)
-    *(COMMON)
-    . = ALIGN(4);
-    __bss_end__ = .;
-  } > RAM AT > RAM
-
-  __ramfuncs_start__ = .;
-
-  __vma_ramfuncs_start__ = .;
-  __lma_ramfuncs_start__ = __etext + SIZEOF(.data);
-
-  __text_application_ram_offset__ = . - __vma_ramfuncs_start__;
-  text_application_ram . : AT(__lma_ramfuncs_start__ + __text_application_ram_offset__)
-  {
-    . = ALIGN(4);
-    __text_application_ram_start__ = .;
-    *(text_application_ram)
-    . = ALIGN(4);
-    __text_application_ram_end__ = .;
-  } > RAM
-
-  . = ALIGN(4);
-  __vma_ramfuncs_end__ = .;
-  __lma_ramfuncs_end__ = __lma_ramfuncs_start__ + __text_application_ram_offset__ + SIZEOF(text_application_ram);
-
-  __ramfuncs_end__ = .;
-
-  .heap (COPY):
-  {
+    . = ALIGN(8);
     __HeapBase = .;
     __end__ = .;
     end = __end__;
     _end = __end__;
-    KEEP(*(.heap*))
-    __HeapLimit = .;
+    KEEP(*(.memory_manager_heap*))
+    __HeapLimit = ORIGIN(RAM) + LENGTH(RAM);
   } > RAM
 
-  __main_flash_end__ = ORIGIN(FLASH) + LENGTH(FLASH);
+  __heap_size = __HeapLimit - __HeapBase;
+  __ram_end__ = 0x20000000 + 0x40000;
+  __main_flash_end__ = 0x8006000 + 0x178000;
 
-  /* .stack_dummy section doesn't contains any symbols. It is only
-   * used for linker to calculate size of stack sections, and assign
-   * values to stack symbols later */
-  .stack_dummy (COPY):
-  {
-    KEEP(*(.stack*))
- /* KEEP(*(.stackseal*))*/
-  } > RAM
+   /* This is where we handle flash storage blocks. We use dummy sections for finding the configured
+   * block sizes and then "place" them at the end of flash when the size is known. */
+  .internal_storage (DSECT) : {
+    KEEP(*(.internal_storage*))
+  } > FLASH
 
-  /* Set stack top to end of RAM, and stack limit move down by
-   * size of stack_dummy section */
-  __StackTop = ORIGIN(RAM) + LENGTH(RAM);
-  __StackLimit = __StackTop - SIZEOF(.stack_dummy);
-  PROVIDE(__stack = __StackTop);
 
-   .nvm (DSECT) : {
+  .nvm (DSECT) : {
     KEEP(*(.simee*))
   } > FLASH
 
-  /* Last page of flash is reserved for the manufacturing token space */
-  linker_nvm_end = __main_flash_end__ - 8192;
+  __ramfuncs_start__ = __vma_ramfuncs_start__;
+  __ramfuncs_end__ = __vma_ramfuncs_end__;
+
+  linker_nvm_end = __main_flash_end__;
   linker_nvm_begin = linker_nvm_end - SIZEOF(.nvm);
-  linker_nvm_size = SIZEOF(.nvm);
+  linker_storage_end = linker_nvm_begin;
   __nvm3Base = linker_nvm_begin;
-  __attestation_credentials_base = linker_nvm_end;
 
-  /* Check if data + heap + stack exceeds RAM limit */
-  /*ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")*/
-  ASSERT( (linker_nvm_begin + SIZEOF(.nvm)) <= __main_flash_end__, "NVM3 is excessing the flash size !")
+  linker_storage_begin = linker_storage_end - SIZEOF(.internal_storage);
+  ASSERT((linker_storage_begin >= (__etext + SIZEOF(.data))), "FLASH memory overflowed !")
 
-  /* Check if FLASH usage exceeds FLASH size */
-  ASSERT( LENGTH(FLASH) >= (__etext + SIZEOF(.data)), "FLASH memory overflowed !")
+
+  app_flash_end = 0x8006000 + 0x178000;
+  ASSERT( (linker_nvm_begin + SIZEOF(.nvm)) <= app_flash_end, "NVM3 is excessing the flash size !")
 }
diff --git a/examples/platform/silabs/ldscripts/mgm24.ld b/examples/platform/silabs/ldscripts/mgm24.ld
index a38794b..16066c2 100644
--- a/examples/platform/silabs/ldscripts/mgm24.ld
+++ b/examples/platform/silabs/ldscripts/mgm24.ld
@@ -1,43 +1,22 @@
-/*
- *
- *    Copyright (c) 2021 Project CHIP Authors
- *    All rights reserved.
- *
- *    Licensed under the Apache License, Version 2.0 (the "License");
- *    you may not use this file except in compliance with the License.
- *    You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *    Unless required by applicable law or agreed to in writing, software
- *    distributed under the License is distributed on an "AS IS" BASIS,
- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *    See the License for the specific language governing permissions and
- *    limitations under the License.
- */
 /***************************************************************************//**
- * @file     gcc_EFR32MG24.ld
- * @brief    GNU Linker Script for Cortex-M based device
- * @version  V2.2.0
- * @date     16. December 2020
- * Linker script for Silicon Labs EFR32MG24 devices
+ * GCC Linker script for Silicon Labs devices
  *******************************************************************************
  * # License
- * <b>Copyright 2022 Silicon Laboratories, Inc. www.silabs.com </b>
+ * <b>Copyright 2020 Silicon Laboratories Inc. www.silabs.com</b>
  *******************************************************************************
  *
  * SPDX-License-Identifier: Zlib
- * 
+ *
  * The licensor of this software is Silicon Laboratories Inc.
- * 
+ *
  * This software is provided 'as-is', without any express or implied
  * warranty. In no event will the authors be held liable for any damages
  * arising from the use of this software.
- * 
+ *
  * Permission is granted to anyone to use this software for any purpose,
  * including commercial applications, and to alter it and redistribute it
  * freely, subject to the following restrictions:
- * 
+ *
  * 1. The origin of this software must not be misrepresented; you must not
  *    claim that you wrote the original software. If you use this software
  *    in a product, an acknowledgment in the product documentation would be
@@ -48,52 +27,81 @@
  *
  ******************************************************************************/
 
-MEMORY
-{
-  FLASH (rx) : ORIGIN = 0x08006000, LENGTH = 0x17A000
-  RAM (rwx)  : ORIGIN = 0x20000000, LENGTH = 0x40000
-}
-
-/* Linker script to place sections and symbol values. Should be used together
- * with other linker script that defines memory regions FLASH and RAM.
- * It references following symbols, which must be defined in code:
- *   Reset_Handler : Entry of reset handler
- *
- * It defines following symbols, which code can use without definition:
- *   __exidx_start
- *   __exidx_end
- *   __copy_table_start__
- *   __copy_table_end__
- *   __zero_table_start__
- *   __zero_table_end__
- *   __etext
- *   __data_start__
- *   __preinit_array_start
- *   __preinit_array_end
- *   __init_array_start
- *   __init_array_end
- *   __fini_array_start
- *   __fini_array_end
- *   __data_end__
- *   __bss_start__
- *   __bss_end__
- *   __end__
- *   end
- *   __HeapLimit
- *   __StackLimit
- *   __StackTop
- *   __stack
- *   __StackSeal      (only if ARMv8-M stack sealing is used)
- */
+ MEMORY
+ {
+   FLASH      (rx)  : ORIGIN = 0x8006000, LENGTH = 0x178000
+   RAM        (rwx) : ORIGIN = 0x20000000, LENGTH = 0x40000
+ }
 
 ENTRY(Reset_Handler)
 
 SECTIONS
 {
+
+  .vectors :
+  {
+    linker_vectors_begin = .;
+    KEEP(*(.vectors))
+    linker_vectors_end = .;
+
+    __Vectors_End = .;
+    __Vectors_Size = __Vectors_End - __Vectors;
+    __lma_ramfuncs_start__ = .;
+  } > FLASH
+
+  .stack (NOLOAD):
+  {
+    . = ALIGN(8);
+    __StackLimit = .;
+    KEEP(*(.stack*))
+    . = ALIGN(4);
+    __StackTop = .;
+    PROVIDE(__stack = __StackTop);
+  } > RAM
+
+
+  .noinit (NOLOAD):
+  {
+    *(.noinit*);
+  } > RAM
+
+  .bss :
+  {
+    . = ALIGN(4);
+    __bss_start__ = .;
+    *(SORT_BY_ALIGNMENT(.bss*))
+    *(COMMON)
+    . = ALIGN(4);
+    __bss_end__ = .;
+  } > RAM
+
+  text_application_ram :
+  {
+    . = ALIGN(4);
+    __vma_ramfuncs_start__ = .;
+    __text_application_ram_start__ = .;
+
+    *(text_application_ram)
+
+    . = ALIGN(4);
+    __vma_ramfuncs_end__ = .;
+    __text_application_ram_end__ = .;
+  } > RAM AT > FLASH
+
+  .rodata :
+  {
+    __lma_ramfuncs_end__ = .;
+    __rodata_start__ = .;
+    __rodata_end__ = .;
+  } > FLASH
+
   .text :
   {
-    KEEP(*(.vectors))
-    *(.text*)
+    linker_code_begin = .;
+    *(SORT_BY_ALIGNMENT(.text*))
+    *(SORT_BY_ALIGNMENT(text_*))
+    . = ALIGN(32);
+    linker_code_end = .;
 
     KEEP(*(.init))
     KEEP(*(.fini))
@@ -111,16 +119,11 @@
     *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
     *(SORT(.dtors.*))
     *(.dtors)
-  
-    __code_classification_validator_start__ = .;
-    . = . + 0x20;
-    *(code_classification_validator)
-    . = ALIGN(32);
-    __code_classification_validator_end__ = .;
-    *(.rodata*)
 
-    KEEP(*(.eh_frame*))
+    *(.rodata*)
+    *(.eh_frame*)
   } > FLASH
+
   .ARM.extab :
   {
     *(.ARM.extab* .gnu.linkonce.armextab.*)
@@ -142,6 +145,13 @@
     LONG (__data_start__)
     LONG ((__data_end__ - __data_start__) / 4)
 
+    /* Add each additional data section here */
+    /*
+    LONG (__etext2)
+    LONG (__data2_start__)
+    LONG ((__data2_end__ - __data2_start__) / 4)
+    */
+
     __copy_table_end__ = .;
   } > FLASH
 
@@ -149,19 +159,23 @@
   {
     . = ALIGN(4);
     __zero_table_start__ = .;
+    /* Add each additional bss section here */
+    /*
+    LONG (__bss2_start__)
+    LONG ((__bss2_end__ - __bss2_start__) / 4)
+    */
+
     __zero_table_end__ = .;
-    __etext = ALIGN(4);
+    __etext = .;
   } > FLASH
 
-  .data : AT (__etext)
+  .data :
   {
+    . = ALIGN(4);
     __data_start__ = .;
     *(vtable)
-    *(.data*)
-    . = ALIGN (4);
-    PROVIDE (__ram_func_section_start = .);
-    *(.ram)
-    PROVIDE (__ram_func_section_end = .);
+    *(SORT_BY_ALIGNMENT(.data*))
+    . = ALIGN(4);
 
     . = ALIGN(4);
     /* preinit data */
@@ -183,87 +197,49 @@
     KEEP(*(.fini_array))
     PROVIDE_HIDDEN (__fini_array_end = .);
 
-    KEEP(*(.jcr*))
     . = ALIGN(4);
     /* All data end */
     __data_end__ = .;
 
-  } > RAM
-
-  .bss :
+  } > RAM AT > FLASH
+  .memory_manager_heap (NOLOAD):
   {
-    . = ALIGN(4);
-    __bss_start__ = .;
-    *(.bss)
-    *(.bss.*)
-    *(COMMON)
-    . = ALIGN(4);
-    __bss_end__ = .;
-  } > RAM AT > RAM
-
-  __ramfuncs_start__ = .;
-
-  __vma_ramfuncs_start__ = .;
-  __lma_ramfuncs_start__ = __etext + SIZEOF(.data);
-
-  __text_application_ram_offset__ = . - __vma_ramfuncs_start__;
-  text_application_ram . : AT(__lma_ramfuncs_start__ + __text_application_ram_offset__)
-  {
-    . = ALIGN(4);
-    __text_application_ram_start__ = .;
-    *(text_application_ram)
-    . = ALIGN(4);
-    __text_application_ram_end__ = .;
-  } > RAM
-
-  . = ALIGN(4);
-  __vma_ramfuncs_end__ = .;
-  __lma_ramfuncs_end__ = __lma_ramfuncs_start__ + __text_application_ram_offset__ + SIZEOF(text_application_ram);
-
-  __ramfuncs_end__ = .;
-
-  .heap (COPY):
-  {
+    . = ALIGN(8);
     __HeapBase = .;
     __end__ = .;
     end = __end__;
     _end = __end__;
-    KEEP(*(.heap*))
-    __HeapLimit = .;
+    KEEP(*(.memory_manager_heap*))
+    __HeapLimit = ORIGIN(RAM) + LENGTH(RAM);
   } > RAM
 
-  __main_flash_end__ = ORIGIN(FLASH) + LENGTH(FLASH);
+  __heap_size = __HeapLimit - __HeapBase;
+  __ram_end__ = 0x20000000 + 0x40000;
+  __main_flash_end__ = 0x8006000 + 0x178000;
 
-  /* .stack_dummy section doesn't contains any symbols. It is only
-   * used for linker to calculate size of stack sections, and assign
-   * values to stack symbols later */
-  .stack_dummy (COPY):
-  {
-    KEEP(*(.stack*))
- /* KEEP(*(.stackseal*))*/
-  } > RAM
+   /* This is where we handle flash storage blocks. We use dummy sections for finding the configured
+   * block sizes and then "place" them at the end of flash when the size is known. */
+  .internal_storage (DSECT) : {
+    KEEP(*(.internal_storage*))
+  } > FLASH
 
-  /* Set stack top to end of RAM, and stack limit move down by
-   * size of stack_dummy section */
-  __StackTop = ORIGIN(RAM) + LENGTH(RAM);
-  __StackLimit = __StackTop - SIZEOF(.stack_dummy);
-  PROVIDE(__stack = __StackTop);
 
-   .nvm (DSECT) : {
+  .nvm (DSECT) : {
     KEEP(*(.simee*))
   } > FLASH
 
-  /* Last page of flash is reserved for the manufacturing token space */
-  linker_nvm_end = __main_flash_end__ - 8192;
+  __ramfuncs_start__ = __vma_ramfuncs_start__;
+  __ramfuncs_end__ = __vma_ramfuncs_end__;
+
+  linker_nvm_end = __main_flash_end__;
   linker_nvm_begin = linker_nvm_end - SIZEOF(.nvm);
-  linker_nvm_size = SIZEOF(.nvm);
+  linker_storage_end = linker_nvm_begin;
   __nvm3Base = linker_nvm_begin;
-  __attestation_credentials_base = linker_nvm_end;
 
-  /* Check if data + heap + stack exceeds RAM limit */
-  /*ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")*/
-  ASSERT( (linker_nvm_begin + SIZEOF(.nvm)) <= __main_flash_end__, "NVM3 is excessing the flash size !")
+  linker_storage_begin = linker_storage_end - SIZEOF(.internal_storage);
+  ASSERT((linker_storage_begin >= (__etext + SIZEOF(.data))), "FLASH memory overflowed !")
 
-  /* Check if FLASH usage exceeds FLASH size */
-  ASSERT( LENGTH(FLASH) >= (__etext + SIZEOF(.data)), "FLASH memory overflowed !")
+
+  app_flash_end = 0x8006000 + 0x178000;
+  ASSERT( (linker_nvm_begin + SIZEOF(.nvm)) <= app_flash_end, "NVM3 is excessing the flash size !")
 }
diff --git a/examples/platform/silabs/matter-platform.slcp b/examples/platform/silabs/matter-platform.slcp
index 4f5d1ef..c807565 100644
--- a/examples/platform/silabs/matter-platform.slcp
+++ b/examples/platform/silabs/matter-platform.slcp
@@ -27,7 +27,7 @@
   file_list:
   - {path: app.h}
   - {path: reset_util.h}
-sdk: {id: gecko_sdk, version: 4.4.2}
+sdk: {id: simplicity_sdk, version: 2024.6.0}
 toolchain_settings: []
 
 component:
@@ -38,13 +38,26 @@
 - {id: bluetooth_feature_connection}
 - {id: bluetooth_feature_system}
 - {id: bluetooth_stack}
-# Other components
+# Platform support
+- {id: cpp_support}
+- {id: sl_system}
+- {id: device_init}
+- {id: board_control}
+- {id: memory_manager}
+- {id: silabs_core_memory_manager}
+- {id: clock_manager}
+- {id: silabs_core_circular_queue}
+- {id: sleeptimer}
 - {id: nvm3_lib}
 - {id: freertos}
+- {id: freertos_heap_3}
+- {id: iostream_rtt}
+- {id: toolchain_gcc}
 - {id: brd4002a}
 - {id: rail_util_pti}
 - {id: rail_lib_multiprotocol}
 - {id: rail_util_power_manager_init}
+# crypto components
 - {id: psa_crypto}
 - {id: psa_crypto_aes}
 - {id: psa_crypto_ccm}
@@ -59,7 +72,6 @@
 - {id: mbedtls_platform_dynamic_memory_allocation_config_init_runtime }
 - {id: mbedtls_base64}
 - {id: ot_psa_crypto}
-- {id: iostream_rtt}
 # Necessary componenets for ot coap cert lib
 # - {id: mbedtls_dtls} # Requried by COAP lib
 # - {id: mbedtls_tls_server} # Requried by COAP lib
@@ -86,9 +98,15 @@
   name: SL_IOSTREAM_USART_VCOM_RX_BUFFER_SIZE
   value: '128'
 - {name: SL_HEAP_SIZE, value: '0'}
-- {name: SL_STACK_SIZE, value: '0'}
+- {name: SL_STACK_SIZE, value: '4608'}
 - {name: SL_BOARD_ENABLE_VCOM, value: '0'}
 - {name: EMDRV_UARTDRV_FLOW_CONTROL_ENABLE, value: '0'}
+- {name: NVM3_DEFAULT_MAX_OBJECT_SIZE, value: '4092'}
+- {name: CIRCULAR_QUEUE_LEN_MAX, value: '16'}
+- {name: SL_CLOCK_MANAGER_HFRCO_DPLL_EN, value: 1}
+- {name: SL_BT_RTOS_LINK_LAYER_TASK_STACK_SIZE, value: 1024}
+- {name: SL_BT_RTOS_HOST_STACK_TASK_STACK_SIZE, value: 2048}
+- {name: SL_BT_RTOS_EVENT_HANDLER_STACK_SIZE, value: 1536}
 
 template_contribution:
   - name: mbedtls_ssl_content_len_in_requirement
@@ -97,8 +115,6 @@
     value: 900
 
 requires:
-- condition: [device_series_1]
-  name: uartdrv_usart
 - condition: [device_series_2]
   name: uartdrv_eusart
 - condition: [device_series_2]
diff --git a/src/platform/silabs/CHIPMem-Platform.cpp b/src/platform/silabs/CHIPMem-Platform.cpp
index 2085910..cf6552d 100644
--- a/src/platform/silabs/CHIPMem-Platform.cpp
+++ b/src/platform/silabs/CHIPMem-Platform.cpp
@@ -44,9 +44,6 @@
 // #include <lib/core/CHIPConfig.h>
 #include <lib/support/CHIPMem.h>
 
-#include "heap_4_silabs.h"
-#include "task.h"
-
 #include <atomic>
 #include <cstdio>
 #include <cstring>
@@ -104,7 +101,7 @@
 {
     void * ptr;
     VERIFY_INITIALIZED();
-    ptr = pvPortMalloc(size);
+    ptr = malloc(size);
     trackAlloc(ptr, size);
     return ptr;
 }
@@ -113,7 +110,7 @@
 {
     void * ptr;
     VERIFY_INITIALIZED();
-    ptr = pvPortMalloc(size);
+    ptr = malloc(size);
     trackAlloc(ptr, size);
     return ptr;
 }
@@ -122,7 +119,7 @@
 {
     VERIFY_INITIALIZED();
 
-    void * ptr = pvPortCalloc(num, size);
+    void * ptr = calloc(num, size);
     trackAlloc(ptr, size * num);
     return ptr;
 }
@@ -131,7 +128,7 @@
 {
     VERIFY_INITIALIZED();
 
-    p = pvPortRealloc(p, size);
+    p = realloc(p, size);
     return p;
 }
 
@@ -139,7 +136,7 @@
 {
     VERIFY_INITIALIZED();
     trackFree(p, 0);
-    vPortFree(p);
+    free(p);
 }
 
 bool MemoryInternalCheckPointer(const void * p, size_t min_size)
@@ -150,12 +147,7 @@
 } // namespace Platform
 } // namespace chip
 
-#ifdef BRD4325A
-extern "C" void memMonitoringTrackAlloc(void * ptr, size_t size) {}
-extern "C" void memMonitoringTrackFree(void * ptr, size_t size) {}
-#else
-extern "C" __WEAK void memMonitoringTrackAlloc(void * ptr, size_t size) {}
-extern "C" __WEAK void memMonitoringTrackFree(void * ptr, size_t size) {}
-#endif // BRD4325A
+extern "C" __attribute__((weak)) void memMonitoringTrackAlloc(void * ptr, size_t size) {}
+extern "C" __attribute__((weak)) void memMonitoringTrackFree(void * ptr, size_t size) {}
 
 #endif // CHIP_CONFIG_MEMORY_MGMT_PLATFORM
diff --git a/src/platform/silabs/DiagnosticDataProviderImpl.cpp b/src/platform/silabs/DiagnosticDataProviderImpl.cpp
index 1dc4083..4be7113 100644
--- a/src/platform/silabs/DiagnosticDataProviderImpl.cpp
+++ b/src/platform/silabs/DiagnosticDataProviderImpl.cpp
@@ -29,7 +29,7 @@
 #include <platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.h>
 #endif
 #include "FreeRTOS.h"
-#include "heap_4_silabs.h"
+#include "sl_memory_manager.h"
 #include <inet/InetInterface.h>
 #include <lib/support/CHIPMemString.h>
 
@@ -46,38 +46,28 @@
 
 // Software Diagnostics Getters
 /*
- * The following Heap stats are compiled values done by the FreeRTOS Heap4 implementation.
- * See /examples/platform/silabs/heap_4_silabs.c
+ * The following Heap stats are compiled values done by the sl_memory_manager.
  * It keeps track of the number of calls to allocate and free memory as well as the
  * number of free bytes remaining, but says nothing about fragmentation.
  */
 CHIP_ERROR DiagnosticDataProviderImpl::GetCurrentHeapFree(uint64_t & currentHeapFree)
 {
-    size_t freeHeapSize = xPortGetFreeHeapSize();
+    size_t freeHeapSize = sl_memory_get_free_heap_size();
     currentHeapFree     = static_cast<uint64_t>(freeHeapSize);
     return CHIP_NO_ERROR;
 }
 
 CHIP_ERROR DiagnosticDataProviderImpl::GetCurrentHeapUsed(uint64_t & currentHeapUsed)
 {
-    // Calculate the Heap used based on Total heap - Free heap
-    int64_t heapUsed = (configTOTAL_HEAP_SIZE - xPortGetFreeHeapSize());
-
-    // Something went wrong, this should not happen
-    VerifyOrReturnError(heapUsed >= 0, CHIP_ERROR_INVALID_INTEGER_VALUE);
+    size_t heapUsed = sl_memory_get_used_heap_size();
     currentHeapUsed = static_cast<uint64_t>(heapUsed);
     return CHIP_NO_ERROR;
 }
 
 CHIP_ERROR DiagnosticDataProviderImpl::GetCurrentHeapHighWatermark(uint64_t & currentHeapHighWatermark)
 {
-    // FreeRTOS records the lowest amount of available heap during runtime
-    // currentHeapHighWatermark wants the highest heap usage point so we calculate it here
-    int64_t HighestHeapUsageRecorded = (configTOTAL_HEAP_SIZE - xPortGetMinimumEverFreeHeapSize());
-
-    // Something went wrong, this should not happen
-    VerifyOrReturnError(HighestHeapUsageRecorded >= 0, CHIP_ERROR_INVALID_INTEGER_VALUE);
-    currentHeapHighWatermark = static_cast<uint64_t>(HighestHeapUsageRecorded);
+    size_t HighestHeapUsageRecorded = sl_memory_get_heap_high_watermark();
+    currentHeapHighWatermark        = static_cast<uint64_t>(HighestHeapUsageRecorded);
 
     return CHIP_NO_ERROR;
 }
@@ -86,9 +76,7 @@
 {
     // If implemented, the server SHALL set the value of the CurrentHeapHighWatermark attribute to the
     // value of the CurrentHeapUsed.
-
-    xPortResetHeapMinimumEverFreeHeapSize();
-
+    sl_memory_reset_heap_high_watermark();
     return CHIP_NO_ERROR;
 }
 
diff --git a/src/platform/silabs/SiWx917/wifi/ethernetif.cpp b/src/platform/silabs/SiWx917/wifi/ethernetif.cpp
index 8570fc4..7272510 100644
--- a/src/platform/silabs/SiWx917/wifi/ethernetif.cpp
+++ b/src/platform/silabs/SiWx917/wifi/ethernetif.cpp
@@ -32,6 +32,7 @@
 #include "sl_si91x_driver.h"
 #include "sl_si91x_host_interface.h"
 #include "sl_si91x_types.h"
+#include "sl_wifi.h"
 #include "sl_wifi_callback_framework.h"
 #include "sl_wifi_constants.h"
 #include "sl_wifi_types.h"
@@ -45,8 +46,6 @@
 #include "netif/etharp.h"
 #include "silabs_utils.h"
 
-#include <lib/support/logging/CHIPLogging.h>
-
 StaticSemaphore_t xEthernetIfSemaBuffer;
 
 /*****************************************************************************
@@ -132,14 +131,13 @@
         (memcmp(netif->hwaddr, dst_mac, netif->hwaddr_len) != 0))
     {
 #ifdef WIFI_DEBUG_ENABLED
-        ChipLogProgress(DeviceLayer, "%s: DROP, [%02x:%02x:%02x:%02x:%02x:%02x]<-[%02x:%02x:%02x:%02x:%02x:%02x] type=%02x%02x",
-                        __func__,
+        SILABS_LOG("%s: DROP, [%02x:%02x:%02x:%02x:%02x:%02x]<-[%02x:%02x:%02x:%02x:%02x:%02x] type=%02x%02x", __func__,
 
-                        dst_mac[0], dst_mac[1], dst_mac[2], dst_mac[3], dst_mac[4], dst_mac[5],
+                   dst_mac[0], dst_mac[1], dst_mac[2], dst_mac[3], dst_mac[4], dst_mac[5],
 
-                        src_mac[0], src_mac[1], src_mac[2], src_mac[3], src_mac[4], src_mac[5],
+                   src_mac[0], src_mac[1], src_mac[2], src_mac[3], src_mac[4], src_mac[5],
 
-                        b[12], b[13]);
+                   b[12], b[13]);
 #endif
         return;
     }
@@ -155,15 +153,14 @@
             bufferoffset += q->len;
         }
 #ifdef WIFI_DEBUG_ENABLED
-        ChipLogProgress(DeviceLayer,
-                        "%s: ACCEPT %d, [%02x:%02x:%02x:%02x:%02x:%02x]<-[%02x:%02x:%02x:%02x:%02x:%02x] type=%02x%02x", __func__,
-                        bufferoffset,
+        SILABS_LOG("%s: ACCEPT %d, [%02x:%02x:%02x:%02x:%02x:%02x]<-[%02x:%02x:%02x:%02x:%02x:%02x] type=%02x%02x", __func__,
+                   bufferoffset,
 
-                        dst_mac[0], dst_mac[1], dst_mac[2], dst_mac[3], dst_mac[4], dst_mac[5],
+                   dst_mac[0], dst_mac[1], dst_mac[2], dst_mac[3], dst_mac[4], dst_mac[5],
 
-                        src_mac[0], src_mac[1], src_mac[2], src_mac[3], src_mac[4], src_mac[5],
+                   src_mac[0], src_mac[1], src_mac[2], src_mac[3], src_mac[4], src_mac[5],
 
-                        b[12], b[13]);
+                   b[12], b[13]);
 #endif
 
         if (netif->input(p, netif) != ERR_OK)
@@ -194,84 +191,13 @@
  ******************************************************************************/
 static err_t low_level_output(struct netif * netif, struct pbuf * p)
 {
-    sl_wifi_buffer_t * buffer;
-    sl_si91x_packet_t * packet;
-    sl_status_t status = SL_STATUS_OK;
-    void * rsipkt;
-    struct pbuf * q;
-    uint16_t framelength = 0;
-    uint16_t datalength  = 0;
-
-#ifdef WIFI_DEBUG_ENABLED
-    ChipLogProgress(DeviceLayer, "LWIP : low_level_output");
-#endif
-    if (xSemaphoreTake(ethout_sem, portMAX_DELAY) != pdTRUE)
+    UNUSED_PARAMETER(netif);
+    sl_status_t status;
+    status = sl_wifi_send_raw_data_frame(SL_WIFI_CLIENT_INTERFACE, (uint8_t *) p->payload, p->len);
+    if (status != SL_STATUS_OK)
     {
         return ERR_IF;
     }
-    /* Calculate total packet size */
-    for (q = p, framelength = 0; q != NULL; q = q->next)
-    {
-        framelength += q->len;
-    }
-    if (framelength < LWIP_FRAME_ALIGNMENT)
-    {
-        framelength = LWIP_FRAME_ALIGNMENT;
-    }
-
-    /* Confirm if packet is allocated */
-    status = sl_si91x_allocate_command_buffer(&buffer, (void **) &packet, sizeof(sl_si91x_packet_t) + framelength,
-                                              SL_WIFI_ALLOCATE_COMMAND_BUFFER_WAIT_TIME_MS);
-    VERIFY_STATUS_AND_RETURN(status);
-    if (packet == NULL)
-    {
-        ChipLogProgress(DeviceLayer, "EN-RSI:No buf");
-        xSemaphoreGive(ethout_sem);
-        return SL_STATUS_ALLOCATION_FAILED;
-    }
-    memset(packet->desc, 0, sizeof(packet->desc));
-#ifdef WIFI_DEBUG_ENABLED
-    ChipLogProgress(DeviceLayer, "EN-RSI: Output");
-#endif
-    if ((netif->flags & (NETIF_FLAG_LINK_UP | NETIF_FLAG_UP)) != (NETIF_FLAG_LINK_UP | NETIF_FLAG_UP))
-    {
-        ChipLogProgress(DeviceLayer, "EN-RSI:NOT UP");
-        xSemaphoreGive(ethout_sem);
-        return ERR_IF;
-    }
-#ifdef WIFI_DEBUG_ENABLED
-    uint8_t * b = (uint8_t *) p->payload;
-    ChipLogProgress(DeviceLayer, "EN-RSI: Out [%02x:%02x:%02x:%02x:%02x:%02x][%02x:%02x:%02x:%02x:%02x:%02x]type=%02x%02x", b[0],
-                    b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8], b[9], b[10], b[11], b[12], b[13]);
-#endif
-    /* Generate the packet */
-    for (q = p, datalength = 0; q != NULL; q = q->next)
-    {
-        wfx_rsi_pkt_add_data(packet, (uint8_t *) (q->payload), (uint16_t) q->len, datalength);
-        datalength += q->len;
-    }
-    if (datalength < LWIP_FRAME_ALIGNMENT)
-    {
-        /* Add junk data to the end for frame alignment if framelength is less than 60 */
-        wfx_rsi_pkt_add_data(packet, (uint8_t *) (p->payload), LWIP_FRAME_ALIGNMENT - datalength, datalength);
-    }
-#ifdef WIFI_DEBUG_ENABLED
-    ChipLogProgress(DeviceLayer, "EN-RSI: Sending %d", framelength);
-#endif
-    packet->length  = framelength & 0xFFF;
-    packet->command = RSI_SEND_RAW_DATA;
-    if (sl_si91x_driver_send_data_packet(SI91X_WLAN_CMD_QUEUE, buffer, 1000))
-    {
-        ChipLogProgress(DeviceLayer, "*ERR*EN-RSI:Send fail");
-        xSemaphoreGive(ethout_sem);
-        return ERR_IF;
-    }
-    /*
-     * forward the generated packet to RSI to
-     * send the data over wifi network
-     */
-    xSemaphoreGive(ethout_sem);
-
     return ERR_OK;
 }
 
diff --git a/src/platform/silabs/SiWx917/wifi/wfx_host_events.h b/src/platform/silabs/SiWx917/wifi/wfx_host_events.h
index 526e22c..e3f9238 100644
--- a/src/platform/silabs/SiWx917/wifi/wfx_host_events.h
+++ b/src/platform/silabs/SiWx917/wifi/wfx_host_events.h
@@ -246,19 +246,12 @@
 #endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */
 
 #if SL_ICD_ENABLED
+uint32_t sl_app_sleep_ready();
 sl_status_t wfx_power_save(rsi_power_save_profile_mode_t sl_si91x_ble_state, sl_si91x_performance_profile_t sl_si91x_wifi_state);
 void sl_button_on_change(uint8_t btn, uint8_t btnAction);
 #endif /* SL_ICD_ENABLED */
 
 void wfx_ipv6_notify(int got_ip);
-
-/* RSI for LWIP */
-void wfx_rsi_pkt_add_data(void * p, uint8_t * buf, uint16_t len, uint16_t off);
-int32_t wfx_rsi_send_data(void * p, uint16_t len);
-sl_status_t sl_si91x_driver_send_data_packet(sl_si91x_queue_type_t queue_type, sl_wifi_buffer_t * buffer, uint32_t wait_time);
-sl_status_t sl_si91x_allocate_command_buffer(sl_wifi_buffer_t ** host_buffer, void ** buffer, uint32_t requested_buffer_size,
-                                             uint32_t wait_duration_ms);
-
 void wfx_retry_interval_handler(bool is_wifi_disconnection_event, uint16_t retryJoin);
 
 #ifdef __cplusplus
diff --git a/src/platform/silabs/efr32/args.gni b/src/platform/silabs/efr32/args.gni
index ad124de..394e4bb 100644
--- a/src/platform/silabs/efr32/args.gni
+++ b/src/platform/silabs/efr32/args.gni
@@ -48,7 +48,7 @@
 chip_use_transitional_commissionable_data_provider = false
 
 openthread_root =
-    "${chip_root}/third_party/silabs/gecko_sdk/util/third_party/openthread"
+    "${chip_root}/third_party/silabs/simplicity_sdk/util/third_party/openthread"
 
 openthread_core_config_platform_check_file =
     "openthread-core-efr32-config-check.h"
diff --git a/src/platform/silabs/efr32/wifi/ethernetif.cpp b/src/platform/silabs/efr32/wifi/ethernetif.cpp
index d07c14f..0388337 100644
--- a/src/platform/silabs/efr32/wifi/ethernetif.cpp
+++ b/src/platform/silabs/efr32/wifi/ethernetif.cpp
@@ -40,6 +40,7 @@
 #include "sl_si91x_driver.h"
 #include "sl_si91x_host_interface.h"
 #include "sl_si91x_types.h"
+#include "sl_wifi.h"
 #include "sl_wifi_callback_framework.h"
 #include "sl_wifi_constants.h"
 #include "sl_wifi_types.h"
@@ -347,12 +348,16 @@
 static err_t low_level_output(struct netif * netif, struct pbuf * p)
 {
 #if (SLI_SI91X_MCU_INTERFACE | EXP_BOARD)
-    sl_wifi_buffer_t * buffer;
-    sl_si91x_packet_t * packet;
-    sl_status_t status = SL_STATUS_OK;
+    UNUSED_PARAMETER(netif);
+    sl_status_t status;
+    status = sl_wifi_send_raw_data_frame(SL_WIFI_CLIENT_INTERFACE, (uint8_t *) p->payload, p->len);
+    if (status != SL_STATUS_OK)
+    {
+        return ERR_IF;
+    }
+    return ERR_OK;
 #else
     void * packet;
-#endif
     struct pbuf * q;
     uint16_t framelength = 0;
     uint16_t datalength  = 0;
@@ -381,27 +386,14 @@
         xSemaphoreGive(ethout_sem);
         return ERR_IF;
     }
-    /* Confirm if packet is allocated */
-#if (SLI_SI91X_MCU_INTERFACE | EXP_BOARD)
-    status = sl_si91x_allocate_command_buffer(&buffer, (void **) &packet, sizeof(sl_si91x_packet_t) + framelength,
-                                              SL_WIFI_ALLOCATE_COMMAND_BUFFER_WAIT_TIME_MS);
-    VERIFY_STATUS_AND_RETURN(status);
-    if (packet == NULL)
-#else  // RS9116
     packet = wfx_rsi_alloc_pkt();
     if (!packet)
-#endif // SLI_SI91X_MCU_INTERFACE
     {
         ChipLogProgress(DeviceLayer, "EN-RSI:No buf");
         xSemaphoreGive(ethout_sem);
-#if (SLI_SI91X_MCU_INTERFACE | EXP_BOARD)
-        return SL_STATUS_ALLOCATION_FAILED;
-    }
-    memset(packet->desc, 0, sizeof(packet->desc));
-#else  // RS9116
         return ERR_IF;
     }
-#endif // SLI_SI91X_MCU_INTERFACE
+
 #ifdef WIFI_DEBUG_ENABLED
     uint8_t * b = (uint8_t *) p->payload;
     ChipLogProgress(DeviceLayer, "EN-RSI: Out [%02x:%02x:%02x:%02x:%02x:%02x][%02x:%02x:%02x:%02x:%02x:%02x]type=%02x%02x", b[0],
@@ -425,16 +417,7 @@
     /* forward the generated packet to RSI to
      * send the data over wifi network
      */
-#if (SLI_SI91X_MCU_INTERFACE | EXP_BOARD)
-    packet->length  = framelength & 0xFFF;
-    packet->command = RSI_SEND_RAW_DATA;
-    if (sl_si91x_driver_send_data_packet(SI91X_WLAN_CMD_QUEUE, buffer, 1000))
-#else
-    /* forward the generated packet to RSI to
-     * send the data over wifi network
-     */
     if (wfx_rsi_send_data(packet, datalength))
-#endif
     {
         ChipLogProgress(DeviceLayer, "*ERR*EN-RSI:Send fail");
         xSemaphoreGive(ethout_sem);
@@ -447,6 +430,7 @@
     xSemaphoreGive(ethout_sem);
 
     return ERR_OK;
+#endif // RS9116
 }
 
 #if (SLI_SI91X_MCU_INTERFACE | EXP_BOARD)
diff --git a/src/platform/silabs/efr32/wifi/wfx_host_events.h b/src/platform/silabs/efr32/wifi/wfx_host_events.h
index b7a7c93..a7a2dc2 100644
--- a/src/platform/silabs/efr32/wifi/wfx_host_events.h
+++ b/src/platform/silabs/efr32/wifi/wfx_host_events.h
@@ -386,12 +386,6 @@
 sl_status_t sl_wfx_host_process_event(sl_wfx_generic_message_t * event_payload);
 #endif
 
-#if (SLI_SI91X_MCU_INTERFACE | EXP_BOARD)
-void wfx_retry_interval_handler(bool is_wifi_disconnection_event, uint16_t retryJoin);
-sl_status_t sl_si91x_driver_send_data_packet(sl_si91x_queue_type_t queue_type, sl_wifi_buffer_t * buffer, uint32_t wait_time);
-sl_status_t sl_si91x_allocate_command_buffer(sl_wifi_buffer_t ** host_buffer, void ** buffer, uint32_t requested_buffer_size,
-                                             uint32_t wait_duration_ms);
-#endif
 void wfx_retry_interval_handler(bool is_wifi_disconnection_event, uint16_t retryJoin);
 
 #ifdef __cplusplus
diff --git a/src/test_driver/efr32/BUILD.gn b/src/test_driver/efr32/BUILD.gn
index 76b4df8..ad0c1a22 100644
--- a/src/test_driver/efr32/BUILD.gn
+++ b/src/test_driver/efr32/BUILD.gn
@@ -70,7 +70,6 @@
     "${chip_root}/examples/common/pigweed/RpcService.cpp",
     "${chip_root}/examples/common/pigweed/efr32/PigweedLoggerMutex.cpp",
     "${examples_common_plat_dir}/PigweedLogger.cpp",
-    "${examples_common_plat_dir}/heap_4_silabs.c",
     "${examples_common_plat_dir}/syscalls_stubs.cpp",
     "${examples_plat_dir}/uart.cpp",
     "src/main.cpp",
diff --git a/third_party/openthread/platforms/efr32/BUILD.gn b/third_party/openthread/platforms/efr32/BUILD.gn
index f8f2dd4..381c640 100644
--- a/third_party/openthread/platforms/efr32/BUILD.gn
+++ b/third_party/openthread/platforms/efr32/BUILD.gn
@@ -29,10 +29,14 @@
   ]
 
   include_dirs = [
+    "${sl_ot_efr32_root}",
     "${chip_root}/examples/platform/efr32",
     "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}",
-    "${sl_ot_efr32_root}",
     "${sl_ot_platform_abstraction}/include",
+    "${sl_ot_platform_abstraction}/rtos",
+
+    #TODO this is for sl_openthread_features_config.h. should use generated one per board when sl_ot_abstraction is integrated
+    "${sl_ot_libs_path}/config",
   ]
 
   # temporarily disable check until gsdk pulls in a more recent version of openthread
@@ -54,6 +58,9 @@
 source_set("libopenthread-efr32") {
   sources = [
     "${openthread_root}/examples/apps/cli/cli_uart.cpp",
+    "${openthread_root}/examples/platforms/utils/link_metrics.cpp",
+    "${openthread_root}/examples/platforms/utils/mac_frame.cpp",
+    "${openthread_root}/examples/platforms/utils/settings_ram.c",
     "${sl_ot_efr32_root}/alarm.c",
     "${sl_ot_efr32_root}/crypto.c",
     "${sl_ot_efr32_root}/entropy.c",
@@ -61,11 +68,17 @@
     "${sl_ot_efr32_root}/ieee802154-packet-utils.cpp",
     "${sl_ot_efr32_root}/misc.c",
     "${sl_ot_efr32_root}/radio.c",
+    "${sl_ot_efr32_root}/radio_coex.c",
+    "${sl_ot_efr32_root}/radio_extension.c",
+    "${sl_ot_efr32_root}/radio_power_manager.c",
+    "${sl_ot_efr32_root}/sl_gp_interface.c",
     "${sl_ot_efr32_root}/sleep.c",
     "${sl_ot_efr32_root}/soft_source_match_table.c",
     "${sl_ot_efr32_root}/system.c",
   ]
 
+  include_dirs = [ "${openthread_root}/examples/platforms/utils" ]
+
   public_deps = [
     ":openthread_core_config_efr32",
     "${openthread_root}/src/core:libopenthread_core_headers",
diff --git a/third_party/silabs/BUILD.gn b/third_party/silabs/BUILD.gn
index 2326a73..915cf8b 100644
--- a/third_party/silabs/BUILD.gn
+++ b/third_party/silabs/BUILD.gn
@@ -66,8 +66,6 @@
   if (use_silabs_thread_lib) {
     config("libopenthread-platform_config") {
       include_dirs = [ "${openthread_root}/examples/platforms" ]
-
-      defines = [ "SL_CONFIG_OPENTHREAD_LIB=1" ]
     }
 
     copy("copy_openthread_system") {
@@ -126,8 +124,13 @@
     }
 
     source_set("ot-efr32-cert") {
+      sources = [
+        "${openthread_root}/examples/platforms/utils/mac_frame.cpp",
+        "${openthread_root}/examples/platforms/utils/mac_frame.h",
+      ]
+
       if (enable_openthread_cli) {
-        sources = [
+        sources += [
           "${openthread_root}/examples/apps/cli/cli_uart.cpp",
           "${openthread_root}/src/cli/cli.cpp",
           "${openthread_root}/src/cli/cli.hpp",
@@ -150,12 +153,16 @@
           "${openthread_root}/src/cli/cli_history.hpp",
           "${openthread_root}/src/cli/cli_joiner.cpp",
           "${openthread_root}/src/cli/cli_joiner.hpp",
+          "${openthread_root}/src/cli/cli_link_metrics.cpp",
+          "${openthread_root}/src/cli/cli_link_metrics.hpp",
           "${openthread_root}/src/cli/cli_mac_filter.cpp",
           "${openthread_root}/src/cli/cli_mac_filter.hpp",
+          "${openthread_root}/src/cli/cli_mdns.cpp",
+          "${openthread_root}/src/cli/cli_mdns.hpp",
           "${openthread_root}/src/cli/cli_network_data.cpp",
           "${openthread_root}/src/cli/cli_network_data.hpp",
-          "${openthread_root}/src/cli/cli_output.cpp",
-          "${openthread_root}/src/cli/cli_output.hpp",
+          "${openthread_root}/src/cli/cli_ping.cpp",
+          "${openthread_root}/src/cli/cli_ping.hpp",
           "${openthread_root}/src/cli/cli_srp_client.cpp",
           "${openthread_root}/src/cli/cli_srp_client.hpp",
           "${openthread_root}/src/cli/cli_srp_server.cpp",
@@ -164,6 +171,8 @@
           "${openthread_root}/src/cli/cli_tcp.hpp",
           "${openthread_root}/src/cli/cli_udp.cpp",
           "${openthread_root}/src/cli/cli_udp.hpp",
+          "${openthread_root}/src/cli/cli_utils.cpp",
+          "${openthread_root}/src/cli/cli_utils.hpp",
           "${openthread_root}/src/cli/x509_cert_key.hpp",
         ]
       }
@@ -187,6 +196,20 @@
       XTD = "ftd"
       if (!chip_openthread_ftd) {
         XTD = "mtd"
+      } else {
+        # additional files needed for ftd lib
+        sources += [
+          "${openthread_root}/examples/platforms/utils/link_metrics.cpp",
+          "${openthread_root}/examples/platforms/utils/link_metrics.h",
+          "${openthread_root}/src/core/api/link_api.cpp",
+          "${openthread_root}/src/core/mac/mac.cpp",
+          "${openthread_root}/src/core/mac/mac_frame.cpp",
+          "${openthread_root}/src/core/mac/sub_mac.cpp",
+          "${openthread_root}/src/core/thread/mle.cpp",
+          "${sl_ot_platform_abstraction}/efr32/radio.c",
+        ]
+
+        include_dirs = [ "${sl_ot_platform_abstraction}/include" ]
       }
 
       # Use silabs openthread library stack with or without coap api enabled
@@ -197,6 +220,11 @@
 
       public_configs += [ "${openthread_root}:openthread_${XTD}_config" ]
 
+      if (silabs_family == "mgm24") {
+        # Locally set silabs_family to efr32mg24 as mgm24 doesn't have dedicated sl_ot_platform libs
+        silabs_family = "efr32mg24"
+      }
+
       libs = [
         "${sl_ot_libs_path}/libs/libsl_ot_stack_${XTD}_${COAP_API}${silabs_family}_gcc.a",
         "${sl_ot_libs_path}/libs/libsl_platform_${XTD}_dmp_${silabs_family}_gcc.a",
diff --git a/third_party/silabs/SiWx917_sdk.gni b/third_party/silabs/SiWx917_sdk.gni
index 59ab005..2862f9b 100644
--- a/third_party/silabs/SiWx917_sdk.gni
+++ b/third_party/silabs/SiWx917_sdk.gni
@@ -141,6 +141,13 @@
       "${wifi_sdk_root}/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/config",
       "${wifi_sdk_root}/components/device/silabs/si91x/mcu/core/config",
 
+      # sl memory manager
+      "${efr32_sdk_root}/platform/service/memory_manager/inc",
+      "${efr32_sdk_root}/platform/service/memory_manager/src",
+      "${efr32_sdk_root}/platform/service/memory_manager/profiler/inc",
+      "${efr32_sdk_root}/platform/service/memory_manager/profiler/config",
+      "${efr32_sdk_root}/util/silicon_labs/silabs_core/memory_manager",
+
       # OTA
       "${wifi_sdk_root}/components/device/silabs/si91x/wireless/firmware_upgrade",
       "${wifi_sdk_root}/components/device/silabs/si91x/mcu/hal/inc",
@@ -225,6 +232,7 @@
       "RADIO_CONFIG_DMP_SUPPORT=1",
       "configUSE_POSIX_ERRNO=1",
       "NVM3_LOCK_OVERRIDE=1",
+      "SL_MEMORY_POOL_LIGHT=1",
     ]
 
     if (silabs_log_enabled && chip_logging) {
@@ -373,6 +381,7 @@
       # si91x component
       "${efr32_sdk_root}/platform/CMSIS/RTOS2/Source/os_systick.c",
       "${efr32_sdk_root}/platform/common/src/sl_assert.c",
+      "${efr32_sdk_root}/platform/common/src/sl_core_cortexm.c",
       "${efr32_sdk_root}/platform/common/src/sl_slist.c",
       "${efr32_sdk_root}/platform/common/src/sli_cmsis_os2_ext_task_register.c",
       "${efr32_sdk_root}/util/third_party/freertos/cmsis/Source/cmsis_os2.c",
@@ -410,7 +419,10 @@
       "${wifi_sdk_root}/components/device/silabs/si91x/mcu/drivers/cmsis_driver/UDMA.c",
       "${wifi_sdk_root}/components/device/silabs/si91x/mcu/drivers/cmsis_driver/USART.c",
       "${wifi_sdk_root}/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/clock_update.c",
+      "${wifi_sdk_root}/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_crc.c",
       "${wifi_sdk_root}/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_egpio.c",
+      "${wifi_sdk_root}/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_spi.c",
+      "${wifi_sdk_root}/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_timers.c",
       "${wifi_sdk_root}/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_udma.c",
       "${wifi_sdk_root}/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_udma_wrapper.c",
       "${wifi_sdk_root}/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_usart.c",
@@ -446,10 +458,12 @@
       "${efr32_sdk_root}/platform/emlib/src/em_core.c",
       "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_nvic.c",
       "${efr32_sdk_root}/platform/service/system/src/sl_system_init.c",
+      "${efr32_sdk_root}/platform/service/system/src/sl_system_kernel.c",
       "${efr32_sdk_root}/util/third_party/freertos/kernel/croutine.c",
       "${efr32_sdk_root}/util/third_party/freertos/kernel/event_groups.c",
       "${efr32_sdk_root}/util/third_party/freertos/kernel/list.c",
       "${efr32_sdk_root}/util/third_party/freertos/kernel/portable/GCC/ARM_CM4F/port.c",
+      "${efr32_sdk_root}/util/third_party/freertos/kernel/portable/MemMang/heap_3.c",
       "${efr32_sdk_root}/util/third_party/freertos/kernel/queue.c",
       "${efr32_sdk_root}/util/third_party/freertos/kernel/stream_buffer.c",
       "${efr32_sdk_root}/util/third_party/freertos/kernel/tasks.c",
@@ -457,11 +471,22 @@
       "${sdk_support_root}/matter/si91x/siwx917/BRD4338A/autogen/sl_event_handler.c",
       "${sdk_support_root}/matter/si91x/siwx917/BRD4338A/autogen/sl_si91x_button_instances.c",
       "${sdk_support_root}/matter/si91x/siwx917/BRD4338A/autogen/sl_si91x_led_instances.c",
+      "${sdk_support_root}/matter/si91x/siwx917/BRD4338A/autogen/sl_ulp_timer_init.c",
       "${sdk_support_root}/matter/si91x/siwx917/BRD4338A/support/hal/rsi_hal_mcu_m4.c",
       "${wifi_sdk_root}/components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/src/sl_si91x_button.c",
       "${wifi_sdk_root}/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/src/sl_si91x_led.c",
       "${wifi_sdk_root}/components/device/silabs/si91x/mcu/drivers/service/nvm3/src/sl_si91x_nvm3_hal_flash.c",
 
+      # sl memory manager
+      "${efr32_sdk_root}/platform/service/memory_manager/profiler/src/sli_memory_profiler_stubs.c",
+      "${efr32_sdk_root}/platform/service/memory_manager/src/sl_memory_manager.c",
+      "${efr32_sdk_root}/platform/service/memory_manager/src/sl_memory_manager_cpp.cpp",
+      "${efr32_sdk_root}/platform/service/memory_manager/src/sl_memory_manager_dynamic_reservation.c",
+      "${efr32_sdk_root}/platform/service/memory_manager/src/sl_memory_manager_pool.c",
+      "${efr32_sdk_root}/platform/service/memory_manager/src/sl_memory_manager_region.c",
+      "${efr32_sdk_root}/platform/service/memory_manager/src/sl_memory_manager_retarget.c",
+      "${efr32_sdk_root}/platform/service/memory_manager/src/sli_memory_manager_common.c",
+
       # mbedtls
       "${chip_root}/third_party/mbedtls/repo/library/aes.c",
       "${chip_root}/third_party/mbedtls/repo/library/asn1parse.c",
diff --git a/third_party/silabs/efr32_sdk.gni b/third_party/silabs/efr32_sdk.gni
index a563f8e..8ef09c8 100644
--- a/third_party/silabs/efr32_sdk.gni
+++ b/third_party/silabs/efr32_sdk.gni
@@ -23,7 +23,7 @@
 
 declare_args() {
   # Location of the efr32 SDK.
-  efr32_sdk_root = "${chip_root}/third_party/silabs/gecko_sdk"
+  efr32_sdk_root = "${chip_root}/third_party/silabs/simplicity_sdk"
   sdk_support_root = "${chip_root}/third_party/silabs/matter_support"
   wiseconnect_sdk_root =
       "${chip_root}/third_party/silabs/wiseconnect-wifi-bt-sdk"
@@ -153,31 +153,45 @@
       "${efr32_sdk_root}/hardware/driver/configuration_over_swo/inc/",
       "${efr32_sdk_root}/platform/bootloader",
       "${efr32_sdk_root}/platform/bootloader/config",
-      "${efr32_sdk_root}/platform/bootloader/config/s2/btl_interface",
+      "${efr32_sdk_root}/platform/bootloader/config/btl_interface",
       "${efr32_sdk_root}/platform/bootloader/api",
       "${efr32_sdk_root}/platform/CMSIS/Core/Include",
       "${efr32_sdk_root}/platform/CMSIS/RTOS2/Include",
       "${efr32_sdk_root}/platform/common/inc",
+      "${efr32_sdk_root}/platform/driver/debug/inc",
       "${efr32_sdk_root}/platform/emdrv/common/inc",
       "${efr32_sdk_root}/platform/emdrv/gpiointerrupt/inc",
       "${efr32_sdk_root}/platform/emdrv/dmadrv/inc",
       "${efr32_sdk_root}/platform/emdrv/nvm3/inc",
-      "${efr32_sdk_root}/platform/emdrv/rtcdrv/inc",
       "${efr32_sdk_root}/platform/emlib/inc",
       "${efr32_sdk_root}/platform/halconfig/inc/hal-config",
       "${efr32_sdk_root}/platform/peripheral/inc",
       "${efr32_sdk_root}/platform/radio/rail_lib/common",
       "${efr32_sdk_root}/platform/radio/rail_lib/chip/efr32",
-      "${efr32_sdk_root}/platform/radio/rail_lib/chip/efr32/rf/common/cortex",
       "${efr32_sdk_root}/platform/radio/rail_lib/protocol/ieee802154",
       "${efr32_sdk_root}/platform/radio/rail_lib/protocol/ble",
       "${efr32_sdk_root}/platform/radio/rail_lib/plugin/pa-conversions",
       "${efr32_sdk_root}/platform/radio/rail_lib/plugin/rail_util_pti",
       "${efr32_sdk_root}/platform/radio/rail_lib/plugin/rail_util_power_manager_init",
+      "${efr32_sdk_root}/platform/security/sl_component/sl_mbedtls_support/config/",
+      "${efr32_sdk_root}/platform/security/sl_component/sl_mbedtls_support/config/preset",
+      "${efr32_sdk_root}/platform/security/sl_component/sl_mbedtls_support/inc",
+      "${efr32_sdk_root}/platform/security/sl_component/sl_protocol_crypto/src",
+      "${efr32_sdk_root}/platform/security/sl_component/sl_psa_driver/inc",
+      "${efr32_sdk_root}/platform/security/sl_component/se_manager/inc",
+      "${efr32_sdk_root}/platform/security/sl_component/se_manager/src/",
+      "${efr32_sdk_root}/platform/service/clock_manager/inc",
       "${efr32_sdk_root}/platform/service/device_init/inc",
+      "${efr32_sdk_root}/platform/service/device_manager/inc",
       "${efr32_sdk_root}/platform/service/hfxo_manager/inc",
       "${efr32_sdk_root}/platform/service/hfxo_manager/src",
+      "${efr32_sdk_root}/platform/service/interrupt_manager/inc/",
+      "${efr32_sdk_root}/platform/service/interrupt_manager/inc/arm/",
       "${efr32_sdk_root}/platform/service/iostream/inc",
+      "${efr32_sdk_root}/platform/service/memory_manager/inc",
+      "${efr32_sdk_root}/platform/service/memory_manager/src",
+      "${efr32_sdk_root}/platform/service/memory_manager/profiler/inc",
+      "${efr32_sdk_root}/platform/service/memory_manager/profiler/config",
       "${efr32_sdk_root}/platform/service/mpu/inc",
       "${efr32_sdk_root}/platform/service/power_manager/inc/",
       "${efr32_sdk_root}/platform/service/power_manager/src/",
@@ -189,34 +203,26 @@
       "${efr32_sdk_root}/platform/middleware/glib/config",
       "${efr32_sdk_root}/platform/middleware/glib/glib",
       "${efr32_sdk_root}/platform/middleware/glib/dmd",
-      "${efr32_sdk_root}/platform/base/hal/plugin/psstore",
-      "${efr32_sdk_root}/platform/base/hal/plugin/antenna",
       "${efr32_sdk_root}/protocol/bluetooth/inc/",
       "${efr32_sdk_root}/protocol/bluetooth/bgstack/ll/inc",
       "${efr32_sdk_root}/util/plugin/plugin-common/fem-control",
       "${efr32_sdk_root}/util/silicon_labs/silabs_core/graphics",
       "${efr32_sdk_root}/util/silicon_labs/silabs_core/memory_manager",
+      "${efr32_sdk_root}/util/silicon_labs/silabs_core/queue",
       "${efr32_sdk_root}/util/third_party/mbedtls/include",
       "${efr32_sdk_root}/util/third_party/mbedtls/include/mbedtls",
       "${efr32_sdk_root}/util/third_party/mbedtls/include/psa",
       "${efr32_sdk_root}/util/third_party/mbedtls/library",
-      "${efr32_sdk_root}/platform/security/sl_component/sl_protocol_crypto/src",
-      "${efr32_sdk_root}/platform/security/sl_component/sl_mbedtls_support/config/",
-      "${efr32_sdk_root}/platform/security/sl_component/sl_mbedtls_support/config/preset",
-      "${efr32_sdk_root}/platform/security/sl_component/sl_psa_driver/inc",
-      "${efr32_sdk_root}/platform/security/sl_component/se_manager/inc",
-      "${efr32_sdk_root}/platform/security/sl_component/se_manager/src/",
       "${efr32_sdk_root}/util/third_party/freertos/cmsis/Include",
       "${efr32_sdk_root}/util/third_party/freertos/kernel/include",
-      "${efr32_sdk_root}/platform/driver/debug/inc",
       "${silabs_gen_folder}/config",
       "${silabs_gen_folder}/autogen",
 
-      # Use directory in matter support until gsdk files are updated
-      "${sdk_support_root}/platform/security/sl_component/sl_mbedtls_support/inc",
-
       # Headers needed for Init no function will be called if OT is not used
       "${sl_ot_efr32_root}",
+
+      # TODO this is for sl_openthread_features_config.h. should use generated one per board when sl_ot_abstraction is integrated
+      "${sl_ot_libs_path}/config",
     ]
 
     if (silabs_family == "efr32mg24") {
@@ -287,25 +293,33 @@
       "NVM3_DEFAULT_NVM_SIZE=40960",
       "NVM3_DEFAULT_MAX_OBJECT_SIZE=4092",
       "KVS_MAX_ENTRIES=${kvs_max_entries}",
-      "EFR32_OPENTHREAD_API",
-      "PHY=EMBER_PHY_RAIL",
-      "CORTEXM3",
+      "CORTEXM3=1",
       "MICRO=EMBER_MICRO_CORTEXM3_EFR32",
       "PLAT=EMBER_PLATFORM_CORTEXM3",
       "${silabs_mcu}=1",
       "${silabs_board}=1",
       "SL_BOARD_NAME=${silabs_board}",
       "__HEAP_SIZE=0",
+      "__STACK_SIZE=0",
       "SL_THREADING_ALT=1",
       "SL_COMPONENT_CATALOG_PRESENT=1",
+      "SL_CODE_COMPONENT_CORE=core",
+      "SL_CODE_COMPONENT_PERIPHERAL_SYSRTC=hal_sysrtc",
+      "SL_CODE_COMPONENT_POWER_MANAGER=power_manager",
+      "SL_CODE_COMPONENT_SLEEPTIMER=sleeptimer",
+      "CMSIS_NVIC_VIRTUAL=1",
+      "CMSIS_NVIC_VIRTUAL_HEADER_FILE=\"cmsis_nvic_virtual.h\"",
       "PLATFORM_HEADER=\"platform-header.h\"",
       "USE_NVM3=1",
       "SL_RAIL_LIB_MULTIPROTOCOL_SUPPORT=1",
       "SL_RAIL_UTIL_PA_CONFIG_HEADER=<sl_rail_util_pa_config.h>",
       "RADIO_CONFIG_DMP_SUPPORT=1",
       "SL_MATTER_BLE_EXTENDED_ADV=${sl_matter_ble_extended_adv}",
-
-      #"__STACK_SIZE=0",
+      "SL_MEMORY_POOL_LIGHT=1",
+      "SL_OPENTHREAD_STACK_FEATURES_CONFIG_FILE=\"sl_openthread_features_config.h\"",
+      "SL_CSL_TIMEOUT=${sl_ot_csl_timeout_sec}",
+      "CIRCULAR_QUEUE_USE_LOCAL_CONFIG_HEADER=1",
+      "MATTER_INTEGRATION=1",
     ]
 
     if (silabs_log_enabled && chip_logging) {
@@ -314,11 +328,6 @@
       defines += [ "SILABS_LOG_ENABLED=0" ]
     }
 
-    # Temporary configuration to enable COAP specific configurations
-    if (use_thread_coap_lib) {
-      defines += [ "SL_USE_COAP_CONFIG=1" ]
-    }
-
     if (sl_uart_log_output) {
       defines += [
         "SILABS_LOG_OUT_UART=1",
@@ -326,6 +335,18 @@
       ]
     }
 
+    if (use_silabs_thread_lib) {
+      defines += [ "SL_CONFIG_OPENTHREAD_LIB=1" ]
+    } else {
+      defines += [ "SL_CONFIG_OPENTHREAD_LIB=0" ]
+    }
+
+    if (use_thread_coap_lib) {
+      defines += [ "SL_USE_COAP_CONFIG=1" ]
+    } else {
+      defines += [ "SL_USE_COAP_CONFIG=0" ]
+    }
+
     if (chip_enable_ble_rs911x) {
       defines += [
         "RSI_BLE_ENABLE=1",
@@ -449,7 +470,6 @@
           defines += [
             "CHIP_DEVICE_CONFIG_THREAD_SSED=1",
             "SL_CSL_ENABLE=1",
-            "SL_CSL_TIMEOUT=${sl_ot_csl_timeout_sec}",
           ]
         }
       }
@@ -511,6 +531,8 @@
         "${efr32_sdk_root}/platform/radio/rail_lib/plugin/pa-conversions/efr32xg24/config",
         "${efr32_sdk_root}/platform/service/device_init/config/s2/",
         "${efr32_sdk_root}/platform/emdrv/spidrv/inc",
+        "${efr32_sdk_root}/platform/emdrv/spidrv/config",
+        "${efr32_sdk_root}/platform/emdrv/dmadrv/inc/s2_signals",
       ]
 
       libs += [
@@ -521,9 +543,10 @@
 
       if (!chip_enable_ble_rs911x) {
         libs += [
-          "${sdk_support_root}/protocol/bluetooth/bgcommon/lib/libbgcommon_efr32xg24_gcc_release.a",
+          "${sdk_support_root}/protocol/bluetooth/bgcommon/lib/build/gcc/cortex-m33/bgcommon/release/libbgcommon.a",
           "${sdk_support_root}/protocol/bluetooth/bgstack/ll/lib/libbluetooth_controller_efr32xg24_gcc_release.a",
-          "${sdk_support_root}/protocol/bluetooth/lib/libbluetooth_host_efr32xg24_gcc_release.a",
+          "${sdk_support_root}/protocol/bluetooth/build/gcc/cortex-m33/bt_host/release/libbt_host.a",
+          "${sdk_support_root}/protocol/bluetooth/build/gcc/cortex-m33/bt_host/hal/release/libbt_hal_series2.a",
         ]
       }
 
@@ -542,12 +565,14 @@
         "${efr32_sdk_root}/platform/radio/rail_lib/plugin/pa-conversions/efr32xg24",
         "${efr32_sdk_root}/platform/radio/rail_lib/plugin/pa-conversions/efr32xg24/config",
         "${efr32_sdk_root}/platform/service/device_init/config/s2/",
+        "${efr32_sdk_root}/platform/emdrv/dmadrv/inc/s2_signals",
       ]
 
       libs += [
-        "${sdk_support_root}/protocol/bluetooth/bgcommon/lib/libbgcommon_efr32xg24_gcc_release.a",
+        "${sdk_support_root}/protocol/bluetooth/bgcommon/lib/build/gcc/cortex-m33/bgcommon/release/libbgcommon.a",
         "${sdk_support_root}/protocol/bluetooth/bgstack/ll/lib/libbluetooth_controller_efr32xg24_gcc_release.a",
-        "${sdk_support_root}/protocol/bluetooth/lib/libbluetooth_host_efr32xg24_gcc_release.a",
+        "${sdk_support_root}/protocol/bluetooth/build/gcc/cortex-m33/bt_host/release/libbt_host.a",
+        "${sdk_support_root}/protocol/bluetooth/build/gcc/cortex-m33/bt_host/hal/release/libbt_hal_series2.a",
         "${sdk_support_root}/platform/radio/rail_lib/autogen/librail_release/librail_multiprotocol_module_efr32xg24_gcc_release.a",
         "${sdk_support_root}/platform/emdrv/nvm3/lib/libnvm3_CM33_gcc.a",
         "${sdk_support_root}/protocol/openthread/libs/libsl_openthread_efr32mg2x_gcc.a",
@@ -618,6 +643,7 @@
       "${efr32_sdk_root}/platform/bootloader/api/btl_interface.c",
       "${efr32_sdk_root}/platform/bootloader/api/btl_interface_storage.c",
       "${efr32_sdk_root}/platform/bootloader/security/sha/crypto_sha.c",
+      "${efr32_sdk_root}/platform/common/src/sl_core_cortexm.c",
       "${efr32_sdk_root}/platform/common/src/sl_slist.c",
       "${efr32_sdk_root}/platform/common/src/sli_cmsis_os2_ext_task_register.c",
       "${efr32_sdk_root}/platform/emdrv/dmadrv/src/dmadrv.c",
@@ -625,7 +651,6 @@
       "${efr32_sdk_root}/platform/emdrv/nvm3/src/nvm3_default.c",
       "${efr32_sdk_root}/platform/emdrv/nvm3/src/nvm3_hal_flash.c",
       "${efr32_sdk_root}/platform/emdrv/nvm3/src/nvm3_lock.c",
-      "${efr32_sdk_root}/platform/emlib/src/em_adc.c",
       "${efr32_sdk_root}/platform/emlib/src/em_cmu.c",
       "${efr32_sdk_root}/platform/emlib/src/em_core.c",
       "${efr32_sdk_root}/platform/emlib/src/em_crypto.c",
@@ -639,11 +664,10 @@
       "${efr32_sdk_root}/platform/emlib/src/em_se.c",
       "${efr32_sdk_root}/platform/emlib/src/em_system.c",
       "${efr32_sdk_root}/platform/emlib/src/em_timer.c",
-      "${efr32_sdk_root}/platform/peripheral/src/peripheral_sysrtc.c",
+      "${efr32_sdk_root}/platform/peripheral/src/sl_hal_sysrtc.c",
       "${efr32_sdk_root}/platform/radio/rail_lib/plugin/pa-conversions/pa_conversions_efr32.c",
       "${efr32_sdk_root}/platform/radio/rail_lib/plugin/rail_util_power_manager_init/sl_rail_util_power_manager_init.c",
       "${efr32_sdk_root}/platform/radio/rail_lib/plugin/rail_util_pti/sl_rail_util_pti.c",
-      "${efr32_sdk_root}/platform/security/sl_component/sl_mbedtls_support/src/crypto_ecp.c",
       "${efr32_sdk_root}/platform/security/sl_component/sl_mbedtls_support/src/error.c",
       "${efr32_sdk_root}/platform/security/sl_component/sl_mbedtls_support/src/mbedtls_ccm.c",
       "${efr32_sdk_root}/platform/security/sl_component/sl_mbedtls_support/src/mbedtls_cmac.c",
@@ -651,23 +675,34 @@
       "${efr32_sdk_root}/platform/security/sl_component/sl_mbedtls_support/src/mbedtls_sha.c",
       "${efr32_sdk_root}/platform/security/sl_component/sl_mbedtls_support/src/sl_entropy_hardware.c",
       "${efr32_sdk_root}/platform/security/sl_component/sl_mbedtls_support/src/sl_mbedtls.c",
+      "${efr32_sdk_root}/platform/security/sl_component/sl_mbedtls_support/src/sl_psa_crypto.c",
       "${efr32_sdk_root}/platform/security/sl_component/sl_mbedtls_support/src/sli_psa_crypto.c",
+      "${efr32_sdk_root}/platform/security/sl_component/sl_psa_driver/src/sl_psa_its_nvm3.c",
       "${efr32_sdk_root}/platform/security/sl_component/sl_psa_driver/src/sli_psa_driver_common.c",
       "${efr32_sdk_root}/platform/security/sl_component/sl_psa_driver/src/sli_psa_driver_init.c",
       "${efr32_sdk_root}/platform/security/sl_component/sl_psa_driver/src/sli_psa_trng.c",
       "${efr32_sdk_root}/platform/security/sl_component/sl_psa_driver/src/sli_se_driver_builtin_keys.c",
       "${efr32_sdk_root}/platform/security/sl_component/sl_psa_driver/src/sli_se_driver_signature.c",
       "${efr32_sdk_root}/platform/security/sl_component/sl_psa_driver/src/sli_se_version_dependencies.c",
-      "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_lfrco.c",
-      "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_nvic.c",
+      "${efr32_sdk_root}/platform/service/clock_manager/src/sl_clock_manager.c",
+      "${efr32_sdk_root}/platform/service/clock_manager/src/sl_clock_manager_init.c",
+      "${efr32_sdk_root}/platform/service/device_manager/src/sl_device_clock.c",
+      "${efr32_sdk_root}/platform/service/device_manager/src/sl_device_peripheral.c",
       "${efr32_sdk_root}/platform/service/hfxo_manager/src/sl_hfxo_manager.c",
+      "${efr32_sdk_root}/platform/service/interrupt_manager/src/sl_interrupt_manager_cortexm.c",
       "${efr32_sdk_root}/platform/service/iostream/src/sl_iostream.c",
       "${efr32_sdk_root}/platform/service/iostream/src/sl_iostream_rtt.c",
+      "${efr32_sdk_root}/platform/service/memory_manager/profiler/src/sli_memory_profiler_stubs.c",
+      "${efr32_sdk_root}/platform/service/memory_manager/src/sl_memory_manager.c",
+      "${efr32_sdk_root}/platform/service/memory_manager/src/sl_memory_manager_cpp.cpp",
+      "${efr32_sdk_root}/platform/service/memory_manager/src/sl_memory_manager_dynamic_reservation.c",
+      "${efr32_sdk_root}/platform/service/memory_manager/src/sl_memory_manager_pool.c",
+      "${efr32_sdk_root}/platform/service/memory_manager/src/sl_memory_manager_region.c",
+      "${efr32_sdk_root}/platform/service/memory_manager/src/sl_memory_manager_retarget.c",
+      "${efr32_sdk_root}/platform/service/memory_manager/src/sli_memory_manager_common.c",
       "${efr32_sdk_root}/platform/service/mpu/src/sl_mpu.c",
       "${efr32_sdk_root}/platform/service/power_manager/src/sl_power_manager.c",
       "${efr32_sdk_root}/platform/service/power_manager/src/sl_power_manager_debug.c",
-      "${efr32_sdk_root}/platform/service/power_manager/src/sl_power_manager_hal_s0_s1.c",
-      "${efr32_sdk_root}/platform/service/power_manager/src/sl_power_manager_hal_s2.c",
       "${efr32_sdk_root}/platform/service/sleeptimer/src/sl_sleeptimer.c",
       "${efr32_sdk_root}/platform/service/sleeptimer/src/sl_sleeptimer_hal_rtcc.c",
       "${efr32_sdk_root}/platform/service/system/src/sl_system_init.c",
@@ -675,11 +710,12 @@
       "${efr32_sdk_root}/platform/service/udelay/src/sl_udelay.c",
       "${efr32_sdk_root}/platform/service/udelay/src/sl_udelay_armv6m_gcc.S",
       "${efr32_sdk_root}/util/plugin/security_manager/security_manager.c",
-      "${efr32_sdk_root}/util/silicon_labs/silabs_core/memory_manager/sl_malloc.c",
+      "${efr32_sdk_root}/util/silicon_labs/silabs_core/queue/circular_queue.c",
       "${efr32_sdk_root}/util/third_party/freertos/cmsis/Source/cmsis_os2.c",
       "${efr32_sdk_root}/util/third_party/freertos/kernel/croutine.c",
       "${efr32_sdk_root}/util/third_party/freertos/kernel/event_groups.c",
       "${efr32_sdk_root}/util/third_party/freertos/kernel/list.c",
+      "${efr32_sdk_root}/util/third_party/freertos/kernel/portable/MemMang/heap_3.c",
       "${efr32_sdk_root}/util/third_party/freertos/kernel/portable/SiliconLabs/tick_power_manager.c",
       "${efr32_sdk_root}/util/third_party/freertos/kernel/queue.c",
       "${efr32_sdk_root}/util/third_party/freertos/kernel/stream_buffer.c",
@@ -718,7 +754,6 @@
       "${efr32_sdk_root}/util/third_party/mbedtls/library/psa_crypto_cipher.c",
       "${efr32_sdk_root}/util/third_party/mbedtls/library/psa_crypto_client.c",
       "${efr32_sdk_root}/util/third_party/mbedtls/library/psa_crypto_driver_wrappers_no_static.c",
-      "${efr32_sdk_root}/util/third_party/mbedtls/library/psa_crypto_ecp.c",
       "${efr32_sdk_root}/util/third_party/mbedtls/library/psa_crypto_hash.c",
       "${efr32_sdk_root}/util/third_party/mbedtls/library/psa_crypto_mac.c",
       "${efr32_sdk_root}/util/third_party/mbedtls/library/psa_crypto_rsa.c",
@@ -747,12 +782,8 @@
       "${silabs_gen_folder}/autogen/gatt_db.c",
       "${silabs_gen_folder}/autogen/sl_bluetooth.c",
       "${silabs_gen_folder}/autogen/sl_board_default_init.c",
-      "${silabs_gen_folder}/autogen/sl_device_init_clocks.c",
       "${silabs_gen_folder}/autogen/sl_event_handler.c",
       "${silabs_gen_folder}/autogen/sl_iostream_handles.c",
-
-      # Used file in matter_support until fix is pushed to gsdk
-      "${sdk_support_root}/platform/security/sl_component/sl_psa_driver/src/sl_psa_its_nvm3.c",
     ]
     if (enable_dic) {
       sources += [
@@ -765,11 +796,6 @@
       ]
     }
 
-    if (silabs_family != "mgm24") {
-      sources +=
-          [ "${efr32_sdk_root}/platform/radio/rail_lib/hal/efr32/hal_efr.c" ]
-    }
-
     if (use_wstk_buttons) {
       sources += [
         "${efr32_sdk_root}/platform/driver/button/src/sl_button.c",
@@ -803,6 +829,7 @@
         "${efr32_sdk_root}/protocol/bluetooth/src/sl_bt_stack_init.c",
         "${efr32_sdk_root}/protocol/bluetooth/src/sli_bt_advertiser_config.c",
         "${efr32_sdk_root}/protocol/bluetooth/src/sli_bt_connection_config.c",
+        "${efr32_sdk_root}/protocol/bluetooth/src/sli_bt_host_adaptation.c",
       ]
     }
 
@@ -858,7 +885,6 @@
         "${efr32_sdk_root}/hardware/driver/memlcd/src/memlcd_usart/sl_memlcd_spi.c",
         "${efr32_sdk_root}/platform/emdrv/uartdrv/src/uartdrv.c",
         "${efr32_sdk_root}/platform/emlib/src/em_eusart.c",
-        "${efr32_sdk_root}/platform/emlib/src/em_leuart.c",
         "${efr32_sdk_root}/platform/emlib/src/em_usart.c",
         "${silabs_gen_folder}/autogen/sl_uartdrv_init.c",
       ]
@@ -901,7 +927,6 @@
         "${efr32_sdk_root}/platform/Device/SiliconLabs/EFR32MG24/Source/startup_efr32mg24.c",
         "${efr32_sdk_root}/platform/Device/SiliconLabs/EFR32MG24/Source/system_efr32mg24.c",
         "${efr32_sdk_root}/platform/radio/rail_lib/plugin/pa-conversions/pa_curves_efr32.c",
-        "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_hfxo_s2.c",
       ]
     } else if (silabs_family == "mgm24") {
       sources += [
@@ -909,7 +934,6 @@
         "${efr32_sdk_root}/platform/Device/SiliconLabs/MGM24/Source/system_mgm24.c",
         "${efr32_sdk_root}/platform/radio/rail_lib/plugin/fem_util/sl_fem_util.c",
         "${efr32_sdk_root}/platform/radio/rail_lib/plugin/rail_util_rssi/sl_rail_util_rssi.c",
-        "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_hfxo_mgm24.c",
       ]
     }
 
@@ -925,6 +949,7 @@
         "${efr32_sdk_root}/platform/security/sl_component/se_manager/src/sl_se_manager_key_handling.c",
         "${efr32_sdk_root}/platform/security/sl_component/se_manager/src/sl_se_manager_signature.c",
         "${efr32_sdk_root}/platform/security/sl_component/se_manager/src/sl_se_manager_util.c",
+        "${efr32_sdk_root}/platform/security/sl_component/se_manager/src/sli_se_manager_mailbox.c",
         "${efr32_sdk_root}/platform/security/sl_component/sl_mbedtls_support/src/se_aes.c",
         "${efr32_sdk_root}/platform/security/sl_component/sl_mbedtls_support/src/se_jpake.c",
         "${efr32_sdk_root}/platform/security/sl_component/sl_protocol_crypto/src/sli_protocol_crypto_radioaes.c",
@@ -943,11 +968,13 @@
         "${efr32_sdk_root}/platform/security/sl_component/sl_psa_driver/src/sli_se_transparent_driver_hash.c",
         "${efr32_sdk_root}/platform/security/sl_component/sl_psa_driver/src/sli_se_transparent_driver_mac.c",
         "${efr32_sdk_root}/platform/security/sl_component/sl_psa_driver/src/sli_se_transparent_key_derivation.c",
+        "${efr32_sdk_root}/platform/service/clock_manager/src/sl_clock_manager_hal_s2.c",
+        "${efr32_sdk_root}/platform/service/clock_manager/src/sl_clock_manager_init_hal_s2.c",
         "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_dcdc_s2.c",
-        "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_dpll_s2.c",
-        "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_emu_s2.c",
-        "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_lfxo_s2.c",
+        "${efr32_sdk_root}/platform/service/device_manager/clocks/sl_device_clock_efr32xg24.c",
+        "${efr32_sdk_root}/platform/service/device_manager/devices/sl_device_peripheral_hal_efr32xg24.c",
         "${efr32_sdk_root}/platform/service/hfxo_manager/src/sl_hfxo_manager_hal_s2.c",
+        "${efr32_sdk_root}/platform/service/power_manager/src/sl_power_manager_hal_s2.c",
         "${efr32_sdk_root}/platform/service/sleeptimer/src/sl_sleeptimer_hal_sysrtc.c",
         "${efr32_sdk_root}/util/third_party/freertos/kernel/portable/GCC/ARM_CM33_NTZ/non_secure/port.c",
         "${efr32_sdk_root}/util/third_party/freertos/kernel/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c",
diff --git a/third_party/silabs/gecko_sdk b/third_party/silabs/gecko_sdk
deleted file mode 160000
index e359ba4..0000000
--- a/third_party/silabs/gecko_sdk
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit e359ba40a2ba5b127964a6e7afe9e70ff5f9a1cf
diff --git a/third_party/silabs/matter_support b/third_party/silabs/matter_support
index edbfeba..a1fdd62 160000
--- a/third_party/silabs/matter_support
+++ b/third_party/silabs/matter_support
@@ -1 +1 @@
-Subproject commit edbfeba723c9ffdc93f57ad1eee85186b1643f25
+Subproject commit a1fdd62cb168049f946f7e1b5399c39353bcd7b4
diff --git a/third_party/silabs/simplicity_sdk b/third_party/silabs/simplicity_sdk
new file mode 160000
index 0000000..a1a37fa
--- /dev/null
+++ b/third_party/silabs/simplicity_sdk
@@ -0,0 +1 @@
+Subproject commit a1a37fa7dda1f76ea70229aa4ffe2e47cb066edc
diff --git a/third_party/silabs/slc_gen/run_slc.py b/third_party/silabs/slc_gen/run_slc.py
index 4ec7f59..22ef27b 100644
--- a/third_party/silabs/slc_gen/run_slc.py
+++ b/third_party/silabs/slc_gen/run_slc.py
@@ -14,10 +14,11 @@
 
 
 def isMG24(partnumber):
-    if "EFR32MG24" in partnumber or "MGM240" in partnumber:
-        return True
-    else:
-        return False
+    return ("EFR32MG24" in partnumber or "MGM240" in partnumber)
+
+
+def isMG26(partnumber):
+    return ("EFR32MG26" in partnumber)
 
 
 root_path = sys.argv[1]
@@ -35,10 +36,8 @@
 slc_arguments = ""
 
 # Add Familly specific component
-if isMG24(silabs_mcu):
+if isMG24(silabs_mcu) or isMG26(silabs_mcu):
     slc_arguments += "uartdrv_eusart:vcom,"
-else:
-    slc_arguments += "uartdrv_usart:vcom,"
 
 # Translate GN arguments in SLC arguments
 if not disable_lcd:
@@ -58,15 +57,15 @@
 
 print(slc_arguments)
 
-if "GSDK_ROOT" in os.environ:
-    gsdk_root = os.getenv('GSDK_ROOT')
+if "SISDK_ROOT" in os.environ:
+    sisdk_root = os.getenv('SISDK_ROOT')
 else:
     # If no gsdk path is set in the environment, use the standard path to the submodule
-    gsdk_root = os.path.join(root_path, "third_party/silabs/gecko_sdk/")
+    sisdk_root = os.path.join(root_path, "third_party/silabs/simplicity_sdk/")
 
 # make sure we have a configured and trusted gsdk in slc
-subprocess.run(["slc", "configuration", "--sdk", gsdk_root], check=True)
-subprocess.run(["slc", "signature", "trust", "--sdk", gsdk_root], check=True)
+subprocess.run(["slc", "configuration", "--sdk", sisdk_root], check=True)
+subprocess.run(["slc", "signature", "trust", "--sdk", sisdk_root], check=True)
 
 subprocess.run(["slc", "generate", slcp_file_path, "-d", output_path, "--with", slc_arguments], check=True)
 
diff --git a/third_party/silabs/wifi_sdk b/third_party/silabs/wifi_sdk
index aa514d4..e97a0ed 160000
--- a/third_party/silabs/wifi_sdk
+++ b/third_party/silabs/wifi_sdk
@@ -1 +1 @@
-Subproject commit aa514d4fac4b568d03e1f6d3d19c7811034d5077
+Subproject commit e97a0ed00ddda347a8a39e8276f470e1c5fea469