OpenWRT SPI Flash Support for Orange Pi R1

I ported OpenWRT install on SPI flash on Orange Pi R1. Now it can boot from onboard SPI flash, the only thing does not work now is the WiFi.

https://github.com/lzto/openwrt/tree/orangepi-r1

Bootlog

[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 4.19.16 (lzto@objd) (gcc version 7.4.0 (OpenWrt GCC 7.4.0 r9060-4029788ff3)) #0 SMP PREEMPT Sun Jan 27 04:20:00 2019
[    0.000000] CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=30c5387d
[    0.000000] CPU: div instructions available: patching division code
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[    0.000000] OF: fdt: Machine model: Xunlong Orange Pi R1
[    0.000000] Memory policy: Data cache writealloc
[    0.000000] On node 0 totalpages: 65536
[    0.000000]   Normal zone: 512 pages used for memmap
[    0.000000]   Normal zone: 0 pages reserved
[    0.000000]   Normal zone: 65536 pages, LIFO batch:15
[    0.000000] psci: probing for conduit method from DT.
[    0.000000] psci: Using PSCI v0.1 Function IDs from DT
[    0.000000] random: get_random_bytes called from start_kernel+0x78/0x448 with crng_init=0
[    0.000000] percpu: Embedded 16 pages/cpu @(ptrval) s35084 r8192 d22260 u65536
[    0.000000] pcpu-alloc: s35084 r8192 d22260 u65536 alloc=16*4096
[    0.000000] pcpu-alloc: [0] 0 [0] 1 [0] 2 [0] 3 
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 65024
[    0.000000] Kernel command line: console=ttyS0,115200 earlyprintk panic=5 mtdparts=spi0.0:1M(uboot)ro,64k(dtb)ro,4M(kernel)ro,11200k(rootfs),15360k@0x100000(firmware) rootfstype=squashfs
[    0.000000] Dentry cache hash table entries: 32768 (order: 5, 131072 bytes)
[    0.000000] Inode-cache hash table entries: 16384 (order: 4, 65536 bytes)
[    0.000000] Memory: 248652K/262144K available (5913K kernel code, 373K rwdata, 1668K rodata, 2048K init, 246K bss, 13492K reserved, 0K cma-reserved, 0K highmem)
[    0.000000] Virtual kernel memory layout:
[    0.000000]     vector  : 0xffff0000 - 0xffff1000   (   4 kB)
[    0.000000]     fixmap  : 0xffc00000 - 0xfff00000   (3072 kB)
[    0.000000]     vmalloc : 0xd0800000 - 0xff800000   ( 752 MB)
[    0.000000]     lowmem  : 0xc0000000 - 0xd0000000   ( 256 MB)
[    0.000000]     pkmap   : 0xbfe00000 - 0xc0000000   (   2 MB)
[    0.000000]     modules : 0xbf000000 - 0xbfe00000   (  14 MB)
[    0.000000]       .text : 0x(ptrval) - 0x(ptrval)   (7930 kB)
[    0.000000]       .init : 0x(ptrval) - 0x(ptrval)   (2048 kB)
[    0.000000]       .data : 0x(ptrval) - 0x(ptrval)   ( 374 kB)
[    0.000000]        .bss : 0x(ptrval) - 0x(ptrval)   ( 247 kB)
[    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
[    0.000000] rcu: Preemptible hierarchical RCU implementation.
[    0.000000] rcu: 	RCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=4.
[    0.000000] 	Tasks RCU enabled.
[    0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=4
[    0.000000] NR_IRQS: 16, nr_irqs: 16, preallocated irqs: 16
[    0.000000] GIC: Using split EOI/Deactivate mode
[    0.000000] clocksource: timer: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 79635851949 ns
[    0.000000] arch_timer: cp15 timer(s) running at 24.00MHz (phys).
[    0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x588fe9dc0, max_idle_ns: 440795202592 ns
[    0.000006] sched_clock: 56 bits at 24MHz, resolution 41ns, wraps every 4398046511097ns
[    0.000017] Switching to timer-based delay loop, resolution 41ns
[    0.000143] Console: colour dummy device 80x30
[    0.000182] Calibrating delay loop (skipped), value calculated using timer frequency.. 48.00 BogoMIPS (lpj=240000)
[    0.000196] pid_max: default: 32768 minimum: 301
[    0.000322] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
[    0.000334] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
[    0.000829] CPU: Testing write buffer coherency: ok
[    0.001173] /cpus/cpu@0 missing clock-frequency property
[    0.001195] /cpus/cpu@1 missing clock-frequency property
[    0.001213] /cpus/cpu@2 missing clock-frequency property
[    0.001232] /cpus/cpu@3 missing clock-frequency property
[    0.001244] CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
[    0.060061] Setting up static identity map for 0x40200000 - 0x40200060
[    0.080055] rcu: Hierarchical SRCU implementation.
[    0.120115] smp: Bringing up secondary CPUs ...
[    0.210514] CPU1: thread -1, cpu 1, socket 0, mpidr 80000001
[    0.300650] CPU2: thread -1, cpu 2, socket 0, mpidr 80000002
[    0.390794] CPU3: thread -1, cpu 3, socket 0, mpidr 80000003
[    0.390875] smp: Brought up 1 node, 4 CPUs
[    0.390896] SMP: Total of 4 processors activated (192.00 BogoMIPS).
[    0.390903] CPU: All CPU(s) started in HYP mode.
[    0.390908] CPU: Virtualization extensions available.
[    0.395240] VFP support v0.3: implementor 41 architecture 2 part 30 variant 7 rev 5
[    0.395804] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[    0.395827] futex hash table entries: 1024 (order: 4, 65536 bytes)
[    0.396176] pinctrl core: initialized pinctrl subsystem
[    0.397396] NET: Registered protocol family 16
[    0.397703] DMA: preallocated 256 KiB pool for atomic coherent allocations
[    0.399292] No ATAGs?
[    0.433037] SCSI subsystem initialized
[    0.433122] libata version 3.00 loaded.
[    0.433343] usbcore: registered new interface driver usbfs
[    0.433393] usbcore: registered new interface driver hub
[    0.433489] usbcore: registered new device driver usb
[    0.433613] pps_core: LinuxPPS API ver. 1 registered
[    0.433624] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti 
[    0.433664] PTP clock support registered
[    0.433993] Advanced Linux Sound Architecture Driver Initialized.
[    0.435327] clocksource: Switched to clocksource arch_sys_counter
[    0.441116] NET: Registered protocol family 2
[    0.441691] tcp_listen_portaddr_hash hash table entries: 512 (order: 0, 6144 bytes)
[    0.441718] TCP established hash table entries: 2048 (order: 1, 8192 bytes)
[    0.441748] TCP bind hash table entries: 2048 (order: 2, 16384 bytes)
[    0.441784] TCP: Hash tables configured (established 2048 bind 2048)
[    0.441879] UDP hash table entries: 256 (order: 1, 8192 bytes)
[    0.441918] UDP-Lite hash table entries: 256 (order: 1, 8192 bytes)
[    0.442092] NET: Registered protocol family 1
[    0.442547] kvm [1]: 8-bit VMID
[    0.442970] kvm [1]: vgic interrupt IRQ16
[    0.443065] kvm [1]: Hyp mode initialized successfully
[    0.444225] No memory allocated for crashlog
[    0.444390] workingset: timestamp_bits=30 max_order=16 bucket_order=0
[    0.448926] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[    0.449100] jffs2: version 2.2 (NAND) (SUMMARY) (LZMA) (RTIME) (CMODE_PRIORITY) (c) 2001-2006 Red Hat, Inc.
[    0.451864] io scheduler noop registered
[    0.451882] io scheduler deadline registered
[    0.452056] io scheduler cfq registered (default)
[    0.452971] sun4i-usb-phy 1c19400.phy: Couldn't request ID GPIO
[    0.456732] sun8i-h3-pinctrl 1c20800.pinctrl: initialized sunXi PIO driver
[    0.458261] sun8i-h3-r-pinctrl 1f02c00.pinctrl: initialized sunXi PIO driver
[    0.497302] Serial: 8250/16550 driver, 8 ports, IRQ sharing disabled
[    0.499430] console [ttyS0] disabled
[    0.519653] 1c28000.serial: ttyS0 at MMIO 0x1c28000 (irq = 36, base_baud = 1500000) is a U6_16550A
[    1.132866] console [ttyS0] enabled
[    1.141212] loop: module loaded
[    1.146543] m25p80 spi0.0: mx25l12805d (16384 Kbytes)
[    1.151622] 5 cmdlinepart partitions found on MTD device spi0.0
[    1.157554] Creating 5 MTD partitions on "spi0.0":
[    1.162348] 0x000000000000-0x000000100000 : "uboot"
[    1.167981] 0x000000100000-0x000000110000 : "dtb"
[    1.173297] 0x000000110000-0x000000510000 : "kernel"
[    1.178902] 0x000000510000-0x000001000000 : "rootfs"
[    1.184484] mtd: device 3 (rootfs) set to be root filesystem
[    1.190332] 1 squashfs-split partitions found on MTD device rootfs
[    1.196532] 0x0000008a0000-0x000001000000 : "rootfs_data"
[    1.202605] 0x000000100000-0x000001000000 : "firmware"
[    1.209138] libphy: Fixed MDIO Bus: probed
[    1.213624] dwmac-sun8i 1c30000.ethernet: PTP uses main clock
[    1.219427] dwmac-sun8i 1c30000.ethernet: No regulator found
[    1.225380] dwmac-sun8i 1c30000.ethernet: Current syscon value is not the default 148000 (expect 58000)
[    1.234779] dwmac-sun8i 1c30000.ethernet: No HW DMA feature register supported
[    1.242017] dwmac-sun8i 1c30000.ethernet: RX Checksum Offload Engine supported
[    1.249247] dwmac-sun8i 1c30000.ethernet: COE Type 2
[    1.254206] dwmac-sun8i 1c30000.ethernet: TX Checksum insertion supported
[    1.260998] dwmac-sun8i 1c30000.ethernet: Normal descriptors
[    1.266663] dwmac-sun8i 1c30000.ethernet: Chain mode enabled
[    1.272468] libphy: stmmac: probed
[    1.276432] dwmac-sun8i 1c30000.ethernet: Found internal PHY node
[    1.282633] libphy: mdio_mux: probed
[    1.286247] dwmac-sun8i 1c30000.ethernet: Switch mux to internal PHY
[    1.292597] dwmac-sun8i 1c30000.ethernet: Powering internal PHY
[    1.299256] libphy: mdio_mux: probed
[    1.303501] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    1.310051] ehci-platform: EHCI generic platform driver
[    1.315461] ehci-platform 1c1a000.usb: EHCI Host Controller
[    1.321050] ehci-platform 1c1a000.usb: new USB bus registered, assigned bus number 1
[    1.328932] ehci-platform 1c1a000.usb: irq 27, io mem 0x01c1a000
[    1.355344] ehci-platform 1c1a000.usb: USB 2.0 started, EHCI 1.00
[    1.361605] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 4.19
[    1.369879] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    1.377103] usb usb1: Product: EHCI Host Controller
[    1.381975] usb usb1: Manufacturer: Linux 4.19.16 ehci_hcd
[    1.387464] usb usb1: SerialNumber: 1c1a000.usb
[    1.392393] hub 1-0:1.0: USB hub found
[    1.396198] hub 1-0:1.0: 1 port detected
[    1.400745] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[    1.406959] ohci-platform: OHCI generic platform driver
[    1.412334] ohci-platform 1c1a400.usb: Generic Platform OHCI controller
[    1.418984] ohci-platform 1c1a400.usb: new USB bus registered, assigned bus number 2
[    1.426842] ohci-platform 1c1a400.usb: irq 28, io mem 0x01c1a400
[    1.499490] usb usb2: New USB device found, idVendor=1d6b, idProduct=0001, bcdDevice= 4.19
[    1.510130] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    1.517358] usb usb2: Product: Generic Platform OHCI controller
[    1.523272] usb usb2: Manufacturer: Linux 4.19.16 ohci_hcd
[    1.528764] usb usb2: SerialNumber: 1c1a400.usb
[    1.533660] hub 2-0:1.0: USB hub found
[    1.537456] hub 2-0:1.0: 1 port detected
[    1.541907] usbcore: registered new interface driver usb-storage
[    1.548160] mousedev: PS/2 mouse device common for all mice
[    1.554113] i2c /dev entries driver
[    1.558319] sunxi-wdt 1c20ca0.watchdog: Watchdog enabled (timeout=16 sec, nowayout=0)
[    1.567456] sunxi-mmc 1c0f000.mmc: Linked as a consumer to regulator.2
[    1.574370] sunxi-mmc 1c0f000.mmc: Got CD GPIO
[    1.604147] sunxi-mmc 1c0f000.mmc: initialized, max. request size: 16384 KB
[    1.611499] sunxi-mmc 1c10000.mmc: Linked as a consumer to regulator.2
[    1.618424] sunxi-mmc 1c10000.mmc: allocated mmc-pwrseq
[    1.867915] sunxi-mmc 1c10000.mmc: initialized, max. request size: 16384 KB
[    1.877107] NET: Registered protocol family 10
[    1.882869] Segment Routing with IPv6
[    1.886665] NET: Registered protocol family 17
[    1.891170] can: controller area network core (rev 20170425 abi 9)
[    1.897474] NET: Registered protocol family 29
[    1.901939] 8021q: 802.1Q VLAN Support v1.8
[    1.906264] Registering SWP/SWPB emulation handler
[    1.920813] sun4i-usb-phy 1c19400.phy: Linked as a consumer to regulator.4
[    1.928614] ehci-platform 1c1b000.usb: EHCI Host Controller
[    1.934209] ehci-platform 1c1b000.usb: new USB bus registered, assigned bus number 3
[    1.942142] ehci-platform 1c1b000.usb: irq 29, io mem 0x01c1b000
[    1.950007] mmc1: new high speed SDIO card at address 0001
[    1.975346] ehci-platform 1c1b000.usb: USB 2.0 started, EHCI 1.00
[    1.981626] usb usb3: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 4.19
[    1.989905] usb usb3: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    1.997132] usb usb3: Product: EHCI Host Controller
[    2.002005] usb usb3: Manufacturer: Linux 4.19.16 ehci_hcd
[    2.007500] usb usb3: SerialNumber: 1c1b000.usb
[    2.012423] hub 3-0:1.0: USB hub found
[    2.016228] hub 3-0:1.0: 1 port detected
[    2.020678] cpu cpu0: Linked as a consumer to regulator.5
[    2.026140] cpu cpu0: Dropping the link to regulator.5
[    2.031426] cpu cpu0: Linked as a consumer to regulator.5
[    2.037732] hctosys: unable to open rtc device (rtc0)
[    2.043271] vcc3v0: disabling
[    2.046268] vcc5v0: disabling
[    2.049240] ALSA device list:
[    2.052202]   No soundcards found.
[    2.058282] random: fast init done
[    2.064342] VFS: Mounted root (squashfs filesystem) readonly on device 31:3.
[    2.073532] Freeing unused kernel memory: 2048K
[    2.078248] Run /sbin/init as init process
[    2.193566] random: crng init done
[    2.385410] usb 3-1: new high-speed USB device number 2 using ehci-platform
[    2.530358] init: Console is alive
[    2.533962] init: - watchdog -
[    2.587761] usb 3-1: New USB device found, idVendor=0bda, idProduct=8152, bcdDevice=20.00
[    2.596009] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[    2.603253] usb 3-1: Product: USB 10/100 LAN
[    2.607542] usb 3-1: Manufacturer: Realtek
[    2.611639] usb 3-1: SerialNumber: C0742BFFF82C
[    3.171703] kmodloader: loading kernel modules from /etc/modules-boot.d/*
[    3.213332] Loading modules backported from Linux version v4.19.7-0-g61c68f2a2af0
[    3.220857] Backport generated by backports.git v4.19.7-1-0-g148b072d
[    3.373749] bFWReady == _FALSE call reset 8051...
[    3.403515] kmodloader: done loading kernel modules from /etc/modules-boot.d/*
[    3.413599] init: - preinit -
[    4.168559] Generic PHY 0.1:01: attached PHY driver [Generic PHY] (mii_bus:phy_addr=0.1:01, irq=POLL)
[    4.179293] dwmac-sun8i 1c30000.ethernet eth0: No Safety Features support found
[    4.186632] dwmac-sun8i 1c30000.ethernet eth0: No MAC Management Counters available
[    4.194282] dwmac-sun8i 1c30000.ethernet eth0: PTP not supported by HW
[    4.202101] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
[    7.295969] dwmac-sun8i 1c30000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx
[    7.304554] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[    7.393338] jffs2: notice: (1370) jffs2_build_xattr_subsystem: complete building xattr subsystem, 8 of xdatum (0 unchecked, 6 orphan) and 33 of xref (4 dead, 10 orphan) found.
[    7.411769] mount_root: switching to jffs2 overlay
[    7.439940] overlayfs: upper fs does not support tmpfile.
[    7.456789] urandom-seed: Seeding with /etc/urandom.seed
[    7.571440] procd: - early -
[    7.574390] procd: - watchdog -
[    8.347571] procd: - watchdog -
[    8.350947] procd: - ubus -
[    8.440139] procd: - init -
[    8.626865] kmodloader: loading kernel modules from /etc/modules.d/*
[    8.636569] zram: Added device: zram0
[    8.682050] u32 classifier
[    8.684778]     input device check on
[    8.688578]     Actions configured
[    8.693677] Mirror/redirect action on
[    8.729218] usbcore: registered new interface driver r8152
[    8.742383] wireguard: WireGuard 0.0.20190123 loaded. See www.wireguard.com for information.
[    8.751068] wireguard: Copyright (C) 2015-2019 Jason A. Donenfeld . All Rights Reserved.
[    8.790458] xt_time: kernel timezone is -0000
[    8.801674] PPP generic driver version 2.4.2
[    8.808268] NET: Registered protocol family 24
[    8.815633] kmodloader: done loading kernel modules from /etc/modules.d/*
[    8.895436] usb 3-1: reset high-speed USB device number 2 using ehci-platform
[    9.177365] r8152 3-1:1.0 eth1: v1.09.9
[   12.639064] Generic PHY 0.1:01: attached PHY driver [Generic PHY] (mii_bus:phy_addr=0.1:01, irq=POLL)
[   12.650680] dwmac-sun8i 1c30000.ethernet eth0: No Safety Features support found
[   12.658459] dwmac-sun8i 1c30000.ethernet eth0: No MAC Management Counters available
[   12.666464] dwmac-sun8i 1c30000.ethernet eth0: PTP not supported by HW
[   12.674689] br-lan: port 1(eth0) entered blocking state
[   12.680178] br-lan: port 1(eth0) entered disabled state
[   12.686276] device eth0 entered promiscuous mode
[   12.693628] IPv6: ADDRCONF(NETDEV_UP): br-lan: link is not ready
[   12.753102] IPv6: ADDRCONF(NETDEV_UP): eth1: link is not ready
[   15.765948] dwmac-sun8i 1c30000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx
[   15.774518] br-lan: port 1(eth0) entered blocking state
[   15.779775] br-lan: port 1(eth0) entered forwarding state
[   15.785772] IPv6: ADDRCONF(NETDEV_CHANGE): br-lan: link becomes ready
[   35.525813] dwmac-sun8i 1c30000.ethernet eth0: Link is Down
[   35.533590] br-lan: port 1(eth0) entered disabled state
[   37.605926] dwmac-sun8i 1c30000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx
[   37.614503] br-lan: port 1(eth0) entered blocking state
[   37.619757] br-lan: port 1(eth0) entered forwarding state

DD-WRT users, you might be a victim of open source firmware

Ha! What a title, I am just trying to make a click-bait style title.

DD-WRT is a great piece of firmware for various of router/AP. I’ve been using it for years and I am happy with it. It has lots of powerful features integrated, which is great. However, after helping several friends to revive their bricked router for flashing buggy DD-WRT versions and bricking several routers of mine which is unable to bring them back I start to give it a second thought. There are several things come to my mind.

Code quality: You have been warned, there is no warranty and you are at your own risk. The firmware(likely trunk, or nightly built) from the FTP(ftp://ftp.dd-wrt.com/betas/)(even stable version?) is not well tested and is very likely to have bugs that might either makes at least one part of the router not functioning right(wireless speed stuck at some low speed for example), or even soft-brick your router(software issue) for flashing a oversized firmware(firmware size too big for example for recent TEW-811DRU, http://svn.dd-wrt.com/ticket/6144#) or even hard-brick(circuit is blown up) by changing a wireless setting, you are at your own risk flashing such firmware. You might think well why not flash a stable firmware, and you will find out how old the stable firmware is and there are potential or known vulnerabilities in the firmware because DD-WRT is built upon open source software such as dnsmasq, radvd, iw etc, you just can not control the code quality of other open source software. And often router/AP is not easy to de-brick without opening the case(void warranty) and a set of handy equipment(solder iron, hot air gun, flash chip clip etc. and software & skill of course), 8 Pin SOP SPI flash chip is easy to deal with but TSOP-48 like parallel flash chips are much harder. You can also use JTAG to de-brick, and that requires more advanced skills from the end user. So, compared to normal computer(PC, Mac etc), embedded device like routers are much harder to make it friendly to open source software user, because that is something not like your PC, you just don’t have the right tool to de-brick your device, which means you have to throw away your device if it is bricked and this is VERY frustrating.

The Design of DD-WRT Interface: I like the interface of DD-WRT honestly speaking. It often loads faster and offers more intuitive information than the original firmware. But there are several design flaws which will lead to disaster consequence for “normal” user, for example no firmware checking before flashing, (no checksum). Once upon a time, I uploaded a firmware which belongs to another model to a router, and it just flashed the firmware without warning, and the router was bricked definitely. Luckily the u-boot is not broken and I was able to connect a serial port to re-flash it with the correct firmware. Configuring wireless will often lead to the unexpected result! For example, you can not use WEP encryption to get maximum throughput, and the 20/40/80Mhz frequency setting which directly associated with connection speed is not hinted to the user. Of course, if you know these details, you can definitely do it right.

Think about how you use the router or AP, do you still use it as a router or AP after flashing DD-WRT or does it offer more functions than the original firmware? To me, there are functions like ipv6, dnsmasq and easy configuration as an AP, that is not supported by original firmware, which I found very useful, and DD-WRT definitely has a reason to stay. Also, there are security/privacy concerns that OEM firmware might have a backdoor(D-LINK Backdoor, rumored Chinese router vendors like XiaoMi and Feixun etc. intercepting and uploading user credentials to a remote server for example). But if you don’t use those functions, or don’t care security/privacy why bother?

Some of the devices I’ve played with DD-WRT on.

Happy DD-WRT

WZR-1750DHP
Buffalo WZR-1750DHP

MW150R, same as TL-WR741Nv1
MW150R, rebranded as TL-WR741Nv1

linksys-wrt-54gl
linksys-wrt-54gl

TEW-811DRU
TEW-811DRU

tl-wr706n
TP-LINK tl-wr706n

Sad DD-WRT

DIR-605
D-Link DIR-605, TSOP-48 flash, bricked, orange led then blue WPS led

wzr-hp-g300nh2
Buffalo, WZR-HP-G300NH2, SOP-8 SPI flash, bricked, no lights at all