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);
> }
>
>