在使用英特尔的 xHC 启用插槽命令后,如何确定 USB 设备连接到哪个根集线器端口?

How to determine on which Root Hub Port is connected a usb device after an Enable Slot Command with the Intel's xHC?

我正在为 Intel 的 xHC 编写一个小驱动程序,作为一个小爱好OS我使用 UEFI 启动。

在我重置所有 Root Hub 端口后,我得到 2 个端口状态更改事件,这是因为我要求 QEMU 在命令行中模拟 usb 键盘和 usb 鼠标。每个设备的一个端口状态更改事件似乎是公平的。在此之后,我按照 USB 设备的初始化步骤进行操作。如 xHCI 规范所述:

After the port successfully reaches the Enabled state, system software shall obtain a Device Slot for the newly attached device using an Enable Slot Command, as described in section 4.3.2.

因此,我向每个存在端口状态更改事件的根集线器端口发送启用插槽命令。这似乎有效,因为我在事件环上收到 2 个命令完成事件,它们都触发了中断。这两个事件都标有完成代码 1,表示成功。

我的问题从这里开始。在端口状态更改事件中是一个端口 ID 字段,它允许确定哪个端口触发了事件。在命令完成事件中,有 none 个。我可以 link 到触发事件的命令 TRB,但命令 TRB 不包含端口 ID。我的问题是,在启用插槽命令之后,我需要创建一个输入上下文,其中包括一个插槽上下文,该插槽上下文应包含根集线器端口号。

我可以保留一个端口列表,我向其发送了启用插槽命令,但它会出现竞争条件,尤其是在启用多处理后。

如何正确获取哪个根集线器端口触发了命令完成事件?

linux-usb 邮件列表上有人提出了类似的问题。
There, Mathias Nyman, points out that the Enable Slot is misleading 因为 它不启用特定端口的插槽 相反命令只是 returns 设备上下文基地址中的一个空闲索引数组.
此索引是 插槽 ID 值。

程序员必须使用指向 Device Context 结构的指针设置相应的条目(即 dev_ctx_base_addr[slot_id])并填充其 Slot Context 以及他们认为合适的任何 端口号路由字符串
需要强调的是 Slot IDPort Number/Route String.[=12= 之间没有先验关系]

因此您可以只拥有一个插槽队列,以便在 命令完成事件 到达时对其进行初始化和出列。