On 9 February 2016 at 20:23, Ryan Harkin <ryan.har...@linaro.org> wrote: > Add a PCD for the link negotiation timeout so the platform can over-ride > the default value. > > The code previously did 2000 iterations of the loop with a 2us stall, so > the code has been changed subtly to set the number of iterations equal > to the PCD value divided by the stall time. > > Since the stall time has not changed, the default PCD value is set at > 4000 so the original behaviour is not changed. > > The problems were discovered when the ARM Juno Development Platform used > the "EFI Network" option with then LAN9118 driver. It fails to boot the > first time and so the board drops back to Shell again: > > Warning: LAN9118 Driver in stopped state > Link timeout in auto-negotiation. > Lan9118: Auto Negociation not supported. > EhcExecTransfer: transfer failed with 2 > EhcControlTransfer: error - Device Error, transfer - 2 > Buffer: EFI Hard Drive > Booting EFI Misc Device > Booting EFI Misc Device 1 > Booting EFI Hard Drive > Booting EFI Network > Warning: LAN9118 Driver not initialized > Link timeout in auto-negotiation. > Lan9118: Auto Negociation not supported. > Booting EFI Internal Shell > > Exiting Shell drops the user back to the Intel BDS UI. Selecting > "Continue" then succeeds in booting from the EFI Network: > > Booting EFI Misc Device > Booting EFI Misc Device 1 > Booting EFI Hard Drive > Booting EFI Network > ..MnpFreeTxBuf: Duplicated recycle report from SNP. > MnpFreeTxBuf: Duplicated recycle report from SNP. > [snip repeated errors] > > Discussion on the edk2-devel mailing list [1] prompted Laszlo Ersek to > suggest the time taken for the NIC to negotiate was causing a problem. > He suggested the solution contained in this patch to provide a PCD > configurable by the platform. > > The default PCD value does not work for Juno. Setting the PCD to a > larger value works for Juno R0, R1 and R2. > > [1] http://article.gmane.org/gmane.comp.bios.edk2.devel/7341 > > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Ryan Harkin <ryan.har...@linaro.org>
Reviewed-by: Ard Biesheuvel <ard.biesheu...@linaro.org> > --- > EmbeddedPkg/EmbeddedPkg.dec | 1 + > EmbeddedPkg/Drivers/Lan9118Dxe/Lan9118Dxe.inf | 1 + > EmbeddedPkg/Drivers/Lan9118Dxe/Lan9118DxeUtil.c | 2 +- > 3 files changed, 3 insertions(+), 1 deletion(-) > > diff --git a/EmbeddedPkg/EmbeddedPkg.dec b/EmbeddedPkg/EmbeddedPkg.dec > index f557527..cd0d96f 100644 > --- a/EmbeddedPkg/EmbeddedPkg.dec > +++ b/EmbeddedPkg/EmbeddedPkg.dec > @@ -145,6 +145,7 @@ [PcdsFixedAtBuild.common] > # LAN9118 Ethernet Driver PCDs > gEmbeddedTokenSpaceGuid.PcdLan9118DxeBaseAddress|0x0|UINT32|0x00000025 > gEmbeddedTokenSpaceGuid.PcdLan9118DefaultMacAddress|0x0|UINT64|0x00000026 > + > gEmbeddedTokenSpaceGuid.PcdLan9118DefaultNegotiationTimeout|4000|UINT32|0x00000027 > > # > # Android FastBoot > diff --git a/EmbeddedPkg/Drivers/Lan9118Dxe/Lan9118Dxe.inf > b/EmbeddedPkg/Drivers/Lan9118Dxe/Lan9118Dxe.inf > index 9e5f98b..3c2246f 100644 > --- a/EmbeddedPkg/Drivers/Lan9118Dxe/Lan9118Dxe.inf > +++ b/EmbeddedPkg/Drivers/Lan9118Dxe/Lan9118Dxe.inf > @@ -51,6 +51,7 @@ [Protocols] > [FixedPcd] > gEmbeddedTokenSpaceGuid.PcdLan9118DxeBaseAddress > gEmbeddedTokenSpaceGuid.PcdLan9118DefaultMacAddress > + gEmbeddedTokenSpaceGuid.PcdLan9118DefaultNegotiationTimeout > > [Depex] > TRUE > diff --git a/EmbeddedPkg/Drivers/Lan9118Dxe/Lan9118DxeUtil.c > b/EmbeddedPkg/Drivers/Lan9118Dxe/Lan9118DxeUtil.c > index 2ef1ecb..c57c7ce 100644 > --- a/EmbeddedPkg/Drivers/Lan9118Dxe/Lan9118DxeUtil.c > +++ b/EmbeddedPkg/Drivers/Lan9118Dxe/Lan9118DxeUtil.c > @@ -586,7 +586,7 @@ AutoNegotiate ( > // Check that link is up first > if ((PhyStatus & PHYSTS_LINK_STS) == 0) { > // Wait until it is up or until Time Out > - TimeOut = 2000; > + TimeOut = FixedPcdGet32 (PcdLan9118DefaultNegotiationTimeout) / > LAN9118_STALL; > while ((IndirectPHYRead32 (PHY_INDEX_BASIC_STATUS) & PHYSTS_LINK_STS) == > 0) { > MemoryFence(); > gBS->Stall (LAN9118_STALL); > -- > 2.1.4 > _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel