[Bug 235944] jedec_dimm(4) does not attach to KFA2 (aka Galax) Hall of Fame DDR4 sticks

bugzilla-noreply at freebsd.org bugzilla-noreply at freebsd.org
Sat Feb 23 03:45:51 UTC 2019


https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=235944

Ravi Pokala <rpokala at panasas.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |avg at FreeBSD.org

--- Comment #8 from Ravi Pokala <rpokala at panasas.com> ---
The fact that the message from intsmb_error() comes immediately before a
message about failing to change or restore the page, means that the call that
failed was smbus_writeb(), which is ultimately handled by intsmb_writeb():

================================================================
static int
intsmb_writeb(device_t dev, u_char slave, char cmd, char byte)
{
        struct intsmb_softc *sc = device_get_softc(dev);
        int error;

        INTSMB_LOCK(sc);
        error = intsmb_free(sc);
        if (error) {
                INTSMB_UNLOCK(sc);
                return (error);
        }
        bus_write_1(sc->io_res, PIIX4_SMBHSTADD, slave & ~LSB);
        bus_write_1(sc->io_res, PIIX4_SMBHSTCMD, cmd);
        bus_write_1(sc->io_res, PIIX4_SMBHSTDAT0, byte);
        intsmb_start(sc, PIIX4_SMBHSTCNT_PROT_BDATA, 0);
        error = intsmb_stop(sc);
        INTSMB_UNLOCK(sc);
        return (error);
}
================================================================

You can see that intsmb_writeb() does not call intsmb_error() directly.
However, it does call intsmb_stop():

================================================================
static int
intsmb_stop(struct intsmb_softc *sc)
{
        int error, status;

        INTSMB_LOCK_ASSERT(sc);

        if (sc->poll || cold)
                /* So that it can use device during device probe on SMBus. */
                return (intsmb_stop_poll(sc));

        error = msleep(sc, &sc->lock, PWAIT | PCATCH, "SMBWAI", hz / 8);
        if (error == 0) {
                status = bus_read_1(sc->io_res, PIIX4_SMBHSTSTS);
                if (!(status & PIIX4_SMBHSTSTAT_BUSY)) {
                        error = intsmb_error(sc->dev, status);
                        if (error == 0 && !(status & PIIX4_SMBHSTSTAT_INTR))
                                device_printf(sc->dev, "unknown cause why?\n");
#ifdef ENABLE_ALART
                        bus_write_1(sc->io_res, PIIX4_SMBSLVCNT,
                            PIIX4_SMBSLVCNT_ALTEN);
#endif
                        return (error);
                }
        }

        /* Timeout Procedure. */
        sc->isbusy = 0;

        /* Re-enable suppressed interrupt from slave part. */
        bus_write_1(sc->io_res, PIIX4_SMBSLVCNT, PIIX4_SMBSLVCNT_ALTEN);
        if (error == EWOULDBLOCK)
                return (SMB_ETIMEOUT);
        else
                return (SMB_EABORT);
}
================================================================

Unfortunately, I'm not familiar enough with this SMBus controller -- or the
intsmb(4) driver -- to debug this further. It looks like the people who have
made functional changes in the past decade are cem@ (already CCed) and avg@
(adding).

-- 
You are receiving this mail because:
You are the assignee for the bug.


More information about the freebsd-bugs mailing list