diff --git a/sys/dev/isp/isp.c b/sys/dev/isp/isp.c index da00908a5566..89a37eca99cb 100644 --- a/sys/dev/isp/isp.c +++ b/sys/dev/isp/isp.c @@ -6369,7 +6369,7 @@ static const uint32_t mbpfc[] = { ISPOPMAP(0xff, 0xff), /* 0x06: MBOX_MAILBOX_REG_TEST */ ISPOPMAP(0x03, 0x07), /* 0x07: MBOX_VERIFY_CHECKSUM */ ISPOPMAP(0x01, 0x4f), /* 0x08: MBOX_ABOUT_FIRMWARE */ - ISPOPMAP(0xdf, 0x01), /* 0x09: LOAD RAM */ + ISPOPMAP(0xdf, 0x01), /* 0x09: MBOX_LOAD_RISC_RAM_2100 */ ISPOPMAP(0xdf, 0x01), /* 0x0a: DUMP RAM */ ISPOPMAP(0x1ff, 0x01), /* 0x0b: MBOX_LOAD_RISC_RAM */ ISPOPMAP(0x00, 0x00), /* 0x0c: */ diff --git a/sys/dev/isp/isp_freebsd.c b/sys/dev/isp/isp_freebsd.c index cc2bc760fa3e..ac29bbabd238 100644 --- a/sys/dev/isp/isp_freebsd.c +++ b/sys/dev/isp/isp_freebsd.c @@ -3458,42 +3458,52 @@ isp_mbox_acquire(ispsoftc_t *isp) void isp_mbox_wait_complete(ispsoftc_t *isp, mbreg_t *mbp) { - int usecs = mbp->timeout; - int j; + unsigned int usecs = mbp->timeout; + unsigned int max, olim, ilim; if (usecs == 0) { usecs = MBCMD_DEFAULT_TIMEOUT; } - if (isp->isp_mbxwrk0) { - usecs *= isp->isp_mbxwrk0; - } + max = isp->isp_mbxwrk0 + 1; + if (isp->isp_osinfo.mbox_sleep_ok) { - int ms = usecs / 1000; + unsigned int ms = (usecs + 999) / 1000; + isp->isp_osinfo.mbox_sleep_ok = 0; isp->isp_osinfo.mbox_sleeping = 1; + for (olim = 0; olim < max; olim++) { #if __FreeBSD_version < 500000 || !defined(ISP_SMPLOCK) - tsleep(&isp->isp_mbxworkp, PRIBIO, "ispmbx_sleep", - isp_mstohz(ms)); + tsleep(&isp->isp_mbxworkp, PRIBIO, "ispmbx_sleep", + isp_mstohz(ms)); #else - msleep(&isp->isp_mbxworkp, &isp->isp_mtx, PRIBIO, - "ispmbx_sleep", isp_mstohz(ms)); + msleep(&isp->isp_mbxworkp, &isp->isp_mtx, PRIBIO, + "ispmbx_sleep", isp_mstohz(ms)); #endif - isp->isp_osinfo.mbox_sleep_ok = 1; - isp->isp_osinfo.mbox_sleeping = 0; - } else { - for (j = 0; j < usecs; j += 100) { - uint32_t isr; - uint16_t sema, mbox; if (isp->isp_osinfo.mboxcmd_done) { break; } - if (ISP_READ_ISR(isp, &isr, &sema, &mbox)) { - isp_intr(isp, isr, sema, mbox); + } + isp->isp_osinfo.mbox_sleep_ok = 1; + isp->isp_osinfo.mbox_sleeping = 0; + } else { + for (olim = 0; olim < max; olim++) { + for (ilim = 0; ilim < usecs; ilim += 100) { + uint32_t isr; + uint16_t sema, mbox; if (isp->isp_osinfo.mboxcmd_done) { break; } + if (ISP_READ_ISR(isp, &isr, &sema, &mbox)) { + isp_intr(isp, isr, sema, mbox); + if (isp->isp_osinfo.mboxcmd_done) { + break; + } + } + USEC_DELAY(100); + } + if (isp->isp_osinfo.mboxcmd_done) { + break; } - USEC_DELAY(100); } } if (isp->isp_osinfo.mboxcmd_done == 0) { @@ -3524,12 +3534,16 @@ isp_mbox_release(ispsoftc_t *isp) int isp_mstohz(int ms) { + int hz; struct timeval t; t.tv_sec = ms / 1000; t.tv_usec = (ms % 1000) * 1000; - ms = tvtohz(&t); - if (ms < 0) { - ms = 0x7fffffff; + hz = tvtohz(&t); + if (hz < 0) { + hz = 0x7fffffff; } - return (ms); + if (hz == 0) { + hz = 1; + } + return (hz); } diff --git a/sys/dev/isp/ispmbox.h b/sys/dev/isp/ispmbox.h index e3652d6d7d82..829d8b6f9388 100644 --- a/sys/dev/isp/ispmbox.h +++ b/sys/dev/isp/ispmbox.h @@ -42,7 +42,7 @@ #define MBOX_MAILBOX_REG_TEST 0x0006 #define MBOX_VERIFY_CHECKSUM 0x0007 #define MBOX_ABOUT_FIRMWARE 0x0008 - /* 9 */ +#define MBOX_LOAD_RISC_RAM_2100 0x0009 /* a */ #define MBOX_LOAD_RISC_RAM 0x000b /* c */