Reviewed-By: Wu Jiaxin <[email protected]> > -----Original Message----- > From: Fu, Siyuan > Sent: Wednesday, May 4, 2016 4:48 PM > To: [email protected] > Cc: Ye, Ting <[email protected]>; Wu, Jiaxin <[email protected]> > Subject: [PATCH v2] MdeModulePkg: Refine SNP driver's media status check > logic. > > V2 Update: > Refine variable and function description per Ye, Ting's comments. > > Some UNDI drivers may not support the cable detect in UNDI INITIALIZE > command, but support the media present check in UNDI GET_STATUS > command. Current SNP driver will set the MediaPresentSupported field to > FALSE in EFI_SIMPLE_NETWORK_MODE for such case, which forbid the > media detect from the callers. > > This patch updates the SNP driver to support such kind of UNDIs for media > detect. > MediaPresentSupported will be set to TRUE, and a GET_STATUS command > will be issued immediately after INITIALIZE command in SNP->Initialize() > function, to refresh the value of MediaPresent in SNP mode data. > > Cc: Ye Ting <[email protected]> > Cc: Wu Jiaxin <[email protected]> > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Fu Siyuan <[email protected]> > --- > MdeModulePkg/Universal/Network/SnpDxe/Get_status.c | 25 ++++++++-- > ------ MdeModulePkg/Universal/Network/SnpDxe/Initialize.c | 13 > ++++++++- > MdeModulePkg/Universal/Network/SnpDxe/Snp.c | 8 +++-- > MdeModulePkg/Universal/Network/SnpDxe/Snp.h | 34 > +++++++++++++++++++++- > 4 files changed, 64 insertions(+), 16 deletions(-) > > diff --git a/MdeModulePkg/Universal/Network/SnpDxe/Get_status.c > b/MdeModulePkg/Universal/Network/SnpDxe/Get_status.c > index edbc0f2..4c3bdae 100644 > --- a/MdeModulePkg/Universal/Network/SnpDxe/Get_status.c > +++ b/MdeModulePkg/Universal/Network/SnpDxe/Get_status.c > @@ -18,24 +18,25 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF > ANY KIND, EITHER EXPRESS OR IMPLIED. > /** > Call undi to get the status of the interrupts, get the list of recycled > transmit > buffers that completed transmitting. The recycled transmit buffer address > will > - be saved into Snp->RecycledTxBuf. > + be saved into Snp->RecycledTxBuf. This function will also update the > + MediaPresent field of EFI_SIMPLE_NETWORK_MODE if UNDI support it. > > - @param Snp Pointer to snp driver structure. > - @param InterruptStatusPtr A non null pointer to contain the interrupt > - status. > - @param GetTransmittedBuf Set to TRUE to retrieve the recycled > transmit > - buffer address. > + @param[in] Snp Pointer to snp driver structure. > + @param[out] InterruptStatusPtr A non null pointer to contain the > interrupt > + status. > + @param[in] GetTransmittedBuf Set to TRUE to retrieve the recycled > transmit > + buffer address. > > - @retval EFI_SUCCESS The status of the network interface was > retrieved. > - @retval EFI_DEVICE_ERROR The command could not be sent to the > network > - interface. > + @retval EFI_SUCCESS The status of the network interface > was > retrieved. > + @retval EFI_DEVICE_ERROR The command could not be sent to the > network > + interface. > > **/ > EFI_STATUS > PxeGetStatus ( > - SNP_DRIVER *Snp, > - UINT32 *InterruptStatusPtr, > - BOOLEAN GetTransmittedBuf > + IN SNP_DRIVER *Snp, > + OUT UINT32 *InterruptStatusPtr, > + IN BOOLEAN GetTransmittedBuf > ) > { > PXE_DB_GET_STATUS *Db; > diff --git a/MdeModulePkg/Universal/Network/SnpDxe/Initialize.c > b/MdeModulePkg/Universal/Network/SnpDxe/Initialize.c > index 3f40ef3..2151375 100644 > --- a/MdeModulePkg/Universal/Network/SnpDxe/Initialize.c > +++ b/MdeModulePkg/Universal/Network/SnpDxe/Initialize.c > @@ -229,7 +229,10 @@ SnpUndi32Initialize ( > // > Snp->TxRxBufferSize = (UINT32) (Snp->InitInfo.MemoryRequired + > ExtraRxBufferSize + ExtraTxBufferSize); > > - if (Snp->Mode.MediaPresentSupported) { > + // > + // If UNDI support cable detect for INITIALIZE command, try it first. > + // > + if (Snp->CableDetectSupported) { > if (PxeInit (Snp, PXE_OPFLAGS_INITIALIZE_DETECT_CABLE) == > EFI_SUCCESS) { > Snp->Mode.MediaPresent = TRUE; > goto ON_EXIT; > @@ -242,6 +245,14 @@ SnpUndi32Initialize ( > > if (EFI_ERROR (EfiStatus)) { > gBS->CloseEvent (Snp->Snp.WaitForPacket); > + goto ON_EXIT; > + } > + > + // > + // Try to update the MediaPresent field of EFI_SIMPLE_NETWORK_MODE > if the UNDI support it. > + // > + if (Snp->MediaStatusSupported) { > + PxeGetStatus (Snp, NULL, FALSE); > } > > ON_EXIT: > diff --git a/MdeModulePkg/Universal/Network/SnpDxe/Snp.c > b/MdeModulePkg/Universal/Network/SnpDxe/Snp.c > index 5ff294f..9f61aee 100644 > --- a/MdeModulePkg/Universal/Network/SnpDxe/Snp.c > +++ b/MdeModulePkg/Universal/Network/SnpDxe/Snp.c > @@ -554,12 +554,12 @@ SimpleNetworkDriverStart ( > > switch (InitStatFlags & PXE_STATFLAGS_CABLE_DETECT_MASK) { > case PXE_STATFLAGS_CABLE_DETECT_SUPPORTED: > - Snp->Mode.MediaPresentSupported = TRUE; > + Snp->CableDetectSupported = TRUE; > break; > > case PXE_STATFLAGS_CABLE_DETECT_NOT_SUPPORTED: > default: > - Snp->Mode.MediaPresentSupported = FALSE; > + Snp->CableDetectSupported = FALSE; > } > > switch (InitStatFlags & PXE_STATFLAGS_GET_STATUS_NO_MEDIA_MASK) > { @@ -572,6 +572,10 @@ SimpleNetworkDriverStart ( > Snp->MediaStatusSupported = FALSE; > } > > + if (Snp->CableDetectSupported || Snp->MediaStatusSupported) { > + Snp->Mode.MediaPresentSupported = TRUE; } > + > if ((Pxe->hw.Implementation & > PXE_ROMID_IMP_STATION_ADDR_SETTABLE) != 0) { > Snp->Mode.MacAddressChangeable = TRUE; > } else { > diff --git a/MdeModulePkg/Universal/Network/SnpDxe/Snp.h > b/MdeModulePkg/Universal/Network/SnpDxe/Snp.h > index 67f65ff..9d5ae98 100644 > --- a/MdeModulePkg/Universal/Network/SnpDxe/Snp.h > +++ b/MdeModulePkg/Universal/Network/SnpDxe/Snp.h > @@ -130,11 +130,19 @@ typedef struct { > > // > // Whether UNDI support reporting media status from GET_STATUS > command, > - // i.e. PXE_STATFLAGS_GET_STATUS_NO_MEDIA_SUPPORTED > + // i.e. PXE_STATFLAGS_GET_STATUS_NO_MEDIA_SUPPORTED or > + // PXE_STATFLAGS_GET_STATUS_NO_MEDIA_NOT_SUPPORTED > // > BOOLEAN MediaStatusSupported; > > // > + // Whether UNDI support cable detect for INITIALIZE command, // i.e. > + PXE_STATFLAGS_CABLE_DETECT_SUPPORTED or > + // PXE_STATFLAGS_CABLE_DETECT_NOT_SUPPORTED > + // > + BOOLEAN CableDetectSupported; > + > + // > // Array of the recycled transmit buffer address from UNDI. > // > UINT64 *RecycledTxBuf; > @@ -234,6 +242,30 @@ PxeGetStnAddr ( > ); > > /** > + Call undi to get the status of the interrupts, get the list of > + recycled transmit buffers that completed transmitting. The recycled > + transmit buffer address will be saved into Snp->RecycledTxBuf. This > + function will also update the MediaPresent field of > EFI_SIMPLE_NETWORK_MODE if UNDI support it. > + > + @param[in] Snp Pointer to snp driver structure. > + @param[out] InterruptStatusPtr A non null pointer to contain the > interrupt > + status. > + @param[in] GetTransmittedBuf Set to TRUE to retrieve the recycled > transmit > + buffer address. > + > + @retval EFI_SUCCESS The status of the network interface > was > retrieved. > + @retval EFI_DEVICE_ERROR The command could not be sent to the > network > + interface. > + > +**/ > +EFI_STATUS > +PxeGetStatus ( > + IN SNP_DRIVER *Snp, > + OUT UINT32 *InterruptStatusPtr, > + IN BOOLEAN GetTransmittedBuf > + ); > + > +/** > This is a callback routine supplied to UNDI3.1 at undi_start time. > UNDI call this routine when it wants to have exclusive access to a critical > section of the code/data. > -- > 2.7.4.windows.1
_______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

