Index: sys/dev/ichsmb/ichsmb.c =================================================================== --- sys/dev/ichsmb/ichsmb.c +++ sys/dev/ichsmb/ichsmb.c @@ -608,7 +608,8 @@ sc->ich_cmd = -1; bus_write_1(sc->io_res, ICH_HST_STA, status); - wakeup(sc); + if (!cold) + wakeup(sc); break; } @@ -637,8 +638,25 @@ KASSERT(sc->ich_cmd != -1, ("%s: ich_cmd=%d\n", __func__ , sc->ich_cmd)); mtx_assert(&sc->mutex, MA_OWNED); - error = msleep(sc, &sc->mutex, PZERO, "ichsmb", hz / 4); - DBG("msleep -> %d\n", error); + if (cold) { + const u_int timeout_us = hz / 4 * 1000; + const u_int delay_us = 500; + u_int i; + + error = EWOULDBLOCK; + for (i = 0; i < timeout_us; i += delay_us) { + mtx_unlock(&sc->mutex); + DELAY(delay_us); + mtx_lock(&sc->mutex); + if (sc->ich_cmd == -1) { + error = 0; + break; + } + } + } else { + error = msleep(sc, &sc->mutex, PZERO, "ichsmb", hz / 4); + DBG("msleep -> %d\n", error); + } switch (error) { case 0: smb_error = sc->smb_error;