On Tue, Nov 24, 2020 at 07:20:46PM -0600, Scott Cheloha wrote: > 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?
I don't see why the upper bound would have to be so precise. Why not just for (i = 0; i < 3000; i += 100) { if (CSR_READ_2(sc, AN_EVENT_STAT) & AN_EV_CMD) break; tsleep_nsec(sc, PWAIT, "anatch", MSEC_TO_NSEC(100)); } > > 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); > } > >