wiki:expansion/gw16167

GW16167 M.2 E-Key 802.11ah (HaLow) radio

The GW16167 M.2 E-Key Sub-1GHz 802.11ah radio uses the second-generation MorseMicro MM8108 chip which offers improvements in range and throughput (up to 43.33Mbps) over the first generation MM6108.

NOTE: The GW16167 requires an M.2 E-Key socket with USB 2.0. This may require an adapter for the Venice SBCs

IEEE 802.11ah is a wireless networking protocol published in 2017 called Wi-Fi HaLow as an amendment of the IEEE 802.11-2007 wireless networking standard. It uses 900 MHz license-exempt bands to provide extended-range Wi-Fi networks, compared to conventional Wi-Fi networks operating in the 2.4 GHz, 5 GHz and 6 GHz bands. It also benefits from lower energy consumption, allowing the creation of large groups of stations or sensors that cooperate to share signals, supporting the concept of the Internet of things (IoT). The protocol's low power consumption competes with Bluetooth, LoRa, and Zigbee, and has the added benefit of higher data rates and wider coverage range.

The radio communicates over the USB 2.0 bus

Datasheets:

WiFi Details:

  • WiFi HaLow 802.11ah 850-950MHz bands 1/2/4/8MHz channel width 26dBm max output power and 43.3Mbps theoretical maximum transmission rate

Software Details:

M.2 Pinout

Gateworks follows the wider M.2 spec for E-Key signalling.

M.2 Pin Details:

  • M2.2: 3.3VDC
  • M2.3: USB+
  • M2.4: 3.3VDC
  • M2.5: USB-
  • M2.56: W_DISABLE1# routed to the RESET_N pin of the MM8108 module a 200k pu to VDD_3P3
  • M2.54: W_DISABLE2# routed to the WAKE pin of the MM8108 module with a 10k pu to VDD_3P3
  • M2.72: 3.3VDC
  • M2.74: 3.3VDC
  • M.2 various pins GND, per M.2 E-Key Spec (such as 1,7, 33,39,45,51,57,63,69,75)

Antenna

The antenna port is MMCX, 50 ohms impedance.

The antenna type should be a rod and a +3.4dBi and 50 ohms impedance.

To maintain the FCC cert from MorseMicro module, a certified antenna needs to be used.

The certified antenna is a Kyocera X9000984-4GDSMB , Gateworks PN GW10156

Note, a pigtail, MMCX to SMA will be needed with the above antenna. This is the Gateworks GW10074 Pigtail Cable

Certifications

The MM8108-MF15457 from MorseMicro has modular certifications at the following:

  • FCC Part 15

Note, these certifications are only with the MorseMicro recommended antennas.

Note, while the module may be certified, often the final entire product (SBC, power supply, wireless cards, enclosure) have to be put through a final certification.

Europe Use

EU restrictions:

  • Channels: 1 MHz and 2 Mhz channels only
  • Duty cycle: 10% for AP, 2.8% for STA (measure over an hour). Can transmit for 360 seconds every hour as an AP, 100 seconds per hour as STA
  • Power:
    • 16.13 dBm EIRP for non audio video
    • 12 dBm EIRP without duty cycling requirement for certain audio & video applications (EU Decision 2022/180)

Notes:

  1. The firmware will try to spread transmissions out across the hour
  2. There is a burst mode too that allows full throughput up to duty cycle. Caveat, on AP there is a slight reduction to allow for beacons across the hour
  3. Setting the country code as EU or UK in firmware (config store), will impose these restrictions. A One time programmable fuse can also be set to ensure compliance.

Software

Pre-Built Software Images

The mm8108 driver is supported in our latest pre-built images:

Driver

The mm8108 on the GW16167 is supported by the open-source out-of-tree Linux kernel driver from MorseMicro. This driver is included in the Gateworks Ubuntu pre-built images and the below instructions are only for if building is needed.

Building with the Gateworks Venice BSP:

  • coming soon

hostapd and wpa_supplicant

MorseMicro has a custom version of hostapd and wpa_supplicant with support added for 802.11ah. For most of the added configuration options there is no current way to pass them via ieee80211 APIs with nl80211 so instead the configuration is supplied via vendor-specific commands using the morse_cli userspace application. These are typically built as hostapd_s1g and wpa_supplicant_s1g so that they can coexist with the standard tools.

morse_cli

The morse_cli userspace application can be used to interact with the driver. It communicates over netlink so the interface must be up before you can talk to it. Much of the functionality is present for hostapd_s1g and wpa_supplicant_s1g to use.

Examples:

# make sure interface is up
ifconfig wlan0 up
# morse_cli --interface=wlan0 hw_version
HW Version: MM8108
# morse_cli --interface=wlan0 version 
Morse_cli Version: rel_1_12_5_2024_Jul_25-4-g3541610
FW Version: rel_1_12_4_2024_Jun_11
# morse_cli channel
Full Channel Information
        Operating Frequency: 916000 kHz
        Operating BW: 8 MHz
        Primary BW: 2 MHz
        Primary Channel Index: 0
  • note if not specified the interface defaults to wlan0

Kernel Patches

There is a small set of kernel patches from MorseMicro which may improve the experience for 802.11ah for specific use cases. Gateworks has found these patches to be unnecessary for most use cases including AP, STA, and 802.11s MESH. These patches from MorseMicro exist for several LTS kernels at https://github.com/MorseMicro/linux

Here is an evaluation of the various patches for a 6.6 kernel:

A basic AP/station HaLow network without powersave requirements or extended channel switch will function without these patches.

It has been reported that with these kernel patches have not caused any noticeable obvious issues with other mac80211 radios

OpenWrt

Support has been added for the GW16167 to the Gateworks OpenWrt packages for the 24.10 branch:

The morse_driver and morse-fw packages are required and included in the pre-built Gateworks OpenWrt image for venice: https://dev.gateworks.com/venice/images/openwrt-venice.img.gz OpenWrt will recognize the interface as a generic 5Ghz radio and allow you to configure it as an AP or a STA. OpenWrt does not understand that the channels map to the sub-1GHz band. The bandwidths will map as follows:

  • 20MHz = 1MHz sub-1G
  • 40MHz = 2MHz sub-1G
  • 80MHz = 4MHz sub-1G
  • 160MHz = 8MHz sub-1G

Please note that WiFi interfaces do not appear in /sys/class/net in OpenWrt.

For testing HaLow AP/STA/Mesh, Gateworks currently recommends avoiding the OpenWrt UCI layer for configuration of the interface, as it is not yet fully compatible with all features (i.e. WPA3 setup) out-of-the-box. Instead, a reliable approach is to have UCI not configure the HaLow radio/interface, and manually set it up via the s1g tools (wpa_supplicant_s1g, hostapd_s1g), explained in the Configuration section below. This route still allows for UCI / LuCI GUI to be used to configure other interfaces, bridges, etc. depending on your intended goal.

# Disable UCI’s wifi control for radio0 (gw16167)
uci set wireless.radio0.disabled='1'
uci commit wireless
# Potentially setup firewall zones here

# Setup interface manually
# i.e.
iw phy phy0 interface add wlan0 type managed
ifconfig wlan0 up
# For quick testing, allow incoming traffic 
/etc/init.d/firewall stop

# Now bring up network with hostapd_s1g or wpa_supplicant_s1g

Note: By default, the OpenWrt firewall will block incoming data from wlan0 as /etc/config/firewall does not assign it into a zone. For testing, you can stop and disable the firewall, or configure it properly according to the OpenWrt firewall documentation.

Channel Mapping

The HaLow channels are mapped to standard 802.11 channels:

  • US
S1G Op Class Global Op Class Channel Bandwidth Channel Number Center Frequency
1 68 1 1 902.5
1 68 1 3 903.5
1 68 1 5 904.5
1 68 1 7 905.5
1 68 1 9 906.5
1 68 1 11 907.5
1 68 1 13 908.5
1 68 1 15 909.5
1 68 1 17 910.5
1 68 1 19 911.5
1 68 1 21 912.5
1 68 1 23 913.5
1 68 1 25 914.5
1 68 1 27 915.5
1 68 1 29 916.5
1 68 1 31 917.5
1 68 1 33 918.5
1 68 1 35 919.5
1 68 1 37 920.5
1 68 1 39 921.5
1 68 1 41 922.5
1 68 1 43 923.5
1 68 1 45 924.5
1 68 1 47 925.5
1 68 1 49 926.5
1 68 1 51 927.5
2 69 2 2 903.0
2 69 2 6 905.0
2 69 2 10 907.0
2 69 2 14 909.0
2 69 2 18 911.0
2 69 2 22 913.0
2 69 2 26 915.0
2 69 2 30 917.0
2 69 2 34 919.0
2 69 2 38 921.0
2 69 2 42 923.0
2 69 2 46 925.0
2 69 2 50 927.0
2 70 4 8 906.0
2 70 4 16 910.0
2 70 4 24 914.0
2 70 4 32 918.0
2 70 4 40 922.0
2 70 4 48 926.0
2 71 8 12 908.0
2 71 8 28 916.0
2 71 8 44 924.0

Configuration (AP, STA, Mesh)

The changes made by MorseMicro to hostap add a number of parameters to hostapd.conf:

  • ieee80211ah: IEEE 802.11ah (S1G) supported
  • s1g_prim_chwidth: Sub-1 GHz primary channel bandwidth
  • s1g_prim_1mhz_chan_index: Sub-1 GHz primary 1MHz channel index
  • s1g_capab: S1G capabilities (list of flags)
  • s1g_traveling_pilots: Sub-1 Ghz traveling pilots
  • s1g_bss_color: Sub-1 GHz BSS color (0-7).
  • s1g_max_mpdu: Sub-1 GHz MPDU maximum length
  • s1g_ampdu: Sub-1 GHz A-MPDU support
  • s1g_max_ampdu_len_exp: Sub-1 GHz A-MPDU length exponent
  • s1g_basic_mcs_nss_set: Sub-1 GHz basic NSS/MCS support

For documentation on these refer to the code:

Below are examples for configuring WPA2/WPA3 AP + STA, along with WPA3 Mesh.

AP & STA

  • Infrastructure mode using WPA2:
    • AP:
      cat << EOF > hostapd_s1g_wpa2.conf
      interface=wlan0
      logger_syslog=-1
      logger_syslog_level=2
      logger_stdout=-1
      logger_stdout_level=2
      ctrl_interface=/var/run/hostapd
      ctrl_interface_group=0
      ssid=HaLow-WPA2
      country_code=US
      hw_mode=a
      beacon_int=100
      dtim_period=2
      max_num_sta=255
      rts_threshold=-1
      fragm_threshold=-1
      macaddr_acl=0
      auth_algs=3
      ignore_broadcast_ssid=0
      wmm_enabled=1
      wmm_ac_bk_cwmin=4
      wmm_ac_bk_cwmax=10
      wmm_ac_bk_aifs=7
      wmm_ac_bk_txop_limit=0
      wmm_ac_bk_acm=0
      wmm_ac_be_aifs=3
      wmm_ac_be_cwmin=4
      wmm_ac_be_cwmax=10
      wmm_ac_be_txop_limit=0
      wmm_ac_be_acm=0
      wmm_ac_vi_aifs=2
      wmm_ac_vi_cwmin=3
      wmm_ac_vi_cwmax=4
      wmm_ac_vi_txop_limit=94
      wmm_ac_vi_acm=0
      wmm_ac_vo_aifs=2
      wmm_ac_vo_cwmin=2
      wmm_ac_vo_cwmax=3
      wmm_ac_vo_txop_limit=47
      wmm_ac_vo_acm=0
      ieee80211ah=1
      s1g_prim_chwidth=1
      s1g_prim_1mhz_chan_index=0
      s1g_capab=[SHORT-GI-ALL]
      eapol_key_index_workaround=0
      own_ip_addr=127.0.0.1
      #918.5MHz@1
      #channel=33
      #op_class=68
      #907MHz@2
      #channel=10
      #op_class=69
      #922Mhz@4
      #channel=40
      #op_class=70
      #916MHz@8
      channel=28
      op_class=71
      # WPA2 security
      wpa=2
      wpa_passphrase=strongpassword123
      wpa_key_mgmt=WPA-PSK
      wpa_pairwise=TKIP
      rsn_pairwise=CCMP
      EOF
      hostapd_s1g ./hostapd_s1g_wpa2.conf -B
      ifconfig wlan0 192.168.1.1
      iperf3 -s
      
    • STA:
      #wpa_passphrase generates WPA2 wpa_supplicant configuration
      wpa_passphrase_s1g HaLow-WPA2 strongpassword123 > wpa_supplicant_s1g.conf
      #ensure wlan0 interface is up
      ifconfig wlan0 up
      #Start wpa_supplicant_s1g, send to background (replace & with -d for debug)
      wpa_supplicant_s1g -i wlan0 -c ./wpa_supplicant_s1g.conf &
      #assign static IP; DHCP is not part of this example
      ifconfig wlan0 192.168.1.128
      iperf3 -c 192.168.1.1
      
  • Infrastructure mode using WPA3:
    • AP:
      cat << EOF > hostapd_s1g_wpa3.conf
      interface=wlan0
      logger_syslog=-1
      logger_syslog_level=2
      logger_stdout=-1
      logger_stdout_level=2
      ctrl_interface=/var/run/hostapd
      ctrl_interface_group=0
      ssid=HaLow-WPA3
      country_code=US
      hw_mode=a
      beacon_int=100
      dtim_period=2
      max_num_sta=255
      rts_threshold=-1
      fragm_threshold=-1
      macaddr_acl=0
      auth_algs=3
      ignore_broadcast_ssid=0
      wmm_enabled=1
      wmm_ac_bk_cwmin=4
      wmm_ac_bk_cwmax=10
      wmm_ac_bk_aifs=7
      wmm_ac_bk_txop_limit=0
      wmm_ac_bk_acm=0
      wmm_ac_be_aifs=3
      wmm_ac_be_cwmin=4
      wmm_ac_be_cwmax=10
      wmm_ac_be_txop_limit=0
      wmm_ac_be_acm=0
      wmm_ac_vi_aifs=2
      wmm_ac_vi_cwmin=3
      wmm_ac_vi_cwmax=4
      wmm_ac_vi_txop_limit=94
      wmm_ac_vi_acm=0
      wmm_ac_vo_aifs=2
      wmm_ac_vo_cwmin=2
      wmm_ac_vo_cwmax=3
      wmm_ac_vo_txop_limit=47
      wmm_ac_vo_acm=0
      ieee80211ah=1
      s1g_prim_chwidth=1
      s1g_prim_1mhz_chan_index=0
      s1g_capab=[SHORT-GI-ALL]
      eapol_key_index_workaround=0
      own_ip_addr=127.0.0.1
      channel=28
      op_class=71
      #WPA3 / SAE configuration
      wpa=2
      wpa_key_mgmt=SAE
      ieee80211w=2
      sae_pwe=2
      rsn_pairwise=CCMP
      sae_password=HalowDemo123
      EOF
      #Start the AP with configuration in background.
      #For quick (foreground) debugging, remove the -B flag
      hostapd_s1g ./hostapd_s1g_wpa3.conf -B
      #Configure static IP
      ifconfig wlan0 192.168.1.1
      #Start iperf3 server for connection testing
      iperf3 -s
      
    • STA:
      #wpa_passphrase_s1g is only to create WPA2 configurations; create conf manually
      cat << EOF > wpa_supplicant_s1g_wpa3.conf
      update_config=1
      
      pmf=2
      sae_pwe=1
      network={
              ssid="HaLow-WPA3"
              key_mgmt=SAE
              pairwise=CCMP
              psk="strongpassword123"
      }
      EOF
      
      #Ensure interface is up
      ifconfig wlan0 up
      #Start wpa_supplicant_s1g, send to background (replace & with -d for debug)
      wpa_supplicant_s1g -i wlan0 -c ./wpa_supplicant_s1g_wpa3.conf &
      #Configure static IP, as dhcp is not present in example.
      ifconfig wlan0 192.168.1.128
      iperf3 -c 192.168.1.1
      

Mesh

  • 802.11s Mesh using WPA3:
    cat << EOF > wpa_supplicant_s1g.conf
    country=US
    ctrl_interface=/var/run/wpa_supplicant_s1g
    sae_pwe=1
    
    max_peer_links=10
    mesh_fwding=1
    network={
            ssid="HaLow-WPA3-Mesh"
            key_mgmt=SAE
            mode=5
            # 8MHz width at 916MHz
            channel=28
            op_class=71
            country="US"
            s1g_prim_chwidth=1
            s1g_prim_1mhz_chan_index=3
            mesh_rssi_threshold=-85
            sae_password="strongpassword123"
            pairwise=CCMP
            ieee80211w=2
            beacon_int=1000
    }
    EOF
    ifconfig wlan0 up
    wpa_supplicant_s1g -iwlan0 -c wpa_supplicant_s1g.conf &
    
  • Note: wpa_supplicant_s1g automatically configures the interface type from 'managed' to 'mesh point' when configured for mesh. It is cleaner practice and recommended for production systems, to setup the interface as a mesh point explicitly.
    #optional: delete wlan0 interface
    iw dev wlan0 del
    iw phy phy0 interface add mesh0 type mp
    
    #morse_cli sanity check
    #morse_cli requires interface to talk to the driver; ensure interface is up 
    ifconfig mesh0 up
    #morse_cli defaults to wlan0, so to use it we need to manually state -i mesh0
    morse_cli -i mesh0 version
    

More information on mesh and 802.11s can be found on our mesh networks wiki page.

Last modified 23 hours ago Last modified on 10/16/2025 08:44:21 PM
Note: See TracWiki for help on using the wiki.