📄 rtl8139config.c
字号:
}
/************************************************************************
* 函数名称: SetRtl8139State
* 功能描述: 设置8139的各种状态
* 输入参数: unit: 网口的设备号,如rtl0的0
* ucState 网口状态,见rtl8139Config.h中的宏定义
* 输出参数: 无
* 返 回 值: OK: 成功
ERROR:失败
* 其它说明: 仅供内部测试用
* 修改日期: 版本号 修改人 修改内容
* -----------------------------------------------
* 2002/05/21 V1.0 邹同亮 创建
************************************************************************/
STATUS SetRtl8139State(int unit,unsigned char ucState)
{
RTL81X9END_DEVICE *pDrvCtrl = NULL;
USHORT wBMCR =0;
ULONG dwTxConfig =0;
/* 判断网口是否存在,不存在返回 */
pDrvCtrl = (RTL81X9END_DEVICE *)endFindByName("rtl", unit);
if(pDrvCtrl == NULL )
{
return ERROR;
}
rtl81x9CsrWriteWord(pDrvCtrl, RTL_REGS_INTR_MASK, 0x00, NONE);
dwTxConfig = rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_TX_CONFIG, RTL_WIN_0);
wBMCR = rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_MII_BMCR, RTL_WIN_0);
/* 检查并配置8139为正常工作状态 */
if( ucState == RTL8139_STATE_NORM)
{
rtl81x9CsrWriteWord(pDrvCtrl, RTL_REGS_MII_BMCR, wBMCR|0x3000, RTL_WIN_0); /* 自动协商 */
rtl81x9CsrWriteLong(pDrvCtrl, RTL_REGS_TX_CONFIG, (dwTxConfig&0xfff9ffff), RTL_WIN_0); /* 非自环 */
rtl81x9CsrWriteWord (pDrvCtrl, RTL_REGS_INTR_MASK, RTL_VALID_INTERRUPTS, NONE);
taskDelay(20);
return OK;
}
rtl81x9CsrWriteWord(pDrvCtrl, RTL_REGS_MII_BMCR, wBMCR&0xefff, RTL_WIN_0); /* 配置各种状态前先禁止网口的自动协商功能 */
wBMCR = rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_MII_BMCR, RTL_WIN_0);
/* 检查并配置8139为自环状态 */
if(ucState & RTL8139_STATE_LOOP)
{
rtl81x9CsrWriteLong(pDrvCtrl, RTL_REGS_TX_CONFIG, (dwTxConfig|0x00060000), RTL_WIN_0);
taskDelay(20);
}
/* 检查并配置8139速度为100M */
if(ucState & RTL8139_STATE_100M)
{
/* 100M */
rtl81x9CsrWriteWord(pDrvCtrl, RTL_REGS_MII_BMCR, (wBMCR|0x2100), RTL_WIN_0);
}
/* 检查并配置8139速度为10M */
if(ucState & RTL8139_STATE_10M)
{
/* 10M */
rtl81x9CsrWriteWord(pDrvCtrl, RTL_REGS_MII_BMCR, (wBMCR&0xcfff), RTL_WIN_0);
}
taskDelay(10);
rtl81x9CsrWriteWord (pDrvCtrl, RTL_REGS_INTR_MASK, RTL_VALID_INTERRUPTS, NONE);
return OK;
}
/************************************************************************
* 函数名称: Get8139Reg
* 功能描述: 打印8139的寄存器
* 输入参数: pDrvCtrl:网口设备控制块指针
* ucBegin: 要打印寄存器开始偏移地址
* ucEnd: 要打印寄存器结束偏移地址
* 输出参数: 无
* 返 回 值: 无
* 其它说明: 仅供内部测试用,供GetRtl8139Info调用
* 修改日期: 版本号 修改人 修改内容
* -----------------------------------------------
* 2002/05/21 V1.0 邹同亮 创建
************************************************************************/
void Get8139Reg(RTL81X9END_DEVICE *pDrvCtrl, unsigned char ucBegin, unsigned char ucEnd)
{
if((RTL_REGS_TX_STATUS0 >= ucBegin) && (ucEnd >= RTL_REGS_TX_STATUS0))
printf("RTL_REGS_TX_STATUS0: 0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_TX_STATUS0, RTL_WIN_0));
if((RTL_REGS_TX_STATUS1 >= ucBegin) && (ucEnd >= RTL_REGS_TX_STATUS1))
printf("RTL_REGS_TX_STATUS1: 0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_TX_STATUS1, RTL_WIN_0));
if((RTL_REGS_TX_START_NOR_0 >= ucBegin) && (ucEnd >= RTL_REGS_TX_START_NOR_0))
printf("RTL_REGS_TX_START_NOR_0: 0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_TX_START_NOR_0, RTL_WIN_0));
if((RTL_REGS_TX_START_NOR_1 >= ucBegin) && (ucEnd >= RTL_REGS_TX_START_NOR_1))
printf("RTL_REGS_TX_START_NOR_1: 0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_TX_START_NOR_1, RTL_WIN_0));
if((RTL_REGS_TX_START_HIGH_0 >= ucBegin) && (ucEnd >= RTL_REGS_TX_START_HIGH_0))
printf("RTL_REGS_TX_START_HIGH_0: 0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_TX_START_HIGH_0, RTL_WIN_0));
if((RTL_REGS_TX_START_HIGH_1 >= ucBegin) && (ucEnd >= RTL_REGS_TX_START_HIGH_1))
printf("RTL_REGS_TX_START_HIGH_1: 0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_TX_START_HIGH_1, RTL_WIN_0));
if((RTL_REGS_RX_EARLY_CNT >= ucBegin) && (ucEnd >= RTL_REGS_RX_EARLY_CNT))
printf("RTL_REGS_RX_EARLY_CNT: 0x%04x\n",rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_RX_EARLY_CNT, RTL_WIN_0));
if((RTL_REGS_RX_EARLY_STATUS >= ucBegin) && (ucEnd >= RTL_REGS_RX_EARLY_STATUS))
printf("RTL_REGS_RX_EARLY_STATUS: 0x%02x\n",rtl81x9CsrReadByte(pDrvCtrl, RTL_REGS_RX_EARLY_STATUS, RTL_WIN_0));
if((RTL_REGS_CHIP_CMD >= ucBegin) && (ucEnd >= RTL_REGS_CHIP_CMD))
printf("RTL_REGS_CHIP_CMD: 0x%02x\n",rtl81x9CsrReadByte(pDrvCtrl, RTL_REGS_CHIP_CMD, RTL_WIN_0));
if((RTL_REGS_INTR_MASK >= ucBegin) && (ucEnd >= RTL_REGS_INTR_MASK))
printf("RTL_REGS_INTR_MASK: 0x%04x\n",rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_INTR_MASK, RTL_WIN_0));
if((RTL_REGS_INTR_STATUS >= ucBegin) && (ucEnd >= RTL_REGS_INTR_STATUS))
printf("RTL_REGS_INTR_STATUS: 0x%04x\n",rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_INTR_STATUS, RTL_WIN_0));
if((RTL_REGS_TX_CONFIG >= ucBegin) && (ucEnd >= RTL_REGS_TX_CONFIG))
printf("RTL_REGS_TX_CONFIG: 0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_TX_CONFIG, RTL_WIN_0));
if((RTL_REGS_RX_CONFIG >= ucBegin) && (ucEnd >= RTL_REGS_RX_CONFIG))
printf("RTL_REGS_RX_CONFIG: 0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_RX_CONFIG, RTL_WIN_0));
if((RTL_REGS_TIMER >= ucBegin) && (ucEnd >= RTL_REGS_TIMER))
printf("RTL_REGS_TIMER: 0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_TIMER, RTL_WIN_0));
if((RTL_REGS_RX_MISSED >= ucBegin) && (ucEnd >= RTL_REGS_RX_MISSED))
printf("RTL_REGS_RX_MISSED: 0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_RX_MISSED, RTL_WIN_0));
if((RTL_REGS_CFG_9346 >= ucBegin) && (ucEnd >= RTL_REGS_CFG_9346))
printf("RTL_REGS_CFG_9346: 0x%02x\n",rtl81x9CsrReadByte(pDrvCtrl, RTL_REGS_CFG_9346, RTL_WIN_0));
if((RTL_REGS_CONFIG_0 >= ucBegin) && (ucEnd >= RTL_REGS_CONFIG_0))
printf("RTL_REGS_CONFIG_0: 0x%02x\n",rtl81x9CsrReadByte(pDrvCtrl, RTL_REGS_CONFIG_0, RTL_WIN_0));
if((RTL_REGS_CONFIG_1 >= ucBegin) && (ucEnd >= RTL_REGS_CONFIG_1))
printf("RTL_REGS_CONFIG_1: 0x%02x\n",rtl81x9CsrReadByte(pDrvCtrl, RTL_REGS_CONFIG_1, RTL_WIN_0));
if((RTL_REGS_TIMERINT >= ucBegin) && (ucEnd >= RTL_REGS_TIMERINT))
printf("RTL_REGS_TIMERINT: 0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_TIMERINT, RTL_WIN_0));
if((RTL_REGS_MSR >= ucBegin) && (ucEnd >= RTL_REGS_MSR))
printf("RTL_REGS_MSR: 0x%02x\n",rtl81x9CsrReadByte(pDrvCtrl, RTL_REGS_MSR, RTL_WIN_0));
if((RTL_REGS_CONFIG3 >= ucBegin) && (ucEnd >= RTL_REGS_CONFIG3))
printf("RTL_REGS_CONFIG3: 0x%02x\n",rtl81x9CsrReadByte(pDrvCtrl, RTL_REGS_CONFIG3, RTL_WIN_0));
if((RTL_REGS_MII >= ucBegin) && (ucEnd >= RTL_REGS_MII))
printf("RTL_REGS_MII: 0x%02x\n",rtl81x9CsrReadByte(pDrvCtrl, RTL_REGS_MII, RTL_WIN_0));
if((RTL_REGS_MULTI_INTR >= ucBegin) && (ucEnd >= RTL_REGS_MULTI_INTR))
printf("RTL_REGS_MULTI_INTR: 0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_MULTI_INTR, RTL_WIN_0));
if((RTL_REGS_MII_BMCR >= ucBegin) && (ucEnd >= RTL_REGS_MII_BMCR))
printf("RTL_REGS_MII_BMCR: 0x%04x\n",rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_MII_BMCR, RTL_WIN_0));
if((RTL_REGS_MII_BMSR >= ucBegin) && (ucEnd >= RTL_REGS_MII_BMSR))
printf("RTL_REGS_MII_BMSR: 0x%04x\n",rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_MII_BMSR, RTL_WIN_0));
if((RTL_REGS_NWAY_ADVERT >= ucBegin) && (ucEnd >= RTL_REGS_NWAY_ADVERT))
printf("RTL_REGS_NWAY_ADVERT: 0x%04x\n",rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_NWAY_ADVERT, RTL_WIN_0));
if((RTL_REGS_NWAY_LPAR >= ucBegin) && (ucEnd >= RTL_REGS_NWAY_LPAR))
printf("RTL_REGS_NWAY_LPAR: 0x%04x\n",rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_NWAY_LPAR, RTL_WIN_0));
if((RTL_REGS_NWAY_EXPANSION >= ucBegin) && (ucEnd >= RTL_REGS_NWAY_EXPANSION))
printf("RTL_REGS_NWAY_EXPANSION: 0x%04x\n",rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_NWAY_EXPANSION, RTL_WIN_0));
if((RTL_REGS_DIS >= ucBegin) && (ucEnd >= RTL_REGS_DIS))
printf("RTL_REGS_DIS: 0x%04x\n",rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_DIS, RTL_WIN_0));
if((RTL_REGS_FCSC >= ucBegin) && (ucEnd >= RTL_REGS_FCSC))
printf("RTL_REGS_FCSC: 0x%04x\n",rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_FCSC, RTL_WIN_0));
if((RTL_REGS_NWAYTR >= ucBegin) && (ucEnd >= RTL_REGS_NWAYTR))
printf("RTL_REGS_NWAYTR: 0x%04x\n",rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_NWAYTR, RTL_WIN_0));
if((RTL_REGS_CSCR >= ucBegin) && (ucEnd >= RTL_REGS_CSCR))
printf("RTL_REGS_CSCR: 0x%04x\n",rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_CSCR, RTL_WIN_0));
if((RTL_REGS_PARA_78 >= ucBegin) && (ucEnd >= RTL_REGS_PARA_78))
printf("RTL_REGS_PARA_78: 0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_PARA_78, RTL_WIN_0));
if((RTL_REGS_PARA_7c >= ucBegin) && (ucEnd >= RTL_REGS_PARA_7c))
printf("RTL_REGS_PARA_7c: 0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_PARA_7c, RTL_WIN_0));
if((RTL_REGS_TPPOLL >= ucBegin) && (ucEnd >= RTL_REGS_TPPOLL))
printf("RTL_REGS_TPPOLL: 0x%02x\n",rtl81x9CsrReadByte(pDrvCtrl, RTL_REGS_TPPOLL, RTL_WIN_0));
if((RTL_REGS_CPCR >= ucBegin) && (ucEnd >= RTL_REGS_CPCR))
printf("RTL_REGS_CPCR: 0x%04x\n",rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_CPCR, RTL_WIN_0));
if((RTL_REGS_RDSAR_0 >= ucBegin) && (ucEnd >= RTL_REGS_RDSAR_0))
printf("RTL_REGS_RDSAR_0: 0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_RDSAR_0, RTL_WIN_0));
if((RTL_REGS_RDSAR_1 >= ucBegin) && (ucEnd >= RTL_REGS_RDSAR_1))
printf("RTL_REGS_RDSAR_1: 0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_RDSAR_1, RTL_WIN_0));
if((RTL_REGS_ETTHR >= ucBegin) && (ucEnd >= RTL_REGS_ETTHR))
printf("RTL_REGS_ETTHR: 0x%02x\n",rtl81x9CsrReadByte(pDrvCtrl, RTL_REGS_ETTHR, RTL_WIN_0));
}
/************************************************************************
* 函数名称: GetRxTxDescriptor
* 功能描述: 打印8139的Descriptor值
* 输入参数: pDrvCtrl:网口设备控制块指针
* 输出参数: 无
* 返 回 值: 无
* 其它说明: 仅供内部测试用,供GetRtl8139Info调用
* 修改日期: 版本号 修改人 修改内容
* -----------------------------------------------
* 2002/05/21 V1.0 邹同亮 创建
************************************************************************/
void GetRxTxDescriptor(RTL81X9END_DEVICE *pDrvCtrl)
{
unsigned long dwRxCmd[64];
unsigned long dwTxCmd[64];
int i =0;
RTL_RMD *pRmd = (RTL_RMD *)NULL;
RTL_TMD *pTmd = (RTL_TMD *)NULL;
/* 获取 */
for (i=0; i<64 ; i++)
{
pRmd = ( RTL_RMD *)(pDrvCtrl->ptrRxBufSpace + 16*i);
dwRxCmd[i] = LONGSWAP(pRmd->cmd_leng);
}
for (i=0; i<64 ; i++)
{
pTmd = ( RTL_TMD *)(pDrvCtrl->ptrTxBufSpace + 16*i);
dwTxCmd[i] = LONGSWAP(pTmd->cmd_leng);
}
/* 打印 */
printf("rmdIndex:%d, tmdIndex:%d, tmdIndexC:%d\n", pDrvCtrl->rmdIndex, pDrvCtrl->tmdIndex, pDrvCtrl->tmdIndexC);
printf("RxDesciptor:\n");
for (i=0; i<64 ; i++)
{
if(((i+1)%8) ==0)
{
printf("%08lx,%08lx,%08lx,%08lx,%08lx,%08lx,%08lx,%08lx\n",dwRxCmd[i-7],dwRxCmd[i-6],dwRxCmd[i-5],dwRxCmd[i-4],dwRxCmd[i-3],dwRxCmd[i-2],dwRxCmd[i-1],dwRxCmd[i]);
}
}
printf("TxDesciptor:\n");
for (i=0; i<64 ; i++)
{
if(((i+1)%8) ==0)
{
printf("%08lx,%08lx,%08lx,%08lx,%08lx,%08lx,%08lx,%08lx\n",dwTxCmd[i-7],dwTxCmd[i-6],dwTxCmd[i-5],dwTxCmd[i-4],dwTxCmd[i-3],dwTxCmd[i-2],dwTxCmd[i-1],dwTxCmd[i]);
}
}
}
/************************************************************************
* 函数名称: Get8139Counter
* 功能描述: 打印8139的统计值
* 输入参数: pDrvCtrl:网口设备控制块指针
* 输出参数: 无
* 返 回 值: 无
* 其它说明: 仅供内部测试用,供GetRtl8139Info调用
* 修改日期: 版本号 修改人 修改内容
* -----------------------------------------------
* 2002/05/21 V1.0 邹同亮 创建
************************************************************************/
void Get8139Counter(RTL81X9END_DEVICE *pDrvCtrl)
{
unsigned long *pCouterBase =NULL;
if(pCouterBase == NULL)
{
pCouterBase = (unsigned long *)malloc (0x200);
pCouterBase = (unsigned long *) ( ( (unsigned long)pCouterBase + 63) & ((unsigned long)~63));
}
rtl81x9CsrWriteLong(pDrvCtrl, RTL_REGS_TX_STATUS0, ((unsigned long)pCouterBase) | 0x8, RTL_WIN_0);
rtl81x9CsrWriteLong(pDrvCtrl, RTL_REGS_TX_STATUS1, 0, RTL_WIN_0);
while( (rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_TX_STATUS0, RTL_WIN_0) & 0x8) !=0 )
{
taskDelay(1);
}
printf("TxOk = %ld%ld\n", LONGSWAP(*(pCouterBase +1)), LONGSWAP(*pCouterBase));
printf("RxOk = %ld%ld\n", LONGSWAP(*(pCouterBase +3)), LONGSWAP(*(pCouterBase +2)));
printf("TxErr = %ld%ld\n", LONGSWAP(*(pCouterBase +5)), LONGSWAP(*(pCouterBase +4)));
printf("RxErr = %ld\n", LONGSWAP(*(pCouterBase +6)));
printf("MissPkt = %d\n", WORDSWAP(*((unsigned short*)(pCouterBase +7))));
printf("FAE = %d\n", WORDSWAP(*((unsigned short*)(pCouterBase +7) +1)));
printf("Tx1Col = %ld\n", LONGSWAP(*(pCouterBase +8)));
printf("TxMCol = %ld\n", LONGSWAP(*(pCouterBase +9)));
printf("RxOkPhy = %ld%ld\n", LONGSWAP(*(pCouterBase +11)), LONGSWAP(*(pCouterBase +10)));
printf("RxOkBrd = %ld%ld\n", LONGSWAP(*(pCouterBase +13)), LONGSWAP(*(pCouterBase +12)));
printf("RxOkMul = %ld\n", LONGSWAP(*(pCouterBase +14)));
printf("TxAbt = %d\n", WORDSWAP(*((unsigned short*)(pCouterBase +15))));
printf("TxUndrn = %d\n", WORDSWAP(*((unsigned short*)(pCouterBase +15) +1)));
}
/************************************************************************
* 函数名称: GetRtl8139Info
* 功能描述: 打印8139的各种信息
* 输入参数: unit: 网口的设备号,如rtl0的0
* ucInfo 网口信息类型,见rtl8139Config.h中的宏定义
* 输出参数: 无
* 返 回 值: OK: 成功
ERROR:失败
* 其它说明: 仅供内部测试用
* 修改日期: 版本号 修改人 修改内容
* -----------------------------------------------
* 2002/05/21 V1.0 邹同亮 创建
************************************************************************/
STATUS GetRtl8139Info(int unit,unsigned char ucInfo)
{
RTL81X9END_DEVICE *pDrvCtrl = NULL;
pDrvCtrl = (RTL81X9END_DEVICE *)endFindByName("rtl", unit);
if(pDrvCtrl == NULL )
{
return ERROR;
}
/* 打印8139的寄存器 */
if(ucInfo & RTL8139_INFO_REG)
{
Get8139Reg(pDrvCtrl, 0x00, 0xff);
}
/* 打印8139的GetRxTxDescriptor */
if(ucInfo & RTL8139_INFO_DESCP)
{
GetRxTxDescriptor(pDrvCtrl);
}
/* 打印8139的统计记数器 */
if(ucInfo & RTL8139_INFO_COUNT)
{
Get8139Counter(pDrvCtrl);
}
/* 打印8139对应设备的缓冲池统计 */
if(ucInfo & RTL8139_INFO_POOL)
{
netPoolShow(pDrvCtrl->end.pNetPool);
}
return OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -