That is among the reasons why ipmi is disabled.
And will remain disabled, until all the reasons are fixed.

> 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