diff options
author | yongari <yongari@FreeBSD.org> | 2010-04-07 17:12:57 +0000 |
---|---|---|
committer | yongari <yongari@FreeBSD.org> | 2010-04-07 17:12:57 +0000 |
commit | fb61fa2765f6a5279b2beb1b469333e18103249b (patch) | |
tree | f15b2437d712b7e72d9a06ef3ba1abb0942c072c | |
parent | 6f6df068298364f82e51c2ac00754b54c4eeacb4 (diff) | |
download | FreeBSD-src-fb61fa2765f6a5279b2beb1b469333e18103249b.zip FreeBSD-src-fb61fa2765f6a5279b2beb1b469333e18103249b.tar.gz |
Partial revert r204545.
Just relying on status LE ownership of status block seems to cause
poor performance. Always read current status index register first
and then check status ownership as we had before. Accessing status
index register seems to trigger immediate status update if
controller have pending status updates.
MFC after: 1 week
Reported by: Andre Albsmeier <Andre.Albsmeier <> siemens dot com>
Tested by: Andre Albsmeier <Andre.Albsmeier <> siemens dot com>
-rw-r--r-- | sys/dev/msk/if_msk.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/sys/dev/msk/if_msk.c b/sys/dev/msk/if_msk.c index 63a11ab..61b131b 100644 --- a/sys/dev/msk/if_msk.c +++ b/sys/dev/msk/if_msk.c @@ -3473,6 +3473,9 @@ msk_handle_events(struct msk_softc *sc) uint32_t control, status; int cons, len, port, rxprog; + if (sc->msk_stat_cons == CSR_READ_2(sc, STAT_PUT_IDX)) + return (0); + /* Sync status LEs. */ bus_dmamap_sync(sc->msk_stat_tag, sc->msk_stat_map, BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); @@ -3556,7 +3559,7 @@ msk_handle_events(struct msk_softc *sc) if (rxput[MSK_PORT_B] > 0) msk_rxput(sc->msk_if[MSK_PORT_B]); - return (rxprog > sc->msk_process_limit ? EAGAIN : 0); + return (sc->msk_stat_cons != CSR_READ_2(sc, STAT_PUT_IDX)); } static void |