AppleEHCItdMemoryBlock.cpp [plain text]
#include <IOKit/usb/IOUSBLog.h>
#include "AppleEHCItdMemoryBlock.h"
#define super OSObject
OSDefineMetaClassAndStructors(AppleEHCItdMemoryBlock, OSObject);
AppleEHCItdMemoryBlock*
AppleEHCItdMemoryBlock::NewMemoryBlock(void)
{
AppleEHCItdMemoryBlock *me = new AppleEHCItdMemoryBlock;
IOByteCount len;
IODMACommand *dmaCommand = NULL;
UInt64 offset = 0;
IODMACommand::Segment32 segments;
UInt32 numSegments = 1;
IOReturn status = kIOReturnSuccess;
EHCIGeneralTransferDescriptorSharedPtr sharedPtr;
IOPhysicalAddress sharedPhysical;
UInt32 i;
if (me)
{
dmaCommand = IODMACommand::withSpecification(kIODMACommandOutputHost32, 32, PAGE_SIZE, (IODMACommand::MappingOptions)(IODMACommand::kMapped | IODMACommand::kIterateOnly));
if (!dmaCommand)
{
USBError(1, "AppleEHCItdMemoryBlock::NewMemoryBlock - could not create IODMACommand");
return NULL;
}
USBLog(6, "AppleEHCItdMemoryBlock::NewMemoryBlock - got IODMACommand %p", dmaCommand);
me->_buffer = IOBufferMemoryDescriptor::inTaskWithPhysicalMask(kernel_task, kIOMemoryUnshared | kIODirectionInOut, kEHCIPageSize, kEHCIStructureAllocationPhysicalMask);
if (me->_buffer)
{
status = me->_buffer->prepare();
if (status)
{
USBError(1, "AppleEHCItdMemoryBlock::NewMemoryBlock - could not prepare buffer");
me->_buffer->release();
me->release();
dmaCommand->release();
return NULL;
}
sharedPtr = (EHCIGeneralTransferDescriptorSharedPtr)me->_buffer->getBytesNoCopy();
bzero(sharedPtr, kEHCIPageSize);
status = dmaCommand->setMemoryDescriptor(me->_buffer);
if (status)
{
USBError(1, "AppleEHCItdMemoryBlock::NewMemoryBlock - could not set memory descriptor");
me->_buffer->complete();
me->_buffer->release();
me->release();
dmaCommand->release();
return NULL;
}
status = dmaCommand->gen32IOVMSegments(&offset, &segments, &numSegments);
dmaCommand->clearMemoryDescriptor();
dmaCommand->release();
if (status || (numSegments != 1) || (segments.fLength != kEHCIPageSize))
{
USBError(1, "AppleEHCItdMemoryBlock::NewMemoryBlock - could not get physical segment");
me->_buffer->complete();
me->_buffer->release();
me->release();
return NULL;
}
sharedPhysical = segments.fIOVMAddr;
for (i=0; i < TDsPerBlock; i++)
{
me->_TDs[i].pPhysical = sharedPhysical+(i * sizeof(EHCIGeneralTransferDescriptorShared));
me->_TDs[i].pShared = &sharedPtr[i];
}
}
else
{
USBError(1, "AppleEHCItdMemoryBlock::NewMemoryBlock, could not allocate buffer!");
me->release();
me = NULL;
}
}
else
{
USBError(1, "AppleEHCItdMemoryBlock::NewMemoryBlock, constructor failed!");
}
return me;
}
UInt32
AppleEHCItdMemoryBlock::NumTDs(void)
{
return TDsPerBlock;
}
EHCIGeneralTransferDescriptorPtr
AppleEHCItdMemoryBlock::GetTD(UInt32 index)
{
return (index < TDsPerBlock) ? &_TDs[index] : NULL;
}
AppleEHCItdMemoryBlock*
AppleEHCItdMemoryBlock::GetNextBlock(void)
{
return _nextBlock;
}
void
AppleEHCItdMemoryBlock::SetNextBlock(AppleEHCItdMemoryBlock* next)
{
_nextBlock = next;
}