Thanks Ting, version2 patch will be sent out later. After that, I will 
highlight it with your comments again.

Thanks.
Jiaxin

> -----Original Message-----
> From: Ye, Ting
> Sent: Thursday, May 26, 2016 2:52 PM
> To: Wu, Jiaxin <[email protected]>; [email protected]
> Cc: Fu, Siyuan <[email protected]>
> Subject: RE: [Patch] MdeModulePkg: Fix SNP.Initialize() spec conformance
> issue
> 
> Jiaxin,
> 
> It looks to me the three places of below code can be merged together.
> Please double check.
> 
> +        Snp->Mode.State = EfiSimpleNetworkInitialized;
> +        Status          = EFI_SUCCESS;
> 
> Also, I would like to highlight that the patch might bring interoperability
> issues to the NIC cards which do not comply with the UNDI definitions in UEFI
> spec. We validated some Intel NICs and they worked probably with this patch.
> If anyone in the mailing list meet the interoperability issue please raise to 
> us.
> 
> Thanks,
> Ye Ting
> 
> -----Original Message-----
> From: Wu, Jiaxin
> Sent: Thursday, May 26, 2016 9:10 AM
> To: [email protected]
> Cc: Ye, Ting <[email protected]>; Fu, Siyuan <[email protected]>
> Subject: [Patch] MdeModulePkg: Fix SNP.Initialize() spec conformance issue
> 
> Current SNP UNDI Initialize command does not follow the UEFI Spec to
> update the SNP MediaPresent field. The result for the Initialize command
> execution check should be:
> StatFlags: (1) Monitor the upper two bits (14 & 15) in the field to know
> whether the command has been executed by the UNDI (Not started,
> Queued, Error, Complete). (2) Check the other field to see if there is an
> active connection to this network device (used to update MediaPresent).
> StatCode: After command execution completes, either successfully or not,
> this field contains the result of the command execution (success or failure).
> This patch is used to fix it.
> 
> NOTE: If any UNDI driver does not follow the UEFI Spec for the media status
> update, it may meet failure with this more conditions check (StatFlags).
> 
> Cc: Ye Ting <[email protected]>
> Cc: Fu Siyuan <[email protected]>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Jiaxin Wu <[email protected]>
> ---
>  MdeModulePkg/Universal/Network/SnpDxe/Initialize.c | 37
> ++++++++++++++++++----
>  1 file changed, 31 insertions(+), 6 deletions(-)
> 
> diff --git a/MdeModulePkg/Universal/Network/SnpDxe/Initialize.c
> b/MdeModulePkg/Universal/Network/SnpDxe/Initialize.c
> index 2151375..0c292a5 100644
> --- a/MdeModulePkg/Universal/Network/SnpDxe/Initialize.c
> +++ b/MdeModulePkg/Universal/Network/SnpDxe/Initialize.c
> @@ -1,9 +1,9 @@
>  /** @file
>               Implementation of initializing a network adapter.
> 
> -Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
>  This program and the accompanying materials are licensed  and made
> available under the terms and conditions of the BSD License which
> accompanies this distribution. The full text of the license may be found at
> http://opensource.org/licenses/bsd-license.php
> 
> @@ -35,10 +35,12 @@ PxeInit (
>  {
>    PXE_CPB_INITIALIZE  *Cpb;
>    VOID                *Addr;
>    EFI_STATUS          Status;
> 
> +  Status = EFI_SUCCESS;
> +
>    Cpb = Snp->Cpb;
>    if (Snp->TxRxBufferSize != 0) {
>      Status = Snp->PciIo->AllocateBuffer (
>                             Snp->PciIo,
>                             AllocateAnyPages, @@ -97,14 +99,38 @@ PxeInit (
> 
>    DEBUG ((EFI_D_NET, "\nSnp->undi.initialize()  "));
> 
>    (*Snp->IssueUndi32Command) ((UINT64)(UINTN) &Snp->Cdb);
> 
> -  if (Snp->Cdb.StatCode == PXE_STATCODE_SUCCESS) {
> -    Snp->Mode.State = EfiSimpleNetworkInitialized;
> -
> -    Status          = EFI_SUCCESS;
> +  //
> +  // There are two fields need to be checked here:
> +  // First is the upper two bits (14 & 15) in the CDB.StatFlags field.
> + Until these bits change to report  //
> PXE_STATFLAGS_COMMAND_COMPLETE or
> PXE_STATFLAGS_COMMAND_FAILED, the command has not been executed
> by the UNDI.
> +  // Second is the CDB.StatCode field. After command execution
> + completes, either successfully or not,  // the CDB.StatCode field contains
> the result of the command execution.
> +  //
> +  if ((((Snp->Cdb.StatFlags) & PXE_STATFLAGS_STATUS_MASK) ==
> PXE_STATFLAGS_COMMAND_COMPLETE) &&
> +      (Snp->Cdb.StatCode == PXE_STATCODE_SUCCESS)) {
> +    //
> +    // If cable detect feature is enabled in CDB.OpFlags, check the
> CDB.StatFlags to see if there is an
> +    // active connection to this network device. If the no media StatFlag is 
> set,
> the UNDI and network
> +    // device are still initialized.
> +    //
> +    if (CableDetectFlag == PXE_OPFLAGS_INITIALIZE_DETECT_CABLE) {
> +      if(((Snp->Cdb.StatFlags) & PXE_STATFLAGS_INITIALIZED_NO_MEDIA) !=
> PXE_STATFLAGS_INITIALIZED_NO_MEDIA) {
> +        Snp->Mode.MediaPresent = TRUE;
> +        Snp->Mode.State = EfiSimpleNetworkInitialized;
> +        Status = EFI_SUCCESS;
> +      } else {
> +        Snp->Mode.MediaPresent = FALSE;
> +        Snp->Mode.State = EfiSimpleNetworkInitialized;
> +        Status          = EFI_SUCCESS;
> +      }
> +    } else {
> +      Snp->Mode.State   = EfiSimpleNetworkInitialized;
> +      Status            = EFI_SUCCESS;
> +    }
>    } else {
>      DEBUG (
>        (EFI_D_WARN,
>        "\nSnp->undi.initialize()  %xh:%xh\n",
>        Snp->Cdb.StatFlags,
> @@ -232,11 +258,10 @@ SnpUndi32Initialize (
>    //
>    // 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;
>      }
>    }
> 
>    Snp->Mode.MediaPresent  = FALSE;
> --
> 1.9.5.msysgit.1

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to