e1000e: Guarantee descriptor writeback flush success.
In rare circumstances, a descriptor writeback flush may not work if it arrives on a specific clock cycle as a writeback request is going out. Signed-off-by: Matthew Vick <matthew.vick@intel.com> Tested-by: Aaron Brown <aaron.f.brown@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
bb9e44d0d0
commit
bf03085f85
1 changed files with 17 additions and 0 deletions
|
@ -1059,6 +1059,13 @@ static void e1000_print_hw_hang(struct work_struct *work)
|
||||||
ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD);
|
ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD);
|
||||||
/* execute the writes immediately */
|
/* execute the writes immediately */
|
||||||
e1e_flush();
|
e1e_flush();
|
||||||
|
/*
|
||||||
|
* Due to rare timing issues, write to TIDV again to ensure
|
||||||
|
* the write is successful
|
||||||
|
*/
|
||||||
|
ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD);
|
||||||
|
/* execute the writes immediately */
|
||||||
|
e1e_flush();
|
||||||
adapter->tx_hang_recheck = true;
|
adapter->tx_hang_recheck = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -3616,6 +3623,16 @@ static void e1000e_flush_descriptors(struct e1000_adapter *adapter)
|
||||||
|
|
||||||
/* execute the writes immediately */
|
/* execute the writes immediately */
|
||||||
e1e_flush();
|
e1e_flush();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* due to rare timing issues, write to TIDV/RDTR again to ensure the
|
||||||
|
* write is successful
|
||||||
|
*/
|
||||||
|
ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD);
|
||||||
|
ew32(RDTR, adapter->rx_int_delay | E1000_RDTR_FPD);
|
||||||
|
|
||||||
|
/* execute the writes immediately */
|
||||||
|
e1e_flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void e1000e_update_stats(struct e1000_adapter *adapter);
|
static void e1000e_update_stats(struct e1000_adapter *adapter);
|
||||||
|
|
Loading…
Add table
Reference in a new issue