]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/Ax88772.c
Ax88772: Add logic to separate packet, fix MTU issue. Ax88772b: Fix driver model...
[mirror_edk2.git] / OptionRomPkg / Bus / Usb / UsbNetworking / Ax88772 / Ax88772.c
index 746a509b79afcce36dfa68bc42565fd4024bb676..dd18a957b86eea466d2274fc673ec6adfef68b98 100644 (file)
@@ -656,6 +656,78 @@ Ax88772Reset (
 }\r
 \r
 \r
+VOID \r
+FillPkt2Queue (\r
+  IN NIC_DEVICE * pNicDevice,\r
+  IN UINTN BufLength)\r
+{\r
+\r
+  UINT16 * pLength;\r
+  UINT16 * pLengthBar;\r
+  UINT8* pData;\r
+  UINT32 offset;\r
+  RX_TX_PACKET * pRxPacket;\r
+  UINTN LengthInBytes;\r
+  EFI_STATUS Status;\r
+  \r
+  for ( offset = 0; offset < BufLength; ){\r
+    pLength = (UINT16*) (pNicDevice->pBulkInBuff + offset);\r
+    pLengthBar = (UINT16*) (pNicDevice->pBulkInBuff + offset +2);\r
+    \r
+    *pLength &= 0x7ff;\r
+    *pLengthBar &= 0x7ff;\r
+    *pLengthBar |= 0xf800;\r
+      \r
+    if ((*pLength ^ *pLengthBar ) != 0xFFFF) {\r
+      DEBUG (( EFI_D_ERROR , "Pkt length error. BufLength = %d\n", BufLength));\r
+      return;\r
+    }\r
+      \r
+    pRxPacket = pNicDevice->pRxFree;\r
+    LengthInBytes = sizeof ( *pRxPacket ) - sizeof ( pRxPacket->pNext );\r
+    if ( NULL == pRxPacket ) {\r
+      Status = gBS->AllocatePool ( EfiRuntimeServicesData,\r
+                                   sizeof( RX_TX_PACKET ),\r
+                                   (VOID **) &pRxPacket );\r
+      if ( !EFI_ERROR ( Status )) {\r
+        //\r
+        //  Add this packet to the free packet list\r
+        //\r
+        pNicDevice->pRxFree = pRxPacket;\r
+        pRxPacket->pNext = NULL;\r
+      }\r
+      else {\r
+        //\r
+        //  Use the discard packet buffer\r
+        //\r
+        //pRxPacket = &Packet;\r
+      }\r
+    }\r
+      \r
+\r
+    pData = pNicDevice->pBulkInBuff + offset + 4;\r
+    pRxPacket->Length = *pLength;\r
+    pRxPacket->LengthBar = *(UINT16*) (pNicDevice->pBulkInBuff + offset +2);\r
+    CopyMem (&pRxPacket->Data[0], pData, *pLength);\r
+    //DEBUG((DEBUG_INFO, "Packet [%d]\n", *pLength));\r
+    \r
+    pNicDevice->pRxFree = pRxPacket->pNext;\r
+    pRxPacket->pNext = NULL;\r
+    \r
+    if ( NULL == pNicDevice->pRxTail ) {\r
+      pNicDevice->pRxHead = pRxPacket;\r
+    }\r
+    else {\r
+      pNicDevice->pRxTail->pNext = pRxPacket;\r
+    }\r
+    pNicDevice->pRxTail = pRxPacket;\r
+    offset += (*pLength + 4);\r
+              \r
+  }\r
+}\r
+\r
+\r
+\r
 /**\r
   Receive a frame from the network.\r
 \r
@@ -760,10 +832,10 @@ Ax88772Rx (
     //  Locate a packet for use\r
     //\r
     pRxPacket = pNicDevice->pRxFree;\r
-    LengthInBytes = sizeof ( *pRxPacket ) - sizeof ( pRxPacket->pNext );\r
+    LengthInBytes = MAX_BULKIN_SIZE;\r
     if ( NULL == pRxPacket ) {\r
       Status = gBS->AllocatePool ( EfiRuntimeServicesData,\r
-                                   LengthInBytes,\r
+                                   sizeof ( *pRxPacket ),\r
                                    (VOID **) &pRxPacket );\r
       if ( !EFI_ERROR ( Status )) {\r
         //\r
@@ -783,16 +855,22 @@ Ax88772Rx (
     //\r
     //  Attempt to receive a packet\r
     //\r
+    SetMem (&pNicDevice->pBulkInBuff[0], MAX_BULKIN_SIZE, 0);\r
     pUsbIo = pNicDevice->pUsbIo;\r
     Status = pUsbIo->UsbBulkTransfer ( pUsbIo,\r
                                        USB_ENDPOINT_DIR_IN | BULK_IN_ENDPOINT,\r
-                                       &pRxPacket->Length,\r
+                                       &pNicDevice->pBulkInBuff[0],\r
                                        &LengthInBytes,\r
                                        2,\r
                                        &TransferStatus );\r
+    if ( LengthInBytes > 0 ) {\r
+      FillPkt2Queue(pNicDevice, LengthInBytes);\r
+    }\r
+    pRxPacket = pNicDevice->pRxHead;\r
     if (( !EFI_ERROR ( Status ))\r
       && ( 0 < pRxPacket->Length )\r
-      && ( pRxPacket->Length <= sizeof ( pRxPacket->Data ))) {\r
+      && ( pRxPacket->Length <= sizeof ( pRxPacket->Data ))\r
+      && ( LengthInBytes > 0)) {\r
 \r
       //\r
       //  Determine if the packet should be received\r
@@ -869,22 +947,6 @@ Ax88772Rx (
                     LengthInBytes ));\r
         }\r
         \r
-        //\r
-        //  Remove this packet from the free packet list\r
-        //\r
-        pNicDevice->pRxFree = pRxPacket->pNext;\r
-        pRxPacket->pNext = NULL;\r
-\r
-        //\r
-        //  Append this packet to the receive list\r
-        //\r
-        if ( NULL == pNicDevice->pRxTail ) {\r
-          pNicDevice->pRxHead = pRxPacket;\r
-        }\r
-        else {\r
-          pNicDevice->pRxTail->pNext = pRxPacket;\r
-        }\r
-        pNicDevice->pRxTail = pRxPacket;\r
       }\r
       else {\r
         //\r