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

