⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 88e1111phy.c

📁 freescale mottsec 千兆单元驱动源码
💻 C
📖 第 1 页 / 共 2 页
字号:
#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, &regValue,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, &regValue,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;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -