Guest hangs during option rom loading with certain cards
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
QEMU |
Fix Released
|
Undecided
|
Unassigned |
Bug Description
With a Broadcom Corporation NetXtreme II BCM57810 10 Gigabit Ethernet card, device assignment does not work. The guest hangs during option rom execution. Moreover, if an attempt is made to quit qemu when the guest is in the hung state, the card gets into an inoperable state. Only a powercycle then, restores the card back into working order, just unloading/loading the driver does not help.
Qemu version - 1.6.2 or current master
Distribution - FC19
Kernel Version - 3.12.9-
Details of the card -
# ethtool -i p2p2
driver: bnx2x
version: 1.78.17-0
firmware-version: bc 7.8.22
bus-info: 0000:08:00.1
supports-
supports-test: yes
supports-
supports-
supports-
The output of lspci when the card is broken -
03:00.0 Ethernet controller: Broadcom Corporation NetXtreme II BCM57810 10 Gigabit Ethernet (rev ff) (prog-if ff)
!!! Unknown header type 7f
Kernel driver in use: bnx2x
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
I will post if I get a chance to try out a newer than 7.8.22 for the option rom and see if this issue is fixed. However it appears we need to have a unified approach to automatically avoid loading the rom based on certain criteria. Manually, looking out for fixes to firmware and hard coding decisions based on those is neither desirable nor easy to maintain.
Based on the trace in the attachment, the sequence of config space accesses leading up to the hang -
vfio: vfio_pci_ write_config( 0000:03: 00.0, @0x78, 0x1, len=0x4) write_config( 0000:03: 00.0, @0x80, 0x9430, len=0x4) write_config( 0000:03: 00.0, @0x78, 0xa30c, len=0x4) write_config( 0000:03: 00.0, @0x80, 0x7fffffff, len=0x4) write_config( 0000:03: 00.0, @0x78, 0xa5dc, len=0x4) write_config( 0000:03: 00.0, @0x80, 0x0, len=0x4) write_config( 0000:03: 00.0, @0x78, 0xa2ec, len=0x4) write_config( 0000:03: 00.0, @0x80, 0x3, len=0x4) read_config( 0000:03: 00.0, @0x98, len=0x4) 200 write_config( 0000:03: 00.0, @0x78, 0xa408, len=0x4) read_config( 0000:03: 00.0, @0x80, len=0x4) 8
vfio: vfio_pci_
vfio: vfio_pci_
vfio: vfio_pci_
vfio: vfio_pci_
vfio: vfio_pci_
vfio: vfio_pci_
vfio: vfio_pci_
vfio: vfio_pci_
vfio: vfio_pci_
vfio: vfio_pci_
vfio: vfio_pci_ write_config( 0000:03: 00.0, @0x78, 0x86420, len=0x4) write_config( 0000:03: 00.0, @0x80, 0x4, len=0x4) write_config( 0000:03: 00.0, @0x78, 0x86420, len=0x4) read_config( 0000:03: 00.0, @0x80, len=0x4) 8
vfio: vfio_pci_
vfio: vfio_pci_
vfio: vfio_pci_
The last 4 writes co-relate to the point where the guest hangs because they get repeated forever