私のマシン (Linux カーネル 3.2.38 を実行) の起動時に、PCI デバイスのサブシステム ID (サブデバイスとサブベンダー ID) が間違っています。システムがまだ起動している間に PCI デバイスを物理的に抜き差しすると (つまり、ホットプラグ)、正しい ID が取得されます。
取得した間違ったサブデバイス ID とサブベンダー ID は、デバイスのデバイス ID とベンダー ID と同じであることに注意してください (以下の lspci 出力の最初の 2 行を参照してください)。
以下は、デバイスのホットプラグ前後の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 バスの再スキャン/再列挙/再構成を実行するなどして、カーネルに PCI デバイス ID の再読み取りを強制しますか?
どんな助けでも大歓迎です。ありがとう。
PS。この問題は、UEFI 内部シェルで起動した場合でも存在するため、実際にはカーネル/ソフトウェアに関連していないことに注意してください。
PPS。この場合の PCI デバイスはMEN F206Nで、「私のマシン」はMEN F22P です。