Skip to content

Commit 6bba24f

Browse files
wiseconnect: Restore si91x_bus_events
The Zephyr osEventFlags API has a bug when an osEventFlags is watched from two different threads. For WiseConnect, it means the events are not received by the thread "si91x_bus". WiseConnect 3.3 was not impacted because there there were a specific osEventFlags for "si91x_bus" ("si91x_bus_events"). This patch restore use of "si91x_bus_events" to workaround the osEventFlags bug. Co-authored-by: Swami Das Nampalli <[email protected]> Signed-off-by: Jérôme Pouiller <[email protected]> Signed-off-by: Swami Das Nampalli <[email protected]>
1 parent fd0b152 commit 6bba24f

File tree

7 files changed

+38
-9
lines changed

7 files changed

+38
-9
lines changed

wiseconnect/components/device/silabs/si91x/wireless/ahb_interface/src/rsi_hal_mcu_m4_rom.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ sl_status_t sli_m4_interrupt_isr(void)
277277

278278
mask_ta_interrupt(TA_RSI_BUFFER_FULL_CLEAR_EVENT);
279279

280-
sli_si91x_set_event(SL_SI91X_TA_BUFFER_FULL_CLEAR_EVENT);
280+
sl_si91x_host_set_bus_event(SL_SI91X_TA_BUFFER_FULL_CLEAR_EVENT);
281281

282282
// Clear the interrupt
283283
clear_ta_to_m4_interrupt(TA_RSI_BUFFER_FULL_CLEAR_EVENT);
@@ -333,7 +333,7 @@ sl_status_t sli_receive_from_ta_done_isr(void)
333333
VERIFY_STATUS_AND_RETURN(status);
334334

335335
//! Set event RX pending event to host
336-
sli_si91x_set_event(SL_SI91X_NCP_HOST_BUS_RX_EVENT);
336+
sl_si91x_host_set_bus_event(SL_SI91X_NCP_HOST_BUS_RX_EVENT);
337337
#endif
338338

339339
return SL_STATUS_OK;

wiseconnect/components/device/silabs/si91x/wireless/ahb_interface/src/sl_platform_wireless.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
#include "sl_rsi_utility.h"
4343

4444
extern osEventFlagsId_t si91x_events;
45+
extern osEventFlagsId_t si91x_bus_events;
4546
extern osEventFlagsId_t si91x_async_events;
4647
extern uint32_t frontend_switch_control;
4748
extern osMutexId_t side_band_crypto_mutex;

wiseconnect/components/device/silabs/si91x/wireless/inc/sl_rsi_utility.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,11 +274,13 @@ sl_status_t sli_si91x_platform_deinit(void);
274274
// Event API
275275
/* Function used to set specified flags for event */
276276
void sli_si91x_set_event(uint32_t event_mask);
277+
void sl_si91x_host_set_bus_event(uint32_t event_mask);
277278

278279
/* Function used to set specified flags for async event */
279280
void sli_si91x_host_set_async_event(uint32_t event_mask);
280281

281282
uint32_t sli_si91x_wait_for_event(uint32_t event_mask, uint32_t timeout);
283+
uint32_t si91x_host_wait_for_bus_event(uint32_t event_mask, uint32_t timeout);
282284

283285
/* Function used to clear flags for specific event */
284286
uint32_t sli_si91x_clear_event(uint32_t event_mask);

wiseconnect/components/device/silabs/si91x/wireless/socket/src/sl_si91x_socket_utility.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1171,7 +1171,7 @@ sl_status_t sli_si91x_send_socket_command(sli_si91x_socket_t *socket,
11711171
node_buffer->id = this_packet_id;
11721172
sli_si91x_append_to_buffer_queue(&socket->command_queue.tx_queue, node_buffer);
11731173
tx_socket_command_queues_status |= (1 << socket->index);
1174-
sli_si91x_set_event(SL_SI91X_SOCKET_COMMAND_TX_PENDING_EVENT);
1174+
sl_si91x_host_set_bus_event(SL_SI91X_SOCKET_COMMAND_TX_PENDING_EVENT);
11751175
CORE_ExitAtomic(state);
11761176

11771177
if (wait_period != 0) {
@@ -1257,7 +1257,7 @@ sl_status_t sli_si91x_send_socket_data(sli_si91x_socket_t *si91x_socket,
12571257
CORE_irqState_t state = CORE_EnterAtomic();
12581258
sli_si91x_append_to_buffer_queue(&si91x_socket->tx_data_queue, buffer);
12591259
tx_socket_data_queues_status |= (1 << si91x_socket->index);
1260-
sli_si91x_set_event(SL_SI91X_SOCKET_DATA_TX_PENDING_EVENT);
1260+
sl_si91x_host_set_bus_event(SL_SI91X_SOCKET_DATA_TX_PENDING_EVENT);
12611261
CORE_ExitAtomic(state);
12621262

12631263
return SL_STATUS_OK;

wiseconnect/components/device/silabs/si91x/wireless/src/sl_rsi_utility.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ typedef struct sli_scan_info_s {
166166
osThreadId_t si91x_thread = 0;
167167
osThreadId_t si91x_event_thread = 0;
168168
osEventFlagsId_t si91x_events = 0;
169+
osEventFlagsId_t si91x_bus_events = 0;
169170
osEventFlagsId_t si91x_async_events = 0;
170171
osMutexId_t malloc_free_mutex = 0;
171172

@@ -1058,6 +1059,10 @@ sl_status_t sl_si91x_platform_init(void)
10581059
si91x_events = osEventFlagsNew(NULL);
10591060
}
10601061

1062+
if (NULL == si91x_bus_events) {
1063+
si91x_bus_events = osEventFlagsNew(NULL);
1064+
}
1065+
10611066
if (NULL == si91x_async_events) {
10621067
si91x_async_events = osEventFlagsNew(NULL);
10631068
}
@@ -1114,6 +1119,11 @@ sl_status_t sli_si91x_platform_deinit(void)
11141119
// Terminate Command Engine thread
11151120
sli_wifi_command_engine_deinit();
11161121

1122+
if (NULL != si91x_bus_events) {
1123+
osEventFlagsDelete(si91x_bus_events);
1124+
si91x_bus_events = NULL;
1125+
}
1126+
11171127
// Terminate SI91X event handler thread
11181128
if (NULL != si91x_event_thread) {
11191129
osThreadTerminate(si91x_event_thread);
@@ -1166,6 +1176,11 @@ void sli_si91x_set_event(uint32_t event_mask)
11661176
osEventFlagsSet(si91x_events, event_mask);
11671177
}
11681178

1179+
void sl_si91x_host_set_bus_event(uint32_t event_mask)
1180+
{
1181+
osEventFlagsSet(si91x_bus_events, event_mask);
1182+
}
1183+
11691184
sl_status_t sli_si91x_add_to_queue(sli_si91x_buffer_queue_t *queue, sl_wifi_buffer_t *buffer)
11701185
{
11711186
sli_si91x_append_to_buffer_queue(queue, buffer);
@@ -1760,6 +1775,16 @@ uint32_t sli_si91x_wait_for_event(uint32_t event_mask, uint32_t timeout)
17601775
return result;
17611776
}
17621777

1778+
uint32_t si91x_host_wait_for_bus_event(uint32_t event_mask, uint32_t timeout)
1779+
{
1780+
uint32_t result = osEventFlagsWait(si91x_bus_events, event_mask, osFlagsWaitAny, timeout);
1781+
1782+
if (result == (uint32_t)osErrorTimeout || result == (uint32_t)osErrorResource) {
1783+
return 0;
1784+
}
1785+
return result;
1786+
}
1787+
17631788
uint32_t sli_si91x_clear_event(uint32_t event_mask)
17641789
{
17651790
uint32_t result = osEventFlagsClear(si91x_events, event_mask);

wiseconnect/components/device/silabs/si91x/wireless/src/sl_si91x_driver.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1185,7 +1185,7 @@ sl_status_t sli_si91x_driver_send_command_packet(uint32_t command,
11851185
packet->node.node = NULL;
11861186
sli_si91x_append_to_buffer_queue(&cmd_queues[command_type].tx_queue, packet);
11871187
tx_command_queues_status |= SL_SI91X_TX_PENDING_FLAG(command_type);
1188-
sli_si91x_set_event(SL_SI91X_TX_PENDING_FLAG(command_type));
1188+
sl_si91x_host_set_bus_event(SL_SI91X_TX_PENDING_FLAG(command_type));
11891189
CORE_ExitAtomic(state);
11901190

11911191
// Check if the command should return immediately or wait for a response
@@ -1255,7 +1255,7 @@ static sl_status_t sl_si91x_driver_send_data_packet(sl_wifi_buffer_t *buffer, ui
12551255
sli_si91x_append_to_buffer_queue(&sli_tx_data_queue, buffer);
12561256
CORE_irqState_t state = CORE_EnterAtomic();
12571257
tx_generic_socket_data_queues_status |= SL_SI91X_GENERIC_DATA_TX_PENDING_EVENT;
1258-
sli_si91x_set_event(SL_SI91X_GENERIC_DATA_TX_PENDING_EVENT);
1258+
sl_si91x_host_set_bus_event(SL_SI91X_GENERIC_DATA_TX_PENDING_EVENT);
12591259
CORE_ExitAtomic(state);
12601260

12611261
return SL_STATUS_OK;
@@ -1328,7 +1328,7 @@ sl_status_t sli_si91x_driver_send_async_command(uint32_t command,
13281328
buffer->id = 0; // Does not use packet ID as async packets do not have a matching response
13291329
sli_si91x_append_to_buffer_queue(&cmd_queues[command_type].tx_queue, buffer);
13301330
tx_command_queues_status |= SL_SI91X_TX_PENDING_FLAG(command_type);
1331-
sli_si91x_set_event(SL_SI91X_TX_PENDING_FLAG(command_type));
1331+
sl_si91x_host_set_bus_event(SL_SI91X_TX_PENDING_FLAG(command_type));
13321332
CORE_ExitAtomic(irqState);
13331333

13341334
return SL_STATUS_OK;

wiseconnect/components/sli_si91x_wifi_event_handler/src/sli_si91x_wifi_event_handler.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1728,12 +1728,13 @@ void sli_si91x_process_ble_events()
17281728

17291729
uint32_t sli_wifi_command_engine_wait_for_event(uint32_t event_mask, uint32_t timeout)
17301730
{
1731-
return sli_si91x_wait_for_event(event_mask, timeout);
1731+
return si91x_host_wait_for_bus_event(event_mask, timeout);
1732+
17321733
}
17331734

17341735
uint32_t sli_wifi_command_engine_set_event(uint32_t event_mask)
17351736
{
1736-
sli_si91x_set_event(event_mask);
1737+
sl_si91x_host_set_bus_event(event_mask);
17371738
return 0;
17381739
}
17391740

0 commit comments

Comments
 (0)