VxWorks系統(tǒng)下的RTL8139驅動程序改進
引言
RTL8139是臺灣Realtek半導體公司生產的一種快速以太網控制器,提供符合PCI2.2標準的接口,兼容IEEE802.3u 100BASE-T規(guī)范,支持IEEE-802.3x全雙工流量控制,支持10Mbit.s-1/100Mbit.s-1全雙工、半雙工自適應,價格便宜,性能穩(wěn)定,是PC機、電信終端產品中應用最多的以太網控制器之一。RTL8139在各種操作系統(tǒng)下的驅動都能從Realtek公司網頁下載,其中包括 VxWorks系統(tǒng)下的驅動,而且提供C源代碼。但是在嵌入式系統(tǒng)下,針對不同的硬件平臺,往往需要修改該驅動程序以提高其穩(wěn)定性和效率?;?MPC8241 CPU的硬件平臺,本文提出RTL8139在VxWorks系統(tǒng)下驅動程序的改進措施。
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,其作用是轉發(fā)由話音信號打成的數(shù)據(jù)包,要求1200pps(每秒數(shù)據(jù)包),且CPU占用率不高于50%。
VxWorks支持END(增加型網絡驅動)格式的以太網控制器驅動,提供MUX層作為網絡協(xié)議和以太網控制器驅動間的接口,MUX規(guī)定了驅動的接口函數(shù),RTL8139驅動程序Rtl8139End.c是完全按照END格式編寫的代碼,提供了所有MUX層規(guī)定的接口函數(shù),只要寫好RTL8139 PCI配制空間寄存器,在sysRtl8139End.c中傳入PCI空間首地址、中斷向量號和中斷優(yōu)先級參數(shù),按照END格式驅動裝載程序,裝載成功后 RTL8139就能順利運行。
2 驅動程序中需要解決的問題
如果數(shù)據(jù)包的收發(fā)速率是均勻的,RTL8139完全可以達到前文提出的要求,但是Internet上經常有突發(fā)的數(shù)據(jù)包,而RTL8139的接收FIFO和發(fā)送FIFO 都只有2Kb,加之RTL8139對收發(fā)數(shù)據(jù)包采取完全拷貝方式,在數(shù)據(jù)包突發(fā)期間,CPU占用率過高,來不及處理過多的數(shù)據(jù)包,從而造成丟包。在 Rtl8139End.c中,驅動的數(shù)據(jù)包緩沖和協(xié)議棧的內存池是完全分開的,數(shù)據(jù)包接收和發(fā)送都有1次拷貝過程,而高性能以太網控制器一般只在發(fā)送時需要拷貝1次,這樣每收發(fā)一個包,CPU需要多拷貝1次,這是導致RTL8139性能不高的重要原因,但這種包處理方式是由硬件決定的,驅動程序不能改變。事實上,在突發(fā)包很多的情況下,以太網控制器丟包是允許的,但突發(fā)時間過后,應恢復正常的收發(fā)包流程。但在前文介紹的硬件平臺上運行 Rtl8139End.c,在PC機上用Sniffer以連續(xù)方式給RTL8139發(fā)數(shù)據(jù)包,測試時間為數(shù)十秒,停止發(fā)包后,在PC機上用ping命令測試RTL8139能否正常回包,結果不能ping通,表明RTL8139的收發(fā)包流程因突發(fā)包太多而中斷,且不能恢復。
分析Rtl8139End.c程序,其發(fā)送數(shù)據(jù)包流程如圖2所示。
RTL8139有4個發(fā)送描述符,有各自的發(fā)送狀態(tài)寄存器TSD0~TSD3和發(fā)送起始地址寄存器TSAD0~TSAD3,每個發(fā)送描述符可發(fā)送1個數(shù)據(jù)包。在函數(shù)Rtl8139Send()中申請1個發(fā)送數(shù)據(jù)包緩沖區(qū),將協(xié)議棧傳下來的數(shù)據(jù)包拷貝進該緩沖區(qū),然后將該緩沖區(qū)的首地址寫入發(fā)送起始地址寄存器,最后填寫發(fā)送狀態(tài)寄存器,并將其OWN位置0,表示將該緩沖區(qū)交給RTL8139的發(fā)送DMA管理,啟動發(fā)送操作。發(fā)送完成后 RTL8139產生中斷,進人中斷服務程序Rtl8139Int(),調用Rtl8139HandleSendInt(),在該函數(shù)中讀取發(fā)送狀態(tài)寄存器。如果OWN位為1,則表示發(fā)送DMA操作完成,釋放相應的發(fā)送緩沖;否則表示發(fā)送DMA操作未完成,該發(fā)送緩沖仍由RTL8139硬件所有,下次進入發(fā)送中斷再重新查看OWN位。如此循環(huán)往復,直到OWN位變?yōu)?,才能釋放相應的發(fā)送緩沖,其占用的發(fā)送描述符變?yōu)榭捎谩?/p>
以上過程可歸結為兩點:
a)在Rtl8139Send()中申請1個數(shù)據(jù)包緩沖區(qū),占用1個發(fā)送描述符;
b)在Rtl8139Int()中釋放相應的數(shù)據(jù)包緩沖區(qū)和發(fā)送描述符。
從以上分析可以看出,只要發(fā)包的這兩個環(huán)節(jié)不出問題,發(fā)包流程就不會中斷,另外,在Rtl8139HandleSendInt()中,不是僅僅釋放1個包緩沖和描述符,而是將所有啟動過發(fā)包操作、發(fā)送狀態(tài)寄存器的OWN位變?yōu)?的描述符和相應包緩沖都釋放掉。這樣可增強程序的穩(wěn)定性,在有突發(fā)包的情況下,CPU可能來不及響應中斷,即造成中斷丟失,但只要還有1個描述符可用,發(fā)包完成后能進中斷,就可以把以前占用的緩沖和描述符全部釋放掉。如果突發(fā)包太多,CPU連續(xù)4個發(fā)包中斷未響應,發(fā)送描述符全被占用,下次進入Rtl8139Send()將無發(fā)送描述符可用,也就不會再有發(fā)包中斷, Rtl8139HandleSendInt()不會被調用,發(fā)送描述符無法釋放,發(fā)包流程就此中斷,不能恢復,這就是上述RTL8139不能ping通的原因。
[!--empirenews.page--]
3 解決辦法
根據(jù)以上分析,只有將被占用的發(fā)送描述符和發(fā)送緩沖釋放,發(fā)包流程才能恢復,這只要調用一次Rtl8139HandleSendInt()就能實現(xiàn)。MPC8241片內集成有4個定時器 (TimerO~Timer3),可以使用其中的TimerO來產生硬件定時中斷。在中斷服務程序中,以Rtl8139HandleSendInt函數(shù)指針作為入口參數(shù)調用netJobAdd(),這樣就可以定時執(zhí)行Rtl8139HandleSendInt(),及時釋放被占用的發(fā)送描述符。這需要在 Rtl8139Start()中添加如下代碼:
其中:(pDrvCtrl->TxRingFree<0)表示沒有空閑發(fā)送描述符。
修改后的驅動再用前文介紹的方法測試,Sniffer發(fā)包停止后,RTL8139能恢復。改用Smartbit測試,以半雙工、10 Mbit/s線速給RTL8139發(fā)包,發(fā)包停止后,RTL8139仍能恢復。用Smartbit以1 200pps勻速率給RTL8139發(fā)包,包長240字節(jié)。測試結果為:RTL8139不丟包,CPU占用率45%。
4 結束語
采用本文介紹的方法改進RTL8139驅動,能有效地增強程序的魯棒性,又不會降低效率,在交換機終端上長時間運行穩(wěn)定,性能完全滿足要求。