giorez
February 13, 2026, 8:28am
1
@maurer after the fresh flash the router is not detecting automatically the modem (in ECM mode). I partially solved the issue adding: Kernel Modules → USB Support → kmod-usb-net-cdc-ether + kmod-usb-net-cdc-subset during compilation. But the modem get online when you force the wan to use usb0. I suppose your porting for zbt 8102 ax v2 (nand variant) is not affected. Correct?
https://forum.openwrt.org/t/sysupgrade-zbt-z8102ax-emmc-not-working/245596/34?u=giorez
main ← giorez:zbt-z8102ax-v2-emmc
opened 07:56AM - 06 Apr 26 UTC
This PR adds support for the **eMMC variant** of the **ZBT Z8102AX V2** router, … which was previously only available with SPI-NAND storage.
**This PR supersedes #21995**
### Specifications
- SoC: MediaTek MT7981B
- RAM: 1024MiB DDR4
- Storage: eMMC (8GB, GPT layout defined by vendor bootloader)
- Network: 4x Gigabit LAN + 1x Gigabit WAN, MT7531 switch
- WiFi: MT7976CN (AX3000 2.4GHz + 5GHz dual-band)
- USB: 1x USB 3.0 port + 2x M.2 slots (5G modem support)
- Buttons: Reset, Mesh (WPS)
- Power: DC 12V 2 A
- UART: 115200n8 (VCC-RX-TX-GND layout)
The device uses standard OpenWrt squashfs with overlay filesystem for persistent storage.
### Installation
- Power down the router and hold the Reset button.
- While holding the button, power up the router.
- Keep holding the button for about 10 seconds until the LEDs change, then release.
- Connect your computer to a LAN port and navigate to 192.168.1.1 in a web browser.
- You should see the U-Boot Web Recovery GUI.
- Upload the OpenWrt sysupgrade file (squashfs-sysupgrade.bin) to flash the firmware.
Note: The Web Recovery GUI can also be used to unbrick the device if an incorrect firmware is flashed.
### Partition Layout
Partition | Size | Description
-----------|-----------|------------
factory | 512 KiB | WiFi calibration & MAC addresses
fip | 512 KiB | Firmware image payload (ATF)
kernel | 8 MiB | Linux kernel image
rootfs | remaining space | Root filesystem with overlay
### Block Device Mapping
/dev/ | Name | Sectors | Description
-------------|---------|---------|------------
mmcblk0 | | 7634944 | 8GB eMMC
mmcblk0p1 | gpt | 17 | GPT table
mmcblk0p2 | env | 512 | U-Boot environment
mmcblk0p3 | factory | 2048 | Factory data
mmcblk0p4 | fip | 2048 | Firmware payload
mmcblk0p5 | kernel | 32768 | Linux kernel
mmcblk0p6 | rootfs | 7298560 | Squashfs + Overlay
mmcblk0boot0 | | 4096 | eMMC boot partition 0
mmcblk0boot1 | | 4096 | eMMC boot partition 1
### Rootfs Filesystem
The rootfs uses **squashfs as a read-only base filesystem** with **automatic overlay mounting** for persistent configuration storage.
**Squashfs (Read-only):**
- Type: squashfs
- Mount point: /rom
- Contains: OpenWrt base system
**Overlay (Read-write):**
- Type: automatically created (ext4 or f2fs depending on configuration)
- Mount point: /overlay
- Stored in: Free space within rootfs partition
- Survives: Reboots, sysupgrade operations
**Persistent Data Locations:**
- /etc/config/* - Network and system configuration
- /etc/passwd* - User account information
- /root - Root home directory
- /var/* - Application state and logs
- Custom packages and modifications
### MAC Address Assignment
The device derives all MAC addresses from a single base address stored in the factory partition:
Interface | MAC Address | Offset
-------------|-------------------|-------
Base MAC | f8:5e:3c:66:af:c6 | +0
LAN Ports | f8:5e:3c:66:af:c6 | +0
WiFi 2.4GHz | f8:5e:3c:66:af:c6 | +0
WiFi 5GHz | f8:5e:3c:66:af:c7 | +1
WAN Port | f8:5e:3c:66:af:c8 | +2
### Implementation Details
**Device Tree**: mt7981b-zbtlink-zbt-z8102ax-v2-emmc.dts
- eMMC support with NVMEM layout for factory partition
- Rootdisk reference for libfstools overlay detection
- GPIO and LED configuration for all indicators
**Build Configuration**: target/linux/mediatek/image/filogic.mk
- Uses vendor GPT partition layout
- Kernel and rootfs sysupgrade support
- Factory image generation for initial flashing
### Testing Performed
- Device tree compilation and validation
- eMMC partition detection and mounting
- Overlay filesystem automatic creation and persistence
- WiFi calibration data loading from factory partition
- MAC address derivation and assignment
- Sysupgrade with configuration preservation
### Related Issues
This PR supersedes #21995.
Compared to #21995, this version aligns the ZBT-Z8102AX V2 eMMC flow with existing filogic eMMC devices by wiring board-specific eMMC paths in base-files (MAC derivation from the MMC factory partition, sysupgrade via emmc_do_upgrade, and U-Boot env on mmcblk0p2), and by adding the V2 eMMC profile so image metadata and runtime board handling are consistent.
### Notes for Reviewers
- The device follows the vendor GPT partition layout
- Overlay support is enabled through libfstools automatic detection via root=PARTLABEL=rootfs rootwait kernel parameter
- The device is backward compatible with existing OpenWrt infrastructure
- No additional kernel patches or out-of-tree drivers required
### Credits
Signed-off-by: giorez <nospam@rezzoli.com>
Co-authored-by: tokisaki <moebest@outlook.jp>
frollic
February 13, 2026, 8:32am
2
most standard images don't come with the packages required for any kind of LTE modem.
add usb0 to the wan firewall zone, do you have wired wan hooked up at the same time ?
giorez
February 13, 2026, 8:46am
3
could you guide to accomplish this tip? thanks in advance
frollic
February 13, 2026, 8:50am
4
don't have access to any openwrt device at the moment, in the modem interface you've set up, there's a list box with zone assignment, it should be wan.
AndrewZ
February 13, 2026, 9:21am
5
Please start from showing the output from cat /sys/kernel/debug/usb/devices
giorez
February 13, 2026, 11:15am
6
ciao @AndrewZ thanks for replying. here is the query output:
root@OpenWrt:~# ls /dev
bus loop2 mmcblk0p3 shm ttyUSB3
console loop3 mmcblk0p4 stderr ubi_ctrl
fd loop4 mmcblk0p5 stdin urandom
full loop5 mmcblk0p6 stdout watchdog
gpiochip0 loop6 mmcblk0rpmb tty watchdog0
hwrng loop7 null ttyS0 watchdog1
kmsg mmcblk0 port ttyS1 zero
log mmcblk0boot0 ppp ttyS2
loop-control mmcblk0boot1 ptmx ttyUSB0
loop0 mmcblk0p1 pts ttyUSB1
loop1 mmcblk0p2 random ttyUSB2
root@OpenWrt:~# cat /sys/kernel/debug/usb/devices
T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh= 1
B: Alloc= 0/800 us ( 0%), #Int= 0, #Iso= 0
D: Ver= 2.00 Cls=09(hub ) Sub=00 Prot=01 MxPS=64 #Cfgs= 1
P: Vendor=1d6b ProdID=0002 Rev= 6.12
S: Manufacturer=Linux 6.12.69 xhci-hcd
S: Product=xHCI Host Controller
S: SerialNumber=11200000.usb
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 4 Ivl=256ms
T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=480 MxCh= 4
D: Ver= 2.10 Cls=09(hub ) Sub=00 Prot=01 MxPS=64 #Cfgs= 1
P: Vendor=05e3 ProdID=0610 Rev= 6.63
S: Manufacturer=GenesysLogic
S: Product=USB2.1 Hub
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=100mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 1 Ivl=256ms
T: Bus=02 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=10000 MxCh= 1
B: Alloc= 0/800 us ( 0%), #Int= 0, #Iso= 0
D: Ver= 3.10 Cls=09(hub ) Sub=00 Prot=03 MxPS= 9 #Cfgs= 1
P: Vendor=1d6b ProdID=0003 Rev= 6.12
S: Manufacturer=Linux 6.12.69 xhci-hcd
S: Product=xHCI Host Controller
S: SerialNumber=11200000.usb
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 4 Ivl=256ms
T: Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=5000 MxCh= 4
D: Ver= 3.20 Cls=09(hub ) Sub=00 Prot=03 MxPS= 9 #Cfgs= 1
P: Vendor=05e3 ProdID=0626 Rev= 6.63
S: Manufacturer=GenesysLogic
S: Product=USB3.1 Hub
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=13(Int.) MxPS= 2 Ivl=16ms
T: Bus=02 Lev=02 Prnt=02 Port=01 Cnt=01 Dev#= 3 Spd=5000 MxCh= 0
D: Ver= 3.20 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 9 #Cfgs= 1
P: Vendor=2c7c ProdID=0122 Rev= 5.15
S: Manufacturer=Quectel
S: Product=RM551E-GL
S: SerialNumber=4ec33ae0
C:* #Ifs= 7 Cfg#= 1 Atr=a0 MxPwr=896mA
A: FirstIf#=10 IfCount= 2 Cls=02(comm.) Sub=06 Prot=00
I:* If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=30 Driver=option
E: Ad=01(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
E: Ad=81(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
I:* If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option
E: Ad=82(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
E: Ad=02(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
I:* If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option
E: Ad=84(I) Atr=03(Int.) MxPS= 10 Ivl=32ms
E: Ad=83(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
E: Ad=03(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
I:* If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option
E: Ad=86(I) Atr=03(Int.) MxPS= 10 Ivl=32ms
E: Ad=85(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
E: Ad=04(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
I:* If#= 5 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=42 Prot=01 Driver=(none)
E: Ad=05(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
E: Ad=87(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
I:* If#=10 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=06 Prot=00 Driver=cdc_ether
E: Ad=89(I) Atr=03(Int.) MxPS= 16 Ivl=32ms
I: If#=11 Alt= 0 #EPs= 0 Cls=0a(data ) Sub=00 Prot=00 Driver=cdc_ether
I:* If#=11 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=cdc_ether
E: Ad=88(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
E: Ad=06(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
root@OpenWrt:~#
AndrewZ
February 13, 2026, 11:23am
7
You need to follow https://openwrt.org/docs/guide-user/network/wan/wwan/ethernetoverusb_cdc
I suggest you search Quectel forum for information on IP passthrough configration with this modem.
Alternatively you can try switching the modem to MBIM or QMI and follow https://openwrt.org/docs/guide-user/network/wan/wwan/ltedongle
This may require updating your modem firmware.
giorez
February 14, 2026, 7:20am
8
hi @andrewz , i succesfully solved the issue. setting manually those commands. i wonder if same result can be achieved througt uci-defaults at first boot or hardcoded into firmware compilation. any tip for this?