AppleUHCItdMemoryBlock.cpp [plain text]
#include <IOKit/usb/IOUSBLog.h>
#include "AppleUSBUHCI.h"
#include "AppleUHCItdMemoryBlock.h"
#include "AppleUHCIListElement.h"
#define super OSObject
OSDefineMetaClassAndStructors(AppleUHCItdMemoryBlock, OSObject);
AppleUHCItdMemoryBlock*
AppleUHCItdMemoryBlock::NewMemoryBlock(void)
{
AppleUHCItdMemoryBlock *me = new AppleUHCItdMemoryBlock;
IOByteCount len;
IODMACommand *dmaCommand = NULL;
UInt64 offset = 0;
IODMACommand::Segment32 segments;
UInt32 numSegments = 1;
IOReturn status = kIOReturnSuccess;
if (me)
{
dmaCommand = IODMACommand::withSpecification(kIODMACommandOutputHost32, 32, PAGE_SIZE, (IODMACommand::MappingOptions)(IODMACommand::kMapped | IODMACommand::kIterateOnly));
if (!dmaCommand)
{
USBError(1, "AppleUHCItdMemoryBlock::NewMemoryBlock - could not create IODMACommand");
return NULL;
}
USBLog(6, "AppleUHCItdMemoryBlock::NewMemoryBlock - got IODMACommand %p", dmaCommand);
me->_buffer = IOBufferMemoryDescriptor::inTaskWithPhysicalMask(kernel_task, kIOMemoryUnshared | kIODirectionInOut, kUHCIPageSize, kUHCIStructureAllocationPhysicalMask);
if (me->_buffer)
{
status = me->_buffer->prepare();
if (status)
{
USBError(1, "AppleUHCItdMemoryBlock::NewMemoryBlock - could not prepare buffer");
me->_buffer->release();
me->release();
dmaCommand->release();
return NULL;
}
me->_sharedLogical = (UHCITransferDescriptorSharedPtr)me->_buffer->getBytesNoCopy();
bzero(me->_sharedLogical, kUHCIPageSize);
status = dmaCommand->setMemoryDescriptor(me->_buffer);
if (status)
{
USBError(1, "AppleUHCItdMemoryBlock::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 != kUHCIPageSize))
{
USBError(1, "AppleUHCItdMemoryBlock::NewMemoryBlock - could not get physical segment");
me->_buffer->complete();
me->_buffer->release();
me->release();
return NULL;
}
me->_sharedPhysical = segments.fIOVMAddr;
}
else
{
USBError(1, "AppleUHCItdMemoryBlock::NewMemoryBlock, could not allocate buffer!");
me->release();
me = NULL;
}
}
else
{
USBError(1, "AppleUHCItdMemoryBlock::NewMemoryBlock, constructor failed!");
}
return me;
}
UInt32
AppleUHCItdMemoryBlock::NumTDs(void)
{
return TDsPerBlock;
}
IOPhysicalAddress
AppleUHCItdMemoryBlock::GetPhysicalPtr(UInt32 index)
{
IOPhysicalAddress ret = NULL;
if (index < TDsPerBlock)
ret = _sharedPhysical + (index * sizeof(UHCITransferDescriptorShared));
return ret;
}
UHCITransferDescriptorSharedPtr
AppleUHCItdMemoryBlock::GetLogicalPtr(UInt32 index)
{
UHCITransferDescriptorSharedPtr ret = NULL;
if (index < TDsPerBlock)
ret = &_sharedLogical[index];
return ret;
}
AppleUHCItdMemoryBlock*
AppleUHCItdMemoryBlock::GetNextBlock(void)
{
return _nextBlock;
}
void
AppleUHCItdMemoryBlock::SetNextBlock(AppleUHCItdMemoryBlock* next)
{
_nextBlock = next;
}