/******************************************************************************* * miiSmiIfWriteRegister * * DESCRIPTION: * This function writes to a register throw the SMI / MII interface, to be * used by upper layers. * * INPUTS: * phyAddr - The PHY address to be read. * regAddr - The register address to read. * data - The data to be written to the register. * * OUTPUTS: * None. * * RETURNS: * GT_OK - on success * GT_FAIL - on error * * COMMENTS: * None. * *******************************************************************************/ GT_STATUS miiSmiIfWriteRegister ( IN GT_QD_DEV *dev, IN GT_U8 phyAddr, IN GT_U8 regAddr, IN GT_U16 data ) { #ifdef GT_RMGMT_ACCESS if((dev->accessMode == SMI_MULTI_ADDR_MODE) && (dev->fgtHwAccessMod == HW_ACCESS_MODE_SMI)) #else if(dev->accessMode == SMI_MULTI_ADDR_MODE) #endif { if(qdMultiAddrWrite(dev,(GT_U32)phyAddr,(GT_U32)regAddr,(GT_U32)data) != GT_TRUE) { return GT_FAIL; } } else { if(fgtWriteMii(dev,(GT_U32)phyAddr,(GT_U32)regAddr,(GT_U32)data) != GT_TRUE) { return GT_FAIL; } } return GT_OK; }
GT_BOOL qdMultiAddrWrite (GT_QD_DEV* dev, unsigned int phyAddr , unsigned int regAddr, unsigned int value) { unsigned int smiReg; volatile unsigned int timeOut; /* in 100MS units */ volatile int i; /* first check that it is not busy */ if(fgtReadMii(dev,(GT_U32)dev->phyAddr,(GT_U32)QD_REG_SMI_COMMAND, &smiReg) != GT_TRUE) { return GT_FALSE; } timeOut = QD_SMI_ACCESS_LOOP; /* initialize the loop count */ if(smiReg & QD_SMI_BUSY) { for(i = 0 ; i < QD_SMI_TIMEOUT ; i++); do { if(timeOut-- < 1 ) { return GT_FALSE; } if(fgtReadMii(dev,(GT_U32)dev->phyAddr,(GT_U32)QD_REG_SMI_COMMAND, &smiReg) != GT_TRUE) { return GT_FALSE; } } while (smiReg & QD_SMI_BUSY); } if(fgtWriteMii(dev,(GT_U32)dev->phyAddr,(GT_U32)QD_REG_SMI_DATA, value) != GT_TRUE) { return GT_FALSE; } smiReg = QD_SMI_BUSY | (phyAddr << QD_SMI_DEV_ADDR_BIT) | (QD_SMI_WRITE << QD_SMI_OP_BIT) | (regAddr << QD_SMI_REG_ADDR_BIT) | (QD_SMI_CLAUSE22 << QD_SMI_MODE_BIT); if(fgtWriteMii(dev,(GT_U32)dev->phyAddr,(GT_U32)QD_REG_SMI_COMMAND, smiReg) != GT_TRUE) { return GT_FALSE; } return GT_TRUE; }