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

📄 88e1111phy.c

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