Thank you for starting the new topic. I’ll repost my previous message there.
I finally have some good news. I’ve managed to fix the 6dBm limit for mt7615e card thanks to @Ryder.Lee and @frank-w.
One should recompile OpenWRT (or mt76 module) with this eeprom.c. I’ve hard-coded mt7615e.eeprom.bin
contents from here. I’ve also tried a more common MT7615E1_EEPROM.bin
found here and many other repositories. These files have two bytes different but there is no difference in performance or functionality.
eeprom.c (13.5 KB)
As a result I’ve got WiFi working on 2.4 and 5 GHz in both AP and client modes.
root@OpenWrt:/# iw dev
phy#1
Interface wlan1
ifindex 8
wdev 0x100000002
addr 00:0c:43:26:60:00
type AP
txpower 20.00 dBm
multicast TXQ:
qsz-byt qsz-pkt flows drops marks overlmt hashcol tx-bytes tx-packets
0 0 0 0 0 0 0 0 0
phy#0
Interface wlan0
ifindex 7
wdev 0x2
addr 00:0c:43:26:60:00
ssid testssid
type managed
channel 48 (5240 MHz), width: 80 MHz, center1: 5210 MHz
txpower 16.00 dBm
multicast TXQ:
qsz-byt qsz-pkt flows drops marks overlmt hashcol tx-bytes tx-packets
0 0 0 0 0 0 0 0 0
The downsides as I see them:
- mt7615 is up from 6 dBm to 16 dBm but it is still not enough. MacBook’s own 5GHz WiFi connection gives much higher speeds than mt7615 in client mode. Images from @sinovoip seem to have mt7615 working on 20 dBm.
- I wouldn’t call this an elegant solution as it requires manually replacing
eeprom.c
, recompiling OpenWRT and copyingmt76.ko
,mt7615-common.ko
andmt7615e.ko
to/lib/modules/5.4.42/
- Both cards have the same MAC address, which seems to be encoded in eeprom.
Although these steps give me an almost working OpenWRT router, I still have some questions:
- How can I increase both mt7622 and mt7615 to their maximum capabilities? I want them to operate at 30 dBm to cover large areas in the countryside.
- If there is no obvious answer to the first question, how can I increase mt7615 to at least 20 dBm? Is it possible to extract/get eeprom from official @sinovoip LEDE/Ubuntu/Debian images?
-
@frank-w could you please clarify how to make the driver load eeprom from file as you advised here? I now have
kmod-mt7615e
included in kernel and bothkmod-mt76
andkmod-mt76x2
excluded from build.
Against same mac just change bytes 4-9 (5-10 if counting from 1) in your struct for mt7622 or 7615
For eeprom loading from file…basicly in similar way like firmware
Here an api-call “request_firmware” is used which loads file from filesystem defined in headerfile into a struct firmware
https://www.kernel.org/doc/html/v4.13/driver-api/firmware/request_firmware.html#request-firmware
Maybe a similar function exists without writing firmware to device/starting it
Else there are basic file operation functions in c (e.g. https://stackoverflow.com/a/14002980). You can look into source of request firmware how it gets the full path to file (afaik it checks multiple paths) and create a new function with only needed code for eeprom
Afaik the core-part you need here is
https://elixir.bootlin.com/linux/latest/source/drivers/base/firmware_loader/main.c#L498
Or maybe this directly
https://elixir.bootlin.com/linux/latest/source/fs/exec.c#L899
Which makes memory allocation,but you need to create path-string before
@svintuss As for TX power. Change country to US in wifi settings. You will be able to go to up 28dbm with mt7622. Bare in mind that it each country have different restrictions for tx power of customer transsivers and can be illegal to increase them.
@frank-w thank you for explanation, I’ll try to do things right.
@niebieski20 thanks for the advice. Manually specifying country in /etc/config/wireless
did have some effect. mt7622 responds to country code change but mt7615 doesn’t. mt7622 won’t go past 25 dBm and mt7615 is stuck on 16 dBm. I’ve tried ‘US’, ‘AU’ and ‘RU’ domains.
root@OpenWrt:/# iw reg get
global
country AU: DFS-ETSI
(2400 - 2483 @ 40), (N/A, 36), (N/A)
(5150 - 5250 @ 80), (N/A, 23), (N/A), NO-OUTDOOR, AUTO-BW
(5250 - 5350 @ 80), (N/A, 20), (0 ms), NO-OUTDOOR, DFS, AUTO-BW
(5470 - 5600 @ 80), (N/A, 27), (0 ms), DFS
(5650 - 5730 @ 80), (N/A, 27), (0 ms), DFS
(5730 - 5850 @ 80), (N/A, 36), (N/A)
(57000 - 66000 @ 2160), (N/A, 43), (N/A), NO-OUTDOOR
root@OpenWrt:/# iw dev
phy#1
Interface wlan1
ifindex 9
wdev 0x100000003
addr 00:0c:43:26:60:00
ssid OpenWrt_2.4
type AP
channel 1 (2412 MHz), width: 20 MHz, center1: 2412 MHz
txpower 25.00 dBm
multicast TXQ:
qsz-byt qsz-pkt flows drops marks overlmt hashcol tx-bytes tx-packets
0 0 0 0 0 0 0 0 0
phy#0
Interface wlan0
ifindex 10
wdev 0x3
addr 00:0c:43:26:60:00
ssid testssid
type managed
channel 48 (5240 MHz), width: 80 MHz, center1: 5210 MHz
txpower 16.00 dBm
multicast TXQ:
qsz-byt qsz-pkt flows drops marks overlmt hashcol tx-bytes tx-packets
0 0 0 0 0 0 0 0 0
I still think there is some limitation in eeproms. I found eeprom bytes meaning in mt76x02_eeprom.h
and in mt7615/eeprom.h
files. Seems like I need to change some bytes in eeprom to unlock mt7615 card’s full potential.
// This is from mt76x02_eeprom.h
enum mt76x02_eeprom_field {
MT_EE_CHIP_ID = 0x000,
MT_EE_VERSION = 0x002,
MT_EE_MAC_ADDR = 0x004,
MT_EE_PCI_ID = 0x00A,
MT_EE_ANTENNA = 0x022,
MT_EE_CFG1_INIT = 0x024,
MT_EE_NIC_CONF_0 = 0x034,
MT_EE_NIC_CONF_1 = 0x036,
MT_EE_COUNTRY_REGION_5GHZ = 0x038,
MT_EE_COUNTRY_REGION_2GHZ = 0x039,
MT_EE_FREQ_OFFSET = 0x03a,
MT_EE_NIC_CONF_2 = 0x042,
MT_EE_XTAL_TRIM_1 = 0x03a,
MT_EE_XTAL_TRIM_2 = 0x09e,
MT_EE_LNA_GAIN = 0x044,
MT_EE_RSSI_OFFSET_2G_0 = 0x046,
MT_EE_RSSI_OFFSET_2G_1 = 0x048,
MT_EE_LNA_GAIN_5GHZ_1 = 0x049,
MT_EE_RSSI_OFFSET_5G_0 = 0x04a,
MT_EE_RSSI_OFFSET_5G_1 = 0x04c,
MT_EE_LNA_GAIN_5GHZ_2 = 0x04d,
MT_EE_TX_POWER_DELTA_BW40 = 0x050,
MT_EE_TX_POWER_DELTA_BW80 = 0x052,
MT_EE_TX_POWER_EXT_PA_5G = 0x054,
MT_EE_TX_POWER_0_START_2G = 0x056,
MT_EE_TX_POWER_1_START_2G = 0x05c,
/* used as byte arrays */
#define MT_TX_POWER_GROUP_SIZE_5G 5
#define MT_TX_POWER_GROUPS_5G 6
MT_EE_TX_POWER_0_START_5G = 0x062,
MT_EE_TSSI_SLOPE_2G = 0x06e,
MT_EE_TX_POWER_0_GRP3_TX_POWER_DELTA = 0x074,
MT_EE_TX_POWER_0_GRP4_TSSI_SLOPE = 0x076,
MT_EE_TX_POWER_1_START_5G = 0x080,
MT_EE_TX_POWER_CCK = 0x0a0,
MT_EE_TX_POWER_OFDM_2G_6M = 0x0a2,
MT_EE_TX_POWER_OFDM_2G_24M = 0x0a4,
MT_EE_TX_POWER_OFDM_5G_6M = 0x0b2,
MT_EE_TX_POWER_OFDM_5G_24M = 0x0b4,
MT_EE_TX_POWER_HT_MCS0 = 0x0a6,
MT_EE_TX_POWER_HT_MCS4 = 0x0a8,
MT_EE_TX_POWER_HT_MCS8 = 0x0aa,
MT_EE_TX_POWER_HT_MCS12 = 0x0ac,
MT_EE_TX_POWER_VHT_MCS0 = 0x0ba,
MT_EE_TX_POWER_VHT_MCS4 = 0x0bc,
MT_EE_TX_POWER_VHT_MCS8 = 0x0be,
MT_EE_2G_TARGET_POWER = 0x0d0,
MT_EE_TEMP_OFFSET = 0x0d1,
MT_EE_5G_TARGET_POWER = 0x0d2,
MT_EE_TSSI_BOUND1 = 0x0d4,
MT_EE_TSSI_BOUND2 = 0x0d6,
MT_EE_TSSI_BOUND3 = 0x0d8,
MT_EE_TSSI_BOUND4 = 0x0da,
MT_EE_FREQ_OFFSET_COMPENSATION = 0x0db,
MT_EE_TSSI_BOUND5 = 0x0dc,
MT_EE_TX_POWER_BYRATE_BASE = 0x0de,
MT_EE_TSSI_SLOPE_5G = 0x0f0,
MT_EE_RF_TEMP_COMP_SLOPE_5G = 0x0f2,
MT_EE_RF_TEMP_COMP_SLOPE_2G = 0x0f4,
MT_EE_RF_2G_TSSI_OFF_TXPOWER = 0x0f6,
MT_EE_RF_2G_RX_HIGH_GAIN = 0x0f8,
MT_EE_RF_5G_GRP0_1_RX_HIGH_GAIN = 0x0fa,
MT_EE_RF_5G_GRP2_3_RX_HIGH_GAIN = 0x0fc,
MT_EE_RF_5G_GRP4_5_RX_HIGH_GAIN = 0x0fe,
MT_EE_BT_RCAL_RESULT = 0x138,
MT_EE_BT_VCDL_CALIBRATION = 0x13c,
MT_EE_BT_PMUCFG = 0x13e,
MT_EE_USAGE_MAP_START = 0x1e0,
MT_EE_USAGE_MAP_END = 0x1fc,
__MT_EE_MAX
};
// This is from mt7615/eeprom.h
enum mt7615_eeprom_field {
MT_EE_CHIP_ID = 0x000,
MT_EE_VERSION = 0x002,
MT_EE_MAC_ADDR = 0x004,
MT_EE_NIC_CONF_0 = 0x034,
MT_EE_NIC_CONF_1 = 0x036,
MT_EE_WIFI_CONF = 0x03e,
MT_EE_CALDATA_FLASH = 0x052,
MT_EE_TX0_2G_TARGET_POWER = 0x058,
MT_EE_TX0_5G_G0_TARGET_POWER = 0x070,
MT_EE_TX1_5G_G0_TARGET_POWER = 0x098,
MT_EE_EXT_PA_2G_TARGET_POWER = 0x0f2,
MT_EE_EXT_PA_5G_TARGET_POWER = 0x0f3,
MT7663_EE_TX0_2G_TARGET_POWER = 0x123,
MT_EE_TX2_5G_G0_TARGET_POWER = 0x142,
MT_EE_TX3_5G_G0_TARGET_POWER = 0x16a,
MT7615_EE_MAX = 0x3bf,
MT7622_EE_MAX = 0x3db,
MT7663_EE_MAX = 0x400,
};
I’ve tried changing MT_EE_COUNTRY_REGION_5GHZ
and MT_EE_COUNTRY_REGION_2GHZ
bytes in mt7615e.eeprom.bin from 0x01
to 0x00
but that had no effect on 16 dBm limit. Maybe @Ryder.Lee could help with these settings?
I’ve extracted mt7615 eeprom
from the official BPI LEDE image. It’s loaded from /etc_ro/wlan/MT7615E_EEPROM2.bin
just like @frank-w suggested.
Here’s the difference with the eeprom that @Ryder.Lee linked.
This might answer the question which bytes in mt7615 eeprom are responsible for TX power. mt7615 limit has gone up from 16 dBm to 23 dBm.
However this didn’t solve poor connection speed issue.
- On MacBook Pro connected to WiFi 5Ghz network I get 270 Mbit download and 100 Mbit upload.
- On same MacBook connected to BPI-R64 with ethernet which in turn is connected to 5 Ghz WiFi I get only 200 Mbit download (unstable) and 8 Mbit upload. Upload speed does not change upon changing regional domain and TX power. 16 dBm - 20 dBm - 22 dBm all give similar results.
Any advice on increasing mt7615 upload and download speeds?
P. S. Here are an updated eeprom.c
and MT7615E_EEPROM2.bin
itself.
eeprom.c (13.5 KB) MT7615E_EEPROM2_BPI.bin (1 KB)
can you use the latest mt76 branch for testing?
How can I make sure I use the latest mt76?
Am I getting the latest branch by executing:
git clone https://git.openwrt.org/openwrt/openwrt.git
git pull
git checkout
Your branch is up to date with 'origin/master'.
You need to link it to your kernel-tree or like i did clone into it and change makefile/kconfig in drivers/net/wireless/mediatek if folder-name is different to existing…maybe you need some changes to makefile and add Kconfig inside mt76 folder…you can take files from my 5.4-main tree (mt76_new).i’m sure you need to use more recent kernel as 5.4 (maybe 5.7) because of api-changes
So there seems already a way to load eeprom from file…but this image seems to have no public sourcecode yet
OpenWRT creates this folder in build_dir
. Based on the folder name I think it’s the latest mt76 version.
./build_dir/target-aarch64_cortex-a53_musl/linux-mediatek_mt7622/mt76-2020-05-30-85c51608
I’ve gone further into testing WiFi performance. I still can’t call 5 GHz WiFi operational.
mt7615 constantly causes a system crash and reboot after about 30-50 sec. of iperf3
operation.
[ ID] Interval Transfer Bitrate
[ 5] 0.00-1.00 sec 74.9 MBytes 625 Mbits/sec
[ 5] 1.00-2.00 sec 77.3 MBytes 650 Mbits/sec
[ 5] 2.00-3.00 sec 72.2 MBytes 606 Mbits/sec
[ 5] 3.00-4.00 sec 72.4 MBytes 607 Mbits/sec
[ 5] 4.00-5.00 sec 73.3 MBytes 616 Mbits/sec
[ 5] 5.00-6.00 sec 50.1 MBytes 419 Mbits/sec
[ 5] 6.00-7.00 sec 21.2 MBytes 178 Mbits/sec
[ 5] 7.00-8.00 sec 27.2 MBytes 228 Mbits/sec
[ 5] 8.00-9.00 sec 17.5 MBytes 147 Mbits/sec
[ 5] 9.00-10.00 sec 30.7 MBytes 258 Mbits/sec
[ 5] 10.00-11.00 sec 51.6 MBytes 433 Mbits/sec
[ 5] 11.00-12.00 sec 56.9 MBytes 477 Mbits/sec
[ 5] 12.00-13.00 sec 77.7 MBytes 653 Mbits/sec
[ 5] 13.00-14.00 sec 97.2 MBytes 816 Mbits/sec
[ 5] 14.00-15.00 sec 99.0 MBytes 830 Mbits/sec
[ 5] 15.00-16.00 sec 97.8 MBytes 821 Mbits/sec
[ 5] 16.00-17.00 sec 99.4 MBytes 833 Mbits/sec
[ 5] 17.00-18.00 sec 55.7 MBytes 468 Mbits/sec
[ 5] 18.00-19.00 sec 994 KBytes 8.13 Mbits/sec
[ 5] 19.00-20.00 sec 8.22 MBytes 68.9 Mbits/sec
[ 5] 20.00-21.00 sec 12.0 MBytes 101 Mbits/sec
[ 5] 21.00-22.00 sec 17.0 MBytes 143 Mbits/sec
[ 5] 22.00-23.00 sec 32.4 MBytes 272 Mbits/sec
[ 5] 23.00-24.00 sec 46.2 MBytes 387 Mbits/sec
[ 5] 24.00-25.00 sec 47.7 MBytes 399 Mbits/sec
[ 5] 25.00-26.01 sec 59.8 MBytes 501 Mbits/sec
[ 5] 26.01-27.00 sec 53.9 MBytes 453 Mbits/sec
[ 5] 27.00-28.00 sec 60.6 MBytes 509 Mbits/sec
[ 5] 28.00-29.00 sec 72.4 MBytes 608 Mbits/sec
[ 5] 29.00-30.00 sec 61.6 MBytes 516 Mbits/sec
[ 5] 30.00-31.00 sec 66.6 MBytes 558 Mbits/sec
[ 5] 31.00-32.00 sec 67.0 MBytes 563 Mbits/sec
[ 5] 32.00-33.00 sec 78.1 MBytes 655 Mbits/sec
[ 5] 33.00-34.00 sec 68.9 MBytes 578 Mbits/sec
[ 5] 34.00-35.00 sec 67.4 MBytes 565 Mbits/sec
[ 5] 35.00-36.00 sec 106 MBytes 885 Mbits/sec
[ 5] 36.00-37.00 sec 25.0 MBytes 210 Mbits/sec
[ 5] 37.00-38.00 sec 0.00 Bytes 0.00 Mbits/sec
[ 5] 38.00-39.01 sec 0.00 Bytes 0.00 Mbits/sec
[ 5] 39.01-40.01 sec 0.00 Bytes 0.00 Mbits/sec
[ 5] 40.01-41.00 sec 0.00 Bytes 0.00 Mbits/sec
[ 5] 41.00-42.00 sec 0.00 Bytes 0.00 Mbits/sec
[ 5] 42.00-43.00 sec 0.00 Bytes 0.00 Mbits/sec
[ 5] 43.00-44.00 sec 0.00 Bytes 0.00 Mbits/sec
[ 5] 44.00-45.00 sec 0.00 Bytes 0.00 Mbits/sec
mt7622 seems more stable, but it too has some instability once in a while.
[ 5] 460.00-461.00 sec 15.2 MBytes 127 Mbits/sec
[ 5] 461.00-462.01 sec 4.04 MBytes 33.7 Mbits/sec
[ 5] 462.01-463.00 sec 0.00 Bytes 0.00 Mbits/sec
[ 5] 463.00-464.01 sec 0.00 Bytes 0.00 Mbits/sec
[ 5] 464.01-465.01 sec 0.00 Bytes 0.00 Mbits/sec
[ 5] 465.01-466.01 sec 0.00 Bytes 0.00 Mbits/sec
[ 5] 466.01-467.00 sec 5.00 MBytes 42.2 Mbits/sec
[ 5] 467.00-468.00 sec 16.4 MBytes 137 Mbits/sec
[ 5] 468.00-469.00 sec 16.3 MBytes 137 Mbits/sec
[ 5] 469.00-470.00 sec 15.9 MBytes 133 Mbits/sec
At least my mt7615 works fine ~1h. Where did you get this board? I think you should contact you board manufacturer.
It’s a BPI-MT7615 module. Should I contact @sinovoip?
I have issues on official LEDE image too: when I bring up mt7615 module system goes in reboot.
Hi, @svintuss
Would you please create a github repo for all patches and firmware bin. I can’t follow your approach. Thanks.
Sure, will do that soon. I just want to find out how to make OpenWRT patches from manually modified files. I don’t like a “compile - install - make changes - recompile again - replace modules on working system” approach.
I’ve got some progress here.
After several hours of load testing with iperf3
I found out that mt7615 makes system crash if TX power exceeds 21 dBm. That means that in ‘AU’ or ‘US’ regional domains one have to manually limit TX power to 21 dBm.
I don’t know yet whether it’s my unit’s or a general BPI-MT7615 board/driver problem.
I also have that problem. I got a solution from BPI. If you want use BPI-MT7615 module on BPI-R64 board, The R64 board must modify a resistance to provide more power to the pci-e slot.
Which slot (pcie0,cn25?), which resistant and to which value?