Can't read e1000 NIC EEPROM on NetBSD guest
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
QEMU |
Fix Released
|
Undecided
|
Unassigned |
Bug Description
QEMU Version: qemu-0.12.4
Host OS: NetBSD/i386 5.0.2
Guest OS: NetBSD/i386 5.1_RC1
On this environment, guest NetBSD tries to attach e1000 NIC using its own wm(4) driver but fails to read EEPROM as the following:
---
NetBSD 5.1_RC1 (GENERIC) #0: Sat Apr 24 23:26:09 UTC 2010
<email address hidden>
netbsd-
total memory = 127 MB
avail memory = 113 MB
Bochs Bochs
:
drm at vga1 not configured
wm0 at pci0 dev 3 function 0: Intel i82540EM 1000BASE-T Ethernet, rev. 3
wm0: interrupting at irq 11
wm0: unable to read Ethernet address
isa0 at pcib0
:
---
You can reproduce this with NetBSD/i386 install CD image:
ftp://ftp.
% qemu -cdrom i386cd-5.1_RC1.iso -boot d
---in QEMU window---
[type ^C to quit installer]
# dmesg | grep wm0
------
Per DBGOUT(EEPROM) messages, it show too large eecd_state.bitnum values, i.e. EEPROM state is not reset properly.
The set_eecd() function in e1000.c clears EEPROM internal state values on SK rising edge during CS==L.
But according to FM93C06 EEPROM (which is MicroWire compatible) data sheet,
EEPROM internal status should be cleared on CS rise edge regardless of SK input:
"... a rising edge on this signal is required to reset the internal state-machine to accept a new cycle .."
Intel's em driver seems to explicitly raise and lower SK output after CS is negated in em_standby_eeprom()
so many other OSes that use Intel's driver don't have this problem with current e1000.c implementation,
but I can't find articles that say the MICROWIRE or EEPROM spec requires such sequence.
With the attached patch, NetBSD guest properly gets MAC address from e1000 NIC EEPROM.
Changed in qemu: | |
status: | Incomplete → Fix Committed |
Changed in qemu: | |
status: | Fix Committed → Fix Released |
I applied this patch against qemu.git and it does indeed fix the issue for netbsd referenced in the bug. Please submit this patch against upstream qemu.git and include a Signed-off-by: in the patch.