?? 88e1111phy.c
字號:
#include "88E1111phy.h"#define _88E1111PHYDBG_LOAD 0x1#define _88E1111PHYDBG_INIT 0x2#define _88E1111PHYDBG_IOCTL 0x4#define _88E1111PHYDBG_INT 0x8#ifdef LOCAL#undef LOCAL#define LOCAL#endifUINT32 _88E1111PhyDbg = 0;#define _88E1111PHYDBG(FLG, X0, X1, X2, X3, X4, X5, X6) \ { \ if (_88E1111PhyDbg & FLG) \ logMsg (X0, X1, X2, X3, X4, X5, X6); \ }LOCAL STATUS _88E1111PhyPreInit(DRV_VIR_PHY *);LOCAL STATUS _88E1111PhyInit(DRV_VIR_PHY *);LOCAL STATUS _88E1111PhyUnInit(DRV_VIR_PHY *);LOCAL STATUS _88E1111Phyioctl(DRV_VIR_PHY *,int,caddr_t);LOCAL void _88E1111PhyInt(DRV_VIR_PHY *);DRV_VIR_PHY* _88E1111PhyLoad(){ _88E1111_PHY * phyInfo; _88E1111PHYDBG(_88E1111PHYDBG_LOAD, "_88E1111PhyLoad Enter\n", 1, 2, 3, 4, 5, 6); phyInfo = (_88E1111_PHY *) calloc (sizeof (_88E1111_PHY), 1); phyInfo->virPhy.preInit = _88E1111PhyPreInit; phyInfo->virPhy.init = _88E1111PhyInit; phyInfo->virPhy.unInit = _88E1111PhyUnInit; phyInfo->virPhy.ioctl = _88E1111Phyioctl; _88E1111PHYDBG(_88E1111PHYDBG_LOAD, "_88E1111PhyLoad Exit\n", 1, 2, 3, 4, 5, 6); return &phyInfo->virPhy;}void _88E1111PhyUnLoad(DRV_VIR_PHY* pCookie){ _88E1111_PHY * phyInfo; _88E1111PHYDBG(_88E1111PHYDBG_LOAD, "_88E1111PhyUnLoad Enter\n", 1, 2, 3, 4, 5, 6); phyInfo = (_88E1111_PHY *)pCookie; if(!phyInfo) { _88E1111PHYDBG(_88E1111PHYDBG_LOAD, "_88E1111PhyUnLoad never loaded\n", 1, 2, 3, 4, 5, 6); return; } if(phyInfo->state & _88E1111_PHY_PRE_INITED) { _88E1111PhyUnInit(pCookie); } _88E1111PHYDBG(_88E1111PHYDBG_LOAD, "_88E1111PhyUnLoad Exit\n", 1, 2, 3, 4, 5, 6); free(phyInfo);}LOCAL STATUS _88E1111PhyPreInit(DRV_VIR_PHY * pCookie){ UINT16 value; UINT16 bakValue; _88E1111_PHY * phyInfo; _88E1111PHYDBG(_88E1111PHYDBG_INIT, "_88E1111PhyPreInit Enter\n", 1, 2, 3, 4, 5, 6); phyInfo = (_88E1111_PHY *)pCookie; if(phyInfo->state & _88E1111_PHY_INITED) { _88E1111PHYDBG(_88E1111PHYDBG_INIT, "_88E1111PhyPreInit had inited\n", 1, 2, 3, 4, 5, 6); return (OK); } value = _88E1111_PHY_LEDCT_PUL_DUA_170_340 | _88E1111_PHY_LEDCT_BLK_RATE_340 | 0xD1; phyInfo->virPhy.write((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_LEDCT, value,phyInfo->virPhy.pDrvCtrl); /*phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_EXSCT, &value,phyInfo->virPhy.pDrvCtrl); value &= ~_88E1111_PHY_EXSCT_PRE_MASK; value |= _88E1111_PHY_EXSCT_PRE_COPPER; phyInfo->virPhy.write((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_EXSCT, 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); */ /* disable auto fiber/copper select and set mode to GMII-to-FIBER */ phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_EXSST, &value,phyInfo->virPhy.pDrvCtrl); value &= ~_88E1111_PHY_EXSST_HWCFG_MODE_MASK; value |= _88E1111_PHY_EXSST_HWCFG_MODE_GMII_FIBER; 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); /* bakup register page */ phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_EXADD, &bakValue,phyInfo->virPhy.pDrvCtrl); /* configure fiber int enable */ value = _88E1111_PHY_EXADD_FIBER; phyInfo->virPhy.write((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_EXADD, value,phyInfo->virPhy.pDrvCtrl); value = _88E1111_PHY_INTEN_LINK_STAT; phyInfo->virPhy.write((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_INTEN, value,phyInfo->virPhy.pDrvCtrl); /* set mode to GMII-to-COPPER and configure copper int enable */ phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_EXSST, &value,phyInfo->virPhy.pDrvCtrl); value &= ~_88E1111_PHY_EXSST_HWCFG_MODE_MASK; value |= _88E1111_PHY_EXSST_HWCFG_MODE_GMII_COPPER; 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); value = _88E1111_PHY_EXADD_COPPER; phyInfo->virPhy.write((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_EXADD, value,phyInfo->virPhy.pDrvCtrl); value = _88E1111_PHY_INTEN_LINK_STAT; phyInfo->virPhy.write((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_INTEN, value,phyInfo->virPhy.pDrvCtrl); /* restore register page */ phyInfo->virPhy.write((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_EXADD, bakValue,phyInfo->virPhy.pDrvCtrl); /* disable auto fiber/copper select and now work in GMII-to-Copper */ 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->state |= _88E1111_PHY_PRE_INITED; _88E1111PHYDBG(_88E1111PHYDBG_INIT, "_88E1111PhyPreInit Exit\n", 1, 2, 3, 4, 5, 6); return (OK);}LOCAL STATUS _88E1111PhyInit(DRV_VIR_PHY * pCookie){ UINT16 value; UINT16 bakValue; _88E1111_PHY * phyInfo; _88E1111PHYDBG(_88E1111PHYDBG_INIT, "_88E1111PhyInit Enter\n", 1, 2, 3, 4, 5, 6); phyInfo = (_88E1111_PHY *)pCookie; if(!(phyInfo->state & _88E1111_PHY_PRE_INITED)) { _88E1111PHYDBG(_88E1111PHYDBG_INIT, "_88E1111PhyInit have not pre inited\n", 1, 2, 3, 4, 5, 6); return (ERROR); } phyInfo->virPhy.intConnect(phyInfo->virPhy.vecNum,_88E1111PhyInt,pCookie); phyInfo->virPhy.intEnable(phyInfo->virPhy.vecNum); phyInfo->state |= _88E1111_PHY_INITED; _88E1111PHYDBG(_88E1111PHYDBG_INIT, "_88E1111PhyInit Exit\n", 1, 2, 3, 4, 5, 6); return (OK);}LOCAL STATUS _88E1111PhyUnInit(DRV_VIR_PHY * pCookie){ UINT16 value; UINT16 bakValue; _88E1111_PHY * phyInfo; _88E1111PHYDBG(_88E1111PHYDBG_INIT, "_88E1111PhyUnInit Enter\n", 1, 2, 3, 4, 5, 6); phyInfo = (_88E1111_PHY *)pCookie; if(!(phyInfo->state & _88E1111_PHY_PRE_INITED)) { _88E1111PHYDBG(_88E1111PHYDBG_INIT, "_88E1111PhyUnInit never pre inited\n", 1, 2, 3, 4, 5, 6); return (ERROR); } if(phyInfo->state & _88E1111_PHY_INITED) { phyInfo->virPhy.intDisable(phyInfo->virPhy.vecNum); phyInfo->virPhy.intDisConnect(phyInfo->virPhy.vecNum); phyInfo->state &= ~_88E1111_PHY_INITED; } #if 0 /* disable auto fiber/copper select and set mode to GMII-to-FIBER */ phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_EXSST, &value,phyInfo->virPhy.pDrvCtrl); value &= ~_88E1111_PHY_EXSST_HWCFG_MODE_MASK; value |= _88E1111_PHY_EXSST_HWCFG_MODE_GMII_FIBER; 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); /* bakup register page */ phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_EXADD, &bakValue,phyInfo->virPhy.pDrvCtrl); /* disable fiber int enable */ value = _88E1111_PHY_EXADD_FIBER; phyInfo->virPhy.write((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_EXADD, value,phyInfo->virPhy.pDrvCtrl); value = 0; phyInfo->virPhy.write((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_INTEN, value,phyInfo->virPhy.pDrvCtrl); /* set mode to GMII-to-COPPER and disable copper int enable */ phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_EXSST, &value,phyInfo->virPhy.pDrvCtrl); value &= ~_88E1111_PHY_EXSST_HWCFG_MODE_MASK; value |= _88E1111_PHY_EXSST_HWCFG_MODE_GMII_COPPER; 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); value = _88E1111_PHY_EXADD_COPPER; phyInfo->virPhy.write((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_EXADD, value,phyInfo->virPhy.pDrvCtrl); value = 0; phyInfo->virPhy.write((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_INTEN, value,phyInfo->virPhy.pDrvCtrl); /* restore register page */ phyInfo->virPhy.write((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_EXADD, bakValue,phyInfo->virPhy.pDrvCtrl); /* enable auto fiber/copper select and now work in GMII-to-Copper */ 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);#endif phyInfo->state &= ~_88E1111_PHY_PRE_INITED; _88E1111PHYDBG(_88E1111PHYDBG_INIT, "_88E1111PhyUnInit Exit\n", 1, 2, 3, 4, 5, 6); return (OK);}LOCAL STATUS _88E1111Phyioctl(DRV_VIR_PHY *pCookie, int cmd, caddr_t data){ _88E1111_PHY * phyInfo; int error = OK; UINT16 regValue; UINT16 value; _88E1111PHYDBG(_88E1111PHYDBG_IOCTL, "_88E1111Phyioctl Enter\n", 1, 2, 3, 4, 5, 6); phyInfo = (_88E1111_PHY *)pCookie; switch ((UINT32) cmd) { case PHY_GET_LINK_STATE: case PHY_GET_FC_TYPE: case PHY_GET_10_M_LINK_FD: case PHY_GET_100_M_LINK_FD: case PHY_GET_1000_M_LINK_FD: case PHY_GET_1000_M_LINK_OK: if(NULL == data) { return (ERROR); } break; default: break; } switch ((UINT32) cmd) { case PHY_GET_LINK_STATE: error = phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_SPSTA, ®Value,phyInfo->virPhy.pDrvCtrl); if(OK == error) { if ((regValue & _88E1111_PHY_SPSTA_LINK_UP) && (regValue != 0xffff)) { *(UINT32*)data = PHY_LINK_UP; } else { *(UINT32*)data = PHY_LINK_DOWN; } } _88E1111PHYDBG(_88E1111PHYDBG_IOCTL, "_88E1111Phyioctl PHY_GET_LINK_STATE %d\n", *(UINT32*)data , 2, 3, 4, 5, 6); break; case PHY_GET_FC_TYPE: error = phyInfo->virPhy.read((UINT8)phyInfo->virPhy.phyAddr,(UINT8)_88E1111_PHY_REG_EXSST, ®Value,phyInfo->virPhy.pDrvCtrl); if(OK == error) { if(regValue & _88E1111_PHY_EXSST_FCAUTO_SEL) { if(_88E1111_PHY_EXSST_HWCFG_MODE_GMII_COPPER == (regValue & _88E1111_PHY_EXSST_HWCFG_MODE_MASK)) { *(UINT32*)data = PHY_COPEER_LINK; } else if(_88E1111_PHY_EXSST_HWCFG_MODE_GMII_FIBER == (regValue & _88E1111_PHY_EXSST_HWCFG_MODE_MASK)) { *(UINT32*)data = PHY_FIBER_LINK; } else { error = ERROR; } } else { 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_LINK_UP) { if(regValue & _88E1111_PHY_EXSST_FC_RESOLVE) { *(UINT32*)data = PHY_FIBER_LINK; } else { *(UINT32*)data = PHY_COPEER_LINK;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -