Can You Use USB Wi-Fi Adapters with Raspberry Pi CM5?
Testing AC600/AC1300 and Installing the Driver

The Raspberry Pi CM5 is available in models with built-in Wi-Fi. However, it is often said that the onboard antenna provides relatively weak wireless performance. To see whether an external USB Wi-Fi adapter offers a better alternative, we decided to put it to the test.

Another challenge with the Raspberry Pi 5 and CM5 generation is that many USB Wi-Fi adapters no longer work out of the box. This was rarely an issue with the Raspberry Pi 4, so many users may be surprised when their existing adapter is not recognized.

In this article, we tested both USB 2.0 and USB 3.0 Wi-Fi adapters. Although the two products use different Realtek chipsets, we will compare their performance and explain how to install the required Linux drivers.

Test Environment

The test environment is shown below.

Product: PL-R5 Industrial Raspberry Pi
Model: Raspberry Pi Compute Module 5 Rev 1.0
CPU Architecture: ARM64 (aarch64)
OS: Debian GNU/Linux 12 (Bookworm)
Kernel: 6.12.62+rpt-rpi-v8

The Wi-Fi adapters used in this evaluation were the TP-Link AC1300 and AC600. Both support 2.4 GHz and 5 GHz Wi-Fi networks.

The AC600 is a USB 2.0 device, while the AC1300 supports USB 3.0 connectivity.

Aside from their specifications, the two adapters are almost identical in size and appearance.

The AC600 is advertised as compatible with Windows and macOS, while the AC1300 officially supports Windows only. Both products include a driver CD-ROM, but neither claims Linux compatibility.

Specifications

  • AC600: 1 stream (1×1), up to 433 Mbps (theoretical)
  • AC1300: 2 streams (2×2), up to 866 Mbps (theoretical)

Driver Compatibility

Neither of the tested adapters officially supports Linux, and no official Linux drivers are provided by the manufacturer.

When using Linux, including Raspberry Pi OS, you may need to find and install a compatible third-party driver if the adapter is not supported by the standard kernel.

Driver compatibility depends on several factors, including the kernel version, wireless chipset, CPU architecture, and operating system.

Among these, the wireless chipset is the most important.

The first step is to verify that the USB device is detected and identify the chipset it uses. Installing the correct driver is essential, as the adapter will not function without it.

Identifying the Chipset (AC600 and AC1300)

Insert the Wi-Fi adapter into a USB port before running the following commands. We started by testing the AC600.

Since it is a USB device, the easiest way to identify it is with the lsusb command.

lsusb
Bus 004 Device 004: ID 2357:0120 TP-Link Archer T2U PLUS [RTL8821AU]

The adapter was successfully detected as a USB device, and the chipset was clearly identified as the Realtek RTL8821AU. The USB vendor and product ID (2357:0120) also confirmed that it is a TP-Link device.

Next, we checked the available network interfaces using the ip link command.

Because the test system does not include onboard Wi-Fi, a successfully recognized adapter should automatically create a wlan0 interface. However, no wireless interface appeared.

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 2c:cf:67:ba:f9:8e brd ff:ff:ff:ff:ff:ff
3: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000
    link/ether c8:ac:35:05:00:02 brd ff:ff:ff:ff:ff:ff

Although the USB device itself was detected correctly, the standard Raspberry Pi kernel did not create a wireless network interface, indicating that the adapter is not supported by the default driver.

AC1300

We repeated the same process with the AC1300 and identified its chipset as RTL8822BU.

The lsusb command reported the USB ID 2357:0138, but it did not display the chipset name. We therefore checked the kernel log using sudo dmesg | grep -i rtw (the chipset can also be identified with lsusb -t).

Bus 003 Device 004: ID 2357:0138 TP-Link 802.11ac NIC

Finding a Compatible Driver

Fortunately, there are community-developed Linux drivers available for many USB Wi-Fi adapters. Since other users have encountered the same issues, it is often possible to find a suitable driver with a little research.

Before looking elsewhere, however, it is worth checking whether a compatible driver is already available through the Linux package repository.

We first searched the Raspberry Pi OS package repository using apt search.

Unfortunately, there was no driver package available for the RTL8821AU chipset. The search returned packages such as rtw88_8821cu, rtw88_8821ce, and rtw88_8821c, but nothing for the RTL8821AU.

Since no suitable package was available through apt, we turned to GitHub.

The search criteria were as follows:

  • RTL8821AU (AC600)
  • RTL8822BU (AC1300)
  • Linux Kernel 6.12
  • Raspberry Pi OS Bookworm
  • ARM64

Ideally, the driver should also support DKMS (Dynamic Kernel Module Support).

  • With DKMS: The driver is automatically rebuilt whenever the kernel is updated.
  • Without DKMS: The driver must be rebuilt manually after every kernel update.

Without DKMS support, a routine OS update that installs a new kernel can cause the Wi-Fi adapter to stop working.

This may not be a major issue if the device has a keyboard and monitor connected, but it can become a serious problem for remote systems that are difficult to access physically.

The GitHub Repository We Chose

While searching GitHub, we came across another repository that recommended a particular driver. After trying it ourselves, it worked perfectly.

Repository used: https://github.com/lwfinger/rtw88

This is a downstream repository dedicated to developing, testing, and maintaining drivers for the Realtek rtw88 Wi-Fi 5 chipset family.

In other words, it backports the latest wireless-next (mainline) code developed for Linux 6.13 to older kernels, making it compatible with Raspberry Pi OS Bookworm running Kernel 6.12.

The supported device list also included both chipsets we had previously identified—RTL8821AU and RTL8822BU—so we were confident that this was the correct driver.

PCIe: RTL8723DE, RTL8812AE, RTL8814AE, RTL8821AE, RTL8821CE, RTL8822BE, RTL8822CE
SDIO: RTL8723CS, RTL8723DS, RTL8821CS, RTL8822BS, RTL8822CS
USB : RTL8723DU, RTL8811AU, RTL8811CU, RTL8812AU, RTL8812BU, RTL8812CU
USB : RTL8814AU, RTL8821AU, RTL8821CU, RTL8822BU, RTL8822CU

Better yet, the repository includes full DKMS support, making it an excellent choice for long-term maintenance.

Installing the Driver

Next, we’ll install the driver.

The installation procedure below follows the instructions provided in the lwfinger/rtw88 README and is intended for Raspberry Pi OS.

Install the Required Packages

On Raspberry Pi OS, install the required build tools first.

Although Bookworm already includes most of the required environment, it is recommended to run the following command to ensure everything is installed.

sudo apt install -y raspberrypi-kernel-headers build-essential git

The repository uses DKMS, which is not installed by default on Raspberry Pi OS, so install it as well.

sudo apt install dkms

Install the rtw88 Driver

Clone the repository, install the DKMS driver, install the required firmware, and finally copy the configuration file to the appropriate location.

git clone https://github.com/lwfinger/rtw88.git

cd rtw88
sudo dkms install $PWD

sudo make install_fw
sudo cp rtw88.conf /etc/modprobe.d/

After rebooting the system, verify that the wireless interface has been created by running the ip link command.

You should now see either wlan0 or wlan1.

Connecting to Wi-Fi

Once the driver has been installed successfully, simply configure the detected wireless interface (wlan0) to connect to your Wi-Fi network.

sudo nmcli dev wifi connect "5GHz SSID" password "Wi-Fi Password"

If the command reports that the connection has been successfully activated, the adapter is ready to use.

You can disconnect and reconnect later using the following commands.

# Disconnect
sudo nmcli dev wifi disconnect wlan0

# Reconnect
sudo nmcli con up "SSID"

If you are using the Raspberry Pi desktop environment, you can also connect to or disconnect from Wi-Fi using the network icon in the top menu bar.

Checking Signal Strength (AC600)

After confirming that the adapter was connected successfully, we evaluated its wireless performance.

To check the signal quality, we used the following command.

iw dev wlan0 link
Connected to XX:XX:XX:XX:XX:XX (on wlan0) # sample
    SSID: secret # sample
    freq: 5220
    RX: 1846814 bytes (8763 packets)
    TX: 370914443 bytes (48765 packets)
    signal: -40 dBm
    rx bitrate: 390.0 MBit/s VHT-MCS 9 80MHz VHT-NSS 1
    tx bitrate: 433.3 MBit/s VHT-MCS 9 80MHz short GI VHT-NSS 1

The three lines below are the most important.

signal: -40 dBm
rx bitrate: 390.0 MBit/s VHT-MCS 9 80MHz VHT-NSS 1
tx bitrate: 433.3 MBit/s VHT-MCS 9 80MHz short GI VHT-NSS 1

For signal strength, values closer to 0 dBm indicate a stronger signal.

  • -30 to -45 dBm: Excellent
  • -50 to -67 dBm: Good
  • Below -70 dBm: Weak

Our test measured -40 dBm, indicating an excellent wireless signal.

The notation VHT-MCS 9 80MHz VHT-NSS 1 also provides useful information.

  • VHT indicates the Wi-Fi 5 (802.11ac) transmission mode.
  • MCS 9 is the highest modulation and coding scheme supported.
  • 80 MHz is the channel bandwidth.
  • VHT-NSS 1 indicates a single spatial stream (one antenna). The AC1300 should report VHT-NSS 2, indicating two spatial streams.

(VHT stands for Very High Throughput.)

The wireless standards are commonly represented as follows:

  • 802.11nHT (Wi-Fi 4)
  • 802.11acVHT (Wi-Fi 5)
  • 802.11axHE (Wi-Fi 6)

Channel bandwidth has also increased over successive Wi-Fi generations.

  • 20 MHz
  • 40 MHz
  • 80 MHz ← Used by the adapters tested here
  • 160 MHz

Connecting the AC600 to a USB 3.0 Port

Next, we tested the AC600, which officially supports only USB 2.0, by connecting it to a USB 3.0 port.

After rebooting the system, we moved the adapter to the USB 3.0 port and ran the same command again.

The iw dev wlan0 link output was as follows.

signal: -42 dBm
rx bitrate: 351.0 MBit/s VHT-MCS 8 80MHz VHT-NSS 1
tx bitrate: 433.3 MBit/s VHT-MCS 9 80MHz short GI VHT-NSS 1

Compared with the USB 2.0 test, the received signal strength dropped slightly, while the receive link rate decreased from 390.0 Mbit/s to 351.0 Mbit/s.

In practice, however, there was almost no noticeable difference between using the adapter in a USB 2.0 or USB 3.0 port.

Checking Signal Strength (AC1300)

Next, we tested the AC1300, which supports USB 3.0, by connecting it to a USB 3.0 port.

Since the driver had already been installed, the adapter was detected automatically without any additional configuration.

Again, we checked the wireless link information.

signal: -40 dBm
rx bitrate: 780.0 MBit/s VHT-MCS 9 80MHz VHT-NSS 2
tx bitrate: 866.7 MBit/s VHT-MCS 9 80MHz short GI VHT-NSS 2

The signal strength was -40 dBm, indicating an excellent connection, similar to the AC600.

As expected, the negotiated link rates (780.0 / 866.7 Mbit/s) were significantly higher than those of the AC600.

The channel bandwidth remained 80 MHz, while the adapter correctly reported VHT-NSS 2, indicating two spatial streams.

Connecting the AC1300 to a USB 2.0 Port

As with the AC600, we rebooted the system and connected the AC1300 to the USB 2.0 port.

signal: -42 dBm
rx bitrate: 702.0 MBit/s VHT-MCS 8 80MHz VHT-NSS 2
tx bitrate: 866.7 MBit/s VHT-MCS 9 80MHz short GI VHT-NSS 2

The signal strength decreased slightly to -42 dBm, while the negotiated receive link rate dropped from 780.0 Mbit/s to 702.0 Mbit/s.

Port Selection Had Little Practical Impact

Although the AC600 is designed for USB 2.0 and the AC1300 supports USB 3.0, both adapters worked normally regardless of which USB port they were connected to.

For everyday use, the difference between USB 2.0 and USB 3.0 ports was barely noticeable in terms of either performance or usability.

Signal strength also fluctuated slightly depending on when the measurement was taken after boot.

In practice, the physical location of the USB port and the surrounding electrical noise may have a greater impact than the USB interface itself.

Although each adapter performed slightly better when connected to its intended USB port, there is little reason to use a different port unless the preferred one is already occupied.

Throughput Testing

Next, we measured the actual network throughput using iperf3.

We installed iperf3 on both the PL-R5 and a separate Mac, and started the Mac in server mode.

brew install iperf3

iperf3 -s

After installing iperf3 on the Raspberry Pi, we ran the client using the Mac’s IP address.

iperf3 -c <Mac IP address>

iperf3 Results

The final line on the Mac (receiver) side contains the measured throughput.

# AC1300
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec   359 MBytes   301 Mbits/sec    0             sender
[  5]   0.00-10.02  sec   358 MBytes   300 Mbits/sec                  receiver
# AC600
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec   163 MBytes   137 Mbits/sec    0             sender
[  5]   0.00-10.03  sec   160 MBytes   134 Mbits/sec                  receiver

The AC1300 achieved approximately 300 Mbit/s, while the AC600 reached approximately 134 Mbit/s.

Although these values are lower than their theoretical maximum link rates (866.7 Mbit/s and 433.3 Mbit/s, respectively), they represent realistic application-level throughput.

For a more accurate measurement, you can run iperf3 with four parallel streams using the -P 4 option.

iperf3 -c <IP address> -P 4
# AC600

[ ID] Interval           Transfer     Bitrate         Retr
[SUM]   0.00-10.00  sec   161 MBytes   135 Mbits/sec    0             sender
[SUM]   0.00-10.03  sec   154 MBytes   129 Mbits/sec                  receiver

# AC1300

[ ID] Interval           Transfer     Bitrate         Retr
[SUM]   0.00-10.00  sec   363 MBytes   305 Mbits/sec    0             sender
[SUM]   0.00-10.05  sec   351 MBytes   293 Mbits/sec                  receiver

The results remained consistent, indicating stable wireless performance.

Test Results and Comparison

The table below summarizes the test results.

Since Wi-Fi link speeds (RX, TX, and iperf3) vary depending on measurement timing and radio conditions, the values should be regarded as reference measurements rather than absolute figures.

In particular, the values reported by iw dev wlan0 link tend to fluctuate.

Conclusion

In our test environment using Raspberry Pi OS Bookworm, both adapters required an additional DKMS driver.

The driver used in this article is a backport of the wireless-next codebase, meaning that support for these chipsets may eventually become available in the standard Linux kernel.

Support for the RTL8822BU chipset, in particular, appears to be progressing upstream. A related discussion can be found on the official Raspberry Pi forum.

Enabling the RTW88_8821AU option adds support for the RTL8811AU/RTL8821AU family.
Source: https://forums.raspberrypi.com/viewtopic.php?t=392929

Future Raspberry Pi OS releases based on Trixie and newer kernels may include improved built-in support.

At the time of writing, however, some environments still require a DKMS/backport driver, even for the RTL8822BU chipset.

In our testing, the lwfinger/rtw88 repository provided stable and reliable operation for both adapters.

If you are using a USB Wi-Fi adapter based on the same Realtek chipsets, we recommend following the procedure described in this article.


Contributed by Raspida

Raspida operates raspida.com, a Raspberry Pi information website designed to be enjoyable even for non-engineers. Based on years of hands-on experience with Raspberry Pi, the site publishes many useful articles and topics for both experienced Raspberry Pi users and those who are interested in getting started. Raspida contributes technical blog articles about industrial Raspberry Pi products to the PiLink website.