The sleep duration is in milliseconds. We can rip out the timeval and tvtohz(9) and use MSEC_TO_NSEC() directly instead. I've added a local "msecs" variable because "timo" (a) feels a bit ambiguous and (b) is used with different units earlier in the same function.
ok? Index: pci/ips.c =================================================================== RCS file: /cvs/src/sys/dev/pci/ips.c,v retrieving revision 1.113 diff -u -p -r1.113 ips.c --- pci/ips.c 14 Aug 2016 04:08:03 -0000 1.113 +++ pci/ips.c 11 Jan 2020 08:51:00 -0000 @@ -1418,8 +1418,7 @@ ips_cmd(struct ips_softc *sc, struct ips int ips_poll(struct ips_softc *sc, struct ips_ccb *ccb) { - struct timeval tv; - int error, timo; + int error, msecs, timo; splassert(IPL_BIO); @@ -1436,14 +1435,11 @@ ips_poll(struct ips_softc *sc, struct ip } } else { /* sleep */ - timo = ccb->c_xfer ? ccb->c_xfer->timeout : IPS_TIMEOUT; - tv.tv_sec = timo / 1000; - tv.tv_usec = (timo % 1000) * 1000; - timo = tvtohz(&tv); + msecs = ccb->c_xfer ? ccb->c_xfer->timeout : IPS_TIMEOUT; - DPRINTF(IPS_D_XFER, ("%s: ips_poll: sleep %d hz\n", - sc->sc_dev.dv_xname, timo)); - tsleep(ccb, PRIBIO + 1, "ipscmd", timo); + DPRINTF(IPS_D_XFER, ("%s: ips_poll: sleep %d ms\n", + sc->sc_dev.dv_xname, msecs)); + tsleep_nsec(ccb, PRIBIO + 1, "ipscmd", MSEC_TO_NSEC(msecs)); } DPRINTF(IPS_D_XFER, ("%s: ips_poll: state %d\n", sc->sc_dev.dv_xname, ccb->c_state));