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