summaryrefslogtreecommitdiffstats
path: root/sys/dev/vge
diff options
context:
space:
mode:
authoryongari <yongari@FreeBSD.org>2009-12-14 19:08:11 +0000
committeryongari <yongari@FreeBSD.org>2009-12-14 19:08:11 +0000
commitfb3e5ec422251b7f02b1b44f79c1bc4ae3da20b1 (patch)
treef30e34f7d9d7f21a73381900605e8ed70e85bd63 /sys/dev/vge
parent3d6f6d0125d1b67a61a41bbc2811104081560b0b (diff)
downloadFreeBSD-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.c5
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;
OpenPOWER on IntegriCloud