This guide outlines the technical process of installing and enabling the AIC8800 Wi-Fi driver on a Linux system using the DKMS (Dynamic Kernel Module Support) framework. The AIC8800 chipset, known for being a cost-effective Wi-Fi 6 solution, offers high-speed wireless connectivity at an affordable price, making it an excellent choice for budget-conscious users who still want the latest wireless technology.

Prerequisites

Before starting, ensure that you have the necessary dependencies:

  1. DKMS (Dynamic Kernel Module Support), which will handle automatic module rebuilds after kernel updates. You can install it by running: sudo apt-get install dkms

Step-by-Step Installation Guide

1. Clone the AIC8800-DKMS Repository

First, clone the AIC8800-DKMS repository from GitHub to your local machine:

Navigate to the downloaded directory:

2. Copy Source Files to /usr/src/

Next, copy the source code to the /usr/src/ directory so that DKMS can track and manage the module:

The 1.0.5 reflects the version number of the module. Ensure this is correct.

3. Copy Firmware Blobs

Firmware blobs are essential for the module to work properly. Copy these to the /usr/lib/firmware/ directory:

4. Install the AIC8800 Wi-Fi Module with DKMS

Now that the files are in place, use DKMS to install the module:

This command will add the AIC8800 module to DKMS, allowing it to automatically manage it during kernel upgrades.

5. Load the AIC8800 Driver

Once installed, load the driver with the following command:

This command activates the module and ensures that your system recognizes the wireless chipset supported by AIC8800.

6. Verify the Installation and Driver Activation

To confirm the installation, check the status of the DKMS module by running:

This will display the AIC8800 module version and confirm whether it is associated with the current kernel.

You can also confirm that the driver is loaded with:

If successful, this command will display information about the loaded module.

7. Reboot the System

For all changes to take effect, reboot your system:

This will ensure that the AIC8800 Wi-Fi driver is fully integrated and working as expected after the restart.

Conclusion

By following these steps, you’ve successfully installed and enabled the AIC8800 Wi-Fi driver for Linux using DKMS. The module will automatically rebuild itself after any kernel upgrades, ensuring continued support for your wireless device.

For further troubleshooting or assistance, refer to the official AIC8800 GitHub repository.

15 Responses

  1. Error while installing the module:

    dkms install aic8800/1.0.5
    Sign command: /lib/modules/6.6.9-amd64/build/scripts/sign-file
    Signing key: /var/lib/dkms/mok.key
    Public certificate (MOK): /var/lib/dkms/mok.pub

    Building module:
    Cleaning build area…
    Building module(s)………..(bad exit status: 2)
    Failed command:
    arch=’x86_64′ kernelver=’6.6.9-amd64′ ./driverctl make all
    Error! Bad return status for module build on kernel: 6.6.9-amd64 (x86_64)
    Consult /var/lib/dkms/aic8800/1.0.5/build/make.log for more information

  2. Hi.

    For 6.1.0-25-amd64 no issue.

    Today, my laptop MX LINUX updated to 6.1.0-26-amd64, then the driver not loaded anymore. Please advise.

    Building module:
    Cleaning build area…
    arch=’x86_64′ kernelver=’6.1.0-26-amd64′ ./driverctl make all….(bad exit status: 2)
    Error! Bad return status for module build on kernel: 6.1.0-26-amd64 (x86_64)
    Consult /var/lib/dkms/aic8800/1.0.5/build/make.log for more information.

  3. Hi, I’m getting the following error:

    /var/lib/dkms/aic8800/1.0.5/build/aic8800_fdrv/rwnx_rx.c:498:9: error: too few arguments to function ‘ieee80211_amsdu_to_8023s’

    What am I missing?

  4. Full log:

    DKMS make.log for aic8800-1.0.5 for kernel 6.1.0-26-amd64 (x86_64)
    dimecres, 9 d’octubre de 2024, 23:57:58 CEST
    make -C /lib/modules/6.1.0-26-amd64/build M=/var/lib/dkms/aic8800/1.0.5/build ARCH=x86_64 CROSS_COMPILE= modules
    make[1]: Entering directory ‘/usr/src/linux-headers-6.1.0-26-amd64’
    CC [M] /var/lib/dkms/aic8800/1.0.5/build/aic_load_fw/aic_bluetooth_main.o
    CC [M] /var/lib/dkms/aic8800/1.0.5/build/aic_load_fw/aicbluetooth.o
    CC [M] /var/lib/dkms/aic8800/1.0.5/build/aic8800_fdrv/rwnx_msg_tx.o
    CC [M] /var/lib/dkms/aic8800/1.0.5/build/aic_load_fw/aicwf_usb.o
    CC [M] /var/lib/dkms/aic8800/1.0.5/build/aic8800_fdrv/rwnx_msg_rx.o
    CC [M] /var/lib/dkms/aic8800/1.0.5/build/aic_load_fw/aic_txrxif.o
    CC [M] /var/lib/dkms/aic8800/1.0.5/build/aic_load_fw/aicbluetooth_cmds.o
    CC [M] /var/lib/dkms/aic8800/1.0.5/build/aic8800_fdrv/rwnx_utils.o
    CC [M] /var/lib/dkms/aic8800/1.0.5/build/aic_load_fw/aic_compat_8800d80.o
    CC [M] /var/lib/dkms/aic8800/1.0.5/build/aic_load_fw/md5.o
    CC [M] /var/lib/dkms/aic8800/1.0.5/build/aic_load_fw/aicwf_txq_prealloc.o
    CC [M] /var/lib/dkms/aic8800/1.0.5/build/aic8800_fdrv/rwnx_cmds.o
    CC [M] /var/lib/dkms/aic8800/1.0.5/build/aic8800_fdrv/rwnx_irqs.o
    CC [M] /var/lib/dkms/aic8800/1.0.5/build/aic8800_fdrv/rwnx_cfgfile.o
    CC [M] /var/lib/dkms/aic8800/1.0.5/build/aic8800_fdrv/rwnx_strs.o
    CC [M] /var/lib/dkms/aic8800/1.0.5/build/aic8800_fdrv/rwnx_rx.o
    LD [M] /var/lib/dkms/aic8800/1.0.5/build/aic_load_fw/aic_load_fw.o
    CC [M] /var/lib/dkms/aic8800/1.0.5/build/aic8800_fdrv/rwnx_tx.o
    CC [M] /var/lib/dkms/aic8800/1.0.5/build/aic8800_fdrv/rwnx_txq.o
    CC [M] /var/lib/dkms/aic8800/1.0.5/build/aic8800_fdrv/rwnx_main.o
    CC [M] /var/lib/dkms/aic8800/1.0.5/build/aic8800_fdrv/rwnx_mod_params.o
    /var/lib/dkms/aic8800/1.0.5/build/aic8800_fdrv/rwnx_rx.c: In function ‘rwnx_rx_data_skb’:
    /var/lib/dkms/aic8800/1.0.5/build/aic8800_fdrv/rwnx_rx.c:498:9: error: too few arguments to function ‘ieee80211_amsdu_to_8023s’
    498 | ieee80211_amsdu_to_8023s(skb, &list, rwnx_vif->ndev->dev_addr,
    | ^~~~~~~~~~~~~~~~~~~~~~~~
    In file included from /var/lib/dkms/aic8800/1.0.5/build/aic8800_fdrv/rwnx_defs.h:20,
    from /var/lib/dkms/aic8800/1.0.5/build/aic8800_fdrv/rwnx_rx.c:15:
    /usr/src/linux-headers-6.1.0-26-common/include/net/cfg80211.h:6334:6: note: declared here
    6334 | void ieee80211_amsdu_to_8023s(struct sk_buff *skb, struct sk_buff_head *list,
    | ^~~~~~~~~~~~~~~~~~~~~~~~
    make[3]: *** [/usr/src/linux-headers-6.1.0-26-common/scripts/Makefile.build:255: /var/lib/dkms/aic8800/1.0.5/build/aic8800_fdrv/rwnx_rx.o] Error 1
    make[3]: *** Waiting for unfinished jobs….
    make[2]: *** [/usr/src/linux-headers-6.1.0-26-common/scripts/Makefile.build:508: /var/lib/dkms/aic8800/1.0.5/build/aic8800_fdrv] Error 2
    make[1]: *** [/usr/src/linux-headers-6.1.0-26-common/Makefile:2034: /var/lib/dkms/aic8800/1.0.5/build] Error 2
    make[1]: Leaving directory ‘/usr/src/linux-headers-6.1.0-26-amd64’
    make: *** [Makefile:55: modules] Error 2

  5. Hello, driver installation was successful but dmesg log shows that the fw failed to load, detailes shown as bellow:

    ┌[gtmssj@Main] [/dev/pts/0] [1]
    └[~]> sudo dmesg | grep firmware

    [ 0.399877] Relocating firmware framebuffer to offset 0x0000000001000000[d] within [mem 0xf0000000-0xf1ffffff flags 0x14220c]
    [ 3.050405] systemd[1]: Clear Stale Hibernate Storage Info was skipped because of an unmet condition check (ConditionPathExists=/sys/firmware/efi/efivars/HibernateLocation-8cf2644b-4b0b-428f-9387-6d876050dc67).
    [ 3.340109] aic_load_firmware :firmware path = /lib/firmware/aic8800D80/fw_patch_table_8800d80_u02.bin
    [ 3.340742] aic_load_firmware: fw_patch_table_8800d80_u02.bin file failed to open
    [ 3.340746] wrong size of firmware file
    [ 4.765714] platform regulatory.0: Direct firmware load for regulatory.db failed with error -2

    please instruct what should I do next, thank you.

  6. Hello, driver installation was successful but dmesg log shows that the fw failed to load, detailes shown as bellow:

    ┌[gtmssj@Main] [/dev/pts/0] [1]
    └[~]> sudo dmesg | grep firmware

    [ 0.399877] Relocating firmware framebuffer to offset 0x0000000001000000[d] within [mem 0xf0000000-0xf1ffffff flags 0x14220c]
    [ 3.050405] systemd[1]: Clear Stale Hibernate Storage Info was skipped because of an unmet condition check (ConditionPathExists=/sys/firmware/efi/efivars/HibernateLocation-8cf2644b-4b0b-428f-9387-6d876050dc67).
    [ 3.340109] aic_load_firmware :firmware path = /lib/firmware/aic8800D80/fw_patch_table_8800d80_u02.bin
    [ 3.340742] aic_load_firmware: fw_patch_table_8800d80_u02.bin file failed to open
    [ 3.340746] wrong size of firmware file
    [ 4.765714] platform regulatory.0: Direct firmware load for regulatory.db failed with error -2

    when using “sudo modprobe aci8800_fdrv” to manually load the driver again, shows the following error msg:

    ┌[gtmssj@Main] [/dev/pts/0] [130]
    └[~]> sudo modprobe aci8800_fdrv
    [sudo] password for gtmssj:
    modprobe: FATAL: Module aci8800_fdrv not found in directory /lib/modules/6.11.2-arch1-1

    please instruct what should I do next, thank you.

  7. Error while installing the module:

    /usr/src/aic8800-1.0.5$ sudo dkms install aic8800/1.0.5
    Sign command: /usr/bin/kmodsign
    Signing key: /var/lib/shim-signed/mok/MOK.priv
    Public certificate (MOK): /var/lib/shim-signed/mok/MOK.der

    Building module:
    Cleaning build area…
    arch=’x86_64′ kernelver=’6.8.12-060812-generic’ ./driverctl make all…(bad exit status: 2)
    ERROR (dkms apport): binary package for aic8800: 1.0.5 not found
    Error! Bad return status for module build on kernel: 6.8.12-060812-generic (x86_64)
    Consult /var/lib/dkms/aic8800/1.0.5/build/make.log for more information.

  8. sudo dkms install aic8800/1.0.5

    Kernel preparation unnecessary for this kernel. Skipping…

    Building module:
    cleaning build area…
    arch=’x86_64′ kernelver=’6.8.0-49-generic’ ./driverctl make all….(bad exit status: 2)
    Error! Bad return status for module build on kernel: 6.8.0-49-generic (x86_64)
    Consult /var/lib/dkms/aic8800/1.0.5/build/make.log for more information.

    Kernel Headers are installed

  9. The compilation problem seems to stem from:

    ~/aic8800/src/aic8800_fdrv/rwnx_main.c

    …. (row 1060)
    #if (LINUX_VERSION_CODE >- KERNEL_VERSION(6, 9, 0))
    cfg80211_ch_switch_notify(vif->ndev, &csa->chandef, 0);
    #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 3, 0))
    cfg80211_ch_switch_notify(vif->ndev, &csa->chandef, 0, 0);
    #elif (LINUX_VERSION_CODE >=KERNEL_VERSION(5, 19, 2))
    cfg80211_ch_switch_notify(vif->ndev, &csa->chandef, 0);
    #else
    cfg80211_ch_switch_notify(vif->ndev, &csa->chandef);
    #endif
    …..

    In the first line there seems to be a typo “>-” instead of “>=”

    in addition:

    There is a mismatch in the expected function signature of cfg80211_ch_switch_notify between the driver source code and the Linux kernel headers for the kernel version I am building against (5.15.0-126-generic). Specifically, the driver passes too many arguments to the function cfg80211_ch_switch_notify. Only the first two arguments are accepted.

    after changing it to this, the compile errors disappeared

    #if (LINUX_VERSION_CODE >- KERNEL_VERSION(6, 9, 0))
    cfg80211_ch_switch_notify(vif->ndev, &csa->chandef);
    #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 3, 0))
    cfg80211_ch_switch_notify(vif->ndev, &csa->chandef);
    #elif (LINUX_VERSION_CODE >=KERNEL_VERSION(5, 19, 2))
    cfg80211_ch_switch_notify(vif->ndev, &csa->chandef);
    #else
    cfg80211_ch_switch_notify(vif->ndev, &csa->chandef);
    #endif
    …..

  10. The easiest way to do a proper install under linux for the AIC8800 devices below

    USB ID a69c:5721 aicsemi Aic MSC
    USB ID a69c:88dcAICSemi AIC8800DC

    Is to use the following command from the command line:

    sh -c ‘wget linux.brostrend.com/install -O /tmp/install && sh /tmp/install’

  11. Hi, I have an AX300 U2. I can install the driver on Linux 6.11.x kernel, but on 6.12.x and later, I also get a bad error.
    What should I do, please?

  12. ➜ aic8800 git:(main) dkms install aic8800/1.0.5
    Sign command: /lib/modules/6.12.20-amd64/build/scripts/sign-file
    Signing key: /var/lib/dkms/mok.key
    Public certificate (MOK): /var/lib/dkms/mok.pub

    Building module(s)………(bad exit status: 2)
    Failed command:
    arch=’x86_64′ kernelver=’6.12.20-amd64′ ./driverctl make all

    Error! Bad return status for module build on kernel: 6.12.20-amd64 (x86_64)
    Consult /var/lib/dkms/aic8800/1.0.5/build/make.log for more information.

  13. thanks from the bottom of my heart bro… spend 13 hours straight being a new linux user, just to solve this shit. At last only your modified driver worked on my ubuntu 24.04

Leave a Reply

Your email address will not be published. Required fields are marked *