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);
        }

Reply via email to