Merge pull request #71 from hzhuang1/fix_usb

Drivers/DwUsb3Dxe: hack an interface for usb transmission size
diff --git a/Drivers/Usb/DwUsb3Dxe/DwUsb3Dxe.c b/Drivers/Usb/DwUsb3Dxe/DwUsb3Dxe.c
index 5ed3dd4..c2fad30 100644
--- a/Drivers/Usb/DwUsb3Dxe/DwUsb3Dxe.c
+++ b/Drivers/Usb/DwUsb3Dxe/DwUsb3Dxe.c
@@ -88,6 +88,7 @@
 #define USB3_STATUS_BUF_SIZE    512
 STATIC UINT8                          *gEndPoint0StatusBuf;
 STATIC USB_DEVICE_RX_CALLBACK         mDataReceivedCallback;
+STATIC UINTN                          mDataBufferSize;
 /*
 	UINT8 ep0_status_buf[USB3_STATUS_BUF_SIZE];
 */
@@ -1755,7 +1756,18 @@
         ASSERT (gRxBuf != NULL);
         WriteBackDataCacheRange (gRxBuf, DATA_SIZE);
         req->bufdma = (UINT64 *)gRxBuf;
-        req->length = DATA_SIZE;
+        if (mDataBufferSize == 0) {
+          req->length = CMD_SIZE;
+        } else if (mDataBufferSize > DATA_SIZE) {
+          req->length = DATA_SIZE;
+          mDataBufferSize = mDataBufferSize - DATA_SIZE;
+        } else if (mDataBufferSize > CMD_SIZE) {
+          req->length = CMD_SIZE;
+          mDataBufferSize = mDataBufferSize - CMD_SIZE;
+        } else {
+          req->length = mDataBufferSize;
+          mDataBufferSize = 0;
+        }
         DwUsb3EndPointXStartTransfer (pcd, ep);
       }
     } else {
@@ -2115,7 +2127,18 @@
       ASSERT (gRxBuf != NULL);
       WriteBackDataCacheRange (gRxBuf, DATA_SIZE);
       req->bufdma = (UINT64 *)gRxBuf;
-      req->length = DATA_SIZE;
+      if (mDataBufferSize == 0) {
+        req->length = CMD_SIZE;
+      } else if (mDataBufferSize > DATA_SIZE) {
+        req->length = DATA_SIZE;
+        mDataBufferSize = mDataBufferSize - DATA_SIZE;
+      } else if (mDataBufferSize > CMD_SIZE) {
+        req->length = CMD_SIZE;
+        mDataBufferSize = mDataBufferSize - CMD_SIZE;
+      } else {
+        req->length = mDataBufferSize;
+        mDataBufferSize = 0;
+      }
       DwUsb3EndPointXStartTransfer (pcd, ep);
     }
   }
@@ -2301,9 +2324,21 @@
   return EFI_SUCCESS;
 }
 
+EFI_STATUS
+DwUsb3Request (
+  IN UINTN   BufferSize
+  )
+{
+  if (BufferSize) {
+    mDataBufferSize = BufferSize;
+  }
+  return EFI_SUCCESS;
+}
+
 USB_DEVICE_PROTOCOL mUsbDevice = {
   DwUsb3Start,
-  DwUsb3Send
+  DwUsb3Send,
+  DwUsb3Request
 };
 
 EFI_STATUS