]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/SimpleNetwork.c
OptionRomPkg: Fix typos in comments
[mirror_edk2.git] / OptionRomPkg / Bus / Usb / UsbNetworking / Ax88772b / SimpleNetwork.c
index be751618351ba4d90d50beb02664672f3a401f84..cee028c94ce4590f32411fd0286595e151dd076b 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Provides the Simple Network functions.\r
 \r
-  Copyright (c) 2011, Intel Corporation\r
+  Copyright (c) 2011 - 2016, 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
@@ -203,7 +203,12 @@ SN_GetStatus (
       Status = EFI_SUCCESS;\r
     }\r
     else {\r
-      Status = EFI_NOT_STARTED;\r
+      if ( EfiSimpleNetworkStarted == pMode->State ) {\r
+        Status = EFI_DEVICE_ERROR;\r
+      }\r
+      else {\r
+        Status = EFI_NOT_STARTED;\r
+      }\r
     }\r
       \r
   }\r
@@ -228,7 +233,7 @@ SN_GetStatus (
 \r
   @retval EFI_SUCCESS           This operation was successful.\r
   @retval EFI_NOT_STARTED       The network interface was not started.\r
-  @retval EFI_OUT_OF_RESORUCES  There was not enough memory for the transmit and receive buffers\r
+  @retval EFI_OUT_OF_RESOURCES  There was not enough memory for the transmit and receive buffers\r
   @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid\r
                                 EFI_SIMPLE_NETWORK_PROTOCOL structure.\r
   @retval EFI_DEVICE_ERROR      The command could not be sent to the network interface.\r
@@ -317,7 +322,7 @@ SN_MCastIPtoMAC (
   IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,\r
   IN BOOLEAN bIPv6,\r
   IN EFI_IP_ADDRESS * pIP,\r
-  IN EFI_MAC_ADDRESS * pMAC\r
+  OUT EFI_MAC_ADDRESS * pMAC\r
   )\r
 {\r
   EFI_STATUS Status;\r
@@ -349,13 +354,22 @@ SN_MCastIPtoMAC (
         return EFI_INVALID_PARAMETER;\r
       }\r
       else {\r
-        pMAC->Addr[0] = 0x01;\r
-        pMAC->Addr[1] = 0x00;\r
-        pMAC->Addr[2] = 0x5e;\r
-        pMAC->Addr[3] = (UINT8) (pIP->v4.Addr[1] & 0x7f);\r
-        pMAC->Addr[4] = (UINT8) pIP->v4.Addr[2];\r
-        pMAC->Addr[5] = (UINT8) pIP->v4.Addr[3];\r
-        Status = EFI_SUCCESS;\r
+        if (pSimpleNetwork->Mode->State == EfiSimpleNetworkInitialized)\r
+        {\r
+          pMAC->Addr[0] = 0x01;\r
+          pMAC->Addr[1] = 0x00;\r
+          pMAC->Addr[2] = 0x5e;\r
+          pMAC->Addr[3] = (UINT8) (pIP->v4.Addr[1] & 0x7f);\r
+          pMAC->Addr[4] = (UINT8) pIP->v4.Addr[2];\r
+          pMAC->Addr[5] = (UINT8) pIP->v4.Addr[3];\r
+          Status = EFI_SUCCESS;\r
+        }\r
+        else if (pSimpleNetwork->Mode->State == EfiSimpleNetworkStarted) {\r
+          Status = EFI_DEVICE_ERROR;\r
+        }\r
+        else {\r
+          Status = EFI_NOT_STARTED;\r
+        }\r
         gBS->RestoreTPL(TplPrevious);\r
       }\r
   }\r
@@ -471,7 +485,10 @@ SN_Receive (
   //\r
   // Verify the parameters\r
   //\r
-  if (( NULL != pSimpleNetwork ) && ( NULL != pSimpleNetwork->Mode )) {\r
+  if (( NULL != pSimpleNetwork ) && \r
+    ( NULL != pSimpleNetwork->Mode ) && \r
+    (NULL != pBufferSize) && \r
+    (NULL != pBuffer)) {\r
     //\r
     // The interface must be running\r
     //\r
@@ -576,7 +593,12 @@ SN_Receive (
       \r
     }\r
     else {\r
-      Status = EFI_NOT_STARTED;\r
+      if (EfiSimpleNetworkStarted == pMode->State) {\r
+        Status = EFI_DEVICE_ERROR;\r
+      }\r
+      else {\r
+        Status = EFI_NOT_STARTED;\r
+      }\r
     }\r
   }\r
   else {\r
@@ -678,10 +700,8 @@ SN_ReceiveFilters (
   EFI_SIMPLE_NETWORK_MODE * pMode;\r
   EFI_STATUS Status = EFI_SUCCESS;   \r
   EFI_TPL TplPrevious; \r
-  NIC_DEVICE * pNicDevice;\r
 \r
   TplPrevious = gBS->RaiseTPL(TPL_CALLBACK);\r
-  pNicDevice = DEV_FROM_SIMPLE_NETWORK ( pSimpleNetwork );\r
   pMode = pSimpleNetwork->Mode;\r
 \r
   if (pSimpleNetwork == NULL) {\r
@@ -852,7 +872,12 @@ SN_Reset (
                }\r
        }\r
        else {\r
-               Status = EFI_NOT_STARTED;\r
+      if (EfiSimpleNetworkStarted == pMode->State) {\r
+        Status = EFI_DEVICE_ERROR;\r
+      }\r
+      else {\r
+        Status = EFI_NOT_STARTED;\r
+      }\r
        }  \r
   }\r
   else {\r
@@ -1148,13 +1173,13 @@ SN_StationAddress (
   //\r
   if (( NULL != pSimpleNetwork )\r
     && ( NULL != pSimpleNetwork->Mode )\r
-    && (( !bReset ) || ( bReset && ( NULL != pNew )))) {\r
+    && (( bReset ) || ( ( !bReset) && ( NULL != pNew )))) {\r
     //\r
     // Verify that the adapter is already started\r
     //\r
     pNicDevice = DEV_FROM_SIMPLE_NETWORK ( pSimpleNetwork );\r
     pMode = pSimpleNetwork->Mode;\r
-    if ( EfiSimpleNetworkStarted == pMode->State ) {\r
+    if ( EfiSimpleNetworkInitialized == pMode->State ) {\r
       //\r
       // Determine the adapter MAC address\r
       //\r
@@ -1181,7 +1206,12 @@ SN_StationAddress (
       Status = Ax88772MacAddressSet ( pNicDevice, &pMode->CurrentAddress.Addr[0]);\r
     }\r
     else {\r
-      Status = EFI_NOT_STARTED;\r
+      if (EfiSimpleNetworkStarted == pMode->State) {\r
+        Status = EFI_DEVICE_ERROR;\r
+      }\r
+      else {\r
+        Status = EFI_NOT_STARTED;\r
+      }\r
     }\r
   }\r
   else {\r
@@ -1249,8 +1279,43 @@ SN_Statistics (
   )\r
 {\r
   EFI_STATUS Status;\r
-\r
-  Status = EFI_UNSUPPORTED;\r
+  EFI_SIMPLE_NETWORK_MODE * pMode;\r
+  //\r
+  // Verify the prarameters\r
+  //\r
+  if (( NULL != pSimpleNetwork ) && ( NULL != pSimpleNetwork->Mode )) {\r
+    pMode = pSimpleNetwork->Mode;\r
+    //\r
+    // Determine if the interface is started \r
+    //\r
+    if (EfiSimpleNetworkInitialized == pMode->State){\r
+      //\r
+      // Determine if the StatisticsSize is big enough\r
+      //\r
+      if (sizeof (EFI_NETWORK_STATISTICS) <= *pStatisticsSize){\r
+        if (bReset) {\r
+          Status = EFI_SUCCESS;\r
+        } \r
+        else {\r
+          Status = EFI_UNSUPPORTED;\r
+        }\r
+      }\r
+      else {\r
+        Status = EFI_BUFFER_TOO_SMALL;\r
+      }\r
+    }\r
+    else{\r
+      if (EfiSimpleNetworkStarted == pMode->State) {\r
+        Status = EFI_DEVICE_ERROR;\r
+      }\r
+      else {\r
+        Status = EFI_NOT_STARTED;\r
+      }\r
+    }\r
+  }\r
+  else {\r
+       Status = EFI_INVALID_PARAMETER;\r
+  }\r
 \r
   return Status;\r
 }\r
@@ -1441,127 +1506,151 @@ SN_Transmit (
 \r
   // Verify the parameters\r
   //\r
-  if (( NULL != pSimpleNetwork ) && ( NULL != pSimpleNetwork->Mode )) {\r
+  if (( NULL != pSimpleNetwork ) && \r
+      ( NULL != pSimpleNetwork->Mode ) && \r
+      ( NULL != pBuffer) && \r
+      ( (HeaderSize == 0) || ( (NULL != pDestAddr) && (NULL != pProtocol) ))) {\r
     //\r
     // The interface must be running\r
     //\r
     pMode = pSimpleNetwork->Mode;\r
-    if ( EfiSimpleNetworkInitialized == pMode->State ) {\r
+    //\r
+    // Verify parameter of HeaderSize\r
+    //\r
+    if ((HeaderSize == 0) || (HeaderSize == pMode->MediaHeaderSize)){\r
       //\r
-      // Update the link status\r
+      // Determine if BufferSize is big enough\r
       //\r
-      pNicDevice = DEV_FROM_SIMPLE_NETWORK ( pSimpleNetwork );\r
-      pMode->MediaPresent = pNicDevice->bLinkUp;\r
+      if (BufferSize >= pMode->MediaHeaderSize){\r
+        if ( EfiSimpleNetworkInitialized == pMode->State ) {\r
+          //\r
+          // Update the link status\r
+          //\r
+          pNicDevice = DEV_FROM_SIMPLE_NETWORK ( pSimpleNetwork );\r
+          pMode->MediaPresent = pNicDevice->bLinkUp;\r
 \r
-      //\r
-      //  Release the synchronization with Ax88772Timer\r
-      //      \r
-      if ( pMode->MediaPresent && pNicDevice->bComplete) {\r
-        //\r
-        //  Copy the packet into the USB buffer\r
-        //\r
+          //\r
+          //  Release the synchronization with Ax88772Timer\r
+          //      \r
+          if ( pMode->MediaPresent && pNicDevice->bComplete) {\r
+            //\r
+            //  Copy the packet into the USB buffer\r
+            //\r
 \r
-        CopyMem ( &pNicDevice->pTxTest->Data[0], pBuffer, BufferSize ); \r
-        pNicDevice->pTxTest->Length = (UINT16) BufferSize;\r
+            CopyMem ( &pNicDevice->pTxTest->Data[0], pBuffer, BufferSize ); \r
+            pNicDevice->pTxTest->Length = (UINT16) BufferSize;\r
 \r
-        //\r
-        //  Transmit the packet\r
-        //\r
-        pHeader = (ETHERNET_HEADER *) &pNicDevice->pTxTest->Data[0];\r
-        if ( 0 != HeaderSize ) {\r
-          if ( NULL != pDestAddr ) {\r
-            CopyMem ( &pHeader->dest_addr, pDestAddr, PXE_HWADDR_LEN_ETHER );\r
-          }\r
-          if ( NULL != pSrcAddr ) {\r
-            CopyMem ( &pHeader->src_addr, pSrcAddr, PXE_HWADDR_LEN_ETHER );\r
-          }\r
-          else {\r
-            CopyMem ( &pHeader->src_addr, &pMode->CurrentAddress.Addr[0], PXE_HWADDR_LEN_ETHER );\r
-          }\r
-          if ( NULL != pProtocol ) {\r
-            Type = *pProtocol;\r
+            //\r
+            //  Transmit the packet\r
+            //\r
+            pHeader = (ETHERNET_HEADER *) &pNicDevice->pTxTest->Data[0];\r
+            if ( 0 != HeaderSize ) {\r
+              if ( NULL != pDestAddr ) {\r
+                CopyMem ( &pHeader->dest_addr, pDestAddr, PXE_HWADDR_LEN_ETHER );\r
+              }\r
+              if ( NULL != pSrcAddr ) {\r
+                CopyMem ( &pHeader->src_addr, pSrcAddr, PXE_HWADDR_LEN_ETHER );\r
+              }\r
+              else {\r
+                CopyMem ( &pHeader->src_addr, &pMode->CurrentAddress.Addr[0], PXE_HWADDR_LEN_ETHER );\r
+              }\r
+              if ( NULL != pProtocol ) {\r
+                Type = *pProtocol;\r
+              }\r
+              else {\r
+                Type = pNicDevice->pTxTest->Length;\r
+              }\r
+              Type = (UINT16)(( Type >> 8 ) | ( Type << 8 ));\r
+              pHeader->type = Type;\r
+            }\r
+            if ( pNicDevice->pTxTest->Length < MIN_ETHERNET_PKT_SIZE ) {\r
+              pNicDevice->pTxTest->Length = MIN_ETHERNET_PKT_SIZE;\r
+              ZeroMem ( &pNicDevice->pTxTest->Data[ BufferSize ],\r
+                        pNicDevice->pTxTest->Length - BufferSize );\r
+            }\r
+        \r
+            DEBUG ((EFI_D_INFO, "TX: %02x-%02x-%02x-%02x-%02x-%02x  %02x-%02x-%02x-%02x-%02x-%02x"\r
+                      "  %02x-%02x  %d bytes\r\n",\r
+                      pNicDevice->pTxTest->Data[0],\r
+                      pNicDevice->pTxTest->Data[1],\r
+                      pNicDevice->pTxTest->Data[2],\r
+                      pNicDevice->pTxTest->Data[3],\r
+                      pNicDevice->pTxTest->Data[4],\r
+                      pNicDevice->pTxTest->Data[5],\r
+                      pNicDevice->pTxTest->Data[6],\r
+                      pNicDevice->pTxTest->Data[7],\r
+                      pNicDevice->pTxTest->Data[8],\r
+                      pNicDevice->pTxTest->Data[9],\r
+                      pNicDevice->pTxTest->Data[10],\r
+                      pNicDevice->pTxTest->Data[11],\r
+                      pNicDevice->pTxTest->Data[12],\r
+                      pNicDevice->pTxTest->Data[13],\r
+                      pNicDevice->pTxTest->Length ));\r
+\r
+            pNicDevice->pTxTest->LengthBar = ~(pNicDevice->pTxTest->Length);\r
+            TransferLength = sizeof ( pNicDevice->pTxTest->Length )\r
+                           + sizeof ( pNicDevice->pTxTest->LengthBar )\r
+                           + pNicDevice->pTxTest->Length;\r
+                           \r
+            if (TransferLength % 512 == 0 || TransferLength % 1024 == 0)\r
+                TransferLength +=4;\r
+\r
+            //\r
+            //  Work around USB bus driver bug where a timeout set by receive\r
+            //  succeeds but the timeout expires immediately after, causing the\r
+            //  transmit operation to timeout.\r
+            //\r
+            pUsbIo = pNicDevice->pUsbIo;\r
+            Status = pUsbIo->UsbBulkTransfer ( pUsbIo,\r
+                                               BULK_OUT_ENDPOINT,\r
+                                               &pNicDevice->pTxTest->Length,\r
+                                               &TransferLength,\r
+                                               0xfffffffe, \r
+                                               &TransferStatus );\r
+            if ( !EFI_ERROR ( Status )) {\r
+              Status = TransferStatus;\r
+            }\r
+\r
+            if ( !EFI_ERROR ( Status )) {\r
+              pNicDevice->pTxBuffer = pBuffer;\r
+            }\r
+            else {\r
+              if ((TransferLength != (UINTN)( pNicDevice->pTxTest->Length + 4 )) &&\r
+                   (TransferLength != (UINTN)(( pNicDevice->pTxTest->Length + 4 ) + 4))) {\r
+                DEBUG ((EFI_D_INFO, "TransferLength didn't match Packet Length\n"));\r
+              }\r
+              //\r
+              //  Reset the controller to fix the error\r
+              //\r
+              if ( EFI_DEVICE_ERROR == Status ) {\r
+                SN_Reset ( pSimpleNetwork, FALSE );\r
+              }\r
+              Status = EFI_NOT_READY;\r
+            }\r
           }\r
           else {\r
-            Type = pNicDevice->pTxTest->Length;\r
+            //\r
+            // No packets available.\r
+            //\r
+            Status = EFI_NOT_READY;\r
           }\r
-          Type = (UINT16)(( Type >> 8 ) | ( Type << 8 ));\r
-          pHeader->type = Type;\r
-        }\r
-        if ( pNicDevice->pTxTest->Length < MIN_ETHERNET_PKT_SIZE ) {\r
-          pNicDevice->pTxTest->Length = MIN_ETHERNET_PKT_SIZE;\r
-          ZeroMem ( &pNicDevice->pTxTest->Data[ BufferSize ],\r
-                    pNicDevice->pTxTest->Length - BufferSize );\r
-        }\r
-    \r
-        DEBUG ((EFI_D_INFO, "TX: %02x-%02x-%02x-%02x-%02x-%02x  %02x-%02x-%02x-%02x-%02x-%02x"\r
-                  "  %02x-%02x  %d bytes\r\n",\r
-                  pNicDevice->pTxTest->Data[0],\r
-                  pNicDevice->pTxTest->Data[1],\r
-                  pNicDevice->pTxTest->Data[2],\r
-                  pNicDevice->pTxTest->Data[3],\r
-                  pNicDevice->pTxTest->Data[4],\r
-                  pNicDevice->pTxTest->Data[5],\r
-                  pNicDevice->pTxTest->Data[6],\r
-                  pNicDevice->pTxTest->Data[7],\r
-                  pNicDevice->pTxTest->Data[8],\r
-                  pNicDevice->pTxTest->Data[9],\r
-                  pNicDevice->pTxTest->Data[10],\r
-                  pNicDevice->pTxTest->Data[11],\r
-                  pNicDevice->pTxTest->Data[12],\r
-                  pNicDevice->pTxTest->Data[13],\r
-                  pNicDevice->pTxTest->Length ));\r
-\r
-        pNicDevice->pTxTest->LengthBar = ~(pNicDevice->pTxTest->Length);\r
-        TransferLength = sizeof ( pNicDevice->pTxTest->Length )\r
-                       + sizeof ( pNicDevice->pTxTest->LengthBar )\r
-                       + pNicDevice->pTxTest->Length;\r
-                       \r
-        if (TransferLength % 512 == 0 || TransferLength % 1024 == 0)\r
-            TransferLength +=4;\r
-\r
-        //\r
-        //  Work around USB bus driver bug where a timeout set by receive\r
-        //  succeeds but the timeout expires immediately after, causing the\r
-        //  transmit operation to timeout.\r
-        //\r
-        pUsbIo = pNicDevice->pUsbIo;\r
-        Status = pUsbIo->UsbBulkTransfer ( pUsbIo,\r
-                                           BULK_OUT_ENDPOINT,\r
-                                           &pNicDevice->pTxTest->Length,\r
-                                           &TransferLength,\r
-                                           0xfffffffe, \r
-                                           &TransferStatus );\r
-        if ( !EFI_ERROR ( Status )) {\r
-          Status = TransferStatus;\r
-        }\r
-\r
-        if ( !EFI_ERROR ( Status )) {\r
-          pNicDevice->pTxBuffer = pBuffer;\r
+          \r
         }\r
         else {\r
-          if ((TransferLength != (UINTN)( pNicDevice->pTxTest->Length + 4 )) &&\r
-               (TransferLength != (UINTN)(( pNicDevice->pTxTest->Length + 4 ) + 4))) {\r
-            DEBUG ((EFI_D_INFO, "TransferLength didn't match Packet Length\n"));\r
+          if (EfiSimpleNetworkStarted == pMode->State) {\r
+            Status = EFI_DEVICE_ERROR;\r
           }\r
-          //\r
-          //  Reset the controller to fix the error\r
-          //\r
-          if ( EFI_DEVICE_ERROR == Status ) {\r
-                SN_Reset ( pSimpleNetwork, FALSE );\r
+          else {\r
+            Status = EFI_NOT_STARTED ;\r
           }\r
-          Status = EFI_NOT_READY;\r
         }\r
       }\r
       else {\r
-        //\r
-        // No packets available.\r
-        //\r
-        Status = EFI_NOT_READY;\r
+        Status = EFI_BUFFER_TOO_SMALL;\r
       }\r
-      \r
     }\r
     else {\r
-      Status = EFI_NOT_STARTED ;\r
+      Status = EFI_INVALID_PARAMETER;\r
     }\r
   }\r
   else {\r