MT7916的160MHz速率之谜

 

测试环境说明

速率异常情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# 因为MT7916芯片设计上只能在 2.4GHz+5GHz 或 2.4GHz+6GHz 上启用双频双发,所以不能 5GHz+6GHz 同时使用
# 然而 eeprom 中默认的组合是 2.4GHz+6GHz 从而导致MT7916开5G 160MHz时速率跟过山车一样,所以打补丁后使其默认 2.4GHz+5GHz 后就正常了

# Armbian默认内核及默认固件用MT7916在hostapd中开启5G 160MHz时测速的过山车情况
PS C:\Users\leux> iperf3 -c 192.168.1.1
Connecting to host 192.168.1.1, port 5201
[ 5] local 192.168.1.230 port 51164 connected to 192.168.1.1 port 5201
[ ID] Interval Transfer Bitrate
[ 5] 0.00-1.00 sec 21.5 MBytes 180 Mbits/sec
[ 5] 1.00-2.01 sec 31.5 MBytes 263 Mbits/sec
[ 5] 2.01-3.01 sec 38.8 MBytes 324 Mbits/sec
[ 5] 3.01-4.00 sec 21.0 MBytes 178 Mbits/sec
[ 5] 4.00-5.00 sec 31.5 MBytes 264 Mbits/sec
[ 5] 5.00-6.01 sec 49.6 MBytes 416 Mbits/sec
[ 5] 6.01-7.01 sec 12.0 MBytes 100 Mbits/sec
[ 5] 7.01-8.01 sec 39.1 MBytes 327 Mbits/sec
[ 5] 8.01-9.01 sec 33.1 MBytes 278 Mbits/sec
[ 5] 9.01-10.01 sec 22.6 MBytes 189 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate
[ 5] 0.00-10.01 sec 301 MBytes 252 Mbits/sec sender
[ 5] 0.00-10.05 sec 300 MBytes 250 Mbits/sec receiver

iperf Done.
-------------------------------------------------------------------------------

# Armbian内核打补丁及更新固件用MT7916在hostapd中开启5G 160MHz的测速情况
PS C:\Users\leux> iperf3 -c 192.168.1.1
......
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate
[ 5] 0.00-10.01 sec 1.89 GBytes 1.62 Gbits/sec sender
[ 5] 0.00-10.02 sec 1.89 GBytes 1.62 Gbits/sec receiver


# Armbian内核打补丁及默认固件用MT7916在hostapd中开启5G 160MHz的测速情况
PS C:\Users\leux> iperf3 -c 192.168.1.1
......
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate
[ 5] 0.00-10.01 sec 1.83 GBytes 1.57 Gbits/sec sender
[ 5] 0.00-10.02 sec 1.83 GBytes 1.57 Gbits/sec receiver


# Armbian默认内核及默认固件用MT7916在hostapd中开启5G 80MHz的测速情况
PS C:\Users\leux> iperf3 -c 192.168.1.1
......
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate
[ 5] 0.00-10.00 sec 979 MBytes 821 Mbits/sec sender
[ 5] 0.00-10.02 sec 978 MBytes 819 Mbits/sec receiver


# 在Armbian中运行的测速服务端命令
leux@h88k:~$ iperf3 -s -D

速率修复补丁

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# 这个补丁的功能是自行选择是使用5GHz还是6GHz,因为默认是 2.4GHz+6GHz 的组合
static bool enable_6ghz; // 静态变量默认值为0即false,就是默认不开启6ghz
module_param(enable_6ghz, bool, 0644);
MODULE_PARM_DESC(enable_6ghz, "Enable 6 GHz instead of 5 GHz on hardware that supports both");

# 要从默认的5GHz切换为使用6GHz需在加载mt7915e内核模块时添加 enable_6ghz=1 参数即可,例如:
# 也可直接 echo "mt7915e enable_6ghz=1" >> /etc/modules-load.d/modules.conf 或 /etc/modules.d/mt7915e
rmmod mt7915e; insmod mt7915e enable_6ghz=1 或 modprobe -r mt7915e; modprobe mt7915e enable_6ghz=1

cat /sys/module/mt7915e/parameters/enable_6ghz # 后期要查看当前使用的是5GHz还是6GHz,可这样获取模块参数值,Y 为6GHz N 为5GHz

------------------------------------------ select_5ghz_or_6ghz.patch ------------------------------------------
diff -Nur a/drivers/net/wireless/mediatek/mt76/mt7915/init.c b/drivers/net/wireless/mediatek/mt76/mt7915/init.c
--- a/drivers/net/wireless/mediatek/mt76/mt7915/init.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/init.c
@@ -1109,14 +1109,14 @@
if (ret)
goto unreg_dev;

- ieee80211_queue_work(mt76_hw(dev), &dev->init_work);
-
if (phy2) {
ret = mt7915_register_ext_phy(dev, phy2);
if (ret)
goto unreg_thermal;
}

+ ieee80211_queue_work(mt76_hw(dev), &dev->init_work);
+
mt7915_init_debugfs(&dev->phy);

return 0;
diff -Nur a/drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c b/drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c
--- a/drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c
@@ -2,9 +2,14 @@
/* Copyright (C) 2020 MediaTek Inc. */

#include <linux/firmware.h>
+#include <linux/moduleparam.h>
#include "mt7915.h"
#include "eeprom.h"

+static bool enable_6ghz;
+module_param(enable_6ghz, bool, 0644);
+MODULE_PARM_DESC(enable_6ghz, "Enable 6 GHz instead of 5 GHz on hardware that supports both");
+
static int mt7915_eeprom_load_precal(struct mt7915_dev *dev)
{
struct mt76_dev *mdev = &dev->mt76;
@@ -150,8 +155,20 @@
phy->mt76->cap.has_6ghz = true;
return;
case MT_EE_V2_BAND_SEL_5GHZ_6GHZ:
- phy->mt76->cap.has_5ghz = true;
- phy->mt76->cap.has_6ghz = true;
+ if (enable_6ghz) {
+ phy->mt76->cap.has_6ghz = true;
+ u8p_replace_bits(&eeprom[MT_EE_WIFI_CONF + phy->band_idx],
+ MT_EE_V2_BAND_SEL_6GHZ,
+ MT_EE_WIFI_CONF0_BAND_SEL);
+ } else {
+ phy->mt76->cap.has_5ghz = true;
+ u8p_replace_bits(&eeprom[MT_EE_WIFI_CONF + phy->band_idx],
+ MT_EE_V2_BAND_SEL_5GHZ,
+ MT_EE_WIFI_CONF0_BAND_SEL);
+ }
+ /* force to buffer mode */
+ dev->flash_mode = true;
+
return;
default:
phy->mt76->cap.has_2ghz = true;

编译部署内核

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
git clone --depth 1 -b rk-6.1-rkr5 https://github.com/armbian/linux-rockchip
cd linux-rockchip
patch -p1 < select_5ghz_or_6ghz.patch

wget -O .config https://github.com/armbian/build/raw/main/config/kernel/linux-rk35xx-vendor.config
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)

KERNEL_PATH=$HOME/kernel && sudo mkdir -p ${KERNEL_PATH}/boot/
sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- install INSTALL_PATH=${KERNEL_PATH}/boot
sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- modules_install INSTALL_MOD_PATH=${KERNEL_PATH} INSTALL_MOD_STRIP=1
sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- headers_install INSTALL_HDR_PATH=${KERNEL_PATH}/usr
sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- dtbs_install INSTALL_DTBS_PATH=${KERNEL_PATH}/boot/dtb-6.1.99

sudo cp -r kernel/boot/* /boot && sudo cp -r kernel/lib/modules/* /lib/modules/
KERNEL_VERSION=6.1.99 # 制作生成uInitrd文件
sudo mkinitramfs -c xz -o /boot/initrd.img-${KERNEL_VERSION} ${KERNEL_VERSION}
sudo mkimage -A arm64 -T ramdisk -C none -n uInitrd -d /boot/initrd.img-${KERNEL_VERSION} /boot/uInitrd-${KERNEL_VERSION}
cd /boot/ # 软链接内核文件以供uboot调用
sudo unlink dtb && sudo ln -sf dtb-${KERNEL_VERSION} dtb
sudo unlink Image && sudo ln -sf vmlinuz-${KERNEL_VERSION} Image
sudo unlink uInitrd && sudo ln -sf uInitrd-${KERNEL_VERSION} uInitrd

更新闭源固件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 打补丁后不更新闭源固件160MHz也速率正常,但你需要的话也可更新固件
cd /lib/firmware/mediatek/ && sudo su
mv mt7916_rom_patch.bin mt7916_rom_patch.bin.bak
mv mt7916_wm.bin mt7916_wm.bin.bak
mv mt7916_wa.bin mt7916_wa.bin.bak
wget https://github.com/DHDAXCW/mt76/raw/master/firmware/mt7916_eeprom.bin # 该文件与原版一致,不需要更新
wget https://github.com/DHDAXCW/mt76/raw/master/firmware/mt7916_rom_patch.bin
wget https://github.com/DHDAXCW/mt76/raw/master/firmware/mt7916_wm.bin
wget https://github.com/DHDAXCW/mt76/raw/master/firmware/mt7916_wa.bin


# Armbian中原版固件显示的版本,2.4G 5G-80MHz hostapd 均正常,但 5G-160MHz 速率异常
leux@old:~$ dmesg | grep mt791*
[ 9.6] mt7915e 0002:21:00.0: enabling device (0000 -> 0002)
[ 9.7] mt7915e 0002:21:00.0: HW/SW Version: 0x8a108a10, Build Time: 20230202144915a # mt7916_rom_patch.bin
[ 9.8] mt7915e 0002:21:00.0: WM Firmware Version: ____000000, Build Time: 20230202145005 # mt7916_wm.bin
[ 9.9] mt7915e 0002:21:00.0: WA Firmware Version: DEV_000000, Build Time: 20230202143332 # mt7916_wa.bin

# 后面获取的新版固件显示版本,默认内核加新版固件不知为何在hostapd中开启5G-80MHz或5G-160MHz后其他设备搜索不到
leux@new:~$ dmesg | grep mt791*
[ 9.5] mt7915e 0002:21:00.0: enabling device (0000 -> 0002)
[ 9.6] mt7915e 0002:21:00.0: HW/SW Version: 0x8a108a10, Build Time: 20230424212203a
[ 9.7] mt7915e 0002:21:00.0: WM Firmware Version: ____000000, Build Time: 20230424212218
[ 9.8] mt7915e 0002:21:00.0: WA Firmware Version: DEV_000000, Build Time: 20230424212310

# 查看MT7916的温度的相关知识
leux@h88k:~$ cat /sys/class/ieee80211/phy*/hwmon*/temp1_input
59000 <-- 2g
59000 <-- 5g
leux@h88k:~$ cat /sys/class/hwmon/hwmon10/name
mt7915_phy0
leux@h88k:~$ cat /sys/class/hwmon/hwmon10/temp1_input
61000
leux@h88k:~$ cat /sys/class/hwmon/hwmon11/name
mt7915_phy1
leux@h88k:~$ cat /sys/class/hwmon/hwmon11/temp1_input
59000