Installed Intel AX200. ...but it is hard blocked

I like my tiny computer and bought some wireless parts for it. An Intel AX200 desktop kit included the m.2 module itself, two SMA adapter cables and the dual band antennas, of course. The only parts that I had to change was the adapter cables because the ones in the kit would not fit inside the pico-ITX case. …but there are parts that do and the seller of the desktop kit added those to the order.

It was nerve-wracking to detach the long adapters and snap in the new ones. The parts are absolutely tiny!

But with all the parts installed I kept my fingers crossed and booted up the Gnome 46 desktop on my openSUSE Tumbleweed system from the NVME. But now there’s an symbol telling me that my wireless transmitters have been turned off. I’m in in-flight mode and I can’t turn it off.

An administrator on the openSUSE forum asked me if my interface was blocked and a quick rfkill command showed that the wireless is indeed hard blocked, something that can’t be unblocked by rfkill, afaik.

Seeing a hard block usually means that there is a hardware switch to turn the interface on or off.

So now I’m sitting here wondering if there is such a switch on the AX200 or on the Rock 5B.

…and if so, where?

You get better access to some chipsets using the m.2 socket it’s true, I just use USB adapters in the end, yeah the bus can be more pain-in-the-butt prone but things have slowly gotten more reliable. I have a comcast mt7921au based adapter and it works pretty much flawlessly (* with the latest linux kernel) even for AP mode.

Anyway that was all pretty off topic but one thing I had trouble with getting wireless to work in Linux was the “regdb” part.

I quickly searched on google and got this https://www.0xf8.org/2015/07/fixing-wireless-regulatory-support-crda-wireless-regdb-on-opensuse-tumbleweed/ but it’s probably too old to be relevant to your problem.

This link suggests “crda” is installed by default, but perhaps it’s not for you and you just need to install the “crda” package. This is assuming your adapter is detected and has a driver working at all. I guess the first thing to check there is if “iw list” or “sudo iw list” returns nothing.

I am sorry but sudo iw list produces a very long output that I can’t make much out of. …but…

…this is what I get from sudo hwinfo

13: PCI 20100.0: 0282 WLAN controller
  [Created at pci.386]
  Unique ID: EQcw.mxT2IIe1w3C
  SysFS ID: /devices/pci0002:01/0002:01:00.0
  SysFS BusID: 0002:01:00.0
  Hardware Class: network
  Model: "Intel Wi-Fi 6 AX200"
  Vendor: pci 0x8086 "Intel Corporation"
  Device: pci 0x2723 "Wi-Fi 6 AX200"
  SubVendor: pci 0x8086 "Intel Corporation"
  SubDevice: pci 0x0080 
  Revision: 0x1a
  Driver: "iwlwifi"
  Driver Modules: "iwlwifi"
  Device File: wlP2p1s0
  Features: WLAN
  Memory Range: 0x990000000-0x990003fff (rw,non-prefetchable)
  IRQ: 24 (10 events)
  HW Address: ---
  Permanent HW Address: ---
  Link detected: no
  WLAN channels: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104
  WLAN frequencies: 2.412 2.417 2.422 2.427 2.432 2.437 2.442 2.447 2.452 2.457 2.462 2.467 2.472 2.484 5.18 5.2 5.22 5.24 5.26 5.28 5.3 5.32 5.34 5.36 5.38 5.4 5.42 5.44 5.46 5.48 5.5 5.52
  WLAN encryption modes: WEP40 WEP104 TKIP CCMP
  WLAN authentication modes: open sharedkey wpa-psk wpa-eap
  Module Alias: "pci:v00008086d00002723sv00008086sd00000080bc02sc80i00"
  Driver Info #0:
    Driver Status: iwlwifi is active
    Driver Activation Cmd: "modprobe iwlwifi"
  Config Status: cfg=new, avail=yes, need=no, active=unknown

so the hardware is detected and the driver is loaded that’s good
what about “sudo iw reg get”

sudo iw reg get

global
country 00: DFS-UNSET
	(755 - 928 @ 2), (N/A, 20), (N/A), PASSIVE-SCAN
	(2402 - 2472 @ 40), (N/A, 20), (N/A)
	(2457 - 2482 @ 20), (N/A, 20), (N/A), AUTO-BW, PASSIVE-SCAN
	(2474 - 2494 @ 20), (N/A, 20), (N/A), NO-OFDM, PASSIVE-SCAN
	(5170 - 5250 @ 80), (N/A, 20), (N/A), AUTO-BW, PASSIVE-SCAN
	(5250 - 5330 @ 80), (N/A, 20), (0 ms), DFS, AUTO-BW, PASSIVE-SCAN
	(5490 - 5730 @ 160), (N/A, 20), (0 ms), DFS, PASSIVE-SCAN
	(5735 - 5835 @ 80), (N/A, 20), (N/A), PASSIVE-SCAN
	(57240 - 63720 @ 2160), (N/A, 0), (N/A)

phy#0 (self-managed)
country 00: DFS-UNSET
	(2402 - 2437 @ 40), (6, 22), (N/A), AUTO-BW, NO-HT40MINUS, NO-80MHZ, NO-160MHZ
	(2422 - 2462 @ 40), (6, 22), (N/A), AUTO-BW, NO-80MHZ, NO-160MHZ
	(2447 - 2482 @ 40), (6, 22), (N/A), AUTO-BW, NO-HT40PLUS, NO-80MHZ, NO-160MHZ
	(5170 - 5190 @ 160), (6, 22), (N/A), NO-OUTDOOR, AUTO-BW, IR-CONCURRENT, NO-HT40MINUS, NO-320MHZ, PASSIVE-SCAN
	(5190 - 5210 @ 160), (6, 22), (N/A), NO-OUTDOOR, AUTO-BW, IR-CONCURRENT, NO-HT40PLUS, NO-320MHZ, PASSIVE-SCAN
	(5210 - 5230 @ 160), (6, 22), (N/A), NO-OUTDOOR, AUTO-BW, IR-CONCURRENT, NO-HT40MINUS, NO-320MHZ, PASSIVE-SCAN
	(5230 - 5250 @ 160), (6, 22), (N/A), NO-OUTDOOR, AUTO-BW, IR-CONCURRENT, NO-HT40PLUS, NO-320MHZ, PASSIVE-SCAN
	(5250 - 5270 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40MINUS, NO-320MHZ, PASSIVE-SCAN
	(5270 - 5290 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40PLUS, NO-320MHZ, PASSIVE-SCAN
	(5290 - 5310 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40MINUS, NO-320MHZ, PASSIVE-SCAN
	(5310 - 5330 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40PLUS, NO-320MHZ, PASSIVE-SCAN
	(5490 - 5510 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40MINUS, NO-320MHZ, PASSIVE-SCAN
	(5510 - 5530 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40PLUS, NO-320MHZ, PASSIVE-SCAN
	(5530 - 5550 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40MINUS, NO-320MHZ, PASSIVE-SCAN
	(5550 - 5570 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40PLUS, NO-320MHZ, PASSIVE-SCAN
	(5570 - 5590 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40MINUS, NO-320MHZ, PASSIVE-SCAN
	(5590 - 5610 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40PLUS, NO-320MHZ, PASSIVE-SCAN
	(5610 - 5630 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40MINUS, NO-320MHZ, PASSIVE-SCAN
	(5630 - 5650 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40PLUS, NO-320MHZ, PASSIVE-SCAN
	(5650 - 5670 @ 80), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40MINUS, NO-160MHZ, NO-320MHZ, PASSIVE-SCAN
	(5670 - 5690 @ 80), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40PLUS, NO-160MHZ, NO-320MHZ, PASSIVE-SCAN
	(5690 - 5710 @ 80), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40MINUS, NO-160MHZ, NO-320MHZ, PASSIVE-SCAN
	(5710 - 5730 @ 80), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40PLUS, NO-160MHZ, NO-320MHZ, PASSIVE-SCAN
	(5735 - 5755 @ 80), (6, 22), (N/A), AUTO-BW, IR-CONCURRENT, NO-HT40MINUS, NO-160MHZ, NO-320MHZ, PASSIVE-SCAN
	(5755 - 5775 @ 80), (6, 22), (N/A), AUTO-BW, IR-CONCURRENT, NO-HT40PLUS, NO-160MHZ, NO-320MHZ, PASSIVE-SCAN
	(5775 - 5795 @ 80), (6, 22), (N/A), AUTO-BW, IR-CONCURRENT, NO-HT40MINUS, NO-160MHZ, NO-320MHZ, PASSIVE-SCAN
	(5795 - 5815 @ 80), (6, 22), (N/A), AUTO-BW, IR-CONCURRENT, NO-HT40PLUS, NO-160MHZ, NO-320MHZ, PASSIVE-SCAN
	(5815 - 5835 @ 20), (6, 22), (N/A), AUTO-BW, IR-CONCURRENT, NO-HT40MINUS, NO-HT40PLUS, NO-80MHZ, NO-160MHZ, NO-320MHZ, PASSIVE-SCAN

hmpf
does it let you set a country ? like “sudo iw reg set US” then to check “sudo iw reg get”

…and crda seems to be installed.

rpm -q crda
crda-4.15-2.1.aarch64

I used SE instead of US, because I live in Sweden.
sudo iw reg set SE

then…

sudo iw reg get

global
country SE: DFS-ETSI
	(2400 - 2483 @ 40), (N/A, 20), (N/A)
	(5150 - 5250 @ 80), (N/A, 23), (N/A), NO-OUTDOOR, AUTO-BW
	(5250 - 5350 @ 80), (N/A, 20), (0 ms), NO-OUTDOOR, DFS, AUTO-BW
	(5470 - 5725 @ 160), (N/A, 26), (0 ms), DFS
	(5725 - 5875 @ 80), (N/A, 13), (N/A)
	(5945 - 6425 @ 160), (N/A, 23), (N/A), NO-OUTDOOR
	(57000 - 66000 @ 2160), (N/A, 40), (N/A)

phy#0 (self-managed)
country 00: DFS-UNSET
	(2402 - 2437 @ 40), (6, 22), (N/A), AUTO-BW, NO-HT40MINUS, NO-80MHZ, NO-160MHZ
	(2422 - 2462 @ 40), (6, 22), (N/A), AUTO-BW, NO-80MHZ, NO-160MHZ
	(2447 - 2482 @ 40), (6, 22), (N/A), AUTO-BW, NO-HT40PLUS, NO-80MHZ, NO-160MHZ
	(5170 - 5190 @ 160), (6, 22), (N/A), NO-OUTDOOR, AUTO-BW, IR-CONCURRENT, NO-HT40MINUS, NO-320MHZ, PASSIVE-SCAN
	(5190 - 5210 @ 160), (6, 22), (N/A), NO-OUTDOOR, AUTO-BW, IR-CONCURRENT, NO-HT40PLUS, NO-320MHZ, PASSIVE-SCAN
	(5210 - 5230 @ 160), (6, 22), (N/A), NO-OUTDOOR, AUTO-BW, IR-CONCURRENT, NO-HT40MINUS, NO-320MHZ, PASSIVE-SCAN
	(5230 - 5250 @ 160), (6, 22), (N/A), NO-OUTDOOR, AUTO-BW, IR-CONCURRENT, NO-HT40PLUS, NO-320MHZ, PASSIVE-SCAN
	(5250 - 5270 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40MINUS, NO-320MHZ, PASSIVE-SCAN
	(5270 - 5290 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40PLUS, NO-320MHZ, PASSIVE-SCAN
	(5290 - 5310 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40MINUS, NO-320MHZ, PASSIVE-SCAN
	(5310 - 5330 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40PLUS, NO-320MHZ, PASSIVE-SCAN
	(5490 - 5510 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40MINUS, NO-320MHZ, PASSIVE-SCAN
	(5510 - 5530 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40PLUS, NO-320MHZ, PASSIVE-SCAN
	(5530 - 5550 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40MINUS, NO-320MHZ, PASSIVE-SCAN
	(5550 - 5570 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40PLUS, NO-320MHZ, PASSIVE-SCAN
	(5570 - 5590 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40MINUS, NO-320MHZ, PASSIVE-SCAN
	(5590 - 5610 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40PLUS, NO-320MHZ, PASSIVE-SCAN
	(5610 - 5630 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40MINUS, NO-320MHZ, PASSIVE-SCAN
	(5630 - 5650 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40PLUS, NO-320MHZ, PASSIVE-SCAN
	(5650 - 5670 @ 80), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40MINUS, NO-160MHZ, NO-320MHZ, PASSIVE-SCAN
	(5670 - 5690 @ 80), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40PLUS, NO-160MHZ, NO-320MHZ, PASSIVE-SCAN
	(5690 - 5710 @ 80), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40MINUS, NO-160MHZ, NO-320MHZ, PASSIVE-SCAN
	(5710 - 5730 @ 80), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40PLUS, NO-160MHZ, NO-320MHZ, PASSIVE-SCAN
	(5735 - 5755 @ 80), (6, 22), (N/A), AUTO-BW, IR-CONCURRENT, NO-HT40MINUS, NO-160MHZ, NO-320MHZ, PASSIVE-SCAN
	(5755 - 5775 @ 80), (6, 22), (N/A), AUTO-BW, IR-CONCURRENT, NO-HT40PLUS, NO-160MHZ, NO-320MHZ, PASSIVE-SCAN
	(5775 - 5795 @ 80), (6, 22), (N/A), AUTO-BW, IR-CONCURRENT, NO-HT40MINUS, NO-160MHZ, NO-320MHZ, PASSIVE-SCAN
	(5795 - 5815 @ 80), (6, 22), (N/A), AUTO-BW, IR-CONCURRENT, NO-HT40PLUS, NO-160MHZ, NO-320MHZ, PASSIVE-SCAN
	(5815 - 5835 @ 20), (6, 22), (N/A), AUTO-BW, IR-CONCURRENT, NO-HT40MINUS, NO-HT40PLUS, NO-80MHZ, NO-160MHZ, NO-320MHZ, PASSIVE-SCAN

Seems like everything is installed ok then, but phy0 still has unset country so a lot of things disabled I assume, but whether that means it doesn’t work at all I don’t know.

Does scan give anything back ? “sudo iw wlP2p1s0 scan” ?

If it does then maybe something else is missing like wpa_supplicant but if you get nothing back from the scan then maybe it’s still some kind of region setting problem specific to intel and maybe someone else is going to know more about that.

sudo iw wlP2p1s0 scan

command failed: Network is down (-100)

…which is kind of logical as the system is locked in “in-flight mode”.

sorry you might need to bring it up first

sudo ip link set wlP2p1s0 up
sudo iw wlP2p1s0 scan

sudo ip link set wlP2p1s0 up

RTNETLINK answers: Operation not possible due to RF-kill

yes, looked around
maybe the adapter requires some kind of secure boot uefi environment

it seems there’s a utility called “mokutil”
“sudo zypper install mokutil”
and “sudo mokutil --disable-validation”
reboot ?

but this is probably way off track

When troubleshooting no time is wasted. I am thankful for the time you put in.

My personal guess is that ACPI and/or UEFI is the culprit somehow. It seems a Rockchip 3588 system should use device tree mode but I can’t tell if my system does. Everything is still suspected until proven otherwise, it seems.

So… trying another distribution for reference.

Downloaded the image for Debian Bullseye, flashed it to a SD memory and booted the machine.

The good news is that in bullseye the AX200 works out of the box. Both wifi and bluetooth.

The bad news is that the hardware works fine in bullseye but not in Tumbleweed. So it has to be software related. So now I have to find something that hardblocks the ax200 in software. Imagine that.

So I’m comparing to a third distro; Armbian Jammy (with panfork).

Wish me luck.

Oh, by the way… mokutil says that my system isn’t locked.

Could not get anything on the display with the Armbian Jammy experiment.

Using the kernel parameter noacpi doesn’t fix the hard block.

rfkill is controlled by a gpio. It’s better to use devicetree instead of acpi because that is defined in devicetree.

Yes, using Device Tree Mode is suggested by the EDK UEFI firmware that I’m using to boot from NVME. If I can find the setting for switching to device tree mode, the firmware apparently installs a DTB compatible with (most) Rockchip SDK Linux 5.10 legacy kernel variants. Would this be good enough for the 6.8 kernel of Tumbleweed?

And, out of curiosity, how does the GPIO control the bluetooth and wifi? The hard block of rfkill was pointing to a hardware switch but it never hit me that the GPIO might be involved.

There are two pins on the M.2 interface that allows wireless functionality to be killed, pin 54 and 56 to be exact. Only when they’re pulled high is the card allowed to operate.

If you’re running the upstream or collabora’s 6.8 kernel, these pins were not described in the device tree, so they can’t be controlled by software.

If you absolutely need to run upstream kernel, wait for 6.9 release, or you can try isolating pin 54 and 56 on the card with a piece of adhesive tape, or you can try applying this patch to the 6.8 device tree.

And no, do not attempt to run the 6.8 kernel with 5.10 DTB. The format is different.