VOID GMACvSetPacketFilter(DWORD dwIoBase, WORD wFilterType) { BYTE byOldRCR; BYTE byNewRCR = 0; BYTE byOrgCAMCR, byData; /* modify CAMCR to select MAR regs */ VNSvInPortB(dwIoBase + MAC_REG_CAMCR, &byOrgCAMCR); byData = (BYTE)(byOrgCAMCR & ~(CAMCR_PS1|CAMCR_PS0)); VNSvOutPortB(dwIoBase + MAC_REG_CAMCR, byData); /* if only in DIRECTED mode, multicast-address will set to zero, */ /* but if other mode exist (e.g. PROMISCUOUS), multicast-address */ /* will be open */ if (BITbIsBitOn(wFilterType, PKT_TYPE_DIRECTED)) { /* set multicast address to accept none */ VNSvOutPortD(dwIoBase + MAC_REG_MAR, 0L); /* PCAvDelayByIO(1); */ VNSvOutPortD(dwIoBase + MAC_REG_MAR + sizeof(DWORD), 0L); /* PCAvDelayByIO(1); */ } if (BITbIsAnyBitsOn(wFilterType, PKT_TYPE_PROMISCUOUS | PKT_TYPE_ALL_MULTICAST)) { /* set multicast address to accept all */ VNSvOutPortD(dwIoBase + MAC_REG_MAR, 0xFFFFFFFFL); /* PCAvDelayByIO(1); */ VNSvOutPortD(dwIoBase + MAC_REG_MAR + sizeof(DWORD), 0xFFFFFFFFL); /* PCAvDelayByIO(1); */ } /* restore to original CAMCR */ VNSvOutPortB(dwIoBase + MAC_REG_CAMCR, byOrgCAMCR); if (BITbIsBitOn(wFilterType, PKT_TYPE_PROMISCUOUS)) byNewRCR |= (RCR_PROM | RCR_AM | RCR_AB); if (BITbIsAnyBitsOn(wFilterType, PKT_TYPE_MULTICAST | PKT_TYPE_ALL_MULTICAST)) byNewRCR |= RCR_AM; if (BITbIsBitOn(wFilterType, PKT_TYPE_BROADCAST)) byNewRCR |= RCR_AB; if (BITbIsBitOn(wFilterType, PKT_TYPE_RUNT)) byNewRCR |= RCR_AR; if (BITbIsBitOn(wFilterType, PKT_TYPE_ERROR)) byNewRCR |= RCR_SEP; VNSvInPortB(dwIoBase + MAC_REG_RCR, &byOldRCR); if (byNewRCR != (byOldRCR & 0x1F)) { /* Modify the Receive Command Register */ byNewRCR |= (BYTE)(byOldRCR & 0xE0); VNSvOutPortB(dwIoBase + MAC_REG_RCR, byNewRCR); } }
/* * Description: Read a byte from EEPROM, by MAC I2C * * Parameters: * In: * dwIoBase - I/O base address * byContntOffset - address of EEPROM * Out: * none * * Return Value: data read * */ BYTE SROMbyReadEmbedded(DWORD_PTR dwIoBase, BYTE byContntOffset) { WORD wDelay, wNoACK; BYTE byWait; BYTE byData; BYTE byOrg; byData = 0xFF; VNSvInPortB(dwIoBase + MAC_REG_I2MCFG, &byOrg); // turn off hardware retry for getting NACK VNSvOutPortB(dwIoBase + MAC_REG_I2MCFG, (byOrg & (~I2MCFG_NORETRY))); for (wNoACK = 0; wNoACK < W_MAX_I2CRETRY; wNoACK++) { VNSvOutPortB(dwIoBase + MAC_REG_I2MTGID, EEP_I2C_DEV_ID); VNSvOutPortB(dwIoBase + MAC_REG_I2MTGAD, byContntOffset); // issue read command VNSvOutPortB(dwIoBase + MAC_REG_I2MCSR, I2MCSR_EEMR); // wait DONE be set for (wDelay = 0; wDelay < W_MAX_TIMEOUT; wDelay++) { VNSvInPortB(dwIoBase + MAC_REG_I2MCSR, &byWait); if (BITbIsAnyBitsOn(byWait, (I2MCSR_DONE | I2MCSR_NACK))) break; PCAvDelayByIO(CB_DELAY_LOOP_WAIT); } if ((wDelay < W_MAX_TIMEOUT) && (BITbIsBitOff(byWait, I2MCSR_NACK))) { break; } } VNSvInPortB(dwIoBase + MAC_REG_I2MDIPT, &byData); VNSvOutPortB(dwIoBase + MAC_REG_I2MCFG, byOrg); return byData; }
BOOL GMACbIsInLoopbackMode(DWORD dwIoBase) { BYTE byOrgValue; VNSvInPortB(dwIoBase + MAC_REG_TCR, &byOrgValue); if (BITbIsAnyBitsOn(byOrgValue, TCR_LB1 | TCR_LB0)) return TRUE; return FALSE; }