找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 683|回复: 7

来来来,精力充沛的尝试intel无线网卡的兄弟们,小弟在这挖个坑,你们来跳吧

[复制链接]
本帖最后由 wulishui 于 2023-11-30 20:19 编辑

首先科普一个东西: wirele“师夷长技以制夷”egdb,这里定义了wifi各个国家无线频道的信道注册范围,有FCC、ETSI等等乱七八糟执行标准,每个国家有关部门一拍大腿,红笔一圈,就交作业上去,所以大家的可用信道都不一定相同。下面是CCNN的:
  1. country CN: DFS-FCC
  2.         (2400 - 2483.5 [url=home.php?mod=space&uid=162986]@[/url] 40), (20)
  3.         (5150 - 5350 [url=home.php?mod=space&uid=162986]@[/url] 80), (20), DFS, AUTO-BW
  4.         (5725 - 5850 @ 80), (33)
  5.         # 60 GHz band channels 1,4: 28dBm, channels 2,3: 44dBm
  6.         # ref: http://www.miit.gov.cn/n11293472/n11505629/n11506593/n11960250/n11960606/n11960700/n12330791.files/n12330790.pdf
  7.         (57240 - 59400 @ 2160), (28)
  8.         (59400 - 63720 @ 2160), (44)
  9.         (63720 - 65880 @ 2160), (28)
复制代码
wifi正常运行之后执行iw reg get可以得到当前配置的国家的信道注册标准:

上面这是正常工作的,如果你装上牙膏厂的网卡,下面还会有一段country:00,就是不正常的。

再执行iw phy,你会找到一张信道列表,这张表是按照上面的regdb生成的:

以(** dBm)结尾的就是发射wifi信号的。
原则上DFS信道也运行发射wifi信号,只是需要先检测无雷达信号。但hostapd是最信不过的,很多时候都错乱,无法正常判定,发射wifi失败。
所以实际应用时,标记DFS的信道你要避开别用,不然哪天wifi无缘无故毙掉了你自己都不知道。

普通的无线网卡都是可以自行配置国家码的,以使无线网卡按照所配置的国家的信道定义工作。
但牙膏厂是例外(怪胎),它不允许你配置,自己做主,叫做LAR(Location-Aware Regulatory)
首先它扫描无线信号,搜到周围wifi信号,看看这群道友是哪的,然后它认为它也是哪的,所以这出问题了:
周围一个道友都没有时,你问鬼呀?---比如你在农村,你在山区,除了你自己,周围只有鬼的时候,谁发射wifi给你搜?
或者,周围的道友都各怀鬼胎,没一个老实的时候?---比如邻居老王在亚马逊买了个洋垃圾无线路由,他也没改配置就这么插上用了,只有鬼才知道它配置的是哪个国家!
所以牙膏厂这个怪胎要么根本不知道自己在哪里,要么相差十万八千里,你以为它自己不知道?它非这样搞你们而已。

开始时iwlwifi是有一个lar_disable=1调试选项的,只是是linux发行版的用户在用,op上没人用。因为牙膏厂的firmware并不希望你这样搞,所以这选项会随机引起iwlwifi-firmware崩溃。
有人满怀希望去叫牙膏厂修复一下,结果直接被轰出门。用户和牙膏厂的恩怨这里有一句话描述:https://tildearrow.org/?p=post&month=7&year=2022&item=lar
不但不修复,直接把lar_disable=1相关源码剔除。提交补丁的这位道兄被骂成狗,这里有激烈的争论:https://github.com/torvalds/linu ... 5e0a8ec4eb2b038e153

又过了几个纪元,https://tildearrow.org/?p=post&month=7&year=2022&item=lar 这位道友偶然在一陨仙的道坟中捡得一张牙膏厂的无线网卡,秉着忍无可忍的心态,呕心沥血研究出来个折中办法:
启动wifi时先让hostapd扫描一次,这样网卡就能知道自己在哪了,它就会乖乖给你收矿。
只是这里存在两个问题啊,前面都说了,一是hostapd本身三魂七魄少了一魂二魄,根本不可靠,你都不知道它什么时候是正常的。二是,在荒郊野岭,你搜个P啊!
所以这个补丁,它有的人能成功,有的人不能成功,有的人这次成功,下次又不成功。而且它还折磨人,因为它扫描后要沉睡0.1*110秒,造成你配置wifi后要等半天才能知道工作状态,
而且在23版hostapd上出现个极大副作用:和lar_disable=1同样的病,iwlwifi-firmware一样崩溃,而且不是随机,是百分之百(按理说它只是执行wifi scan,跟iwlwifi-firmware P关系都没有,它为什么要崩溃?说明iwlwifi-firmware真的有坑,因为其它厂家的网卡都不会崩溃)!最终,大家都不玩了。

所以,既然他非要剔除这部分代码,我非要把它加回,你能奈我何!有人他真就这么干了(我想做,也做了的时候,发现上个纪元有道友先我一步干了): https://github.com/Mejituu/linux-builder
  1. --- a/drivers/net/wireless/intel/iwlwifi/iwl-drv.c
  2. +++ b/drivers/net/wireless/intel/iwlwifi/iwl-drv.c
  3. @@ -1887,6 +1887,9 @@ MODULE_PARM_DESC(fw_restart, "restart firmware in case of error (default true)")
  4. module_param_named(nvm_file, iwlwifi_mod_params.nvm_file, charp, 0444);
  5. MODULE_PARM_DESC(nvm_file, "NVM file name");

  6. +module_param_named(lar_disable, iwlwifi_mod_params.lar_disable, bool, 0444);
  7. +MODULE_PARM_DESC(lar_disable, "disable LAR functionality (default: N)");
  8. +
  9. module_param_named(uapsd_disable, iwlwifi_mod_params.uapsd_disable, uint, 0644);
  10. MODULE_PARM_DESC(uapsd_disable,
  11.                   "disable U-APSD functionality bitmap 1: BSS 2: P2P Client (default: 3)");
  12. diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-modparams.h b/drivers/net/wireless/intel/iwlwifi/iwl-modparams.h
  13. index 1cf26ab4f488..c9343ce72cd5 100644
  14. --- a/drivers/net/wireless/intel/iwlwifi/iwl-modparams.h
  15. +++ b/drivers/net/wireless/intel/iwlwifi/iwl-modparams.h
  16. @@ -59,6 +59,7 @@ enum iwl_uapsd_disable {
  17.   * @nvm_file: specifies a external NVM file
  18.   * @uapsd_disable: disable U-APSD, see &enum iwl_uapsd_disable, default =
  19.   *        IWL_DISABLE_UAPSD_BSS | IWL_DISABLE_UAPSD_P2P_CLIENT
  20. + * @lar_disable: disable LAR (regulatory), default = 0
  21.   * @disable_11ac: disable VHT capabilities, default = false.
  22.   * @remove_when_gone: remove an inaccessible device from the PCIe bus.
  23.   * @enable_ini: enable new FW debug infratructure (INI TLVs)
  24. @@ -78,6 +79,7 @@ struct iwl_mod_params {
  25. #endif
  26.          char *nvm_file;
  27.          u32 uapsd_disable;
  28. +        bool lar_disable;
  29.          bool disable_11ac;
  30.          /**
  31.           * @disable_11ax: disable HE capabilities, default = false
  32. diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
  33. index aa8e08487b52..6bcf68535a92 100644
  34. --- a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
  35. +++ b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
  36. @@ -1366,7 +1366,7 @@ iwl_parse_nvm_data(struct iwl_trans *trans, const struct iwl_cfg *cfg,
  37.                     const __be16 *nvm_hw, const __le16 *nvm_sw,
  38.                     const __le16 *nvm_calib, const __le16 *regulatory,
  39.                     const __le16 *mac_override, const __le16 *phy_sku,
  40. -                   u8 tx_chains, u8 rx_chains)
  41. +                   u8 tx_chains, u8 rx_chains, bool lar_fw_supported)
  42. {
  43.          struct iwl_nvm_data *data;
  44.          bool lar_enabled;
  45. @@ -1446,8 +1446,7 @@ iwl_parse_nvm_data(struct iwl_trans *trans, const struct iwl_cfg *cfg,
  46.                  return NULL;
  47.          }

  48. -        if (lar_enabled &&
  49. -            fw_has_capa(&fw->ucode_capa, IWL_UCODE_TLV_CAPA_LAR_SUPPORT))
  50. +        if (lar_fw_supported && lar_enabled)
  51.                  sbands_flags |= IWL_NVM_SBANDS_FLAGS_LAR;

  52.          if (iwl_nvm_no_wide_in_5ghz(trans, cfg, nvm_hw))
  53. @@ -1892,6 +1891,9 @@ struct iwl_nvm_data *iwl_get_nvm(struct iwl_trans *trans,
  54.                  .id = WIDE_ID(REGULATORY_AND_NVM_GROUP, NVM_GET_INFO)
  55.          };
  56.          int  ret;
  57. +        bool lar_fw_supported = !iwlwifi_mod_params.lar_disable &&
  58. +                                fw_has_capa(&fw->ucode_capa,
  59. +                                            IWL_UCODE_TLV_CAPA_LAR_SUPPORT);
  60.          bool empty_otp;
  61.          u32 mac_flags;
  62.          u32 sbands_flags = 0;
  63. @@ -1971,9 +1973,7 @@ struct iwl_nvm_data *iwl_get_nvm(struct iwl_trans *trans,
  64.          nvm->valid_tx_ant = (u8)le32_to_cpu(rsp->phy_sku.tx_chains);
  65.          nvm->valid_rx_ant = (u8)le32_to_cpu(rsp->phy_sku.rx_chains);

  66. -        if (le32_to_cpu(rsp->regulatory.lar_enabled) &&
  67. -            fw_has_capa(&fw->ucode_capa,
  68. -                        IWL_UCODE_TLV_CAPA_LAR_SUPPORT)) {
  69. +        if (le32_to_cpu(rsp->regulatory.lar_enabled) && lar_fw_supported) {
  70.                  nvm->lar_enabled = true;
  71.                  sbands_flags |= IWL_NVM_SBANDS_FLAGS_LAR;
  72.          }
  73. diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h
  74. index e01f7751cf11..22ac163f8f8c 100644
  75. --- a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h
  76. +++ b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h
  77. @@ -35,7 +35,7 @@ iwl_parse_nvm_data(struct iwl_trans *trans, const struct iwl_cfg *cfg,
  78.                     const __be16 *nvm_hw, const __le16 *nvm_sw,
  79.                     const __le16 *nvm_calib, const __le16 *regulatory,
  80.                     const __le16 *mac_override, const __le16 *phy_sku,
  81. -                   u8 tx_chains, u8 rx_chains);
  82. +                   u8 tx_chains, u8 rx_chains, bool lar_fw_supported);

  83. /**
  84.   * iwl_parse_mcc_info - parse MCC (mobile country code) info coming from FW
  85. diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
  86. index ce6b701f3f4c..aef745a624c6 100644
  87. --- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
  88. +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
  89. @@ -1277,6 +1277,9 @@ static inline bool iwl_mvm_is_lar_supported(struct iwl_mvm *mvm)
  90.          bool tlv_lar = fw_has_capa(&mvm->fw->ucode_capa,
  91.                                     IWL_UCODE_TLV_CAPA_LAR_SUPPORT);

  92. +        if (iwlwifi_mod_params.lar_disable)
  93. +                return false;
  94. +
  95.          /*
  96.           * Enable LAR only if it is supported by the FW (TLV) &&
  97.           * enabled in the NVM
  98. diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c b/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c
  99. index 6d18a1fd649b..5859f449ff68 100644
  100. --- a/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c
  101. +++ b/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c
  102. @@ -220,6 +220,7 @@ iwl_parse_nvm_sections(struct iwl_mvm *mvm)
  103.          struct iwl_nvm_section *sections = mvm->nvm_sections;
  104.          const __be16 *hw;
  105.          const __le16 *sw, *calib, *regulatory, *mac_override, *phy_sku;
  106. +        bool lar_enabled;
  107.          int regulatory_type;

  108.          /* Checking for required sections */
  109. @@ -270,9 +271,14 @@ iwl_parse_nvm_sections(struct iwl_mvm *mvm)
  110.                  (const __le16 *)sections[NVM_SECTION_TYPE_REGULATORY_SDP].data :
  111.                  (const __le16 *)sections[NVM_SECTION_TYPE_REGULATORY].data;

  112. +        lar_enabled = !iwlwifi_mod_params.lar_disable &&
  113. +                      fw_has_capa(&mvm->fw->ucode_capa,
  114. +                                  IWL_UCODE_TLV_CAPA_LAR_SUPPORT);
  115. +
  116.          return iwl_parse_nvm_data(mvm->trans, mvm->cfg, mvm->fw, hw, sw, calib,
  117.                                    regulatory, mac_override, phy_sku,
  118. -                                  mvm->fw->valid_tx_ant, mvm->fw->valid_rx_ant);
  119. +                                  mvm->fw->valid_tx_ant, mvm->fw->valid_rx_ant,
  120. +                                  lar_enabled);
  121. }

  122. /* Loads the NVM data stored in mvm->nvm_sections into the NIC */
  123. --
  124. 2.39.1
复制代码
上面补丁按你内核修改,放在/package/kernel/mac80211/patches/subsys下,然后编译。

因为之前是linux发行版的人用,op的人没用过,op的内核模块是按/etc/modules.d下的文件顺序加载的,echo options iwlwifi lar_disable=1 >> /etc/modprobe.d/iwlwifi.conf 这个做法无效。
在/etc/modules.d/iwlwifi的里面加lar_disable=1它也不行,因为/etc/modules.d/iwlwifi里面包含了3个模块。
所以咱们需要把3个模块拆分,单独加载:
  1. cat /etc/modules.d/iwlwifi | while read i
  2. do
  3.       echo "$i" > /etc/modules.d/$i
  4. done
  5. echo "iwlwifi lar_disable=1" > /etc/modules.d/iwlwifi
复制代码
这样重启之后,似乎生效了,典型表现就是随机iwlwifi-firmware崩溃(几率不大),哈!
然后你去配置wifi信号,你会发现,一顿操作猛如虎,实际作用等于无,卵用都没有,哈哈哈哈哈哈!
这个固件是默认开启了这选项的:https://www.right.com.cn/forum/thread-8307497-1-1.html ,我告诉你,不能用,砸了吧!


本帖子中包含更多资源

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

×
我的恩山、我的无线 The best wifi forum is right here.
用了MT7986 我特地买了张MT7922配置,AX210在上版驱动中丢包
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

来了小老弟
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

前几天才遇到,买了两张ax210
由于没有做功课,并不知道这么大的坑,折腾两天,网上的各种补丁找了一个遍,最终还是失败了!

点评

我发的那个固件可以试一试,但是不用抱希望  详情 回复 发表于 2023-12-1 09:28
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| | 显示全部楼层
点击修改密码 发表于 2023-12-1 09:13
前几天才遇到,买了两张ax210
由于没有做功课,并不知道这么大的坑,折腾两天,网上的各种补丁找了一个遍, ...

我发的那个固件可以试一试,但是不用抱希望

点评

老板,您的固件在哪呢?我也是210想试试  详情 回复 发表于 2024-1-13 10:57
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

靠,我的 ax101 也是一顿折腾,修改了 iwlwifi 的源码,将NO IR和radar都去掉了,还是不能开启 5G 热点,这个 intel 的卡真是折腾死人,最后放弃了
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

wulishui 发表于 2023-12-1 09:28
我发的那个固件可以试一试,但是不用抱希望

老板,您的固件在哪呢?我也是210想试试
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

搞了半天,最后这个结果也是悲伤
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 01:42

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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

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