On 9 February 2016 at 12:04, Laszlo Ersek <[email protected]> wrote: > comments below: > > On 02/09/16 12:41, Ryan Harkin 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 exception is the Stall() in the AutoNegotiate() function. This >> stall is waiting for the link to negotiate, which may require stalling >> until it is ready. In this instance, 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]> >> --- >> EmbeddedPkg/Drivers/Lan9118Dxe/Lan9118Dxe.c | 9 +++--- >> EmbeddedPkg/Drivers/Lan9118Dxe/Lan9118DxeUtil.c | 43 >> +++++++++++++------------ >> 2 files changed, 26 insertions(+), 26 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(); > > You removed two Stall() calls, but only added one MemoryFence(). Why? > > Just kidding. :) >
I know, when I saw that, I aged just a little faster :) > I won't try to review this patch in depth without actually knowing how > to program the device, but the idea seems clear, from skimming the patch. > > Acked-by: Laszlo Ersek <[email protected]> > Sure, thanks for checking and acking it. > Thanks > Laszlo > >> >> // 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..8398c10 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,13 @@ 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; >> @@ -377,7 +377,7 @@ Lan9118Initialize ( >> // Check that EEPROM isn't active >> Timeout = 20; >> while ((MmioRead32 (LAN9118_E2P_CMD) & E2P_EPC_BUSY) && --Timeout){ >> - gBS->Stall (LAN9118_STALL); >> + MemoryFence(); >> } >> if (!Timeout) { >> return EFI_TIMEOUT; >> @@ -447,12 +447,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) { >> >> - gBS->Stall (LAN9118_STALL); >> + MemoryFence(); >> ResetTime += 1; >> >> // If time taken exceeds 100us, then there was an error condition >> @@ -500,7 +500,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 +508,7 @@ PhySoftReset ( >> >> // Wait for completion >> while (IndirectPHYRead32 (PHY_INDEX_BASIC_CTRL) & PHYCR_RESET) { >> - gBS->Stall (LAN9118_STALL); >> + MemoryFence(); >> } >> } >> >> @@ -542,7 +542,7 @@ ConfigureHardware ( >> >> // Write the configuration >> MmioWrite32 (LAN9118_GPIO_CFG, GpioConf); >> - gBS->Stall (LAN9118_STALL); >> + MemoryFence(); >> } >> >> return EFI_SUCCESS; >> @@ -585,6 +585,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 +672,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 +691,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 +726,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 +752,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 +803,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 +1000,7 @@ ChangeFifoAllocation ( >> HwConf &= ~(0xF0000); >> HwConf |= ((TxFifoOption & 0xF) << 16); >> MmioWrite32 (LAN9118_HW_CFG, HwConf); >> - gBS->Stall (LAN9118_STALL); >> + MemoryFence(); >> >> return EFI_SUCCESS; >> } >> > _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

