|
@@ -935,14 +935,19 @@ static void gem_rx_refill(struct macb_queue *queue)
|
|
|
|
|
|
|
|
if (entry == bp->rx_ring_size - 1)
|
|
if (entry == bp->rx_ring_size - 1)
|
|
|
paddr |= MACB_BIT(RX_WRAP);
|
|
paddr |= MACB_BIT(RX_WRAP);
|
|
|
- macb_set_addr(bp, desc, paddr);
|
|
|
|
|
desc->ctrl = 0;
|
|
desc->ctrl = 0;
|
|
|
|
|
+ /* Setting addr clears RX_USED and allows reception,
|
|
|
|
|
+ * make sure ctrl is cleared first to avoid a race.
|
|
|
|
|
+ */
|
|
|
|
|
+ dma_wmb();
|
|
|
|
|
+ macb_set_addr(bp, desc, paddr);
|
|
|
|
|
|
|
|
/* properly align Ethernet header */
|
|
/* properly align Ethernet header */
|
|
|
skb_reserve(skb, NET_IP_ALIGN);
|
|
skb_reserve(skb, NET_IP_ALIGN);
|
|
|
} else {
|
|
} else {
|
|
|
- desc->addr &= ~MACB_BIT(RX_USED);
|
|
|
|
|
desc->ctrl = 0;
|
|
desc->ctrl = 0;
|
|
|
|
|
+ dma_wmb();
|
|
|
|
|
+ desc->addr &= ~MACB_BIT(RX_USED);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|