找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 18638|回复: 84

【2018-10-10】分享一个解决mtk7620a/n开源无线驱动频繁无故断流的痛点的方法,

  [复制链接]
发表于 2018-10-9 22:40 | 显示全部楼层 |阅读模式
本帖最后由 hello_limin 于 2018-10-11 14:09 编辑

1,Stanislaw Gruszka 大神已经发布了相应补丁,我只是停供一个移植的方法,方便编译适合你自己用的版本,以下图的这个版本为例,

内核是4.9,开源无线驱动是 backports-2017-11-01.tar.xz





2,具体用得到的几个补丁见下图红框里的部分,



以及再加上一个经典的 999-rt2x00-queue-update.patch


其实你可以偷懒,直接从master源码里拷贝粘贴出来到目标文件夹里。




3,务必移除一个非必要补丁,600-23-rt2x00-rt2800mmio-add-a-workaround-for-spurious-TX_F.patch ,
位置在 [sources] / package / kernel / mac80211/ patches / 文件夹里,



接着就是修改 [sources] / package / kernel / mac80211 / 里的 Makefile 文件了,添加一行代码 rt2x00-mmio然后剩下的工作就是编译固件,enjoy it


==================== 接下来是编译过程中遇到问题的解决办法=======================






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

评分

参与人数 2恩山币 +2 收起 理由
safehorse + 1 What a 牛X技术贴!
weihua153 + 1 给力

查看全部评分

我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2018-10-9 22:48 | 显示全部楼层
本帖最后由 hello_limin 于 2018-10-11 14:14 编辑

第1个,就是我在编译的过程中卡在了 704-rt2x00-use-different-txstatus-timeouts-when-flushing.patch 这个补丁,仔细看了看,是 rt2x00mac.c 打不上,后来想到 999-rt2x00-queue-update.patch 这个里面也有对 rt2x00mac.c 进行打补丁,ok 那我就将704里这卡住的部分剪切粘贴到999补丁里,
嘿 移花接木居然编译通过了,歪打正着

举此贴中案例如下,kernel version : 4.9.58 + mac80211 wireless version : backports-2017-11-01.tar.xz

A. 贴上卡壳的 704-rt2x00-use-different-txstatus-timeouts-when-flushing.patch 补丁修改后的**码,
  1. From feb87977b6d251fb01a329905719e45908f6c939 Mon Sep 17 00:00:00 2001
  2. From: Stanislaw Gruszka <sgruszka@redhat.com>
  3. Date: Fri, 10 Aug 2018 12:31:55 +0200
  4. Subject: [PATCH 4/5] rt2x00: use different txstatus timeouts when flushing

  5. Use different tx status timeouts for normal operation and when flushing.
  6. This increase timeout to 2s for normal operation as when there are bad
  7. radio conditions and frames are reposted many times device can not provide
  8. the status for quite long. With new timeout we can still get valid status
  9. on such bad conditions.

  10. Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
  11. ---
  12. .../net/wireless/ralink/rt2x00/rt2800lib.c    | 31 +++++++++++++------
  13. drivers/net/wireless/ralink/rt2x00/rt2x00.h   |  1 +
  14. .../net/wireless/ralink/rt2x00/rt2x00mac.c    |  4 +++
  15. 3 files changed, 26 insertions(+), 10 deletions(-)

  16. diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
  17. index 0c56c7dca55f..595cb9c90b81 100644
  18. --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
  19. +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
  20. @@ -1137,36 +1137,47 @@ void rt2800_txdone(struct rt2x00_dev *rt2x00dev)
  21. }
  22. EXPORT_SYMBOL_GPL(rt2800_txdone);

  23. -static inline bool rt2800_entry_txstatus_timeout(struct queue_entry *entry)
  24. +static inline bool rt2800_entry_txstatus_timeout(struct rt2x00_dev *rt2x00dev,
  25. +                                                 struct queue_entry *entry)
  26. {
  27. -        bool tout;
  28. +        bool ret;
  29. +        unsigned long tout;

  30.          if (!test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags))
  31.                  return false;

  32. -        tout = time_after(jiffies, entry->last_action + msecs_to_jiffies(500));
  33. -        if (unlikely(tout))
  34. +        if (test_bit(DEVICE_STATE_FLUSHING, &rt2x00dev->flags))
  35. +                tout = msecs_to_jiffies(100);
  36. +        else
  37. +                tout = msecs_to_jiffies(2000);
  38. +
  39. +        ret = time_after(jiffies, entry->last_action + tout);
  40. +        if (unlikely(ret))
  41.                  rt2x00_dbg(entry->queue->rt2x00dev,
  42.                             "TX status timeout for entry %d in queue %d\n",
  43.                             entry->entry_idx, entry->queue->qid);
  44. -        return tout;
  45. -
  46. +        return ret;
  47. }

  48. bool rt2800_txstatus_timeout(struct rt2x00_dev *rt2x00dev)
  49. {
  50.          struct data_queue *queue;
  51.          struct queue_entry *entry;
  52. +        unsigned long tout;
  53. +
  54. +        if (test_bit(DEVICE_STATE_FLUSHING, &rt2x00dev->flags))
  55. +                tout = msecs_to_jiffies(50);
  56. +        else
  57. +                tout = msecs_to_jiffies(1000);

  58. -        if (time_before(jiffies,
  59. -                        rt2x00dev->last_nostatus_check + msecs_to_jiffies(500)))
  60. +        if (time_before(jiffies, rt2x00dev->last_nostatus_check + tout))
  61.                  return false;

  62.          rt2x00dev->last_nostatus_check = jiffies;

  63.          tx_queue_for_each(rt2x00dev, queue) {
  64.                  entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE);
  65. -                if (rt2800_entry_txstatus_timeout(entry))
  66. +                if (rt2800_entry_txstatus_timeout(rt2x00dev, entry))
  67.                          return true;
  68.          }

  69. @@ -1195,7 +1206,7 @@ void rt2800_txdone_nostatus(struct rt2x00_dev *rt2x00dev)
  70.                                  break;

  71.                          if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags) ||
  72. -                            rt2800_entry_txstatus_timeout(entry))
  73. +                            rt2800_entry_txstatus_timeout(rt2x00dev, entry))
  74.                                  rt2x00lib_txdone_noinfo(entry, TXDONE_FAILURE);
  75.                          else
  76.                                  break;
  77. diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00.h b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
  78. index af062cda4a23..4b1744e9fb78 100644
  79. --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
  80. +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
  81. @@ -665,6 +665,7 @@ enum rt2x00_state_flags {
  82.          DEVICE_STATE_STARTED,
  83.          DEVICE_STATE_ENABLED_RADIO,
  84.          DEVICE_STATE_SCANNING,
  85. +        DEVICE_STATE_FLUSHING,

  86.          /*
  87.           * Driver configuration
复制代码


B, 贴上突发奇想的 999-rt2x00-queue-update.patch 补丁修改后的**码,
  1. --- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
  2. +++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
  3. @@ -700,7 +700,7 @@ void rt2800mmio_queue_init(struct data_queue *queue)

  4.          switch (queue->qid) {
  5.          case QID_RX:
  6. -                queue->limit = 128;
  7. +                queue->limit = 256;
  8.                  queue->data_size = AGGREGATION_SIZE;
  9.                  queue->desc_size = RXD_DESC_SIZE;
  10.                  queue->winfo_size = rxwi_size;
  11. @@ -711,7 +711,7 @@ void rt2800mmio_queue_init(struct data_queue *queue)
  12.          case QID_AC_VI:
  13.          case QID_AC_BE:
  14.          case QID_AC_BK:
  15. -                queue->limit = 64;
  16. +                queue->limit = 128;
  17.                  queue->data_size = AGGREGATION_SIZE;
  18.                  queue->desc_size = TXD_DESC_SIZE;
  19.                  queue->winfo_size = txwi_size;
  20. --- a/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c
  21. +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c
  22. @@ -26,6 +26,7 @@

  23. #include "rt2x00.h"
  24. #include "rt2x00lib.h"
  25. +#include "rt2x00queue.h"

  26. static int rt2x00mac_tx_rts_cts(struct rt2x00_dev *rt2x00dev,
  27.                                  struct data_queue *queue,
  28. @@ -115,6 +116,26 @@ void rt2x00mac_tx(struct ieee80211_hw *hw,
  29.          if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags))
  30.                  goto exit_free_skb;

  31. +        /* Dirty hack for Queue overrun protection,
  32. +         * if AC_VO/AC_VI/AC_BE is full, use next queue.
  33. +         * if AC_BK is full use previous queue.
  34. +         */
  35. +        if (qid < 4) {
  36. +                queue = rt2x00queue_get_tx_queue(rt2x00dev, qid);
  37. +                if (unlikely(rt2x00queue_full(queue))) {
  38. +                        switch (qid) {
  39. +                                case 0: /* QID_AC_VO */
  40. +                                case 1: /* QID_AC_VI */
  41. +                                case 2: /* QID_AC_BE */
  42. +                                        qid ++;
  43. +                                        break;
  44. +                                case 3: /* QID_AC_BK */
  45. +                                        qid --;
  46. +                                        break;
  47. +                        }
  48. +                }
  49. +        }
  50. +
  51.          /*
  52.           * Use the ATIM queue if appropriate and present.
  53.           */
  54. +        /* 以下此处是我突发奇想的, *^_^*
  55. +         * 解决704-rt2x00-use-different-txstatus-timeouts-when-flushing.patch,
  56. +         * 卡壳 rt2x00mac.c 打不上补丁的点子.
  57. +         */
  58. @@ -742,10 +742,14 @@ void rt2x00mac_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
  59.   if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags))
  60.       return;
  61. +     set_bit(DEVICE_STATE_FLUSHING, &rt2x00dev->flags);
  62. +
  63.   tx_queue_for_each(rt2x00dev, queue)
  64.     if (!rt2x00queue_empty(queue))
  65.       rt2x00queue_flush_queue(queue, drop);
  66. +
  67. +     clear_bit(DEVICE_STATE_FLUSHING, &rt2x00dev->flags);     
  68.   }
  69.   EXPORT_SYMBOL_GPL(rt2x00mac_flush);

  70.   int rt2x00mac_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
  71. +        /* 以上此处是我突发奇想的, *^_^*
  72. +         * 解决704-rt2x00-use-different-txstatus-timeouts-when-flushing.patch,
  73. +         * 卡壳 rt2x00mac.c 打不上补丁的点子.
  74. +         */
  75. --- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c
  76. +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c
  77. @@ -1211,16 +1211,40 @@ void rt2x00queue_uninitialize(struct rt2x00_dev *rt2x00dev)
  78. static void rt2x00queue_init(struct rt2x00_dev *rt2x00dev,
  79.                               struct data_queue *queue, enum data_queue_qid qid)
  80. {
  81. +        /* Use default values for each queue type */
  82. +        unsigned short cwmin = 5, cwmax = 10, aifs = 2, txop = 0;
  83. +
  84. +        switch (qid) {
  85. +                case QID_AC_VO:
  86. +                        cwmin = 2;
  87. +                        cwmax = 3;
  88. +                        txop = 47;
  89. +                        break;
  90. +                case QID_AC_VI:
  91. +                        cwmin = 3;
  92. +                        cwmax = 4;
  93. +                        txop = 94;
  94. +                        break;
  95. +                case QID_AC_BE:
  96. +                        cwmin = 4;
  97. +                        aifs = 3;
  98. +                        break;
  99. +                case QID_AC_BK:
  100. +                        cwmin = 4;
  101. +                        aifs = 7;
  102. +                        break;
  103. +        }
  104. +
  105.          mutex_init(&queue->status_lock);
  106.          spin_lock_init(&queue->tx_lock);
  107.          spin_lock_init(&queue->index_lock);

  108.          queue->rt2x00dev = rt2x00dev;
  109.          queue->qid = qid;
  110. -        queue->txop = 0;
  111. -        queue->aifs = 2;
  112. -        queue->cw_min = 5;
  113. -        queue->cw_max = 10;
  114. +        queue->txop = txop;
  115. +        queue->aifs = aifs;
  116. +        queue->cw_min = cwmin;
  117. +        queue->cw_max = cwmax;

  118.          rt2x00dev->ops->queue_init(queue);

复制代码




我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2018-10-9 22:49 来自手机 | 显示全部楼层
2.4G问题多吧,我一直用的5G,感觉没事儿

点评

@dato 老哥你也是遇到相同的问题了?  详情 回复 发表于 2018-10-10 11:06
我在斐讯fir302m (mt7620n)和 路由宝 L1 (mt7620a)上都试了,通过这十多天的使用感觉挺好  详情 回复 发表于 2018-10-9 23:01
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2018-10-9 22:59 | 显示全部楼层
第2个,就是之前我遇到”Dropping frame due to full tx queue 2“的情况,看到之前有帖子分析说是开源驱动里mtk无线信号的发送接收不一致造成的,那我就果断修改一下 999-rt2x00-queue-update.patch ,将这两处都改成相同的数值256

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2018-10-9 23:01 | 显示全部楼层
hcyme 发表于 2018-10-9 22:49
2.4G问题多吧,我一直用的5G,感觉没事儿

我在斐讯fir302m (mt7620n)和 路由宝 L1 (mt7620a)上都试了,通过这十多天的使用感觉挺好
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2018-10-9 23:36 来自手机 | 显示全部楼层
人才啊,再接再厉,把网件驱动也随便移植过来

点评

网件驱动在哪儿有?可以看看?  详情 回复 发表于 2018-10-10 07:50
能力有限,望尘莫及  详情 回复 发表于 2018-10-10 00:20
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2018-10-10 00:08 来自手机 | 显示全部楼层
op没有同步到官方源码吗?

点评

官方的是4.14内核,我编译完了使用起来觉得很卡,就想着看看能不能降级下来,结果还算满意,比之前未应用补丁的开源驱动强多了  详情 回复 发表于 2018-10-10 00:23
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2018-10-10 00:20 来自手机 | 显示全部楼层
dzhuqi567 发表于 2018-10-9 23:36
人才啊,再接再厉,把网件驱动也随便移植过来

能力有限,望尘莫及
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2018-10-10 00:23 来自手机 | 显示全部楼层
123hundun123 发表于 2018-10-10 00:08
op没有同步到官方源码吗?

官方的是4.14内核,我编译完了使用起来觉得很卡,就想着看看能不能降级下来,结果还算满意,比之前未应用补丁的开源驱动强多了
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2018-10-10 01:36 | 显示全部楼层
能否提交到lean开源的git上?

点评

不能,本来就是开源共享的,为什么要贡献给他私有源?其实你同步他的源码以后,你自己简单修改一下就好,祝你玩机愉快  详情 回复 发表于 2018-10-10 05:27
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2018-10-10 05:27 来自手机 | 显示全部楼层
victor2002 发表于 2018-10-10 01:36
能否提交到lean开源的git上?

不能,本来就是开源共享的,为什么要贡献给他私有源?其实你同步他的源码以后,你自己简单修改一下就好,祝你玩机愉快
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2018-10-10 07:50 来自手机 | 显示全部楼层
你这个方法就是官方的最新master rt2800无线补丁,不需要kuoruan的,lean的源码不需要这个补丁,他同步官方的时候就已经有这个补丁了,另外方法不全,要删除一个补丁后加这几个补丁

点评

官方的最新master是用的4.14内核,开源无线驱动是 backports-4.19-rc5-1.tar.xz ,我现在将它降级到 4.9 4.4 4.1 3.18 内核使用,算不算半原创 mod 版?本来就是开源的东西,大家都分享共享一份力量,你说对不对呢?  详情 回复 发表于 2018-10-10 07:59
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2018-10-10 07:50 来自手机 | 显示全部楼层
dzhuqi567 发表于 2018-10-9 23:36
人才啊,再接再厉,把网件驱动也随便移植过来

网件驱动在哪儿有?可以看看?

点评

哪儿有什么网件驱动?他大概说的是用博通芯片的机器吧?  详情 回复 发表于 2018-10-10 08:14
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2018-10-10 07:59 | 显示全部楼层
kochiya 发表于 2018-10-10 07:50
你这个方法就是官方的最新master rt2800无线补丁,不需要kuoruan的,lean的源码不需要这个补丁,他同步官方 ...

官方的最新master是用的4.14内核,开源无线驱动是 backports-4.19-rc5-1.tar.xz ,我现在将它降级到 4.9 4.4 4.1 3.18 内核使用,算不算半原创 mod 版?本来就是开源的东西,大家都分享共享一份力量,你说对不对呢?

P.S. 我帖子还没编辑完全,你提到的一点,我稍后会补充,也谢谢你善良的建议

点评

降级到4.4内核使用如何了喃?  详情 回复 发表于 2018-11-11 15:58
祝你移植成功。我和kochiya移植mac80211驱动至3.18内核研究了2周才搞定的。  详情 回复 发表于 2018-10-10 08:46
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2018-10-10 08:14 | 显示全部楼层
kochiya 发表于 2018-10-10 07:50
网件驱动在哪儿有?可以看看?

哪儿有什么网件驱动?他大概说的是用博通芯片的机器吧?

点评

R7800坤藤不是移植网件的原厂无线驱动吗?网件很多型号开源,试试移植3800驱动,编译个3800  详情 回复 发表于 2018-10-11 10:14
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-4-20 08:43

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

快速回复 返回顶部 返回列表