|
@@ -599,6 +599,20 @@ static void i40e_stat_update32(struct i40e_hw *hw, u32 reg,
|
|
|
*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.
|
|
|
* @vsi: the VSI to be updated
|
|
@@ -1040,18 +1054,15 @@ static void i40e_update_pf_stats(struct i40e_pf *pf)
|
|
|
&osd->rx_jabber, &nsd->rx_jabber);
|
|
|
|
|
|
/* FDIR stats */
|
|
|
- i40e_stat_update32(hw,
|
|
|
- I40E_GLQF_PCNT(I40E_FD_ATR_STAT_IDX(pf->hw.pf_id)),
|
|
|
- pf->stat_offsets_loaded,
|
|
|
- &osd->fd_atr_match, &nsd->fd_atr_match);
|
|
|
- i40e_stat_update32(hw,
|
|
|
- I40E_GLQF_PCNT(I40E_FD_SB_STAT_IDX(pf->hw.pf_id)),
|
|
|
- pf->stat_offsets_loaded,
|
|
|
- &osd->fd_sb_match, &nsd->fd_sb_match);
|
|
|
- i40e_stat_update32(hw,
|
|
|
- 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);
|
|
|
+ i40e_stat_update_and_clear32(hw,
|
|
|
+ I40E_GLQF_PCNT(I40E_FD_ATR_STAT_IDX(hw->pf_id)),
|
|
|
+ &nsd->fd_atr_match);
|
|
|
+ i40e_stat_update_and_clear32(hw,
|
|
|
+ I40E_GLQF_PCNT(I40E_FD_SB_STAT_IDX(hw->pf_id)),
|
|
|
+ &nsd->fd_sb_match);
|
|
|
+ i40e_stat_update_and_clear32(hw,
|
|
|
+ I40E_GLQF_PCNT(I40E_FD_ATR_TUNNEL_STAT_IDX(hw->pf_id)),
|
|
|
+ &nsd->fd_atr_tunnel_match);
|
|
|
|
|
|
val = rd32(hw, I40E_PRTPM_EEE_STAT);
|
|
|
nsd->tx_lpi_status =
|