[BPI-R64] OpenWRT kernel 5.4.40 running from eMMC

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:

  1. 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.
  2. I wouldn’t call this an elegant solution as it requires manually replacing eeprom.c, recompiling OpenWRT and copying mt76.ko, mt7615-common.ko and mt7615e.ko to /lib/modules/5.4.42/
  3. 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:

  1. 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.
  2. 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?
  3. @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 both kmod-mt76 and kmod-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 :slight_smile:

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

1 Like

@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.

1 Like

@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?

1 Like

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.

  1. On MacBook Pro connected to WiFi 5Ghz network I get 270 Mbit download and 100 Mbit upload.
  2. 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)

1 Like

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.

please send mail to 肖 [email protected]

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?