mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
e1000: correctly set isc_pause_frames only when XOFF increases
From Jake: The e1000 driver sets the iflib shared context isc_pause_frames value to the number of received xoff frames. This is done so that the iflib watchdog timer won't trigger a Tx Hang due to pause frames. Unfortunately, the function simply sets it to the value of the xoffrxc counter. Once the device has received a single XOFF packet, the driver always reports that we received pause frames. This will prevent the Tx hang detection entirely from that point on. Fix this by assigning isc_pause_frames to a non-zero value if we received any XOFF packets in the last timer interval. We could attempt to calculate the total number of received packets by doing a subtraction, but the iflib stack only seems to check if isc_pause_frames is non-zero. Signed-off-by: Jacob Keller <jacob.e.keller@intel.com> Submitted by: Jacob Keller <jacob.e.keller@intel.com> Reviewed by: gallatin@ Sponsored by: Intel Corporation Differential Revision: https://reviews.freebsd.org/D21868
This commit is contained in:
parent
fd9d16bddb
commit
ea0e3f4db5
1 changed files with 3 additions and 1 deletions
|
|
@ -3903,6 +3903,7 @@ em_disable_aspm(struct adapter *adapter)
|
|||
static void
|
||||
em_update_stats_counters(struct adapter *adapter)
|
||||
{
|
||||
u64 prev_xoffrxc = adapter->stats.xoffrxc;
|
||||
|
||||
if(adapter->hw.phy.media_type == e1000_media_type_copper ||
|
||||
(E1000_READ_REG(&adapter->hw, E1000_STATUS) & E1000_STATUS_LU)) {
|
||||
|
|
@ -3926,7 +3927,8 @@ em_update_stats_counters(struct adapter *adapter)
|
|||
** For watchdog management we need to know if we have been
|
||||
** paused during the last interval, so capture that here.
|
||||
*/
|
||||
adapter->shared->isc_pause_frames = adapter->stats.xoffrxc;
|
||||
if (adapter->stats.xoffrxc != prev_xoffrxc)
|
||||
adapter->shared->isc_pause_frames = 1;
|
||||
adapter->stats.xofftxc += E1000_READ_REG(&adapter->hw, E1000_XOFFTXC);
|
||||
adapter->stats.fcruc += E1000_READ_REG(&adapter->hw, E1000_FCRUC);
|
||||
adapter->stats.prc64 += E1000_READ_REG(&adapter->hw, E1000_PRC64);
|
||||
|
|
|
|||
Loading…
Reference in a new issue