Understanding Cisco CW9172 Day-0 Workflow, Persona Selection, and Fast Offline Migration (FOM) – Part 1

The Cisco CW9172 Day-0 onboarding process is significantly more complex than traditional CAPWAP AP discovery. The boot logs reveal that the AP does not immediately commit to either Meraki or Catalyst operation, even when the AP initially boots a Meraki image.

Reference: https://www.cisco.com/c/en/us/td/docs/wireless/access_point/technical-reference/cw9172-dg.html

Understanding the workflow via the AP logs – Workflow # 1 – this scenario
canning shenv data blocks

Total valid parts=2

Active shenv part[1:0], write_counter=22

In:    serial@78AF000

Out:   serial@78AF000

Err:   serial@78AF000

Device Tree: Cisco System, Inc. IPQ5332/CW9172I

machid: 8060101

Net:   No ethernet found.

Autoboot in 5 seconds



Meraki Mode Selected

First-boot migration detection enabled!

Secure boot enabled.

Meraki Image Slot slot: meraki_a

    index: [26] name:[meraki_a]

    attributes: 0x007f000000000000

    priority:3 active: 1 retry: 7, success: 1, unbootable: 0



Meraki Image Slot slot: meraki_b

    index: [27] name:[meraki_b]

    attributes: 0x007e000000000000

    priority:2 active: 1 retry: 7, success: 1, unbootable: 0

Selected slot at partition number 26

Reading FDT image header from slot, start lba 65536 size 409599

Reading 25 blocks into a buffer of 12800 bytes

Found valid image header at offset 0x3000

Found image with a size of 42425092, 82862 blocks

secure image authentication success

## Loading kernel from FIT Image at 50000000 ...

   Using 'config_101' configuration

   Verifying Hash Integrity ... OK

   Trying 'kernel' kernel subimage

     Description:  Goldfinger Kernel

     Type:         Kernel Image

     Compression:  gzip compressed

     Data Start:   0x50000100

     Data Size:    4228029 Bytes = 4 MiB

     Architecture: AArch64

     OS:           Linux

     Load Address: 0x41080000

     Entry Point:  0x41080000

   Verifying Hash Integrity ... OK

## Loading ramdisk from FIT Image at 50000000 ...

   Using 'config_101' configuration

   Verifying Hash Integrity ... OK

   Trying 'ramdisk' ramdisk subimage

     Description:  Goldfinger Ramdisk

     Type:         RAMDisk Image

     Compression:  uncompressed

     Data Start:   0x5040856c

     Data Size:    37955388 Bytes = 36.2 MiB

     Architecture: AArch64

     OS:           Linux

     Load Address: 0x45000000

     Entry Point:  unavailable

   Verifying Hash Integrity ... OK

   Loading ramdisk from 0x5040856c to 0x45000000

## Loading fdt from FIT Image at 50000000 ...

   Using 'config_101' configuration

   Verifying Hash Integrity ... OK

   Trying 'fdt_2' fdt subimage

     Description:  Hornet Device Tree

     Type:         Flat Device Tree

     Compression:  uncompressed

     Data Start:   0x5284913c

     Data Size:    55432 Bytes = 54.1 KiB

     Architecture: AArch64

     Load Address: 0x43000000

   Verifying Hash Integrity ... OK

   Loading fdt from 0x5284913c to 0x43000000

   Booting using the fdt blob at 0x43000000

Working FDT set to 43000000

   Uncompressing Kernel Image

   Using Device Tree in place at 43000000, end 43010887

Working FDT set to 43000000

Updating FDT with selected slot

Using machid 0x8060101 from environment

Starting kernel ...

Jumping to AARCH64 kernel via monitor

[    0.000000] Booting Linux on physical CPU 0x0000000000 [0x51af8014]
[    0.000000] Linux version 5.4.220-meraki (oe-user@oe-host) (gcc version 9.5.0 (GCC)) #1 SMP PREEMPT Tue Nov 19 02:18:35 UTC 2024
[    0.000000] Machine model: Meraki CW9172i
[    0.000000] earlycon: msm_serial_dm0 at MMIO 0x00000000078af000 (options '')
[    0.000000] printk: bootconsole [msm_serial_dm0] enabled
[    0.000000] OF: reserved mem: OVERLAP DETECTED!
[    0.000000] q6_code_data@4A900000 (0x000000004a900000--0x000000004be00000) overlaps with q6_mem_regions@4a900000 (0x000000004a900000--0x000000004f900000)
[    0.000000] OF: reserved mem: OVERLAP DETECTED!
[    0.000000] q6_mem_regions@4a900000 (0x000000004a900000--0x000000004f900000) overlaps with q6_qca5332_data@4be00000 (0x000000004be00000--0x000000004dd00000)
[    0.000000] Reserved memory: created DMA memory pool at 0x00000000bf2a7000, size 9 MiB
[    0.000000] OF: reserved mem: initialized node dma_pool1@1, compatible id shared-dma-pool
[    0.000000] psci: probing for conduit method from DT.
[    0.000000] psci: PSCIv1.0 detected in firmware.
[    0.000000] psci: Using standard PSCI v0.2 function IDs
[    0.000000] psci: MIGRATE_INFO_TYPE not supported.
[    0.000000] psci: SMC Calling Convention v1.0
[    0.000000] percpu: Embedded 21 pages/cpu s47000 r8192 d30824 u86016
[    0.000000] Detected VIPT I-cache on CPU0
[    0.000000] CPU features: kernel page table isolation disabled by kernel configuration
[    0.000000] ARM_SMCCC_ARCH_WORKAROUND_1 missing from firmware
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 473004
[    0.000000] Kernel command line: console=ttyMSM0,115200,n8 gpt clk_ignore_unused swiotlb=1 earlycon
[    0.000000] printk: log_buf_len individual max cpu contribution: 131072 bytes
[    0.000000] printk: log_buf_len total cpu_extra contributions: 393216 bytes
[    0.000000] printk: log_buf_len min size: 131072 bytes
[    0.000000] printk: log_buf_len: 524288 bytes
[    0.000000] printk: early log buf free: 128804(98%)
[    0.000000] Dentry cache hash table entries: 262144 (order: 9, 2097152 bytes, linear)
[    0.000000] Inode-cache hash table entries: 131072 (order: 8, 1048576 bytes, linear)
[    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[    0.000000] Memory: 1834872K/1922048K available (5950K kernel code, 610K rwdata, 1984K rodata, 320K init, 393K bss, 87176K reserved, 0K cma-reserved)
[    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
[    0.000000] rcu: Preemptible hierarchical RCU implementation.
[    0.000000] Tasks RCU enabled.
[    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 10 jiffies.
[    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
[    0.000000] GICv2m: range[mem 0x0b00c000-0x0b00cffc], SPI[640:671]
[    0.000000] GICv2m: range[mem 0x0b00d000-0x0b00dffc], SPI[672:703]
[    0.000000] GICv2m: range[mem 0x0b00e000-0x0b00effc], SPI[704:735]
[    0.000000] arch_timer: cp15 and mmio timer(s) running at 24.00MHz (virt/virt).
[    0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x588fe9dc0, max_idle_ns: 440795202592 ns
[    0.000005] sched_clock: 56 bits at 24MHz, resolution 41ns, wraps every 4398046511097ns
[    0.011124] Calibrating delay loop (skipped), value calculated using timer frequency.. 48.00 BogoMIPS (lpj=240000)
[    0.018751] pid_max: default: 32768 minimum: 301
[    0.029330] Mou[   18.631382] Freeing initrd memory: 37064K
[   18.632329] hw perfevents: enabled with armv8_cortex_a53 PMU driver, 7 counters available
[   18.637188] Initialise system trusted keyrings
[   18.642832] workingset: timestamp_bits=46 max_order=19 bucket_order=0
[   18.663443] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[   18.663470] fuse: init (API version 7.31)
[   18.689715] Key type asymmetric registered
[   18.689739] Asymmetric key parser 'x509' registered
[   18.692769] io scheduler mq-deadline registered
[   18.703173] bam-dma-engine 7884000.dma: qcom,controlled-remotely unspecified
[   18.705145] bam-dma-engine 7984000.dma: qcom,controlled-remotely unspecified
[   18.731489] CPU: IPQ5332, SoC Version: 1.1
[   18.731512] OEM_ID: 1, PROD_ID: 0
[   18.737913] TZ Log : Will warn on Access Violation, as paniconaccessviolation is not set
[   18.739211] msm_serial 78af000.serial: msm_serial: detected port #0
[   18.746492] msm_serial 78af000.serial: uartclk = 1843199
[   18.752142] 78af000.serial: ttyMSM0 at MMIO 0x78af000 (irq = 35, base_baud = 115199)[   18.766169] printk: console [ttyMSM0] enabled
[   18.766169] printk: console [ttyMSM0] enabled
[   18.769494] printk: bootconsole [msm_serial_dm0] disabled
[   18.769494] printk: bootconsole [msm_serial_dm0] disabled
[   18.780033] msm_serial 78b0000.serial: msm_serial: detected port #1
[   18.784728] msm_serial 78b0000.serial: uartclk = 24000000
[   18.790780] 78b0000.serial: ttyMSM1 at MMIO 0x78b0000 (irq = 36, base_baud = 1500000) is a MSM
[   18.797024] msm_serial: driver initialized
[   18.804799] Trying to register dev faulty etc
[   18.809657] random: crng init done
[   18.811889] TRACK: P[0]PMask[4]
[   18.816542] TRACK: P[1]PMask[4]
[   18.819924] TRACK: P[2]PMask[4]
[   18.823741] TRACK: P[3]PMask[4]
[   18.826348] TRACK: P[4]PMask[4]
[   18.829559] TRACK: P[5]PMask[4]
[   18.832822] TRACK: P[6]PMask[4]
[   18.848622] brd: module loaded
[   18.874380] loop: module loaded
[   19.090514] qca-mdio 90000.mdio: Reset PHY by GPIO 31
[   19.311642] qca-mdio 90000.mdio: qca-mdio driver was registered
[   19.311923] tun: Universal TUN/TAP device driver, 1.6
[   19.316677] usbcore: registered new interface driver r8152
[   19.321681] usbcore: registered new interface driver cdc_eem
[   19.333628] xhci-hcd xhci-hcd.0.auto: xHCI Host Controller
[   19.333685] xhci-hcd xhci-hcd.0.auto: new USB bus registered, assigned bus number 1
[   19.338235] xhci-hcd xhci-hcd.0.auto: hcc params 0x0220fe65 hci version 0x110 quirks 0x0000000000010010
[   19.345693] xhci-hcd xhci-hcd.0.auto: irq 95, io mem 0x08a00000
[   19.355347] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 5.04
[   19.360906] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[   19.369223] usb usb1: Product: xHCI Host Controller
[   19.376442] usb usb1: Manufacturer: Linux 5.4.220-meraki xhci-hcd
[   19.381220] usb usb1: SerialNumber: xhci-hcd.0.auto
[   19.388167] hub 1-0:1.0: USB hub found
[   19.392230] hub 1-0:1.0: 1 port detected
[   19.396602] xhci-hcd xhci-hcd.0.auto: xHCI Host Controller
[   19.400056] xhci-hcd xhci-hcd.0.auto: new USB bus registered, assigned bus number 2
[   19.405399] xhci-hcd xhci-hcd.0.auto: Host supports USB 3.0 SuperSpeed
[   19.412985] usb usb2: We don't know the algorithms for LPM for this host, disabling LPM.
[   19.419617] usb usb2: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 5.04
[   19.427858] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[   19.435818] usb usb2: Product: xHCI Host Controller
[   19.443014] usb usb2: Manufacturer: Linux 5.4.220-meraki xhci-hcd
[   19.447780] usb usb2: SerialNumber: xhci-hcd.0.auto
[   19.454872] hub 2-0:1.0: USB hub found
[   19.458777] hub 2-0:1.0: 1 port detected
[   19.463569] usbcore: registered new interface driver cdc_acm
[   19.466616] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
[   19.472616] usbcore: registered new interface driver pl2303
[   19.480127] usbserial: USB Serial support registered for pl2303
[   19.486077] i2c /dev entries driver
[   19.493839] at24 0-0056: 8192 byte 24c64 EEPROM, writable, 1 bytes/write
[   19.496117] Driver for 1-wire Dallas network protocol.
[   19.504014] lm75 0-0048: hwmon0: sensor 'tmp75'
[   19.508310] lm75 0-0049: hwmon1: sensor 'tmp75'
[   19.513414] lm75 0-004a: hwmon2: sensor 'tmp75'
[   19.517249] lm75 0-004b: hwmon3: sensor 'tmp75'
[   19.521245] qcom-tsens 4a9000.thermal-sensor: tsens device is not enabled
[   19.526126] sdhci: Secure Digital Host Controller Interface driver
[   19.531828] sdhci: Copyright(c) Pierre Ossman
[   19.537794] sdhci-pltfm: SDHCI platform and OF driver helper
[   19.542872] sdhci_msm 7804000.sdhci: sdhci_msm_get_ice_device_vops: ICE device is not enabled
[   19.579683] mmc0: SDHCI controller on 7804000.sdhci [7804000.sdhci] using ADMA 64-bit
[   19.606711] qti_scm_restart_reason bff00000.qti,scm_restart_reason: reset_reason : Power on Reset [0x20]
[   19.618543] remoteproc remoteproc0: d100000.remoteproc is available
[   19.619914] remoteproc remoteproc1: 4ab000.remoteproc_pd1 is available
[   19.624894] remoteproc remoteproc2: d100000.remoteproc:remoteproc_pd2 is available
[   19.633298] NET: Registered protocol family 10
[   19.639056] Segment Routing with IPv6
[   19.642656] NET: Registered protocol family 17
[   19.646007] bridge: filtering via arp/ip/ip6tables is no longer available by default. Update your scripts to load br_netfilter if you need this.
[   19.652895] Loading compiled-in X.509 certificates
[   19.668503] Loaded X.509 cert 'Cisco Meraki: Auto-generated kernel signing key: 9043ab6b0dad0af2bd8eb85eade8d7c7a8817991'
[   19.668631] Key type ._fscrypt registered
[   19.679053] Key type .fscrypt registered
[   19.703522] qcom-pcie 18000000.pcie: IRQ mdm2ap_e911 not found
[   19.703559] qcom-pcie 18000000.pcie: host bridge /soc/pcie@18000000 ranges:
[   19.708277] qcom-pcie 18000000.pcie:    IO 0x18200000..0x182fffff -> 0x18200000
[   19.715237] qcom-pcie 18000000.pcie:   MEM 0x18300000..0x1fffffff -> 0x18300000
[   19.724003] mmc0: new HS200 MMC card at address 0001
[   19.730366] mmcblk0: mmc0:0001 S40016 7.28 GiB 
[   19.735223] mmcblk0boot0: mmc0:0001 S40016 partition 1 4.00 MiB
[   19.739399] mmcblk0boot1: mmc0:0001 S40016 partition 2 4.00 MiB
[   19.745283] mmcblk0rpmb: mmc0:0001 S40016 partition 3 4.00 MiB, chardev (244:0)
[   19.753701]  mmcblk0: p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 p17 p18 p19 p20 p21 p22 p23 p24 p25 p26 p27 p28 p29 p30 p31 p32 p33 p34
[   19.981987] qcom-pcie 18000000.pcie: Link up
[   19.982218] qcom-pcie 18000000.pcie: PCI host bridge to bus 0001:00
[   19.985327] pci_bus 0001:00: root bus resource [bus 00-ff]
[   19.991339] pci_bus 0001:00: root bus resource [io  0x0000-0xfffff] (bus address [0x18200000-0x182fffff])
[   19.996869] pci_bus 0001:00: root bus resource [mem 0x18300000-0x1fffffff]
[   20.006542] pci 0001:00:00.0: [17cb:1005] type 01 class 0x060400
[   20.013304] pci 0001:00:00.0: reg 0x10: [mem 0x00000000-0x00000fff]
[   20.019438] pci 0001:00:00.0: reg 0x14: [mem 0x00000000-0x0000ffff]
[   20.025495] pci 0001:00:00.0: PME# supported from D0 D3hot D3cold
[   20.036059] pci 0001:01:00.0: [17cb:1109] type 00 class 0x028000
[   20.038076] pci 0001:01:00.0: reg 0x10: [mem 0x00000000-0x001fffff 64bit]
[   20.044213] pci 0001:01:00.0: Max Payload Size set to 256 (was 128, max 256)
[   20.051072] pci 0001:01:00.0: PME# supported from D0 D3hot D3cold
[   20.062047] pci 0001:00:00.0: BAR 8: assigned [mem 0x18400000-0x185fffff]
[   20.063798] pci 0001:00:00.0: BAR 9: assigned [mem 0x18600000-0x187fffff 64bit pref]
[   20.070581] pci 0001:00:00.0: BAR 1: assigned [mem 0x18300000-0x1830ffff]
[   20.078380] pci 0001:00:00.0: BAR 0: assigned [mem 0x18310000-0x18310fff]
[   20.085096] pci 0001:00:00.0: BAR 7: assigned [io  0x1000-0x1fff]
[   20.091859] pci 0001:01:00.0: BAR 0: assigned [mem 0x18400000-0x185fffff 64bit]
[   20.097954] pci 0001:00:00.0: PCI bridge to [bus 01-ff]
[   20.105037] pci 0001:00:00.0:   bridge window [io  0x1000-0x1fff]
[   20.110234] pci 0001:00:00.0:   bridge window [mem 0x18400000-0x185fffff]
[   20.116494] pci 0001:00:00.0:   bridge window [mem 0x18600000-0x187fffff 64bit pref]
[   20.123367] PCIe: RC enabled during bootup
[   20.131131] qcom-pcie 18000000.pcie: Received Link up event for RC 0
[   20.133897] qcom_wdt b017000.watchdog: boot reason:0
[   20.142714] cpufreq: cpufreq_online: CPU0: Running at unlisted freq: 799999 KHz
[   20.146568] cpufreq: cpufreq_online: CPU0: Unlisted initial frequency changed to: 1100000 KHz
[   20.153722] hctosys: unable to open rtc device (rtc0)
[   20.162383] cfg80211: Loading compiled-in X.509 certificates for regulatory database
[   20.167949] cfg80211: Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
[   20.175092] platform regulatory.0: Direct firmware load for regulatory.db failed with error -2
[   20.180422] clk: Not disabling unused clocks
[   20.181336] platform regulatory.0: Falling back to sysfs fallback for: regulatory.db
[   20.189984] devtmpfs: mounted
[   20.202391] Freeing unused kernel memory: 320K
[   20.280459] Run /init as init process
[   20.306414] early_init: linked /dev/meraki-board-config to /sys/bus/i2c/devices/0-0056/eeprom for goldfinger
[   20.525864] early_init: meraki_CW72I 000000000, (101) CM72I, 32768, Q5BE-HP4T-BK94, B8:B4:C9:23:B0:40, arch:arm64, board:goldfinger, hw:CW9172i, pid:958, ppid:956, fd1:/early_init.log, fd2:/early_init.log
[   20.815760] extfs_mount: meraki_CW72I 000000000, (101) CM72I, 32768, Q5BE-HP4T-BK94, B8:B4:C9:23:B0:40, arch:arm64, board:goldfinger, hw:CW9172i, pid:1040, ppid:958, fd1:/extfs_mount.log, fd2:/extfs_mount.log
[   21.268787] Mounting ext4 /dev/mmcblk0p34 on /boot
[   21.272612] EXT4-fs (mmcblk0p34): mounted filesystem with ordered data mode. Opts: (null)
[   21.341645] Mounting ext4 /dev/mmcblk0p29 on /storage
[   21.345363] EXT4-fs (mmcblk0p29): mounted filesystem with ordered data mode. Opts: (null)
[   21.356454] extfs_mount done, returning 0 (success)
[   21.725501] tpm_tis_i2c 0-002e: 2.0 TPM (device-id 0x0, rev-id 78)
[   21.740436] tpm tpm0: A TPM error (256) occurred attempting the self test
[   21.740453] tpm tpm0: starting up the TPM manually
[   29.444693] Mounting secure storage...
[   36.950701] fscrypt: AES-256-CTS-CBC using implementation "cts(cbc(aes-generic))"
[   37.301265] early_init done
[   37.306431] storage-recovery: S04storage skipped for board goldfinger

Global Use AP ships with Meraki OS as the primary image and with default no   
country domain configured. Depending on the DHCP/DNS configurations and Cloud 
connectivity AP will either stay in Meraki or Catalyst mode to reach WLCs. To 
get more details on the procedure please look at online documentation.        

We have currently detected the Access Point is in Day 0 mode. i.e doesn't have
a persona yet. AP will proceed for offline migration shortly. Offline         
migration procedure will check if a Catalyst WLC is present in the network and
automatically migrate to Catalyst if a valid one is detected (>= IOS XE 17.15)

Offline migration can take up to 15 minutes to take a decision. To get logs   
and details on the current state of offline migration procedure, please type  
'offline-migration-info' command after <Meraki> console prompt.

If the intent for the Access Point is to be connected via Meraki mode, resolve
the Cloud connectivity and follow the Dashboard procedure to claim the device 
on the network.

What the Boot Logs Reveal

Early in the boot process, the AP reports:

Meraki Mode Selected

However, later the AP reports:

“We have currently detected the Access Point is in Day 0 mode. i.e doesn’t have a persona yet.”

At first glance, these statements appear contradictory, but they are not.

The AP:

  1. Boots using the Meraki OS image,
  2. enters Day-0 onboarding logic,
  3. then evaluates whether it should become:
    • a Meraki AP,
    • or a Catalyst AP.

This means the AP is initially operating in a temporary onboarding state before persona commitment occurs.

This is a major departure from traditional Cisco AP behavior, where:

  • CAPWAP discovery begins immediately,
  • And the AP already knows it is a Catalyst AP.

CW917x Universal APs behave differently because they support:

  • Meraki mode,
  • Catalyst mode,
  • and migration between the two.

What “Persona” Actually Means

Persona determines:

  • management plane,
  • operational behavior,
  • onboarding workflow,
  • cloud interaction,
  • regulatory handling,
  • controller expectations.

The AP is effectively deciding:

Meraki Persona
vs
Catalyst Persona

Before the standard controller discovery fully matters.

Why the “8 Minute Timer” Can be Misleading

The Cisco workflow diagram references an 8-minute wait timer.

However, the actual AP logs state:

“Offline migration can take up to 15 minutes to take a decision.”

This suggests two separate timers exist internally.

Likely architecture:

TimerFunction
~8 minutesMeraki cloud reachability timeout
~15 minutesFull offline migration workflow window

This means:

Cloud timeout

Entire migration workflow

The AP likely performs:

  1. Cloud connectivity checks
  2. Persona evaluation
  3. DHCP Option 43 FOM parsing
  4. DNS-based migration checks
  5. WLC reachability validation
  6. IOS-XE compatibility validation
  7. Regulatory/domain evaluation

before making a final onboarding decision.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.