net/avp: add device statistics operations

Adds device functions to query and reset statistics.

Signed-off-by: Allain Legacy <allain.legacy@windriver.com>
Acked-by: Vincent Jardin <vincent.jardin@6wind.com>
This commit is contained in:
Allain Legacy 2017-03-28 07:54:05 -04:00 committed by Ferruh Yigit
parent 295abce2d2
commit 5a5abe2de9
2 changed files with 70 additions and 0 deletions

View File

@ -9,5 +9,7 @@ Jumbo frame = Y
Scattered Rx = Y
Unicast MAC filter = Y
VLAN offload = Y
Basic stats = Y
Stats per queue = Y
Linux UIO = Y
x86-64 = Y

View File

@ -98,6 +98,10 @@ static uint16_t avp_xmit_pkts(void *tx_queue,
static void avp_dev_rx_queue_release(void *rxq);
static void avp_dev_tx_queue_release(void *txq);
static void avp_dev_stats_get(struct rte_eth_dev *dev,
struct rte_eth_stats *stats);
static void avp_dev_stats_reset(struct rte_eth_dev *dev);
#define AVP_DEV_TO_PCI(eth_dev) RTE_DEV_TO_PCI((eth_dev)->device)
@ -145,6 +149,8 @@ static const struct eth_dev_ops avp_eth_dev_ops = {
.dev_configure = avp_dev_configure,
.dev_infos_get = avp_dev_info_get,
.vlan_offload_set = avp_vlan_offload_set,
.stats_get = avp_dev_stats_get,
.stats_reset = avp_dev_stats_reset,
.link_update = avp_dev_link_update,
.rx_queue_setup = avp_dev_rx_queue_setup,
.rx_queue_release = avp_dev_rx_queue_release,
@ -1718,5 +1724,67 @@ avp_vlan_offload_set(struct rte_eth_dev *eth_dev, int mask)
}
}
static void
avp_dev_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats)
{
struct avp_dev *avp = AVP_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
unsigned int i;
for (i = 0; i < avp->num_rx_queues; i++) {
struct avp_queue *rxq = avp->dev_data->rx_queues[i];
if (rxq) {
stats->ipackets += rxq->packets;
stats->ibytes += rxq->bytes;
stats->ierrors += rxq->errors;
stats->q_ipackets[i] += rxq->packets;
stats->q_ibytes[i] += rxq->bytes;
stats->q_errors[i] += rxq->errors;
}
}
for (i = 0; i < avp->num_tx_queues; i++) {
struct avp_queue *txq = avp->dev_data->tx_queues[i];
if (txq) {
stats->opackets += txq->packets;
stats->obytes += txq->bytes;
stats->oerrors += txq->errors;
stats->q_opackets[i] += txq->packets;
stats->q_obytes[i] += txq->bytes;
stats->q_errors[i] += txq->errors;
}
}
}
static void
avp_dev_stats_reset(struct rte_eth_dev *eth_dev)
{
struct avp_dev *avp = AVP_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
unsigned int i;
for (i = 0; i < avp->num_rx_queues; i++) {
struct avp_queue *rxq = avp->dev_data->rx_queues[i];
if (rxq) {
rxq->bytes = 0;
rxq->packets = 0;
rxq->errors = 0;
}
}
for (i = 0; i < avp->num_tx_queues; i++) {
struct avp_queue *txq = avp->dev_data->tx_queues[i];
if (txq) {
txq->bytes = 0;
txq->packets = 0;
txq->errors = 0;
}
}
}
RTE_PMD_REGISTER_PCI(net_avp, rte_avp_pmd.pci_drv);
RTE_PMD_REGISTER_PCI_TABLE(net_avp, pci_id_avp_map);