|
46 | 46 | #include <linux/crash_dump.h>
|
47 | 47 | #include <net/busy_poll.h>
|
48 | 48 | #include <net/vxlan.h>
|
| 49 | +#include <net/netdev_queues.h> |
49 | 50 |
|
50 | 51 | #include "cq_enet_desc.h"
|
51 | 52 | #include "vnic_dev.h"
|
@@ -2571,6 +2572,54 @@ static void enic_clear_intr_mode(struct enic *enic)
|
2571 | 2572 | vnic_dev_set_intr_mode(enic->vdev, VNIC_DEV_INTR_MODE_UNKNOWN);
|
2572 | 2573 | }
|
2573 | 2574 |
|
| 2575 | +static void enic_get_queue_stats_rx(struct net_device *dev, int idx, |
| 2576 | + struct netdev_queue_stats_rx *rxs) |
| 2577 | +{ |
| 2578 | + struct enic *enic = netdev_priv(dev); |
| 2579 | + struct enic_rq_stats *rqstats = &enic->rq_stats[idx]; |
| 2580 | + |
| 2581 | + rxs->bytes = rqstats->bytes; |
| 2582 | + rxs->packets = rqstats->packets; |
| 2583 | + rxs->hw_drops = rqstats->bad_fcs + rqstats->pkt_truncated; |
| 2584 | + rxs->hw_drop_overruns = rqstats->pkt_truncated; |
| 2585 | + rxs->csum_unnecessary = rqstats->csum_unnecessary + |
| 2586 | + rqstats->csum_unnecessary_encap; |
| 2587 | +} |
| 2588 | + |
| 2589 | +static void enic_get_queue_stats_tx(struct net_device *dev, int idx, |
| 2590 | + struct netdev_queue_stats_tx *txs) |
| 2591 | +{ |
| 2592 | + struct enic *enic = netdev_priv(dev); |
| 2593 | + struct enic_wq_stats *wqstats = &enic->wq_stats[idx]; |
| 2594 | + |
| 2595 | + txs->bytes = wqstats->bytes; |
| 2596 | + txs->packets = wqstats->packets; |
| 2597 | + txs->csum_none = wqstats->csum_none; |
| 2598 | + txs->needs_csum = wqstats->csum_partial + wqstats->encap_csum + |
| 2599 | + wqstats->tso; |
| 2600 | + txs->hw_gso_packets = wqstats->tso; |
| 2601 | + txs->stop = wqstats->stopped; |
| 2602 | + txs->wake = wqstats->wake; |
| 2603 | +} |
| 2604 | + |
| 2605 | +static void enic_get_base_stats(struct net_device *dev, |
| 2606 | + struct netdev_queue_stats_rx *rxs, |
| 2607 | + struct netdev_queue_stats_tx *txs) |
| 2608 | +{ |
| 2609 | + rxs->bytes = 0; |
| 2610 | + rxs->packets = 0; |
| 2611 | + rxs->hw_drops = 0; |
| 2612 | + rxs->hw_drop_overruns = 0; |
| 2613 | + rxs->csum_unnecessary = 0; |
| 2614 | + txs->bytes = 0; |
| 2615 | + txs->packets = 0; |
| 2616 | + txs->csum_none = 0; |
| 2617 | + txs->needs_csum = 0; |
| 2618 | + txs->hw_gso_packets = 0; |
| 2619 | + txs->stop = 0; |
| 2620 | + txs->wake = 0; |
| 2621 | +} |
| 2622 | + |
2574 | 2623 | static const struct net_device_ops enic_netdev_dynamic_ops = {
|
2575 | 2624 | .ndo_open = enic_open,
|
2576 | 2625 | .ndo_stop = enic_stop,
|
@@ -2619,6 +2668,12 @@ static const struct net_device_ops enic_netdev_ops = {
|
2619 | 2668 | .ndo_features_check = enic_features_check,
|
2620 | 2669 | };
|
2621 | 2670 |
|
| 2671 | +static const struct netdev_stat_ops enic_netdev_stat_ops = { |
| 2672 | + .get_queue_stats_rx = enic_get_queue_stats_rx, |
| 2673 | + .get_queue_stats_tx = enic_get_queue_stats_tx, |
| 2674 | + .get_base_stats = enic_get_base_stats, |
| 2675 | +}; |
| 2676 | + |
2622 | 2677 | static void enic_dev_deinit(struct enic *enic)
|
2623 | 2678 | {
|
2624 | 2679 | unsigned int i;
|
@@ -2961,6 +3016,7 @@ static int enic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
2961 | 3016 | netdev->netdev_ops = &enic_netdev_dynamic_ops;
|
2962 | 3017 | else
|
2963 | 3018 | netdev->netdev_ops = &enic_netdev_ops;
|
| 3019 | + netdev->stat_ops = &enic_netdev_stat_ops; |
2964 | 3020 |
|
2965 | 3021 | netdev->watchdog_timeo = 2 * HZ;
|
2966 | 3022 | enic_set_ethtool_ops(netdev);
|
|
0 commit comments