Hi,
Both kettenis@ and mpi@ have mentioned in private that my proposed
changes to tsleep_nsec(9) etc. would be nicer if we could just get rid
of tsleep(9) etc. entirely.
This is difficult, but I'll try.
Worst case, we thin out the remaining callers. There are not many
left.
--
So, an(4) is one such caller.
In an_wait() we spin for (3 * hz) ticks waiting for CSR_WRITE_2 to
return the AN_EV_CMD flag. There is no code handling a case where
this fails to happen.
What we do in practice is very nearly equivalent to spinning for 3
seconds waiting for CSR_WRITE_2 to return the AN_EV_CMD flag, so I
have converted it to use tsleep_nsec(9).
This compiles on amd64 but I can't test it.
Thoughts? ok?
Index: an.c
===================================================================
RCS file: /cvs/src/sys/dev/ic/an.c,v
retrieving revision 1.76
diff -u -p -r1.76 an.c
--- an.c 10 Jul 2020 13:26:37 -0000 1.76
+++ an.c 25 Nov 2020 01:19:16 -0000
@@ -678,13 +678,18 @@ an_linkstat_intr(struct an_softc *sc)
void
an_wait(struct an_softc *sc)
{
- int i;
+ struct timespec now, end;
+
+ nanouptime(&now);
+ end = now;
+ end.tv_sec += 3; /* spin for at most three seconds */
CSR_WRITE_2(sc, AN_COMMAND, AN_CMD_NOOP2);
- for (i = 0; i < 3*hz; i++) {
- if (CSR_READ_2(sc, AN_EVENT_STAT) & AN_EV_CMD)
+ while ((CSR_READ_2(sc, AN_EVENT_STAT) & AN_EV_CMD) == 0) {
+ nanouptime(&now);
+ if (timespeccmp(&end, &now, <=))
break;
- (void)tsleep(sc, PWAIT, "anatch", 1);
+ tsleep_nsec(sc, PWAIT, "anatch", MSEC_TO_NSEC(10));
}
CSR_WRITE_2(sc, AN_EVENT_ACK, AN_EV_CMD);
}