Fixes race condition in event wait logic of SDMMC driver.

This change makes it so that the timeout is set as part of the SDIO_WAITENABLE call instead of the SDIO_EVENTWAIT call. By doing so, you eliminate all opportunity for a race condition.

stm32h7:sdmmc Check if busy ended early
This commit is contained in:
Anthony Merlino
2021-03-06 22:45:38 -05:00
committed by Xiang Xiao
parent cd08694698
commit b21cb3308a
17 changed files with 509 additions and 534 deletions
+5 -4
View File
@@ -683,7 +683,7 @@
*
****************************************************************************/
#define SDIO_WAITENABLE(dev,eventset) ((dev)->waitenable(dev,eventset))
#define SDIO_WAITENABLE(dev,eventset,timeout) ((dev)->waitenable(dev,eventset,timeout))
/****************************************************************************
* Name: SDIO_EVENTWAIT
@@ -706,7 +706,7 @@
*
****************************************************************************/
#define SDIO_EVENTWAIT(dev,timeout) ((dev)->eventwait(dev,timeout))
#define SDIO_EVENTWAIT(dev) ((dev)->eventwait(dev))
/****************************************************************************
* Name: SDIO_CALLBACKENABLE
@@ -920,8 +920,9 @@ struct sdio_dev_s
/* Event/Callback support */
void (*waitenable)(FAR struct sdio_dev_s *dev, sdio_eventset_t eventset);
sdio_eventset_t (*eventwait)(FAR struct sdio_dev_s *dev, uint32_t timeout);
void (*waitenable)(FAR struct sdio_dev_s *dev, sdio_eventset_t eventset,
uint32_t timeout);
sdio_eventset_t (*eventwait)(FAR struct sdio_dev_s *dev);
void (*callbackenable)(FAR struct sdio_dev_s *dev,
sdio_eventset_t eventset);