Debricking MR70x and reverting to OEM firmware

Hi. I installed OpenWrt on my Mercusys MR70x using the provided method in the git commit (flash using OEM firmware upgrade), and used it to test a couple of things. When I later tried to revert to OEM firmware (boot into OEM firmware recovery), it would accept my .bin file, but it would not actually do anything with the file. No matter which firmware I tried, it would not flash it. If I then pulled the power and did a normal boot, it would just go back into LuCI. At one point, I think I accidentally selected an OpenWrt factory image for the recovery prompt, which caused the router to fail to boot into OpenWrt at all, remaining stuck on the OEM firmware recovery page.

I found this thread where someone had a similar issue trying to get OpenWrt installed, and so I opened the router and connected to the serial port. That gave me this log, which is approximately the same as the one in the linked post.


▒▒▒

U-Boot 1.1.3 (Mar 25 2022 - 16:27:28)

Board: Ralink APSoC DRAM:  128 MB
relocate_code Pointer at: 87f58000

Config XHCI 40M PLL
flash manufacture id: 20, device id 40 18
Warning: un-recognized chip ID, please update bootloader!
*** Warning - bad CRC, using default environment

============================================
Ralink UBoot Version: 5.0.0.0
--------------------------------------------
ASIC MT7621A DualCore (MAC to MT7530 Mode)
DRAM_CONF_FROM: Auto-Detection
DRAM_TYPE: DDR3
DRAM bus: 16 bit
Xtal Mode=3 OCP Ratio=1/3
Flash component: SPI Flash
Date:Mar 25 2022  Time:16:27:28
============================================
THIS IS uboot
icache: sets:256, ways:4, linesz:32 ,total:32768
dcache: sets:256, ways:4, linesz:32 ,total:32768

 ##### The CPU freq = 880 MHZ ####
 estimate memory size =128 Mbytes

Press '4' or 't' to break the booting process

Press 'x' to enter recovery web server                                        0
nm_init:791
nm_initFwupPtnStruct:276
nm_lib_readPtnTable:738
[NM_Debug](nm_lib_readPtnTable) 00743: NM_PTN_TABLE_BASE = 0xfe0000
[NM_Debug](nm_lib_readPtnFromNvram) 00569: partition_used_len = 1054, requried l                                                                                                                                                                                                                                                                                                                                            en = 8192
[NM_Debug](nm_lib_readPtnTable) 00751: Reading Partition Table from NVRAM ... OK

[NM_Debug](nm_lib_readPtnTable) 00759: Parsing Partition Table ... OK

[NM_Debug](nm_lib_readPtnFromNvram) 00569: partition_used_len = 2, requried len                                                                                                                                                                                                                                                                                                                                             = 2
[NM_Error](nm_api_checkInteger) 00331: factory boot check integer flag is not 1.

#Reset_MT7530
set LAN/WAN WLLLL


 NetTxPacket = 0x87FE7180

 KSEG1ADDR(NetTxPacket) = 0xA7FE7180
Trying Eth0 (10/100-M)

 Waitting for RX_DMA_BUSY status Start... done


 ETH_STATE_ACTIVE!!
HTTP server is starting at IP: 192.168.1.1
HTTP server is ready!

## Error: request file name not suport!
## Error: request file name not suport!
## Error: request file name not suport!
## Error: request file name not suport!
## Error: request file name not suport!
## Error: request file name not suport!
## Error: request file name not suport!
## Error: request file name not suport!
## Error: request file name not suport!
## Error: request file name not suport!
## Error: request file name not suport!
## Error: request file name not suport!
## Error: request file name not suport!
## Error: request file name not suport!
## Error: request file name not suport!
## Error: request file name not suport!
## Error: request file name not suport!
## Error: request file name not suport!
## Error: request file name not suport!
## Error: request file name not suport!
## Error: request file name not suport!
Data will be downloaded at 0x80500000 in RAM
Upgrade type: firmware
Upload file size: 14702828 bytes
Loading: #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #######################################
         #############################

Firmware process cloud.
Firmware verify OK!
firmware(size 0xe058ec) verify pass!
HTTP upload is done! Upgrading...
do http upgrade
nm_tpFirmwareRecovery---
Firmware Recovery file length : 14702828

Firmware process id 2.

handle_fw_cloud 146

Image verify OK!

Firmware file Verify ok!

[NM_Debug](nm_buildUpgradeStruct) 01273: nm_buildUpgradeStruct 1273 87fe6454

[NM_Debug](nm_buildUpgradeStruct) 01291: nFileBytes = 14698712
[NM_Debug](nm_lib_readPtnFromNvram) 00569: partition_used_len = 272, requried le                                                                                                                                                                                                                                                                                                                                            n = 4096
[Error]sysmgr_proinfo_buildStruct():  660 @ unknown id(device_name), skip it.

[Error]sysmgr_proinfo_buildStruct():  660 @ unknown id(country), skip it.

Firmware supports, check OK.

[NM_Debug](nm_lib_readPtnFromNvram) 00569: partition_used_len = 12, required len = 256                                                                                                                                                                                                                                                                                                 
[NM_Error](nm_checkUpdateContent) 01221: the firmware software version dismatche                                                                                                                                                                                                                                                                                                                                            d

[NM_Error](nm_buildUpgradeStruct) 01316: checkUpdateContent failed.

Web recovery failed type 0.
## Error: HTTP ugrade failed!

Trying Eth0 (10/100-M)

 ETH_STATE_ACTIVE!!
HTTP server is starting at IP: 192.168.1.1
HTTP server is ready!

Following the instructions in the linked thread, I have been able to boot an initramfs OpenWrt build using tftpboot and bootm, but haven't been able to progress much past this.

Thus, my question is this:
How can I successfully flash an OEM stock firmware file onto this router? It's a squashfs-based image, so I can't just tftpboot it. I have serial access and am capable of technical troubleshooting, but I don't have a lot of experience with embedded devices such as this.

same here:

and here:
https://www.reddit.com/r/openwrt/comments/1d4r4h2/cannot_revert_openwrt_install_with_oem_recovery/

Oh, right. Forgot to mention. That reddit post is me from a few days ago.

Hello dear friends.

First of all, i'm a newbie in this router's custom firmware stuff. Second time I was using openWRT, first time was on a tplink and it was more easier to recover.

Now i got an mercusys mr70x free from a client of mine. And if this is my type of play, lets put openWRT on it. I used the flash from webUI and burned: MR70X(EU)_V1_22022220220408115056 (the latest firmware found on website of Mercusys.. After that i'v updated to latest firmware availableusing the WebUI in the router.

Now i went to openWRT site and i grabbed and flashed: openwrt-23.05.3-mediatek-filogic-mercusys_mr90x-v1-initramfs-kernel

All was ok, everything worked but i had in mind to resell it and went again into openWRT webUI and flashed the oficial first firmware again, MR70X(EU)_V1_22022220220408115056, i got an warning that the image miss some ID's, i clicked "i agree" and click Flash.

The router rebooted and now it simply stay with still light on, it responds to PIGNs if i set manual IP to my eth adapter.

I'v tried to use ASUS recovery tool and Firmware Upgrade Utility_v3.7.1 to see if the router goes into recovery mode or semething bot nothing happens?

Any easy way to make it work again? Or it needs to be opened up and have an IT guy look at it.

Thanks a lot and sorry if this was already posted, i'v google it a lot, and found only ASUS and TPlink bricked routers.

blind guess: there should be a revert/recovery boot mode for the mr70x as described here: https://github.com/openwrt/openwrt/pull/12104

For router firmware it is not a good idea, to flash firmware files from different devices (mr90x->mr70x) or to experiment instead on relying on handson guidelines for reverting. As you already found out, experimenting with the flash procedure or firmware files will easily brick a device. Always check the wiki or forum first.

Update: Using binwalk, I found out that the Linux image of the OEM firmware file starts at offset 0x2014. By stripping away this, I was able to tftpboot the stock firmware. It refused to accept OEM firmware upgrades (with an error message this time), but was successfully able to rewrite OpenWrt, meaning I'm now back to where I was before bricking.

1 Like

After writing OpenWrt, I'm no longer able to boot the OEM firmware image with tftpboot. I did try writing it as a sysupgrade image through LuCI, but it gives me the same error. The kernel is unable to mount any of the mtd partitions as root, and panics. I can still tftpboot OpenWrt, and unlike before, sysupgrading with a valid sysupgrade image actually works.

Can you paste the contents of

fw_printenv
root@OpenWrt:~# fw_printenv
read failed about /sys/bus/nvmem/devices/mtd5/of_node/compatible
Cannot parse config file '/etc/fw_env.config': No such file or directory
Failed to find NVMEM device

I have done printenv in the U-Boot console, though, which produces this:

bootargs=console=ttyS1,115200 root=/dev/mtdblock2 rootfstype=squashfs init=/etc/preinit mtdparts=raspi:256k(uboot),4096k(uImage),11968k@0x440000(rootfs),64k@0xff0000(ART) mem=128M
bootcmd=tftp
bootdelay=0x1
baudrate=115200
ethaddr="00:AA:BB:CC:DD:10"
ipaddr=192.168.1.1
serverip=192.168.1.5
stdin=serial
stdout=serial
stderr=serial

Environment size: 332/4092 bytes

I also just now realised that I downloaded all all but the config and the tplink mtd partitions from LuCI after booting into initramfs post-brick, and I'll compare them to the ones I have now.

The uboot, kernel, and radio partitions are identical, while the firmware, rootfs and rootfs_data are different, as per diff.

By setting up /etc/fw_env.config to contain a single entry for /dev/mtd0 of env size and sector size of 0x40000, I got this out of fw_printenv

Warning: Bad CRC, using default environment
bootcmd=bootp; setenv bootargs root=/dev/nfs nfsroot=${serverip}:${rootpath} ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}::off; bootm
bootdelay=5
baudrate=115200
``

Okay, I've been able to resolve this, at least partially. By using tplink-safeloader from the firmware-utils git I was able to convert a stock firmware into a sysupgrade-compatible image. I then used OpenWrt to flash this firmware onto the device. It's imperfect, as it reports a firmware version of 0.0.0, but at least it now gives me the option to look for firmware online (and it correctly says that it's on the latest firmware). I'll be poking and prodding and making sure that everything is working as expected, then I'll close this topic.

this sounds very familiar to the ax23 issues people are having with reverting to stock firmware, on the ax23 if you revert to stock you end up with a firmware version of 3.0.3.

Huh, strange. I wonder if there is some small incompatibility between the EU models and US models in this regard. When I first installed OpenWrt I was a bit confused and applied first the factory image through the OEM web interface, then the sysupgrade image unnecessarily through LuCI. With this, I should still be able to revert using the OEM web recovery.

Maybe installing OpenWrt marks the device as an US model, or otherwise tampers with it? When I try to apply a firmware update manually, it rejects it with this log. I'll try to see if I can get a copy of the US firmware and try that.

upgrade firmware...
Reading Partition Table from NVRAM ... OK
Parsing Partition Table ... OK
file_len:14702828
fw_type_name : Cloud
cloud CheckUpgradeFile : 303
md5 verify ok!
[Error]sysmgr_proinfo_buildStruct():  670 @ unknown id(device_name), skip it.
[Error]sysmgr_proinfo_buildStruct():  670 @ unknown id(country), skip it.
--------------------------------------------------------------------
      vendorName : Mercusys
       vendorUrl : www.mercusys.com
     productName : MR70X
 productLanguage : US
       productId : 18000001
      productVer : ff010000
       specialId : 45550000
            hwId : BEA9246D14969065F575BC7D4814655B
           oemId : F9DCD93DFBF1273E4C14A4BAFBB84C8C
--------------------------------------------------------------------
Firmwave supports, check OK.
[NM_Error](nm_checkUpdateContent) 01058: software version dismatched
[NM_Error](nm_buildUpgradeStruct) 01159: checkUpdateContent failed.
check firmware error!
[NM_Error](nvrammanager_checkUpgradeFile) 00803: check firmware file failed!

[NM_Error](main) 01179: firmware upgrade file check error

firmware check fail

Hello there.

I'v tried to use recovery page (only works in EDGE) but every firmware i'v tried tu upload, it simply goes back to recovery. I have mr70x v1 EU. If someone knows a simple fix without going to some IT guys, please reply.

PS i cant SSH to 192.168.1.1 root 22 , connection refused. I think i broke it when i'v used stock firmware in the wrong firmware upgrade box, while in openWRT.

there is this parallel thread, seems to have the same issue, maybe keep an eye on that discussion: Debricking MR70x and reverting to OEM firmware

Chances are you broke the main firmware, but you should still have a functioning bootloader. At this point, the only thing you can do is crack the router open and connect to it with an USB UART 3.3v serial modem. It has a small header inside for serial connection. This will allow you access to the bootloader console, from which you can boot into a live environment and flash the correct firmware. Check the thread Pico linked and the git commit that added support for the MR70x for details. This is a fairly technical process that requires you to solder in connections (depending on the serial cable/modem you have) on the mainboard itself, then setting up a TFTP server. If you don't feel comfortable doing this, you need to hand it off to someone else.

If you do wind up doing this, here's how to disassemble the unit: Start by screwing out the two visible screws. There are no other screws, and there is nothing under the sticker. Around the edge there are insanely hard clips holding the plastic together. I find the using flexible plastic picks to prise it open a smidge, then using a metal prying tool to fully unhook the clip works best. Ideally you'd use all-plastic tools to preserve the plastic, but these clips are so hard that I was unable to do it. I recommend starting on the long flat bit on the sides of the router. This procedure will most likely marr the plastic and probably snap a clip or two, but the alternative is it remaining a brick. If you truly have tried uploading multiple MR70X stock firmwares into the recovery web page, as I have, there is no other way.

I'm marking this as resolved. Flashing via tplink-safeloader and the normal sysupgrade menu seems to work, with potential caveats about upgrading the firmware later. It might be worth editing the device page for the MR70X to point out that reverting seems to be on sketchy ground, or at least that the provided web recovery doesn't necessarily work with current builds of OpenWrt. I also don't know if it counts for anything, but the stock firmware looks to be based on OpenWrt 12.09 Attitude Adjustment.

So, in case the MR70x is bricked, the solution that worked for me was as follows:

a) Open device (tough clips around the perimeter and 2 screws in the bottom), and solder in connections to the serial header (pinout in git commit)

b) Use serial console along with tftp server to tftpboot an OpenWrt initramfs image.

c) Once back in LuCI, flash either OpenWrt image or tplink-safeloadered firmware image.

d) if C fails, try stripping the beginning from the OEM firmware (seems to be 0x2014 offset in the presently newest firmware build, use binwalk to confirm), and tftpbooting that. I was able to use that to re-flash OpenWrt, from which I could use the aforementioned method to flash the OEM firmware.

1 Like

Out if curiosity, did you use https://argsnd.github.io/tp-link-stock-firmware-converter/index.html for stripping the fw ?

2 Likes

I tried that at some point, but I believe it didn't work. I don't recall if I used it before tftpbooting the OEM firmware though (which allowed OpenWrt to actually flash things properly; prior to this, initramfs OpenWrt would fail to write anything at all)

Okay, I've found sort-of-a-solution to the problem of permitting software upgrades. It still does require serial access (you need access to a root console), but from what I've read on the internet, you may be able to decrypt a config backup, enable dropbear SSH, then re-encrypt it and reupload it to get a shell without tampering with the device. No promises on that, though, as I have not tested it myself.

Assuming you're on the Mercusys (really, TP-Link) OEM firmware console:
a) Use tftp or another suitable method of getting files onto the device to copy over a file containing the string soft_ver:1.0.1 Build 20201103 Rel. 60187. This is the first firmware available for the device, and should allow you to upgrade to any firmware version you so desire. If you've come across this post and have another TP-Link or Mercusys device, you can find the right string for you by using the numbers in the firmware filename, or by using a hex editor to find the software version partition. I'm now going to refer to the file containing this as ver.

b) Use the command nvrammanager -w ver -p soft-version. This will manually overwrite the software version partition using the same tool that's later going to check it.

c) If you have tftp available, you can port over a firmware file and test it with nvrammanager -c [firmware bin file]. If not, you can use the Web UI to check your new software version and upload a replacement firmware.

In theory, if you have serial access, you don't even need to get rid of OpenWrt if you want to do this as a "just in case". Just strip away the firmware update part of the OEM image, and tftpboot it.

As a side note, I may or may not have done a fair bit of work decompiling nvrammanager, particularly the parts pertaining to firmware checking. If you need any details about the tool, let me know.

2 Likes