0 引言
RTL8139是台湾Realtek半导体公司生产的一种快速以太网控制器,提供符合PCI2.2标准的接口,兼容 IEEE802.3u 100BASE-T规范,支持IEEE-802.3x全双工流量控制,支持10Mbit.s-1/100Mbit.s-1全双工、半双工自适应,价格便宜,性能稳定,是PC机、电信终端产品中应用最多的以太网控制器之一。RTL8139在各种操作系统下的驱动都能从Realtek公司网页下载,其中包括 VxWorks系统下的驱动,而且提供C源代码。但是在嵌入式系统下,针对不同的硬件平台,往往需要修改该驱动程序以提高其稳定性和效率。基于 MPC8241 CPU的硬件平台,本文提出RTL8139在VxWorks系统下驱动程序的改进措施。
1 硬件平台简介
 
CPU采用Motorola公司的PowerPC系列处理器之一的MPC8241,该芯片除嵌入32位PowerPC处理器内核外,还集成了 MPC107桥,提供PCI接口与RTL8139连接,桥上有内存控制器,挂16MB SDRAM和4 MBFlash。CPU时钟是166MHz控制工程网版权所有,SDRAM时钟是66MHz,PCI时钟是33MHz,RTL8139工作在10Mbit/s,半双工方式,通过集线器(HUB)连入Internet,其作用是转发由话音信号打成的数据包,要求1200pps(每秒数据包),且CPU占用率不高于50%。
VxWorks 支持END(增加型网络驱动)格式的以太网控制器驱动,提供MUX层作为网络协议和以太网控制器驱动间的接口,MUX规定了驱动的接口函数, RTL8139驱动程序Rtl8139End.c是完全按照END格式编写的代码控制工程网版权所有,提供了所有MUX层规定的接口函数,只要写好RTL8139 PCI配制空间寄存器,在sysRtl8139End.c中传入PCI空间首地址、中断向量号和中断优先级参数,按照END格式驱动装载程序,装载成功后 RTL8139就能顺利运行。
2 驱动程序中需要解决的问题
如果数据包的收发速率是均匀的,RTL8139完全可以达到前文提出的要求,但是Internet上经常有突发的数据包www.cechina.cn,而RTL8139的接收 FIFO和发送FIFO都只有2Kb,加之RTL8139对收发数据包采取完全拷贝方式,在数据包突发期间,CPU占用率过高,来不及处理过多的数据包,从而造成丢包。在Rtl8139End.c中,驱动的数据包缓冲和协议栈的内存池是完全分开的,数据包接收和发送都有1次拷贝过程,而高性能以太网控制器一般只在发送时需要拷贝1次,这样每收发一个包,CPU需要多拷贝1次,这是导致RTL8139性能不高的重要原因,但这种包处理方式是由硬件决定的,驱动程序不能改变。事实上,在突发包很多的情况下,以太网控制器丢包是允许的,但突发时间过后,应恢复正常的收发包流程。但在前文介绍的硬件平台上运行 Rtl8139End.c,在PC机上用Sniffer以连续方式给RTL8139发数据包,测试时间为数十秒,停止发包后,在PC机上用ping命令测试RTL8139能否正常回包,结果不能ping通,表明RTL8139的收发包流程因突发包太多而中断,且不能恢复。
分析Rtl8139End.c程序控制工程网版权所有,其发送数据包流程如图2所示。
RTL8139有4个发送描述符CONTROL ENGINEERING China版权所有,有各自的发送状态寄存器TSD0~TSD3和发送起始地址寄存器TSAD0~TSAD3,每个发送描述符可发送1 个数据包。在函数Rtl8139Send()中申请1个发送数据包缓冲区,将协议栈传下来的数据包拷贝进该缓冲区,然后将该缓冲区的首地址写入发送起始地址寄存器,最后填写发送状态寄存器,并将其OWN位置0,表示将该缓冲区交给RTL8139的发送