struct e1000_adapter *adapter = container_of(cc, struct e1000_adapter,
                                                     cc);
        struct e1000_hw *hw = &adapter->hw;
-       u32 systimel_1, systimel_2, systimeh;
+       u32 systimel, systimeh;
        cycle_t systim, systim_next;
        /* SYSTIMH latching upon SYSTIML read does not work well.
         * This means that if SYSTIML overflows after we read it but before
         * will experience a huge non linear increment in the systime value
         * to fix that we test for overflow and if true, we re-read systime.
         */
-       systimel_1 = er32(SYSTIML);
+       systimel = er32(SYSTIML);
        systimeh = er32(SYSTIMH);
-       systimel_2 = er32(SYSTIML);
-       /* Check for overflow. If there was no overflow, use the values */
-       if (systimel_1 <= systimel_2) {
-               systim = (cycle_t)systimel_1;
-               systim |= (cycle_t)systimeh << 32;
-       } else {
-               /* There was an overflow, read again SYSTIMH, and use
-                * systimel_2
-                */
-               systimeh = er32(SYSTIMH);
-               systim = (cycle_t)systimel_2;
-               systim |= (cycle_t)systimeh << 32;
+       /* Is systimel is so large that overflow is possible? */
+       if (systimel >= (u32)0xffffffff - E1000_TIMINCA_INCVALUE_MASK) {
+               u32 systimel_2 = er32(SYSTIML);
+               if (systimel > systimel_2) {
+                       /* There was an overflow, read again SYSTIMH, and use
+                        * systimel_2
+                        */
+                       systimeh = er32(SYSTIMH);
+                       systimel = systimel_2;
+               }
        }
+       systim = (cycle_t)systimel;
+       systim |= (cycle_t)systimeh << 32;
 
        if ((hw->mac.type == e1000_82574) || (hw->mac.type == e1000_82583)) {
                u64 time_delta, rem, temp;