ecos无线驱动掉线问题解决方案分析
1、無(wú)線數(shù)據(jù)包的主要數(shù)據(jù)流(從pci總線到phy error)
PCIDRVTAB_ENTRY
wl_pci_probeàwl_attach
netdev_attach
wl_dpc
wl_ecos_comm_wlc_dpc
wlc_dpc(出現(xiàn)tx phy error)
2、出現(xiàn)問(wèn)題
當(dāng)使用大流量無(wú)線數(shù)據(jù)包沖擊路由器的時(shí)候,會(huì)出現(xiàn)無(wú)線掉線丟包嚴(yán)重,甚至掉線問(wèn)題,(特別是使用迅雷下載)但是正常使用不會(huì)出現(xiàn)該現(xiàn)象。
3、問(wèn)題分析
分析問(wèn)題主要是原廠和我方溝通、討論,最主要的是修改然后驗(yàn)證結(jié)果,定位到問(wèn)題點(diǎn)是大流量無(wú)線數(shù)據(jù)包沖擊路由器的時(shí)候,出現(xiàn)phy發(fā)不出數(shù)據(jù)包,然后無(wú)線出現(xiàn)掉線。原廠原來(lái)的給的補(bǔ)丁如下:
static int phy_err_cnt = 0;
phy_err_cnt++;
if( phy_err_cnt >= 3 )
{
WL_ERROR((“wl%d: HAMMERING info, CNT = %d\n”, wlc_hw->unit , wlc_hw->phyerr_cnt ));
wl_init(wlc->wl);
phy_err_cnt = 0;
}
patch原理:
在wlc_dpc要向上層發(fā)送數(shù)據(jù)包是,phy累計(jì)3次沒(méi)有發(fā)出數(shù)據(jù)包,則調(diào)用wl_init。這種辦法不能完全規(guī)避問(wèn)題,只是暫時(shí)緩解,有的時(shí)候甚至根本沒(méi)有效果,并且如果出現(xiàn)一次無(wú)線掉線問(wèn)題,會(huì)連續(xù)出現(xiàn),所以原廠給的這種規(guī)避措施根本沒(méi)有效果。
4、 解決辦法
原廠從我方提供的日志文件和與我方的溝通和驗(yàn)證中,導(dǎo)致phy分析出現(xiàn)異常的可能原因,經(jīng)過(guò)多次的驗(yàn)證,得出結(jié)論:
1) 無(wú)線收發(fā)數(shù)據(jù)包的緩沖隊(duì)列溢出;
2) 無(wú)線數(shù)據(jù)包進(jìn)入ampdu模塊出現(xiàn)異常
鑒于以上兩點(diǎn),暫時(shí)無(wú)法從根本上解決問(wèn)題,所以給出了以下的規(guī)避方法:
1)當(dāng)rx緩沖隊(duì)列溢出時(shí),添加清空緩沖隊(duì)列的處理,并設(shè)置wl_init標(biāo)志位為1
在接收到無(wú)線數(shù)據(jù)包后,無(wú)線收包緩沖隊(duì)列一系列的數(shù)據(jù)會(huì)被更新;可能出現(xiàn)的情況是,phy發(fā)不出數(shù)據(jù)包的時(shí)候,是因?yàn)闊o(wú)線緩沖隊(duì)列已經(jīng)溢出,重啟無(wú)線wl_init,但是重啟后無(wú)線緩沖隊(duì)列并沒(méi)有被釋放,當(dāng)再次接收到無(wú)線數(shù)據(jù)包的時(shí)候,還是會(huì)出現(xiàn)rx緩沖隊(duì)列overflow,所以還是會(huì)連續(xù)出現(xiàn)無(wú)線掉線情況;
這種情況的規(guī)避措施:
在收到無(wú)線數(shù)據(jù)包的時(shí)候,更新緩沖隊(duì)列接收數(shù)據(jù)長(zhǎng)度之前,使用一個(gè)臨時(shí)變量,記錄原來(lái)的緩沖隊(duì)列的溢出長(zhǎng)度,然后接收數(shù)據(jù)包,更新緩沖隊(duì)列的數(shù)據(jù),得到新的緩沖隊(duì)列的溢出長(zhǎng)度。如果緩沖隊(duì)列有溢出,則重啟無(wú)線;
在ampdu(無(wú)線聚合)模塊中,在wlc_ampdu_resp_timeout函數(shù)中,當(dāng)ampud的應(yīng)答器超時(shí)時(shí),原來(lái)做了一些處理,比如一些統(tǒng)計(jì)信息的遞增,主要做的工作是wlc_ampdu_release_all_ordered,丟掉了對(duì)應(yīng)的ampdu的隊(duì)里中的一部分包,然后等待下一個(gè)數(shù)據(jù)包序列到達(dá),我們添加的動(dòng)作是設(shè)置wl_init的標(biāo)志位為1。
3)添加Big_hammer機(jī)制
為了解決視屏卡頓,在wlc_watchdog_timer中,添加big_hammer機(jī)制。如果phyerr_cnt累計(jì)3次發(fā)不出包,或是數(shù)據(jù)包在插入tx的有優(yōu)先級(jí)權(quán)重隊(duì)列過(guò)程失敗或是tx隊(duì)列累計(jì)3次,內(nèi)存塊釋放失敗時(shí),設(shè)置視頻卡頓的標(biāo)志位為1,啟用Big_hammer。
4)wl_init/Big_hammer/Wl_down對(duì)無(wú)線處理比較
wl_init 在保留原來(lái)連接不斷開(kāi)的情況下,調(diào)用wl_reste重置無(wú)線的一些模塊,比如bmac和ampdu以及phy等,然后調(diào)用wlc_reinit對(duì)reset的模塊進(jìn)行重新初始化,在此過(guò)程中,只會(huì)極少的丟包,客戶端幾乎感知不到;
wl_bighammer在保留原來(lái)連接不斷開(kāi)的情況下,清空rx緩沖隊(duì)列,down掉無(wú)線但是調(diào)用wlc_radio_upd迅速恢復(fù),并調(diào)用wl_join恢復(fù)無(wú)線連接
wl_down 會(huì)關(guān)閉無(wú)線,斷開(kāi)無(wú)線連接。
三者的對(duì)無(wú)線的影響由小到大,恢復(fù)時(shí)間由短到長(zhǎng),處理也會(huì)從表面更深入。其實(shí),選擇wl_bighammer是對(duì)wl_init和wl_down的一種折中,既不會(huì)導(dǎo)致無(wú)線掉線,也會(huì)從一定程度上恢復(fù)無(wú)線的基本功能,使之正常運(yùn)行。
5、無(wú)線性能測(cè)試項(xiàng)
無(wú)線主要測(cè)試一下項(xiàng)目:
1、無(wú)線近距離和遠(yuǎn)距離lan到wan、無(wú)線加密、無(wú)線橋接(wisp、wds、apclient)
2、無(wú)線無(wú)干擾環(huán)境下衰減、穿墻(分別穿1、2、3堵墻)、無(wú)線覆蓋
3、無(wú)線抗干擾、掛機(jī)老化、高低溫、待機(jī)量、小包轉(zhuǎn)發(fā)
總結(jié)
以上是生活随笔為你收集整理的ecos无线驱动掉线问题解决方案分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: goahead content-leng
- 下一篇: BRCM eCos下的编译及问题