net/avf: support stats
authorJingjing Wu <jingjing.wu@intel.com>
Wed, 10 Jan 2018 13:01:58 +0000 (21:01 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 16 Jan 2018 17:47:49 +0000 (18:47 +0100)
Signed-off-by: Jingjing Wu <jingjing.wu@intel.com>
doc/guides/nics/features/avf.ini
drivers/net/avf/avf.h
drivers/net/avf/avf_ethdev.c
drivers/net/avf/avf_vchnl.c

index 77e4f53..af84599 100644 (file)
@@ -17,6 +17,7 @@ VLAN offload         = Y
 L3 checksum offload  = Y
 L4 checksum offload  = Y
 Packet type parsing  = Y
+Basic stats          = Y
 Multiprocess aware   = Y
 BSD nic_uio          = Y
 Linux UIO            = Y
index b56ae02..97ebbad 100644 (file)
@@ -201,4 +201,6 @@ int avf_config_irq_map(struct avf_adapter *adapter);
 void avf_add_del_all_mac_addr(struct avf_adapter *adapter, bool add);
 int avf_dev_link_update(struct rte_eth_dev *dev,
                        __rte_unused int wait_to_complete);
+int avf_query_stats(struct avf_adapter *adapter,
+                   struct virtchnl_eth_stats **pstats);
 #endif /* _AVF_ETHDEV_H_ */
index d89df8d..f32d150 100644 (file)
@@ -40,6 +40,8 @@ static void avf_dev_close(struct rte_eth_dev *dev);
 static void avf_dev_info_get(struct rte_eth_dev *dev,
                             struct rte_eth_dev_info *dev_info);
 static const uint32_t *avf_dev_supported_ptypes_get(struct rte_eth_dev *dev);
+static int avf_dev_stats_get(struct rte_eth_dev *dev,
+                            struct rte_eth_stats *stats);
 
 int avf_logtype_init;
 int avf_logtype_driver;
@@ -56,6 +58,7 @@ static const struct eth_dev_ops avf_eth_dev_ops = {
        .dev_infos_get              = avf_dev_info_get,
        .dev_supported_ptypes_get   = avf_dev_supported_ptypes_get,
        .link_update                = avf_dev_link_update,
+       .stats_get                  = avf_dev_stats_get,
        .rx_queue_start             = avf_dev_rx_queue_start,
        .rx_queue_stop              = avf_dev_rx_queue_stop,
        .tx_queue_start             = avf_dev_tx_queue_start,
@@ -477,6 +480,30 @@ avf_dev_link_update(struct rte_eth_dev *dev,
        return 0;
 }
 
+static int
+avf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
+{
+       struct avf_adapter *adapter =
+               AVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
+       struct virtchnl_eth_stats *pstats = NULL;
+       int ret;
+
+       ret = avf_query_stats(adapter, &pstats);
+       if (ret == 0) {
+               stats->ipackets = pstats->rx_unicast + pstats->rx_multicast +
+                                               pstats->rx_broadcast;
+               stats->opackets = pstats->tx_broadcast + pstats->tx_multicast +
+                                               pstats->tx_unicast;
+               stats->imissed = pstats->rx_discards;
+               stats->oerrors = pstats->tx_errors + pstats->tx_discards;
+               stats->ibytes = pstats->rx_bytes;
+               stats->obytes = pstats->tx_bytes;
+       } else {
+               PMD_DRV_LOG(ERR, "Get statistics failed");
+       }
+       return -EIO;
+}
+
 static int
 avf_check_vf_reset_done(struct avf_hw *hw)
 {
index f5da601..e26527f 100644 (file)
@@ -693,3 +693,30 @@ avf_add_del_all_mac_addr(struct avf_adapter *adapter, bool add)
                begin = next_begin;
        } while (begin < AVF_NUM_MACADDR_MAX);
 }
+
+int
+avf_query_stats(struct avf_adapter *adapter,
+               struct virtchnl_eth_stats **pstats)
+{
+       struct avf_info *vf = AVF_DEV_PRIVATE_TO_VF(adapter);
+       struct virtchnl_queue_select q_stats;
+       struct avf_cmd_info args;
+       int err;
+
+       memset(&q_stats, 0, sizeof(q_stats));
+       q_stats.vsi_id = vf->vsi_res->vsi_id;
+       args.ops = VIRTCHNL_OP_GET_STATS;
+       args.in_args = (uint8_t *)&q_stats;
+       args.in_args_size = sizeof(q_stats);
+       args.out_buffer = vf->aq_resp;
+       args.out_size = AVF_AQ_BUF_SZ;
+
+       err = avf_execute_vf_cmd(adapter, &args);
+       if (err) {
+               PMD_DRV_LOG(ERR, "fail to execute command OP_GET_STATS");
+               *pstats = NULL;
+               return err;
+       }
+       *pstats = (struct virtchnl_eth_stats *)args.out_buffer;
+       return 0;
+}