diff --git a/os/hal/ports/STM32/LLD/MACv1/hal_mac_lld.c b/os/hal/ports/STM32/LLD/MACv1/hal_mac_lld.c index e0227bf1d..1a625338c 100644 --- a/os/hal/ports/STM32/LLD/MACv1/hal_mac_lld.c +++ b/os/hal/ports/STM32/LLD/MACv1/hal_mac_lld.c @@ -427,15 +427,12 @@ msg_t mac_lld_get_transmit_descriptor(MACDriver *macp, if (!macp->link_up) return MSG_TIMEOUT; - osalSysLock(); - /* Get Current TX descriptor.*/ tdes = macp->txptr; /* Ensure that descriptor isn't owned by the Ethernet DMA or locked by another thread.*/ if (tdes->tdes0 & (STM32_TDES0_OWN | STM32_TDES0_LOCKED)) { - osalSysUnlock(); return MSG_TIMEOUT; } @@ -445,8 +442,6 @@ msg_t mac_lld_get_transmit_descriptor(MACDriver *macp, /* Next TX descriptor to use.*/ macp->txptr = (stm32_eth_tx_descriptor_t *)tdes->tdes3; - osalSysUnlock(); - /* Set the buffer size and configuration.*/ tdp->offset = 0; tdp->size = STM32_MAC_BUFFERS_SIZE; @@ -503,8 +498,6 @@ msg_t mac_lld_get_receive_descriptor(MACDriver *macp, MACReceiveDescriptor *rdp) { stm32_eth_rx_descriptor_t *rdes; - osalSysLock(); - /* Get Current RX descriptor.*/ rdes = macp->rxptr; @@ -523,7 +516,6 @@ msg_t mac_lld_get_receive_descriptor(MACDriver *macp, rdp->physdesc = rdes; macp->rxptr = (stm32_eth_rx_descriptor_t *)rdes->rdes3; - osalSysUnlock(); return MSG_OK; } /* Invalid frame found, purging.*/ @@ -534,7 +526,6 @@ msg_t mac_lld_get_receive_descriptor(MACDriver *macp, /* Next descriptor to check.*/ macp->rxptr = rdes; - osalSysUnlock(); return MSG_TIMEOUT; } diff --git a/os/hal/src/hal_mac.c b/os/hal/src/hal_mac.c index c79f5a5e2..e03a58f0f 100644 --- a/os/hal/src/hal_mac.c +++ b/os/hal/src/hal_mac.c @@ -155,16 +155,18 @@ msg_t macWaitTransmitDescriptor(MACDriver *macp, osalDbgCheck((macp != NULL) && (tdp != NULL)); osalDbgAssert(macp->state == MAC_ACTIVE, "not active"); + osalSysLock(); + while (((msg = mac_lld_get_transmit_descriptor(macp, tdp)) != MSG_OK) && (timeout > (sysinterval_t)0)) { - osalSysLock(); msg = osalThreadEnqueueTimeoutS(&macp->tdqueue, timeout); if (msg == MSG_TIMEOUT) { - osalSysUnlock(); break; } - osalSysUnlock(); } + + osalSysUnlock(); + return msg; } @@ -210,15 +212,17 @@ msg_t macWaitReceiveDescriptor(MACDriver *macp, osalDbgCheck((macp != NULL) && (rdp != NULL)); osalDbgAssert(macp->state == MAC_ACTIVE, "not active"); + osalSysLock(); + while (((msg = mac_lld_get_receive_descriptor(macp, rdp)) != MSG_OK)) { - osalSysLock(); msg = osalThreadEnqueueTimeoutS(&macp->rdqueue, timeout); if (msg == MSG_TIMEOUT) { - osalSysUnlock(); break; } - osalSysUnlock(); } + + osalSysUnlock(); + return msg; } diff --git a/readme.txt b/readme.txt index 186dc9d12..6dc398668 100644 --- a/readme.txt +++ b/readme.txt @@ -83,6 +83,8 @@ MEMS Accelerometers. - NEW: Safer messages mechanism for sandboxes (to be backported to 20.3.1). - NEW: Added latency measurement test application. +- FIX: Fixed race condition in HAL MAC driver (bug #1083) + (backported to 20.3.1)(backported to 19.1.4). - FIX: Fixed early interrupts enable in ARMv7-M port (bug #1081) (backported to 20.3.1). - FIX: Fixed I2CD4 interrupt vectors are swapped versus I2CD1-I2CD3 (bug #1080)