ethdev: make stats and xstats reset callbacks return int
[dpdk.git] / drivers / net / virtio / virtio_ethdev.c
index 62c8274..0b03b4f 100644 (file)
@@ -41,11 +41,11 @@ static int eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev);
 static int  virtio_dev_configure(struct rte_eth_dev *dev);
 static int  virtio_dev_start(struct rte_eth_dev *dev);
 static void virtio_dev_stop(struct rte_eth_dev *dev);
-static void virtio_dev_promiscuous_enable(struct rte_eth_dev *dev);
-static void virtio_dev_promiscuous_disable(struct rte_eth_dev *dev);
+static int virtio_dev_promiscuous_enable(struct rte_eth_dev *dev);
+static int virtio_dev_promiscuous_disable(struct rte_eth_dev *dev);
 static void virtio_dev_allmulticast_enable(struct rte_eth_dev *dev);
 static void virtio_dev_allmulticast_disable(struct rte_eth_dev *dev);
-static void virtio_dev_info_get(struct rte_eth_dev *dev,
+static int virtio_dev_info_get(struct rte_eth_dev *dev,
                                struct rte_eth_dev_info *dev_info);
 static int virtio_dev_link_update(struct rte_eth_dev *dev,
        int wait_to_complete);
@@ -61,7 +61,7 @@ static int virtio_dev_xstats_get(struct rte_eth_dev *dev,
 static int virtio_dev_xstats_get_names(struct rte_eth_dev *dev,
                                       struct rte_eth_xstat_name *xstats_names,
                                       unsigned limit);
-static void virtio_dev_stats_reset(struct rte_eth_dev *dev);
+static int virtio_dev_stats_reset(struct rte_eth_dev *dev);
 static void virtio_dev_free_mbufs(struct rte_eth_dev *dev);
 static int virtio_vlan_filter_set(struct rte_eth_dev *dev,
                                uint16_t vlan_id, int on);
@@ -121,7 +121,6 @@ static const struct rte_virtio_xstats_name_off rte_virtio_rxq_stat_strings[] = {
 static const struct rte_virtio_xstats_name_off rte_virtio_txq_stat_strings[] = {
        {"good_packets",           offsetof(struct virtnet_tx, stats.packets)},
        {"good_bytes",             offsetof(struct virtnet_tx, stats.bytes)},
-       {"errors",                 offsetof(struct virtnet_tx, stats.errors)},
        {"multicast_packets",      offsetof(struct virtnet_tx, stats.multicast)},
        {"broadcast_packets",      offsetof(struct virtnet_tx, stats.broadcast)},
        {"undersize_packets",      offsetof(struct virtnet_tx, stats.size_bins[0])},
@@ -747,7 +746,7 @@ virtio_dev_close(struct rte_eth_dev *dev)
        }
 }
 
-static void
+static int
 virtio_dev_promiscuous_enable(struct rte_eth_dev *dev)
 {
        struct virtio_hw *hw = dev->data->dev_private;
@@ -757,7 +756,7 @@ virtio_dev_promiscuous_enable(struct rte_eth_dev *dev)
 
        if (!vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_RX)) {
                PMD_INIT_LOG(INFO, "host does not support rx control");
-               return;
+               return -ENOTSUP;
        }
 
        ctrl.hdr.class = VIRTIO_NET_CTRL_RX;
@@ -766,11 +765,15 @@ virtio_dev_promiscuous_enable(struct rte_eth_dev *dev)
        dlen[0] = 1;
 
        ret = virtio_send_command(hw->cvq, &ctrl, dlen, 1);
-       if (ret)
+       if (ret) {
                PMD_INIT_LOG(ERR, "Failed to enable promisc");
+               return -EAGAIN;
+       }
+
+       return 0;
 }
 
-static void
+static int
 virtio_dev_promiscuous_disable(struct rte_eth_dev *dev)
 {
        struct virtio_hw *hw = dev->data->dev_private;
@@ -780,7 +783,7 @@ virtio_dev_promiscuous_disable(struct rte_eth_dev *dev)
 
        if (!vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_RX)) {
                PMD_INIT_LOG(INFO, "host does not support rx control");
-               return;
+               return -ENOTSUP;
        }
 
        ctrl.hdr.class = VIRTIO_NET_CTRL_RX;
@@ -789,8 +792,12 @@ virtio_dev_promiscuous_disable(struct rte_eth_dev *dev)
        dlen[0] = 1;
 
        ret = virtio_send_command(hw->cvq, &ctrl, dlen, 1);
-       if (ret)
+       if (ret) {
                PMD_INIT_LOG(ERR, "Failed to disable promisc");
+               return -EAGAIN;
+       }
+
+       return 0;
 }
 
 static void
@@ -944,7 +951,6 @@ virtio_update_stats(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 
                stats->opackets += txvq->stats.packets;
                stats->obytes += txvq->stats.bytes;
-               stats->oerrors += txvq->stats.errors;
 
                if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {
                        stats->q_opackets[i] = txvq->stats.packets;
@@ -1070,7 +1076,7 @@ virtio_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
        return 0;
 }
 
-static void
+static int
 virtio_dev_stats_reset(struct rte_eth_dev *dev)
 {
        unsigned int i;
@@ -1082,7 +1088,6 @@ virtio_dev_stats_reset(struct rte_eth_dev *dev)
 
                txvq->stats.packets = 0;
                txvq->stats.bytes = 0;
-               txvq->stats.errors = 0;
                txvq->stats.multicast = 0;
                txvq->stats.broadcast = 0;
                memset(txvq->stats.size_bins, 0,
@@ -1102,6 +1107,8 @@ virtio_dev_stats_reset(struct rte_eth_dev *dev)
                memset(rxvq->stats.size_bins, 0,
                       sizeof(rxvq->stats.size_bins[0]) * 8);
        }
+
+       return 0;
 }
 
 static void
@@ -1848,7 +1855,14 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev)
        struct virtio_hw *hw = eth_dev->data->dev_private;
        int ret;
 
-       RTE_BUILD_BUG_ON(RTE_PKTMBUF_HEADROOM < sizeof(struct virtio_net_hdr_mrg_rxbuf));
+       if (sizeof(struct virtio_net_hdr_mrg_rxbuf) > RTE_PKTMBUF_HEADROOM) {
+               PMD_INIT_LOG(ERR,
+                       "Not sufficient headroom required = %d, avail = %d",
+                       (int)sizeof(struct virtio_net_hdr_mrg_rxbuf),
+                       RTE_PKTMBUF_HEADROOM);
+
+               return -1;
+       }
 
        eth_dev->dev_ops = &virtio_eth_dev_ops;
 
@@ -2390,7 +2404,7 @@ virtio_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)
        return 0;
 }
 
-static void
+static int
 virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 {
        uint64_t tso_mask, host_features;
@@ -2432,6 +2446,8 @@ virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
                (1ULL << VIRTIO_NET_F_HOST_TSO6);
        if ((host_features & tso_mask) == tso_mask)
                dev_info->tx_offload_capa |= DEV_TX_OFFLOAD_TCP_TSO;
+
+       return 0;
 }
 
 /*