|
本帖最后由 wulishui 于 2023-11-30 20:19 编辑
首先科普一个东西: wirele“师夷长技以制夷”egdb,这里定义了wifi各个国家无线频道的信道注册范围,有FCC、ETSI等等乱七八糟执行标准,每个国家有关部门一拍大腿,红笔一圈,就交作业上去,所以大家的可用信道都不一定相同。下面是CCNN的:
- country CN: DFS-FCC
- (2400 - 2483.5 [url=home.php?mod=space&uid=162986]@[/url] 40), (20)
- (5150 - 5350 [url=home.php?mod=space&uid=162986]@[/url] 80), (20), DFS, AUTO-BW
- (5725 - 5850 @ 80), (33)
- # 60 GHz band channels 1,4: 28dBm, channels 2,3: 44dBm
- # ref: http://www.miit.gov.cn/n11293472/n11505629/n11506593/n11960250/n11960606/n11960700/n12330791.files/n12330790.pdf
- (57240 - 59400 @ 2160), (28)
- (59400 - 63720 @ 2160), (44)
- (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
- --- a/drivers/net/wireless/intel/iwlwifi/iwl-drv.c
- +++ b/drivers/net/wireless/intel/iwlwifi/iwl-drv.c
- @@ -1887,6 +1887,9 @@ MODULE_PARM_DESC(fw_restart, "restart firmware in case of error (default true)")
- module_param_named(nvm_file, iwlwifi_mod_params.nvm_file, charp, 0444);
- MODULE_PARM_DESC(nvm_file, "NVM file name");
-
- +module_param_named(lar_disable, iwlwifi_mod_params.lar_disable, bool, 0444);
- +MODULE_PARM_DESC(lar_disable, "disable LAR functionality (default: N)");
- +
- module_param_named(uapsd_disable, iwlwifi_mod_params.uapsd_disable, uint, 0644);
- MODULE_PARM_DESC(uapsd_disable,
- "disable U-APSD functionality bitmap 1: BSS 2: P2P Client (default: 3)");
- diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-modparams.h b/drivers/net/wireless/intel/iwlwifi/iwl-modparams.h
- index 1cf26ab4f488..c9343ce72cd5 100644
- --- a/drivers/net/wireless/intel/iwlwifi/iwl-modparams.h
- +++ b/drivers/net/wireless/intel/iwlwifi/iwl-modparams.h
- @@ -59,6 +59,7 @@ enum iwl_uapsd_disable {
- * @nvm_file: specifies a external NVM file
- * @uapsd_disable: disable U-APSD, see &enum iwl_uapsd_disable, default =
- * IWL_DISABLE_UAPSD_BSS | IWL_DISABLE_UAPSD_P2P_CLIENT
- + * @lar_disable: disable LAR (regulatory), default = 0
- * @disable_11ac: disable VHT capabilities, default = false.
- * @remove_when_gone: remove an inaccessible device from the PCIe bus.
- * @enable_ini: enable new FW debug infratructure (INI TLVs)
- @@ -78,6 +79,7 @@ struct iwl_mod_params {
- #endif
- char *nvm_file;
- u32 uapsd_disable;
- + bool lar_disable;
- bool disable_11ac;
- /**
- * @disable_11ax: disable HE capabilities, default = false
- diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
- index aa8e08487b52..6bcf68535a92 100644
- --- a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
- +++ b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
- @@ -1366,7 +1366,7 @@ iwl_parse_nvm_data(struct iwl_trans *trans, const struct iwl_cfg *cfg,
- const __be16 *nvm_hw, const __le16 *nvm_sw,
- const __le16 *nvm_calib, const __le16 *regulatory,
- const __le16 *mac_override, const __le16 *phy_sku,
- - u8 tx_chains, u8 rx_chains)
- + u8 tx_chains, u8 rx_chains, bool lar_fw_supported)
- {
- struct iwl_nvm_data *data;
- bool lar_enabled;
- @@ -1446,8 +1446,7 @@ iwl_parse_nvm_data(struct iwl_trans *trans, const struct iwl_cfg *cfg,
- return NULL;
- }
-
- - if (lar_enabled &&
- - fw_has_capa(&fw->ucode_capa, IWL_UCODE_TLV_CAPA_LAR_SUPPORT))
- + if (lar_fw_supported && lar_enabled)
- sbands_flags |= IWL_NVM_SBANDS_FLAGS_LAR;
-
- if (iwl_nvm_no_wide_in_5ghz(trans, cfg, nvm_hw))
- @@ -1892,6 +1891,9 @@ struct iwl_nvm_data *iwl_get_nvm(struct iwl_trans *trans,
- .id = WIDE_ID(REGULATORY_AND_NVM_GROUP, NVM_GET_INFO)
- };
- int ret;
- + bool lar_fw_supported = !iwlwifi_mod_params.lar_disable &&
- + fw_has_capa(&fw->ucode_capa,
- + IWL_UCODE_TLV_CAPA_LAR_SUPPORT);
- bool empty_otp;
- u32 mac_flags;
- u32 sbands_flags = 0;
- @@ -1971,9 +1973,7 @@ struct iwl_nvm_data *iwl_get_nvm(struct iwl_trans *trans,
- nvm->valid_tx_ant = (u8)le32_to_cpu(rsp->phy_sku.tx_chains);
- nvm->valid_rx_ant = (u8)le32_to_cpu(rsp->phy_sku.rx_chains);
-
- - if (le32_to_cpu(rsp->regulatory.lar_enabled) &&
- - fw_has_capa(&fw->ucode_capa,
- - IWL_UCODE_TLV_CAPA_LAR_SUPPORT)) {
- + if (le32_to_cpu(rsp->regulatory.lar_enabled) && lar_fw_supported) {
- nvm->lar_enabled = true;
- sbands_flags |= IWL_NVM_SBANDS_FLAGS_LAR;
- }
- diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h
- index e01f7751cf11..22ac163f8f8c 100644
- --- a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h
- +++ b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h
- @@ -35,7 +35,7 @@ iwl_parse_nvm_data(struct iwl_trans *trans, const struct iwl_cfg *cfg,
- const __be16 *nvm_hw, const __le16 *nvm_sw,
- const __le16 *nvm_calib, const __le16 *regulatory,
- const __le16 *mac_override, const __le16 *phy_sku,
- - u8 tx_chains, u8 rx_chains);
- + u8 tx_chains, u8 rx_chains, bool lar_fw_supported);
-
- /**
- * iwl_parse_mcc_info - parse MCC (mobile country code) info coming from FW
- diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
- index ce6b701f3f4c..aef745a624c6 100644
- --- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
- +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
- @@ -1277,6 +1277,9 @@ static inline bool iwl_mvm_is_lar_supported(struct iwl_mvm *mvm)
- bool tlv_lar = fw_has_capa(&mvm->fw->ucode_capa,
- IWL_UCODE_TLV_CAPA_LAR_SUPPORT);
-
- + if (iwlwifi_mod_params.lar_disable)
- + return false;
- +
- /*
- * Enable LAR only if it is supported by the FW (TLV) &&
- * enabled in the NVM
- diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c b/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c
- index 6d18a1fd649b..5859f449ff68 100644
- --- a/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c
- +++ b/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c
- @@ -220,6 +220,7 @@ iwl_parse_nvm_sections(struct iwl_mvm *mvm)
- struct iwl_nvm_section *sections = mvm->nvm_sections;
- const __be16 *hw;
- const __le16 *sw, *calib, *regulatory, *mac_override, *phy_sku;
- + bool lar_enabled;
- int regulatory_type;
-
- /* Checking for required sections */
- @@ -270,9 +271,14 @@ iwl_parse_nvm_sections(struct iwl_mvm *mvm)
- (const __le16 *)sections[NVM_SECTION_TYPE_REGULATORY_SDP].data :
- (const __le16 *)sections[NVM_SECTION_TYPE_REGULATORY].data;
-
- + lar_enabled = !iwlwifi_mod_params.lar_disable &&
- + fw_has_capa(&mvm->fw->ucode_capa,
- + IWL_UCODE_TLV_CAPA_LAR_SUPPORT);
- +
- return iwl_parse_nvm_data(mvm->trans, mvm->cfg, mvm->fw, hw, sw, calib,
- regulatory, mac_override, phy_sku,
- - mvm->fw->valid_tx_ant, mvm->fw->valid_rx_ant);
- + mvm->fw->valid_tx_ant, mvm->fw->valid_rx_ant,
- + lar_enabled);
- }
-
- /* Loads the NVM data stored in mvm->nvm_sections into the NIC */
- --
- 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个模块拆分,单独加载:
- cat /etc/modules.d/iwlwifi | while read i
- do
- echo "$i" > /etc/modules.d/$i
- done
- echo "iwlwifi lar_disable=1" > /etc/modules.d/iwlwifi
复制代码 这样重启之后,似乎生效了,典型表现就是随机iwlwifi-firmware崩溃(几率不大),哈!
然后你去配置wifi信号,你会发现,一顿操作猛如虎,实际作用等于无,卵用都没有,哈哈哈哈哈哈!
这个固件是默认开启了这选项的:https://www.right.com.cn/forum/thread-8307497-1-1.html ,我告诉你,不能用,砸了吧!
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|