diff --git a/examples/lighting-app/silabs/SiWx917/BUILD.gn b/examples/lighting-app/silabs/SiWx917/BUILD.gn
index 3a812b9..61f849a 100644
--- a/examples/lighting-app/silabs/SiWx917/BUILD.gn
+++ b/examples/lighting-app/silabs/SiWx917/BUILD.gn
@@ -18,8 +18,8 @@
 import("//build_overrides/pigweed.gni")
 
 import("${build_root}/config/defaults.gni")
+import("${efr32_sdk_build_root}/SiWx917_sdk.gni")
 import("${efr32_sdk_build_root}/efr32_executable.gni")
-import("${efr32_sdk_build_root}/efr32_sdk.gni")
 
 import("${chip_root}/examples/common/pigweed/pigweed_rpcs.gni")
 import("${chip_root}/src/platform/device.gni")
@@ -31,8 +31,8 @@
 
 assert(current_os == "freertos")
 
-efr32_project_dir = "${chip_root}/examples/lighting-app/silabs/efr32"
-examples_plat_dir = "${chip_root}/examples/platform/silabs/efr32"
+efr32_project_dir = "${chip_root}/examples/lighting-app/silabs/SiWx917"
+examples_plat_dir = "${chip_root}/examples/platform/silabs/SiWx917"
 examples_common_plat_dir = "${chip_root}/examples/platform/silabs"
 
 declare_args() {
@@ -56,13 +56,19 @@
   sl_wfx_config_scan = true
 
   # Disable LCD on supported devices
-  disable_lcd = false
+  disable_lcd = true
 
   # Argument to Disable IPv4 for wifi(rs911)
   chip_enable_wifi_ipv4 = false
 
   # Argument to force enable WPA3 security on rs91x
   rs91x_wpa3_only = false
+
+  #default WiFi SSID
+  ssid = ""
+
+  #default Wifi Password
+  psk = ""
 }
 
 declare_args() {
@@ -80,7 +86,7 @@
 if (chip_enable_wifi) {
   assert(use_rs911x || use_wf200)
   enable_openthread_cli = false
-  import("${chip_root}/src/platform/silabs/EFR32/wifi_args.gni")
+  import("${chip_root}/src/platform/silabs/SiWx917/wifi_args.gni")
 }
 
 # ThunderBoards, Explorer Kit and MGM240L do not support LCD (No LCD)
@@ -90,6 +96,8 @@
   disable_lcd = true
 }
 
+defines = []
+
 # WiFi settings
 if (chip_enable_wifi) {
   # disabling LCD for MG24 for wifi
@@ -97,7 +105,19 @@
     show_qr_code = false
     disable_lcd = true
   }
-  wifi_sdk_dir = "${chip_root}/src/platform/silabs/EFR32/wifi"
+
+  if (ssid != "") {
+    defines += [
+      "CHIP_ONNETWORK_PAIRING = 1",
+      "CHIP_WIFI_SSID = $ssid",
+    ]
+  }
+  if (psk != "") {
+    assert(ssid != "", "ssid can't be null if psk is provided")
+    defines += [ "CHIP_WIFI_PSK = $psk" ]
+  }
+
+  wifi_sdk_dir = "${chip_root}/src/platform/silabs/SiWx917/wifi"
   efr32_lwip_defs = [ "LWIP_NETIF_API=1" ]
   if (lwip_ipv4) {
     efr32_lwip_defs += [
@@ -122,13 +142,8 @@
     efr32_lwip_defs += [ "LWIP_IPV6=0" ]
   }
 
-  if (use_rs911x) {
-    wiseconnect_sdk_root =
-        "${chip_root}/third_party/silabs/wiseconnect-wifi-bt-sdk"
-    import("${examples_plat_dir}/rs911x/rs911x.gni")
-  } else {
-    import("${examples_plat_dir}/wf200/wf200.gni")
-  }
+  wiseconnect_sdk_root = "${chip_root}/third_party/silabs/wisemcu-wifi-bt-sdk"
+  import("${examples_plat_dir}/SiWx917/rs911x.gni")
 }
 
 efr32_sdk("sdk") {
@@ -138,22 +153,18 @@
   ]
 
   include_dirs = [
-    "${chip_root}/src/platform/silabs/EFR32",
+    "${chip_root}/src/platform/silabs/SiWx917",
     "${efr32_project_dir}/include",
     "${examples_plat_dir}",
     "${chip_root}/src/lib",
     "${examples_common_plat_dir}",
   ]
 
-  defines = [
+  defines += [
     "BOARD_ID=${silabs_board}",
     "OTA_PERIODIC_TIMEOUT=${OTA_periodic_query_timeout}",
   ]
 
-  if (enable_heap_monitoring) {
-    defines += [ "HEAP_MONITORING" ]
-  }
-
   if (chip_enable_pw_rpc) {
     defines += [
       "HAL_VCOM_ENABLE=1",
@@ -196,9 +207,9 @@
   sources = [
     "${examples_common_plat_dir}/heap_4_silabs.c",
     "${examples_plat_dir}/BaseApplication.cpp",
-    "${examples_plat_dir}/efr32_utils.cpp",
-    "${examples_plat_dir}/init_efrPlatform.cpp",
+    "${examples_plat_dir}/init_ccpPlatform.cpp",
     "${examples_plat_dir}/matter_config.cpp",
+    "${examples_plat_dir}/siwx917_utils.cpp",
     "src/AppTask.cpp",
     "src/LightingManager.cpp",
     "src/ZclCallbacks.cpp",
@@ -206,12 +217,13 @@
   ]
 
   if (use_wstk_leds) {
-    sources += [ "${examples_plat_dir}/LEDWidget.cpp" ]
+    # TODO: Commentting for CCP till the bring up of this is done
+    #sources += [ "${examples_plat_dir}/LEDWidget.cpp" ]
   }
 
-  if (chip_enable_pw_rpc || chip_build_libshell || enable_openthread_cli ||
-      use_wf200 || use_rs911x) {
-    sources += [ "${examples_plat_dir}/uart.cpp" ]
+  if (chip_enable_pw_rpc || chip_build_libshell || use_rs911x) {
+    # TODO: Commentting for CCP till the bring up of this is done
+    #sources += [ "${examples_plat_dir}/uart.cpp" ]
   }
 
   deps = [
@@ -231,10 +243,7 @@
     ]
   }
 
-  if (chip_enable_ota_requestor) {
-    defines += [ "EFR32_OTA_ENABLED" ]
-    sources += [ "${examples_plat_dir}/OTAConfig.cpp" ]
-  }
+  #TODO: OTA should be added
 
   # WiFi Settings
   if (chip_enable_wifi) {
@@ -326,7 +335,7 @@
       "${chip_root}/examples/common/pigweed:lighting_service.nanopb_rpc",
       "${chip_root}/examples/common/pigweed:ot_cli_service.nanopb_rpc",
       "${chip_root}/examples/common/pigweed:thread_service.nanopb_rpc",
-      "${examples_plat_dir}/pw_sys_io:pw_sys_io_efr32",
+      "${examples_plat_dir}/pw_sys_io:pw_sys_io_siwx917",
     ]
 
     deps += pw_build_LINK_DEPS
@@ -365,7 +374,7 @@
 
   # Attestation Credentials
   if (chip_build_platform_attestation_credentials_provider) {
-    deps += [ "${examples_plat_dir}:efr32-attestation-credentials" ]
+    deps += [ "${examples_plat_dir}:siwx917-attestation-credentials" ]
   }
 
   # Factory Data Provider
diff --git a/examples/lighting-app/silabs/SiWx917/args.gni b/examples/lighting-app/silabs/SiWx917/args.gni
index d216faa..8b382c4 100644
--- a/examples/lighting-app/silabs/SiWx917/args.gni
+++ b/examples/lighting-app/silabs/SiWx917/args.gni
@@ -15,7 +15,7 @@
 import("//build_overrides/chip.gni")
 import("//build_overrides/pigweed.gni")
 import("${chip_root}/config/standalone/args.gni")
-import("${chip_root}/src/platform/silabs/EFR32/args.gni")
+import("${chip_root}/src/platform/silabs/SiWx917/args.gni")
 
 efr32_sdk_target = get_label_info(":sdk", "label_no_toolchain")
 
diff --git a/examples/lighting-app/silabs/SiWx917/build_for_wifi_args.gni b/examples/lighting-app/silabs/SiWx917/build_for_wifi_args.gni
index 363d2be..8a0192c 100644
--- a/examples/lighting-app/silabs/SiWx917/build_for_wifi_args.gni
+++ b/examples/lighting-app/silabs/SiWx917/build_for_wifi_args.gni
@@ -17,7 +17,7 @@
 
 efr32_sdk_target = get_label_info(":sdk", "label_no_toolchain")
 chip_enable_openthread = false
-import("${chip_root}/src/platform/silabs/EFR32/wifi_args.gni")
+import("${chip_root}/src/platform/silabs/SiWx917/wifi_args.gni")
 
 chip_enable_ota_requestor = true
 
diff --git a/examples/lighting-app/silabs/SiWx917/include/AppConfig.h b/examples/lighting-app/silabs/SiWx917/include/AppConfig.h
index ffadaf9..b86af8b 100644
--- a/examples/lighting-app/silabs/SiWx917/include/AppConfig.h
+++ b/examples/lighting-app/silabs/SiWx917/include/AppConfig.h
@@ -19,7 +19,7 @@
 
 #pragma once
 
-#include "efr32_utils.h"
+#include "siwx917_utils.h"
 
 // ---- Lighting Example App Config ----
 
diff --git a/examples/lighting-app/silabs/SiWx917/include/AppTask.h b/examples/lighting-app/silabs/SiWx917/include/AppTask.h
index df80995..225b726 100644
--- a/examples/lighting-app/silabs/SiWx917/include/AppTask.h
+++ b/examples/lighting-app/silabs/SiWx917/include/AppTask.h
@@ -30,7 +30,6 @@
 #include "BaseApplication.h"
 #include "FreeRTOS.h"
 #include "LightingManager.h"
-#include "sl_simple_button_instances.h"
 #include "timers.h" // provides FreeRTOS timer support
 #include <app/clusters/identify-server/identify-server.h>
 #include <ble/BLEEndPoint.h>
@@ -71,16 +70,6 @@
     CHIP_ERROR StartAppTask();
 
     /**
-     * @brief Event handler when a button is pressed
-     * Function posts an event for button processing
-     *
-     * @param buttonHandle APP_LIGHT_SWITCH or APP_FUNCTION_BUTTON
-     * @param btnAction button action - SL_SIMPLE_BUTTON_PRESSED,
-     *                  SL_SIMPLE_BUTTON_RELEASED or SL_SIMPLE_BUTTON_DISABLED
-     */
-    void ButtonEventHandler(const sl_button_t * buttonHandle, uint8_t btnAction) override;
-
-    /**
      * @brief Callback called by the identify-server when an identify command is received
      *
      * @param identify identify structure the command applies on
diff --git a/examples/lighting-app/silabs/SiWx917/src/AppTask.cpp b/examples/lighting-app/silabs/SiWx917/src/AppTask.cpp
index 9abc9e1..22cab2f 100644
--- a/examples/lighting-app/silabs/SiWx917/src/AppTask.cpp
+++ b/examples/lighting-app/silabs/SiWx917/src/AppTask.cpp
@@ -21,11 +21,6 @@
 #include "AppConfig.h"
 #include "AppEvent.h"
 
-#ifdef ENABLE_WSTK_LEDS
-#include "LEDWidget.h"
-#include "sl_simple_led_instances.h"
-#endif // ENABLE_WSTK_LEDS
-
 #include <app-common/zap-generated/attribute-id.h>
 #include <app-common/zap-generated/attribute-type.h>
 #include <app/clusters/identify-server/identify-server.h>
@@ -43,11 +38,6 @@
 
 #include <platform/CHIPDeviceLayer.h>
 
-#ifdef ENABLE_WSTK_LEDS
-#define SYSTEM_STATE_LED &sl_led_led0
-#define LIGHT_LED &sl_led_led1
-#endif // ENABLE_WSTK_LEDS
-
 #define APP_FUNCTION_BUTTON &sl_button_btn0
 #define APP_LIGHT_SWITCH &sl_button_btn1
 
@@ -56,10 +46,6 @@
 
 namespace {
 
-#ifdef ENABLE_WSTK_LEDS
-LEDWidget sLightLED;
-#endif // ENABLE_WSTK_LEDS
-
 EmberAfIdentifyEffectIdentifier sIdentifyEffect = EMBER_ZCL_IDENTIFY_EFFECT_IDENTIFIER_STOP_EFFECT;
 
 /**********************************************************
@@ -144,19 +130,16 @@
         appError(err);
     }
 
-    err = LightMgr().Init();
-    if (err != CHIP_NO_ERROR)
-    {
-        SILABS_LOG("LightMgr::Init() failed");
-        appError(err);
-    }
+    /* TODO
+        err = LightMgr().Init();
+        if (err != CHIP_NO_ERROR)
+        {
+            SILABS_LOG("LightMgr::Init() failed");
+            appError(err);
+        }
 
-    LightMgr().SetCallbacks(ActionInitiated, ActionCompleted);
-
-#ifdef ENABLE_WSTK_LEDS
-    sLightLED.Init(LIGHT_LED);
-    sLightLED.Set(LightMgr().IsLightOn());
-#endif // ENABLE_WSTK_LEDS
+        LightMgr().SetCallbacks(ActionInitiated, ActionCompleted);
+    */
 
     return err;
 }
@@ -246,39 +229,12 @@
     }
 }
 
-void AppTask::ButtonEventHandler(const sl_button_t * buttonHandle, uint8_t btnAction)
-{
-    if (buttonHandle == NULL)
-    {
-        return;
-    }
-
-    AppEvent button_event           = {};
-    button_event.Type               = AppEvent::kEventType_Button;
-    button_event.ButtonEvent.Action = btnAction;
-
-    if (buttonHandle == APP_LIGHT_SWITCH && btnAction == SL_SIMPLE_BUTTON_PRESSED)
-    {
-        button_event.Handler = LightActionEventHandler;
-        sAppTask.PostEvent(&button_event);
-    }
-    else if (buttonHandle == APP_FUNCTION_BUTTON)
-    {
-        button_event.Handler = BaseApplication::ButtonHandler;
-        sAppTask.PostEvent(&button_event);
-    }
-}
-
 void AppTask::ActionInitiated(LightingManager::Action_t aAction, int32_t aActor)
 {
     // Action initiated, update the light led
     bool lightOn = aAction == LightingManager::ON_ACTION;
     SILABS_LOG("Turning light %s", (lightOn) ? "On" : "Off")
 
-#ifdef ENABLE_WSTK_LEDS
-    sLightLED.Set(lightOn);
-#endif // ENABLE_WSTK_LEDS
-
 #ifdef DISPLAY_ENABLED
     sAppTask.GetLCD().WriteDemoUI(lightOn);
 #endif
diff --git a/examples/lighting-app/silabs/SiWx917/src/main.cpp b/examples/lighting-app/silabs/SiWx917/src/main.cpp
index 2594f6f..e3ed2a9 100644
--- a/examples/lighting-app/silabs/SiWx917/src/main.cpp
+++ b/examples/lighting-app/silabs/SiWx917/src/main.cpp
@@ -20,14 +20,13 @@
 #include <AppTask.h>
 
 #include "AppConfig.h"
-#include "init_efrPlatform.h"
-#include "sl_simple_button_instances.h"
-#include "sl_system_kernel.h"
+#include "init_ccpPlatform.h"
+
 #include <DeviceInfoProviderImpl.h>
 #include <app/server/Server.h>
 #include <credentials/DeviceAttestationCredsProvider.h>
 #include <matter_config.h>
-#ifdef EFR32_ATTESTATION_CREDENTIALS
+#ifdef SI917_ATTESTATION_CREDENTIALS
 #include <examples/platform/silabs/SilabsDeviceAttestationCreds.h>
 #else
 #include <credentials/examples/DeviceAttestationCredsExample.h>
@@ -49,16 +48,18 @@
 // ================================================================================
 int main(void)
 {
-    init_efrPlatform();
-    if (EFR32MatterConfig::InitMatter(BLE_DEV_NAME) != CHIP_NO_ERROR)
+    init_ccpPlatform();
+    if (SI917MatterConfig::InitMatter(BLE_DEV_NAME) != CHIP_NO_ERROR)
+    {
         appError(CHIP_ERROR_INTERNAL);
+    }
 
     gExampleDeviceInfoProvider.SetStorageDelegate(&chip::Server::GetInstance().GetPersistentStorage());
     chip::DeviceLayer::SetDeviceInfoProvider(&gExampleDeviceInfoProvider);
 
     chip::DeviceLayer::PlatformMgr().LockChipStack();
     // Initialize device attestation config
-#ifdef EFR32_ATTESTATION_CREDENTIALS
+#ifdef SI917_ATTESTATION_CREDENTIALS
     SetDeviceAttestationCredentialsProvider(Silabs::GetSilabsDacProvider());
 #else
     SetDeviceAttestationCredentialsProvider(Examples::GetExampleDACProvider());
@@ -67,18 +68,15 @@
 
     SILABS_LOG("Starting App Task");
     if (AppTask::GetAppTask().StartAppTask() != CHIP_NO_ERROR)
+    {
         appError(CHIP_ERROR_INTERNAL);
+    }
 
     SILABS_LOG("Starting FreeRTOS scheduler");
-    sl_system_kernel_start();
+    vTaskStartScheduler();
 
     // Should never get here.
     chip::Platform::MemoryShutdown();
     SILABS_LOG("vTaskStartScheduler() failed");
     appError(CHIP_ERROR_INTERNAL);
 }
-
-void sl_button_on_change(const sl_button_t * handle)
-{
-    AppTask::GetAppTask().ButtonEventHandler(handle, sl_button_get_state(handle));
-}
diff --git a/examples/lighting-app/silabs/SiWx917/with_pw_rpc.gni b/examples/lighting-app/silabs/SiWx917/with_pw_rpc.gni
index 40a8bb7..3e2b6e5 100644
--- a/examples/lighting-app/silabs/SiWx917/with_pw_rpc.gni
+++ b/examples/lighting-app/silabs/SiWx917/with_pw_rpc.gni
@@ -17,7 +17,7 @@
 
 import("//build_overrides/chip.gni")
 import("${chip_root}/config/efr32/lib/pw_rpc/pw_rpc.gni")
-import("${chip_root}/examples/platform/silabs/efr32/args.gni")
+import("${chip_root}/examples/platform/silabs/SiWx917/args.gni")
 
 efr32_sdk_target = get_label_info(":sdk", "label_no_toolchain")
 
diff --git a/examples/platform/silabs/SiWx917/BUILD.gn b/examples/platform/silabs/SiWx917/BUILD.gn
index dbd8473..990a43d 100644
--- a/examples/platform/silabs/SiWx917/BUILD.gn
+++ b/examples/platform/silabs/SiWx917/BUILD.gn
@@ -16,7 +16,7 @@
 import("//build_overrides/efr32_sdk.gni")
 import("${chip_root}/src/lib/lib.gni")
 import("${chip_root}/src/platform/device.gni")
-import("${efr32_sdk_build_root}/efr32_sdk.gni")
+import("${efr32_sdk_build_root}/SiWx917_sdk.gni")
 
 config("chip_examples_project_config") {
   include_dirs = [ "project_include" ]
@@ -40,22 +40,6 @@
   ]
 }
 
-source_set("openthread_core_config_efr32_chip_examples") {
-  if (chip_enable_openthread) {
-    sources = [ "project_include/OpenThreadConfig.h" ]
-
-    public_deps = [ "${efr32_sdk_build_root}:efr32_sdk" ]
-
-    if (use_silabs_thread_lib) {
-      public_deps += [ "${efr32_sdk_build_root}:openthread_core_config_efr32" ]
-    } else {
-      public_deps += [ "${chip_root}/third_party/openthread/platforms/efr32:openthread_core_config_efr32" ]
-    }
-
-    public_configs = [ ":chip_examples_project_config" ]
-  }
-}
-
 source_set("efr-matter-shell") {
   if (chip_build_libshell) {
     defines = [ "ENABLE_CHIP_SHELL" ]
@@ -75,8 +59,8 @@
   include_dirs = [ "${chip_root}" ]
 
   defines = [
-    # Set to 1 to enable EFR32 attestation credentials
-    "EFR32_ATTESTATION_CREDENTIALS",
+    # Set to 1 to enable SI917 attestation credentials
+    "SI917_ATTESTATION_CREDENTIALS",
   ]
 }
 
@@ -96,8 +80,8 @@
 
 source_set("efr32-factory-data-provider") {
   sources = [
-    "EFR32DeviceDataProvider.cpp",
-    "EFR32DeviceDataProvider.h",
+    "SiWx917DeviceDataProvider.cpp",
+    "SiWx917DeviceDataProvider.h",
   ]
 
   public_deps = [
diff --git a/examples/platform/silabs/SiWx917/BaseApplication.cpp b/examples/platform/silabs/SiWx917/BaseApplication.cpp
index a9ecfc6..b401c18 100644
--- a/examples/platform/silabs/SiWx917/BaseApplication.cpp
+++ b/examples/platform/silabs/SiWx917/BaseApplication.cpp
@@ -25,11 +25,6 @@
 #include "AppEvent.h"
 #include "AppTask.h"
 
-#ifdef ENABLE_WSTK_LEDS
-#include "LEDWidget.h"
-#include "sl_simple_led_instances.h"
-#endif // ENABLE_WSTK_LEDS
-
 #ifdef DISPLAY_ENABLED
 #include "lcd.h"
 #ifdef QR_CODE_ENABLED
@@ -37,7 +32,7 @@
 #endif // QR_CODE_ENABLED
 #endif // DISPLAY_ENABLED
 
-#include "EFR32DeviceDataProvider.h"
+#include "SiWx917DeviceDataProvider.h"
 #include <app-common/zap-generated/attribute-id.h>
 #include <app-common/zap-generated/attribute-type.h>
 #include <app/server/OnboardingCodesUtil.h>
@@ -49,12 +44,6 @@
 #include <setup_payload/QRCodeSetupPayloadGenerator.h>
 #include <setup_payload/SetupPayload.h>
 
-#if CHIP_ENABLE_OPENTHREAD
-#include <platform/OpenThread/OpenThreadUtils.h>
-#include <platform/ThreadStackManager.h>
-#include <platform/silabs/ThreadStackManagerImpl.h>
-#endif // CHIP_ENABLE_OPENTHREAD
-
 #ifdef SL_WIFI
 #include "wfx_host_events.h"
 #include <app/clusters/network-commissioning/network-commissioning.h>
@@ -74,12 +63,6 @@
 #define APP_EVENT_QUEUE_SIZE 10
 #define EXAMPLE_VENDOR_ID 0xcafe
 
-#ifdef ENABLE_WSTK_LEDS
-#define SYSTEM_STATE_LED &sl_led_led0
-#endif // ENABLE_WSTK_LEDS
-
-#define APP_FUNCTION_BUTTON &sl_button_btn0
-
 using namespace chip;
 using namespace ::chip::DeviceLayer;
 
@@ -95,10 +78,6 @@
 TaskHandle_t sAppTaskHandle;
 QueueHandle_t sAppEventQueue;
 
-#ifdef ENABLE_WSTK_LEDS
-LEDWidget sStatusLED;
-#endif // ENABLE_WSTK_LEDS
-
 #ifdef SL_WIFI
 app::Clusters::NetworkCommissioning::Instance
     sWiFiNetworkCommissioningInstance(0 /* Endpoint Id */, &(NetworkCommissioning::SlWiFiDriver::GetInstance()));
@@ -211,11 +190,6 @@
 
     SILABS_LOG("Current Software Version: %s", CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING);
 
-#ifdef ENABLE_WSTK_LEDS
-    LEDWidget::InitGpio();
-    sStatusLED.Init(SYSTEM_STATE_LED);
-#endif // ENABLE_WSTK_LEDS
-
     ConfigurationMgr().LogDeviceConfig();
 
     // Create buffer for QR code that can fit max size and null terminator.
@@ -271,13 +245,6 @@
 #endif // CHIP_DEVICE_CONFIG_ENABLE_SED
 
         mFunction = kFunction_FactoryReset;
-
-#ifdef ENABLE_WSTK_LEDS
-        // Turn off all LEDs before starting blink to make sure blink is
-        // co-ordinated.
-        sStatusLED.Set(false);
-        sStatusLED.Blink(500);
-#endif // ENABLE_WSTK_LEDS
     }
     else if (mFunctionTimerActive && mFunction == kFunction_FactoryReset)
     {
@@ -329,133 +296,6 @@
     // the LEDs at an even rate of 100ms.
     //
     // Otherwise, blink the LED ON for a very short time.
-    if (mFunction != kFunction_FactoryReset)
-    {
-        if ((gIdentifyptr != nullptr) && (gIdentifyptr->mActive))
-        {
-#ifdef ENABLE_WSTK_LEDS
-            sStatusLED.Blink(250, 250);
-#endif // ENABLE_WSTK_LEDS
-        }
-        else if (sIdentifyEffect != EMBER_ZCL_IDENTIFY_EFFECT_IDENTIFIER_STOP_EFFECT)
-        {
-            if (sIdentifyEffect == EMBER_ZCL_IDENTIFY_EFFECT_IDENTIFIER_BLINK)
-            {
-#ifdef ENABLE_WSTK_LEDS
-                sStatusLED.Blink(50, 50);
-#endif // ENABLE_WSTK_LEDS
-            }
-            if (sIdentifyEffect == EMBER_ZCL_IDENTIFY_EFFECT_IDENTIFIER_BREATHE)
-            {
-#ifdef ENABLE_WSTK_LEDS
-                sStatusLED.Blink(1000, 1000);
-#endif // ENABLE_WSTK_LEDS
-            }
-            if (sIdentifyEffect == EMBER_ZCL_IDENTIFY_EFFECT_IDENTIFIER_OKAY)
-            {
-#ifdef ENABLE_WSTK_LEDS
-                sStatusLED.Blink(300, 700);
-#endif // ENABLE_WSTK_LEDS
-            }
-        }
-#if !(defined(CHIP_DEVICE_CONFIG_ENABLE_SED) && CHIP_DEVICE_CONFIG_ENABLE_SED)
-        else if (sIsProvisioned && sIsEnabled)
-        {
-            if (sIsAttached)
-            {
-#ifdef ENABLE_WSTK_LEDS
-                sStatusLED.Set(true);
-#endif // ENABLE_WSTK_LEDS
-            }
-            else
-            {
-#ifdef ENABLE_WSTK_LEDS
-                sStatusLED.Blink(950, 50);
-#endif
-            }
-        }
-        else if (sHaveBLEConnections)
-        {
-#ifdef ENABLE_WSTK_LEDS
-            sStatusLED.Blink(100, 100);
-#endif // ENABLE_WSTK_LEDS
-        }
-        else
-        {
-#ifdef ENABLE_WSTK_LEDS
-            sStatusLED.Blink(50, 950);
-#endif // ENABLE_WSTK_LEDS
-        }
-#endif // CHIP_DEVICE_CONFIG_ENABLE_SED
-    }
-
-#ifdef ENABLE_WSTK_LEDS
-    sStatusLED.Animate();
-#endif // ENABLE_WSTK_LEDS
-}
-
-void BaseApplication::ButtonHandler(AppEvent * aEvent)
-{
-    // To trigger software update: press the APP_FUNCTION_BUTTON button briefly (<
-    // FACTORY_RESET_TRIGGER_TIMEOUT) To initiate factory reset: press the
-    // APP_FUNCTION_BUTTON for FACTORY_RESET_TRIGGER_TIMEOUT +
-    // FACTORY_RESET_CANCEL_WINDOW_TIMEOUT All LEDs start blinking after
-    // FACTORY_RESET_TRIGGER_TIMEOUT to signal factory reset has been initiated.
-    // To cancel factory reset: release the APP_FUNCTION_BUTTON once all LEDs
-    // start blinking within the FACTORY_RESET_CANCEL_WINDOW_TIMEOUT
-    if (aEvent->ButtonEvent.Action == SL_SIMPLE_BUTTON_PRESSED)
-    {
-        if (!mFunctionTimerActive && mFunction == kFunction_NoneSelected)
-        {
-            StartFunctionTimer(FACTORY_RESET_TRIGGER_TIMEOUT);
-            mFunction = kFunction_StartBleAdv;
-        }
-    }
-    else
-    {
-        // If the button was released before factory reset got initiated, open the commissioning window and start BLE advertissement
-        // in fast mode
-        if (mFunctionTimerActive && mFunction == kFunction_StartBleAdv)
-        {
-            CancelFunctionTimer();
-            mFunction = kFunction_NoneSelected;
-
-#ifdef QR_CODE_ENABLED
-            // TOGGLE QRCode/LCD demo UI
-            slLCD.ToggleQRCode();
-#endif
-
-#ifdef SL_WIFI
-            if (!ConnectivityMgr().IsWiFiStationProvisioned())
-#else
-            if (!ConnectivityMgr().IsThreadProvisioned())
-#endif /* !SL_WIFI */
-            {
-                // Open Basic CommissioningWindow. Will start BLE advertisements
-                chip::DeviceLayer::PlatformMgr().LockChipStack();
-                CHIP_ERROR err = chip::Server::GetInstance().GetCommissioningWindowManager().OpenBasicCommissioningWindow();
-                chip::DeviceLayer::PlatformMgr().UnlockChipStack();
-                if (err != CHIP_NO_ERROR)
-                {
-                    SILABS_LOG("Failed to open the Basic Commissioning Window");
-                }
-            }
-            else { SILABS_LOG("Network is already provisioned, Ble advertissement not enabled"); }
-        }
-        else if (mFunctionTimerActive && mFunction == kFunction_FactoryReset)
-        {
-            CancelFunctionTimer();
-
-#if CHIP_DEVICE_CONFIG_ENABLE_SED == 1
-            StopStatusLEDTimer();
-#endif
-
-            // Change the function to none selected since factory reset has been
-            // canceled.
-            mFunction = kFunction_NoneSelected;
-            SILABS_LOG("Factory Reset has been Canceled");
-        }
-    }
 }
 
 void BaseApplication::CancelFunctionTimer()
@@ -500,9 +340,6 @@
 
 void BaseApplication::StopStatusLEDTimer()
 {
-#ifdef ENABLE_WSTK_LEDS
-    sStatusLED.Set(false);
-#endif // ENABLE_WSTK_LEDS
 
     if (xTimerStop(sLightTimer, 100) != pdPASS)
     {
diff --git a/examples/platform/silabs/SiWx917/BaseApplication.h b/examples/platform/silabs/SiWx917/BaseApplication.h
index febd7aa..2c0e07e 100644
--- a/examples/platform/silabs/SiWx917/BaseApplication.h
+++ b/examples/platform/silabs/SiWx917/BaseApplication.h
@@ -28,7 +28,6 @@
 
 #include "AppEvent.h"
 #include "FreeRTOS.h"
-#include "sl_simple_button_instances.h"
 #include "timers.h" // provides FreeRTOS timer support
 #include <app/clusters/identify-server/identify-server.h>
 #include <ble/BLEEndPoint.h>
@@ -89,16 +88,6 @@
 #endif
 
     /**
-     * @brief Event handler when a button is pressed
-     * Function posts an event for button processing
-     *
-     * @param buttonHandle APP_LIGHT_SWITCH or APP_FUNCTION_BUTTON
-     * @param btnAction button action - SL_SIMPLE_BUTTON_PRESSED,
-     *                  SL_SIMPLE_BUTTON_RELEASED or SL_SIMPLE_BUTTON_DISABLED
-     */
-    virtual void ButtonEventHandler(const sl_button_t * buttonHandle, uint8_t btnAction) = 0;
-
-    /**
      * @brief Function called to start the LED light timer
      */
     static void StartStatusLEDTimer(void);
diff --git a/examples/platform/silabs/SiWx917/FreeRTOSConfig.h b/examples/platform/silabs/SiWx917/FreeRTOSConfig.h
index 50f4c24..02b441e 100644
--- a/examples/platform/silabs/SiWx917/FreeRTOSConfig.h
+++ b/examples/platform/silabs/SiWx917/FreeRTOSConfig.h
@@ -107,20 +107,6 @@
 
 #include <stdint.h>
 
-#include "RTE_Components.h"
-#include CMSIS_device_header
-
-#include "em_assert.h"
-#include "em_device.h"
-
-#if defined(SL_COMPONENT_CATALOG_PRESENT)
-#include "sl_component_catalog.h"
-#endif
-
-#if SL_SYSTEM_VIEW
-#include "SEGGER_SYSVIEW_FreeRTOS.h"
-#endif
-
 /*-----------------------------------------------------------
  * Application specific definitions.
  *
@@ -133,6 +119,8 @@
  * See http://www.freertos.org/a00110.html.
  *----------------------------------------------------------*/
 
+extern uint32_t SystemCoreClock;
+
 /* Energy saving modes. */
 #if defined(SL_CATALOG_POWER_MANAGER_PRESENT)
 #define configUSE_TICKLESS_IDLE 1
@@ -148,7 +136,7 @@
 #define configUSE_TICK_HOOK (1)
 #define configCHECK_FOR_STACK_OVERFLOW (2)
 #define configUSE_MALLOC_FAILED_HOOK (1)
-#define configUSE_IDLE_HOOK (1)
+#define configUSE_IDLE_HOOK (0)
 
 /* Main functions*/
 /* Run time stats gathering related definitions. */
@@ -185,13 +173,7 @@
 #define configUSE_TICKLESS_IDLE_SIMPLE_DEBUG (1) /* See into vPortSuppressTicksAndSleep source code for explanation */
 #define configMAX_PRIORITIES (56)
 #define configMINIMAL_STACK_SIZE (320) /* Number of words to use for Idle and Timer stacks */
-
-#ifdef HEAP_MONITORING
-#define configMAX_TASK_NAME_LEN (24)
-#else
 #define configMAX_TASK_NAME_LEN (10)
-#endif // HEAP_MONITORING
-
 #define configUSE_16_BIT_TICKS (0)
 #define configIDLE_SHOULD_YIELD (1)
 #define configUSE_MUTEXES (1)
@@ -207,11 +189,7 @@
 #define configSUPPORT_DYNAMIC_ALLOCATION (1)
 
 #ifndef configTOTAL_HEAP_SIZE
-#ifdef SL_WIFI
 #define configTOTAL_HEAP_SIZE ((size_t)(34 * 1024))
-#else
-#define configTOTAL_HEAP_SIZE ((size_t)(20 * 1024))
-#endif
 #endif // configTOTAL_HEAP_SIZE
 
 /* Optional functions - most linkers will remove unused functions anyway. */
diff --git a/examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal.h b/examples/platform/silabs/SiWx917/SiWx917/hal/rsi_hal.h
similarity index 94%
rename from examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal.h
rename to examples/platform/silabs/SiWx917/SiWx917/hal/rsi_hal.h
index 4e19543..8e4e6e2 100644
--- a/examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal.h
+++ b/examples/platform/silabs/SiWx917/SiWx917/hal/rsi_hal.h
@@ -54,12 +54,6 @@
 // Macro to drive high value on GPIO
 #define RSI_HAL_GPIO_HIGH 1
 
-// Macro to drive LDMA channel number
-#define RSI_LDMA_TRANSFER_CHANNEL_NUM 3
-
-// Macro to drive semaphore block minimun timer in milli seconds
-#define RSI_SEM_BLOCK_MIN_TIMER_VALUE_MS 50
-
 /******************************************************
  * *               Function Declarations
  * ******************************************************/
diff --git a/examples/platform/silabs/SiWx917/SiWx917/hal/rsi_hal_mcu_platform_init.c b/examples/platform/silabs/SiWx917/SiWx917/hal/rsi_hal_mcu_platform_init.c
new file mode 100644
index 0000000..b2effb5
--- /dev/null
+++ b/examples/platform/silabs/SiWx917/SiWx917/hal/rsi_hal_mcu_platform_init.c
@@ -0,0 +1,113 @@
+/*
+ *
+ *    Copyright (c) 2022 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.
+ */
+
+/**
+ * Includes
+ */
+#include "rsi_board.h"
+#include "rsi_pll.h"
+#include "rsi_rom_clks.h"
+#include "siwx917_utils.h"
+#include "system_RS1xxxx.h"
+
+#define SOC_PLL_REF_FREQUENCY 32000000 /* PLL input REFERENCE clock 32MHZ */
+
+// Note: Change this macro to required PLL frequency in hertz
+#define PS4_SOC_FREQ 80000000 /* PLL out clock 80MHz */
+#define SWITCH_QSPI_TO_SOC_PLL
+#define ICACHE_DISABLE
+#define DEBUG_DISABLE
+
+#define PMU_GOOD_TIME 31  /*Duration in us*/
+#define XTAL_GOOD_TIME 31 /*Duration in us*/
+
+/*Pre-fetch and regestring */
+#define ICACHE2_ADDR_TRANSLATE_1_REG *(volatile uint32_t *) (0x20280000 + 0x24)
+#define MISC_CFG_SRAM_REDUNDANCY_CTRL *(volatile uint32_t *) (0x46008000 + 0x18)
+#define MISC_CONFIG_MISC_CTRL1 *(volatile uint32_t *) (0x46008000 + 0x44)
+#define MISC_QUASI_SYNC_MODE *(volatile uint32_t *) (0x46008000 + 0x84)
+
+/**
+ * @fn           void soc_pll_config()
+ * @brief        This function to configure clock for SiWx917 SoC (80MHz)
+ *               Configure the PLL frequency and Switch M4 clock to PLL clock for speed operations
+ *
+ * @param[in]    none
+ * @param[out]   none
+ * @return       int
+ * @section description
+ * configure clock for SiWx917 SoC
+ *
+ */
+int soc_pll_config(void)
+{
+    RSI_CLK_SocPllLockConfig(1, 1, 7);
+
+    RSI_CLK_SocPllRefClkConfig(2);
+
+    RSI_CLK_M4SocClkConfig(M4CLK, M4_ULPREFCLK, 0);
+
+    /*Enable fre-fetch and register if SOC-PLL frequency is more than or equal to 120M*/
+#if (PS4_SOC_FREQ >= 120000000)
+    ICACHE2_ADDR_TRANSLATE_1_REG  = BIT(21);
+    MISC_CFG_SRAM_REDUNDANCY_CTRL = BIT(4);
+    MISC_CONFIG_MISC_CTRL1 |= BIT(4);
+#if !(defined WISE_AOC_4)
+    MISC_QUASI_SYNC_MODE |= BIT(6);
+    MISC_QUASI_SYNC_MODE |= (BIT(6) | BIT(7));
+#endif /* !WISE_AOC_4 */
+#endif /* (PS4_SOC_FREQ > 120000000) */
+
+    RSI_CLK_SetSocPllFreq(M4CLK, PS4_SOC_FREQ, SOC_PLL_REF_FREQUENCY);
+
+    RSI_CLK_M4SocClkConfig(M4CLK, M4_SOCPLLCLK, 0);
+
+#ifdef SWITCH_QSPI_TO_SOC_PLL
+    RSI_CLK_QspiClkConfig(M4CLK, QSPI_INTFPLLCLK, 0, 0, 0);
+#endif /* SWITCH_QSPI_TO_SOC_PLL */
+
+    return 0;
+}
+
+/*==============================================*/
+/**
+ * @fn           void rsi_hal_board_init()
+ * @brief        This function Initializes the platform
+ * @param[in]    none
+ * @param[out]   none
+ * @return       none
+ * @section description
+ * This function initializes the platform
+ *
+ */
+void rsi_hal_board_init(void)
+{
+    SystemCoreClockUpdate();
+
+    /* configure clock for SiWx917 SoC */
+    soc_pll_config();
+    SILABS_LOG("%s, soc_pll_config, SystemCoreClock=%d\n", __func__, SystemCoreClock);
+
+#ifdef COMMON_FLASH_EN
+    /* Before TA going to power save mode ,set m4ss_ref_clk_mux_ctrl ,tass_ref_clk_mux_ctrl,
+    AON domain power supply controls form TA to M4 */
+    RSI_Set_Cntrls_To_M4();
+#endif
+#ifdef DEBUG_UART
+    DEBUGINIT();
+#endif
+}
diff --git a/examples/platform/silabs/SiWx917/SiWx917/hal/rsi_hal_mcu_timer.c b/examples/platform/silabs/SiWx917/SiWx917/hal/rsi_hal_mcu_timer.c
new file mode 100644
index 0000000..e7141d4
--- /dev/null
+++ b/examples/platform/silabs/SiWx917/SiWx917/hal/rsi_hal_mcu_timer.c
@@ -0,0 +1,221 @@
+/*
+ *
+ *    Copyright (c) 2022 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.
+ */
+
+/**
+ * Includes
+ */
+
+#include "rsi_driver.h"
+#ifdef RSI_WITH_OS
+/* FreeRTOS includes. */
+#include "FreeRTOS.h"
+#include "StackMacros.h"
+#include "task.h"
+#include "timers.h"
+
+#if defined(SysTick)
+#undef SysTick_Handler
+/* FreeRTOS SysTick interrupt handler prototype */
+extern void SysTick_Handler(void);
+/* FreeRTOS tick timer interrupt handler prototype */
+extern void xPortSysTickHandler(void);
+#endif /* SysTick */
+#endif
+
+static volatile uint32_t _dwTickCount; // systick cout variable
+
+/*===================================================*/
+/**
+ * @fn           int32_t rsi_timer_start(uint8_t timer_no, uint8_t mode,uint8_t type,uint32_t duration,void (*
+ * rsi_timer_expiry_handler)())
+ * @brief        Starts and configures timer
+ * @param[in]    timer_node, timer node to be configured.
+ * @param[in]    mode , mode of the timer
+ *               0 - Micro seconds mode
+ *               1 - Milli seconds mode
+ * @param[in]    type, type of  the timer
+ *               0 - single shot type
+ *               1 - periodic type
+ * @param[in]    duration, timer duration
+ * @param[in]    rsi_timer_expiry_handler() ,call back function to handle timer interrupt
+ * @param[out]   none
+ * @return       0 - success
+ *               !0 - Failure
+ * @description  This HAL API should contain the code to initialize the timer and start the timer
+ *
+ */
+
+int32_t rsi_timer_start(uint8_t timer_node, uint8_t mode, uint8_t type, uint32_t duration, void (*rsi_timer_expiry_handler)(void))
+{
+
+    //! Initialise the timer
+
+    //! register the call back
+
+    //! Start timer
+
+    return 0;
+}
+
+/*===================================================*/
+/**
+ * @fn           int32_t rsi_timer_stop(uint8_t timer_no)
+ * @brief        Stops timer
+ * @param[in]    timer_node, timer node to stop
+ * @param[out]   none
+ * @return       0 - success
+ *               !0 - Failure
+ * @description  This HAL API should contain the code to stop the timer
+ *
+ */
+
+int32_t rsi_timer_stop(uint8_t timer_node)
+{
+
+    //! Stop the timer
+
+    return 0;
+}
+
+/*===================================================*/
+/**
+ * @fn           uint32_t rsi_timer_read(uint8_t timer_node)
+ * @brief        read timer
+ * @param[in]    timer_node, timer node to read
+ * @param[out]   none
+ * @return       timer value
+ * @description  This HAL API should contain API to  read the timer
+ *
+ */
+
+uint32_t rsi_timer_read(uint8_t timer_node)
+{
+
+    volatile uint32_t timer_val = 0;
+
+    //! read the timer and return timer value
+
+    return timer_val;
+}
+
+/*===================================================*/
+/**
+ * @fn           void rsi_delay_us(uint32_t delay)
+ * @brief        create delay in micro seconds
+ * @param[in]    delay_us, timer delay in micro seconds
+ * @param[out]   none
+ * @return       none
+ * @description  This HAL API should contain the code to create delay in micro seconds
+ *
+ */
+void rsi_delay_us(uint32_t delay_us)
+{
+
+    //! call the API for delay in micro seconds
+
+    return;
+}
+
+/*===================================================*/
+/**
+ * @fn           void rsi_delay_ms(uint32_t delay)
+ * @brief        create delay in micro seconds
+ * @param[in]    delay, timer delay in micro seconds
+ * @param[out]   none
+ * @return       none
+ * @description  This HAL API should contain the code to create delay in micro seconds
+ *
+ */
+void rsi_delay_ms1(uint32_t delay_ms)
+{
+
+    //! call the API for delay in milli seconds
+
+    return;
+}
+
+/*===================================================*/
+/**
+ * @fn           void SysTick_Handler(void);
+ * @brief        systick cout variable
+ * @param[in]    none
+ * @param[out]   none
+ * @return       none
+ * @description  This HAL API is systick cout variable
+ *
+ */
+
+void SysTick_Handler(void)
+{
+    _dwTickCount++;
+#ifdef RSI_WITH_OS
+    if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
+    {
+        xPortSysTickHandler();
+    }
+#endif
+}
+/*===================================================*/
+/**
+ * @fn           uint32_t GetTickCount( void )
+ * @brief        gets the tick count from systic ISR
+ * @param[in]    delay, timer delay in micro seconds
+ * @param[out]   none
+ * @return       Returns the systick current tick count
+ * @description  This HAL API gets the tick count from systic ISR
+ *
+ */
+
+uint32_t GetTickCount(void)
+{
+    return _dwTickCount; // gets the tick count from systic ISR
+}
+
+/*===================================================*/
+/**
+ * @fn           void rsi_delay_ms(uint32_t delay)
+ * @brief        create delay in milli seconds
+ * @param[in]    delay, timer delay in milli seconds
+ * @param[out]   none
+ * @return       none
+ * @description  This HAL API should contain the code to create delay in milli seconds
+ *
+ */
+
+void rsi_delay_ms(uint32_t delay_ms)
+{
+    uint64_t waitTime = rsi_hal_gettickcount() + delay_ms;
+
+    while (waitTime > rsi_hal_gettickcount())
+    {
+        // we busy wait
+    }
+}
+
+/*===================================================*/
+/**
+ * @fn           uint32_t rsi_hal_gettickcount()
+ * @brief        provides a tick value in milliseconds
+ * @return       tick value
+ * @description  This HAL API should contain the code to read the timer tick count value in milliseconds
+ *
+ */
+
+uint32_t rsi_hal_gettickcount(void)
+{
+    return GetTickCount();
+}
diff --git a/examples/platform/silabs/SiWx917/SiWx917/rs911x.gni b/examples/platform/silabs/SiWx917/SiWx917/rs911x.gni
new file mode 100644
index 0000000..0cca175
--- /dev/null
+++ b/examples/platform/silabs/SiWx917/SiWx917/rs911x.gni
@@ -0,0 +1,144 @@
+import("//build_overrides/chip.gni")
+import("//build_overrides/efr32_sdk.gni")
+import("//build_overrides/pigweed.gni")
+
+examples_plat_dir = "${chip_root}/examples/platform/silabs/SiWx917"
+wifi_sdk_dir = "${chip_root}/src/platform/silabs/SiWx917/wifi"
+wiseconnect_sdk_root = "${chip_root}/third_party/silabs/wisemcu-wifi-bt-sdk"
+rs911x_cflags = []
+
+rs911x_src_plat = [
+  "${examples_plat_dir}/SiWx917/rsi_if.c",
+  "${examples_plat_dir}/SiWx917/wfx_rsi_host.c",
+  "${wifi_sdk_dir}/wfx_notify.cpp",
+
+  "${examples_plat_dir}/SiWx917/hal/rsi_hal_mcu_timer.c",
+  "${examples_plat_dir}/SiWx917/hal/rsi_hal_mcu_platform_init.c",
+
+  "${wiseconnect_sdk_root}/platforms/si91x/hal/src/rsi_bootup_config.c",
+  "${wiseconnect_sdk_root}/platforms/si91x/hal/src/rsi_hal_mcu_m4.c",
+  "${wiseconnect_sdk_root}/platforms/si91x/hal/src/rsi_hal_mcu_m4_rom.c",
+  "${wiseconnect_sdk_root}/platforms/si91x/hal/src/rsi_hal_mcu_interrupt.c",
+]
+rs911x_plat_incs = [
+  "${wifi_sdk_dir}",
+  "${wifi_sdk_dir}/hal",
+  "${wiseconnect_sdk_root}/platforms/si91x/hal/inc",
+
+  #  "${wiseconnect_sdk_root}/sapi/include",
+  "${chip_root}/src/platform/silabs/SiWx917",
+  "${chip_root}/src/platform/silabs/SiWx917/bluetooth",
+  "${examples_plat_dir}/SiWx917",
+  "${wiseconnect_sdk_root}/platforms/si91x/hal/inc",
+]
+
+#
+# All the stuff from wiseconnect
+#
+rs911x_src_sapi = [
+  "${wiseconnect_sdk_root}/sapi/wlan/rsi_wlan_apis.c",
+  "${wiseconnect_sdk_root}/sapi/common/rsi_apis_non_rom.c",
+  "${wiseconnect_sdk_root}/sapi/common/rsi_apis_rom.c",
+  "${wiseconnect_sdk_root}/sapi/common/rsi_common_apis.c",
+  "${wiseconnect_sdk_root}/sapi/common/rsi_device_init_apis.c",
+
+  #  "${wiseconnect_sdk_root}/sapi/common/rsi_wisemcu_hardware_setup.c",
+  "${wiseconnect_sdk_root}/sapi/driver/device_interface/spi/rsi_spi_frame_rd_wr.c",
+  "${wiseconnect_sdk_root}/sapi/driver/device_interface/spi/rsi_spi_functs.c",
+  "${wiseconnect_sdk_root}/sapi/driver/device_interface/spi/rsi_spi_iface_init.c",
+  "${wiseconnect_sdk_root}/sapi/driver/device_interface/spi/rsi_spi_mem_rd_wr.c",
+  "${wiseconnect_sdk_root}/sapi/driver/device_interface/spi/rsi_spi_reg_rd_wr.c",
+  "${wiseconnect_sdk_root}/sapi/driver/rsi_common.c",
+  "${wiseconnect_sdk_root}/sapi/driver/rsi_device_init.c",
+  "${wiseconnect_sdk_root}/sapi/driver/rsi_driver_event_handlers.c",
+  "${wiseconnect_sdk_root}/sapi/driver/rsi_driver.c",
+  "${wiseconnect_sdk_root}/sapi/driver/rsi_events_rom.c",
+  "${wiseconnect_sdk_root}/sapi/driver/rsi_events.c",
+  "${wiseconnect_sdk_root}/sapi/driver/rsi_iap.c",
+  "${wiseconnect_sdk_root}/sapi/driver/rsi_nwk_rom.c",
+  "${wiseconnect_sdk_root}/sapi/driver/rsi_nwk.c",
+  "${wiseconnect_sdk_root}/sapi/driver/rsi_pkt_mgmt_rom.c",
+  "${wiseconnect_sdk_root}/sapi/driver/rsi_pkt_mgmt.c",
+  "${wiseconnect_sdk_root}/sapi/driver/rsi_queue_rom.c",
+  "${wiseconnect_sdk_root}/sapi/driver/rsi_queue.c",
+  "${wiseconnect_sdk_root}/sapi/driver/rsi_scheduler_rom.c",
+  "${wiseconnect_sdk_root}/sapi/driver/rsi_scheduler.c",
+  "${wiseconnect_sdk_root}/sapi/driver/rsi_setregion_countryinfo.c",
+  "${wiseconnect_sdk_root}/sapi/driver/rsi_timer.c",
+  "${wiseconnect_sdk_root}/sapi/driver/rsi_utils_rom.c",
+  "${wiseconnect_sdk_root}/sapi/driver/rsi_utils.c",
+  "${wiseconnect_sdk_root}/sapi/driver/rsi_wlan.c",
+  "${wiseconnect_sdk_root}/sapi/rtos/freertos_wrapper/rsi_os_wrapper.c",
+]
+
+foreach(src_file, rs911x_src_sapi) {
+  rs911x_cflags += [
+    "-Wno-empty-body",
+    "-Wno-cpp",
+    "-Wno-missing-braces",
+    "-Wno-sign-compare",
+    "-Wno-error",
+    "-Wno-unknown-warning-option",
+    "-Wno-unused-variable",
+    "-Wno-implicit-function-declaration",
+    "-Wno-unused-function",
+  ]
+}
+
+rs911x_inc_plat = [
+  "${wifi_sdk_dir}",
+  "${examples_plat_dir}/SiWx917",
+  "${examples_plat_dir}/SiWx917/hal",
+  "${wiseconnect_sdk_root}/sapi/include",
+
+  #CCP Platfrom
+  "${wiseconnect_sdk_root}/platforms/si91x/hal/inc",
+  "${wiseconnect_sdk_root}/platforms/si91x/boards/brd4325a/inc",
+  "${wiseconnect_sdk_root}/platforms/si91x/drivers/peripheral_drivers/inc",
+  "${wiseconnect_sdk_root}/platforms/si91x/drivers/systemlevel/inc",
+  "${wiseconnect_sdk_root}/platforms/si91x/core/chip/inc",
+  "${wiseconnect_sdk_root}/platforms/si91x/core/config",
+  "${wiseconnect_sdk_root}/platforms/si91x/drivers/cmsis_driver/config",
+  "${wiseconnect_sdk_root}/platforms/si91x/drivers/rom_driver/inc",
+  "${wiseconnect_sdk_root}/platforms/si91x/drivers/cmsis_driver",
+  "${wiseconnect_sdk_root}/platforms/si91x/drivers/cmsis_driver/CMSIS/Driver/Include",
+
+  "${wiseconnect_sdk_root}/platforms/si91x/core/cmsis",
+  "${wiseconnect_sdk_root}/platforms/si91x/service/system/inc",
+]
+
+# Apparently - the rsi library needs this
+rs911x_src_sock = [
+  "${wiseconnect_sdk_root}/sapi/network/socket/rsi_socket.c",
+  "${wiseconnect_sdk_root}/sapi/network/socket/rsi_socket_rom.c",
+]
+rs911x_sock_inc = [ "${wifi_sdk_dir}/rsi-sockets" ]
+
+#
+# If we use LWIP - not built-in sockets
+#
+rs911x_src_lwip = [
+  "${wifi_sdk_dir}/ethernetif.cpp",
+  "${wifi_sdk_dir}/dhcp_client.cpp",
+  "${wifi_sdk_dir}/lwip_netif.cpp",
+]
+rs911x_defs = [
+  "CCP_SI917_BRINGUP=1",
+  "SL_HEAP_SIZE=32768",
+  "SL_WIFI=1",
+  "RS911X_WIFI",
+  "RSI_WLAN_ENABLE",
+  "RSI_WITH_OS",
+  "RSI_M4_INTERFACE",  #Enable CCP bus Interface
+  "RSI_WLAN_API_ENABLE",
+  "HMAC_512",
+  "LITTLE_ENDIAN_ORDER",
+  "_CHIP_9118",
+
+  #  "ROM_WIRELESS"
+  #__CC_ARM DEBUG_UART _CHIP_9118   LITTLE_ENDIAN_ORDER HMAC_512
+]
+rs911x_sock_defs = [
+  "RS911X_SOCKETS",
+  "RSI_IPV6_ENABLE",
+]
diff --git a/examples/platform/silabs/SiWx917/rs911x/rsi_if.c b/examples/platform/silabs/SiWx917/SiWx917/rsi_if.c
similarity index 92%
rename from examples/platform/silabs/SiWx917/rs911x/rsi_if.c
rename to examples/platform/silabs/SiWx917/SiWx917/rsi_if.c
index 7d3be40..3b15cd8 100644
--- a/examples/platform/silabs/SiWx917/rs911x/rsi_if.c
+++ b/examples/platform/silabs/SiWx917/SiWx917/rsi_if.c
@@ -19,12 +19,6 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "em_bus.h"
-#include "em_cmu.h"
-#include "em_gpio.h"
-#include "em_ldma.h"
-#include "em_usart.h"
-
 #include "sl_status.h"
 
 #include "FreeRTOS.h"
@@ -38,6 +32,7 @@
 
 #include "rsi_common_apis.h"
 #include "rsi_data_types.h"
+#include "rsi_error.h"
 #include "rsi_nwk.h"
 #include "rsi_socket.h"
 #include "rsi_utils.h"
@@ -46,12 +41,13 @@
 #include "rsi_wlan_config.h"
 //#include "rsi_wlan_non_rom.h"
 #include "rsi_bootup_config.h"
-#include "rsi_error.h"
 
 #include "dhcp_client.h"
-#include "wfx_host_events.h"
 #include "wfx_rsi.h"
 
+#define VAL(str) #str
+#define TOSTRING(str) VAL(str)
+
 /* Rsi driver Task will use as its stack */
 StackType_t driverRsiTaskStack[WFX_RSI_WLAN_TASK_SZ] = { 0 };
 
@@ -107,24 +103,10 @@
  *********************************************************************/
 int32_t wfx_rsi_get_ap_ext(wfx_wifi_scan_ext_t * extra_info)
 {
-    int32_t status;
-    uint8_t buff[RSI_RESPONSE_MAX_SIZE] = { 0 };
-    status                              = rsi_wlan_get(RSI_WLAN_EXT_STATS, buff, sizeof(buff));
-    if (status != RSI_SUCCESS)
-    {
-        WFX_RSI_LOG("\r\n Failed, Error Code : 0x%lX\r\n", status);
-    }
-    else
-    {
-        rsi_wlan_ext_stats_t * test   = (rsi_wlan_ext_stats_t *) buff;
-        extra_info->beacon_lost_count = test->beacon_lost_count - temp_reset->beacon_lost_count;
-        extra_info->beacon_rx_count   = test->beacon_rx_count - temp_reset->beacon_rx_count;
-        extra_info->mcast_rx_count    = test->mcast_rx_count - temp_reset->mcast_rx_count;
-        extra_info->mcast_tx_count    = test->mcast_tx_count - temp_reset->mcast_tx_count;
-        extra_info->ucast_rx_count    = test->ucast_rx_count - temp_reset->ucast_rx_count;
-        extra_info->ucast_tx_count    = test->ucast_tx_count - temp_reset->ucast_tx_count;
-        extra_info->overrun_count     = test->overrun_count - temp_reset->overrun_count;
-    }
+    /* TODO : Place holder until we have similar functionality
+     *        available for SiWx917
+     */
+    int32_t status = 0;
     return status;
 }
 
@@ -138,24 +120,10 @@
  *********************************************************************/
 int32_t wfx_rsi_reset_count()
 {
-    int32_t status;
-    uint8_t buff[RSI_RESPONSE_MAX_SIZE] = { 0 };
-    status                              = rsi_wlan_get(RSI_WLAN_EXT_STATS, buff, sizeof(buff));
-    if (status != RSI_SUCCESS)
-    {
-        WFX_RSI_LOG("\r\n Failed, Error Code : 0x%lX\r\n", status);
-    }
-    else
-    {
-        rsi_wlan_ext_stats_t * test   = (rsi_wlan_ext_stats_t *) buff;
-        temp_reset->beacon_lost_count = test->beacon_lost_count;
-        temp_reset->beacon_rx_count   = test->beacon_rx_count;
-        temp_reset->mcast_rx_count    = test->mcast_rx_count;
-        temp_reset->mcast_tx_count    = test->mcast_tx_count;
-        temp_reset->ucast_rx_count    = test->ucast_rx_count;
-        temp_reset->ucast_tx_count    = test->ucast_tx_count;
-        temp_reset->overrun_count     = test->overrun_count;
-    }
+    /* TODO : Place holder until we have similar functionality
+     *        available for SiWx917
+     */
+    int32_t status = 0;
     return status;
 }
 
@@ -187,8 +155,6 @@
 {
     WFX_RSI_LOG("%s: status: %02x", __func__, status);
     wfx_rsi.dev_state &= ~WFX_RSI_ST_STA_CONNECTING;
-    temp_reset = (wfx_wifi_scan_ext_t *) malloc(sizeof(wfx_wifi_scan_ext_t));
-    memset(temp_reset, 0, sizeof(wfx_wifi_scan_ext_t));
     if (status != RSI_SUCCESS)
     {
         /*
@@ -294,24 +260,7 @@
 {
     int32_t status;
     uint8_t buf[RSI_RESPONSE_HOLD_BUFF_SIZE];
-    extern void rsi_hal_board_init(void);
 
-    WFX_RSI_LOG("%s: starting(HEAP_SZ = %d)", __func__, SL_HEAP_SIZE);
-    //! Driver initialization
-    status = rsi_driver_init(wfx_rsi_drv_buf, WFX_RSI_BUF_SZ);
-    if ((status < RSI_DRIVER_STATUS) || (status > WFX_RSI_BUF_SZ))
-    {
-        WFX_RSI_LOG("%s: error: RSI drv init failed with status: %02x", __func__, status);
-        return status;
-    }
-
-    WFX_RSI_LOG("%s: rsi_device_init", __func__);
-    /* ! Redpine module intialisation */
-    if ((status = rsi_device_init(LOAD_NWP_FW)) != RSI_SUCCESS)
-    {
-        WFX_RSI_LOG("%s: error: rsi_device_init failed with status: %02x", __func__, status);
-        return status;
-    }
     WFX_RSI_LOG("%s: start wireless drv task", __func__);
     /*
      * Create the driver task
@@ -478,6 +427,7 @@
             /* Call rsi connect call with given ssid and password
              * And check there is a success
              */
+
             if ((status = rsi_wlan_connect_async((int8_t *) &wfx_rsi.sec.ssid[0], (rsi_security_mode_t) wfx_rsi.sec.security,
                                                  &wfx_rsi.sec.passkey[0], wfx_rsi_join_cb)) != RSI_SUCCESS)
             {
@@ -485,7 +435,7 @@
                 wfx_rsi.dev_state &= ~WFX_RSI_ST_STA_CONNECTING;
                 WFX_RSI_LOG("%s: rsi_wlan_connect_async failed with status: %02x on try %d", __func__, status,
                             wfx_rsi.join_retries);
-                vTaskDelay(4000);
+                vTaskDelay(400);
                 /* TODO - Start a timer.. to retry */
             }
             else
@@ -501,6 +451,7 @@
         {
             WFX_RSI_LOG("%s: starting JOIN to %s after %d tries\n", __func__, (char *) &wfx_rsi.sec.ssid[0], wfx_rsi.join_retries);
         }
+        WFX_RSI_LOG("Returning the do join");
     }
 }
 
@@ -518,6 +469,7 @@
 void wfx_rsi_task(void * arg)
 {
     EventBits_t flags;
+    int32_t status = 0;
 #ifndef RS911X_SOCKETS
     TickType_t last_dhcp_poll, now;
     struct netif * sta_netif;
@@ -537,6 +489,12 @@
     wfx_started_notify();
 
     WFX_RSI_LOG("%s: starting event wait", __func__);
+#ifdef CHIP_ONNETWORK_PAIRING
+    memcpy(&wfx_rsi.sec.ssid[0], TOSTRING(CHIP_WIFI_SSID), sizeof(TOSTRING(CHIP_WIFI_SSID)));
+    memcpy(&wfx_rsi.sec.passkey[0], TOSTRING(CHIP_WIFI_PSK), sizeof(TOSTRING(CHIP_WIFI_PSK)));
+    xEventGroupSetBits(wfx_rsi.events, WFX_EVT_STA_START_JOIN);
+#endif
+
     for (;;)
     {
         /*
@@ -627,7 +585,7 @@
             // Joining to the network
             wfx_rsi_do_join();
         }
-        if (flags & WFX_EVT_STA_CONN)
+        if ((flags & WFX_EVT_STA_CONN))
         {
             /*
              * Initiate the Join command (assuming we have been provisioned)
@@ -851,4 +809,28 @@
     return status;
 }
 
+int32_t wfx_rsi_init_platform()
+{
+    int32_t status;
+    /*init task - RS911x*/
+    WFX_RSI_LOG("RSI_INIT");
+    WFX_RSI_LOG("%s: starting(HEAP_SZ = %d)", __func__, SL_HEAP_SIZE);
+    //! Driver initialization
+    status = rsi_driver_init(wfx_rsi_drv_buf, WFX_RSI_BUF_SZ);
+    if ((status < RSI_DRIVER_STATUS) || (status > WFX_RSI_BUF_SZ))
+    {
+        WFX_RSI_LOG("%s: error: RSI drv init failed with status: %02x", __func__, status);
+    }
+
+    WFX_RSI_LOG("%s: rsi_device_init", __func__);
+    /* ! Redpine module intialisation */
+    if ((status = rsi_device_init(LOAD_NWP_FW)) != RSI_SUCCESS)
+    {
+        WFX_RSI_LOG("%s: error: rsi_device_init failed with status: %02x", __func__, status);
+        return status;
+    }
+
+    return status;
+}
+
 struct wfx_rsi wfx_rsi;
diff --git a/examples/platform/silabs/SiWx917/rs911x/rsi_wlan_config.h b/examples/platform/silabs/SiWx917/SiWx917/rsi_wlan_config.h
similarity index 84%
rename from examples/platform/silabs/SiWx917/rs911x/rsi_wlan_config.h
rename to examples/platform/silabs/SiWx917/SiWx917/rsi_wlan_config.h
index f2a47b5..4f2dc07 100644
--- a/examples/platform/silabs/SiWx917/rs911x/rsi_wlan_config.h
+++ b/examples/platform/silabs/SiWx917/SiWx917/rsi_wlan_config.h
@@ -25,53 +25,31 @@
 //! Disable feature
 #define RSI_DISABLE 0
 
-//! To enable wlan opermode
-#define RSI_OPERMODE_WLAN 0
-
 //! To enable concurrent mode
 #define CONCURRENT_MODE RSI_DISABLE
 
-//! opermode command parameters
+//! opermode command paramaters
 /*=======================================================================*/
 //! To set wlan feature select bit map
 #define RSI_FEATURE_BIT_MAP (FEAT_SECURITY_OPEN)
 
 //! TCP IP BYPASS feature check
-#ifdef RS911X_SOCKETS
-#define RSI_TCP_IP_BYPASS RSI_DISABLE
+//#define RSI_TCP_IP_BYPASS RSI_DISABLE
+//! TCP/IP feature select bitmap for selecting TCP/IP features
+//#define RSI_TCP_IP_FEATURE_BIT_MAP (TCP_IP_FEAT_DHCPV4_CLIENT | TCP_IP_FEAT_ICMP)
 
-#define RSI_TCP_IP_FEATURE_BIT_MAP                                                                                                 \
-    (TCP_IP_FEAT_DHCPV4_CLIENT |                             /*TCP_IP_FEAT_HTTP_CLIENT | */                                        \
-     TCP_IP_FEAT_EXTENSION_VALID | /*TCP_IP_FEAT_SSL     |*/ /*TCP_IP_FEAT_DNS_CLIENT |*/                                          \
-     0)
-//! To set custom feature select bit map
-#define RSI_CUSTOM_FEATURE_BIT_MAP FEAT_CUSTOM_FEAT_EXTENSION_VALID
-
-#else /* Don't use RSI_SOCKETS */
 #define RSI_TCP_IP_BYPASS RSI_ENABLE
+//#define RSI_TCP_IP_FEATURE_BIT_MAP (TCP_IP_FEAT_DHCPV4_CLIENT | TCP_IP_FEAT_ICMP)
 #define RSI_TCP_IP_FEATURE_BIT_MAP (TCP_IP_FEAT_BYPASS /*| TCP_IP_FEAT_EXTENSION_VALID*/)
-#endif
+
+//! To set custom feature select bit map
+#define RSI_CUSTOM_FEATURE_BIT_MAP FEAT_CUSTOM_FEAT_EXTENTION_VALID
 
 //! To set Extended custom feature select bit map
-#if WIFI_ENABLE_SECURITY_WPA3
-#ifdef RSI_M4_INTERFACE
-#define RSI_EXT_CUSTOM_FEATURE_BIT_MAP (EXT_FEAT_256K_MODE | EXT_FEAT_IEEE_80211W)
-#else
-#define RSI_EXT_CUSTOM_FEATURE_BIT_MAP (EXT_FEAT_384K_MODE | EXT_FEAT_IEEE_80211W)
-#endif
-#else
-#ifdef RSI_M4_INTERFACE
-#define RSI_EXT_CUSTOM_FEATURE_BIT_MAP EXT_FEAT_256K_MODE
-#else
-#define RSI_EXT_CUSTOM_FEATURE_BIT_MAP EXT_FEAT_384K_MODE
-#endif
-#endif
+#define RSI_EXT_CUSTOM_FEATURE_BIT_MAP EXT_FEAT_UART_SEL_FOR_DEBUG_PRINTS
 
-//! To set Extended TCPIP feature select bit map
-#define RSI_EXT_TCPIP_FEATURE_BITMAP (/*EXT_FEAT_HTTP_OTAF_SUPPORT |*/ EXT_TCP_IP_SSL_16K_RECORD)
-//! Extended custom feature is selected internally
-//! CCP         -- EXT_FEAT_256K_MODE
-//! Wiseconnect -- EXT_FEAT_384K_MODE
+#define RSI_EXT_TCPIP_FEATURE_BITMAP 0
+
 /*=======================================================================*/
 //! Feature frame parameters
 /*=======================================================================*/
@@ -82,13 +60,13 @@
 #define AFE_TYPE 1
 #define FEATURE_ENABLES 0
 /*=======================================================================*/
-//! Band command parameters
+//! Band command paramters
 /*=======================================================================*/
 
 //! RSI_BAND_2P4GHZ(2.4GHz) or RSI_BAND_5GHZ(5GHz) or RSI_DUAL_BAND
 #define RSI_BAND RSI_BAND_2P4GHZ
 /*=======================================================================*/
-//! set region command parameters
+//! set region command paramters
 /*=======================================================================*/
 
 //! RSI_ENABLE or RSI_DISABLE Set region support
@@ -98,13 +76,13 @@
 #define RSI_SET_REGION_FROM_USER_OR_BEACON 1
 
 //! 0-Default Region domain ,1-US, 2-EUROPE, 3-JAPAN
-#define RSI_REGION_CODE 1
+#define RSI_REGION_CODE 3
 
 //! 0- Without On Board Antenna , 1- With On Board Antenna
 #define RSI_MODULE_TYPE 1
 
 /*=======================================================================*/
-//! set region AP command parameters
+//! set region AP command paramters
 /*=======================================================================*/
 
 //! RSI_ENABLE or RSI_DISABLE Set region AP support
@@ -114,20 +92,21 @@
 #define RSI_SET_REGION_AP_FROM_USER RSI_DISABLE
 
 //! "US" or "EU" or "JP" or other region codes
-#define RSI_COUNTRY_CODE "US"
+#define RSI_COUNTRY_CODE "US "
+
 /*=======================================================================*/
 
 //! Rejoin parameters
 /*=======================================================================*/
 
 //! RSI_ENABLE or RSI_DISABLE rejoin params
-#define RSI_REJOIN_PARAMS_SUPPORT RSI_ENABLE
+#define RSI_REJOIN_PARAMS_SUPPORT RSI_DISABLE
 
 //! Rejoin retry count. If 0 retries infinity times
-#define RSI_REJOIN_MAX_RETRY 5
+#define RSI_REJOIN_MAX_RETRY 0
 
 //! Periodicity of rejoin attempt
-#define RSI_REJOIN_SCAN_INTERVAL 1
+#define RSI_REJOIN_SCAN_INTERVAL 4
 
 //! Beacon missed count
 #define RSI_REJOIN_BEACON_MISSED_COUNT 40
@@ -141,13 +120,13 @@
 /*=======================================================================*/
 
 //! RSI_ENABLE or RSI_DISABLE BG Scan support
-#define RSI_BG_SCAN_SUPPORT RSI_ENABLE
+#define RSI_BG_SCAN_SUPPORT RSI_DISABLE
 
 //! RSI_ENABLE or RSI_DISABLE BG scan
 #define RSI_BG_SCAN_ENABLE RSI_ENABLE
 
 //! RSI_ENABLE or RSI_DISABLE instant BG scan
-#define RSI_INSTANT_BG RSI_ENABLE
+#define RSI_INSTANT_BG 1 // RSI_DISABLE
 
 //! BG scan threshold value
 #define RSI_BG_SCAN_THRESHOLD 63
@@ -165,7 +144,7 @@
 #define RSI_PASSIVE_SCAN_DURATION 50
 
 //! Multi probe
-#define RSI_MULTIPROBE RSI_ENABLE
+#define RSI_MULTIPROBE RSI_DISABLE
 
 /*=======================================================================*/
 
@@ -197,15 +176,8 @@
 //! RSI_ENABLE or RSI_DISABLE 11n mode in AP mode
 #define RSI_MODE_11N_ENABLE RSI_DISABLE
 
-//! HT caps supported
-#define RSI_HT_CAPS_NUM_RX_STBC (1 << 8)
-#define RSI_HT_CAPS_SHORT_GI_20MHZ BIT(5)
-#define RSI_HT_CAPS_GREENFIELD_EN BIT(4)
-#define RSI_HT_CAPS_SUPPORT_CH_WIDTH BIT(1)
-
 //! HT caps bit map.
-#define RSI_HT_CAPS_BIT_MAP                                                                                                        \
-    (RSI_HT_CAPS_NUM_RX_STBC | RSI_HT_CAPS_SHORT_GI_20MHZ | RSI_HT_CAPS_GREENFIELD_EN | RSI_HT_CAPS_SUPPORT_CH_WIDTH)
+#define RSI_HT_CAPS_BIT_MAP 10
 
 /*=======================================================================*/
 //! Scan command parameters
@@ -253,12 +225,9 @@
 #define RSI_POWER_LEVEL RSI_POWER_LEVEL_HIGH
 
 //! RSI_JOIN_FEAT_STA_BG_ONLY_MODE_ENABLE or RSI_JOIN_FEAT_LISTEN_INTERVAL_VALID
-#if WIFI_ENABLE_SECURITY_WPA3
-#define RSI_JOIN_FEAT_BIT_MAP RSI_JOIN_FEAT_MFP_CAPABLE_REQUIRED
-#else
 #define RSI_JOIN_FEAT_BIT_MAP 0
-#endif
 
+//!
 #define RSI_LISTEN_INTERVAL 0
 
 //! Transmission data rate. Physical rate at which data has to be transmitted.
@@ -269,7 +238,7 @@
 /*=======================================================================*/
 
 //! DHCP client host name
-#define RSI_DHCP_HOST_NAME "efr_9116"
+#define RSI_DHCP_HOST_NAME "dhcp_client"
 
 //! Transmit test command parameters
 /*=======================================================================*/
@@ -345,16 +314,17 @@
 /*=======================================================================*/
 //! RSI_ENABLE or RSI_DISABLE High performance socket
 #define HIGH_PERFORMANCE_ENABLE RSI_ENABLE //@ RSI_ENABLE or RSI_DISABLE High performance socket
-#define TOTAL_SOCKETS 10                   //@ Total number of sockets. TCP TX + TCP RX + UDP TX + UDP RX
-#define TOTAL_TCP_SOCKETS 4                //@ Total TCP sockets. TCP TX + TCP RX
-#define TOTAL_UDP_SOCKETS 4                //@ Total UDP sockets. UDP TX + UDP RX
-#define TCP_TX_ONLY_SOCKETS 0              //@ Total TCP TX only sockets. TCP TX
-#define TCP_RX_ONLY_SOCKETS 0              //@ Total TCP RX only sockets. TCP RX
-#define UDP_TX_ONLY_SOCKETS 0              //@ Total UDP TX only sockets. UDP TX
-#define UDP_RX_ONLY_SOCKETS 0              //@ Total UDP RX only sockets. UDP RX
-#define TCP_RX_HIGH_PERFORMANCE_SOCKETS 1  //@ Total TCP RX High Performance sockets
-#define TCP_RX_WINDOW_SIZE_CAP 10          //@ TCP RX Window size
-#define TCP_RX_WINDOW_DIV_FACTOR 10        //@ TCP RX Window division factor
+
+#define TOTAL_SOCKETS 1                   //@ Total number of sockets. TCP TX + TCP RX + UDP TX + UDP RX
+#define TOTAL_TCP_SOCKETS 1               //@ Total TCP sockets. TCP TX + TCP RX
+#define TOTAL_UDP_SOCKETS 0               //@ Total UDP sockets. UDP TX + UDP RX
+#define TCP_TX_ONLY_SOCKETS 0             //@ Total TCP TX only sockets. TCP TX
+#define TCP_RX_ONLY_SOCKETS 1             //@ Total TCP RX only sockets. TCP RX
+#define UDP_TX_ONLY_SOCKETS 0             //@ Total UDP TX only sockets. UDP TX
+#define UDP_RX_ONLY_SOCKETS 0             //@ Total UDP RX only sockets. UDP RX
+#define TCP_RX_HIGH_PERFORMANCE_SOCKETS 1 //@ Total TCP RX High Performance sockets
+#define TCP_RX_WINDOW_SIZE_CAP 10         //@ TCP RX Window size
+#define TCP_RX_WINDOW_DIV_FACTOR 10       //@ TCP RX Window division factor
 /*=======================================================================*/
 
 //! Socket Create parameters
@@ -384,12 +354,6 @@
 //! Timeout for PING_REQUEST
 #define RSI_PING_REQ_TIMEOUT_MS 1000
 
-//! Provide HTTP/HTTPS response status code indication to application e.g 200, 404 etc
-/*=======================================================================*/
-//! Enable or Diable feature
-#define RSI_HTTP_STATUS_INDICATION_EN RSI_DISABLE
-/*=======================================================================*/
-
 //! Store Config Profile parameters
 /*=======================================================================*/
 
@@ -470,7 +434,7 @@
 //! To configure listen interval
 #define RSI_CONFIG_CLIENT_LISTEN_INTERVAL 0
 //! To configure SSID
-#define RSI_CONFIG_CLIENT_SSID "Matter_9116"
+#define RSI_CONFIG_CLIENT_SSID "SILABS_AP"
 //! RSI_BAND_2P4GHZ(2.4GHz) or RSI_BAND_5GHZ(5GHz) or RSI_DUAL_BAND
 #define RSI_CONFIG_CLIENT_BAND RSI_BAND_2P4GHZ
 //! To configure channel number
diff --git a/examples/platform/silabs/SiWx917/rs911x/wfx_rsi.h b/examples/platform/silabs/SiWx917/SiWx917/wfx_rsi.h
similarity index 85%
rename from examples/platform/silabs/SiWx917/rs911x/wfx_rsi.h
rename to examples/platform/silabs/SiWx917/SiWx917/wfx_rsi.h
index 380fc8f..4309e97 100644
--- a/examples/platform/silabs/SiWx917/rs911x/wfx_rsi.h
+++ b/examples/platform/silabs/SiWx917/SiWx917/wfx_rsi.h
@@ -21,11 +21,11 @@
  * Interface to RSI Sapis
  */
 
-#define WFX_RSI_WLAN_TASK_SZ (1024 + 512 + 256) /* Unknown how big this should be 	*/
-#define WFX_RSI_TASK_SZ (1024 + 1024)           /* Stack for the WFX/RSI task		*/
-#define WFX_RSI_BUF_SZ (1024 * 10)              /* May need tweak 			*/
-#define WFX_RSI_CONFIG_MAX_JOIN 5               /* Max join retries			*/
-#define WFX_RSI_NUM_TIMERS 2                    /* Number of RSI timers to alloc	*/
+#define WFX_RSI_WLAN_TASK_SZ (1024 + 512 + 256 + 1024 + 512) /* Unknown how big this should be 	*/
+#define WFX_RSI_TASK_SZ (1024 + 1024 + 1024)                 /* Stack for the WFX/RSI task		*/
+#define WFX_RSI_BUF_SZ (1024 * 15)                           /* May need tweak 			*/
+#define WFX_RSI_CONFIG_MAX_JOIN 5                            /* Max join retries			*/
+#define WFX_RSI_NUM_TIMERS 2                                 /* Number of RSI timers to alloc	*/
 
 /*
  * Various events fielded by the wfx_rsi task
@@ -57,6 +57,8 @@
     EventGroupHandle_t events;
     TaskHandle_t drv_task;
     TaskHandle_t wlan_task;
+    TaskHandle_t init_task;
+    TaskHandle_t ble_task;
     uint16_t dev_state;
     uint16_t ap_chan; /* The chan our STA is using	*/
     wfx_wifi_provision_t sec;
diff --git a/examples/platform/silabs/SiWx917/rs911x/wfx_rsi_host.c b/examples/platform/silabs/SiWx917/SiWx917/wfx_rsi_host.c
similarity index 98%
rename from examples/platform/silabs/SiWx917/rs911x/wfx_rsi_host.c
rename to examples/platform/silabs/SiWx917/SiWx917/wfx_rsi_host.c
index a55e0ae..f44b6e9 100644
--- a/examples/platform/silabs/SiWx917/rs911x/wfx_rsi_host.c
+++ b/examples/platform/silabs/SiWx917/SiWx917/wfx_rsi_host.c
@@ -15,15 +15,11 @@
  *    limitations under the License.
  */
 
+#include "stdbool.h"
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 
-#include "em_bus.h"
-#include "em_cmu.h"
-#include "em_gpio.h"
-#include "em_ldma.h"
-#include "em_usart.h"
 #include "sl_status.h"
 
 #include "FreeRTOS.h"
@@ -71,6 +67,11 @@
     return SL_STATUS_OK;
 }
 
+int32_t wfx_rsi_platform()
+{
+    return wfx_rsi_init_platform();
+}
+
 /*********************************************************************
  * @fn  void wfx_enable_sta_mode(void)
  * @brief
diff --git a/examples/platform/silabs/SiWx917/rs911x/wfx_rsidev.c b/examples/platform/silabs/SiWx917/SiWx917/wfx_rsidev.c
similarity index 99%
rename from examples/platform/silabs/SiWx917/rs911x/wfx_rsidev.c
rename to examples/platform/silabs/SiWx917/SiWx917/wfx_rsidev.c
index 8d8a3c1..d7a4641 100644
--- a/examples/platform/silabs/SiWx917/rs911x/wfx_rsidev.c
+++ b/examples/platform/silabs/SiWx917/SiWx917/wfx_rsidev.c
@@ -223,7 +223,7 @@
     USART_InitSync_TypeDef usartInit = USART_INITSYNC_DEFAULT;
 
     res = sl_wfx_host_spi_set_config(USART);
-    if (res != SPI_CONFIG_SUCCESS)
+    if (res != SPI_CONFIG_SUCESS)
     {
         return SL_STATUS_FAIL;
     }
diff --git a/examples/platform/silabs/SiWx917/EFR32DeviceDataProvider.cpp b/examples/platform/silabs/SiWx917/SiWx917DeviceDataProvider.cpp
similarity index 99%
rename from examples/platform/silabs/SiWx917/EFR32DeviceDataProvider.cpp
rename to examples/platform/silabs/SiWx917/SiWx917DeviceDataProvider.cpp
index 6e097ff..9116c26 100644
--- a/examples/platform/silabs/SiWx917/EFR32DeviceDataProvider.cpp
+++ b/examples/platform/silabs/SiWx917/SiWx917DeviceDataProvider.cpp
@@ -15,7 +15,7 @@
  *    limitations under the License.
  */
 
-#include "EFR32DeviceDataProvider.h"
+#include "SiWx917DeviceDataProvider.h"
 #include <crypto/CHIPCryptoPAL.h>
 #include <lib/support/Base64.h>
 #include <platform/silabs/SilabsConfig.h>
diff --git a/examples/platform/silabs/SiWx917/EFR32DeviceDataProvider.h b/examples/platform/silabs/SiWx917/SiWx917DeviceDataProvider.h
similarity index 100%
rename from examples/platform/silabs/SiWx917/EFR32DeviceDataProvider.h
rename to examples/platform/silabs/SiWx917/SiWx917DeviceDataProvider.h
diff --git a/examples/platform/silabs/SiWx917/TemperatureSensor.cpp b/examples/platform/silabs/SiWx917/TemperatureSensor.cpp
deleted file mode 100644
index 69ba106..0000000
--- a/examples/platform/silabs/SiWx917/TemperatureSensor.cpp
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *
- *    Copyright (c) 2020 Project CHIP Authors
- *    Copyright (c) 2019 Google LLC.
- *    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.
- */
-
-#include "TemperatureSensor.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-// This is a C implementation. Need the ifdef __cplusplus else we get linking issues
-#include "sl_sensor_rht.h"
-
-#ifdef __cplusplus
-}
-#endif
-
-namespace TemperatureSensor {
-constexpr uint16_t kSensorTemperatureOffset = 800;
-
-sl_status_t Init()
-{
-    return sl_sensor_rht_init();
-}
-
-sl_status_t GetTemp(uint32_t * relativeHumidity, int16_t * temperature)
-{
-    // Sensor resolution 0.001 C
-    // DataModel resolution 0.01 C
-    int32_t temp;
-    sl_status_t status = sl_sensor_rht_get(relativeHumidity, &temp);
-    *temperature       = static_cast<int16_t>(temp / 10) - kSensorTemperatureOffset;
-    return status;
-}
-}; // namespace TemperatureSensor
diff --git a/examples/platform/silabs/SiWx917/TemperatureSensor.h b/examples/platform/silabs/SiWx917/TemperatureSensor.h
deleted file mode 100644
index 116287e..0000000
--- a/examples/platform/silabs/SiWx917/TemperatureSensor.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *
- *    Copyright (c) 2020 Project CHIP Authors
- *    Copyright (c) 2019 Google LLC.
- *    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.
- */
-
-#pragma once
-
-#include "sl_status.h"
-#include <stdint.h>
-
-namespace TemperatureSensor {
-sl_status_t Init();
-sl_status_t GetTemp(uint32_t * relativeHumidity, int16_t * temperature);
-}; // namespace TemperatureSensor
diff --git a/examples/platform/silabs/SiWx917/board_config.h b/examples/platform/silabs/SiWx917/board_config.h
index 8c495b4..ed92fdd 100644
--- a/examples/platform/silabs/SiWx917/board_config.h
+++ b/examples/platform/silabs/SiWx917/board_config.h
@@ -28,7 +28,7 @@
 
 /**
  * @file
- *   This file includes dev borad compile-time configuration constants for efr32.
+ *   This file includes dev board compile-time configuration constants for SiWx917.
  *
  */
 
diff --git a/examples/platform/silabs/SiWx917/device/inc/system_si917.h b/examples/platform/silabs/SiWx917/device/inc/system_si917.h
new file mode 100644
index 0000000..9c56651
--- /dev/null
+++ b/examples/platform/silabs/SiWx917/device/inc/system_si917.h
@@ -0,0 +1,167 @@
+/*
+ *
+ *    Copyright (c) 2022 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.
+ */
+
+#pragma once
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "core_cm4.h" /* Cortex-M4 processor and core peripherals */
+#include <stdint.h>
+//#include "cmsis_gcc.h"
+
+/*******************************************************************************
+ * @addtogroup Parts
+ * @{
+ ******************************************************************************/
+/*******************************************************************************
+ * @addtogroup EFR32 EFR32
+ * @{
+ ******************************************************************************/
+
+/*******************************************************************************
+ ******************************   TYPEDEFS   ***********************************
+ ******************************************************************************/
+
+/* Interrupt vectortable entry */
+typedef union
+{
+    void (*VECTOR_TABLE_Type)(void);
+    void * topOfStack;
+} tVectorEntry;
+
+/*******************************************************************************
+ **************************   GLOBAL VARIABLES   *******************************
+ ******************************************************************************/
+//#ifndef CCP_SI917_BRINGUP
+extern uint32_t SystemCoreClock; /**< System Clock Frequency (Core Clock) */
+//#endif /* CCP_SI917_BRINGUP */
+extern uint32_t SystemHfrcoFreq; /**< System HFRCO frequency */
+
+/*******************************************************************************
+ *****************************   PROTOTYPES   **********************************
+ ******************************************************************************/
+
+void Reset_Handler(void);      /**< Reset Handler */
+void NMI_Handler(void);        /**< NMI Handler */
+void HardFault_Handler(void);  /**< Hard Fault Handler */
+void MemManage_Handler(void);  /**< MPU Fault Handler */
+void BusFault_Handler(void);   /**< Bus Fault Handler */
+void UsageFault_Handler(void); /**< Usage Fault Handler */
+void SVC_Handler(void);        /**< SVCall Handler */
+void DebugMon_Handler(void);   /**< Debug Monitor Handler */
+void PendSV_Handler(void);     /**< PendSV Handler */
+void SysTick_Handler(void);    /**< SysTick Handler */
+
+void EMU_IRQHandler(void);       /**< EMU IRQ Handler */
+void FRC_PRI_IRQHandler(void);   /**< FRC_PRI IRQ Handler */
+void WDOG0_IRQHandler(void);     /**< WDOG0 IRQ Handler */
+void WDOG1_IRQHandler(void);     /**< WDOG1 IRQ Handler */
+void FRC_IRQHandler(void);       /**< FRC IRQ Handler */
+void MODEM_IRQHandler(void);     /**< MODEM IRQ Handler */
+void RAC_SEQ_IRQHandler(void);   /**< RAC_SEQ IRQ Handler */
+void RAC_RSM_IRQHandler(void);   /**< RAC_RSM IRQ Handler */
+void BUFC_IRQHandler(void);      /**< BUFC IRQ Handler */
+void LDMA_IRQHandler(void);      /**< LDMA IRQ Handler */
+void GPIO_EVEN_IRQHandler(void); /**< GPIO_EVEN IRQ Handler */
+void TIMER0_IRQHandler(void);    /**< TIMER0 IRQ Handler */
+void USART0_RX_IRQHandler(void); /**< USART0_RX IRQ Handler */
+void USART0_TX_IRQHandler(void); /**< USART0_TX IRQ Handler */
+void ACMP0_IRQHandler(void);     /**< ACMP0 IRQ Handler */
+void ADC0_IRQHandler(void);      /**< ADC0 IRQ Handler */
+void IDAC0_IRQHandler(void);     /**< IDAC0 IRQ Handler */
+void I2C0_IRQHandler(void);      /**< I2C0 IRQ Handler */
+void GPIO_ODD_IRQHandler(void);  /**< GPIO_ODD IRQ Handler */
+void TIMER1_IRQHandler(void);    /**< TIMER1 IRQ Handler */
+void USART1_RX_IRQHandler(void); /**< USART1_RX IRQ Handler */
+void USART1_TX_IRQHandler(void); /**< USART1_TX IRQ Handler */
+void LEUART0_IRQHandler(void);   /**< LEUART0 IRQ Handler */
+void PCNT0_IRQHandler(void);     /**< PCNT0 IRQ Handler */
+void CMU_IRQHandler(void);       /**< CMU IRQ Handler */
+void MSC_IRQHandler(void);       /**< MSC IRQ Handler */
+void CRYPTO0_IRQHandler(void);   /**< CRYPTO IRQ Handler */
+void LETIMER0_IRQHandler(void);  /**< LETIMER0 IRQ Handler */
+void AGC_IRQHandler(void);       /**< AGC IRQ Handler */
+void PROTIMER_IRQHandler(void);  /**< PROTIMER IRQ Handler */
+void RTCC_IRQHandler(void);      /**< RTCC IRQ Handler */
+void SYNTH_IRQHandler(void);     /**< SYNTH IRQ Handler */
+void CRYOTIMER_IRQHandler(void); /**< CRYOTIMER IRQ Handler */
+void RFSENSE_IRQHandler(void);   /**< RFSENSE IRQ Handler */
+void FPUEH_IRQHandler(void);     /**< FPUEH IRQ Handler */
+void SMU_IRQHandler(void);       /**< SMU IRQ Handler */
+void WTIMER0_IRQHandler(void);   /**< WTIMER0 IRQ Handler */
+void WTIMER1_IRQHandler(void);   /**< WTIMER1 IRQ Handler */
+void PCNT1_IRQHandler(void);     /**< PCNT1 IRQ Handler */
+void PCNT2_IRQHandler(void);     /**< PCNT2 IRQ Handler */
+void USART2_RX_IRQHandler(void); /**< USART2_RX IRQ Handler */
+void USART2_TX_IRQHandler(void); /**< USART2_TX IRQ Handler */
+void I2C1_IRQHandler(void);      /**< I2C1 IRQ Handler */
+void USART3_RX_IRQHandler(void); /**< USART3_RX IRQ Handler */
+void USART3_TX_IRQHandler(void); /**< USART3_TX IRQ Handler */
+void VDAC0_IRQHandler(void);     /**< VDAC0 IRQ Handler */
+void CSEN_IRQHandler(void);      /**< CSEN IRQ Handler */
+void LESENSE_IRQHandler(void);   /**< LESENSE IRQ Handler */
+void CRYPTO1_IRQHandler(void);   /**< CRYPTO1 IRQ Handler */
+void TRNG0_IRQHandler(void);     /**< TRNG0 IRQ Handler */
+void SYSCFG_IRQHandler(void);    /**< SYSCFG IRQ Handler */
+
+uint32_t SystemCoreClockGet(void);
+
+/*******************************************************************************
+ * @brief
+ *   Update CMSIS SystemCoreClock variable.
+ *
+ * @details
+ *   CMSIS defines a global variable SystemCoreClock
+ *that shall hold the core frequency in Hz. If the
+ *core frequency is dynamically changed, the variable
+ *must be kept updated in order to be CMSIS compliant.
+ *
+ *   Notice that only if changing the core clock
+ *frequency through the EFR CMU API, this variable
+ *will be kept updated. This function is only provided
+ *   for CMSIS compliance and if a user modifies the
+ *the core clock outside the CMU API.
+ ******************************************************************************/
+#ifndef CCP_SI917_BRINGUP
+static __INLINE void SystemCoreClockUpdate(void)
+{
+    (void) SystemCoreClockGet();
+}
+#endif /* CCP_SI917_BRINGUP */
+
+uint32_t SystemMaxCoreClockGet(void);
+
+void SystemInit(void);
+uint32_t SystemHFClockGet(void);
+
+uint32_t SystemHFXOClockGet(void);
+void SystemHFXOClockSet(uint32_t freq);
+
+uint32_t SystemLFRCOClockGet(void);
+uint32_t SystemULFRCOClockGet(void);
+
+uint32_t SystemLFXOClockGet(void);
+void SystemLFXOClockSet(uint32_t freq);
+
+/** @} End of group */
+/** @} End of group Parts */
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/examples/platform/silabs/SiWx917/device/src/startup_RS1xxxx.c b/examples/platform/silabs/SiWx917/device/src/startup_RS1xxxx.c
new file mode 100644
index 0000000..a62ea68
--- /dev/null
+++ b/examples/platform/silabs/SiWx917/device/src/startup_RS1xxxx.c
@@ -0,0 +1,530 @@
+/*
+ *
+ *    Copyright (c) 2022 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.
+ */
+
+#include "rsi_ps_ram_func.h"
+#include "system_RS1xxxx.h"
+#include "system_si917.h"
+
+/*----------Stack Configuration-----------------------------------------------*/
+#define STACK_SIZE 0x00000C00 /*!< Stack size (in Words)           */
+__attribute__((section(".co_stack"))) unsigned long pulStack[STACK_SIZE];
+
+#define EXT_IRQ_COUNT 98 /**< Number of External (NVIC) interrupts */ // senthil copied from "efr32mg12p432f1024gl125.h"
+#define TOTAL_INTERRUPTS (16 + EXT_IRQ_COUNT)
+
+#ifndef __INITIAL_SP
+#define __INITIAL_SP __StackTop
+#endif
+#ifndef __VECTOR_TABLE_ATTRIBUTE
+#define __VECTOR_TABLE_ATTRIBUTE __attribute__((used, section(".vectors")))
+#endif
+
+/*----------Macro definition--------------------------------------------------*/
+#define WEAK __attribute__((weak))
+
+/*----------Declaration of the default fault handlers-------------------------*/
+// #ifndef __START
+// extern void  _start(void) __attribute__((noreturn));    /* Pre Main (C library entry point) */
+// #else
+// extern int  __START(void) __attribute__((noreturn));    /* main entry point */
+// #endif
+
+/* System exception vector handler */
+__attribute__((used)) void WEAK Reset_Handler(void);
+void WEAK NMI_Handler(void);
+void WEAK HardFault_Handler(void);
+void WEAK MemManage_Handler(void);
+void WEAK BusFault_Handler(void);
+void WEAK UsageFault_Handler(void);
+void WEAK SVC_Handler(void);
+void WEAK DebugMon_Handler(void);
+void WEAK PendSV_Handler(void);
+void WEAK SysTick_Handler(void);
+
+/*Boot up functions*/
+void RSI_Default_Reset_Handler(void);
+void RSI_Default_WakeUp_Handler(void);
+void RSI_PS_RestoreCpuContext(void);
+
+void WEAK IRQ000_Handler(void);                                           /*!<  ULP Processor Interrupt   0      */
+void WEAK IRQ001_Handler(void);                                           /*!<  ULP Processor Interrupt   1      */
+void WEAK IRQ002_Handler(void);                                           /*!<  ULP Processor Interrupt   2      */
+void WEAK IRQ003_Handler(void);                                           /*!<  ULP Processor Interrupt   3      */
+void WEAK IRQ004_Handler(void);                                           /*!<  ULP Processor Interrupt   4      */
+void WEAK IRQ005_Handler(void);                                           /*!<  ULP Processor Interrupt   5      */
+void WEAK IRQ006_Handler(void);                                           /*!<  ULP Processor Interrupt   6      */
+void WEAK IRQ007_Handler(void);                                           /*!<  ULP Processor Interrupt   7      */
+void WEAK IRQ008_Handler(void);                                           /*!<  ULP Processor Interrupt   8      */
+void WEAK IRQ009_Handler(void);                                           /*!<  ULP Processor Interrupt   9      */
+void WEAK IRQ010_Handler(void);                                           /*!<  ULP Processor Interrupt   10     */
+void WEAK IRQ011_Handler(void);                                           /*!<  ULP Processor Interrupt   11     */
+void WEAK IRQ012_Handler(void);                                           /*!<  ULP Processor Interrupt   12     */
+void WEAK IRQ013_Handler(void);                                           /*!<  ULP Processor Interrupt   13     */
+void WEAK IRQ014_Handler(void);                                           /*!<  ULP Processor Interrupt   14     */
+void WEAK IRQ015_Handler(void);                                           /*!<  ULP Processor Interrupt   15     */
+void WEAK IRQ016_Handler(void);                                           /*!<  ULP Processor Interrupt   15     */
+void WEAK IRQ017_Handler(void);                                           /*!<  ULP Processor Interrupt   17     */
+void WEAK IRQ018_Handler(void);                                           /*!<  ULP Processor Interrupt   18     */
+void WEAK IRQ019_Handler(void);                                           /*!<  ULP Processor Interrupt   19     */
+void WEAK IRQ020_Handler(void); /*!<  Sleep Sensor Interrupts   0      */ /*WDT*/
+void WEAK IRQ021_Handler(void);                                           /*!<  Sleep Sensor Interrupts   1      */
+void WEAK IRQ022_Handler(void);                                           /*!<  Sleep Sensor Interrupts   2      */
+void WEAK IRQ023_Handler(void);                                           /*!<  Sleep Sensor Interrupts   3      */
+void WEAK IRQ024_Handler(void);                                           /*!<  Sleep Sensor Interrupts   4      */
+void WEAK IRQ025_Handler(void);                                           /*!<  Sleep Sensor Interrupts   5      */
+void WEAK IRQ026_Handler(void);                                           /*!<  Sleep Sensor Interrupts   6      */
+void WEAK IRQ027_Handler(void);                                           /*!<  Sleep Sensor Interrupts   7      */
+void WEAK IRQ028_Handler(void); /*!<  Sleep Sensor Interrupts   8      */ /*Alarm*/
+void WEAK IRQ029_Handler(void); /*!<  Sleep Sensor Interrupts   9      */ /*Msec and sec interrupt */
+void WEAK IRQ030_Handler(void);                                           /*!<  Reserved                         */
+void WEAK IRQ031_Handler(void);                                           /*!<  M4SS DMA interrupt               */
+void WEAK IRQ032_Handler(void);                                           /*!<  Reserved                         */
+void WEAK IRQ033_Handler(void);                                           /*!<  M4SS DMA interrupt               */
+void WEAK IRQ034_Handler(void);                                           /*!<  M4SS SCT interrupt               */
+void WEAK HIF1_IRQHandler(void);                                          /*!<  HIF Interrupt 1                  */
+void WEAK HIF2_IRQHandler(void);                                          /*!<  HIF Interrupt 2                  */
+void WEAK IRQ037_Handler(void);                                           /*!<  SIO Interrupt                    */
+void WEAK IRQ038_Handler(void);                                           /*!<  USART 1 Interrupt                */
+void WEAK IRQ039_Handler(void);                                           /*!<  Reserved                         */
+void WEAK IRQ040_Handler(void);                                           /*!<  Reserved                         */
+void WEAK IRQ041_Handler(void);                                           /*!<  Reserved                         */
+void WEAK IRQ042_Handler(void);                                           /*!<  I2C Interrupt                    */
+void WEAK IRQ043_Handler(void);                                           /*!<  Reserved                         */
+void WEAK IRQ044_Handler(void);                                           /*!<  SSI Slave Interrupt              */
+void WEAK IRQ045_Handler(void);                                           /*!<  Reserved                         */
+void WEAK IRQ046_Handler(void);                                           /*!<  GSPI Master 1 Interrupt          */
+void WEAK IRQ047_Handler(void);                                           /*!<  Reserved                         */
+void WEAK IRQ048_Handler(void);                                           /*!<  MCPWM Interrupt                  */
+void WEAK IRQ049_Handler(void);                                           /*!<  QEI Interrupt                    */
+void WEAK IRQ050_Handler(void);                                           /*!<  GPIO Group Interrupt 0           */
+void WEAK IRQ051_Handler(void);                                           /*!<  GPIO Group Interrupt 1           */
+void WEAK IRQ052_Handler(void);                                           /*!<  GPIO Pin Interrupt   0           */
+void WEAK IRQ053_Handler(void);                                           /*!<  GPIO Pin Interrupt   1           */
+void WEAK IRQ054_Handler(void);                                           /*!<  GPIO Pin Interrupt   2           */
+void WEAK IRQ055_Handler(void);                                           /*!<  GPIO Pin Interrupt   3           */
+void WEAK IRQ056_Handler(void);                                           /*!<  GPIO Pin Interrupt   4           */
+void WEAK IRQ057_Handler(void);                                           /*!<  GPIO Pin Interrupt   5           */
+void WEAK IRQ058_Handler(void);                                           /*!<  GPIO Pin Interrupt   6           */
+void WEAK IRQ059_Handler(void);                                           /*!<  GPIO Pin Interrupt   7           */
+void WEAK IRQ060_Handler(void);                                           /*!<  QSPI Interrupt                   */
+void WEAK IRQ061_Handler(void);                                           /*!<  I2C 2 Interrupt                  */
+void WEAK IRQ062_Handler(void);                                           /*!<  Ethernet Interrupt               */
+void WEAK IRQ063_Handler(void);                                           /*!<  Reserved                         */
+void WEAK IRQ064_Handler(void);                                           /*!<  I2S master Interrupt             */
+void WEAK IRQ065_Handler(void);                                           /*!<  Reserved                         */
+void WEAK IRQ066_Handler(void);                                           /*!<  Can 1 Interrupt                  */
+void WEAK IRQ067_Handler(void);                                           /*!<  Reserved                         */
+void WEAK IRQ068_Handler(void);                                           /*!<  SDMEM Interrupt                  */
+void WEAK IRQ069_Handler(void);                                           /*!<  PLL clock ind Interrupt          */
+void WEAK IRQ070_Handler(void);                                           /*!<  Reserved                         */
+void WEAK IRQ071_Handler(void);                                           /*!<  CCI system Interrupt Out         */
+void WEAK IRQ072_Handler(void);                                           /*!<  FPU exception                    */
+void WEAK IRQ073_Handler(void);                                           /*!<  USB INTR                         */
+void WEAK IRQ074_Handler(void);                                           /*!<  TASS_P2P_INTR                    */
+void WEAK IRQ075_Handler(void);                                           /*!<  WLAN Band1 intr0                 */
+void WEAK IRQ076_Handler(void);                                           /*!<  WLAN Band1 intr1                 */
+void WEAK IRQ077_Handler(void);                                           /*!<  Reserved                         */
+void WEAK IRQ078_Handler(void);                                           /*!<  Reserved                         */
+void WEAK IRQ079_Handler(void);                                           /*!<  BT intr                          */
+void WEAK IRQ080_Handler(void);                                           /*!<  ZB intr                          */
+void WEAK IRQ081_Handler(void);                                           /*!<  Reserved                         */
+void WEAK IRQ082_Handler(void);                                           /*!<  Modem disabled mode trigger intr */
+void WEAK IRQ083_Handler(void);                                           /*!<  gpio intr                        */
+void WEAK IRQ084_Handler(void);                                           /*!<  uart intr                        */
+void WEAK IRQ085_Handler(void);                                           /*!<  watch dog level intr             */
+void WEAK IRQ086_Handler(void);                                           /*!<  ULP Sleep sensor interrupt       */
+void WEAK IRQ087_Handler(void);                                           /*!<  ECDH intr                        */
+void WEAK IRQ088_Handler(void);                                           /*!<  DH intr                          */
+void WEAK IRQ089_Handler(void);                                           /*!<  QSPI intr                        */
+void WEAK IRQ090_Handler(void);                                           /*!<  ULP processor interrupt TASS     */
+void WEAK IRQ091_Handler(void);                                           /*!<  Sys Tick Timer                   */
+void WEAK IRQ092_Handler(void);                                           /*!<  Real Timer interrupt             */
+void WEAK IRQ093_Handler(void);                                           /*!<  PLL lock interrupt               */
+void WEAK IRQ094_Handler(void);                                           /*!<  Reserved                         */
+void WEAK IRQ095_Handler(void);                                           /*!<  UART2 Interrupt                  */
+void WEAK IRQ096_Handler(void);                                           /*!<  I2S Interrupt                    */
+void WEAK IRQ097_Handler(void);                                           /*!<  I2C Interrupt                    */
+void WEAK IRQ098_Handler(void);                                           /*!<  RESERVED                         */
+
+/*----------Symbols defined in linker script----------------------------------*/
+extern unsigned long _sidata; /*!< Start address for the initialization
+                                      values of the .data section.            */
+extern unsigned long _sdata;  /*!< Start address for the .data section     */
+extern unsigned long _edata;  /*!< End address for the .data section       */
+extern unsigned long _sbss;   /*!< Start address for the .bss section      */
+extern unsigned long _ebss;   /*!< End address for the .bss section        */
+extern void _eram;            /*!< End address for ram                     */
+extern uint32_t __etext;
+extern unsigned long __StackTop;
+
+/*----------Function prototypes-----------------------------------------------*/
+extern int main(void);             /*!< The entry point for the application  */
+void Default_Reset_Handler(void);  /*!< Default reset handler                */
+static void Default_Handler(void); /*!< Default exception handler            */
+/**
+ *@brief The minimal vector table for a Cortex M4.  Note that the proper constructs
+ *       must be placed on this to ensure that it ends up at physical address
+ *       0x00000000.
+ */
+
+//(void *)0x300001
+/*CCP new */
+extern const tVectorEntry __VECTOR_TABLE[TOTAL_INTERRUPTS];
+const tVectorEntry __VECTOR_TABLE[TOTAL_INTERRUPTS] __attribute__((aligned(512))) __VECTOR_TABLE_ATTRIBUTE = {
+    /* Cortex-M Exception Handlers */
+    { .topOfStack = &__INITIAL_SP }, /* Initial Stack Pointer */
+    /*{ (void *)&pulStack[STACK_SIZE - 1] },*/
+    { (void *) 0x300001 },  /* Reset Handler : IN CCP Platform system start
+                                           from bootloader which inturn call reset handler */
+    { NMI_Handler },        /* NMI Handler */
+    { HardFault_Handler },  /* Hard Fault Handler */
+    { MemManage_Handler },  /* MPU Fault Handler */
+    { BusFault_Handler },   /* Bus Fault Handler */
+    { UsageFault_Handler }, /* Usage Fault Handler */
+    { 0 },                  /* Reserved */
+    { 0 },                  /* Reserved */
+    { 0 },                  /* Reserved */
+    { 0 },                  /* Reserved */
+    { SVC_Handler },        /* SVCall Handler */
+    { DebugMon_Handler },   /* Debug Monitor Handler */
+    { 0 },                  /* Application properties*/
+    { PendSV_Handler },     /* PendSV Handler */
+    { SysTick_Handler },    /* SysTick Handler */
+
+    /* External interrupts */
+
+    { IRQ000_Handler },              /* 0 */
+    { IRQ001_Handler },              /* 1 */
+    { IRQ002_Handler },              /* 2 */
+    { IRQ003_Handler },              /* 3 */
+    { IRQ004_Handler },              /* 4 */
+    { IRQ005_Handler },              /* 5 */
+    { IRQ006_Handler },              /* 6 */
+    { IRQ007_Handler },              /* 7 */
+    { IRQ008_Handler },              /* 8 */
+    { IRQ009_Handler },              /* 9 */
+    { IRQ010_Handler },              /* 10 */
+    { IRQ011_Handler },              /* 11 */
+    { IRQ012_Handler },              /* 12 */
+    { IRQ013_Handler },              /* 13 */
+    { IRQ014_Handler },              /* 14 */
+    { IRQ015_Handler },              /* 15 */
+    { IRQ016_Handler },              /* 16 */
+    { IRQ017_Handler },              /* 17 */
+    { IRQ018_Handler },              /* 18 */
+    { IRQ019_Handler },              /* 19 */
+    { IRQ020_Handler },              /* 20 */
+    { IRQ021_Handler },              /* 21 */
+    { IRQ022_Handler },              /* 22 */
+    { IRQ023_Handler },              /* 23 */
+    { IRQ024_Handler },              /* 24 */
+    { IRQ025_Handler },              /* 25 */
+    { IRQ026_Handler },              /* 26 */
+    { IRQ027_Handler },              /* 27 */
+    { IRQ028_Handler },              /* 28 */
+    { IRQ029_Handler },              /* 29 */
+    { (void *) &__StackTop - 0x0c }, /* 30 */
+    { IRQ031_Handler },              /* 31 */
+    { RSI_Default_Reset_Handler },   /* 32 */
+    { IRQ033_Handler },              /* 33 */
+    { IRQ034_Handler },              /* 34 */
+    { HIF1_IRQHandler },             /* 35 */
+    { HIF2_IRQHandler },             /* 36 */
+    { IRQ037_Handler },              /* 37 */
+    { IRQ038_Handler },              /* 38 */
+    { IRQ039_Handler },              /* 39 */
+    { RSI_PS_RestoreCpuContext },    /* 40 */
+    { IRQ041_Handler },              /* 41 */
+    { IRQ042_Handler },              /* 42 */
+    { (void *) 0x10AD10AD },         /* 43 */
+    { IRQ044_Handler },              /* 44 */
+    { 0 },                           /* 45 */
+    { IRQ046_Handler },              /* 46 */
+    { IRQ047_Handler },              /* 47 */
+    { IRQ048_Handler },              /* 48 */
+    { IRQ049_Handler },              /* 49 */
+    { IRQ050_Handler },              /* 50 - Reserved */
+    { IRQ051_Handler },
+    { IRQ052_Handler },
+    { IRQ053_Handler },
+    { IRQ054_Handler },
+    { IRQ055_Handler },
+    { IRQ056_Handler },
+    { IRQ057_Handler },
+    { IRQ058_Handler },
+    { IRQ059_Handler },
+    { IRQ060_Handler },
+    { IRQ061_Handler },
+    { IRQ062_Handler },
+    { IRQ063_Handler },
+    { IRQ064_Handler },
+    { 0 },
+    { IRQ066_Handler },
+    { 0 },
+    { IRQ068_Handler },
+    { IRQ069_Handler },
+    { 0 },
+    { IRQ071_Handler },
+    { IRQ072_Handler },
+    { IRQ073_Handler },
+    { IRQ074_Handler },
+    { IRQ075_Handler },
+    { IRQ076_Handler },
+    { 0 },
+    { 0 },
+    { IRQ079_Handler },
+    { IRQ080_Handler },
+    { 0 },
+    { IRQ082_Handler },
+    { IRQ083_Handler },
+    { IRQ084_Handler },
+    { IRQ085_Handler },
+    { IRQ086_Handler },
+    { IRQ087_Handler },
+    { IRQ088_Handler },
+    { IRQ089_Handler },
+    { IRQ090_Handler },
+    { IRQ091_Handler },
+    { IRQ092_Handler },
+    { IRQ093_Handler },
+    { 0 },
+    { IRQ095_Handler },
+    { 0 },
+    { IRQ097_Handler },
+};
+
+/**
+ * @brief  This is the code that gets never called, Dummy handler
+ * @param  None
+ * @retval None
+ */
+void Default_Reset_Handler(void)
+{
+    /*Generic Default reset handler for CM4 */
+    while (1)
+        ;
+}
+
+void Copy_Table()
+{
+    uint32_t *pSrc, *pDest;
+    extern uint32_t __etext;
+    extern uint32_t __data_start__;
+    extern uint32_t __data_end__;
+    pSrc  = &__etext;
+    pDest = &__data_start__;
+
+    for (; pDest < &__data_end__;)
+    {
+        *pDest++ = *pSrc++;
+    }
+}
+
+void Zero_Table()
+{
+    uint32_t * pDest;
+    extern uint32_t __bss_start__;
+    extern uint32_t __bss_end__;
+    pDest = &__bss_start__;
+
+    for (; pDest < &__bss_end__;)
+    {
+        *pDest++ = 0UL;
+    }
+}
+void Reset_Handler(void)
+{
+#ifndef __NO_SYSTEM_INIT
+    SystemInit(); /* CMSIS System Initialization */
+#endif
+
+#ifdef BOOTLOADER_ENABLE
+    SystemInit2();
+#endif /* BOOTLOADER_ENABLE */
+
+#if defined(__GNUC__) && defined(__START)
+    Copy_Table();
+    Zero_Table();
+    __START();
+#else
+#if 0 // senthil_ccp
+  __PROGRAM_START();               /* Enter PreMain (C library entry point) */
+#else
+    Copy_Table();
+    Zero_Table();
+    _start();
+#endif
+#endif /* __GNUC__ */
+}
+
+void RSI_Default_Reset_Handler(void)
+{
+#ifndef __NO_SYSTEM_INIT
+    SystemInit(); /* CMSIS System Initialization */
+#endif
+
+#ifdef BOOTLOADER_ENABLE
+    SystemInit2();
+#endif /* BOOTLOADER_ENABLE */
+
+#if defined(__GNUC__) && defined(__START)
+    Copy_Table();
+    Zero_Table();
+    __START();
+#else
+#if 0 // senthil_ccp
+  __PROGRAM_START();               /* Enter PreMain (C library entry point) */
+#else
+    Copy_Table();
+    Zero_Table();
+    _start();
+#endif
+#endif /* __GNUC__ */
+}
+
+/**
+ *@brief Provide weak aliases for each Exception handler to the Default_Handler.
+ *       As they are weak aliases, any function with the same name will override
+ *       this definition.
+ */
+//#pragma weak Reset_Handler      = RSI_Default_Reset_Handler
+#pragma weak NMI_Handler        = Default_Handler
+#pragma weak HardFault_Handler  = Default_Handler
+#pragma weak MemManage_Handler  = Default_Handler
+#pragma weak BusFault_Handler   = Default_Handler
+#pragma weak UsageFault_Handler = Default_Handler
+#pragma weak SVC_Handler        = Default_Handler
+#pragma weak DebugMon_Handler   = Default_Handler
+#pragma weak PendSV_Handler     = Default_Handler
+#pragma weak SysTick_Handler    = Default_Handler
+/*----------------------------------external interrupts------------------------------ */
+#pragma weak IRQ000_Handler  = Default_Handler
+#pragma weak IRQ001_Handler  = Default_Handler
+#pragma weak IRQ002_Handler  = Default_Handler
+#pragma weak IRQ003_Handler  = Default_Handler
+#pragma weak IRQ004_Handler  = Default_Handler
+#pragma weak IRQ005_Handler  = Default_Handler
+#pragma weak IRQ006_Handler  = Default_Handler
+#pragma weak IRQ007_Handler  = Default_Handler
+#pragma weak IRQ008_Handler  = Default_Handler
+#pragma weak IRQ009_Handler  = Default_Handler
+#pragma weak IRQ010_Handler  = Default_Handler
+#pragma weak IRQ011_Handler  = Default_Handler
+#pragma weak IRQ012_Handler  = Default_Handler
+#pragma weak IRQ013_Handler  = Default_Handler
+#pragma weak IRQ014_Handler  = Default_Handler
+#pragma weak IRQ015_Handler  = Default_Handler
+#pragma weak IRQ016_Handler  = Default_Handler
+#pragma weak IRQ017_Handler  = Default_Handler
+#pragma weak IRQ018_Handler  = Default_Handler
+#pragma weak IRQ019_Handler  = Default_Handler
+#pragma weak IRQ020_Handler  = Default_Handler
+#pragma weak IRQ021_Handler  = Default_Handler
+#pragma weak IRQ022_Handler  = Default_Handler
+#pragma weak IRQ023_Handler  = Default_Handler
+#pragma weak IRQ024_Handler  = Default_Handler
+#pragma weak IRQ025_Handler  = Default_Handler
+#pragma weak IRQ026_Handler  = Default_Handler
+#pragma weak IRQ027_Handler  = Default_Handler
+#pragma weak IRQ028_Handler  = Default_Handler
+#pragma weak IRQ029_Handler  = Default_Handler
+#pragma weak IRQ030_Handler  = Default_Handler
+#pragma weak IRQ031_Handler  = Default_Handler
+#pragma weak IRQ032_Handler  = Default_Handler
+#pragma weak IRQ033_Handler  = Default_Handler
+#pragma weak IRQ034_Handler  = Default_Handler
+#pragma weak HIF1_IRQHandler = Default_Handler
+#pragma weak HIF2_IRQHandler = Default_Handler
+#pragma weak IRQ037_Handler  = Default_Handler
+#pragma weak IRQ038_Handler  = Default_Handler
+#pragma weak IRQ039_Handler  = Default_Handler
+#pragma weak IRQ040_Handler  = Default_Handler
+#pragma weak IRQ041_Handler  = Default_Handler
+#pragma weak IRQ042_Handler  = Default_Handler
+#pragma weak IRQ043_Handler  = Default_Handler
+#pragma weak IRQ044_Handler  = Default_Handler
+#pragma weak IRQ045_Handler  = Default_Handler
+#pragma weak IRQ046_Handler  = Default_Handler
+#pragma weak IRQ047_Handler  = Default_Handler
+#pragma weak IRQ048_Handler  = Default_Handler
+#pragma weak IRQ049_Handler  = Default_Handler
+#pragma weak IRQ050_Handler  = Default_Handler
+#pragma weak IRQ051_Handler  = Default_Handler
+#pragma weak IRQ052_Handler  = Default_Handler
+#pragma weak IRQ053_Handler  = Default_Handler
+#pragma weak IRQ054_Handler  = Default_Handler
+#pragma weak IRQ055_Handler  = Default_Handler
+#pragma weak IRQ056_Handler  = Default_Handler
+#pragma weak IRQ057_Handler  = Default_Handler
+#pragma weak IRQ058_Handler  = Default_Handler
+#pragma weak IRQ059_Handler  = Default_Handler
+#pragma weak IRQ060_Handler  = Default_Handler
+#pragma weak IRQ061_Handler  = Default_Handler
+#pragma weak IRQ062_Handler  = Default_Handler
+#pragma weak IRQ063_Handler  = Default_Handler
+#pragma weak IRQ064_Handler  = Default_Handler
+#pragma weak IRQ065_Handler  = Default_Handler
+#pragma weak IRQ066_Handler  = Default_Handler
+#pragma weak IRQ067_Handler  = Default_Handler
+#pragma weak IRQ068_Handler  = Default_Handler
+#pragma weak IRQ069_Handler  = Default_Handler
+#pragma weak IRQ070_Handler  = Default_Handler
+#pragma weak IRQ071_Handler  = Default_Handler
+#pragma weak IRQ072_Handler  = Default_Handler
+#pragma weak IRQ073_Handler  = Default_Handler
+#pragma weak IRQ074_Handler  = Default_Handler
+#pragma weak IRQ075_Handler  = Default_Handler
+#pragma weak IRQ076_Handler  = Default_Handler
+#pragma weak IRQ077_Handler  = Default_Handler
+#pragma weak IRQ078_Handler  = Default_Handler
+#pragma weak IRQ079_Handler  = Default_Handler
+#pragma weak IRQ080_Handler  = Default_Handler
+#pragma weak IRQ081_Handler  = Default_Handler
+#pragma weak IRQ082_Handler  = Default_Handler
+#pragma weak IRQ083_Handler  = Default_Handler
+#pragma weak IRQ084_Handler  = Default_Handler
+#pragma weak IRQ085_Handler  = Default_Handler
+#pragma weak IRQ086_Handler  = Default_Handler
+#pragma weak IRQ087_Handler  = Default_Handler
+#pragma weak IRQ088_Handler  = Default_Handler
+#pragma weak IRQ089_Handler  = Default_Handler
+#pragma weak IRQ090_Handler  = Default_Handler
+#pragma weak IRQ091_Handler  = Default_Handler
+#pragma weak IRQ092_Handler  = Default_Handler
+#pragma weak IRQ093_Handler  = Default_Handler
+#pragma weak IRQ094_Handler  = Default_Handler
+#pragma weak IRQ095_Handler  = Default_Handler
+#pragma weak IRQ096_Handler  = Default_Handler
+#pragma weak IRQ097_Handler  = Default_Handler
+#pragma weak IRQ098_Handler  = Default_Handler
+
+/**
+ * @brief  This is the code that gets called when the processor receives an
+ *         unexpected interrupt.  This simply enters an infinite loop,
+ *         preserving the system state for examination by a debugger.
+ * @param  None
+ * @retval None
+ */
+static void Default_Handler(void)
+{
+    /* Go into an infinite loop. */
+    while (1)
+    {
+    }
+}
+
+/*********************** (C) COPYRIGHT 2009 Coocox ************END OF FILE*****/
diff --git a/examples/platform/silabs/SiWx917/device/src/startup_si917.c b/examples/platform/silabs/SiWx917/device/src/startup_si917.c
new file mode 100644
index 0000000..03cb7ff
--- /dev/null
+++ b/examples/platform/silabs/SiWx917/device/src/startup_si917.c
@@ -0,0 +1,403 @@
+/*
+ *
+ *    Copyright (c) 2022 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.
+ */
+
+#include "system_si917.h"
+#include <stdbool.h>
+#include <stdint.h>
+//#include "cmsis_gcc.h"
+
+#ifdef BOOTLOADER_ENABLE
+#include "api/btl_interface.h"
+
+#endif
+
+#ifdef SL_APP_PROPERTIES
+#include "api/application_properties.h"
+
+#endif
+
+#define EXT_IRQ_COUNT 51 /**< Number of External (NVIC) interrupts */ // senthil copied from "efr32mg12p432f1024gl125.h"
+#define TOTAL_INTERRUPTS (16 + EXT_IRQ_COUNT)
+
+#ifdef BOOTLOADER_ENABLE
+extern MainBootloaderTable_t mainStageTable;
+
+extern void SystemInit2(void);
+
+/*----------------------------------------------------------------------------
+ * Exception / Interrupt Handler Function Prototype
+ *----------------------------------------------------------------------------*/
+typedef void (*VECTOR_TABLE_Type)(void);
+#endif
+
+#ifdef SL_APP_PROPERTIES
+extern ApplicationProperties_t sl_app_properties;
+
+/*----------------------------------------------------------------------------
+ * Exception / Interrupt Handler Function Prototype
+ *----------------------------------------------------------------------------*/
+typedef void (*VECTOR_TABLE_Type)(void);
+#endif
+
+/*---------------------------------------------------------------------------
+ * External References
+ *---------------------------------------------------------------------------*/
+extern uint32_t __INITIAL_SP;
+extern uint32_t __StackTop;
+
+#ifndef __INITIAL_SP
+#define __INITIAL_SP __StackTop
+#endif
+#ifndef __VECTOR_TABLE_ATTRIBUTE
+#define __VECTOR_TABLE_ATTRIBUTE __attribute__((used, section(".vectors")))
+#endif
+
+extern void __PROGRAM_START(void);
+
+#if defined(__START) && defined(__GNUC__)
+extern int __START(void) __attribute__((noreturn)); /* main entry point */
+void Zero_Table();
+void Copy_Table();
+#endif /* __START */
+
+/*---------------------------------------------------------------------------
+ * Internal References
+ *---------------------------------------------------------------------------*/
+void Reset_Handler(void);
+void Default_Handler(void);
+
+#if defined(__GNUC__)
+#ifndef __STACK_SIZE
+#define __STACK_SIZE 0x00000400
+#endif /* __STACK_SIZE */
+
+#ifndef __HEAP_SIZE
+#define __HEAP_SIZE 0x00000C00
+#endif /* __HEAP_SIZE */
+#endif /* __GNUC__ */
+
+/*----------------------------------------------------------------------------
+ * Exception / Interrupt Handler
+ *----------------------------------------------------------------------------*/
+/* Cortex-M Processor Exceptions */
+void NMI_Handler(void) __attribute__((weak, alias("Default_Handler")));
+void HardFault_Handler(void) __attribute__((weak, alias("Default_Handler")));
+void MemManage_Handler(void) __attribute__((weak, alias("Default_Handler")));
+void BusFault_Handler(void) __attribute__((weak, alias("Default_Handler")));
+void UsageFault_Handler(void) __attribute__((weak, alias("Default_Handler")));
+void DebugMon_Handler(void) __attribute__((weak, alias("Default_Handler")));
+void SVC_Handler(void) __attribute__((weak, alias("Default_Handler")));
+void PendSV_Handler(void) __attribute__((weak, alias("Default_Handler")));
+void SysTick_Handler(void) __attribute__((weak, alias("Default_Handler")));
+#ifndef SL_APP_PROPERTIES
+/* Provide a dummy value for the sl_app_properties symbol. */
+void sl_app_properties(void); /* Prototype to please MISRA checkers. */
+void sl_app_properties(void) __attribute__((weak, alias("Default_Handler")));
+#endif
+
+/* Part Specific Interrupts */
+
+void EMU_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void FRC_PRI_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void WDOG0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void WDOG1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void FRC_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void MODEM_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void RAC_SEQ_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void RAC_RSM_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void BUFC_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void LDMA_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void GPIO_EVEN_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void TIMER0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void USART0_RX_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void USART0_TX_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void ACMP0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void ADC0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void IDAC0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void I2C0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void GPIO_ODD_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void TIMER1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void USART1_RX_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void USART1_TX_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void LEUART0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void PCNT0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void CMU_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void MSC_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void CRYPTO0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void LETIMER0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void AGC_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void PROTIMER_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void RTCC_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void SYNTH_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void CRYOTIMER_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void RFSENSE_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void FPUEH_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void SMU_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void WTIMER0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void WTIMER1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void PCNT1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void PCNT2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void USART2_RX_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void USART2_TX_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void I2C1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void USART3_RX_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void USART3_TX_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void VDAC0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void CSEN_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void LESENSE_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void CRYPTO1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void TRNG0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+
+#if 0 // senthil_ccp
+
+#ifndef __PROGRAM_START
+
+/**
+  \brief   Initializes data and bss sections
+  \details This default implementations initialized all data and additional bss
+           sections relying on .copy.table and .zero.table specified properly
+           in the used linker script.
+
+ */
+void __cmsis_start(void)
+{
+  extern void _start(void) __NO_RETURN;
+
+  typedef struct {
+    uint32_t const* src;
+    uint32_t* dest;
+    uint32_t  wlen;
+  } __copy_table_t;
+
+  typedef struct {
+    uint32_t* dest;
+    uint32_t  wlen;
+  } __zero_table_t;
+
+  extern const __copy_table_t __copy_table_start__;
+  extern const __copy_table_t __copy_table_end__;
+  extern const __zero_table_t __zero_table_start__;
+  extern const __zero_table_t __zero_table_end__;
+
+  for (__copy_table_t const* pTable = &__copy_table_start__; pTable < &__copy_table_end__; ++pTable) {
+    for(uint32_t i=0u; i<pTable->wlen; ++i) {
+      pTable->dest[i] = pTable->src[i];
+    }
+  }
+
+  for (__zero_table_t const* pTable = &__zero_table_start__; pTable < &__zero_table_end__; ++pTable) {
+    for(uint32_t i=0u; i<pTable->wlen; ++i) {
+      pTable->dest[i] = 0u;
+    }
+  }
+
+  _start();
+}
+
+#define __PROGRAM_START __cmsis_start
+#endif
+
+#endif / senthil_ccp
+/*----------------------------------------------------------------------------
+ * Exception / Interrupt Vector table
+ *----------------------------------------------------------------------------*/
+
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wpedantic"
+#endif
+
+#if defined(__ICCARM__)
+#pragma data_alignment = 512
+extern const tVectorEntry __VECTOR_TABLE[TOTAL_INTERRUPTS];
+const tVectorEntry __VECTOR_TABLE[TOTAL_INTERRUPTS] __VECTOR_TABLE_ATTRIBUTE = {
+#elif defined(__GNUC__)
+extern const tVectorEntry __VECTOR_TABLE[TOTAL_INTERRUPTS];
+// const tVectorEntry __VECTOR_TABLE[TOTAL_INTERRUPTS] __attribute__((aligned(512))) __VECTOR_TABLE_ATTRIBUTE = {
+const tVectorEntry __VECTOR_TABLE[TOTAL_INTERRUPTS] __attribute__((aligned(512))) __VECTOR_TABLE_ATTRIBUTE = {
+#else
+extern const tVectorEntry __VECTOR_TABLE[TOTAL_INTERRUPTS];
+const tVectorEntry __VECTOR_TABLE[TOTAL_INTERRUPTS] __VECTOR_TABLE_ATTRIBUTE = {
+#endif
+    /* Cortex-M Exception Handlers */
+    { .topOfStack = &__INITIAL_SP }, /* Initial Stack Pointer */
+    { Reset_Handler },               /* Reset Handler */
+    { NMI_Handler },                 /* NMI Handler */
+    { HardFault_Handler },           /* Hard Fault Handler */
+    { MemManage_Handler },           /* MPU Fault Handler */
+    { BusFault_Handler },            /* Bus Fault Handler */
+    { UsageFault_Handler },          /* Usage Fault Handler */
+    { Default_Handler },             /* Reserved */
+    { Default_Handler },             /* Reserved */
+    { Default_Handler },             /* Reserved */
+#ifdef BOOTLOADER_ENABLE
+    { (VECTOR_TABLE_Type) &mainStageTable },
+#else
+    { Default_Handler },   /* Reserved */
+#endif
+    { SVC_Handler },      /* SVCall Handler */
+    { DebugMon_Handler }, /* Debug Monitor Handler */
+#ifdef SL_APP_PROPERTIES
+    { (VECTOR_TABLE_Type) &sl_app_properties }, /* Application properties*/
+#else
+    { sl_app_properties }, /* Application properties*/
+#endif
+    { PendSV_Handler },  /* PendSV Handler */
+    { SysTick_Handler }, /* SysTick Handler */
+
+    /* External interrupts */
+
+    { EMU_IRQHandler },       /* 0 */
+    { FRC_PRI_IRQHandler },   /* 1 */
+    { WDOG0_IRQHandler },     /* 2 */
+    { WDOG1_IRQHandler },     /* 3 */
+    { FRC_IRQHandler },       /* 4 */
+    { MODEM_IRQHandler },     /* 5 */
+    { RAC_SEQ_IRQHandler },   /* 6 */
+    { RAC_RSM_IRQHandler },   /* 7 */
+    { BUFC_IRQHandler },      /* 8 */
+    { LDMA_IRQHandler },      /* 9 */
+    { GPIO_EVEN_IRQHandler }, /* 10 */
+    { TIMER0_IRQHandler },    /* 11 */
+    { USART0_RX_IRQHandler }, /* 12 */
+    { USART0_TX_IRQHandler }, /* 13 */
+    { ACMP0_IRQHandler },     /* 14 */
+    { ADC0_IRQHandler },      /* 15 */
+    { IDAC0_IRQHandler },     /* 16 */
+    { I2C0_IRQHandler },      /* 17 */
+    { GPIO_ODD_IRQHandler },  /* 18 */
+    { TIMER1_IRQHandler },    /* 19 */
+    { USART1_RX_IRQHandler }, /* 20 */
+    { USART1_TX_IRQHandler }, /* 21 */
+    { LEUART0_IRQHandler },   /* 22 */
+    { PCNT0_IRQHandler },     /* 23 */
+    { CMU_IRQHandler },       /* 24 */
+    { MSC_IRQHandler },       /* 25 */
+    { CRYPTO0_IRQHandler },   /* 26 */
+    { LETIMER0_IRQHandler },  /* 27 */
+    { AGC_IRQHandler },       /* 28 */
+    { PROTIMER_IRQHandler },  /* 29 */
+    { RTCC_IRQHandler },      /* 30 */
+    { SYNTH_IRQHandler },     /* 31 */
+    { CRYOTIMER_IRQHandler }, /* 32 */
+    { RFSENSE_IRQHandler },   /* 33 */
+    { FPUEH_IRQHandler },     /* 34 */
+    { SMU_IRQHandler },       /* 35 */
+    { WTIMER0_IRQHandler },   /* 36 */
+    { WTIMER1_IRQHandler },   /* 37 */
+    { PCNT1_IRQHandler },     /* 38 */
+    { PCNT2_IRQHandler },     /* 39 */
+    { USART2_RX_IRQHandler }, /* 40 */
+    { USART2_TX_IRQHandler }, /* 41 */
+    { I2C1_IRQHandler },      /* 42 */
+    { USART3_RX_IRQHandler }, /* 43 */
+    { USART3_TX_IRQHandler }, /* 44 */
+    { VDAC0_IRQHandler },     /* 45 */
+    { CSEN_IRQHandler },      /* 46 */
+    { LESENSE_IRQHandler },   /* 47 */
+    { CRYPTO1_IRQHandler },   /* 48 */
+    { TRNG0_IRQHandler },     /* 49 */
+    { Default_Handler },      /* 50 - Reserved */
+};
+
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+
+//#if defined (__START) && defined (__GNUC__) //senthil_ccp
+void Copy_Table()
+{
+    uint32_t *pSrc, *pDest;
+    extern uint32_t __etext;
+    extern uint32_t __data_start__;
+    extern uint32_t __data_end__;
+    pSrc  = &__etext;
+    pDest = &__data_start__;
+
+    for (; pDest < &__data_end__;)
+    {
+        *pDest++ = *pSrc++;
+    }
+}
+
+void Zero_Table()
+{
+    uint32_t * pDest;
+    extern uint32_t __bss_start__;
+    extern uint32_t __bss_end__;
+    pDest = &__bss_start__;
+
+    for (; pDest < &__bss_end__;)
+    {
+        *pDest++ = 0UL;
+    }
+}
+//#endif /* __START */
+
+/*---------------------------------------------------------------------------
+ * Reset Handler called on controller reset
+ *---------------------------------------------------------------------------*/
+#if 0
+ void SysTick_Handler(void)
+{
+	SysTick_Handler();
+}
+#endif
+
+void Reset_Handler(void)
+{
+#ifndef __NO_SYSTEM_INIT
+    SystemInit(); /* CMSIS System Initialization */
+#endif
+
+#ifdef BOOTLOADER_ENABLE
+    SystemInit2();
+#endif /* BOOTLOADER_ENABLE */
+
+#if defined(__GNUC__) && defined(__START)
+    Copy_Table();
+    Zero_Table();
+    __START();
+#else
+#if 0 // senthil_ccp
+  __PROGRAM_START();               /* Enter PreMain (C library entry point) */
+#else
+    Copy_Table();
+    Zero_Table();
+    _start();
+#endif
+#endif /* __GNUC__ */
+}
+
+#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wmissing-noreturn"
+#endif
+
+/*----------------------------------------------------------------------------
+ * Default Handler for Exceptions / Interrupts
+ *----------------------------------------------------------------------------*/
+void Default_Handler(void)
+{
+    while (true)
+    {
+    }
+}
+
+#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
+#pragma clang diagnostic pop
+#endif
diff --git a/examples/platform/silabs/SiWx917/efr32_utils.h b/examples/platform/silabs/SiWx917/init_ccpPlatform.cpp
similarity index 67%
copy from examples/platform/silabs/SiWx917/efr32_utils.h
copy to examples/platform/silabs/SiWx917/init_ccpPlatform.cpp
index b0d508d..0d5bb78 100644
--- a/examples/platform/silabs/SiWx917/efr32_utils.h
+++ b/examples/platform/silabs/SiWx917/init_ccpPlatform.cpp
@@ -1,7 +1,7 @@
 /*
  *
  *    Copyright (c) 2020 Project CHIP Authors
- *    Copyright (c) 2022 Silabs.
+ *    Copyright (c) 2019 Google LLC.
  *    All rights reserved.
  *
  *    Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,22 +17,30 @@
  *    limitations under the License.
  */
 
-#pragma once
+#include "AppConfig.h"
+#include <lib/support/CHIPPlatformMemory.h>
+#include <platform/CHIPDeviceLayer.h>
 
-// EFR Logging
 #ifdef __cplusplus
 extern "C" {
 #endif
+#include <assert.h>
+#include <string.h>
 
-void silabsInitLog(void);
+#include <mbedtls/platform.h>
 
-void efr32Log(const char * aFormat, ...);
-#define SILABS_LOG(...) efr32Log(__VA_ARGS__);
-void appError(int err);
+#include "init_ccpPlatform.h"
+
+void initAntenna(void);
+
+void init_ccpPlatform(void)
+{
+
+#if SILABS_LOG_ENABLED
+    silabsInitLog();
+#endif
+}
 
 #ifdef __cplusplus
 }
-
-#include <lib/core/CHIPError.h>
-void appError(CHIP_ERROR error);
 #endif
diff --git a/examples/platform/silabs/SiWx917/init_efrPlatform.h b/examples/platform/silabs/SiWx917/init_ccpPlatform.h
similarity index 96%
rename from examples/platform/silabs/SiWx917/init_efrPlatform.h
rename to examples/platform/silabs/SiWx917/init_ccpPlatform.h
index aeb47b8..986e2fe 100644
--- a/examples/platform/silabs/SiWx917/init_efrPlatform.h
+++ b/examples/platform/silabs/SiWx917/init_ccpPlatform.h
@@ -22,8 +22,7 @@
 extern "C" {
 #endif
 
-void init_efrPlatform(void);
-
+void init_ccpPlatform(void);
 #ifdef __cplusplus
 }
 #endif
diff --git a/examples/platform/silabs/SiWx917/init_efrPlatform.cpp b/examples/platform/silabs/SiWx917/init_efrPlatform.cpp
deleted file mode 100644
index 993b4fe..0000000
--- a/examples/platform/silabs/SiWx917/init_efrPlatform.cpp
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *
- *    Copyright (c) 2020 Project CHIP Authors
- *    Copyright (c) 2019 Google LLC.
- *    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.
- */
-
-#include "AppConfig.h"
-#include <lib/support/CHIPPlatformMemory.h>
-#include <platform/CHIPDeviceLayer.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-#include <assert.h>
-#include <string.h>
-
-#include <mbedtls/platform.h>
-
-#if CHIP_ENABLE_OPENTHREAD
-#include <openthread-core-config.h>
-#include <openthread/cli.h>
-#include <openthread/config.h>
-#include <openthread/dataset.h>
-#include <openthread/error.h>
-#include <openthread/heap.h>
-#include <openthread/icmp6.h>
-#include <openthread/instance.h>
-#include <openthread/link.h>
-#include <openthread/platform/openthread-system.h>
-#include <openthread/tasklet.h>
-#include <openthread/thread.h>
-#include <utils/uart.h>
-
-#include "platform-efr32.h"
-
-#if OPENTHREAD_CONFIG_HEAP_EXTERNAL_ENABLE
-#include "openthread/heap.h"
-#endif // OPENTHREAD_CONFIG_HEAP_EXTERNAL_ENABLE
-#endif // CHIP_ENABLE_OPENTHREAD
-
-#include "init_efrPlatform.h"
-#include "sl_component_catalog.h"
-#include "sl_mbedtls.h"
-#include "sl_system_init.h"
-
-#if SL_SYSTEM_VIEW
-#include "SEGGER_SYSVIEW.h"
-#endif
-
-void initAntenna(void);
-
-void init_efrPlatform(void)
-{
-    sl_system_init();
-    sl_mbedtls_init();
-#if SL_SYSTEM_VIEW
-    SEGGER_SYSVIEW_Conf();
-    SEGGER_SYSVIEW_Start();
-#endif
-
-#if SILABS_LOG_ENABLED
-    silabsInitLog();
-#endif
-
-#if CHIP_ENABLE_OPENTHREAD
-    efr32RadioInit();
-    efr32AlarmInit();
-#endif // CHIP_ENABLE_OPENTHREAD
-}
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/examples/platform/silabs/SiWx917/ldscripts/efr32mg12.ld b/examples/platform/silabs/SiWx917/ldscripts/SiWx917.ld
similarity index 74%
rename from examples/platform/silabs/SiWx917/ldscripts/efr32mg12.ld
rename to examples/platform/silabs/SiWx917/ldscripts/SiWx917.ld
index f9f4f55..13f0b22 100644
--- a/examples/platform/silabs/SiWx917/ldscripts/efr32mg12.ld
+++ b/examples/platform/silabs/SiWx917/ldscripts/SiWx917.ld
@@ -1,7 +1,6 @@
 /*
  *
- *    Copyright (c) 2020 Project CHIP Authors
- *    All rights reserved.
+ *    Copyright (c) 2022 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.
@@ -15,40 +14,12 @@
  *    See the License for the specific language governing permissions and
  *    limitations under the License.
  */
-/***************************************************************************//**
- * Linker script for Silicon Labs EFR32MG12P devices
- *******************************************************************************
- * # License
- * <b>Copyright 2022 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
- *    appreciated but is not required.
- * 2. Altered source versions must be plainly marked as such, and must not be
- *    misrepresented as being the original software.
- * 3. This notice may not be removed or altered from any source distribution.
- *
- ******************************************************************************/
 
 
 MEMORY
 {
-  FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 1048576
-  RAM (rwx)  : ORIGIN = 0x20000000, LENGTH = 262144
+	FLASH (rx)  : ORIGIN = 0x08012000, LENGTH = 0x200000
+	RAM (rwx) : ORIGIN = 0xC, LENGTH = 262144
 }
 
 /* Linker script to place sections and symbol values. Should be used together
@@ -146,10 +117,13 @@
   } > FLASH
 
   __etext = ALIGN (4);
+  _sidata = __etext;
 
   .data : AT (__etext)
   {
     __data_start__ = .;
+    _sdata = __data_start__;
+
     *(vtable)
     *(.data*)
     . = ALIGN (4);
@@ -181,6 +155,7 @@
     . = ALIGN(4);
     /* All data end */
     __data_end__ = .;
+    _edata = __data_end__;
 
   } > RAM
 
@@ -188,11 +163,13 @@
   {
     . = ALIGN(4);
     __bss_start__ = .;
+    _sbss = __bss_start__;
     *(.bss)
     *(.bss.*)
     *(COMMON)
     . = ALIGN(4);
     __bss_end__ = .;
+    _ebss = __bss_end__;
   } > RAM
 
   .heap (COPY) :
@@ -237,6 +214,6 @@
   ASSERT( (linker_nvm_begin + SIZEOF(.nvm)) <= __main_flash_end__, "NVM3 is excessing the flash size !")
 
   /* Check if FLASH usage exceeds FLASH size */
-  ASSERT( LENGTH(FLASH) >= (__etext), "FLASH memory overflowed !")
+/*  ASSERT( LENGTH(FLASH) >= (__etext), "FLASH memory overflowed !") */ /* Build error need to be checked for CCP */
   ASSERT((__etext + SIZEOF(.data)) <= __nvm3Base, "FLASH memory overlapped with NVM section.")
 }
diff --git a/examples/platform/silabs/SiWx917/ldscripts/efr32mg21.ld b/examples/platform/silabs/SiWx917/ldscripts/efr32mg21.ld
deleted file mode 100644
index 2c9de0d..0000000
--- a/examples/platform/silabs/SiWx917/ldscripts/efr32mg21.ld
+++ /dev/null
@@ -1,289 +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.
- */
-/***************************************************************************//**
- * Linker script for Silicon Labs EFR32MG21 devices
- * @version 5.7.2
- *******************************************************************************
- * # License
- * <b>Copyright 2018 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
- *    appreciated but is not required.
- * 2. Altered source versions must be plainly marked as such, and must not be
- *    misrepresented as being the original software.
- * 3. This notice may not be removed or altered from any source distribution.
- *
- ******************************************************************************/
-
-MEMORY
-{
-  FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 1048576 - 8192  /* 8K is reserved at top of flash on MG21 */
-  RAM (rwx)  : ORIGIN = 0x20000000, LENGTH = 98304
-}
-
-/* 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
- *   __HeapBase
- *   __HeapLimit
- *   __StackLimit
- *   __StackTop
- *   __stack
- *   __Vectors_End
- *   __Vectors_Size
- */
-ENTRY(Reset_Handler)
-
-SECTIONS
-{
-  .text :
-  {
-    KEEP(*(.vectors))
-    __Vectors_End = .;
-    __Vectors_Size = __Vectors_End - __Vectors;
-    __end__ = .;
-
-    *(.text*)
-
-    KEEP(*(.init))
-    KEEP(*(.fini))
-
-    KEEP(*(.application_properties))
-	KEEP(*(.gecko_configuration))
-	KEEP(*(.xo_configuration))
-    KEEP(*(.gatt_header))
-    KEEP(*(.gatt_data))
-
-    /* .ctors */
-    *crtbegin.o(.ctors)
-    *crtbegin?.o(.ctors)
-    *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
-    *(SORT(.ctors.*))
-    *(.ctors)
-
-    /* .dtors */
-    *crtbegin.o(.dtors)
-    *crtbegin?.o(.dtors)
-    *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
-    *(SORT(.dtors.*))
-    *(.dtors)
-
-    *(.rodata*)
-
-
-    KEEP(*(.eh_frame*))
-  } > FLASH
-
-
-  .ARM.extab :
-  {
-    *(.ARM.extab* .gnu.linkonce.armextab.*)
-  } > FLASH
-
-  __exidx_start = .;
-  .ARM.exidx :
-  {
-    *(.ARM.exidx* .gnu.linkonce.armexidx.*)
-  } > FLASH
-  __exidx_end = .;
-
-
-
-  /* To copy multiple ROM to RAM sections,
-   * uncomment .copy.table section and,
-   * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */
-  /*
-  .copy.table :
-  {
-    . = ALIGN(4);
-    __copy_table_start__ = .;
-    LONG (__etext)
-    LONG (__data_start__)
-    LONG (__data_end__ - __data_start__)
-    LONG (__etext2)
-    LONG (__data2_start__)
-    LONG (__data2_end__ - __data2_start__)
-    __copy_table_end__ = .;
-  } > FLASH
-  */
-
-  /* To clear multiple BSS sections,
-   * uncomment .zero.table section and,
-   * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */
-  /*
-  .zero.table :
-  {
-    . = ALIGN(4);
-    __zero_table_start__ = .;
-    LONG (__bss_start__)
-    LONG (__bss_end__ - __bss_start__)
-    LONG (__bss2_start__)
-    LONG (__bss2_end__ - __bss2_start__)
-    __zero_table_end__ = .;
-  } > FLASH
-  */
-
-  __etext = .;
-
-  /*******************************************************************/
-  /* Define flash block for BLE-simee & CHIP-nvm3                    */
-  /* simee: 9000H (36k) bytes for BLE nvm3                           */
-  /* chipNvm3_section: 4000H (16k) bytes for CHIP nvm3.              */
-  /* 8K is reserved for OpenThread's NVM which is mapped directly at */
-  /* the top of flash                                                */
-  /*******************************************************************/
-
-  OPENTHREAD_NVM_SIZE = 8192;
-
-  .nvm_dummy (DSECT):
-  {
-    __nvm3_dummy_begin = .;
-    . = ALIGN (8192);
-    __nvm3_dummy_simee = .;
-    KEEP(*(.simee));
-    . = ALIGN (8192);
-    __nvm3_dummy_chip = .;
-    KEEP(*(chipNvm3_section));
-    . = ALIGN (8192);
-    . += OPENTHREAD_NVM_SIZE;
-    . = ALIGN (8192);
-  } > FLASH
-
-  /* Set NVM to end of FLASH */
-  __nvm3Base = LENGTH(FLASH) - SIZEOF(.nvm_dummy) + (__nvm3_dummy_simee - __nvm3_dummy_begin);
-  __nvm3ChipBase = LENGTH(FLASH) - SIZEOF(.nvm_dummy) + (__nvm3_dummy_chip - __nvm3_dummy_begin);
-
-
-  /*******************************************************************/
-
-  .data : AT (__etext)
-  {
-    __data_start__ = .;
-    *(vtable)
-    *(.data*)
-    . = ALIGN (4);
-    PROVIDE (__ram_func_section_start = .);
-    *(.ram)
-    PROVIDE (__ram_func_section_end = .);
-
-    . = ALIGN(4);
-    /* preinit data */
-    PROVIDE_HIDDEN (__preinit_array_start = .);
-    KEEP(*(.preinit_array))
-    PROVIDE_HIDDEN (__preinit_array_end = .);
-
-    . = ALIGN(4);
-    /* init data */
-    PROVIDE_HIDDEN (__init_array_start = .);
-    KEEP(*(SORT(.init_array.*)))
-    KEEP(*(.init_array))
-    PROVIDE_HIDDEN (__init_array_end = .);
-
-    . = ALIGN(4);
-    /* finit data */
-    PROVIDE_HIDDEN (__fini_array_start = .);
-    KEEP(*(SORT(.fini_array.*)))
-    KEEP(*(.fini_array))
-    PROVIDE_HIDDEN (__fini_array_end = .);
-
-    KEEP(*(.jcr*))
-    . = ALIGN(4);
-    /* All data end */
-    __data_end__ = .;
-
-  } > RAM
-
-  .bss :
-  {
-    . = ALIGN(4);
-    __bss_start__ = .;
-    *(.bss*)
-    *(COMMON)
-    . = ALIGN(4);
-    __bss_end__ = .;
-  } > RAM
-
-  .heap (COPY):
-  {
-    __HeapBase = .;
-    __end__ = .;
-    end = __end__;
-    _end = __end__;
-    KEEP(*(.heap*))
-    __HeapLimit = .;
-  } > RAM
-
-  /* .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*))
-  } > RAM
-
-  /* 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);
-
-  /* Check if data + heap + stack exceeds RAM limit */
-  ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
-
-
-  /* Check if FLASH usage exceeds FLASH size */
-  ASSERT( LENGTH(FLASH) >= (__etext + SIZEOF(.data)), "FLASH memory overflowed !")
-  ASSERT((__etext + SIZEOF(.data)) <= __nvm3Base, "FLASH memory overlapped with NVM section.")
-}
\ No newline at end of file
diff --git a/examples/platform/silabs/SiWx917/ldscripts/efr32mg24.ld b/examples/platform/silabs/SiWx917/ldscripts/efr32mg24.ld
deleted file mode 100644
index b057a9a..0000000
--- a/examples/platform/silabs/SiWx917/ldscripts/efr32mg24.ld
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- *
- *    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
- *******************************************************************************
- * # License
- * <b>Copyright 2022 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
- *    appreciated but is not required.
- * 2. Altered source versions must be plainly marked as such, and must not be
- *    misrepresented as being the original software.
- * 3. This notice may not be removed or altered from any source distribution.
- *
- ******************************************************************************/
-
-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)
- */
-
-ENTRY(Reset_Handler)
-
-SECTIONS
-{
-  .text :
-  {
-    KEEP(*(.vectors))
-    *(.text*)
-
-    KEEP(*(.init))
-    KEEP(*(.fini))
-
-    /* .ctors */
-    *crtbegin.o(.ctors)
-    *crtbegin?.o(.ctors)
-    *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
-    *(SORT(.ctors.*))
-    *(.ctors)
-
-    /* .dtors */
-    *crtbegin.o(.dtors)
-    *crtbegin?.o(.dtors)
-    *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
-    *(SORT(.dtors.*))
-    *(.dtors)
-
-    *(.rodata*)
-
-    KEEP(*(.eh_frame*))
-  } > FLASH
-  .ARM.extab :
-  {
-    *(.ARM.extab* .gnu.linkonce.armextab.*)
-  } > FLASH
-
-  __exidx_start = .;
-  .ARM.exidx :
-  {
-    *(.ARM.exidx* .gnu.linkonce.armexidx.*)
-  } > FLASH
-  __exidx_end = .;
-
-  .copy.table :
-  {
-    . = ALIGN(4);
-    __copy_table_start__ = .;
-
-    LONG (__etext)
-    LONG (__data_start__)
-    LONG ((__data_end__ - __data_start__) / 4)
-
-    __copy_table_end__ = .;
-  } > FLASH
-
-  .zero.table :
-  {
-    . = ALIGN(4);
-    __zero_table_start__ = .;
-    __zero_table_end__ = .;
-    __etext = ALIGN(4);
-  } > FLASH
-
-  .data : AT (__etext)
-  {
-    __data_start__ = .;
-    *(vtable)
-    *(.data*)
-    . = ALIGN (4);
-    PROVIDE (__ram_func_section_start = .);
-    *(.ram)
-    PROVIDE (__ram_func_section_end = .);
-
-    . = ALIGN(4);
-    /* preinit data */
-    PROVIDE_HIDDEN (__preinit_array_start = .);
-    KEEP(*(.preinit_array))
-    PROVIDE_HIDDEN (__preinit_array_end = .);
-
-    . = ALIGN(4);
-    /* init data */
-    PROVIDE_HIDDEN (__init_array_start = .);
-    KEEP(*(SORT(.init_array.*)))
-    KEEP(*(.init_array))
-    PROVIDE_HIDDEN (__init_array_end = .);
-
-    . = ALIGN(4);
-    /* finit data */
-    PROVIDE_HIDDEN (__fini_array_start = .);
-    KEEP(*(SORT(.fini_array.*)))
-    KEEP(*(.fini_array))
-    PROVIDE_HIDDEN (__fini_array_end = .);
-
-    KEEP(*(.jcr*))
-    . = ALIGN(4);
-    /* All data end */
-    __data_end__ = .;
-
-  } > RAM
-
-  .bss :
-  {
-    . = ALIGN(4);
-    __bss_start__ = .;
-    *(.bss)
-    *(.bss.*)
-    *(COMMON)
-    . = ALIGN(4);
-    __bss_end__ = .;
-  } > RAM AT > RAM
-
-  .heap (COPY):
-  {
-    __HeapBase = .;
-    __end__ = .;
-    end = __end__;
-    _end = __end__;
-    KEEP(*(.heap*))
-    __HeapLimit = .;
-  } > RAM
-
-  __main_flash_end__ = ORIGIN(FLASH) + LENGTH(FLASH);
-
-  /* .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
-
-  /* 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) : {
-    KEEP(*(.simee*))
-  } > FLASH
-
-  /* Last page of flash is reserved for the manufacturing token space */
-  linker_nvm_end = __main_flash_end__ - 8192;
-  linker_nvm_begin = linker_nvm_end - SIZEOF(.nvm);
-  linker_nvm_size = SIZEOF(.nvm);
-  __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 !")
-
-  /* Check if FLASH usage exceeds FLASH size */
-  ASSERT( LENGTH(FLASH) >= (__etext + SIZEOF(.data)), "FLASH memory overflowed !")
-}
diff --git a/examples/platform/silabs/SiWx917/ldscripts/mgm24.ld b/examples/platform/silabs/SiWx917/ldscripts/mgm24.ld
deleted file mode 100644
index b057a9a..0000000
--- a/examples/platform/silabs/SiWx917/ldscripts/mgm24.ld
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- *
- *    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
- *******************************************************************************
- * # License
- * <b>Copyright 2022 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
- *    appreciated but is not required.
- * 2. Altered source versions must be plainly marked as such, and must not be
- *    misrepresented as being the original software.
- * 3. This notice may not be removed or altered from any source distribution.
- *
- ******************************************************************************/
-
-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)
- */
-
-ENTRY(Reset_Handler)
-
-SECTIONS
-{
-  .text :
-  {
-    KEEP(*(.vectors))
-    *(.text*)
-
-    KEEP(*(.init))
-    KEEP(*(.fini))
-
-    /* .ctors */
-    *crtbegin.o(.ctors)
-    *crtbegin?.o(.ctors)
-    *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
-    *(SORT(.ctors.*))
-    *(.ctors)
-
-    /* .dtors */
-    *crtbegin.o(.dtors)
-    *crtbegin?.o(.dtors)
-    *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
-    *(SORT(.dtors.*))
-    *(.dtors)
-
-    *(.rodata*)
-
-    KEEP(*(.eh_frame*))
-  } > FLASH
-  .ARM.extab :
-  {
-    *(.ARM.extab* .gnu.linkonce.armextab.*)
-  } > FLASH
-
-  __exidx_start = .;
-  .ARM.exidx :
-  {
-    *(.ARM.exidx* .gnu.linkonce.armexidx.*)
-  } > FLASH
-  __exidx_end = .;
-
-  .copy.table :
-  {
-    . = ALIGN(4);
-    __copy_table_start__ = .;
-
-    LONG (__etext)
-    LONG (__data_start__)
-    LONG ((__data_end__ - __data_start__) / 4)
-
-    __copy_table_end__ = .;
-  } > FLASH
-
-  .zero.table :
-  {
-    . = ALIGN(4);
-    __zero_table_start__ = .;
-    __zero_table_end__ = .;
-    __etext = ALIGN(4);
-  } > FLASH
-
-  .data : AT (__etext)
-  {
-    __data_start__ = .;
-    *(vtable)
-    *(.data*)
-    . = ALIGN (4);
-    PROVIDE (__ram_func_section_start = .);
-    *(.ram)
-    PROVIDE (__ram_func_section_end = .);
-
-    . = ALIGN(4);
-    /* preinit data */
-    PROVIDE_HIDDEN (__preinit_array_start = .);
-    KEEP(*(.preinit_array))
-    PROVIDE_HIDDEN (__preinit_array_end = .);
-
-    . = ALIGN(4);
-    /* init data */
-    PROVIDE_HIDDEN (__init_array_start = .);
-    KEEP(*(SORT(.init_array.*)))
-    KEEP(*(.init_array))
-    PROVIDE_HIDDEN (__init_array_end = .);
-
-    . = ALIGN(4);
-    /* finit data */
-    PROVIDE_HIDDEN (__fini_array_start = .);
-    KEEP(*(SORT(.fini_array.*)))
-    KEEP(*(.fini_array))
-    PROVIDE_HIDDEN (__fini_array_end = .);
-
-    KEEP(*(.jcr*))
-    . = ALIGN(4);
-    /* All data end */
-    __data_end__ = .;
-
-  } > RAM
-
-  .bss :
-  {
-    . = ALIGN(4);
-    __bss_start__ = .;
-    *(.bss)
-    *(.bss.*)
-    *(COMMON)
-    . = ALIGN(4);
-    __bss_end__ = .;
-  } > RAM AT > RAM
-
-  .heap (COPY):
-  {
-    __HeapBase = .;
-    __end__ = .;
-    end = __end__;
-    _end = __end__;
-    KEEP(*(.heap*))
-    __HeapLimit = .;
-  } > RAM
-
-  __main_flash_end__ = ORIGIN(FLASH) + LENGTH(FLASH);
-
-  /* .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
-
-  /* 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) : {
-    KEEP(*(.simee*))
-  } > FLASH
-
-  /* Last page of flash is reserved for the manufacturing token space */
-  linker_nvm_end = __main_flash_end__ - 8192;
-  linker_nvm_begin = linker_nvm_end - SIZEOF(.nvm);
-  linker_nvm_size = SIZEOF(.nvm);
-  __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 !")
-
-  /* Check if FLASH usage exceeds FLASH size */
-  ASSERT( LENGTH(FLASH) >= (__etext + SIZEOF(.data)), "FLASH memory overflowed !")
-}
diff --git a/examples/platform/silabs/SiWx917/matter_config.cpp b/examples/platform/silabs/SiWx917/matter_config.cpp
index 83e9095..caa6a34 100644
--- a/examples/platform/silabs/SiWx917/matter_config.cpp
+++ b/examples/platform/silabs/SiWx917/matter_config.cpp
@@ -25,9 +25,15 @@
 
 #include <mbedtls/platform.h>
 
+#ifdef __cplusplus
+extern "C" {
+#endif
 #ifdef SL_WIFI
 #include "wfx_host_events.h"
 #endif /* SL_WIFI */
+#ifdef __cplusplus
+}
+#endif
 
 #if PW_RPC_ENABLED
 #include "Rpc.h"
@@ -46,89 +52,34 @@
 using namespace ::chip::DeviceLayer;
 
 #include <crypto/CHIPCryptoPAL.h>
-// If building with the EFR32-provided crypto backend, we can use the
-// opaque keystore
-#if CHIP_CRYPTO_PLATFORM
-#include <platform/silabs/EFR32/Efr32PsaOperationalKeystore.h>
-static chip::DeviceLayer::Internal::Efr32PsaOperationalKeystore gOperationalKeystore;
-#endif
+// If building with the SiWx917-provided crypto backend, we can use the
 
-#include "EFR32DeviceDataProvider.h"
-
-#if CHIP_ENABLE_OPENTHREAD
-#include <inet/EndPointStateOpenThread.h>
-#include <openthread/cli.h>
-#include <openthread/dataset.h>
-#include <openthread/error.h>
-#include <openthread/heap.h>
-#include <openthread/icmp6.h>
-#include <openthread/instance.h>
-#include <openthread/link.h>
-#include <openthread/platform/openthread-system.h>
-#include <openthread/tasklet.h>
-#include <openthread/thread.h>
-
-// ================================================================================
-// Matter Networking Callbacks
-// ================================================================================
-void LockOpenThreadTask(void)
-{
-    chip::DeviceLayer::ThreadStackMgr().LockThreadStack();
-}
-
-void UnlockOpenThreadTask(void)
-{
-    chip::DeviceLayer::ThreadStackMgr().UnlockThreadStack();
-}
-
-// ================================================================================
-// EFR32MatterConfig Methods
-// ================================================================================
-
-CHIP_ERROR EFR32MatterConfig::InitOpenThread(void)
-{
-    SILABS_LOG("Initializing OpenThread stack");
-    ReturnErrorOnFailure(ThreadStackMgr().InitThreadStack());
-
-#if CHIP_DEVICE_CONFIG_THREAD_FTD
-    ReturnErrorOnFailure(ConnectivityMgr().SetThreadDeviceType(ConnectivityManager::kThreadDeviceType_Router));
-#else // CHIP_DEVICE_CONFIG_THREAD_FTD
-#if CHIP_DEVICE_CONFIG_ENABLE_SED
-    ReturnErrorOnFailure(ConnectivityMgr().SetThreadDeviceType(ConnectivityManager::kThreadDeviceType_SleepyEndDevice));
-#else  // CHIP_DEVICE_CONFIG_ENABLE_SED
-    ReturnErrorOnFailure(ConnectivityMgr().SetThreadDeviceType(ConnectivityManager::kThreadDeviceType_MinimalEndDevice));
-#endif // CHIP_DEVICE_CONFIG_ENABLE_SED
-#endif // CHIP_DEVICE_CONFIG_THREAD_FTD
-
-    SILABS_LOG("Starting OpenThread task");
-    return ThreadStackMgrImpl().StartThreadTask();
-}
-#endif // CHIP_ENABLE_OPENTHREAD
+#include "SiWx917DeviceDataProvider.h"
 
 #if EFR32_OTA_ENABLED
 void EFR32MatterConfig::InitOTARequestorHandler(System::Layer * systemLayer, void * appState)
 {
+#if 0 // TODO : OTA is not planned now for CCP
     OTAConfig::Init();
+#endif
 }
 #endif
 
-void EFR32MatterConfig::ConnectivityEventCallback(const ChipDeviceEvent * event, intptr_t arg)
-{
+void SI917MatterConfig::ConnectivityEventCallback(const ChipDeviceEvent * event, intptr_t arg){
     // Initialize OTA only when Thread or WiFi connectivity is established
-    if (((event->Type == DeviceEventType::kThreadConnectivityChange) &&
+    /*if (((event->Type == DeviceEventType::kThreadConnectivityChange) &&
          (event->ThreadConnectivityChange.Result == kConnectivity_Established)) ||
         ((event->Type == DeviceEventType::kInternetConnectivityChange) &&
          (event->InternetConnectivityChange.IPv6 == kConnectivity_Established)))
     {
-#if EFR32_OTA_ENABLED
         SILABS_LOG("Scheduling OTA Requestor initialization")
         chip::DeviceLayer::SystemLayer().StartTimer(chip::System::Clock::Seconds32(OTAConfig::kInitOTARequestorDelaySec),
                                                     InitOTARequestorHandler, nullptr);
-#endif
-    }
+    }*/
+    SILABS_LOG("Scheduling OTA Requestor initialization")
 }
 
-CHIP_ERROR EFR32MatterConfig::InitMatter(const char * appName)
+CHIP_ERROR SI917MatterConfig::InitMatter(const char * appName)
 {
     CHIP_ERROR err;
 
@@ -154,39 +105,27 @@
     SILABS_LOG("Init CHIP Stack");
     // Init Chip memory management before the stack
     ReturnErrorOnFailure(chip::Platform::MemoryInit());
+
+    SILABS_LOG("Init RSI 911x Platform");
+    int32_t deviceInit = wfx_rsi_platform();
+    if (deviceInit != SL_STATUS_OK)
+    {
+        SILABS_LOG("RSI init failed");
+        return CHIP_ERROR_INTERNAL;
+    }
     ReturnErrorOnFailure(PlatformMgr().InitChipStack());
 
     chip::DeviceLayer::ConnectivityMgr().SetBLEDeviceName(appName);
 
-#if CHIP_ENABLE_OPENTHREAD
-    ReturnErrorOnFailure(InitOpenThread());
-#endif
-
     // Stop Matter event handling while setting up resources
     chip::DeviceLayer::PlatformMgr().LockChipStack();
 
     // Create initParams with SDK example defaults here
     static chip::CommonCaseDeviceServerInitParams initParams;
 
-#if CHIP_CRYPTO_PLATFORM
-    // When building with EFR32 crypto, use the opaque key store
-    // instead of the default (insecure) one.
-    gOperationalKeystore.Init();
-    initParams.operationalKeystore = &gOperationalKeystore;
-#endif
-
     // Initialize the remaining (not overridden) providers to the SDK example defaults
     (void) initParams.InitializeStaticResourcesBeforeServerInit();
 
-#if CHIP_ENABLE_OPENTHREAD
-    // Set up OpenThread configuration when OpenThread is included
-    chip::Inet::EndPointStateOpenThread::OpenThreadEndpointInitParam nativeParams;
-    nativeParams.lockCb                = LockOpenThreadTask;
-    nativeParams.unlockCb              = UnlockOpenThreadTask;
-    nativeParams.openThreadInstancePtr = chip::DeviceLayer::ThreadStackMgrImpl().OTInstance();
-    initParams.endpointNativeParams    = static_cast<void *>(&nativeParams);
-#endif
-
     // Init Matter Server and Start Event Loop
     err = chip::Server::GetInstance().Init(initParams);
     chip::DeviceLayer::PlatformMgr().UnlockChipStack();
@@ -194,7 +133,8 @@
     ReturnErrorOnFailure(err);
 
     // OTA Requestor initialization will be triggered by the connectivity events
-    PlatformMgr().AddEventHandler(ConnectivityEventCallback, reinterpret_cast<intptr_t>(nullptr));
+    // TODO
+    // PlatformMgr().AddEventHandler(ConnectivityEventCallback, reinterpret_cast<intptr_t>(nullptr));
 
     SILABS_LOG("Starting Platform Manager Event Loop");
     ReturnErrorOnFailure(PlatformMgr().StartEventLoopTask());
@@ -211,16 +151,8 @@
 }
 
 #ifdef SL_WIFI
-void EFR32MatterConfig::InitWiFi(void)
+void SI917MatterConfig::InitWiFi(void)
 {
-#ifdef WF200_WIFI
-    // Start wfx bus communication task.
-    wfx_bus_start();
-#ifdef SL_WFX_USE_SECURE_LINK
-    wfx_securelink_task_start(); // start securelink key renegotiation task
-#endif                           // SL_WFX_USE_SECURE_LINK
-#endif                           /* WF200_WIFI */
-
 #ifdef RS911X_WIFI
     /*
      * Start up any RSI interface stuff
diff --git a/examples/platform/silabs/SiWx917/matter_config.h b/examples/platform/silabs/SiWx917/matter_config.h
index e0af603..6b3bb62 100644
--- a/examples/platform/silabs/SiWx917/matter_config.h
+++ b/examples/platform/silabs/SiWx917/matter_config.h
@@ -22,7 +22,7 @@
 #include <platform/CHIPDeviceLayer.h>
 #include <platform/KeyValueStoreManager.h>
 
-class EFR32MatterConfig
+class SI917MatterConfig
 {
 public:
     static CHIP_ERROR InitMatter(const char * appName);
diff --git a/examples/platform/silabs/SiWx917/project_include/OpenThreadConfig.h b/examples/platform/silabs/SiWx917/project_include/OpenThreadConfig.h
deleted file mode 100644
index dccf3c8..0000000
--- a/examples/platform/silabs/SiWx917/project_include/OpenThreadConfig.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- *
- *    Copyright (c) 2020 Project CHIP Authors
- *    Copyright (c) 2019 Google LLC.
- *    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
- *      Overrides to default OpenThread configuration.
- *
- */
-
-#pragma once
-
-#include <em_device.h>
-
-// Disable the SiLabs-supplied OpenThread logging facilities and use
-// the facilities provided by the Device Layer (see
-// src/platform/silabs/Logging.cpp).
-#define OPENTHREAD_CONFIG_LOG_OUTPUT OPENTHREAD_CONFIG_LOG_OUTPUT_APP
-
-// Turn on a moderate level of logging in OpenThread
-// Enable use of external heap allocator (calloc/free) for OpenThread.
-#define OPENTHREAD_CONFIG_HEAP_EXTERNAL_ENABLE 1
-
-// EFR32MG21A020F1024IM32 has 96k of RAM. Reduce the number of buffers to
-// conserve RAM for this Series 2 part.
-#if defined(EFR32MG21)
-#define OPENTHREAD_CONFIG_NUM_MESSAGE_BUFFERS 22
-#define OPENTHREAD_CONFIG_CLI_UART_TX_BUFFER_SIZE 512
-#define OPENTHREAD_CONFIG_CLI_UART_RX_BUFFER_SIZE 512
-#endif
-
-#define OPENTHREAD_CONFIG_NCP_HDLC_ENABLE 1
-#define OPENTHREAD_CONFIG_IP6_SLAAC_ENABLE 1
-
-#define OPENTHREAD_CONFIG_DNS_CLIENT_ENABLE 1
-#define OPENTHREAD_CONFIG_SRP_CLIENT_ENABLE 1
-#define OPENTHREAD_CONFIG_ECDSA_ENABLE 1
-
-// disable unused features
-#define OPENTHREAD_CONFIG_COAP_API_ENABLE 0
-#define OPENTHREAD_CONFIG_JOINER_ENABLE 0
-#define OPENTHREAD_CONFIG_COMMISSIONER_ENABLE 0
-#define OPENTHREAD_CONFIG_UDP_FORWARD_ENABLE 0
-#define OPENTHREAD_CONFIG_BORDER_ROUTER_ENABLE 0
-#define OPENTHREAD_CONFIG_DHCP6_CLIENT_ENABLE 0
-#define OPENTHREAD_CONFIG_DHCP6_SERVER_ENABLE 0
-#define OPENTHREAD_CONFIG_TCP_ENABLE 0
-
-// Support udp multicast by enabling Multicast Listener Registration (MLR)
-#define OPENTHREAD_CONFIG_MLR_ENABLE 1
-
-// Define as 1 to stay awake between fragments while transmitting a large packet,
-// and to stay awake after receiving a packet with frame pending set to true.
-#define OPENTHREAD_CONFIG_MAC_STAY_AWAKE_BETWEEN_FRAGMENTS 1
-
-// Use the SiLabs-supplied default platform configuration for remainder
-// of OpenThread config options.
-//
-// NB: This file gets included during the build of OpenThread.  Hence
-// it cannot use "openthread" in the path to the included file.
-//
-#include "openthread-core-efr32-config.h"
diff --git a/examples/platform/silabs/SiWx917/pw_sys_io/BUILD.gn b/examples/platform/silabs/SiWx917/pw_sys_io/BUILD.gn
index 722d2a7..20547c3 100644
--- a/examples/platform/silabs/SiWx917/pw_sys_io/BUILD.gn
+++ b/examples/platform/silabs/SiWx917/pw_sys_io/BUILD.gn
@@ -17,7 +17,7 @@
 
 import("$dir_pw_build/target_types.gni")
 
-examples_plat_dir = "${chip_root}/examples/platform/silabs/efr32"
+examples_plat_dir = "${chip_root}/examples/platform/silabs/SiWx917"
 
 config("default_config") {
   include_dirs = [ "public" ]
diff --git a/examples/platform/silabs/SiWx917/pw_sys_io/sys_io_efr32.cc b/examples/platform/silabs/SiWx917/pw_sys_io/sys_io_siwx917.cc
similarity index 100%
rename from examples/platform/silabs/SiWx917/pw_sys_io/sys_io_efr32.cc
rename to examples/platform/silabs/SiWx917/pw_sys_io/sys_io_siwx917.cc
diff --git a/examples/platform/silabs/SiWx917/rs911x/hal/efx_spi.c b/examples/platform/silabs/SiWx917/rs911x/hal/efx_spi.c
deleted file mode 100644
index f01cac3..0000000
--- a/examples/platform/silabs/SiWx917/rs911x/hal/efx_spi.c
+++ /dev/null
@@ -1,324 +0,0 @@
-/*
- *
- *    Copyright (c) 2022 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.
- */
-
-/**
- * Includes
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "dmadrv.h"
-#include "em_chip.h"
-#include "em_cmu.h"
-#include "em_core.h"
-#include "em_device.h"
-#include "em_gpio.h"
-#include "em_ldma.h"
-#if defined(EFR32MG12)
-#include "em_usart.h"
-#elif defined(EFR32MG24)
-#include "em_eusart.h"
-#endif
-#include "spidrv.h"
-
-#include "gpiointerrupt.h"
-#include "sl_device_init_clocks.h"
-#include "sl_status.h"
-
-#include "FreeRTOS.h"
-#include "event_groups.h"
-#include "task.h"
-
-#include "wfx_host_events.h"
-#include "wfx_rsi.h"
-
-#include "rsi_board_configuration.h"
-#include "rsi_driver.h"
-#include "sl_device_init_dpll.h"
-#include "sl_device_init_hfxo.h"
-
-StaticSemaphore_t xEfxSpiIntfSemaBuffer;
-static SemaphoreHandle_t spi_sem;
-
-#if defined(EFR32MG12)
-#include "sl_spidrv_exp_config.h"
-extern SPIDRV_Handle_t sl_spidrv_exp_handle;
-#endif
-
-#if defined(EFR32MG24)
-#include "sl_spidrv_eusart_exp_config.h"
-extern SPIDRV_Handle_t sl_spidrv_eusart_exp_handle;
-#endif
-
-static unsigned int tx_dma_channel;
-static unsigned int rx_dma_channel;
-
-static uint32_t dummy_data; /* Used for DMA - when results don't matter */
-extern void rsi_gpio_irq_cb(uint8_t irqnum);
-//#define RS911X_USE_LDMA
-
-/********************************************************
- * @fn   sl_wfx_host_gpio_init(void)
- * @brief
- *        Deal with the PINS that are not associated with SPI -
- *        Ie. RESET, Wakeup
- * @return
- *        None
- **********************************************************/
-void sl_wfx_host_gpio_init(void)
-{
-    // Enable GPIO clock.
-    CMU_ClockEnable(cmuClock_GPIO, true);
-
-    GPIO_PinModeSet(WFX_RESET_PIN.port, WFX_RESET_PIN.pin, gpioModePushPull, PINOUT_SET);
-    GPIO_PinModeSet(WFX_SLEEP_CONFIRM_PIN.port, WFX_SLEEP_CONFIRM_PIN.pin, gpioModePushPull, PINOUT_CLEAR);
-
-    CMU_OscillatorEnable(cmuOsc_LFXO, true, true);
-
-    // Set up interrupt based callback function - trigger on both edges.
-    GPIOINT_Init();
-    GPIO_PinModeSet(WFX_INTERRUPT_PIN.port, WFX_INTERRUPT_PIN.pin, gpioModeInputPull, PINOUT_CLEAR);
-    GPIO_ExtIntConfig(WFX_INTERRUPT_PIN.port, WFX_INTERRUPT_PIN.pin, SL_WFX_HOST_PINOUT_SPI_IRQ, true, false, true);
-    GPIOINT_CallbackRegister(SL_WFX_HOST_PINOUT_SPI_IRQ, rsi_gpio_irq_cb);
-    GPIO_IntDisable(1 << SL_WFX_HOST_PINOUT_SPI_IRQ); /* Will be enabled by RSI */
-
-    // Change GPIO interrupt priority (FreeRTOS asserts unless this is done here!)
-    NVIC_SetPriority(GPIO_EVEN_IRQn, WFX_SPI_NVIC_PRIORITY);
-    NVIC_SetPriority(GPIO_ODD_IRQn, WFX_SPI_NVIC_PRIORITY);
-}
-
-/*****************************************************************
- * @fn  void sl_wfx_host_reset_chip(void)
- * @brief
- *      To reset the WiFi CHIP
- * @return
- *      None
- ****************************************************************/
-void sl_wfx_host_reset_chip(void)
-{
-    // Pull it low for at least 1 ms to issue a reset sequence
-    GPIO_PinOutClear(WFX_RESET_PIN.port, WFX_RESET_PIN.pin);
-
-    // Delay for 10ms
-    vTaskDelay(pdMS_TO_TICKS(10));
-
-    // Hold pin high to get chip out of reset
-    GPIO_PinOutSet(WFX_RESET_PIN.port, WFX_RESET_PIN.pin);
-
-    // Delay for 3ms
-    vTaskDelay(pdMS_TO_TICKS(3));
-}
-
-/*****************************************************************
- * @fn   void rsi_hal_board_init(void)
- * @brief
- *       Initialize the board
- * @return
- *       None
- ****************************************************************/
-void rsi_hal_board_init(void)
-{
-    spi_sem = xSemaphoreCreateBinaryStatic(&xEfxSpiIntfSemaBuffer);
-    xSemaphoreGive(spi_sem);
-
-    /* Assign DMA channel from Handle*/
-#if defined(EFR32MG12)
-    /* MG12 + rs9116 combination uses USART driver */
-    tx_dma_channel = sl_spidrv_exp_handle->txDMACh;
-    rx_dma_channel = sl_spidrv_exp_handle->rxDMACh;
-
-#elif defined(EFR32MG24)
-    /* MG24 + rs9116 combination uses EUSART driver */
-    tx_dma_channel = sl_spidrv_eusart_exp_handle->txDMACh;
-    rx_dma_channel = sl_spidrv_eusart_exp_handle->rxDMACh;
-#endif
-
-    /* GPIO INIT of MG12 & MG24 : Reset, Wakeup, Interrupt */
-    WFX_RSI_LOG("RSI_HAL: init GPIO");
-    sl_wfx_host_gpio_init();
-
-    /* Reset of Wifi chip */
-    WFX_RSI_LOG("RSI_HAL: Reset Wifi");
-    sl_wfx_host_reset_chip();
-    WFX_RSI_LOG("RSI_HAL: Init done");
-}
-
-/*****************************************************************************
- *@fn static bool rx_dma_complete(unsigned int channel, unsigned int sequenceNo, void *userParam)
- *
- *@brief
- *    complete dma
- *
- * @param[in] channel:
- * @param[in] sequenceNO: sequence number
- * @param[in] userParam :user parameter
- *
- * @return
- *    None
- ******************************************************************************/
-static bool rx_dma_complete(unsigned int channel, unsigned int sequenceNo, void * userParam)
-{
-    BaseType_t xHigherPriorityTaskWoken = pdFALSE;
-    // uint8_t *buf = (void *)userParam;
-
-    (void) channel;
-    (void) sequenceNo;
-    (void) userParam;
-
-    // WFX_RSI_LOG ("SPI: DMA done [%x,%x,%x,%x]", buf [0], buf [1], buf [2], buf [3]);
-    xSemaphoreGiveFromISR(spi_sem, &xHigherPriorityTaskWoken);
-    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
-
-    return true;
-}
-
-/*************************************************************
- * @fn   static void receiveDMA(uint8_t *rx_buf, uint16_t xlen)
- * @brief
- *       RX buf was specified
- *       TX buf was not specified by caller - so we
- *       transmit dummy data (typically 0)
- * @param[in] rx_buf:
- * @param[in] xlen:
- * @return
- *        None
- *******************************************************************/
-static void receiveDMA(uint8_t * rx_buf, uint16_t xlen)
-{
-    /*
-     * The caller wants to receive data -
-     * The xmit can be dummy data (no src increment for tx)
-     */
-    dummy_data = 0;
-    DMADRV_PeripheralMemory(rx_dma_channel, MY_USART_RX_SIGNAL, (void *) rx_buf, (void *) &(MY_USART->RXDATA), true, xlen,
-                            dmadrvDataSize1, rx_dma_complete, NULL);
-
-    // Start transmit DMA.
-    DMADRV_MemoryPeripheral(tx_dma_channel, MY_USART_TX_SIGNAL, (void *) &(MY_USART->TXDATA), (void *) &(dummy_data), false, xlen,
-                            dmadrvDataSize1, NULL, NULL);
-}
-
-/*****************************************************************************
- *@fn static void transmitDMA(void *rx_buf, void *tx_buf, uint8_t xlen)
- *@brief
- *    we have a tx_buf. There are some instances where
- *    a rx_buf is not specified. If one is specified then
- *    the caller wants results (auto increment src)
- * @param[in] rx_buf:
- * @param[in] tx_buf:
- * @param[in] xlen:
- * @return
- *     None
- ******************************************************************************/
-static void transmitDMA(uint8_t * rx_buf, uint8_t * tx_buf, uint16_t xlen)
-{
-    void * buf;
-    bool srcinc;
-    /*
-     * we have a tx_buf. There are some instances where
-     * a rx_buf is not specified. If one is specified then
-     * the caller wants results (auto increment src)
-     * TODO - the caller specified 8/32 bit - we should use this
-     * instead of dmadrvDataSize1 always
-     */
-    if (rx_buf == NULL)
-    {
-        buf    = &dummy_data;
-        srcinc = false;
-    }
-    else
-    {
-        buf                   = rx_buf;
-        srcinc                = true;
-        /* DEBUG */ rx_buf[0] = 0xAA;
-        rx_buf[1]             = 0x55;
-    }
-    DMADRV_PeripheralMemory(rx_dma_channel, MY_USART_RX_SIGNAL, buf, (void *) &(MY_USART->RXDATA), srcinc, xlen, dmadrvDataSize1,
-                            rx_dma_complete, buf);
-    // Start transmit DMA.
-    DMADRV_MemoryPeripheral(tx_dma_channel, MY_USART_TX_SIGNAL, (void *) &(MY_USART->TXDATA), (void *) tx_buf, true, xlen,
-                            dmadrvDataSize1, NULL, NULL);
-}
-
-/*********************************************************************
- * @fn   int16_t rsi_spi_transfer(uint8_t *tx_buf, uint8_t *rx_buf, uint16_t xlen, uint8_t mode)
- * @brief
- *       Do a SPI transfer - Mode is 8/16 bit - But every 8 bit is aligned
- * @param[in] tx_buf:
- * @param[in] rx_buf:
- * @param[in] xlen:
- * @param[in] mode:
- * @return
- *        None
- **************************************************************************/
-int16_t rsi_spi_transfer(uint8_t * tx_buf, uint8_t * rx_buf, uint16_t xlen, uint8_t mode)
-{
-    // WFX_RSI_LOG ("SPI: Xfer: tx=%x,rx=%x,len=%d",(uint32_t)tx_buf, (uint32_t)rx_buf, xlen);
-    if (xlen > MIN_XLEN)
-    {
-        MY_USART->CMD = USART_CMD_CLEARRX | USART_CMD_CLEARTX;
-        if (xSemaphoreTake(spi_sem, portMAX_DELAY) != pdTRUE)
-        {
-            return RSI_FALSE;
-        }
-        if (tx_buf == NULL)
-        {
-            receiveDMA(rx_buf, xlen);
-        }
-        else
-        {
-            transmitDMA(rx_buf, tx_buf, xlen);
-        }
-
-        /*
-         * receiveDMA() and transmitDMA() are asynchronous
-         * Our application design assumes that this function is synchronous
-         * To make it synchronous, we wait to re-acquire the semaphore before exiting this function
-         * rx_dma_complete() gives back the semaphore when the SPI transfer is done
-         */
-        if (xSemaphoreTake(spi_sem, pdMS_TO_TICKS(RSI_SEM_BLOCK_MIN_TIMER_VALUE_MS)) == pdTRUE)
-        {
-            // Transfer complete
-            // Give back the semaphore before exiting, so that it may be re-acquired
-            // in this function, just before the next transfer
-            xSemaphoreGive(spi_sem);
-        }
-        // Temporary patch
-        // Sometimes the xSemaphoreTake() above is getting stuck indefinitely
-        // As a workaround, if the transfer is not done within RSI_SEM_BLOCK_MIN_TIMER_VALUE_MS
-        // stop and start it again
-        // No need to re-acquire the semaphore since this is the function that acquired it
-        // TODO: Remove this after a permanent solution is found to the problem of the transfer getting stuck
-        else
-        {
-            uint32_t ldma_flags = 0;
-            uint32_t rem_len    = 0;
-            rem_len             = LDMA_TransferRemainingCount(RSI_LDMA_TRANSFER_CHANNEL_NUM);
-            LDMA_StopTransfer(RSI_LDMA_TRANSFER_CHANNEL_NUM);
-            ldma_flags = LDMA_IntGet();
-            LDMA_IntClear(ldma_flags);
-            receiveDMA(rx_buf, rem_len);
-            if (xSemaphoreTake(spi_sem, portMAX_DELAY) == pdTRUE)
-            {
-                xSemaphoreGive(spi_sem);
-            }
-        }
-    }
-
-    return RSI_ERROR_NONE;
-}
diff --git a/examples/platform/silabs/SiWx917/rs911x/hal/rsi_board_configuration.h b/examples/platform/silabs/SiWx917/rs911x/hal/rsi_board_configuration.h
deleted file mode 100644
index 204e751..0000000
--- a/examples/platform/silabs/SiWx917/rs911x/hal/rsi_board_configuration.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *
- *    Copyright (c) 2022 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.
- */
-
-#ifndef _RSI_BOARD_CONFIGURATION_H_
-#define _RSI_BOARD_CONFIGURATION_H_
-
-typedef struct
-{
-    unsigned char port;
-    unsigned char pin;
-} rsi_pin_t;
-
-#define PIN(port_id, pin_id)                                                                                                       \
-    (rsi_pin_t) { .port = gpioPort##port_id, .pin = pin_id }
-
-#if defined(EFR32MG12_BRD4161A) || defined(BRD4161A) || defined(EFR32MG12_BRD4162A) || defined(BRD4162A) ||                        \
-    defined(EFR32MG12_BRD4163A) || defined(BRD4163A) || defined(EFR32MG12_BRD4164A) || defined(BRD4164A) ||                        \
-    defined(EFR32MG12_BRD4170A) || defined(BRD4170A)
-// BRD4161-63-64 are pin to pin compatible for SPI
-#include "brd4161a.h"
-#elif defined(EFR32MG24_BRD4186C) || defined(BRD4186C)
-#include "brd4186c.h"
-#elif defined(EFR32MG24_BRD4187C) || defined(BRD4187C)
-#include "brd4187c.h"
-#else
-#error "Need SPI Pins"
-#endif /* EFR32MG12_BRD4161A */
-
-#endif /* _RSI_BOARD_CONFIGURATION_H_ */
diff --git a/examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal_mcu_interrupt.c b/examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal_mcu_interrupt.c
deleted file mode 100644
index 40e4189..0000000
--- a/examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal_mcu_interrupt.c
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- *
- *    Copyright (c) 2022 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.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "dmadrv.h"
-#include "em_chip.h"
-#include "em_cmu.h"
-#include "em_core.h"
-#include "em_device.h"
-#include "em_gpio.h"
-#include "em_ldma.h"
-#include "em_usart.h"
-#include "gpiointerrupt.h"
-#include "sl_device_init_clocks.h"
-#include "sl_status.h"
-
-#include "FreeRTOS.h"
-#include "event_groups.h"
-#include "task.h"
-
-#include "wfx_host_events.h"
-#include "wfx_rsi.h"
-
-#include "rsi_board_configuration.h"
-#include "rsi_driver.h"
-
-typedef void (*UserIntCallBack_t)(void);
-UserIntCallBack_t call_back, gpio_callback;
-#ifdef LOGGING_STATS
-uint8_t current_pin_set, prev_pin_set;
-#endif /* LOGGING_STATS */
-
-/* ARGSUSED */
-void rsi_gpio_irq_cb(uint8_t irqnum)
-{
-
-    // WFX_RSI_LOG ("RSI: Got Int=%d", irqnum)
-    if (irqnum != SL_WFX_HOST_PINOUT_SPI_IRQ)
-        return;
-    GPIO_IntClear(1 << SL_WFX_HOST_PINOUT_SPI_IRQ);
-
-    // WFX_RSI_LOG ("Got SPI intr, cb=%x", (uint32_t)call_back);
-    if (call_back != NULL)
-        (*call_back)();
-}
-
-/*===================================================*/
-/**
- * @fn           void rsi_hal_intr_config(void (* rsi_interrupt_handler)())
- * @brief        Starts and enables the SPI interrupt
- * @param[in]    rsi_interrupt_handler() ,call back function to handle interrupt
- * @param[out]   none
- * @return       none
- * @description  This HAL API should contain the code to initialize the register/pins
- *               related to interrupts and enable the interrupts.
- */
-void rsi_hal_intr_config(void (*rsi_interrupt_handler)(void))
-{
-    call_back = rsi_interrupt_handler;
-    WFX_RSI_LOG("RSI:Set SPI intr CB to=%x", (uint32_t) call_back);
-}
-
-/*===================================================*/
-/**
- * @fn           void rsi_hal_log_stats_intr_config(void (* rsi_give_wakeup_indication)())
- * @brief        Checks the interrupt and map/set gpio callback function
- * @param[in]    rsi_give_wakeup_indication() ,gpio call back function to handle interrupt
- * @param[out]   none
- * @return       none
- * @description  This HAL API should contain the code
- *               related to mapping of gpio callback function.
- */
-#ifdef LOGGING_STATS
-void rsi_hal_log_stats_intr_config(void (*rsi_give_wakeup_indication)())
-{
-    gpio_callback = rsi_give_wakeup_indication;
-}
-#endif
-
-/*===================================================*/
-/**
- * @fn           void rsi_hal_intr_mask(void)
- * @brief        Disables the SPI Interrupt
- * @param[in]    none
- * @param[out]   none
- * @return       none
- * @description  This HAL API should contain the code to mask/disable interrupts.
- */
-void rsi_hal_intr_mask(void)
-{
-    // WFX_RSI_LOG ("RSI:Disable IRQ");
-    // NVIC_DisableIRQ(GPIO_ODD_IRQn);
-    GPIO_IntDisable(1 << SL_WFX_HOST_PINOUT_SPI_IRQ);
-}
-
-/*===================================================*/
-/**
- * @fn           void rsi_hal_intr_unmask(void)
- * @brief        Enables the SPI interrupt
- * @param[in]    none
- * @param[out]   none
- * @return       none
- * @description  This HAL API should contain the code to enable interrupts.
- */
-void rsi_hal_intr_unmask(void)
-{
-    // Unmask/Enable the interrupt
-    NVIC_EnableIRQ(GPIO_ODD_IRQn);
-    NVIC_EnableIRQ(GPIO_EVEN_IRQn);
-    GPIO_IntEnable(1 << SL_WFX_HOST_PINOUT_SPI_IRQ);
-    // WFX_RSI_LOG ("RSI:Enable IRQ (mask=%x)", GPIO_IntGetEnabled ());
-}
-
-/*===================================================*/
-/**
- * @fn           void rsi_hal_intr_clear(void)
- * @brief        Clears the pending interrupt
- * @param[in]    none
- * @param[out]   none
- * @return       none
- * @description  This HAL API should contain the code to clear the handled interrupts.
- */
-void rsi_hal_intr_clear(void)
-{
-    GPIO_IntClear(1 << SL_WFX_HOST_PINOUT_SPI_IRQ);
-}
-
-/*===================================================*/
-/**
- * @fn          void rsi_hal_intr_pin_status(void)
- * @brief       Checks the SPI interrupt at pin level
- * @param[in]   none
- * @param[out]  uint8_t, interrupt status
- * @return      none
- * @description This API is used to check interrupt pin status(pin level whether it is high/low).
- */
-uint8_t rsi_hal_intr_pin_status(void)
-{
-    uint32_t mask;
-    // Return interrupt pin  status(high(1) /low (0))
-    mask = GPIO_PinInGet(WFX_INTERRUPT_PIN.port, WFX_INTERRUPT_PIN.pin);
-
-    return !!mask;
-}
diff --git a/examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal_mcu_ioports.c b/examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal_mcu_ioports.c
deleted file mode 100644
index 1ff5bc5..0000000
--- a/examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal_mcu_ioports.c
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- *
- *    Copyright (c) 2022 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.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "dmadrv.h"
-#include "em_chip.h"
-#include "em_cmu.h"
-#include "em_core.h"
-#include "em_device.h"
-#include "em_gpio.h"
-#include "em_ldma.h"
-#include "em_usart.h"
-#include "gpiointerrupt.h"
-#include "sl_device_init_clocks.h"
-#include "sl_status.h"
-
-#include "FreeRTOS.h"
-#include "event_groups.h"
-#include "task.h"
-
-#include "wfx_host_events.h"
-#include "wfx_rsi.h"
-
-#include "rsi_board_configuration.h"
-#include "rsi_driver.h"
-
-/*===========================================================*/
-/**
- * @fn            void rsi_hal_config_gpio(uint8_t gpio_number,uint8_t mode,uint8_t value)
- * @brief         Configures gpio pin in output mode,with a value
- * @param[in]     uint8_t gpio_number, gpio pin number to be configured
- * @param[in]     uint8_t mode , input/output mode of the gpio pin to configure
- *                0 - input mode
- *                1 - output mode
- * @param[in]     uint8_t value, default value to be driven if gpio is configured in output mode
- *                0 - low
- *                1 - high
- * @param[out]    none
- * @return        none
- * @description This API is used to configure host gpio pin in output mode.
- */
-void rsi_hal_config_gpio(uint8_t gpio_number, uint8_t mode, uint8_t value)
-{
-
-    CMU_ClockEnable(cmuClock_GPIO, true);
-
-    // WFX_RSI_LOG ("RSI: CFG GPIO: 0x%x", gpio_number);
-    switch (gpio_number)
-    {
-    case RSI_HAL_RESET_PIN:
-        GPIO_PinModeSet(WFX_RESET_PIN.port, WFX_RESET_PIN.pin, gpioModePushPull, PINOUT_SET);
-        break;
-    default:
-        break;
-    }
-}
-
-/*===========================================================*/
-/**
- * @fn            void rsi_hal_set_gpio(uint8_t gpio_number)
- * @brief         Makes/drives the gpio  value high
- * @param[in]     uint8_t gpio_number, gpio pin number
- * @param[out]    none
- * @return        none
- * @description   This API is used to drives or makes the host gpio value high.
- */
-void rsi_hal_set_gpio(uint8_t gpio_number)
-{
-    // WFX_RSI_LOG ("RSI: SET GPIO: 0x%x", gpio_number);
-    switch (gpio_number)
-    {
-    case RSI_HAL_RESET_PIN:
-        GPIO_PinModeSet(WFX_RESET_PIN.port, WFX_RESET_PIN.pin, gpioModeWiredOrPullDown, PINOUT_SET);
-        break;
-    default:
-        break;
-    }
-}
-
-/*===========================================================*/
-/**
- * @fn          uint8_t rsi_hal_get_gpio(void)
- * @brief       get the gpio pin value
- * @param[in]   uint8_t gpio_number, gpio pin number
- * @param[out]  none
- * @return      gpio pin value
- * @description This API is used to configure get the gpio pin value.
- */
-uint8_t rsi_hal_get_gpio(uint8_t gpio_number)
-{
-    // WFX_RSI_LOG ("RSI: GET GPIO: 0x%x", gpio_number);
-    switch (gpio_number)
-    {
-    case RSI_HAL_RESET_PIN:
-        return GPIO_PinInGet(WFX_RESET_PIN.port, WFX_RESET_PIN.pin);
-    case RSI_HAL_MODULE_INTERRUPT_PIN:
-        return GPIO_PinInGet(WFX_INTERRUPT_PIN.port, WFX_INTERRUPT_PIN.pin);
-    default:
-        break;
-    }
-
-    return 0;
-}
-
-/*===========================================================*/
-/**
- * @fn            void rsi_hal_set_gpio(uint8_t gpio_number)
- * @brief         Makes/drives the gpio value to low
- * @param[in]     uint8_t gpio_number, gpio pin number
- * @param[out]    none
- * @return        none
- * @description   This API is used to drives or makes the host gpio value low.
- */
-void rsi_hal_clear_gpio(uint8_t gpio_number)
-{
-    // WFX_RSI_LOG ("RSI: CLR GPIO: 0x%x", gpio_number);
-    switch (gpio_number)
-    {
-    case RSI_HAL_RESET_PIN:
-        return GPIO_PinOutClear(WFX_RESET_PIN.port, WFX_RESET_PIN.pin);
-    default:
-        break;
-    }
-}
diff --git a/examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal_mcu_rtc.c b/examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal_mcu_rtc.c
deleted file mode 100644
index f57d47a..0000000
--- a/examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal_mcu_rtc.c
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- *
- *    Copyright (c) 2022 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.
- */
-
-/**
- * Includes
- */
-#include "em_cmu.h"
-#include "em_core.h"
-#include "em_rtcc.h"
-#include "sl_sleeptimer_config.h"
-#include "sl_status.h"
-#include <stdlib.h>
-#include <time.h>
-
-#define ZONE0 0
-#define CH_SELECTOR 1u
-#define RTC_DEFAULT_COUNTER_VALUE 0u
-#define RSI_RTC_FREQ_VALUE 0
-#define TIME_ZONE_OFFSET 0u
-
-#define SLEEPTIMER_EVENT_OF (0x01)
-#define SLEEPTIMER_EVENT_COMP (0x02)
-#define SLEEPTIMER_ENUM(name)                                                                                                      \
-    typedef uint8_t name;                                                                                                          \
-    enum name##_enum
-#define TIME_UNIX_EPOCH (1970u)
-#define TIME_NTP_EPOCH (1900u)
-#define TIME_ZIGBEE_EPOCH (2000u)
-#define TIME_NTP_UNIX_EPOCH_DIFF (TIME_UNIX_EPOCH - TIME_NTP_EPOCH)
-#define TIME_ZIGBEE_UNIX_EPOCH_DIFF (TIME_ZIGBEE_EPOCH - TIME_UNIX_EPOCH)
-#define TIME_DAY_COUNT_NTP_TO_UNIX_EPOCH (TIME_NTP_UNIX_EPOCH_DIFF * 365u + 17u)      ///< 70 years and 17 leap days
-#define TIME_DAY_COUNT_ZIGBEE_TO_UNIX_EPOCH (TIME_ZIGBEE_UNIX_EPOCH_DIFF * 365u + 7u) ///< 30 years and 7 leap days
-#define TIME_SEC_PER_DAY (60u * 60u * 24u)
-#define TIME_NTP_EPOCH_OFFSET_SEC (TIME_DAY_COUNT_NTP_TO_UNIX_EPOCH * TIME_SEC_PER_DAY)
-#define TIME_ZIGBEE_EPOCH_OFFSET_SEC (TIME_DAY_COUNT_ZIGBEE_TO_UNIX_EPOCH * TIME_SEC_PER_DAY)
-#define TIME_DAY_PER_YEAR (365u)
-#define TIME_SEC_PER_YEAR (TIME_SEC_PER_DAY * TIME_DAY_PER_YEAR)
-#define TIME_UNIX_TIMESTAMP_MAX (0x7FFFFFFF)
-
-/// Time zone offset from UTC(second).
-typedef int32_t sl_sleeptimer_time_zone_offset_t;
-/// Timestamp, wall clock time in seconds.
-typedef uint32_t sl_sleeptimer_timestamp_t;
-/// @brief Time Format.
-SLEEPTIMER_ENUM(sl_sleeptimer_time_format_t){
-    TIME_FORMAT_UNIX = 0,           ///< Number of seconds since January 1, 1970, 00:00.
-                                    ///< Type is signed, so represented on 31 bit.
-    TIME_FORMAT_NTP = 1,            ///< Number of seconds since January 1, 1900, 00:00.
-                                    ///< Type is unsigned, so represented on 32 bit.
-    TIME_FORMAT_ZIGBEE_CLUSTER = 2, ///< Number of seconds since January 1, 2000, 00:00. Type is
-                                    ///< unsigned, so represented on 32 bit.
-};
-
-// Initialization flag.
-static bool is_sleeptimer_initialized = false;
-// Timer frequency in Hz.
-static uint32_t timer_frequency;
-#if SL_SLEEPTIMER_WALLCLOCK_CONFIG
-// Current time count.
-static sl_sleeptimer_timestamp_t second_count;
-// Tick rest when the frequency is not a divider of the timer width.
-static uint32_t overflow_tick_rest = 0;
-#endif
-
-/*******************************************************************************
- * Checks if the time stamp, format and time zone are
- *  within the supported range.
- *
- * @param time Time stamp to check.
- * @param format Format of the time.
- * @param time_zone Time zone offset in second.
- *
- * @return true if the time is valid. False otherwise.
- ******************************************************************************/
-static bool is_valid_time(sl_sleeptimer_timestamp_t time, sl_sleeptimer_time_format_t format,
-                          sl_sleeptimer_time_zone_offset_t time_zone)
-{
-    bool valid_time = false;
-
-    // Check for overflow.
-    if ((time_zone < ZONE0 && time > (uint32_t) abs(time_zone)) || (time_zone >= ZONE0 && (time <= UINT32_MAX - time_zone)))
-    {
-        valid_time = true;
-    }
-    if (format == TIME_FORMAT_UNIX)
-    {
-        if (time > TIME_UNIX_TIMESTAMP_MAX)
-        { // Check if Unix time stamp is an
-          // unsigned 31 bits.
-            valid_time = false;
-        }
-    }
-    else
-    {
-        if ((format == TIME_FORMAT_NTP) && (time >= TIME_NTP_EPOCH_OFFSET_SEC))
-        {
-            valid_time &= true;
-        }
-        else if ((format == TIME_FORMAT_ZIGBEE_CLUSTER) && (time <= TIME_UNIX_TIMESTAMP_MAX - TIME_ZIGBEE_EPOCH_OFFSET_SEC))
-        {
-            valid_time &= true;
-        }
-        else
-        {
-            valid_time = false;
-        }
-    }
-    return valid_time;
-}
-
-/*******************************************************************************
- * Gets RTCC timer frequency.
- ******************************************************************************/
-uint32_t rsi_rtc_get_hal_timer_frequency(void)
-{
-    /* CMU_PrescToLog2 converts prescaler dividend to a logarithmic value. It only works for even
-     * numbers equal to 2^n.
-     * An unscaled dividend (dividend = argument + 1).
-     * So we need to send argument subtracted by 1
-     */
-    return (CMU_ClockFreqGet(cmuClock_RTCC) >> (CMU_PrescToLog2(SL_SLEEPTIMER_FREQ_DIVIDER - 1)));
-}
-
-/******************************************************************************
- * Initializes RTCC sleep timer.
- *****************************************************************************/
-void rsi_rtc_init_timer(void)
-{
-    RTCC_Init_TypeDef rtcc_init   = RTCC_INIT_DEFAULT;
-    RTCC_CCChConf_TypeDef channel = RTCC_CH_INIT_COMPARE_DEFAULT;
-
-    CMU_ClockEnable(cmuClock_RTCC, true);
-
-    rtcc_init.enable = false;
-
-    /* CMU_PrescToLog2 converts prescaler dividend to a logarithmic value. It only works for even
-     * numbers equal to 2^n.
-     * An unscaled dividend (dividend = argument + 1).
-     * So we need to send argument subtracted by 1
-     */
-    rtcc_init.presc = (RTCC_CntPresc_TypeDef)(CMU_PrescToLog2(SL_SLEEPTIMER_FREQ_DIVIDER - 1));
-
-    RTCC_Init(&rtcc_init);
-
-    // Compare channel starts disabled and is enabled only when compare match
-    // interrupt is enabled.
-    channel.chMode = rtccCapComChModeOff;
-    RTCC_ChannelInit(CH_SELECTOR, &channel);
-
-    RTCC_IntDisable(_RTCC_IEN_MASK);
-    RTCC_IntClear(_RTCC_IF_MASK);
-    RTCC_CounterSet(RTC_DEFAULT_COUNTER_VALUE);
-
-    RTCC_Enable(true);
-
-    NVIC_ClearPendingIRQ(RTCC_IRQn);
-    NVIC_EnableIRQ(RTCC_IRQn);
-}
-
-/******************************************************************************
- * Enables RTCC interrupts.
- *****************************************************************************/
-void rsi_rtc_enable_int(uint8_t local_flag)
-{
-    uint32_t rtcc_ien = 0u;
-
-    if (local_flag & SLEEPTIMER_EVENT_OF)
-    {
-        rtcc_ien |= RTCC_IEN_OF;
-    }
-
-    if (local_flag & SLEEPTIMER_EVENT_COMP)
-    {
-        rtcc_ien |= RTCC_IEN_CC1;
-    }
-
-    RTCC_IntEnable(rtcc_ien);
-}
-
-/*******************************************************************************
- * Get timer frequency.
- ******************************************************************************/
-uint32_t rsi_rtc_get_timer_frequency(void)
-{
-    return timer_frequency;
-}
-
-/******************************************************************************
- * Gets RTCC counter value.
- *****************************************************************************/
-uint32_t rsi_rtc_get_counter(void)
-{
-    return RTCC_CounterGet();
-}
-
-sl_status_t rsi_rtc_init(void)
-{
-    CORE_DECLARE_IRQ_STATE;
-    CORE_ENTER_ATOMIC();
-
-    if (!is_sleeptimer_initialized)
-    {
-        rsi_rtc_init_timer();
-        rsi_rtc_enable_int(SLEEPTIMER_EVENT_OF);
-        timer_frequency = rsi_rtc_get_hal_timer_frequency();
-        if (timer_frequency == RSI_RTC_FREQ_VALUE)
-        {
-            CORE_EXIT_ATOMIC();
-            return SL_STATUS_INVALID_PARAMETER;
-        }
-
-#if SL_SLEEPTIMER_WALLCLOCK_CONFIG
-        second_count = 0;
-#endif
-
-        is_sleeptimer_initialized = true;
-    }
-    CORE_EXIT_ATOMIC();
-
-    return SL_STATUS_OK;
-}
-
-#if SL_SLEEPTIMER_WALLCLOCK_CONFIG
-/*******************************************************************************
- * Retrieves current time.
- ******************************************************************************/
-uint32_t rsi_rtc_get_time(void)
-{
-    uint32_t cnt  = 0u;
-    uint32_t freq = 0u;
-    sl_sleeptimer_timestamp_t time;
-    CORE_DECLARE_IRQ_STATE;
-
-    cnt  = rsi_rtc_get_counter();
-    freq = rsi_rtc_get_timer_frequency();
-
-    CORE_ENTER_ATOMIC();
-    time = second_count + cnt / freq;
-    if (cnt % freq + overflow_tick_rest >= freq)
-    {
-        time++;
-    }
-    CORE_EXIT_ATOMIC();
-
-    return time;
-}
-
-/*******************************************************************************
- * Sets current time.
- ******************************************************************************/
-sl_status_t rsi_rtc_settime(sl_sleeptimer_timestamp_t time)
-{
-    uint32_t freq        = 0u;
-    uint32_t counter_sec = 0u;
-    uint32_t cnt         = 0;
-    CORE_DECLARE_IRQ_STATE;
-
-    if (!is_valid_time(time, TIME_FORMAT_UNIX, TIME_ZONE_OFFSET))
-    {
-        return SL_STATUS_INVALID_CONFIGURATION;
-    }
-
-    freq = rsi_rtc_get_timer_frequency();
-    cnt  = rsi_rtc_get_counter();
-
-    CORE_ENTER_ATOMIC();
-    second_count       = time;
-    overflow_tick_rest = 0;
-    counter_sec        = cnt / freq;
-
-    if (second_count >= counter_sec)
-    {
-        second_count -= counter_sec;
-    }
-    else
-    {
-        CORE_EXIT_ATOMIC();
-        return SL_STATUS_INVALID_CONFIGURATION;
-    }
-
-    CORE_EXIT_ATOMIC();
-
-    return SL_STATUS_OK;
-}
-
-/*******************************************************************************
- * @fn  int32_t rsi_rtc_set_time(uint32_t time)
- * @brief
- *      Init Sleeptimer and Set current time.
- * @param[in] time:
- * @return
- *      None
- ******************************************************************************/
-int32_t rsi_rtc_set_time(uint32_t time)
-{
-    sl_status_t ret_val = SL_STATUS_OK;
-    ret_val             = rsi_rtc_init();
-    if (ret_val != SL_STATUS_OK)
-    {
-        return -1;
-    }
-    else
-    {
-        ret_val = rsi_rtc_settime(time);
-        if (ret_val != SL_STATUS_OK)
-        {
-            return -1;
-        }
-    }
-    return 0;
-}
-#endif // SL_SLEEPTIMER_WALLCLOCK_CONFIG
diff --git a/examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal_mcu_timer.c b/examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal_mcu_timer.c
deleted file mode 100644
index c6d6381..0000000
--- a/examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal_mcu_timer.c
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
- *
- *    Copyright (c) 2022 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.
- */
-
-/**
- * Includes
- */
-
-#include "em_cmu.h"
-#ifdef RSI_WITH_OS
-/* FreeRTOS includes. */
-#include "FreeRTOS.h"
-#include "event_groups.h"
-#include "task.h"
-#include "timers.h"
-#if defined(SysTick)
-#undef SysTick_Handler
-/* FreeRTOS SysTick interrupt handler prototype */
-extern void SysTick_Handler(void);
-/* FreeRTOS tick timer interrupt handler prototype */
-extern void xPortSysTickHandler(void);
-#endif /* SysTick */
-#endif /* RSI_WITH_OS */
-#include "wfx_host_events.h"
-
-/* RSI Driver include file */
-#include "rsi_driver.h"
-/* RSI WLAN Config include file */
-#include "rsi_bootup_config.h"
-#include "rsi_common_apis.h"
-#include "rsi_data_types.h"
-#include "rsi_error.h"
-#include "rsi_nwk.h"
-#include "rsi_socket.h"
-#include "rsi_utils.h"
-#include "rsi_wlan.h"
-#include "rsi_wlan_apis.h"
-#include "rsi_wlan_config.h"
-#include "wfx_rsi.h"
-
-#ifndef _use_the_rsi_defined_functions
-
-StaticTimer_t sRsiTimerBuffer;
-
-/*
- * We (Matter port) need a few functions out of this file
- * They are at the top
- */
-uint32_t rsi_hal_gettickcount(void)
-{
-    return xTaskGetTickCount();
-}
-void rsi_delay_ms(uint32_t delay_ms)
-{
-#ifndef RSI_WITH_OS
-    uint32_t start;
-#endif
-    if (delay_ms == 0) // Check if delay is 0msec
-        return;
-
-#ifdef RSI_WITH_OS
-    vTaskDelay(pdMS_TO_TICKS(delay_ms));
-#else
-    start = rsi_hal_gettickcount();
-    do
-    {
-    } while (rsi_hal_gettickcount() - start < delay_ms);
-#endif
-}
-static struct rsi_timer
-{
-    void (*func)(void);
-    TimerHandle_t handle;
-    uint8_t id;
-    uint8_t name[3];
-} rsi_timer[WFX_RSI_NUM_TIMERS];
-static void timer_cb(TimerHandle_t thandle)
-{
-    int x;
-    for (x = 0; x < WFX_RSI_NUM_TIMERS; x++)
-    {
-        if (rsi_timer[x].handle == thandle)
-        {
-            (*rsi_timer[x].func)();
-            break;
-        }
-    }
-}
-
-/*
- * Run a one-shot/periodic timer
- */
-int32_t rsi_timer_start(uint8_t timer_node, uint8_t mode, uint8_t type, uint32_t duration, void (*rsi_timer_cb)(void))
-{
-    int x;
-    struct rsi_timer * tp;
-
-    if (mode == RSI_HAL_TIMER_MODE_MILLI)
-        return RSI_ERROR_INVALID_OPTION; /* Not supported for now - Fix this later */
-    for (x = 0; x < WFX_RSI_NUM_TIMERS; x++)
-    {
-        tp = &rsi_timer[x];
-        if (tp->handle == NULL)
-        {
-            goto found;
-        }
-    }
-    /* No space */
-    return RSI_ERROR_INSUFFICIENT_BUFFER;
-found:
-    tp->name[0] = 'r';
-    tp->name[1] = timer_node;
-    tp->name[2] = 0;
-    tp->func    = rsi_timer_cb;
-    tp->handle =
-        xTimerCreateStatic((char *) &tp->name[0], pdMS_TO_TICKS(duration),
-                           ((mode == RSI_HAL_TIMER_TYPE_SINGLE_SHOT) ? pdFALSE : pdTRUE), NULL, timer_cb, &sRsiTimerBuffer);
-
-    if (tp->handle == NULL)
-    {
-        return RSI_ERROR_INSUFFICIENT_BUFFER;
-    }
-
-    (void) xTimerStart(tp->handle, TIMER_TICKS_TO_WAIT_0);
-
-    return RSI_ERROR_NONE;
-}
-#else /* _use_the_rsi_defined_functions */
-
-/* Counts 1ms timeTicks */
-volatile uint32_t msTicks = 0;
-
-/*===================================================*/
-/**
- * @fn           int32_t rsi_timer_start(uint8_t timer_no, uint8_t mode,uint8_t type,uint32_t duration,void (*
- * rsi_timer_expiry_handler)())
- * @brief        Starts and configures timer
- * @param[in]    timer_node, timer node to be configured.
- * @param[in]    mode , mode of the timer
- *               0 - Micro seconds mode
- *               1 - Milli seconds mode
- * @param[in]    type, type of  the timer
- *               0 - single shot type
- *               1 - periodic type
- * @param[in]    duration, timer duration
- * @param[in]    rsi_timer_expiry_handler() ,call back function to handle timer interrupt
- * @param[out]   none
- * @return       0 - success
- *               !0 - Failure
- * @description  This HAL API should contain the code to initialize the timer and start the timer
- *
- */
-
-int32_t rsi_timer_start(uint8_t timer_node, uint8_t mode, uint8_t type, uint32_t duration, void (*rsi_timer_expiry_handler)(void))
-{
-
-    // Initialise the timer
-
-    // register the call back
-
-    // Start timer
-
-    return 0;
-}
-
-/*===================================================*/
-/**
- * @fn           int32_t rsi_timer_stop(uint8_t timer_no)
- * @brief        Stops timer
- * @param[in]    timer_node, timer node to stop
- * @param[out]   none
- * @return       0 - success
- *               !0 - Failure
- * @description  This HAL API should contain the code to stop the timer
- *
- */
-
-int32_t rsi_timer_stop(uint8_t timer_node)
-{
-
-    // Stop the timer
-
-    return 0;
-}
-
-/*===================================================*/
-/**
- * @fn           uint32_t rsi_timer_read(uint8_t timer_node)
- * @brief        read timer
- * @param[in]    timer_node, timer node to read
- * @param[out]   none
- * @return       timer value
- * @description  This HAL API should contain API to  read the timer
- *
- */
-uint32_t rsi_timer_read(uint8_t timer_node)
-{
-
-    volatile uint32_t timer_val = 0;
-
-    // read the timer and return timer value
-
-    return timer_val;
-}
-
-/*===================================================*/
-/**
- * @fn           void rsi_delay_us(uint32_t delay)
- * @brief        create delay in micro seconds
- * @param[in]    delay_us, timer delay in micro seconds
- * @param[out]   none
- * @return       none
- * @description  This HAL API should contain the code to create delay in micro seconds
- *
- */
-void rsi_delay_us(uint32_t delay_us)
-{
-
-    // call the API for delay in micro seconds
-
-    return;
-}
-
-#ifdef RSI_M4_INTERFACE
-
-extern void SysTick_Handler(void);
-
-void SysTick_Handler(void)
-{
-    _dwTickCount++;
-}
-
-uint32_t GetTickCount(void)
-{
-    return _dwTickCount; // gets the tick count from systic ISR
-}
-#endif
-
-/*===================================================*/
-/**
- * @fn           void rsi_delay_ms(uint32_t delay)
- * @brief        create delay in milli seconds
- * @param[in]    delay, timer delay in milli seconds
- * @param[out]   none
- * @return       none
- * @description  This HAL API should contain the code to create delay in milli seconds
- */
-void rsi_delay_ms(uint32_t delay_ms)
-{
-#ifndef RSI_WITH_OS
-    uint32_t start;
-#endif
-    if (delay_ms == DELAY0)
-        return;
-
-#ifdef RSI_WITH_OS
-    vTaskDelay(delay_ms);
-#else
-    start = rsi_hal_gettickcount();
-    do
-    {
-    } while (rsi_hal_gettickcount() - start < delay_ms);
-#endif
-}
-
-/*===================================================*/
-/**
- * @fn           uint32_t rsi_hal_gettickcount()
- * @brief        provides a tick value in milliseconds
- * @return       tick value
- * @description  This HAL API should contain the code to read the timer tick count value in milliseconds
- *
- */
-
-#ifndef RSI_HAL_USE_RTOS_SYSTICK
-/*
-  SysTick handler implementation that also clears overflow flag.
-*/
-void SysTick_Handler(void)
-{
-    /* Increment counter necessary in Delay()*/
-    msTicks++;
-#ifdef RSI_WITH_OS
-    if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
-    {
-        xPortSysTickHandler();
-    }
-#endif
-}
-
-uint32_t rsi_hal_gettickcount(void)
-{
-    return msTicks;
-
-#ifdef LINUX_PLATFORM
-    // Define your API to get the tick count delay in milli seconds from systic ISR and return the resultant value
-    struct rsi_timeval tv1;
-    gettimeofday(&tv1, NULL);
-    return (tv1.tv_sec * CONVERT_SEC_TO_MSEC + tv1.tv_usec * CONVERT_USEC_TO_MSEC);
-#endif
-}
-
-#else
-uint32_t rsi_hal_gettickcount(void)
-{
-    return xTaskGetTickCount();
-}
-#endif /* RSI_HAL_USE_RTOS_SYSTICK */
-#endif /* _use_the_rsi_defined_functions */
diff --git a/examples/platform/silabs/SiWx917/rs911x/rs911x.gni b/examples/platform/silabs/SiWx917/rs911x/rs911x.gni
deleted file mode 100644
index f119810..0000000
--- a/examples/platform/silabs/SiWx917/rs911x/rs911x.gni
+++ /dev/null
@@ -1,101 +0,0 @@
-import("//build_overrides/chip.gni")
-import("//build_overrides/efr32_sdk.gni")
-import("//build_overrides/pigweed.gni")
-
-examples_plat_dir = "${chip_root}/examples/platform/silabs/efr32"
-wifi_sdk_dir = "${chip_root}/src/platform/silabs/EFR32/wifi"
-wiseconnect_sdk_root = "${chip_root}/third_party/silabs/wiseconnect-wifi-bt-sdk"
-rs911x_cflags = []
-
-rs911x_src_plat = [
-  "${examples_plat_dir}/rs911x/rsi_if.c",
-  "${examples_plat_dir}/rs911x/wfx_rsi_host.c",
-  "${wifi_sdk_dir}/wfx_notify.cpp",
-  "${examples_plat_dir}/rs911x/hal/rsi_hal_mcu_interrupt.c",
-  "${examples_plat_dir}/rs911x/hal/rsi_hal_mcu_ioports.c",
-  "${examples_plat_dir}/rs911x/hal/rsi_hal_mcu_timer.c",
-  "${examples_plat_dir}/rs911x/hal/efx_spi.c",
-]
-rs911x_plat_incs = [
-  "${wifi_sdk_dir}",
-  "${wifi_sdk_dir}/hal",
-  "${chip_root}/src/platform/EFR32",
-]
-
-#
-# All the stuff from wiseconnect
-#
-rs911x_src_sapi = [
-  "${wiseconnect_sdk_root}/sapi/wlan/rsi_wlan_apis.c",
-  "${wiseconnect_sdk_root}/sapi/common/rsi_apis_non_rom.c",
-  "${wiseconnect_sdk_root}/sapi/common/rsi_apis_rom.c",
-  "${wiseconnect_sdk_root}/sapi/common/rsi_common_apis.c",
-  "${wiseconnect_sdk_root}/sapi/common/rsi_device_init_apis.c",
-  "${wiseconnect_sdk_root}/sapi/driver/device_interface/spi/rsi_spi_frame_rd_wr.c",
-  "${wiseconnect_sdk_root}/sapi/driver/device_interface/spi/rsi_spi_functs.c",
-  "${wiseconnect_sdk_root}/sapi/driver/device_interface/spi/rsi_spi_iface_init.c",
-  "${wiseconnect_sdk_root}/sapi/driver/device_interface/spi/rsi_spi_mem_rd_wr.c",
-  "${wiseconnect_sdk_root}/sapi/driver/device_interface/spi/rsi_spi_reg_rd_wr.c",
-  "${wiseconnect_sdk_root}/sapi/driver/rsi_common.c",
-  "${wiseconnect_sdk_root}/sapi/driver/rsi_device_init.c",
-  "${wiseconnect_sdk_root}/sapi/driver/rsi_driver_event_handlers.c",
-  "${wiseconnect_sdk_root}/sapi/driver/rsi_driver.c",
-  "${wiseconnect_sdk_root}/sapi/driver/rsi_events_rom.c",
-  "${wiseconnect_sdk_root}/sapi/driver/rsi_events.c",
-  "${wiseconnect_sdk_root}/sapi/driver/rsi_iap.c",
-  "${wiseconnect_sdk_root}/sapi/driver/rsi_nwk_rom.c",
-  "${wiseconnect_sdk_root}/sapi/driver/rsi_nwk.c",
-  "${wiseconnect_sdk_root}/sapi/driver/rsi_pkt_mgmt_rom.c",
-  "${wiseconnect_sdk_root}/sapi/driver/rsi_pkt_mgmt.c",
-  "${wiseconnect_sdk_root}/sapi/driver/rsi_queue_rom.c",
-  "${wiseconnect_sdk_root}/sapi/driver/rsi_queue.c",
-  "${wiseconnect_sdk_root}/sapi/driver/rsi_scheduler_rom.c",
-  "${wiseconnect_sdk_root}/sapi/driver/rsi_scheduler.c",
-  "${wiseconnect_sdk_root}/sapi/driver/rsi_setregion_countryinfo.c",
-  "${wiseconnect_sdk_root}/sapi/driver/rsi_timer.c",
-  "${wiseconnect_sdk_root}/sapi/driver/rsi_utils_rom.c",
-  "${wiseconnect_sdk_root}/sapi/driver/rsi_utils.c",
-  "${wiseconnect_sdk_root}/sapi/driver/rsi_wlan.c",
-  "${wiseconnect_sdk_root}/sapi/rtos/freertos_wrapper/rsi_os_wrapper.c",
-]
-
-foreach(src_file, rs911x_src_sapi) {
-  rs911x_cflags += [ "-Wno-empty-body" ]
-}
-
-rs911x_inc_plat = [
-  "${wifi_sdk_dir}",
-  "${examples_plat_dir}/rs911x",
-  "${examples_plat_dir}/rs911x/hal",
-  "${wiseconnect_sdk_root}/sapi/include",
-]
-
-# Apparently - the rsi library needs this
-rs911x_src_sock = [
-  "${wiseconnect_sdk_root}/sapi/network/socket/rsi_socket.c",
-  "${wiseconnect_sdk_root}/sapi/network/socket/rsi_socket_rom.c",
-]
-rs911x_sock_inc = [ "${wifi_sdk_dir}/rsi-sockets" ]
-
-#
-# If we use LWIP - not built-in sockets
-#
-rs911x_src_lwip = [
-  "${wifi_sdk_dir}/ethernetif.cpp",
-  "${wifi_sdk_dir}/dhcp_client.cpp",
-  "${wifi_sdk_dir}/lwip_netif.cpp",
-]
-rs911x_defs = [
-  "SL_HEAP_SIZE=32768",
-  "SL_WIFI=1",
-  "SL_WFX_USE_SPI",
-  "EFX32_RS911X=1",
-  "RS911X_WIFI",
-  "RSI_WLAN_ENABLE",
-  "RSI_SPI_INTERFACE",
-  "RSI_WITH_OS",
-]
-rs911x_sock_defs = [
-  "RS911X_SOCKETS",
-  "RSI_IPV6_ENABLE",
-]
diff --git a/examples/platform/silabs/SiWx917/efr32_utils.cpp b/examples/platform/silabs/SiWx917/siwx917_utils.cpp
similarity index 91%
rename from examples/platform/silabs/SiWx917/efr32_utils.cpp
rename to examples/platform/silabs/SiWx917/siwx917_utils.cpp
index bd2bf77..49a2325 100644
--- a/examples/platform/silabs/SiWx917/efr32_utils.cpp
+++ b/examples/platform/silabs/SiWx917/siwx917_utils.cpp
@@ -17,9 +17,8 @@
  *    limitations under the License.
  */
 
-#include "efr32_utils.h"
-#include "init_efrPlatform.h"
-#include "sl_system_kernel.h"
+#include "siwx917_utils.h"
+#include "init_ccpPlatform.h"
 
 #include <matter_config.h>
 
diff --git a/examples/platform/silabs/SiWx917/efr32_utils.h b/examples/platform/silabs/SiWx917/siwx917_utils.h
similarity index 97%
rename from examples/platform/silabs/SiWx917/efr32_utils.h
rename to examples/platform/silabs/SiWx917/siwx917_utils.h
index b0d508d..2223275 100644
--- a/examples/platform/silabs/SiWx917/efr32_utils.h
+++ b/examples/platform/silabs/SiWx917/siwx917_utils.h
@@ -19,7 +19,7 @@
 
 #pragma once
 
-// EFR Logging
+// SiWx917 Logging
 #ifdef __cplusplus
 extern "C" {
 #endif
diff --git a/examples/platform/silabs/SiWx917/uart.cpp b/examples/platform/silabs/SiWx917/uart.cpp
index 76dbca2..d264e96 100644
--- a/examples/platform/silabs/SiWx917/uart.cpp
+++ b/examples/platform/silabs/SiWx917/uart.cpp
@@ -22,217 +22,21 @@
 extern "C" {
 #endif
 #include "assert.h"
-#include "em_core.h"
-#include "em_usart.h"
-#include "sl_board_control.h"
-#include "sl_uartdrv_instances.h"
-#if (defined(EFR32MG24) || defined(MGM24))
-#include "sl_uartdrv_eusart_vcom_config.h"
-#else
-#include "sl_uartdrv_usart_vcom_config.h"
-#endif // EFR32MG24
+#include "rsi_board.h"
 #include "uart.h"
 #include "uartdrv.h"
 #include <stddef.h>
 #include <string.h>
 
-#if defined(SL_CATALOG_POWER_MANAGER_PRESENT)
-#include "sl_power_manager.h"
-#endif
-
 #if !defined(MIN)
 #define MIN(A, B) ((A) < (B) ? (A) : (B))
 #endif
 
-#if (defined(EFR32MG24) || defined(MGM24))
-#define HELPER1(x) EUSART##x##_RX_IRQn
-#else
-#define HELPER1(x) USART##x##_RX_IRQn
-#endif
-
-#define HELPER2(x) HELPER1(x)
-
-#if (defined(EFR32MG24) || defined(MGM24))
-#define HELPER3(x) EUSART##x##_RX_IRQHandler
-#else
-#define HELPER3(x) USART##x##_RX_IRQHandler
-#endif
-
-#define HELPER4(x) HELPER3(x)
-
-// On MG24 boards VCOM runs on the EUSART device, MG12 uses the UART device
-#if (defined(EFR32MG24) || defined(MGM24))
-#define USART_IRQ HELPER2(SL_UARTDRV_EUSART_VCOM_PERIPHERAL_NO)
-#define USART_IRQHandler HELPER4(SL_UARTDRV_EUSART_VCOM_PERIPHERAL_NO)
-#define vcom_handle sl_uartdrv_eusart_vcom_handle
-#else
-#define USART_IRQ HELPER2(SL_UARTDRV_USART_VCOM_PERIPHERAL_NO)
-#define USART_IRQHandler HELPER4(SL_UARTDRV_USART_VCOM_PERIPHERAL_NO)
-#define vcom_handle sl_uartdrv_usart_vcom_handle
-#endif // EFR32MG24
-
-typedef struct
-{
-    // The data buffer
-    uint8_t * pBuffer;
-    // The offset of the first item written to the list.
-    volatile uint16_t Head;
-    // The offset of the next item to be written to the list.
-    volatile uint16_t Tail;
-    // Maxium size of data that can be hold in buffer before overwriting
-    uint16_t MaxSize;
-} Fifo_t;
-
 #define UART_CONSOLE_ERR -1 // Negative value in case of UART Console action failed. Triggers a failure for PW_RPC
-#define MAX_BUFFER_SIZE 256
-#define MAX_DMA_BUFFER_SIZE (MAX_BUFFER_SIZE / 2)
-// In order to reduce the probability of data loss during the dmaFull callback handler we use
-// two duplicate receive buffers so we can always have one "active" receive queue.
-static uint8_t sRxDmaBuffer[MAX_DMA_BUFFER_SIZE];
-static uint8_t sRxDmaBuffer2[MAX_DMA_BUFFER_SIZE];
-static uint16_t lastCount; // Nb of bytes already processed from the active dmaBuffer
 
-// Rx buffer for the receive Fifo
-static uint8_t sRxFifoBuffer[MAX_BUFFER_SIZE];
-static Fifo_t sReceiveFifo;
-
-static void UART_rx_callback(UARTDRV_Handle_t handle, Ecode_t transferStatus, uint8_t * data, UARTDRV_Count_t transferCount);
-
-static bool InitFifo(Fifo_t * fifo, uint8_t * pDataBuffer, uint16_t bufferSize)
-{
-    if (fifo == NULL || pDataBuffer == NULL)
-    {
-        return false;
-    }
-
-    fifo->pBuffer = pDataBuffer;
-    fifo->MaxSize = bufferSize;
-    fifo->Tail = fifo->Head = 0;
-
-    return true;
-}
-
-/*
- *   @brief Get the amount of unprocessed bytes in the fifo buffer
- *   @param Ptr to the fifo
- *   @return Nb of "unread" bytes available in the fifo
- */
-static uint16_t AvailableDataCount(Fifo_t * fifo)
-{
-    uint16_t size = 0;
-
-    // if equal there is no data return 0 directly
-    if (fifo->Tail != fifo->Head)
-    {
-        // determine if a wrap around occurred to get the right data size available.
-        size = (fifo->Tail < fifo->Head) ? (fifo->MaxSize - fifo->Head + fifo->Tail) : (fifo->Tail - fifo->Head);
-    }
-
-    return size;
-}
-
-/*
- *   @brief Get the available space in the fifo buffer to insert new data
- *   @param Ptr to the fifo
- *   @return Nb of free bytes left in te buffer
- */
-static uint16_t RemainingSpace(Fifo_t * fifo)
-{
-    return fifo->MaxSize - AvailableDataCount(fifo);
-}
-
-/*
- *   @brief Write data in the fifo as a circular buffer
- *   @param Ptr to the fifo, ptr of the data to write, nb of bytes to write
- */
-static void WriteToFifo(Fifo_t * fifo, uint8_t * pDataToWrite, uint16_t SizeToWrite)
-{
-    assert(fifo);
-    assert(pDataToWrite);
-    assert(SizeToWrite <= fifo->MaxSize);
-
-    // Overwrite is not allowed
-    if (RemainingSpace(fifo) >= SizeToWrite)
-    {
-        uint16_t nBytesBeforWrap = (fifo->MaxSize - fifo->Tail);
-        if (SizeToWrite > nBytesBeforWrap)
-        {
-            // The number of bytes to write is bigger than the remaining bytes
-            // in the buffer, we have to wrap around
-            memcpy(fifo->pBuffer + fifo->Tail, pDataToWrite, nBytesBeforWrap);
-            memcpy(fifo->pBuffer, pDataToWrite + nBytesBeforWrap, SizeToWrite - nBytesBeforWrap);
-        }
-        else
-        {
-            memcpy(fifo->pBuffer + fifo->Tail, pDataToWrite, SizeToWrite);
-        }
-
-        fifo->Tail = (fifo->Tail + SizeToWrite) % fifo->MaxSize; // increment tail with wraparound
-    }
-}
-
-/*
- *   @brief Write data in the fifo as a circular buffer
- *   @param Ptr to the fifo, ptr to contain the data to process, nb of bytes to pull from the fifo
- *   @return Nb of bytes that were retrieved.
- */
-static uint8_t RetrieveFromFifo(Fifo_t * fifo, uint8_t * pData, uint16_t SizeToRead)
-{
-    assert(fifo);
-    assert(pData);
-    assert(SizeToRead <= fifo->MaxSize);
-
-    uint16_t ReadSize        = MIN(SizeToRead, AvailableDataCount(fifo));
-    uint16_t nBytesBeforWrap = (fifo->MaxSize - fifo->Head);
-
-    if (ReadSize > nBytesBeforWrap)
-    {
-        memcpy(pData, fifo->pBuffer + fifo->Head, nBytesBeforWrap);
-        memcpy(pData + nBytesBeforWrap, fifo->pBuffer, ReadSize - nBytesBeforWrap);
-    }
-    else
-    {
-        memcpy(pData, (fifo->pBuffer + fifo->Head), ReadSize);
-    }
-
-    fifo->Head = (fifo->Head + ReadSize) % fifo->MaxSize; // increment tail with wraparound
-
-    return ReadSize;
-}
-
-/*
- *   @brief Init the the UART for serial communication, Start DMA reception
- *          and init Fifo to handle the received data from this uart
- *
- *   @Note This UART is used for pigweed rpc
- */
 void uartConsoleInit(void)
 {
-    sl_board_enable_vcom();
-    // Init a fifo for the data received on the uart
-    InitFifo(&sReceiveFifo, sRxFifoBuffer, MAX_BUFFER_SIZE);
-
-    // Activate 2 dma queues to always have one active
-
-    UARTDRV_Receive(vcom_handle, sRxDmaBuffer, MAX_DMA_BUFFER_SIZE, UART_rx_callback);
-    UARTDRV_Receive(vcom_handle, sRxDmaBuffer2, MAX_DMA_BUFFER_SIZE, UART_rx_callback);
-
-    // Enable USART0/EUSART0 interrupt to wake OT task when data arrives
-    NVIC_ClearPendingIRQ(USART_IRQ);
-    NVIC_EnableIRQ(USART_IRQ);
-
-#if (defined(EFR32MG24) || defined(MGM24))
-    // Clear previous RX interrupts
-    EUSART_IntClear(SL_UARTDRV_EUSART_VCOM_PERIPHERAL, EUSART_IF_RXFL);
-
-    // Enable RX interrupts
-    EUSART_IntEnable(SL_UARTDRV_EUSART_VCOM_PERIPHERAL, EUSART_IF_RXFL);
-
-    // Enable EUSART
-    EUSART_Enable(SL_UARTDRV_EUSART_VCOM_PERIPHERAL, eusartEnable);
-#else
-    USART_IntEnable(SL_UARTDRV_USART_VCOM_PERIPHERAL, USART_IF_RXDATAV);
-#endif // EFR32MG24
+    // UART init is already done
 }
 
 void USART_IRQHandler(void)
@@ -289,25 +93,12 @@
         return UART_CONSOLE_ERR;
     }
 
-#if defined(SL_CATALOG_POWER_MANAGER_PRESENT)
-    sl_power_manager_add_em_requirement(SL_POWER_MANAGER_EM1);
-#endif
+    // Add Terminating char at the end of buffer
+    Buf[BufLength] = '\0';
 
-    // Use of ForceTransmit here. Transmit with DMA was causing errors with PW_RPC
-    // TODO Use DMA and find/fix what causes the issue with PW
-    if (UARTDRV_ForceTransmit(vcom_handle, (uint8_t *) Buf, BufLength) == ECODE_EMDRV_UARTDRV_OK)
-    {
-#if defined(SL_CATALOG_POWER_MANAGER_PRESENT)
-        sl_power_manager_remove_em_requirement(SL_POWER_MANAGER_EM1);
-#endif
-        return BufLength;
-    }
+    Board_UARTPutSTR((uint8_t *) Buf);
 
-#if defined(SL_CATALOG_POWER_MANAGER_PRESENT)
-    sl_power_manager_remove_em_requirement(SL_POWER_MANAGER_EM1);
-#endif
-
-    return UART_CONSOLE_ERR;
+    return BufLength;
 }
 
 /*
@@ -317,25 +108,20 @@
  */
 int16_t uartConsoleRead(char * Buf, uint16_t NbBytesToRead)
 {
-    uint8_t * data;
-    UARTDRV_Count_t count, remaining;
+    uint32_t data;
 
     if (Buf == NULL || NbBytesToRead < 1)
     {
         return UART_CONSOLE_ERR;
     }
 
-    if (NbBytesToRead > AvailableDataCount(&sReceiveFifo))
+    while (--NbBytesToRead >= 0)
     {
-        // Not enough data available in the fifo for the read size request
-        // If there is data available in dma buffer, get it now.
-        CORE_ATOMIC_SECTION(UARTDRV_GetReceiveStatus(vcom_handle, &data, &count, &remaining); if (count > lastCount) {
-            WriteToFifo(&sReceiveFifo, data + lastCount, count - lastCount);
-            lastCount = count;
-        })
+        data   = Board_UARTGetChar();
+        *Buf++ = (char) data;
     }
 
-    return (int16_t) RetrieveFromFifo(&sReceiveFifo, (uint8_t *) Buf, NbBytesToRead);
+    return NbBytesToRead;
 }
 
 #ifdef __cplusplus
diff --git a/examples/platform/silabs/SiWx917/uart.h b/examples/platform/silabs/SiWx917/uart.h
index f708030..035d5b3 100644
--- a/examples/platform/silabs/SiWx917/uart.h
+++ b/examples/platform/silabs/SiWx917/uart.h
@@ -28,13 +28,6 @@
 int16_t uartConsoleWrite(const char * Buf, uint16_t BufLength);
 int16_t uartConsoleRead(char * Buf, uint16_t NbBytesToRead);
 
-// Implemented by in openthread code
-#ifndef PW_RPC_ENABLED
-extern void otPlatUartReceived(const uint8_t * aBuf, uint16_t aBufLength);
-extern void otPlatUartSendDone(void);
-extern void otSysEventSignalPending(void);
-#endif
-
 #ifdef __cplusplus
 } // extern "C"
 #endif
diff --git a/examples/platform/silabs/SiWx917/wf200/efr_spi.c b/examples/platform/silabs/SiWx917/wf200/efr_spi.c
deleted file mode 100644
index fb35093..0000000
--- a/examples/platform/silabs/SiWx917/wf200/efr_spi.c
+++ /dev/null
@@ -1,426 +0,0 @@
-/*
- *
- *    Copyright (c) 2022 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.
- */
-
-#include "sl_wfx_configuration_defaults.h"
-
-#include "sl_wfx.h"
-#include "sl_wfx_board.h"
-#include "sl_wfx_host_api.h"
-
-#include "dmadrv.h"
-#include "em_bus.h"
-#include "em_cmu.h"
-#include "em_gpio.h"
-#include "em_ldma.h"
-#include "em_usart.h"
-#include "spidrv.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "FreeRTOS.h"
-#include "semphr.h"
-#ifdef SLEEP_ENABLED
-#include "sl_power_manager.h"
-#endif
-#include "AppConfig.h"
-
-#include "gpiointerrupt.h"
-
-#include "sl_spidrv_exp_config.h"
-#include "sl_wfx_board.h"
-#include "sl_wfx_host.h"
-#include "sl_wfx_task.h"
-#include "wfx_host_events.h"
-
-extern SPIDRV_Handle_t sl_spidrv_exp_handle;
-
-#define USART SL_WFX_HOST_PINOUT_SPI_PERIPHERAL
-
-StaticSemaphore_t xEfrSpiSemaBuffer;
-static SemaphoreHandle_t spi_sem;
-
-static unsigned int tx_dma_channel;
-static unsigned int rx_dma_channel;
-
-static uint32_t dummy_rx_data;
-static uint32_t dummy_tx_data;
-static bool spi_enabled = false;
-
-#if defined(EFR32MG12)
-uint8_t wirq_irq_nb = SL_WFX_HOST_PINOUT_SPI_IRQ;
-#elif defined(EFR32MG24)
-uint8_t wirq_irq_nb = SL_WFX_HOST_PINOUT_SPI_WIRQ_PIN; // SL_WFX_HOST_PINOUT_SPI_WIRQ_PIN;
-#endif
-
-#define PIN_OUT_SET 1
-#define PIN_OUT_CLEAR 0
-
-/****************************************************************************
- * @fn  sl_status_t sl_wfx_host_init_bus(void)
- * @brief
- *  Initialize SPI peripheral
- * @param[in] None
- * @return returns SL_STATUS_OK
- *****************************************************************************/
-sl_status_t sl_wfx_host_init_bus(void)
-{
-    spi_enabled = true;
-
-    /* Assign allocated DMA channel */
-    tx_dma_channel = sl_spidrv_exp_handle->txDMACh;
-    rx_dma_channel = sl_spidrv_exp_handle->rxDMACh;
-
-    /*
-     * Route EUSART1 MOSI, MISO, and SCLK to the specified pins.  CS is
-     * not controlled by EUSART so there is no write to the corresponding
-     * EUSARTROUTE register to do this.
-     */
-    MY_USART->CTRL |= (1u << _USART_CTRL_SMSDELAY_SHIFT);
-
-#if defined(EFR32MG12)
-    MY_USART->ROUTEPEN = USART_ROUTEPEN_TXPEN | USART_ROUTEPEN_RXPEN | USART_ROUTEPEN_CLKPEN;
-#endif
-
-#if defined(EFR32MG24)
-    GPIO->USARTROUTE[0].ROUTEEN = GPIO_USART_ROUTEEN_RXPEN | // MISO
-        GPIO_USART_ROUTEEN_TXPEN |                           // MOSI
-        GPIO_USART_ROUTEEN_CLKPEN;
-#endif
-
-    spi_sem = xSemaphoreCreateBinaryStatic(&xEfrSpiSemaBuffer);
-    xSemaphoreGive(spi_sem);
-
-    return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn  sl_status_t sl_wfx_host_deinit_bus(void)
- * @brief
- *     De-initialize SPI peripheral and DMAs
- * @param[in] None
- * @return returns SL_STATUS_OK
- *****************************************************************************/
-sl_status_t sl_wfx_host_deinit_bus(void)
-{
-    vSemaphoreDelete(spi_sem);
-    // Stop DMAs.
-    DMADRV_StopTransfer(rx_dma_channel);
-    DMADRV_StopTransfer(tx_dma_channel);
-    DMADRV_FreeChannel(tx_dma_channel);
-    DMADRV_FreeChannel(rx_dma_channel);
-    DMADRV_DeInit();
-    USART_Reset(MY_USART);
-    return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn  sl_status_t sl_wfx_host_spi_cs_assert()
- * @brief
- *     Assert chip select.
- * @param[in] None
- * @return returns SL_STATUS_OK
- *****************************************************************************/
-sl_status_t sl_wfx_host_spi_cs_assert()
-{
-    GPIO_PinOutClear(SL_SPIDRV_EXP_CS_PORT, SL_SPIDRV_EXP_CS_PIN);
-    return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn  sl_status_t sl_wfx_host_spi_cs_deassert()
- * @brief
- *     De-Assert chip select.
- * @param[in] None
- * @return returns SL_STATUS_OK
- *****************************************************************************/
-sl_status_t sl_wfx_host_spi_cs_deassert()
-{
-    GPIO_PinOutSet(SL_SPIDRV_EXP_CS_PORT, SL_SPIDRV_EXP_CS_PIN);
-    return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn  static bool rx_dma_complete(unsigned int channel, unsigned int sequenceNo, void *userParam)
- * @brief
- *     function called when the DMA complete
- * @param[in] channel:
- * @param[in]  sequenceNo: sequence number
- * @param[in]  userParam: user parameter
- * @return returns true if suucessful,
- *          false otherwise
- *****************************************************************************/
-static bool rx_dma_complete(unsigned int channel, unsigned int sequenceNo, void * userParam)
-{
-    (void) channel;
-    (void) sequenceNo;
-    (void) userParam;
-
-    BaseType_t xHigherPriorityTaskWoken = pdFALSE;
-    xSemaphoreGiveFromISR(spi_sem, &xHigherPriorityTaskWoken);
-    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
-
-    return true;
-}
-
-/****************************************************************************
- * @fn   void receiveDMA(uint8_t *buffer, uint16_t buffer_length)
- * @brief
- *     start receive DMA
- * @param[in]  buffer:
- * @param[in]  buffer_length:
- * @return  None
- *****************************************************************************/
-void receiveDMA(uint8_t * buffer, uint16_t buffer_length)
-{
-    // Start receive DMA.
-    DMADRV_PeripheralMemory(rx_dma_channel, MY_USART_RX_SIGNAL, (void *) buffer, (void *) &(MY_USART->RXDATA), true, buffer_length,
-                            dmadrvDataSize1, rx_dma_complete, NULL);
-
-    // Start transmit DMA.
-    DMADRV_MemoryPeripheral(tx_dma_channel, MY_USART_TX_SIGNAL, (void *) &(MY_USART->TXDATA), (void *) &(dummy_tx_data), false,
-                            buffer_length, dmadrvDataSize1, NULL, NULL);
-}
-
-/****************************************************************************
- * @fn   void transmitDMA(uint8_t *buffer, uint16_t buffer_length)
- * @brief
- *     start  transmit DMA
- * @param[in]  buffer:
- * @param[in]  buffer_length:
- * @return  None
- *****************************************************************************/
-void transmitDMA(uint8_t * buffer, uint16_t buffer_length)
-{
-    // Receive DMA runs only to initiate callback
-    // Start receive DMA.
-    DMADRV_PeripheralMemory(rx_dma_channel, MY_USART_RX_SIGNAL, &dummy_rx_data, (void *) &(MY_USART->RXDATA), false, buffer_length,
-                            dmadrvDataSize1, rx_dma_complete, NULL);
-    // Start transmit DMA.
-    DMADRV_MemoryPeripheral(tx_dma_channel, MY_USART_TX_SIGNAL, (void *) &(MY_USART->TXDATA), (void *) buffer, true, buffer_length,
-                            dmadrvDataSize1, NULL, NULL);
-}
-
-/****************************************************************************
- * @fn  sl_status_t sl_wfx_host_spi_transfer_no_cs_assert(sl_wfx_host_bus_transfer_type_t type,
-                                                  uint8_t *header,
-                                                  uint16_t header_length,
-                                                  uint8_t *buffer,
-                                                  uint16_t buffer_length)
- * @brief
- * WFX SPI transfer implementation
- * @param[in] type:
- * @param[in] header:
- * @param[in] header_length:
- * @param[in] buffer:
- * @param[in] buffer_length:
- * @return  returns SL_STATUS_OK if successful,
- *          SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_spi_transfer_no_cs_assert(sl_wfx_host_bus_transfer_type_t type, uint8_t * header, uint16_t header_length,
-                                                  uint8_t * buffer, uint16_t buffer_length)
-{
-    sl_status_t result = SL_STATUS_FAIL;
-    const bool is_read = (type == SL_WFX_BUS_READ);
-
-    while (!(MY_USART->STATUS & USART_STATUS_TXBL))
-    {
-    }
-    MY_USART->CMD = USART_CMD_CLEARRX | USART_CMD_CLEARTX;
-
-    /* header length should be greater than 0 */
-    if (header_length > 0)
-    {
-        for (uint8_t * buffer_ptr = header; header_length > 0; --header_length, ++buffer_ptr)
-        {
-            MY_USART->TXDATA = (uint32_t)(*buffer_ptr);
-
-            while (!(MY_USART->STATUS & USART_STATUS_TXC))
-            {
-            }
-        }
-        while (!(MY_USART->STATUS & USART_STATUS_TXBL))
-        {
-        }
-    }
-
-    /* buffer length should be greater than 0 */
-    if (buffer_length > 0)
-    {
-        MY_USART->CMD = USART_CMD_CLEARRX | USART_CMD_CLEARTX;
-        if (xSemaphoreTake(spi_sem, portMAX_DELAY) == pdTRUE)
-        {
-            if (is_read)
-            {
-                receiveDMA(buffer, buffer_length);
-                result = SL_STATUS_OK;
-            }
-            else
-            {
-                transmitDMA(buffer, buffer_length);
-                result = SL_STATUS_OK;
-            }
-
-            if (xSemaphoreTake(spi_sem, portMAX_DELAY) == pdTRUE)
-            {
-                xSemaphoreGive(spi_sem);
-            }
-        }
-        else
-        {
-            result = SL_STATUS_TIMEOUT;
-        }
-    }
-
-    return result;
-}
-
-/****************************************************************************
- * @fn   void sl_wfx_host_start_platform_interrupt(void)
- * @brief
- * Enable WFX interrupt
- * @param[in]  none
- * @return None
- *****************************************************************************/
-void sl_wfx_host_start_platform_interrupt(void)
-{
-    // Enable (and clear) the bus interrupt
-    GPIO_ExtIntConfig(SL_WFX_HOST_PINOUT_SPI_WIRQ_PORT, SL_WFX_HOST_PINOUT_SPI_WIRQ_PIN, wirq_irq_nb, true, false, true);
-}
-
-/****************************************************************************
- * @fn   sl_status_t sl_wfx_host_disable_platform_interrupt(void)
- * @brief
- * Disable WFX interrupt
- * @param[in]  None
- * @return  returns SL_STATUS_OK if successful,
- *          SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_disable_platform_interrupt(void)
-{
-    GPIO_IntDisable(1 << wirq_irq_nb);
-    return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn   sl_status_t sl_wfx_host_enable_platform_interrupt(void)
- * @brief
- *      enable the platform interrupt
- * @param[in]  None
- * @return  returns SL_STATUS_OK if successful,
- *          SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_enable_platform_interrupt(void)
-{
-    GPIO_IntEnable(1 << wirq_irq_nb);
-    return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn   sl_status_t sl_wfx_host_enable_spi(void)
- * @brief
- *       enable spi
- * @param[in]  None
- * @return  returns SL_STATUS_OK if successful,
- *          SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_enable_spi(void)
-{
-    if (spi_enabled == false)
-    {
-#ifdef SLEEP_ENABLED
-        // Prevent the host to use lower EM than EM1
-        sl_power_manager_add_em_requirement(SL_POWER_MANAGER_EM1);
-#endif
-        spi_enabled = true;
-    }
-    return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn   sl_status_t sl_wfx_host_disable_spi(void)
- * @brief
- *       disable spi
- * @param[in]  None
- * @return  returns SL_STATUS_OK if successful,
- *          SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_disable_spi(void)
-{
-    if (spi_enabled == true)
-    {
-        spi_enabled = false;
-#ifdef SLEEP_ENABLED
-        // Allow the host to use the lowest allowed EM
-        sl_power_manager_remove_em_requirement(SL_POWER_MANAGER_EM1);
-#endif
-    }
-    return SL_STATUS_OK;
-}
-
-/*
- * IRQ for SPI callback
- * Clear the Interrupt and wake up the task that
- * handles the actions of the interrupt (typically - wfx_bus_task ())
- */
-static void sl_wfx_spi_wakeup_irq_callback(uint8_t irqNumber)
-{
-    BaseType_t bus_task_woken;
-    uint32_t interrupt_mask;
-
-    if (irqNumber != wirq_irq_nb)
-        return;
-    // Get and clear all pending GPIO interrupts
-    interrupt_mask = GPIO_IntGet();
-    GPIO_IntClear(interrupt_mask);
-    bus_task_woken = pdFALSE;
-    xSemaphoreGiveFromISR(wfx_wakeup_sem, &bus_task_woken);
-    vTaskNotifyGiveFromISR(wfx_bus_task_handle, &bus_task_woken);
-    portYIELD_FROM_ISR(bus_task_woken);
-}
-
-/****************************************************************************
- * Init some actions pins to the WF-200 expansion board
- *****************************************************************************/
-void sl_wfx_host_gpio_init(void)
-{
-    SILABS_LOG("WIFI: GPIO Init:IRQ=%d", wirq_irq_nb);
-    // Enable GPIO clock.
-    CMU_ClockEnable(cmuClock_GPIO, true);
-
-    // Configure WF200 reset pin.
-    GPIO_PinModeSet(SL_WFX_HOST_PINOUT_RESET_PORT, SL_WFX_HOST_PINOUT_RESET_PIN, gpioModePushPull, 0);
-    // Configure WF200 WUP pin.
-    GPIO_PinModeSet(SL_WFX_HOST_PINOUT_WUP_PORT, SL_WFX_HOST_PINOUT_WUP_PIN, gpioModePushPull, 0);
-
-    // GPIO used as IRQ.
-    GPIO_PinModeSet(SL_WFX_HOST_PINOUT_SPI_WIRQ_PORT, SL_WFX_HOST_PINOUT_SPI_WIRQ_PIN, gpioModeInputPull, 0);
-    CMU_OscillatorEnable(cmuOsc_LFXO, true, true);
-
-    // Set up interrupt based callback function - trigger on both edges.
-    GPIOINT_Init();
-    GPIO_ExtIntConfig(SL_WFX_HOST_PINOUT_SPI_WIRQ_PORT, SL_WFX_HOST_PINOUT_SPI_WIRQ_PIN, wirq_irq_nb, true, false,
-                      false); /* Don't enable it */
-
-    GPIOINT_CallbackRegister(wirq_irq_nb, sl_wfx_spi_wakeup_irq_callback);
-
-    // Change GPIO interrupt priority (FreeRTOS asserts unless this is done here!)
-    NVIC_ClearPendingIRQ(1 << wirq_irq_nb);
-    NVIC_SetPriority(GPIO_EVEN_IRQn, 5);
-    NVIC_SetPriority(GPIO_ODD_IRQn, 5);
-}
diff --git a/examples/platform/silabs/SiWx917/wf200/host_if.cpp b/examples/platform/silabs/SiWx917/wf200/host_if.cpp
deleted file mode 100644
index 26bd788..0000000
--- a/examples/platform/silabs/SiWx917/wf200/host_if.cpp
+++ /dev/null
@@ -1,1270 +0,0 @@
-/*
- *
- *    Copyright (c) 2022 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.
- */
-
-/* Includes */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "em_bus.h"
-#include "em_cmu.h"
-#include "em_gpio.h"
-#include "em_ldma.h"
-#include "em_usart.h"
-#include "gpiointerrupt.h"
-
-#include "wifi_config.h"
-
-#include "AppConfig.h"
-#include "sl_wfx_board.h"
-#include "sl_wfx_host.h"
-#include "sl_wfx_task.h"
-#include "wfx_host_events.h"
-
-#include "FreeRTOS.h"
-#include "event_groups.h"
-#include "task.h"
-
-#include "dhcp_client.h"
-#include "ethernetif.h"
-#include <platform/CHIPDeviceLayer.h>
-
-using namespace ::chip;
-using namespace ::chip::DeviceLayer;
-
-/* wfxRsi Task will use as its stack */
-StackType_t wfxEventTaskStack[1024] = { 0 };
-
-/* Structure that will hold the TCB of the wfxRsi Task being created. */
-StaticTask_t wfxEventTaskBuffer;
-
-/* Declare a variable to hold the data associated with the created event group. */
-StaticEventGroup_t wfxEventGroup;
-
-EventGroupHandle_t sl_wfx_event_group;
-TaskHandle_t wfx_events_task_handle;
-static sl_wfx_mac_address_t ap_mac;
-static uint32_t sta_ip;
-static wfx_wifi_scan_result_t ap_info;
-
-// Set Scan Parameters
-#define ACTIVE_CHANNEL_TIME 110
-#define PASSIVE_CHANNEL_TIME 0
-#define NUM_PROBE_REQUEST 2
-
-// wfx_fmac_driver context
-sl_wfx_context_t wifiContext;
-static uint8_t wifi_extra;
-
-/*****************************************************************************
- * macros
- ******************************************************************************/
-#define WE_ST_STARTED 1
-#define WE_ST_STA_CONN 2
-#define WE_ST_HW_STARTED 4
-
-#ifdef SL_WFX_CONFIG_SOFTAP
-// Connection parameters
-char softap_ssid[32]                   = SOFTAP_SSID_DEFAULT;
-char softap_passkey[64]                = SOFTAP_PASSKEY_DEFAULT;
-sl_wfx_security_mode_t softap_security = SOFTAP_SECURITY_DEFAULT;
-uint8_t softap_channel                 = SOFTAP_CHANNEL_DEFAULT;
-#endif
-
-/* station network interface structures */
-struct netif * sta_netif;
-wfx_wifi_provision_t wifi_provision;
-sl_wfx_get_counters_cnf_t * counters;
-sl_wfx_get_counters_cnf_t * Tempcounters;
-#define PUT_COUNTER(name) SILABS_LOG("%-24s %lu\r\n", #name, (unsigned long) counters->body.count_##name);
-
-bool hasNotifiedIPV6             = false;
-bool hasNotifiedIPV4             = false;
-bool hasNotifiedWifiConnectivity = false;
-static uint8_t retryJoin         = 0;
-bool retryInProgress             = false;
-
-#ifdef SL_WFX_CONFIG_SCAN
-static struct scan_result_holder
-{
-    struct scan_result_holder * next;
-    wfx_wifi_scan_result scan;
-} * scan_save;
-static uint8_t scan_count = 0;
-static void (*scan_cb)(wfx_wifi_scan_result_t *); /* user-callback - when scan is done */
-static char * scan_ssid;                          /* Which one are we scanning for */
-static void sl_wfx_scan_result_callback(sl_wfx_scan_result_ind_body_t * scan_result);
-static void sl_wfx_scan_complete_callback(uint32_t status);
-#endif /* SL_WFX_CONFIG_SCAN */
-
-static void wfx_events_task(void * p_arg);
-
-/* WF200 host callbacks */
-static void sl_wfx_connect_callback(sl_wfx_connect_ind_body_t connect_indication_body);
-static void sl_wfx_disconnect_callback(uint8_t * mac, uint16_t reason);
-static void sl_wfx_generic_status_callback(sl_wfx_generic_ind_t * frame);
-
-#ifdef SL_WFX_CONFIG_SOFTAP
-static void sl_wfx_start_ap_callback(uint32_t status);
-static void sl_wfx_stop_ap_callback(void);
-static void sl_wfx_client_connected_callback(uint8_t * mac);
-static void sl_wfx_ap_client_disconnected_callback(uint32_t status, uint8_t * mac);
-static void sl_wfx_ap_client_rejected_callback(uint32_t status, uint8_t * mac);
-#endif
-
-extern uint32_t gOverrunCount;
-
-/***************************************************************************
- * @brief
- * Creates WFX events processing task.
- ******************************************************************************/
-static void wfx_events_task_start()
-{
-    /* create an event group to track Wi-Fi events */
-    sl_wfx_event_group = xEventGroupCreateStatic(&wfxEventGroup);
-
-    wfx_events_task_handle = xTaskCreateStatic(wfx_events_task, "wfx_events", WLAN_TASK_STACK_SIZE, NULL, WLAN_TASK_PRIORITY,
-                                               wfxEventTaskStack, &wfxEventTaskBuffer);
-    if (NULL == wfx_events_task_handle)
-    {
-        SILABS_LOG("Failed to create WFX wfx_events");
-    }
-}
-
-/****************************************************************************
- * @brief
- * Called when the driver needs to post an event
- * @param[in]  event_payload:
- * @returns Returns SL_STATUS_OK if successful,
- *SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_process_event(sl_wfx_generic_message_t * event_payload)
-{
-    switch (event_payload->header.id)
-    {
-    /******** INDICATION ********/
-    case SL_WFX_STARTUP_IND_ID: {
-        SILABS_LOG("WFX Startup Completed\r\n");
-        PlatformMgrImpl().HandleWFXSystemEvent(WIFI_EVENT, event_payload);
-        break;
-    }
-    case SL_WFX_CONNECT_IND_ID: {
-        sl_wfx_connect_ind_t * connect_indication = (sl_wfx_connect_ind_t *) event_payload;
-        sl_wfx_connect_callback(connect_indication->body);
-        break;
-    }
-    case SL_WFX_DISCONNECT_IND_ID: {
-        sl_wfx_disconnect_ind_t * disconnect_indication = (sl_wfx_disconnect_ind_t *) event_payload;
-        sl_wfx_disconnect_callback(disconnect_indication->body.mac, disconnect_indication->body.reason);
-        break;
-    }
-    case SL_WFX_RECEIVED_IND_ID: {
-        sl_wfx_received_ind_t * ethernet_frame = (sl_wfx_received_ind_t *) event_payload;
-        if (ethernet_frame->body.frame_type == ETH_FRAME)
-        {
-            sl_wfx_host_received_frame_callback(ethernet_frame);
-        }
-        break;
-    }
-#ifdef SL_WFX_CONFIG_SCAN
-    case SL_WFX_SCAN_RESULT_IND_ID: {
-        sl_wfx_scan_result_ind_t * scan_result = (sl_wfx_scan_result_ind_t *) event_payload;
-        sl_wfx_scan_result_callback(&scan_result->body);
-        break;
-    }
-    case SL_WFX_SCAN_COMPLETE_IND_ID: {
-        sl_wfx_scan_complete_ind_t * scan_complete = (sl_wfx_scan_complete_ind_t *) event_payload;
-        sl_wfx_scan_complete_callback(scan_complete->body.status);
-        break;
-    }
-#endif /* SL_WFX_CONFIG_SCAN */
-#ifdef SL_WFX_CONFIG_SOFTAP
-    case SL_WFX_START_AP_IND_ID: {
-        sl_wfx_start_ap_ind_t * start_ap_indication = (sl_wfx_start_ap_ind_t *) event_payload;
-        sl_wfx_start_ap_callback(start_ap_indication->body.status);
-        break;
-    }
-    case SL_WFX_STOP_AP_IND_ID: {
-        sl_wfx_stop_ap_callback();
-        break;
-    }
-    case SL_WFX_AP_CLIENT_CONNECTED_IND_ID: {
-        sl_wfx_ap_client_connected_ind_t * client_connected_indication = (sl_wfx_ap_client_connected_ind_t *) event_payload;
-        sl_wfx_client_connected_callback(client_connected_indication->body.mac);
-        break;
-    }
-    case SL_WFX_AP_CLIENT_REJECTED_IND_ID: {
-        sl_wfx_ap_client_rejected_ind_t * ap_client_rejected_indication = (sl_wfx_ap_client_rejected_ind_t *) event_payload;
-        sl_wfx_ap_client_rejected_callback(ap_client_rejected_indication->body.reason, ap_client_rejected_indication->body.mac);
-        break;
-    }
-    case SL_WFX_AP_CLIENT_DISCONNECTED_IND_ID: {
-        sl_wfx_ap_client_disconnected_ind_t * ap_client_disconnected_indication =
-            (sl_wfx_ap_client_disconnected_ind_t *) event_payload;
-        sl_wfx_ap_client_disconnected_callback(ap_client_disconnected_indication->body.reason,
-                                               ap_client_disconnected_indication->body.mac);
-        break;
-    }
-#endif /* SL_WFX_CONFIG_SOFTAP */
-#ifdef SL_WFX_USE_SECURE_LINK
-    case SL_WFX_SECURELINK_EXCHANGE_PUB_KEYS_IND_ID: {
-        if (host_context.waited_event_id != SL_WFX_SECURELINK_EXCHANGE_PUB_KEYS_IND_ID)
-        {
-            memcpy((void *) &sl_wfx_context->secure_link_exchange_ind, (void *) event_payload, event_payload->header.length);
-        }
-        break;
-    }
-#endif
-    case SL_WFX_GENERIC_IND_ID: {
-        sl_wfx_generic_ind_t * generic_status = (sl_wfx_generic_ind_t *) event_payload;
-        sl_wfx_generic_status_callback(generic_status);
-        break;
-    }
-    case SL_WFX_EXCEPTION_IND_ID: {
-        sl_wfx_exception_ind_t * firmware_exception = (sl_wfx_exception_ind_t *) event_payload;
-        uint8_t * exception_tmp                     = (uint8_t *) firmware_exception;
-        SILABS_LOG("firmware exception\r\n");
-        for (uint16_t i = 0; i < firmware_exception->header.length; i += 16)
-        {
-            SILABS_LOG("hif: %.8x:", i);
-            for (uint8_t j = 0; (j < 16) && ((i + j) < firmware_exception->header.length); j++)
-            {
-                SILABS_LOG(" %.2x", *exception_tmp);
-                exception_tmp++;
-            }
-            SILABS_LOG("\r\n");
-        }
-        break;
-    }
-    case SL_WFX_ERROR_IND_ID: {
-        sl_wfx_error_ind_t * firmware_error = (sl_wfx_error_ind_t *) event_payload;
-        uint8_t * error_tmp                 = (uint8_t *) firmware_error;
-        SILABS_LOG("firmware error %lu\r\n", firmware_error->body.type);
-        for (uint16_t i = 0; i < firmware_error->header.length; i += 16)
-        {
-            SILABS_LOG("hif: %.8x:", i);
-            for (uint8_t j = 0; (j < 16) && ((i + j) < firmware_error->header.length); j++)
-            {
-                SILABS_LOG(" %.2x", *error_tmp);
-                error_tmp++;
-            }
-            SILABS_LOG("\r\n");
-        }
-        break;
-    }
-    }
-
-    return SL_STATUS_OK;
-}
-
-#ifdef SL_WFX_CONFIG_SCAN
-/****************************************************************************
- * @brief
- * Callback for individual scan result
- * @param[in] scan_result: Scan result of all SSID's
- *****************************************************************************/
-static void sl_wfx_scan_result_callback(sl_wfx_scan_result_ind_body_t * scan_result)
-{
-    struct scan_result_holder * ap;
-
-    SILABS_LOG("# %2d %2d  %03d %02X:%02X:%02X:%02X:%02X:%02X  %s", scan_count, scan_result->channel,
-               ((int16_t)(scan_result->rcpi - 220) / 2), scan_result->mac[0], scan_result->mac[1], scan_result->mac[2],
-               scan_result->mac[3], scan_result->mac[4], scan_result->mac[5], scan_result->ssid_def.ssid);
-    /*Report one AP information*/
-    SILABS_LOG("\r\n");
-    /* don't save if filter only wants specific ssid */
-    if (scan_ssid != (char *) 0)
-    {
-        if (strcmp(scan_ssid, (char *) &scan_result->ssid_def.ssid[0]) != CMP_SUCCESS)
-            return;
-    }
-    if ((ap = (struct scan_result_holder *) pvPortMalloc(sizeof(*ap))) == (struct scan_result_holder *) 0)
-    {
-        SILABS_LOG("*ERR*Scan: No Mem");
-    }
-    else
-    {
-        ap->next  = scan_save;
-        scan_save = ap;
-        /* Not checking if scan_result->ssid_length is < 33 */
-        memcpy(ap->scan.ssid, scan_result->ssid_def.ssid, scan_result->ssid_def.ssid_length);
-        ap->scan.ssid[scan_result->ssid_def.ssid_length] = 0; /* make sure about null terminate */
-        /* We do it in this order WPA3 first */
-        /* No EAP supported - Is this required */
-        if (scan_result->security_mode.wpa3)
-        {
-            ap->scan.security = WFX_SEC_WPA3;
-        }
-        else if (scan_result->security_mode.wpa2)
-        {
-            ap->scan.security = WFX_SEC_WPA2;
-        }
-        else if (scan_result->security_mode.wpa)
-        {
-            ap->scan.security = WFX_SEC_WPA;
-        }
-        else if (scan_result->security_mode.wep)
-        {
-            ap->scan.security = WFX_SEC_WEP;
-        }
-        else
-        {
-            ap->scan.security = WFX_SEC_NONE;
-        }
-        ap->scan.chan = scan_result->channel;
-        ap->scan.rssi = scan_result->rcpi;
-        memcpy(&ap->scan.bssid[0], &scan_result->mac[0], BSSID_MAX_STR_LEN);
-        scan_count++;
-    }
-}
-
-/****************************************************************************
- * @brief
- * Callback for scan complete
- * @param[in] status:Status of WLAN scan api
- *****************************************************************************/
-/* ARGSUSED */
-static void sl_wfx_scan_complete_callback(uint32_t status)
-{
-    (void) (status);
-    /* Use scan_count value and reset it */
-    xEventGroupSetBits(sl_wfx_event_group, SL_WFX_SCAN_COMPLETE);
-}
-#endif /* SL_WFX_CONFIG_SCAN */
-
-/****************************************************************************
- * @brief
- * Callback when station connects
- * @param[in]  mac: MAC address of device
- * @param[in]  status: Status of connect call
- *****************************************************************************/
-static void sl_wfx_connect_callback(sl_wfx_connect_ind_body_t connect_indication_body)
-{
-    uint8_t * mac   = connect_indication_body.mac;
-    uint32_t status = connect_indication_body.status;
-    switch (status)
-    {
-    case WFM_STATUS_SUCCESS: {
-        SILABS_LOG("STA-Connected\r\n");
-        memcpy(&ap_mac.octet[0], mac, MAC_ADDRESS_FIRST_OCTET);
-        sl_wfx_context->state =
-            static_cast<sl_wfx_state_t>(static_cast<int>(sl_wfx_context->state) | static_cast<int>(SL_WFX_STA_INTERFACE_CONNECTED));
-        xEventGroupSetBits(sl_wfx_event_group, SL_WFX_CONNECT);
-        break;
-    }
-    case WFM_STATUS_NO_MATCHING_AP: {
-        SILABS_LOG("WFX Connection failed, access point not found\r\n");
-        break;
-    }
-    case WFM_STATUS_CONNECTION_ABORTED: {
-        SILABS_LOG("WFX Connection aborted\r\n");
-        break;
-    }
-    case WFM_STATUS_CONNECTION_TIMEOUT: {
-        SILABS_LOG("WFX Connection timeout\r\n");
-        break;
-    }
-    case WFM_STATUS_CONNECTION_REJECTED_BY_AP: {
-        SILABS_LOG("WFX Connection rejected by the access point\r\n");
-        break;
-    }
-    case WFM_STATUS_CONNECTION_AUTH_FAILURE: {
-        SILABS_LOG("WFX Connection authentication failure\r\n");
-        break;
-    }
-    default: {
-        SILABS_LOG("WF Connection attempt error\r\n");
-    }
-    }
-
-    if ((status != WFM_STATUS_SUCCESS) && retryJoin < MAX_JOIN_RETRIES_COUNT)
-    {
-        retryJoin += 1;
-        retryInProgress = false;
-        SILABS_LOG("WFX Retry to connect to network count: %d", retryJoin);
-        sl_wfx_context->state =
-            static_cast<sl_wfx_state_t>(static_cast<int>(sl_wfx_context->state) & ~static_cast<int>(SL_WFX_STARTED));
-        xEventGroupSetBits(sl_wfx_event_group, SL_WFX_RETRY_CONNECT);
-    }
-}
-
-/****************************************************************************
- * @brief
- * Callback for station disconnect
- * @param[in]  mac: MAC address of device
- * @param[in]  reason: Reason code of disconnection
- *****************************************************************************/
-static void sl_wfx_disconnect_callback(uint8_t * mac, uint16_t reason)
-{
-    (void) (mac);
-    SILABS_LOG("WFX Disconnected %d\r\n", reason);
-    sl_wfx_context->state =
-        static_cast<sl_wfx_state_t>(static_cast<int>(sl_wfx_context->state) & ~static_cast<int>(SL_WFX_STA_INTERFACE_CONNECTED));
-    xEventGroupSetBits(sl_wfx_event_group, SL_WFX_DISCONNECT);
-}
-
-#ifdef SL_WFX_CONFIG_SOFTAP
-/****************************************************************************
- * @brief
- * Callback for AP started
- * @param[in]  status: Status of wfx start ap api
- *****************************************************************************/
-static void sl_wfx_start_ap_callback(uint32_t status)
-{
-    if (status == AP_START_SUCCESS)
-    {
-        SILABS_LOG("AP started\r\n");
-        sl_wfx_context->state =
-            static_cast<sl_wfx_state_t>(static_cast<int>(sl_wfx_context->state) | static_cast<int>(SL_WFX_AP_INTERFACE_UP));
-        xEventGroupSetBits(sl_wfx_event_group, SL_WFX_START_AP);
-    }
-    else
-    {
-        SILABS_LOG("AP start failed\r\n");
-        strcpy(event_log, "AP start failed");
-    }
-}
-
-/****************************************************************************
- * @brief
- * Callback for AP stopped
- *****************************************************************************/
-static void sl_wfx_stop_ap_callback(void)
-{
-    // TODO
-    // dhcpserver_clear_stored_mac();
-    SILABS_LOG("SoftAP stopped\r\n");
-    sl_wfx_context->state =
-        static_cast<sl_wfx_state_t>(static_cast<int>(sl_wfx_context->state) & ~static_cast<int>(SL_WFX_AP_INTERFACE_UP));
-    xEventGroupSetBits(sl_wfx_event_group, SL_WFX_STOP_AP);
-}
-
-/****************************************************************************
- * @brief
- * Callback for client connect to AP
- * @param[in]  mac: MAC address of device
- *****************************************************************************/
-static void sl_wfx_client_connected_callback(uint8_t * mac)
-{
-    SILABS_LOG("Client connected, MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
-    // TODO
-    SILABS_LOG("Open a web browser and go to http://%d.%d.%d.%d\r\n", ap_ip_addr0, ap_ip_addr1, ap_ip_addr2, ap_ip_addr3);
-}
-
-/****************************************************************************
- * @brief
- * Callback for client rejected from AP
- * @param[in] status: Status of ap rejected
- * @param[in] mac: MAC address of device
- *****************************************************************************/
-static void sl_wfx_ap_client_rejected_callback(uint32_t status, uint8_t * mac)
-{
-    SILABS_LOG("Client rejected, reason: %d, MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", (int) status, mac[0], mac[1], mac[2], mac[3],
-               mac[4], mac[5]);
-}
-
-/****************************************************************************
- * @brief
- * Callback for AP client disconnect
- * @param[in] status: Status of ap dissconnect
- * @param[in]  mac:
- *****************************************************************************/
-static void sl_wfx_ap_client_disconnected_callback(uint32_t status, uint8_t * mac)
-{
-    // TODO
-    SILABS_LOG("Client disconnected, reason: %d, MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", (int) status, mac[0], mac[1], mac[2],
-               mac[3], mac[4], mac[5]);
-}
-#endif /* SL_WFX_CONFIG_SOFTAP */
-
-/****************************************************************************
- * @brief
- * Callback for generic status received
- * @param[in] farme:
- *****************************************************************************/
-static void sl_wfx_generic_status_callback(sl_wfx_generic_ind_t * frame)
-{
-    (void) (frame);
-    SILABS_LOG("WFX Generic status received\r\n");
-}
-
-/***************************************************************************
- * @brief
- * WFX events processing task.
- * @param[in] p_arg:
- *  ******************************************************************************/
-static void wfx_events_task(void * p_arg)
-{
-    TickType_t last_dhcp_poll, now;
-    EventBits_t flags;
-    (void) p_arg;
-
-    sta_netif      = wfx_get_netif(SL_WFX_STA_INTERFACE);
-    last_dhcp_poll = xTaskGetTickCount();
-    while (true)
-    {
-        flags = xEventGroupWaitBits(sl_wfx_event_group,
-                                    SL_WFX_CONNECT | SL_WFX_DISCONNECT
-#ifdef SL_WFX_CONFIG_SOFTAP
-                                        | SL_WFX_START_AP | SL_WFX_STOP_AP
-#endif /* SL_WFX_CONFIG_SOFTAP */
-#ifdef SL_WFX_CONFIG_SCAN
-                                        | SL_WFX_SCAN_START | SL_WFX_SCAN_COMPLETE
-#endif /* SL_WFX_CONFIG_SCAN */
-                                        | BITS_TO_WAIT,
-                                    pdTRUE, pdFALSE, pdMS_TO_TICKS(250)); /* 250 msec delay converted to ticks */
-        if (flags & SL_WFX_RETRY_CONNECT)
-        {
-            if (!retryInProgress)
-            {
-                SILABS_LOG("WFX sending the connect command");
-                wfx_connect_to_ap();
-                retryInProgress = true;
-            }
-        }
-
-        if (wifi_extra & WE_ST_STA_CONN)
-        {
-            if ((now = xTaskGetTickCount()) > (last_dhcp_poll + pdMS_TO_TICKS(250)))
-            {
-#if (CHIP_DEVICE_CONFIG_ENABLE_IPV4)
-                uint8_t dhcp_state = dhcpclient_poll(&sta_netif);
-
-                if ((dhcp_state == DHCP_ADDRESS_ASSIGNED) && !hasNotifiedIPV4)
-                {
-                    wfx_dhcp_got_ipv4((uint32_t) sta_netif->ip_addr.u_addr.ip4.addr);
-                    hasNotifiedIPV4 = true;
-                    if (!hasNotifiedWifiConnectivity)
-                    {
-                        SILABS_LOG("WIFI: Has Notified Wifi Connectivity");
-                        wfx_connected_notify(CONNECTION_STATUS_SUCCESS, &ap_mac);
-                        hasNotifiedWifiConnectivity = true;
-                    }
-                }
-                else if (dhcp_state == DHCP_OFF)
-                {
-                    wfx_ip_changed_notify(IP_STATUS_FAIL);
-                    hasNotifiedIPV4 = false;
-                }
-#endif // CHIP_DEVICE_CONFIG_ENABLE_IPV4
-                if ((ip6_addr_ispreferred(netif_ip6_addr_state(sta_netif, 0))) && !hasNotifiedIPV6)
-                {
-                    wfx_ipv6_notify(1);
-                    hasNotifiedIPV6 = true;
-                    if (!hasNotifiedWifiConnectivity)
-                    {
-                        wfx_connected_notify(CONNECTION_STATUS_SUCCESS, &ap_mac);
-                        hasNotifiedWifiConnectivity = true;
-                    }
-                }
-                last_dhcp_poll = now;
-            }
-        }
-
-        if (flags & SL_WFX_CONNECT)
-        {
-#if (CHIP_DEVICE_CONFIG_ENABLE_IPV4)
-            wfx_ip_changed_notify(IP_STATUS_FAIL);
-            hasNotifiedIPV4 = false;
-#endif // CHIP_DEVICE_CONFIG_ENABLE_IPV4
-            wfx_ipv6_notify(GET_IPV6_FAIL);
-            hasNotifiedIPV6             = false;
-            hasNotifiedWifiConnectivity = false;
-            SILABS_LOG("WIFI: Connected to AP");
-            wifi_extra |= WE_ST_STA_CONN;
-            wfx_lwip_set_sta_link_up();
-#ifdef SLEEP_ENABLED
-            if (!(wfx_get_wifi_state() & SL_WFX_AP_INTERFACE_UP))
-            {
-                // Enable the power save
-                sl_wfx_set_power_mode(WFM_PM_MODE_PS, WFM_PM_POLL_UAPSD, BEACON_1);
-                sl_wfx_enable_device_power_save();
-            }
-#endif // SLEEP_ENABLED
-        }
-
-        if (flags & SL_WFX_DISCONNECT)
-        {
-
-#if (CHIP_DEVICE_CONFIG_ENABLE_IPV4)
-            wfx_ip_changed_notify(IP_STATUS_FAIL);
-            hasNotifiedIPV4 = false;
-#endif // CHIP_DEVICE_CONFIG_ENABLE_IPV4
-            wfx_ipv6_notify(GET_IPV6_FAIL);
-            hasNotifiedIPV6             = false;
-            hasNotifiedWifiConnectivity = false;
-            wifi_extra &= ~WE_ST_STA_CONN;
-            wfx_lwip_set_sta_link_down();
-        }
-
-#ifdef SL_WFX_CONFIG_SCAN
-        if (flags & SL_WFX_SCAN_START)
-        {
-            /*
-             * Start the Scan
-             */
-            sl_wfx_ssid_def_t ssid, *sp;
-            uint16_t num_ssid, slen;
-            if (scan_ssid)
-            {
-                memset(&ssid, 0, sizeof(ssid));
-                slen = strlen(scan_ssid);
-                memcpy(&ssid.ssid[0], scan_ssid, slen);
-                ssid.ssid_length = slen;
-                num_ssid         = 1;
-                sp               = &ssid;
-            }
-            else
-            {
-                num_ssid = 0;
-                sp       = (sl_wfx_ssid_def_t *) 0;
-            }
-
-            SILABS_LOG("WIFI Scan Parameter set to Active channel time %d, Passive "
-                       "Channel Time: %d, Number of prob: %d",
-                       ACTIVE_CHANNEL_TIME, PASSIVE_CHANNEL_TIME, NUM_PROBE_REQUEST);
-            (void) sl_wfx_set_scan_parameters(ACTIVE_CHANNEL_TIME, PASSIVE_CHANNEL_TIME, NUM_PROBE_REQUEST);
-            (void) sl_wfx_send_scan_command(WFM_SCAN_MODE_ACTIVE, CHANNEL_LIST, /* Channel list */
-                                            CHANNEL_COUNT,                      /* Scan all chans */
-                                            sp, num_ssid, IE_DATA,              /* IE we're looking for */
-                                            IE_DATA_LENGTH, BSSID_SCAN);
-        }
-        if (flags & SL_WFX_SCAN_COMPLETE)
-        {
-            struct scan_result_holder *hp, *next;
-
-            SILABS_LOG("WIFI: Return %d scan results", scan_count);
-            for (hp = scan_save; hp; hp = next)
-            {
-                next = hp->next;
-                (*scan_cb)(&hp->scan);
-                vPortFree(hp);
-            }
-            (*scan_cb)((wfx_wifi_scan_result *) 0);
-            scan_save  = (struct scan_result_holder *) 0;
-            scan_count = 0;
-            if (scan_ssid)
-            {
-                vPortFree(scan_ssid);
-                scan_ssid = (char *) 0;
-            }
-            /* Terminate scan */
-            scan_cb = 0;
-        }
-#endif /* SL_WFX_CONFIG_SCAN */
-    }
-}
-
-/****************************************************************************
- * @brief
- * Initialize the WF200 used by the two interfaces
- *****************************************************************************/
-static sl_status_t wfx_init(void)
-{
-    /* Initialize the WF200 used by the two interfaces */
-    wfx_events_task_start();
-    sl_status_t status = sl_wfx_init(&wifiContext);
-    SILABS_LOG("FMAC Driver version    %s", FMAC_DRIVER_VERSION_STRING);
-    switch (status)
-    {
-    case SL_STATUS_OK:
-        SILABS_LOG("WF200 FW ver:%d.%d.%d [MAC %02x:%02x:%02x-%02x:%02x:%02x]", wifiContext.firmware_major,
-                   wifiContext.firmware_minor, wifiContext.firmware_build, wifiContext.mac_addr_0.octet[0],
-                   wifiContext.mac_addr_0.octet[1], wifiContext.mac_addr_0.octet[2], wifiContext.mac_addr_0.octet[3],
-                   wifiContext.mac_addr_0.octet[4], wifiContext.mac_addr_0.octet[5]);
-        SILABS_LOG("WF200 Init OK");
-
-        if (wifiContext.state == SL_WFX_STA_INTERFACE_CONNECTED)
-        {
-            sl_wfx_send_disconnect_command();
-        }
-
-        break;
-    case SL_STATUS_WIFI_INVALID_KEY:
-        SILABS_LOG("*ERR*WF200: F/W keyset invalid");
-        break;
-    case SL_STATUS_WIFI_FIRMWARE_DOWNLOAD_TIMEOUT:
-        SILABS_LOG("*ERR*WF200: F/W download timo");
-        break;
-    case SL_STATUS_TIMEOUT:
-        SILABS_LOG("*ERR*WF200: Poll for value timo");
-        break;
-    case SL_STATUS_FAIL:
-        SILABS_LOG("*ERR*WF200: Error");
-        break;
-    default:
-        SILABS_LOG("*ERR*WF200: Unknown");
-    }
-
-    return status;
-}
-
-/*****************************************************************************
- * @brief
- *   tcp ip, wfx and lwip stack and start dhcp client.
- * @return
- *    sl_status_t Shows init succes or error.
- ******************************************************************************/
-static void wfx_wifi_hw_start(void)
-{
-    sl_status_t status;
-
-    if (wifi_extra & WE_ST_HW_STARTED)
-        return;
-    SILABS_LOG("STARTING WF200\n");
-    wifi_extra |= WE_ST_HW_STARTED;
-
-    sl_wfx_host_gpio_init();
-    if ((status = wfx_init()) == SL_STATUS_OK)
-    {
-        /* Initialize the LwIP stack */
-        SILABS_LOG("WF200:Start LWIP");
-        wfx_lwip_start();
-        wifiContext.state = SL_WFX_STARTED; /* Really this is a bit mask */
-        SILABS_LOG("WF200:ready..");
-    }
-    else
-    {
-        SILABS_LOG("*ERR*WF200:init failed");
-    }
-}
-
-/***********************************************************************
- * @brief
- * Get AP info
- * @param[in]  ap: access point information
- * @return returns -1
- **************************************************************************/
-int32_t wfx_get_ap_info(wfx_wifi_scan_result_t * ap)
-{
-    int32_t signal_strength;
-    SILABS_LOG("WIFI:SSID:: %s", &ap_info.ssid[0]);
-    memcpy(ap->ssid, ap_info.ssid, sizeof(ap_info.ssid));
-    SILABS_LOG("WIFI:Mac addr:: %02x:%02x:%02x:%02x:%02x:%02x", ap_info.bssid[0], ap_info.bssid[1], ap_info.bssid[2],
-               ap_info.bssid[3], ap_info.bssid[4], ap_info.bssid[5]);
-    memcpy(ap->bssid, ap_info.bssid, sizeof(ap_info.bssid));
-    ap->security = ap_info.security;
-    SILABS_LOG("WIFI:security:: %d", ap->security);
-    ap->chan = ap_info.chan;
-    SILABS_LOG("WIFI:Channel:: to %d", ap->chan);
-
-    sl_status_t status = sl_wfx_get_signal_strength((uint32_t *) &signal_strength);
-
-    if (status == SL_STATUS_OK)
-    {
-        SILABS_LOG("status SL_STATUS_OK & signal_strength:: %d", signal_strength);
-        ap->rssi = (signal_strength - 220) / 2;
-    }
-    return status;
-}
-
-/************************************************************************
- * @brief
- * Get AP extra info
- * @param[in]  extra_info: access point extra information
- * @return returns -1
- **************************************************************************/
-int32_t wfx_get_ap_ext(wfx_wifi_scan_ext_t * extra_info)
-{
-    int32_t status;
-    status = get_all_counters();
-    if (status != SL_STATUS_OK)
-    {
-        SILABS_LOG("Failed to get the couters");
-    }
-    else
-    {
-        extra_info->beacon_lost_count = counters->body.count_miss_beacon;
-        extra_info->beacon_rx_count   = counters->body.count_rx_beacon;
-        extra_info->mcast_rx_count    = counters->body.count_rx_multicast_frames;
-        extra_info->mcast_tx_count    = counters->body.count_tx_multicast_frames;
-        extra_info->ucast_rx_count    = counters->body.count_rx_packets;
-        extra_info->ucast_tx_count    = counters->body.count_tx_packets;
-        extra_info->overrun_count     = gOverrunCount;
-    }
-    return status;
-}
-
-sl_status_t get_all_counters(void)
-{
-    sl_status_t result;
-    uint8_t command_id         = 0x05;
-    uint16_t mib_id            = 0x2035;
-    sl_wfx_mib_req_t * request = NULL;
-    uint32_t request_length    = SL_WFX_ROUND_UP_EVEN(sizeof(sl_wfx_header_mib_t) + sizeof(sl_wfx_mib_req_body_t));
-
-    result =
-        sl_wfx_allocate_command_buffer((sl_wfx_generic_message_t **) &request, command_id, SL_WFX_CONTROL_BUFFER, request_length);
-
-    if (request == NULL)
-    {
-    }
-
-    request->body.mib_id      = mib_id;
-    request->header.interface = 0x2;
-    request->header.encrypted = 0x0;
-
-    result = sl_wfx_send_request(command_id, (sl_wfx_generic_message_t *) request, request_length);
-    SL_WFX_ERROR_CHECK(result);
-
-    result = sl_wfx_host_wait_for_confirmation(command_id, SL_WFX_DEFAULT_REQUEST_TIMEOUT_MS, (void **) &counters);
-    SL_WFX_ERROR_CHECK(result);
-
-    SILABS_LOG("%-24s %12s \r\n", "", "Debug Counters Content");
-    SILABS_LOG("%-24s %lu\r\n", "rcpi", (unsigned long) counters->body.rcpi);
-    PUT_COUNTER(plcp_errors);
-    PUT_COUNTER(fcs_errors);
-    PUT_COUNTER(tx_packets);
-    PUT_COUNTER(rx_packets);
-    PUT_COUNTER(rx_packet_errors);
-    PUT_COUNTER(rx_decryption_failures);
-    PUT_COUNTER(rx_mic_failures);
-    PUT_COUNTER(rx_no_key_failures);
-    PUT_COUNTER(tx_multicast_frames);
-    PUT_COUNTER(tx_frames_success);
-    PUT_COUNTER(tx_frame_failures);
-    PUT_COUNTER(tx_frames_retried);
-    PUT_COUNTER(tx_frames_multi_retried);
-    PUT_COUNTER(rx_frame_duplicates);
-    PUT_COUNTER(rts_success);
-    PUT_COUNTER(rts_failures);
-    PUT_COUNTER(ack_failures);
-    PUT_COUNTER(rx_multicast_frames);
-    PUT_COUNTER(rx_frames_success);
-    PUT_COUNTER(rx_cmacicv_errors);
-    PUT_COUNTER(rx_cmac_replays);
-    PUT_COUNTER(rx_mgmt_ccmp_replays);
-    PUT_COUNTER(rx_bipmic_errors);
-    PUT_COUNTER(rx_beacon);
-    PUT_COUNTER(miss_beacon);
-
-error_handler:
-
-    if (result == SL_STATUS_TIMEOUT)
-    {
-        if (sl_wfx_context->used_buffers > 0)
-        {
-            sl_wfx_context->used_buffers--;
-        }
-    }
-    if (request != NULL)
-    {
-        sl_wfx_free_command_buffer((sl_wfx_generic_message_t *) request, command_id, SL_WFX_CONTROL_BUFFER);
-    }
-
-    return result;
-}
-
-/************************************************************************
- * @brief
- *    reset the count
- * @return returns -1
- **************************************************************************/
-int32_t wfx_reset_counts()
-{
-    /* TODO */
-    return -1;
-}
-
-/*************************************************************************
- * @brief
- * I think that this is getting called before FreeRTOS threads are ready
- * @return  returns SL_STATUS_OK
- **************************************************************************/
-sl_status_t wfx_wifi_start(void)
-{
-    if (wifi_extra & WE_ST_STARTED)
-    {
-        SILABS_LOG("WIFI: Already started");
-        return SL_STATUS_OK;
-    }
-    wifi_extra |= WE_ST_STARTED;
-    wfx_soft_init();
-    wfx_wifi_hw_start();
-
-    return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @brief
- *      get the wifi state
- * @return returns wificonetext state
- *****************************************************************************/
-sl_wfx_state_t wfx_get_wifi_state(void)
-{
-    return wifiContext.state;
-}
-
-/****************************************************************************
- * @brief
- *      getnetif using interface
- * @param[in]  interface:
- * @return returns selectedNetif
- *****************************************************************************/
-struct netif * wfx_GetNetif(sl_wfx_interface_t interface)
-{
-    struct netif * SelectedNetif = NULL;
-    if (interface == SL_WFX_STA_INTERFACE)
-    {
-        SelectedNetif = sta_netif;
-    }
-#ifdef SL_WFX_CONFIG_SOFTAP
-    else if (interface == SL_WFX_SOFTAP_INTERFACE)
-    {
-        // no ap currently
-    }
-#endif
-    return SelectedNetif;
-}
-
-/****************************************************************************
- * @brief
- * get the wifi mac address using interface
- * @param[in] interface:
- * @return  returns wificontext.mac_addr_o if successful,
- *          wificontext.mac_addr_1 otherwise
- *****************************************************************************/
-sl_wfx_mac_address_t wfx_get_wifi_mac_addr(sl_wfx_interface_t interface)
-{
-    // return Mac address used by WFX SL_WFX_STA_INTERFACE or SL_WFX_SOFTAP_INTERFACE,
-    return (interface == SL_WFX_STA_INTERFACE) ? wifiContext.mac_addr_0 : wifiContext.mac_addr_1;
-}
-
-/****************************************************************************
- * @brief
- * set the wifi provision
- * @param[in] wifiConfig: configuration of wifi
- *****************************************************************************/
-void wfx_set_wifi_provision(wfx_wifi_provision_t * wifiConfig)
-{
-    memcpy(wifi_provision.ssid, wifiConfig->ssid, sizeof(wifiConfig->ssid));
-    memcpy(wifi_provision.passkey, wifiConfig->passkey, sizeof(wifiConfig->passkey));
-    SILABS_LOG("WIFI: Provision SSID=%s", &wifi_provision.ssid[0]);
-
-    /* Not very good - To be improved */
-    switch (wifiConfig->security)
-    {
-    case WFX_SEC_WPA:
-        wifi_provision.security = static_cast<uint8_t>(sl_wfx_security_mode_e::WFM_SECURITY_MODE_WPA2_WPA1_PSK);
-        break;
-    case WFX_SEC_WPA3:
-        wifi_provision.security = WFM_SECURITY_MODE_WPA3_SAE;
-        break;
-    case WFX_SEC_WPA2:
-        wifi_provision.security = static_cast<uint8_t>(sl_wfx_security_mode_e::WFM_SECURITY_MODE_WPA2_WPA1_PSK);
-        break;
-    case WFX_SEC_WPA_WPA2_MIXED:
-        wifi_provision.security = static_cast<uint8_t>(sl_wfx_security_mode_e::WFM_SECURITY_MODE_WPA2_WPA1_PSK);
-        break;
-    default:
-        wifi_provision.security = WFM_SECURITY_MODE_WPA2_PSK;
-        break;
-    }
-}
-
-/****************************************************************************
- * @brief
- * get the wifi provision
- * @param[in] wifiConfig: configuration of wifi
- * @return returns true if successful,
- *         false otherwise
- *****************************************************************************/
-bool wfx_get_wifi_provision(wfx_wifi_provision_t * wifiConfig)
-{
-    if (wifiConfig == NULL)
-    {
-        return false;
-    }
-    memcpy(wifiConfig, &wifi_provision, sizeof(wfx_wifi_provision_t));
-
-    return true;
-}
-
-/****************************************************************************
- * @brief
- * clear the wifi provision
- * @return returns true if successful,
- *         false otherwise
- *****************************************************************************/
-void wfx_clear_wifi_provision(void)
-{
-    memset(&wifi_provision, 0, sizeof(wifi_provision));
-}
-
-/****************************************************************************
- * @brief
- *      driver STA provisioned
- * @return returns true if successful,
- *         false otherwise
- *****************************************************************************/
-bool wfx_is_sta_provisioned(void)
-{
-    return (wifi_provision.ssid[0]) ? true : false;
-}
-
-/****************************************************************************
- * @fn  sl_status_t wfx_connect_to_ap(void)
- * @brief
- *  driver connect to ap
- * @return returns SL_STATUS_NOT_AVAILABLE
- *****************************************************************************/
-sl_status_t wfx_connect_to_ap(void)
-{
-    sl_status_t result;
-
-    if (wifi_provision.ssid[0] == 0)
-    {
-        return SL_STATUS_NOT_AVAILABLE;
-    }
-    SILABS_LOG("WIFI:JOIN to %s", &wifi_provision.ssid[0]);
-
-    SILABS_LOG("WIFI Scan Parameter set to Active channel time %d, Passive Channel "
-               "Time: %d, Number of prob: %d",
-               ACTIVE_CHANNEL_TIME, PASSIVE_CHANNEL_TIME, NUM_PROBE_REQUEST);
-    (void) sl_wfx_set_scan_parameters(ACTIVE_CHANNEL_TIME, PASSIVE_CHANNEL_TIME, NUM_PROBE_REQUEST);
-    result =
-        sl_wfx_send_join_command((uint8_t *) wifi_provision.ssid, strlen(wifi_provision.ssid), NULL, CHANNEL_0,
-                                 static_cast<sl_wfx_security_mode_t>(wifi_provision.security), PREVENT_ROAMING, DISABLE_PMF_MODE,
-                                 (uint8_t *) wifi_provision.passkey, strlen(wifi_provision.passkey), NULL, IE_DATA_LENGTH);
-
-    return result;
-}
-
-/****************************************************************************
- * @brief
- * get the wifi mac addresss
- * @param[in] interface:
- * @param[in] addr : address
- *****************************************************************************/
-void wfx_get_wifi_mac_addr(sl_wfx_interface_t interface, sl_wfx_mac_address_t * addr)
-{
-    sl_wfx_mac_address_t * mac;
-
-#ifdef SL_WFX_CONFIG_SOFTAP
-    mac = (interface == SL_WFX_SOFTAP_INTERFACE) ? &wifiContext.mac_addr_1 : &wifiContext.mac_addr_0;
-#else
-    mac = &wifiContext.mac_addr_0;
-#endif
-    *addr = *mac;
-    SILABS_LOG("WLAN:Get WiFi Mac addr %02x:%02x:%02x:%02x:%02x:%02x", mac->octet[0], mac->octet[1], mac->octet[2], mac->octet[3],
-               mac->octet[4], mac->octet[5]);
-    memcpy(&ap_info.bssid[0], &mac->octet[0], 6);
-}
-
-/****************************************************************************
- * @brief
- *     function called when driver have ipv4 address
- * @param[in]  which_if:
- * @return returns false if successful,
- *         true otherwise
- *****************************************************************************/
-bool wfx_have_ipv4_addr(sl_wfx_interface_t which_if)
-{
-    if (which_if == SL_WFX_STA_INTERFACE)
-    {
-        return (sta_ip == STA_IP_FAIL) ? false : true;
-    }
-    else
-    {
-        return false; /* TODO */
-    }
-}
-
-/****************************************************************************
- * @brief
- *     function called when driver have ipv6 address
- * @param[in]  which_if:
- * @return returns false if successful,
- *         true otherwise
- *****************************************************************************/
-bool wfx_have_ipv6_addr(sl_wfx_interface_t which_if)
-{
-    SILABS_LOG("%s: started.", __func__);
-    bool status = false;
-    if (which_if == SL_WFX_STA_INTERFACE)
-    {
-        status = wfx_is_sta_connected();
-    }
-    else
-    {
-        status = false; /* TODO */
-    }
-    SILABS_LOG("%s: status: %d", __func__, status);
-    return status;
-}
-
-/****************************************************************************
- * @brief
- * Disconnect station mode from connected AP
- * @returns Returns SL_STATUS_OK if successful,
- *             SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t wfx_sta_discon(void)
-{
-    SILABS_LOG("STA-Disconnecting");
-    int32_t status = sl_wfx_send_disconnect_command();
-    wifi_extra &= ~WE_ST_STA_CONN;
-    xEventGroupSetBits(sl_wfx_event_group, SL_WFX_RETRY_CONNECT);
-    return status;
-}
-
-/****************************************************************************
- * @brief
- *     enable the STA mode
- * @return returns true
- *****************************************************************************/
-bool wfx_is_sta_mode_enabled(void)
-{
-    return true; /* It always is */
-}
-
-/****************************************************************************
- * @brief
- *     fuction called when driver is STA connected
- * @return returns true if successful,
- *         false otherwise
- *****************************************************************************/
-bool wfx_is_sta_connected(void)
-{
-    bool val;
-
-    val = (wifi_extra & WE_ST_STA_CONN) ? true : false;
-
-    SILABS_LOG("WLAN: STA %s connected", (val ? "IS" : "NOT"));
-
-    return val;
-}
-
-/****************************************************************************
- * @brief
- *      It is automatically done when lwip link up
- * @return returns true if successful,
- *         false otherwise
- *****************************************************************************/
-void wfx_setup_ip6_link_local(sl_wfx_interface_t whichif)
-{
-    SILABS_LOG("Setup-IP6: TODO"); /* It is automatically done when lwip link up */
-}
-
-/****************************************************************************
- * @brief
- *      get the wifi mode
- * @return returns WIFI_MODE_NULL if successful,
- *         WIFI_MODE_STA otherwise
- *****************************************************************************/
-wifi_mode_t wfx_get_wifi_mode()
-{
-    if (wifiContext.state & SL_WFX_STARTED)
-        return WIFI_MODE_STA;
-    return WIFI_MODE_NULL;
-}
-
-/*****************************************************************************
- * @brief
- * This is called from the context of AppTask
- * For WF200 - Start WIFI here
- * @return returns true if successful,
- *         false otherwise
- ******************************************************************************/
-bool wfx_hw_ready(void)
-{
-    return (wifiContext.state & SL_WFX_STARTED) ? true : false;
-}
-
-#if CHIP_DEVICE_CONFIG_ENABLE_IPV4
-/*****************************************************************************
- * @brief
- *    function called when dhcp got ipv4
- * @param[in]  ip : internet protocol
- ******************************************************************************/
-void wfx_dhcp_got_ipv4(uint32_t ip)
-{
-    /* Acquire the new IP address
-     */
-    sta_ip = ip;
-    wfx_ip_changed_notify(IP_STATUS_SUCCESS);
-}
-#endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */
-
-/*****************************************************************************
- * @brief
- *    function called from connectivityManager
- ******************************************************************************/
-void wfx_enable_sta_mode(void)
-{
-    /* Nothing to do - default is that it is
-       place holder */
-}
-
-/****************************************************************************
- * @brief
- * driver scan start
- * @param[in]  callback: Callback from the wifi scan  results
- * @return returns true if successful,
- *         false otherwise
- *****************************************************************************/
-#ifdef SL_WFX_CONFIG_SCAN
-bool wfx_start_scan(char * ssid, void (*callback)(wfx_wifi_scan_result_t *))
-{
-    int sz;
-
-    if (scan_cb)
-        return false; /* Already in progress */
-    if (ssid)
-    {
-        sz = strlen(ssid);
-        if ((scan_ssid = (char *) pvPortMalloc(sz + 1)) == (char *) 0)
-        {
-            return false;
-        }
-        strcpy(scan_ssid, ssid);
-    }
-    scan_cb = callback;
-    xEventGroupSetBits(sl_wfx_event_group, SL_WFX_SCAN_START);
-
-    return true;
-}
-
-/****************************************************************************
- * @brief
- * driver scan cancelation
- *****************************************************************************/
-void wfx_cancel_scan(void)
-{
-    struct scan_result_holder *hp, *next;
-    /* Not possible */
-    if (!scan_cb)
-    {
-        return;
-    }
-    sl_wfx_send_stop_scan_command();
-    for (hp = scan_save; hp; hp = next)
-    {
-        next = hp->next;
-        vPortFree(hp);
-    }
-    scan_save  = (struct scan_result_holder *) 0;
-    scan_count = 0;
-    if (scan_ssid)
-    {
-        vPortFree(scan_ssid);
-        scan_ssid = (char *) 0;
-    }
-    scan_cb = 0;
-}
-#endif /* SL_WFX_CONFIG_SCAN */
diff --git a/examples/platform/silabs/SiWx917/wf200/sl_wfx_board.h b/examples/platform/silabs/SiWx917/wf200/sl_wfx_board.h
deleted file mode 100644
index 96ab968..0000000
--- a/examples/platform/silabs/SiWx917/wf200/sl_wfx_board.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *
- *    Copyright (c) 2022 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.
- */
-
-#ifndef _SL_WFX_BOARD_H_
-#define _SL_WFX_BOARD_H_
-/*
- * Pull in the right board PINS
- */
-#if defined(EFR32MG12_BRD4161A) || defined(BRD4161A) || defined(EFR32MG12_BRD4162A) || defined(BRD4162A) ||                        \
-    defined(EFR32MG12_BRD4163A) || defined(BRD4163A) || defined(EFR32MG12_BRD4164A) || defined(BRD4164A) ||                        \
-    defined(EFR32MG12_BRD4170A) || defined(BRD4170A)
-#include "brd4161a.h"
-#elif defined(EFR32MG24_BRD4186C) || defined(BRD4186C) || defined(EFR32MG24_BRD4186A) || defined(BRD4186A)
-#include "brd4186c.h"
-#elif defined(EFR32MG24_BRD4187C) || defined(BRD4187C) || defined(EFR32MG24_BRD4187A) || defined(BRD4187A)
-#include "brd4187c.h"
-#else
-#error "Need SPI Pins"
-#endif /* EFR32MG12_BRD4161A */
-#endif /* _SL_WFX_BOARD_H_ */
diff --git a/examples/platform/silabs/SiWx917/wf200/sl_wfx_configuration.h b/examples/platform/silabs/SiWx917/wf200/sl_wfx_configuration.h
deleted file mode 100644
index deb468d..0000000
--- a/examples/platform/silabs/SiWx917/wf200/sl_wfx_configuration.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *
- *    Copyright (c) 2022 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.
- */
-
-#pragma once
-
-// SL_WFX_DEFAULT_REQUEST_TIMEOUT_MS> Timeout period in milliseconds<250-10000>
-// Default: 5000
-// Timeout period in milliseconds for requests.
-#define SL_WFX_DEFAULT_REQUEST_TIMEOUT_MS (5000)
-
-// <h>WFx Secure Link configuration
-
-// SL_WFX_SLK_CURVE25519> Use crypto curves
-// Default: 1
-// If this option is enabled ECDH crypto is used, KDF otherwise.
-#define SL_WFX_SLK_CURVE25519 (1)
diff --git a/examples/platform/silabs/SiWx917/wf200/sl_wfx_crypto.c b/examples/platform/silabs/SiWx917/wf200/sl_wfx_crypto.c
deleted file mode 100644
index ddad3ec..0000000
--- a/examples/platform/silabs/SiWx917/wf200/sl_wfx_crypto.c
+++ /dev/null
@@ -1,409 +0,0 @@
-/*
- *
- *    Copyright (c) 2022 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.
- */
-
-#ifdef SL_WFX_USE_SECURE_LINK
-
-/* Includes */
-
-#include "sl_wfx.h"
-#include <stdio.h>
-
-#include "mbedtls/ccm.h"
-#include "mbedtls/ctr_drbg.h"
-#include "mbedtls/ecdh.h"
-#include "mbedtls/entropy.h"
-#include "mbedtls/md.h"
-#include "mbedtls/sha256.h"
-
-#include "FreeRTOS.h"
-#include "queue.h"
-#include "semphr.h"
-#include "task.h"
-
-// Secure link MAC key location for WGM160P (in DI page in flash)
-#ifdef EFM32GG11B820F2048GM64 // WGM160PX22KGA2
-#define SL_WFX_FCCC_BASE_ADDR ((void *) 0x0fe08000ul)
-#define SL_WFX_FCCC_DI_OFFSET 0x1B0ul
-#define SL_WFX_FCCC_DI_ADDR ((void *) (SL_WFX_FCCC_BASE_ADDR + SL_WFX_FCCC_DI_OFFSET))
-#define SL_WFX_SECURE_LINK_MAC_KEY_LOCATION ((void *) (SL_WFX_FCCC_BASE_ADDR + 0x3D0))
-#endif
-/******************************************************
- *                      Macros
- ******************************************************/
-#define MAC_KEY_FAIL_BYTE 0XFF
-#define KEY_DIGEST_SIZE 92
-#define MEMCMP_FAIL 0
-#define MPI_SET 1
-#define SUCCESS_STATUS_WIFI_SECURE_LINK_EXCHANGE 0
-#define SHA224_0 0
-#define HMAC_SIZE 92
-#define MEMSET_LEN 1
-#define LABLE_LEN 24
-#define ADDRESS_LENGTH 0
-#define CCM_STATUS_SUCCESS 0
-/******************************************************
- *                    Constants
- ******************************************************/
-
-/* Semaphore to signal wfx driver available */
-extern TaskHandle_t wfx_securelink_task;
-extern SemaphoreHandle_t wfx_securelink_rx_mutex;
-
-/******************************************************
- *                   Enumerations
- ******************************************************/
-
-/******************************************************
- *                 Type Definitions
- ******************************************************/
-
-/******************************************************
- *                    Structures
- ******************************************************/
-
-/******************************************************
- *               Function Declarations
- ******************************************************/
-
-static inline void reverse_bytes(uint8_t * src, uint8_t length);
-
-/******************************************************
- *               Variable Definitions
- ******************************************************/
-
-#if SL_WFX_SLK_CURVE25519
-static mbedtls_ecdh_context mbedtls_host_context;
-static mbedtls_ctr_drbg_context host_drbg_context;
-#endif
-static mbedtls_entropy_context entropy;
-uint8_t temp_key_location[SL_WFX_HOST_PUB_KEY_MAC_SIZE];
-#ifdef EFM32GG11B820F2048GM64 // WGM160PX22KGA2
-static const uint8_t * const secure_link_mac_key = (uint8_t *) SL_WFX_SECURE_LINK_MAC_KEY_LOCATION;
-#else
-static const uint8_t secure_link_mac_key[SL_WFX_SECURE_LINK_MAC_KEY_LENGTH] = { 0x2B, 0x49, 0xFD, 0x66, 0xCB, 0x74, 0x6D, 0x6B,
-                                                                                0x4F, 0xDC, 0xC3, 0x79, 0x4E, 0xC5, 0x9A, 0x86,
-                                                                                0xE5, 0x48, 0x2A, 0x41, 0x22, 0x87, 0x8B, 0x12,
-                                                                                0x1A, 0x7C, 0x3E, 0xEF, 0xB7, 0x04, 0x9E, 0xB3 };
-#endif
-/******************************************************
- *               Function Definitions
- ******************************************************/
-/****************************************************************************
- * @fn  sl_status_t sl_wfx_host_get_secure_link_mac_key(uint8_t *sl_mac_key)
- * @brief
- * Get secure link mac key
- * @param[in]  sl_mac_key:
- * @return  returns SL_STATUS_OK
- *****************************************************************************/
-sl_status_t sl_wfx_host_get_secure_link_mac_key(uint8_t * sl_mac_key)
-{
-    sl_status_t result = SL_STATUS_WIFI_SECURE_LINK_MAC_KEY_ERROR;
-
-    memcpy(sl_mac_key, secure_link_mac_key, SL_WFX_SECURE_LINK_MAC_KEY_LENGTH);
-
-    for (uint8_t index = 0; index < SL_WFX_SECURE_LINK_MAC_KEY_LENGTH; ++index)
-    {
-        // Assuming 0xFF... when not written
-        if (sl_mac_key[index] != MAC_KEY_FAIL_BYTE)
-        {
-            result = SL_STATUS_OK;
-            break;
-        }
-    }
-
-    return result;
-}
-
-/****************************************************************************
- * @fn  sl_status_t sl_wfx_host_compute_pub_key(sl_wfx_securelink_exchange_pub_keys_req_body_t *request,
-                                        const uint8_t *sl_mac_key)
- * @brief
- * compute host public key
- * @param[in] request :
- * @param[in] sl_mac_key :
- * @return  returns SL_STATUS_OK
- *****************************************************************************/
-sl_status_t sl_wfx_host_compute_pub_key(sl_wfx_securelink_exchange_pub_keys_req_body_t * request, const uint8_t * sl_mac_key)
-{
-    sl_status_t status = SL_STATUS_OK;
-
-#if SL_WFX_SLK_CURVE25519
-    const char identifier[] = "ecdh";
-
-    mbedtls_ecdh_init(&mbedtls_host_context);
-    mbedtls_ctr_drbg_init(&host_drbg_context);
-    mbedtls_entropy_init(&entropy);
-    status = mbedtls_ctr_drbg_seed(&host_drbg_context, mbedtls_entropy_func, &entropy, (const unsigned char *) identifier,
-                                   sizeof(identifier));
-    status += mbedtls_ecp_group_load(&mbedtls_host_context.grp, MBEDTLS_ECP_DP_CURVE25519);
-    status += mbedtls_ecdh_gen_public(&mbedtls_host_context.grp, &mbedtls_host_context.d, &mbedtls_host_context.Q,
-                                      mbedtls_ctr_drbg_random, &host_drbg_context);
-    status += mbedtls_mpi_write_binary(&mbedtls_host_context.Q.X, request->host_pub_key, SL_WFX_HOST_PUB_KEY_SIZE);
-#else
-    mbedtls_entropy_init(&entropy);
-    status                        = mbedtls_entropy_func(&entropy, request->host_pub_key, SL_WFX_HOST_PUB_KEY_SIZE);
-#endif
-    reverse_bytes(request->host_pub_key, SL_WFX_HOST_PUB_KEY_SIZE);
-    SL_WFX_ERROR_CHECK(status);
-
-    // Generate SHA512 digest of public key
-    status = mbedtls_md_hmac(mbedtls_md_info_from_type(MBEDTLS_MD_SHA512), sl_mac_key, SL_WFX_HOST_PUB_KEY_SIZE,
-                             request->host_pub_key, SL_WFX_HOST_PUB_KEY_SIZE, request->host_pub_key_mac);
-    SL_WFX_ERROR_CHECK(status);
-
-error_handler:
-    if (status != SL_STATUS_OK)
-    {
-        return SL_STATUS_WIFI_SECURE_LINK_EXCHANGE_FAILED;
-    }
-    return status;
-}
-
-/****************************************************************************
- * @fn  sl_status_t sl_wfx_host_verify_pub_key(sl_wfx_securelink_exchange_pub_keys_ind_t *response_packet,
-                                       const uint8_t *sl_mac_key,
-                                       uint8_t *sl_host_pub_key)
- * @brief
- * verify host public key
- * @param[in]  response_packet:
- * @param[in]  sl_mac_key:
- * @param[in]  sl_host_pub_key:
- * @return returns SL_STATUS_OK if successful,
- *         SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_verify_pub_key(sl_wfx_securelink_exchange_pub_keys_ind_t * response_packet, const uint8_t * sl_mac_key,
-                                       uint8_t * sl_host_pub_key)
-{
-    sl_status_t status = SL_STATUS_OK;
-    uint8_t shared_key_digest[KEY_DIGEST_SIZE];
-
-    if (xSemaphoreTake(wfx_securelink_rx_mutex, portMAX_DELAY) != pdTRUE)
-    {
-        return SL_STATUS_WIFI_SECURE_LINK_EXCHANGE_FAILED;
-    }
-
-    // Compute the Hash and verify the public key/hashing
-    status = mbedtls_md_hmac(mbedtls_md_info_from_type(MBEDTLS_MD_SHA512), sl_mac_key, SL_WFX_NCP_PUB_KEY_SIZE,
-                             response_packet->body.ncp_pub_key, SL_WFX_NCP_PUB_KEY_SIZE, temp_key_location);
-    SL_WFX_ERROR_CHECK(status);
-
-    // Calculate session key if public key/SHA512 digest matches
-    if (memcmp(temp_key_location, response_packet->body.ncp_pub_key_mac, SL_WFX_HOST_PUB_KEY_MAC_SIZE) != MEMCMP_FAIL)
-    {
-        status = SL_STATUS_WIFI_SECURE_LINK_EXCHANGE_FAILED;
-        goto error_handler;
-    }
-
-#if SL_WFX_SLK_CURVE25519
-    SL_WFX_UNUSED_PARAMETER(sl_host_pub_key);
-
-    mbedtls_mpi_lset(&mbedtls_host_context.Qp.Z, MPI_SET);
-
-    // Read Ineo public key
-    reverse_bytes(response_packet->body.ncp_pub_key, SL_WFX_NCP_PUB_KEY_SIZE);
-    mbedtls_mpi_read_binary(&mbedtls_host_context.Qp.X, response_packet->body.ncp_pub_key, SL_WFX_NCP_PUB_KEY_SIZE);
-
-    // Calculate shared secret
-    if (mbedtls_ecdh_compute_shared(&mbedtls_host_context.grp, &mbedtls_host_context.z, &mbedtls_host_context.Qp,
-                                    &mbedtls_host_context.d, mbedtls_ctr_drbg_random,
-                                    &host_drbg_context) != SUCCESS_STATUS_WIFI_SECURE_LINK_EXCHANGE)
-    {
-        status = SL_STATUS_WIFI_SECURE_LINK_EXCHANGE_FAILED;
-        goto error_handler;
-    }
-
-    // Generate session key
-    mbedtls_mpi_write_binary(&mbedtls_host_context.z, temp_key_location, SL_WFX_HOST_PUB_KEY_SIZE);
-    reverse_bytes(temp_key_location, SL_WFX_HOST_PUB_KEY_SIZE);
-    mbedtls_sha256(temp_key_location, SL_WFX_HOST_PUB_KEY_SIZE, shared_key_digest, SHA224_0);
-#else
-    uint8_t hmac_input[HMAC_SIZE] = { 0 };
-    char label[LABLE_LEN]         = "SecureLink!KeyDerivation";
-
-    memset((uint16_t *) &hmac_input[0], (uint16_t) sl_wfx_htole16(1), MEMSET_LEN);
-    memcpy((uint8_t *) &hmac_input[2], (uint8_t *) label, LABLE_LEN);
-    memcpy((uint8_t *) &hmac_input[26], sl_host_pub_key, SL_WFX_NCP_PUB_KEY_SIZE);
-    memcpy((uint8_t *) &hmac_input[58], (uint8_t *) response_packet->body.ncp_pub_key, SL_WFX_NCP_PUB_KEY_SIZE);
-    memset((uint16_t *) &hmac_input[90], (uint16_t) sl_wfx_htole16(128), 1);
-
-    // Generate SHA256 digest of hmac_input
-    status = mbedtls_md_hmac(mbedtls_md_info_from_type(MBEDTLS_MD_SHA256), sl_mac_key, SL_WFX_HOST_PUB_KEY_SIZE,
-                             (uint8_t *) hmac_input, HMAC_SIZE, shared_key_digest);
-#endif
-
-    memcpy(sl_wfx_context->secure_link_session_key, shared_key_digest,
-           SL_WFX_SECURE_LINK_SESSION_KEY_LENGTH); // Use the lower 16 bytes of the sha256
-    sl_wfx_context->secure_link_nonce.hp_packet_count = 0;
-    sl_wfx_context->secure_link_nonce.rx_packet_count = 0;
-    sl_wfx_context->secure_link_nonce.tx_packet_count = 0;
-
-error_handler:
-    if (xSemaphoreGive(wfx_securelink_rx_mutex) != pdTRUE)
-    {
-        printf("ERROR: sl_wfx_securelink_rx_mutex. unable to post.\n");
-    }
-    return status;
-}
-
-/****************************************************************************
- * @fn  sl_status_t sl_wfx_host_free_crypto_context(void)
- * @brief
- * Free host crypto context
- * @param[in] None
- * @return returns SL_STATUS_OK
- *****************************************************************************/
-sl_status_t sl_wfx_host_free_crypto_context(void)
-{
-#if SL_WFX_SLK_CURVE25519
-    mbedtls_ecdh_free(&mbedtls_host_context);
-    mbedtls_ctr_drbg_free(&host_drbg_context);
-#endif
-    mbedtls_entropy_free(&entropy);
-
-    return SL_STATUS_OK;
-}
-
-/********************************************************************************
- * @fn   sl_status_t sl_wfx_host_decode_secure_link_data(uint8_t *buffer, uint32_t length, uint8_t *session_key)
- * @brief
- * Decode receive data
- * Length excludes size of CCM tag and secure link header
- * @param[in] buffer:
- * @param[in] length:
- * @param[in] session_key:
- * @return returns SL_STATUS_OK if successful,
- *         SL_STATUS_FAIL otherwise
- ********************************************************************************/
-sl_status_t sl_wfx_host_decode_secure_link_data(uint8_t * buffer, uint32_t length, uint8_t * session_key)
-{
-    mbedtls_ccm_context ccm_context;
-    sl_status_t status = SL_STATUS_SECURITY_DECRYPT_ERROR;
-    int crypto_status;
-    sl_wfx_nonce_t nonce = { 0, 0, 0 };
-
-    if (xSemaphoreTake(wfx_securelink_rx_mutex, portMAX_DELAY) != pdTRUE)
-    {
-        return SL_STATUS_FAIL;
-    }
-
-    // Nonce for decryption should have TX and HP counters 0, only use RX counter
-    nonce.rx_packet_count = sl_wfx_context->secure_link_nonce.rx_packet_count;
-
-    // Init context
-    mbedtls_ccm_init(&ccm_context);
-
-    // Set the crypto key
-    crypto_status = mbedtls_ccm_setkey(&ccm_context, MBEDTLS_CIPHER_ID_AES, session_key, SL_WFX_SECURE_LINK_SESSION_KEY_BIT_COUNT);
-    SL_WFX_ERROR_CHECK(crypto_status);
-
-    // Decrypt the data
-    if (!mbedtls_ccm_auth_decrypt(&ccm_context, length, (uint8_t *) &nonce, SL_WFX_SECURE_LINK_NONCE_SIZE_BYTES, NULL,
-                                  ADDRESS_LENGTH, (uint8_t *) buffer, (uint8_t *) buffer, (uint8_t *) buffer + length,
-                                  SL_WFX_SECURE_LINK_CCM_TAG_SIZE))
-    {
-        status = SL_STATUS_OK;
-    }
-
-error_handler:
-    mbedtls_ccm_free(&ccm_context);
-    if (xSemaphoreGive(wfx_securelink_rx_mutex) != pdTRUE)
-    {
-        printf("ERROR: sl_wfx_securelink_rx_mutex. unable to post.\n");
-    }
-    return status;
-}
-
-/*********************************************************************
- * @fn  sl_status_t sl_wfx_host_encode_secure_link_data(sl_wfx_generic_message_t *buffer,
-                                                uint32_t data_length,
-                                                uint8_t *session_key,
-                                                uint8_t *nonce)
- * @brief
- * Encode transmit data
- * Length excludes size of CCM tag and secure link header
- * @param[in]  buffer:
- * @param[in]  data_length:
- * @param[in]  session_key:
- * @param[in]  nonce:
- * @return  returns SL_STATUS_OK if successful,
- *         SL_STATUS_FAIL otherwise
-*************************************************************************/
-sl_status_t sl_wfx_host_encode_secure_link_data(sl_wfx_generic_message_t * buffer, uint32_t data_length, uint8_t * session_key,
-                                                uint8_t * nonce)
-{
-    mbedtls_ccm_context ccm_context;
-    sl_status_t status = SL_STATUS_FAIL;
-
-    mbedtls_ccm_init(&ccm_context);
-    if (mbedtls_ccm_setkey(&ccm_context, MBEDTLS_CIPHER_ID_AES, session_key, SL_WFX_SECURE_LINK_SESSION_KEY_BIT_COUNT) ==
-        CCM_STATUS_SUCCESS)
-    {
-        mbedtls_ccm_encrypt_and_tag(&ccm_context, data_length, nonce, SL_WFX_SECURE_LINK_NONCE_SIZE_BYTES, NULL, ADDRESS_LENGTH,
-                                    (uint8_t *) &buffer->header.id, (uint8_t *) &buffer->header.id,
-                                    (uint8_t *) &buffer->header.id + data_length, SL_WFX_SECURE_LINK_CCM_TAG_SIZE);
-        status = SL_STATUS_OK;
-    }
-
-    mbedtls_ccm_free(&ccm_context);
-
-    return status;
-}
-
-/****************************************************************************
- * @fn  sl_status_t sl_wfx_host_schedule_secure_link_renegotiation(void)
- * @brief
- * Called when the driver needs to schedule secure link renegotiation
- * @param[in] None
- * @returns Returns SL_STATUS_OK if successful,
- *          SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_schedule_secure_link_renegotiation(void)
-{
-    // call sl_wfx_secure_link_renegotiate_session_key() as soon as it makes sense for the host to do so
-    xTaskNotifyGive(wfx_securelink_task);
-    return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn  static inline void reverse_bytes(uint8_t *src, uint8_t length)
- * @brief
- *         reverse the bytes
- * @param[in] src: source
- * @param[in] length:
- * @returns None
- *****************************************************************************/
-static inline void reverse_bytes(uint8_t * src, uint8_t length)
-{
-    uint8_t * lo = src;
-    uint8_t * hi = src + length - 1;
-    uint8_t swap;
-
-    while (lo < hi)
-    {
-        swap  = *lo;
-        *lo++ = *hi;
-        *hi-- = swap;
-    }
-}
-
-/********************************************************************************************************
- ********************************************************************************************************
- *                                       DEPENDENCIES & AVAIL CHECK(S)
- ********************************************************************************************************
- *******************************************************************************************************/
-
-#endif // SL_WFX_USE_SECURE_LINK
diff --git a/examples/platform/silabs/SiWx917/wf200/sl_wfx_host.h b/examples/platform/silabs/SiWx917/wf200/sl_wfx_host.h
deleted file mode 100644
index dc9bcd2..0000000
--- a/examples/platform/silabs/SiWx917/wf200/sl_wfx_host.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *
- *    Copyright (c) 2022 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.
- */
-
-#pragma once
-
-#include "FreeRTOS.h"
-#include "queue.h"
-#include "semphr.h"
-#include "sl_wfx.h"
-#include "task.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-uint8_t sl_wfx_host_get_waited_event(void);
-sl_status_t wfx_soft_init(void);
-
-#ifdef SLEEP_ENABLED
-sl_status_t sl_wfx_host_switch_to_wirq(void);
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-#define SL_WFX_MAX_STATIONS 8
-#define SL_WFX_MAX_SCAN_RESULTS 50
-
-typedef struct __attribute__((__packed__)) scan_result_list_s
-{
-    sl_wfx_ssid_def_t ssid_def;
-    uint8_t mac[SL_WFX_MAC_ADDR_SIZE];
-    uint16_t channel;
-    sl_wfx_security_mode_bitmask_t security_mode;
-    uint16_t rcpi;
-} scan_result_list_t;
-
-void sl_wfx_host_start_platform_interrupt(void);
-extern SemaphoreHandle_t wfx_wakeup_sem;
diff --git a/examples/platform/silabs/SiWx917/wf200/sl_wfx_securelink_task.c b/examples/platform/silabs/SiWx917/wf200/sl_wfx_securelink_task.c
deleted file mode 100644
index 28ffdda..0000000
--- a/examples/platform/silabs/SiWx917/wf200/sl_wfx_securelink_task.c
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *
- *    Copyright (c) 2022 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.
- */
-
-#ifdef SL_WFX_USE_SECURE_LINK
-#include "secure_link/sl_wfx_secure_link.h"
-
-#include "FreeRTOS.h"
-#include "queue.h"
-#include "semphr.h"
-#include "task.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-// Securelink Task Configurations
-#define WFX_SECURELINK_TASK_PRIO 1u
-#define WFX_SECURELINK_TASK_STK_SIZE 512u
-
-TaskHandle_t secureLinkTaskHandle;
-SemaphoreHandle_t s_xSLSemaphore;
-StackType_t secureLinkStack[WFX_SECURELINK_TASK_STK_SIZE];
-StaticTask_t secureLinkTaskStruct;
-
-StaticSemaphore_t xSlMutexBuffer;
-
-/*********************************************************************
- * @fn  static void prvSecureLinkTask(void *p_arg)
- * @brief
- * The task that implements the Secure Link renegotiation with WFX.
- * @param[in] p_arg:
- * @return None
- *************************************************************************/
-static void prvSecureLinkTask(void * p_arg)
-{
-    sl_status_t result;
-    (void) p_arg;
-
-    /* Create a mutex used for making Secure Link renegotiations atomic */
-    s_xSLSemaphore = xSemaphoreCreateMutexStatic(&xSlMutexBuffer);
-
-    for (;;)
-    {
-        /* Wait for a key renegotiation request */
-        ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
-
-        result = sl_wfx_secure_link_renegotiate_session_key();
-        if (result != SL_STATUS_OK)
-        {
-            printf("session key negotiation error %lu\n", result);
-        }
-    }
-}
-
-/****************************************************************************
- * @fn  void wfx_securelink_task_start(void)
- * @brief
- * Creates WFX securelink key renegotiation task.
- * @param[in] None
- * @return None
- ******************************************************************************/
-void wfx_securelink_task_start(void)
-{
-    secureLinkTaskHandle = xTaskCreateStatic(prvSecureLinkTask, "secureLinkTask", WFX_SECURELINK_TASK_STK_SIZE, NULL,
-                                             WFX_SECURELINK_TASK_PRIO, secureLinkStack, &secureLinkTaskStruct);
-    if (secureLinkTaskHandle == NULL)
-    {
-        printf("Failed to create WFX secureLinkTask");
-    }
-}
-
-#endif
diff --git a/examples/platform/silabs/SiWx917/wf200/sl_wfx_task.c b/examples/platform/silabs/SiWx917/wf200/sl_wfx_task.c
deleted file mode 100644
index 8a00e45..0000000
--- a/examples/platform/silabs/SiWx917/wf200/sl_wfx_task.c
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- *
- *    Copyright (c) 2022 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.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "em_gpio.h"
-
-#include "sl_wfx.h"
-#include "sl_wfx_board.h"
-#include "sl_wfx_host.h"
-#include "sl_wfx_task.h"
-
-#include "FreeRTOS.h"
-#include "event_groups.h"
-#include "task.h"
-
-#include "AppConfig.h"
-
-#define CHECK_VAL 0
-#define WFX_BUS_TASK_PRIORITY 2
-#define BUS_TASK_STACK_SIZE 1024
-static StackType_t busStack[BUS_TASK_STACK_SIZE];
-StaticTask_t busTaskStruct;
-TaskHandle_t wfx_bus_task_handle;
-
-wfx_frame_q_item wfx_bus_tx_frame;
-SemaphoreHandle_t wfxtask_tx_complete;
-SemaphoreHandle_t wfxtask_mutex;
-
-// Flag to indicate receive frames is currently running.
-static bool wfx_bus_rx_in_process = false;
-
-/***************************************************************************
- * @fn  bool wfx_bus_is_receive_processing(void)
- * @brief
- * Check receive frame status
- * @param[in]  None
- * @return returns wfx_bus_rx_in_process
- ******************************************************************************/
-bool wfx_bus_is_receive_processing(void)
-{
-    return wfx_bus_rx_in_process;
-}
-
-/*****************************************************************************
- * @fn  static sl_status_t receive_frames()
- * @brief
- * Receives frames from the WFX.
- * @param[in] None
- * @return returns result
- ******************************************************************************/
-static sl_status_t receive_frames()
-{
-    sl_status_t result;
-    uint16_t control_register = 0;
-    wfx_bus_rx_in_process     = true;
-    do
-    {
-        result = sl_wfx_receive_frame(&control_register);
-        SL_WFX_ERROR_CHECK(result);
-    } while ((control_register & SL_WFX_CONT_NEXT_LEN_MASK) != CHECK_VAL);
-
-error_handler:
-    wfx_bus_rx_in_process = false;
-    return result;
-}
-
-/********************************************************************************
- * @fn  static void wfx_bus_task(void *p_arg)
- * @brief
- * WFX bus communication task.
- * receives frames from the Bus interface
- * @param[in] p_arg:
- * @return None
- */
-static void wfx_bus_task(void * p_arg)
-{
-    SILABS_LOG("SPI: Bus Task started");
-    sl_wfx_host_start_platform_interrupt();
-    for (;;)
-    {
-        /*Wait for an interrupt from WFX*/
-        ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
-
-        /*Disable the interrupt while treating frames received to avoid
-         *the case where the interrupt is set but there is no frame left to treat.*/
-        sl_wfx_host_disable_platform_interrupt();
-
-        /*Receive the frame(s) pending in WFX*/
-        receive_frames();
-
-        /*Re-enable the interrupt*/
-        sl_wfx_host_enable_platform_interrupt();
-    }
-}
-
-/***************************************************************************
- * @fn  void wfx_bus_start()
- * @brief
- * Creates WFX bus communication task.
- * @param[in] None
- * @return None
- ******************************************************************************/
-void wfx_bus_start()
-{
-    wfx_bus_task_handle =
-        xTaskCreateStatic(wfx_bus_task, "wfxbus", BUS_TASK_STACK_SIZE, NULL, WFX_BUS_TASK_PRIORITY, busStack, &busTaskStruct);
-    if (wfx_bus_task_handle == NULL)
-    {
-        SILABS_LOG("*ERR*WFX BusTask");
-    }
-}
diff --git a/examples/platform/silabs/SiWx917/wf200/sl_wfx_task.h b/examples/platform/silabs/SiWx917/wf200/sl_wfx_task.h
deleted file mode 100644
index 6838b9b..0000000
--- a/examples/platform/silabs/SiWx917/wf200/sl_wfx_task.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *
- *    Copyright (c) 2022 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.
- */
-
-#pragma once
-
-#include <stdbool.h>
-
-#include "FreeRTOS.h"
-#include "sl_wfx_constants.h"
-#include "task.h"
-
-typedef struct
-{
-    sl_wfx_send_frame_req_t * frame;
-    uint32_t data_length;
-    sl_wfx_interface_t interface;
-    uint8_t priority;
-} wfx_frame_q_item;
-
-extern wfx_frame_q_item wfxtask_tx_frame;
-extern TaskHandle_t wfx_bus_task_handle;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/****************************************************************************
- * @fn void wfx_bus_start(void)
- * @brief
- * Start wfx bus communication task.
- *****************************************************************************/
-void wfx_bus_start(void);
-
-/****************************************************************************
- * @fn  bool wfx_bus_is_receive_processing(void)
- * @brief
- * Returns status of wfx receive frames.
- *****************************************************************************/
-bool wfx_bus_is_receive_processing(void);
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/examples/platform/silabs/SiWx917/wf200/wf200.gni b/examples/platform/silabs/SiWx917/wf200/wf200.gni
deleted file mode 100644
index 358384a..0000000
--- a/examples/platform/silabs/SiWx917/wf200/wf200.gni
+++ /dev/null
@@ -1,30 +0,0 @@
-import("//build_overrides/chip.gni")
-import("//build_overrides/efr32_sdk.gni")
-import("//build_overrides/pigweed.gni")
-
-examples_plat_dir = "${chip_root}/examples/platform/silabs/efr32"
-wifi_sdk_dir = "${chip_root}/src/platform/silabs/EFR32/wifi"
-
-wf200_defs = [
-  "SL_HEAP_SIZE=24576",
-  "WF200_WIFI=1",
-  "SL_WIFI=1",
-  "SL_WFX_USE_SPI",
-  "SL_WFX_DEBUG_MASK=0x0003",
-]
-softap_defs = "SL_WFX_CONFIG_SOFTAP"
-wifi_scan_defs = "SL_WFX_CONFIG_SCAN"
-wf200_plat_incs = [
-  "${wifi_sdk_dir}/",
-  "${examples_plat_dir}/wf200",
-]
-wf200_plat_src = [
-  "${wifi_sdk_dir}/dhcp_client.cpp",
-  "${wifi_sdk_dir}/ethernetif.cpp",
-  "${wifi_sdk_dir}/lwip_netif.cpp",
-  "${wifi_sdk_dir}/wfx_notify.cpp",
-  "${examples_plat_dir}/wf200/sl_wfx_task.c",
-  "${examples_plat_dir}/wf200/wf200_init.c",
-  "${examples_plat_dir}/wf200/efr_spi.c",
-  "${examples_plat_dir}/wf200/host_if.cpp",
-]
diff --git a/examples/platform/silabs/SiWx917/wf200/wf200_init.c b/examples/platform/silabs/SiWx917/wf200/wf200_init.c
deleted file mode 100644
index 12973d3..0000000
--- a/examples/platform/silabs/SiWx917/wf200/wf200_init.c
+++ /dev/null
@@ -1,543 +0,0 @@
-/*
- *
- *    Copyright (c) 2022 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.
- */
-
-/* Includes */
-
-#include "em_gpio.h"
-
-#include "sl_wfx.h"
-#include "sl_wfx_board.h"
-
-// File specific to each platform, it must be created for custom boards
-#include "sl_wfx_pds.h"
-
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-/* Firmware include */
-#include "sl_wfx_wf200_C0.h"
-
-#include "FreeRTOS.h"
-#include "event_groups.h"
-#include "task.h"
-
-#include "AppConfig.h"
-#include "sl_wfx_host.h"
-#include "sl_wfx_task.h"
-#include "wfx_host_events.h"
-
-#include "sl_spidrv_instances.h"
-#include "spidrv.h"
-
-#define SL_WFX_EVENT_MAX_SIZE 512
-#define SL_WFX_EVENT_LIST_SIZE 1
-
-StaticSemaphore_t xWfxWakeupSemaBuffer;
-uint8_t sWfxEventQueueBuffer[SL_WFX_EVENT_LIST_SIZE * sizeof(uint8_t)];
-StaticQueue_t sWfxEventQueueStruct;
-QueueHandle_t wfx_event_Q        = NULL;
-SemaphoreHandle_t wfx_wakeup_sem = NULL;
-SemaphoreHandle_t wfx_mutex      = NULL;
-
-StaticSemaphore_t xWfxMutexBuffer;
-
-struct
-{
-    uint32_t wf200_firmware_download_progress;
-    int wf200_initialized;
-    uint8_t waited_event_id;
-    uint8_t posted_event_id;
-} host_context;
-
-#ifdef SL_WFX_USE_SDIO
-#ifdef SLEEP_ENABLED
-sl_status_t sl_wfx_host_enable_sdio(void);
-sl_status_t sl_wfx_host_disable_sdio(void);
-#endif
-#endif
-
-#ifdef SL_WFX_USE_SPI
-#ifdef SLEEP_ENABLED
-sl_status_t sl_wfx_host_enable_spi(void);
-sl_status_t sl_wfx_host_disable_spi(void);
-#endif
-#endif
-
-/****************************************************************************
- * @fn  sl_status_t wfx_soft_init(void)
- * @brief
- * WFX FMAC driver host interface initialization
- * @param[in] None
- * @returns Returns SL_STATUS_OK if successful,
- *          SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t wfx_soft_init(void)
-{
-    SILABS_LOG("WF200:Soft Init");
-    if ((wfx_event_Q = xQueueCreateStatic(SL_WFX_EVENT_LIST_SIZE, sizeof(uint8_t), sWfxEventQueueBuffer, &sWfxEventQueueStruct)) ==
-        NULL)
-    {
-        return SL_STATUS_FAIL;
-    }
-
-    if ((wfx_wakeup_sem = xSemaphoreCreateBinaryStatic(&xWfxWakeupSemaBuffer)) == NULL)
-    {
-        return SL_STATUS_FAIL;
-    }
-
-    if ((wfx_mutex = xSemaphoreCreateMutexStatic(&xWfxMutexBuffer)) == NULL)
-    {
-        return SL_STATUS_FAIL;
-    }
-
-    return SL_STATUS_OK;
-}
-/****************************************************************************
- * @fn  sl_status_t sl_wfx_host_init(void)
- * @brief
- * Notify driver init function
- * @param[in] None
- * @returns Returns SL_STATUS_OK if successful,
- *          SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_init(void)
-{
-    SILABS_LOG("WFX: Host Init");
-    host_context.wf200_firmware_download_progress = 0;
-    host_context.wf200_initialized                = 0;
-    return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn   sl_status_t sl_wfx_host_get_firmware_data(const uint8_t **data, uint32_t data_size)
- * @brief
- * Get firmware data
- * @param[in] data:
- * @param[in] data_size:
- * @returns Returns SL_STATUS_OK if successful,
- *          SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_get_firmware_data(const uint8_t ** data, uint32_t data_size)
-{
-    *data = &sl_wfx_firmware[host_context.wf200_firmware_download_progress];
-    host_context.wf200_firmware_download_progress += data_size;
-    return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn   sl_status_t sl_wfx_host_get_firmware_size(uint32_t *firmware_size)
- * @brief
- * Get firmware size
- * @param[in] firmware_size:
- * @returns Returns SL_STATUS_OK if successful,
- *         SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_get_firmware_size(uint32_t * firmware_size)
-{
-    *firmware_size = sizeof(sl_wfx_firmware);
-    return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn   sl_status_t sl_wfx_host_get_pds_data(const char **pds_data, uint16_t index)
- * @brief
- * Get PDS data
- * @param[in] pds_data:
- * @param[in] index:
- * @returns Returns SL_STATUS_OK if successful,
- *SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_get_pds_data(const char ** pds_data, uint16_t index)
-{
-    *pds_data = sl_wfx_pds[index];
-    return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn  sl_status_t sl_wfx_host_get_pds_size(uint16_t *pds_size)
- * @brief
- * Get PDS size
- * @param[in] pds_size:
- * @returns Returns SL_STATUS_OK if successful,
- *SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_get_pds_size(uint16_t * pds_size)
-{
-    *pds_size = SL_WFX_ARRAY_COUNT(sl_wfx_pds);
-    return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn  sl_status_t sl_wfx_host_deinit(void)
- * @brief
- * Deinit host interface
- * @param[in] None
- * @returns Returns SL_STATUS_OK if successful,
- *SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_deinit(void)
-{
-    return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn  sl_status_t sl_wfx_host_allocate_buffer(void **buffer, sl_wfx_buffer_type_t type, uint32_t buffer_size)
- * @brief
- * Allocate buffer (Should allocate either Ethernet - from LWIP or Control) - TODO
- * @param[in] buffer:
- * @param[in] type:
- * @param[in] buffer_size:
- * @returns Returns SL_STATUS_OK if successful,
- *SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_allocate_buffer(void ** buffer, sl_wfx_buffer_type_t type, uint32_t buffer_size)
-{
-    if ((*buffer = pvPortMalloc(buffer_size)) == (void *) 0)
-    {
-        return SL_STATUS_FAIL;
-    }
-    return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn  sl_status_t sl_wfx_host_free_buffer(void *buffer, sl_wfx_buffer_type_t type)
- * @brief
- * Free host buffer (CHECK LWIP buffer)
- * @param[in] buffer:
- * @param[in] type:
- * @returns Returns SL_STATUS_OK if successful,
- *SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_free_buffer(void * buffer, sl_wfx_buffer_type_t type)
-{
-    vPortFree(buffer);
-    return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn  sl_status_t sl_wfx_host_hold_in_reset(void)
- * @brief
- * Set reset pin low
- * @param[in] None
- * @returns Returns SL_STATUS_OK if successful,
- *SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_hold_in_reset(void)
-{
-    GPIO_PinOutClear(SL_WFX_HOST_PINOUT_RESET_PORT, SL_WFX_HOST_PINOUT_RESET_PIN);
-    host_context.wf200_initialized = 0;
-    return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn  sl_status_t sl_wfx_host_set_wake_up_pin(uint8_t state)
- * @brief
- * Set wakeup pin status
- * @param[in] state:
- * @returns Returns SL_STATUS_OK if successful,
- *SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_set_wake_up_pin(uint8_t state)
-{
-    CORE_DECLARE_IRQ_STATE;
-
-    CORE_ENTER_ATOMIC();
-    if (state > PINOUT_CLEAR_STATUS)
-    {
-#ifdef SLEEP_ENABLED
-#ifdef SL_WFX_USE_SDIO
-        sl_wfx_host_enable_sdio();
-#endif
-#ifdef SL_WFX_USE_SPI
-        sl_wfx_host_enable_spi();
-#endif
-#endif
-        GPIO_PinOutSet(SL_WFX_HOST_PINOUT_WUP_PORT, SL_WFX_HOST_PINOUT_WUP_PIN);
-    }
-    else
-    {
-        GPIO_PinOutClear(SL_WFX_HOST_PINOUT_WUP_PORT, SL_WFX_HOST_PINOUT_WUP_PIN);
-#ifdef SLEEP_ENABLED
-#ifdef SL_WFX_USE_SDIO
-        sl_wfx_host_disable_sdio();
-#endif
-#ifdef SL_WFX_USE_SPI
-        sl_wfx_host_disable_spi();
-#endif
-#endif
-    }
-    CORE_EXIT_ATOMIC();
-    return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn  sl_status_t sl_wfx_host_reset_chip(void)
- * @brief
- * reset the host chip
- * @returns Returns SL_STATUS_OK if successful,
- *SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_reset_chip(void)
-{
-    // Pull it low for at least 1 ms to issue a reset sequence
-    GPIO_PinOutClear(SL_WFX_HOST_PINOUT_RESET_PORT, SL_WFX_HOST_PINOUT_RESET_PIN);
-
-    // Delay for 10ms
-    vTaskDelay(pdMS_TO_TICKS(10));
-
-    // Hold pin high to get chip out of reset
-    GPIO_PinOutSet(SL_WFX_HOST_PINOUT_RESET_PORT, SL_WFX_HOST_PINOUT_RESET_PIN);
-
-    // Delay for 3ms
-    vTaskDelay(pdMS_TO_TICKS(3));
-
-    host_context.wf200_initialized = 0;
-    return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn  sl_status_t sl_wfx_host_wait_for_wake_up(void)
- * @brief
- * wait for the host wake up
- * @returns Returns SL_STATUS_OK if successful,
- *SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_wait_for_wake_up(void)
-{
-    xSemaphoreTake(wfx_wakeup_sem, TICKS_TO_WAIT_0);
-    xSemaphoreTake(wfx_wakeup_sem, TICKS_TO_WAIT_3 / portTICK_PERIOD_MS);
-
-    return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn  sl_status_t sl_wfx_host_wait(uint32_t wait_time)
- * @brief
- * wait for the host
- * @param[in]  wait_time:
- * @returns Returns SL_STATUS_OK if successful,
- *SL_STATUS_FAIL otherwise
- *****************************************************************************/
-
-sl_status_t sl_wfx_host_wait(uint32_t wait_time)
-{
-    uint32_t ticks = pdMS_TO_TICKS(wait_time);
-    vTaskDelay(ticks ? ticks : 10);
-    return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn   sl_status_t sl_wfx_host_setup_waited_event(uint8_t event_id)
- * @brief
- * Called when the driver needs to setup the waited event
- * @param[in] event_id:
- * @returns Returns SL_STATUS_OK if successful,
- *SL_STATUS_FAIL otherwise
- *****************************************************************************/
-
-sl_status_t sl_wfx_host_setup_waited_event(uint8_t event_id)
-{
-    host_context.waited_event_id = event_id;
-    host_context.posted_event_id = 0;
-
-    return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn  uint8_t sl_wfx_host_get_waited_event(void)
- * @brief
- * Called when the driver get waited event
- * @returns returns host_context.waited_event_id
- *****************************************************************************/
-
-uint8_t sl_wfx_host_get_waited_event(void)
-{
-    return host_context.waited_event_id;
-}
-
-/******************************************************************************
- * @fn  sl_status_t sl_wfx_host_wait_for_confirmation(uint8_t confirmation_id, uint32_t timeout, void **event_payload_out)
- * @brief
- * wait for the host confirmation
- * @param[in] confirmation_id:
- * @param[in] timeout:
- * @param[in] event_payload_out:
- * @returns Returns SL_STATUS_OK if successful,
- * Timeout, SL_STATUS_TIMEOUT otherwise
- *****************************************************************************/
-
-sl_status_t sl_wfx_host_wait_for_confirmation(uint8_t confirmation_id, uint32_t timeout, void ** event_payload_out)
-{
-    uint8_t posted_event_id;
-    for (uint32_t i = 0; i < timeout; i++)
-    {
-        /* Wait for an event posted by the function sl_wfx_host_post_event() */
-        if (xQueueReceive(wfx_event_Q, &posted_event_id, TICKS_TO_WAIT_1) == pdTRUE)
-        {
-            /* Once a message is received, check if it is the expected ID */
-            if (confirmation_id == posted_event_id)
-            {
-                /* Pass the confirmation reply and return*/
-                if (event_payload_out != NULL)
-                {
-                    *event_payload_out = sl_wfx_context->event_payload_buffer;
-                }
-                return SL_STATUS_OK;
-            }
-        }
-    }
-    /* The wait for the confirmation timed out, return */
-    return SL_STATUS_TIMEOUT;
-}
-
-/****************************************************************************
- * @fn  sl_status_t sl_wfx_host_lock(void)
- * @brief
- * Called when the driver needs to lock its access
- * @returns Returns SL_STATUS_OK if successful,
- *SL_STATUS_TIMEOUT otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_lock(void)
-{
-
-    sl_status_t status = SL_STATUS_OK;
-
-    if (xSemaphoreTake(wfx_mutex, TICKS_TO_WAIT_500) != pdTRUE)
-    {
-        SILABS_LOG("*ERR*Wi-Fi driver mutex timo");
-        status = SL_STATUS_TIMEOUT;
-    }
-
-    return status;
-}
-
-/****************************************************************************
- * @fn  sl_status_t sl_wfx_host_unlock(void)
- * @brief
- * Called when the driver needs to unlock its access
- * @returns Returns SL_STATUS_OK
- *****************************************************************************/
-sl_status_t sl_wfx_host_unlock(void)
-{
-    xSemaphoreGive(wfx_mutex);
-
-    return SL_STATUS_OK;
-}
-
-/******************************************************************************
- * @fn  sl_status_t sl_wfx_host_post_event(sl_wfx_generic_message_t *event_payload)
- * @brief
- * Called when the driver needs to post an event
- * @param[in]  event_payload:
- * @returns Returns status
- *****************************************************************************/
-sl_status_t sl_wfx_host_post_event(sl_wfx_generic_message_t * event_payload)
-{
-    sl_status_t status;
-
-    /* Forward the message to the application */
-    status = sl_wfx_host_process_event(event_payload);
-
-    if (host_context.waited_event_id == event_payload->header.id)
-    {
-        if (event_payload->header.length < SL_WFX_EVENT_MAX_SIZE)
-        {
-            /* Post the event in the queue */
-            memcpy(sl_wfx_context->event_payload_buffer, (void *) event_payload, event_payload->header.length);
-            host_context.posted_event_id = event_payload->header.id;
-            xQueueOverwrite(wfx_event_Q, (void *) &event_payload->header.id);
-        }
-    }
-
-    return status;
-}
-
-/****************************************************************************
- * @fn  sl_status_t sl_wfx_host_transmit_frame(void *frame, uint32_t frame_len)
- * @brief
- * Called when the driver needs to transmit a frame
- * @param[in] frame:
- * @param[in] frame_len:
- * @returns returns sl_wfx_data_write(frame, frame_len)
- *****************************************************************************/
-sl_status_t sl_wfx_host_transmit_frame(void * frame, uint32_t frame_len)
-{
-    return sl_wfx_data_write(frame, frame_len);
-}
-
-/****************************************************************************
- * @fn  sl_status_t sl_wfx_host_sleep_grant(sl_wfx_host_bus_transfer_type_t type,
-                                    sl_wfx_register_address_t address,
-                                    uint32_t length)
- * @brief
- * Called when the driver is considering putting the
- * WFx in sleep mode
- * @param[in] type:
- * @param[in] address:
- * @param[in] length:
- * @returns SL_WIFI_SLEEP_GRANTED to let the WFx go to
- *sleep, SL_WIFI_SLEEP_NOT_GRANTED otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_sleep_grant(sl_wfx_host_bus_transfer_type_t type, sl_wfx_register_address_t address, uint32_t length)
-{
-    (void) (type);
-    (void) (address);
-    (void) (length);
-
-    return SL_STATUS_WIFI_SLEEP_GRANTED;
-}
-
-#if SL_WFX_DEBUG_MASK
-/****************************************************************************
- * @fn  void sl_wfx_host_log(const char *str, ...)
- * @brief
- * Host debug output
- * @param[in] str: string
- * @return None
- *****************************************************************************/
-void sl_wfx_host_log(const char * str, ...)
-{
-    va_list args;
-    va_start(args, str);
-    vprintf(str, args);
-    va_end(args);
-}
-#endif
-#ifndef PW_RPC_ENABLED
-/* Place holder - This is just to handle UART interrupts
- * The "otThread tasks handles it. WiFi does not need it yet
- * I don't care for it. I should really have the thread
- * shut it off
- */
-#if !CHIP_ENABLE_OPENTHREAD
-/****************************************************************************
- * @fn  void otSysEventSignalPending(void)
- * @brief
- * system event signal pending
- * @param[in] None
- * @return None
- *****************************************************************************/
-void otSysEventSignalPending(void)
-{
-    // BaseType_t yieldRequired = ThreadStackMgrImpl().SignalThreadActivityPendingFromISR();
-    SILABS_LOG("*ERR*UART intr - NOT Handled");
-    portYIELD_FROM_ISR(pdFALSE);
-}
-#endif /* !CHIP_ENABLE_OPENTHREAD */
-#endif /* PW_RPC_ENABLED */
diff --git a/src/platform/BUILD.gn b/src/platform/BUILD.gn
index c02b331..92687ba 100644
--- a/src/platform/BUILD.gn
+++ b/src/platform/BUILD.gn
@@ -164,6 +164,11 @@
         "CHIP_DEVICE_LAYER_TARGET_EFR32=1",
         "CHIP_DEVICE_LAYER_TARGET=silabs",
       ]
+    } else if (chip_device_platform == "SiWx917") {
+      defines += [
+        "CHIP_DEVICE_LAYER_TARGET_EFR32=1",
+        "CHIP_DEVICE_LAYER_TARGET=silabs",
+      ]
     } else if (chip_device_platform == "esp32") {
       defines += [
         "CHIP_DEVICE_LAYER_TARGET_ESP32=1",
@@ -410,6 +415,8 @@
       _platform_target = "Darwin"
     } else if (chip_device_platform == "efr32") {
       _platform_target = "silabs/EFR32"
+    } else if (chip_device_platform == "SiWx917") {
+      _platform_target = "silabs/SiWx917"
     } else if (chip_device_platform == "esp32") {
       _platform_target = "ESP32"
     } else if (chip_device_platform == "k32w0") {
diff --git a/src/platform/device.gni b/src/platform/device.gni
index 601d21e..c0ad4bb 100755
--- a/src/platform/device.gni
+++ b/src/platform/device.gni
@@ -113,6 +113,8 @@
   _chip_device_layer = "Darwin"
 } else if (chip_device_platform == "efr32") {
   _chip_device_layer = "silabs"
+} else if (chip_device_platform == "SiWx917") {
+  _chip_device_layer = "silabs"
 } else if (chip_device_platform == "esp32") {
   _chip_device_layer = "ESP32"
 } else if (chip_device_platform == "linux") {
@@ -212,5 +214,5 @@
         chip_device_platform == "webos" || chip_device_platform == "bl602" ||
         chip_device_platform == "mw320" || chip_device_platform == "zephyr" ||
         chip_device_platform == "beken" || chip_device_platform == "bl702" ||
-        chip_device_platform == "mt793x",
+        chip_device_platform == "mt793x" || chip_device_platform == "SiWx917",
     "Please select a valid value for chip_device_platform")
diff --git a/src/platform/silabs/BLEManagerImpl.h b/src/platform/silabs/BLEManagerImpl.h
index 0f1d478..e0a04e5 100644
--- a/src/platform/silabs/BLEManagerImpl.h
+++ b/src/platform/silabs/BLEManagerImpl.h
@@ -26,10 +26,22 @@
 #if CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE
 
 #include "FreeRTOS.h"
+#include "timers.h"
+#ifdef RS91X_BLE_ENABLE
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <rsi_ble.h>
+#include <rsi_ble_apis.h>
+#include <rsi_bt_common.h>
+#ifdef __cplusplus
+}
+#endif
+#else
 #include "gatt_db.h"
 #include "sl_bgapi.h"
 #include "sl_bt_api.h"
-#include "timers.h"
+#endif // RS91X_BLE_ENABLE
 
 namespace chip {
 namespace DeviceLayer {
@@ -45,6 +57,16 @@
 
 public:
     void HandleBootEvent(void);
+
+#ifdef RS91X_BLE_ENABLE
+    void HandleConnectEvent(void);
+    void HandleConnectionCloseEvent(uint16_t reason);
+    void HandleWriteEvent(rsi_ble_event_write_t evt);
+    void UpdateMtu(rsi_ble_event_mtu_t evt);
+    void HandleTxConfirmationEvent(BLE_CONNECTION_OBJECT conId);
+    void HandleTXCharCCCDWrite(rsi_ble_event_write_t * evt);
+    void HandleSoftTimerEvent(void);
+#else
     void HandleConnectEvent(volatile sl_bt_msg_t * evt);
     void HandleConnectionCloseEvent(volatile sl_bt_msg_t * evt);
     void HandleWriteEvent(volatile sl_bt_msg_t * evt);
@@ -53,9 +75,17 @@
     void HandleTXCharCCCDWrite(volatile sl_bt_msg_t * evt);
     void HandleSoftTimerEvent(volatile sl_bt_msg_t * evt);
 
+#endif // RS91X_BLE_ENABLE
+
+#if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING
+#ifdef RS91X_BLE_ENABLE
+    static void HandleC3ReadRequest(void);
+#else
 #if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING
     static void HandleC3ReadRequest(volatile sl_bt_msg_t * evt);
 #endif
+#endif
+#endif
 
 private:
     // Allow the BLEManager interface class to delegate method calls to
@@ -125,7 +155,9 @@
 
     struct CHIPoBLEConState
     {
+#ifndef RS91X_BLE_ENABLE
         bd_addr address;
+#endif
         uint16_t mtu : 10;
         uint16_t allocated : 1;
         uint16_t subscribed : 1;
@@ -153,7 +185,12 @@
 #if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING
     CHIP_ERROR EncodeAdditionalDataTlv();
 #endif
+
+#ifdef RS91X_BLE_ENABLE
+    void HandleRXCharWrite(rsi_ble_event_write_t * evt);
+#else
     void HandleRXCharWrite(volatile sl_bt_msg_t * evt);
+#endif
     bool RemoveConnection(uint8_t connectionHandle);
     void AddConnection(uint8_t connectionHandle, uint8_t bondingHandle);
     void StartBleAdvTimeoutTimer(uint32_t aTimeoutInMs);
diff --git a/src/platform/silabs/CHIPMem-Platform.cpp b/src/platform/silabs/CHIPMem-Platform.cpp
index 4f8b938..a826ebe 100644
--- a/src/platform/silabs/CHIPMem-Platform.cpp
+++ b/src/platform/silabs/CHIPMem-Platform.cpp
@@ -150,7 +150,12 @@
 } // 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
 
 #endif // CHIP_CONFIG_MEMORY_MGMT_PLATFORM
diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp
index 7bb0741..effee8c 100644
--- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp
+++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp
@@ -262,6 +262,7 @@
         // If the WiFi station interface is no longer enabled, or no longer provisioned,
         // disconnect the station from the AP, unless the WiFi station mode is currently
         // under application control.
+#ifndef CHIP_ONNETWORK_PAIRING
         if (mWiFiStationMode != kWiFiStationMode_ApplicationControlled &&
             (mWiFiStationMode != kWiFiStationMode_Enabled || !IsWiFiStationProvisioned()))
         {
@@ -275,6 +276,7 @@
 
             ChangeWiFiStationState(kWiFiStationState_Disconnecting);
         }
+#endif
     }
     // Otherwise the station interface is NOT connected to an AP, so...
     else
diff --git a/src/platform/silabs/SiWx917/BLEManagerImpl.cpp b/src/platform/silabs/SiWx917/BLEManagerImpl.cpp
index a76f26c..6563f4b 100644
--- a/src/platform/silabs/SiWx917/BLEManagerImpl.cpp
+++ b/src/platform/silabs/SiWx917/BLEManagerImpl.cpp
@@ -26,33 +26,113 @@
 #include <platform/internal/CHIPDeviceLayerInternal.h>
 #if CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE
 
-#include "sl_component_catalog.h"
-
 #include <platform/internal/BLEManager.h>
+#define RSI_BLE_ENABLE 1
 
-#include "FreeRTOS.h"
-#include "rail.h"
+//#include "rail.h"
 extern "C" {
-#include "sl_bluetooth.h"
-}
-#include "sl_bt_api.h"
-#include "sl_bt_stack_config.h"
-#include "sl_bt_stack_init.h"
+#include "FreeRTOS.h"
+#include "event_groups.h"
+#include "task.h"
 #include "timers.h"
+#include "wfx_host_events.h"
+#include "wfx_rsi.h"
+#include "wfx_sl_ble_init.h"
+#include <rsi_driver.h>
+#include <rsi_utils.h>
+#include <stdbool.h>
+}
 #include <ble/CHIPBleServiceData.h>
 #include <lib/support/CodeUtils.h>
 #include <lib/support/logging/CHIPLogging.h>
 #include <platform/CommissionableDataProvider.h>
 #include <platform/DeviceInstanceInfoProvider.h>
-#include <sl_bt_rtos_adaptation.h>
+#include <string.h>
 
 #if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING
 #include <setup_payload/AdditionalDataPayloadGenerator.h>
 #endif
 
+// static int32_t handleTxConfirmationFlag = 0;
+extern uint16_t rsi_ble_measurement_hndl;
+extern rsi_ble_event_conn_status_t conn_event_to_app;
+extern sl_wfx_msg_t event_msg;
+
+// StaticTask_t busInitTaskStruct;
+
+/* wfxRsi Task will use as its stack */
+// StackType_t wfxRsiInitTaskStack[WFX_RSI_TASK_SZ] = { 0 };
+
 using namespace ::chip;
 using namespace ::chip::Ble;
 
+void rsi_ble_event_handling_task(void)
+{
+    int32_t event_id;
+
+    // int32_t event_id;
+    WFX_RSI_LOG("StartAdvertising");
+    //    chip::DeviceLayer::Internal::BLEManagerImpl().StartAdvertising(); //TODO:: Called on after init of module
+
+    // Application event map
+    while (1)
+    {
+        // checking for events list
+        event_id = rsi_ble_app_get_event();
+        if (event_id == -1)
+        {
+            continue;
+        }
+        switch (event_id)
+        {
+        case RSI_BLE_CONN_EVENT: {
+            rsi_ble_app_clear_event(RSI_BLE_CONN_EVENT);
+            chip::DeviceLayer::Internal::BLEMgrImpl().HandleConnectEvent();
+            WFX_RSI_LOG(" RSI_BLE : Module got connected");
+        }
+        break;
+        case RSI_BLE_DISCONN_EVENT: {
+            // event invokes when disconnection was completed
+            WFX_RSI_LOG(" RSI_BLE : Module got Disconnected");
+            chip::DeviceLayer::Internal::BLEMgrImpl().HandleConnectionCloseEvent(event_msg.reason);
+            // clear the served event
+            rsi_ble_app_clear_event(RSI_BLE_DISCONN_EVENT);
+        }
+        break;
+        case RSI_BLE_MTU_EVENT: {
+            // event invokes when write/notification events received
+            WFX_RSI_LOG("RSI_BLE:: RSI_BLE_MTU_EVENT");
+            chip::DeviceLayer::Internal::BLEMgrImpl().UpdateMtu(event_msg.rsi_ble_mtu);
+            // clear the served event
+            rsi_ble_app_clear_event(RSI_BLE_MTU_EVENT);
+        }
+        break;
+        case RSI_BLE_GATT_WRITE_EVENT: {
+            // event invokes when write/notification events received
+            WFX_RSI_LOG("RSI_BLE : RSI_BLE_GATT_WRITE_EVENT");
+            chip::DeviceLayer::Internal::BLEMgrImpl().HandleWriteEvent(event_msg.rsi_ble_write);
+            // clear the served event
+            rsi_ble_app_clear_event(RSI_BLE_GATT_WRITE_EVENT);
+        }
+        break;
+        case RSI_BLE_GATT_INDICATION_CONFIRMATION: {
+            WFX_RSI_LOG("RSI_BLE : indication confirmation");
+            chip::DeviceLayer::Internal::BLEMgrImpl().HandleTxConfirmationEvent(1);
+            rsi_ble_app_clear_event(RSI_BLE_GATT_INDICATION_CONFIRMATION);
+        }
+        break;
+
+        case RSI_BLE_RESP_ATT_VALUE: {
+            WFX_RSI_LOG("RSI_BLE : RESP_ATT confirmation");
+        }
+        default:
+            break;
+        }
+    }
+
+    WFX_RSI_LOG("%s  END", __func__);
+}
+
 namespace chip {
 namespace DeviceLayer {
 namespace Internal {
@@ -75,6 +155,7 @@
 
 // Timer Frequency used.
 #define TIMER_CLK_FREQ ((uint32_t) 32768)
+
 // Convert msec to timer ticks.
 #define TIMER_MS_2_TIMERTICK(ms) ((TIMER_CLK_FREQ * ms) / 1000)
 #define TIMER_S_2_TIMERTICK(s) (TIMER_CLK_FREQ * s)
@@ -96,6 +177,8 @@
 #define BLE_CONFIG_MIN_CE_LENGTH (0)      // Leave to min value
 #define BLE_CONFIG_MAX_CE_LENGTH (0xFFFF) // Leave to max value
 
+#define BLE__DEFAULT_TIMER_PERIOD 1
+
 TimerHandle_t sbleAdvTimeoutTimer; // FreeRTOS sw timer.
 
 const uint8_t UUID_CHIPoBLEService[]       = { 0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80,
@@ -113,21 +196,33 @@
 CHIP_ERROR BLEManagerImpl::_Init()
 {
     CHIP_ERROR err;
+    ChipLogProgress(DeviceLayer, "%s Start ", __func__);
+
+    //    wfx_rsi.init_task = xTaskCreateStatic((TaskFunction_t) wfx_sl_module_init, "init_task", WFX_RSI_TASK_SZ, NULL, 1,
+    //    wfxRsiInitTaskStack, &busInitTaskStruct);
+
+    if (NULL == wfx_rsi.init_task)
+    {
+        WFX_RSI_LOG("%s: error: failed to create task.", __func__);
+    }
 
     // Initialize the CHIP BleLayer.
     err = BleLayer::Init(this, this, &DeviceLayer::SystemLayer());
     SuccessOrExit(err);
 
+    return err;
+
+    ble_rsi_task();
     memset(mBleConnections, 0, sizeof(mBleConnections));
     memset(mIndConfId, kUnusedIndex, sizeof(mIndConfId));
     mServiceMode = ConnectivityManager::kCHIPoBLEServiceMode_Enabled;
 
     // Create FreeRTOS sw timer for BLE timeouts and interval change.
-    sbleAdvTimeoutTimer = xTimerCreate("BleAdvTimer",       // Just a text name, not used by the RTOS kernel
-                                       1,                   // == default timer period (mS)
-                                       false,               // no timer reload (==one-shot)
-                                       (void *) this,       // init timer id = ble obj context
-                                       BleAdvTimeoutHandler // timer callback handler
+    sbleAdvTimeoutTimer = xTimerCreate("BleAdvTimer",             // Just a text name, not used by the RTOS kernel
+                                       BLE__DEFAULT_TIMER_PERIOD, // == default timer period (mS)
+                                       false,                     // no timer reload (==one-shot)
+                                       (void *) this,             // init timer id = ble obj context
+                                       BleAdvTimeoutHandler       // timer callback handler
     );
 
     mFlags.ClearAll().Set(Flags::kAdvertisingEnabled, CHIP_DEVICE_CONFIG_CHIPOBLE_ENABLE_ADVERTISING_AUTOSTART);
@@ -135,6 +230,7 @@
     PlatformMgr().ScheduleWork(DriveBLEState, 0);
 
 exit:
+    ChipLogProgress(DeviceLayer, "%s END ", __func__);
     return err;
 }
 
@@ -198,14 +294,18 @@
 
 CHIP_ERROR BLEManagerImpl::_SetDeviceName(const char * deviceName)
 {
+    ChipLogProgress(DeviceLayer, "_SetDeviceName Started");
+    rsi_bt_set_local_name((uint8_t *) RSI_BLE_DEV_NAME);
     if (mServiceMode == ConnectivityManager::kCHIPoBLEServiceMode_NotSupported)
     {
+        ChipLogProgress(DeviceLayer, "_SetDeviceName CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE");
         return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
     }
     if (deviceName != NULL && deviceName[0] != 0)
     {
         if (strlen(deviceName) >= kMaxDeviceNameLength)
         {
+            ChipLogProgress(DeviceLayer, "_SetDeviceName CHIP_ERROR_INVALID_ARGUMENT");
             return CHIP_ERROR_INVALID_ARGUMENT;
         }
         strcpy(mDeviceName, deviceName);
@@ -218,6 +318,7 @@
         mDeviceName[0] = 0;
     }
     PlatformMgr().ScheduleWork(DriveBLEState, 0);
+    ChipLogProgress(DeviceLayer, "_SetDeviceName Ended");
     return CHIP_NO_ERROR;
 }
 
@@ -281,19 +382,19 @@
 bool BLEManagerImpl::CloseConnection(BLE_CONNECTION_OBJECT conId)
 {
     CHIP_ERROR err = CHIP_NO_ERROR;
-    sl_status_t ret;
+    //    int32_t ret;
 
     ChipLogProgress(DeviceLayer, "Closing BLE GATT connection (con %u)", conId);
 
-    ret = sl_bt_connection_close(conId);
-    err = MapBLEError(ret);
+    // ret = rsi_ble_disconnect(1);
+    //    err = MapBLEError(ret);
 
     if (err != CHIP_NO_ERROR)
     {
         ChipLogError(DeviceLayer, "sl_bt_connection_close() failed: %s", ErrorStr(err));
     }
 
-    return (err == CHIP_NO_ERROR);
+    return true; //(err == CHIP_NO_ERROR);
 }
 
 uint16_t BLEManagerImpl::GetMTU(BLE_CONNECTION_OBJECT conId) const
@@ -305,26 +406,13 @@
 bool BLEManagerImpl::SendIndication(BLE_CONNECTION_OBJECT conId, const ChipBleUUID * svcId, const ChipBleUUID * charId,
                                     PacketBufferHandle data)
 {
-    CHIP_ERROR err              = CHIP_NO_ERROR;
-    CHIPoBLEConState * conState = GetConnectionState(conId);
-    sl_status_t ret;
-    uint16_t cId        = (UUIDsMatch(&ChipUUID_CHIPoBLEChar_RX, charId) ? gattdb_CHIPoBLEChar_Rx : gattdb_CHIPoBLEChar_Tx);
-    uint8_t timerHandle = GetTimerHandle(conId, true);
-
-    VerifyOrExit(((conState != NULL) && (conState->subscribed != 0)), err = CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrExit(timerHandle != kMaxConnections, err = CHIP_ERROR_NO_MEMORY);
-
-    // start timer for light indication confirmation. Long delay for spake2 indication
-    sl_bt_system_set_lazy_soft_timer(TIMER_S_2_TIMERTICK(6), 0, timerHandle, true);
-
-    ret = sl_bt_gatt_server_send_indication(conId, cId, (data->DataLength()), data->Start());
-    err = MapBLEError(ret);
-
-exit:
-    if (err != CHIP_NO_ERROR)
+    int32_t status = 0;
+    WFX_RSI_LOG("In send indication");
+    status = rsi_ble_indicate_value(event_msg.resp_enh_conn.dev_addr, event_msg.rsi_ble_measurement_hndl, (data->DataLength()),
+                                    data->Start());
+    if (status != RSI_SUCCESS)
     {
-        ChipLogError(DeviceLayer, "BLEManagerImpl::SendIndication() failed: %s", ErrorStr(err));
-        return false;
+        WFX_RSI_LOG("indication %d failed with error code %lx ", status);
     }
 
     return true;
@@ -377,15 +465,20 @@
 
 void BLEManagerImpl::DriveBLEState(void)
 {
+
+    ChipLogProgress(DeviceLayer, "DriveBLEState starting");
     CHIP_ERROR err = CHIP_NO_ERROR;
 
     // Check if BLE stack is initialized
-    VerifyOrExit(mFlags.Has(Flags::kEFRBLEStackInitialized), /* */);
+    // VerifyOrExit(mFlags.Has(Flags::kEFRBLEStackInitialized), /* */);
 
+    ChipLogProgress(DeviceLayer, "Start advertising if needed...");
     // Start advertising if needed...
     if (mServiceMode == ConnectivityManager::kCHIPoBLEServiceMode_Enabled && mFlags.Has(Flags::kAdvertisingEnabled) &&
         NumConnections() < kMaxConnections)
     {
+
+        ChipLogProgress(DeviceLayer, "Start/re-start advertising if not already started, or if there is a pending change");
         // Start/re-start advertising if not already started, or if there is a pending change
         // to the advertising configuration.
         if (!mFlags.Has(Flags::kAdvertising) || mFlags.Has(Flags::kRestartAdvertising))
@@ -403,6 +496,7 @@
     }
 
 exit:
+    ChipLogProgress(DeviceLayer, "DriveBLEState End");
     if (err != CHIP_NO_ERROR)
     {
         ChipLogError(DeviceLayer, "Disabling CHIPoBLE service due to error: %s", ErrorStr(err));
@@ -412,21 +506,24 @@
 
 CHIP_ERROR BLEManagerImpl::ConfigureAdvertisingData(void)
 {
-    sl_status_t ret;
+
     ChipBLEDeviceIdentificationInfo mDeviceIdInfo;
     CHIP_ERROR err;
+    int32_t result;
     uint8_t responseData[MAX_RESPONSE_DATA_LEN];
     uint8_t advData[MAX_ADV_DATA_LEN];
     uint32_t index              = 0;
     uint32_t mDeviceNameLength  = 0;
     uint8_t mDeviceIdInfoLength = 0;
+    err                         = ConfigurationMgr().GetBLEDeviceIdentificationInfo(mDeviceIdInfo);
+
+    ChipLogProgress(DeviceLayer, "ConfigureAdvertisingData start");
 
     VerifyOrExit((kMaxDeviceNameLength + 1) < UINT8_MAX, err = CHIP_ERROR_INVALID_ARGUMENT);
 
     memset(responseData, 0, MAX_RESPONSE_DATA_LEN);
     memset(advData, 0, MAX_ADV_DATA_LEN);
 
-    err = ConfigurationMgr().GetBLEDeviceIdentificationInfo(mDeviceIdInfo);
     SuccessOrExit(err);
 
     if (!mFlags.Has(Flags::kDeviceNameSet))
@@ -457,154 +554,125 @@
     advData[index++] = CHIP_ADV_DATA_TYPE_SERVICE_DATA;                                         // AD type : Service Data
     advData[index++] = ShortUUID_CHIPoBLEService[0];                                            // AD value
     advData[index++] = ShortUUID_CHIPoBLEService[1];
-    memcpy(&advData[index], (void *) &mDeviceIdInfo, mDeviceIdInfoLength); // AD value
-    index += mDeviceIdInfoLength;
+
+    // TODO:: replace the hardcoded values by calling the GetBLEDeviceIdentificationInfo
+    advData[index++] = 0;   // OpCode
+    advData[index++] = 0;   // DeviceDiscriminatorAndAdvVersion []
+    advData[index++] = 15;  // DeviceDiscriminatorAndAdvVersion []
+    advData[index++] = 241; // DeviceVendorId []
+    advData[index++] = 255; // DeviceVendorId []
+    advData[index++] = 5;   // DeviceProductId[]
+    advData[index++] = 128; // DeviceProductId[]
+    advData[index++] = 0;   // AdditionalDataFlag
+
+    //! prepare advertise data //local/device name
+    advData[index++] = strlen(RSI_BLE_DEV_NAME) + 1;
+    advData[index++] = 9;
+
+    memcpy(&advData[index], RSI_BLE_DEV_NAME, strlen(RSI_BLE_DEV_NAME)); // AD value
+    index += strlen(RSI_BLE_DEV_NAME);
 
 #if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING
     ReturnErrorOnFailure(EncodeAdditionalDataTlv());
 #endif
 
-    if (0xff != advertising_set_handle)
+    result = rsi_ble_set_advertise_data(advData, index);
+    if (result != SL_STATUS_OK)
     {
-        sl_bt_advertiser_delete_set(advertising_set_handle);
-        advertising_set_handle = 0xff;
-    }
-
-    ret = sl_bt_advertiser_create_set(&advertising_set_handle);
-    if (ret != SL_STATUS_OK)
-    {
-        err = MapBLEError(ret);
-        ChipLogError(DeviceLayer, "sl_bt_advertiser_create_set() failed: %s", ErrorStr(err));
+        err = MapBLEError(result);
+        ChipLogError(DeviceLayer, "rsi_ble_set_advertise_data() failed: %ld", result);
         ExitNow();
     }
-
-    ret = sl_bt_legacy_advertiser_set_data(advertising_set_handle, sl_bt_advertiser_advertising_data_packet, index,
-                                           (uint8_t *) advData);
-
-    if (ret != SL_STATUS_OK)
+    else
     {
-        err = MapBLEError(ret);
-        ChipLogError(DeviceLayer, "sl_bt_legacy_advertiser_set_data() - Advertising Data failed: %s", ErrorStr(err));
-        ExitNow();
+        ChipLogError(DeviceLayer, "rsi_ble_set_advertise_data() success: %ld", result);
     }
 
-    index = 0;
+    err = MapBLEError(result);
 
-    responseData[index++] = CHIP_ADV_SHORT_UUID_LEN + 1;  // AD length
-    responseData[index++] = CHIP_ADV_DATA_TYPE_UUID;      // AD type : uuid
-    responseData[index++] = ShortUUID_CHIPoBLEService[0]; // AD value
-    responseData[index++] = ShortUUID_CHIPoBLEService[1];
-
-    responseData[index++] = static_cast<uint8_t>(mDeviceNameLength + 1); // length
-    responseData[index++] = CHIP_ADV_DATA_TYPE_NAME;                     // AD type : name
-    memcpy(&responseData[index], mDeviceName, mDeviceNameLength);        // AD value
-    index += mDeviceNameLength;
-
-    ret = sl_bt_legacy_advertiser_set_data(advertising_set_handle, sl_bt_advertiser_scan_response_packet, index,
-                                           (uint8_t *) responseData);
-
-    if (ret != SL_STATUS_OK)
-    {
-        err = MapBLEError(ret);
-        ChipLogError(DeviceLayer, "sl_bt_legacy_advertiser_set_data() - Scan Response failed: %s", ErrorStr(err));
-        ExitNow();
-    }
-
-    err = MapBLEError(ret);
-
+    ChipLogProgress(DeviceLayer, "ConfigureAdvertisingData End");
 exit:
-    return err;
+    return CHIP_NO_ERROR;
 }
 
 CHIP_ERROR BLEManagerImpl::StartAdvertising(void)
 {
     CHIP_ERROR err;
-    sl_status_t ret;
-    uint32_t interval_min;
-    uint32_t interval_max;
-    uint16_t numConnectionss = NumConnections();
-    uint8_t connectableAdv =
-        (numConnectionss < kMaxConnections) ? sl_bt_advertiser_connectable_scannable : sl_bt_advertiser_scannable_non_connectable;
+    int32_t status = 0;
+
+    ChipLogProgress(DeviceLayer, "StartAdvertising start");
 
     // If already advertising, stop it, before changing values
     if (mFlags.Has(Flags::kAdvertising))
     {
-        sl_bt_advertiser_stop(advertising_set_handle);
+        // sl_bt_advertiser_stop(advertising_set_handle);
     }
     else
     {
         ChipLogDetail(DeviceLayer, "Start BLE advertissement");
     }
 
-    const uint8_t kResolvableRandomAddrType = 2; // Private resolvable random address type
-    bd_addr unusedBdAddr;                        // We can ignore this field when setting random address.
-    sl_bt_advertiser_set_random_address(advertising_set_handle, kResolvableRandomAddrType, unusedBdAddr, &unusedBdAddr);
-    (void) unusedBdAddr;
+    //    bd_addr unusedBdAddr; // We can ignore this field when setting random address.
+
+    //    (void) unusedBdAddr;
 
     err = ConfigureAdvertisingData();
     SuccessOrExit(err);
 
     mFlags.Clear(Flags::kRestartAdvertising);
 
-    if (mFlags.Has(Flags::kFastAdvertisingEnabled))
-    {
-        interval_min = CHIP_DEVICE_CONFIG_BLE_FAST_ADVERTISING_INTERVAL_MIN;
-        interval_max = CHIP_DEVICE_CONFIG_BLE_FAST_ADVERTISING_INTERVAL_MAX;
-    }
-    else
-    {
-        interval_min = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MIN;
-        interval_max = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MAX;
-    }
+    sl_wfx_mac_address_t macaddr;
+    wfx_get_wifi_mac_addr(SL_WFX_STA_INTERFACE, &macaddr);
 
-    ret = sl_bt_advertiser_set_timing(advertising_set_handle, interval_min, interval_max, 0, 0);
-    err = MapBLEError(ret);
-    SuccessOrExit(err);
-
-    sl_bt_advertiser_configure(advertising_set_handle, 1);
-    ret = sl_bt_legacy_advertiser_start(advertising_set_handle, connectableAdv);
-
-    if (SL_STATUS_OK == ret)
+    //! Set local name
+    status = rsi_ble_start_advertising();
+    if (status == RSI_SUCCESS)
     {
+        ChipLogProgress(DeviceLayer, "rsi_ble_start_advertising Success");
+
         if (mFlags.Has(Flags::kFastAdvertisingEnabled))
         {
             StartBleAdvTimeoutTimer(CHIP_DEVICE_CONFIG_BLE_ADVERTISING_INTERVAL_CHANGE_TIME);
         }
         mFlags.Set(Flags::kAdvertising);
     }
-
-    err = MapBLEError(ret);
+    else
+    {
+        ChipLogProgress(DeviceLayer, "rsi_ble_start_advertising Failed with status: %lx", status);
+    }
 
 exit:
-    return err;
+    ChipLogError(DeviceLayer, "StartAdvertising() End error: %s", ErrorStr(err));
+    return CHIP_NO_ERROR; // err;
 }
 
+// TODO:: Implementation need to be done.
 CHIP_ERROR BLEManagerImpl::StopAdvertising(void)
 {
     CHIP_ERROR err = CHIP_NO_ERROR;
-    sl_status_t ret;
+    // sl_status_t ret;
 
     if (mFlags.Has(Flags::kAdvertising))
     {
         mFlags.Clear(Flags::kAdvertising).Clear(Flags::kRestartAdvertising);
         mFlags.Set(Flags::kFastAdvertisingEnabled, true);
 
-        ret = sl_bt_advertiser_stop(advertising_set_handle);
-        sl_bt_advertiser_delete_set(advertising_set_handle);
+        // ret = sl_bt_advertiser_stop(advertising_set_handle);
+        // sl_bt_advertiser_delete_set(advertising_set_handle);
         advertising_set_handle = 0xff;
-        err                    = MapBLEError(ret);
-        SuccessOrExit(err);
+        // err                    = MapBLEError(ret);
+        //        SuccessOrExit(err);
 
         CancelBleAdvTimeoutTimer();
     }
 
-exit:
+    // exit:
     return err;
 }
 
-void BLEManagerImpl::UpdateMtu(volatile sl_bt_msg_t * evt)
+void BLEManagerImpl::UpdateMtu(rsi_ble_event_mtu_t evt)
 {
-    CHIPoBLEConState * bleConnState = GetConnectionState(evt->data.evt_gatt_mtu_exchanged.connection);
+    CHIPoBLEConState * bleConnState = GetConnectionState(event_msg.connectionHandle);
     if (bleConnState != NULL)
     {
         // bleConnState->MTU is a 10-bit field inside a uint16_t.  We're
@@ -616,9 +684,10 @@
         // TODO: https://github.com/project-chip/connectedhomeip/issues/2569
         // tracks making this safe with a check or explaining why no check
         // is needed.
+        ChipLogProgress(DeviceLayer, "DriveBLEState UpdateMtu %d", evt.mtu_size);
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wconversion"
-        bleConnState->mtu = evt->data.evt_gatt_mtu_exchanged.mtu;
+        bleConnState->mtu = evt.mtu_size;
 #pragma GCC diagnostic pop
         ;
     }
@@ -630,23 +699,18 @@
     PlatformMgr().ScheduleWork(DriveBLEState, 0);
 }
 
-void BLEManagerImpl::HandleConnectEvent(volatile sl_bt_msg_t * evt)
+void BLEManagerImpl::HandleConnectEvent(void)
 {
-    sl_bt_evt_connection_opened_t * conn_evt = (sl_bt_evt_connection_opened_t *) &(evt->data);
-    uint8_t connHandle                       = conn_evt->connection;
-    uint8_t bondingHandle                    = conn_evt->bonding;
-
-    ChipLogProgress(DeviceLayer, "Connect Event for handle : %d", connHandle);
-
-    AddConnection(connHandle, bondingHandle);
+    ChipLogProgress(DeviceLayer, "Connect Event for handle : %d", event_msg.connectionHandle);
+    AddConnection(event_msg.connectionHandle, event_msg.bondingHandle);
 
     PlatformMgr().ScheduleWork(DriveBLEState, 0);
 }
 
-void BLEManagerImpl::HandleConnectionCloseEvent(volatile sl_bt_msg_t * evt)
+// TODO:: Implementation need to be done.
+void BLEManagerImpl::HandleConnectionCloseEvent(uint16_t reason)
 {
-    sl_bt_evt_connection_closed_t * conn_evt = (sl_bt_evt_connection_closed_t *) &(evt->data);
-    uint8_t connHandle                       = conn_evt->connection;
+    uint8_t connHandle = 1;
 
     ChipLogProgress(DeviceLayer, "Disconnect Event for handle : %d", connHandle);
 
@@ -656,24 +720,19 @@
         event.Type                          = DeviceEventType::kCHIPoBLEConnectionError;
         event.CHIPoBLEConnectionError.ConId = connHandle;
 
-        switch (conn_evt->reason)
-        {
-        case SL_STATUS_BT_CTRL_REMOTE_USER_TERMINATED:
-        case SL_STATUS_BT_CTRL_REMOTE_DEVICE_TERMINATED_CONNECTION_DUE_TO_LOW_RESOURCES:
-        case SL_STATUS_BT_CTRL_REMOTE_POWERING_OFF:
-            event.CHIPoBLEConnectionError.Reason = BLE_ERROR_REMOTE_DEVICE_DISCONNECTED;
-            break;
+        //        switch (reason)
+        //        {
+        //
+        //        case RSI_REMOTE_DEV_TERMINATE_CONN:
+        //        case RSI_BT_CTRL_REMOTE_DEVICE_TERMINATED_CONNECTION_DUE_TO_LOW_RESOURCES:
+        //        case RSI_BT_CTRL_REMOTE_POWERING_OFF:
+        //           event.CHIPoBLEConnectionError.Reason = BLE_ERROR_REMOTE_DEVICE_DISCONNECTED;
+        //        break;
+        //        default:
+        //           event.CHIPoBLEConnectionError.Reason = BLE_ERROR_CHIPOBLE_PROTOCOL_ABORT;
+        //        }
 
-        case SL_STATUS_BT_CTRL_CONNECTION_TERMINATED_BY_LOCAL_HOST:
-            event.CHIPoBLEConnectionError.Reason = BLE_ERROR_APP_CLOSED_CONNECTION;
-            break;
-
-        default:
-            event.CHIPoBLEConnectionError.Reason = BLE_ERROR_CHIPOBLE_PROTOCOL_ABORT;
-            break;
-        }
-
-        ChipLogProgress(DeviceLayer, "BLE GATT connection closed (con %u, reason %u)", connHandle, conn_evt->reason);
+        //        ChipLogProgress(DeviceLayer, "BLE GATT connection closed (con %u, reason %u)", connHandle, conn_evt->reason);
 
         PlatformMgr().PostEventOrDie(&event);
 
@@ -685,84 +744,61 @@
     }
 }
 
-void BLEManagerImpl::HandleWriteEvent(volatile sl_bt_msg_t * evt)
+void BLEManagerImpl::HandleWriteEvent(rsi_ble_event_write_t evt)
 {
-    uint16_t attribute = evt->data.evt_gatt_server_user_write_request.characteristic;
+    // RSI_BLE_WRITE_REQUEST_EVENT
+    ChipLogProgress(DeviceLayer, "Char Write Req, packet type %d", evt.pkt_type);
+    uint8_t attribute = (uint8_t) event_msg.rsi_ble_measurement_hndl;
 
-    ChipLogProgress(DeviceLayer, "Char Write Req, char : %d", attribute);
+    WFX_RSI_LOG("attribute = %d,rsi_ble_measurement_hndl = %d", attribute, event_msg.rsi_ble_measurement_hndl);
 
-    if (gattdb_CHIPoBLEChar_Rx == attribute)
+    if (evt.handle[0] == (uint8_t) event_msg.rsi_ble_gatt_server_client_config_hndl) // TODO:: compare the handle exactly
     {
-        HandleRXCharWrite(evt);
-    }
-}
-
-void BLEManagerImpl::HandleTXCharCCCDWrite(volatile sl_bt_msg_t * evt)
-{
-    CHIP_ERROR err = CHIP_NO_ERROR;
-    CHIPoBLEConState * bleConnState;
-    bool isIndicationEnabled = false;
-    ChipDeviceEvent event;
-
-    bleConnState = GetConnectionState(evt->data.evt_gatt_server_user_write_request.connection);
-    VerifyOrExit(bleConnState != NULL, err = CHIP_ERROR_NO_MEMORY);
-
-    // Determine if the client is enabling or disabling notification/indication.
-    isIndicationEnabled = (evt->data.evt_gatt_server_characteristic_status.client_config_flags == sl_bt_gatt_indication);
-
-    ChipLogProgress(DeviceLayer, "HandleTXcharCCCDWrite - Config Flags value : %d",
-                    evt->data.evt_gatt_server_characteristic_status.client_config_flags);
-    ChipLogProgress(DeviceLayer, "CHIPoBLE %s received", isIndicationEnabled ? "subscribe" : "unsubscribe");
-
-    if (isIndicationEnabled)
-    {
-        // If indications are not already enabled for the connection...
-        if (!bleConnState->subscribed)
-        {
-            bleConnState->subscribed = 1;
-            // Post an event to the CHIP queue to process either a CHIPoBLE Subscribe or Unsubscribe based on
-            // whether the client is enabling or disabling indications.
-            {
-                event.Type                    = DeviceEventType::kCHIPoBLESubscribe;
-                event.CHIPoBLESubscribe.ConId = evt->data.evt_gatt_server_user_write_request.connection;
-                err                           = PlatformMgr().PostEvent(&event);
-            }
-        }
+        WFX_RSI_LOG("Inside HandleTXCharCCCDWrite ");
+        HandleTXCharCCCDWrite(&evt);
     }
     else
     {
-        bleConnState->subscribed      = 0;
-        event.Type                    = DeviceEventType::kCHIPoBLEUnsubscribe;
-        event.CHIPoBLESubscribe.ConId = evt->data.evt_gatt_server_user_write_request.connection;
-        err                           = PlatformMgr().PostEvent(&event);
-    }
-
-exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        ChipLogError(DeviceLayer, "HandleTXCharCCCDWrite() failed: %s", ErrorStr(err));
+        HandleRXCharWrite(&evt);
     }
 }
 
-void BLEManagerImpl::HandleRXCharWrite(volatile sl_bt_msg_t * evt)
+void BLEManagerImpl::HandleTXCharCCCDWrite(rsi_ble_event_write_t * evt)
 {
     CHIP_ERROR err = CHIP_NO_ERROR;
+    ChipDeviceEvent event;
+    // whether the client is enabling or disabling indications.
+    {
+        event.Type                    = DeviceEventType::kCHIPoBLESubscribe;
+        event.CHIPoBLESubscribe.ConId = 1;
+        err                           = PlatformMgr().PostEvent(&event);
+    }
+}
+
+void BLEManagerImpl::HandleRXCharWrite(rsi_ble_event_write_t * evt)
+{
+    uint8_t conId  = 1;
+    CHIP_ERROR err = CHIP_NO_ERROR;
     System::PacketBufferHandle buf;
-    uint16_t writeLen = evt->data.evt_gatt_server_user_write_request.value.len;
-    uint8_t * data    = (uint8_t *) evt->data.evt_gatt_server_user_write_request.value.data;
+    uint16_t writeLen = evt->length;
+    uint8_t * data    = (uint8_t *) evt->att_value;
+
+    for (int i = 0; i < evt->length; i++)
+    {
+        ChipLogDetail(DeviceLayer, "HandleRXCharWrite  value : %d", evt->att_value[i]);
+    }
 
     // Copy the data to a packet buffer.
     buf = System::PacketBufferHandle::NewWithData(data, writeLen, 0, 0);
     VerifyOrExit(!buf.IsNull(), err = CHIP_ERROR_NO_MEMORY);
 
-    ChipLogDetail(DeviceLayer, "Write request/command received for CHIPoBLE RX characteristic (con %u, len %u)",
-                  evt->data.evt_gatt_server_user_write_request.connection, buf->DataLength());
+    ChipLogDetail(DeviceLayer, "Write request/command received for CHIPoBLE RX characteristic ( len %d)", writeLen);
 
     // Post an event to the CHIP queue to deliver the data into the CHIP stack.
     {
         ChipDeviceEvent event;
         event.Type                        = DeviceEventType::kCHIPoBLEWriteReceived;
-        event.CHIPoBLEWriteReceived.ConId = evt->data.evt_gatt_server_user_write_request.connection;
+        event.CHIPoBLEWriteReceived.ConId = conId;
         event.CHIPoBLEWriteReceived.Data  = std::move(buf).UnsafeRelease();
         err                               = PlatformMgr().PostEvent(&event);
     }
@@ -777,36 +813,38 @@
 void BLEManagerImpl::HandleTxConfirmationEvent(BLE_CONNECTION_OBJECT conId)
 {
     ChipDeviceEvent event;
-    uint8_t timerHandle = sInstance.GetTimerHandle(conId, false);
-
-    ChipLogProgress(DeviceLayer, "Tx Confirmation received");
-
-    // stop indication confirmation timer
-    if (timerHandle < kMaxConnections)
-    {
-        ChipLogProgress(DeviceLayer, " stop soft timer");
-        sl_bt_system_set_lazy_soft_timer(0, 0, timerHandle, false);
-    }
+    //    uint8_t timerHandle = sInstance.GetTimerHandle(conId, false);
+    //
+    //    ChipLogProgress(DeviceLayer, "Tx Confirmation received");
+    //
+    //    // stop indication confirmation timer // TODO:: Need to find the proper repleacement
+    //    if (timerHandle < kMaxConnections)
+    //    {
+    //        ChipLogProgress(DeviceLayer, " stop soft timer");
+    //        // sl_bt_system_set_lazy_soft_timer(0, 0, timerHandle, false);
+    //    }
 
     event.Type                          = DeviceEventType::kCHIPoBLEIndicateConfirm;
     event.CHIPoBLEIndicateConfirm.ConId = conId;
     PlatformMgr().PostEventOrDie(&event);
 }
 
-void BLEManagerImpl::HandleSoftTimerEvent(volatile sl_bt_msg_t * evt)
+// TODO:: Need to Implement
+void BLEManagerImpl::HandleSoftTimerEvent(void)
 {
+
     // BLE Manager starts soft timers with timer handles less than kMaxConnections
     // If we receive a callback for unknown timer handle ignore this.
-    if (evt->data.evt_system_soft_timer.handle < kMaxConnections)
-    {
-        ChipLogProgress(DeviceLayer, "BLEManagerImpl::HandleSoftTimerEvent CHIPOBLE_PROTOCOL_ABORT");
-        ChipDeviceEvent event;
-        event.Type                                                   = DeviceEventType::kCHIPoBLEConnectionError;
-        event.CHIPoBLEConnectionError.ConId                          = mIndConfId[evt->data.evt_system_soft_timer.handle];
-        sInstance.mIndConfId[evt->data.evt_system_soft_timer.handle] = kUnusedIndex;
-        event.CHIPoBLEConnectionError.Reason                         = BLE_ERROR_CHIPOBLE_PROTOCOL_ABORT;
-        PlatformMgr().PostEventOrDie(&event);
-    }
+    //    if (evt->data.evt_system_soft_timer.handle < kMaxConnections)
+    //    {
+    //        ChipLogProgress(DeviceLayer, "BLEManagerImpl::HandleSoftTimerEvent CHIPOBLE_PROTOCOL_ABORT");
+    //        ChipDeviceEvent event;
+    //        event.Type                                                   = DeviceEventType::kCHIPoBLEConnectionError;
+    //        event.CHIPoBLEConnectionError.ConId                          = mIndConfId[evt->data.evt_system_soft_timer.handle];
+    //        sInstance.mIndConfId[evt->data.evt_system_soft_timer.handle] = kUnusedIndex;
+    //        event.CHIPoBLEConnectionError.Reason                         = BLE_ERROR_CHIPOBLE_PROTOCOL_ABORT;
+    //        PlatformMgr().PostEventOrDie(&event);
+    //    }
 }
 
 bool BLEManagerImpl::RemoveConnection(uint8_t connectionHandle)
@@ -900,19 +938,20 @@
     return err;
 }
 
-void BLEManagerImpl::HandleC3ReadRequest(volatile sl_bt_msg_t * evt)
+// TODO:: Need the
+void BLEManagerImpl::HandleC3ReadRequest(void)
 {
-    sl_bt_evt_gatt_server_user_read_request_t * readReq =
-        (sl_bt_evt_gatt_server_user_read_request_t *) &(evt->data.evt_gatt_server_user_read_request);
-    ChipLogDetail(DeviceLayer, "Read request received for CHIPoBLEChar_C3 - opcode:%d", readReq->att_opcode);
-    sl_status_t ret = sl_bt_gatt_server_send_user_read_response(readReq->connection, readReq->characteristic, 0,
-                                                                sInstance.c3AdditionalDataBufferHandle->DataLength(),
-                                                                sInstance.c3AdditionalDataBufferHandle->Start(), nullptr);
+    //    sl_bt_evt_gatt_server_user_read_request_t * readReq =
+    //        (sl_bt_evt_gatt_server_user_read_request_t *) &(evt->data.evt_gatt_server_user_read_request);
+    //    ChipLogDetail(DeviceLayer, "Read request received for CHIPoBLEChar_C3 - opcode:%d", readReq->att_opcode);
+    //    sl_status_t ret = sl_bt_gatt_server_send_user_read_response(readReq->connection, readReq->characteristic, 0,
+    //                                                                sInstance.c3AdditionalDataBufferHandle->DataLength(),
+    //                                                                sInstance.c3AdditionalDataBufferHandle->Start(), nullptr);
 
-    if (ret != SL_STATUS_OK)
-    {
-        ChipLogDetail(DeviceLayer, "Failed to send read response, err:%ld", ret);
-    }
+    //    if (ret != SL_STATUS_OK)
+    //    {
+    //        ChipLogDetail(DeviceLayer, "Failed to send read response, err:%ld", ret);
+    //    }
 }
 #endif // CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING
 
@@ -989,105 +1028,4 @@
 } // namespace DeviceLayer
 } // namespace chip
 
-extern "C" void sl_bt_on_event(sl_bt_msg_t * evt)
-{
-    // As this is running in a separate thread, we need to block CHIP from operating,
-    // until the events are handled.
-    chip::DeviceLayer::PlatformMgr().LockChipStack();
-
-    // handle bluetooth events
-    switch (SL_BT_MSG_ID(evt->header))
-    {
-    case sl_bt_evt_system_boot_id: {
-        ChipLogProgress(DeviceLayer, "Bluetooth stack booted: v%d.%d.%d-b%d", evt->data.evt_system_boot.major,
-                        evt->data.evt_system_boot.minor, evt->data.evt_system_boot.patch, evt->data.evt_system_boot.build);
-        chip::DeviceLayer::Internal::BLEMgrImpl().HandleBootEvent();
-
-        RAIL_Version_t railVer;
-        RAIL_GetVersion(&railVer, true);
-        ChipLogProgress(DeviceLayer, "RAIL version:, v%d.%d.%d-b%d", railVer.major, railVer.minor, railVer.rev, railVer.build);
-        sl_bt_connection_set_default_parameters(BLE_CONFIG_MIN_INTERVAL, BLE_CONFIG_MAX_INTERVAL, BLE_CONFIG_LATENCY,
-                                                BLE_CONFIG_TIMEOUT, BLE_CONFIG_MIN_CE_LENGTH, BLE_CONFIG_MAX_CE_LENGTH);
-    }
-    break;
-
-    case sl_bt_evt_connection_opened_id: {
-        chip::DeviceLayer::Internal::BLEMgrImpl().HandleConnectEvent(evt);
-    }
-    break;
-    case sl_bt_evt_connection_parameters_id: {
-        // ChipLogProgress(DeviceLayer, "Connection parameter ID received");
-    }
-    break;
-    case sl_bt_evt_connection_phy_status_id: {
-        // ChipLogProgress(DeviceLayer, "PHY update procedure is completed");
-    }
-    break;
-    case sl_bt_evt_connection_closed_id: {
-        chip::DeviceLayer::Internal::BLEMgrImpl().HandleConnectionCloseEvent(evt);
-    }
-    break;
-
-    /* This event indicates that a remote GATT client is attempting to write a value of an
-     * attribute in to the local GATT database, where the attribute was defined in the GATT
-     * XML firmware configuration file to have type="user".  */
-    case sl_bt_evt_gatt_server_attribute_value_id: {
-        chip::DeviceLayer::Internal::BLEMgrImpl().HandleWriteEvent(evt);
-    }
-    break;
-
-    case sl_bt_evt_gatt_mtu_exchanged_id: {
-        chip::DeviceLayer::Internal::BLEMgrImpl().UpdateMtu(evt);
-    }
-    break;
-
-    // confirmation of indication received from remote GATT client
-    case sl_bt_evt_gatt_server_characteristic_status_id: {
-        sl_bt_gatt_server_characteristic_status_flag_t StatusFlags;
-
-        StatusFlags = (sl_bt_gatt_server_characteristic_status_flag_t) evt->data.evt_gatt_server_characteristic_status.status_flags;
-
-        if (sl_bt_gatt_server_confirmation == StatusFlags)
-        {
-            chip::DeviceLayer::Internal::BLEMgrImpl().HandleTxConfirmationEvent(
-                evt->data.evt_gatt_server_characteristic_status.connection);
-        }
-        else if ((evt->data.evt_gatt_server_characteristic_status.characteristic == gattdb_CHIPoBLEChar_Tx) &&
-                 (evt->data.evt_gatt_server_characteristic_status.status_flags == gatt_server_client_config))
-        {
-            chip::DeviceLayer::Internal::BLEMgrImpl().HandleTXCharCCCDWrite(evt);
-        }
-    }
-    break;
-
-    /* Software Timer event */
-    case sl_bt_evt_system_soft_timer_id: {
-        chip::DeviceLayer::Internal::BLEMgrImpl().HandleSoftTimerEvent(evt);
-    }
-    break;
-
-    case sl_bt_evt_gatt_server_user_read_request_id: {
-        ChipLogProgress(DeviceLayer, "GATT server user_read_request");
-#if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING
-        if (evt->data.evt_gatt_server_user_read_request.characteristic == gattdb_CHIPoBLEChar_C3)
-        {
-            chip::DeviceLayer::Internal::BLEMgrImpl().HandleC3ReadRequest(evt);
-        }
-#endif // CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING
-    }
-    break;
-
-    case sl_bt_evt_connection_remote_used_features_id: {
-        // ChipLogProgress(DeviceLayer, "link layer features supported by the remote device");
-    }
-    break;
-
-    default:
-        ChipLogProgress(DeviceLayer, "evt_UNKNOWN id = %08" PRIx32, SL_BT_MSG_ID(evt->header));
-        break;
-    }
-
-    chip::DeviceLayer::PlatformMgr().UnlockChipStack();
-}
-
 #endif // CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE
diff --git a/src/platform/silabs/SiWx917/BUILD.gn b/src/platform/silabs/SiWx917/BUILD.gn
index b67c63c..4026e1c 100644
--- a/src/platform/silabs/SiWx917/BUILD.gn
+++ b/src/platform/silabs/SiWx917/BUILD.gn
@@ -22,17 +22,13 @@
 
 silabs_platform_dir = "${chip_root}/src/platform/silabs"
 
-assert(chip_device_platform == "efr32")
+assert(chip_device_platform == "SiWx917")
 
 if (chip_enable_openthread) {
   import("//build_overrides/openthread.gni")
 }
 
-if (chip_crypto == "platform") {
-  import("//build_overrides/mbedtls.gni")
-}
-
-static_library("EFR32") {
+static_library("SiWx917") {
   sources = [
     "${silabs_platform_dir}/BLEManagerImpl.h",
     "${silabs_platform_dir}/BlePlatformConfig.h",
@@ -57,33 +53,21 @@
     "ConfigurationManagerImpl.cpp",
     "KeyValueStoreManagerImpl.cpp",
     "PlatformManagerImpl.cpp",
+    "bluetooth/rsi_ble_config.h",
+    "bluetooth/wfx_sl_ble_init.c",
+    "bluetooth/wfx_sl_ble_init.h",
   ]
 
+  # TODO: OTA on CCP platform
   if (chip_enable_ota_requestor) {
     sources += [
-      "OTAImageProcessorImpl.cpp",
-      "OTAImageProcessorImpl.h",
+      #"OTAImageProcessorImpl.cpp",
+      #"OTAImageProcessorImpl.h",
     ]
   }
 
   public_deps = [ "${chip_root}/src/platform:platform_base" ]
 
-  # Add platform crypto implementation
-  if (chip_crypto == "platform") {
-    sources += [
-      "CHIPCryptoPALPsaEfr32.cpp",
-      "Efr32OpaqueKeypair.h",
-      "Efr32PsaOpaqueKeypair.cpp",
-      "Efr32PsaOperationalKeystore.cpp",
-      "Efr32PsaOperationalKeystore.h",
-    ]
-
-    public_deps += [
-      "${chip_root}/src/crypto",
-      "${mbedtls_root}:mbedtls",
-    ]
-  }
-
   # Add pigweed KVS
   deps = [
     "$dir_pw_kvs:crc16",
@@ -93,27 +77,6 @@
     "$dir_pw_checksum",
     "$dir_pw_kvs",
   ]
-  if (chip_enable_openthread) {
-    public_deps += [ "${chip_root}/third_party/openthread:openthread" ]
-
-    deps += [ "${chip_root}/third_party/openthread:openthread_cli" ]
-
-    sources += [
-      "${silabs_platform_dir}/ThreadStackManagerImpl.h",
-      "../../OpenThread/OpenThreadUtils.cpp",
-      "ConnectivityManagerImpl.cpp",
-      "ThreadStackManagerImpl.cpp",
-    ]
-
-    if (chip_mdns == "platform") {
-      sources += [ "../../OpenThread/DnssdImpl.cpp" ]
-      deps += [ "${chip_root}/src/lib/dnssd:platform_header" ]
-    }
-
-    public_configs = [
-      "${chip_root}/src/lib/address_resolve:default_address_resolve_config",
-    ]
-  }
 
   if (chip_enable_wifi) {
     sources += [
diff --git a/src/platform/silabs/SiWx917/CHIPCryptoPALPsaEfr32.cpp b/src/platform/silabs/SiWx917/CHIPCryptoPALPsaEfr32.cpp
deleted file mode 100644
index 13af1ae..0000000
--- a/src/platform/silabs/SiWx917/CHIPCryptoPALPsaEfr32.cpp
+++ /dev/null
@@ -1,1879 +0,0 @@
-/*
- *
- *    Copyright (c) 2020-2022 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.
- */
-
-/**
- *    @file
- *      PSA Crypto API based implementation of CHIP crypto primitives
- *      with Silicon Labs SDK modifications
- */
-
-#include <crypto/CHIPCryptoPAL.h>
-
-#include <type_traits>
-
-// Include version header to get configuration information
-#include <mbedtls/version.h>
-
-#if !defined(MBEDTLS_PSA_CRYPTO_C)
-#error "This implementation needs PSA Crypto"
-#endif
-
-#if !defined(MBEDTLS_USE_PSA_CRYPTO)
-#error "This implementation requires that PSA Crypto keys can be used for CSR generation"
-#endif
-
-#include "psa/crypto.h"
-
-// Go straight for the driver wrappers for speed on plaintext keys
-extern "C" {
-#include "psa_crypto_core.h"
-#include "psa_crypto_driver_wrappers.h"
-}
-
-// Includes needed for SPAKE2+ ECP operations
-#include <mbedtls/bignum.h>
-#include <mbedtls/ecp.h>
-
-// Includes needed for certificate parsing
-#if defined(MBEDTLS_X509_CRT_PARSE_C)
-#include <mbedtls/x509_crt.h>
-#endif // defined(MBEDTLS_X509_CRT_PARSE_C)
-#include <mbedtls/md.h>
-#include <mbedtls/x509.h>
-#include <mbedtls/x509_csr.h>
-
-#if defined(MBEDTLS_ERROR_C)
-#include <mbedtls/error.h>
-#endif // defined(MBEDTLS_ERROR_C)
-
-#include <lib/core/CHIPSafeCasts.h>
-#include <lib/support/BufferWriter.h>
-#include <lib/support/BytesToHex.h>
-#include <lib/support/CHIPArgParser.hpp>
-#include <lib/support/CHIPMem.h>
-#include <lib/support/CodeUtils.h>
-#include <lib/support/SafeInt.h>
-#include <lib/support/SafePointerCast.h>
-#include <lib/support/logging/CHIPLogging.h>
-
-#include <string.h>
-
-namespace chip {
-namespace Crypto {
-
-using chip::Platform::MemoryCalloc;
-using chip::Platform::MemoryFree;
-
-#define MAX_ERROR_STR_LEN 128
-#define NUM_BYTES_IN_SHA256_HASH 32
-
-// In mbedTLS 3.0.0 direct access to structure fields was replaced with using MBEDTLS_PRIVATE macro.
-#if (MBEDTLS_VERSION_NUMBER >= 0x03000000)
-#define CHIP_CRYPTO_PAL_PRIVATE(x) MBEDTLS_PRIVATE(x)
-#else
-#define CHIP_CRYPTO_PAL_PRIVATE(x) x
-#endif
-
-#if (MBEDTLS_VERSION_NUMBER >= 0x03000000 && MBEDTLS_VERSION_NUMBER < 0x03010000)
-#define CHIP_CRYPTO_PAL_PRIVATE_X509(x) MBEDTLS_PRIVATE(x)
-#else
-#define CHIP_CRYPTO_PAL_PRIVATE_X509(x) x
-#endif
-
-static void _log_mbedTLS_error(int error_code)
-{
-    if (error_code != 0)
-    {
-#if defined(MBEDTLS_ERROR_C)
-        char error_str[MAX_ERROR_STR_LEN];
-        mbedtls_strerror(error_code, error_str, sizeof(error_str));
-        ChipLogError(Crypto, "mbedTLS error: %s", error_str);
-#else
-        // Error codes defined in 16-bit negative hex numbers. Ease lookup by printing likewise
-        ChipLogError(Crypto, "mbedTLS error: -0x%04X", -static_cast<uint16_t>(error_code));
-#endif
-    }
-}
-
-static void _log_PSA_error(psa_status_t status)
-{
-    if (status != 0)
-    {
-        // Error codes defined in 16-bit negative hex numbers. Ease lookup by printing likewise
-        ChipLogError(Crypto, "PSA error: %ld", status);
-    }
-}
-
-static bool _isValidTagLength(size_t tag_length)
-{
-    if (tag_length == 8 || tag_length == 12 || tag_length == 16)
-    {
-        return true;
-    }
-    return false;
-}
-
-/**
- * @brief Compare two times
- *
- * @param t1 First time to compare
- * @param t2 Second time to compare
- * @return int  0 If both times are idential to the second, -1 if t1 < t2, 1 if t1 > t2.
- */
-static int timeCompare(mbedtls_x509_time * t1, mbedtls_x509_time * t2)
-{
-    VerifyOrReturnValue(t1->year >= t2->year, -1);
-    VerifyOrReturnValue(t1->year <= t2->year, 1);
-    // Same year
-    VerifyOrReturnValue(t1->mon >= t2->mon, -1);
-    VerifyOrReturnValue(t1->mon <= t2->mon, 1);
-    // Same month
-    VerifyOrReturnValue(t1->day >= t2->day, -1);
-    VerifyOrReturnValue(t1->day <= t2->day, 1);
-    // Same day
-    VerifyOrReturnValue(t1->hour >= t2->hour, -1);
-    VerifyOrReturnValue(t1->hour <= t2->hour, 1);
-    // Same hour
-    VerifyOrReturnValue(t1->min >= t2->min, -1);
-    VerifyOrReturnValue(t1->min <= t2->min, 1);
-    // Same minute
-    VerifyOrReturnValue(t1->sec >= t2->sec, -1);
-    VerifyOrReturnValue(t1->sec <= t2->sec, 1);
-    // Same second
-    return 0;
-}
-
-CHIP_ERROR AES_CCM_encrypt(const uint8_t * plaintext, size_t plaintext_length, const uint8_t * aad, size_t aad_length,
-                           const uint8_t * key, size_t key_length, const uint8_t * nonce, size_t nonce_length, uint8_t * ciphertext,
-                           uint8_t * tag, size_t tag_length)
-{
-    CHIP_ERROR error          = CHIP_NO_ERROR;
-    psa_status_t status       = PSA_ERROR_BAD_STATE;
-    psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
-    size_t output_length      = 0;
-    uint8_t * buffer          = nullptr;
-    bool allocated_buffer     = false;
-
-    VerifyOrExit(_isValidTagLength(tag_length), error = CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrExit(key_length == kAES_CCM128_Key_Length, error = CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrExit(key != nullptr, error = CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrExit(key_length == kAES_CCM128_Key_Length, error = CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrExit(nonce != nullptr, error = CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrExit(nonce_length > 0, error = CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrExit(CanCastTo<int>(nonce_length), error = CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrExit(tag != nullptr, error = CHIP_ERROR_INVALID_ARGUMENT);
-
-    // If the ciphertext and tag outputs aren't a contiguous buffer, the PSA API requires buffer copying
-    if (Uint8::to_uchar(ciphertext) + plaintext_length != Uint8::to_uchar(tag))
-    {
-        buffer           = (uint8_t *) MemoryCalloc(1, plaintext_length + tag_length);
-        allocated_buffer = true;
-        VerifyOrExit(buffer != nullptr, error = CHIP_ERROR_NO_MEMORY);
-    }
-
-    psa_crypto_init();
-
-    psa_set_key_type(&attr, PSA_KEY_TYPE_AES);
-    psa_set_key_bits(&attr, key_length * 8);
-    psa_set_key_algorithm(&attr, PSA_ALG_AEAD_WITH_AT_LEAST_THIS_LENGTH_TAG(PSA_ALG_CCM, 8));
-    psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_ENCRYPT);
-
-    status = psa_driver_wrapper_aead_encrypt(
-        &attr, Uint8::to_const_uchar(key), key_length, PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CCM, tag_length),
-        Uint8::to_const_uchar(nonce), nonce_length, Uint8::to_const_uchar(aad), aad_length, Uint8::to_const_uchar(plaintext),
-        plaintext_length, allocated_buffer ? buffer : ciphertext, plaintext_length + tag_length, &output_length);
-
-    VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL);
-    VerifyOrExit(output_length == plaintext_length + tag_length, error = CHIP_ERROR_INTERNAL);
-
-    if (allocated_buffer)
-    {
-        memcpy(Uint8::to_uchar(ciphertext), buffer, plaintext_length);
-        memcpy(Uint8::to_uchar(tag), buffer + plaintext_length, tag_length);
-        memset(buffer, 0, plaintext_length + tag_length);
-    }
-
-exit:
-    if (allocated_buffer)
-    {
-        MemoryFree(buffer);
-    }
-    psa_reset_key_attributes(&attr);
-    return error;
-}
-
-CHIP_ERROR AES_CCM_decrypt(const uint8_t * ciphertext, size_t ciphertext_len, const uint8_t * aad, size_t aad_len,
-                           const uint8_t * tag, size_t tag_length, const uint8_t * key, size_t key_length, const uint8_t * nonce,
-                           size_t nonce_length, uint8_t * plaintext)
-{
-    CHIP_ERROR error          = CHIP_NO_ERROR;
-    psa_status_t status       = PSA_ERROR_BAD_STATE;
-    psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
-    size_t output_length      = 0;
-    uint8_t * buffer          = nullptr;
-    bool allocated_buffer     = false;
-
-    VerifyOrExit(_isValidTagLength(tag_length), error = CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrExit(tag != nullptr, error = CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrExit(key != nullptr, error = CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrExit(key_length == kAES_CCM128_Key_Length, error = CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrExit(nonce != nullptr, error = CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrExit(nonce_length > 0, error = CHIP_ERROR_INVALID_ARGUMENT);
-
-    // If the ciphertext and tag outputs aren't a contiguous buffer, the PSA API requires buffer copying
-    if (Uint8::to_const_uchar(ciphertext) + ciphertext_len != Uint8::to_const_uchar(tag))
-    {
-        buffer           = (uint8_t *) MemoryCalloc(1, ciphertext_len + tag_length);
-        allocated_buffer = true;
-        VerifyOrExit(buffer != nullptr, error = CHIP_ERROR_NO_MEMORY);
-    }
-
-    psa_crypto_init();
-
-    psa_set_key_type(&attr, PSA_KEY_TYPE_AES);
-    psa_set_key_bits(&attr, key_length * 8);
-    psa_set_key_algorithm(&attr, PSA_ALG_AEAD_WITH_AT_LEAST_THIS_LENGTH_TAG(PSA_ALG_CCM, 8));
-    psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_DECRYPT);
-
-    if (allocated_buffer)
-    {
-        memcpy(buffer, ciphertext, ciphertext_len);
-        memcpy(buffer + ciphertext_len, tag, tag_length);
-    }
-
-    status = psa_driver_wrapper_aead_decrypt(
-        &attr, Uint8::to_const_uchar(key), key_length, PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CCM, tag_length),
-        Uint8::to_const_uchar(nonce), nonce_length, Uint8::to_const_uchar(aad), aad_len, allocated_buffer ? buffer : ciphertext,
-        ciphertext_len + tag_length, plaintext, ciphertext_len, &output_length);
-
-    if (allocated_buffer)
-    {
-        memset(buffer, 0, ciphertext_len + tag_length);
-    }
-
-    VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL);
-    VerifyOrExit(output_length == ciphertext_len, error = CHIP_ERROR_INTERNAL);
-exit:
-    if (allocated_buffer)
-    {
-        MemoryFree(buffer);
-    }
-
-    psa_reset_key_attributes(&attr);
-    return error;
-}
-
-CHIP_ERROR Hash_SHA256(const uint8_t * data, const size_t data_length, uint8_t * out_buffer)
-{
-    size_t output_length = 0;
-
-    psa_crypto_init();
-
-    const psa_status_t result =
-        psa_hash_compute(PSA_ALG_SHA_256, data, data_length, out_buffer, PSA_HASH_LENGTH(PSA_ALG_SHA_256), &output_length);
-
-    VerifyOrReturnError(result == PSA_SUCCESS, CHIP_ERROR_INTERNAL);
-    VerifyOrReturnError(output_length == PSA_HASH_LENGTH(PSA_ALG_SHA_256), CHIP_ERROR_INTERNAL);
-
-    return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR Hash_SHA1(const uint8_t * data, const size_t data_length, uint8_t * out_buffer)
-{
-    size_t output_length = 0;
-
-    psa_crypto_init();
-
-    const psa_status_t result =
-        psa_hash_compute(PSA_ALG_SHA_1, data, data_length, out_buffer, PSA_HASH_LENGTH(PSA_ALG_SHA_1), &output_length);
-
-    VerifyOrReturnError(result == PSA_SUCCESS, CHIP_ERROR_INTERNAL);
-    VerifyOrReturnError(output_length == PSA_HASH_LENGTH(PSA_ALG_SHA_1), CHIP_ERROR_INTERNAL);
-
-    return CHIP_NO_ERROR;
-}
-
-static_assert(kMAX_Hash_SHA256_Context_Size >= sizeof(psa_hash_operation_t),
-              "kMAX_Hash_SHA256_Context_Size is too small for the size of underlying psa_hash_operation_t");
-
-static inline psa_hash_operation_t * to_inner_hash_sha256_context(HashSHA256OpaqueContext * context)
-{
-    return SafePointerCast<psa_hash_operation_t *>(context);
-}
-
-Hash_SHA256_stream::Hash_SHA256_stream(void)
-{
-    psa_hash_operation_t * context             = to_inner_hash_sha256_context(&mContext);
-    const psa_hash_operation_t initial_context = PSA_HASH_OPERATION_INIT;
-    memcpy(context, &initial_context, sizeof(psa_hash_operation_t));
-}
-
-Hash_SHA256_stream::~Hash_SHA256_stream(void)
-{
-    psa_hash_operation_t * context = to_inner_hash_sha256_context(&mContext);
-    psa_hash_abort(context);
-    Clear();
-}
-
-CHIP_ERROR Hash_SHA256_stream::Begin(void)
-{
-    psa_crypto_init();
-
-    psa_hash_operation_t * context = to_inner_hash_sha256_context(&mContext);
-    *context                       = PSA_HASH_OPERATION_INIT;
-    const psa_status_t result      = psa_hash_setup(context, PSA_ALG_SHA_256);
-
-    VerifyOrReturnError(result == PSA_SUCCESS, CHIP_ERROR_INTERNAL);
-
-    return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR Hash_SHA256_stream::AddData(const ByteSpan data)
-{
-    psa_hash_operation_t * context = to_inner_hash_sha256_context(&mContext);
-    const psa_status_t result      = psa_hash_update(context, Uint8::to_const_uchar(data.data()), data.size());
-
-    VerifyOrReturnError(result == PSA_SUCCESS, CHIP_ERROR_INTERNAL);
-
-    return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR Hash_SHA256_stream::GetDigest(MutableByteSpan & out_buffer)
-{
-    CHIP_ERROR result              = CHIP_NO_ERROR;
-    psa_status_t status            = PSA_ERROR_BAD_STATE;
-    size_t output_length           = 0;
-    psa_hash_operation_t * context = to_inner_hash_sha256_context(&mContext);
-
-    VerifyOrReturnError(out_buffer.size() >= kSHA256_Hash_Length, CHIP_ERROR_BUFFER_TOO_SMALL);
-
-    // Clone the context first since calculating the digest finishes the operation
-    psa_hash_operation_t digest_context = PSA_HASH_OPERATION_INIT;
-    status                              = psa_hash_clone(context, &digest_context);
-
-    VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL);
-
-    // Calculate digest on the cloned context
-    status = psa_hash_finish(&digest_context, Uint8::to_uchar(out_buffer.data()), out_buffer.size(), &output_length);
-
-    VerifyOrExit(status == PSA_SUCCESS, result = CHIP_ERROR_INTERNAL);
-    VerifyOrExit(output_length == PSA_HASH_LENGTH(PSA_ALG_SHA_256), result = CHIP_ERROR_INTERNAL);
-exit:
-    psa_hash_abort(&digest_context);
-    return result;
-}
-
-CHIP_ERROR Hash_SHA256_stream::Finish(MutableByteSpan & out_buffer)
-{
-    psa_hash_operation_t * context = to_inner_hash_sha256_context(&mContext);
-    size_t output_length           = 0;
-
-    VerifyOrReturnError(out_buffer.size() >= kSHA256_Hash_Length, CHIP_ERROR_BUFFER_TOO_SMALL);
-    const psa_status_t status = psa_hash_finish(context, Uint8::to_uchar(out_buffer.data()), out_buffer.size(), &output_length);
-
-    VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL);
-    VerifyOrReturnError(output_length == PSA_HASH_LENGTH(PSA_ALG_SHA_256), CHIP_ERROR_INTERNAL);
-
-    return CHIP_NO_ERROR;
-}
-
-void Hash_SHA256_stream::Clear(void)
-{
-    psa_hash_operation_t * context = to_inner_hash_sha256_context(&mContext);
-    psa_hash_abort(context);
-}
-
-CHIP_ERROR HKDF_sha::HKDF_SHA256(const uint8_t * secret, const size_t secret_length, const uint8_t * salt, const size_t salt_length,
-                                 const uint8_t * info, const size_t info_length, uint8_t * out_buffer, size_t out_length)
-{
-    VerifyOrReturnError(secret != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrReturnError(secret_length > 0, CHIP_ERROR_INVALID_ARGUMENT);
-
-    // Salt is optional
-    if (salt_length > 0)
-    {
-        VerifyOrReturnError(salt != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
-    }
-
-    VerifyOrReturnError(info_length > 0, CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrReturnError(info != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrReturnError(out_length > 0, CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrReturnError(out_buffer != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
-
-    CHIP_ERROR error                         = CHIP_NO_ERROR;
-    psa_status_t status                      = PSA_ERROR_BAD_STATE;
-    psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
-
-    psa_crypto_init();
-
-    status = psa_key_derivation_setup(&operation, PSA_ALG_HKDF(PSA_ALG_SHA_256));
-    VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL);
-
-    if (salt_length > 0)
-    {
-        status =
-            psa_key_derivation_input_bytes(&operation, PSA_KEY_DERIVATION_INPUT_SALT, Uint8::to_const_uchar(salt), salt_length);
-        VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL);
-    }
-
-    status =
-        psa_key_derivation_input_bytes(&operation, PSA_KEY_DERIVATION_INPUT_SECRET, Uint8::to_const_uchar(secret), secret_length);
-    VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL);
-
-    status = psa_key_derivation_input_bytes(&operation, PSA_KEY_DERIVATION_INPUT_INFO, Uint8::to_const_uchar(info), info_length);
-    VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL);
-
-    status = psa_key_derivation_output_bytes(&operation, out_buffer, out_length);
-    VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL);
-exit:
-    psa_key_derivation_abort(&operation);
-
-    return error;
-}
-
-CHIP_ERROR HMAC_sha::HMAC_SHA256(const uint8_t * key, size_t key_length, const uint8_t * message, size_t message_length,
-                                 uint8_t * out_buffer, size_t out_length)
-{
-    VerifyOrReturnError(key != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrReturnError(key_length > 0, CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrReturnError(message != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrReturnError(message_length > 0, CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrReturnError(out_length >= kSHA256_Hash_Length, CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrReturnError(out_buffer != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
-
-    CHIP_ERROR error              = CHIP_NO_ERROR;
-    psa_status_t status           = PSA_ERROR_BAD_STATE;
-    psa_key_attributes_t attr     = PSA_KEY_ATTRIBUTES_INIT;
-    psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
-    size_t output_length          = 0;
-
-    psa_crypto_init();
-
-    psa_set_key_type(&attr, PSA_KEY_TYPE_HMAC);
-    psa_set_key_bits(&attr, key_length * 8);
-    psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_SIGN_HASH);
-    psa_set_key_algorithm(&attr, PSA_ALG_HMAC(PSA_ALG_SHA_256));
-
-    status = psa_driver_wrapper_mac_compute(&attr, Uint8::to_const_uchar(key), key_length, PSA_ALG_HMAC(PSA_ALG_SHA_256),
-                                            Uint8::to_const_uchar(message), message_length, out_buffer, out_length, &output_length);
-
-    VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL);
-    VerifyOrExit(output_length == PSA_HASH_LENGTH(PSA_ALG_SHA_256), error = CHIP_ERROR_INTERNAL);
-exit:
-    psa_mac_abort(&operation);
-    psa_reset_key_attributes(&attr);
-    return error;
-}
-
-CHIP_ERROR PBKDF2_sha256::pbkdf2_sha256(const uint8_t * password, size_t plen, const uint8_t * salt, size_t slen,
-                                        unsigned int iteration_count, uint32_t key_length, uint8_t * output)
-{
-    // TODO: replace inlined algorithm with usage of the PSA key derivation API once implemented
-    CHIP_ERROR error          = CHIP_NO_ERROR;
-    psa_status_t status       = PSA_ERROR_BAD_STATE;
-    psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
-    size_t output_length      = 0;
-
-    // Align these buffers on the native data size to speed up the XOR
-    static const size_t hash_size_in_native =
-        ((PSA_HASH_LENGTH(PSA_ALG_SHA_256) + sizeof(unsigned int) - 1) / sizeof(unsigned int));
-    static_assert(hash_size_in_native * sizeof(unsigned int) >= PSA_HASH_LENGTH(PSA_ALG_SHA_256));
-
-    unsigned int md1_buffer[hash_size_in_native];
-    unsigned int work_buffer[hash_size_in_native];
-    uint8_t * md1  = (uint8_t *) md1_buffer;
-    uint8_t * work = (uint8_t *) work_buffer;
-
-    size_t use_len;
-    unsigned char * out_p = output;
-    uint8_t * U1          = (uint8_t *) MemoryCalloc(1, slen + 4);
-
-    VerifyOrExit(U1 != nullptr, error = CHIP_ERROR_NO_MEMORY);
-    VerifyOrExit(password != nullptr, error = CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrExit(plen > 0, error = CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrExit(salt != nullptr, error = CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrExit(slen >= kSpake2p_Min_PBKDF_Salt_Length, error = CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrExit(slen <= kSpake2p_Max_PBKDF_Salt_Length, error = CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrExit(key_length > 0, error = CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrExit(output != nullptr, error = CHIP_ERROR_INVALID_ARGUMENT);
-
-    psa_crypto_init();
-
-    psa_set_key_type(&attr, PSA_KEY_TYPE_HMAC);
-    psa_set_key_bits(&attr, plen * 8);
-    psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_SIGN_HASH);
-    psa_set_key_algorithm(&attr, PSA_ALG_HMAC(PSA_ALG_SHA_256));
-
-    // Start with initializing the salt + counter
-    memcpy(U1, salt, slen);
-    U1[slen]     = 0;
-    U1[slen + 1] = 0;
-    U1[slen + 2] = 0;
-    U1[slen + 3] = 1;
-
-    // Loop until we have generated the requested key length
-    while (key_length)
-    {
-        // U1 ends up in work
-        status = psa_driver_wrapper_mac_compute(&attr, password, plen, PSA_ALG_HMAC(PSA_ALG_SHA_256), U1, slen + 4, work,
-                                                PSA_HASH_LENGTH(PSA_ALG_SHA_256), &output_length);
-
-        VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL);
-        VerifyOrExit(output_length == PSA_HASH_LENGTH(PSA_ALG_SHA_256), error = CHIP_ERROR_INTERNAL);
-
-        memcpy(md1, work, PSA_HASH_LENGTH(PSA_ALG_SHA_256));
-
-        for (size_t i = 1; i < iteration_count; i++)
-        {
-            // U2 ends up in md1
-            //
-
-            status = psa_driver_wrapper_mac_compute(&attr, password, plen, PSA_ALG_HMAC(PSA_ALG_SHA_256), md1, sizeof(md1_buffer),
-                                                    md1, sizeof(md1_buffer), &output_length);
-
-            VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL);
-            VerifyOrExit(output_length == PSA_HASH_LENGTH(PSA_ALG_SHA_256), error = CHIP_ERROR_INTERNAL);
-
-            // U1 xor U2
-            //
-            for (size_t j = 0; j < hash_size_in_native; j++)
-            {
-                work_buffer[j] ^= md1_buffer[j];
-            }
-        }
-
-        use_len = (key_length < PSA_HASH_LENGTH(PSA_ALG_SHA_256)) ? key_length : PSA_HASH_LENGTH(PSA_ALG_SHA_256);
-        memcpy(out_p, work, use_len);
-
-        key_length -= (uint32_t) use_len;
-        out_p += use_len;
-
-        for (size_t i = 4; i > 0; i--)
-        {
-            if (++U1[slen + i - 1] != 0)
-            {
-                break;
-            }
-        }
-    }
-
-exit:
-    MemoryFree(U1);
-    psa_reset_key_attributes(&attr);
-    return error;
-}
-
-CHIP_ERROR add_entropy_source(entropy_source fn_source, void * p_source, size_t threshold)
-{
-    // PSA Crypto has its own entropy and doesn't support an override mechanism
-    (void) fn_source;
-    (void) p_source;
-    (void) threshold;
-
-    return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR DRBG_get_bytes(uint8_t * out_buffer, const size_t out_length)
-{
-    VerifyOrReturnError(out_buffer != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrReturnError(out_length > 0, CHIP_ERROR_INVALID_ARGUMENT);
-
-    psa_crypto_init();
-    const psa_status_t result = psa_generate_random(Uint8::to_uchar(out_buffer), out_length);
-    VerifyOrReturnError(result == PSA_SUCCESS, CHIP_ERROR_INTERNAL);
-
-    return CHIP_NO_ERROR;
-}
-
-// CryptoRNG's definition is needed to use the mbedTLS-backed SPAKE2+ and certificate operations
-static int CryptoRNG(void * ctxt, uint8_t * out_buffer, size_t out_length)
-{
-    return (chip::Crypto::DRBG_get_bytes(out_buffer, out_length) == CHIP_NO_ERROR) ? 0 : 1;
-}
-
-// Mapping function is used as part of the certificate operations
-mbedtls_ecp_group_id MapECPGroupId(SupportedECPKeyTypes keyType)
-{
-    switch (keyType)
-    {
-    case SupportedECPKeyTypes::ECP256R1:
-        return MBEDTLS_ECP_DP_SECP256R1;
-    default:
-        return MBEDTLS_ECP_DP_NONE;
-    }
-}
-
-/*******************************************************************************
- *
- * WARNING: The default (base) implementation of P256Keypair is UNSAFE!
- *
- * Because of the way CHIPCryptoPAL has evolved, it is dictating how a base
- * P256Keypair should behave. This includes:
- *      * Allowing using a P256 key for both ECDSA and ECDH operations
- *      * Needing to support copying a key through Serialize()/Deserialize()
- *        operations. This can't easily be done opaquely on an opaque backend
- *        without convoluted forms of reference tracking.
- *      * Not including a way to figure out whether the created key is supposed
- *        to be ephemeral or long-lived.
- *      * Needing to support ingestion of specific-format keys through
- *        Deserialize() (to support e.g. the example DAC provider).
- *
- * These conditions have lead to the base implementation of this class in this
- * crypto backend being backed by a plaintext key buffer instead of opaque key
- * references. Usage of the base class is strongly discouraged, and is only
- * implemented to support the in-tree examples which instantiate keys of this
- * base class.
- *
- ******************************************************************************/
-
-typedef struct
-{
-    uint8_t privkey[32];
-    size_t bitlen;
-} psa_plaintext_ecp_keypair;
-
-static inline psa_plaintext_ecp_keypair * to_keypair(P256KeypairContext * context)
-{
-    return SafePointerCast<psa_plaintext_ecp_keypair *>(context);
-}
-
-static inline const psa_plaintext_ecp_keypair * to_const_keypair(const P256KeypairContext * context)
-{
-    return SafePointerCast<const psa_plaintext_ecp_keypair *>(context);
-}
-
-CHIP_ERROR P256Keypair::ECDSA_sign_msg(const uint8_t * msg, const size_t msg_length, P256ECDSASignature & out_signature) const
-{
-    CHIP_ERROR error                          = CHIP_NO_ERROR;
-    psa_status_t status                       = PSA_ERROR_BAD_STATE;
-    psa_key_attributes_t attr                 = PSA_KEY_ATTRIBUTES_INIT;
-    size_t output_length                      = 0;
-    const psa_plaintext_ecp_keypair * keypair = to_const_keypair(&mKeypair);
-
-    VerifyOrExit(mInitialized, error = CHIP_ERROR_WELL_UNINITIALIZED);
-    VerifyOrExit((msg != nullptr) && (msg_length > 0), error = CHIP_ERROR_INVALID_ARGUMENT);
-
-    psa_crypto_init();
-
-    psa_set_key_type(&attr, PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_R1));
-    psa_set_key_bits(&attr, keypair->bitlen);
-    psa_set_key_algorithm(&attr, PSA_ALG_ECDSA(PSA_ALG_SHA_256));
-    psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_SIGN_MESSAGE);
-
-    // use imported key to sign a message
-    status =
-        psa_driver_wrapper_sign_message(&attr, keypair->privkey, PSA_BITS_TO_BYTES(keypair->bitlen), PSA_ALG_ECDSA(PSA_ALG_SHA_256),
-                                        msg, msg_length, out_signature.Bytes(), out_signature.Capacity(), &output_length);
-
-    VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL);
-    VerifyOrReturnError(output_length == kP256_ECDSA_Signature_Length_Raw, CHIP_ERROR_INTERNAL);
-    VerifyOrReturnError(out_signature.SetLength(output_length) == CHIP_NO_ERROR, CHIP_ERROR_INTERNAL);
-
-exit:
-    _log_PSA_error(status);
-    psa_reset_key_attributes(&attr);
-
-    return error;
-}
-
-CHIP_ERROR P256PublicKey::ECDSA_validate_msg_signature(const uint8_t * msg, const size_t msg_length,
-                                                       const P256ECDSASignature & signature) const
-{
-    CHIP_ERROR error          = CHIP_NO_ERROR;
-    psa_status_t status       = PSA_ERROR_BAD_STATE;
-    psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
-
-    VerifyOrExit((msg != nullptr) && (msg_length > 0), error = CHIP_ERROR_INVALID_ARGUMENT);
-
-    psa_crypto_init();
-
-    psa_set_key_type(&attr, PSA_KEY_TYPE_ECC_PUBLIC_KEY(PSA_ECC_FAMILY_SECP_R1));
-    psa_set_key_bits(&attr, 256);
-    psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_VERIFY_MESSAGE);
-    psa_set_key_algorithm(&attr, PSA_ALG_ECDSA(PSA_ALG_SHA_256));
-
-    // use imported key to verify a message
-    status = psa_driver_wrapper_verify_message(&attr, Uint8::to_const_uchar(*this), Length(), PSA_ALG_ECDSA(PSA_ALG_SHA_256), msg,
-                                               msg_length, signature.ConstBytes(), signature.Length());
-
-    VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INVALID_SIGNATURE);
-exit:
-    _log_PSA_error(status);
-    psa_reset_key_attributes(&attr);
-
-    return error;
-}
-
-CHIP_ERROR P256PublicKey::ECDSA_validate_hash_signature(const uint8_t * hash, const size_t hash_length,
-                                                        const P256ECDSASignature & signature) const
-{
-    VerifyOrReturnError(hash != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrReturnError(hash_length == kSHA256_Hash_Length, CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrReturnError(signature.Length() == kP256_ECDSA_Signature_Length_Raw, CHIP_ERROR_INVALID_ARGUMENT);
-
-    CHIP_ERROR error          = CHIP_NO_ERROR;
-    psa_status_t status       = PSA_ERROR_BAD_STATE;
-    psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
-
-    // Step 1: import public key as volatile
-    psa_crypto_init();
-
-    psa_set_key_type(&attr, PSA_KEY_TYPE_ECC_PUBLIC_KEY(PSA_ECC_FAMILY_SECP_R1));
-    psa_set_key_bits(&attr, 256);
-    psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_VERIFY_HASH);
-    psa_set_key_algorithm(&attr, PSA_ALG_ECDSA(PSA_ALG_SHA_256));
-
-    // use imported key to verify a hash
-    status = psa_driver_wrapper_verify_hash(&attr, Uint8::to_const_uchar(*this), Length(), PSA_ALG_ECDSA(PSA_ALG_SHA_256), hash,
-                                            hash_length, signature.ConstBytes(), signature.Length());
-
-    VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INVALID_SIGNATURE);
-exit:
-    _log_PSA_error(status);
-    psa_reset_key_attributes(&attr);
-    return error;
-}
-
-CHIP_ERROR P256Keypair::ECDH_derive_secret(const P256PublicKey & remote_public_key, P256ECDHDerivedSecret & out_secret) const
-{
-    // Todo: replace with driver call once key derivation through the driver wrapper has been figured out
-    CHIP_ERROR error                          = CHIP_NO_ERROR;
-    psa_status_t status                       = PSA_ERROR_BAD_STATE;
-    mbedtls_svc_key_id_t key_id               = 0;
-    psa_key_attributes_t attr                 = PSA_KEY_ATTRIBUTES_INIT;
-    size_t output_length                      = 0;
-    const psa_plaintext_ecp_keypair * keypair = to_const_keypair(&mKeypair);
-
-    VerifyOrExit(mInitialized, error = CHIP_ERROR_WELL_UNINITIALIZED);
-
-    // Step 1: import plaintext key as volatile for ECDH
-    psa_crypto_init();
-
-    psa_set_key_type(&attr, PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_R1));
-    psa_set_key_bits(&attr, keypair->bitlen);
-    psa_set_key_algorithm(&attr, PSA_ALG_ECDH);
-    psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_DERIVE);
-
-    status = psa_import_key(&attr, keypair->privkey, PSA_BITS_TO_BYTES(keypair->bitlen), &key_id);
-
-    VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL);
-
-    // Step 2: do key derivation
-    status = psa_raw_key_agreement(PSA_ALG_ECDH, key_id, Uint8::to_const_uchar(remote_public_key), remote_public_key.Length(),
-                                   Uint8::to_uchar(out_secret),
-                                   (out_secret.Length() == 0) ? out_secret.Capacity() : out_secret.Length(), &output_length);
-
-    VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL);
-    SuccessOrExit(out_secret.SetLength(output_length));
-
-exit:
-    _log_PSA_error(status);
-    // Step 3: destroy imported key
-    psa_reset_key_attributes(&attr);
-    if (key_id != 0)
-    {
-        psa_destroy_key(key_id);
-    }
-    return error;
-}
-
-void ClearSecretData(uint8_t * buf, size_t len)
-{
-    mbedtls_platform_zeroize(buf, len);
-}
-
-// THE BELOW IS FROM `third_party/openthread/repo/third_party/mbedtls/repo/library/constant_time.c` since
-// mbedtls_ct_memcmp is not available on Linux somehow :(
-int mbedtls_ct_memcmp_copy(const void * a, const void * b, size_t n)
-{
-    size_t i;
-    volatile const unsigned char * A = (volatile const unsigned char *) a;
-    volatile const unsigned char * B = (volatile const unsigned char *) b;
-    volatile unsigned char diff      = 0;
-
-    for (i = 0; i < n; i++)
-    {
-        /* Read volatile data in order before computing diff.
-         * This avoids IAR compiler warning:
-         * 'the order of volatile accesses is undefined ..' */
-        unsigned char x = A[i], y = B[i];
-        diff |= x ^ y;
-    }
-
-    return ((int) diff);
-}
-
-bool IsBufferContentEqualConstantTime(const void * a, const void * b, size_t n)
-{
-    return mbedtls_ct_memcmp_copy(a, b, n) == 0;
-}
-
-CHIP_ERROR P256Keypair::Initialize()
-{
-    CHIP_ERROR error                    = CHIP_NO_ERROR;
-    psa_status_t status                 = PSA_ERROR_BAD_STATE;
-    psa_plaintext_ecp_keypair * keypair = to_keypair(&mKeypair);
-    size_t output_length;
-
-    if (mInitialized)
-    {
-        return CHIP_ERROR_INCORRECT_STATE;
-    }
-
-    // Step 1: Generate a volatile new key
-    psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
-    psa_crypto_init();
-
-    psa_set_key_type(&attr, PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_R1));
-    psa_set_key_bits(&attr, 256);
-    psa_set_key_algorithm(&attr, PSA_ALG_ECDH);
-    psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_DERIVE | PSA_KEY_USAGE_EXPORT);
-
-    status = psa_driver_wrapper_generate_key(&attr, keypair->privkey, sizeof(keypair->privkey), &output_length);
-
-    VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL);
-    VerifyOrExit(output_length == kP256_PrivateKey_Length, error = CHIP_ERROR_INTERNAL);
-
-    keypair->bitlen = 256;
-
-    // Step 2: Export the public key into the pubkey member
-    status = psa_driver_wrapper_export_public_key(&attr, keypair->privkey, sizeof(keypair->privkey), Uint8::to_uchar(mPublicKey),
-                                                  mPublicKey.Length(), &output_length);
-
-    VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL);
-    VerifyOrExit(output_length == kP256_PublicKey_Length, error = CHIP_ERROR_INTERNAL);
-
-exit:
-    _log_PSA_error(status);
-    if (error == CHIP_NO_ERROR)
-    {
-        mInitialized = true;
-    }
-    psa_reset_key_attributes(&attr);
-
-    return error;
-}
-
-CHIP_ERROR P256Keypair::Serialize(P256SerializedKeypair & output) const
-{
-    CHIP_ERROR error                          = CHIP_NO_ERROR;
-    const psa_plaintext_ecp_keypair * keypair = to_const_keypair(&mKeypair);
-    size_t len                                = output.Length() == 0 ? output.Capacity() : output.Length();
-    Encoding::BufferWriter bbuf(output, len);
-
-    VerifyOrExit(mInitialized, error = CHIP_ERROR_WELL_UNINITIALIZED);
-
-    bbuf.Put(mPublicKey, mPublicKey.Length());
-
-    VerifyOrExit(bbuf.Available() == sizeof(keypair->privkey), error = CHIP_ERROR_INTERNAL);
-
-    bbuf.Put(keypair->privkey, PSA_BITS_TO_BYTES(keypair->bitlen));
-    VerifyOrExit(bbuf.Fit(), error = CHIP_ERROR_BUFFER_TOO_SMALL);
-
-    output.SetLength(bbuf.Needed());
-
-exit:
-    return error;
-}
-
-CHIP_ERROR P256Keypair::Deserialize(P256SerializedKeypair & input)
-{
-    CHIP_ERROR error                    = CHIP_NO_ERROR;
-    psa_plaintext_ecp_keypair * keypair = to_keypair(&mKeypair);
-    Encoding::BufferWriter bbuf(mPublicKey, mPublicKey.Length());
-
-    VerifyOrExit(input.Length() == mPublicKey.Length() + kP256_PrivateKey_Length, error = CHIP_ERROR_INVALID_ARGUMENT);
-
-    Clear();
-
-    memcpy(keypair->privkey, Uint8::to_uchar(input) + mPublicKey.Length(), kP256_PrivateKey_Length);
-    keypair->bitlen = 256;
-
-    bbuf.Put((const uint8_t *) input, mPublicKey.Length());
-    VerifyOrExit(bbuf.Fit(), error = CHIP_ERROR_NO_MEMORY);
-
-    mInitialized = true;
-
-exit:
-    return error;
-}
-
-void P256Keypair::Clear()
-{
-    if (mInitialized)
-    {
-        psa_plaintext_ecp_keypair * keypair = to_keypair(&mKeypair);
-        memset(keypair, 0, sizeof(psa_plaintext_ecp_keypair));
-        mInitialized = false;
-    }
-}
-
-P256Keypair::~P256Keypair()
-{
-    Clear();
-}
-
-CHIP_ERROR P256Keypair::NewCertificateSigningRequest(uint8_t * out_csr, size_t & csr_length) const
-{
-    MutableByteSpan csr(out_csr, csr_length);
-    CHIP_ERROR err = GenerateCertificateSigningRequest(this, csr);
-    csr_length     = (CHIP_NO_ERROR == err) ? csr.size() : 0;
-    return err;
-}
-
-CHIP_ERROR VerifyCertificateSigningRequest(const uint8_t * csr_buf, size_t csr_length, P256PublicKey & pubkey)
-{
-#if defined(MBEDTLS_X509_CSR_PARSE_C)
-    ReturnErrorOnFailure(VerifyCertificateSigningRequestFormat(csr_buf, csr_length));
-
-    // TODO: For some embedded targets, mbedTLS library doesn't have mbedtls_x509_csr_parse_der, and mbedtls_x509_csr_parse_free.
-    //       Taking a step back, embedded targets likely will not process CSR requests. Adding this action item to reevaluate
-    //       this if there's a need for this processing for embedded targets.
-    CHIP_ERROR error   = CHIP_NO_ERROR;
-    size_t pubkey_size = 0;
-
-    mbedtls_ecp_keypair * keypair = nullptr;
-
-    P256ECDSASignature signature;
-    MutableByteSpan out_raw_sig_span(signature.Bytes(), signature.Capacity());
-
-    mbedtls_x509_csr csr;
-    mbedtls_x509_csr_init(&csr);
-
-    int result = mbedtls_x509_csr_parse_der(&csr, csr_buf, csr_length);
-    VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
-    // Verify the signature algorithm and public key type
-    VerifyOrExit(csr.CHIP_CRYPTO_PAL_PRIVATE(sig_md) == MBEDTLS_MD_SHA256, error = CHIP_ERROR_UNSUPPORTED_SIGNATURE_TYPE);
-    VerifyOrExit(csr.CHIP_CRYPTO_PAL_PRIVATE(sig_pk) == MBEDTLS_PK_ECDSA, error = CHIP_ERROR_WRONG_KEY_TYPE);
-
-    keypair = mbedtls_pk_ec(csr.CHIP_CRYPTO_PAL_PRIVATE_X509(pk));
-
-    // Copy the public key from the CSR
-    result = mbedtls_ecp_point_write_binary(&keypair->CHIP_CRYPTO_PAL_PRIVATE(grp), &keypair->CHIP_CRYPTO_PAL_PRIVATE(Q),
-                                            MBEDTLS_ECP_PF_UNCOMPRESSED, &pubkey_size, Uint8::to_uchar(pubkey), pubkey.Length());
-
-    VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-    VerifyOrExit(pubkey_size == pubkey.Length(), error = CHIP_ERROR_INTERNAL);
-
-    // Convert DER signature to raw signature
-    error = EcdsaAsn1SignatureToRaw(kP256_FE_Length,
-                                    ByteSpan{ csr.CHIP_CRYPTO_PAL_PRIVATE(sig).CHIP_CRYPTO_PAL_PRIVATE_X509(p),
-                                              csr.CHIP_CRYPTO_PAL_PRIVATE(sig).CHIP_CRYPTO_PAL_PRIVATE_X509(len) },
-                                    out_raw_sig_span);
-
-    VerifyOrExit(error == CHIP_NO_ERROR, error = CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrExit(out_raw_sig_span.size() == (kP256_FE_Length * 2), error = CHIP_ERROR_INTERNAL);
-    signature.SetLength(out_raw_sig_span.size());
-
-    // Verify the signature using the public key
-    error = pubkey.ECDSA_validate_msg_signature(csr.CHIP_CRYPTO_PAL_PRIVATE_X509(cri).CHIP_CRYPTO_PAL_PRIVATE_X509(p),
-                                                csr.CHIP_CRYPTO_PAL_PRIVATE_X509(cri).CHIP_CRYPTO_PAL_PRIVATE_X509(len), signature);
-
-    SuccessOrExit(error);
-
-exit:
-    mbedtls_x509_csr_free(&csr);
-    _log_mbedTLS_error(result);
-    return error;
-#else
-    ChipLogError(Crypto, "MBEDTLS_X509_CSR_PARSE_C is not enabled. CSR cannot be parsed");
-    return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
-#endif
-}
-
-typedef struct Spake2p_Context
-{
-    mbedtls_ecp_group curve;
-    mbedtls_ecp_point M;
-    mbedtls_ecp_point N;
-    mbedtls_ecp_point X;
-    mbedtls_ecp_point Y;
-    mbedtls_ecp_point L;
-    mbedtls_ecp_point Z;
-    mbedtls_ecp_point V;
-
-    mbedtls_mpi w0;
-    mbedtls_mpi w1;
-    mbedtls_mpi xy;
-    mbedtls_mpi tempbn;
-} Spake2p_Context;
-
-static inline Spake2p_Context * to_inner_spake2p_context(Spake2pOpaqueContext * context)
-{
-    return SafePointerCast<Spake2p_Context *>(context);
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::InitInternal(void)
-{
-    CHIP_ERROR error = CHIP_NO_ERROR;
-    int result       = 0;
-
-    Spake2p_Context * context = to_inner_spake2p_context(&mSpake2pContext);
-
-    memset(context, 0, sizeof(Spake2p_Context));
-
-    mbedtls_ecp_group_init(&context->curve);
-    result = mbedtls_ecp_group_load(&context->curve, MBEDTLS_ECP_DP_SECP256R1);
-    VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
-    VerifyOrExit(mbedtls_md_info_from_type(MBEDTLS_MD_SHA256) != nullptr, error = CHIP_ERROR_INTERNAL);
-
-    mbedtls_ecp_point_init(&context->M);
-    mbedtls_ecp_point_init(&context->N);
-    mbedtls_ecp_point_init(&context->X);
-    mbedtls_ecp_point_init(&context->Y);
-    mbedtls_ecp_point_init(&context->L);
-    mbedtls_ecp_point_init(&context->V);
-    mbedtls_ecp_point_init(&context->Z);
-    M = &context->M;
-    N = &context->N;
-    X = &context->X;
-    Y = &context->Y;
-    L = &context->L;
-    V = &context->V;
-    Z = &context->Z;
-
-    mbedtls_mpi_init(&context->w0);
-    mbedtls_mpi_init(&context->w1);
-    mbedtls_mpi_init(&context->xy);
-    mbedtls_mpi_init(&context->tempbn);
-    w0     = &context->w0;
-    w1     = &context->w1;
-    xy     = &context->xy;
-    tempbn = &context->tempbn;
-
-    G     = &context->curve.G;
-    order = &context->curve.N;
-
-    return error;
-
-exit:
-    _log_mbedTLS_error(result);
-    Clear();
-    return error;
-}
-
-void Spake2p_P256_SHA256_HKDF_HMAC::Clear()
-{
-    VerifyOrReturn(state != CHIP_SPAKE2P_STATE::PREINIT);
-
-    Spake2p_Context * context = to_inner_spake2p_context(&mSpake2pContext);
-
-    mbedtls_ecp_point_free(&context->M);
-    mbedtls_ecp_point_free(&context->N);
-    mbedtls_ecp_point_free(&context->X);
-    mbedtls_ecp_point_free(&context->Y);
-    mbedtls_ecp_point_free(&context->L);
-    mbedtls_ecp_point_free(&context->Z);
-    mbedtls_ecp_point_free(&context->V);
-
-    mbedtls_mpi_free(&context->w0);
-    mbedtls_mpi_free(&context->w1);
-    mbedtls_mpi_free(&context->xy);
-    mbedtls_mpi_free(&context->tempbn);
-
-    mbedtls_ecp_group_free(&context->curve);
-
-    state = CHIP_SPAKE2P_STATE::PREINIT;
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::Mac(const uint8_t * key, size_t key_len, const uint8_t * in, size_t in_len,
-                                              MutableByteSpan & out_span)
-{
-    HMAC_sha hmac;
-    VerifyOrReturnError(out_span.size() >= kSHA256_Hash_Length, CHIP_ERROR_BUFFER_TOO_SMALL);
-    ReturnErrorOnFailure(hmac.HMAC_SHA256(key, key_len, in, in_len, out_span.data(), kSHA256_Hash_Length));
-    out_span = out_span.SubSpan(0, kSHA256_Hash_Length);
-    return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::MacVerify(const uint8_t * key, size_t key_len, const uint8_t * mac, size_t mac_len,
-                                                    const uint8_t * in, size_t in_len)
-{
-    CHIP_ERROR error = CHIP_NO_ERROR;
-    int result       = 0;
-
-    uint8_t computed_mac[kSHA256_Hash_Length];
-    MutableByteSpan computed_mac_span{ computed_mac };
-    VerifyOrExit(mac_len == kSHA256_Hash_Length, error = CHIP_ERROR_INVALID_ARGUMENT);
-
-    SuccessOrExit(error = Mac(key, key_len, in, in_len, computed_mac_span));
-    VerifyOrExit(computed_mac_span.size() == mac_len, error = CHIP_ERROR_INTERNAL);
-
-    VerifyOrExit(IsBufferContentEqualConstantTime(mac, computed_mac, kSHA256_Hash_Length), error = CHIP_ERROR_INTERNAL);
-
-exit:
-    _log_mbedTLS_error(result);
-    return error;
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::FELoad(const uint8_t * in, size_t in_len, void * fe)
-{
-    CHIP_ERROR error = CHIP_NO_ERROR;
-    int result       = 0;
-
-    result = mbedtls_mpi_read_binary((mbedtls_mpi *) fe, Uint8::to_const_uchar(in), in_len);
-    VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
-    result = mbedtls_mpi_mod_mpi((mbedtls_mpi *) fe, (mbedtls_mpi *) fe, (const mbedtls_mpi *) order);
-    VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
-exit:
-    _log_mbedTLS_error(result);
-    return error;
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::FEWrite(const void * fe, uint8_t * out, size_t out_len)
-{
-    if (mbedtls_mpi_write_binary((const mbedtls_mpi *) fe, Uint8::to_uchar(out), out_len) != 0)
-    {
-        return CHIP_ERROR_INTERNAL;
-    }
-    return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::FEGenerate(void * fe)
-{
-    CHIP_ERROR error = CHIP_NO_ERROR;
-    int result       = 0;
-
-    Spake2p_Context * context = to_inner_spake2p_context(&mSpake2pContext);
-
-    result = mbedtls_ecp_gen_privkey(&context->curve, (mbedtls_mpi *) fe, CryptoRNG, nullptr);
-    VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
-exit:
-    _log_mbedTLS_error(result);
-    return error;
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::FEMul(void * fer, const void * fe1, const void * fe2)
-{
-    CHIP_ERROR error = CHIP_NO_ERROR;
-    int result       = 0;
-
-    result = mbedtls_mpi_mul_mpi((mbedtls_mpi *) fer, (const mbedtls_mpi *) fe1, (const mbedtls_mpi *) fe2);
-    VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
-    result = mbedtls_mpi_mod_mpi((mbedtls_mpi *) fer, (mbedtls_mpi *) fer, (const mbedtls_mpi *) order);
-    VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
-exit:
-    _log_mbedTLS_error(result);
-    return error;
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::PointLoad(const uint8_t * in, size_t in_len, void * R)
-{
-    Spake2p_Context * context = to_inner_spake2p_context(&mSpake2pContext);
-
-    if (mbedtls_ecp_point_read_binary(&context->curve, (mbedtls_ecp_point *) R, Uint8::to_const_uchar(in), in_len) != 0)
-    {
-        return CHIP_ERROR_INTERNAL;
-    }
-
-    return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::PointWrite(const void * R, uint8_t * out, size_t out_len)
-{
-    memset(out, 0, out_len);
-
-    size_t mbedtls_out_len = out_len;
-
-    Spake2p_Context * context = to_inner_spake2p_context(&mSpake2pContext);
-
-    if (mbedtls_ecp_point_write_binary(&context->curve, (const mbedtls_ecp_point *) R, MBEDTLS_ECP_PF_UNCOMPRESSED,
-                                       &mbedtls_out_len, Uint8::to_uchar(out), out_len) != 0)
-    {
-        return CHIP_ERROR_INTERNAL;
-    }
-
-    return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::PointMul(void * R, const void * P1, const void * fe1)
-{
-    Spake2p_Context * context = to_inner_spake2p_context(&mSpake2pContext);
-
-    if (mbedtls_ecp_mul(&context->curve, (mbedtls_ecp_point *) R, (const mbedtls_mpi *) fe1, (const mbedtls_ecp_point *) P1,
-                        CryptoRNG, nullptr) != 0)
-    {
-        return CHIP_ERROR_INTERNAL;
-    }
-
-    return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::PointAddMul(void * R, const void * P1, const void * fe1, const void * P2,
-                                                      const void * fe2)
-{
-    Spake2p_Context * context = to_inner_spake2p_context(&mSpake2pContext);
-
-    if (mbedtls_ecp_muladd(&context->curve, (mbedtls_ecp_point *) R, (const mbedtls_mpi *) fe1, (const mbedtls_ecp_point *) P1,
-                           (const mbedtls_mpi *) fe2, (const mbedtls_ecp_point *) P2) != 0)
-    {
-        return CHIP_ERROR_INTERNAL;
-    }
-
-    return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::PointInvert(void * R)
-{
-    mbedtls_ecp_point * Rp    = (mbedtls_ecp_point *) R;
-    Spake2p_Context * context = to_inner_spake2p_context(&mSpake2pContext);
-
-    if (mbedtls_mpi_sub_mpi(&Rp->CHIP_CRYPTO_PAL_PRIVATE(Y), &context->curve.P, &Rp->CHIP_CRYPTO_PAL_PRIVATE(Y)) != 0)
-    {
-        return CHIP_ERROR_INTERNAL;
-    }
-
-    return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::PointCofactorMul(void * R)
-{
-    return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::ComputeL(uint8_t * Lout, size_t * L_len, const uint8_t * w1in, size_t w1in_len)
-{
-    CHIP_ERROR error = CHIP_NO_ERROR;
-    int result       = 0;
-
-    mbedtls_ecp_group curve;
-    mbedtls_mpi w1_bn;
-    mbedtls_ecp_point Ltemp;
-
-    mbedtls_ecp_group_init(&curve);
-    mbedtls_mpi_init(&w1_bn);
-    mbedtls_ecp_point_init(&Ltemp);
-
-    result = mbedtls_ecp_group_load(&curve, MBEDTLS_ECP_DP_SECP256R1);
-    VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
-    result = mbedtls_mpi_read_binary(&w1_bn, Uint8::to_const_uchar(w1in), w1in_len);
-    VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
-    result = mbedtls_mpi_mod_mpi(&w1_bn, &w1_bn, &curve.N);
-    VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
-    result = mbedtls_ecp_mul(&curve, &Ltemp, &w1_bn, &curve.G, CryptoRNG, nullptr);
-    VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
-    memset(Lout, 0, *L_len);
-
-    result = mbedtls_ecp_point_write_binary(&curve, &Ltemp, MBEDTLS_ECP_PF_UNCOMPRESSED, L_len, Uint8::to_uchar(Lout), *L_len);
-    VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
-exit:
-    _log_mbedTLS_error(result);
-    mbedtls_ecp_point_free(&Ltemp);
-    mbedtls_mpi_free(&w1_bn);
-    mbedtls_ecp_group_free(&curve);
-
-    return error;
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::PointIsValid(void * R)
-{
-    Spake2p_Context * context = to_inner_spake2p_context(&mSpake2pContext);
-
-    if (mbedtls_ecp_check_pubkey(&context->curve, (mbedtls_ecp_point *) R) != 0)
-    {
-        return CHIP_ERROR_INTERNAL;
-    }
-
-    return CHIP_NO_ERROR;
-}
-
-constexpr uint8_t sOID_AttributeType_CommonName[]         = { 0x55, 0x04, 0x03 };
-constexpr uint8_t sOID_AttributeType_MatterVendorId[]     = { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0xA2, 0x7C, 0x02, 0x01 };
-constexpr uint8_t sOID_AttributeType_MatterProductId[]    = { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0xA2, 0x7C, 0x02, 0x02 };
-constexpr uint8_t sOID_SigAlgo_ECDSAWithSHA256[]          = { 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x02 };
-constexpr uint8_t sOID_Extension_BasicConstraints[]       = { 0x55, 0x1D, 0x13 };
-constexpr uint8_t sOID_Extension_KeyUsage[]               = { 0x55, 0x1D, 0x0F };
-constexpr uint8_t sOID_Extension_SubjectKeyIdentifier[]   = { 0x55, 0x1D, 0x0E };
-constexpr uint8_t sOID_Extension_AuthorityKeyIdentifier[] = { 0x55, 0x1D, 0x23 };
-
-/**
- * Compares an mbedtls_asn1_buf structure (oidBuf) to a reference OID represented as uint8_t array (oid).
- */
-#define OID_CMP(oid, oidBuf)                                                                                                       \
-    ((MBEDTLS_ASN1_OID == (oidBuf).CHIP_CRYPTO_PAL_PRIVATE_X509(tag)) &&                                                           \
-     (sizeof(oid) == (oidBuf).CHIP_CRYPTO_PAL_PRIVATE_X509(len)) &&                                                                \
-     (memcmp((oid), (oidBuf).CHIP_CRYPTO_PAL_PRIVATE_X509(p), (oidBuf).CHIP_CRYPTO_PAL_PRIVATE_X509(len)) == 0))
-
-CHIP_ERROR VerifyAttestationCertificateFormat(const ByteSpan & cert, AttestationCertType certType)
-{
-#if defined(MBEDTLS_X509_CRT_PARSE_C)
-    CHIP_ERROR error = CHIP_NO_ERROR;
-    int result       = 0;
-    mbedtls_x509_crt mbed_cert;
-    unsigned char * p         = nullptr;
-    const unsigned char * end = nullptr;
-    size_t len                = 0;
-    bool extBasicPresent      = false;
-    bool extKeyUsagePresent   = false;
-
-    VerifyOrReturnError(!cert.empty(), CHIP_ERROR_INVALID_ARGUMENT);
-
-    mbedtls_x509_crt_init(&mbed_cert);
-
-    result = mbedtls_x509_crt_parse(&mbed_cert, Uint8::to_const_uchar(cert.data()), cert.size());
-    VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
-    // "version" value is 1 higher than the actual encoded value.
-    VerifyOrExit(mbed_cert.CHIP_CRYPTO_PAL_PRIVATE_X509(version) - 1 == 2, error = CHIP_ERROR_INTERNAL);
-
-    // Verify signature algorithms is ECDSA with SHA256.
-    VerifyOrExit(OID_CMP(sOID_SigAlgo_ECDSAWithSHA256, mbed_cert.CHIP_CRYPTO_PAL_PRIVATE_X509(sig_oid)),
-                 error = CHIP_ERROR_INTERNAL);
-
-    // Verify public key presence and format.
-    {
-        Crypto::P256PublicKey pubkey;
-        SuccessOrExit(error = ExtractPubkeyFromX509Cert(cert, pubkey));
-    }
-
-    p      = mbed_cert.CHIP_CRYPTO_PAL_PRIVATE_X509(v3_ext).CHIP_CRYPTO_PAL_PRIVATE_X509(p);
-    end    = p + mbed_cert.CHIP_CRYPTO_PAL_PRIVATE_X509(v3_ext).CHIP_CRYPTO_PAL_PRIVATE_X509(len);
-    result = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE);
-    VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
-    while (p < end)
-    {
-        mbedtls_x509_buf extOID = { 0, 0, nullptr };
-        int extCritical         = 0;
-
-        result = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE);
-        VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
-        /* Get extension ID */
-        result = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_OID);
-        VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
-        extOID.CHIP_CRYPTO_PAL_PRIVATE_X509(tag) = MBEDTLS_ASN1_OID;
-        extOID.CHIP_CRYPTO_PAL_PRIVATE_X509(len) = len;
-        extOID.CHIP_CRYPTO_PAL_PRIVATE_X509(p)   = p;
-        p += len;
-
-        /* Get optional critical */
-        result = mbedtls_asn1_get_bool(&p, end, &extCritical);
-        VerifyOrExit(result == 0 || result == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG, error = CHIP_ERROR_INTERNAL);
-
-        /* Data should be octet string type */
-        result = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_OCTET_STRING);
-        VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
-        if (OID_CMP(sOID_Extension_BasicConstraints, extOID))
-        {
-            int isCA                 = 0;
-            int pathLen              = -1;
-            unsigned char * seqStart = p;
-
-            VerifyOrExit(extCritical, error = CHIP_ERROR_INTERNAL);
-            extBasicPresent = true;
-
-            result = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE);
-            VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-            if (len > 0)
-            {
-                result = mbedtls_asn1_get_bool(&p, end, &isCA);
-                VerifyOrExit(result == 0 || result == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG, error = CHIP_ERROR_INTERNAL);
-
-                if (p != seqStart + len)
-                {
-                    result = mbedtls_asn1_get_int(&p, end, &pathLen);
-                    VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-                }
-            }
-
-            if (certType == AttestationCertType::kDAC)
-            {
-                VerifyOrExit(!isCA && pathLen == -1, error = CHIP_ERROR_INTERNAL);
-            }
-            else if (certType == AttestationCertType::kPAI)
-            {
-                VerifyOrExit(isCA && pathLen == 0, error = CHIP_ERROR_INTERNAL);
-            }
-            else
-            {
-                VerifyOrExit(isCA && (pathLen == -1 || pathLen == 0 || pathLen == 1), error = CHIP_ERROR_INTERNAL);
-            }
-        }
-        else if (OID_CMP(sOID_Extension_KeyUsage, extOID))
-        {
-            mbedtls_x509_bitstring bs = { 0, 0, nullptr };
-            unsigned int keyUsage     = 0;
-
-            VerifyOrExit(extCritical, error = CHIP_ERROR_INTERNAL);
-            extKeyUsagePresent = true;
-
-            result = mbedtls_asn1_get_bitstring(&p, p + len, &bs);
-            VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
-            for (size_t i = 0; i < bs.CHIP_CRYPTO_PAL_PRIVATE_X509(len) && i < sizeof(unsigned int); i++)
-            {
-                keyUsage |= static_cast<unsigned int>(bs.CHIP_CRYPTO_PAL_PRIVATE_X509(p)[i]) << (8 * i);
-            }
-
-            if (certType == AttestationCertType::kDAC)
-            {
-                // SHALL only have the digitalSignature bit set.
-                VerifyOrExit(keyUsage == MBEDTLS_X509_KU_DIGITAL_SIGNATURE, error = CHIP_ERROR_INTERNAL);
-            }
-            else
-            {
-                bool keyCertSignFlag = keyUsage & MBEDTLS_X509_KU_KEY_CERT_SIGN;
-                bool crlSignFlag     = keyUsage & MBEDTLS_X509_KU_CRL_SIGN;
-                bool otherFlags =
-                    keyUsage & ~(MBEDTLS_X509_KU_CRL_SIGN | MBEDTLS_X509_KU_KEY_CERT_SIGN | MBEDTLS_X509_KU_DIGITAL_SIGNATURE);
-                VerifyOrExit(keyCertSignFlag && crlSignFlag && !otherFlags, error = CHIP_ERROR_INTERNAL);
-            }
-        }
-        else
-        {
-            p += len;
-        }
-    }
-
-    // Verify basic and key usage extensions are present.
-    VerifyOrExit(extBasicPresent && extKeyUsagePresent, error = CHIP_ERROR_INTERNAL);
-
-    // Verify that SKID and AKID extensions are present.
-    {
-        uint8_t kidBuf[kSubjectKeyIdentifierLength];
-        MutableByteSpan kid(kidBuf);
-        SuccessOrExit(error = ExtractSKIDFromX509Cert(cert, kid));
-        if (certType == AttestationCertType::kDAC || certType == AttestationCertType::kPAI)
-        {
-            // Mandatory extension for DAC and PAI certs.
-            SuccessOrExit(error = ExtractAKIDFromX509Cert(cert, kid));
-        }
-    }
-
-exit:
-    _log_mbedTLS_error(result);
-    mbedtls_x509_crt_free(&mbed_cert);
-
-#else
-    (void) cert;
-    (void) certType;
-    CHIP_ERROR error = CHIP_ERROR_NOT_IMPLEMENTED;
-#endif // defined(MBEDTLS_X509_CRT_PARSE_C)
-
-    return error;
-}
-
-CHIP_ERROR ValidateCertificateChain(const uint8_t * rootCertificate, size_t rootCertificateLen, const uint8_t * caCertificate,
-                                    size_t caCertificateLen, const uint8_t * leafCertificate, size_t leafCertificateLen,
-                                    CertificateChainValidationResult & result)
-{
-#if defined(MBEDTLS_X509_CRT_PARSE_C)
-    CHIP_ERROR error = CHIP_NO_ERROR;
-    mbedtls_x509_crt certChain;
-    mbedtls_x509_crt rootCert;
-    mbedtls_x509_time leaf_valid_from;
-    mbedtls_x509_crt * cert = NULL;
-    int mbedResult;
-    uint32_t flags;
-    int compare_from  = 0;
-    int compare_until = 0;
-
-    result = CertificateChainValidationResult::kInternalFrameworkError;
-
-    VerifyOrReturnError(rootCertificate != nullptr && rootCertificateLen != 0,
-                        (result = CertificateChainValidationResult::kRootArgumentInvalid, CHIP_ERROR_INVALID_ARGUMENT));
-    VerifyOrReturnError(leafCertificate != nullptr && leafCertificateLen != 0,
-                        (result = CertificateChainValidationResult::kLeafArgumentInvalid, CHIP_ERROR_INVALID_ARGUMENT));
-
-    mbedtls_x509_crt_init(&certChain);
-    mbedtls_x509_crt_init(&rootCert);
-
-    /* Start of chain  */
-    mbedResult = mbedtls_x509_crt_parse(&certChain, Uint8::to_const_uchar(leafCertificate), leafCertificateLen);
-    VerifyOrExit(mbedResult == 0, (result = CertificateChainValidationResult::kLeafFormatInvalid, error = CHIP_ERROR_INTERNAL));
-    leaf_valid_from = certChain.valid_from;
-
-    /* Add the intermediate to the chain, if present */
-    if (caCertificate != nullptr && caCertificateLen > 0)
-    {
-        mbedResult = mbedtls_x509_crt_parse(&certChain, Uint8::to_const_uchar(caCertificate), caCertificateLen);
-        VerifyOrExit(mbedResult == 0, (result = CertificateChainValidationResult::kICAFormatInvalid, error = CHIP_ERROR_INTERNAL));
-    }
-
-    /* Parse the root cert */
-    mbedResult = mbedtls_x509_crt_parse(&rootCert, Uint8::to_const_uchar(rootCertificate), rootCertificateLen);
-    VerifyOrExit(mbedResult == 0, (result = CertificateChainValidationResult::kRootFormatInvalid, error = CHIP_ERROR_INTERNAL));
-
-    /* Validates that intermediate and root certificates are valid at the time of the leaf certificate's start time.  */
-    compare_from  = timeCompare(&leaf_valid_from, &rootCert.valid_from);
-    compare_until = timeCompare(&leaf_valid_from, &rootCert.valid_to);
-    VerifyOrExit((compare_from >= 0) && (compare_until <= 0),
-                 (result = CertificateChainValidationResult::kChainInvalid, error = CHIP_ERROR_CERT_NOT_TRUSTED));
-    cert = certChain.next;
-    while (cert)
-    {
-        compare_from  = timeCompare(&leaf_valid_from, &cert->valid_from);
-        compare_until = timeCompare(&leaf_valid_from, &cert->valid_to);
-        VerifyOrExit((compare_from >= 0) && (compare_until <= 0),
-                     (result = CertificateChainValidationResult::kChainInvalid, error = CHIP_ERROR_CERT_NOT_TRUSTED));
-        cert = cert->next;
-    }
-
-    /* Verify the chain against the root */
-    mbedResult = mbedtls_x509_crt_verify(&certChain, &rootCert, NULL, NULL, &flags, NULL, NULL);
-
-    switch (mbedResult)
-    {
-    case 0:
-        VerifyOrExit(flags == 0, (result = CertificateChainValidationResult::kInternalFrameworkError, error = CHIP_ERROR_INTERNAL));
-        result = CertificateChainValidationResult::kSuccess;
-        break;
-    case MBEDTLS_ERR_X509_CERT_VERIFY_FAILED:
-        result = CertificateChainValidationResult::kChainInvalid;
-        error  = CHIP_ERROR_CERT_NOT_TRUSTED;
-        break;
-    default:
-        SuccessOrExit((result = CertificateChainValidationResult::kInternalFrameworkError, error = CHIP_ERROR_INTERNAL));
-    }
-
-exit:
-    _log_mbedTLS_error(mbedResult);
-    mbedtls_x509_crt_free(&certChain);
-    mbedtls_x509_crt_free(&rootCert);
-
-#else
-    (void) rootCertificate;
-    (void) rootCertificateLen;
-    (void) caCertificate;
-    (void) caCertificateLen;
-    (void) leafCertificate;
-    (void) leafCertificateLen;
-    (void) result;
-    CHIP_ERROR error = CHIP_ERROR_NOT_IMPLEMENTED;
-#endif // defined(MBEDTLS_X509_CRT_PARSE_C)
-
-    return error;
-}
-
-inline bool IsTimeGreaterThanEqual(const mbedtls_x509_time * const timeA, const mbedtls_x509_time * const timeB)
-{
-
-    // checks if two values are different and if yes, then returns first > second.
-#define RETURN_STRICTLY_GREATER_IF_DIFFERENT(component)                                                                            \
-    {                                                                                                                              \
-        auto valueA = timeA->CHIP_CRYPTO_PAL_PRIVATE_X509(component);                                                              \
-        auto valueB = timeB->CHIP_CRYPTO_PAL_PRIVATE_X509(component);                                                              \
-                                                                                                                                   \
-        if (valueA != valueB)                                                                                                      \
-        {                                                                                                                          \
-            return valueA > valueB;                                                                                                \
-        }                                                                                                                          \
-    }
-
-    RETURN_STRICTLY_GREATER_IF_DIFFERENT(year);
-    RETURN_STRICTLY_GREATER_IF_DIFFERENT(mon);
-    RETURN_STRICTLY_GREATER_IF_DIFFERENT(day);
-    RETURN_STRICTLY_GREATER_IF_DIFFERENT(hour);
-    RETURN_STRICTLY_GREATER_IF_DIFFERENT(min);
-    RETURN_STRICTLY_GREATER_IF_DIFFERENT(sec);
-
-    // all above are equal
-    return true;
-}
-
-CHIP_ERROR IsCertificateValidAtIssuance(const ByteSpan & referenceCertificate, const ByteSpan & toBeEvaluatedCertificate)
-{
-#if defined(MBEDTLS_X509_CRT_PARSE_C)
-    CHIP_ERROR error = CHIP_NO_ERROR;
-    mbedtls_x509_crt mbedReferenceCertificate;
-    mbedtls_x509_crt mbedToBeEvaluatedCertificate;
-    mbedtls_x509_time refNotBeforeTime;
-    mbedtls_x509_time tbeNotBeforeTime;
-    mbedtls_x509_time tbeNotAfterTime;
-    int result;
-
-    VerifyOrReturnError(!referenceCertificate.empty() && !toBeEvaluatedCertificate.empty(), CHIP_ERROR_INVALID_ARGUMENT);
-
-    mbedtls_x509_crt_init(&mbedReferenceCertificate);
-    mbedtls_x509_crt_init(&mbedToBeEvaluatedCertificate);
-
-    result = mbedtls_x509_crt_parse(&mbedReferenceCertificate, Uint8::to_const_uchar(referenceCertificate.data()),
-                                    referenceCertificate.size());
-    VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
-    result = mbedtls_x509_crt_parse(&mbedToBeEvaluatedCertificate, Uint8::to_const_uchar(toBeEvaluatedCertificate.data()),
-                                    toBeEvaluatedCertificate.size());
-    VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
-    refNotBeforeTime = mbedReferenceCertificate.CHIP_CRYPTO_PAL_PRIVATE_X509(valid_from);
-    tbeNotBeforeTime = mbedToBeEvaluatedCertificate.CHIP_CRYPTO_PAL_PRIVATE_X509(valid_from);
-    tbeNotAfterTime  = mbedToBeEvaluatedCertificate.CHIP_CRYPTO_PAL_PRIVATE_X509(valid_to);
-
-    // check if referenceCertificate is issued at or after tbeCertificate's notBefore timestamp
-    VerifyOrExit(IsTimeGreaterThanEqual(&refNotBeforeTime, &tbeNotBeforeTime), error = CHIP_ERROR_CERT_EXPIRED);
-
-    // check if referenceCertificate is issued at or before tbeCertificate's notAfter timestamp
-    VerifyOrExit(IsTimeGreaterThanEqual(&tbeNotAfterTime, &refNotBeforeTime), error = CHIP_ERROR_CERT_EXPIRED);
-
-exit:
-    _log_mbedTLS_error(result);
-    mbedtls_x509_crt_free(&mbedReferenceCertificate);
-    mbedtls_x509_crt_free(&mbedToBeEvaluatedCertificate);
-
-#else
-    (void) referenceCertificate;
-    (void) toBeEvaluatedCertificate;
-    CHIP_ERROR error = CHIP_ERROR_NOT_IMPLEMENTED;
-#endif // defined(MBEDTLS_X509_CRT_PARSE_C)
-
-    return error;
-}
-
-CHIP_ERROR IsCertificateValidAtCurrentTime(const ByteSpan & certificate)
-{
-#if defined(MBEDTLS_X509_CRT_PARSE_C)
-    CHIP_ERROR error = CHIP_NO_ERROR;
-    mbedtls_x509_crt mbedCertificate;
-    int result;
-
-    VerifyOrReturnError(!certificate.empty(), CHIP_ERROR_INVALID_ARGUMENT);
-
-    mbedtls_x509_crt_init(&mbedCertificate);
-
-    result = mbedtls_x509_crt_parse(&mbedCertificate, Uint8::to_const_uchar(certificate.data()), certificate.size());
-    VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
-    // check if certificate's notBefore timestamp is earlier than or equal to current time.
-    result = mbedtls_x509_time_is_past(&mbedCertificate.CHIP_CRYPTO_PAL_PRIVATE_X509(valid_from));
-    VerifyOrExit(result == 1, error = CHIP_ERROR_CERT_EXPIRED);
-
-    // check if certificate's notAfter timestamp is later than current time.
-    result = mbedtls_x509_time_is_future(&mbedCertificate.CHIP_CRYPTO_PAL_PRIVATE_X509(valid_to));
-    VerifyOrExit(result == 1, error = CHIP_ERROR_CERT_EXPIRED);
-
-exit:
-    _log_mbedTLS_error(result);
-    mbedtls_x509_crt_free(&mbedCertificate);
-
-#else
-    (void) certificate;
-    CHIP_ERROR error = CHIP_ERROR_NOT_IMPLEMENTED;
-#endif // defined(MBEDTLS_X509_CRT_PARSE_C)
-
-    return error;
-}
-
-CHIP_ERROR ExtractPubkeyFromX509Cert(const ByteSpan & certificate, Crypto::P256PublicKey & pubkey)
-{
-#if defined(MBEDTLS_X509_CRT_PARSE_C)
-    CHIP_ERROR error = CHIP_NO_ERROR;
-    mbedtls_x509_crt mbed_cert;
-    mbedtls_ecp_keypair * keypair = nullptr;
-    size_t pubkey_size            = 0;
-
-    mbedtls_x509_crt_init(&mbed_cert);
-
-    int result = mbedtls_x509_crt_parse(&mbed_cert, Uint8::to_const_uchar(certificate.data()), certificate.size());
-    VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
-    VerifyOrExit(mbedtls_pk_get_type(&(mbed_cert.CHIP_CRYPTO_PAL_PRIVATE_X509(pk))) == MBEDTLS_PK_ECKEY,
-                 error = CHIP_ERROR_INVALID_ARGUMENT);
-
-    keypair = mbedtls_pk_ec(mbed_cert.CHIP_CRYPTO_PAL_PRIVATE_X509(pk));
-    VerifyOrExit(keypair->CHIP_CRYPTO_PAL_PRIVATE(grp).id == MapECPGroupId(pubkey.Type()), error = CHIP_ERROR_INVALID_ARGUMENT);
-    // Copy the public key from the cert in raw point format
-    result =
-        mbedtls_ecp_point_write_binary(&keypair->CHIP_CRYPTO_PAL_PRIVATE(grp), &keypair->CHIP_CRYPTO_PAL_PRIVATE(Q),
-                                       MBEDTLS_ECP_PF_UNCOMPRESSED, &pubkey_size, Uint8::to_uchar(pubkey.Bytes()), pubkey.Length());
-
-    VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-    VerifyOrExit(pubkey_size == pubkey.Length(), error = CHIP_ERROR_INTERNAL);
-
-exit:
-    _log_mbedTLS_error(result);
-    mbedtls_x509_crt_free(&mbed_cert);
-
-#else
-    (void) certificate;
-    (void) pubkey;
-    CHIP_ERROR error = CHIP_ERROR_NOT_IMPLEMENTED;
-#endif // defined(MBEDTLS_X509_CRT_PARSE_C)
-
-    return error;
-}
-
-namespace {
-
-CHIP_ERROR ExtractKIDFromX509Cert(bool extractSKID, const ByteSpan & certificate, MutableByteSpan & kid)
-{
-#if defined(MBEDTLS_X509_CRT_PARSE_C)
-    CHIP_ERROR error = CHIP_ERROR_NOT_FOUND;
-    mbedtls_x509_crt mbed_cert;
-    unsigned char * p         = nullptr;
-    const unsigned char * end = nullptr;
-    size_t len                = 0;
-
-    mbedtls_x509_crt_init(&mbed_cert);
-
-    int result = mbedtls_x509_crt_parse(&mbed_cert, Uint8::to_const_uchar(certificate.data()), certificate.size());
-    VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
-    // TODO: The mbedTLS team is working on supporting SKID and AKID extensions processing.
-    // Once it is supported, this code should be updated.
-
-    p   = mbed_cert.CHIP_CRYPTO_PAL_PRIVATE_X509(v3_ext).CHIP_CRYPTO_PAL_PRIVATE_X509(p);
-    end = mbed_cert.CHIP_CRYPTO_PAL_PRIVATE_X509(v3_ext).CHIP_CRYPTO_PAL_PRIVATE_X509(p) +
-        mbed_cert.CHIP_CRYPTO_PAL_PRIVATE_X509(v3_ext).CHIP_CRYPTO_PAL_PRIVATE_X509(len);
-    result = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE);
-    VerifyOrExit(result == 0, error = CHIP_ERROR_WRONG_CERT_TYPE);
-
-    while (p < end)
-    {
-        result = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE);
-        VerifyOrExit(result == 0, error = CHIP_ERROR_WRONG_CERT_TYPE);
-        result = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_OID);
-        VerifyOrExit(result == 0, error = CHIP_ERROR_WRONG_CERT_TYPE);
-
-        mbedtls_x509_buf extOID    = { MBEDTLS_ASN1_OID, len, p };
-        bool extractCurrentExtSKID = extractSKID && OID_CMP(sOID_Extension_SubjectKeyIdentifier, extOID);
-        bool extractCurrentExtAKID = !extractSKID && OID_CMP(sOID_Extension_AuthorityKeyIdentifier, extOID);
-        p += len;
-
-        int is_critical = 0;
-        result          = mbedtls_asn1_get_bool(&p, end, &is_critical);
-        VerifyOrExit(result == 0 || result == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG, error = CHIP_ERROR_WRONG_CERT_TYPE);
-
-        result = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_OCTET_STRING);
-        VerifyOrExit(result == 0, error = CHIP_ERROR_WRONG_CERT_TYPE);
-
-        if (extractCurrentExtSKID || extractCurrentExtAKID)
-        {
-            if (extractCurrentExtSKID)
-            {
-                result = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_OCTET_STRING);
-                VerifyOrExit(result == 0, error = CHIP_ERROR_WRONG_CERT_TYPE);
-            }
-            else
-            {
-                result = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE);
-                VerifyOrExit(result == 0, error = CHIP_ERROR_WRONG_CERT_TYPE);
-                result = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_CONTEXT_SPECIFIC);
-                VerifyOrExit(result == 0, error = CHIP_ERROR_WRONG_CERT_TYPE);
-                // Other optional fields, authorityCertIssuer and authorityCertSerialNumber,
-                // will be skipped if present.
-            }
-            VerifyOrExit(len == kSubjectKeyIdentifierLength, error = CHIP_ERROR_WRONG_CERT_TYPE);
-            VerifyOrExit(len <= kid.size(), error = CHIP_ERROR_BUFFER_TOO_SMALL);
-            memcpy(kid.data(), p, len);
-            if (kid.size() > len)
-            {
-                kid.reduce_size(len);
-            }
-            ExitNow(error = CHIP_NO_ERROR);
-            break;
-        }
-        p += len;
-    }
-
-exit:
-    _log_mbedTLS_error(result);
-    mbedtls_x509_crt_free(&mbed_cert);
-
-#else
-    (void) certificate;
-    (void) kid;
-    CHIP_ERROR error = CHIP_ERROR_NOT_IMPLEMENTED;
-#endif // defined(MBEDTLS_X509_CRT_PARSE_C)
-
-    return error;
-}
-
-} // namespace
-
-CHIP_ERROR ExtractSKIDFromX509Cert(const ByteSpan & certificate, MutableByteSpan & skid)
-{
-    return ExtractKIDFromX509Cert(true, certificate, skid);
-}
-
-CHIP_ERROR ExtractAKIDFromX509Cert(const ByteSpan & certificate, MutableByteSpan & akid)
-{
-    return ExtractKIDFromX509Cert(false, certificate, akid);
-}
-
-CHIP_ERROR ExtractVIDPIDFromX509Cert(const ByteSpan & certificate, AttestationCertVidPid & vidpid)
-{
-#if defined(MBEDTLS_X509_CRT_PARSE_C)
-    CHIP_ERROR error = CHIP_NO_ERROR;
-    mbedtls_x509_crt mbed_cert;
-    mbedtls_asn1_named_data * dnIterator = nullptr;
-    AttestationCertVidPid vidpidFromCN;
-
-    mbedtls_x509_crt_init(&mbed_cert);
-
-    int result = mbedtls_x509_crt_parse(&mbed_cert, Uint8::to_const_uchar(certificate.data()), certificate.size());
-    VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
-    for (dnIterator = &mbed_cert.CHIP_CRYPTO_PAL_PRIVATE_X509(subject); dnIterator != nullptr;
-         dnIterator = dnIterator->CHIP_CRYPTO_PAL_PRIVATE_X509(next))
-    {
-        DNAttrType attrType = DNAttrType::kUnspecified;
-        if (OID_CMP(sOID_AttributeType_CommonName, dnIterator->CHIP_CRYPTO_PAL_PRIVATE_X509(oid)))
-        {
-            attrType = DNAttrType::kCommonName;
-        }
-        else if (OID_CMP(sOID_AttributeType_MatterVendorId, dnIterator->CHIP_CRYPTO_PAL_PRIVATE_X509(oid)))
-        {
-            attrType = DNAttrType::kMatterVID;
-        }
-        else if (OID_CMP(sOID_AttributeType_MatterProductId, dnIterator->CHIP_CRYPTO_PAL_PRIVATE_X509(oid)))
-        {
-            attrType = DNAttrType::kMatterPID;
-        }
-
-        size_t val_len  = dnIterator->CHIP_CRYPTO_PAL_PRIVATE_X509(val).CHIP_CRYPTO_PAL_PRIVATE_X509(len);
-        uint8_t * val_p = dnIterator->CHIP_CRYPTO_PAL_PRIVATE_X509(val).CHIP_CRYPTO_PAL_PRIVATE_X509(p);
-        error           = ExtractVIDPIDFromAttributeString(attrType, ByteSpan(val_p, val_len), vidpid, vidpidFromCN);
-        SuccessOrExit(error);
-    }
-
-    // If Matter Attributes were not found use values extracted from the CN Attribute,
-    // which might be uninitialized as well.
-    if (!vidpid.Initialized())
-    {
-        vidpid = vidpidFromCN;
-    }
-
-exit:
-    _log_mbedTLS_error(result);
-    mbedtls_x509_crt_free(&mbed_cert);
-
-#else
-    (void) certificate;
-    (void) vidpid;
-    CHIP_ERROR error = CHIP_ERROR_NOT_IMPLEMENTED;
-#endif // defined(MBEDTLS_X509_CRT_PARSE_C)
-
-    return error;
-}
-
-} // namespace Crypto
-} // namespace chip
diff --git a/src/platform/silabs/SiWx917/ConfigurationManagerImpl.cpp b/src/platform/silabs/SiWx917/ConfigurationManagerImpl.cpp
index aad7493..618b5a6 100644
--- a/src/platform/silabs/SiWx917/ConfigurationManagerImpl.cpp
+++ b/src/platform/silabs/SiWx917/ConfigurationManagerImpl.cpp
@@ -19,7 +19,7 @@
 /**
  *    @file
  *          Provides the implementation of the Device Layer ConfigurationManager object
- *          for EFR32 platforms using the Silicon Labs SDK.
+ *          for SiWx917 platforms using the Silicon Labs SDK.
  */
 /* this file behaves like a config.h, comes first */
 #include <platform/internal/CHIPDeviceLayerInternal.h>
@@ -30,7 +30,7 @@
 #include <platform/DiagnosticDataProvider.h>
 #include <platform/silabs/SilabsConfig.h>
 
-#include "em_rmu.h"
+#include "core_cm4.h"
 
 #if CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
 #include "wfx_host_events.h"
@@ -60,8 +60,6 @@
     IncreaseBootCount();
     // It is possible to configure the possible reset sources with RMU_ResetControl
     // In this case, we keep Reset control at default setting
-    rebootCause = RMU_ResetCauseGet();
-    RMU_ResetCauseClear();
 
     err = CHIP_NO_ERROR;
 
diff --git a/src/platform/silabs/SiWx917/ConnectivityManagerImpl.cpp b/src/platform/silabs/SiWx917/ConnectivityManagerImpl.cpp
deleted file mode 100644
index c38a5e5..0000000
--- a/src/platform/silabs/SiWx917/ConnectivityManagerImpl.cpp
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- *
- *    Copyright (c) 2020 Project CHIP Authors
- *    Copyright (c) 2019 Nest Labs, Inc.
- *
- *    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.
- */
-/* this file behaves like a config.h, comes first */
-#include <platform/internal/CHIPDeviceLayerInternal.h>
-
-#include <lib/support/CodeUtils.h>
-#include <lib/support/logging/CHIPLogging.h>
-#include <platform/ConnectivityManager.h>
-#include <platform/internal/BLEManager.h>
-
-#include <platform/internal/GenericConnectivityManagerImpl_UDP.ipp>
-
-#if INET_CONFIG_ENABLE_TCP_ENDPOINT
-#include <platform/internal/GenericConnectivityManagerImpl_TCP.ipp>
-#endif
-
-#if CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE
-#include <platform/internal/GenericConnectivityManagerImpl_BLE.ipp>
-#endif
-
-#if CHIP_DEVICE_CONFIG_ENABLE_THREAD
-#include <platform/internal/GenericConnectivityManagerImpl_Thread.ipp>
-#endif
-
-using namespace ::chip;
-using namespace ::chip::Inet;
-using namespace ::chip::System;
-using namespace ::chip::TLV;
-using namespace ::chip::DeviceLayer::Internal;
-
-namespace chip {
-namespace DeviceLayer {
-
-ConnectivityManagerImpl ConnectivityManagerImpl::sInstance;
-
-CHIP_ERROR ConnectivityManagerImpl::_Init()
-{
-    CHIP_ERROR err = CHIP_NO_ERROR;
-
-    // Initialize the generic base classes that require it.
-#if CHIP_DEVICE_CONFIG_ENABLE_THREAD
-    GenericConnectivityManagerImpl_Thread<ConnectivityManagerImpl>::_Init();
-#endif
-    SuccessOrExit(err);
-
-exit:
-    return err;
-}
-
-void ConnectivityManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event)
-{
-    // Forward the event to the generic base classes as needed.
-#if CHIP_DEVICE_CONFIG_ENABLE_THREAD
-    GenericConnectivityManagerImpl_Thread<ConnectivityManagerImpl>::_OnPlatformEvent(event);
-#endif
-}
-
-} // namespace DeviceLayer
-} // namespace chip
diff --git a/src/platform/silabs/SiWx917/Efr32OpaqueKeypair.h b/src/platform/silabs/SiWx917/Efr32OpaqueKeypair.h
deleted file mode 100644
index 58123c1..0000000
--- a/src/platform/silabs/SiWx917/Efr32OpaqueKeypair.h
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- *    Copyright (c) 2022 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.
- */
-
-#pragma once
-
-#include <crypto/CHIPCryptoPAL.h>
-#include <platform/CHIPDeviceError.h>
-
-namespace chip {
-namespace DeviceLayer {
-namespace Internal {
-
-typedef uint16_t EFR32OpaqueKeyId;
-constexpr EFR32OpaqueKeyId kEFR32OpaqueKeyIdUnknown       = 0xFFFFU; // Do not modify, will impact existing deployments
-constexpr EFR32OpaqueKeyId kEFR32OpaqueKeyIdVolatile      = 0xFFFEU; // Do not modify, will impact existing deployments
-constexpr EFR32OpaqueKeyId kEFR32OpaqueKeyIdPersistentMin = 0x0U;    // Do not modify, will impact existing deployments
-constexpr EFR32OpaqueKeyId kEFR32OpaqueKeyIdPersistentMax = 0x1FFU;  // Do not decrease, will impact existing deployments
-
-enum class EFR32OpaqueKeyUsages : uint8_t
-{
-    ECDSA_P256_SHA256 = 0,
-    ECDH_P256         = 1,
-};
-
-/**
- * @brief Base class for opaque keys
- *
- * Deriving from this class allows using it as a base class for operations
- * which don't expose the private key independent of key size.
- **/
-class EFR32OpaqueKeypair
-{
-public:
-    EFR32OpaqueKeypair();
-    virtual ~EFR32OpaqueKeypair();
-
-    /**
-     * @brief Load a keypair with given key ID
-     *
-     * If no key exists under the given ID, an error is returned
-     * and the object is unusable for operations.
-     *
-     * @param key_id    key ID under which this key was created
-     *
-     * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise
-     **/
-    CHIP_ERROR Load(EFR32OpaqueKeyId key_id);
-
-    /**
-     * @brief Create a new keypair with given ID and usage
-     *
-     * If a key already exists under the given ID, an error is returned
-     * and no new key is created.
-     *
-     * @param key_id    key ID under which to store this key. Set to 0
-     *                  for a non-persistent key which gets destructed
-     *                  when the lifetime of this object ends, or set
-     *                  to any other value to store the key under that
-     *                  ID.
-     *
-     * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise
-     **/
-    CHIP_ERROR Create(EFR32OpaqueKeyId key_id, EFR32OpaqueKeyUsages usage);
-
-    /**
-     * @brief Get the public key for this keypair
-     *
-     * @param output        Output buffer to put public key (in 0x04 || X || Y format)
-     * @param output_size   Size of \p output
-     * @param output_length Amount of bytes put in \p output on success
-     *
-     * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise
-     **/
-    CHIP_ERROR GetPublicKey(uint8_t * output, size_t output_size, size_t * output_length) const;
-
-    /**
-     * @brief Get the key ID for this keypair
-     *
-     * @return Returns kEFR32OpaqueKeyIdUnknown for an uninitialised/invalid
-     *         key, kEFR32OpaqueKeyIdVolatile for a volatile key, and a key
-     *         ID in the range [kEFR32OpaqueKeyIdPersistentMin, kEFR32OpaqueKeyIdPersistentMax]
-     *         for valid persistent keys.
-     **/
-    EFR32OpaqueKeyId GetKeyId() const;
-
-    /**
-     * @brief Use this keypair to sign a message using the ECDSA-SHA256 algorithm
-     *
-     * @param msg           Message buffer to sign
-     * @param msg_len       Size of \p msg in bytes
-     * @param output        Output buffer to write signature to. Signature
-     *                      is in raw format (i.e. binary concatenation of
-     *                      r and s)
-     * @param output_size   Size of output buffer
-     * @param output_length Amount of bytes written into output buffer
-     *
-     * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise
-     **/
-    CHIP_ERROR Sign(const uint8_t * msg, size_t msg_len, uint8_t * output, size_t output_size, size_t * output_length) const;
-
-    /**
-     * @brief Use this keypair to derive a key using the raw ECDH algorithm
-     *
-     * @param their_key     Buffer containing raw uncompressed public key
-     *                      of party to derive with
-     * @param their_key_len Size of \p their_key in bytes
-     * @param output        Output buffer to write derived bytes to
-     * @param output_size   Size of output buffer
-     * @param output_length Amount of bytes written into output buffer
-     *
-     * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise
-     **/
-    CHIP_ERROR Derive(const uint8_t * their_key, size_t their_key_len, uint8_t * output, size_t output_size,
-                      size_t * output_length) const;
-
-    /**
-     * @brief Delete the keypair from storage
-     *
-     * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise
-     **/
-    CHIP_ERROR Delete();
-
-protected:
-    void * mContext      = nullptr;
-    bool mHasKey         = false;
-    bool mIsPersistent   = false;
-    uint8_t * mPubkeyRef = nullptr;
-    size_t mPubkeySize   = 0;
-    size_t mPubkeyLength = 0;
-};
-
-/**
- * @brief Derived class of P256Keypair for using opaque keys
- *
- * The signature and compiled form of this class is suboptimal due to how
- * the P256Keypair isn't really an abstract interface, but rather partly
- * interface / partly implementation. Future optimisation should look at
- * converting P256Keypair to a fully abstract interface.
- **/
-class EFR32OpaqueP256Keypair : public chip::Crypto::P256Keypair, public EFR32OpaqueKeypair
-{
-public:
-    EFR32OpaqueP256Keypair();
-    ~EFR32OpaqueP256Keypair() override;
-
-    /**
-     * @brief Initialize the keypair.
-     * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise
-     **/
-    CHIP_ERROR Initialize() override;
-
-    /**
-     * @brief Serialize the keypair (unsupported on opaque keys)
-     * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise
-     **/
-    CHIP_ERROR Serialize(chip::Crypto::P256SerializedKeypair & output) const override;
-
-    /**
-     * @brief Deserialize the keypair (unsupported on opaque keys)
-     * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise
-     **/
-    CHIP_ERROR Deserialize(chip::Crypto::P256SerializedKeypair & input) override;
-
-    /**
-     * @brief Generate a new Certificate Signing Request (CSR).
-     * @param csr Newly generated CSR in DER format
-     * @param csr_length The caller provides the length of input buffer (csr). The function returns the actual length of generated
-     *CSR.
-     * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise
-     **/
-    CHIP_ERROR NewCertificateSigningRequest(uint8_t * csr, size_t & csr_length) const override;
-
-    /**
-     * @brief A function to sign a msg using ECDSA
-     * @param msg Message that needs to be signed
-     * @param msg_length Length of message
-     * @param out_signature Buffer that will hold the output signature. The signature consists of: 2 EC elements (r and s),
-     * in raw <r,s> point form (see SEC1).
-     * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise
-     **/
-    CHIP_ERROR ECDSA_sign_msg(const uint8_t * msg, size_t msg_length,
-                              chip::Crypto::P256ECDSASignature & out_signature) const override;
-
-    /**
-     * @brief A function to derive a shared secret using ECDH
-     *
-     * This implements the CHIP_Crypto_ECDH(PrivateKey myPrivateKey, PublicKey theirPublicKey) cryptographic primitive
-     * from the specification, using this class's private key from `mKeypair` as `myPrivateKey` and the remote
-     * public key from `remote_public_key` as `theirPublicKey`.
-     *
-     * @param remote_public_key Public key of remote peer with which we are trying to establish secure channel. remote_public_key is
-     * ASN.1 DER encoded as padded big-endian field elements as described in SEC 1: Elliptic Curve Cryptography
-     * [https://www.secg.org/sec1-v2.pdf]
-     * @param out_secret Buffer to write out secret into. This is a byte array representing the x coordinate of the shared secret.
-     * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise
-     **/
-    CHIP_ERROR ECDH_derive_secret(const chip::Crypto::P256PublicKey & remote_public_key,
-                                  chip::Crypto::P256ECDHDerivedSecret & out_secret) const override;
-
-    /** @brief Return public key for the keypair.
-     **/
-    const chip::Crypto::P256PublicKey & Pubkey() const override;
-
-private:
-    chip::Crypto::P256PublicKey mPubKey;
-};
-
-} // namespace Internal
-} // namespace DeviceLayer
-} // namespace chip
diff --git a/src/platform/silabs/SiWx917/Efr32PsaOpaqueKeypair.cpp b/src/platform/silabs/SiWx917/Efr32PsaOpaqueKeypair.cpp
deleted file mode 100644
index ae9a0f6..0000000
--- a/src/platform/silabs/SiWx917/Efr32PsaOpaqueKeypair.cpp
+++ /dev/null
@@ -1,452 +0,0 @@
-/*
- *    Copyright (c) 2022 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.
- */
-
-#include "Efr32OpaqueKeypair.h"
-#include "em_device.h"
-#include <psa/crypto.h>
-
-#include <lib/core/CHIPSafeCasts.h>
-#include <lib/support/CHIPMem.h>
-#include <lib/support/SafeInt.h>
-using chip::Platform::MemoryCalloc;
-using chip::Platform::MemoryFree;
-
-using chip::Crypto::P256ECDHDerivedSecret;
-using chip::Crypto::P256ECDSASignature;
-using chip::Crypto::P256Keypair;
-using chip::Crypto::P256PublicKey;
-using chip::Crypto::P256SerializedKeypair;
-
-namespace chip {
-namespace DeviceLayer {
-namespace Internal {
-
-/*******************************************************************************
- *
- * PSA key ID range for storing Matter Opaque keys
- *
- ******************************************************************************/
-#define PSA_KEY_ID_FOR_MATTER_MIN (0x00004400)
-#define PSA_KEY_ID_FOR_MATTER_MAX (0x000045FF)
-#define PSA_KEY_ID_FOR_MATTER_SIZE (PSA_KEY_ID_FOR_MATTER_MAX - PSA_KEY_ID_FOR_MATTER_MIN + 1)
-
-static_assert((kEFR32OpaqueKeyIdPersistentMax - kEFR32OpaqueKeyIdPersistentMin) < PSA_KEY_ID_FOR_MATTER_SIZE,
-              "Not enough PSA range to store all allowed opaque key IDs");
-
-#if defined(SEMAILBOX_PRESENT) && (_SILICON_LABS_SECURITY_FEATURE == _SILICON_LABS_SECURITY_FEATURE_VAULT)
-#define PSA_CRYPTO_LOCATION_FOR_DEVICE PSA_KEY_LOCATION_SL_SE_OPAQUE
-#elif defined(CRYPTOACC_PRESENT) && defined(SEPUF_PRESENT) && defined(SL_TRUSTZONE_NONSECURE)
-#define PSA_CRYPTO_LOCATION_FOR_DEVICE PSA_KEY_LOCATION_SL_CRYPTOACC_OPAQUE
-#else
-#define PSA_CRYPTO_LOCATION_FOR_DEVICE PSA_KEY_LOCATION_LOCAL_STORAGE
-#endif
-
-static void _log_PSA_error(psa_status_t status)
-{
-    if (status != PSA_SUCCESS)
-    {
-        ChipLogError(Crypto, "PSA error: %ld", status);
-    }
-}
-
-/*******************************************************************************
- *
- * PSA Crypto backed implementation of EFR32OpaqueKeypair
- *
- ******************************************************************************/
-
-static bool is_opaque_key_valid(EFR32OpaqueKeyId id)
-{
-    if (id == kEFR32OpaqueKeyIdVolatile)
-    {
-        return true;
-    }
-    else if (id >= kEFR32OpaqueKeyIdPersistentMin && id <= (kEFR32OpaqueKeyIdPersistentMin + PSA_KEY_ID_FOR_MATTER_SIZE))
-    {
-        return true;
-    }
-
-    return false;
-}
-
-static mbedtls_svc_key_id_t psa_key_id_from_opaque(EFR32OpaqueKeyId id)
-{
-    if (id == kEFR32OpaqueKeyIdVolatile || !is_opaque_key_valid(id))
-    {
-        return 0;
-    }
-
-    return PSA_KEY_ID_FOR_MATTER_MIN + (id - kEFR32OpaqueKeyIdPersistentMin);
-}
-
-static EFR32OpaqueKeyId opaque_key_id_from_psa(mbedtls_svc_key_id_t id)
-{
-    if (id == 0)
-    {
-        return kEFR32OpaqueKeyIdVolatile;
-    }
-    else if (id >= PSA_KEY_ID_FOR_MATTER_MIN && id <= PSA_KEY_ID_FOR_MATTER_MAX)
-    {
-        return (id + kEFR32OpaqueKeyIdPersistentMin) - PSA_KEY_ID_FOR_MATTER_MIN;
-    }
-    else
-    {
-        return kEFR32OpaqueKeyIdUnknown;
-    }
-}
-
-EFR32OpaqueKeypair::EFR32OpaqueKeypair()
-{
-    psa_crypto_init();
-    // Avoid having a reference to PSA datatypes in the signature of this class
-    mContext = MemoryCalloc(1, sizeof(mbedtls_svc_key_id_t));
-}
-
-EFR32OpaqueKeypair::~EFR32OpaqueKeypair()
-{
-    // Free key resources
-    if (mContext != nullptr)
-    {
-        // Delete volatile keys, since nobody else can after we drop the key ID.
-        if (!mIsPersistent)
-        {
-            Delete();
-        }
-
-        MemoryFree(mContext);
-        mContext = nullptr;
-    }
-}
-
-CHIP_ERROR EFR32OpaqueKeypair::Load(EFR32OpaqueKeyId opaque_id)
-{
-    CHIP_ERROR error            = CHIP_NO_ERROR;
-    psa_status_t status         = PSA_ERROR_BAD_STATE;
-    mbedtls_svc_key_id_t key_id = 0;
-
-    VerifyOrExit(opaque_id != kEFR32OpaqueKeyIdVolatile, error = CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrExit(is_opaque_key_valid(opaque_id), error = CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrExit(mContext, error = CHIP_ERROR_INCORRECT_STATE);
-
-    // If the object contains a volatile key, clean it up before reusing the object storage
-    if (mHasKey && !mIsPersistent)
-    {
-        Delete();
-    }
-
-    key_id = psa_key_id_from_opaque(opaque_id);
-
-    status = psa_export_public_key(key_id, mPubkeyRef, mPubkeySize, &mPubkeyLength);
-
-    if (status == PSA_ERROR_DOES_NOT_EXIST)
-    {
-        error = CHIP_DEVICE_ERROR_CONFIG_NOT_FOUND;
-        goto exit;
-    }
-
-    VerifyOrExit(status == PSA_SUCCESS, {
-        _log_PSA_error(status);
-        error = CHIP_ERROR_INTERNAL;
-    });
-
-    // Store the key ID and mark the key as valid
-    *(mbedtls_svc_key_id_t *) mContext = key_id;
-    mHasKey                            = true;
-    mIsPersistent                      = true;
-
-exit:
-    if (error != CHIP_NO_ERROR)
-    {
-        memset(mPubkeyRef, 0, mPubkeySize);
-    }
-
-    return error;
-}
-
-CHIP_ERROR EFR32OpaqueKeypair::Create(EFR32OpaqueKeyId opaque_id, EFR32OpaqueKeyUsages usage)
-{
-    CHIP_ERROR error            = CHIP_NO_ERROR;
-    psa_status_t status         = PSA_ERROR_BAD_STATE;
-    psa_key_attributes_t attr   = PSA_KEY_ATTRIBUTES_INIT;
-    mbedtls_svc_key_id_t key_id = 0;
-
-    VerifyOrExit(is_opaque_key_valid(opaque_id), error = CHIP_ERROR_INVALID_ARGUMENT);
-    VerifyOrExit(mContext, error = CHIP_ERROR_INCORRECT_STATE);
-
-    if (opaque_id == kEFR32OpaqueKeyIdVolatile)
-    {
-        psa_set_key_lifetime(
-            &attr, PSA_KEY_LIFETIME_FROM_PERSISTENCE_AND_LOCATION(PSA_KEY_LIFETIME_VOLATILE, PSA_CRYPTO_LOCATION_FOR_DEVICE));
-    }
-    else
-    {
-        psa_key_handle_t key_handle;
-
-        key_id = psa_key_id_from_opaque(opaque_id);
-
-        // Check if the key already exists
-        int ret = psa_open_key(key_id, &key_handle);
-        if (PSA_SUCCESS == ret)
-        {
-            // WARNING: Existing key! This is caused by a problem in the key store.
-            // The key must be destroyed, otherwhise the device won't recover.
-            ChipLogError(Crypto, "WARNING: PSA key recycled: %d / %ld", opaque_id, key_id);
-            psa_destroy_key(key_id);
-        }
-
-        psa_set_key_id(&attr, key_id);
-        psa_set_key_lifetime(
-            &attr, PSA_KEY_LIFETIME_FROM_PERSISTENCE_AND_LOCATION(PSA_KEY_LIFETIME_PERSISTENT, PSA_CRYPTO_LOCATION_FOR_DEVICE));
-    }
-
-    switch (usage)
-    {
-    case EFR32OpaqueKeyUsages::ECDSA_P256_SHA256:
-        psa_set_key_type(&attr, PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_R1));
-        psa_set_key_bits(&attr, 256);
-        psa_set_key_algorithm(&attr, PSA_ALG_ECDSA(PSA_ALG_SHA_256));
-        // Need hash signing permissions because the CSR generation uses sign_hash internally
-        psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_SIGN_MESSAGE | PSA_KEY_USAGE_SIGN_HASH);
-        break;
-    case EFR32OpaqueKeyUsages::ECDH_P256:
-        psa_set_key_type(&attr, PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_R1));
-        psa_set_key_bits(&attr, 256);
-        psa_set_key_algorithm(&attr, PSA_ALG_ECDH);
-        psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_DERIVE);
-        break;
-    }
-
-    status = psa_generate_key(&attr, &key_id);
-    VerifyOrExit(status == PSA_SUCCESS, {
-        _log_PSA_error(status);
-        error = CHIP_ERROR_INTERNAL;
-    });
-
-    // Export the public key
-    status = psa_export_public_key(key_id, mPubkeyRef, mPubkeySize, &mPubkeyLength);
-    if (PSA_SUCCESS != status)
-    {
-        _log_PSA_error(status);
-        // Key generation succeeded, but pubkey export did not. To avoid
-        // memory leaks, delete the generated key before returning the error
-        psa_destroy_key(key_id);
-        error = CHIP_ERROR_INTERNAL;
-        goto exit;
-    }
-
-    // Store the key ID and mark the key as valid
-    mHasKey       = true;
-    mIsPersistent = opaque_id != kEFR32OpaqueKeyIdVolatile;
-
-exit:
-    psa_reset_key_attributes(&attr);
-    if (mContext)
-    {
-        if (CHIP_NO_ERROR == error)
-        {
-            *(mbedtls_svc_key_id_t *) mContext = key_id;
-        }
-        else
-        {
-            *(mbedtls_svc_key_id_t *) mContext = 0;
-        }
-    }
-    return error;
-}
-
-CHIP_ERROR EFR32OpaqueKeypair::GetPublicKey(uint8_t * output, size_t output_size, size_t * output_length) const
-{
-    CHIP_ERROR error = CHIP_NO_ERROR;
-    VerifyOrExit(mHasKey, error = CHIP_ERROR_INCORRECT_STATE);
-
-    if (output_size >= mPubkeyLength)
-    {
-        memcpy(output, mPubkeyRef, mPubkeyLength);
-        *output_length = mPubkeyLength;
-    }
-    else
-    {
-        error = CHIP_ERROR_BUFFER_TOO_SMALL;
-    }
-exit:
-    return error;
-}
-
-EFR32OpaqueKeyId EFR32OpaqueKeypair::GetKeyId() const
-{
-    if (!mHasKey)
-    {
-        return kEFR32OpaqueKeyIdUnknown;
-    }
-
-    if (!mIsPersistent)
-    {
-        return kEFR32OpaqueKeyIdVolatile;
-    }
-
-    return opaque_key_id_from_psa(*(mbedtls_svc_key_id_t *) mContext);
-}
-
-CHIP_ERROR EFR32OpaqueKeypair::Sign(const uint8_t * msg, size_t msg_len, uint8_t * output, size_t output_size,
-                                    size_t * output_length) const
-{
-    CHIP_ERROR error    = CHIP_NO_ERROR;
-    psa_status_t status = PSA_ERROR_BAD_STATE;
-
-    VerifyOrExit(mContext, error = CHIP_ERROR_INCORRECT_STATE);
-    VerifyOrExit(mHasKey, error = CHIP_ERROR_INCORRECT_STATE);
-
-    status = psa_sign_message(*(mbedtls_svc_key_id_t *) mContext, PSA_ALG_ECDSA(PSA_ALG_SHA_256), msg, msg_len, output, output_size,
-                              output_length);
-
-    VerifyOrExit(status == PSA_SUCCESS, {
-        _log_PSA_error(status);
-        error = CHIP_ERROR_INTERNAL;
-    });
-
-exit:
-    return error;
-}
-
-CHIP_ERROR EFR32OpaqueKeypair::Derive(const uint8_t * their_key, size_t their_key_len, uint8_t * output, size_t output_size,
-                                      size_t * output_length) const
-{
-    CHIP_ERROR error    = CHIP_NO_ERROR;
-    psa_status_t status = PSA_ERROR_BAD_STATE;
-
-    VerifyOrExit(mHasKey, error = CHIP_ERROR_INCORRECT_STATE);
-
-    status = psa_raw_key_agreement(PSA_ALG_ECDH, *(mbedtls_svc_key_id_t *) mContext, their_key, their_key_len, output, output_size,
-                                   output_length);
-
-    VerifyOrExit(status == PSA_SUCCESS, {
-        _log_PSA_error(status);
-        error = CHIP_ERROR_INTERNAL;
-    });
-
-exit:
-    return error;
-}
-
-CHIP_ERROR EFR32OpaqueKeypair::Delete()
-{
-    CHIP_ERROR error    = CHIP_NO_ERROR;
-    psa_status_t status = PSA_ERROR_BAD_STATE;
-
-    VerifyOrExit(mHasKey, error = CHIP_ERROR_INCORRECT_STATE);
-
-    status = psa_destroy_key(*(mbedtls_svc_key_id_t *) mContext);
-    VerifyOrExit(status == PSA_SUCCESS, {
-        _log_PSA_error(status);
-        error = CHIP_ERROR_INTERNAL;
-    });
-
-exit:
-    mHasKey       = false;
-    mIsPersistent = false;
-    memset(mPubkeyRef, 0, mPubkeySize);
-    if (mContext)
-    {
-        *(mbedtls_svc_key_id_t *) mContext = 0;
-    }
-    return error;
-}
-
-/*******************************************************************************
- *
- * PSA Crypto backed implementation of EFR32OpaqueP256Keypair
- *
- ******************************************************************************/
-EFR32OpaqueP256Keypair::EFR32OpaqueP256Keypair()
-{
-    mPubkeyRef    = mPubKey.Bytes();
-    mPubkeySize   = mPubKey.Length();
-    mPubkeyLength = 0;
-}
-
-EFR32OpaqueP256Keypair::~EFR32OpaqueP256Keypair() {}
-
-CHIP_ERROR EFR32OpaqueP256Keypair::Initialize()
-{
-    if (mPubkeyLength > 0)
-    {
-        // already have a key - ECDH use case where CASESession is calling Initialize()
-        return CHIP_NO_ERROR;
-    }
-
-    ChipLogError(Crypto, "Initialize() is invalid on opaque keys, use Create() instead");
-    return CHIP_ERROR_NOT_IMPLEMENTED;
-}
-
-CHIP_ERROR EFR32OpaqueP256Keypair::Serialize(P256SerializedKeypair & output) const
-{
-    ChipLogError(Crypto, "Serialisation is invalid on opaque keys, share the object instead");
-    return CHIP_ERROR_NOT_IMPLEMENTED;
-}
-
-CHIP_ERROR EFR32OpaqueP256Keypair::Deserialize(P256SerializedKeypair & input)
-{
-    ChipLogError(Crypto, "Serialisation is invalid on opaque keys");
-    return CHIP_ERROR_NOT_IMPLEMENTED;
-}
-
-CHIP_ERROR EFR32OpaqueP256Keypair::NewCertificateSigningRequest(uint8_t * out_csr, size_t & csr_length) const
-{
-    MutableByteSpan csr(out_csr, csr_length);
-    CHIP_ERROR err = GenerateCertificateSigningRequest(this, csr);
-    csr_length     = (CHIP_NO_ERROR == err) ? csr.size() : 0;
-    return err;
-}
-
-CHIP_ERROR EFR32OpaqueP256Keypair::ECDSA_sign_msg(const uint8_t * msg, size_t msg_length, P256ECDSASignature & out_signature) const
-{
-    CHIP_ERROR error     = CHIP_NO_ERROR;
-    size_t output_length = 0;
-
-    VerifyOrExit((msg != nullptr) && (msg_length > 0), error = CHIP_ERROR_INVALID_ARGUMENT);
-
-    error = Sign(msg, msg_length, out_signature.Bytes(), out_signature.Capacity(), &output_length);
-
-    SuccessOrExit(error);
-    SuccessOrExit(out_signature.SetLength(output_length));
-exit:
-    return error;
-}
-
-CHIP_ERROR EFR32OpaqueP256Keypair::ECDH_derive_secret(const P256PublicKey & remote_public_key,
-                                                      P256ECDHDerivedSecret & out_secret) const
-{
-    CHIP_ERROR error     = CHIP_NO_ERROR;
-    size_t output_length = 0;
-
-    error = Derive(Uint8::to_const_uchar(remote_public_key), remote_public_key.Length(), Uint8::to_uchar(out_secret),
-                   (out_secret.Length() == 0) ? out_secret.Capacity() : out_secret.Length(), &output_length);
-
-    SuccessOrExit(error);
-    SuccessOrExit(out_secret.SetLength(output_length));
-exit:
-    return error;
-}
-
-const P256PublicKey & EFR32OpaqueP256Keypair::Pubkey() const
-{
-    return mPubKey;
-}
-
-} // namespace Internal
-} // namespace DeviceLayer
-} // namespace chip
diff --git a/src/platform/silabs/SiWx917/Efr32PsaOperationalKeystore.cpp b/src/platform/silabs/SiWx917/Efr32PsaOperationalKeystore.cpp
deleted file mode 100644
index e8fdf61..0000000
--- a/src/platform/silabs/SiWx917/Efr32PsaOperationalKeystore.cpp
+++ /dev/null
@@ -1,455 +0,0 @@
-/*
- *    Copyright (c) 2022 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.
- */
-#include "Efr32PsaOperationalKeystore.h"
-
-#include <crypto/OperationalKeystore.h>
-#include <lib/core/CHIPError.h>
-#include <lib/core/CHIPTLV.h>
-#include <lib/core/DataModelTypes.h>
-#include <lib/support/CHIPMem.h>
-#include <lib/support/CodeUtils.h>
-#include <lib/support/SafeInt.h>
-
-#include "Efr32OpaqueKeypair.h"
-#include <platform/silabs/SilabsConfig.h>
-
-namespace chip {
-namespace DeviceLayer {
-namespace Internal {
-
-static_assert((sizeof(FabricIndex) == 1), "Implementation is not prepared for large fabric indices");
-static_assert(SL_MATTER_MAX_STORED_OP_KEYS <= (kEFR32OpaqueKeyIdPersistentMax - kEFR32OpaqueKeyIdPersistentMin),
-              "Not enough opaque keys available to cover all requested operational keys");
-static_assert((CHIP_CONFIG_MAX_FABRICS + 1) <= SL_MATTER_MAX_STORED_OP_KEYS,
-              "Not enough operational keys requested to cover all potential fabrics (+1 staging for fabric update)");
-static_assert(SL_MATTER_MAX_STORED_OP_KEYS >= 1, "Minimum supported amount of operational keys is 1");
-
-using namespace chip::Crypto;
-
-using chip::Platform::MemoryCalloc;
-using chip::Platform::MemoryFree;
-
-Efr32PsaOperationalKeystore::~Efr32PsaOperationalKeystore()
-{
-    Deinit();
-}
-
-CHIP_ERROR Efr32PsaOperationalKeystore::Init()
-{
-    // Detect existing keymap size
-    CHIP_ERROR error   = CHIP_NO_ERROR;
-    size_t wantedLen   = SL_MATTER_MAX_STORED_OP_KEYS * sizeof(FabricIndex);
-    size_t existingLen = 0;
-    bool update_cache  = false;
-
-    if (SILABSConfig::ConfigValueExists(SILABSConfig::kConfigKey_OpKeyMap, existingLen))
-    {
-        // There's a pre-existing key map on disk. Size the map to read it fully.
-        size_t outLen = 0;
-
-        if (existingLen > (kEFR32OpaqueKeyIdPersistentMax - kEFR32OpaqueKeyIdPersistentMin) * sizeof(FabricIndex))
-        {
-            return CHIP_ERROR_INTERNAL;
-        }
-
-        // Upsize the map if the config was changed
-        if (existingLen < wantedLen)
-        {
-            existingLen = wantedLen;
-        }
-
-        mKeyMap = (FabricIndex *) MemoryCalloc(1, existingLen);
-        VerifyOrExit(mKeyMap, error = CHIP_ERROR_NO_MEMORY);
-
-        // Read the existing key map
-        error = SILABSConfig::ReadConfigValueBin(SILABSConfig::kConfigKey_OpKeyMap, (uint8_t *) mKeyMap, existingLen, outLen);
-        SuccessOrExit(error);
-
-        // If upsizing, extend the map with undefined indices
-        for (size_t i = (outLen / sizeof(FabricIndex)); i < (existingLen / sizeof(FabricIndex)); i++)
-        {
-            mKeyMap[i] = kUndefinedFabricIndex;
-        }
-
-        // If the config has changed, check whether it can be downsized fully or partially
-        if (existingLen > wantedLen)
-        {
-            size_t highest_found_index = 0;
-            for (size_t i = (wantedLen / sizeof(FabricIndex)); i < (existingLen / sizeof(FabricIndex)); i++)
-            {
-                if (mKeyMap[i] != kUndefinedFabricIndex)
-                {
-                    highest_found_index = i;
-                }
-            }
-
-            // set size to the smallest that will fit the upper opaque key ID in use
-            if (highest_found_index > 0)
-            {
-                existingLen  = (highest_found_index + 1) * sizeof(FabricIndex);
-                update_cache = true;
-            }
-        }
-
-        // Set the key map size
-        mKeyMapSize = existingLen;
-    }
-    else
-    {
-        // No key map on disk. Create and initialize a new one.
-        mKeyMap = (FabricIndex *) MemoryCalloc(1, wantedLen);
-        VerifyOrExit(mKeyMap, error = CHIP_ERROR_NO_MEMORY);
-
-        for (size_t i = 0; i < (wantedLen / sizeof(FabricIndex)); i++)
-        {
-            mKeyMap[i] = kUndefinedFabricIndex;
-        }
-
-        mKeyMapSize = wantedLen;
-
-        update_cache = true;
-    }
-
-    // Write-out keymap if needed
-    if (update_cache)
-    {
-        error = SILABSConfig::WriteConfigValueBin(SILABSConfig::kConfigKey_OpKeyMap, mKeyMap, mKeyMapSize);
-        SuccessOrExit(error);
-    }
-
-    // Initialize cache key
-    mCachedKey = Platform::New<EFR32OpaqueP256Keypair>();
-    VerifyOrExit(mCachedKey, error = CHIP_ERROR_NO_MEMORY);
-
-exit:
-    if (error != CHIP_NO_ERROR)
-    {
-        Deinit();
-        return error;
-    }
-
-    mIsInitialized = true;
-    return CHIP_NO_ERROR;
-}
-
-EFR32OpaqueKeyId Efr32PsaOperationalKeystore::FindKeyIdForFabric(FabricIndex fabricIndex) const
-{
-    // Search the map linearly to find a matching index slot
-    for (size_t i = 0; i < (mKeyMapSize / sizeof(FabricIndex)); i++)
-    {
-        if (mKeyMap[i] == fabricIndex)
-        {
-            // Found a match
-            return i + kEFR32OpaqueKeyIdPersistentMin;
-        }
-    }
-
-    return kEFR32OpaqueKeyIdUnknown;
-}
-
-bool Efr32PsaOperationalKeystore::HasOpKeypairForFabric(FabricIndex fabricIndex) const
-{
-    VerifyOrReturnError(mIsInitialized, false);
-    VerifyOrReturnError(IsValidFabricIndex(fabricIndex), false);
-
-    // If there was a pending keypair, then there's really a usable key
-    if (mIsPendingKeypairActive && (fabricIndex == mPendingFabricIndex) && (mPendingKeypair != nullptr))
-    {
-        return true;
-    }
-
-    // Check whether we have a match in the map
-    if (FindKeyIdForFabric(fabricIndex) != kEFR32OpaqueKeyIdUnknown)
-    {
-        return true;
-    }
-
-    return false;
-}
-
-CHIP_ERROR Efr32PsaOperationalKeystore::NewOpKeypairForFabric(FabricIndex fabricIndex,
-                                                              MutableByteSpan & outCertificateSigningRequest)
-{
-    CHIP_ERROR error = CHIP_NO_ERROR;
-    VerifyOrReturnError(mIsInitialized, CHIP_ERROR_WELL_UNINITIALIZED);
-    VerifyOrReturnError(IsValidFabricIndex(fabricIndex), CHIP_ERROR_INVALID_FABRIC_INDEX);
-
-    // If a key is pending, we cannot generate for a different fabric index until we commit or revert.
-    if ((mPendingFabricIndex != kUndefinedFabricIndex) && (fabricIndex != mPendingFabricIndex))
-    {
-        return CHIP_ERROR_INVALID_FABRIC_INDEX;
-    }
-
-    VerifyOrReturnError(outCertificateSigningRequest.size() >= Crypto::kMAX_CSR_Length, CHIP_ERROR_BUFFER_TOO_SMALL);
-
-    // Generate new key
-    EFR32OpaqueKeyId id = kEFR32OpaqueKeyIdUnknown;
-
-    if (mPendingFabricIndex != kUndefinedFabricIndex)
-    {
-        // If we already have a pending key, delete it and put a new one in its place
-        id = mPendingKeypair->GetKeyId();
-        if (id == kEFR32OpaqueKeyIdUnknown)
-        {
-            ResetPendingKey();
-        }
-        else
-        {
-            mPendingKeypair->Delete();
-            if (id == kEFR32OpaqueKeyIdVolatile)
-            {
-                id = kEFR32OpaqueKeyIdUnknown;
-            }
-        }
-    }
-
-    if (id == kEFR32OpaqueKeyIdUnknown)
-    {
-        // Try to find an available opaque ID in the map
-        id = FindKeyIdForFabric(kUndefinedFabricIndex);
-
-        if (!mPendingKeypair)
-        {
-            mPendingKeypair = Platform::New<EFR32OpaqueP256Keypair>();
-        }
-    }
-
-    if (id == kEFR32OpaqueKeyIdUnknown)
-    {
-        // Could not find a free spot in the map
-        return CHIP_ERROR_NO_MEMORY;
-    }
-
-    // Create new key on the old or found key ID
-    error = mPendingKeypair->Create(id, EFR32OpaqueKeyUsages::ECDSA_P256_SHA256);
-    if (error != CHIP_NO_ERROR)
-    {
-        ResetPendingKey();
-        return error;
-    }
-
-    // Set CSR and state
-    size_t csrLength = outCertificateSigningRequest.size();
-    error            = mPendingKeypair->NewCertificateSigningRequest(outCertificateSigningRequest.data(), csrLength);
-    if (error != CHIP_NO_ERROR)
-    {
-        ResetPendingKey();
-        return error;
-    }
-
-    outCertificateSigningRequest.reduce_size(csrLength);
-    mPendingFabricIndex = fabricIndex;
-
-    return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR Efr32PsaOperationalKeystore::ActivateOpKeypairForFabric(FabricIndex fabricIndex,
-                                                                   const Crypto::P256PublicKey & nocPublicKey)
-{
-    VerifyOrReturnError(mIsInitialized, CHIP_ERROR_WELL_UNINITIALIZED);
-    VerifyOrReturnError(mPendingKeypair != nullptr, CHIP_ERROR_INVALID_FABRIC_INDEX);
-    VerifyOrReturnError(IsValidFabricIndex(fabricIndex) && (fabricIndex == mPendingFabricIndex), CHIP_ERROR_INVALID_FABRIC_INDEX);
-
-    // Validate public key being activated matches last generated pending keypair
-    VerifyOrReturnError(mPendingKeypair->Pubkey().Matches(nocPublicKey), CHIP_ERROR_INVALID_PUBLIC_KEY);
-
-    mIsPendingKeypairActive = true;
-
-    return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR Efr32PsaOperationalKeystore::CommitOpKeypairForFabric(FabricIndex fabricIndex)
-{
-    VerifyOrReturnError(mIsInitialized, CHIP_ERROR_WELL_UNINITIALIZED);
-    VerifyOrReturnError(mPendingKeypair != nullptr, CHIP_ERROR_INVALID_FABRIC_INDEX);
-    VerifyOrReturnError(IsValidFabricIndex(fabricIndex) && (fabricIndex == mPendingFabricIndex), CHIP_ERROR_INVALID_FABRIC_INDEX);
-    VerifyOrReturnError(mIsPendingKeypairActive == true, CHIP_ERROR_INCORRECT_STATE);
-
-    // Add key association to key map
-    EFR32OpaqueKeyId id = mPendingKeypair->GetKeyId();
-
-    if (id == kEFR32OpaqueKeyIdUnknown || id == kEFR32OpaqueKeyIdVolatile)
-    {
-        ResetPendingKey();
-        return CHIP_ERROR_INTERNAL;
-    }
-
-    // Guard against array out-of-bounds (should not happen with correctly initialised keys)
-    size_t keymap_index = id - kEFR32OpaqueKeyIdPersistentMin;
-    if (keymap_index >= (mKeyMapSize / sizeof(FabricIndex)))
-    {
-        return CHIP_ERROR_INTERNAL;
-    }
-
-    if (mKeyMap[keymap_index] != kUndefinedFabricIndex)
-    {
-        ResetPendingKey();
-        return CHIP_ERROR_INTERNAL;
-    }
-
-    mKeyMap[keymap_index] = fabricIndex;
-
-    // Persist key map
-    CHIP_ERROR error = SILABSConfig::WriteConfigValueBin(SILABSConfig::kConfigKey_OpKeyMap, mKeyMap, mKeyMapSize);
-    if (error != CHIP_NO_ERROR)
-    {
-        return error;
-    }
-
-    // There's a good chance we'll need the key again soon
-    mCachedKey->Load(id);
-
-    mPendingKeypair         = nullptr;
-    mIsPendingKeypairActive = false;
-    mPendingFabricIndex     = kUndefinedFabricIndex;
-
-    return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR Efr32PsaOperationalKeystore::RemoveOpKeypairForFabric(FabricIndex fabricIndex)
-{
-    VerifyOrReturnError(mIsInitialized, CHIP_ERROR_WELL_UNINITIALIZED);
-    VerifyOrReturnError(IsValidFabricIndex(fabricIndex), CHIP_ERROR_INVALID_FABRIC_INDEX);
-
-    // Remove pending keypair if we have it and the fabric ID matches
-    if ((mPendingKeypair != nullptr) && (fabricIndex == mPendingFabricIndex))
-    {
-        RevertPendingKeypair();
-    }
-
-    EFR32OpaqueKeyId id = FindKeyIdForFabric(fabricIndex);
-    if (id == kEFR32OpaqueKeyIdUnknown)
-    {
-        // Fabric is not in the map, so assume it's gone already
-        return CHIP_NO_ERROR;
-    }
-
-    // Guard against array out-of-bounds (should not happen with correctly initialised keys)
-    size_t keymap_index = id - kEFR32OpaqueKeyIdPersistentMin;
-    if (keymap_index >= (mKeyMapSize / sizeof(FabricIndex)))
-    {
-        return CHIP_ERROR_INTERNAL;
-    }
-
-    // Reset the key mapping since we'll be deleting this key
-    mKeyMap[keymap_index] = kUndefinedFabricIndex;
-
-    // Persist key map
-    CHIP_ERROR error = SILABSConfig::WriteConfigValueBin(SILABSConfig::kConfigKey_OpKeyMap, mKeyMap, mKeyMapSize);
-    if (error != CHIP_NO_ERROR)
-    {
-        return error;
-    }
-
-    // Check if key is cached
-    EFR32OpaqueKeyId cachedId = mCachedKey->GetKeyId();
-
-    if (id == cachedId)
-    {
-        // Delete from persistent storage and unload
-        mCachedKey->Delete();
-        return CHIP_NO_ERROR;
-    }
-
-    // Load it for purposes of deletion
-    error = mCachedKey->Load(id);
-    if (error != CHIP_NO_ERROR && error != CHIP_DEVICE_ERROR_CONFIG_NOT_FOUND)
-    {
-        return CHIP_ERROR_INTERNAL;
-    }
-
-    mCachedKey->Delete();
-
-    return CHIP_NO_ERROR;
-}
-
-void Efr32PsaOperationalKeystore::RevertPendingKeypair()
-{
-    if (mIsInitialized)
-    {
-        // Just delete the pending key from storage
-        ResetPendingKey();
-    }
-}
-
-CHIP_ERROR Efr32PsaOperationalKeystore::SignWithOpKeypair(FabricIndex fabricIndex, const ByteSpan & message,
-                                                          Crypto::P256ECDSASignature & outSignature) const
-{
-    VerifyOrReturnError(mIsInitialized, CHIP_ERROR_WELL_UNINITIALIZED);
-    VerifyOrReturnError(IsValidFabricIndex(fabricIndex), CHIP_ERROR_INVALID_FABRIC_INDEX);
-
-    // Check to see whether the key is an activated pending key
-    if (mIsPendingKeypairActive && (fabricIndex == mPendingFabricIndex))
-    {
-        VerifyOrReturnError(mPendingKeypair != nullptr, CHIP_ERROR_INTERNAL);
-        return mPendingKeypair->ECDSA_sign_msg(message.data(), message.size(), outSignature);
-    }
-
-    // Figure out which key ID we're looking for
-    EFR32OpaqueKeyId id = FindKeyIdForFabric(fabricIndex);
-
-    if (id == kEFR32OpaqueKeyIdUnknown)
-    {
-        // Fabric is not in the map, but the caller thinks it's there?
-        return CHIP_ERROR_INTERNAL;
-    }
-
-    // Check whether we have the key in cache
-    EFR32OpaqueKeyId cachedId = mCachedKey->GetKeyId();
-
-    if (id == cachedId)
-    {
-        return mCachedKey->ECDSA_sign_msg(message.data(), message.size(), outSignature);
-    }
-
-    // If not, we need to recreate from the backend
-    CHIP_ERROR error = mCachedKey->Load(id);
-    if (error != CHIP_NO_ERROR)
-    {
-        return CHIP_ERROR_INTERNAL;
-    }
-
-    // Sign with retrieved key
-    error = mCachedKey->ECDSA_sign_msg(message.data(), message.size(), outSignature);
-    if (error != CHIP_NO_ERROR)
-    {
-        return CHIP_ERROR_INTERNAL;
-    }
-
-    return CHIP_NO_ERROR;
-}
-
-Crypto::P256Keypair * Efr32PsaOperationalKeystore::AllocateEphemeralKeypairForCASE()
-{
-    EFR32OpaqueP256Keypair * new_key = Platform::New<EFR32OpaqueP256Keypair>();
-
-    if (new_key != nullptr)
-    {
-        new_key->Create(kEFR32OpaqueKeyIdVolatile, EFR32OpaqueKeyUsages::ECDH_P256);
-    }
-
-    return new_key;
-}
-
-void Efr32PsaOperationalKeystore::ReleaseEphemeralKeypair(Crypto::P256Keypair * keypair)
-{
-    Platform::Delete<EFR32OpaqueP256Keypair>((EFR32OpaqueP256Keypair *) keypair);
-}
-
-} // namespace Internal
-} // namespace DeviceLayer
-} // namespace chip
diff --git a/src/platform/silabs/SiWx917/Efr32PsaOperationalKeystore.h b/src/platform/silabs/SiWx917/Efr32PsaOperationalKeystore.h
deleted file mode 100644
index 4203724..0000000
--- a/src/platform/silabs/SiWx917/Efr32PsaOperationalKeystore.h
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- *    Copyright (c) 2022 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.
- */
-
-#pragma once
-
-#include <crypto/OperationalKeystore.h>
-#include <lib/core/CHIPConfig.h>
-
-#include <psa/crypto.h>
-
-#include "Efr32OpaqueKeypair.h"
-#include <platform/CHIPDeviceLayer.h>
-
-// Set SL_MATTER_MAX_STORED_OP_KEYS to the preferred size of the mapping table
-// between fabric IDs and opaque key indices. It can not be less than
-// CHIP_CONFIG_MAX_FABRICS + 1 (since there would be too few map elements to
-// support all fabrics the application wants to support in addition to an extra
-// pending key), but can be larger in case a consistent on-disk size of the map
-// is required.
-#ifndef SL_MATTER_MAX_STORED_OP_KEYS
-#define SL_MATTER_MAX_STORED_OP_KEYS (CHIP_CONFIG_MAX_FABRICS + 1)
-#endif
-
-namespace chip {
-namespace DeviceLayer {
-namespace Internal {
-
-/**
- * @brief OperationalKeystore implementation making use of the EFR32 SDK-provided
- *        storage mechanisms to load/store keypairs.
- *
- * WARNING: Ensure that any implementation that uses this one as a starting point
- *          DOES NOT have the raw key material (in usable form) passed up/down to
- *          direct storage APIs that may make copies on heap/stack without sanitization.
- */
-class Efr32PsaOperationalKeystore : public chip::Crypto::OperationalKeystore
-{
-public:
-    Efr32PsaOperationalKeystore(){};
-    virtual ~Efr32PsaOperationalKeystore() override;
-
-    // Non-copyable
-    Efr32PsaOperationalKeystore(Efr32PsaOperationalKeystore const &) = delete;
-    void operator=(Efr32PsaOperationalKeystore const &) = delete;
-
-    /**
-     * @brief Initialize the Operational Keystore
-     */
-    CHIP_ERROR Init();
-
-    bool HasPendingOpKeypair() const override { return (mPendingKeypair != nullptr); }
-
-    bool HasOpKeypairForFabric(FabricIndex fabricIndex) const override;
-    CHIP_ERROR NewOpKeypairForFabric(FabricIndex fabricIndex, MutableByteSpan & outCertificateSigningRequest) override;
-    CHIP_ERROR ActivateOpKeypairForFabric(FabricIndex fabricIndex, const chip::Crypto::P256PublicKey & nocPublicKey) override;
-    CHIP_ERROR CommitOpKeypairForFabric(FabricIndex fabricIndex) override;
-    CHIP_ERROR RemoveOpKeypairForFabric(FabricIndex fabricIndex) override;
-    void RevertPendingKeypair() override;
-    CHIP_ERROR SignWithOpKeypair(FabricIndex fabricIndex, const ByteSpan & message,
-                                 chip::Crypto::P256ECDSASignature & outSignature) const override;
-    Crypto::P256Keypair * AllocateEphemeralKeypairForCASE() override;
-    void ReleaseEphemeralKeypair(chip::Crypto::P256Keypair * keypair) override;
-
-protected:
-    // The keymap maps PSA Crypto persistent key ID offsets against fabric IDs.
-    // The keymap is persisted in NVM3, and the keys are stored through the PSA
-    // API.
-    FabricIndex * mKeyMap = nullptr;
-    size_t mKeyMapSize    = 0;
-
-    // The key cache is to avoid having to reconstruct keys from the storage
-    // backend all the time (since it is rather slow).
-    EFR32OpaqueP256Keypair * mCachedKey = nullptr;
-
-    // This pending fabric index is `kUndefinedFabricIndex` if there isn't a
-    // pending keypair override for a given fabric.
-    FabricIndex mPendingFabricIndex          = kUndefinedFabricIndex;
-    EFR32OpaqueP256Keypair * mPendingKeypair = nullptr;
-    bool mIsPendingKeypairActive             = false;
-    bool mIsInitialized                      = false;
-
-private:
-    void ResetPendingKey()
-    {
-        if (mPendingKeypair != nullptr)
-        {
-            mPendingKeypair->Delete();
-            Platform::Delete(mPendingKeypair);
-        }
-        mPendingKeypair         = nullptr;
-        mIsPendingKeypairActive = false;
-        mPendingFabricIndex     = kUndefinedFabricIndex;
-    }
-
-    void Deinit()
-    {
-        ResetPendingKey();
-
-        if (mCachedKey != nullptr)
-        {
-            Platform::Delete<EFR32OpaqueP256Keypair>(mCachedKey);
-            mCachedKey = nullptr;
-        }
-
-        if (mKeyMap != nullptr)
-        {
-            Platform::MemoryFree(mKeyMap);
-            mKeyMap     = nullptr;
-            mKeyMapSize = 0;
-        }
-
-        mIsInitialized = false;
-    }
-
-    /**
-     * @brief Find the opaque key ID stored in the map for a given
-     *        fabric ID.
-     *
-     * @param fabricIndex The fabric index to find the opaque key ID for.
-     *                    Can also be kUndefinedFabricIndex to find the first
-     *                    unoccupied key ID.
-     *
-     * @return a valid key ID on match, or kEFR32OpaqueKeyIdUnknown if no
-     *         match is found.
-     */
-    EFR32OpaqueKeyId FindKeyIdForFabric(FabricIndex fabricIndex) const;
-};
-
-} // namespace Internal
-} // namespace DeviceLayer
-} // namespace chip
diff --git a/src/platform/silabs/SiWx917/PlatformManagerImpl.cpp b/src/platform/silabs/SiWx917/PlatformManagerImpl.cpp
index 25de6d5..8032c84 100644
--- a/src/platform/silabs/SiWx917/PlatformManagerImpl.cpp
+++ b/src/platform/silabs/SiWx917/PlatformManagerImpl.cpp
@@ -24,6 +24,7 @@
 /* this file behaves like a config.h, comes first */
 #include <platform/internal/CHIPDeviceLayerInternal.h>
 
+#include <crypto/CHIPCryptoPAL.h>
 #include <platform/FreeRTOS/SystemTimeSupport.h>
 #include <platform/KeyValueStoreManager.h>
 #include <platform/PlatformManager.h>
@@ -42,6 +43,24 @@
 
 PlatformManagerImpl PlatformManagerImpl::sInstance;
 
+static void app_get_random(uint8_t * aOutput, size_t aLen)
+{
+    size_t i;
+
+    for (i = 0; i < aLen; i++)
+    {
+        aOutput[i] = rand();
+    }
+}
+
+static int app_entropy_source(void * data, unsigned char * output, size_t len, size_t * olen)
+{
+    app_get_random(reinterpret_cast<uint8_t *>(output), static_cast<uint16_t>(len));
+    *olen = len;
+
+    return 0;
+}
+
 CHIP_ERROR PlatformManagerImpl::_InitChipStack(void)
 {
     CHIP_ERROR err;
@@ -57,6 +76,9 @@
 
     ReturnErrorOnFailure(System::Clock::InitClock_RealTime());
 
+    // 16 : Threshold value
+    ReturnErrorOnFailure(chip::Crypto::add_entropy_source(app_entropy_source, NULL, 16));
+
     // Call _InitChipStack() on the generic implementation base class
     // to finish the initialization process.
     err = Internal::GenericPlatformManagerImpl_FreeRTOS<PlatformManagerImpl>::_InitChipStack();
diff --git a/src/platform/silabs/SiWx917/ThreadStackManagerImpl.cpp b/src/platform/silabs/SiWx917/ThreadStackManagerImpl.cpp
deleted file mode 100644
index 16d7922..0000000
--- a/src/platform/silabs/SiWx917/ThreadStackManagerImpl.cpp
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- *
- *    Copyright (c) 2020 Project CHIP Authors
- *    Copyright (c) 2019 Nest Labs, Inc.
- *
- *    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
- *          Provides an implementation of the ThreadStackManager object for
- *          EFR32 platforms using the Silicon Labs SDK and the OpenThread
- *          stack.
- *
- */
-/* this file behaves like a config.h, comes first */
-#include <platform/internal/CHIPDeviceLayerInternal.h>
-
-#include <platform/FreeRTOS/GenericThreadStackManagerImpl_FreeRTOS.cpp>
-#include <platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.cpp>
-#include <platform/OpenThread/OpenThreadUtils.h>
-#include <platform/ThreadStackManager.h>
-
-#include <openthread/platform/entropy.h>
-
-#include <lib/support/CHIPPlatformMemory.h>
-
-namespace chip {
-namespace DeviceLayer {
-
-using namespace ::chip::DeviceLayer::Internal;
-
-ThreadStackManagerImpl ThreadStackManagerImpl::sInstance;
-
-CHIP_ERROR ThreadStackManagerImpl::_InitThreadStack(void)
-{
-    return InitThreadStack(NULL);
-}
-
-CHIP_ERROR ThreadStackManagerImpl::InitThreadStack(otInstance * otInst)
-{
-    CHIP_ERROR err = CHIP_NO_ERROR;
-
-    // Initialize the generic implementation base classes.
-    err = GenericThreadStackManagerImpl_FreeRTOS<ThreadStackManagerImpl>::DoInit();
-    SuccessOrExit(err);
-    err = GenericThreadStackManagerImpl_OpenThread<ThreadStackManagerImpl>::DoInit(otInst);
-    SuccessOrExit(err);
-
-exit:
-    return err;
-}
-
-bool ThreadStackManagerImpl::IsInitialized()
-{
-    return sInstance.mThreadStackLock != NULL;
-}
-
-} // namespace DeviceLayer
-} // namespace chip
-
-using namespace ::chip::DeviceLayer;
-
-/**
- * Glue function called directly by the OpenThread stack when tasklet processing work
- * is pending.
- */
-extern "C" void otTaskletsSignalPending(otInstance * p_instance)
-{
-    ThreadStackMgrImpl().SignalThreadActivityPending();
-}
-
-/**
- * Glue function called directly by the OpenThread stack when system event processing work
- * is pending.
- */
-extern "C" void otSysEventSignalPending(void)
-{
-    BaseType_t yieldRequired = ThreadStackMgrImpl().SignalThreadActivityPendingFromISR();
-    portYIELD_FROM_ISR(yieldRequired);
-}
-
-extern "C" void * otPlatCAlloc(size_t aNum, size_t aSize)
-{
-    return CHIPPlatformMemoryCalloc(aNum, aSize);
-}
-
-extern "C" void otPlatFree(void * aPtr)
-{
-    CHIPPlatformMemoryFree(aPtr);
-}
-
-extern "C" __WEAK void sl_openthread_init(void)
-{
-    // Place holder for enabling Silabs specific features available only through Simplicity Studio
-}
-
-/**
- * @brief Openthread UART implementation for the CLI is conflicting
- *        with the UART implemented for Pigweed RPC as they use the same UART port
- *
- *        We now only build the uart as implemented in
- *        connectedhomeip/examples/platform/efr32/uart.c
- *        and remap OT functions to use our uart api.
- *
- *        For now OT CLI isn't usable when the examples are built with pw_rpc
- */
-
-#ifndef PW_RPC_ENABLED
-#include "uart.h"
-#endif
-
-extern "C" otError otPlatUartEnable(void)
-{
-#ifdef PW_RPC_ENABLED
-    return OT_ERROR_NOT_IMPLEMENTED;
-#else
-    uartConsoleInit();
-    return OT_ERROR_NONE;
-#endif
-}
-
-#if CHIP_DEVICE_CONFIG_THREAD_ENABLE_CLI
-
-extern "C" otError otPlatUartSend(const uint8_t * aBuf, uint16_t aBufLength)
-{
-#ifdef PW_RPC_ENABLED
-    return OT_ERROR_NOT_IMPLEMENTED;
-#else
-    if (uartConsoleWrite((const char *) aBuf, aBufLength) > 0)
-    {
-        otPlatUartSendDone();
-        return OT_ERROR_NONE;
-    }
-    return OT_ERROR_FAILED;
-#endif
-}
-
-extern "C" void efr32UartProcess(void)
-{
-#if !defined(PW_RPC_ENABLED) && !defined(ENABLE_CHIP_SHELL)
-    uint8_t tempBuf[128] = { 0 };
-    // will read the data available up to 128bytes
-    uint16_t count = uartConsoleRead((char *) tempBuf, 128);
-    if (count > 0)
-    {
-        // ot process Received data for CLI cmds
-        otPlatUartReceived(tempBuf, count);
-    }
-#endif
-}
-
-extern "C" __WEAK otError otPlatUartFlush(void)
-{
-    return OT_ERROR_NOT_IMPLEMENTED;
-}
-
-extern "C" __WEAK otError otPlatUartDisable(void)
-{
-    return OT_ERROR_NOT_IMPLEMENTED;
-}
-
-#endif // CHIP_DEVICE_CONFIG_THREAD_ENABLE_CLI
diff --git a/src/platform/silabs/SiWx917/args.gni b/src/platform/silabs/SiWx917/args.gni
index 6e7ac8d..4fa9a22 100644
--- a/src/platform/silabs/SiWx917/args.gni
+++ b/src/platform/silabs/SiWx917/args.gni
@@ -16,7 +16,7 @@
 import("//build_overrides/efr32_sdk.gni")
 import("//build_overrides/pigweed.gni")
 
-import("${chip_root}/examples/platform/silabs/efr32/args.gni")
+import("${chip_root}/examples/platform/silabs/SiWx917/args.gni")
 import("${chip_root}/src/crypto/crypto.gni")
 
 # ARM architecture flags will be set based on silabs_family.
@@ -26,12 +26,7 @@
 
 openthread_external_mbedtls = mbedtls_target
 
-# default to platform crypto implementation but allow commandline override
-if (chip_crypto == "") {
-  chip_crypto = "platform"
-}
-
-chip_device_platform = "efr32"
+chip_device_platform = "SiWx917"
 
 #Net work configuration OpenThread
 lwip_platform = "efr32"
@@ -44,7 +39,7 @@
 chip_build_tests = false
 
 # Transitional CommissionableDataProvider not used anymore
-# examples/platform/silabs/efr32/EFR32DeviceDataProvider is now used.
+# examples/platform/silabs/SiWx917/SiWx917DeviceDataProvider is now used.
 chip_use_transitional_commissionable_data_provider = false
 
 openthread_root = "${chip_root}/third_party/openthread/ot-efr32/openthread"
diff --git a/src/platform/silabs/SiWx917/bluetooth/rsi_ble_config.h b/src/platform/silabs/SiWx917/bluetooth/rsi_ble_config.h
new file mode 100644
index 0000000..7849747
--- /dev/null
+++ b/src/platform/silabs/SiWx917/bluetooth/rsi_ble_config.h
@@ -0,0 +1,269 @@
+/*******************************************************************************
+ * @file  rsi_ble_config.h
+ * @brief
+ *******************************************************************************
+ * # License
+ * <b>Copyright 2020 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.
+ *
+ ******************************************************************************/
+
+#ifndef RSI_BLE_CONFIG_H
+#define RSI_BLE_CONFIG_H
+
+#include "rsi_ble_apis.h"
+#include <rsi_data_types.h>
+/******************************************************
+ * *                      Macros
+ * ******************************************************/
+//! application event list
+#define RSI_BLE_CONN_EVENT 0x01
+#define RSI_BLE_DISCONN_EVENT 0x02
+#define RSI_BLE_GATT_WRITE_EVENT 0x03
+#define RSI_BLE_MTU_EVENT 0x04
+#define RSI_BLE_GATT_INDICATION_CONFIRMATION 0x05
+#define RSI_BLE_RESP_ATT_VALUE 0x06
+#define RSI_SSID 0x0D
+#define RSI_SECTYPE 0x0E
+#define RSI_BLE_WLAN_DISCONN_NOTIFY 0x0F
+#define RSI_WLAN_ALREADY 0x10
+#define RSI_WLAN_NOT_ALREADY 0x11
+#define RSI_BLE_WLAN_TIMEOUT_NOTIFY 0x12
+#define RSI_BLE_WLAN_JOIN_STATUS 0x15
+#define RSI_APP_FW_VERSION 0x13
+#define RSI_BLE_WLAN_DISCONNECT_STATUS 0x14
+
+#define RSI_REM_DEV_ADDR_LEN 18
+#define RSI_REM_DEV_NAME_LEN 31
+
+#define RSI_BLE_DEV_NAME "CCP_DEVICE"
+#define RSI_BLE_SET_RAND_ADDR "00:23:A7:12:34:56"
+
+#define CLEAR_WHITELIST 0x00
+#define ADD_DEVICE_TO_WHITELIST 0x01
+#define DELETE_DEVICE_FROM_WHITELIST 0x02
+
+#define ALL_PHYS 0x00
+
+#define RSI_BLE_DEV_ADDR_RESOLUTION_ENABLE 0
+
+#define RSI_OPERMODE_WLAN_BLE 13
+
+/***********************************************************************************************************************************************/
+//! Characteristic Presenatation Format Fields
+/***********************************************************************************************************************************************/
+#define RSI_BLE_UINT8_FORMAT 0x04
+#define RSI_BLE_EXPONENT 0x00
+#define RSI_BLE_PERCENTAGE_UNITS_UUID 0x27AD
+#define RSI_BLE_NAME_SPACE 0x01
+#define RSI_BLE_DESCRIPTION 0x010B
+
+//! BLE characteristic custom service uuid
+#define RSI_BLE_CUSTOM_SERVICE_UUID 0xFFF6
+#define RSI_BLE_CUSTOM_LEVEL_UUID 0x1FF1
+
+#ifdef RSI_M4_INTERFACE
+#define RSI_BLE_MAX_NBR_ATT_REC 20
+#define RSI_BLE_MAX_NBR_SLAVES 1
+#define RSI_BLE_NUM_CONN_EVENTS 2
+#else
+#define RSI_BLE_MAX_NBR_ATT_REC 80
+#define RSI_BLE_MAX_NBR_SLAVES 3
+#define RSI_BLE_NUM_CONN_EVENTS 20
+#endif
+
+#define RSI_BLE_MAX_NBR_ATT_SERV 10
+
+#define RSI_BLE_MAX_NBR_MASTERS 1
+#define RSI_BLE_GATT_ASYNC_ENABLE 1
+#define RSI_BLE_GATT_INIT 0
+
+#define RSI_BLE_START_SCAN 0x01
+#define RSI_BLE_STOP_SCAN 0x00
+
+#define RSI_BLE_SCAN_TYPE SCAN_TYPE_ACTIVE
+#define RSI_BLE_SCAN_FILTER_TYPE SCAN_FILTER_TYPE_ALL
+/* Number of BLE GATT RECORD SIZE IN (n*16 BYTES), eg:(0x40*16)=1024 bytes */
+#define RSI_BLE_NUM_REC_BYTES 0x40
+
+#define RSI_BLE_INDICATE_CONFIRMATION_FROM_HOST 0
+
+/*=======================================================================*/
+//! Advertising command parameters
+/*=======================================================================*/
+
+#define RSI_BLE_ADV_TYPE UNDIR_CONN
+#define RSI_BLE_ADV_FILTER_TYPE ALLOW_SCAN_REQ_ANY_CONN_REQ_ANY
+#define RSI_BLE_ADV_DIR_ADDR_TYPE LE_PUBLIC_ADDRESS
+#define RSI_BLE_ADV_DIR_ADDR "00:15:83:6A:64:17"
+
+#define RSI_BLE_ADV_INT_MIN 0x100
+#define RSI_BLE_ADV_INT_MAX 0x200
+#define RSI_BLE_ADV_CHANNEL_MAP 0x07
+
+//! Advertise status
+//!  Start the advertising process
+#define RSI_BLE_START_ADV 0x01
+//! Stop the advertising process
+#define RSI_BLE_STOP_ADV 0x00
+
+//! BLE Tx Power Index On Air
+#define RSI_BLE_PWR_INX 30
+
+//! BLE Active H/w Pwr Features
+#define BLE_DISABLE_DUTY_CYCLING 0
+#define BLE_DUTY_CYCLING 1
+#define BLR_DUTY_CYCLING 2
+#define BLE_4X_PWR_SAVE_MODE 4
+#define RSI_BLE_PWR_SAVE_OPTIONS BLE_DISABLE_DUTY_CYCLING
+
+//! Advertise types
+
+/* Advertising will be visible(discoverable) to all the devices.
+ * Scanning/Connection is also accepted from all devices
+ * */
+#define UNDIR_CONN 0x80
+
+/* Advertising will be visible(discoverable) to the particular device
+ * mentioned in RSI_BLE_ADV_DIR_ADDR only.
+ * Scanning and Connection will be accepted from that device only.
+ * */
+#define DIR_CONN 0x81
+
+/* Advertising will be visible(discoverable) to all the devices.
+ * Scanning will be accepted from all the devices.
+ * Connection will be not be accepted from any device.
+ * */
+#define UNDIR_SCAN 0x82
+
+/* Advertising will be visible(discoverable) to all the devices.
+ * Scanning and Connection will not be accepted from any device
+ * */
+#define UNDIR_NON_CONN 0x83
+
+/* Advertising will be visible(discoverable) to the particular device
+ * mentioned in RSI_BLE_ADV_DIR_ADDR only.
+ * Scanning and Connection will be accepted from that device only.
+ * */
+#define DIR_CONN_LOW_DUTY_CYCLE 0x84
+
+//! Advertising flags
+#define LE_LIMITED_DISCOVERABLE 0x01
+#define LE_GENERAL_DISCOVERABLE 0x02
+#define LE_BR_EDR_NOT_SUPPORTED 0x04
+
+//! Advertise filters
+#define ALLOW_SCAN_REQ_ANY_CONN_REQ_ANY 0x00
+#define ALLOW_SCAN_REQ_WHITE_LIST_CONN_REQ_ANY 0x01
+#define ALLOW_SCAN_REQ_ANY_CONN_REQ_WHITE_LIST 0x02
+#define ALLOW_SCAN_REQ_WHITE_LIST_CONN_REQ_WHITE_LIST 0x03
+
+//! Address types
+#define LE_PUBLIC_ADDRESS 0x00
+#define LE_RANDOM_ADDRESS 0x01
+#define LE_RESOLVABLE_PUBLIC_ADDRESS 0x02
+#define LE_RESOLVABLE_RANDOM_ADDRESS 0x03
+
+/*=======================================================================*/
+
+/*=======================================================================*/
+//! Connection parameters
+/*=======================================================================*/
+#define LE_SCAN_INTERVAL 0x0100
+#define LE_SCAN_WINDOW 0x0050
+
+#define CONNECTION_INTERVAL_MIN 0x00A0
+#define CONNECTION_INTERVAL_MAX 0x00A0
+
+#define CONNECTION_LATENCY 0x0000
+#define SUPERVISION_TIMEOUT 0x07D0 // 2000
+
+/*=======================================================================*/
+
+/*=======================================================================*/
+//! Scan command parameters
+/*=======================================================================*/
+
+#define SL_WFX_BLE_SCAN_TYPE SCAN_TYPE_ACTIVE
+#define SL_WFX_BLE_SCAN_FILTER_TYPE SCAN_FILTER_TYPE_ALL
+
+//! Scan status
+#define SL_WFX_BLE_START_SCAN 0x01
+#define SL_WFX_BLE_STOP_SCAN 0x00
+
+//! Scan types
+#define SCAN_TYPE_ACTIVE 0x01
+#define SCAN_TYPE_PASSIVE 0x00
+
+//! Scan filters
+#define SCAN_FILTER_TYPE_ALL 0x00
+#define SCAN_FILTER_TYPE_ONLY_WHITE_LIST 0x01
+
+#define SL_WFX_SEL_INTERNAL_ANTENNA 0x00
+#define SL_WFX_SEL_EXTERNAL_ANTENNA 0x01
+
+#define SL_WFX_BT_CTRL_REMOTE_USER_TERMINATED 0x4E13
+#define SL_WFX_BT_CTRL_REMOTE_DEVICE_TERMINATED_CONNECTION_DUE_TO_LOW_RESOURCES 0x4E14
+#define SL_WFX_BT_CTRL_REMOTE_POWERING_OFF 0x4E15
+#define SL_WFX_BT_CTRL_TERMINATED_MIC_FAILURE 0x4E3D
+#define SL_WFX_BT_FAILED_TO_ESTABLISH_CONN 0x4E3E
+#define SL_WFX_BT_INVALID_RANGE 0x4E60
+
+/***********************************************************************************************************************************************/
+//! RS9116 Firmware Configurations
+/***********************************************************************************************************************************************/
+
+/*=======================================================================*/
+//! Opermode command parameters
+/*=======================================================================*/
+/*
+#define RSI_FEATURE_BIT_MAP \
+  (FEAT_ULP_GPIO_BASED_HANDSHAKE | FEAT_DEV_TO_HOST_ULP_GPIO_1) //! To set wlan feature select bit map
+#define RSI_TCP_IP_BYPASS RSI_DISABLE                           //! TCP IP BYPASS feature check
+#define RSI_TCP_IP_FEATURE_BIT_MAP \
+  (TCP_IP_FEAT_DHCPV4_CLIENT) //! TCP/IP feature select bitmap for selecting TCP/IP features
+#define RSI_EXT_TCPIP_FEATURE_BITMAP 0
+
+#define RSI_CUSTOM_FEATURE_BIT_MAP FEAT_CUSTOM_FEAT_EXTENTION_VALID //! To set custom feature select bit map
+
+#define RSI_EXT_CUSTOM_FEATURE_BIT_MAP (EXT_FEAT_LOW_POWER_MODE | EXT_FEAT_XTAL_CLK_ENABLE | EXT_FEAT_384K_MODE)
+
+#define RSI_BT_FEATURE_BITMAP (BT_RF_TYPE | ENABLE_BLE_PROTOCOL)
+*/
+/*=======================================================================*/
+//! Power save command parameters
+/*=======================================================================*/
+//! set handshake type of power mode
+//#define RSI_HAND_SHAKE_TYPE GPIO_BASED
+
+#define BLE_ATT_REC_SIZE 500
+#define NO_OF_VAL_ATT 5 //! Attribute value count
+
+/***********************************************************************************************************************************************/
+//! user defined structure
+/***********************************************************************************************************************************************/
+typedef struct rsi_ble_att_list_s
+{
+    uuid_t char_uuid;
+    uint16_t handle;
+    uint16_t value_len;
+    uint16_t max_value_len;
+    uint8_t char_val_prop;
+    void * value;
+} rsi_ble_att_list_t;
+typedef struct rsi_ble_s
+{
+    uint8_t DATA[BLE_ATT_REC_SIZE];
+    uint16_t DATA_ix;
+    uint16_t att_rec_list_count;
+    rsi_ble_att_list_t att_rec_list[NO_OF_VAL_ATT];
+} rsi_ble_t;
+
+#endif
\ No newline at end of file
diff --git a/src/platform/silabs/SiWx917/bluetooth/wfx_sl_ble_init.c b/src/platform/silabs/SiWx917/bluetooth/wfx_sl_ble_init.c
new file mode 100644
index 0000000..115e5c1
--- /dev/null
+++ b/src/platform/silabs/SiWx917/bluetooth/wfx_sl_ble_init.c
@@ -0,0 +1,539 @@
+/*******************************************************************************
+ * @file  wfx_sl_ble_init.c
+ * @brief
+ *******************************************************************************
+ * # License
+ * <b>Copyright 2021 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.
+ *
+ ******************************************************************************/
+/*************************************************************************
+ *
+ */
+
+/*================================================================================
+* @brief : This file contains example application for Wlan Station BLE
+* Provisioning
+* @section Description :
+* This application explains how to get the WLAN connection functionality using
+* BLE provisioning.
+* Silicon Labs Module starts advertising and with BLE Provisioning the Access Point
+* details are fetched.
+* Silicon Labs device is configured as a WiFi station and connects to an Access Point.
+=================================================================================*/
+
+#include "wfx_sl_ble_init.h"
+#include "rsi_ble_config.h"
+
+// application defines
+rsi_ble_event_conn_status_t conn_event_to_app;
+rsi_ble_t att_list;
+sl_wfx_msg_t event_msg;
+
+// Memory to initialize driver
+uint8_t bt_global_buf[BT_GLOBAL_BUFF_LEN];
+static uint8_t wfx_rsi_drv_buf[WFX_RSI_BUF_SZ];
+const uint8_t ShortUUID_CHIPoBLEService[] = { 0xF6, 0xFF };
+
+/* Rsi driver Task will use as its stack */
+// StackType_t driverRsiTaskStack[WFX_RSI_WLAN_TASK_SZ] = { 0 };
+
+/* Structure that will hold the TCB of the wfxRsi Task being created. */
+// StaticTask_t driverRsiTaskBuffer;
+
+StaticTask_t rsiBLETaskStruct;
+
+/* wfxRsi Task will use as its stack */
+StackType_t wfxBLETaskStack[WFX_RSI_TASK_SZ] = { 0 };
+
+int32_t ble_rsi_task(void)
+{
+    int32_t status;
+    uint8_t buf[RSI_RESPONSE_HOLD_BUFF_SIZE];
+    //    extern void rsi_hal_board_init(void);
+    //
+    //    WFX_RSI_LOG("%s: starting(HEAP_SZ = %d)", __func__, SL_HEAP_SIZE);
+    //
+    //    //! Driver initialization
+    //    status = rsi_driver_init(wfx_rsi_drv_buf, WFX_RSI_BUF_SZ);
+    //    if ((status < RSI_DRIVER_STATUS) || (status > WFX_RSI_BUF_SZ))
+    //    {
+    //        WFX_RSI_LOG("%s: error: RSI Driver initialization failed with status: %02x", __func__, status);
+    //        return status;
+    //    }
+    //
+    //    WFX_RSI_LOG("%s: rsi_device_init", __func__);
+    //
+    //    /* ! Redpine module intialisation */
+    //    if ((status = rsi_device_init(LOAD_NWP_FW)) != RSI_SUCCESS)
+    //    {
+    //        WFX_RSI_LOG("%s: error: rsi_device_init failed with status: %02x", __func__, status);
+    //        return status;
+    //    }
+    //    WFX_RSI_LOG("%s: start wireless drv task", __func__);
+    //
+    //    /*
+    //     * Create the driver task
+    //     */
+    //    wfx_rsi.drv_task = xTaskCreateStatic((TaskFunction_t) rsi_wireless_driver_task, "rsi_drv", WFX_RSI_WLAN_TASK_SZ, NULL,
+    //                                         1, driverRsiTaskStack, &driverRsiTaskBuffer);
+    //    if (NULL == wfx_rsi.drv_task)
+    //    {
+    //        WFX_RSI_LOG("%s: error: Create the driver task failed", __func__);
+    //        return RSI_ERROR_INVALID_PARAM;
+    //    }
+    //
+    //    /* Initialize WiSeConnect or Module features. */
+    //    WFX_RSI_LOG("%s: rsi_wireless_init", __func__);
+    //    if ((status = rsi_wireless_init(OPER_MODE_0, RSI_OPERMODE_WLAN_BLE)) != RSI_SUCCESS)
+    //    {
+    //        WFX_RSI_LOG("%s: error: Initialize WiSeConnect failed with status: %02x", __func__, status);
+    //        return status;
+    //    }
+    //
+    //    WFX_RSI_LOG("%s: get FW version..", __func__);
+    //
+    //    /*
+    //     * Get the MAC and other info to let the user know about it.
+    //     */
+    //    if (rsi_wlan_get(RSI_FW_VERSION, buf, sizeof(buf)) != RSI_SUCCESS)
+    //    {
+    //        WFX_RSI_LOG("%s: error: rsi_wlan_get(RSI_FW_VERSION) failed with status: %02x", __func__, status);
+    //        return status;
+    //    }
+    //
+    //    buf[sizeof(buf) - 1] = 0;
+    //    WFX_RSI_LOG("%s: RSI firmware version: %s", __func__, buf);
+    //    //! Send feature frame
+    //    if ((status = rsi_send_feature_frame()) != RSI_SUCCESS)
+    //    {
+    //        WFX_RSI_LOG("%s: error: rsi_send_feature_frame failed with status: %02x", __func__, status);
+    //        return status;
+    //    }
+    //
+    //    WFX_RSI_LOG("%s: sent rsi_send_feature_frame", __func__);
+    //    /* initializes wlan radio parameters and WLAN supplicant parameters.
+    //     */
+    //    (void) rsi_wlan_radio_init(); /* Required so we can get MAC address */
+    //    if ((status = rsi_wlan_get(RSI_MAC_ADDRESS, &wfx_rsi.sta_mac.octet[0], RESP_BUFF_SIZE)) != RSI_SUCCESS)
+    //    {
+    //        WFX_RSI_LOG("%s: error: rsi_wlan_get failed with status: %02x", __func__, status);
+    //        return status;
+    //    }
+
+    // registering the GAP callback functions
+    rsi_ble_gap_register_callbacks(NULL, NULL, rsi_ble_on_disconnect_event, NULL, NULL, NULL, rsi_ble_on_enhance_conn_status_event,
+                                   NULL, NULL, NULL);
+
+    // registering the GATT call back functions
+    rsi_ble_gatt_register_callbacks(NULL, NULL, NULL, NULL, NULL, NULL, NULL, rsi_ble_on_gatt_write_event, NULL, NULL, NULL,
+                                    rsi_ble_on_mtu_event, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+                                    rsi_ble_on_event_indication_confirmation, NULL);
+
+    WFX_RSI_LOG("registering rsi_ble_add_service");
+
+    //  Exchange of GATT info with BLE stack
+    rsi_ble_add_matter_service();
+
+    //  initializing the application events map
+    rsi_ble_app_init_events();
+
+    wfx_rsi.ble_task = xTaskCreateStatic((TaskFunction_t) rsi_ble_event_handling_task, "rsi_ble", WFX_RSI_TASK_SZ, NULL, 2,
+                                         wfxBLETaskStack, &rsiBLETaskStruct);
+    WFX_RSI_LOG("%s: rsi_task_suspend init_task ", __func__);
+    if (wfx_rsi.ble_task == NULL)
+    {
+        WFX_RSI_LOG("%s: error: failed to create ble task.", __func__);
+    }
+
+    WFX_RSI_LOG("%s complete", __func__);
+    //    rsi_task_destroy((rsi_task_handle_t *)wfx_rsi.init_task);
+    return RSI_SUCCESS;
+}
+
+/*==============================================*/
+/**
+ * @fn         rsi_ble_app_init_events
+ * @brief      initializes the event parameter.
+ * @param[in]  none.
+ * @return     none.
+ * @section description
+ * This function is used during BLE initialization.
+ */
+void rsi_ble_app_init_events()
+{
+    event_msg.ble_app_event_map  = 0;
+    event_msg.ble_app_event_mask = 0xFFFFFFFF;
+    event_msg.ble_app_event_mask = event_msg.ble_app_event_mask; // To suppress warning while compiling
+    WFX_RSI_LOG("Function :: rsi_ble_app_init_events");
+    return;
+}
+
+/*==============================================*/
+/**
+ * @fn         rsi_ble_app_clear_event
+ * @brief      clears the specific event.
+ * @param[in]  event_num, specific event number.
+ * @return     none.
+ * @section description
+ * This function is used to clear the specific event.
+ */
+void rsi_ble_app_clear_event(uint32_t event_num)
+{
+    event_msg.event_num = event_num;
+    event_msg.ble_app_event_map &= ~BIT(event_num);
+    return;
+}
+
+/*==============================================*/
+/**
+ * @fn         rsi_ble_on_mtu_event
+ * @brief      its invoked when mtu exhange event is received.
+ * @param[in]  rsi_ble_mtu, mtu event paramaters.
+ * @return     none.
+ * @section description
+ * This callback function is invoked when  mtu exhange event is received
+ */
+void rsi_ble_on_mtu_event(rsi_ble_event_mtu_t * rsi_ble_mtu)
+{
+    WFX_RSI_LOG(" RSI_BLE : rsi_ble_on_mtu_event");
+    memset(&event_msg.rsi_ble_mtu, 0, sizeof(rsi_ble_event_mtu_t));
+    memcpy(&event_msg.rsi_ble_mtu, rsi_ble_mtu, sizeof(rsi_ble_event_mtu_t));
+    rsi_ble_app_set_event(RSI_BLE_MTU_EVENT);
+}
+
+/*==============================================*/
+/**
+ * @fn         rsi_ble_on_gatt_write_event
+ * @brief      its invoked when write/notify/indication events are received.
+ * @param[in]  event_id, it indicates write/notification event id.
+ * @param[in]  rsi_ble_write, write event parameters.
+ * @return     none.
+ * @section description
+ * This callback function is invoked when write/notify/indication events are received
+ */
+void rsi_ble_on_gatt_write_event(uint16_t event_id, rsi_ble_event_write_t * rsi_ble_write)
+{
+    WFX_RSI_LOG(" RSI_BLE : rsi_ble_on_gatt_write_event");
+    memset(&event_msg.rsi_ble_write, 0, sizeof(rsi_ble_event_write_t));
+    event_msg.event_id = event_id;
+    memcpy(&event_msg.rsi_ble_write, rsi_ble_write, sizeof(rsi_ble_event_write_t));
+    rsi_ble_app_set_event(RSI_BLE_GATT_WRITE_EVENT);
+}
+
+/*==============================================*/
+/**
+ * @fn         rsi_ble_on_enhance_conn_status_event
+ * @brief      invoked when enhanced connection complete event is received
+ * @param[out] resp_conn, connected remote device information
+ * @return     none.
+ * @section description
+ * This callback function indicates the status of the connection
+ */
+void rsi_ble_on_enhance_conn_status_event(rsi_ble_event_enhance_conn_status_t * resp_enh_conn)
+{
+    WFX_RSI_LOG(" RSI_BLE : rsi_ble_on_enhance_conn_status_event");
+    event_msg.connectionHandle = 1;
+    event_msg.bondingHandle    = 255;
+    memcpy(event_msg.resp_enh_conn.dev_addr, resp_enh_conn->dev_addr, RSI_DEV_ADDR_LEN);
+    rsi_ble_app_set_event(RSI_BLE_CONN_EVENT);
+}
+
+/*==============================================*/
+/**
+ * @fn         rsi_ble_on_disconnect_event
+ * @brief      invoked when disconnection event is received
+ * @param[in]  resp_disconnect, disconnected remote device information
+ * @param[in]  reason, reason for disconnection.
+ * @return     none.
+ * @section description
+ * This callback function indicates disconnected device information and status
+ */
+void rsi_ble_on_disconnect_event(rsi_ble_event_disconnect_t * resp_disconnect, uint16_t reason)
+{
+    WFX_RSI_LOG(" RSI_BLE : rsi_ble_on_disconnect_event");
+    event_msg.reason = reason;
+    memcpy(event_msg.resp_disconnect, resp_disconnect, sizeof(rsi_ble_event_disconnect_t));
+    rsi_ble_app_set_event(RSI_BLE_DISCONN_EVENT);
+}
+
+/*==============================================*/
+/**
+ * @fn         rsi_ble_on_event_indication_confirmation
+ * @brief      this function will invoke when received indication confirmation event
+ * @param[out] resp_id, response id
+ * @param[out] status, status of the response
+ * @return     none
+ * @section description
+ */
+void rsi_ble_on_event_indication_confirmation(uint16_t resp_status, rsi_ble_set_att_resp_t * rsi_ble_event_set_att_rsp)
+{
+    WFX_RSI_LOG(" RSI_BLE : rsi_ble_on_event_indication_confirmation");
+    event_msg.resp_status = resp_status;
+    memcpy(&event_msg.rsi_ble_event_set_att_rsp, rsi_ble_event_set_att_rsp, sizeof(rsi_ble_set_att_resp_t));
+    rsi_ble_app_set_event(RSI_BLE_GATT_INDICATION_CONFIRMATION);
+}
+
+/*==============================================*/
+/**
+ * @fn         rsi_ble_app_get_event
+ * @brief      returns the first set event based on priority
+ * @param[in]  none.
+ * @return     int32_t
+ *             > 0  = event number
+ *             -1   = not received any event
+ * @section description
+ * This function returns the highest priority event among all the set events
+ */
+int32_t rsi_ble_app_get_event(void)
+{
+    uint32_t ix;
+
+    for (ix = 0; ix < 32; ix++)
+    {
+        if (event_msg.ble_app_event_map & (1 << ix))
+        {
+            return ix;
+        }
+    }
+
+    return (-1);
+}
+
+/*==============================================*/
+/**
+ * @fn         rsi_ble_app_set_event
+ * @brief      set the specific event.
+ * @param[in]  event_num, specific event number.
+ * @return     none.
+ * @section description
+ * This function is used to set/raise the specific event.
+ */
+void rsi_ble_app_set_event(uint32_t event_num)
+{
+    event_msg.ble_app_event_map |= BIT(event_num);
+    return;
+}
+
+/*==============================================*/
+/**
+ * @fn         rsi_gatt_add_attribute_to_list
+ * @brief      This function is used to store characteristic service attribute.
+ * @param[in]  p_val, pointer to homekit structure
+ * @param[in]  handle, characteristic service attribute handle.
+ * @param[in]  data_len, characteristic value length
+ * @param[in]  data, characteristic value pointer
+ * @param[in]  uuid, characteristic value uuid
+ * @return     none.
+ * @section description
+ * This function is used to store all attribute records
+ */
+void rsi_gatt_add_attribute_to_list(rsi_ble_t * p_val, uint16_t handle, uint16_t data_len, uint8_t * data, uuid_t uuid,
+                                    uint8_t char_prop)
+{
+    if ((p_val->DATA_ix + data_len) >= BLE_ATT_REC_SIZE)
+    { //! Check for max data length for the characteristic value
+        LOG_PRINT("\r\n no data memory for att rec values \r\n");
+        return;
+    }
+
+    p_val->att_rec_list[p_val->att_rec_list_count].char_uuid     = uuid;
+    p_val->att_rec_list[p_val->att_rec_list_count].handle        = handle;
+    p_val->att_rec_list[p_val->att_rec_list_count].value_len     = data_len;
+    p_val->att_rec_list[p_val->att_rec_list_count].max_value_len = data_len;
+    p_val->att_rec_list[p_val->att_rec_list_count].char_val_prop = char_prop;
+    memcpy(p_val->DATA + p_val->DATA_ix, data, data_len);
+    p_val->att_rec_list[p_val->att_rec_list_count].value = p_val->DATA + p_val->DATA_ix;
+    p_val->att_rec_list_count++;
+    p_val->DATA_ix += p_val->att_rec_list[p_val->att_rec_list_count].max_value_len;
+
+    return;
+}
+
+/*==============================================*/
+/**
+ * @fn         rsi_ble_add_char_serv_att
+ * @brief      this function is used to add characteristic service attribute..
+ * @param[in]  serv_handler, service handler.
+ * @param[in]  handle, characteristic service attribute handle.
+ * @param[in]  val_prop, characteristic value property.
+ * @param[in]  att_val_handle, characteristic value handle
+ * @param[in]  att_val_uuid, characteristic value uuid
+ * @return     none.
+ * @section description
+ * This function is used at application to add characteristic attribute
+ */
+void rsi_ble_add_char_serv_att(void * serv_handler, uint16_t handle, uint8_t val_prop, uint16_t att_val_handle, uuid_t att_val_uuid)
+{
+    rsi_ble_req_add_att_t new_att = { 0 };
+
+    //! preparing the attribute service structure
+    new_att.serv_handler       = serv_handler;
+    new_att.handle             = handle;
+    new_att.att_uuid.size      = 2;
+    new_att.att_uuid.val.val16 = RSI_BLE_CHAR_SERV_UUID;
+    new_att.property           = RSI_BLE_ATT_PROPERTY_READ;
+
+    //! preparing the characteristic attribute value
+    new_att.data_len = att_val_uuid.size + 4;
+    new_att.data[0]  = val_prop;
+    rsi_uint16_to_2bytes(&new_att.data[2], att_val_handle);
+    if (new_att.data_len == 6)
+    {
+        rsi_uint16_to_2bytes(&new_att.data[4], att_val_uuid.val.val16);
+    }
+    else if (new_att.data_len == 8)
+    {
+        rsi_uint32_to_4bytes(&new_att.data[4], att_val_uuid.val.val32);
+    }
+    else if (new_att.data_len == 20)
+    {
+        memcpy(&new_att.data[4], &att_val_uuid.val.val128, att_val_uuid.size);
+    }
+    //! Add attribute to the service
+    rsi_ble_add_attribute(&new_att);
+
+    return;
+}
+
+/*==============================================*/
+/**
+ * @fn         rsi_ble_add_char_val_att
+ * @brief      this function is used to add characteristic value attribute.
+ * @param[in]  serv_handler, new service handler.
+ * @param[in]  handle, characteristic value attribute handle.
+ * @param[in]  att_type_uuid, attribute uuid value.
+ * @param[in]  val_prop, characteristic value property.
+ * @param[in]  data, characteristic value data pointer.
+ * @param[in]  data_len, characteristic value length.
+ * @return     none.
+ * @section description
+ * This function is used at application to create new service.
+ */
+
+void rsi_ble_add_char_val_att(void * serv_handler, uint16_t handle, uuid_t att_type_uuid, uint8_t val_prop, uint8_t * data,
+                              uint8_t data_len, uint8_t auth_read)
+{
+    rsi_ble_req_add_att_t new_att = { 0 };
+
+    memset(&new_att, 0, sizeof(rsi_ble_req_add_att_t));
+    //! preparing the attributes
+    new_att.serv_handler  = serv_handler;
+    new_att.handle        = handle;
+    new_att.config_bitmap = auth_read;
+    memcpy(&new_att.att_uuid, &att_type_uuid, sizeof(uuid_t));
+    new_att.property = val_prop;
+
+    if (data != NULL)
+        memcpy(new_att.data, data, RSI_MIN(sizeof(new_att.data), data_len));
+
+    //! preparing the attribute value
+    new_att.data_len = data_len;
+
+    //! add attribute to the service
+    rsi_ble_add_attribute(&new_att);
+
+    if ((auth_read == ATT_REC_MAINTAIN_IN_HOST) || (data_len > 20))
+    {
+        if (data != NULL)
+        {
+            rsi_gatt_add_attribute_to_list(&att_list, handle, data_len, data, att_type_uuid, val_prop);
+        }
+    }
+
+    //! check the attribute property with notification/Indication
+    if ((val_prop & RSI_BLE_ATT_PROPERTY_NOTIFY) || (val_prop & RSI_BLE_ATT_PROPERTY_INDICATE))
+    {
+        //! if notification/indication property supports then we need to add client characteristic service.
+
+        //! preparing the client characteristic attribute & values
+        memset(&new_att, 0, sizeof(rsi_ble_req_add_att_t));
+        new_att.serv_handler       = serv_handler;
+        new_att.handle             = handle + 1;
+        new_att.att_uuid.size      = 2;
+        new_att.att_uuid.val.val16 = RSI_BLE_CLIENT_CHAR_UUID;
+        new_att.property           = RSI_BLE_ATT_PROPERTY_READ | RSI_BLE_ATT_PROPERTY_WRITE;
+        new_att.data_len           = 2;
+
+        //! add attribute to the service
+        rsi_ble_add_attribute(&new_att);
+    }
+
+    return;
+}
+
+/*==============================================*/
+/**
+ * @fn         rsi_ble_add_matter_service
+ * @brief      this function is used to add service for matter
+ * @return     status (uint32_t) 0 for success.
+ * @section description
+ * This function is used at application to create new service.
+ */
+
+uint32_t rsi_ble_add_matter_service(void)
+{
+    uuid_t custom_service    = { RSI_BLE_MATTER_CUSTOM_SERVICE_UUID };
+    custom_service.size      = RSI_BLE_MATTER_CUSTOM_SERVICE_SIZE;
+    custom_service.val.val16 = RSI_BLE_MATTER_CUSTOM_SERVICE_VALUE_16;
+    uint8_t data[230]        = { RSI_BLE_MATTER_CUSTOM_SERVICE_DATA };
+
+    static const uuid_t custom_characteristic_RX = { .size             = RSI_BLE_CUSTOM_CHARACTERISTIC_RX_SIZE,
+                                                     .reserved         = { RSI_BLE_CUSTOM_CHARACTERISTIC_RX_RESERVED },
+                                                     .val.val128.data1 = RSI_BLE_CUSTOM_CHARACTERISTIC_RX_VALUE_128_DATA_1,
+                                                     .val.val128.data2 = RSI_BLE_CUSTOM_CHARACTERISTIC_RX_VALUE_128_DATA_2,
+                                                     .val.val128.data3 = RSI_BLE_CUSTOM_CHARACTERISTIC_RX_VALUE_128_DATA_3,
+                                                     .val.val128.data4 = { RSI_BLE_CUSTOM_CHARACTERISTIC_RX_VALUE_128_DATA_4 } };
+
+    rsi_ble_resp_add_serv_t new_serv_resp = { 0 };
+    rsi_ble_add_service(custom_service, &new_serv_resp);
+
+    // Adding custom characteristic declaration to the custom service
+    rsi_ble_add_char_serv_att(
+        new_serv_resp.serv_handler, new_serv_resp.start_handle + RSI_BLE_CHARACTERISTIC_RX_ATTRIBUTE_HANDLE_LOCATION,
+        RSI_BLE_ATT_PROPERTY_WRITE | RSI_BLE_ATT_PROPERTY_READ, // Set read, write, write without response
+        new_serv_resp.start_handle + RSI_BLE_CHARACTERISTIC_RX_VALUE_HANDLE_LOCATION, custom_characteristic_RX);
+
+    // Adding characteristic value attribute to the service
+    rsi_ble_add_char_val_att(new_serv_resp.serv_handler,
+                             new_serv_resp.start_handle + RSI_BLE_CHARACTERISTIC_RX_VALUE_HANDLE_LOCATION, custom_characteristic_RX,
+                             RSI_BLE_ATT_PROPERTY_WRITE | RSI_BLE_ATT_PROPERTY_READ, // Set read, write, write without response
+                             data, sizeof(data), ATT_REC_IN_HOST);
+
+    static const uuid_t custom_characteristic_TX = { .size             = RSI_BLE_CUSTOM_CHARACTERISTIC_TX_SIZE,
+                                                     .reserved         = { RSI_BLE_CUSTOM_CHARACTERISTIC_TX_RESERVED },
+                                                     .val.val128.data1 = RSI_BLE_CUSTOM_CHARACTERISTIC_TX_VALUE_128_DATA_1,
+                                                     .val.val128.data2 = RSI_BLE_CUSTOM_CHARACTERISTIC_TX_VALUE_128_DATA_2,
+                                                     .val.val128.data3 = RSI_BLE_CUSTOM_CHARACTERISTIC_TX_VALUE_128_DATA_3,
+                                                     .val.val128.data4 = { RSI_BLE_CUSTOM_CHARACTERISTIC_TX_VALUE_128_DATA_4 } };
+
+    // Adding custom characteristic declaration to the custom service
+    rsi_ble_add_char_serv_att(
+        new_serv_resp.serv_handler, new_serv_resp.start_handle + RSI_BLE_CHARACTERISTIC_TX_ATTRIBUTE_HANDLE_LOCATION,
+        RSI_BLE_ATT_PROPERTY_WRITE_NO_RESPONSE | RSI_BLE_ATT_PROPERTY_WRITE | RSI_BLE_ATT_PROPERTY_READ |
+            RSI_BLE_ATT_PROPERTY_NOTIFY | RSI_BLE_ATT_PROPERTY_INDICATE, // Set read, write, write without response
+        new_serv_resp.start_handle + RSI_BLE_CHARACTERISTIC_TX_MEASUREMENT_HANDLE_LOCATION, custom_characteristic_TX);
+
+    // Adding characteristic value attribute to the service
+    event_msg.rsi_ble_measurement_hndl = new_serv_resp.start_handle + RSI_BLE_CHARACTERISTIC_TX_MEASUREMENT_HANDLE_LOCATION;
+
+    // Adding characteristic value attribute to the service
+    event_msg.rsi_ble_gatt_server_client_config_hndl =
+        new_serv_resp.start_handle + RSI_BLE_CHARACTERISTIC_TX_GATT_SERVER_CLIENT_HANDLE_LOCATION;
+
+    rsi_ble_add_char_val_att(new_serv_resp.serv_handler, event_msg.rsi_ble_measurement_hndl, custom_characteristic_TX,
+                             RSI_BLE_ATT_PROPERTY_WRITE_NO_RESPONSE | RSI_BLE_ATT_PROPERTY_WRITE | RSI_BLE_ATT_PROPERTY_READ |
+                                 RSI_BLE_ATT_PROPERTY_NOTIFY |
+                                 RSI_BLE_ATT_PROPERTY_INDICATE, // Set read, write, write without response
+                             data, sizeof(data), ATT_REC_MAINTAIN_IN_HOST);
+
+    memset(&data, 0, sizeof(data));
+    return 0;
+}
\ No newline at end of file
diff --git a/src/platform/silabs/SiWx917/bluetooth/wfx_sl_ble_init.h b/src/platform/silabs/SiWx917/bluetooth/wfx_sl_ble_init.h
new file mode 100644
index 0000000..497d2b5
--- /dev/null
+++ b/src/platform/silabs/SiWx917/bluetooth/wfx_sl_ble_init.h
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * @file  wfx_sl_ble_init.h
+ * @brief
+ *******************************************************************************
+ * # License
+ * <b>Copyright 2021 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.
+ *
+ ******************************************************************************/
+/*************************************************************************
+ *
+ */
+
+/**
+ * Include files
+ * */
+
+#ifndef WFX_SL_BLE_INIT
+#define WFX_SL_BLE_INIT
+#define RSI_BLE_ENABLE 1
+
+// BLE include file to refer BLE APIs
+#include "FreeRTOS.h"
+#include "event_groups.h"
+#include "rsi_ble_config.h"
+#include "task.h"
+#include "timers.h"
+#include "wfx_host_events.h"
+#include "wfx_rsi.h"
+#include <rsi_ble.h>
+#include <rsi_ble_apis.h>
+#include <rsi_ble_common_config.h>
+#include <rsi_ble_config.h>
+#include <rsi_bootup_config.h>
+#include <rsi_bt_common.h>
+#include <rsi_bt_common_apis.h>
+#include <rsi_common_apis.h>
+#include <rsi_driver.h>
+#include <rsi_wlan_apis.h>
+#include <rsi_wlan_config.h>
+#include <rsi_wlan_non_rom.h>
+#include <stdbool.h>
+#include <string.h>
+
+#ifdef RSI_M4_INTERFACE
+#include "rsi_board.h"
+#endif
+
+#define ATT_REC_IN_HOST 0
+
+#define RSI_BLE_MATTER_CUSTOM_SERVICE_UUID 0
+#define RSI_BLE_MATTER_CUSTOM_SERVICE_SIZE 2
+#define RSI_BLE_MATTER_CUSTOM_SERVICE_VALUE_16 0xFFF6
+#define RSI_BLE_MATTER_CUSTOM_SERVICE_DATA 0x00
+
+#define RSI_BLE_CUSTOM_CHARACTERISTIC_RX_SIZE 16
+#define RSI_BLE_CUSTOM_CHARACTERISTIC_RX_RESERVED 0x00, 0x00, 0x00
+#define RSI_BLE_CUSTOM_CHARACTERISTIC_RX_VALUE_128_DATA_1 0x18EE2EF5
+#define RSI_BLE_CUSTOM_CHARACTERISTIC_RX_VALUE_128_DATA_2 0x263D
+#define RSI_BLE_CUSTOM_CHARACTERISTIC_RX_VALUE_128_DATA_3 0x4559
+#define RSI_BLE_CUSTOM_CHARACTERISTIC_RX_VALUE_128_DATA_4 0x9F, 0x95, 0x9C, 0x4F, 0x11, 0x9D, 0x9F, 0x42
+#define RSI_BLE_CHARACTERISTIC_RX_ATTRIBUTE_HANDLE_LOCATION 1
+#define RSI_BLE_CHARACTERISTIC_RX_VALUE_HANDLE_LOCATION 2
+
+#define RSI_BLE_CUSTOM_CHARACTERISTIC_TX_SIZE 16
+#define RSI_BLE_CUSTOM_CHARACTERISTIC_TX_RESERVED 0x00, 0x00, 0x00
+#define RSI_BLE_CUSTOM_CHARACTERISTIC_TX_VALUE_128_DATA_1 0x18EE2EF5
+#define RSI_BLE_CUSTOM_CHARACTERISTIC_TX_VALUE_128_DATA_2 0x263D
+#define RSI_BLE_CUSTOM_CHARACTERISTIC_TX_VALUE_128_DATA_3 0x4559
+#define RSI_BLE_CUSTOM_CHARACTERISTIC_TX_VALUE_128_DATA_4 0x9F, 0x95, 0x9C, 0x4F, 0x12, 0x9D, 0x9F, 0x42
+#define RSI_BLE_CHARACTERISTIC_TX_ATTRIBUTE_HANDLE_LOCATION 3
+#define RSI_BLE_CHARACTERISTIC_TX_MEASUREMENT_HANDLE_LOCATION 4
+#define RSI_BLE_CHARACTERISTIC_TX_GATT_SERVER_CLIENT_HANDLE_LOCATION 5
+
+typedef struct sl_wfx_msg_s
+{
+    uint8_t connectionHandle;
+    uint8_t bondingHandle;
+    uint32_t event_num;
+    uint16_t reason;
+    uint16_t event_id;
+    uint16_t resp_status;
+    rsi_ble_event_mtu_t rsi_ble_mtu;
+    rsi_ble_event_write_t rsi_ble_write;
+    rsi_ble_event_enhance_conn_status_t resp_enh_conn;
+    rsi_ble_event_disconnect_t * resp_disconnect;
+    rsi_ble_set_att_resp_t rsi_ble_event_set_att_rsp;
+    uint32_t ble_app_event_map;
+    uint32_t ble_app_event_mask;
+    uint16_t rsi_ble_measurement_hndl;
+    uint16_t rsi_ble_gatt_server_client_config_hndl;
+} sl_wfx_msg_t;
+
+int32_t ble_rsi_task(void);
+void rsi_ble_on_connect_event(rsi_ble_event_conn_status_t * resp_conn);
+void rsi_ble_on_disconnect_event(rsi_ble_event_disconnect_t * resp_disconnect, uint16_t reason);
+void rsi_ble_on_enhance_conn_status_event(rsi_ble_event_enhance_conn_status_t * resp_enh_conn);
+void rsi_ble_on_gatt_write_event(uint16_t event_id, rsi_ble_event_write_t * rsi_ble_write);
+void rsi_ble_on_mtu_event(rsi_ble_event_mtu_t * rsi_ble_mtu);
+void rsi_ble_on_event_indication_confirmation(uint16_t resp_status, rsi_ble_set_att_resp_t * rsi_ble_event_set_att_rsp);
+void rsi_gatt_add_attribute_to_list(rsi_ble_t * p_val, uint16_t handle, uint16_t data_len, uint8_t * data, uuid_t uuid,
+                                    uint8_t char_prop);
+void rsi_ble_add_char_serv_att(void * serv_handler, uint16_t handle, uint8_t val_prop, uint16_t att_val_handle,
+                               uuid_t att_val_uuid);
+void rsi_ble_add_char_val_att(void * serv_handler, uint16_t handle, uuid_t att_type_uuid, uint8_t val_prop, uint8_t * data,
+                              uint8_t data_len, uint8_t auth_read);
+uint32_t rsi_ble_add_matter_service(void);
+void rsi_ble_app_set_event(uint32_t event_num);
+int32_t rsi_ble_app_get_event(void);
+void rsi_ble_app_clear_event(uint32_t event_num);
+void rsi_ble_app_init_events();
+void rsi_ble_event_handling_task(void);
+
+#endif
\ No newline at end of file
diff --git a/src/platform/silabs/SiWx917/efr32-mbedtls-psa-crypto-config.h b/src/platform/silabs/SiWx917/efr32-mbedtls-psa-crypto-config.h
deleted file mode 100644
index 6df9724..0000000
--- a/src/platform/silabs/SiWx917/efr32-mbedtls-psa-crypto-config.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *
- *    Copyright (c) 2020-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.
- */
-
-#pragma once
-
-// ADD USER PSA CRYPTO CONFIG HERE
-#define SL_PSA_KEY_USER_SLOT_COUNT (4)
-
-#define SL_PSA_ITS_USER_MAX_FILES (128)
-
-#include "em_device.h"
-#if defined(SEMAILBOX_PRESENT) || defined(CRYPTOACC_PRESENT)
-// Use accelerated HMAC when we have it
-#define MBEDTLS_PSA_ACCEL_ALG_HMAC
-// Use accelerated ECDSA/ECDH when we have it
-#define MBEDTLS_PSA_ACCEL_KEY_TYPE_ECC_KEY_PAIR
-#define MBEDTLS_PSA_ACCEL_KEY_TYPE_ECC_PUBLIC_KEY
-#define MBEDTLS_PSA_ACCEL_ECC_SECP_R1_256
-#define MBEDTLS_PSA_ACCEL_ALG_ECDH
-#define MBEDTLS_PSA_ACCEL_ALG_ECDSA
-#else
-// Devices without SEMAILBOX or CRYPTOACC don't have HMAC top-level accelerated
-#define MBEDTLS_PSA_BUILTIN_ALG_HMAC 1
-// Devices without SEMAILBOX or CRYPTOACC don't have fully implemented ECDSA/ECDH
-#define MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_PUBLIC_KEY 1
-#define MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR 1
-#define MBEDTLS_PSA_BUILTIN_ECC_SECP_R1_256 1
-#define MBEDTLS_PSA_BUILTIN_ALG_ECDH 1
-#define MBEDTLS_PSA_BUILTIN_ALG_ECDSA 1
-#endif
-// end of user configuration section >>>
-
-// AUTO GENERATED PSA CONFIG SECTION BELOW. **KEEP AS IS FUTURE GSDK UPDATE**
-#define PSA_WANT_KEY_TYPE_AES
-#define PSA_WANT_ALG_CMAC
-#define PSA_WANT_ALG_SHA_256
-#define PSA_WANT_ALG_CCM
-#define PSA_WANT_ALG_ECB_NO_PADDING
-#define PSA_WANT_ALG_ECDSA
-#define PSA_WANT_ALG_ECDH
-#define PSA_WANT_KEY_TYPE_ECC_KEY_PAIR
-#define PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY
-#define PSA_WANT_ECC_SECP_R1_256
-#define PSA_WANT_ALG_HKDF
-#define PSA_WANT_ALG_HMAC
-#define PSA_WANT_KEY_TYPE_HMAC
-#define MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG
-#define MBEDTLS_PSA_ACCEL_ALG_SHA_1
-#define MBEDTLS_PSA_ACCEL_ALG_SHA_224
-#define MBEDTLS_PSA_ACCEL_ALG_SHA_256
-#define MBEDTLS_PSA_ACCEL_KEY_TYPE_AES
-#define MBEDTLS_PSA_ACCEL_ALG_ECB_NO_PADDING
-#define MBEDTLS_PSA_ACCEL_ALG_CBC_NO_PADDING
-#define MBEDTLS_PSA_ACCEL_ALG_CBC_PKCS7
-#define MBEDTLS_PSA_ACCEL_ALG_CTR
-#define MBEDTLS_PSA_ACCEL_ALG_CFB
-#define MBEDTLS_PSA_ACCEL_ALG_OFB
-#define MBEDTLS_PSA_ACCEL_ALG_GCM
-#define MBEDTLS_PSA_ACCEL_ALG_CCM
-#define MBEDTLS_PSA_ACCEL_ALG_CMAC
-
-#define MBEDTLS_PSA_KEY_SLOT_COUNT (15 + 1 + SL_PSA_KEY_USER_SLOT_COUNT)
-#define SL_PSA_ITS_MAX_FILES (1 + SL_PSA_ITS_USER_MAX_FILES)
diff --git a/src/platform/silabs/SiWx917/efr32-chip-mbedtls-config.h b/src/platform/silabs/SiWx917/siwx917-chip-mbedtls-config.h
similarity index 86%
rename from src/platform/silabs/SiWx917/efr32-chip-mbedtls-config.h
rename to src/platform/silabs/SiWx917/siwx917-chip-mbedtls-config.h
index 049c12c..41126c5 100644
--- a/src/platform/silabs/SiWx917/efr32-chip-mbedtls-config.h
+++ b/src/platform/silabs/SiWx917/siwx917-chip-mbedtls-config.h
@@ -1,5 +1,5 @@
 /*
- *  Copyright (c) 2020, The OpenThread Authors.
+ *  Copyright (c) 2021, The OpenThread Authors.
  *  All rights reserved.
  *
  *  Redistribution and use in source and binary forms, with or without
@@ -31,13 +31,10 @@
 #include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
-
-#include "em_device.h"
-#include "em_se.h"
-
-#if CHIP_HAVE_CONFIG_H
-#include <crypto/CryptoBuildConfig.h>
-#endif // CHIP_HAVE_CONFIG_H
+/**
+ * Enable FreeRTOS threading support
+ */
+#define MBEDTLS_FREERTOS
 
 /**
  * Enable H Crypto and Entropy modules
@@ -46,8 +43,16 @@
 #define MBEDTLS_ECP_C
 #define MBEDTLS_ECDH_C
 #define MBEDTLS_ENTROPY_C
-#define MBEDTLS_SHA224_C
 #define MBEDTLS_SHA256_C
+#define MBEDTLS_CIPHER_MODE_CTR
+#define MBEDTLS_TRNG_C
+
+#define MBEDTLS_NO_PLATFORM_ENTROPY
+#define MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES
+
+#if defined(MBEDTLS_ECP_ALT) && !defined(MBEDTLS_ECP_RESTARTABLE)
+typedef void mbedtls_ecp_restart_ctx;
+#endif
 
 #define MBEDTLS_PLATFORM_SNPRINTF_MACRO snprintf
 
@@ -58,6 +63,8 @@
 #define MBEDTLS_BIGNUM_C
 #define MBEDTLS_CCM_C
 #define MBEDTLS_CIPHER_C
+#define MBEDTLS_CIPHER_MODE_CBC
+#define MBEDTLS_CIPHER_MODE_CFB
 #define MBEDTLS_CMAC_C
 #define MBEDTLS_CTR_DRBG_C
 #define MBEDTLS_ECDH_LEGACY_CONTEXT
@@ -67,7 +74,9 @@
 #define MBEDTLS_ECP_DP_SECP256R1_ENABLED
 #define MBEDTLS_ECP_NIST_OPTIM
 #define MBEDTLS_ENTROPY_FORCE_SHA256
-#define MBEDTLS_ENTROPY_HARDWARE_ALT
+// TODO: 3R
+// #define MBEDTLS_ENTROPY_HARDWARE_ALT
+
 #define MBEDTLS_ERROR_STRERROR_DUMMY
 #define MBEDTLS_HAVE_ASM
 #define MBEDTLS_HKDF_C
@@ -76,23 +85,15 @@
 #define MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED
 #define MBEDTLS_KEY_EXCHANGE_PSK_ENABLED
 #define MBEDTLS_MD_C
-#define MBEDTLS_NO_PLATFORM_ENTROPY
 #define MBEDTLS_OID_C
 #define MBEDTLS_PEM_PARSE_C
 #define MBEDTLS_PEM_WRITE_C
 #define MBEDTLS_PK_C
 #define MBEDTLS_PK_PARSE_C
 #define MBEDTLS_PK_WRITE_C
-#if CHIP_CRYPTO_MBEDTLS
 #define MBEDTLS_PKCS5_C
-#endif
 #define MBEDTLS_PLATFORM_C
 #define MBEDTLS_PLATFORM_MEMORY
-#define MBEDTLS_PLATFORM_NO_STD_FUNCTIONS
-#define MBEDTLS_PSA_CRYPTO_C
-#define MBEDTLS_PSA_CRYPTO_CONFIG
-#define MBEDTLS_PSA_CRYPTO_DRIVERS
-#define MBEDTLS_PSA_CRYPTO_STORAGE_C
 #define MBEDTLS_SHA256_SMALLER
 #define MBEDTLS_SHA512_C
 #define MBEDTLS_SSL_CLI_C
@@ -106,11 +107,6 @@
 #define MBEDTLS_SSL_PROTO_DTLS
 #define MBEDTLS_SSL_SRV_C
 #define MBEDTLS_SSL_TLS_C
-
-#if CHIP_CRYPTO_PLATFORM
-#define MBEDTLS_USE_PSA_CRYPTO
-#endif
-
 #define MBEDTLS_X509_CREATE_C
 #define MBEDTLS_X509_CSR_WRITE_C
 #define MBEDTLS_X509_CRL_PARSE_C
@@ -133,9 +129,4 @@
 
 #define MBEDTLS_SSL_CIPHERSUITES MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8
 
-#define MBEDTLS_CIPHER_MODE_WITH_PADDING
-
-#include "check_crypto_config.h"
-#include "config-device-acceleration.h"
 #include "mbedtls/check_config.h"
-#include "mbedtls/config_psa.h"
diff --git a/src/platform/silabs/SiWx917/wifi/dhcp_client.cpp b/src/platform/silabs/SiWx917/wifi/dhcp_client.cpp
index 15c6785..e45f38b 100644
--- a/src/platform/silabs/SiWx917/wifi/dhcp_client.cpp
+++ b/src/platform/silabs/SiWx917/wifi/dhcp_client.cpp
@@ -21,12 +21,6 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "em_bus.h"
-#include "em_cmu.h"
-#include "em_gpio.h"
-#include "em_ldma.h"
-#include "em_usart.h"
-
 #include "dhcp_client.h"
 #include "lwip/dhcp.h"
 #include "wfx_host_events.h"
diff --git a/src/platform/silabs/SiWx917/wifi/ethernetif.cpp b/src/platform/silabs/SiWx917/wifi/ethernetif.cpp
index d1fcc01..13cc843 100644
--- a/src/platform/silabs/SiWx917/wifi/ethernetif.cpp
+++ b/src/platform/silabs/SiWx917/wifi/ethernetif.cpp
@@ -21,12 +21,6 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "em_bus.h"
-#include "em_cmu.h"
-#include "em_gpio.h"
-#include "em_ldma.h"
-#include "em_usart.h"
-
 #ifndef WF200_WIFI
 #include "FreeRTOS.h"
 #include "event_groups.h"
@@ -182,141 +176,6 @@
     }
 }
 
-/*****************************************************************************
- *  @fn  static err_t low_level_output(struct netif *netif, struct pbuf *p)
- *  @brief
- *    This function should does the actual transmission of the packet(s).
- *    The packet is contained in the pbuf that is passed to the function.
- *    This pbuf might be chained.
- *
- * @param[in] netif: the lwip network interface structure
- *
- * @param[in] p: the packet to send
- *
- * @return
- *    ERR_OK if successful
- ******************************************************************************/
-#ifdef WF200_WIFI
-static err_t low_level_output(struct netif * netif, struct pbuf * p)
-{
-    struct pbuf * q;
-    sl_wfx_send_frame_req_t * tx_buffer;
-    uint8_t * buffer;
-    uint32_t framelength, asize;
-    uint32_t bufferoffset;
-    uint32_t padding;
-    sl_status_t result;
-
-    for (q = p, framelength = 0; q != NULL; q = q->next)
-    {
-        framelength += q->len;
-    }
-    if (framelength < LWIP_FRAME_ALIGNMENT)
-    { /* 60 : Frame alignment for LWIP */
-        padding = LWIP_FRAME_ALIGNMENT - framelength;
-    }
-    else
-    {
-        padding = 0;
-    }
-
-    /* choose padding of 64 */
-    asize = SL_WFX_ROUND_UP(framelength + padding, 64) + sizeof(sl_wfx_send_frame_req_t);
-    // 12 is size of other data in buffer struct, user shouldn't have to care about this?
-    if (sl_wfx_host_allocate_buffer((void **) &tx_buffer, SL_WFX_TX_FRAME_BUFFER, asize) != SL_STATUS_OK)
-    {
-        SILABS_LOG("*ERR*EN-Out: No mem frame len=%d", framelength);
-        gOverrunCount++;
-        SILABS_LOG("overrun count exiting when faied to alloc value %d", gOverrunCount);
-        return ERR_MEM;
-    }
-    buffer = tx_buffer->body.packet_data;
-    /* copy frame from pbufs to driver buffers */
-    for (q = p, bufferoffset = 0; q != NULL; q = q->next)
-    {
-        /* Get bytes in current lwIP buffer */
-        memcpy((uint8_t *) ((uint8_t *) buffer + bufferoffset), (uint8_t *) ((uint8_t *) q->payload), q->len);
-        bufferoffset += q->len;
-    }
-    /* No requirement to do this - but we should for security */
-    if (padding)
-    {
-        memset(buffer + bufferoffset, 0, padding);
-        framelength += padding;
-    }
-    /* transmit */
-    int i  = 0;
-    result = SL_STATUS_FAIL;
-
-#ifdef WIFI_DEBUG_ENABLED
-    SILABS_LOG("WF200: Out %d", (int) framelength);
-#endif
-
-    /* send the generated frame over Wifi network */
-    while ((result != SL_STATUS_OK) && (i++ < 10))
-    {
-        result = sl_wfx_send_ethernet_frame(tx_buffer, framelength, SL_WFX_STA_INTERFACE, PRIORITY_0);
-    }
-    sl_wfx_host_free_buffer(tx_buffer, SL_WFX_TX_FRAME_BUFFER);
-
-    if (result != SL_STATUS_OK)
-    {
-        SILABS_LOG("*ERR*Send enet %d", (int) framelength);
-        return ERR_IF;
-    }
-    return ERR_OK;
-}
-
-/*****************************************************************************
- * @fn   void sl_wfx_host_received_frame_callback(sl_wfx_received_ind_t *rx_buffer)
- * @brief
- *    This function implements the wf200 received frame callback.
- *    Called from the context of the bus_task (not ISR)
- *
- * @param[in] rx_buffer: the ethernet frame received by the wf200
- *
- * @return
- *    None
- ******************************************************************************/
-void sl_wfx_host_received_frame_callback(sl_wfx_received_ind_t * rx_buffer)
-{
-    struct netif * netif;
-
-    /* Check packet interface to send to AP or STA interface */
-    if ((rx_buffer->header.info & SL_WFX_MSG_INFO_INTERFACE_MASK) == (SL_WFX_STA_INTERFACE << SL_WFX_MSG_INFO_INTERFACE_OFFSET))
-    {
-
-        /* Send received frame to station interface */
-        if ((netif = wfx_get_netif(SL_WFX_STA_INTERFACE)) != NULL)
-        {
-            uint8_t * buffer;
-            uint16_t len;
-
-            len    = rx_buffer->body.frame_length;
-            buffer = (uint8_t *) &(rx_buffer->body.frame[rx_buffer->body.frame_padding]);
-
-#ifdef WIFI_DEBUG_ENABLED
-            SILABS_LOG("WF200: In %d", (int) len);
-#endif
-
-            low_level_input(netif, buffer, len);
-        }
-        else
-        {
-#ifdef WIFI_DEBUG_ENABLED
-            SILABS_LOG("WF200: NO-INTF");
-#endif
-        }
-    }
-    else
-    {
-#ifdef WIFI_DEBUG_ENABLED
-        SILABS_LOG("WF200: Invalid frame IN");
-#endif
-    }
-}
-
-#else /* For RS911x - using LWIP */
 static SemaphoreHandle_t ethout_sem;
 /*****************************************************************************
  *  @fn  static err_t low_level_output(struct netif *netif, struct pbuf *p)
@@ -422,8 +281,6 @@
     }
 }
 
-#endif /* RS911x - with LWIP */
-
 /*****************************************************************************
  *  @fn  err_t sta_ethernetif_init(struct netif *netif)
  *  @brief
@@ -452,10 +309,10 @@
 
     /* initialize the hardware */
     low_level_init(netif);
-#ifndef WF200_WIFI
+
     /* Need single output only */
     ethout_sem = xSemaphoreCreateBinaryStatic(&xEthernetIfSemaBuffer);
     xSemaphoreGive(ethout_sem);
-#endif
+
     return ERR_OK;
 }
diff --git a/src/platform/silabs/SiWx917/wifi/ethernetif.h b/src/platform/silabs/SiWx917/wifi/ethernetif.h
index dfea1ea..bac51b9 100644
--- a/src/platform/silabs/SiWx917/wifi/ethernetif.h
+++ b/src/platform/silabs/SiWx917/wifi/ethernetif.h
@@ -42,11 +42,8 @@
  ******************************************************************************/
 err_t ap_ethernetif_init(struct netif * netif);
 
-#ifdef WF200_WIFI
-void sl_wfx_host_received_frame_callback(sl_wfx_received_ind_t * rx_buffer);
-#else
 void wfx_host_received_sta_frame_cb(uint8_t * buf, int len);
-#endif /* WF200_WIFI */
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/platform/silabs/SiWx917/wifi/lwip_netif.cpp b/src/platform/silabs/SiWx917/wifi/lwip_netif.cpp
index e19cf97..913f589 100644
--- a/src/platform/silabs/SiWx917/wifi/lwip_netif.cpp
+++ b/src/platform/silabs/SiWx917/wifi/lwip_netif.cpp
@@ -20,12 +20,6 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "em_bus.h"
-#include "em_cmu.h"
-#include "em_gpio.h"
-#include "em_ldma.h"
-#include "em_usart.h"
-
 #include "wfx_host_events.h"
 #include "wifi_config.h"
 
diff --git a/src/platform/silabs/SiWx917/wifi/wfx_host_events.h b/src/platform/silabs/SiWx917/wifi/wfx_host_events.h
index 5a7e861..66e161d 100644
--- a/src/platform/silabs/SiWx917/wifi/wfx_host_events.h
+++ b/src/platform/silabs/SiWx917/wifi/wfx_host_events.h
@@ -17,86 +17,7 @@
 
 #pragma once
 
-#ifdef WF200_WIFI
-#include "FreeRTOS.h"
-#include "event_groups.h"
-#include "semphr.h"
-#include "task.h"
-#include "timers.h"
-
-#include "sl_wfx_cmd_api.h"
-#include "sl_wfx_constants.h"
-
-typedef struct __attribute__((__packed__)) sl_wfx_get_counters_cnf_body_s
-{
-    uint32_t status;
-    uint16_t mib_id;
-    uint16_t length;
-    uint32_t rcpi;
-    uint32_t count_plcp_errors;
-    uint32_t count_fcs_errors;
-    uint32_t count_tx_packets;
-    uint32_t count_rx_packets;
-    uint32_t count_rx_packet_errors;
-    uint32_t count_rx_decryption_failures;
-    uint32_t count_rx_mic_failures;
-    uint32_t count_rx_no_key_failures;
-    uint32_t count_tx_multicast_frames;
-    uint32_t count_tx_frames_success;
-    uint32_t count_tx_frame_failures;
-    uint32_t count_tx_frames_retried;
-    uint32_t count_tx_frames_multi_retried;
-    uint32_t count_rx_frame_duplicates;
-    uint32_t count_rts_success;
-    uint32_t count_rts_failures;
-    uint32_t count_ack_failures;
-    uint32_t count_rx_multicast_frames;
-    uint32_t count_rx_frames_success;
-    uint32_t count_rx_cmacicv_errors;
-    uint32_t count_rx_cmac_replays;
-    uint32_t count_rx_mgmt_ccmp_replays;
-    uint32_t count_rx_bipmic_errors;
-    uint32_t count_rx_beacon;
-    uint32_t count_miss_beacon;
-    uint32_t reserved[15];
-} sl_wfx_get_counters_cnf_body_t;
-
-typedef struct __attribute__((__packed__)) sl_wfx_get_counters_cnf_s
-{
-    /** Common message header. */
-    sl_wfx_header_t header;
-    /** Confirmation message body. */
-    sl_wfx_get_counters_cnf_body_t body;
-} sl_wfx_get_counters_cnf_t;
-
-typedef struct __attribute__((__packed__)) sl_wfx_mib_req_body_s
-{
-    uint16_t mib_id; ///< ID of the MIB to be read.
-    uint16_t reserved;
-} sl_wfx_mib_req_body_t;
-
-typedef struct __attribute__((__packed__)) sl_wfx_header_mib_s
-{
-    uint16_t length; ///< Message length in bytes including this uint16_t.
-                     ///< Maximum value is 8188 but maximum Request size is FW dependent and reported in the
-                     ///< ::sl_wfx_startup_ind_body_t::size_inp_ch_buf.
-    uint8_t id;      ///< Contains the message Id indexed by sl_wfx_general_commands_ids_t or sl_wfx_message_ids_t.
-    uint8_t reserved : 1;
-    uint8_t interface : 2;
-    uint8_t seqnum : 3;
-    uint8_t encrypted : 2;
-} sl_wfx_header_mib_t;
-
-typedef struct __attribute__((__packed__)) sl_wfx_mib_req_s
-{
-    /** Common message header. */
-    sl_wfx_header_mib_t header;
-    /** Request message body. */
-    sl_wfx_mib_req_body_t body;
-} sl_wfx_mib_req_t;
-
-#else /* End WF200 else RS911x */
-
+#include "stdbool.h"
 #include "wfx_msgs.h"
 
 /* Wi-Fi events*/
@@ -106,8 +27,6 @@
 #define SL_WFX_SCAN_COMPLETE_ID 4
 #define WFX_RSI_SSID_SIZE 64
 
-#endif /* WF200 */
-
 #ifndef RS911X_SOCKETS
 /* LwIP includes. */
 #include "lwip/apps/httpd.h"
@@ -129,18 +48,11 @@
 
 #include "sl_status.h"
 
-#ifdef RS911X_WIFI
 #define WLAN_TASK_STACK_SIZE 1024
-#define WLAN_TASK_PRIORITY 1
-#define WLAN_DRIVER_TASK_PRIORITY 1
+#define WLAN_TASK_PRIORITY 3
+#define WLAN_DRIVER_TASK_PRIORITY 2
 #define MAX_JOIN_RETRIES_COUNT 5
 
-#else /* WF200 */
-#define WLAN_TASK_STACK_SIZE 1024
-#define WLAN_TASK_PRIORITY 1
-#define MAX_JOIN_RETRIES_COUNT 5
-#endif
-
 // WLAN related Macros
 #define ETH_FRAME 0
 #define CMP_SUCCESS 0
@@ -322,6 +234,7 @@
 int32_t wfx_get_ap_info(wfx_wifi_scan_result_t * ap);
 int32_t wfx_get_ap_ext(wfx_wifi_scan_ext_t * extra_info);
 int32_t wfx_reset_counts();
+int32_t wfx_rsi_platform();
 
 void wfx_clear_wifi_provision(void);
 sl_status_t wfx_connect_to_ap(void);
@@ -364,12 +277,6 @@
 int32_t wfx_rsi_send_data(void * p, uint16_t len);
 #endif /* RS911X_WIFI */
 
-#ifdef WF200_WIFI
-void wfx_bus_start(void);
-sl_status_t get_all_counters(void);
-void sl_wfx_host_gpio_init(void);
-sl_status_t sl_wfx_host_process_event(sl_wfx_generic_message_t * event_payload);
-#endif
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/platform/silabs/SiWx917/wifi/wfx_notify.cpp b/src/platform/silabs/SiWx917/wifi/wfx_notify.cpp
index 9f681e7..86bba19 100644
--- a/src/platform/silabs/SiWx917/wifi/wfx_notify.cpp
+++ b/src/platform/silabs/SiWx917/wifi/wfx_notify.cpp
@@ -19,13 +19,6 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "em_bus.h"
-#include "em_cmu.h"
-#include "em_gpio.h"
-#include "em_ldma.h"
-#include "em_usart.h"
-#include "gpiointerrupt.h"
-
 #include "AppConfig.h"
 
 #include "FreeRTOS.h"
diff --git a/src/platform/silabs/SiWx917/wifi_args.gni b/src/platform/silabs/SiWx917/wifi_args.gni
index 73a6613..88d554d 100644
--- a/src/platform/silabs/SiWx917/wifi_args.gni
+++ b/src/platform/silabs/SiWx917/wifi_args.gni
@@ -17,7 +17,7 @@
 import("//build_overrides/efr32_sdk.gni")
 import("//build_overrides/pigweed.gni")
 
-import("${chip_root}/examples/platform/silabs/efr32/args.gni")
+import("${chip_root}/examples/platform/silabs/SiWx917/args.gni")
 import("${chip_root}/src/crypto/crypto.gni")
 
 # ARM architecture flags will be set based on silabs_family.
@@ -25,11 +25,6 @@
 
 mbedtls_target = "${efr32_sdk_build_root}:efr32_sdk"
 
-# default to platform crypto implementation but allow commandline override
-if (chip_crypto == "") {
-  chip_crypto = "platform"
-}
-
 # Transitional CommissionableDataProvider not used anymore
 # examples/platform/efr32/EFR32DeviceDataProvider is now used.
 chip_use_transitional_commissionable_data_provider = false
@@ -41,7 +36,7 @@
 lwip_api = true
 lwip_ethernet = true
 
-chip_device_platform = "efr32"
+chip_device_platform = "SiWx917"
 chip_enable_openthread = false
 chip_inet_config_enable_ipv4 = true
 chip_inet_config_enable_dns_resolver = false
diff --git a/third_party/silabs/BUILD.gn b/third_party/silabs/BUILD.gn
index f968d3d..9c59de2 100644
--- a/third_party/silabs/BUILD.gn
+++ b/third_party/silabs/BUILD.gn
@@ -16,7 +16,13 @@
 import("//build_overrides/efr32_sdk.gni")
 import("//build_overrides/jlink.gni")
 import("${chip_root}/src/platform/device.gni")
-import("${efr32_sdk_build_root}/efr32_sdk.gni")
+import("${efr32_sdk_build_root}/silabs_board.gni")
+
+if (silabs_board == "BRD4325A") {  # CCP board
+  import("${efr32_sdk_build_root}/SiWx917_sdk.gni")
+} else {
+  import("${efr32_sdk_build_root}/efr32_sdk.gni")
+}
 
 declare_args() {
   # Build target to use for efr32 SDK. Use this to set global SDK defines.
diff --git a/third_party/silabs/SiWx917_sdk.gni b/third_party/silabs/SiWx917_sdk.gni
index 38359a7..5d6a857 100644
--- a/third_party/silabs/SiWx917_sdk.gni
+++ b/third_party/silabs/SiWx917_sdk.gni
@@ -24,6 +24,8 @@
   # Location of the efr32 SDK.
   efr32_sdk_root = "${chip_root}/third_party/silabs/gecko_sdk"
   sdk_support_root = "${chip_root}/third_party/silabs/matter_support"
+  wiseconnect_sdk_root = "${chip_root}/third_party/silabs/wisemcu-wifi-bt-sdk"
+  examples_plat_dir = "${chip_root}/examples/platform/silabs/SiWx917"
 
   # Build openthread with prebuilt silabs lib
   use_silabs_thread_lib = false
@@ -35,9 +37,6 @@
   # Use Silabs factory data provider example.
   # Users can implement their own.
   use_efr32_factory_data_provider = true
-
-  # Enable Segger System View
-  use_system_view = false
 }
 
 # Explorer Kit and MGM240L do not have external flash
@@ -67,12 +66,6 @@
   }
 
   assert(efr32_sdk_root != "", "efr32_sdk_root must be specified")
-  use_wf200 = false
-  if (defined(invoker.use_wf200)) {
-    if (invoker.use_wf200) {
-      use_wf200 = true
-    }
-  }
 
   sdk_target_name = target_name
 
@@ -85,82 +78,30 @@
 
     # Treat these includes as system includes, so warnings in them are not fatal.
     _include_dirs = [
-      "${efr32_sdk_root}",
-      "${efr32_sdk_root}/hardware/kit/common/bsp",
-      "${efr32_sdk_root}/app/common/util/app_assert/",
-      "${efr32_sdk_root}/hardware/board/inc",
-      "${efr32_sdk_root}/hardware/driver/memlcd/inc",
-      "${efr32_sdk_root}/hardware/driver/memlcd/src/ls013b7dh03",
-      "${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/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/button/inc",
-      "${efr32_sdk_root}/platform/emdrv/common/inc",
-      "${efr32_sdk_root}/platform/emdrv/gpiointerrupt/inc",
-      "${efr32_sdk_root}/platform/emdrv/dmadrv/config",
-      "${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/hal",
-      "${efr32_sdk_root}/platform/radio/rail_lib/hal/efr32",
-      "${efr32_sdk_root}/platform/radio/rail_lib/protocol/ieee802154",
-      "${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_rf_path",
-      "${efr32_sdk_root}/platform/service/device_init/inc",
-      "${efr32_sdk_root}/platform/service/hfxo_manager/config/",
-      "${efr32_sdk_root}/platform/service/hfxo_manager/inc",
-      "${efr32_sdk_root}/platform/service/hfxo_manager/src",
-      "${efr32_sdk_root}/platform/service/mpu/inc",
-      "${efr32_sdk_root}/platform/service/power_manager/config/",
-      "${efr32_sdk_root}/platform/service/power_manager/inc/",
-      "${efr32_sdk_root}/platform/service/power_manager/src/",
-      "${efr32_sdk_root}/platform/service/sleeptimer/inc",
-      "${efr32_sdk_root}/platform/service/sleeptimer/config",
-      "${efr32_sdk_root}/platform/service/system/inc",
-      "${efr32_sdk_root}/platform/service/udelay/inc",
-      "${efr32_sdk_root}/platform/service/legacy_hal/inc",
-      "${efr32_sdk_root}/platform/service/token_manager/config",
-      "${efr32_sdk_root}/platform/service/token_manager/inc",
-      "${efr32_sdk_root}/platform/service/token_manager/test",
-      "${efr32_sdk_root}/platform/service/token_manager/test/include",
-      "${efr32_sdk_root}/platform/service/token_manager/test/stack/config",
-      "${efr32_sdk_root}/platform/service/token_manager/test/stack/include",
-      "${efr32_sdk_root}/platform/middleware/glib",
-      "${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}/app/bluetooth/common/in_place_ota_dfu/",
-      "${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/third_party/crypto/mbedtls/include",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/include/psa",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_alt/include",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_protocol_crypto/src",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/inc",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/config/",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/inc",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/inc/public",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/inc",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/",
-      "${efr32_sdk_root}/util/third_party/freertos/cmsis/Include",
-      "${efr32_sdk_root}/util/third_party/freertos/kernel/include",
-      "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}/config",
-      "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}/autogen",
+      "${sdk_support_root}/platform/emdrv/nvm3/inc",
+
+      "${chip_root}/third_party/mbedtls/repo/include",
+
+      ### CCP includes ###
+      "${wiseconnect_sdk_root}/platforms/si91x/drivers/peripheral_drivers/inc",
+      "${wiseconnect_sdk_root}/platforms/si91x/core/chip/inc",
+      "${wiseconnect_sdk_root}/platforms/si91x/core/config",
+      "${wiseconnect_sdk_root}/platforms/si91x/drivers/cmsis_driver/config",
+      "${wiseconnect_sdk_root}/platforms/si91x/drivers/rom_driver/inc",
+      "${wiseconnect_sdk_root}/platforms/si91x/drivers/systemlevel/inc",
+
+      "${wiseconnect_sdk_root}/platforms/si91x/drivers/cmsis_driver",
+      "${wiseconnect_sdk_root}/platforms/si91x/drivers/cmsis_driver/CMSIS/Driver/Include",
+      "${wiseconnect_sdk_root}/platforms/si91x/boards/brd4325a/inc",
+      "${wiseconnect_sdk_root}/platforms/si91x/core/cmsis",
+      "${wiseconnect_sdk_root}/third_party/freertos/include",
+      "${wiseconnect_sdk_root}/third_party/freertos/portable/GCC/ARM_CM4F",
+      "${examples_plat_dir}/device/inc",
+
+      "${wiseconnect_sdk_root}/sapi/include",
+
+      "${chip_root}/examples/platform/SiWx917/SiWx917",
+      "${chip_root}/examples/platform/SiWx917/SiWx917/hal",
     ]
 
     # Note that we're setting the mbedTLS and PSA configuration files through a
@@ -169,13 +110,14 @@
     # To fix this, these files are also manually depended upon in the source set
     # declared in efr32_mbedtls_config further down this file.
     defines = [
-      "MBEDTLS_CONFIG_FILE=\"efr32-chip-mbedtls-config.h\"",
-      "MBEDTLS_PSA_CRYPTO_CONFIG_FILE=\"efr32-mbedtls-psa-crypto-config.h\"",
+      "MBEDTLS_CONFIG_FILE=\"siwx917-chip-mbedtls-config.h\"",
       "__STARTUP_CLEAR_BSS",
       "HARD_FAULT_LOG_ENABLE",
       "CORTEXM3_EFM32_MICRO",
-      "EFR32_LOG_ENABLED=1",
-      "NVM3_DEFAULT_NVM_SIZE=40960",
+      "SILABS_LOG_ENABLED=1",
+
+      #Matter required at least 40960 but SiWx917 SoC requires an extra 20k to resolve nvm3_open() error, Need to be checked.
+      "NVM3_DEFAULT_NVM_SIZE=73728",
       "NVM3_DEFAULT_MAX_OBJECT_SIZE=4092",
       "KVS_MAX_ENTRIES=${kvs_max_entries}",
       "EFR32_OPENTHREAD_API",
@@ -186,36 +128,18 @@
       "${silabs_mcu}=1",
       "${silabs_board}=1",
       "__HEAP_SIZE=0",
-      "SL_CATALOG_FREERTOS_KERNEL_PRESENT=1",
-      "MBEDTLS_THREADING_C=1",
-      "MBEDTLS_THREADING_ALT=1",
-      "SL_THREADING_ALT=1",
       "SL_COMPONENT_CATALOG_PRESENT",
       "PLATFORM_HEADER=\"platform-header.h\"",
       "USE_NVM3=1",
-
-      #"__STACK_SIZE=0",
+      "RSI_ARM_CM4F",
+      "RSI_BLE_ENABLE=1",
+      "BRD4325A",
+      "CHIP_9117",
+      "RS91X_BLE_ENABLE=1",
     ]
 
-    if (use_system_view) {
-      _include_dirs += [
-        "${efr32_sdk_root}/util/third_party/segger/systemview/SEGGER",
-        "${efr32_sdk_root}/util/third_party/segger/systemview/Sample/FreeRTOSV10/Config/Cortex-M",
-        "${efr32_sdk_root}/util/third_party/segger/systemview/Sample/FreeRTOSV10",
-        "${efr32_sdk_root}/util/third_party/segger/systemview/Config/",
-      ]
-
-      defines += [ "SL_SYSTEM_VIEW=1" ]
-    }
-
     defines += board_defines
 
-    if (use_wstk_leds) {
-      _include_dirs += [ "${efr32_sdk_root}/platform/driver/leddrv/inc" ]
-
-      defines += [ "ENABLE_WSTK_LEDS" ]
-    }
-
     if (defined(invoker.enable_sleepy_device)) {
       if (invoker.enable_sleepy_device) {
         defines += [
@@ -257,112 +181,11 @@
         "${efr32_sdk_root}/platform/emdrv/uartdrv/inc",
         "${efr32_sdk_root}/platform/emdrv/uartdrv/config",
         "${efr32_sdk_root}/hardware/driver/memlcd/inc/memlcd_usart",
+        "${efr32_sdk_root}/platform/common/errno/inc",
       ]
     }
 
-    if (silabs_family == "efr32mg12") {
-      _include_dirs += [
-        "${efr32_sdk_root}/platform/Device/SiliconLabs/EFR32MG12P/Include",
-        "${efr32_sdk_root}/platform/radio/rail_lib/chip/efr32/efr32xg1x",
-        "${efr32_sdk_root}/util/third_party/freertos/kernel/portable/GCC/ARM_CM4F",
-        "${efr32_sdk_root}/platform/radio/rail_lib/plugin/pa-conversions/efr32xg1x/config",
-        "${efr32_sdk_root}/platform/service/device_init/config/s1/",
-        "${efr32_sdk_root}/platform/emdrv/spidrv/inc",
-      ]
-
-      libs += [
-        "${sdk_support_root}/protocol/bluetooth/lib/EFR32MG12P/GCC/binapploader.o",
-        "${sdk_support_root}/protocol/bluetooth/lib/EFR32MG12P/GCC/libbluetooth.a",
-        "${sdk_support_root}/platform/radio/rail_lib/autogen/librail_release/librail_multiprotocol_efr32xg12_gcc_release.a",
-        "${sdk_support_root}/platform/emdrv/nvm3/lib/libnvm3_CM4_gcc.a",
-      ]
-
-      defines += [ "EFR32MG12" ]
-    } else if (silabs_family == "efr32mg21") {
-      _include_dirs += [
-        "${efr32_sdk_root}/platform/Device/SiliconLabs/EFR32MG21/Include",
-        "${efr32_sdk_root}/platform/radio/rail_lib/chip/efr32/efr32xg2x",
-        "${efr32_sdk_root}/util/third_party/freertos/kernel/portable/GCC/ARM_CM33_NTZ/non_secure",
-        "${efr32_sdk_root}/platform/radio/rail_lib/plugin/pa-conversions/efr32xg21",
-        "${efr32_sdk_root}/platform/radio/rail_lib/plugin/pa-conversions/efr32xg21/config",
-        "${efr32_sdk_root}/platform/service/device_init/config/s2/",
-      ]
-
-      libs += [
-        "${sdk_support_root}/protocol/bluetooth/lib/EFR32MG21/GCC/binapploader.o",
-        "${sdk_support_root}/protocol/bluetooth/lib/EFR32MG21/GCC/libbluetooth.a",
-        "${sdk_support_root}/platform/radio/rail_lib/autogen/librail_release/librail_multiprotocol_efr32xg21_gcc_release.a",
-        "${sdk_support_root}/platform/emdrv/nvm3/lib/libnvm3_CM33_gcc.a",
-      ]
-
-      defines += [
-        "EFR32MG21",
-        "EFR32_SERIES2_CONFIG1_MICRO",
-      ]
-    } else if (silabs_family == "efr32mg24") {
-      _include_dirs += [
-        "${efr32_sdk_root}/platform/Device/SiliconLabs/EFR32MG24/Include",
-        "${efr32_sdk_root}/platform/radio/rail_lib/chip/efr32/efr32xg2x",
-        "${efr32_sdk_root}/util/third_party/freertos/kernel/portable/GCC/ARM_CM33_NTZ/non_secure",
-        "${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/spidrv/inc",
-      ]
-
-      libs += [
-        "${sdk_support_root}/protocol/bluetooth/lib/EFR32MG24/GCC/libapploader.a",
-        "${sdk_support_root}/protocol/bluetooth/lib/EFR32MG24/GCC/libbluetooth.a",
-        "${sdk_support_root}/platform/radio/rail_lib/autogen/librail_release/librail_multiprotocol_efr32xg24_gcc_release.a",
-        "${sdk_support_root}/platform/emdrv/nvm3/lib/libnvm3_CM33_gcc.a",
-      ]
-
-      defines += [
-        "EFR32MG24",
-        "EFR32_SERIES2_CONFIG4_MICRO",
-      ]
-    } else if (silabs_family == "mgm24") {
-      _include_dirs += [
-        "${efr32_sdk_root}/platform/Device/SiliconLabs/MGM24/Include",
-        "${efr32_sdk_root}/platform/radio/rail_lib/chip/efr32/efr32xg2x",
-        "${efr32_sdk_root}/platform/radio/rail_lib/protocol/ble",
-        "${efr32_sdk_root}/platform/radio/rail_lib/protocol/ieee802154",
-        "${efr32_sdk_root}/util/third_party/freertos/kernel/portable/GCC/ARM_CM33_NTZ/non_secure",
-        "${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/",
-      ]
-
-      libs += [
-        "${sdk_support_root}/protocol/bluetooth/lib/EFR32MG24/GCC/libapploader.a",
-        "${sdk_support_root}/protocol/bluetooth/lib/EFR32MG24/GCC/libbluetooth.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",
-      ]
-
-      if (silabs_mcu == "MGM240PB32VNA") {
-        libs += [ "${sdk_support_root}/platform/radio/rail_lib/autogen/librail_release/librail_config_mgm240pb32vna_gcc.a" ]
-      } else if (silabs_mcu == "MGM240PB22VNA") {
-        libs += [ "${sdk_support_root}/platform/radio/rail_lib/autogen/librail_release/librail_config_mgm240pb22vna_gcc.a" ]
-      } else if (silabs_mcu == "MGM240L022RNF") {
-        libs += [ "${sdk_support_root}/platform/radio/rail_lib/autogen/librail_release/librail_config_mgm240l022rnf_gcc.a" ]
-      }
-
-      defines += [
-        "MGM24",
-        "EFR32_SERIES2_CONFIG4_MICRO",
-      ]
-    }
-
-    if (use_wf200) {
-      _include_dirs += [
-        "${efr32_sdk_root}/platform/radio/wifi/wfx_fmac_driver",
-        "${efr32_sdk_root}/platform/radio/wifi/wfx_fmac_driver/bus",
-        "${efr32_sdk_root}/platform/radio/wifi/wfx_fmac_driver/firmware",
-        "${efr32_sdk_root}/platform/radio/wifi/wfx_fmac_driver/pds/brd8022a",
-        "${efr32_sdk_root}/platform/radio/wifi/wfx_fmac_driver/secure_link",
-      ]
-    }
+    libs += [ "${sdk_support_root}/platform/emdrv/nvm3/lib/libnvm3_CM4_gcc.a" ]
 
     cflags = []
     foreach(include_dir, _include_dirs) {
@@ -390,14 +213,13 @@
     }
   }
 
-  source_set("efr32_mbedtls_config") {
+  source_set("si917_mbedtls_config") {
     # We're setting the mbedTLS config flags here as the efr32_sdk target
     # acts as the mbedTLS target for EFR32 builds. We need this for the build
     # system to recompile mbedTLS (= the SDK) when the mbedTLS config gets
     # edited.
     sources = [
-      "${chip_root}/src/platform/silabs/EFR32/efr32-chip-mbedtls-config.h",
-      "${chip_root}/src/platform/silabs/EFR32/efr32-mbedtls-psa-crypto-config.h",
+      "${chip_root}/src/platform/silabs/SiWx917/siwx917-chip-mbedtls-config.h",
     ]
 
     public_deps = [ "${chip_root}/src/crypto:crypto_buildconfig" ]
@@ -405,412 +227,91 @@
 
   source_set(sdk_target_name) {
     sources = [
-      "${chip_root}/third_party/mbedtls/repo/include/mbedtls/platform.h",
-      "${efr32_sdk_root}/app/bluetooth/common/in_place_ota_dfu/sl_bt_in_place_ota_dfu.c",
-      "${efr32_sdk_root}/hardware/board/src/sl_board_control_gpio.c",
-      "${efr32_sdk_root}/hardware/board/src/sl_board_init.c",
-      "${efr32_sdk_root}/platform/CMSIS/RTOS2/Source/os_systick.c",
-      "${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_slist.c",
-      "${efr32_sdk_root}/platform/driver/button/src/sl_button.c",
-      "${efr32_sdk_root}/platform/driver/button/src/sl_simple_button.c",
-      "${efr32_sdk_root}/platform/emdrv/dmadrv/src/dmadrv.c",
-      "${efr32_sdk_root}/platform/emdrv/gpiointerrupt/src/gpiointerrupt.c",
-      "${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",
-      "${efr32_sdk_root}/platform/emlib/src/em_emu.c",
-      "${efr32_sdk_root}/platform/emlib/src/em_gpio.c",
-      "${efr32_sdk_root}/platform/emlib/src/em_ldma.c",
-      "${efr32_sdk_root}/platform/emlib/src/em_msc.c",
-      "${efr32_sdk_root}/platform/emlib/src/em_prs.c",
-      "${efr32_sdk_root}/platform/emlib/src/em_rmu.c",
-      "${efr32_sdk_root}/platform/emlib/src/em_rtcc.c",
-      "${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/radio/rail_lib/hal/efr32/hal_efr.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_pti/sl_rail_util_pti.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/hfxo_manager/src/sl_hfxo_manager.c",
-      "${efr32_sdk_root}/platform/service/legacy_hal/src/token_legacy.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/sleeptimer/src/sl_sleeptimer_hal_sysrtc.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}/platform/service/system/src/sl_system_process_action.c",
-      "${efr32_sdk_root}/platform/service/token_manager/src/sl_token_def.c",
-      "${efr32_sdk_root}/platform/service/token_manager/src/sl_token_manager.c",
-      "${efr32_sdk_root}/platform/service/token_manager/src/sl_token_manufacturing.c",
-      "${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}/protocol/bluetooth/src/sl_bt_mbedtls_context.c",
-      "${efr32_sdk_root}/protocol/bluetooth/src/sl_bt_rtos_adaptation.c",
-      "${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}/util/silicon_labs/silabs_core/memory_manager/sl_malloc.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/aes.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/aesni.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/asn1parse.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/asn1write.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/base64.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/bignum.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/camellia.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ccm.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/chacha20.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/chachapoly.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/cipher.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/cipher_wrap.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/cmac.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/constant_time.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ctr_drbg.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/debug.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/des.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/dhm.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ecdh.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ecdsa.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ecjpake.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ecp.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ecp_curves.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/entropy.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/entropy_poll.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/gcm.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/hkdf.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/hmac_drbg.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/md.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/md5.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/oid.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/pem.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/pk.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/pk_wrap.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/pkcs12.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/pkcs5.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/pkparse.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/pkwrite.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/platform.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/platform_util.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/poly1305.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/psa_crypto.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/psa_crypto_aead.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/psa_crypto_cipher.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/psa_crypto_client.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/psa_crypto_driver_wrappers.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/psa_crypto_ecp.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/psa_crypto_hash.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/psa_crypto_mac.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/psa_crypto_rsa.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/psa_crypto_se.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/psa_crypto_slot_management.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/psa_crypto_storage.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/psa_its_file.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ripemd160.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/rsa.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/sha1.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/sha256.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/sha512.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ssl_cache.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ssl_ciphersuites.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ssl_cli.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ssl_cookie.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ssl_msg.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ssl_srv.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ssl_ticket.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ssl_tls.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ssl_tls13_keys.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/threading.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/timing.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/version.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/x509.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/x509_create.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/x509_crl.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/x509_crt.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/x509_csr.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/x509write_crt.c",
-      "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/x509write_csr.c",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/aes_aes.c",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/crypto_aes.c",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/crypto_ecp.c",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/error.c",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/mbedtls_ccm.c",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/mbedtls_cmac.c",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/mbedtls_ecdsa_ecdh.c",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/mbedtls_sha.c",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/sl_entropy_hardware.c",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/sl_mbedtls.c",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/version_features.c",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_protocol_crypto/src/sli_protocol_crypto_crypto.c",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_protocol_crypto/src/sli_protocol_crypto_radioaes.c",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/crypto_management.c",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sl_psa_its_nvm3.c",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_crypto_transparent_driver_aead.c",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_crypto_transparent_driver_cipher.c",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_crypto_transparent_driver_hash.c",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_crypto_transparent_driver_mac.c",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_crypto_trng_driver.c",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_psa_driver_common.c",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_psa_driver_init.c",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_psa_trng.c",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_builtin_keys.c",
-      "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_signature.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/queue.c",
-      "${efr32_sdk_root}/util/third_party/freertos/kernel/stream_buffer.c",
-      "${efr32_sdk_root}/util/third_party/freertos/kernel/tasks.c",
-      "${efr32_sdk_root}/util/third_party/freertos/kernel/timers.c",
-      "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}/autogen/gatt_db.c",
-      "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}/autogen/sl_bluetooth.c",
-      "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}/autogen/sl_board_default_init.c",
-      "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}/autogen/sl_device_init_clocks.c",
-      "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}/autogen/sl_event_handler.c",
-      "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}/autogen/sl_simple_button_instances.c",
+      "${examples_plat_dir}/device/src/startup_RS1xxxx.c",
+      "${sdk_support_root}/platform/emdrv/nvm3/src/ccp_flash_dev.c",
+      "${sdk_support_root}/platform/emdrv/nvm3/src/ccp_flash_intf.c",
+      "${sdk_support_root}/platform/emdrv/nvm3/src/ccp_flash_prg.c",
+      "${sdk_support_root}/platform/emdrv/nvm3/src/nvm3_default.c",
+
+      ### nvm3 for ccp platform ###
+      "${sdk_support_root}/platform/emdrv/nvm3/src/nvm3_hal_flash_ccp.c",
+      "${sdk_support_root}/platform/emdrv/nvm3/src/nvm3_lock.c",
+
+      ######## CCP Platform #########
+      "${wiseconnect_sdk_root}/platforms/si91x/boards/brd4325a/src/rsi_board.c",
+
+      #"${wiseconnect_sdk_root}/platforms/si91x/boards/brd4325a/src/syscalls.c",
+      "${wiseconnect_sdk_root}/platforms/si91x/core/chip/src/rsi_deepsleep_commonflash.c",
+      "${wiseconnect_sdk_root}/platforms/si91x/core/chip/src/rsi_ps_ram_func.c",
+      "${wiseconnect_sdk_root}/platforms/si91x/core/chip/src/rsi_system_config.c",
+      "${wiseconnect_sdk_root}/platforms/si91x/core/chip/src/system_RS1xxxx.c",
+
+      #"${wiseconnect_sdk_root}/platforms/si91x/drivers/cmsis_driver/UDMA.c",
+      #"${wiseconnect_sdk_root}/platforms/si91x/drivers/cmsis_driver/USART.c",
+
+      "${wiseconnect_sdk_root}/platforms/si91x/drivers/peripheral_drivers/src/clock_update.c",
+      "${wiseconnect_sdk_root}/platforms/si91x/drivers/peripheral_drivers/src/rsi_comparator.c",
+      "${wiseconnect_sdk_root}/platforms/si91x/drivers/peripheral_drivers/src/rsi_egpio.c",
+      "${wiseconnect_sdk_root}/platforms/si91x/drivers/peripheral_drivers/src/rsi_udma.c",
+      "${wiseconnect_sdk_root}/platforms/si91x/drivers/peripheral_drivers/src/rsi_udma_wrapper.c",
+      "${wiseconnect_sdk_root}/platforms/si91x/drivers/peripheral_drivers/src/rsi_usart.c",
+      "${wiseconnect_sdk_root}/platforms/si91x/drivers/systemlevel/src/rsi_ipmu.c",
+      "${wiseconnect_sdk_root}/platforms/si91x/drivers/systemlevel/src/rsi_pll.c",
+      "${wiseconnect_sdk_root}/platforms/si91x/drivers/systemlevel/src/rsi_power_save.c",
+      "${wiseconnect_sdk_root}/platforms/si91x/drivers/systemlevel/src/rsi_processor_sensor.c",
+      "${wiseconnect_sdk_root}/platforms/si91x/drivers/systemlevel/src/rsi_rtc.c",
+      "${wiseconnect_sdk_root}/platforms/si91x/drivers/systemlevel/src/rsi_temp_sensor.c",
+      "${wiseconnect_sdk_root}/platforms/si91x/drivers/systemlevel/src/rsi_time_period.c",
+      "${wiseconnect_sdk_root}/platforms/si91x/drivers/systemlevel/src/rsi_ulpss_clk.c",
+      "${wiseconnect_sdk_root}/platforms/si91x/drivers/systemlevel/src/rsi_wwdt.c",
+      "${wiseconnect_sdk_root}/third_party/freertos/croutine.c",
+      "${wiseconnect_sdk_root}/third_party/freertos/event_groups.c",
+      "${wiseconnect_sdk_root}/third_party/freertos/list.c",
+      "${wiseconnect_sdk_root}/third_party/freertos/portable/GCC/ARM_CM4F/port.c",
+      "${wiseconnect_sdk_root}/third_party/freertos/queue.c",
+      "${wiseconnect_sdk_root}/third_party/freertos/stream_buffer.c",
+      "${wiseconnect_sdk_root}/third_party/freertos/tasks.c",
+      "${wiseconnect_sdk_root}/third_party/freertos/timers.c",
+
+      # Bluetooth
+      "${wiseconnect_sdk_root}/sapi/bluetooth/rsi_ble_gap_apis.c",
+      "${wiseconnect_sdk_root}/sapi/bluetooth/rsi_ble_gatt_apis.c",
+      "${wiseconnect_sdk_root}/sapi/bluetooth/rsi_bt_common_apis.c",
+      "${wiseconnect_sdk_root}/sapi/driver/rsi_bt_ble.c",
+
+      # mbedtls
+      "${chip_root}/third_party/mbedtls/repo/library/aes.c",
+      "${chip_root}/third_party/mbedtls/repo/library/asn1parse.c",
+      "${chip_root}/third_party/mbedtls/repo/library/asn1write.c",
+      "${chip_root}/third_party/mbedtls/repo/library/bignum.c",
+      "${chip_root}/third_party/mbedtls/repo/library/ccm.c",
+      "${chip_root}/third_party/mbedtls/repo/library/cipher.c",
+      "${chip_root}/third_party/mbedtls/repo/library/cipher_wrap.c",
+      "${chip_root}/third_party/mbedtls/repo/library/constant_time.c",
+      "${chip_root}/third_party/mbedtls/repo/library/ctr_drbg.c",
+      "${chip_root}/third_party/mbedtls/repo/library/ecdh.c",
+      "${chip_root}/third_party/mbedtls/repo/library/ecdsa.c",
+      "${chip_root}/third_party/mbedtls/repo/library/ecp.c",
+      "${chip_root}/third_party/mbedtls/repo/library/ecp_curves.c",
+      "${chip_root}/third_party/mbedtls/repo/library/entropy.c",
+      "${chip_root}/third_party/mbedtls/repo/library/hkdf.c",
+      "${chip_root}/third_party/mbedtls/repo/library/hmac_drbg.c",
+      "${chip_root}/third_party/mbedtls/repo/library/md.c",
+      "${chip_root}/third_party/mbedtls/repo/library/oid.c",
+      "${chip_root}/third_party/mbedtls/repo/library/pk.c",
+      "${chip_root}/third_party/mbedtls/repo/library/pk_wrap.c",
+      "${chip_root}/third_party/mbedtls/repo/library/pkcs5.c",
+      "${chip_root}/third_party/mbedtls/repo/library/pkwrite.c",
+      "${chip_root}/third_party/mbedtls/repo/library/platform.c",
+      "${chip_root}/third_party/mbedtls/repo/library/platform_util.c",
+      "${chip_root}/third_party/mbedtls/repo/library/sha256.c",
+      "${chip_root}/third_party/mbedtls/repo/library/sha512.c",
+      "${chip_root}/third_party/mbedtls/repo/library/x509_create.c",
+      "${chip_root}/third_party/mbedtls/repo/library/x509write_csr.c",
     ]
 
-    if (use_system_view) {
-      sources += [
-        "${efr32_sdk_root}/util/third_party/segger/systemview/SEGGER/SEGGER_SYSVIEW.c",
-        "${efr32_sdk_root}/util/third_party/segger/systemview/Sample/FreeRTOSV10/Config/Cortex-M/SEGGER_SYSVIEW_Config_FreeRTOS.c",
-        "${efr32_sdk_root}/util/third_party/segger/systemview/Sample/FreeRTOSV10/SEGGER_SYSVIEW_FreeRTOS.c",
-      ]
-    }
-
-    if (use_wstk_leds) {
-      sources += [
-        "${efr32_sdk_root}/platform/driver/leddrv/src/sl_led.c",
-        "${efr32_sdk_root}/platform/driver/leddrv/src/sl_pwm_led.c",
-        "${efr32_sdk_root}/platform/driver/leddrv/src/sl_simple_led.c",
-        "${efr32_sdk_root}/platform/driver/leddrv/src/sl_simple_rgb_pwm_led.c",
-        "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}/autogen/sl_simple_led_instances.c",
-      ]
-    }
-
-    # SPI is only used for Wifi
-    if (defined(invoker.chip_enable_wifi) && invoker.chip_enable_wifi) {
-      sources += [
-        "${efr32_sdk_root}/platform/emdrv/spidrv/src/spidrv.c",
-        "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}/autogen/sl_spidrv_init.c",
-      ]
-    }
-
-    if (defined(invoker.enable_sleepy_device)) {
-      if (invoker.enable_sleepy_device) {
-        sources += [ "${efr32_sdk_root}/util/third_party/freertos/kernel/portable/SiliconLabs/tick_power_manager.c" ]
-      }
-    }
-
-    if (defined(enable_fem)) {
-      sources += [
-        "${efr32_sdk_root}/util/plugin/plugin-common/fem-control/fem-control.c",
-      ]
-    }
-
-    # USART sources files
-    if ((defined(invoker.chip_enable_pw_rpc) && invoker.chip_enable_pw_rpc) ||
-        chip_build_libshell || enable_openthread_cli ||
-        (defined(invoker.chip_enable_wifi) && invoker.chip_enable_wifi) ||
-        (defined(invoker.show_qr_code) && invoker.show_qr_code) ||
-        (defined(invoker.disable_lcd) && !invoker.disable_lcd) ||
-        (defined(invoker.use_external_flash) && use_external_flash)) {
-      sources += [
-        "${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",
-        "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}/autogen/sl_uartdrv_init.c",
-      ]
-
-      if (defined(invoker.use_external_flash) && use_external_flash) {
-        sources += [ "${efr32_sdk_root}/hardware/driver/mx25_flash_shutdown/src/sl_mx25_flash_shutdown_usart/sl_mx25_flash_shutdown.c" ]
-      }
-    }
-
-    if ((defined(invoker.show_qr_code) && invoker.show_qr_code) ||
-        (defined(invoker.disable_lcd) && !invoker.disable_lcd)) {
-      sources += [
-        "${efr32_sdk_root}/hardware/driver/memlcd/src/sl_memlcd.c",
-        "${efr32_sdk_root}/hardware/driver/memlcd/src/sl_memlcd_display.c",
-        "${efr32_sdk_root}/platform/middleware/glib/dmd/display/dmd_memlcd.c",
-        "${efr32_sdk_root}/platform/middleware/glib/glib/bmp.c",
-        "${efr32_sdk_root}/platform/middleware/glib/glib/glib.c",
-        "${efr32_sdk_root}/platform/middleware/glib/glib/glib_bitmap.c",
-        "${efr32_sdk_root}/platform/middleware/glib/glib/glib_circle.c",
-        "${efr32_sdk_root}/platform/middleware/glib/glib/glib_font_narrow_6x8.c",
-        "${efr32_sdk_root}/platform/middleware/glib/glib/glib_font_normal_8x8.c",
-        "${efr32_sdk_root}/platform/middleware/glib/glib/glib_font_number_16x20.c",
-        "${efr32_sdk_root}/platform/middleware/glib/glib/glib_line.c",
-        "${efr32_sdk_root}/platform/middleware/glib/glib/glib_polygon.c",
-        "${efr32_sdk_root}/platform/middleware/glib/glib/glib_rectangle.c",
-        "${efr32_sdk_root}/platform/middleware/glib/glib/glib_string.c",
-      ]
-    }
-
-    if (use_wf200) {
-      sources += [
-        "${efr32_sdk_root}/platform/radio/wifi/wfx_fmac_driver/bus/sl_wfx_bus.c",
-        "${efr32_sdk_root}/platform/radio/wifi/wfx_fmac_driver/bus/sl_wfx_bus_spi.c",
-        "${efr32_sdk_root}/platform/radio/wifi/wfx_fmac_driver/secure_link/sl_wfx_secure_link.c",
-        "${efr32_sdk_root}/platform/radio/wifi/wfx_fmac_driver/sl_wfx.c",
-      ]
-    }
-
-    if (silabs_family == "efr32mg12") {
-      sources += [
-        "${efr32_sdk_root}/platform/Device/SiliconLabs/EFR32MG12P/Source/startup_efr32mg12p.c",
-        "${efr32_sdk_root}/platform/Device/SiliconLabs/EFR32MG12P/Source/system_efr32mg12p.c",
-        "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_dcdc_s1.c",
-        "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_emu_s1.c",
-        "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_hfxo_s1.c",
-        "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_lfxo_s1.c",
-        "${efr32_sdk_root}/protocol/bluetooth/src/sl_apploader_util_s1.c",
-        "${efr32_sdk_root}/util/third_party/freertos/kernel/portable/GCC/ARM_CM4F/port.c",
-      ]
-    } else if (silabs_family == "efr32mg21") {
-      sources += [
-        "${efr32_sdk_root}/platform/Device/SiliconLabs/EFR32MG21/Source/startup_efr32mg21.c",
-        "${efr32_sdk_root}/platform/Device/SiliconLabs/EFR32MG21/Source/system_efr32mg21.c",
-        "${efr32_sdk_root}/platform/radio/rail_lib/plugin/rail_util_rf_path/sl_rail_util_rf_path.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_hfrco.c",
-        "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_hfxo_s2.c",
-        "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_lfxo_s2.c",
-        "${efr32_sdk_root}/platform/service/hfxo_manager/src/sl_hfxo_manager_hal_s2.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_cipher.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_entropy.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_hash.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_key_derivation.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_key_handling.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_signature.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_util.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_alt/source/sl_se_management.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/se_aes.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/se_gcm.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/se_jpake.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_protocol_crypto/src/sli_radioaes_management.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_aead.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_cipher.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_key_derivation.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_key_management.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_mac.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_opaque_driver_aead.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_opaque_driver_cipher.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_opaque_driver_mac.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_opaque_key_derivation.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_transparent_driver_cipher.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_transparent_driver_hash.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_transparent_driver_mac.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_transparent_key_derivation.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",
-      ]
-    } else if (silabs_family == "efr32mg24") {
-      sources += [
-        "${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_dcdc_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_hfxo_s2.c",
-        "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_lfxo_s2.c",
-        "${efr32_sdk_root}/platform/service/hfxo_manager/src/sl_hfxo_manager_hal_s2.c",
-        "${efr32_sdk_root}/protocol/bluetooth/src/sl_apploader_util_s2.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_attestation.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_cipher.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_entropy.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_hash.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_key_derivation.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_key_handling.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_signature.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_util.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/se_aes.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/se_jpake.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_protocol_crypto/src/sli_radioaes_management.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_aead.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_cipher.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_key_derivation.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_key_management.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_mac.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_opaque_driver_aead.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_opaque_driver_cipher.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_opaque_driver_mac.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_opaque_key_derivation.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_transparent_driver_aead.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_transparent_driver_cipher.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_transparent_driver_hash.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_transparent_driver_mac.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_transparent_key_derivation.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",
-      ]
-    } else if (silabs_family == "mgm24") {
-      sources += [
-        "${efr32_sdk_root}/platform/Device/SiliconLabs/MGM24/Source/startup_mgm24.c",
-        "${efr32_sdk_root}/platform/Device/SiliconLabs/MGM24/Source/system_mgm24.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_dcdc_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_hfxo_mgm24.c",
-        "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_lfxo_s2.c",
-        "${efr32_sdk_root}/platform/service/hfxo_manager/src/sl_hfxo_manager_hal_s2.c",
-        "${efr32_sdk_root}/protocol/bluetooth/src/sl_apploader_util_s2.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_attestation.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_cipher.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_entropy.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_hash.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_key_derivation.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_key_handling.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_signature.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_util.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/se_aes.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/se_jpake.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_protocol_crypto/src/sli_radioaes_management.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_aead.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_cipher.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_key_derivation.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_key_management.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_mac.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_opaque_driver_aead.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_opaque_driver_cipher.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_opaque_driver_mac.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_opaque_key_derivation.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_transparent_driver_aead.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_transparent_driver_cipher.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_transparent_driver_hash.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_transparent_driver_mac.c",
-        "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_transparent_key_derivation.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",
-      ]
-    }
-
-    if (silabs_board == "BRD4186A" || silabs_board == "BRD4186C" ||
-        silabs_board == "BRD4187A" || silabs_board == "BRD4187C") {
-      sources += [ "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_dpll_s2.c" ]
-    }
-
     public_deps = [
-      ":efr32_mbedtls_config",
+      ":si917_mbedtls_config",
       "${segger_rtt_root}:segger_rtt",
       "${segger_rtt_root}:segger_rtt_printf",
       "${segger_rtt_root}:segger_rtt_syscalls",
diff --git a/third_party/silabs/efr32_arm.gni b/third_party/silabs/efr32_arm.gni
index e169630..68126f5 100644
--- a/third_party/silabs/efr32_arm.gni
+++ b/third_party/silabs/efr32_arm.gni
@@ -14,7 +14,7 @@
 
 import("silabs_board.gni")
 
-if (silabs_family == "efr32mg12") {
+if (silabs_family == "efr32mg12" || silabs_family == "SiWx917") {
   arm_arch = "armv7e-m"
   arm_abi = "aapcs"
   arm_cpu = "cortex-m4"
diff --git a/third_party/silabs/silabs_board.gni b/third_party/silabs/silabs_board.gni
index b5fe904..1e638c9 100644
--- a/third_party/silabs/silabs_board.gni
+++ b/third_party/silabs/silabs_board.gni
@@ -59,6 +59,9 @@
 } else if (silabs_board == "BRD4170A") {
   silabs_family = "efr32mg12"
   silabs_mcu = "EFR32MG12P433F1024GM68"
+} else if (silabs_board == "BRD4325A") {
+  silabs_family = "SiWx917"
+  silabs_mcu = "EFR32MG12P432F1024GL125"
 } else if (silabs_board == "BRD4180A") {
   assert(
       false,
