net/bnxt: add PCI function stats to extended stats

HWRM API allows drivers to query stats per PCI function.
These stats can provide some useful information in certain
circumstances.

Signed-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>
This commit is contained in:
Ajit Khaparde 2020-04-01 22:26:29 -07:00 committed by Ferruh Yigit
parent 64261910b7
commit 5f9374de2a
5 changed files with 39 additions and 21 deletions

View File

@ -148,6 +148,7 @@ New Features
Updated Broadcom bnxt driver with new features and improvements, including:
* Added support for host based flow table management
* Added PCI function stats to extended stats
* **Added handling of mixed crypto algorithms in QAT PMD for GEN2.**

View File

@ -2261,7 +2261,8 @@ int bnxt_hwrm_func_qstats_tx_drop(struct bnxt *bp, uint16_t fid,
}
int bnxt_hwrm_func_qstats(struct bnxt *bp, uint16_t fid,
struct rte_eth_stats *stats)
struct rte_eth_stats *stats,
struct hwrm_func_qstats_output *func_qstats)
{
int rc = 0;
struct hwrm_func_qstats_input req = {.req_type = 0};
@ -2274,6 +2275,12 @@ int bnxt_hwrm_func_qstats(struct bnxt *bp, uint16_t fid,
rc = bnxt_hwrm_send_message(bp, &req, sizeof(req), BNXT_USE_CHIMP_MB);
HWRM_CHECK_RESULT();
if (func_qstats)
memcpy(func_qstats, resp,
sizeof(struct hwrm_func_qstats_output));
if (!stats)
goto exit;
stats->ipackets = rte_le_to_cpu_64(resp->rx_ucast_pkts);
stats->ipackets += rte_le_to_cpu_64(resp->rx_mcast_pkts);
@ -2293,6 +2300,7 @@ int bnxt_hwrm_func_qstats(struct bnxt *bp, uint16_t fid,
stats->ierrors = rte_le_to_cpu_64(resp->rx_drop_pkts);
stats->oerrors = rte_le_to_cpu_64(resp->tx_discard_pkts);
exit:
HWRM_UNLOCK();
return rc;

View File

@ -12,6 +12,7 @@
struct bnxt;
struct bnxt_filter_info;
struct bnxt_cp_ring_info;
struct hwrm_func_qstats_output;
#define HWRM_SEQ_ID_INVALID -1U
/* Convert Bit field location to value */
@ -112,7 +113,8 @@ int bnxt_hwrm_func_qcaps(struct bnxt *bp);
int bnxt_hwrm_func_reset(struct bnxt *bp);
int bnxt_hwrm_func_driver_unregister(struct bnxt *bp, uint32_t flags);
int bnxt_hwrm_func_qstats(struct bnxt *bp, uint16_t fid,
struct rte_eth_stats *stats);
struct rte_eth_stats *stats,
struct hwrm_func_qstats_output *func_qstats);
int bnxt_hwrm_func_qstats_tx_drop(struct bnxt *bp, uint16_t fid,
uint64_t *dropped);
int bnxt_hwrm_func_clr_stats(struct bnxt *bp, uint16_t fid);

View File

@ -547,7 +547,7 @@ int bnxt_stats_get_op(struct rte_eth_dev *eth_dev,
return rc;
}
rc = bnxt_hwrm_func_qstats(bp, 0xffff, bnxt_stats);
rc = bnxt_hwrm_func_qstats(bp, 0xffff, bnxt_stats, NULL);
return rc;
}
@ -581,10 +581,10 @@ int bnxt_dev_xstats_get_op(struct rte_eth_dev *eth_dev,
{
struct bnxt *bp = eth_dev->data->dev_private;
unsigned int count, i;
uint64_t tx_drop_pkts;
unsigned int rx_port_stats_ext_cnt;
unsigned int tx_port_stats_ext_cnt;
unsigned int stat_size = sizeof(uint64_t);
struct hwrm_func_qstats_output func_qstats = {0};
unsigned int stat_count;
int rc;
@ -597,8 +597,8 @@ int bnxt_dev_xstats_get_op(struct rte_eth_dev *eth_dev,
memset(xstats, 0, sizeof(*xstats));
bnxt_hwrm_func_qstats(bp, 0xffff, NULL, &func_qstats);
bnxt_hwrm_port_qstats(bp);
bnxt_hwrm_func_qstats_tx_drop(bp, 0xffff, &tx_drop_pkts);
bnxt_hwrm_ext_port_qstats(bp);
rx_port_stats_ext_cnt = RTE_MIN(RTE_DIM(bnxt_rx_ext_stats_strings),
(bp->fw_rx_port_stats_ext_size /
@ -608,7 +608,8 @@ int bnxt_dev_xstats_get_op(struct rte_eth_dev *eth_dev,
stat_size));
count = RTE_DIM(bnxt_rx_stats_strings) +
RTE_DIM(bnxt_tx_stats_strings) + 1/* For tx_drop_pkts */ +
RTE_DIM(bnxt_tx_stats_strings) +
RTE_DIM(bnxt_func_stats_strings) +
RTE_DIM(bnxt_rx_ext_stats_strings) +
RTE_DIM(bnxt_tx_ext_stats_strings);
stat_count = count;
@ -635,10 +636,13 @@ int bnxt_dev_xstats_get_op(struct rte_eth_dev *eth_dev,
count++;
}
/* The Tx drop pkts aka the Anti spoof coounter */
xstats[count].id = count;
xstats[count].value = rte_le_to_cpu_64(tx_drop_pkts);
count++;
for (i = 0; i < RTE_DIM(bnxt_func_stats_strings); i++) {
xstats[count].id = count;
xstats[count].value =
rte_le_to_cpu_64(((uint64_t *)&func_qstats)[i]);
count++;
}
for (i = 0; i < rx_port_stats_ext_cnt; i++) {
uint64_t *rx_stats_ext = (uint64_t *)bp->hw_rx_port_stats_ext;
@ -667,9 +671,9 @@ int bnxt_dev_xstats_get_names_op(struct rte_eth_dev *eth_dev,
struct rte_eth_xstat_name *xstats_names,
__rte_unused unsigned int limit)
{
/* Account for the Tx drop pkts aka the Anti spoof counter */
const unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) +
RTE_DIM(bnxt_tx_stats_strings) + 1 +
RTE_DIM(bnxt_tx_stats_strings) +
RTE_DIM(bnxt_func_stats_strings) +
RTE_DIM(bnxt_rx_ext_stats_strings) +
RTE_DIM(bnxt_tx_ext_stats_strings);
struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
@ -697,10 +701,12 @@ int bnxt_dev_xstats_get_names_op(struct rte_eth_dev *eth_dev,
count++;
}
strlcpy(xstats_names[count].name,
bnxt_func_stats_strings[4].name,
sizeof(xstats_names[count].name));
count++;
for (i = 0; i < RTE_DIM(bnxt_func_stats_strings); i++) {
strlcpy(xstats_names[count].name,
bnxt_func_stats_strings[i].name,
sizeof(xstats_names[count].name));
count++;
}
for (i = 0; i < RTE_DIM(bnxt_rx_ext_stats_strings); i++) {
strlcpy(xstats_names[count].name,
@ -748,9 +754,9 @@ int bnxt_dev_xstats_reset_op(struct rte_eth_dev *eth_dev)
int bnxt_dev_xstats_get_by_id_op(struct rte_eth_dev *dev, const uint64_t *ids,
uint64_t *values, unsigned int limit)
{
/* Account for the Tx drop pkts aka the Anti spoof counter */
const unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) +
RTE_DIM(bnxt_tx_stats_strings) + 1 +
RTE_DIM(bnxt_tx_stats_strings) +
RTE_DIM(bnxt_func_stats_strings) +
RTE_DIM(bnxt_rx_ext_stats_strings) +
RTE_DIM(bnxt_tx_ext_stats_strings);
struct bnxt *bp = dev->data->dev_private;
@ -781,9 +787,9 @@ int bnxt_dev_xstats_get_names_by_id_op(struct rte_eth_dev *dev,
struct rte_eth_xstat_name *xstats_names,
const uint64_t *ids, unsigned int limit)
{
/* Account for the Tx drop pkts aka the Anti spoof counter */
const unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) +
RTE_DIM(bnxt_tx_stats_strings) + 1 +
RTE_DIM(bnxt_tx_stats_strings) +
RTE_DIM(bnxt_func_stats_strings) +
RTE_DIM(bnxt_rx_ext_stats_strings) +
RTE_DIM(bnxt_tx_ext_stats_strings);
struct rte_eth_xstat_name xstats_names_copy[stat_cnt];

View File

@ -614,7 +614,8 @@ int rte_pmd_bnxt_get_vf_stats(uint16_t port,
return -ENOTSUP;
}
return bnxt_hwrm_func_qstats(bp, bp->pf.first_vf_id + vf_id, stats);
return bnxt_hwrm_func_qstats(bp, bp->pf.first_vf_id + vf_id, stats,
NULL);
}
int rte_pmd_bnxt_reset_vf_stats(uint16_t port,