static void DRV_EXTPHY_WOLInterruptMaskSet(DRV_HANDLE hClientObj,int intStaus) { unsigned short intmask; DRV_ETHPHY_SMIReadStart(hClientObj,PHY_REG_INT_MASK); intmask=DRV_ETHPHY_SMIReadResultGet(hClientObj)&(~0xFE01); if(intStaus == WOL_INT_ENABLED) { intmask |= WOL_INT8_EN; } else { intmask &= ~WOL_INT8_EN; } DRV_ETHPHY_SMIWriteStart(hClientObj,PHY_REG_INT_MASK, intmask); }
/**************************************************************************** * Function: DRV_EXTPHY_MIIConfigure * * PreCondition: - Communication to the PHY should have been established. * * Input: handle - A valid open-instance handle, returned from the driver's open routine * 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. * *****************************************************************************/ ETH_RESULT_CODE DRV_EXTPHY_MIIConfigure(DRV_HANDLE hClientObj,ETHPHY_CONFIG_FLAGS cFlags) { unsigned short phyReg; DRV_ETHPHY_SMIReadStart(hClientObj,PHY_REG_SPECIAL_MODE, PHY_ADDRESS); phyReg=DRV_ETHPHY_SMIReadResultGet(hClientObj)&(_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; } DRV_ETHPHY_SMIWriteStart(hClientObj,PHY_REG_SPECIAL_MODE, PHY_ADDRESS, phyReg); // update the Special Modes reg return ETH_RES_OK; }
/**************************************************************************** * Function: set_sense_any_pkt * * PreCondition: Ethernet Initiazation should be completed. * * Input: hClientObj - A valid open-instance handle, returned from the driver's open routine * * Output: none * * * Side Effects: None * * Overview: This api is used set any packet for WOL event * and is only used for IP101GR PHY driver . * * * Note: None *****************************************************************************/ static void set_sense_any_pkt(DRV_HANDLE hClientObj,int anypkt) { unsigned short wol; DRV_ETHPHY_SMIWriteStart(hClientObj,PHY_REG_PAGE_SEL, PAGENUM_4); DRV_ETHPHY_SMIReadStart(hClientObj,PHY_REG_WOL_CNTRL); wol = DRV_ETHPHY_SMIReadResultGet(hClientObj); if (anypkt) { wol = wol | _WOL_SENSE_ANY_PKT_MASK; } else { wol = wol & ~_WOL_SENSE_ANY_PKT_MASK; } DRV_ETHPHY_SMIWriteStart(hClientObj,PHY_REG_WOL_CNTRL, wol); DRV_ETHPHY_SMIWriteStart(hClientObj,PHY_REG_PAGE_SEL, PAGENUM_0); }
static eWOL_STATE check_wol_status(DRV_HANDLE hClientObj) { WOL_OPERATION_MODE mode; unsigned short status; DRV_ETHPHY_SMIWriteStart(hClientObj,PHY_REG_PAGE_SEL, PAGENUM_17); DRV_ETHPHY_SMIReadStart(hClientObj,PHY_REG_WOL_STATUS); status=DRV_ETHPHY_SMIReadResultGet(hClientObj); DRV_ETHPHY_SMIWriteStart(hClientObj,PHY_REG_PAGE_SEL, PAGENUM_0); mode = read_wol_mode(hClientObj); if (mode == WOL_MODE_MASTER) { if (status & _WOL_PLUS_SLEEPING_STATUS_MASK) return WOL_SLEEPING; else if(status & _WOL_PLUS_WAKE_STATUS_MASK) return WOL_WAKEUP; else return WOL_NORMAL; } else { status &= (_WOL_PLUS_SLEEPING_STATUS_MASK | _WOL_PLUS_SLEEP_MASK | _WOL_PLUS_WAKE_STATUS_MASK); if (status == _WOL_PLUS_SLEEP_MASK) return WOL_RDY4SLP; else if (status == (_WOL_PLUS_WAKE_STATUS_MASK |_WOL_PLUS_SLEEPING_STATUS_MASK)) return WOL_RDY4WAKE; else if(status & _WOL_PLUS_WAKE_STATUS_MASK) return WOL_RDY4WAKE; /* else if (status & _WOL_PLUS_SLEEPING_STATUS_MASK) return WOL_SLEEPING; */ else return WOL_NORMAL; } }