|
@@ -4275,7 +4275,7 @@ static cycle_t e1000e_cyclecounter_read(const struct cyclecounter *cc)
|
|
|
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
|
|
@@ -4283,21 +4283,21 @@ static cycle_t e1000e_cyclecounter_read(const struct cyclecounter *cc)
|
|
|
* 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;
|