📄 rtl8139config.c
字号:
/************************************************************************
* 版权所有 (C)2003, 深圳市中兴通讯股份有限公司。
*
* 文件名称: rtl8139Config.c
* 文件标识:
* 内容摘要: 提供对8139的各种配置函数
* 其它说明: 暂无
* 当前版本: V1.0
* 作 者: 邹同亮
* 完成日期: 2003年1月11日
*
* 修改记录1:增加了读写8139寄存器和Descriptor的函数,并加了注释
* 修改日期:2003-5-20
* 版 本 号:
* 修 改 人:
* 修改内容:
* 修改记录2:…
************************************************************************/
#include "vxWorks.h"
#include "muxlib.h"
#include "etherLib.h"
#include "end.h"
#include "endLib.h"
#include "ifLib.h"
#include "ipProto.h"
#include "rtl8139Config.h"
#include "rtlcpp.h"
IMPORT STATUS ipDetach(int unit, char * pDevice );
IMPORT void netPoolShow(NET_POOL_ID pNetPool);
/************************************************************************
* 函数名称: Set8139DeviceNum
* 功能描述: 初始化8139对应的资源表入口
* 输入参数: unit: 网口的设备号,如rtl0的0
* pciBus: PCI总线号
* pciDevice:网口PCI设备号
* pciFunc: 网口PCI功能号
* 输出参数: 无
* 返 回 值: OK: 加载成功
ERROR: 加载不成功
* 其它说明: 无
* 修改日期: 版本号 修改人 修改内容
* -----------------------------------------------
* 2002/12/24 V1.0 汪康宏 创建
* 2003/03/28 V1.01 邹同亮 设置前先判断是否存在
************************************************************************/
STATUS Set8139DeviceNum(int unit, UINT32 pciBus, UINT32 pciDevice, UINT32 pciFunc)
{
UINT32 membaseCsr; /* 网口内存空间基地址 */
UINT32 iobaseCsr; /* 网口IO空间基地址 */
UINT16 deviceId; /* 设备类型号 */
char irq; /* 网口中断向量号 */
/* 填写PCI设备表 */
pRsrc [unit] = rtl81x9PciResrcs + unit;
pRsrc [unit]->pciBus = pciBus;
pRsrc [unit]->pciDevice = pciDevice;
pRsrc [unit]->pciFunc = pciFunc;
UnitNum++;
needScan8139 = 0;
pciConfigInWord (pciBus, pciDevice, pciFunc, PCI_CFG_DEVICE_ID, &deviceId);
if ((RTL_DEVICEID_8129 != deviceId) && (RTL_DEVICEID_8139 != deviceId))
{
return(ERROR);
}
pRsrc [unit] = rtl81x9PciResrcs + unit;
/* 获得网口PCI的内存基地址、IO基地址、中断向量号 */
pciConfigInLong (pRsrc[unit]->pciBus,
pRsrc[unit]->pciDevice,
pRsrc[unit]->pciFunc,
PCI_CFG_BASE_ADDRESS_0, &iobaseCsr);
pciConfigInLong (pRsrc[unit]->pciBus,
pRsrc[unit]->pciDevice,
pRsrc[unit]->pciFunc,
PCI_CFG_BASE_ADDRESS_1, &membaseCsr);
pciConfigInByte (pRsrc[unit]->pciBus,
pRsrc[unit]->pciDevice,
pRsrc[unit]->pciFunc,
PCI_CFG_DEV_INT_LINE, &irq);
membaseCsr &= PCI_MEMBASE_MASK;
iobaseCsr &= PCI_IOBASE_MASK;
/* 填写到资源表 */
pRsrc[unit]->membaseCsr = membaseCsr;
pRsrc[unit]->iobaseCsr = iobaseCsr;
pRsrc[unit]->irq = irq;
pRsrc[unit]->irqvec = irq;
/* 使能内存空间和IO空间映射 */
pciConfigOutWord ( pRsrc[unit]->pciBus,
pRsrc[unit]->pciDevice,
pRsrc[unit]->pciFunc,
PCI_CFG_COMMAND, PCI_CMD_IO_ENABLE |
PCI_CMD_MEM_ENABLE | PCI_CMD_MASTER_ENABLE);
/* 禁止睡眠模式 */
pciConfigOutWord (pRsrc[unit]->pciBus,
pRsrc[unit]->pciDevice,
pRsrc[unit]->pciFunc,
PCI_CFG_MODE,
SLEEP_MODE_DIS);
return OK;
}
/************************************************************************
* 函数名称: init8139net
* 功能描述: 加载8139网口
* 输入参数: unit: 网口的设备号,如rtl0的0
* pciBus: PCI总线号
* pciDevice:网口PCI设备号
* pciFunc: 网口PCI功能号
* clusterNum:网口缓冲区大小,缺省值为2000
* 输出参数: 无
* 返 回 值: OK: 加载成功
ERROR: 加载不成功
* 其它说明: 无
* 修改日期: 版本号 修改人 修改内容
* -----------------------------------------------
* 2002/12/24 V1.0 邹同亮 创建
************************************************************************/
STATUS init8139net(int unit, UINT32 pciBus, UINT32 pciDevice, UINT32 pciFunc, UINT32 clusterNum)
{
void *pInitC;
/* 初始化8139对应的资源表入口 */
if(Set8139DeviceNum(unit, pciBus, pciDevice, pciFunc) !=OK)
{
return ERROR;
}
g_ul8139ClusterNum = clusterNum;
/* 加载8139设备到mux并启动之 */
pInitC = (void *)muxDevLoad(unit,
sysRtlcpEndLoad,
"",
1, NULL);
if (pInitC == NULL)
{
printf("muxLoad failed!\n");
return ERROR;
}
else
{
if (muxDevStart(pInitC) != OK)
{
printf("muxDevStart failed!\n");
return ERROR;
}
}
return OK;
}
/************************************************************************
* 函数名称: Get8139MacAddr
* 功能描述: 用于获得8139的mac地址
* 输入参数: unit: 网口的设备号,如rtl0的0
* 输出参数: pucAddr: 用于传出MAC地址.为6个字节的数组,如0x00,0x01,0xaf,0x04,
0xb,0x16
* 返 回 值: OK: 成功
ERROR: 不成功
* 其它说明: 无
* 修改日期: 版本号 修改人 修改内容
* -----------------------------------------------
* 2002/12/24 V1.0 马书宇 创建
************************************************************************/
STATUS Get8139MacAddr(int unit, unsigned char * pucAddr)
{
END_OBJ *FindEnd;
char NetDevice[5] = "rtl";
FindEnd = endFindByName(NetDevice,unit);
if(FindEnd == NULL)
{
printf("endFindByName error\n");
return (ERROR);
}
if((*(FindEnd->pFuncTable->ioctl))(FindEnd->devObject.pDevice, EIOCGADDR, pucAddr) == ERROR)
{
printf("GetNetMac error\n");
return (ERROR);
}
return (OK);
}
/************************************************************************
* 函数名称: Set8139MacAddr
* 功能描述: 用于动态修改8139的mac地址
* 输入参数: unit: 网口的设备号,如rtl0的0
pucAddr: 用于传入MAC地址.为6个字节的数组,如0x00,0x01,0xaf,0x04,
0xb,0x16
* 输出参数: 无
* 返 回 值: OK: 成功
ERROR: 不成功
* 其它说明: 修改网口MAC地址之前,必须保存当前掩码和IP地址,卸掉协议栈,
修改之后,再装载协议栈,恢复原来地掩码和IP地址
* 修改日期: 版本号 修改人 修改内容
* -----------------------------------------------
* 2002/12/24 V1.0 马书宇 创建
************************************************************************/
STATUS Set8139MacAddr(int unit, unsigned char * pucAddr)
{
END_OBJ *FindEnd;
char IpAddress[40];
int NetMask[2];
char NetDevice[4] = "rtl";
char DeviceName[4] = "rtl";
NetDevice[3] = unit + 0x30;
/* 判断网口是否存在 */
FindEnd = endFindByName(DeviceName, unit);
if(FindEnd == NULL)
{
printf("endFindByName error\n");
return (ERROR);
}
/* 修改前先保存一些IP层信息,为修改后恢复用 */
if(ifMaskGet(NetDevice, NetMask) == ERROR)
{
printf("ifMaskGet error\n");
return (ERROR);
}
if(ifAddrGet(NetDevice, IpAddress) == ERROR)
{
printf("ifAddrGet error\n");
return (ERROR);
}
if(ipDetach(unit, DeviceName) == ERROR)
{
printf("ipDetach error\n");
return (ERROR);
}
/* 修改MAC地址 */
if((*(FindEnd->pFuncTable->ioctl))(FindEnd->devObject.pDevice, EIOCSADDR, pucAddr) == ERROR)
{
printf("SetNetMac error\n");
return (ERROR);
}
/* 恢复以前的设置 */
if(ipAttach (unit, DeviceName) == ERROR)
{
printf("ipAttach error\n");
return (ERROR);
}
if(ifMaskSet(NetDevice, *NetMask) == ERROR)
{
printf("ifMaskSet error\n");
return (ERROR);
}
if(ifAddrSet(NetDevice, IpAddress) == ERROR)
{
printf("ifAddrSet error, errno:%x\n",errno);
/* return (ERROR); */
}
return (OK);
}
/************************************************************************
* 函数名称: Set8139MacWithoutIP
* 功能描述: 用于动态修改8139的mac地址
* 输入参数: unit: 网口的设备号,如rtl0的0
pucAddr: 用于传入MAC地址.为6个字节的数组,如0x00,0x01,0xaf,0x04,
0xb,0x16
* 输出参数: 无
* 返 回 值: OK: 成功
ERROR: 不成功
* 其它说明: 用于没有加vxWorks协议栈的网口的MAC地址修改
* 修改日期: 版本号 修改人 修改内容
* -----------------------------------------------
* 2003/06/16 V1.0 邹同亮 创建
************************************************************************/
STATUS Set8139MacWithoutIP(int unit, unsigned char * pucAddr)
{
END_OBJ * FindEnd;
char IpAddress[40];
int NetMask;
char DeviceName[4] = "rtl";
char NetDevice[4] = "rtl";
NetDevice[3] = unit + 0x30;
/* 判断网口是否存在 */
FindEnd = endFindByName(DeviceName, unit);
if(FindEnd == NULL)
{
printf("endFindByName error\n");
return (ERROR);
}
/* 修改MAC地址 */
if((*(FindEnd->pFuncTable->ioctl))(FindEnd->devObject.pDevice, EIOCSADDR, pucAddr)==ERROR)
{
printf("SetNetMac error\n");
return (ERROR);
}
return (OK);
}
/************************************************************************
* 函数名称: writeethead8139
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -