From 301243ed06ac77da6810c20898fe0059b4835d61 Mon Sep 17 00:00:00 2001 From: Marcin Niestroj Date: Fri, 2 Jul 2021 17:44:23 +0200 Subject: [PATCH] drivers: wifi: esp_at: fix race condition when waiting for 'SEND OK' This is more or less the flow of AT+CIPSEND: RX TX -- -- AT+CIPSEND=<...> OK > SEND OK / SEND FAIL 'sem_response' semaphore is released by receiving 'OK'. Then after receiving '>' (which releases 'sem_tx_ready' semaphore) actual data is sent. Waiting for 'SEND OK' or 'SEND FAIL' is implemented by waiting on 'sem_response' (the same as for 'OK'), which mean that resetting this semaphore just after sending all data is racy. Fix that race condition by resetting 'sem_response' just after receiving 'OK', so that neither 'SEND OK' nor 'SEND FAIL' will appear yet (they will not be sent as long as we won't send whole payload). Signed-off-by: Marcin Niestroj --- drivers/wifi/esp_at/esp_offload.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/wifi/esp_at/esp_offload.c b/drivers/wifi/esp_at/esp_offload.c index 4c275dac09e..c9fac55e781 100644 --- a/drivers/wifi/esp_at/esp_offload.c +++ b/drivers/wifi/esp_at/esp_offload.c @@ -242,6 +242,9 @@ static int _sock_send(struct esp_socket *sock, struct net_pkt *pkt) goto out; } + /* Reset semaphore that will be released by 'SEND OK' or 'SEND FAIL' */ + k_sem_reset(&dev->sem_response); + /* Wait for '>' */ ret = k_sem_take(&dev->sem_tx_ready, K_MSEC(5000)); if (ret < 0) { @@ -258,7 +261,6 @@ static int _sock_send(struct esp_socket *sock, struct net_pkt *pkt) } /* Wait for 'SEND OK' or 'SEND FAIL' */ - k_sem_reset(&dev->sem_response); ret = k_sem_take(&dev->sem_response, ESP_CMD_TIMEOUT); if (ret < 0) { LOG_DBG("No send response");