Openwrt 23.05 | fgh100m | MM6108

Hi ,
I am using fgh100m (mm6108) in our openwrt board. We use the SPI interface for the connections. When integrating, we found the following issue:

root@openwrt:~# dmesg | grep morse
[    8.004233] morse micro driver registration. Version 0-rel_1_14_1_2024_Dec_05
[    8.023843] Modules linked in: morse(+) mac80211 libchacha20poly1305 iptable_nat ipt_REJECT ebtable_nat ebtable_filter ebtable_broute dot11ah chacha_neon cfg80211 xt_time xt_tcpudp xt_tcpmss xt_statistic xt_state xt_recent xt_quota xt_policy xt_pkttype xt_owner xt_nat xt_multiport xt_mark xt_mac xt_limit xt_length xt_hl xt_helper xt_esp xt_ecn xt_dscp xt_conntrack xt_connmark xt_connlimit xt_connlabel xt_connbytes xt_comment xt_cgroup xt_addrtype xt_TCPMSS xt_REDIRECT xt_NETMAP xt_MASQUERADE xt_LOG xt_IPMARK xt_HL xt_DSCP xt_CLASSIFY usbserial ts_kmp ts_fsm ts_bm slhc sch_cake qmi_wwan poly1305_neon nft_reject_ipv6 nft_reject_ipv4 nft_reject_inet nft_reject nft_redir nft_quota nft_objref nft_numgen nft_nat nft_masq nft_log nft_limit nft_hash nft_flow_offload nft_fib_ipv6 nft_fib_ipv4 nft_fib nft_ct nft_counter nft_compat nft_chain_nat nf_tables nf_reject_ipv4 nf_nat nf_log_syslog nf_flow_table nf_conntrack_netlink nf_conncount libcurve25519_generic libchacha iptable_mangle
[    8.251256] lr : morse_mac_create+0x168/0x1e0 [morse]
[    8.338635]  morse_mac_create+0x168/0x1e0 [morse]
[    8.343357]  morse_pre_assoc_peer_update_rx_info+0x2f54/0x3e10 [morse]
[    8.388941]  morse_spi_init+0x24/0xef8 [morse]
[    8.393403]  init_module+0x8c/0xb4 [morse]
[    8.441206] morse_spi spi1.0: ieee80211_alloc_hw failed
[    8.446511] morse_spi spi1.0: morse_mac_create failed
[    8.451555] morse_spi: probe of spi1.0 failed with error -12

Hi @sankarganesh

The driver is reporting that ieee80211_alloc_hw is failing. This will either be because there is not enough memory, or because the driver thinks a function op doesn’t need to be implemented - which could happen if you are using a backported mac80211.

Can you specify your kernel and mac80211 versions? If they are different, specify the mac80211 version in the build of the driver using by setting CONFIG_BACKPORT_VERSION.

Hi @ajudge ,

I am using generic Openwrt 23.05.4. Here is the details you needed,
Linux: linux-5.15.162
mac80211: 6.1.97-1

Please specify CONFIG_BACKPORT_VERSION=6.1.97 in your driver build.

Hi @ajudge ,
It is already in a backported version.
PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v6.1.97/

openwrt-23.05.4/build_dir/target-aarch64_cortex-a53_musl/linux-mediatek_filogic/backports-6.1.97-1/

Below patches i am using

999-001-morse-mac80211-disable-robust-management-frame-without-sta-check.patch
999-002-morse-mac80211_mlme_s1g_ecsa_support.patch
999-003-morse-mac80211_tx_s1g_AP_ecsa_support.patch
999-004-morse_mac80211_IBSS_bridge_support.patch
999-005-morse_mac80211_mesh_support.patch
999-006-morse-mac80211-mlme-ps-recalc-for-dynamic-ps-v5.15.patch
999-007-morse-mac80211_ndp_block_ack.patch
999-024-mlme_beacon_wait.patch
999-025-cfg-nl-ignore-chan.patch
999-026-halow_mesh_optimizations.patch

Memory Information :

root@PIAP:~# df -h
Filesystem Size Used Available Use% Mounted on
/dev/root 16.0M 16.0M 0 100% /rom
tmpfs 243.3M 132.0K 243.2M 0% /tmp
/dev/ubi0_2 5.7M 188.0K 5.2M 3% /overlay
overlayfs:/overlay 5.7M 188.0K 5.2M 3% /
tmpfs 512.0K 0 512.0K 0% /dev

Can you share the command you are using to build the Morse Micro driver?

Just giving “make V=sc”

Also tried using > ./scripts/morse_setup.sh -i -b ekh_XXX before running make

target_diffconfig

CONFIG_TARGET_mediatek=y
CONFIG_TARGET_mediatek_filogic=y
CONFIG_TARGET_mediatek_filogic_DEVICE_XXX_YYY=y

CONFIG_PACKAGE_morsectrl=y
CONFIG_PACKAGE_morse-board-config-hotplug-model=y
CONFIG_PACKAGE_luci-app-ekhwizards=y

CONFIG_PACKAGE_kmod-morse=y
CONFIG_PACKAGE_netifd-morse=y
CONFIG_PACKAGE_morse-fw-6108=y

Could you please share any specific steps to integrate mm6108 and build on the generic OpenWrt 23.05.4?

Target: Mediatek Filogic (MT7981)

Hi @sankarganesh

I’m a bit confused. Originally I thought you were using generic OpenWrt 23.05, but ./scripts/morse_setup.sh -i -b ekh_XXX suggests you’re using our OpenWrt fork. Can you confirm exactly which OpenWrt you are using.

If you have integrated our driver into generic OpenWrt, how have you done that?

I would recommend grabbing our “minimal” feed, and following the instructions in the README. Find the minimal feed here: GitHub - MorseMicro/morse-feed at mm/openwrt-23.05

I tried both.

Using your openwrt source: GitHub - MorseMicro/openwrt
and another generic one. In both, I am facing an issue.

Let me try the minimal feed version you suggested, and let you know

HI @ajudge ,
The patches were not applied properly. I used generic Openwrt 23.05 and add the morse feeds mm/openwrt-23.05. and followed the steps.

for dir in $MYDIR/patches/*
++ basename ./feeds/morse/patches/mac80211

  • basename=mac80211
  • case $basename in
  • ‘[’ -d ./feeds/morse/patches/mac80211 ‘]’
  • echo === Applying mac80211 patches…
    === Applying mac80211 patches…
  • for patch in $dir/*.patch
  • patch -p1
    patching file package/kernel/mac80211/patches/subsys/306-01-v6.2-wifi-mac80211-add-internal-handler-for-wake_tx_queue.patch
    Reversed (or previously applied) patch detected! Assume -R? [n]
    Apply anyway? [n]
    Skipping patch.
    1 out of 1 hunk ignored – saving rejects to file package/kernel/mac80211/patches/subsys/306-01-v6.2-wifi-mac80211-add-internal-handler-for-wake_tx_queue.patch.rej
    patching file package/kernel/mac80211/patches/subsys/306-02-v6.2-wifi-mac80211-add-wake_tx_queue-callback-to-drivers.patch
    Reversed (or previously applied) patch detected! Assume -R? [n]
    Apply anyway? [n]
    Skipping patch.
    1 out of 1 hunk ignored – saving rejects to file package/kernel/mac80211/patches/subsys/306-02-v6.2-wifi-mac80211-add-wake_tx_queue-callback-to-drivers.patch.rej
    patching file package/kernel/mac80211/patches/subsys/306-03-v6.2-wifi-mac80211-Drop-support-for-TX-push-path.patch
    Reversed (or previously applied) patch detected! Assume -R? [n]
    Apply anyway? [n]
    Skipping patch.
    1 out of 1 hunk ignored – saving rejects to file package/kernel/mac80211/patches/subsys/306-03-v6.2-wifi-mac80211-Drop-support-for-TX-push-path.patch.rej
    patching file package/kernel/mac80211/patches/subsys/306-04-v6.2-wifi-realtek-remove-duplicated-wake_tx_queue.patch
    Reversed (or previously applied) patch detected! Assume -R? [n]
    Apply anyway? [n]
    Skipping patch.
    1 out of 1 hunk ignored – saving rejects to file package/kernel/mac80211/patches/subsys/306-04-v6.2-wifi-realtek-remove-duplicated-wake_tx_queue.patch.rej
    patching file package/kernel/mac80211/patches/subsys/310-v6.2-mac80211-add-support-for-restricting-netdev-features.patch
    Hunk #2 FAILED at 46.
    Hunk #3 FAILED at 70.
    2 out of 18 hunks FAILED – saving rejects to file package/kernel/mac80211/patches/subsys/310-v6.2-mac80211-add-support-for-restricting-netdev-features.patch.rej
    patching file package/kernel/mac80211/patches/subsys/319-wifi-mac80211-mesh-fast-xmit-support.patch
    patching file package/kernel/mac80211/patches/subsys/320-wifi-mac80211-use-mesh-header-cache-to-speed-up-mesh.patch
    Hunk #4 FAILED at 96.
    1 out of 4 hunks FAILED – saving rejects to file package/kernel/mac80211/patches/subsys/320-wifi-mac80211-use-mesh-header-cache-to-speed-up-mesh.patch.rej
    ++ failure
    ++ echo Failed to adapt your existing OpenWrt. The most probably cause
    Failed to adapt your existing OpenWrt. The most probably cause
    ++ echo of this is that you have local changes that are incompatible.
    of this is that you have local changes that are incompatible.
    ++ echo You should look at the particular patch/operation that failed,
    You should look at the particular patch/operation that failed,
    ++ echo and adjust it appropriately.
    and adjust it appropriately.
    ++ exit 1

Please try from your end and let me know

Hi @ajudge ,
We resolved the patching issue, and here is our output.

[    7.956039] Morse Micro Dot11ah driver registration. Version 0-rel_1_14_1_2024_Dec_05
[    7.991632] morse micro driver registration. Version 0-rel_1_14_1_2024_Dec_05
[    7.999409] morse_spi spi1.0: morse_of_probe: Reading gpio pins configuration from device tree
[    8.008254] uaccess char driver major number is 249
[    8.013277] morse_io: Device node ‘/dev/morse_io’ created successfully
[    8.114634] morse_spi spi1.0: Loaded firmware from morse/mm6108.bin, size 430512, crc32 0xb25c264b
[    8.123782] morse_spi spi1.0: Loaded BCF from morse/bcf_default.bin, size 972, crc32 0x0ac58c9e
[    8.757048] invalid GPIO -2
[    8.759858] invalid GPIO -2
[    8.762641] invalid GPIO -2
[    8.765422] invalid GPIO -2
[    8.768203] invalid GPIO -2
[    8.789141] morse_spi spi1.0: Driver loaded with kernel module parameters
[    8.795931] morse_spi spi1.0:     enable_1mhz_probes                      : Y
[    8.803068] morse_spi spi1.0:     enable_hw_scan                          : Y
[    8.810195] morse_spi spi1.0:     enable_pv1                              : N
[    8.817315] morse_spi spi1.0:     enable_page_slicing                     : N
[    8.824444] morse_spi spi1.0:     log_modparams_on_boot                   : Y
[    8.831570] morse_spi spi1.0:     enable_mcast_rate_control               : N
[    8.838690] morse_spi spi1.0:     enable_mcast_whitelist                  : Y
[    8.845820] morse_spi spi1.0:     ocs_type                                : 1
[    8.852949] morse_spi spi1.0:     enable_wiphy                            : 0
[    8.860074] morse_spi spi1.0:     enable_auto_mpsw                        : Y
[    8.867195] morse_spi spi1.0:     duty_cycle_probe_retry_threshold        : 2500
[    8.874582] morse_spi spi1.0:     duty_cycle_mode                         : 0
[    8.881714] morse_spi spi1.0:     enable_auto_duty_cycle                  : Y
[    8.888835] morse_spi spi1.0:     dhcpc_lease_update_script               : /morse/scripts/dhcpc_update.sh
[    8.898477] morse_spi spi1.0:     enable_ibss_probe_filtering             : Y
[    8.905607] morse_spi spi1.0:     enable_dhcpc_offload                    : N
[    8.912736] morse_spi spi1.0:     enable_arp_offload                      : N
[    8.919862] morse_spi spi1.0:     enable_bcn_change_seq_monitor           : 0
[    8.926983] morse_spi spi1.0:     enable_cac                              : 0
[    8.934109] morse_spi spi1.0:     max_mc_frames                           : 10
[    8.941323] morse_spi spi1.0:     tx_max_power_mbm                        : 2200
[    8.948702] morse_spi spi1.0:     enable_twt                              : Y
[    8.955832] morse_spi spi1.0:     enable_mac80211_connection_monitor      : N
[    8.962958] morse_spi spi1.0:     enable_airtime_fairness                 : N
[    8.970086] morse_spi spi1.0:     enable_raw                              : Y
[    8.977206] morse_spi spi1.0:     max_aggregation_count                   : 0
[    8.984332] morse_spi spi1.0:     max_rate_tries                          : 1
[    8.991458] morse_spi spi1.0:     max_rates                               : 4
[    8.998578] morse_spi spi1.0:     enable_watchdog_reset                   : N
[    9.005704] morse_spi spi1.0:     watchdog_interval_secs                  : 30
[    9.012916] morse_spi spi1.0:     enable_watchdog                         : Y
[    9.020041] morse_spi spi1.0:     country                                 : US
[    9.027249] morse_spi spi1.0:     enable_cts_to_self                      : N
[    9.034376] morse_spi spi1.0:     enable_rts_8mhz                         : N
[    9.041502] morse_spi spi1.0:     enable_trav_pilot                       : Y
[    9.048622] morse_spi spi1.0:     enable_sgi_rc                           : Y
[    9.055748] morse_spi spi1.0:     enable_mbssid_ie                        : N
[    9.062875] morse_spi spi1.0:     virtual_sta_max                         : 0
[    9.070000] morse_spi spi1.0:     thin_lmac                               : 0
[    9.077120] morse_spi spi1.0:     enable_dynamic_ps_offload               : Y
[    9.084244] morse_spi spi1.0:     enable_ps                               : 2
[    9.091379] morse_spi spi1.0:     enable_subbands                         : 2
[    9.098499] morse_spi spi1.0:     enable_survey                           : Y
[    9.105627] morse_spi spi1.0:     mcs10_mode                              : 0
[    9.112753] morse_spi spi1.0:     mcs_mask                                : 1023
[    9.120139] morse_spi spi1.0:     no_hwcrypt                              : 0
[    9.127259] morse_spi spi1.0:     enable_ext_xtal_init                    : N
[    9.134387] morse_spi spi1.0:     enable_otp_check                        : 1
[    9.141512] morse_spi spi1.0:     bcf                                     :
[    9.148546] morse_spi spi1.0:     serial                                  : default
[    9.156195] morse_spi spi1.0:     debug_mask                              : 8
[    9.163322] morse_spi spi1.0:     test_mode                               : 0
[    9.170455] morse_spi spi1.0:     tx_status_lifetime_ms                   : 15000
[    9.177922] morse_spi spi1.0:     tx_queued_lifetime_ms                   : 1000
[    9.185308] morse_spi spi1.0:     max_txq_len                             : 32
[    9.192520] morse_spi spi1.0:     default_cmd_timeout_ms                  : 600
[    9.199819] morse_spi spi1.0:     hw_reload_after_stop                    : 5
[    9.206939] morse_spi spi1.0:     enable_short_bcn_as_dtim_override       : -1
[    9.214155] morse_spi spi1.0:     fw_bin_file                             :
[    9.221195] morse_spi spi1.0:     sdio_reset_time                         : 400
[    9.228489] morse_spi spi1.0:     macaddr_suffix                          : 00:00:00
[    9.236222] morse_spi spi1.0:     macaddr_octet                           : 255
[    9.243522] morse_spi spi1.0:     max_total_vendor_ie_bytes               : 514
[    9.250822] morse_spi spi1.0:     coredump_include                        : 1
[    9.257942] morse_spi spi1.0:     coredump_method                         : 1
[    9.265067] morse_spi spi1.0:     enable_coredump                         : Y
[    9.272196] morse_spi spi1.0:     sdio_clk_debugfs                        :
[    9.279237] morse_spi spi1.0:     spi_use_edge_irq                        : N
[    9.286358] morse_spi spi1.0:     spi_clock_speed                         : 50000000
[    9.294091] morse_spi spi1.0:     enable_mm_vendor_ie                     : Y
[    9.301217] morse_spi spi1.0:     fixed_guard                             : 0
[    9.308338] morse_spi spi1.0:     fixed_ss                                : 1
[    9.315464] morse_spi spi1.0:     fixed_bw                                : 2
[    9.322589] morse_spi spi1.0:     fixed_mcs                               : 4
[    9.329718] morse_spi spi1.0:     enable_fixed_rate                       : N
[    9.337332] usbcore: registered new interface driver morse_usb


In between the logs, there is a GPIO error. Also, we didn’t see any interfaces created for Morse, only phy we can able to see.

Could you help me with a sample UCI wireless configuration file?

Hi @sankarganesh , if you’re using the netifd-morse package it should have installed a hotplug script which creates config in /etc/config/wireless to bring up wlan0. See the README in GitHub - MorseMicro/morse-feed at mm/openwrt-23.05 for more info.

Can you share what’s in your /etc/config/wireless currently?

(note that if there’s nothing in /etc/config/wireless, it’s expected that wlan0 does not exist, as there’s a hotplug script which removes the auto-created one to avoid it interfering with bring-up)

Hi @james.haggerty ,
The driver issues are resolved, and we can have the output in iwinfo

root@OpenWrt:/# iwinfo
wlan0 ESSID: “MorseMicro”
Access Point: BC:2A:33:96:B1:43
Mode: Master Channel: 7 (866.500 MHz) HT Mode: unknown
Center Channel 1: 7 2: unknown
Tx-Power: 0 dBm Link Quality: unknown/70
Signal: unknown Noise: -110 dBm
Bit Rate: unknown
Encryption: WPA3 SAE (CCMP)
Type: dot11ah HW Mode(s): 802.11ah
Hardware: embedded [Morse Micro SPI-MM601X]
TX power offset: none
Frequency offset: none
Supports VAPs: yes PHY name: phy2

But SSID is not broadcasting. We do have another working Halow device, but while scanning, we are not able to detect the SSID.

Also, i would like to get some details about bcf file.

HI @james.haggerty ,
Do you have any user guide for morse_cli ?

Can you show your /etc/config/wireless file so we can confirm it is correctly configured?

The most likely issue is that you’re loading bcf_default.bin (which disables things) rather than the correct BCF for your module. This is available from: morse-firmware/bcf/quectel at main · MorseMicro/morse-firmware · GitHub

Re morse_cli, commands are a subset of morse-ctrl: https://www.morsemicro.com/resources/appnotes/MM_APPNOTE-13_Morsectrl_Guide.pdf

However, you should not need to use morse_cli in normal bring-up.

HI @james.haggerty ,
Please find the wireless config.

root@OpenWrt:/# cat /etc/config/wireless

config wifi-device ‘radio0’
option type ‘morse’
option path ‘platform/11009000.spi/spi_master/spi1/spi1.0’
option band ‘s1g’
option hwmode ‘11ah’
option reconf ‘0’
option channel ‘7’
option country ‘IN’
option bcf ‘bcf_default.bin’

config wifi-iface ‘default_radio0’
option mode ‘ap’
option wds ‘1’
option device ‘radio0’
option network ‘lan’
option ssid ‘MorseMicro’
option encryption ‘sae’
option key ‘12345678’

As you mentioned, I am using bcf_default,bin

Please find the issue we are facing when changing the bcf file

[ 7918.985262] morse micro driver registration. Version 0-rel_1_14_1_2024_Dec_05
[ 7918.992911] morse_spi spi1.0: morse_of_probe: Reading gpio pins configuration from device tree
[ 7919.001846] uaccess char driver major number is 249
[ 7919.006868] morse_io: Device node ‘/dev/morse_io’ created successfully
[ 7919.014294] morse_spi spi1.0: Loaded firmware from morse/mm6108.bin, size 430512, crc32 0xb25c264b
[ 7919.023625] morse_spi spi1.0: Loaded BCF from morse/bcf_fgh100maamd.bin, size 181819, crc32 0x35fe0da8
[ 7919.572479] morse_spi spi1.0: Wrong file format
[ 7920.122521] morse_spi spi1.0: Wrong file format
[ 7920.672760] morse_spi spi1.0: Wrong file format
[ 7920.677364] morse_spi spi1.0: morse_firmware_init failed: -1
[ 7920.683113] morse_spi_probe failed. The driver has not been loaded!
[ 7920.689396] morse_spi: probe of spi1.0 failed with error -1
[ 7920.695096] usbcore: registered new interface driver morse_usb
[ 7920.701358] kmodloader: done loading kernel modules from /etc/modules.d/morse*

HI @james.haggerty ,
Any update on this ?

I think you may have incorrectly copied that BCF file, as it’s 181819 bytes (whereas it should be less than 1kb). Is it possible you downloaded the github HTML or similar?