HG255D出现ieee80211 phy0: rt2x00queue_write_tx_frame: Error问题的解决

2015-04-15 14:25:17| 分类: 计算机与 Interne | 标签:openwrt hg255d (从我的网易博客复制)

  前一段时间在网上低价(每个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上网,应该也无所谓了。

后记:

在经过很长一段时间的运行后还是出现了wifi发送队列满的问题,后来通过dmesg显示日志,发现应该是当时的内存满了,导致驱动程序无法申请内存导致的,可能是由于很多无线连接占用了不少内存引发的现象,这个问题应该在64M的机器上不会出现。
于是手工加了个监控脚本搞定(至少不会连不上wifi了):

# crontab -l
* * * * * /root/rewifi.sh

# cat /root/rewifi.sh
#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin
dmesg|tail -10|grep "Dropping frame due to full tx queue 2"
if [ $? -eq 0 ]; then
        wifi down
        rmmod rt2800soc rt2800mmio rt2x00soc rt2800lib rt2x00mmio rt2x00lib mac80211 cfg80211
        insmod cfg80211
        insmod mac80211
        insmod rt2x00lib
        insmod rt2x00mmio
        insmod rt2800lib
        insmod rt2x00soc
        insmod rt2800mmio
        insmod rt2800soc
        wifi up
fi
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值