#include "BMacEnetRegisters.h"
#include "BMacEnetPrivate.h"
#include <libkern/OSByteOrder.h>
void WriteBigMacRegister( IOPPCAddress ioBaseEnet, u_int32_t reg_offset, u_int16_t data )
{
OSWriteSwapInt16( ioBaseEnet, reg_offset, data );
eieio();
}
volatile u_int16_t ReadBigMacRegister( IOPPCAddress ioBaseEnet, u_int32_t reg_offset )
{
return OSReadSwapInt16( ioBaseEnet, reg_offset );
}
#define kSROMAddressLength 5
#define kDataInOn 0x0008
#define kDataInOff 0x0000
#define kClk 0x0002
#define kChipSelect 0x0001
#define kSDIShiftCount 3
#define kSD0ShiftCount 2
#define kDelayValue 1000 // number of microseconds
#define kSROMStartOffset 10 // this is in words
#define kSROMReadCount 3 // number of words to read from SROM
static unsigned char clock_out_bit(IOPPCAddress base)
{
u_int16_t data;
u_int16_t val;
WriteBigMacRegister(base, kSROMCSR, kChipSelect | kClk);
IODelay(kDelayValue);
data = ReadBigMacRegister(base, kSROMCSR);
IODelay(kDelayValue);
val = (data >> kSD0ShiftCount) & 1;
WriteBigMacRegister(base, kSROMCSR, kChipSelect);
IODelay(kDelayValue);
return val;
}
static void clock_in_bit(IOPPCAddress base, unsigned int val)
{
u_int16_t data;
if (val != 0 && val != 1)
{
IOLog("bogus data in clock_in_bit\n");
return;
}
data = (val << kSDIShiftCount);
WriteBigMacRegister(base, kSROMCSR, data | kChipSelect );
IODelay(kDelayValue);
WriteBigMacRegister(base, kSROMCSR, data | kChipSelect | kClk );
IODelay(kDelayValue);
WriteBigMacRegister(base, kSROMCSR, data | kChipSelect);
IODelay(kDelayValue);
}
void reset_and_select_srom(IOPPCAddress base)
{
WriteBigMacRegister(base, kSROMCSR, 0);
IODelay(kDelayValue);
clock_in_bit(base, 1);
clock_in_bit(base, 1);
clock_in_bit(base, 0);
}
unsigned short read_srom(IOPPCAddress base, unsigned int addr,
unsigned int addr_len)
{
unsigned short data, val;
unsigned int i;
for (i = 0; i < addr_len; i++) {
val = addr >> (addr_len-i-1);
clock_in_bit(base, val & 1);
}
data = 0;
for (i = 0; i < 16; i++) {
val = clock_out_bit(base);
data <<= 1;
data |= val;
}
WriteBigMacRegister(base, kSROMCSR, 0);
return data;
}