📄 88e1111phy.c
字号:
} } else { error = phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_EXADD, &value,phyInfo->virPhy.pDrvCtrl); if(OK == error) { if(_88E1111_PHY_EXADD_COPPER == value) { *(UINT32*)data = PHY_COPEER_LINK; } else if(_88E1111_PHY_EXADD_FIBER == value) { *(UINT32*)data = PHY_FIBER_LINK; } else { error = ERROR; } } } } } } _88E1111PHYDBG(_88E1111PHYDBG_IOCTL, "_88E1111Phyioctl PHY_GET_FC_STATS %d\n", *(UINT32*)data , 2, 3, 4, 5, 6); break; case PHY_GET_DUPLEX: error = phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_SPSTA, &value,phyInfo->virPhy.pDrvCtrl); if(OK == error) { if(value & _88E1111_PHY_SPSTA_DS_RESOLVED) { if(value & _88E1111_PHY_SPSTA_DUPLEX_FULL) { *(UINT32*)data = PHY_DUPLEX_FULL; } else { *(UINT32*)data = PHY_DUPLEX_HALF; } } else { *(UINT32*)data = PHY_DUPLEX_FULL; } } _88E1111PHYDBG(_88E1111PHYDBG_IOCTL, "_88E1111Phyioctl PHY_GET_DUPLEX %d\n", *(UINT32*)data , 2, 3, 4, 5, 6); break; case PHY_GET_SPEED: error = phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_SPSTA, &value,phyInfo->virPhy.pDrvCtrl); if(OK == error) { if(value & _88E1111_PHY_SPSTA_DS_RESOLVED) { if(_88E1111_PHY_SPSTA_SPEED_1000M == (value & _88E1111_PHY_SPSTA_SPEED_MASK)) { *(UINT32*)data = PHY_SPEED_1000M; } else if(_88E1111_PHY_SPSTA_SPEED_100M == (value & _88E1111_PHY_SPSTA_SPEED_MASK)) { *(UINT32*)data = PHY_SPEED_100M; } else if(_88E1111_PHY_SPSTA_SPEED_10M == (value & _88E1111_PHY_SPSTA_SPEED_MASK)) { *(UINT32*)data = PHY_SPEED_10M; } else { error = ERROR; } } else { *(UINT32*)data = PHY_SPEED_1000M; } } _88E1111PHYDBG(_88E1111PHYDBG_IOCTL, "_88E1111Phyioctl PHY_GET_SPEED %d\n", *(UINT32*)data , 2, 3, 4, 5, 6); break; case PHY_SET_AUTO_NEGO: error = phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_CNTRL, ®Value,phyInfo->virPhy.pDrvCtrl); if(OK == error) { if(PHY_AUTO_NEGO_ENA == (UINT32)data) { regValue |= _88E1111_PHY_CNTRL_AUTO_NEG_ENA; } else { regValue &= ~_88E1111_PHY_CNTRL_AUTO_NEG_ENA; } regValue |= _88E1111_PHY_CNTRL_RESET; error = phyInfo->virPhy.write((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_CNTRL, regValue,phyInfo->virPhy.pDrvCtrl); } _88E1111PHYDBG(_88E1111PHYDBG_IOCTL, "_88E1111Phyioctl PHY_SET_AUTO_NEGO %d\n", (int)data, 2, 3, 4, 5, 6); break; case PHY_SET_DUPLEX: error = phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_CNTRL, ®Value,phyInfo->virPhy.pDrvCtrl); if(OK == error) { regValue &= ~_88E1111_PHY_CNTRL_AUTO_NEG_ENA; if(PHY_DUPLEX_FULL == (UINT32)data) { regValue |= _88E1111_PHY_CNTRL_DUPLEX_FULL; } else { regValue &= ~_88E1111_PHY_CNTRL_DUPLEX_FULL; } regValue |= _88E1111_PHY_CNTRL_RESET; error = phyInfo->virPhy.write((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_CNTRL, regValue,phyInfo->virPhy.pDrvCtrl); } _88E1111PHYDBG(_88E1111PHYDBG_IOCTL, "_88E1111Phyioctl PHY_SET_DUPLEX %d\n", (int)data, 2, 3, 4, 5, 6); break; case PHY_SET_SPEED: error = phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_CNTRL, ®Value,phyInfo->virPhy.pDrvCtrl); if(OK == error) { regValue &= ~_88E1111_PHY_CNTRL_AUTO_NEG_ENA; regValue &= ~_88E1111_PHY_CNTRL_SPEED_MASK; if(PHY_SPEED_10M == (UINT32)data) { regValue |= _88E1111_PHY_CNTRL_SPEED_10M; } else if(PHY_SPEED_100M == (UINT32)data) { regValue |= _88E1111_PHY_CNTRL_SPEED_100M; } else { regValue |= _88E1111_PHY_CNTRL_SPEED_1000M; } regValue |= _88E1111_PHY_CNTRL_RESET; error = phyInfo->virPhy.write((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_CNTRL, regValue,phyInfo->virPhy.pDrvCtrl); } _88E1111PHYDBG(_88E1111PHYDBG_IOCTL, "_88E1111Phyioctl PHY_SET_SPEED %d\n", (int)data, 2, 3, 4, 5, 6); break; case PHY_SET_PHOTOELECTRICITY: error = phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_EXSST, ®Value,phyInfo->virPhy.pDrvCtrl); if(OK == error) { regValue |= _88E1111_PHY_EXSST_FCAUTO_SEL;/*设置为光电强制模式*/ regValue &= (~_88E1111_PHY_EXSST_HWCFG_MODE_MASK); if (PHY_SET_PHOTO == (UINT32)data) { regValue |= _88E1111_PHY_EXSST_HWCFG_MODE_GMII_FIBER; } else if (PHY_SET_ELECTRICITY == (UINT32)data) { regValue |= _88E1111_PHY_EXSST_HWCFG_MODE_GMII_COPPER; } } phyInfo->virPhy.write((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_EXSST, regValue,phyInfo->virPhy.pDrvCtrl); phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_CNTRL, ®Value,phyInfo->virPhy.pDrvCtrl); regValue |= _88E1111_PHY_CNTRL_RESET; phyInfo->virPhy.write((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_CNTRL, regValue,phyInfo->virPhy.pDrvCtrl); _88E1111PHYDBG(_88E1111PHYDBG_IOCTL, "_88E1111Phyioctl PHY_SET_PHOTOELECTRICITY %d\n", (int)data, 2, 3, 4, 5, 6); break; case PHY_SET_LOOPBACK: error = phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_CNTRL, ®Value,phyInfo->virPhy.pDrvCtrl); if(OK == error) { if(PHY_LOOP_ENABLE == (UINT32)data) { regValue |= _88E1111_PHY_CNTRL_LOOPBACK; } else { regValue &= ~_88E1111_PHY_CNTRL_LOOPBACK; } error = phyInfo->virPhy.write((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_CNTRL, regValue,phyInfo->virPhy.pDrvCtrl); } _88E1111PHYDBG(_88E1111PHYDBG_IOCTL, "_88E1111Phyioctl PHY_SET_LOOPBACK %d\n", (int)data, 2, 3, 4, 5, 6); break; case PHY_SET_SHUTDOWN: error = phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_CNTRL, ®Value,phyInfo->virPhy.pDrvCtrl); if(OK == error) { if(PHY_SHUTDOWN_ENABLE == (UINT32)data) { regValue |= _88E1111_PHY_CNTRL_POWERDOWN; } else { regValue &= ~_88E1111_PHY_CNTRL_POWERDOWN; } error = phyInfo->virPhy.write((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_CNTRL, regValue,phyInfo->virPhy.pDrvCtrl); } _88E1111PHYDBG(_88E1111PHYDBG_IOCTL, "_88E1111Phyioctl PHY_SET_LOOPBACK %d\n", (int)data, 2, 3, 4, 5, 6); break; case PHY_GET_10_M_LINK_FD: phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_LKPAB, ®Value,phyInfo->virPhy.pDrvCtrl); if(regValue & _88E1111_PHY_LKPAB_10_M_FD) { *(UINT32*)data = PHY_10_M_LINK_FD; } else { *(UINT32*)data = PHY_10_M_LINK_FH; } _88E1111PHYDBG(_88E1111PHYDBG_IOCTL, "_88E1111Phyioctl PHY_GET_10_M_LINK_FD %d\n", *(UINT32*)data , 2, 3, 4, 5, 6); break; case PHY_GET_100_M_LINK_FD: phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_LKPAB, ®Value,phyInfo->virPhy.pDrvCtrl); if(regValue & _88E1111_PHY_LKPAB_100_M_FD) { *(UINT32*)data = PHY_100_M_LINK_FD; } else { *(UINT32*)data = PHY_100_M_LINK_FH; } _88E1111PHYDBG(_88E1111PHYDBG_IOCTL, "_88E1111Phyioctl PHY_GET_100_M_LINK_FD %d\n", *(UINT32*)data , 2, 3, 4, 5, 6); break; case PHY_GET_1000_M_LINK_FD: phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_KSTAT, ®Value,phyInfo->virPhy.pDrvCtrl); if(regValue & _88E1111_PHY_KSTAT_LP_FD) { *(UINT32*)data = PHY_1000_M_LINK_FD; } else { *(UINT32*)data = PHY_1000_M_LINK_FH; } _88E1111PHYDBG(_88E1111PHYDBG_IOCTL, "_88E1111Phyioctl PHY_GET_1000_M_LINK_FD %d\n", *(UINT32*)data , 2, 3, 4, 5, 6); break; case PHY_GET_1000_M_LINK_OK: phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_KSTAT, ®Value,phyInfo->virPhy.pDrvCtrl); if(regValue & _88E1111_PHY_KSTAT_RM_OK) { *(UINT32*)data = PHY_1000_M_LINK_OK; } else { *(UINT32*)data = PHY_1000_M_LINK_ERR; } _88E1111PHYDBG(_88E1111PHYDBG_IOCTL, "_88E1111Phyioctl PHY_GET_1000_M_LINK_OK %d\n", *(UINT32*)data , 2, 3, 4, 5, 6); break; default: _88E1111PHYDBG(_88E1111PHYDBG_IOCTL, "_88E1111Phyioctl ERROR\n", 1 , 2, 3, 4, 5, 6); error = ERROR; break; } _88E1111PHYDBG(_88E1111PHYDBG_IOCTL, "_88E1111Phyioctl Exit\n", 1, 2, 3, 4, 5, 6); return error;}LOCAL void _88E1111PhyInt(DRV_VIR_PHY * pCookie){ UINT16 value; _88E1111_PHY * phyInfo; _88E1111PHYDBG(_88E1111PHYDBG_INT, "_88E1111PhyInt Enter\n", 1 , 2, 3, 4, 5, 6); phyInfo = (_88E1111_PHY *)pCookie; phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_EXADD, &value,phyInfo->virPhy.pDrvCtrl); _88E1111PHYDBG(_88E1111PHYDBG_INT, "_88E1111PhyInt page %x\n", value , 2, 3, 4, 5, 6); if(ERROR == phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr, (UINT8)_88E1111_PHY_REG_INTST, &value, phyInfo->virPhy.pDrvCtrl)) { phyInfo->virPhy.intDisable(phyInfo->virPhy.vecNum); phyInfo->virPhy.intDisConnect(phyInfo->virPhy.vecNum); _88E1111PHYDBG(_88E1111PHYDBG_INT, "_88E1111PhyInt read fatal error\n", 1, 2, 3, 4, 5, 6); } _88E1111PHYDBG(_88E1111PHYDBG_INT, "_88E1111PhyInt int state 0x%x\n", value , 2, 3, 4, 5, 6); if(value & _88E1111_PHY_INTST_LINK_STAT) { /*phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_SPSTA, &value,phyInfo->virPhy.pDrvCtrl); if(value & _88E1111_PHY_SPSTA_LINK_UP) { _88E1111PHYDBG(_88E1111PHYDBG_INT, "_88E1111PhyInt link up %d\n", 1 , 2, 3, 4, 5, 6); phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_EXSST, &value,phyInfo->virPhy.pDrvCtrl); if(!(value & _88E1111_PHY_EXSST_FC_RESOLVE)) { _88E1111PHYDBG(_88E1111PHYDBG_INT, "_88E1111PhyInt link copper %d\n", 1 , 2, 3, 4, 5, 6); phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_EXSST, &value,phyInfo->virPhy.pDrvCtrl); value |= _88E1111_PHY_EXSST_FCAUTO_SEL; phyInfo->virPhy.write((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_EXSST, value,phyInfo->virPhy.pDrvCtrl); phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_CNTRL, &value,phyInfo->virPhy.pDrvCtrl); value |= _88E1111_PHY_CNTRL_RESET; phyInfo->virPhy.write((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_CNTRL, value,phyInfo->virPhy.pDrvCtrl); } } else { _88E1111PHYDBG(_88E1111PHYDBG_INT, "_88E1111PhyInt link down %d\n", 1 , 2, 3, 4, 5, 6); phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_EXSST, &value,phyInfo->virPhy.pDrvCtrl); value &= ~_88E1111_PHY_EXSST_FCAUTO_SEL; phyInfo->virPhy.write((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_EXSST, value,phyInfo->virPhy.pDrvCtrl); phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_CNTRL, &value,phyInfo->virPhy.pDrvCtrl); value |= _88E1111_PHY_CNTRL_RESET; phyInfo->virPhy.write((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_CNTRL, value,phyInfo->virPhy.pDrvCtrl); }*/ phyInfo->virPhy.drvIntCallBack(phyInfo->virPhy.pDrvCtrl); } _88E1111PHYDBG(_88E1111PHYDBG_INT, "_88E1111PhyInt Exit\n", 1 , 2, 3, 4, 5, 6); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -