]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Nt32Pkg/SnpNt32Dxe/SnpNt32.c
UefiCpuPkg: Remove double \r
[mirror_edk2.git] / Nt32Pkg / SnpNt32Dxe / SnpNt32.c
index 13c9fd1b4bc859319ca484380116bf5b307c3292..88c2e22badfab7414b9182d0b6e464bfd349e594 100644 (file)
@@ -1,13 +1,7 @@
 /** @file\r
 \r
-Copyright (c) 2006 - 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 Module Name:\r
 \r
@@ -42,7 +36,7 @@ SNPNT32_GLOBAL_DATA         gSnpNt32GlobalData = {
   {\r
     0,\r
     0,\r
-    0\r
+    EfiLockUninitialized\r
   },                          //  Lock\r
   //\r
   //  Private functions\r
@@ -393,6 +387,9 @@ SNPNT32_INSTANCE_DATA gSnpNt32InstanceTemplate = {
     NULL,\r
     NULL\r
   },                                      //  Entry\r
+  NULL,                                   //  RecycledTxBuf\r
+  0,                                      //  RecycledTxBufCount\r
+  32,                                     //  MaxRecycledTxBuf\r
   NULL,                                   //  GlobalData\r
   NULL,                                   //  DeviceHandle\r
   NULL,                                   //  DevicePath\r
@@ -440,7 +437,7 @@ SNPNT32_INSTANCE_DATA gSnpNt32InstanceTemplate = {
     NET_IFTYPE_ETHERNET,                  //  IfType\r
     FALSE,                                //  MacAddressChangeable\r
     FALSE,                                //  MultipleTxSupported\r
-    FALSE,                                //  MediaPresentSupported\r
+    TRUE,                                 //  MediaPresentSupported\r
     TRUE                                  //  MediaPresent\r
   },\r
   {\r
@@ -704,7 +701,7 @@ SnpNt32ReceiveFilters (
   ReturnValue = GlobalData->NtNetUtilityTable.SetReceiveFilter (\r
                                                 Instance->InterfaceInfo.InterfaceIndex,\r
                                                 EnableBits,\r
-                                                McastFilterCount,\r
+                                                (UINT32)McastFilterCount,\r
                                                 McastFilter\r
                                                 );\r
 \r
@@ -861,9 +858,17 @@ SnpNt32GetStatus (
   OUT VOID                       **TxBuffer\r
   )\r
 {\r
+  SNPNT32_INSTANCE_DATA *Instance;\r
+\r
+  Instance    = SNP_NT32_INSTANCE_DATA_FROM_SNP_THIS (This);\r
 \r
   if (TxBuffer != NULL) {\r
-    *((UINT8 **) TxBuffer) = (UINT8 *) 1;\r
+    if (Instance->RecycledTxBufCount != 0) {\r
+      Instance->RecycledTxBufCount --;\r
+      *((UINT8 **) TxBuffer)    = (UINT8 *) (UINTN)Instance->RecycledTxBuf[Instance->RecycledTxBufCount];\r
+    } else {\r
+      *((UINT8 **) TxBuffer)    = NULL;\r
+    }\r
   }\r
 \r
   if (InterruptStatus != NULL) {\r
@@ -918,6 +923,7 @@ SnpNt32Transmit (
   SNPNT32_INSTANCE_DATA *Instance;\r
   SNPNT32_GLOBAL_DATA   *GlobalData;\r
   INT32                 ReturnValue;\r
+  UINT64                *Tmp;\r
 \r
   Instance    = SNP_NT32_INSTANCE_DATA_FROM_SNP_THIS (This);\r
 \r
@@ -933,8 +939,8 @@ SnpNt32Transmit (
 \r
   ReturnValue = GlobalData->NtNetUtilityTable.Transmit (\r
                                                 Instance->InterfaceInfo.InterfaceIndex,\r
-                                                HeaderSize,\r
-                                                BufferSize,\r
+                                                (UINT32)HeaderSize,\r
+                                                (UINT32)BufferSize,\r
                                                 Buffer,\r
                                                 SrcAddr,\r
                                                 DestAddr,\r
@@ -945,6 +951,24 @@ SnpNt32Transmit (
 \r
   if (ReturnValue < 0) {\r
     return EFI_DEVICE_ERROR;\r
+  } else {\r
+    if ((Instance->MaxRecycledTxBuf + SNP_TX_BUFFER_INCREASEMENT) >= SNP_MAX_TX_BUFFER_NUM) {\r
+      return EFI_NOT_READY;\r
+    }\r
+\r
+    if (Instance->RecycledTxBufCount < Instance->MaxRecycledTxBuf) {\r
+      Instance->RecycledTxBuf[Instance->RecycledTxBufCount] = (UINT64) Buffer;\r
+      Instance->RecycledTxBufCount ++;\r
+    } else {\r
+      Tmp = AllocatePool (sizeof (UINT64) * (Instance->MaxRecycledTxBuf + SNP_TX_BUFFER_INCREASEMENT));\r
+      if (Tmp == NULL) {\r
+        return EFI_DEVICE_ERROR;\r
+      }\r
+      CopyMem (Tmp, Instance->RecycledTxBuf, sizeof (UINT64) * Instance->RecycledTxBufCount);\r
+      FreePool (Instance->RecycledTxBuf);\r
+      Instance->RecycledTxBuf    =  Tmp;\r
+      Instance->MaxRecycledTxBuf += SNP_TX_BUFFER_INCREASEMENT;\r
+    }\r
   }\r
 \r
   return EFI_SUCCESS;\r
@@ -995,6 +1019,9 @@ SnpNt32Receive (
   SNPNT32_INSTANCE_DATA *Instance;\r
   SNPNT32_GLOBAL_DATA   *GlobalData;\r
   INT32                 ReturnValue;\r
+  UINTN                 BufSize;\r
+  \r
+  BufSize     = *BuffSize;\r
 \r
   Instance    = SNP_NT32_INSTANCE_DATA_FROM_SNP_THIS (This);\r
 \r
@@ -1042,7 +1069,7 @@ SnpNt32Receive (
     *Protocol = NTOHS (*((UINT16 *) (((UINT8 *) Buffer) + 12)));\r
   }\r
 \r
-  return EFI_SUCCESS;\r
+  return (*BuffSize <= BufSize) ? EFI_SUCCESS : EFI_BUFFER_TOO_SMALL; \r
 }\r
 \r
 /**\r
@@ -1083,7 +1110,7 @@ SnpNt32InitializeGlobalData (
   //\r
   //  Get the WinNT thunk\r
   //\r
-  Status = gBS->LocateProtocol (&gEfiWinNtThunkProtocolGuid, NULL, &This->WinNtThunk);\r
+  Status = gBS->LocateProtocol (&gEfiWinNtThunkProtocolGuid, NULL, (VOID **)&This->WinNtThunk);\r
 \r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
@@ -1172,7 +1199,7 @@ SnpNt32InitializeGlobalData (
   //\r
   for (Index = 0; Index < InterfaceCount; Index++) {\r
 \r
-    Instance = AllocatePool (sizeof (SNPNT32_INSTANCE_DATA));\r
+    Instance = AllocateZeroPool (sizeof (SNPNT32_INSTANCE_DATA));\r
 \r
     if (NULL == Instance) {\r
       Status = EFI_OUT_OF_RESOURCES;\r
@@ -1183,10 +1210,18 @@ SnpNt32InitializeGlobalData (
     //\r
     CopyMem (Instance, &gSnpNt32InstanceTemplate, sizeof (SNPNT32_INSTANCE_DATA));\r
 \r
+    //\r
+    // Allocate the RecycledTxBuf.\r
+    //\r
+    Instance->RecycledTxBuf = AllocatePool (sizeof (UINT64) * Instance->MaxRecycledTxBuf);\r
+    if (Instance->RecycledTxBuf == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+\r
     //\r
     //  Set the interface information.\r
     //\r
-    Instance->InterfaceInfo = NetInterfaceInfoBuffer[Index];\r
+    CopyMem (&Instance->InterfaceInfo, &NetInterfaceInfoBuffer[Index], sizeof(Instance->InterfaceInfo));\r
     //\r
     //  Initialize this instance\r
     //\r
@@ -1262,8 +1297,8 @@ SnpNt32InitializeInstanceData (
   //\r
   //  Copy Current/PermanentAddress MAC address\r
   //\r
-  Instance->Mode.CurrentAddress   = Instance->InterfaceInfo.MacAddr;\r
-  Instance->Mode.PermanentAddress = Instance->InterfaceInfo.MacAddr;\r
+  CopyMem (&Instance->Mode.CurrentAddress, &Instance->InterfaceInfo.MacAddr, sizeof(Instance->Mode.CurrentAddress));\r
+  CopyMem (&Instance->Mode.PermanentAddress, &Instance->InterfaceInfo.MacAddr, sizeof(Instance->Mode.PermanentAddress));\r
 \r
   //\r
   //  Since the fake SNP is based on a real NIC, to avoid conflict with the host\r
@@ -1284,7 +1319,7 @@ SnpNt32InitializeInstanceData (
   CopyMem (\r
     &Node.MacAddr.MacAddress,\r
     &Instance->Mode.CurrentAddress,\r
-    sizeof (EFI_MAC_ADDRESS)\r
+    NET_ETHER_ADDR_LEN\r
     );\r
 \r
   Node.MacAddr.IfType = Instance->Mode.IfType;\r