Index: sys/dev/msk/if_msk.c =================================================================== --- sys/dev/msk/if_msk.c (revision 193879) +++ sys/dev/msk/if_msk.c (working copy) @@ -673,8 +673,7 @@ } bus_dmamap_sync(sc_if->msk_cdata.msk_rx_ring_tag, - sc_if->msk_cdata.msk_rx_ring_map, - BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); + sc_if->msk_cdata.msk_rx_ring_map, BUS_DMASYNC_PREWRITE); /* Update prefetch unit. */ sc_if->msk_cdata.msk_rx_prod = MSK_RX_RING_CNT - 1; @@ -712,8 +711,7 @@ } bus_dmamap_sync(sc_if->msk_cdata.msk_jumbo_rx_ring_tag, - sc_if->msk_cdata.msk_jumbo_rx_ring_map, - BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); + sc_if->msk_cdata.msk_jumbo_rx_ring_map, BUS_DMASYNC_PREWRITE); sc_if->msk_cdata.msk_rx_prod = MSK_JUMBO_RX_RING_CNT - 1; CSR_WRITE_2(sc_if->msk_softc, @@ -3365,12 +3363,11 @@ bus_dmamap_sync( sc_if->msk_cdata.msk_jumbo_rx_ring_tag, sc_if->msk_cdata.msk_jumbo_rx_ring_map, - BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); + BUS_DMASYNC_PREWRITE); else bus_dmamap_sync( sc_if->msk_cdata.msk_rx_ring_tag, - sc_if->msk_cdata.msk_rx_ring_map, - BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); + sc_if->msk_cdata.msk_rx_ring_map, BUS_DMASYNC_PREWRITE); CSR_WRITE_2(sc, Y2_PREF_Q_ADDR(sc_if->msk_rxq, PREF_UNIT_PUT_IDX_REG), sc_if->msk_cdata.msk_rx_prod); } @@ -3391,7 +3388,6 @@ /* Sync status LEs. */ bus_dmamap_sync(sc->msk_stat_tag, sc->msk_stat_map, BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); - /* XXX Sync Rx LEs here. */ rxput[MSK_PORT_A] = rxput[MSK_PORT_B] = 0; @@ -3401,16 +3397,9 @@ control = le32toh(sd->msk_control); if ((control & HW_OWNER) == 0) break; - /* - * Marvell's FreeBSD driver updates status LE after clearing - * HW_OWNER. However we don't have a way to sync single LE - * with bus_dma(9) API. bus_dma(9) provides a way to sync - * an entire DMA map. So don't sync LE until we have a better - * way to sync LEs. - */ control &= ~HW_OWNER; - sd->msk_control = htole32(control); status = le32toh(sd->msk_status); + sd->msk_control = 0; len = control & STLE_LEN_MASK; port = (control >> 16) & 0x01; sc_if = sc->msk_if[port]; @@ -3467,8 +3456,9 @@ break; } + bus_dmamap_sync(sc->msk_stat_tag, sc->msk_stat_map, + BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); sc->msk_stat_cons = cons; - /* XXX We should sync status LEs here. See above notes. */ if (rxput[MSK_PORT_A] > 0) msk_rxput(sc->msk_if[MSK_PORT_A]);