我的机器(运行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,它也存在。
PPS。这种情况下的PCI设备是MEN F206N,"我的机器"是MEN F22P
您可以通过以下方式强制重新扫描PCI:
# echo 1 > /sys/bus/pci/rescan
仔细查看设备热插拔前后的lscpi输出,会发现更多的delta,而不仅仅是子设备/供应商ID。如果设备在热插拔后能正常工作,我会感到惊讶。
此外,强制PCI重新枚举是不可能的,主要是因为可能有其他设备已经正确枚举并运行。你希望重新就业如何应对这种情况?(还有其他原因。)
Prafulla