Index: sys/dev/rtwn/if_rtwn.c
===================================================================
--- sys/dev/rtwn/if_rtwn.c	(revision 301778)
+++ sys/dev/rtwn/if_rtwn.c	(working copy)
@@ -586,6 +586,9 @@
 
 	if (rx_ring->desc_dmat != NULL) {
 		if (rx_ring->desc != NULL) {
+			bus_dmamap_sync(rx_ring->desc_dmat,
+			    rx_ring->desc_map,
+			    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
 			bus_dmamap_unload(rx_ring->desc_dmat,
 			    rx_ring->desc_map);
 			bus_dmamem_free(rx_ring->desc_dmat, rx_ring->desc,
@@ -600,6 +603,8 @@
 		rx_data = &rx_ring->rx_data[i];
 
 		if (rx_data->m != NULL) {
+			bus_dmamap_sync(rx_ring->data_dmat,
+			    rx_data->map, BUS_DMASYNC_POSTREAD);
 			bus_dmamap_unload(rx_ring->data_dmat, rx_data->map);
 			m_freem(rx_data->m);
 			rx_data->m = NULL;
@@ -643,6 +648,8 @@
 		device_printf(sc->sc_dev, "could not load desc DMA map\n");
 		goto fail;
 	}
+	bus_dmamap_sync(tx_ring->desc_dmat, tx_ring->desc_map,
+	    BUS_DMASYNC_PREWRITE);
 
 	error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0,
 	    BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, MCLBYTES,
@@ -691,6 +698,8 @@
 		    sizeof(desc->nextdescaddr)));
 
 		if (tx_data->m != NULL) {
+			bus_dmamap_sync(tx_ring->data_dmat, tx_data->map,
+			    BUS_DMASYNC_POSTWRITE);
 			bus_dmamap_unload(tx_ring->data_dmat, tx_data->map);
 			m_freem(tx_data->m);
 			tx_data->m = NULL;
@@ -718,6 +727,8 @@
 
 	if (tx_ring->desc_dmat != NULL) {
 		if (tx_ring->desc != NULL) {
+			bus_dmamap_sync(tx_ring->desc_dmat,
+			    tx_ring->desc_map, BUS_DMASYNC_POSTWRITE);
 			bus_dmamap_unload(tx_ring->desc_dmat,
 			    tx_ring->desc_map);
 			bus_dmamem_free(tx_ring->desc_dmat, tx_ring->desc,
@@ -730,6 +741,8 @@
 		tx_data = &tx_ring->tx_data[i];
 
 		if (tx_data->m != NULL) {
+			bus_dmamap_sync(tx_ring->data_dmat, tx_data->map,
+			    BUS_DMASYNC_POSTWRITE);
 			bus_dmamap_unload(tx_ring->data_dmat, tx_data->map);
 			m_freem(tx_data->m);
 			tx_data->m = NULL;
@@ -1761,7 +1774,10 @@
 		if (le32toh(tx_desc->txdw0) & R92C_TXDW0_OWN)
 			continue;
 
-		bus_dmamap_unload(tx_ring->desc_dmat, tx_ring->desc_map);
+		/* Unmap and free mbuf. */
+		bus_dmamap_sync(tx_ring->data_dmat, tx_data->map,
+		    BUS_DMASYNC_POSTWRITE);
+		bus_dmamap_unload(tx_ring->data_dmat, tx_data->map);
 
 		/*
 		 * XXX TODO: figure out whether the transmit succeeded or not.
@@ -1771,8 +1787,10 @@
 		tx_data->ni = NULL;
 		tx_data->m = NULL;
 
-		sc->sc_tx_timer = 0;
-		tx_ring->queued--;
+		if (--tx_ring->queued)
+			sc->sc_tx_timer = 5;
+		else
+			sc->sc_tx_timer = 0;
 	}
 
 	if (tx_ring->queued < (RTWN_TX_LIST_COUNT - 1))
