Hi, I’m starting this thread to figure out how to deal with the (IMO ludicrous) US regulatory restrictions for 6GHz emissions. 6GHz devices are growing in popularity, and those that do not use an internal (Qualcomm) regulatory database, such as Mediatek, Airoha, etc., are unable to bring up an access point on the 6GHz band with OpenWrt’s standard regdb. This will become a larger issue as right now, 6GHz is disabled on vanilla OpenWrt builds and can only be re-enabled with regdb patches, which may end up violating emission laws as they currently stand. There are 2 issues that seem to be present:
Different channel widths are limited to different Power Spectral Densities (PSD). See https://lore.kernel.org/wireless-regdb/CAPRryQp6j4UKvLZCkMAuQdaxepMBETQUJ1eNULJSh3ZWXC0f5Q@mail.gmail.com/ for more details.
6GHz does not require a license and does not require use of an Automatic Frequency Coordinator (AFC) only when used indoors. https://www.federalregister.gov/d/2020-11236/p-61 . Outdoor use is subject to communicating with an AFC, and is outside the scope of this discussion.
It appears that the upstream regdb maintainers have no interest in solving this problem, so I think it must be in the hands of OpenWrt. The path forward I see is adding an intermediate state for configuring/enabling 6GHz access points and clients in the US.
Apply a patch to the regdb that removes NO-IR from 6GHz in US.
Add an indoor-use-only option to uci/luci that must be manually selected, to ensure that the responsibility lives with the device operator. If this option is not present, the AP should not come up (and appropriate logging/warnings should be made to the user)
Add a check that verifies PSD requirements are met for both AP and client mode (since they’re different). I expect that AP+STA would be subject to STA regulations
Other references:
Thoughts?
2 Likes
Upstream hasn't looked at this much due to having to support old kernels. Openwrt could patch regdb; however, if they mess this up the FCC may fine them.
The only solution I see is to have an optional patched wireless-regdb-6Ghz.apk in the repo. US users would install openwrt and then have to install it. That should be enough to cover openwrt legally as it would not be included in the default install.
Short term solution is to apply stangri's patch to wireless-regdb found here:
opened 02:12PM - 02 Oct 25 UTC
bug
invalid
### Describe the bug
On a recent OpenWrt snapshot, the MT7996E 6GHz radio fails… to broadcast when configured as an Access Point. Luci shows radio2 as up and configured correctly but isn't broadcasting. However, the hostapd logs show that the kernel's regulatory database is reporting that there are no available 6GHz channels for AP mode, or that the configured channel is explicitly disallowed due to a NO-IR (No Initiate Radiation) flag. This suggests the driver is failing to correctly parse the 6GHz regulatory and channel information.
Supporting Logs:
logread Output (Showing hostapd Failure):
The system log shows hostapd failing because the kernel reports no channels are available for AP mode.
When a specific channel (6135 MHz / Ch 37) is configured, the log shows:
```
Thu Oct 2 11:12:52 2025 daemon.notice hostapd: Frequency 6135 (primary) not allowed for AP mode, flags: 0x13803 NO-IR
Thu Oct 2 11:12:52 2025 daemon.err hostapd: Primary frequency not allowed
Thu Oct 2 11:12:52 2025 daemon.warn hostapd: phy0.2-ap0: IEEE 802.11 Hardware does not support configured channel
Thu Oct 2 11:12:52 2025 daemon.err hostapd: Could not select hw_mode and channel. (-3)
Thu Oct 2 11:12:52 2025 daemon.notice hostapd: phy0.2-ap0: AP-NO_IR
```
When Automatic Channel Selection (ACS) is enabled, the log shows:
```
Thu Oct 2 11:12:29 2025 daemon.err hostapd: ACS: No available channels found
Thu Oct 2 11:12:29 2025 daemon.err hostapd: Could not select hw_mode and channel. (-3)
Thu Oct 2 11:12:29 2025 daemon.err hostapd: phy0.2-ap0: Unable to setup interface.
```
Other info:
```
root@OpenWrt:~# dmesg | grep mt7996
[ 11.984517] mt7996e_hif 0001:01:00.0: assign IRQ: got 117
[ 11.989934] mt7996e_hif 0001:01:00.0: enabling device (0000 -> 0002)
[ 11.996330] mt7996e_hif 0001:01:00.0: enabling bus mastering
[ 12.002101] mt7996e 0000:01:00.0: assign IRQ: got 114
[ 12.007150] mt7996e 0000:01:00.0: enabling device (0000 -> 0002)
[ 12.013162] mt7996e 0000:01:00.0: enabling bus mastering
[ 12.132464] mt7996e 0000:01:00.0: HW/SW Version: 0x8a108a10, Build Time: 20250904203308a
[ 12.237529] mt7996e 0000:01:00.0: WM Firmware Version: ____000000, Build Time: 20250904203304
[ 12.284568] mt7996e 0000:01:00.0: DSP Firmware Version: ____000000, Build Time: 20250904202814
[ 12.311451] mt7996e 0000:01:00.0: WA Firmware Version: ____000000, Build Time: 20250904203218
[ 28.518317] mt7996e 0000:01:00.0 phy0.0-ap0: entered allmulticast mode
[ 28.524983] mt7996e 0000:01:00.0 phy0.0-ap0: entered promiscuous mode
[ 28.999732] mt7996e 0000:01:00.0 phy0.1-ap0: entered allmulticast mode
[ 29.006419] mt7996e 0000:01:00.0 phy0.1-ap0: entered promiscuous mode
[ 29.474152] mt7996e 0000:01:00.0 phy0.2-ap0: entered allmulticast mode
[ 29.480863] mt7996e 0000:01:00.0 phy0.2-ap0: entered promiscuous mode
[ 29.516792] mt7996e 0000:01:00.0 phy0.2-ap0: left allmulticast mode
[ 29.523070] mt7996e 0000:01:00.0 phy0.2-ap0: left promiscuous mode
[ 93.335203] mt7996e 0000:01:00.0 phy0.2-ap0: entered allmulticast mode
[ 93.341904] mt7996e 0000:01:00.0 phy0.2-ap0: entered promiscuous mode
[ 108.496558] mt7996e 0000:01:00.0 phy0.2-ap0: left allmulticast mode
[ 108.502842] mt7996e 0000:01:00.0 phy0.2-ap0: left promiscuous mode
[ 185.440994] mt7996e 0000:01:00.0 phy0.0-ap0: left allmulticast mode
[ 185.447279] mt7996e 0000:01:00.0 phy0.0-ap0: left promiscuous mode
[ 185.745311] mt7996e 0000:01:00.0 phy0.0-ap0: entered allmulticast mode
[ 185.752036] mt7996e 0000:01:00.0 phy0.0-ap0: entered promiscuous mode
[ 186.167062] mt7996e 0000:01:00.0 phy0.1-ap0: left allmulticast mode
[ 186.173370] mt7996e 0000:01:00.0 phy0.1-ap0: left promiscuous mode
[ 186.593057] mt7996e 0000:01:00.0 phy0.1-ap0: entered allmulticast mode
[ 186.599674] mt7996e 0000:01:00.0 phy0.1-ap0: entered promiscuous mode
[ 187.196021] mt7996e 0000:01:00.0 phy0.2-ap0: entered allmulticast mode
[ 187.202714] mt7996e 0000:01:00.0 phy0.2-ap0: entered promiscuous mode
[ 187.230041] mt7996e 0000:01:00.0 phy0.2-ap0: left allmulticast mode
[ 187.236325] mt7996e 0000:01:00.0 phy0.2-ap0: left promiscuous mode
[ 209.913570] mt7996e 0000:01:00.0 phy0.2-ap0: entered allmulticast mode
[ 209.920281] mt7996e 0000:01:00.0 phy0.2-ap0: entered promiscuous mode
[ 3982.828915] mt7996e 0000:01:00.0 phy0.2-ap0: left allmulticast mode
[ 3982.835216] mt7996e 0000:01:00.0 phy0.2-ap0: left promiscuous mode
[ 3983.453090] mt7996e 0000:01:00.0 phy0.2-ap0: entered allmulticast mode
[ 3983.459773] mt7996e 0000:01:00.0 phy0.2-ap0: entered promiscuous mode
[ 4035.272412] mt7996e 0000:01:00.0 phy0.2-ap0: left allmulticast mode
[ 4035.278785] mt7996e 0000:01:00.0 phy0.2-ap0: left promiscuous mode
[ 4035.549039] mt7996e 0000:01:00.0 phy0.2-ap0: entered allmulticast mode
[ 4035.555742] mt7996e 0000:01:00.0 phy0.2-ap0: entered promiscuous mode
```
Wireless config:
```
config wifi-device 'radio0'
option type 'mac80211'
option path 'soc/11300000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0'
option radio '0'
option band '2g'
option channel '11'
option htmode 'HE40'
option country 'US'
option cell_density '0'
option txpower '20'
config wifi-iface 'default_radio0'
option device 'radio0'
option network 'lan'
option mode 'ap'
option ssid 'Openwrt_2g'
option encryption 'psk2'
option key '12345678'
config wifi-device 'radio1'
option type 'mac80211'
option path 'soc/11300000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0'
option radio '1'
option band '5g'
option channel '100'
option htmode 'HE160'
option country 'US'
option cell_density '0'
option txpower '17'
config wifi-iface 'default_radio1'
option device 'radio1'
option network 'lan'
option mode 'ap'
option ssid 'Openwrt_5g'
option encryption 'psk2'
option key '12345678'
config wifi-device 'radio2'
option type 'mac80211'
option path 'soc/11300000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0'
option radio '2'
option band '6g'
option channel '37'
option htmode 'EHT320'
option country 'US'
option cell_density '0'
option txpower '10'
config wifi-iface 'default_radio2'
option device 'radio2'
option network 'lan'
option mode 'ap'
option ssid 'Openwrt_6g'
option encryption 'sae'
option key '12345678'
option ocv '0'
```
```
root@OpenWrt:~# iw dev phy0.0-ap0 info
Interface phy0.0-ap0
ifindex 15
wdev 0x5
addr d2:12:8c:46:b2:09
ssid Openwrt_2g
type AP
wiphy 0
channel 11 (2462 MHz), width: 40 MHz, center1: 2452 MHz
txpower 20.00 dBm
multicast TXQ:
qsz-byt qsz-pkt flows drops marks overlmt hashcol tx-bytes tx-packets
0 0 2015 0 0 0 0 400051 2075
Radios: 0
root@OpenWrt:~# iw dev phy0.1-ap0 info
Interface phy0.1-ap0
ifindex 16
wdev 0x6
addr d2:12:8c:46:b2:19
ssid Openwrt_5g
type AP
wiphy 0
channel 104 (5520 MHz), width: 160 MHz, center1: 5570 MHz
txpower 17.00 dBm
multicast TXQ:
qsz-byt qsz-pkt flows drops marks overlmt hashcol tx-bytes tx-packets
0 0 0 0 0 0 0 0 0
Radios: 1
root@OpenWrt:~# iw dev phy0.2-ap0 info
Interface phy0.2-ap0
ifindex 20
wdev 0xa
addr d2:12:8c:46:b2:29
type AP
wiphy 0
txpower 23.00 dBm
multicast TXQ:
qsz-byt qsz-pkt flows drops marks overlmt hashcol tx-bytes tx-packets
0 0 0 0 0 0 0 0 0
Radios: 2
root@OpenWrt:~#
```
### OpenWrt version
r0+31262-915a57ccd9
### OpenWrt release
SNAPSHOT
### OpenWrt target/subtarget
mediatek/filogic
### Device
Banana Pi BPI-R4 (2x SFP+)
### Image kind
Self-built image
### Steps to reproduce
Flash a recent OpenWrt snapshot build on a Banana Pi BPI-R4.
Configure the wireless settings for (US) regulatory domain.
Enable the 6GHz radio in Access Point mode, either with a specific channel (e.g., 37) or with automatic channel selection.
Apply the configuration and observe the system log.
### Actual behaviour
The hostapd daemon fails to initialize the phy0.2-ap0 interface. The interface is left in a disabled state with no channel or SSID configured. The Tx power also remains locked at its default value.
### Expected behaviour
The 6GHz Access Point (phy0.2-ap0) should initialize correctly, select a valid channel, and begin broadcasting its SSID.
### Additional info
### Diffconfig
```text
```
### Terms
- [x] I am reporting an issue for OpenWrt, not an unsupported fork.
Just build wireless-regdb. Every single update, you must reinstall your patched wireless-regdb apk.
1 Like
hurrian
February 2, 2026, 11:19pm
3
The "easy way" would limit performance:
Enabling 6GHz... limited to an EIRP of 12dBm to respect PSD limits in 20MHz operation (since currently, frequency-dependent PSD can't be specified in regdb)
(5925 - 7125 @ 320), (12), NO-OUTDOOR
The proper solution would require significant patching:
splitting up NO-IR back into PASSIVE-SCAN (for STA mode) and NO-IBSS
adding a new property into wireless-regdb to mark LPI ranges
cfg80211 supporting said changes
mac80211 and the rest of the other wireless drivers properly reporting their PSD (it has been broken in the past)
2 Likes
"Why doesn't 6Ghz work?!?" "Why does 6Ghz suck with openwrt?!?" + "Why does MLO suck with openwrt?!?"