|
@@ -781,6 +781,7 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
|
|
|
if (*work_done >= work_to_do)
|
|
|
break;
|
|
|
(*work_done)++;
|
|
|
+ rmb(); /* read descriptor and rx_buffer_info after status DD */
|
|
|
|
|
|
status = rx_desc->status;
|
|
|
skb = buffer_info->skb;
|
|
@@ -991,6 +992,7 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter)
|
|
|
while ((eop_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) &&
|
|
|
(count < tx_ring->count)) {
|
|
|
bool cleaned = false;
|
|
|
+ rmb(); /* read buffer_info after eop_desc */
|
|
|
for (; !cleaned; count++) {
|
|
|
tx_desc = E1000_TX_DESC(*tx_ring, i);
|
|
|
buffer_info = &tx_ring->buffer_info[i];
|
|
@@ -1087,6 +1089,7 @@ static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
|
|
|
break;
|
|
|
(*work_done)++;
|
|
|
skb = buffer_info->skb;
|
|
|
+ rmb(); /* read descriptor and rx_buffer_info after status DD */
|
|
|
|
|
|
/* in the packet split case this is header only */
|
|
|
prefetch(skb->data - NET_IP_ALIGN);
|
|
@@ -1286,6 +1289,7 @@ static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter,
|
|
|
if (*work_done >= work_to_do)
|
|
|
break;
|
|
|
(*work_done)++;
|
|
|
+ rmb(); /* read descriptor and rx_buffer_info after status DD */
|
|
|
|
|
|
status = rx_desc->status;
|
|
|
skb = buffer_info->skb;
|