|
@@ -3525,22 +3525,30 @@ s32 e1000e_get_base_timinca(struct e1000_adapter *adapter, u32 *timinca)
|
|
switch (hw->mac.type) {
|
|
switch (hw->mac.type) {
|
|
case e1000_pch2lan:
|
|
case e1000_pch2lan:
|
|
case e1000_pch_lpt:
|
|
case e1000_pch_lpt:
|
|
- case e1000_pch_spt:
|
|
|
|
- /* On I217, I218 and I219, the clock frequency is 25MHz
|
|
|
|
- * or 96MHz as indicated by the System Clock Frequency
|
|
|
|
- * Indication
|
|
|
|
- */
|
|
|
|
- if (((hw->mac.type != e1000_pch_lpt) &&
|
|
|
|
- (hw->mac.type != e1000_pch_spt)) ||
|
|
|
|
- (er32(TSYNCRXCTL) & E1000_TSYNCRXCTL_SYSCFI)) {
|
|
|
|
|
|
+ if (er32(TSYNCRXCTL) & E1000_TSYNCRXCTL_SYSCFI) {
|
|
/* Stable 96MHz frequency */
|
|
/* Stable 96MHz frequency */
|
|
incperiod = INCPERIOD_96MHz;
|
|
incperiod = INCPERIOD_96MHz;
|
|
incvalue = INCVALUE_96MHz;
|
|
incvalue = INCVALUE_96MHz;
|
|
shift = INCVALUE_SHIFT_96MHz;
|
|
shift = INCVALUE_SHIFT_96MHz;
|
|
adapter->cc.shift = shift + INCPERIOD_SHIFT_96MHz;
|
|
adapter->cc.shift = shift + INCPERIOD_SHIFT_96MHz;
|
|
|
|
+ } else {
|
|
|
|
+ /* Stable 25MHz frequency */
|
|
|
|
+ incperiod = INCPERIOD_25MHz;
|
|
|
|
+ incvalue = INCVALUE_25MHz;
|
|
|
|
+ shift = INCVALUE_SHIFT_25MHz;
|
|
|
|
+ adapter->cc.shift = shift;
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case e1000_pch_spt:
|
|
|
|
+ if (er32(TSYNCRXCTL) & E1000_TSYNCRXCTL_SYSCFI) {
|
|
|
|
+ /* Stable 24MHz frequency */
|
|
|
|
+ incperiod = INCPERIOD_24MHz;
|
|
|
|
+ incvalue = INCVALUE_24MHz;
|
|
|
|
+ shift = INCVALUE_SHIFT_24MHz;
|
|
|
|
+ adapter->cc.shift = shift;
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
- /* fall-through */
|
|
|
|
|
|
+ return -EINVAL;
|
|
case e1000_82574:
|
|
case e1000_82574:
|
|
case e1000_82583:
|
|
case e1000_82583:
|
|
/* Stable 25MHz frequency */
|
|
/* Stable 25MHz frequency */
|
|
@@ -4273,9 +4281,16 @@ static cycle_t e1000e_cyclecounter_read(const struct cyclecounter *cc)
|
|
cc);
|
|
cc);
|
|
struct e1000_hw *hw = &adapter->hw;
|
|
struct e1000_hw *hw = &adapter->hw;
|
|
cycle_t systim, systim_next;
|
|
cycle_t systim, systim_next;
|
|
|
|
+ /* SYSTIMH latching upon SYSTIML read does not work well. To fix that
|
|
|
|
+ * we don't want to allow overflow of SYSTIML and a change to SYSTIMH
|
|
|
|
+ * to occur between reads, so if we read a vale close to overflow, we
|
|
|
|
+ * wait for overflow to occur and read both registers when its safe.
|
|
|
|
+ */
|
|
|
|
+ u32 systim_overflow_latch_fix = 0x3FFFFFFF;
|
|
|
|
|
|
- /* latch SYSTIMH on read of SYSTIML */
|
|
|
|
- systim = (cycle_t)er32(SYSTIML);
|
|
|
|
|
|
+ do {
|
|
|
|
+ systim = (cycle_t)er32(SYSTIML);
|
|
|
|
+ } while (systim > systim_overflow_latch_fix);
|
|
systim |= (cycle_t)er32(SYSTIMH) << 32;
|
|
systim |= (cycle_t)er32(SYSTIMH) << 32;
|
|
|
|
|
|
if ((hw->mac.type == e1000_82574) || (hw->mac.type == e1000_82583)) {
|
|
if ((hw->mac.type == e1000_82574) || (hw->mac.type == e1000_82583)) {
|