WiFi 7 M.2 module recommendation for AP

Hi!

I'm looking for an M.2 Wifi 7 module into my nanopi r5c that supports AP mode. I currently have an Intel BE200 but it only does 2.4GHz for AP and I can't seem to find a way to use 5 and 6 GHz (in iw list it says NO-IR). Under armbian and kernel 6.14 I managed to get 5GHz working in 40MHz bandwith and on channel 149 tho.

I'm looking for a reliable card for wifi 7 at the moment and I would appreciate any recommendation.

Thanks in advance.

choose two?

1 Like

The forum search will hand you prior discussions why retrofitting x86_64 with WLAN cards for AP usage is not all that sensible, most of those apply to your system verbatim.

it's a great client card, but as with most Intel adapters, not good for AP mode...

1 Like

try the mediatek mt7925 & avoid any qualcomm/realtek

With any card - firmware is still a bit of a challenge...

I can not recommend the Quectel QCNCM865 (Qualcomm WCN7850). It still has driver problems

Are you sure the problem is just no ir on that band? Like reg.db? Or is driver related?

@ercolino I'm not sure if you are asking me, but I will assume you are

Here is what I know. The driver in use is kmod-ath12k 6.12.30.6.12.6-r2 and ath12k-firmware-wcn7850 20250509-r1 on SNAPSHOT.

This is a warning message on boot. Apparently, this isn't fatal.

Thu Jun 5 13:48:09 2025 daemon.err procd: Could not find firmware /lib/firmware/ath12k/WCN7850/hw2.0/firmware-2.bin: No such file or directory

Here it is loading my AP. "Roy" is my guest lan it is bound to. Notice that hostapd has no complaints.

Tue Jun 10 10:57:43 2025 kern.info kernel: [329844.936358] ath12k_pci 0000:04:00.0 phy0-ap0: left allmulticast mode
Tue Jun 10 10:57:43 2025 kern.info kernel: [329844.942843] ath12k_pci 0000:04:00.0 phy0-ap0: left promiscuous mode
Tue Jun 10 10:57:43 2025 kern.info kernel: [329844.949240] br-roy: port 2(phy0-ap0) entered disabled state
Tue Jun 10 10:57:43 2025 daemon.notice netifd: bridge 'br-roy' link is down
Tue Jun 10 10:57:43 2025 daemon.notice netifd: Interface 'Roy' has link connectivity loss
Tue Jun 10 10:57:43 2025 daemon.notice wpa_supplicant[2569]: Set new config for phy phy0
Tue Jun 10 10:57:43 2025 daemon.notice hostapd: Set new config for phy phy0: /var/run/hostapd-phy0.conf
Tue Jun 10 10:57:43 2025 daemon.notice hostapd: Reload config for bss 'phy0-ap0' on phy 'phy0'
Tue Jun 10 10:57:43 2025 daemon.notice hostapd: Enabling beacon protection as IEEE 802.11be is enabled for this BSS
Tue Jun 10 10:57:43 2025 daemon.notice hostapd: Reloaded settings for phy phy0
Tue Jun 10 10:57:43 2025 daemon.notice netifd: Wireless device 'radio0' is now up
Tue Jun 10 10:57:43 2025 daemon.notice netifd: Network device 'phy0-ap0' link is up
Tue Jun 10 10:57:43 2025 kern.info kernel: [329845.212503] br-roy: port 2(phy0-ap0) entered blocking state
Tue Jun 10 10:57:43 2025 kern.info kernel: [329845.218201] br-roy: port 2(phy0-ap0) entered disabled state
Tue Jun 10 10:57:43 2025 kern.info kernel: [329845.223894] ath12k_pci 0000:04:00.0 phy0-ap0: entered allmulticast mode
Tue Jun 10 10:57:43 2025 kern.info kernel: [329845.230649] ath12k_pci 0000:04:00.0 phy0-ap0: entered promiscuous mode
Tue Jun 10 10:57:43 2025 kern.info kernel: [329845.237311] br-roy: port 2(phy0-ap0) entered blocking state
Tue Jun 10 10:57:43 2025 kern.info kernel: [329845.242999] br-roy: port 2(phy0-ap0) entered forwarding state
Tue Jun 10 10:57:43 2025 daemon.notice netifd: bridge 'br-roy' link is up
Tue Jun 10 10:57:43 2025 daemon.notice netifd: Interface 'Roy' has link connectivity
Tue Jun 10 10:57:45 2025 daemon.info dnsmasq[1]: read /etc/hosts - 12 names
Tue Jun 10 10:57:45 2025 daemon.info dnsmasq[1]: read /tmp/hosts/dhcp.cfg01411c - 4 names
Tue Jun 10 10:57:45 2025 daemon.info dnsmasq[1]: read /tmp/hosts/odhcpd - 8 names
Tue Jun 10 10:57:45 2025 daemon.info dnsmasq-dhcp[1]: read /etc/ethers - 0 addresses

iwinfo see it, too

root@OpenWrt:~# iwinfo phy0-ap0 info
phy0-ap0  ESSID: "OpenWRT_6ghzBE320"
          Access Point: 00:9B:08:43:94:B5
          Mode: Master  Channel: 33 (6.115 GHz)  HT Mode: EHT320
          Center Channel 1: 31 2: unknown
          Tx-Power: 30 dBm  Link Quality: unknown/70
          Signal: unknown  Noise: -96 dBm
          Bit Rate: unknown
          Encryption: WPA3 SAE (CCMP)
          Type: nl80211  HW Mode(s): 802.11ac/ax/b/be/g/n
          Hardware: 17CB:1107 1EAC:8000 [Generic MAC80211]
          TX power offset: unknown
          Frequency offset: unknown
          Supports VAPs: yes  PHY name: phy0

So far, no errors. Even channel analysis from Luci say yes, it is there

But from this laptop with an Intel Killer(TM) Wi-Fi 7 BE1750x 320MHz Wireless Network Adapter (BE200NGW), I don't see it. I just see my neighbors one. I am six feet from the router

I will be trying a different antenna today once it arrives. I have a Mediatek mt7925 coming in the mail, but it is about a week away to replace the Quectel QCNCM865 (Qualcomm WCN7850)

NONE of the Intel M.2 wifi cards work for AP

@ercolino do you think I need to add "country3=0x49" to the custom hostapd config line?

root@OpenWrt:~# iwinfo radio0 freqlist |grep \*
* 6.115 GHz (Band: 6 GHz, Channel 33) [INDOOR_ONLY]

EDIT: Naww... didn't work. I added the line

        option hostapd_options 'country3=0x49'

to the wifi-device section of /etc/config/wireless. I guess you could do this instead

uci add_list wireless.radio0.hostapd_options='country3=0x49'
uci commit
reboot

It behaves better, though, and says AP-ENABLED where it hadn't before. It still doesn't work. I'm examining the generated /var/run/hostapd-phy0.conf but I haven't found the secret. I can create a working AP on 5Ghz using AC mode. The secret for 7/6Ghz/BE eludes me.

Tue Jun 10 16:33:05 2025 kern.info kernel: [349966.334646] ath12k_pci 0000:04:00.0 phy0-ap0: left allmulticast mode
Tue Jun 10 16:33:05 2025 kern.info kernel: [349966.341128] ath12k_pci 0000:04:00.0 phy0-ap0: left promiscuous mode
Tue Jun 10 16:33:05 2025 kern.info kernel: [349966.347533] br-roy: port 2(phy0-ap0) entered disabled state
Tue Jun 10 16:33:05 2025 daemon.notice netifd: bridge 'br-roy' link is down
Tue Jun 10 16:33:05 2025 daemon.notice netifd: Interface 'Roy' has link connectivity loss
Tue Jun 10 16:33:05 2025 daemon.notice wpa_supplicant[2569]: Set new config for phy phy0
Tue Jun 10 16:33:05 2025 daemon.notice hostapd: Set new config for phy phy0: /var/run/hostapd-phy0.conf
Tue Jun 10 16:33:05 2025 daemon.notice hostapd: Restart interface for phy phy0
Tue Jun 10 16:33:05 2025 daemon.notice hostapd: Remove interface 'phy0'
Tue Jun 10 16:33:05 2025 daemon.notice hostapd: phy0-ap0: interface state ENABLED->DISABLED
Tue Jun 10 16:33:05 2025 daemon.notice hostapd: phy0-ap0: AP-DISABLED
Tue Jun 10 16:33:05 2025 daemon.notice hostapd: phy0-ap0: CTRL-EVENT-TERMINATING
Tue Jun 10 16:33:05 2025 daemon.err hostapd: rmdir[ctrl_interface=/var/run/hostapd]: Permission denied
Tue Jun 10 16:33:05 2025 daemon.notice hostapd: nl80211: deinit ifname=phy0-ap0 disabled_11b_rates=0
Tue Jun 10 16:33:05 2025 daemon.notice hostapd: nl80211: Failed to remove interface phy0-ap0 from bridge br-roy: Invalid argument
Tue Jun 10 16:33:06 2025 daemon.notice hostapd: Configuration file: data: driver=nl80211 logger_syslog=127 logger_syslog_level=2 logger_stdout=127 logger_stdout_level=2 country_code=US ieee80211d=1 ieee80211h=1 hw_mode=a beacon_int=100 he_6ghz_reg_pwr_type=0 stationary_ap=1 country3=0x49 chanlist=33 #num_global_macaddr=1 #macaddr_base= op_class=137 ieee80211ax=1 he_oper_chwidth=2 he_oper_centr_freq_seg0_idx=47 he_su_beamformer=1 he_su_beamformee=1 he_bss_color=128 he_spr_sr_control=3 he_default_pe_duration=4 he_rts_threshold=1023 he_mu_edca_qos_info_param_count=0 he_mu_edca_qos_info_q_ack=0 he_mu_edca_qos_info_queue_request=0 he_mu_edca_qos_info_txop_request=0 he_mu_edca_ac_be_aifsn=8 he_mu_edca_ac_be_aci=0 he_mu_edca_ac_be_ecwmin=9 he_mu_edca_ac_be_ecwmax=10 he_mu_edca_ac_be_timer=255 he_mu_edca_ac_bk_aifsn=15 he_mu_edca_ac_bk_aci=1 he_mu_edca_ac_bk_ecwmin=9 he_mu_edca_ac_bk_ecwmax=10 he_mu_edca_ac_bk_timer=255 he_mu_edca_ac_vi_ecwmin=5 he_mu_edca_ac_vi_ecwmax=7 he_mu_edca_ac_vi_aifsn=5 he_mu_edca_ac_vi_aci=2 he_mu_edca_ac_vi
Tue Jun 10 16:33:06 2025 daemon.notice hostapd: Enabling beacon protection as IEEE 802.11be is enabled for this BSS
Tue Jun 10 16:33:06 2025 daemon.notice hostapd: Enabling beacon protection as IEEE 802.11be is enabled for this BSS
Tue Jun 10 16:33:06 2025 kern.info kernel: [349966.802497] br-roy: port 2(phy0-ap0) entered blocking state
Tue Jun 10 16:33:06 2025 kern.info kernel: [349966.808209] br-roy: port 2(phy0-ap0) entered disabled state
Tue Jun 10 16:33:06 2025 kern.info kernel: [349966.813889] ath12k_pci 0000:04:00.0 phy0-ap0: entered allmulticast mode
Tue Jun 10 16:33:06 2025 kern.info kernel: [349966.820666] ath12k_pci 0000:04:00.0 phy0-ap0: entered promiscuous mode
Tue Jun 10 16:33:06 2025 daemon.notice hostapd: phy0-ap0: interface state UNINITIALIZED->COUNTRY_UPDATE
Tue Jun 10 16:33:06 2025 kern.info kernel: [349966.854724] br-roy: port 2(phy0-ap0) entered blocking state
Tue Jun 10 16:33:06 2025 kern.info kernel: [349966.860430] br-roy: port 2(phy0-ap0) entered forwarding state
Tue Jun 10 16:33:06 2025 daemon.notice netifd: Network device 'phy0-ap0' link is up
Tue Jun 10 16:33:06 2025 daemon.notice netifd: bridge 'br-roy' link is up
Tue Jun 10 16:33:06 2025 daemon.notice netifd: Interface 'Roy' has link connectivity
Tue Jun 10 16:33:06 2025 daemon.notice hostapd: phy0-ap0: interface state COUNTRY_UPDATE->ENABLED
Tue Jun 10 16:33:06 2025 daemon.notice hostapd: phy0-ap0: AP-ENABLED
Tue Jun 10 16:33:06 2025 daemon.notice netifd: Wireless device 'radio0' is now up