Commit 0dc8692e authored by Mariusz Stachura's avatar Mariusz Stachura Committed by Jeff Kirsher

i40e: fix for flow director counters not wrapping as expected

An errata with GLQF_PCNT causes it to not wrap as expected. This
can cause an error in flow director statistics. This patch resets
affected counters just after reading.
Signed-off-by: default avatarMariusz Stachura <mariusz.stachura@intel.com>
Tested-by: default avatarAndrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent e04ea002
...@@ -599,6 +599,20 @@ static void i40e_stat_update32(struct i40e_hw *hw, u32 reg, ...@@ -599,6 +599,20 @@ static void i40e_stat_update32(struct i40e_hw *hw, u32 reg,
*stat = (u32)((new_data + BIT_ULL(32)) - *offset); *stat = (u32)((new_data + BIT_ULL(32)) - *offset);
} }
/**
* i40e_stat_update_and_clear32 - read and clear hw reg, update a 32 bit stat
* @hw: ptr to the hardware info
* @reg: the hw reg to read and clear
* @stat: ptr to the stat
**/
static void i40e_stat_update_and_clear32(struct i40e_hw *hw, u32 reg, u64 *stat)
{
u32 new_data = rd32(hw, reg);
wr32(hw, reg, 1); /* must write a nonzero value to clear register */
*stat += new_data;
}
/** /**
* i40e_update_eth_stats - Update VSI-specific ethernet statistics counters. * i40e_update_eth_stats - Update VSI-specific ethernet statistics counters.
* @vsi: the VSI to be updated * @vsi: the VSI to be updated
...@@ -1040,18 +1054,15 @@ static void i40e_update_pf_stats(struct i40e_pf *pf) ...@@ -1040,18 +1054,15 @@ static void i40e_update_pf_stats(struct i40e_pf *pf)
&osd->rx_jabber, &nsd->rx_jabber); &osd->rx_jabber, &nsd->rx_jabber);
/* FDIR stats */ /* FDIR stats */
i40e_stat_update32(hw, i40e_stat_update_and_clear32(hw,
I40E_GLQF_PCNT(I40E_FD_ATR_STAT_IDX(pf->hw.pf_id)), I40E_GLQF_PCNT(I40E_FD_ATR_STAT_IDX(hw->pf_id)),
pf->stat_offsets_loaded, &nsd->fd_atr_match);
&osd->fd_atr_match, &nsd->fd_atr_match); i40e_stat_update_and_clear32(hw,
i40e_stat_update32(hw, I40E_GLQF_PCNT(I40E_FD_SB_STAT_IDX(hw->pf_id)),
I40E_GLQF_PCNT(I40E_FD_SB_STAT_IDX(pf->hw.pf_id)), &nsd->fd_sb_match);
pf->stat_offsets_loaded, i40e_stat_update_and_clear32(hw,
&osd->fd_sb_match, &nsd->fd_sb_match); I40E_GLQF_PCNT(I40E_FD_ATR_TUNNEL_STAT_IDX(hw->pf_id)),
i40e_stat_update32(hw, &nsd->fd_atr_tunnel_match);
I40E_GLQF_PCNT(I40E_FD_ATR_TUNNEL_STAT_IDX(pf->hw.pf_id)),
pf->stat_offsets_loaded,
&osd->fd_atr_tunnel_match, &nsd->fd_atr_tunnel_match);
val = rd32(hw, I40E_PRTPM_EEE_STAT); val = rd32(hw, I40E_PRTPM_EEE_STAT);
nsd->tx_lpi_status = nsd->tx_lpi_status =
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment