AppleUSBOHCI_Optifixes.cpp [plain text]
#include "AppleUSBOHCI.h"
#include <libkern/OSByteOrder.h>
#define nil (0)
#define super IOUSBController
#define self this
void AppleUSBOHCI::DoOptiFix(OHCIEndpointDescriptorPtr pHead)
{
OHCIEndpointDescriptorPtr pED;
OHCIGeneralTransferDescriptorPtr pTD;
int i = 0;
for (i=0; i<27; i++)
{
pED = AllocateED();
pED->pLogicalNext = nil;
pED->flags = 0;
pTD = AllocateTD();
if ( pTD == NULL )
{
break;
}
pED->tdQueueHeadPtr = USBToHostLong ((UInt32) pTD->pPhysical);
pTD->nextTD = pED->tdQueueTailPtr;
pTD->pEndpoint = pED;
pTD->pType = kOHCIOptiLSBug;
pED->tdQueueTailPtr = USBToHostLong ((UInt32) pTD->pPhysical);
pED->nextED = pHead->nextED;
pHead->nextED = USBToHostLong((UInt32) pED->pPhysical);
pHead = pED;
}
}
void AppleUSBOHCI::OptiLSHSFix(void)
{
int i;
OHCIEndpointDescriptorPtr pControlED;
UInt32 controlState;
_OptiOn = 1;
controlState = USBToHostLong(_pOHCIRegisters->hcControl);
_pOHCIRegisters->hcControl = HostToUSBLong(kOHCIFunctionalState_Operational << kOHCIHcControl_HCFSPhase);
IOSleep(2);
for ( i = 0; i< 8; i++)
DoOptiFix(_pInterruptHead[48 + i].pHead);
pControlED = (OHCIEndpointDescriptorPtr) _pControlTail;
pControlED->nextED = _pOHCIRegisters->hcBulkHeadED;
DoOptiFix( (OHCIEndpointDescriptorPtr) _pControlTail);
controlState &= ~kOHCIHcControl_BLE;
OSWriteLittleInt32(&_pOHCIRegisters->hcControl, 0, controlState);
}