It looks like the Supermicro X9SCM BIOS lies about the presence of a BMC.
This board does not have a BMC but OpenBSD 5.9 tries to attach it and fails
with the following panic:
...
acpibtn0 at acpi0: SLPB
acpibtn1 at acpi0: PWRB
panic: ipmi0: sendcmd fails
Starting stack trace...
panic() at panic+0x10b
ipmi_cmd_poll() at ipmi_cmd_poll+0x5c
ipmi_match() at ipmi_match+0x11f
config_scan() at config_scan+0x133
config_search() at config_search+0x129
config_found_sm() at config_found_sm+0x2b
mainbus_attach() at mainbus_attach+0x224
config_attach() at config_attach+0x1bc
cpu_configure() at cpu_configure+0x1b
main() at main+0x40d
end trace frame: 0x0, count: 4
OpenBSD 5.8 works fine though. I think the behaviour changed with rev1.84.
I also attached a workaround which is working for me.
Index: dev/ipmi.c
===================================================================
RCS file: /cvs/src/sys/dev/ipmi.c,v
retrieving revision 1.95
diff -u -p -u -p -r1.95 ipmi.c
--- dev/ipmi.c 11 Feb 2016 04:02:22 -0000 1.95
+++ dev/ipmi.c 12 May 2016 14:01:05 -0000
@@ -150,8 +150,8 @@ int get_sdr(struct ipmi_softc *, u_int16
int ipmi_sendcmd(struct ipmi_cmd *);
int ipmi_recvcmd(struct ipmi_cmd *);
-void ipmi_cmd(struct ipmi_cmd *);
-void ipmi_cmd_poll(struct ipmi_cmd *);
+int ipmi_cmd(struct ipmi_cmd *);
+int ipmi_cmd_poll(struct ipmi_cmd *);
void ipmi_cmd_wait(struct ipmi_cmd *);
void ipmi_cmd_wait_cb(void *);
@@ -1026,26 +1026,33 @@ ipmi_recvcmd(struct ipmi_cmd *c)
return (rc);
}
-void
+int
ipmi_cmd(struct ipmi_cmd *c)
{
+ int rv = 1;
+
if (cold || panicstr != NULL)
- ipmi_cmd_poll(c);
+ rv = ipmi_cmd_poll(c);
else
ipmi_cmd_wait(c);
+
+ return rv;
}
-void
+int
ipmi_cmd_poll(struct ipmi_cmd *c)
{
mtx_enter(&c->c_sc->sc_cmd_mtx);
if (ipmi_sendcmd(c)) {
- panic("%s: sendcmd fails", DEVNAME(c->c_sc));
+ mtx_leave(&c->c_sc->sc_cmd_mtx);
+ return 0; /* BIOS is lying, there is no BMC */
}
c->c_ccode = ipmi_recvcmd(c);
mtx_leave(&c->c_sc->sc_cmd_mtx);
+
+ return 1;
}
void
@@ -1671,10 +1678,11 @@ ipmi_match(struct device *parent, void *
c.c_maxrxlen = sizeof(cmd);
c.c_rxlen = 0;
c.c_data = cmd;
- ipmi_cmd(&c);
+ rv = ipmi_cmd(&c);
+
+ if (rv == 1) /* GETID worked, we got IPMI */
+ dbg_dump(1, "bmc data", c.c_rxlen, cmd);
- dbg_dump(1, "bmc data", c.c_rxlen, cmd);
- rv = 1; /* GETID worked, we got IPMI */
ipmi_unmap_regs(sc);
}