On 9 February 2016 at 20:23, Ryan Harkin <[email protected]> wrote: > When reviewing my LAN9118 driver PCD patch [1], Ard Biesheuvel noted > that most calls to gBS->Stall() in this driver seem to be used to > prevent timing issues between the device updating data and the host > reading the values. And that replacing most of these calls with a > MemoryFence() would be more robust. > > The only exceptions are the stalls that are enclosed inside retry loops: > > - in the AutoNegotiate() function. > This stall is waiting for the link to negotiate, which may require > stalling until it is ready. > > - in the Lan9118Initialize() function. > These two stalls are waiting for devices and time out after a number > of retries. > > - in the SoftReset() function. > This stall is inside a loop where the comment states: > "If time taken exceeds 100us, then there was an error condition" > > In these instances, I kept the stall, but also added a MemoryFence(). > > [1] http://article.gmane.org/gmane.comp.bios.edk2.devel/7389 > > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Ryan Harkin <[email protected]>
Reviewed-by: Ard Biesheuvel <[email protected]> > --- > EmbeddedPkg/Drivers/Lan9118Dxe/Lan9118Dxe.c | 9 +++--- > EmbeddedPkg/Drivers/Lan9118Dxe/Lan9118DxeUtil.c | 40 > ++++++++++++++----------- > 2 files changed, 26 insertions(+), 23 deletions(-) > > diff --git a/EmbeddedPkg/Drivers/Lan9118Dxe/Lan9118Dxe.c > b/EmbeddedPkg/Drivers/Lan9118Dxe/Lan9118Dxe.c > index 4de5204..79bee3f 100644 > --- a/EmbeddedPkg/Drivers/Lan9118Dxe/Lan9118Dxe.c > +++ b/EmbeddedPkg/Drivers/Lan9118Dxe/Lan9118Dxe.c > @@ -307,8 +307,7 @@ SnpInitialize ( > > // Write the current configuration to the register > MmioWrite32 (LAN9118_PMT_CTRL, PmConf); > - gBS->Stall (LAN9118_STALL); > - gBS->Stall (LAN9118_STALL); > + MemoryFence(); > > // Configure GPIO and HW > Status = ConfigureHardware (HW_CONF_USE_LEDS, Snp); > @@ -431,7 +430,7 @@ SnpReset ( > > // Write the current configuration to the register > MmioWrite32 (LAN9118_PMT_CTRL, PmConf); > - gBS->Stall (LAN9118_STALL); > + MemoryFence(); > > // Reactivate the LEDs > Status = ConfigureHardware (HW_CONF_USE_LEDS, Snp); > @@ -446,7 +445,7 @@ SnpReset ( > HwConf |= HW_CFG_TX_FIFO_SIZE(gTxBuffer); // assign size chosen in > SnpInitialize > > MmioWrite32 (LAN9118_HW_CFG, HwConf); // Write the conf > - gBS->Stall (LAN9118_STALL); > + MemoryFence(); > } > > // Enable the receiver and transmitter and clear their contents > @@ -701,7 +700,7 @@ SnpReceiveFilters ( > // Write the options to the MAC_CSR > // > IndirectMACWrite32 (INDIRECT_MAC_INDEX_CR, MacCSRValue); > - gBS->Stall (LAN9118_STALL); > + MemoryFence(); > > // > // If we have to retrieve something, start packet reception. > diff --git a/EmbeddedPkg/Drivers/Lan9118Dxe/Lan9118DxeUtil.c > b/EmbeddedPkg/Drivers/Lan9118Dxe/Lan9118DxeUtil.c > index 9531b0b..2ef1ecb 100644 > --- a/EmbeddedPkg/Drivers/Lan9118Dxe/Lan9118DxeUtil.c > +++ b/EmbeddedPkg/Drivers/Lan9118Dxe/Lan9118DxeUtil.c > @@ -236,7 +236,7 @@ IndirectEEPROMRead32 ( > > // Write to Eeprom command register > MmioWrite32 (LAN9118_E2P_CMD, EepromCmd); > - gBS->Stall (LAN9118_STALL); > + MemoryFence(); > > // Wait until operation has completed > while (MmioRead32 (LAN9118_E2P_CMD) & E2P_EPC_BUSY); > @@ -284,7 +284,7 @@ IndirectEEPROMWrite32 ( > > // Write to Eeprom command register > MmioWrite32 (LAN9118_E2P_CMD, EepromCmd); > - gBS->Stall (LAN9118_STALL); > + MemoryFence(); > > // Wait until operation has completed > while (MmioRead32 (LAN9118_E2P_CMD) & E2P_EPC_BUSY); > @@ -362,13 +362,14 @@ Lan9118Initialize ( > if (((MmioRead32 (LAN9118_PMT_CTRL) & MPTCTRL_PM_MODE_MASK) >> 12) != 0) { > DEBUG ((DEBUG_NET, "Waking from reduced power state.\n")); > MmioWrite32 (LAN9118_BYTE_TEST, 0xFFFFFFFF); > - gBS->Stall (LAN9118_STALL); > + MemoryFence(); > } > > // Check that device is active > Timeout = 20; > while ((MmioRead32 (LAN9118_PMT_CTRL) & MPTCTRL_READY) == 0 && --Timeout) { > gBS->Stall (LAN9118_STALL); > + MemoryFence(); > } > if (!Timeout) { > return EFI_TIMEOUT; > @@ -378,6 +379,7 @@ Lan9118Initialize ( > Timeout = 20; > while ((MmioRead32 (LAN9118_E2P_CMD) & E2P_EPC_BUSY) && --Timeout){ > gBS->Stall (LAN9118_STALL); > + MemoryFence(); > } > if (!Timeout) { > return EFI_TIMEOUT; > @@ -447,11 +449,12 @@ SoftReset ( > > // Write the configuration > MmioWrite32 (LAN9118_HW_CFG, HwConf); > - gBS->Stall (LAN9118_STALL); > + MemoryFence(); > > // Wait for reset to complete > while (MmioRead32 (LAN9118_HW_CFG) & HWCFG_SRST) { > > + MemoryFence(); > gBS->Stall (LAN9118_STALL); > ResetTime += 1; > > @@ -500,7 +503,7 @@ PhySoftReset ( > > // Wait for completion > while (MmioRead32 (LAN9118_PMT_CTRL) & MPTCTRL_PHY_RST) { > - gBS->Stall (LAN9118_STALL); > + MemoryFence(); > } > // PHY Basic Control Register reset > } else if (Flags & PHY_RESET_BCR) { > @@ -508,7 +511,7 @@ PhySoftReset ( > > // Wait for completion > while (IndirectPHYRead32 (PHY_INDEX_BASIC_CTRL) & PHYCR_RESET) { > - gBS->Stall (LAN9118_STALL); > + MemoryFence(); > } > } > > @@ -542,7 +545,7 @@ ConfigureHardware ( > > // Write the configuration > MmioWrite32 (LAN9118_GPIO_CFG, GpioConf); > - gBS->Stall (LAN9118_STALL); > + MemoryFence(); > } > > return EFI_SUCCESS; > @@ -585,6 +588,7 @@ AutoNegotiate ( > // Wait until it is up or until Time Out > TimeOut = 2000; > while ((IndirectPHYRead32 (PHY_INDEX_BASIC_STATUS) & PHYSTS_LINK_STS) == > 0) { > + MemoryFence(); > gBS->Stall (LAN9118_STALL); > TimeOut--; > if (!TimeOut) { > @@ -671,7 +675,7 @@ StopTx ( > TxCfg = MmioRead32 (LAN9118_TX_CFG); > TxCfg |= TXCFG_TXS_DUMP | TXCFG_TXD_DUMP; > MmioWrite32 (LAN9118_TX_CFG, TxCfg); > - gBS->Stall (LAN9118_STALL); > + MemoryFence(); > } > > // Check if already stopped > @@ -690,7 +694,7 @@ StopTx ( > if (TxCfg & TXCFG_TX_ON) { > TxCfg |= TXCFG_STOP_TX; > MmioWrite32 (LAN9118_TX_CFG, TxCfg); > - gBS->Stall (LAN9118_STALL); > + MemoryFence(); > > // Wait for Tx to finish transmitting > while (MmioRead32 (LAN9118_TX_CFG) & TXCFG_STOP_TX); > @@ -725,7 +729,7 @@ StopRx ( > RxCfg = MmioRead32 (LAN9118_RX_CFG); > RxCfg |= RXCFG_RX_DUMP; > MmioWrite32 (LAN9118_RX_CFG, RxCfg); > - gBS->Stall (LAN9118_STALL); > + MemoryFence(); > > while (MmioRead32 (LAN9118_RX_CFG) & RXCFG_RX_DUMP); > } > @@ -751,28 +755,28 @@ StartTx ( > TxCfg = MmioRead32 (LAN9118_TX_CFG); > TxCfg |= TXCFG_TXS_DUMP | TXCFG_TXD_DUMP; > MmioWrite32 (LAN9118_TX_CFG, TxCfg); > - gBS->Stall (LAN9118_STALL); > + MemoryFence(); > } > > // Check if tx was started from MAC and enable if not > if (Flags & START_TX_MAC) { > MacCsr = IndirectMACRead32 (INDIRECT_MAC_INDEX_CR); > - gBS->Stall (LAN9118_STALL); > + MemoryFence(); > if ((MacCsr & MACCR_TX_EN) == 0) { > MacCsr |= MACCR_TX_EN; > IndirectMACWrite32 (INDIRECT_MAC_INDEX_CR, MacCsr); > - gBS->Stall (LAN9118_STALL); > + MemoryFence(); > } > } > > // Check if tx was started from TX_CFG and enable if not > if (Flags & START_TX_CFG) { > TxCfg = MmioRead32 (LAN9118_TX_CFG); > - gBS->Stall (LAN9118_STALL); > + MemoryFence(); > if ((TxCfg & TXCFG_TX_ON) == 0) { > TxCfg |= TXCFG_TX_ON; > MmioWrite32 (LAN9118_TX_CFG, TxCfg); > - gBS->Stall (LAN9118_STALL); > + MemoryFence(); > } > } > > @@ -802,14 +806,14 @@ StartRx ( > RxCfg = MmioRead32 (LAN9118_RX_CFG); > RxCfg |= RXCFG_RX_DUMP; > MmioWrite32 (LAN9118_RX_CFG, RxCfg); > - gBS->Stall (LAN9118_STALL); > + MemoryFence(); > > while (MmioRead32 (LAN9118_RX_CFG) & RXCFG_RX_DUMP); > } > > MacCsr |= MACCR_RX_EN; > IndirectMACWrite32 (INDIRECT_MAC_INDEX_CR, MacCsr); > - gBS->Stall (LAN9118_STALL); > + MemoryFence(); > } > > return EFI_SUCCESS; > @@ -999,7 +1003,7 @@ ChangeFifoAllocation ( > HwConf &= ~(0xF0000); > HwConf |= ((TxFifoOption & 0xF) << 16); > MmioWrite32 (LAN9118_HW_CFG, HwConf); > - gBS->Stall (LAN9118_STALL); > + MemoryFence(); > > return EFI_SUCCESS; > } > -- > 2.1.4 > _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

