3

我的机器(运行 Linux 内核 3.2.38)在启动时有错误的 PCI 设备子系统 ID(子设备和子供应商 ID)。如果我在系统仍处于启动状态(即热插拔)时物理拔出并重新插入 PCI 设备,它会获得正确的 ID。

请注意,它获取的错误子设备和子供应商 ID 与设备的设备和供应商 ID 相同(请参阅下面 lspci 输出中的前两行)。

以下是热插拔设备前后lspci -vvnn的输出:

热插拔前:

0b:0f.0 Bridge [0680]: Device [1a88:4d45] (rev 05)
Subsystem: Device [1a88:4d45]
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 32 (250ns min, 63750ns max)
Interrupt: pin A routed to IRQ 10
Region 0: I/O ports at 2100 [size=256]
Region 1: I/O ports at 2000 [size=256]
Region 2: Memory at 92920000 (32-bit, non-prefetchable) [size=64]

热插拔后:

0b:0f.0 Bridge [0680]: Device [1a88:4d45] (rev 05)
Subsystem: Device [007d:5a14]
Control: I/O- Mem- BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Interrupt: pin A routed to IRQ 10
Region 0: I/O ports at 2100 [disabled] [size=256]
Region 1: I/O ports at 2000 [disabled] [size=256]
Region 2: [virtual] Memory at 92920000 (32-bit, non-prefetchable) [size=64]

我的问题:有没有办法在不热插拔设备的情况下修复 ID?例如,强制内核重新读取 PCI 设备 ID,例如通过执行 PCI 总线重新扫描/重新枚举/重新配置?

任何帮助将不胜感激。谢谢。

PS。请注意,即使启动到 UEFI 内部 shell,问题也与内核/软件无关。

聚苯乙烯。本例中的 PCI 设备是MEN F206N,“我的机器”是MEN F22P

4

2 回答 2

4

您可以通过以下方式强制重新扫描 PCI:

# echo 1 > /sys/bus/pci/rescan

于 2014-08-01T11:25:12.903 回答
1

在热插拔设备之前和之后仔细查看您的 lscpi 输出会显示比子设备/供应商 ID 更多的增量。如果设备在热插拔后按预期运行,我会感到惊讶。

此外,强制 PCI 重新枚举是不可能的,主要是因为可能有其他设备已经正确枚举并且已经运行。您希望重新枚举如何处理这个问题?(还有其他原因。)

普拉富拉

于 2014-04-16T23:03:01.557 回答