diff options
author | yongari <yongari@FreeBSD.org> | 2009-12-14 19:08:11 +0000 |
---|---|---|
committer | yongari <yongari@FreeBSD.org> | 2009-12-14 19:08:11 +0000 |
commit | fb3e5ec422251b7f02b1b44f79c1bc4ae3da20b1 (patch) | |
tree | f30e34f7d9d7f21a73381900605e8ed70e85bd63 /sys/dev/vge | |
parent | 3d6f6d0125d1b67a61a41bbc2811104081560b0b (diff) | |
download | FreeBSD-src-fb3e5ec422251b7f02b1b44f79c1bc4ae3da20b1.zip FreeBSD-src-fb3e5ec422251b7f02b1b44f79c1bc4ae3da20b1.tar.gz |
Clear VGE_TXDESC_Q bit for transmitted frames. The VGE_TXDESC_Q bit
seems to work like a tag that indicates 'not list end' of queued
frames. Without having a VGE_TXDESC_Q bit indicates 'list end'. So
the last frame of multiple queued frames has no VGE_TXDESC_Q bit.
The hardware has peculiar behavior for VGE_TXDESC_Q bit handling.
If the VGE_TXDESC_Q bit of descriptor was set the controller would
fetch next descriptor. However if next descriptor's OWN bit was
cleared but VGE_TXDESC_Q was set, it could confuse controller.
Clearing VGE_TXDESC_Q bit for transmitted frames ensure correct
behavior.
Diffstat (limited to 'sys/dev/vge')
-rw-r--r-- | sys/dev/vge/if_vge.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/sys/dev/vge/if_vge.c b/sys/dev/vge/if_vge.c index 5123f55..0187b60 100644 --- a/sys/dev/vge/if_vge.c +++ b/sys/dev/vge/if_vge.c @@ -1596,8 +1596,11 @@ vge_txeof(sc) __func__)); m_freem(txd->tx_m); txd->tx_m = NULL; + txd->tx_desc->vge_frag[0].vge_addrhi = 0; } - + bus_dmamap_sync(sc->vge_cdata.vge_tx_ring_tag, + sc->vge_cdata.vge_tx_ring_map, + BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); sc->vge_cdata.vge_tx_considx = cons; if (sc->vge_cdata.vge_tx_cnt == 0) sc->vge_timer = 0; |