Skip to content

Commit 27a2554

Browse files
jerome-pouillerswamidas1998
authored andcommitted
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]> Signed-off-by: Jérôme Pouiller <[email protected]>
1 parent 5d7a4bf commit 27a2554

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
@@ -168,6 +168,7 @@ typedef struct sli_scan_info_s {
168168
osThreadId_t si91x_thread = 0;
169169
osThreadId_t si91x_event_thread = 0;
170170
osEventFlagsId_t si91x_events = 0;
171+
osEventFlagsId_t si91x_bus_events = 0;
171172
osEventFlagsId_t si91x_async_events = 0;
172173
osMutexId_t malloc_free_mutex = 0;
173174

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

1063+
if (NULL == si91x_bus_events) {
1064+
si91x_bus_events = osEventFlagsNew(NULL);
1065+
}
1066+
10621067
if (NULL == si91x_async_events) {
10631068
si91x_async_events = osEventFlagsNew(NULL);
10641069
}
@@ -1115,6 +1120,11 @@ sl_status_t sli_si91x_platform_deinit(void)
11151120
// Terminate Command Engine thread
11161121
sli_wifi_command_engine_deinit();
11171122

1123+
if (NULL != si91x_bus_events) {
1124+
osEventFlagsDelete(si91x_bus_events);
1125+
si91x_bus_events = NULL;
1126+
}
1127+
11181128
// Terminate SI91X event handler thread
11191129
if (NULL != si91x_event_thread) {
11201130
osThreadTerminate(si91x_event_thread);
@@ -1167,6 +1177,11 @@ void sli_si91x_set_event(uint32_t event_mask)
11671177
osEventFlagsSet(si91x_events, event_mask);
11681178
}
11691179

1180+
void sl_si91x_host_set_bus_event(uint32_t event_mask)
1181+
{
1182+
osEventFlagsSet(si91x_bus_events, event_mask);
1183+
}
1184+
11701185
sl_status_t sli_si91x_add_to_queue(sli_si91x_buffer_queue_t *queue, sl_wifi_buffer_t *buffer)
11711186
{
11721187
sli_si91x_append_to_buffer_queue(queue, buffer);
@@ -1764,6 +1779,16 @@ uint32_t sli_si91x_wait_for_event(uint32_t event_mask, uint32_t timeout)
17641779
return result;
17651780
}
17661781

1782+
uint32_t si91x_host_wait_for_bus_event(uint32_t event_mask, uint32_t timeout)
1783+
{
1784+
uint32_t result = osEventFlagsWait(si91x_bus_events, event_mask, osFlagsWaitAny, timeout);
1785+
1786+
if (result == (uint32_t)osErrorTimeout || result == (uint32_t)osErrorResource) {
1787+
return 0;
1788+
}
1789+
return result;
1790+
}
1791+
17671792
uint32_t sli_si91x_clear_event(uint32_t event_mask)
17681793
{
17691794
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
@@ -1186,7 +1186,7 @@ sl_status_t sli_si91x_driver_send_command_packet(uint32_t command,
11861186
packet->node.node = NULL;
11871187
sli_si91x_append_to_buffer_queue(&cmd_queues[command_type].tx_queue, packet);
11881188
tx_command_queues_status |= SL_SI91X_TX_PENDING_FLAG(command_type);
1189-
sli_si91x_set_event(SL_SI91X_TX_PENDING_FLAG(command_type));
1189+
sl_si91x_host_set_bus_event(SL_SI91X_TX_PENDING_FLAG(command_type));
11901190
CORE_ExitAtomic(state);
11911191

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

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

13351335
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
@@ -1746,12 +1746,13 @@ void sli_si91x_process_ble_events()
17461746

17471747
uint32_t sli_wifi_command_engine_wait_for_event(uint32_t event_mask, uint32_t timeout)
17481748
{
1749-
return sli_si91x_wait_for_event(event_mask, timeout);
1749+
return si91x_host_wait_for_bus_event(event_mask, timeout);
1750+
17501751
}
17511752

17521753
uint32_t sli_wifi_command_engine_set_event(uint32_t event_mask)
17531754
{
1754-
sli_si91x_set_event(event_mask);
1755+
sl_si91x_host_set_bus_event(event_mask);
17551756
return 0;
17561757
}
17571758

0 commit comments

Comments
 (0)