Xbox Nano Controller (045E:0B4F) pairs over Bluetooth LE but sends no input unless BlueZ host privacy is enabled (Privacy = device)

未关闭
#3,058 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
4/5
预计耗时
3-5 天
新手友好度
48/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
活跃
技术栈
linux

调研方向

Start with the linked btmon excerpts and compare the pairing key distribution with privacy off and with Privacy = device; the issue reports that only the latter exchanges the host identity key and starts HID input notifications. Then trace the SteamOS Bluetooth configuration and the kernel SMP key distribution path described in the report. Done means the Nano sends input on a fresh bond with the stock configuration, while existing LE Secure Connections bonds still reconnect.

由索引模型根据 Issue 内容生成。

描述

Your system information
  • Steam client version: 1792618285
  • SteamOS version: 3.9.5 (build 20261023.100), kernel 7.2.7-valve2-2-neptune-72, BlueZ 5.87
  • Opted into Steam client beta?: No (stable)
  • Opted into SteamOS beta?: No (stable)
  • Have you checked for updates in Settings > System?: Yes
  • Hardware: custom desktop running SteamOS (ASUS AM5 800-series board), onboard MediaTek MT7925 Bluetooth (USB 13d3:3602)
  • Controller: Xbox Nano Controller, 045E:0B4F, firmware 6.19.50.0. It works over USB-C on this machine, and other people report it working over Bluetooth LE on macOS.
Please describe your issue in as much detail as possible:

With the stock SteamOS /etc/bluetooth/main.conf (Privacy left at the default, off), the Xbox Nano Controller pairs and connects over Bluetooth LE. Steam shows it as connected ("XInput Controller #1"), but:

  • the controller's LED never goes solid; it keeps flashing,
  • no button or stick input reaches Steam,
  • the controller powers itself off after a few minutes.

Setting Privacy = device in /etc/bluetooth/main.conf and re-pairing fixes it completely. The LED goes solid, input works immediately, and it keeps working after a reboot. That is the only change from the stock config.

Root cause, from HCI traces (btmon excerpts linked below, with keys and addresses redacted):

  • With privacy off, the kernel's SMP Pairing Request does not offer the host's identity key: Initiator key distribution: EncKey Sign LinkKey (0x0d). The kernel only adds IdKey when HCI_PRIVACY is set. The Nano answers Initiator key distribution: <none> (legacy pairing), so it never receives the host's IRK or identity address.
  • Everything else succeeds: link setup, LE encryption, full GATT/HOGP discovery, the Report Map read, and enabling the CCCDs on all three input reports (the controller acknowledges every write). The controller still never sends a single HID input notification; it only sends battery level. While connected it keeps sending connectable ADV_IND adverts (flags 0x04) and asks for peripheral latency 100. Direct ATT reads of input report 1 return a fixed neutral state even while buttons are held. The controller's HID layer simply never starts on this host.
  • With Privacy = device the host offers IdKey, and the Nano asks for it straight away: Initiator key distribution: IdKey (0x02). The host sends Identity Information and Identity Address Information, and input reports start streaming within a second (about 865 in the first 10 s).

Ruled out (no effect on the Nano): Bluetooth firmware (stock 20250305 versus linux-firmware 20261016); LE connection interval and latency (the xpadneo [LE] settings, plus a fresh pair at 7.5 to 11.25 ms with latency 0); reading the Report Map before enabling CCCDs; Wi-Fi coexistence (Wi-Fi off) and Wi-Fi power save; PCIe ASPM; signal strength (-57 dBm at 2 ft).

Other controllers on the same machine: a DualSense (Classic HID) and an Xbox Series X|S controller (045E:0B13, BLE, Secure Connections) work with or without privacy. The Series controller doesn't depend on the host IdKey.

Steps for reproducing this issue:
  1. Stock SteamOS Bluetooth config (#Privacy = off in /etc/bluetooth/main.conf).
  2. Pair an Xbox Nano Controller through Settings > Bluetooth.
  3. Steam reports it connected, but the LED keeps flashing and there is no input.
  4. Set Privacy = device in /etc/bluetooth/main.conf, restart Bluetooth (or reboot), forget the controller and pair it again. Input now works.

The same main.conf ships on Steam Deck, so Deck owners with an Xbox Nano are probably affected too. I haven't tested that on a Deck.

Suggested fix and a caveat
  • Option A: ship Privacy = device in SteamOS's /etc/bluetooth/main.conf. SteamOS already customises this file (for example FastConnectable = true).
    • Caveat, observed here: enabling privacy breaks existing bonds for LE Secure Connections devices that never received the host IRK. The host now connects from a resolvable private address that the device can't resolve. My Series X|S, bonded before the change, hit repeated supervision timeouts (0x08) on reconnect until I re-paired it. In that state Steam showed the "Xbox controllers with older firmware…" dialog even though firmware wasn't the cause. A rollout would need a re-pair prompt or some other migration.
  • Option B (upstream, less disruptive): have the kernel distribute an identity key during pairing (IRK plus identity address) even when the host doesn't use resolvable private addresses. New bonds would then satisfy controllers like the Nano without changing how existing bonds reconnect.

Possibly related:

  • #2691: an Xbox controller on a Steam Deck OLED keeps blinking while connected and drops every ~10 s, but works on macOS and over USB. It may be the same missing host identity key. Worth testing with Privacy = device plus a re-pair.
  • #2975: its one comment describes a standard Xbox controller flashing forever on SteamOS on an AMD PC, and the workaround they link includes Privacy = device.
  • #3038: another stock main.conf default (JustWorksRepairing) breaking a Bluetooth device. The mechanism is different.
  • #2884: LE reconnection problems with resolvable private addresses. This is relevant if host privacy is enabled by default.

Side note, not investigated: Steam names the Nano "XInput Controller #1", and SDL doesn't appear to have a mapping for 045E:0B4F yet.

Logs

Redacted btmon excerpts (gist): https://gist.github.com/Brandon-Haney/eb4c241fb58a71d452f11d4500768be6

  • nano_privacy_off_no_input.txt: fresh pairing with privacy off. No IdKey exchanged, only battery notifications.
  • nano_privacy_on_input_ok.txt: fresh pairing with Privacy = device. IdKey exchanged, and HID input notifications follow (first 20 shown).
主要语言
没有语言数据
星标
2.7k
派生
89
PR 合并指标
30 天内没有已合并 PR

环境准备

这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

ValveSoftware/SteamOS 的其他 Issue

查看 ValveSoftware/SteamOS 的全部 Issue

相似的 Issue

更多 Backend & API Design Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。