[BPI-R64] OpenWRT kernel 5.4.40 running from eMMC

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

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

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)

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 肖 xiaoqj@banana-pi.com

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?

You’re right.

Thanks to the assistance of 肖 xiaoqj@banana-pi.com from @sinovoip I’ve managed to solve the TX power crash problem.

BPI-R64’s mPCIe slot current is limited to 1.5A (1.44A to be precise). When TX power of mt7615e board exceeds 22 dBm it starts to draw too much current and the whole system crashes.

This 1.5A limit is managed by SY6280 programmable switch. There are two solutions:

  1. Short circuit pins 1 and 5 and remove the current limit.
  2. Increase current limit by replacing R217 resistor to 3K one. This will give 2,27A current limit. The resistor is 0402 (1 mm x 0.5 mm)

I tried method 1, I can confirm that it works. Board is stable with 23 dBm TX power. Maybe the same procedure could be done to CN8 slot too.

UPD: There seems to be an issue with method 1: mt7615e goes up only after initial power on. If one reboots the board or presses reset button there comes up this message in kernel log:

[   12.231122] mt7615e 0000:01:00.0: Firmware is not ready for download

UPD2: Can confirm that method 2 works without issue. After changing R217 to 3KOhm the board is working fine on 23 dBm.

1 Like

Cn8 has additional problem with missing capacitors on tx-lines