From: Michael (XIAO Xufeng) Date: Fri, 31 May 2019 07:23:10 +0000 (+0800) Subject: spi: fix a possible concurrency issue X-Git-Tag: v3.3-rc~32^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1d2a9efa55c9dfb9cf45e053760902d9fcc2aeec;p=esp-idf spi: fix a possible concurrency issue --- diff --git a/components/driver/spi_slave.c b/components/driver/spi_slave.c index 02dd587df9..82fc99c10b 100644 --- a/components/driver/spi_slave.c +++ b/components/driver/spi_slave.c @@ -467,12 +467,14 @@ static void SPI_SLAVE_ISR_ATTR spi_intr(void *arg) } } + //Disable interrupt before checking to avoid concurrency issue. + esp_intr_disable(host->intr); //Grab next transaction r = xQueueReceiveFromISR(host->trans_queue, &trans, &do_yield); - if (!r) { - //No packet waiting. Disable interrupt. - esp_intr_disable(host->intr); - } else { + if (r) { + //enable the interrupt again if there is packet to send + esp_intr_enable(host->intr); + //We have a transaction. Send it. host->hw->slave.trans_done = 0; //clear int bit host->cur_trans = trans;