Hi, Lubo
The allocate memory in SnpNt32InitializeGlobalData is better to use
AllocatePool (sizeof (UINT64) * This->MaxRecycledTxBuf);
to avoid possible macro value update in future.
Other parts are good to me.
Reviewed-by: Fu Siyuan <[email protected]>
> -----Original Message-----
> From: edk2-devel [mailto:[email protected]] On Behalf Of
> Zhang Lubo
> Sent: Friday, April 29, 2016 9:50 AM
> To: [email protected]
> Cc: Ye, Ting <[email protected]>; Fu, Siyuan <[email protected]>; Wu,
> Jiaxin <[email protected]>
> Subject: [edk2] [patch] Nt32Pkg: Fix SnpNt32 GetStatus bug
>
> According to UEFI spec, the Snp.GetStatus should
> return the recycled transmit buffer address, while
> the NT32 SNP always return value 1 for the Txbuffer.
>
> Cc: Fu Siyuan <[email protected]>
> Cc: Ye Ting <[email protected]>
> Cc: Wu Jiaxin <[email protected]>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Zhang Lubo <[email protected]>
> ---
> Nt32Pkg/SnpNt32Dxe/SnpNt32.c | 42
> ++++++++++++++++++++++++++++++++++++++++--
> Nt32Pkg/SnpNt32Dxe/SnpNt32.h | 22 +++++++++++++++++++++-
> 2 files changed, 61 insertions(+), 3 deletions(-)
>
> diff --git a/Nt32Pkg/SnpNt32Dxe/SnpNt32.c
> b/Nt32Pkg/SnpNt32Dxe/SnpNt32.c
> index 4dee182..6d22c2f 100644
> --- a/Nt32Pkg/SnpNt32Dxe/SnpNt32.c
> +++ b/Nt32Pkg/SnpNt32Dxe/SnpNt32.c
> @@ -1,8 +1,8 @@
> /** @file
>
> -Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2006 - 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
>
> @@ -42,10 +42,13 @@ SNPNT32_GLOBAL_DATA gSnpNt32GlobalData = {
> {
> 0,
> 0,
> EfiLockUninitialized
> }, // Lock
> + NULL, // RecycledTxBuf
> + 0, // RecycledTxBufCount
> + 32, // MaxRecycledTxBuf
> //
> // Private functions
> //
> SnpNt32InitializeGlobalData, // InitializeGlobalData
> SnpNt32InitializeInstanceData, // InitializeInstanceData
> @@ -859,13 +862,24 @@ SnpNt32GetStatus (
> IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
> OUT UINT32 *InterruptStatus,
> OUT VOID **TxBuffer
> )
> {
> + SNPNT32_INSTANCE_DATA *Instance;
> + SNPNT32_GLOBAL_DATA *GlobalData;
> +
> + Instance = SNP_NT32_INSTANCE_DATA_FROM_SNP_THIS (This);
> +
> + GlobalData = Instance->GlobalData;
>
> if (TxBuffer != NULL) {
> - *((UINT8 **) TxBuffer) = (UINT8 *)(UINTN) 1;
> + if (GlobalData->RecycledTxBufCount != 0) {
> + GlobalData->RecycledTxBufCount --;
> + *((UINT8 **) TxBuffer) = (UINT8 *) (UINTN)GlobalData-
> >RecycledTxBuf[GlobalData->RecycledTxBufCount];
> + } else {
> + *((UINT8 **) TxBuffer) = NULL;
> + }
> }
>
> if (InterruptStatus != NULL) {
> *InterruptStatus = EFI_SIMPLE_NETWORK_TRANSMIT_INTERRUPT;
> }
> @@ -916,10 +930,11 @@ SnpNt32Transmit (
> )
> {
> SNPNT32_INSTANCE_DATA *Instance;
> SNPNT32_GLOBAL_DATA *GlobalData;
> INT32 ReturnValue;
> + UINT64 *Tmp;
>
> Instance = SNP_NT32_INSTANCE_DATA_FROM_SNP_THIS (This);
>
> GlobalData = Instance->GlobalData;
>
> @@ -943,10 +958,28 @@ SnpNt32Transmit (
>
> EfiReleaseLock (&GlobalData->Lock);
>
> if (ReturnValue < 0) {
> return EFI_DEVICE_ERROR;
> + } else {
> + if ((GlobalData->MaxRecycledTxBuf +
> SNP_TX_BUFFER_INCREASEMENT) >= SNP_MAX_TX_BUFFER_NUM) {
> + return EFI_NOT_READY;
> + }
> +
> + if (GlobalData->RecycledTxBufCount < GlobalData->MaxRecycledTxBuf) {
> + GlobalData->RecycledTxBuf[GlobalData->RecycledTxBufCount] = (UINT64)
> Buffer;
> + GlobalData->RecycledTxBufCount ++;
> + } else {
> + Tmp = AllocatePool (sizeof (UINT64) * (GlobalData->MaxRecycledTxBuf +
> SNP_TX_BUFFER_INCREASEMENT));
> + if (Tmp == NULL) {
> + return EFI_DEVICE_ERROR;
> + }
> + CopyMem (Tmp, GlobalData->RecycledTxBuf, sizeof (UINT64) *
> GlobalData->RecycledTxBufCount);
> + FreePool (GlobalData->RecycledTxBuf);
> + GlobalData->RecycledTxBuf = Tmp;
> + GlobalData->MaxRecycledTxBuf += SNP_TX_BUFFER_INCREASEMENT;
> + }
> }
>
> return EFI_SUCCESS;
> }
>
> @@ -1081,10 +1114,15 @@ SnpNt32InitializeGlobalData (
> InterfaceCount = MAX_INTERFACE_INFO_NUMBER;
>
> InitializeListHead (&This->InstanceList);
> EfiInitializeLock (&This->Lock, TPL_CALLBACK);
>
> + This->RecycledTxBuf = AllocatePool (sizeof (UINT64) *
> MAX_XMIT_BUFFERS);
> + if (This->RecycledTxBuf == NULL) {
> + return EFI_OUT_OF_RESOURCES;
> + }
> +
> //
> // Get the WinNT thunk
> //
> Status = gBS->LocateProtocol (&gEfiWinNtThunkProtocolGuid, NULL, (VOID
> **)&This->WinNtThunk);
>
> diff --git a/Nt32Pkg/SnpNt32Dxe/SnpNt32.h
> b/Nt32Pkg/SnpNt32Dxe/SnpNt32.h
> index 07f6129..cb95c57 100644
> --- a/Nt32Pkg/SnpNt32Dxe/SnpNt32.h
> +++ b/Nt32Pkg/SnpNt32Dxe/SnpNt32.h
> @@ -1,8 +1,8 @@
> /** @file
>
> -Copyright (c) 2006 - 2007, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2006 - 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
>
> @@ -56,10 +56,16 @@ typedef struct _NT_NET_INTERFACE_INFO {
> #define NET_ETHER_HEADER_SIZE 14
>
> #define MAX_INTERFACE_INFO_NUMBER 16
> #define MAX_FILE_NAME_LENGTH 280
>
> +#define SNP_MAX_TX_BUFFER_NUM 65536
> +#define SNP_TX_BUFFER_INCREASEMENT 32
> +
> +
> +
> +
> //
> // Functions in Net Library
> //
> typedef
> INT32
> @@ -153,10 +159,24 @@ struct _SNPNT32_GLOBAL_DATA {
> NT_NET_UTILITY_TABLE NtNetUtilityTable;
>
> EFI_LOCK Lock;
>
> //
> + // Array of the recycled transmit buffer address.
> + //
> + UINT64 *RecycledTxBuf;
> +
> + //
> + // Current number of recycled buffer pointers in RecycledTxBuf.
> + //
> + UINT32 RecycledTxBufCount;
> +
> + // The maximum number of recycled buffer pointers in RecycledTxBuf.
> + //
> + UINT32 MaxRecycledTxBuf;
> +
> + //
> // Private functions
> //
> SNPNT32_INITIALIZE_GLOBAL_DATA InitializeGlobalData;
> SNPNT32_INITIALIZE_INSTANCE_DATA InitializeInstanceData;
> SNPNT32_CLOSE_INSTANCE CloseInstance;
> --
> 1.9.5.msysgit.1
>
> _______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel