#import <IOKit/firewire/IOFireWireFamilyCommon.h>
#import <IOKit/firewire/IOFWUtils.h>
#import <IOKit/assert.h>
#import <IOKit/IOLib.h>
UInt16 FWUpdateCRC16(UInt16 crc16, UInt32 quad)
{
SInt32 shift;
UInt32 sum;
UInt32 crc = crc16;
for (shift = 28; shift >= 0; shift -= 4) {
sum = ((crc >> 12) ^ (quad >> shift)) & 0x0F;
crc = (crc << 4) ^ (sum << 12) ^ (sum << 5) ^ (sum);
}
return (crc & 0xFFFF);
}
UInt16 FWComputeCRC16(const UInt32 *pQuads, UInt32 numQuads)
{
SInt32 shift;
UInt32 sum;
UInt32 crc16;
UInt32 quadNum;
UInt32 quad;
crc16 = 0;
for (quadNum = 0; quadNum < numQuads; quadNum++) {
quad = *pQuads++;
for (shift = 28; shift >= 0; shift -= 4) {
sum = ((crc16 >> 12) ^ (quad >> shift)) & 0x0F;
crc16 = (crc16 << 4) ^ (sum << 12) ^ (sum << 5) ^ (sum);
}
}
return (crc16 & 0xFFFF);
}
UInt32 AddFWCycleTimeToFWCycleTime( UInt32 cycleTime1, UInt32 cycleTime2 )
{
UInt32 secondCount,
cycleCount,
cycleOffset;
UInt32 cycleTime;
cycleOffset = (cycleTime1 & 0x0FFF) + (cycleTime2 & 0x0FFF);
cycleCount = (cycleTime1 & 0x01FFF000) + (cycleTime2 & 0x01FFF000);
if (cycleOffset > 3071)
{
cycleCount += 0x1000;
cycleOffset -= 3072;
}
secondCount = (cycleTime1 & 0xFE000000) + (cycleTime2 & 0xFE000000);
if (cycleCount > (7999 << 12))
{
secondCount += 0x02000000;
cycleCount -= (8000 << 12);
}
cycleTime = secondCount | cycleCount | cycleOffset;
return (cycleTime);
}
UInt32 SubtractFWCycleTimeFromFWCycleTime( UInt32 cycleTime1, UInt32 cycleTime2)
{
SInt32 secondCount,
cycleCount,
cycleOffset;
UInt32 cycleTime;
cycleOffset = (cycleTime1 & 0x0FFF) - (cycleTime2 & 0x0FFF);
cycleCount = (cycleTime1 & 0x01FFF000) - (cycleTime2 & 0x01FFF000);
if (cycleOffset < 0)
{
cycleCount -= 0x1000;
cycleOffset += 3072;
}
secondCount = (cycleTime1 & 0xFE000000) - (cycleTime2 & 0xFE000000);
if (cycleCount < 0)
{
secondCount -= 0x02000000;
cycleCount += (8000 << 12);
}
cycleTime = secondCount | cycleCount | cycleOffset;
return (cycleTime);
}
bool
findOffsetInRanges ( IOVirtualAddress address, unsigned rangeCount, IOVirtualRange ranges[], IOByteCount & outOffset )
{
UInt32 index = 0 ;
IOByteCount distanceInRange ;
bool found = false ;
outOffset = 0 ;
while ( ! found && index < rangeCount )
{
distanceInRange = address - ranges[index].address ;
if ( found = ( distanceInRange < ranges[ index ].length ) )
outOffset += distanceInRange ;
else
outOffset += ranges[ index ].length ;
++index ;
}
return found ;
}