Support for TP-Link Archer C20(EU) V6

Hi,

I'd like to ask if it's possible/viable to support the new EU V6 variant of the TP-Link Archer C20 AC750 wireless router?

It seems to be the direct successor of the already well supported V5 variant: https://openwrt.org/toh/tp-link/archer_c20_v5

The specs mostly didn't change with it still having 8 MiB of flash and 64 MiB of RAM, however it is very cheap and can be bought new for around 20-25€.

Specs

Type Model
WiFi chip MediaTek MT7613BEN
CPU MediaTek MT7628AN
Memory ESMT M14D5121632A
Flash XMC 25QH64DHIQ

The main difference to the older variant seems to be the WiFi chip which is a MT7613BEN, whereas V5 had a MT7610EN.

Pictures

Since I couldn't find any pictures of the PCB, I took some myself:

Higher Resolution: https://imgur.com/a/tp-link-archer-c20-eu-v6-ac750-teardown-dCPI2Sk

Are you sure it's not a 4MB flash chip ?

Would be same as in Support for TPLink Archer C20 6.28 ( 4/32 ).

8MB is a dead end too https://openwrt.org/supported_devices/864_warning.

As for the flash chip, I looked this up in the XMC datasheet. Is this correct?

I'd like to use the router as a wireless bridge and Wireguard peer for some IoT devices which don't need a lot of bandwidth - would the 8 MiB flash be sufficient for this?

8 MB is tight already, it might or might not fit.

It being a 864 device I doubt it'd be accepted, meaning it'll be your spare time project.

You can run the v5 firmware and it will run without 5ghz wifi, or you can modify the:

target/linux/ramips/image/mt76x8.mk

and change the DEVICE_PACKAGES entry for the v5 to take different wifi drivers:

DEVICE_PACKAGES := kmod-mt7615e kmod-mt7663-firmware-sta

3 Likes

Thanks, I'll try that.
FWIW, I've also extracted the OEM bootlog via UART:

[05000B0E][05000C0B]

DDR Calibration DQS reg = 00008987


U-Boot 1.1.3 (Mar  7 2023 - 11:05:20)


Board: Ralink APSoC DRAM:  64 MB

relocate_code Pointer at: 83fac000

gpiomode1 54154404.

gpiomode2 05540554.

gpiomode2 05550555.

flash manufacture id: 20, device id 40 17

Warning: un-recognized chip ID, please update bootloader!

============================================ 

Ralink UBoot Version: 4.3.0.0

-------------------------------------------- 

ASIC 7628_MP (Port5<->None)

DRAM component: 512 Mbits DDR, width 16

DRAM bus: 16 bit

Total memory: 64 MBytes

Flash component: SPI Flash

Date:Mar  7 2023  Time:11:05:20

============================================ 

icache: sets:512, ways:4, linesz:32 ,total:65536

dcache: sets:256, ways:4, linesz:32 ,total:32768 


 ##### The CPU freq = 580 MHZ #### 

 estimate memory size =64 Mbytes

RESET MT7628 PHY!!!!!!

continue to starting system.

 0 


U-Boot 1.1.3 (Mar  7 2023 - 11:05:17)


Board: Ralink APSoC DRAM:  64 MB

relocate_code Pointer at: 83fb8000

gpiomode1 54154404.

gpiomode2 00000000.

gpiomode2 05550555.

flash manufacture id: 20, device id 40 17

Warning: un-recognized chip ID, please update bootloader!

============================================ 

Ralink UBoot Version: 4.3.0.0

-------------------------------------------- 

ASIC 7628_MP (Port5<->None)

DRAM component: 512 Mbits DDR, width 16

DRAM bus: 16 bit

Total memory: 64 MBytes

Flash component: SPI Flash

Date:Mar  7 2023  Time:11:05:17

============================================ 

icache: sets:512, ways:4, linesz:32 ,total:65536

dcache: sets:256, ways:4, linesz:32 ,total:32768 


 ##### The CPU freq = 580 MHZ #### 

 estimate memory size =64 Mbytes

RESET MT7628 PHY!!!!!!

continue to starting system.

 0 

disable switch phyport...

   

3: System Boot system code via Flash.(0xbc050000)

do_bootm:argc=2, addr=0xbc050000

## Booting image at bc050000 ...

   Uncompressing Kernel Image ... OK

No initrd

## Transferring control to Linux (at address 8000c150) ...

## Giving linux memsize in MB, 64


Starting kernel ...


LINUX started...

 THIS IS ASIC
Linux version 2.6.36 (fengbiao@fengbiao) (gcc version 4.6.3 (Buildroot 2012.11.1) ) #1 Tue Mar 7 11:07:51 CST 2023

 The CPU feqenuce set to 580 MHz

 MIPS CPU sleep mode enabled.
CPU revision is: 00019655 (MIPS 24Kc)
Software DMA cache coherency
Determined physical RAM map:
 memory: 04000000 @ 00000000 (usable)
Initrd not found or empty - disabling initrd
Zone PFN ranges:
  Normal   0x00000000 -> 0x00004000
Movable zone start PFN for each node
early_node_map[1] active PFN ranges
    0: 0x00000000 -> 0x00004000
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 16256
Kernel command line: console=ttyS1,115200 root=/dev/mtdblock2 rootfstype=squashfs init=/sbin/init
PID hash table entries: 256 (order: -2, 1024 bytes)
Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
Primary instruction cache 64kB, VIPT, , 4-waylinesize 32 bytes.
Primary data cache 32kB, 4-way, PIPT, no aliases, linesize 32 bytes
Writing ErrCtl register=00014614
Readback ErrCtl register=00014614
Memory: 61204k/65536k available (2525k kernel code, 4332k reserved, 674k data, 164k init, 0k highmem)
NR_IRQS:128
console [ttyS1] enabled
Calibrating delay loop... 386.04 BogoMIPS (lpj=772096)
pid_max: default: 4096 minimum: 301
Mount-cache hash table entries: 512
NET: Registered protocol family 16
RALINK_GPIOMODE = 54154404 
RALINK_GPIOMODE = 54144404 
***** Xtal 40MHz *****
start PCIe register access
RALINK_RSTCTRL = 2400000
RALINK_CLKCFG1 = fdbfffc0

*************** MT7628 PCIe RC mode *************
PCIE0 enabled
Port 0 N_FTS = 1b105000
init_rt2880pci done
bio: create slab <bio-0> at 0
vgaarb: loaded
pci 0000:00:00.0: BAR 0: can't assign mem (size 0x80000000)
pci 0000:00:00.0: BAR 9: assigned [mem 0x20000000-0x201fffff pref]
pci 0000:00:00.0: BAR 1: assigned [mem 0x20200000-0x2020ffff]
pci 0000:00:00.0: BAR 1: set to [mem 0x20200000-0x2020ffff] (PCI address [0x20200000-0x2020ffff]
pci 0000:01:00.0: BAR 0: assigned [mem 0x20000000-0x200fffff 64bit pref]
pci 0000:01:00.0: BAR 0: set to [mem 0x20000000-0x200fffff 64bit pref] (PCI address [0x20000000-0x200fffff]
pci 0000:01:00.0: BAR 2: assigned [mem 0x20100000-0x20103fff 64bit pref]
pci 0000:01:00.0: BAR 2: set to [mem 0x20100000-0x20103fff 64bit pref] (PCI address [0x20100000-0x20103fff]
pci 0000:01:00.0: BAR 4: assigned [mem 0x20104000-0x20104fff 64bit pref]
pci 0000:01:00.0: BAR 4: set to [mem 0x20104000-0x20104fff 64bit pref] (PCI address [0x20104000-0x20104fff]
pci 0000:00:00.0: PCI bridge to [bus 01-01]
pci 0000:00:00.0:   bridge window [io  disabled]
pci 0000:00:00.0:   bridge window [mem disabled]
pci 0000:00:00.0:   bridge window [mem 0x20000000-0x201fffff pref]
BAR0 at slot 0 = 0
bus=0x0, slot = 0x0
res[0]->start = 0
res[0]->end = 0
res[1]->start = 20200000
res[1]->end = 2020ffff
res[2]->start = 0
res[2]->end = 0
res[3]->start = 0
res[3]->end = 0
res[4]->start = 0
res[4]->end = 0
res[5]->start = 0
res[5]->end = 0
bus=0x1, slot = 0x0
res[0]->start = 20000000
res[0]->end = 200fffff
res[1]->start = 0
res[1]->end = 0
res[2]->start = 20100000
res[2]->end = 20103fff
res[3]->start = 0
res[3]->end = 0
res[4]->start = 20104000
res[4]->end = 20104fff
res[5]->start = 0
res[5]->end = 0
Switching to clocksource Ralink Systick timer
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 2048 (order: 2, 16384 bytes)
TCP bind hash table entries: 2048 (order: 1, 8192 bytes)
TCP: Hash tables configured (established 2048 bind 2048)
TCP reno registered
NET: Registered protocol family 1
squashfs: version 4.0 (2009/01/31) Phillip Lougher
fuse init (API version 7.15)
msgmni has been set to 119
io scheduler noop registered
io scheduler deadline registered (default)
Ralink gpio driver initialized
i2cdrv_major = 218
Serial: 8250/16550 driver, 2 ports, IRQ sharing enabled
serial8250: ttyS0 at MMIO 0x10000d00 (irq = 21) is a 16550A
serial8250: ttyS1 at MMIO 0x10000c00 (irq = 20) is a 16550A
brd: module loaded
flash manufacture id: 20, device id 40 17
Warning: un-recognized chip ID, please update SPI driver!
N25Q064A13ESE40F(20 ba171000) (8192 Kbytes)
mtd .name = raspi, .size = 0x00800000 (8M) .erasesize = 0x00010000 (64K) .numeraseregions = 0
Creating 7 MTD partitions on "raspi":
0x000000030000-0x000000050000 : "boot"
0x000000050000-0x000000190000 : "kernel"
0x000000190000-0x0000007c0000 : "rootfs"
mtd: partition "rootfs" set to be root filesystem
0x0000007c0000-0x0000007d0000 : "config"
0x0000007d0000-0x0000007e0000 : "romfile"
0x0000007e0000-0x0000007f0000 : "rom"
0x0000007f0000-0x000000800000 : "radio"
Register flash device:flash0
PPP generic driver version 2.4.2
PPP MPPE Compression module registered
NET: Registered protocol family 24
Mirror/redirect action on
u32 classifier
    Actions configured
Netfilter messages via NETLINK v0.30.
nf_conntrack version 0.5.0 (2048 buckets, 8192 max)
ip_tables: (C) 2000-2006 Netfilter Core Team, Type=Linux
TCP cubic registered
NET: Registered protocol family 10
ip6_tables: (C) 2000-2006 Netfilter Core Team
IPv6 over IPv4 tunneling driver
NET: Registered protocol family 17
Ebtables v2.0 registered
802.1Q VLAN Support v1.8 Ben Greear <greearb@candelatech.com>
All bugs added by David S. Miller <davem@redhat.com>
VFS: Mounted root (squashfs filesystem) readonly on device 31:2.
Freeing unused kernel memory: 164k freed

starting pid 688, tty '': '/etc/init.d/rcS'
rdm_major = 253
spiflash_ioctl_read, Read from 0x007df100 length 0x6, ret 0, retlen 0x6
Read MAC from flash(  7df100) ffffffa8-6e-ffffff84-02-fffffffb-ffffffe0
GMAC1_MAC_ADRH -- : 0x0000a86e
GMAC1_MAC_ADRL -- : 0x8402fbe0
Ralink APSoC Ethernet Driver Initilization. v3.1  256 rx/tx descriptors allocated, mtu = 1500!
NAPI enable, Tx Ring = 256, Rx Ring = 256
spiflash_ioctl_read, Read from 0x007df100 length 0x6, ret 0, retlen 0x6
Read MAC from flash(  7df100) ffffffa8-6e-ffffff84-02-fffffffb-ffffffe0
GMAC1_MAC_ADRH -- : 0x0000a86e
GMAC1_MAC_ADRL -- : 0x8402fbe0
PROC INIT OK!
add domain:tplinkwifi.net
add domain:tplinkap.net
add domain:tplinkrepeater.net
add domain:tplinklogin.net
tp_domain init ok
L2TP core driver, V2.0
PPPoL2TP kernel driver, V2.0
Set: phy[0].reg[0] = 3900
Set: phy[1].reg[0] = 3900
Set: phy[2].reg[0] = 3900
Set: phy[3].reg[0] = 3900
Set: phy[4].reg[0] = 3900
Set: phy[0].reg[0] = 3300
Set: phy[1].reg[0] = 3300
Set: phy[2].reg[0] = 3300
Set: phy[3].reg[0] = 3300
Set: phy[4].reg[0] = 3300
resetMiiPortV over.
Set: phy[0].reg[4] = 01e1
Set: phy[0].reg[0] = 3300
Set: phy[1].reg[4] = 01e1
Set: phy[1].reg[0] = 3300
Set: phy[2].reg[4] = 01e1
Set: phy[2].reg[0] = 3300
Set: phy[3].reg[4] = 01e1
Set: phy[3].reg[0] = 3300
Set: phy[4].reg[4] = 01e1
Set: phy[4].reg[0] = 3300
turn off flow control over.

starting pid 751, tty '/dev/ttyS1': '/bin/sh'
~ #

Press/hold "any key" during this countdown

Then in uboot command line type "help" , "printenv"

Sadly, I wasn't able to interrupt the boot - I think the countdown is set to zero seconds.
However, it seems after boot up you're dumped into a root shell:

Anything you might want me to try?

1 Like

Try fw_printenv, if available.

Sadly, it isn't available. Here's a list of all files in the PATH directories:

lrwxrwxrwx    1         7 umount -> busybox
lrwxrwxrwx    1         7 sleep -> busybox
lrwxrwxrwx    1         7 sh -> busybox
lrwxrwxrwx    1         7 sed -> busybox
lrwxrwxrwx    1         7 rm -> busybox
lrwxrwxrwx    1         7 ps -> busybox
lrwxrwxrwx    1         7 ping6 -> busybox
lrwxrwxrwx    1         7 ping -> busybox
lrwxrwxrwx    1         7 pidof -> busybox
lrwxrwxrwx    1         7 netstat -> busybox
lrwxrwxrwx    1         7 mount -> busybox
lrwxrwxrwx    1         7 mkdir -> busybox
lrwxrwxrwx    1         7 ls -> busybox
lrwxrwxrwx    1         7 login -> busybox
lrwxrwxrwx    1         7 kill -> busybox
lrwxrwxrwx    1         7 grep -> busybox
lrwxrwxrwx    1         7 echo -> busybox
lrwxrwxrwx    1         7 dmesg -> busybox
lrwxrwxrwx    1         7 df -> busybox
lrwxrwxrwx    1         7 date -> busybox
lrwxrwxrwx    1         7 cp -> busybox
lrwxrwxrwx    1         7 chmod -> busybox
lrwxrwxrwx    1         7 cat -> busybox
-rwxr-xr-x    1    315996 busybox
lrwxrwxrwx    1         7 ash -> busybox
lrwxrwxrwx    1        14 vconfig -> ../bin/busybox
-rwxrwxr-x    1     14972 switch
lrwxrwxrwx    1        14 route -> ../bin/busybox
lrwxrwxrwx    1        14 rmmod -> ../bin/busybox
lrwxrwxrwx    1        14 reboot -> ../bin/busybox
lrwxrwxrwx    1        14 poweroff -> ../bin/busybox
-rwxrwxr-x    1      5444 mii_mgr_cl45
-rwxrwxr-x    1      5716 mii_mgr
lrwxrwxrwx    1        14 lsmod -> ../bin/busybox
lrwxrwxrwx    1        14 insmod -> ../bin/busybox
lrwxrwxrwx    1        14 init -> ../bin/busybox
lrwxrwxrwx    1        14 ifconfig -> ../bin/busybox
lrwxrwxrwx    1        14 halt -> ../bin/busybox
lrwxrwxrwx    1        14 getty -> ../bin/busybox
-rwxrwxr-x    1       981 config-mii.sh
-rwxrwxr-x    1     87680 zebra
-rwxrwxr-x    1    133324 xl2tpd
lrwxrwxrwx    1        17 telnetd -> ../../bin/busybox
-rwxrwxr-x    1     97888 ripd
-rwxrwxr-x    1    101524 radvd
-rwxrwxr-x    1    365276 pppd
-rwxrwxr-x    1    167140 dhcp6s
-rwxrwxr-x    1    182264 dhcp6c
lrwxrwxrwx    1        17 brctl -> ../../bin/busybox
-rwxrwxrwx    1     41332 bpalogin
-rwxrwxr-x    1    473768 xtables-multi
-rwxrwxr-x    1    261828 wscd_5G
-rwxrwxr-x    1    261828 wscd
-rwxrwxr-x    1      8764 wlNetlinkTool
-rwxrwxr-x    1     92508 wifidog
-rwxrwxr-x    1      8648 wdctl
-rwxrwxr-x    1     10028 wanType
-rwxrwxr-x    1     97024 upnpd
-rwxrwxr-x    1     79968 traceroute
-rwxrwxr-x    1     79380 tr143d
lrwxrwxrwx    1        17 top -> ../../bin/busybox
-rwxrwxr-x    1    124936 tmpd
lrwxrwxrwx    1        17 tftp -> ../../bin/busybox
-rwxrwxr-x    1     84868 tdpd
-rwxrwxr-x    1     48968 tddp
-rwxrwxr-x    1    129000 tc
lrwxrwxrwx    1        17 taskset -> ../../bin/busybox
lrwxrwxrwx    1        13 scp -> dropbearmulti
-rwxrwxr-x    1    161612 rtinicapd
-rwxrwxr-x    1     73608 rt2860apd
lrwxrwxrwx    1        17 pgrep -> ../../bin/busybox
-rwxrwxr-x    1    551244 openssl
-rwxrwxr-x    1     10352 ntpc
-rwxrwxr-x    1     14256 noipdns
-rwxrwxr-x    1     29880 mldProxy
lrwxrwxrwx    1        17 killall -> ../../bin/busybox
-rwxrwxr-x    1     10276 iwpriv
-rwxrwxr-x    1     23504 iwconfig
lrwxrwxrwx    1        13 iptables -> xtables-multi
-rwxrwxr-x    1     56804 ipping
lrwxrwxrwx    1        17 ipcs -> ../../bin/busybox
lrwxrwxrwx    1        17 ipcrm -> ../../bin/busybox
lrwxrwxrwx    1        13 ip6tables -> xtables-multi
-rwxrwxr-x    1    270456 ip
-rwxrwxr-x    1     27872 igmpd
-rwxrwxr-x    1    165628 httpd
lrwxrwxrwx    1        17 free -> ../../bin/busybox
-rwxrwxr-x    1    208468 ebtables
-rwxrwxr-x    1     14268 dyndns
-rwxrwxr-x    1    722144 dropbearmulti
lrwxrwxrwx    1        13 dropbearkey -> dropbearmulti
lrwxrwxrwx    1        13 dropbear -> dropbearmulti
-rwxrwxr-x    1      6772 dnsProxy
-rwxrwxr-x    1     45556 dhcpd
-rwxrwxr-x    1     36552 dhcpc
-rwxrwxr-x    1    121392 cwmp
-rwxrwxr-x    1    189960 curl
-rwxrwxr-x    1    100304 cos
-rwxrwxr-x    1     14256 cmxdns
-rwxrwxr-x    1     44528 cloud_https
-rwxrwxr-x    1    101836 cli
lrwxrwxrwx    1        17 awk -> ../../bin/busybox
-rwxrwxr-x    1     16044 ated_tp
lrwxrwxrwx    1        17 arping -> ../../bin/busybox
-rwxrwxr-x    1      4892 afcd

The cli command is a TP-Link router shell:

grafik

When entering admin for password, we get this:

Okay, here's the software version. I didn't find anything more interesting.

Any key didn't work, however 4 did:

switch BootType:
   
4: System Enter Boot Command Line Interface.

U-Boot 1.1.3 (Mar  7 2023 - 11:05:20)
MT7628 # printenv            
bootcmd=tftp
bootdelay=1
baudrate=115200
ethaddr="00:0A:EB:13:09:69"
ipaddr=192.168.0.2
serverip=192.168.0.225
stdin=serial
stdout=serial
stderr=serial

Environment size: 152/4092 bytes

Here's the output for help:

MT7628 # help
?       - alias for 'help'
base    - print or set address offset
bootm   - boot application image from memory
bootp   - boot image via network using BootP/TFTP protocol
coninfo - print console devices and information
cp      - memory copy
crc32   - checksum calculation
erase   - erase SPI FLASH memory
go      - start application at address 'addr'
help    - print online help
start www server for firmware recovery
loadb   - load binary file over serial line (kermit mode)
loop    - infinite loop on address range
md      - memory display
mm      - memory modify (auto-incrementing)
mtest   - simple RAM test
nm      - memory modify (constant address)
printenv- print environment variables
rarpboot- boot image via network using RARP/TFTP protocol
reset   - Perform RESET of the CPU
rf      - read/write rf register
saveenv - save environment variables to persistent storage
setenv  - set environment variables
spi     - spi command
tftpboot- boot image via network using TFTP protocol
version - print monitor version

(Edit: Replaced images with text)

1 Like

Please use the "Preformatted text </>" button for logs, scripts, configs and general console output (red circle; this works best in the 'Markdown' composer view in the blue oval):

Screenshot 2025-10-20 at 8.14.14 PM

1 Like

set tftp server on "serverip" then load file via tftpboot (file name in server log) and so on.

OpenWRT works! Many thanks to you all! :heart:
I'll test the router in the next few days to make sure everything functions correctly.


Flashing

Like the previous revision, this router has two bootloaders - the second one of which has to be copied from the original TP-Link firmware into the recovery image.

For this step, I've downloaded the TP-Link firmware image from here.

The length of the boot partition seems to be the same, so the V5 instructions can be used: https://openwrt.org/toh/tp-link/archer_c20_v5#installing_via_tftp
I've only tested flashing via TFTP though (set up TFTP server at 192.168.0.66, then start router with reset button held down until second green LED starts flashing).

Build configuration

I checked out OpenWRT v24.10.5, then made the following changes recommended by @idcrisis:

diff --git a/target/linux/ramips/image/mt76x8.mk b/target/linux/ramips/image/mt76x8.mk
index f1873a794e..a5e7de71fa 100644
--- a/target/linux/ramips/image/mt76x8.mk
+++ b/target/linux/ramips/image/mt76x8.mk
@@ -645,7 +645,7 @@ define Device/tplink_archer-c20-v5
   TPLINK_FLASHLAYOUT := 8MSUmtk
   TPLINK_HWID := 0xc200005
   TPLINK_HWREVADD := 0x5
-  DEVICE_PACKAGES := kmod-mt76x0e
+  DEVICE_PACKAGES := kmod-mt7615e kmod-mt7663-firmware-sta
   IMAGES := sysupgrade.bin
 endef
 TARGET_DEVICES += tplink_archer-c20-v5

Here's the build configuration I chose for my image:

CONFIG_TARGET_ramips=y
CONFIG_TARGET_ramips_mt76x8=y
CONFIG_TARGET_ramips_mt76x8_DEVICE_tplink_archer-c20-v5=y
CONFIG_LUCI_SRCDIET=y
CONFIG_PACKAGE_cgi-io=y
CONFIG_PACKAGE_liblua=y
CONFIG_PACKAGE_liblucihttp=y
CONFIG_PACKAGE_liblucihttp-lua=y
CONFIG_PACKAGE_liblucihttp-ucode=y
CONFIG_PACKAGE_libubus-lua=y
CONFIG_PACKAGE_lua=y
CONFIG_PACKAGE_luci=y
CONFIG_PACKAGE_luci-app-firewall=y
CONFIG_PACKAGE_luci-app-package-manager=y
CONFIG_PACKAGE_luci-base=y
CONFIG_PACKAGE_luci-lib-base=y
CONFIG_PACKAGE_luci-lib-ip=y
CONFIG_PACKAGE_luci-lib-json=y
CONFIG_PACKAGE_luci-lib-jsonc=y
CONFIG_PACKAGE_luci-lib-nixio=y
CONFIG_PACKAGE_luci-light=y
CONFIG_PACKAGE_luci-lua-runtime=y
CONFIG_PACKAGE_luci-mod-admin-full=y
CONFIG_PACKAGE_luci-mod-network=y
CONFIG_PACKAGE_luci-mod-rpc=y
CONFIG_PACKAGE_luci-mod-status=y
CONFIG_PACKAGE_luci-mod-system=y
CONFIG_PACKAGE_luci-proto-ipv6=y
CONFIG_PACKAGE_luci-proto-ppp=y
CONFIG_PACKAGE_luci-theme-bootstrap=y
CONFIG_PACKAGE_rpcd=y
CONFIG_PACKAGE_rpcd-mod-file=y
CONFIG_PACKAGE_rpcd-mod-iwinfo=y
CONFIG_PACKAGE_rpcd-mod-luci=y
CONFIG_PACKAGE_rpcd-mod-rpcsys=y
CONFIG_PACKAGE_rpcd-mod-rrdns=y
CONFIG_PACKAGE_rpcd-mod-ucode=y
CONFIG_PACKAGE_ucode-mod-html=y
CONFIG_PACKAGE_ucode-mod-lua=y
CONFIG_PACKAGE_ucode-mod-math=y
CONFIG_PACKAGE_uhttpd=y
CONFIG_PACKAGE_uhttpd-mod-ubus=y

OpenWRT bootlog

This is what the UART output looks like with the OpenWRT firmware flashed:

[05000B0F][05000C0C]

DDR Calibration DQS reg = 00008A87


U-Boot 1.1.3 (Mar  7 2023 - 11:05:20)


Board: Ralink APSoC DRAM:  64 MB

relocate_code Pointer at: 83fac000

gpiomode1 54154404.

gpiomode2 05540554.

gpiomode2 05550555.

flash manufacture id: 20, device id 40 17

Warning: un-recognized chip ID, please update bootloader!

============================================ 

Ralink UBoot Version: 4.3.0.0

-------------------------------------------- 

ASIC 7628_MP (Port5<->None)

DRAM component: 512 Mbits DDR, width 16

DRAM bus: 16 bit

Total memory: 64 MBytes

Flash component: SPI Flash

Date:Mar  7 2023  Time:11:05:20

============================================ 

icache: sets:512, ways:4, linesz:32 ,total:65536

dcache: sets:256, ways:4, linesz:32 ,total:32768 


 ##### The CPU freq = 580 MHZ #### 

 estimate memory size =64 Mbytes

RESET MT7628 PHY!!!!!!

continue to starting system.

 0 


U-Boot 1.1.3 (Dec 31 2024 - 14:37:19)


Board: Ralink APSoC DRAM:  64 MB

relocate_code Pointer at: 83fb8000

gpiomode1 54154404.

gpiomode2 00000000.

gpiomode2 05550555.

flash manufacture id: 20, device id 40 17

Warning: un-recognized chip ID, please update bootloader!

============================================ 

Ralink UBoot Version: 4.3.0.0

-------------------------------------------- 

ASIC 7628_MP (Port5<->None)

DRAM component: 512 Mbits DDR, width 16

DRAM bus: 16 bit

Total memory: 64 MBytes

Flash component: SPI Flash

Date:Dec 31 2024  Time:14:37:19

============================================ 

icache: sets:512, ways:4, linesz:32 ,total:65536

dcache: sets:256, ways:4, linesz:32 ,total:32768 


 ##### The CPU freq = 580 MHZ #### 

 estimate memory size =64 Mbytes

RESET MT7628 PHY!!!!!!

continue to starting system.

 0 

disable switch phyport...

   

3: System Boot system code via Flash.(0xbc050000)

do_bootm:argc=2, addr=0xbc050000

## Booting image at bc050000 ...

   Uncompressing Kernel Image ... OK

No initrd


Starting kernel ...


[    0.000000] Linux version 6.6.119 (REDACTED@REDACTED) (mipsel-openwrt-linux-musl-gcc (OpenWrt GCC 13.3.0 r29087-d9c5716d1d) 13.3.0, GNU ld (GNU Binutils) 2.42) #0 Wed Dec 17 21:08:22 2025
[    0.000000] Board has DDR2
[    0.000000] Analog PMU set to hw control
[    0.000000] Digital PMU set to hw control
[    0.000000] SoC Type: MediaTek MT7628AN ver:1 eco:2
[    0.000000] printk: bootconsole [early0] enabled
[    0.000000] CPU0 revision is: 00019655 (MIPS 24KEc)
[    0.000000] MIPS: machine is TP-Link Archer C20 v5
[    0.000000] Initrd not found or empty - disabling initrd
[    0.000000] Primary instruction cache 64kB, VIPT, 4-way, linesize 32 bytes.
[    0.000000] Primary data cache 32kB, 4-way, PIPT, no aliases, linesize 32 bytes
[    0.000000] Zone ranges:
[    0.000000]   Normal   [mem 0x0000000000000000-0x0000000003ffffff]
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000000000000-0x0000000003ffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x0000000003ffffff]
[    0.000000] Kernel command line: console=ttyS0,115200 rootfstype=squashfs,jffs2
[    0.000000] Dentry cache hash table entries: 8192 (order: 3, 32768 bytes, linear)
[    0.000000] Inode-cache hash table entries: 4096 (order: 2, 16384 bytes, linear)
[    0.000000] Writing ErrCtl register=00004f1e
[    0.000000] Readback ErrCtl register=00004f1e
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 16256
[    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[    0.000000] Memory: 57576K/65536K available (4545K kernel code, 577K rwdata, 740K rodata, 1232K init, 191K bss, 7960K reserved, 0K cma-reserved)
[    0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[    0.000000] NR_IRQS: 256
[    0.000000] intc: using register map from devicetree
[    0.000000] CPU Clock: 580MHz
[    0.000000] clocksource: MIPS: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 6590553264 ns
[    0.000002] sched_clock: 32 bits at 290MHz, resolution 3ns, wraps every 7405115902ns
[    0.007614] Calibrating delay loop... 385.84 BogoMIPS (lpj=1929216)
[    0.073547] pid_max: default: 32768 minimum: 301
[    0.086798] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
[    0.093855] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
[    0.111957] RCU Tasks Trace: Setting shift to 0 and lim to 1 rcu_task_cb_adjust=1 rcu_task_cpu_ids=1.
[    0.127287] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[    0.136843] futex hash table entries: 256 (order: 0, 3072 bytes, linear)
[    0.143374] pinctrl core: initialized pinctrl subsystem
[    0.151800] NET: Registered PF_NETLINK/PF_ROUTE protocol family
[    0.161656] /pinctrl: Fixed dependency cycle(s) with /pinctrl/pinctrl0
[    0.434130] PCI host bridge to bus 0000:00
[    0.438062] pci_bus 0000:00: root bus resource [mem 0x20000000-0x2fffffff]
[    0.444748] pci_bus 0000:00: root bus resource [io  0x10160000-0x1016ffff]
[    0.451340] pci_bus 0000:00: No busn resource found for root bus, will use [bus 00-ff]
[    0.459057] pci 0000:00:00.0: [14c3:0801] type 01 class 0x060400
[    0.464826] pci 0000:00:00.0: reg 0x10: [mem 0x00000000-0x7fffffff]
[    0.470882] pci 0000:00:00.0: reg 0x14: [mem 0x00000000-0x0000ffff]
[    0.476991] pci 0000:00:00.0: supports D1
[    0.480801] pci 0000:00:00.0: PME# supported from D0 D1 D3hot
[    0.488312] pci 0000:00:00.0: bridge configuration invalid ([bus 00-00]), reconfiguring
[    0.496286] pci 0000:01:00.0: [14c3:7663] type 00 class 0x000280
[    0.502136] pci 0000:01:00.0: reg 0x10: [mem 0x00000000-0x000fffff 64bit pref]
[    0.509087] pci 0000:01:00.0: reg 0x18: [mem 0x00000000-0x00003fff 64bit pref]
[    0.516074] pci 0000:01:00.0: reg 0x20: [mem 0x00000000-0x00000fff 64bit pref]
[    0.523142] pci 0000:01:00.0: supports D1 D2
[    0.527220] pci 0000:01:00.0: PME# supported from D0 D1 D2 D3hot D3cold
[    0.533623] pci 0000:01:00.0: 2.000 Gb/s available PCIe bandwidth, limited by 2.5 GT/s PCIe x1 link at 0000:00:00.0 (capable of 4.000 Gb/s with 5.0 GT/s PCIe x1 link)
[    0.548362] pci_bus 0000:01: busn_res: [bus 01-ff] end is updated to 01
[    0.554728] pci_bus 0000:00: busn_res: [bus 00-ff] end is updated to 01
[    0.561171] pci 0000:00:00.0: BAR 0: no space for [mem size 0x80000000]
[    0.567512] pci 0000:00:00.0: BAR 0: failed to assign [mem size 0x80000000]
[    0.574251] pci 0000:00:00.0: BAR 9: assigned [mem 0x20000000-0x201fffff pref]
[    0.581205] pci 0000:00:00.0: BAR 1: assigned [mem 0x20200000-0x2020ffff]
[    0.587781] pci 0000:01:00.0: BAR 0: assigned [mem 0x20000000-0x200fffff 64bit pref]
[    0.595249] pci 0000:01:00.0: BAR 2: assigned [mem 0x20100000-0x20103fff 64bit pref]
[    0.602739] pci 0000:01:00.0: BAR 4: assigned [mem 0x20104000-0x20104fff 64bit pref]
[    0.610203] pci 0000:00:00.0: PCI bridge to [bus 01]
[    0.614990] pci 0000:00:00.0:   bridge window [mem 0x20000000-0x201fffff pref]
[    0.623922] clocksource: Switched to clocksource MIPS
[    0.642152] NET: Registered PF_INET protocol family
[    0.647296] IP idents hash table entries: 2048 (order: 2, 16384 bytes, linear)
[    0.655430] tcp_listen_portaddr_hash hash table entries: 1024 (order: 0, 4096 bytes, linear)
[    0.663593] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear)
[    0.671119] TCP established hash table entries: 1024 (order: 0, 4096 bytes, linear)
[    0.678504] TCP bind hash table entries: 1024 (order: 1, 8192 bytes, linear)
[    0.685323] TCP: Hash tables configured (established 1024 bind 1024)
[    0.691634] UDP hash table entries: 256 (order: 0, 4096 bytes, linear)
[    0.697994] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes, linear)
[    0.705699] NET: Registered PF_UNIX/PF_LOCAL protocol family
[    0.711276] PCI: CLS 0 bytes, default 32
[    0.721422] workingset: timestamp_bits=30 max_order=14 bucket_order=0
[    0.728110] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[    0.733700] jffs2: version 2.2 (NAND) (SUMMARY) (LZMA) (RTIME) (CMODE_PRIORITY) (c) 2001-2006 Red Hat, Inc.
[    0.748136] mt7621_gpio 10000600.gpio: registering 32 gpios
[    0.753990] mt7621_gpio 10000600.gpio: registering 32 gpios
[    0.759765] mt7621_gpio 10000600.gpio: registering 32 gpios
[    0.766049] Serial: 8250/16550 driver, 3 ports, IRQ sharing disabled
[    0.774708] printk: console [ttyS0] disabled
[    0.779492] 10000c00.uart0: ttyS0 at MMIO 0x10000c00 (irq = 28, base_baud = 2500000) is a 16550A
[    0.788087] printk: console [ttyS0] enabled
[    0.788087] printk: console [ttyS0] enabled
[    0.796512] printk: bootconsole [early0] disabled
[    0.796512] printk: bootconsole [early0] disabled
[    0.825921] spi-mt7621 10000b00.spi: sys_freq: 193333333
[    0.838478] spi-nor spi0.0: XM25QH64C (8192 Kbytes)
[    0.843679] 7 fixed-partitions partitions found on MTD device spi0.0
[    0.850327] OF: Bad cell count for /palmbus@10000000/spi@b00/flash@0/partitions
[    0.857826] OF: Bad cell count for /palmbus@10000000/spi@b00/flash@0/partitions
[    0.865672] Creating 7 MTD partitions on "spi0.0":
[    0.870562] 0x000000000000-0x000000030000 : "factory-uboot"
[    0.880331] 0x000000030000-0x000000050000 : "boot"
[    0.888028] 0x000000050000-0x0000007c0000 : "firmware"
[    0.896510] 2 tplink-fw partitions found on MTD device firmware
[    0.902559] Creating 2 MTD partitions on "firmware":
[    0.907676] 0x000000000000-0x0000001c7cd3 : "kernel"
[    0.912718] mtd: partition "kernel" doesn't end on an erase/write block -- force read-only
[    0.923739] 0x0000001c7cd4-0x000000770000 : "rootfs"
[    0.928892] mtd: partition "rootfs" doesn't start on an erase/write block boundary -- force read-only
[    0.940753] mtd: setting mtd4 (rootfs) as root device
[    0.946093] 1 squashfs-split partitions found on MTD device rootfs
[    0.952377] 0x0000005c0000-0x000000770000 : "rootfs_data"
[    0.960613] 0x0000007c0000-0x0000007d0000 : "config"
[    0.968430] 0x0000007d0000-0x0000007e0000 : "rom"
[    0.976086] OF: Bad cell count for /palmbus@10000000/spi@b00/flash@0/partitions
[    0.984068] 0x0000007e0000-0x0000007f0000 : "romfile"
[    0.991906] 0x0000007f0000-0x000000800000 : "radio"
[    1.000174] OF: Bad cell count for /palmbus@10000000/spi@b00/flash@0/partitions
[    1.042742] rt3050-esw 10110000.esw: mediatek esw at 0xb0110000, irq 25 initialized
[    1.051709] mtk_soc_eth 10100000.ethernet eth0: mediatek frame engine at 0xb0100000, irq 5
[    1.063512] NET: Registered PF_INET6 protocol family
[    1.076439] Segment Routing with IPv6
[    1.080339] In-situ OAM (IOAM) with IPv6
[    1.084587] NET: Registered PF_PACKET protocol family
[    1.089755] 8021q: 802.1Q VLAN Support v1.8
[    1.137228] clk: Disabling unused clocks
[    1.156273] VFS: Mounted root (squashfs filesystem) readonly on device 31:4.
[    1.170411] Freeing unused kernel image (initmem) memory: 1232K
[    1.176466] This architecture does not have kernel memory protection.
[    1.183012] Run /sbin/init as init process
[    4.889028] init: Console is alive
[    4.893066] init: - watchdog -
[    5.136324] rt3050-esw 10110000.esw: port 4 link up
[    7.540549] kmodloader: loading kernel modules from /etc/modules-boot.d/*
[    8.248757] gpio_button_hotplug: loading out-of-tree module taints kernel.
[    8.271962] kmodloader: done loading kernel modules from /etc/modules-boot.d/*
[    8.290224] init: - preinit -
[   15.823960] random: crng init done
[   18.509070] rt3050-esw 10110000.esw: port 4 link down
Press the [f] key and hit [enter] to enter failsafe mode
Press the [1], [2], [3] or [4] key and hit [enter] to select the debug level
[   22.534413] rt3050-esw 10110000.esw: port 4 link up
[   24.454551] jffs2: notice: (372) jffs2_build_xattr_subsystem: complete building xattr subsystem, 8 of xdatum (0 unchecked, 2 orphan) and 9 of xref (2 dead, 0 orphan) found.
[   24.472859] mount_root: switching to jffs2 overlay
[   24.480800] overlayfs: upper fs does not support tmpfile.
[   24.498514] urandom-seed: Seeding with /etc/urandom.seed
[   24.598872] procd: - early -
[   24.602175] procd: - watchdog -
[   25.950338] procd: - watchdog -
[   25.956116] procd: - ubus -
[   26.990163] procd: - init -
Please press Enter to activate this console.
[   32.186315] kmodloader: loading kernel modules from /etc/modules.d/*
[   34.569685] Loading modules backported from Linux version v6.12.61-0-gdcbeffaf66d0
[   34.577475] Backport generated by backports.git v6.1.110-1-35-g410656ef
[   35.178687] mt76_wmac 10300000.wmac: ASIC revision: 76280001
[   35.975934] mt76_wmac 10300000.wmac: Firmware Version: 20151201
[   35.981985] mt76_wmac 10300000.wmac: Build Time: 20151201183641
[   36.089407] urngd: v1.0.2 started.
[   36.093305] mt76_wmac 10300000.wmac: firmware init done
[   36.266628] mt76_wmac 10300000.wmac: registering led 'mt76-phy0'
[   36.712374] mt7615e 0000:01:00.0: card - bus=0x1, slot = 0x0 irq=4
[   36.994859] mt7615e 0000:01:00.0: registering led 'mt76-phy1'
[   37.084022] mt7615e 0000:01:00.0: HW/SW Version: 0x65326363, Build Time: 2005101654debug
[   37.084022] 
[   37.152035] mt7615e 0000:01:00.0: N9 Firmware Version: 7663mp1827, Build Time: 20200512032642
[   37.160813] mt7615e 0000:01:00.0: Region number: 0x4
[   37.165868] mt7615e 0000:01:00.0: Parsing tailer Region: 0
[   37.227517] mt7615e 0000:01:00.0: Region 0, override_addr = 0x00118000
[   37.234228] mt7615e 0000:01:00.0: Parsing tailer Region: 1
[   37.280075] mt7615e 0000:01:00.0: Parsing tailer Region: 2
[   37.297403] PPP generic driver version 2.4.2
[   37.325632] mt7615e 0000:01:00.0: Parsing tailer Region: 3
[   37.334383] mt7615e 0000:01:00.0: override_addr = 0x00118000, option = 3
[   37.345274] NET: Registered PF_PPPOX protocol family
[   37.414425] kmodloader: done loading kernel modules from /etc/modules.d/*
[   68.313141] rt3050-esw 10110000.esw: port 4 link down
[   72.387978] rt3050-esw 10110000.esw: port 4 link up
[   79.874744] br-lan: port 1(eth0.1) entered blocking state
[   79.880275] br-lan: port 1(eth0.1) entered disabled state
[   79.885896] eth0.1: entered allmulticast mode
[   79.890334] mtk_soc_eth 10100000.ethernet eth0: entered allmulticast mode
[   79.897659] eth0.1: entered promiscuous mode
[   79.902031] mtk_soc_eth 10100000.ethernet eth0: entered promiscuous mode
[   80.670949] br-lan: port 1(eth0.1) entered blocking state
[   80.676555] br-lan: port 1(eth0.1) entered forwarding state

This is what I've found so far:

  • Switch ports are all working and assigned correctly.
  • LED assignments are correct and working, with the exception being the WPS LED which this router doesn't have.
  • 2.4GHz WiFi works reliably.
  • 5GHz WiFi is very unreliable. I've managed to connect once and have never been able to since. That one time I was also immediately disconnected. Discovery is also very spotty - some devices can't find the network at all, some do only right after restarting the radio. Forcing a channel doesn't work either - the driver always defaults to channel 36. Switching between AC and N modes doesn't change anything.

These logs were created right after saving the WiFi configuration:

Wed Dec 17 23:19:18 2025 daemon.notice hostapd: Configuration file: Reading configuration file '<inline>'
Wed Dec 17 23:19:18 2025 kern.info kernel: [ 7783.974019] rt3050-esw 10110000.esw: port 4 link up
Wed Dec 17 23:19:19 2025 kern.info kernel: [ 7784.002552] br-lan: port 6(phy1-ap0) entered blocking state
Wed Dec 17 23:19:19 2025 kern.info kernel: [ 7784.008365] br-lan: port 6(phy1-ap0) entered disabled state
Wed Dec 17 23:19:19 2025 kern.info kernel: [ 7784.014116] mt7615e 0000:01:00.0 phy1-ap0: entered allmulticast mode
Wed Dec 17 23:19:19 2025 kern.info kernel: [ 7784.021281] mt7615e 0000:01:00.0 phy1-ap0: entered promiscuous mode
Wed Dec 17 23:19:19 2025 kern.info kernel: [ 7784.027939] br-lan: port 6(phy1-ap0) entered blocking state
Wed Dec 17 23:19:19 2025 kern.info kernel: [ 7784.033622] br-lan: port 6(phy1-ap0) entered forwarding state
Wed Dec 17 23:19:19 2025 kern.info kernel: [ 7784.040307] br-lan: port 1(eth0.1) entered blocking state
Wed Dec 17 23:19:19 2025 kern.info kernel: [ 7784.045904] br-lan: port 1(eth0.1) entered forwarding state
Wed Dec 17 23:19:19 2025 kern.info kernel: [ 7784.052280] br-lan: port 2(eth0.2) entered blocking state
Wed Dec 17 23:19:19 2025 kern.info kernel: [ 7784.057878] br-lan: port 2(eth0.2) entered forwarding state
Wed Dec 17 23:19:19 2025 kern.info kernel: [ 7784.064137] br-lan: port 3(eth0.3) entered blocking state
Wed Dec 17 23:19:19 2025 kern.info kernel: [ 7784.069664] br-lan: port 3(eth0.3) entered forwarding state
Wed Dec 17 23:19:19 2025 kern.info kernel: [ 7784.075884] br-lan: port 4(eth0.4) entered blocking state
Wed Dec 17 23:19:19 2025 kern.info kernel: [ 7784.081390] br-lan: port 4(eth0.4) entered forwarding state
Wed Dec 17 23:19:19 2025 daemon.notice netifd: Network device 'eth0' link is up
Wed Dec 17 23:19:19 2025 daemon.notice netifd: VLAN 'eth0.1' link is up
Wed Dec 17 23:19:19 2025 daemon.notice netifd: VLAN 'eth0.2' link is up
Wed Dec 17 23:19:19 2025 daemon.notice netifd: VLAN 'eth0.3' link is up
Wed Dec 17 23:19:19 2025 daemon.notice netifd: VLAN 'eth0.4' link is up
Wed Dec 17 23:19:19 2025 daemon.notice netifd: VLAN 'eth0.5' link is up
Wed Dec 17 23:19:19 2025 daemon.notice netifd: Interface 'WAN' has link connectivity
Wed Dec 17 23:19:19 2025 daemon.notice netifd: Interface 'WAN' is setting up now
Wed Dec 17 23:19:19 2025 daemon.notice hostapd: phy1-ap0: interface state UNINITIALIZED->COUNTRY_UPDATE
Wed Dec 17 23:19:19 2025 daemon.notice hostapd: ACS: Automatic channel selection started, this may take a bit
Wed Dec 17 23:19:19 2025 daemon.notice hostapd: phy1-ap0: interface state COUNTRY_UPDATE->ACS
Wed Dec 17 23:19:19 2025 daemon.notice hostapd: phy1-ap0: ACS-STARTED
Wed Dec 17 23:19:19 2025 kern.info kernel: [ 7784.252039] br-lan: port 6(phy1-ap0) entered disabled state
Wed Dec 17 23:19:19 2025 daemon.notice netifd: WAN (27617): udhcpc: started, v1.36.1
Wed Dec 17 23:19:19 2025 daemon.notice netifd: Wireless device 'radio1' is now up
Wed Dec 17 23:19:19 2025 daemon.warn odhcpd[1391]: No default route present, setting ra_lifetime to 0!
Wed Dec 17 23:19:19 2025 daemon.notice netifd: WAN (27617): udhcpc: broadcasting discover
Wed Dec 17 23:19:20 2025 daemon.info dnsmasq-dhcp[2159]: DHCPDISCOVER(br-lan) 192.168.1.154 REDACTED
Wed Dec 17 23:19:20 2025 daemon.info dnsmasq-dhcp[2159]: DHCPOFFER(br-lan) 192.168.1.154 REDACTED
Wed Dec 17 23:19:20 2025 daemon.info dnsmasq-dhcp[2159]: DHCPREQUEST(br-lan) 192.168.1.154 REDACTED
Wed Dec 17 23:19:20 2025 daemon.info dnsmasq-dhcp[2159]: DHCPACK(br-lan) 192.168.1.154 REDACTED
Wed Dec 17 23:19:22 2025 daemon.notice netifd: WAN (27617): udhcpc: broadcasting discover
Wed Dec 17 23:19:25 2025 daemon.notice netifd: WAN (27617): udhcpc: broadcasting discover
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5220 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5220 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5220 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5220 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5220 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5220 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5240 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5240 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5240 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5240 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5240 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5240 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5260 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5260 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5260 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5260 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5260 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5260 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5280 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5280 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5280 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5280 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5280 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5280 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5300 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5300 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5300 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5300 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5300 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5300 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5320 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5320 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5320 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5320 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5320 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5320 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5500 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5500 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5500 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5500 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5500 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5500 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5520 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5520 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5520 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5520 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5520 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5520 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5540 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5540 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5540 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5540 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5540 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5540 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5560 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5560 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5560 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5560 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5560 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5560 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5580 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5580 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5580 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5580 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5580 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5580 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5600 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5600 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5600 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5600 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5600 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5600 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5620 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5620 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5620 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5620 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5620 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5620 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5640 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5640 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5640 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5640 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5640 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5640 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5660 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5660 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5660 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5660 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5660 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5660 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5680 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5680 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5680 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5680 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5680 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5680 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5700 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5700 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5700 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5700 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5700 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5700 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5720 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5720 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5720 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5720 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5720 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5720 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5745 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5745 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5745 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5745 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5745 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5745 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5765 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5765 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5765 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5765 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5765 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5765 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5785 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5785 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5785 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5785 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5785 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5785 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5805 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5805 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5805 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5805 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5805 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5805 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5825 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5825 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5825 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5825 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5825 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5825 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5220 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5220 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5240 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5240 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5260 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5260 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5280 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5280 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5300 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5300 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5320 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5320 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5500 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5500 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5520 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5520 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5540 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5540 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5560 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5560 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5580 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5580 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5600 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5600 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5620 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5620 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5640 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5640 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5660 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5660 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5680 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5680 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5700 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5700 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5720 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5720 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5745 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5745 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5765 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5765 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5785 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5785 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5805 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5805 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5825 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: ACS: Survey for freq 5825 is missing noise floor
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: phy1-ap0: ACS-COMPLETED freq=5180 channel=36
Wed Dec 17 23:19:35 2025 kern.info kernel: [ 7800.632493] br-lan: port 6(phy1-ap0) entered blocking state
Wed Dec 17 23:19:35 2025 kern.info kernel: [ 7800.638271] br-lan: port 6(phy1-ap0) entered forwarding state
Wed Dec 17 23:19:35 2025 daemon.notice netifd: Network device 'phy1-ap0' link is up
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: phy1-ap0: interface state ACS->ENABLED
Wed Dec 17 23:19:35 2025 daemon.notice hostapd: phy1-ap0: AP-ENABLED

There is a known issue where the mt7603 and mt7615 drivers find an empty EEPROM and fallback to default values. While the patch for the driver to read the eeprom values from the DTS in in, no one seems to be able to have the courage to put raw calibration data in the DTS without company recommendation as to what the calibration data should be for all such devices ( I am not too sure if there are radios which share the same ID and have different calibration data ).

Here are the patches to the driver that get called only if the eeprom check returns empty from all quarters:

--- a/mt7603/eeprom.c	2026-02-09 22:59:01.901232328 +0530
+++ b/mt7603/eeprom.c	2026-02-10 00:59:27.115298099 +0530
@@ -169,6 +169,59 @@
memcpy(dev->mt76.eeprom.data, dev->mt76.otp.data,
MT7603_EEPROM_SIZE);
}
+

/* If EEPROM still invalid after OTP copy, use C20 v6.8 calibration */

if (mt7603_check_eeprom(&dev->mt76) != 0) {

  u8 *e = dev->mt76.eeprom.data;



  pr_info("mt7603: Invalid EEPROM after OTP, using C20 v6.8 calibration\n");



  /* First, wipe everything to 0xFF or 0x00 */

  memset(e, 0x00, MT7603_EEPROM_SIZE);



  /* Chip ID and header */

  e[0x00] = 0x28; e[0x01] = 0x76; e[0x02] = 0x00; e[0x03] = 0x02;

  e[0x24] = 0x20;



  /* TX power calibration (0x50-0x61) */

  e[0x53] = 0x94;

  e[0x54] = 0x40; e[0x55] = 0xb5; e[0x56] = 0xc0; e[0x57] = 0xca;

  e[0x58] = 0x22; e[0x59] = 0xc1; e[0x5a] = 0xc2; e[0x5b] = 0xc2;

  e[0x5c] = 0x40; e[0x5d] = 0xca; e[0x5e] = 0x22; e[0x5f] = 0xc1;

  e[0x60] = 0xc1; e[0x61] = 0xc1;



  /* Rate power offsets (0xA0-0xAD) */

  e[0xa0] = 0xc4; e[0xa1] = 0xc4; e[0xa2] = 0xc4; e[0xa3] = 0xc4;

  e[0xa4] = 0xc2; e[0xa5] = 0xc2; e[0xa6] = 0x00; e[0xa7] = 0xc4;

  e[0xa8] = 0x00; e[0xa9] = 0xc4; e[0xaa] = 0xc2; e[0xab] = 0xc2;

  e[0xac] = 0x82; e[0xad] = 0x82;



  /* Additional calibration (0xC8-0xD6) */

  e[0xc9] = 0x1a; e[0xca] = 0x22; e[0xcb] = 0x2a;

  e[0xcc] = 0x31; e[0xcd] = 0x35; e[0xce] = 0x01; e[0xcf] = 0x35;

  e[0xd0] = 0x39; e[0xd1] = 0x40; e[0xd2] = 0x46; e[0xd3] = 0x4d;

  e[0xd4] = 0x7f; e[0xd5] = 0x7f; e[0xd6] = 0x7f;



  /* More calibration (0xE0-0xEF) */

  e[0xe0] = 0x11; e[0xe1] = 0x1d; e[0xe2] = 0x11; e[0xe3] = 0x1d;

  e[0xe4] = 0x1c; e[0xe5] = 0x35; e[0xe6] = 0x1c; e[0xe7] = 0x35;

  e[0xe8] = 0x1e; e[0xe9] = 0x35; e[0xea] = 0x1e; e[0xeb] = 0x35;

  e[0xec] = 0x17; e[0xed] = 0x19; e[0xee] = 0x17; e[0xef] = 0x19;



  /* Config (0xF0-0xF8) */

  e[0xf0] = 0x02; e[0xf4] = 0xb9; e[0xf5] = 0x80;

  e[0xf6] = 0x9f; e[0xf7] = 0x88; e[0xf8] = 0x0a;



  /* Additional calibration (0x12F-0x13F) */

  e[0x12f] = 0x77;

  e[0x130] = 0x11; e[0x131] = 0x1d; e[0x132] = 0x11; e[0x133] = 0x1d;

  e[0x134] = 0x15; e[0x135] = 0x7f; e[0x136] = 0x15; e[0x137] = 0x7f;

  e[0x138] = 0x17; e[0x139] = 0x7f; e[0x13a] = 0x17; e[0x13b] = 0x7f;

  e[0x13c] = 0x10; e[0x13d] = 0x3b; e[0x13e] = 0x10; e[0x13f] = 0x3b;

} else {

  pr_info("mt7603: EEPROM chip ID valid: 0x%04x\n", 

  	get_unaligned_le16(dev->mt76.eeprom.data));

}

eeprom = (u8 *)dev->mt76.eeprom.data;
dev->mphy.cap.has_2ghz = true;
  • ======

    --- a/mt7615/eeprom.c
    +++ b/mt7615/eeprom.c
    @@ -347,6 +347,110 @@
    mt7615_cal_free_data(dev);
    }
    
    if (ret) {
    
      u8 *e = dev->mt76.eeprom.data;
    
      int g;
    
    
    
      pr_info("mt7615: Invalid EEPROM chip ID, patching for mt7663\n");
    
    
    
      /* ---- FIRST COPY (base 0x000) ---- */
    
    
    
      /* Chip ID: MT7663 */
    
      e[0x00] = 0x63; e[0x01] = 0x76;
    
    
    
      /* EEPROM version/subversion */
    
      e[0x02] = 0x00; e[0x03] = 0x02;
    
    
    
      /* NIC_CONF_0: internal PA, no external LNA */
    
      e[0x034] = 0x00; e[0x035] = 0x00;
    
    
    
      /* NIC_CONF_1: misc HW config, safe default */
    
      e[0x036] = 0x00; e[0x037] = 0x00;
    
    
    
      /* Country region for 5GHz: 0x00 = all channels */
    
      e[0x038] = 0x00;
    /* NIC_CONF_2: disable dynamic power saving, PSP, beacon early termination */
    
      e[0x042] = 0x00;
      e[0x442] = 0x00;
    
      /* WIFI_CONF: 2T2R 5GHz, TSSI disabled */
    
      e[0x03e] = 0x12;
    
      /* 5GHz sub-band target power: 0x3C = 60 half-dBm = 30 dBm */
    
      e[0x103] = 0x3c; e[0x104] = 0x3c; e[0x105] = 0x3c;
    
    
    
      /* BW40/BW80 TX power delta: no offset */
    
      e[0x089] = 0x00;
    
      e[0x08a] = 0x00;
    
    
    
      /* Per-rate power offsets: 0x00 = use base TX power for all rates */
    
      e[0x0b0] = 0x00; e[0x0b1] = 0x00; e[0x0b2] = 0x00; e[0x0b3] = 0x00;
    
      e[0x0b4] = 0x00; e[0x0b5] = 0x00; e[0x0b6] = 0x00; e[0x0b7] = 0x00;
    
    
    
      /* 5GHz TX power tables: 8 groups x 3 bytes, half-dBm
    
       * 0x3C = 60 half-dBm = 30 dBm */
    
      for (g = 0; g < 8; g++) {
    
      	/* Chain 0 */
    
      	e[0x245 + g * 3]     = 0x3c;
    
      	e[0x245 + g * 3 + 1] = 0x3c;
    
      	e[0x245 + g * 3 + 2] = 0x3c;
    
      	/* Chain 1 */
    
      	e[0x2b5 + g * 3]     = 0x3c;
    
      	e[0x2b5 + g * 3 + 1] = 0x3c;
    
      	e[0x2b5 + g * 3 + 2] = 0x3c;
    
      }
    
    
    
      /* ---- SECOND COPY (mirror at 0x400) ---- */
    
    
    
      e[0x400] = 0x63; e[0x401] = 0x76;
    
      e[0x402] = 0x00; e[0x403] = 0x02;
    
    
    
      e[0x434] = 0x00; e[0x435] = 0x00;
    
      e[0x436] = 0x00; e[0x437] = 0x00;
    
      e[0x438] = 0x00;
    
      e[0x43e] = 0x12;
    
    
    
      e[0x500] = 0x3c; e[0x501] = 0x3c;
    
      e[0x503] = 0x3c; e[0x504] = 0x3c; e[0x505] = 0x3c;
    
    
    
      e[0x489] = 0x00;
    
      e[0x48a] = 0x00;
    
    
    
      e[0x4b0] = 0x00; e[0x4b1] = 0x00; e[0x4b2] = 0x00; e[0x4b3] = 0x00;
    
      e[0x4b4] = 0x00; e[0x4b5] = 0x00; e[0x4b6] = 0x00; e[0x4b7] = 0x00;
    
    
    
      for (g = 0; g < 8; g++) {
    
      	/* Chain 0 */
    
      	e[0x645 + g * 3]     = 0x3c;
    
      	e[0x645 + g * 3 + 1] = 0x3c;
    
      	e[0x645 + g * 3 + 2] = 0x3c;
    
      	/* Chain 1 */
    
      	e[0x6b5 + g * 3]     = 0x3c;
    
      	e[0x6b5 + g * 3 + 1] = 0x3c;
    
      	e[0x6b5 + g * 3 + 2] = 0x3c;
    
      }
    
      /* Adjacent to HW_CONF1 β€” path/antenna config, safe zero default */
    
      e[0x1b5] = 0x00; e[0x1b6] = 0x00; e[0x1b7] = 0x00;
    
    
    
      /* Second region antenna config β€” safe zero default */
    
      e[0x3ac] = 0x00; e[0x3ad] = 0x00; e[0x3ae] = 0x00;
    
      e[0x3af] = 0x00; e[0x3b0] = 0x00; e[0x3b1] = 0x00;
    
      e[0x3b2] = 0x00;
    
    
    
      /* Mirror in second copy */
    
      e[0x5b5] = 0x00; e[0x5b6] = 0x00; e[0x5b7] = 0x00;
    
      e[0x7ac] = 0x00; e[0x7ad] = 0x00; e[0x7ae] = 0x00;
    
      e[0x7af] = 0x00; e[0x7b0] = 0x00; e[0x7b1] = 0x00;
    
      e[0x7b2] = 0x00;
    
    
    
    } else {
    
      pr_info("mt7615: EEPROM chip ID valid: 0x%04x\n",
    
      	get_unaligned_le16(dev->mt76.eeprom.data));
    
      dev->flash_eeprom = true;
    
      mt7615_cal_free_data(dev);
    
    }
    
    mt7615_eeprom_parse_hw_cap(dev);
    memcpy(dev->mphy.macaddr, dev->mt76.eeprom.data + MT_EE_MAC_ADDR,
    ETH_ALEN);
    
    
    • =====

      Warning do not use this patch as is, please try and get these values from an authority or a router where the eeprom check succeeds ( as in the values show up in the eeprom of a running router without this patch ) and get them into the DTS, the default driver will take the values from the DTS and these patches can be a fallback option ( it is inserted in the code and runs only if the eeprom check returned empty ).

      Further note the mt7603 patch above is actual values from another pre calibrated v6 ( so you may not require it ), it is only for some white 4-antenna 6.8s out there.

      The mt7615 patch which is relevant for the 5ghz mt7663 radio provided here just sets a few values as I don’t have another model where I can extract working calibration data. But it will surely get a better functioning 5ghz radio.

      Here are some models where it may be possible to extract the calibration EEPROM data from /dev/mtd:

      TP-Link Archer C6 v3.2
      TP-Link Archer A6 v3
      Xiaomi MiWiFi Range Extender AC1200 RC04

      Anyone who can dump this is most welcome.

Another thing to try is the AP firmware: mt7663-ap instead of STA

Sorry, in the interest of collaboration this is to report that the following simple settings ( setting ID and transmit power ) works better for the 5Ghz radio:

--- a/mt7615/eeprom.c
+++ b/mt7615/eeprom.c
@@ -347,6 +347,59 @@
mt7615_cal_free_data(dev);
}

  if (ret) {

      u8 *e = dev->mt76.eeprom.data;

      int g;



      pr_info("mt7615: Invalid EEPROM chip ID, patching for mt7663\n");



      /* Fix chip ID in both copies */

      e[0x00] = 0x63; e[0x01] = 0x76;

      e[0x400] = 0x63; e[0x401] = 0x76;



      e[0x103] = 0x18; e[0x104] = 0x18; e[0x105] = 0x18;



      /* Second copy */

      e[0x400] = 0x63; e[0x401] = 0x76;

      e[0x500] = 0x18; e[0x501] = 0x18;

      e[0x503] = 0x18; e[0x504] = 0x18; e[0x505] = 0x18;



      /* mt7663 5GHz TX power β€” 8 groups x 3 bytes, half-dBm units */

      /* 0x3c = 60 half-dBm = 30 dBm */

      for (g = 0; g < 8; g++) {

          /* First copy β€” Chain 0 */

          e[0x245 + g * 3]     = 0x3c;

          e[0x245 + g * 3 + 1] = 0x3c;

          e[0x245 + g * 3 + 2] = 0x3c;

          /* First copy β€” Chain 1 */

          e[0x2b5 + g * 3]     = 0x3c;

          e[0x2b5 + g * 3 + 1] = 0x3c;

          e[0x2b5 + g * 3 + 2] = 0x3c;

          /* Second copy β€” Chain 0 */

          e[0x645 + g * 3]     = 0x3c;

          e[0x645 + g * 3 + 1] = 0x3c;

          e[0x645 + g * 3 + 2] = 0x3c;

          /* Second copy β€” Chain 1 */

          e[0x6b5 + g * 3]     = 0x3c;

          e[0x6b5 + g * 3 + 1] = 0x3c;

          e[0x6b5 + g * 3 + 2] = 0x3c;

      }



      /* 5GHz rate power delta β€” no offset */

      e[0x089] = 0x00;

      e[0x489] = 0x00;



      /* HW_CONF1 β€” TX mask 2 chains for mt7663 */

      //e[0x1b0] = 0x02;

      //e[0x5b0] = 0x02;



  } else {

      pr_info("mt7615: EEPROM chip ID valid: 0x%04x\n",

          get_unaligned_le16(dev->mt76.eeprom.data));

      dev->flash_eeprom = true;

      mt7615_cal_free_data(dev);

  }

mt7615_eeprom_parse_hw_cap(dev);
memcpy(dev->mphy.macaddr, dev->mt76.eeprom.data + MT_EE_MAC_ADDR,
ETH_ALEN);

=====

Please remember to:

a) Set country in user mode
b) Change the transmit power in user mode to 24 dBm for channels above 100 ( Please see exact channel specifications )
c) Avoid channels < 100 and not 36,40,44,48 due to radar interference

in order to:

a) Stay in the legal limit for those channels
b) Other routers/devices are constantly playing a game of negotiation regarding channels and nation and transmit power, so the above should work for all negotiations without constantly renegotiating the settings ( and thus getting poor wifi ) on concerned router.

AP firmware is smaller and just as functional as STA firmware ( STA is slightly worse due to some low power considerations but mostly because of lack of calibration ), so AP firmware works to provide both AP and STA mode operation ( the only restriction is both 2.4ghz and 5 ghz operating with AP firmware can work in either AP or STA mode and you will have to physically stop the AP operation if you want to start the STA operation ), the 2.4ghz radio can run 2 ( perhaps more ) SSIDs in AP mode and the 5 Ghz radio can only run one SSID in AP mode.

You can use ZSTD compression on the blobs to save some precious hundreds of kilobytes.

Regards.