I've been trying to get OpenBSD working with a new Dell Inspiron
Zino, and I've run into what I think may be a bug in mii_physubr.c.
First, the symptoms:
(1) /bsd.rd works just fine. I can use the BCM57780 GigE
network card as bge0 and reach the network. OpenBSD installs
correctly.
(2) /bsd panics during bootup. The last lines on console read:
Starting network
panic: mii_phy_setmedia
(and then a warning about reporting errors)
This is with the 4.6 CD set, but I get the same behavior with the
latest snapshot. Looking at the source code to mii_physubr.c, I
see that the panic occurs here at line 96:
#ifdef DIAGNOSTIC
if (ife->ifm_data < 0 || ife->ifm_data >= MII_NMEDIA)
panic("mii_phy_setmedia");
#endif
It turns out that in bsd.rd, DIAGNOSTIC is not defined, so
the section is skipped and everything works. In bsd,
the value ife->ifm_data is MII_NMEDIA. After a little
more poking around, I found that ife->ifm_data is set to
MII_NMEDIA at line 461 of mii_physubr.c:
if (sc->mii_capabilities & BMSR_ANEG) {
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, sc->mii_inst),
MII_NMEDIA); /* intentionally invalid index */
}
I've put a bunch of printf's in both places, and I know
for sure that that section of code, for the BCM57780
using the bge driver and ukphy, will have BMSR_ANEG set
in mii_capabilities and will fail in this way.
BMSR_ANEG is defined in mii.h:
define BMSR_ANEG 0x0008 /* Autonegotiation capable */
Does this mean that if the network device supports Autonegotiation,
then kernel panic? I can't possibly be reading this right.
If I comment out the panic, then everything works fine: the OS
boots, the bge0 device works properly, I can reach the network,
everything is hunky dory. The system is at least stable
enough for me to be writing this email. But, I'm now running
my own hacked kernel, which is a little more bleeding edge
than I'm used to. So, what's the real bug here?
Thanks,
-Bruce