sln.1550

HG255D出现ieee80211 phy0: rt2x00queue_write_tx_frame

前一段时间在网上低价(每个10元)买了几个坏的HG255D路由器,修好了在家里用上次的2元摄像头做监控。也有一些做wifi热点,方便上网,但是wifi发现用久了以后有时候会出现无法连接的问题,后来登陆到对应的路由器上看日志,发现会出现一大段无线网卡驱动的错误日志,如下: 

ieee80211 phy0: rt2x00queue_write_tx_frame: Error - Dropping frame due to full tx queue 2

后来再网上查,也没找的说彻底解决的,后来又下了openwrt的14.07 branch (Barrier Breaker),重新编译后,运行也一样会出现相同的提示,wifi也不能使用。后来找了很久,通过相关的链接,找到两个补丁,虽然我的内核版本比较老,但是代码是类似的,下面提供修改方法:

第一个是rt2x00queue.c文件,一共有两个目录里有这个文件:

./build_dir/linux-ramips_rt305x/compat-wireless-2014-05-22/drivers/net/wireless/rt2x00/rt2x00queue.c ./build_dir/linux-ramips_rt305x/linux-3.3.8/drivers/net/wireless/rt2x00/rt2x00queue.c

我只改动了第二个目录里的文件(其实是第一处忘了改),改动的代码是把加tx_lock提前到函数开始的地方,diff如下:

diff -ru linux-3.10.12/drivers/net/wireless/rt2x00/rt2x00queue.c build_dir/target-mipsel_dsp_uClibc-0.9.33.2/linux-ramips_rt305x/linux-3.10.12/drivers/net/wireless/rt2x00/rt2x00queue.c
--- linux-3.10.12/drivers/net/wireless/rt2x00/rt2x00queue.c 2013-09-14 17:55:12.000000000 +0400
+++ build_dir/target-mipsel_dsp_uClibc-0.9.33.2/linux-ramips_rt305x/linux-3.10.12/drivers/net/wireless/rt2x00/rt2x00queue.c 2013-09-22 15:46:43.482533962 +0400
@@ -645,6 +645,11 @@
int ret = 0;
 
 /*
+ * That function must be called with bh disabled.
+ */
+ spin_lock(&queue->tx_lock);
+
+ /*
 * Copy all TX descriptor information into txdesc,
 * after that we are free to use the skb->cb array
 * for our information.
@@ -693,11 +698,6 @@
else if (test_bit(REQUIRE_DMA, &queue->rt2x00dev->cap_flags))
rt2x00queue_align_frame(skb);
 
- /*
- * That function must be called with bh disabled.
- */
- spin_lock(&queue->tx_lock);
-
if (unlikely(rt2x00queue_full(queue))) {
rt2x00_err(queue->rt2x00dev, "Dropping frame due to full tx queue %d\n",
queue->qid);

第二个是修改./build_dir/linux-ramips_rt305x/compat-wireless-2014-05-22/drivers/net/wireless/rt2x00/rt2800mmio.c,修改队列的尺寸: 

--- a/drivers/net/wireless/rt2x00/rt2800mmio.c
+++ b/drivers/net/wireless/rt2x00/rt2800mmio.c
@@ -711,7 +711,7 @@ void rt2800mmio_queue_init(struct data_q
case QID_AC_VI:
case QID_AC_BE:
case QID_AC_BK:
- queue->limit = 64;
+ queue->limit = 128;
queue->data_size = AGGREGATION_SIZE;
queue->desc_size = TXD_DESC_SIZE;
queue->winfo_size = txwi_size;

修改完这两处以后,重新编译,在刷进固件,一直跑了好几天一直没出现过问题,个人感觉是第二个起了作用,因为之前光改第一个也是会出现。 


运行一段时间偶尔会出现这样的提示:

ieee80211 phy0: rt2800mmio_txstatus_is_spurious: Warning - 4 spurious TX_FIFO_STATUS interrupt(s)

ieee80211 phy0: rt2800mmio_txdone: Warning - Got TX status for an empty queue 2, dropping

但是却不影响wifi上网,应该也无所谓了。

评论

热度(10)