[Silabs] Upstream several wi-fi specific fixes (#41225)
* [SL-UP] Updating the performance profile API to v2 (#639)
* [SL-UP] Adds improvements on the join and scan logic based on WiseConnect feedback (#596)
Co-authored-by: Restyled.io <commits@restyled.io>
Co-authored-by: Mathieu Kardous <84793247+mkardous-silabs@users.noreply.github.com>
* [SL-UP] Custom board part build fix (#597)
* [SL-UP] Rejoin fix after power cycle for sleepy 917 devices
* Fix matter_shell include path argument
* [SL-UP] Adding the changes for the Wi-Fi which were done after the merge (#569)
Co-authored-by: Mathieu Kardous <84793247+mkardous-silabs@users.noreply.github.com>
* [SL-UP] Revert the Task priorities for the 917SoC (#538)
* [SL-UP] Rejoin fix after power cycle for sleepy 917 devices
* [SL-UP] Add an implementation of GetOtaTlvEncryptionKeyId
* fix typo
---------
Co-authored-by: chirag-silabs <100861685+chirag-silabs@users.noreply.github.com>
Co-authored-by: Rohan Sahay <103027015+rosahay-silabs@users.noreply.github.com>
Co-authored-by: Restyled.io <commits@restyled.io>
Co-authored-by: chirag-silabs <chirag.bansal@silabs.com>
diff --git a/examples/platform/silabs/MatterConfig.cpp b/examples/platform/silabs/MatterConfig.cpp
index dec4a37..064d65f 100644
--- a/examples/platform/silabs/MatterConfig.cpp
+++ b/examples/platform/silabs/MatterConfig.cpp
@@ -170,12 +170,7 @@
.cb_size = 0U,
.stack_mem = NULL,
.stack_size = kMainTaskStackSize,
-#ifdef SLI_SI91X_MCU_INTERFACE
- .priority = osPriorityRealtime4
-#else
- .priority = osPriorityRealtime5 // Must be above BLE Link Layer priority
-#endif // SLI_SI91X_MCU_INTERFACE
-};
+ .priority = osPriorityRealtime7 };
osThreadId_t sMainTaskHandle;
static chip::DeviceLayer::DeviceInfoProviderImpl gExampleDeviceInfoProvider;
diff --git a/examples/platform/silabs/shell/BUILD.gn b/examples/platform/silabs/shell/BUILD.gn
index 2d4cb29..b2f1a52 100644
--- a/examples/platform/silabs/shell/BUILD.gn
+++ b/examples/platform/silabs/shell/BUILD.gn
@@ -19,7 +19,7 @@
# This is necessary since the BUILD.gn for both platforms are still split
shell_dependency_path = "${chip_root}/examples/platform/silabs/efr32"
-if (use_SiWx917) {
+if (wifi_soc) {
shell_dependency_path = "${chip_root}/examples/platform/silabs/SiWx917"
}
diff --git a/src/platform/silabs/platformAbstraction/WiseMcuSpam.cpp b/src/platform/silabs/platformAbstraction/WiseMcuSpam.cpp
index dd512af..b57b7e8 100644
--- a/src/platform/silabs/platformAbstraction/WiseMcuSpam.cpp
+++ b/src/platform/silabs/platformAbstraction/WiseMcuSpam.cpp
@@ -80,9 +80,9 @@
uint8_t sButtonStates[SL_SI91x_BUTTON_COUNT] = { 0 };
#endif // SL_CATALOG_SIMPLE_BUTTON_PRESENT
-#if CHIP_CONFIG_ENABLE_ICD_SERVER
+#if CHIP_CONFIG_ENABLE_ICD_SERVER && defined(SL_CATALOG_SIMPLE_BUTTON_PRESENT)
bool btn0_pressed = false;
-#endif /* SL_ICD_ENABLED */
+#endif // CHIP_CONFIG_ENABLE_ICD_SERVER && defined(SL_CATALOG_SIMPLE_BUTTON_PRESENT)
} // namespace
SilabsPlatform SilabsPlatform::sSilabsPlatformAbstractionManager;
diff --git a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp
index 9980da0..4032440 100644
--- a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp
+++ b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp
@@ -72,13 +72,13 @@
using namespace chip::DeviceLayer::Silabs;
using WiFiBandEnum = chip::app::Clusters::NetworkCommissioning::WiFiBandEnum;
-// TODO : Temporary work-around for wifi-init failure in 917NCP ACX module boards.
-// Can be removed after Wiseconnect fixes region code for all ACX module boards.
-#if defined(EXP_BOARD)
-#define REGION_CODE IGNORE_REGION
-#else
+// The REGION_CODE macro defines the regulatory region for the Wi-Fi device.
+// The default value is 'US'. Users can override this macro to specify a different region code.
+// The region code must match one of the values defined in the 'sl_wifi_region_code_t' enum,
+// which is located in 'wifi-sdk/inc/sl_wifi_constants.h'. Example values include US, EU, JP, etc.
+#ifndef REGION_CODE
#define REGION_CODE US
-#endif
+#endif // !REGION_CODE
// TODO: This needs to be refactored so we don't need the global object
WfxRsi_t wfx_rsi;
@@ -173,7 +173,7 @@
constexpr int8_t kAdvScanThreshold = -40;
constexpr uint8_t kAdvRssiToleranceThreshold = 5;
constexpr uint8_t kAdvActiveScanDuration = 15;
-constexpr uint8_t kAdvPassiveScanDuration = 20;
+constexpr uint8_t kAdvPassiveScanDuration = 110;
constexpr uint8_t kAdvMultiProbe = 1;
constexpr uint8_t kAdvScanPeriodicity = 10;
constexpr uint8_t kAdvEnableInstantbgScan = 1;
@@ -320,7 +320,8 @@
status = *reinterpret_cast<sl_status_t *>(scan_result);
ChipLogError(DeviceLayer, "ScanCallback: failed: 0x%lx", status);
}
-
+ // SET FALLBACK VALUES FOR THE SCAN
+ wfx_rsi.ap_chan = SL_WIFI_AUTO_CHANNEL;
#if WIFI_ENABLE_SECURITY_WPA3_TRANSITION
security = SL_WIFI_WPA3_TRANSITION;
#else
@@ -331,7 +332,10 @@
{
security = static_cast<sl_wifi_security_t>(scan_result->scan_info[0].security_mode);
wfx_rsi.ap_chan = scan_result->scan_info[0].rf_channel;
- memcpy(wfx_rsi.ap_mac.data(), scan_result->scan_info[0].bssid, kWifiMacAddressLength);
+
+ chip::MutableByteSpan bssidSpan(wfx_rsi.ap_bssid.data(), kWifiMacAddressLength);
+ chip::ByteSpan inBssid(scan_result->scan_info[0].bssid, kWifiMacAddressLength);
+ chip::CopySpanToMutableSpan(inBssid, bssidSpan);
}
osSemaphoreRelease(sScanCompleteSemaphore);
@@ -363,6 +367,7 @@
}
osSemaphoreRelease(sScanInProgressSemaphore);
+ VerifyOrReturnError(status == SL_STATUS_OK, status, ChipLogProgress(DeviceLayer, "sl_wifi_start_scan failed: 0x%lx", status));
return status;
}
@@ -431,6 +436,17 @@
chip::ByteSpan input(wfx_rsi.credentials.ssid, wfx_rsi.credentials.ssidLength);
chip::CopySpanToMutableSpan(input, output);
+ if (wfx_rsi.ap_chan != SL_WIFI_AUTO_CHANNEL)
+ {
+ // AP channel is known - This indicates that the network scan was done for a specific SSID.
+ // Providing the channel and BSSID in the profile avoids scanning all channels again.
+ profile.config.channel.channel = wfx_rsi.ap_chan;
+
+ chip::MutableByteSpan bssidSpan(profile.config.bssid.octet, kWifiMacAddressLength);
+ chip::ByteSpan inBssid(wfx_rsi.ap_bssid.data(), kWifiMacAddressLength);
+ chip::CopySpanToMutableSpan(inBssid, bssidSpan);
+ }
+
status = sl_net_set_profile(SL_NET_WIFI_CLIENT_INTERFACE, SL_NET_DEFAULT_WIFI_CLIENT_PROFILE_ID, &profile);
VerifyOrReturnError(status == SL_STATUS_OK, status, ChipLogError(DeviceLayer, "sl_net_set_profile failed: 0x%lx", status));
@@ -639,12 +655,21 @@
}
osSemaphoreRelease(sScanInProgressSemaphore);
+ if (status != SL_STATUS_OK)
+ {
+ ChipLogError(DeviceLayer, "sl_wifi_start_scan failed: 0x%lx", status);
+ }
}
break;
case WiseconnectWifiInterface::WifiPlatformEvent::kStationStartJoin:
ChipLogDetail(DeviceLayer, "WifiPlatformEvent::kStationStartJoin");
+// To avoid IOP issues, it is recommended to enable high-performance mode before joining the network.
+// TODO: Remove this once the IOP issue related to power save mode switching is fixed in the Wi-Fi SDK.
+#if CHIP_CONFIG_ENABLE_ICD_SERVER
+ chip::DeviceLayer::Silabs::WifiSleepManager::GetInstance().RequestHighPerformanceWithTransition();
+#endif // CHIP_CONFIG_ENABLE_ICD_SERVER
InitiateScan();
JoinWifiNetwork();
break;
@@ -690,15 +715,9 @@
status = sl_wifi_set_join_callback(JoinCallback, nullptr);
VerifyOrReturnError(status == SL_STATUS_OK, status);
-// To avoid IOP issues, it is recommended to enable high-performance mode before joining the network.
-// TODO: Remove this once the IOP issue related to power save mode switching is fixed in the Wi-Fi SDK.
-#if CHIP_CONFIG_ENABLE_ICD_SERVER
- chip::DeviceLayer::Silabs::WifiSleepManager::GetInstance().RequestHighPerformanceWithTransition();
-#endif // CHIP_CONFIG_ENABLE_ICD_SERVER
-
status = sl_net_up(SL_NET_WIFI_CLIENT_INTERFACE, SL_NET_DEFAULT_WIFI_CLIENT_PROFILE_ID);
- if (!(wfx_rsi.dev_state.Has(WifiState::kStationConnecting)))
+ if (!(wfx_rsi.dev_state.Has(WifiInterface::WifiState::kStationConnecting)))
{
// TODO: Remove this check once the sl_net_up is fixed, sl_net_up is not completely synchronous
// and issue is mostly seen on OPEN access points
@@ -711,7 +730,7 @@
status = SL_STATUS_FAIL;
}
- if (status == SL_STATUS_OK || status == SL_STATUS_IN_PROGRESS)
+ if (status == SL_STATUS_OK)
{
#if CHIP_CONFIG_ENABLE_ICD_SERVER
// Remove High performance request that might have been added during the connect/retry process
@@ -724,7 +743,7 @@
}
// failure only happens when the firmware returns an error
- ChipLogError(DeviceLayer, "sl_wifi_connect failed: 0x%lx", static_cast<uint32_t>(status));
+ ChipLogError(DeviceLayer, "sl_net_up failed: 0x%lx", static_cast<uint32_t>(status));
wfx_rsi.dev_state.Clear(WifiInterface::WifiState::kStationConnecting).Clear(WifiInterface::WifiState::kStationConnected);
ScheduleConnectionAttempt();
@@ -737,7 +756,7 @@
sl_status_t status = SL_STATUS_OK;
// If the failed event is encountered when sl_net_up is in-progress,
// we ignore it and wait for the sl_net_up to complete.
- if (wfx_rsi.dev_state.Has(WifiState::kStationConnecting))
+ if (wfx_rsi.dev_state.Has(WifiInterface::WifiState::kStationConnecting))
{
wfx_rsi.dev_state.Clear(WifiState::kStationConnecting);
if (SL_WIFI_CHECK_IF_EVENT_FAILED(event))
@@ -748,6 +767,7 @@
return SL_STATUS_IN_PROGRESS;
}
}
+
if (SL_WIFI_CHECK_IF_EVENT_FAILED(event))
{
status = *reinterpret_cast<sl_status_t *>(result);
@@ -772,9 +792,9 @@
chip::CopySpanToMutableSpan(ssid, output);
info.ssid_length = output.size();
- chip::ByteSpan apMacSpan(wfx_rsi.ap_mac.data(), wfx_rsi.ap_mac.size());
+ chip::ByteSpan apBssidSpan(wfx_rsi.ap_bssid.data(), wfx_rsi.ap_bssid.size());
chip::MutableByteSpan bssidSpan(info.bssid, kWifiMacAddressLength);
- chip::CopySpanToMutableSpan(apMacSpan, bssidSpan);
+ chip::CopySpanToMutableSpan(apBssidSpan, bssidSpan);
// TODO: add error processing
sl_wifi_get_signal_strength(SL_WIFI_CLIENT_INTERFACE, &(rssi));
@@ -843,15 +863,14 @@
VerifyOrReturnError(error == RSI_SUCCESS, CHIP_ERROR_INTERNAL,
ChipLogError(DeviceLayer, "rsi_bt_power_save_profile failed: %ld", error));
- sl_wifi_performance_profile_t wifi_profile = { .profile = ConvertPowerSaveConfiguration(configuration),
- // TODO: Performance profile fails if not alligned with DTIM
- .dtim_aligned_type = SL_SI91X_ALIGN_WITH_DTIM_BEACON,
- // TODO: Different types need to be fixed in the Wi-Fi SDK
- .listen_interval = static_cast<uint16_t>(listenInterval) };
+ sl_wifi_performance_profile_v2_t wifi_profile = { .profile = ConvertPowerSaveConfiguration(configuration),
+ // TODO: Performance profile fails if not aligned with DTIM
+ .dtim_aligned_type = SL_SI91X_ALIGN_WITH_DTIM_BEACON,
+ .listen_interval = listenInterval };
- sl_status_t status = sl_wifi_set_performance_profile(&wifi_profile);
+ sl_status_t status = sl_wifi_set_performance_profile_v2(&wifi_profile);
VerifyOrReturnError(status == SL_STATUS_OK, CHIP_ERROR_INTERNAL,
- ChipLogError(DeviceLayer, "sl_wifi_set_performance_profile failed: 0x%lx", status));
+ ChipLogError(DeviceLayer, "sl_wifi_set_performance_profile_v2 failed: 0x%lx", status));
return CHIP_NO_ERROR;
}
diff --git a/third_party/silabs/SiWx917_sdk.gni b/third_party/silabs/SiWx917_sdk.gni
index 253ec97..3fce4ef 100644
--- a/third_party/silabs/SiWx917_sdk.gni
+++ b/third_party/silabs/SiWx917_sdk.gni
@@ -263,10 +263,6 @@
"SLI_SI91X_LWIP_HOSTED_NETWORK_STACK=1",
"__FREERTOS_OS_WISECONNECT=1",
"SL_SI91X_SOC_MODE=1",
-
- # TODO: This is a workaround for the init issue with the SiWx917
- "SL_WLAN_EVENT_THREAD_PRIORITY=osPriorityRealtime6",
- "SL_WLAN_COMMAND_ENGINE_THREAD_PRIORITY=osPriorityRealtime5",
]
# Defines for Si917Y MCU