我的机器(运行 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,问题也与内核/软件无关。