bd_prod = RX_BD(bd_prod);
                bd_cons = RX_BD(bd_cons);
 
+               /* A rmb() is required to ensure that the CQE is not read
+                * before it is written by the adapter DMA.  PCI ordering
+                * rules will make sure the other fields are written before
+                * the marker at the end of struct eth_fast_path_rx_cqe
+                * but without rmb() a weakly ordered processor can process
+                * stale data.  Without the barrier TPA state-machine might
+                * enter inconsistent state and kernel stack might be
+                * provided with incorrect packet description - these lead
+                * to various kernel crashed.
+                */
+               rmb();
+
                cqe_fp_flags = cqe_fp->type_error_flags;
                cqe_fp_type = cqe_fp_flags & ETH_FAST_PATH_RX_CQE_TYPE;