Hi, tht(4) is another driver still using tsleep(9).
It uses it to spin while it waits for the card to load the firmware. Then it uses it to spin for up to 2 seconds while waiting for THT_REG_INIT_STATUS. In the firmware case we can sleep for 10 milliseconds each iteration. In the THT_REG_INIT_STATUS loop we can sleep for 10 milliseconds each iteration again, but instead of using a timeout to set a flag after 2 seconds we can just count how many milliseconds we've slept. This is less precise than using the timeout but it is much simpler. Obviously we then need to remove all the timeout-related stuff from the function and the file. Thoughts? ok? Index: if_tht.c =================================================================== RCS file: /cvs/src/sys/dev/pci/if_tht.c,v retrieving revision 1.142 diff -u -p -r1.142 if_tht.c --- if_tht.c 10 Jul 2020 13:26:38 -0000 1.142 +++ if_tht.c 4 Dec 2020 03:57:21 -0000 @@ -582,7 +582,6 @@ void tht_lladdr_read(struct tht_softc void tht_lladdr_write(struct tht_softc *); int tht_sw_reset(struct tht_softc *); int tht_fw_load(struct tht_softc *); -void tht_fw_tick(void *arg); void tht_link_state(struct tht_softc *); /* interface operations */ @@ -1667,11 +1666,9 @@ tht_sw_reset(struct tht_softc *sc) int tht_fw_load(struct tht_softc *sc) { - struct timeout ticker; - volatile int ok = 1; u_int8_t *fw, *buf; size_t fwlen, wrlen; - int error = 1; + int error = 1, msecs, ret; if (loadfirmware("tht", &fw, &fwlen) != 0) return (1); @@ -1682,7 +1679,9 @@ tht_fw_load(struct tht_softc *sc) buf = fw; while (fwlen > 0) { while (tht_fifo_writable(sc, &sc->sc_txt) <= THT_FIFO_GAP) { - if (tsleep(sc, PCATCH, "thtfw", 1) == EINTR) + ret = tsleep_nsec(sc, PCATCH, "thtfw", + MSEC_TO_NSEC(10)); + if (ret == EINTR) goto err; } @@ -1695,32 +1694,21 @@ tht_fw_load(struct tht_softc *sc) buf += wrlen; } - timeout_set(&ticker, tht_fw_tick, (void *)&ok); - timeout_add_sec(&ticker, 2); - while (ok) { + for (msecs = 0; msecs < 2000; msecs += 10) { if (tht_read(sc, THT_REG_INIT_STATUS) != 0) { error = 0; break; } - - if (tsleep(sc, PCATCH, "thtinit", 1) == EINTR) + ret = tsleep_nsec(sc, PCATCH, "thtinit", MSEC_TO_NSEC(10)); + if (ret == EINTR) goto err; } - timeout_del(&ticker); tht_write(sc, THT_REG_INIT_SEMAPHORE, 0x1); err: free(fw, M_DEVBUF, fwlen); return (error); -} - -void -tht_fw_tick(void *arg) -{ - volatile int *ok = arg; - - *ok = 0; } void