AppleUSBOHCI_Optifixes.cpp [plain text]
#include "AppleUSBOHCI.h"
#include <libkern/OSByteOrder.h>
#define nil (0)
#define super IOUSBController
#define self this
void AppleUSBOHCI::DoOptiFix(AppleOHCIEndpointDescriptorPtr pHead)
{
AppleOHCIEndpointDescriptorPtr pED;
AppleOHCIGeneralTransferDescriptorPtr pTD;
int i = 0;
for (i=0; i<27; i++)
{
pED = AllocateED();
pED->pLogicalNext = nil;
pED->pShared->flags = 0;
pTD = AllocateTD();
if ( pTD == NULL )
{
break;
}
pED->pShared->tdQueueHeadPtr = HostToUSBLong ((UInt32) pTD->pPhysical);
pTD->pShared->nextTD = pED->pShared->tdQueueTailPtr;
pTD->pEndpoint = pED;
pTD->pType = kOHCIOptiLSBug;
pED->pShared->tdQueueTailPtr = HostToUSBLong ((UInt32) pTD->pPhysical);
pED->pShared->nextED = pHead->pShared->nextED;
pHead->pShared->nextED = HostToUSBLong((UInt32) pED->pPhysical);
pHead = pED;
}
}
void AppleUSBOHCI::OptiLSHSFix(void)
{
int i;
AppleOHCIEndpointDescriptorPtr 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 = _pControlTail;
pControlED->pShared->nextED = _pOHCIRegisters->hcBulkHeadED;
DoOptiFix(_pControlTail);
controlState &= ~kOHCIHcControl_BLE;
OSWriteLittleInt32(&_pOHCIRegisters->hcControl, 0, controlState);
}