启动时我的计算机(运行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也存在。
答案 0 :(得分:3)
您可以通过以下方式强制重新扫描PCI:
# echo 1 > /sys/bus/pci/rescan
答案 1 :(得分:1)
仔细查看热插拔设备之前和之后的lscpi输出会显示更多的delta,而不仅仅是子设备/供应商ID。如果设备在热插拔后按预期运行,我会感到惊讶。
此外,强制PCI重新枚举是不可能的,主要是因为可能有其他设备已经正确枚举并且已经运行。您如何期待重新计算? (还有其他原因。)
Prafulla