diff options
Diffstat (limited to 'drivers/net/e1000e/netdev.c')
-rw-r--r-- | drivers/net/e1000e/netdev.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index 36d31a416320..c3dd590d87b2 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
@@ -781,6 +781,7 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, | |||
781 | if (*work_done >= work_to_do) | 781 | if (*work_done >= work_to_do) |
782 | break; | 782 | break; |
783 | (*work_done)++; | 783 | (*work_done)++; |
784 | rmb(); /* read descriptor and rx_buffer_info after status DD */ | ||
784 | 785 | ||
785 | status = rx_desc->status; | 786 | status = rx_desc->status; |
786 | skb = buffer_info->skb; | 787 | skb = buffer_info->skb; |
@@ -991,6 +992,7 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter) | |||
991 | while ((eop_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) && | 992 | while ((eop_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) && |
992 | (count < tx_ring->count)) { | 993 | (count < tx_ring->count)) { |
993 | bool cleaned = false; | 994 | bool cleaned = false; |
995 | rmb(); /* read buffer_info after eop_desc */ | ||
994 | for (; !cleaned; count++) { | 996 | for (; !cleaned; count++) { |
995 | tx_desc = E1000_TX_DESC(*tx_ring, i); | 997 | tx_desc = E1000_TX_DESC(*tx_ring, i); |
996 | buffer_info = &tx_ring->buffer_info[i]; | 998 | buffer_info = &tx_ring->buffer_info[i]; |
@@ -1087,6 +1089,7 @@ static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, | |||
1087 | break; | 1089 | break; |
1088 | (*work_done)++; | 1090 | (*work_done)++; |
1089 | skb = buffer_info->skb; | 1091 | skb = buffer_info->skb; |
1092 | rmb(); /* read descriptor and rx_buffer_info after status DD */ | ||
1090 | 1093 | ||
1091 | /* in the packet split case this is header only */ | 1094 | /* in the packet split case this is header only */ |
1092 | prefetch(skb->data - NET_IP_ALIGN); | 1095 | prefetch(skb->data - NET_IP_ALIGN); |
@@ -1286,6 +1289,7 @@ static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter, | |||
1286 | if (*work_done >= work_to_do) | 1289 | if (*work_done >= work_to_do) |
1287 | break; | 1290 | break; |
1288 | (*work_done)++; | 1291 | (*work_done)++; |
1292 | rmb(); /* read descriptor and rx_buffer_info after status DD */ | ||
1289 | 1293 | ||
1290 | status = rx_desc->status; | 1294 | status = rx_desc->status; |
1291 | skb = buffer_info->skb; | 1295 | skb = buffer_info->skb; |