|
@@ -1001,11 +1001,15 @@ static int gem_rx(struct macb_queue *queue, int budget)
|
|
|
|
|
|
|
|
rxused = (desc->addr & MACB_BIT(RX_USED)) ? true : false;
|
|
rxused = (desc->addr & MACB_BIT(RX_USED)) ? true : false;
|
|
|
addr = macb_get_addr(bp, desc);
|
|
addr = macb_get_addr(bp, desc);
|
|
|
- ctrl = desc->ctrl;
|
|
|
|
|
|
|
|
|
|
if (!rxused)
|
|
if (!rxused)
|
|
|
break;
|
|
break;
|
|
|
|
|
|
|
|
|
|
+ /* Ensure ctrl is at least as up-to-date as rxused */
|
|
|
|
|
+ dma_rmb();
|
|
|
|
|
+
|
|
|
|
|
+ ctrl = desc->ctrl;
|
|
|
|
|
+
|
|
|
queue->rx_tail++;
|
|
queue->rx_tail++;
|
|
|
count++;
|
|
count++;
|
|
|
|
|
|
|
@@ -1180,11 +1184,14 @@ static int macb_rx(struct macb_queue *queue, int budget)
|
|
|
/* Make hw descriptor updates visible to CPU */
|
|
/* Make hw descriptor updates visible to CPU */
|
|
|
rmb();
|
|
rmb();
|
|
|
|
|
|
|
|
- ctrl = desc->ctrl;
|
|
|
|
|
-
|
|
|
|
|
if (!(desc->addr & MACB_BIT(RX_USED)))
|
|
if (!(desc->addr & MACB_BIT(RX_USED)))
|
|
|
break;
|
|
break;
|
|
|
|
|
|
|
|
|
|
+ /* Ensure ctrl is at least as up-to-date as addr */
|
|
|
|
|
+ dma_rmb();
|
|
|
|
|
+
|
|
|
|
|
+ ctrl = desc->ctrl;
|
|
|
|
|
+
|
|
|
if (ctrl & MACB_BIT(RX_SOF)) {
|
|
if (ctrl & MACB_BIT(RX_SOF)) {
|
|
|
if (first_frag != -1)
|
|
if (first_frag != -1)
|
|
|
discard_partial_frame(queue, first_frag, tail);
|
|
discard_partial_frame(queue, first_frag, tail);
|