X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FModules%2FUSB%2FCore%2Fusb_poll.c;h=27f4728e88983550f962b94b505c9e9ecabfe88d;hb=f7ec06bee2b80613d80c314bf864c69209d09829;hp=d1cbaa9324da323dc99567b216df0d2bc5d86e1d;hpb=3bcfc9ded1d44d1fbec95f73b5894e26f498b73d;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/USB/Core/usb_poll.c b/KernelLand/Modules/USB/Core/usb_poll.c index d1cbaa93..27f4728e 100644 --- a/KernelLand/Modules/USB/Core/usb_poll.c +++ b/KernelLand/Modules/USB/Core/usb_poll.c @@ -9,10 +9,7 @@ #include #include "usb.h" #include - -#define POLL_ATOM 25 // 25ms atom -#define POLL_MAX 256 // Max period that can be nominated -#define POLL_SLOTS ((int)(POLL_MAX/POLL_ATOM)) +#include "usb_async.h" // === IMPORTS === extern tUSBHost *gUSB_Hosts; @@ -25,9 +22,20 @@ void USB_StartPollingEndpoint(tUSBInterface *Iface, int Endpoint); // === CODE === void USB_int_PollCallback(void *Ptr, void *Data, size_t Length) { + tAsyncOp *op; tUSBEndpoint *ep = Ptr; - ep->Interface->Driver->Endpoints[ep->EndpointIdx].DataAvail(ep->Interface, ep->EndpointIdx, Length, Data); + op = malloc(sizeof(*op)); + + op->Next = NULL; + op->Endpt = ep; + op->Length = Length; + op->Data = ep->InputData; + + LOG("op %p, endpoint %p (0x%x)", op, ep, + ep->Interface->Dev->Address * 16 + ep->EndpointNum); + + Workqueue_AddWork(&gUSB_AsyncQueue, op); } void USB_StartPollingEndpoint(tUSBInterface *Iface, int Endpoint) @@ -35,24 +43,27 @@ void USB_StartPollingEndpoint(tUSBInterface *Iface, int Endpoint) tUSBEndpoint *endpt; ENTER("pIface iEndpoint", Iface, Endpoint); - LEAVE('-'); // Some sanity checks - if(Endpoint <= 0 || Endpoint > Iface->nEndpoints) + if(Endpoint <= 0 || Endpoint > Iface->nEndpoints) { + LEAVE('-'); return ; + } endpt = &Iface->Endpoints[Endpoint-1]; LOG("endpt(%p)->PollingPeriod = %i", endpt, endpt->PollingPeriod); - if(endpt->PollingPeriod > POLL_MAX || endpt->PollingPeriod <= 0) + if(endpt->PollingPeriod > 256 || endpt->PollingPeriod <= 0) { + LOG("Invalid polling period"); + LEAVE('-'); return ; + } // TODO: Check that this endpoint isn't already on the queue endpt->InputData = malloc(endpt->MaxPacketSize); - - Iface->Dev->Host->HostDef->InterruptIN( - Iface->Dev->Host->Ptr, - Iface->Dev->Address * 16 + endpt->EndpointNum, - endpt->PollingPeriod, + LOG("Polling 0x%x at %i ms", Iface->Dev->Address * 16 + endpt->EndpointNum, endpt->PollingPeriod); + Iface->Dev->Host->HostDef->InitInterrupt( + Iface->Dev->Host->Ptr, Iface->Dev->Address * 16 + endpt->EndpointNum, + 0, endpt->PollingPeriod, USB_int_PollCallback, endpt, endpt->InputData, endpt->MaxPacketSize ); @@ -70,10 +81,12 @@ int USB_PollThread(void *unused) // Check hosts for( tUSBHost *host = gUSB_Hosts; host; host = host->Next ) { - host->HostDef->CheckPorts(host->Ptr); + if( host->HostDef->CheckPorts ) + host->HostDef->CheckPorts(host->Ptr); } - Time_Delay(POLL_ATOM); + // 2s delay - fuck those with UHCI only :) + Time_Delay(2000); } }