Working, step-by-step fix for AiCSemi AIC8800D81 (and the closely related AIC8800D80 / AIC8800DC / AIC8801) USB WiFi 6 + Bluetooth 5.x combo dongles that do nothing on Linux — no hci0, no wireless interface, sometimes not even detected — while working fine on Windows.
Tested on Pop!_OS 24.04 (kernel 6.x/7.x). Should apply to any modern Ubuntu/Debian-based distro with matching kernel headers.
Scope: this guide gets Bluetooth working end-to-end (
hci0up, pairing works in GNOME/KDE Bluetooth settings). WiFi is out of scope here — theaic8800_fdrvWiFi module in the upstream driver failed to build on this kernel (GCC internal compiler error /-Werrorfallthrough issues) and wasn't needed for this use case. If you get WiFi working too, open a PR.
You have this problem if:
lsusbshows something likeID 1111:1111 Pandora International Ltd. 88M80— a fake/generic VID:PID, not a real vendor- Windows Device Manager (or the box) mentions AIC8800D81, AIC8800D80, AIC8800M80, or chip marking "88M80"
- The dongle was sold under a generic/whitebox brand name like Fenvi AX900, Ninepluswifi AX900, WIFI6-BW22, UGREEN WiFi 6 + BT USB adapter (a69c:8d80/8d81), or similar no-name "WiFi 6 + BT 5.3/5.4 USB adapter"
dmesg/journalctl -kshows the device enumerating withManufacturer: AICbut nothing binds to it- Bluetooth service reports
bluetooth.service was skipped because of an unmet condition check (ConditionPathIsDirectory=/sys/class/bluetooth)— i.e. no Bluetooth adapter exists at all as far as the kernel is concerned - The LED on the dongle is on, but there's no wireless card, no Bluetooth adapter, nothing in
rfkill list
If lsusb shows the device directly as a69c:8d81, a69c:8d80, or similar (not 1111:1111), skip Part 1 and go straight to Part 2.
These dongles ship as a fake CD-ROM drive (1111:1111) that contains the Windows driver installer — the "ZeroCD" / autorun-installer trick used by a lot of cheap WiFi/BT/modem dongles. On Windows, a background service sends a proprietary command that switches the chip out of CD-ROM mode into actual WiFi+Bluetooth mode. Linux never sends that command, so the dongle stays stuck pretending to be an optical drive forever.
Even after mode-switching, there's a second problem: the public Linux driver for this chip (radxa-pkg/aic8800) ships with the Bluetooth HAL hardcoded for Android (it exposes a raw /dev/aicbt_dev character device for Android's Bluedroid stack instead of registering a normal hci0 device for BlueZ). One #define needs to flip for standard Linux Bluetooth (BlueZ) to see it.
The vendor SCSI command that does this was reverse-engineered by the community — see olamellberg/AIC8800D80. Standard eject and usb_modeswitch -K do not work for this chip; it needs an undocumented 16-byte vendor CDB.
sudo apt install -y sg3-utils
sudo bash scripts/aic8800-modeswitch.shCheck it worked:
lsusb | grep a69c
# should show something like: Bus 001 Device 010: ID a69c:8d81 AICSemi AIC 8800D80If the dongle isn't found, unplug/replug it and re-run the script.
sudo apt install -y git build-essential dkms "linux-headers-$(uname -r)"
git clone --depth 1 https://github.com/radxa-pkg/aic8800.git
cd aic8800
# Patch the Bluetooth module to use BlueZ (hci0) instead of Android's Bluedroid HAL.
bash /path/to/this/repo/scripts/apply-bluez-patch.sh \
src/USB/driver_fw/drivers/aic_btusb/aic_btusb.h
KDIR=/lib/modules/$(uname -r)/build
# Bluetooth firmware-loader helper module
make -C "$KDIR" M="$PWD/src/USB/driver_fw/drivers/aic8800/aic_load_fw"
# Bluetooth USB driver
make -C "$KDIR" M="$PWD/src/USB/driver_fw/drivers/aic_btusb"If the build fails with
cc1: some warnings being treated as errorson-Wimplicit-fallthrough, or with an internal compiler error while building the WiFi module (aic8800_fdrv) — that's a separate, known issue with this driver on newer GCC and isn't needed for Bluetooth. Just skip that module; the twomakecommands above only build the Bluetooth side.
Install the modules and firmware:
sudo mkdir -p "/lib/modules/$(uname -r)/extra"
sudo cp src/USB/driver_fw/drivers/aic8800/aic_load_fw/aic_load_fw.ko "/lib/modules/$(uname -r)/extra/"
sudo cp src/USB/driver_fw/drivers/aic_btusb/aic_btusb.ko "/lib/modules/$(uname -r)/extra/"
sudo depmod -a
sudo mkdir -p /lib/firmware
sudo cp -r src/USB/driver_fw/fw/aic8800D80 /lib/firmware/
sudo modprobe aic_load_fw
sudo modprobe aic_btusbVerify:
ls /sys/class/bluetooth # should print: hci0
hciconfig -a # should show "UP RUNNING"At this point Bluetooth should already be pairable from your desktop's Bluetooth settings (GNOME Settings, KDE System Settings, bluetoothctl, etc).
Every time the dongle loses power, it resets back to fake CD-ROM mode. A udev rule re-runs the mode-switch command automatically whenever it's plugged in:
sudo cp scripts/aic8800-modeswitch.sh /usr/local/sbin/
sudo chmod +x /usr/local/sbin/aic8800-modeswitch.sh
sudo cp scripts/99-aic8800-modeswitch.rules /etc/udev/rules.d/
sudo udevadm control --reload-rulesThe aic_load_fw / aic_btusb modules will auto-load via normal USB driver matching once the dongle mode-switches — no extra step needed there.
Kernel updates: the
.komodules built above are tied to the kernel version you built them against. After a kernel upgrade, re-run themakecommands in Part 2 against the new headers (or set it up properly with DKMS usingdebian/aic8800-usb-dkms.dkmsin the upstream repo, which this guide doesn't cover).
| Symptom | Fix |
|---|---|
sg_raw: command not found |
sudo apt install sg3-utils |
| Mode-switch script says "dongle not found" | Unplug/replug, then re-run. Check lsusb shows 1111:1111 first. |
probe with driver aic_load_fw failed with error -1 in dmesg |
Harmless — this is the WiFi side of the driver failing to claim the interface (WiFi module wasn't built). Bluetooth still works. |
bluetoothd says "No default controller available" |
Check ls /sys/class/bluetooth — if empty, the aic_btusb module isn't loaded or wasn't patched (see Part 2). |
| Adapter shows up but pairing fails / drops | Try sudo systemctl restart bluetooth after the modules load. |
- Mode-switch SCSI command discovered and published by olamellberg/AIC8800D80.
- Base Linux driver from radxa-pkg/aic8800 (AiCSemi source, packaged by Radxa).
- This guide (combining both, plus the BlueZ patch and the udev automation) was researched, debugged, and written end-to-end by Claude (Fable/Sonnet 5, Anthropic), working interactively in a real Pop!_OS terminal session — diagnosing the fake-CD-ROM mode, finding the mode-switch command, building the driver, and discovering the
CONFIG_BLUEDROIDfix. Published by @wilodxd.
AIC8800D81 linux driver, AIC8800D80 linux bluetooth, AIC8800M80 linux, 88M80 wifi bluetooth linux, aic8800 ubuntu, aic8800 debian, a69c:8d81, a69c:8d80, 1111:1111 usb lsusb fake cdrom, Fenvi AX900 linux driver, Ninepluswifi AX900 linux, AicWifiService linux equivalent, AIC8800 hci0 not found, AIC8800 bluetooth not detected linux, ConditionPathIsDirectory=/sys/class/bluetooth, aic_btusb dkms, aic_load_fw module.