Meraki MX64 and MX64W
A Cisco cloud based firewall with 250 Mbps throughput1), small form factor fanless design with aluminium case. There are two variants of this device, the MX64 and MX64W, the latter of which features two unsupported Broadcom wireless BCM43520KMLG chips but otherwise exactly the same hardware. As a result the MX64W can only be supported to the same extent as the MX64.
The MX64 features a dual-core Broadcom BCM58525 first announced in mid-20132)3) but early MX64 devices use an A0 variant of the BCM58625 SoC, which does not feature coherency capability and a different secondary cpu boot reg. While both the older and newer devices are supported, the user must check which device they have and use a corresponding image.
Timeline
| First Announced | Feb 5, 20154) |
| End-of-Sales Announcement | Jan 26, 2022 |
| End-of-Sales Date | July 26, 2022 |
| End-of-Support Date | July 26, 2027 |
OpenWrt support
Merged. ?p=openwrt/openwrt.git;a=commit;h=7ad9988287965be2119df320cfc645b0a8b9d94e
Two versions of squashfs sysupgrade Firmware.
A0 Variant A0 Variant
Release Variant Release
Supporting activities
Describe if there are any ongoing activities that might lead to OpenWrt support.
- OpenWrt forum thread: https://forum.openwrt.org/t/cisco-meraki-mx65-image-support/41168?u=tmomas
- Pull request: https://github.com/openwrt/openwrt/pull/3996
- Merged Pull: https://github.com/openwrt/openwrt/pull/16634
Supported Versions
Wireless
Wireless is not supported.
Hardware highlights
| CPU | CPU MHz | Ram | Flash | Network | WLAN | USB | Serial | JTag |
|---|---|---|---|---|---|---|---|---|
| Broadcom BCM58625BBOKF12G StrataGX™ | 1200 | 2 GB | 1 GB | 5x 10/100/1000 | None | 1x 2.0 | Yes | ? |
Hardware
Info
| Architecture | Arm cortex a9 |
|---|---|
| Vendor | Cisco Meraki |
| Bootloader | U-Boot |
| System-On-Chip | Broadcom StrataGX™ Communications Processor |
| CPU/Speed | 1.2 GHz |
| Flash-Chip | Micron MT29F8G08ABACA |
| Flash size | 1 GB |
| RAM | 2 GB (4 x 4Gb H5TC4G83CFR) |
| Wireless | N/A |
| Ethernet | 5x 10/100/1000 Mbit/s |
| Switch | 1x BCM58625 (5 Ports) |
| USB | 1x 2.0 |
| Serial | YES - on board header |
| JTAG | Yes - not populated |
LEDs
The front light is lit by three discrete LEDs, depending on device status.
| LED | Color | Notes |
|---|---|---|
| LED1 | White | Flashes when entering diagnostic mode. (stock firmware) Solid when booted and connected to the cloud. (stock firmware) Flashes when entering USB boot. (clayface U-Boot) |
| LED2 | Orange | Lights up at boot. |
| LED3 | RGB | Solid green once successfully booted. (OpenWrt) Rainbow when booted and attempting to reach the cloud. (stock firmware) Red when booted and failed to reach the cloud. (stock firmware) |
Buttons
The Meraki MX64/MX64W has the following buttons:
| BUTTON | Event |
|---|---|
| Reset | reset |
Flash Layout
| # cat /proc/mtd | |||
|---|---|---|---|
| dev: | size | erasesize | name |
| mtd0: | 00100000 | 00040000 | “boot” |
| mtd1: | 00080000 | 00040000 | “shmoo” |
| mtd2: | 00300000 | 00040000 | “bootkernel1” |
| mtd3: | 00100000 | 00040000 | “nvram” |
| mtd4: | 00300000 | 00040000 | “bootkernel2” |
| mtd5: | 3f700000 | 00040000 | “ubi” |
| mtd6: | 40000000 | 00040000 | “all” |
Note: This depends on the Unit Itself.
Switched Ethernet layout:
eth0-> wan1
lan2
lan3
lan4
lan5
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host proto kernel_lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether brd ff:ff:ff:ff:ff:ff
valid_lft forever preferred_lft forever
3: lan1@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-lan state UP group default qlen 1000
link/ether brd ff:ff:ff:ff:ff:ff
4: lan2@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-lan state UP group default qlen 1000
link/ether brd ff:ff:ff:ff:ff:ff
5: lan3@eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether brd ff:ff:ff:ff:ff:ff
6: lan4@eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN group default qlen 1000
link/ether brd ff:ff:ff:ff:ff:ff
7: wan@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether brd ff:ff:ff:ff:ff:ff
8: br-lan: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether brd ff:ff:ff:ff:ff:ff
inet 192.168.1.1/24 brd 192.168.0.255 scope global br-lan
valid_lft forever preferred_lft forever
inet6 scope global noprefixroute
valid_lft forever preferred_lft forever
inet6 scope link proto kernel_ll
valid_lft forever preferred_lft forever
Instructions
Preparation and Setup
- Prepare a USB disk with the DOS partitioning scheme and a 128MB FAT16 partition. On Windows, choose the FAT file system.
- If one USB disk doesn't work, try a different one, and/or a FAT32 partition.
- Compile or obtain OpenWrt files for the MX64, including
u-boot,initramfsandsysupgradeimages, and copy them to the USB disk.- For precompiled files, see Installation Files.
- Plug the USB disk into the device.
- On the device, boot into diagnostic mode by holding reset when powering on the device. The front light will turn orange.
Continue to hold reset until it starts blink-blink'ing white.- On used units, the white flash may be difficult or even impossible to see without first opening up the device.
If no white flash is visible, skip confirming it visually and simply hold reset for ~15 seconds when booting. - An ethernet cable can be plugged into any LAN port before powering the device on.
- Release the reset button, and wait another ~15 seconds for the light to turn off, then turn green.
If it goes rainbow instead, unplug the device and try again.- If an ethernet cable has already been plugged in, its LAN port should now light up.
Otherwise, plug an ethernet cable into a LAN port.
- On another device, set the client IP to
192.168.1.2, and telnet to192.168.1.1.- Instead of telnet, the serial connection may be used.
- Note: If connecting by serial, certain USB serial adapters may prevent the device from booting. If that happens, connect to device TXD after the front light starts blinking white.
- Continue to U-Boot Installation
- Using a USB disk can be skipped in the next (u-boot install) section by instead running a webserver on the client device, e.g.
python -m http.server, and then runningwgetfor theuboot_mx64andsha512sumfiles in a shell on the device. - A USB disk will be required to boot an initramfs image.
U-Boot installation
1. Newer fw versions require extra steps to support OpenWrt. To check,
please connect via telnet and run:
cat /sys/block/mtdblock0/ro
If the result is 1, your mtd0 is locked will need to perform extra
steps 4 and 5 in this section. If the result is 0 then skip these.
2. Check which SoC is in use by running the following command:
devmem 0x18000000
If devmem is not found then try:
devmem2 0x18000000
If the output begins with anything between 0x3F00-0x3F03 you will
need to use the A0 release. For any other output, eg 0x3F04 or
higher, use the regular MX64 image.
3 Confirm the size of the device's boot(mtd0) partition. In most
cases it should be 0x100000 or larger. If this is the case, please
proceed to use the uboot_mx64 image. If the reported size is
0x80000, please use the uboot_mx64_small image, then follow the
later guide to change to the larger image.
cat /proc/mtd
Example output:
# cat /proc/mtd cat /proc/mtd dev: size erasesize name mtd0: 00100000 00040000 "boot" mtd1: 00080000 00040000 "shmoo" mtd2: 00300000 00040000 "bootkernel1" mtd3: 00100000 00040000 "nvram" mtd4: 00300000 00040000 "bootkernel2" mtd5: 3f700000 00040000 "ubi" mtd6: 40000000 00040000 "all"
4. Set up a webserver to serve the appropriate uboot_mx64 from the following location and verify the SHA512: https://github.com/clayface/U-boot-MX64-20190430_MX64
5. (Only if mtd0 is locked) You will also need the mtd-rw.ko kernel
module to unlock the partition from the same repo. An mtd executable
is also needed to write the mtd block. Place these on the web server
as well.
6. (Only if mtd0 is locked) Use wget to retrieve the files on the MX64:
wget [http://192.168.1.2/mtd-rw.ko](http://192.168.1.2/mtd-rw.ko%60)
insmod mtd-rw.ko i_want_a_brick=1
and confirm the unlock is set with dmesg
mtd-rw: mtd0: setting writeable flag
7. Download the appropriate u-boot image according to step 3. If you
did not need to unlock the mtd0 partition then use dd to write the
file, with caution:
wget [http://192.168.1.2/uboot_mx64](http://192.168.1.2/uboot_mx64%60)
dd if=uboot_mx64 of=/dev/mtdblock0
If you needed to unlock the mtd0 partition using the mtd-rw module,
run these commands instead to install u-boot instead:
wget [http://192.168.1.2/mtd](http://192.168.1.2/mtd%60) chmod +x mtd wget [http://192.168.1.2/uboot_mx64](http://192.168.1.2/uboot_mx64%60) ./mtd write uboot_mx64 /dev/mtd0
8. Once this has successfully completed, power off the device. If you did not need to install the small u-boot image, proceed to OpenWrt Installation. Otherwise proceed to UBI supporting bootloader installation
UBI supporting bootloader installation
These steps need to be followed if the older u-boot image was
installed, either because the Meraki diagnostic partition scheme used
0x80000 as the mtd0 size, or because you installed the u-boot provided
while OpenWrt support was still under development. If using OpenWrt,
make a backup before proceeding.
- Download the
openwrt-bcm5862x-generic-meraki_mx64-initramfs-kernel.binimage from clayface's U-Boot repo onto the USB disk. - With the prepared USB drive already inserted, power on the device while holding the reset button. A white/orange flashing pattern will occur shortly after power on. Let go of the reset button. The device is now booting into OpenWrt initramfs stored on the USB disk.
- Connect by SSH to
192.168.1.1and flash the embedded u-boot image:mtd write /root/uboot_mx64 /dev/mtd0
You do not need to reboot as this image can handle “Kernel-in-UBI” OpenWrt installation. - Proceed to obtain and flash the appropriate OpenWrt image at OpenWrt Installation step 4.
- Reboot will take significantly longer due to Shmoo calibration.
In case the device does not come online after several minutes, power-cycle the device and see if it boots.
If you see an orange/white flashing pattern, this indicates UBI booting was not successful, and you will need to copy a new bcm53xx image to a USB disk before booting it and attempting to install OpenWrt again - refer to OpenWrt Installation step 1. Do not attempt to reflash u-boot in this scenario.
OpenWrt Installation
- Having obtained an OpenWrt initramfs image, copy the
openwrt-bcm53xx-generic-meraki_mx64-initramfs.binfile to the base directory of the USB disk.- It must have this name to boot!5)
- If using an initramfs image with USB storage support, copy a sysupgrade image over too.
- With the USB drive already inserted, power on the device.
- When the device enters USB boot, it will blink white 3x.
Even on used units, this white blink should be visible, as the orange LED will turn off when it does. - The device will now boot from the image. Its light will stay solid orange during this.
- Eventually it will start blinking green--first fast, then slow. Once the light is solid green, OpenWrt has finished booting.
- This should take about a minute total.
- If it does not boot into the initramfs image, delete and recopy the file to the USB disk and try again.
If that still doesn't work, try a different USB disk, or delete the other partition(s) on it (if you had created other partitions), and try again.
If boot issues persist, a serial connection may help here.
- Connect to the device over LAN. See Preparation and Setup step 6.
- If not using an initramfs image with USB storage support, use
scpto copy the sysupgrade file to192.168.1.1:/tmp.- Example:
scp -O openwrt-bcm53xx-generic-meraki_mx64-squashfs.sysupgrade.bin root@192.168.1.1:/tmp - If
scpcomplains about the host key being different because a different key for 192.168.1.1 is saved, ignore it by inserting-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/nullafterscp.
- SSH to
192.168.1.1. - If using an initramfs image with USB storage support, mount the USB disk with
mkdir /mnt/usb && mount /dev/sda1 /mnt/usb. - Run sysupgrade.
- Example:
sysupgrade /tmp/openwrt-bcm53xx-generic-meraki_mx64-squashfs.sysupgrade.bin - It will reboot.
- OpenWrt should now be installed on the device.
Optional: Recovering Flash Space
⚠️ Proceed with caution!
Most of the 1GiB space is filled with factory Cisco volumes, and are not necessary if installing OpenWrt.
Without deleting these volumes, OpenWrt will only be able to access ~370MiB.
After the initial installation, or even before installation (but after booting from initramfs),
- Copy a
squashfs.sysupgrade.binto/tmp - Run
ubinfo -ato get a list of volumes. - Delete the unnecessary volumes:
ubirmvol /dev/ubi0 -N part.oldubirmvol /dev/ubi0 -N storageubirmvol /dev/ubi0 -N diagnostic1ubirmvol /dev/ubi0 -N part.safe- DO NOT DELETE
board-config!6)
- Apply the sysupgrade
sysupgrade openwrt-xx.xx.x-bcm53xx-generic-meraki_mx64-squashfs.sysupgrade.bin.- It will reboot itself.
- Run
ubinfo -aagain and verify that therootfs_datavolume is now much larger.
Installation Files
U-Boot
- From clayface's U-Boot repo, download the two
uboot_mx64files. - Verify the SHA512 of these two files after they have been written to the USB disk!
- Compare each to the contents of its
.sha512file.
Initramfs
| Download Link | Author | Notes |
|---|---|---|
| Google Drive | Leo-PL | OpenWrt SNAPSHOT, r27578+130-23ac1ad95155. Kernel 6.6.54. Pre-24.10.0-rc1 |
| GitHub DimmaDont/openwrt | DimmaDont | v24.10.4, with USB storage |
* Do not rename the initramfs image file!
Checksum
- From DimmaDont's busybox releases, download the
sha512sumbinary.- This will be used to verify the u-boot image again later.
Sysupgrade
For official images, see Firmware Links.
Installation for both of the units (MX64 and MX65): Github Pull Request 16634
Photos
Still working on it.
Opening the case
- Remove 4 rubber feet on underside of the case.
- Remove 4 hidden screws from under rubber feet.
- Lift off black underside. Slide out PCB
Serial
→ port.serial general information about the serial port, serial port cable, etc.
How to connect to the Serial Port of this specific device:
Set of 4 pins labeled J1
- Pin 1 - (has a small triangle symbol under it) closest to the main processor (3.3v) DO NOT CONNECT!
- Pin 2 - connected to RX on my USB adapter
- Pin 3 - connected to TX on my USB adapter
- Pin 4 - (closest to the LED) connected to Ground on my USB adapter
| Serial connection parameters for Meraki MX64 | 115200, 8N1 |
|---|
JTAG
No info about JTAG-ing the unit atm
20 Pin JTAG port
Bootlogs
OEM bootlog
Insert Meraki MX64 OEM bootlog here
OpenWrt bootlog
root@OpenWrt:~# dmesg [ 0.000000] Booting Linux on physical CPU 0x0 [ 0.000000] Linux version 5.10.23 (root@cluster5) (arm-openwrt-linux-muslgnueabi-gcc (OpenWrt GCC 8.4.0 r16206-bb95be9265) 8.4.0, GNU ld (GNU Binutils) 2.34) #0 SMP Mon Mar 15 05:32:30 2021 [ 0.000000] CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=10c5387d [ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache [ 0.000000] OF: fdt: Machine model: Cisco Meraki MX64(A0) [ 0.000000] Memory policy: Data cache writealloc [ 0.000000] Hit pending asynchronous external abort (FSR=0x00001c06) during first unmask, this is most likely caused by a firmware/bootloader bug. [ 0.000000] Zone ranges: [ 0.000000] Normal [mem 0x0000000060000000-0x00000000dfffffff] [ 0.000000] Movable zone start for each node [ 0.000000] Early memory node ranges [ 0.000000] node 0: [mem 0x0000000060000000-0x00000000dfffffff] [ 0.000000] Initmem setup node 0 [mem 0x0000000060000000-0x00000000dfffffff] [ 0.000000] On node 0 totalpages: 524288 [ 0.000000] Normal zone: 4608 pages used for memmap [ 0.000000] Normal zone: 0 pages reserved [ 0.000000] Normal zone: 524288 pages, LIFO batch:63 [ 0.000000] percpu: Embedded 14 pages/cpu s27148 r8192 d22004 u57344 [ 0.000000] pcpu-alloc: s27148 r8192 d22004 u57344 alloc=14*4096 [ 0.000000] pcpu-alloc: [0] 0 [0] 1 [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 519680 [ 0.000000] Kernel command line: console=ttyS0,115200n8 earlyprintk [ 0.000000] Dentry cache hash table entries: 262144 (order: 8, 1048576 bytes, linear) [ 0.000000] Inode-cache hash table entries: 131072 (order: 7, 524288 bytes, linear) [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off [ 0.000000] Memory: 2037780K/2097152K available (5542K kernel code, 968K rwdata, 1372K rodata, 30720K init, 334K bss, 59372K reserved, 0K cma-reserved) [ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=2, Nodes=1 [ 0.000000] rcu: Hierarchical RCU implementation. [ 0.000000] Tracing variant of Tasks RCU enabled. [ 0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 10 jiffies. [ 0.000000] NR_IRQS: 16, nr_irqs: 16, preallocated irqs: 16 [ 0.000000] L2C: DT/platform modifies aux control register: 0x0a150000 -> 0x3a150000 [ 0.000000] L2C-310 enabling early BRESP for Cortex-A9 [ 0.000000] L2C-310 full line of zeros enabled for Cortex-A9 [ 0.000000] L2C-310 ID prefetch enabled, offset 1 lines [ 0.000000] L2C-310 dynamic clock gating enabled, standby mode enabled [ 0.000000] L2C-310 Coherent cache controller enabled, 16 ways, 512 kB [ 0.000000] L2C-310 Coherent: CACHE_ID 0x410000c8, AUX_CTRL 0x7e150001 [ 0.000000] random: get_random_bytes called from start_kernel+0x358/0x508 with crng_init=0 [ 0.000007] sched_clock: 64 bits at 600MHz, resolution 1ns, wraps every 2199023255551ns [ 0.000025] clocksource: arm_global_timer: mask: 0xffffffffffffffff max_cycles: 0x8a60dddf76, max_idle_ns: 440795229572 ns [ 0.000043] Switching to timer-based delay loop, resolution 1ns [ 0.000209] clocksource: arm,sp804: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 15290083572 ns [ 0.000336] Calibrating delay loop (skipped), value calculated using timer frequency.. 1200.00 BogoMIPS (lpj=6000000) [ 0.000348] pid_max: default: 32768 minimum: 301 [ 0.000443] Mount-cache hash table entries: 4096 (order: 2, 16384 bytes, linear) [ 0.000454] Mountpoint-cache hash table entries: 4096 (order: 2, 16384 bytes, linear) [ 0.000971] CPU: Testing write buffer coherency: ok [ 0.000993] CPU0: Spectre v2: using BPIALL workaround [ 0.001121] CPU0: thread -1, cpu 0, socket 0, mpidr 80000000 [ 0.001480] Setting up static identity map for 0x60100000 - 0x6010003c [ 0.001565] rcu: Hierarchical SRCU implementation. [ 0.001671] dyndbg: Ignore empty _ddebug table in a CONFIG_DYNAMIC_DEBUG_CORE build [ 0.001763] smp: Bringing up secondary CPUs ... [ 0.002263] CPU1: thread -1, cpu 1, socket 0, mpidr 80000001 [ 0.002269] CPU1: Spectre v2: using BPIALL workaround [ 0.002348] smp: Brought up 1 node, 2 CPUs [ 0.002357] SMP: Total of 2 processors activated (2400.00 BogoMIPS). [ 0.002362] CPU: All CPU(s) started in SVC mode. [ 0.004582] VFP support v0.3: implementor 41 architecture 3 part 30 variant 9 rev 4 [ 0.004680] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns [ 0.004695] futex hash table entries: 512 (order: 3, 32768 bytes, linear) [ 0.004805] pinctrl core: initialized pinctrl subsystem [ 0.005033] NET: Registered protocol family 16 [ 0.005713] DMA: preallocated 256 KiB pool for atomic coherent allocations [ 0.006360] thermal_sys: Registered thermal governor 'step_wise' [ 0.019572] cryptd: max_cpu_qlen set to 1000 [ 0.021632] workqueue: max_active 576 requested for napi_workq is out of range, clamping between 1 and 512 [ 0.023191] clocksource: Switched to clocksource arm_global_timer [ 0.023808] NET: Registered protocol family 2 [ 0.024203] tcp_listen_portaddr_hash hash table entries: 1024 (order: 1, 12288 bytes, linear) [ 0.024245] TCP established hash table entries: 16384 (order: 4, 65536 bytes, linear) [ 0.024342] TCP bind hash table entries: 16384 (order: 5, 131072 bytes, linear) [ 0.024506] TCP: Hash tables configured (established 16384 bind 16384) [ 0.024631] UDP hash table entries: 1024 (order: 3, 32768 bytes, linear) [ 0.024721] UDP-Lite hash table entries: 1024 (order: 3, 32768 bytes, linear) [ 0.024959] NET: Registered protocol family 1 [ 0.024986] PCI: CLS 0 bytes, default 64 [ 0.166525] workingset: timestamp_bits=14 max_order=19 bucket_order=5 [ 0.168610] squashfs: version 4.0 (2009/01/31) Phillip Lougher [ 0.168620] jffs2: version 2.2 (NAND) (SUMMARY) (LZMA) (RTIME) (CMODE_PRIORITY) (c) 2001-2006 Red Hat, Inc. [ 0.169721] Serial: 8250/16550 driver, 2 ports, IRQ sharing disabled [ 0.170190] printk: console [ttyS0] disabled [ 0.170255] 18000300.serial: ttyS0 at MMIO 0x18000300 (irq = 30, base_baud = 3906250) is a 16550A [ 0.691108] printk: console [ttyS0] enabled [ 0.696500] nand: device found, Manufacturer ID: 0x2c, Chip ID: 0xd3 [ 0.702868] nand: Micron MT29F8G08ABACAWP [ 0.706902] nand: 1024 MiB, SLC, erase size: 256 KiB, page size: 4096, OOB size: 224 [ 0.714682] iproc_nand 18026000.nand: detected 1024MiB total, 256KiB blocks, 4KiB pages, 27B OOB, 8-bit, BCH-24 (1KiB sector) [ 0.726682] Bad block table found at page 262080, version 0x01 [ 0.733149] Bad block table found at page 262016, version 0x01 [ 0.745309] 6 fixed-partitions partitions found on MTD device brcmnand.0 [ 0.752029] Creating 6 MTD partitions on "brcmnand.0": [ 0.757217] 0x000000000000-0x000000080000 : "U-boot" [ 0.762794] 0x000000080000-0x000000100000 : "Shmoo" [ 0.768246] 0x000000100000-0x000000400000 : "bootkernel1" [ 0.774195] 0x000000400000-0x000000500000 : "senao_nvram" [ 0.780181] 0x000000500000-0x000000800000 : "bootkernel2" [ 0.786144] 0x000000800000-0x00003ff00000 : "ubi" [ 0.793121] libphy: Fixed MDIO Bus: probed [ 0.797691] b53-srab-switch 18036000.srab: Port 5 mode: internal [ 0.803745] b53-srab-switch 18036000.srab: found switch: BCM585xx/586xx/88312, rev 0 [ 0.811693] bgmac-enet 18024000.ethernet: MAC address not present in device tree [ 0.819160] bgmac-enet 18024000.ethernet: Invalid MAC addr: 00:00:00:00:00:00 [ 0.826322] bgmac-enet 18024000.ethernet: Using random MAC: a2:c7:c4:11:c1:23 [ 0.838990] bcm-iproc-i2c 18038000.i2c: bus set to 100000 Hz [ 0.845554] at24 0-0050: 8192 byte 24c64 EEPROM, writable, 32 bytes/write [ 0.852804] sp805-wdt 18039000.watchdog: registration successful [ 0.859949] NET: Registered protocol family 10 [ 0.865048] Segment Routing with IPv6 [ 0.868766] NET: Registered protocol family 17 [ 0.873356] 8021q: 802.1Q VLAN Support v1.8 [ 0.877587] Registering SWP/SWPB emulation handler [ 0.894470] b53-srab-switch 18036000.srab: Port 5 mode: internal [ 0.900532] b53-srab-switch 18036000.srab: found switch: BCM585xx/586xx/88312, rev 0 [ 1.028005] libphy: dsa slave smi: probed [ 1.032557] b53-srab-switch 18036000.srab lan1 (uninitialized): PHY [dsa-0.0:00] driver [Generic PHY] (irq=POLL) [ 1.043770] b53-srab-switch 18036000.srab lan2 (uninitialized): PHY [dsa-0.0:01] driver [Generic PHY] (irq=POLL) [ 1.055012] b53-srab-switch 18036000.srab lan3 (uninitialized): PHY [dsa-0.0:02] driver [Generic PHY] (irq=POLL) [ 1.066186] b53-srab-switch 18036000.srab lan4 (uninitialized): PHY [dsa-0.0:03] driver [Generic PHY] (irq=POLL) [ 1.077475] b53-srab-switch 18036000.srab wan0 (uninitialized): PHY [dsa-0.0:04] driver [Generic PHY] (irq=POLL) [ 1.088204] b53-srab-switch 18036000.srab: Using legacy PHYLIB callbacks. Please migrate to PHYLINK! [ 1.102262] ------------[ cut here ]------------ [ 1.106909] WARNING: CPU: 0 PID: 5 at kernel/irq/manage.c:1751 free_irq+0xd8/0x3d8 [ 1.114496] Trying to free already-free IRQ 0 [ 1.118857] Modules linked in: [ 1.121925] CPU: 0 PID: 5 Comm: kworker/0:0 Not tainted 5.10.23 #0 [ 1.128118] Hardware name: Broadcom Northstar Plus SoC [ 1.133270] Workqueue: events deferred_probe_work_func [ 1.138431] [<4010d5c4>] (unwind_backtrace) from [<40109e14>] (show_stack+0x10/0x14) [ 1.146194] [<40109e14>] (show_stack) from [<403e2c24>] (dump_stack+0x9c/0xb0) [ 1.153439] [<403e2c24>] (dump_stack) from [<40128a60>] (__warn+0xc0/0xd8) [ 1.160328] [<40128a60>] (__warn) from [<40128afc>] (warn_slowpath_fmt+0x84/0x94) [ 1.167830] [<40128afc>] (warn_slowpath_fmt) from [<40177c88>] (free_irq+0xd8/0x3d8) [ 1.175602] [<40177c88>] (free_irq) from [<404c2fbc>] (b53_srab_irq_disable+0x30/0x3c) [ 1.183541] [<404c2fbc>] (b53_srab_irq_disable) from [<404bf64c>] (b53_disable_port+0x98/0xa0) [ 1.192181] [<404bf64c>] (b53_disable_port) from [<406597ac>] (dsa_port_disable+0x14/0x1c) [ 1.200462] [<406597ac>] (dsa_port_disable) from [<40658650>] (dsa_register_switch+0x900/0xcbc) [ 1.209184] [<40658650>] (dsa_register_switch) from [<404c1dc0>] (b53_switch_register+0x204/0x344) [ 1.218172] [<404c1dc0>] (b53_switch_register) from [<4045add0>] (platform_drv_probe+0x34/0x70) [ 1.226888] [<4045add0>] (platform_drv_probe) from [<4045918c>] (really_probe+0xfc/0x3cc) [ 1.235086] [<4045918c>] (really_probe) from [<404577e0>] (bus_for_each_drv+0x70/0x94) [ 1.243023] [<404577e0>] (bus_for_each_drv) from [<40459044>] (__device_attach+0xa8/0xec) [ 1.251223] [<40459044>] (__device_attach) from [<404583e8>] (bus_probe_device+0x84/0x8c) [ 1.259421] [<404583e8>] (bus_probe_device) from [<40458878>] (deferred_probe_work_func+0x68/0x94) [ 1.268409] [<40458878>] (deferred_probe_work_func) from [<40140148>] (process_one_work+0x218/0x470) [ 1.277562] [<40140148>] (process_one_work) from [<40140648>] (worker_thread+0x2a8/0x5d0) [ 1.285761] [<40140648>] (worker_thread) from [<40146234>] (kthread+0x14c/0x150) [ 1.293177] [<40146234>] (kthread) from [<40100128>] (ret_from_fork+0x14/0x2c) [ 1.300414] Exception stack(0x42883fb0 to 0x42883ff8) [ 1.305473] 3fa0: 00000000 00000000 00000000 00000000 [ 1.313665] 3fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 [ 1.321863] 3fe0: 00000000 00000000 00000000 00000000 00000013 00000000 [ 1.328494] ---[ end trace d10b21362587b673 ]--- [ 1.333355] DSA: tree 0 setup [ 1.337161] UBI: auto-attach mtd5 [ 1.340493] ubi0: attaching mtd5 [ 1.360566] random: fast init done [ 2.386610] random: crng init done [ 6.413236] ubi0: scanning is finished [ 6.428589] ubi0: attached mtd5 (name "ubi", size 1015 MiB) [ 6.434205] ubi0: PEB size: 262144 bytes (256 KiB), LEB size: 253952 bytes [ 6.441094] ubi0: min./max. I/O unit sizes: 4096/4096, sub-page size 4096 [ 6.447910] ubi0: VID header offset: 4096 (aligned 4096), data offset: 8192 [ 6.454895] ubi0: good PEBs: 4060, bad PEBs: 0, corrupted PEBs: 0 [ 6.461000] ubi0: user volume: 5, internal volumes: 1, max. volumes count: 128 [ 6.468238] ubi0: max/mean erase counter: 280/208, WL threshold: 4096, image sequence number: 1260248521 [ 6.477746] ubi0: available PEBs: 1611, total reserved PEBs: 2449, PEBs reserved for bad PEB handling: 80 [ 6.487344] ubi0: background thread "ubi_bgt0d" started, PID 407 [ 6.512258] Freeing unused kernel memory: 30720K [ 6.533338] Run /init as init process [ 6.537011] with arguments: [ 6.537014] /init [ 6.537017] earlyprintk [ 6.537020] with environment: [ 6.537022] HOME=/ [ 6.537025] TERM=linux [ 6.869967] init: Console is alive [ 6.873498] init: - watchdog - [ 6.881776] kmodloader: loading kernel modules from /etc/modules-boot.d/* [ 6.892508] usbcore: registered new interface driver usbfs [ 6.898111] usbcore: registered new interface driver hub [ 6.903533] usbcore: registered new device driver usb [ 6.910561] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver [ 6.917657] ehci-fsl: Freescale EHCI Host controller driver [ 6.924799] ehci-platform: EHCI generic platform driver [ 6.930250] ehci-platform 1802a000.usb: EHCI Host Controller [ 6.935986] ehci-platform 1802a000.usb: new USB bus registered, assigned bus number 1 [ 6.944626] ehci-platform 1802a000.usb: irq 34, io mem 0x1802a000 [ 6.973201] ehci-platform 1802a000.usb: USB 2.0 started, EHCI 1.00 [ 6.979846] hub 1-0:1.0: USB hub found [ 6.983663] hub 1-0:1.0: 2 ports detected [ 6.989486] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver [ 6.996293] ohci-platform: OHCI generic platform driver [ 7.001645] ohci-platform 1802b000.usb: Generic Platform OHCI controller [ 7.008394] ohci-platform 1802b000.usb: new USB bus registered, assigned bus number 2 [ 7.016304] ohci-platform 1802b000.usb: irq 34, io mem 0x1802b000 [ 7.097691] hub 2-0:1.0: USB hub found [ 7.102022] hub 2-0:1.0: 2 ports detected [ 7.108925] kmodloader: done loading kernel modules from /etc/modules-boot.d/* [ 7.116700] init: - preinit - [ 7.373324] usb 1-2: new high-speed USB device number 2 using ehci-platform [ 11.505368] procd: - early - [ 11.508294] procd: - watchdog - [ 12.026107] procd: - watchdog - [ 12.029441] procd: - ubus - [ 12.082949] procd: - init - [ 12.257172] kmodloader: loading kernel modules from /etc/modules.d/* [ 12.257360] urngd: v1.0.2 started. [ 12.367778] i2c /dev entries driver [ 12.467919] xt_time: kernel timezone is -0000 [ 12.481064] PPP generic driver version 2.4.2 [ 12.487725] NET: Registered protocol family 24 [ 12.536602] kmodloader: done loading kernel modules from /etc/modules.d/* [ 28.299045] bgmac-enet 18024000.ethernet eth0: Link is Up - 1Gbps/Full - flow control off [ 28.308378] device eth0 entered promiscuous mode [ 28.321142] b53-srab-switch 18036000.srab lan1: configuring for phy/gmii link mode [ 28.331282] 8021q: adding VLAN 0 to HW filter on device lan1 [ 28.339319] b53-srab-switch 18036000.srab lan1: Link is Up - 1Gbps/Full - flow control rx/tx [ 28.393530] br-lan: port 1(lan1) entered blocking state [ 28.398788] br-lan: port 1(lan1) entered disabled state [ 28.404298] device lan1 entered promiscuous mode [ 28.495343] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready [ 28.527536] br-lan: port 1(lan1) entered blocking state [ 28.532795] br-lan: port 1(lan1) entered forwarding state [ 28.545312] b53-srab-switch 18036000.srab lan2: configuring for phy/gmii link mode [ 28.557326] 8021q: adding VLAN 0 to HW filter on device lan2 [ 28.613652] br-lan: port 2(lan2) entered blocking state [ 28.618917] br-lan: port 2(lan2) entered disabled state [ 28.624568] device lan2 entered promiscuous mode [ 28.714578] b53-srab-switch 18036000.srab lan3: configuring for phy/gmii link mode [ 28.722430] 8021q: adding VLAN 0 to HW filter on device lan3 [ 28.813235] br-lan: port 3(lan3) entered blocking state [ 28.818481] br-lan: port 3(lan3) entered disabled state [ 28.823997] device lan3 entered promiscuous mode [ 28.943601] b53-srab-switch 18036000.srab lan4: configuring for phy/gmii link mode [ 28.951388] 8021q: adding VLAN 0 to HW filter on device lan4 [ 29.013418] br-lan: port 4(lan4) entered blocking state [ 29.018655] br-lan: port 4(lan4) entered disabled state [ 29.024192] device lan4 entered promiscuous mode [ 29.146467] b53-srab-switch 18036000.srab wan0: configuring for phy/gmii link mode [ 29.154297] 8021q: adding VLAN 0 to HW filter on device wan0 [ 29.353291] IPv6: ADDRCONF(NETDEV_CHANGE): br-lan: link becomes ready
Notes
- The Meraki provided GPL source are available at 7).
- Wireless capability on the MX64W and MX65W exists in the form of 2x Broadcom BCM43520KMLG, which is not supported. These devices will work otherwise as standard MX64 or MX65 devices.
- Early MX64 units use an A0 variant of the BCM958625 SoC which lacks cache coherency and uses a different “secondary-boot-reg”. As a consequence a different device tree is needed.
- Installation of OpenWrt requires changing u-boot to a custom version. This is due to the stock u-boot “nand read” command being limited to load only 2MB, in spite of the bootkernel1 and bootkernel2 partitions both being 3MB in the stock layout. It is also required to allow booting via USB, enabling cache coherency and setting up the QCA switches and Serdes link on the MX65. The modified sources for U-boot are available for the MX648) and MX659).
- Initial work on this device used a small bootloader within the OEM partition scheme. To allow booting of larger kernels, UBI and bootm support has been added, along with ability to store env variables to the NAND. The Shmoo and newly created env partitions have been moved to the extra space available after the nvram data.
- Users who installed the previous non-UBI supporting bootloader will need to convert to the new one before flashing a compatible image.
Factory firmware
- When booted into diagnostic mode, the Broadcom reference web UI can be accessed at
192.168.1.1with(blank username):admin

