]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/SimpleNetwork.c
Ax88772: Add logic to separate packet, fix MTU issue. Ax88772b: Fix driver model...
[mirror_edk2.git] / OptionRomPkg / Bus / Usb / UsbNetworking / Ax88772b / SimpleNetwork.c
index be751618351ba4d90d50beb02664672f3a401f84..9eeb61f87be34acf5579004d2d7151486af827ad 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Provides the Simple Network functions.\r
 \r
-  Copyright (c) 2011, Intel Corporation\r
+  Copyright (c) 2011 - 2013, 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
@@ -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
@@ -852,7 +874,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 +1175,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 +1208,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 +1281,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 +1508,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