Xiaomi Up The Power
Are You Low On TX Power?
Some of the Mediatek 7628 based Xiaomi models does not use the all the available transmit power when running OpenWrt
Both the 4A 100M Edition and 4C I purchased had this issue.
Fortunately the fix is fairly simple.
Up The TX Power - The Action Plan
The Flash chip of the device is segmented in various blocks.
One of these blocks is called factory and contains things specific to the device e.g. its MAC Address.
When the operating system then boots up it reads a know location on this bloc to get and configure the device with the correct MAC Address.
This block is also consulted when applying a limit on the broadcast power of the radio.
With the default values in the factory block some devices has a limit of only 14.0 dBm TX power on the 2.4 radio.
This is despite the fact that the radio on the device is capable to transmit much more.
To overcome this limitation we will do the following on each device:
Flash a copy of the OpenWrt with MESHdesk firmware in device (it has kmod-mtd-rw included already).
Make a backup of the factory mtd block.
Modify some values in the copy of the factory mtd block.
Write the updated factory mtd block back to the device.
Reboot
Unleash the fury.
Current TX Power
iw list
#Look For This section
HT TX/RX MCS rate indexes supported: 0-15
Frequencies:
* 2412 MHz [1] (14.0 dBm)
* 2417 MHz [2] (14.0 dBm)
* 2422 MHz [3] (14.0 dBm)
* 2427 MHz [4] (14.0 dBm)
* 2432 MHz [5] (14.0 dBm)
* 2437 MHz [6] (14.0 dBm)
* 2442 MHz [7] (14.0 dBm)
* 2447 MHz [8] (14.0 dBm)
* 2452 MHz [9] (14.0 dBm)
* 2457 MHz [10] (14.0 dBm)
* 2462 MHz [11] (14.0 dBm)
* 2467 MHz [12] (disabled)
* 2472 MHz [13] (disabled)
* 2484 MHz [14] (disabled)
valid interface combinations:
Backup factory block
For this we use the Luci web interface to the device.
Go to System → Backup / Flash Firmware.
Under Save mtdblock contents select the factory mtdblock.
Click the SAVE MTDBLOCK button to download it.
The name of the file has a convention of <HOSTNAME>.<Partition name>.bin (e.g. 4C-GW.mtd2.bin)
Keep in mind that the factory block on each device is unique to that device and has to be treated as such.
Edit The Factory Block
This is probably equivalent to brain surgery on a device
Open the factory block file with a hex editor. We use GHex on Ubuntu.
Starting from address A0 is a row of values.
There are 14 of them.
On my 4C it is C0.
On the 4A 100M the value was 80 instead of C0 but the 14x pattern was still present.
See screenshot below
Replace The factory Block
Copy the modified file to the /tmp directory on the device.
Insert the mtd-rw kernel module.
Override the old factory block.
#My AP is on 192.168.8.120
scp 4C-GW.mtd2_hp.bin root@192.168.8.120:/tmp
#ssh into it
ssh root@192.168.8.120
#cd to /tmp
cd /tmp
#Insert the mtd_rw module
# (You can potentially break the router but it is rare that's why you need the permission flag)
insmod mtd-rw.ko i_want_a_brick=1
#Substitute the name to match your file name
mtd write /tmp/4C-GW.mtd2_hp.bin factory
# This will happen
.....
Unlocking factory ...
Writing from /tmp/4C-GW.mtd2_hp.bin to factory ...
# Reboot the device
UNLEASH THE FURY
UNLEASH THE FURY - HOWTO
During boot time shout Unleash the Fury at the Xiaomi
iw list
#Look for this...
Maximum RX AMPDU length 65535 bytes (exponent: 0x003)
Minimum RX AMPDU time spacing: No restriction (0x00)
HT TX/RX MCS rate indexes supported: 0-15
Frequencies:
* 2412 MHz [1] (30.0 dBm)
* 2417 MHz [2] (30.0 dBm)
* 2422 MHz [3] (30.0 dBm)
* 2427 MHz [4] (30.0 dBm)
* 2432 MHz [5] (30.0 dBm)
* 2437 MHz [6] (30.0 dBm)
* 2442 MHz [7] (30.0 dBm)
* 2447 MHz [8] (30.0 dBm)
* 2452 MHz [9] (30.0 dBm)
* 2457 MHz [10] (30.0 dBm)
* 2462 MHz [11] (30.0 dBm)
* 2467 MHz [12] (disabled)
* 2472 MHz [13] (disabled)
* 2484 MHz [14] (disabled)