如何强制内核重新读取/重新初始化PCI设备ID?

时间:2014-04-15 16:22:38

标签: linux pci pci-e pci-bus

启动时我的计算机(运行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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

此外,强制PCI重新枚举是不可能的,主要是因为可能有其他设备已经正确枚举并且已经运行。您如何期待重新计算? (还有其他原因。)

Prafulla