Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 

Repository files navigation

AIC8800D81 / AIC8800D80 Bluetooth on Linux (Ubuntu, Pop!_OS, Debian)

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 (hci0 up, pairing works in GNOME/KDE Bluetooth settings). WiFi is out of scope here — the aic8800_fdrv WiFi module in the upstream driver failed to build on this kernel (GCC internal compiler error / -Werror fallthrough issues) and wasn't needed for this use case. If you get WiFi working too, open a PR.

Is this your dongle?

You have this problem if:

  • lsusb shows something like ID 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 -k shows the device enumerating with Manufacturer: AIC but 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.

Why this happens

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 fix — 3 parts

Part 1 — Mode-switch the dongle out of fake CD-ROM mode

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.sh

Check it worked:

lsusb | grep a69c
# should show something like: Bus 001 Device 010: ID a69c:8d81 AICSemi AIC 8800D80

If the dongle isn't found, unplug/replug it and re-run the script.

Part 2 — Build and install the kernel driver

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 errors on -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 two make commands 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_btusb

Verify:

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).

Part 3 — Make it survive unplug/replug and reboot

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-rules

The 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 .ko modules built above are tied to the kernel version you built them against. After a kernel upgrade, re-run the make commands in Part 2 against the new headers (or set it up properly with DKMS using debian/aic8800-usb-dkms.dkms in the upstream repo, which this guide doesn't cover).

Troubleshooting

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.

Credits

  • 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_BLUEDROID fix. Published by @wilodxd.

Related search terms

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.

About

Fix AIC8800D81/D80 USB WiFi6+BT dongle Bluetooth on Linux (Ubuntu/Pop!_OS): mode-switch fake-CD-ROM dongle + BlueZ driver patch

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages