导言
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、 硬件渠道简介
图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上常常有突发的数据包,而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个发送描述符,有各自的发送状况寄存器TSD0~TSD3和发送开始地址寄存器TSAD0~TSAD3,每个发送描述符可发送1个数据包。在函数Rtl8139Send()中请求1个发送数据包缓冲区,将协议栈传下来的数据包复制进该缓冲区,然后将该缓冲区的首地址写入发送开始地址寄存器,最终填写发送状况寄存器,并将其OWN方位0,表明将该缓冲区交给RTL8139的发送DMA办理,发动发送操作。发送完结后RTL8139发生中止,进人中止服务程序Rtl8139Int(),调用Rtl8139HandleSendInt(),在该函数中读取发送状况寄存器。假如OWN位为1,则表明发送DMA操作完结,开释相应的发送缓冲;不然表明发送DMA操作未完结,该发送缓冲仍由RTL8139硬件一切,下次进入发送中止再从头检查OWN位。如此循环往复,直到OWN位变为1,才干开释相应的发送缓冲,其占用的发送描述符变为可用。
以上进程可归结为两点:
a)在Rtl8139Send()中请求1个数据包缓冲区,占用1个发送描述符;
b)在Rtl8139Int()中开释相应的数据包缓冲区和发送描述符。
从以上剖析能够看出,只需发包的这两个环节不出问题,发包流程就不会中止,别的,在Rtl8139HandleSendInt()中,不是只是开释1个包缓冲和描述符,而是将一切发动过发包操作、发送状况寄存器的OWN位变为1的描述符和相应包缓冲都开释掉。这样可增强程序的安稳性,在有突发包的情况下,CPU或许来不及呼应中止,即形成中止丢掉,但只需还有1个描述符可用,发包完结后能进中止,就能够把曾经占用的缓冲和描述符悉数开释掉。假如突发包太多,CPU接连4个发包中止未呼应,发送描述符全被占用,下次进入Rtl8139Send()将无发送描述符可用,也就不会再有发包中止,Rtl8139HandleSendInt()不会被调用,发送描述符无法开释,发包流程就此中止,不能康复,这便是上述RTL8139不能ping通的原因。
3 、处理办法
依据以上剖析,只需将被占用的发送描述符和发送缓冲开释,发包流程才干康复,这只需调用一次Rtl8139HandleSendInt()就能完结。MPC8241片内集成有4个守时器(TimerO~TImer3),能够运用其间的TImerO来发生硬件守时中止。在中止服务程序中,以Rtl8139HandleSendInt函数指针作为进口参数调用netJobAdd(),这样就能够守时履行Rtl8139HandleSendInt(),及时开释被占用的发送描述符。这需求在Rtl8139Start()中增加如下代码:
其间:(pDrvCtrl-》TxRingFree《0)表明没有闲暇发送描述符。
修正后的驱动再用前文介绍的办法测验,Sniffer发包中止后,RTL8139能康复。改用Smartbit测验,以半双工、10 Mbit/s线速给RTL8139发包,发包中止后,RTL8139仍能康复。用Smartbit以1 200pps匀速率给RTL8139发包,包长240字节。测验成果为:RTL8139不丢包,CPU占用率45%。
4 、结束语
选用本文介绍的办法改善RTL8139驱动,能有效地增强程序的鲁棒性,又不会下降功率,在交换机终端上长时刻运转安稳,功能彻底满足要求。
责任编辑:gt