I ran into a weird issue getting the original large USB Wireless Adapter for Xbox One controllers working under CachyOS. The controller worked fine over Bluetooth, but I wanted to use the Microsoft USB wireless adapter instead.

This write-up covers what finally worked for me, including the issue where the adapter was being grabbed by the wrong Linux driver.

This is specifically for the original/fat Xbox One Wireless Adapter, not the smaller second-generation Xbox wireless adapter.


Hardware involved

The adapter shows up as:

045e:02e6 Microsoft Corp. XBOX ACC

In dmesg, it appears as:

Product: XBOX ACC
Manufacturer: Microsoft Inc.

The short version

The working setup was:

  • Install xone-dkms
  • Install the Xbox wireless dongle firmware
  • Make sure DKMS builds against the correct CachyOS kernel headers
  • Prevent mt76x2u from claiming the original Xbox adapter
  • Force xone_dongle to load at boot
  • Disable USB autosuspend for the adapter

Install the required packages

First install DKMS, joystick testing tools, and the matching CachyOS kernel headers.

sudo pacman -S --needed dkms linux-cachyos linux-cachyos-headers joystick jstest-gtk

If you are using a different CachyOS kernel, install the matching headers instead. For example:

sudo pacman -S --needed linux-cachyos-lts-headers
sudo pacman -S --needed linux-cachyos-bore-headers

Check your running kernel with:

uname -r

Then install xone and the dongle firmware from the AUR:

yay -S xone-dkms xone-dongle-firmware

Check DKMS status:

dkms status

A good result looks something like:

xone/0.5.8, 7.0.10-1-cachyos, x86_64: installed

Important: install the correct headers

One mistake I made was installing the stock Arch linux-headers package while actually booted into the CachyOS kernel.

That caused an error like this:

ERROR: Missing 7.0.10-arch1-1 kernel modules tree for module xone/0.5.8.

The fix was to remove the stock Arch headers and use the CachyOS headers instead:

sudo pacman -Rns linux-headers
sudo pacman -S --needed linux-cachyos linux-cachyos-headers dkms
sudo dkms autoinstall -k "$(uname -r)"

Then verify:

dkms status

The confusing part: there is no xone module

After DKMS showed xone as installed, this command still failed:

sudo modprobe xone

With:

modprobe: FATAL: Module xone not found

That is because the package is called xone, but the actual modules have names like:

xone_dongle
xone_gip
xone_gip_gamepad
xone_wired

You can confirm the installed modules with:

find "/lib/modules/$(uname -r)" -type f \( -iname '*xone*' -o -iname '*gip*' -o -iname '*xow*' \)

Load the dongle driver with:

sudo modprobe xone_dongle

The actual problem: mt76x2u was stealing the adapter

The original Xbox One wireless adapter can be incorrectly claimed by the Linux mt76x2u driver. Internally, this adapter behaves enough like a MediaTek wireless device that the kernel can attach the wrong driver first.

The bad log looked like this:

usb 3-5: New USB device found, idVendor=045e, idProduct=02e6
usb 3-5: Product: XBOX ACC
usb 3-5: Manufacturer: Microsoft Inc.
mt76x2u 3-5:1.0: ASIC revision: 76320044
mt76x2u 3-5:1.0: Firmware Version: 0.0.00

That meant the Xbox adapter was being handled by mt76x2u instead of xone_dongle.

The working module state should look more like this:

xone_gip_gamepad
xone_dongle
xone_gip

And mt76x2u should not be loaded for this adapter.


Temporary fix

Unplug the Xbox wireless adapter first.

Then run:

sudo modprobe -r mt76x2u 2>/dev/null
sudo modprobe xone_dongle

Plug the adapter back in.

Then pair the controller using the physical buttons:

  1. Press the pairing button on the Xbox USB wireless adapter.
  2. Hold the pairing button on the Xbox controller.
  3. Wait for the light to go solid.

Do not pair through KDE Bluetooth when using the USB adapter.

Test the controller with:

jstest-gtk

Or:

ls /dev/input/js*
jstest /dev/input/js0

Permanent fix: blacklist mt76x2u

Create a blacklist file:

sudo vim /etc/modprobe.d/blacklist-xbox-one-wireless-adapter.conf

Add:

# Original/fat Xbox One Wireless Adapter can be incorrectly claimed by mt76x2u.
# Let xone_dongle handle it instead.
blacklist mt76x2u

Then rebuild initramfs:

sudo mkinitcpio -P

Reboot:

sudo reboot

After reboot, check:

lsmod | grep -E 'xone|mt76x2u'

Expected good result:

xone_gip_gamepad
xone_dongle
xone_gip

There should be no mt76x2u listed.

Warning

Blacklisting mt76x2u can disable USB Wi-Fi adapters that use that MediaTek driver. If you do not use a MediaTek USB Wi-Fi dongle, this should be harmless.


Force xone_dongle to load at boot

I also created a modules-load file so the Xbox dongle driver loads at boot.

sudo vim /etc/modules-load.d/xone.conf

Add:

xone_dongle

Then rebuild initramfs again:

sudo mkinitcpio -P

Reboot and verify:

lsmod | grep -E 'xone|mt76x2u'

USB port weirdness after reboot

After getting the driver issue fixed, I still noticed that the adapter sometimes only worked after moving it to a different USB port.

The bad log looked like this:

xone-dongle 3-5:1.0: xone_mt76_write_register: control message failed: -121
xone-dongle 3-5:1.0: xone_dongle_pairing_timeout: disable pairing failed: -19

Then after moving USB ports, it worked:

input: Microsoft Xbox Controller

That suggested the driver was working, but the USB port/device state was getting wedged.


Disable USB autosuspend for the adapter

Create a udev rule:

sudo vim /etc/udev/rules.d/99-xbox-one-wireless-adapter.rules

Add:

# Original/fat Xbox One Wireless Adapter: Microsoft XBOX ACC 045e:02e6
# Prevent USB autosuspend/reset weirdness with xone_dongle.
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="045e", ATTR{idProduct}=="02e6", TEST=="power/control", ATTR{power/control}="on"

Reload udev rules:

sudo udevadm control --reload-rules
sudo udevadm trigger

Unplug and replug the adapter.

Verify the power setting:

for d in /sys/bus/usb/devices/*; do
  if [ -f "$d/idVendor" ] && [ -f "$d/idProduct" ]; then
    if grep -q 045e "$d/idVendor" && grep -q 02e6 "$d/idProduct"; then
      echo "$d"
      cat "$d/power/control"
    fi
  fi
done

Expected:

on

Recommended physical USB setup

For this original adapter, I would avoid:

  • Front-panel USB ports
  • Unpowered USB hubs
  • Ports shared with RGB controllers or audio devices
  • Ports that seem to power-save or reset oddly

Use a rear motherboard USB-A port if possible. If one port consistently works after reboot, leave the adapter there.


Optional recovery script

If the adapter gets wedged, this script reloads the relevant modules.

Create the script:

sudo vim /usr/local/bin/xbox-dongle-reset

Add:

#!/usr/bin/env bash
set -euo pipefail

echo "Unloading xone modules..."
sudo modprobe -r xone_gip_gamepad xone_dongle xone_gip 2>/dev/null || true

echo "Unloading conflicting mt76x2u if present..."
sudo modprobe -r mt76x2u 2>/dev/null || true

sleep 1

echo "Loading xone_dongle..."
sudo modprobe xone_dongle

echo "Done. Now unplug/replug the Xbox wireless adapter if it does not reconnect automatically."

Make it executable:

sudo chmod +x /usr/local/bin/xbox-dongle-reset

Run it with:

xbox-dongle-reset

Useful troubleshooting commands

Check USB detection:

lsusb | grep -i -E 'xbox|microsoft|045e'

Check loaded modules:

lsmod | grep -E 'xone|mt76|xpad'

Check kernel logs:

sudo dmesg | grep -i -E 'xbox|xone|gip|045e|02e6|mt76|firmware' | tail -120

Check input devices:

ls /dev/input/js*

Check whether Linux sees the controller:

grep -i -A8 -B2 'xbox\|microsoft\|xone' /proc/bus/input/devices

Test input:

jstest-gtk

Final working state

The final working setup had:

xone_gip_gamepad
xone_dongle
xone_gip

No mt76x2u grabbing the adapter.

The adapter showed as:

045e:02e6 Microsoft Corp. XBOX ACC

And once paired successfully, dmesg showed:

input: Microsoft Xbox Controller

At that point the Xbox controller worked normally through the original USB wireless adapter on CachyOS.