struct GTeth_desc { unsigned ed_cmdsts; }; struct GTeth_softc { struct GTeth_desc txq_desc[32]; unsigned int txq_fi; unsigned int txq_nactive; }; void GTeth_txq_free (struct GTeth_softc *sc) { struct GTeth_desc *txd = &sc->txq_desc[0]; txd->ed_cmdsts &= ~(1U << (31)); } void GTeth_txq_done (struct GTeth_softc *sc) { while (sc->txq_nactive > 0) { volatile struct GTeth_desc *txd = &sc->txq_desc[sc->txq_fi]; if (txd->ed_cmdsts) { if (sc->txq_nactive == 1) return; } GTeth_txq_free (sc); } }