/**************************************************************************** * Function: EthPhyConfigureMdix * * PreCondition: - Communication to the PHY should have been established. * * Input: oFlags - the requested open flags: ETH_OPEN_MDIX_AUTO, ETH_OPEN_MDIX_NORM/ETH_OPEN_MDIX_SWAP * * Output: ETH_RES_OK - success, * an error code otherwise * * * Side Effects: None * * Overview: This function configures the MDIX mode for the PHY. * * Note: None *****************************************************************************/ eEthRes EthPhyConfigureMdix(eEthOpenFlags oFlags) { unsigned short phyReg; EthMIIMReadStart(PHY_REG_SPECIAL_CTRL, PHY_ADDRESS); phyReg=EthMIIMReadResult()&(_SPECIALCTRL_XPOL_MASK); // mask off not used bits if(oFlagsÐ_OPEN_MDIX_AUTO) { // enable Auto-MDIX phyReg&=~_SPECIALCTRL_AMDIXCTRL_MASK; } else { // no Auto-MDIX phyReg|=_SPECIALCTRL_AMDIXCTRL_MASK; // disable Auto-MDIX if(oFlagsÐ_OPEN_MDIX_SWAP) { phyReg|=_SPECIALCTRL_CH_SELECT_MASK; // swap } else { phyReg&=~_SPECIALCTRL_CH_SELECT_MASK; // normal } } EthMIIMWriteStart(PHY_REG_SPECIAL_CTRL, PHY_ADDRESS, phyReg); return ETH_RES_OK; }
/**************************************************************************** * Function: EthPhyConfigureMdix * * PreCondition: - Communication to the PHY should have been established. * * Input: oFlags - the requested open flags: ETH_OPEN_MDIX_AUTO, ETH_OPEN_MDIX_NORM/ETH_OPEN_MDIX_SWAP * * Output: ETH_RES_OK - success, * an error code otherwise * * * Side Effects: None * * Overview: This function configures the MDIX mode for the PHY. * * Note: None *****************************************************************************/ eEthRes EthPhyConfigureMdix(eEthOpenFlags oFlags) { unsigned short phyReg; EthMIIMReadStart(PHY_REG_PHY_CTRL, PHY_ADDRESS); phyReg=EthMIIMReadResult(); if(oFlagsÐ_OPEN_MDIX_AUTO) { // enable Auto-MDIX phyReg|=_PHYCTRL_MDIX_EN_MASK; } else { // no Auto-MDIX phyReg&=~(_PHYCTRL_MDIX_EN_MASK); // disable Auto-MDIX if(oFlagsÐ_OPEN_MDIX_SWAP) { phyReg|=_PHYCTRL_FORCE_MDIX_MASK; // swap } else { phyReg&=~(_PHYCTRL_FORCE_MDIX_MASK); // normal } } EthMIIMWriteStart(PHY_REG_PHY_CTRL, PHY_ADDRESS, phyReg); return ETH_RES_OK; }
/**************************************************************************** * Function: EthPhyConfigureMII * * PreCondition: - Communication to the PHY should have been established. * * Input: cFlags - the requested configuration flags: ETH_PHY_CFG_RMII/ETH_PHY_CFG_MII * * Output: ETH_RES_OK - success, * an error code otherwise * * * Side Effects: None * * Overview: This function configures the PHY in one of MII/RMII operation modes. * * Note: None *****************************************************************************/ eEthRes EthPhyConfigureMII(eEthPhyCfgFlags cFlags) { unsigned short phyReg; EthMIIMReadStart(PHY_REG_SPECIAL_MODE, PHY_ADDRESS); phyReg=EthMIIMReadResult()&(_SPECIALMODE_PHYAD_MASK|_SPECIALMODE_MODE_MASK); // not used bits should be 0 if(cFlagsÐ_PHY_CFG_RMII) { phyReg|=_SPECIALMODE_MIIMODE_MASK; } else { phyReg&=~_SPECIALMODE_MIIMODE_MASK; } EthMIIMWriteStart(PHY_REG_SPECIAL_MODE, PHY_ADDRESS, phyReg); // update the Special Modes reg return ETH_RES_OK; }
/**************************************************************************** * Function: EthPhyConfigureMII * * PreCondition: - Communication to the PHY should have been established. * * Input: cFlags - the requested open flags: ETH_PHY_CFG_RMII/ETH_PHY_CFG_MII * * Output: ETH_RES_OK - success, * an error code otherwise * * * Side Effects: None * * Overview: This function configures the PHY in one of MII/RMII operation modes. * * Note: None *****************************************************************************/ eEthRes EthPhyConfigureMII(eEthPhyCfgFlags cFlags) { unsigned short phyReg; EthMIIMReadStart(PHY_REG_RMII_BYPASS, PHY_ADDRESS); phyReg=EthMIIMReadResult(); if(cFlagsÐ_PHY_CFG_RMII) { phyReg|=_RMIIBYPASS_RMII_MODE_MASK; phyReg&=~_RMIIBYPASS_RMII_REV1_0_MASK; // use RMII 1.2 } else { phyReg&=~(_RMIIBYPASS_RMII_MODE_MASK); // MII } EthMIIMWriteStart(PHY_REG_RMII_BYPASS, PHY_ADDRESS, phyReg); // update the RMII and Bypass Register return ETH_RES_OK; }
static __inline__ unsigned short __attribute__((always_inline)) _PhyReadReg( unsigned int rIx, unsigned int phyAdd ) { EthMIIMReadStart(rIx, phyAdd); return EthMIIMReadResult(); }