This driver is for the AIC8800D80 chipset, supported by devices such as the Tenda U11 and AX913B.
Important
Choose the branch for your hardware revision before installing. If the
driver log reports chip_id=7, chip_mcu_id=1 on an AIC8800D80 or
AIC8800DC/DW device, use the
legacy-mcu1
branch. It contains the matched legacy firmware and loader profile required
to avoid the deterministic firmware upload timeout at 0x170400. Use
main when chip_mcu_id=0 or when the MCU revision is unknown.
Hardware revision determines the firmware branch. MCU1 devices should use
legacy-mcu1, which also initializes Bluetooth for the
kernel's standard btusb driver. After switching branches, rerun
sudo ./install.sh and reboot; switching the Git branch alone does not
replace the firmware already installed under /lib/firmware.
Added support for devices with Vendor ID 368B (tested).
Tested on Linux kernel 6.16 with Ubuntu 25.04 and 6.1.0.27 with Debian 12.
Note
Maintained branches: This repository now maintains two hardware branches:
main for chip_mcu_id=0 or an unknown MCU revision, and legacy-mcu1 for
chip_mcu_id=1. Wi-Fi, the kernel's standard btusb Bluetooth path, and the
device-scoped ZLP support are integrated into both branches. The former
separate bluetooth branch is retired and should no longer be used.
The same driver supports Wi-Fi-only adapters and Wi-Fi/Bluetooth combo
adapters. On combo devices, aic_load_fw uploads the AIC firmware and the
standard Linux btusb driver handles the Bluetooth HCI interface. The obsolete
custom aic_btusb module is not used.
USB device 368b:8d81 also uses the bundled aic_zlp_quirk companion module.
It adds the Bluetooth ACL bulk TX zero-length-packet behavior validated in
issue #63, while leaving
the distribution's original btusb.ko installed and bound to the device. The
quirk is filtered to that VID:PID and fails closed when the required kernel
probe support is unavailable.
I did not develop this software, The code is sourced from the Tenda U11 driver. I only made some modifications to the code to adapt it to newer kernel versions. Apart from compilation issues, I am unable to address other problems.
Before installing the driver, delete all aic8800-related folders under /lib/firmware. Using an incorrect firmware version may cause the system to freeze.
Method 1: Quick Installation (Recommended)
Copy the aic.rules file to /usr/lib/udev/rules.d/:
sudo cp aic.rules /usr/lib/udev/rules.d/Copy the firmware directories from ./fw to /lib/firmware/:
sudo cp -r ./fw/aic8800* /lib/firmware/Change to the drivers/aic8800 directory:
cd ./drivers/aic8800First, compile the driver:
makeThen, install the driver:
sudo make installFor any kernel updates, you'll need to reinstall the driver:
make clean
make
sudo make installAfter installation, load the driver with the following command:
sudo modprobe aic8800_fdrvCheck if the module is loaded correctly:
lsmod | grep aicYou should see output similar to:
aic8800_fdrv 536576 0
cfg80211 1146880 1 aic8800_fdrv
aic_load_fw 69632 1 aic8800_fdrv
usbcore 348160 10 xhci_hcd,ehci_pci,usbhid,usb_storage,ehci_hcd,xhci_pci,uas,aic_load_fw,uhci_hcd,aic8800_fdrvAfter that, plug in your USB wireless network card.
To check if the Wi-Fi interface is recognized, run:
iwconfigIf the device is still not active, check the kernel logs for any errors related to the driver:
sudo dmesgBluetooth support does not require a separate AIC transport module. After
aic_load_fw initializes a combo adapter, the kernel automatically binds its
Bluetooth interface to btusb. A Wi-Fi-only adapter does not expose that
interface, so the Bluetooth path remains inactive.
Verify the expected modules and controller with:
lsmod | grep -E 'aic_load_fw|aic8800_fdrv|aic_zlp_quirk|btusb'
lsusb -t
bluetoothctl listTo scan after a controller appears:
bluetoothctl
power on
scan onIf Bluetooth is missing or reports HCI timeouts, run the read-only diagnostic script and attach its output together with the current boot log:
chmod +x diagnose_bt.sh
sudo ./diagnose_bt.sh
sudo journalctl -k -b --no-pagerThe installer removes active references to the retired aic_btusb integration.
It does not force-load btusb or globally change the Bluetooth rfkill state;
normal kernel device matching and the user's system policy remain in control.
For 368b:8d81, verify the ZLP hook and its injection counter while Bluetooth
traffic is active:
cat /sys/module/aic_zlp_quirk/parameters/hook
cat /sys/module/aic_zlp_quirk/parameters/injectionsThe Wi-Fi-reset recovery behavior tracked in issue #53 remains a known limitation: after an airplane-mode or hotspot reset, Bluetooth may require a physical unplug/replug of the adapter.