net/i40e/base: add function to read LPI statistics

There was no time duration statistics for LPI (Low Power Idle)
in EEE (Energy-Efficient Ethernet).
Added new procedure to get duration values from FW.
Otherwise there is no available procedure to get tx_lpi_duration
and rx_lpi_duration values.

Signed-off-by: Jaroslaw Gawin <jaroslawx.gawin@intel.com>
Signed-off-by: Xiaolong Ye <xiaolong.ye@intel.com>
Acked-by: Qi Zhang <qi.z.zhang@intel.com>
Acked-by: Beilei Xing <beilei.xing@intel.com>
This commit is contained in:
Xiaolong Ye 2020-01-13 10:39:43 +08:00 committed by Ferruh Yigit
parent bf1551fdb9
commit 76e874a71c
3 changed files with 61 additions and 0 deletions

View File

@ -7083,6 +7083,62 @@ enum i40e_status_code i40e_get_lpi_counters(struct i40e_hw *hw,
return I40E_SUCCESS;
}
/**
* i40e_get_lpi_duration - read LPI time duration from EEE statistics
* @hw: pointer to the hw struct
* @stat: pointer to structure with status of rx and tx lpi
* @tx_duration: pointer to memory for TX LPI time duration
* @rx_duration: pointer to memory for RX LPI time duration
*
* Read Low Power Idle (LPI) mode time duration from Energy Efficient
* Ethernet (EEE) statistics.
*/
enum i40e_status_code i40e_get_lpi_duration(struct i40e_hw *hw,
struct i40e_hw_port_stats *stat,
u64 *tx_duration, u64 *rx_duration)
{
u32 tx_time_dur, rx_time_dur;
enum i40e_status_code retval;
u32 cmd_status;
if (hw->device_id != I40E_DEV_ID_10G_BASE_T_BC)
return I40E_ERR_NOT_IMPLEMENTED;
retval = i40e_aq_run_phy_activity
(hw, I40E_AQ_RUN_PHY_ACT_ID_USR_DFND,
I40E_AQ_RUN_PHY_ACT_DNL_OPCODE_GET_EEE_DUR,
&cmd_status, &tx_time_dur, &rx_time_dur, NULL);
if (retval)
return retval;
if ((cmd_status & I40E_AQ_RUN_PHY_ACT_CMD_STAT_MASK) !=
I40E_AQ_RUN_PHY_ACT_CMD_STAT_SUCC)
return I40E_ERR_ADMIN_QUEUE_ERROR;
if (hw->phy.link_info.link_speed == I40E_LINK_SPEED_1GB &&
!tx_time_dur && !rx_time_dur &&
stat->tx_lpi_status && stat->rx_lpi_status) {
retval = i40e_aq_run_phy_activity
(hw, I40E_AQ_RUN_PHY_ACT_ID_USR_DFND,
I40E_AQ_RUN_PHY_ACT_DNL_OPCODE_GET_EEE_STAT_DUR,
&cmd_status,
&tx_time_dur, &rx_time_dur, NULL);
if (retval)
return retval;
if ((cmd_status & I40E_AQ_RUN_PHY_ACT_CMD_STAT_MASK) !=
I40E_AQ_RUN_PHY_ACT_CMD_STAT_SUCC)
return I40E_ERR_ADMIN_QUEUE_ERROR;
tx_time_dur = 0;
rx_time_dur = 0;
}
*tx_duration = tx_time_dur;
*rx_duration = rx_time_dur;
return retval;
}
/**
* i40e_lpi_stat_update - update LPI counters with values relative to offset
* @hw: pointer to the hw struct

View File

@ -82,6 +82,9 @@ enum i40e_status_code i40e_lpi_stat_update(struct i40e_hw *hw,
bool offset_loaded, u64 *tx_offset,
u64 *tx_stat, u64 *rx_offset,
u64 *rx_stat);
enum i40e_status_code i40e_get_lpi_duration(struct i40e_hw *hw,
struct i40e_hw_port_stats *stat,
u64 *tx_duration, u64 *rx_duration);
/* admin send queue commands */
enum i40e_status_code i40e_aq_get_firmware_version(struct i40e_hw *hw,

View File

@ -1498,6 +1498,8 @@ struct i40e_hw_port_stats {
u32 rx_lpi_status;
u64 tx_lpi_count; /* etlpic */
u64 rx_lpi_count; /* erlpic */
u64 tx_lpi_duration;
u64 rx_lpi_duration;
};
/* Checksum and Shadow RAM pointers */