+ tAsyncOp *op;
+ tUSBHost *host;
+
+ ENTER("pDev iEndpoint iLength pDataBuf", Dev, Endpoint, Length, DataBuf);
+
+ op = malloc(sizeof(*op));
+ op->Next = NULL;
+ op->Endpt = &Dev->Endpoints[Endpoint-1];
+ op->Length = Length;
+ op->Data = DataBuf;
+
+ // TODO: Handle transfers that are larger than one packet
+
+ host = Dev->Dev->Host;
+ LOG("IN from %p %i:%i", host->Ptr, Dev->Dev->Address, op->Endpt->EndpointNum);
+ host->HostDef->SendIN(
+ host->Ptr, Dev->Dev->Address, op->Endpt->EndpointNum,
+ 0, USB_AsyncCallback, op,
+ DataBuf, Length
+ );
+
+ LEAVE('-');
+
+// Log_Warning("USB", "TODO: Implement USB_RecvDataA");
+}
+
+void USB_AsyncCallback(void *Ptr, void *Buf, int Length)
+{
+ tAsyncOp *op = Ptr;
+ op->Length = Length;
+ LOG("adding %p to work queue", op);
+ Workqueue_AddWork(&gUSB_AsyncQueue, op);