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
mt76x2ufrom claiming the original Xbox adapter - Force
xone_dongleto 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:
- Press the pairing button on the Xbox USB wireless adapter.
- Hold the pairing button on the Xbox controller.
- 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.
No comments:
Post a Comment