From: Pradeep Nalla <pradeep.na...@cavium.com>

Support ndo_get_stats64 instead of ndo_get_stats.  Also add stats for
multicast and broadcast packets.

Signed-off-by: Pradeep Nalla <pradeep.na...@cavium.com>
Acked-by: Raghu Vatsavayi <raghu.vatsav...@cavium.com>
Signed-off-by: Felix Manlunas <felix.manlu...@cavium.com>
---
 drivers/net/ethernet/cavium/liquidio/lio_core.c    |  4 +
 drivers/net/ethernet/cavium/liquidio/lio_ethtool.c | 98 +++++++++++++---------
 drivers/net/ethernet/cavium/liquidio/lio_main.c    | 52 ++++++++----
 drivers/net/ethernet/cavium/liquidio/lio_vf_main.c | 47 +++++++----
 .../net/ethernet/cavium/liquidio/liquidio_common.h |  5 ++
 5 files changed, 135 insertions(+), 71 deletions(-)

diff --git a/drivers/net/ethernet/cavium/liquidio/lio_core.c 
b/drivers/net/ethernet/cavium/liquidio/lio_core.c
index 5171dad..9cbbd07 100644
--- a/drivers/net/ethernet/cavium/liquidio/lio_core.c
+++ b/drivers/net/ethernet/cavium/liquidio/lio_core.c
@@ -1207,6 +1207,8 @@ octnet_nic_stats_callback(struct octeon_device *oct_dev,
                /* RX firmware stats */
                rstats->fw_total_rcvd = rsp_rstats->fw_total_rcvd;
                rstats->fw_total_fwd = rsp_rstats->fw_total_fwd;
+               rstats->fw_total_mcast = rsp_rstats->fw_total_mcast;
+               rstats->fw_total_bcast = rsp_rstats->fw_total_bcast;
                rstats->fw_err_pko = rsp_rstats->fw_err_pko;
                rstats->fw_err_link = rsp_rstats->fw_err_link;
                rstats->fw_err_drop = rsp_rstats->fw_err_drop;
@@ -1251,6 +1253,8 @@ octnet_nic_stats_callback(struct octeon_device *oct_dev,
                /* firmware stats */
                tstats->fw_total_sent = rsp_tstats->fw_total_sent;
                tstats->fw_total_fwd = rsp_tstats->fw_total_fwd;
+               tstats->fw_total_mcast_sent = rsp_tstats->fw_total_mcast_sent;
+               tstats->fw_total_bcast_sent = rsp_tstats->fw_total_bcast_sent;
                tstats->fw_err_pko = rsp_tstats->fw_err_pko;
                tstats->fw_err_pki = rsp_tstats->fw_err_pki;
                tstats->fw_err_link = rsp_tstats->fw_err_link;
diff --git a/drivers/net/ethernet/cavium/liquidio/lio_ethtool.c 
b/drivers/net/ethernet/cavium/liquidio/lio_ethtool.c
index 351549c..64c817a 100644
--- a/drivers/net/ethernet/cavium/liquidio/lio_ethtool.c
+++ b/drivers/net/ethernet/cavium/liquidio/lio_ethtool.c
@@ -112,6 +112,9 @@ static const char oct_stats_strings[][ETH_GSTRING_LEN] = {
        "tx_tso_err",
        "tx_vxlan",
 
+       "tx_mcast",
+       "tx_bcast",
+
        "mac_tx_total_pkts",
        "mac_tx_total_bytes",
        "mac_tx_mcast_pkts",
@@ -127,6 +130,8 @@ static const char oct_stats_strings[][ETH_GSTRING_LEN] = {
 
        "rx_total_rcvd",
        "rx_total_fwd",
+       "rx_mcast",
+       "rx_bcast",
        "rx_jabber_err",
        "rx_l2_err",
        "rx_frame_err",
@@ -171,6 +176,10 @@ static const char oct_vf_stats_strings[][ETH_GSTRING_LEN] 
= {
        "tx_errors",
        "rx_dropped",
        "tx_dropped",
+       "rx_mcast",
+       "tx_mcast",
+       "rx_bcast",
+       "tx_bcast",
        "link_state_changes",
 };
 
@@ -1056,50 +1065,48 @@ lio_get_ethtool_stats(struct net_device *netdev,
 {
        struct lio *lio = GET_LIO(netdev);
        struct octeon_device *oct_dev = lio->oct_dev;
-       struct net_device_stats *netstats = &netdev->stats;
+       struct rtnl_link_stats64 lstats;
        int i = 0, j;
 
        if (ifstate_check(lio, LIO_IFSTATE_RESETTING))
                return;
 
-       netdev->netdev_ops->ndo_get_stats(netdev);
-       octnet_get_link_stats(netdev);
-
+       netdev->netdev_ops->ndo_get_stats64(netdev, &lstats);
        /*sum of oct->droq[oq_no]->stats->rx_pkts_received */
-       data[i++] = CVM_CAST64(netstats->rx_packets);
+       data[i++] = lstats.rx_packets;
        /*sum of oct->instr_queue[iq_no]->stats.tx_done */
-       data[i++] = CVM_CAST64(netstats->tx_packets);
+       data[i++] = lstats.tx_packets;
        /*sum of oct->droq[oq_no]->stats->rx_bytes_received */
-       data[i++] = CVM_CAST64(netstats->rx_bytes);
+       data[i++] = lstats.rx_bytes;
        /*sum of oct->instr_queue[iq_no]->stats.tx_tot_bytes */
-       data[i++] = CVM_CAST64(netstats->tx_bytes);
-       data[i++] = CVM_CAST64(netstats->rx_errors +
-                              oct_dev->link_stats.fromwire.fcs_err +
-                              oct_dev->link_stats.fromwire.jabber_err +
-                              oct_dev->link_stats.fromwire.l2_err +
-                              oct_dev->link_stats.fromwire.frame_err);
-       data[i++] = CVM_CAST64(netstats->tx_errors);
+       data[i++] = lstats.tx_bytes;
+       data[i++] = lstats.rx_errors +
+                       oct_dev->link_stats.fromwire.fcs_err +
+                       oct_dev->link_stats.fromwire.jabber_err +
+                       oct_dev->link_stats.fromwire.l2_err +
+                       oct_dev->link_stats.fromwire.frame_err;
+       data[i++] = lstats.tx_errors;
        /*sum of oct->droq[oq_no]->stats->rx_dropped +
         *oct->droq[oq_no]->stats->dropped_nodispatch +
         *oct->droq[oq_no]->stats->dropped_toomany +
         *oct->droq[oq_no]->stats->dropped_nomem
         */
-       data[i++] = CVM_CAST64(netstats->rx_dropped +
-                              oct_dev->link_stats.fromwire.fifo_err +
-                              oct_dev->link_stats.fromwire.dmac_drop +
-                              oct_dev->link_stats.fromwire.red_drops +
-                              oct_dev->link_stats.fromwire.fw_err_pko +
-                              oct_dev->link_stats.fromwire.fw_err_link +
-                              oct_dev->link_stats.fromwire.fw_err_drop);
+       data[i++] = lstats.rx_dropped +
+                       oct_dev->link_stats.fromwire.fifo_err +
+                       oct_dev->link_stats.fromwire.dmac_drop +
+                       oct_dev->link_stats.fromwire.red_drops +
+                       oct_dev->link_stats.fromwire.fw_err_pko +
+                       oct_dev->link_stats.fromwire.fw_err_link +
+                       oct_dev->link_stats.fromwire.fw_err_drop;
        /*sum of oct->instr_queue[iq_no]->stats.tx_dropped */
-       data[i++] = CVM_CAST64(netstats->tx_dropped +
-                              oct_dev->link_stats.fromhost.max_collision_fail +
-                              oct_dev->link_stats.fromhost.max_deferral_fail +
-                              oct_dev->link_stats.fromhost.total_collisions +
-                              oct_dev->link_stats.fromhost.fw_err_pko +
-                              oct_dev->link_stats.fromhost.fw_err_link +
-                              oct_dev->link_stats.fromhost.fw_err_drop +
-                              oct_dev->link_stats.fromhost.fw_err_pki);
+       data[i++] = lstats.tx_dropped +
+                       oct_dev->link_stats.fromhost.max_collision_fail +
+                       oct_dev->link_stats.fromhost.max_deferral_fail +
+                       oct_dev->link_stats.fromhost.total_collisions +
+                       oct_dev->link_stats.fromhost.fw_err_pko +
+                       oct_dev->link_stats.fromhost.fw_err_link +
+                       oct_dev->link_stats.fromhost.fw_err_drop +
+                       oct_dev->link_stats.fromhost.fw_err_pki;
 
        /* firmware tx stats */
        /*per_core_stats[cvmx_get_core_num()].link_stats[mdata->from_ifidx].
@@ -1134,6 +1141,10 @@ lio_get_ethtool_stats(struct net_device *netdev,
         */
        data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.fw_tx_vxlan);
 
+       /* Multicast packets sent by this port */
+       data[i++] = oct_dev->link_stats.fromhost.fw_total_mcast_sent;
+       data[i++] = oct_dev->link_stats.fromhost.fw_total_bcast_sent;
+
        /* mac tx statistics */
        /*CVMX_BGXX_CMRX_TX_STAT5 */
        data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.total_pkts_sent);
@@ -1170,6 +1181,9 @@ lio_get_ethtool_stats(struct net_device *netdev,
         *fw_total_fwd
         */
        data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fw_total_fwd);
+       /* Multicast packets received on this port */
+       data[i++] = oct_dev->link_stats.fromwire.fw_total_mcast;
+       data[i++] = oct_dev->link_stats.fromwire.fw_total_bcast;
        /*per_core_stats[core_id].link_stats[ifidx].fromwire.jabber_err */
        data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.jabber_err);
        /*per_core_stats[core_id].link_stats[ifidx].fromwire.l2_err */
@@ -1338,7 +1352,7 @@ static void lio_vf_get_ethtool_stats(struct net_device 
*netdev,
                                     __attribute__((unused)),
                                     u64 *data)
 {
-       struct net_device_stats *netstats = &netdev->stats;
+       struct rtnl_link_stats64 lstats;
        struct lio *lio = GET_LIO(netdev);
        struct octeon_device *oct_dev = lio->oct_dev;
        int i = 0, j, vj;
@@ -1346,25 +1360,31 @@ static void lio_vf_get_ethtool_stats(struct net_device 
*netdev,
        if (ifstate_check(lio, LIO_IFSTATE_RESETTING))
                return;
 
-       netdev->netdev_ops->ndo_get_stats(netdev);
+       netdev->netdev_ops->ndo_get_stats64(netdev, &lstats);
        /* sum of oct->droq[oq_no]->stats->rx_pkts_received */
-       data[i++] = CVM_CAST64(netstats->rx_packets);
+       data[i++] = lstats.rx_packets;
        /* sum of oct->instr_queue[iq_no]->stats.tx_done */
-       data[i++] = CVM_CAST64(netstats->tx_packets);
+       data[i++] = lstats.tx_packets;
        /* sum of oct->droq[oq_no]->stats->rx_bytes_received */
-       data[i++] = CVM_CAST64(netstats->rx_bytes);
+       data[i++] = lstats.rx_bytes;
        /* sum of oct->instr_queue[iq_no]->stats.tx_tot_bytes */
-       data[i++] = CVM_CAST64(netstats->tx_bytes);
-       data[i++] = CVM_CAST64(netstats->rx_errors);
-       data[i++] = CVM_CAST64(netstats->tx_errors);
+       data[i++] = lstats.tx_bytes;
+       data[i++] = lstats.rx_errors;
+       data[i++] = lstats.tx_errors;
         /* sum of oct->droq[oq_no]->stats->rx_dropped +
          * oct->droq[oq_no]->stats->dropped_nodispatch +
          * oct->droq[oq_no]->stats->dropped_toomany +
          * oct->droq[oq_no]->stats->dropped_nomem
          */
-       data[i++] = CVM_CAST64(netstats->rx_dropped);
+       data[i++] = lstats.rx_dropped;
        /* sum of oct->instr_queue[iq_no]->stats.tx_dropped */
-       data[i++] = CVM_CAST64(netstats->tx_dropped);
+       data[i++] = lstats.tx_dropped;
+
+       data[i++] = oct_dev->link_stats.fromwire.fw_total_mcast;
+       data[i++] = oct_dev->link_stats.fromhost.fw_total_mcast_sent;
+       data[i++] = oct_dev->link_stats.fromwire.fw_total_bcast;
+       data[i++] = oct_dev->link_stats.fromhost.fw_total_bcast_sent;
+
        /* lio->link_changes */
        data[i++] = CVM_CAST64(lio->link_changes);
 
diff --git a/drivers/net/ethernet/cavium/liquidio/lio_main.c 
b/drivers/net/ethernet/cavium/liquidio/lio_main.c
index f3891ae..fe3edf1 100644
--- a/drivers/net/ethernet/cavium/liquidio/lio_main.c
+++ b/drivers/net/ethernet/cavium/liquidio/lio_main.c
@@ -2252,14 +2252,11 @@ static int liquidio_set_mac(struct net_device *netdev, 
void *p)
        return 0;
 }
 
-/**
- * \brief Net device get_stats
- * @param netdev network device
- */
-static struct net_device_stats *liquidio_get_stats(struct net_device *netdev)
+static void
+liquidio_get_stats64(struct net_device *netdev,
+                    struct rtnl_link_stats64 *lstats)
 {
        struct lio *lio = GET_LIO(netdev);
-       struct net_device_stats *stats = &netdev->stats;
        struct octeon_device *oct;
        u64 pkts = 0, drop = 0, bytes = 0;
        struct oct_droq_stats *oq_stats;
@@ -2269,7 +2266,7 @@ static struct net_device_stats *liquidio_get_stats(struct 
net_device *netdev)
        oct = lio->oct_dev;
 
        if (ifstate_check(lio, LIO_IFSTATE_RESETTING))
-               return stats;
+               return;
 
        for (i = 0; i < oct->num_iqs; i++) {
                iq_no = lio->linfo.txpciq[i].s.q_no;
@@ -2279,9 +2276,9 @@ static struct net_device_stats *liquidio_get_stats(struct 
net_device *netdev)
                bytes += iq_stats->tx_tot_bytes;
        }
 
-       stats->tx_packets = pkts;
-       stats->tx_bytes = bytes;
-       stats->tx_dropped = drop;
+       lstats->tx_packets = pkts;
+       lstats->tx_bytes = bytes;
+       lstats->tx_dropped = drop;
 
        pkts = 0;
        drop = 0;
@@ -2298,11 +2295,34 @@ static struct net_device_stats 
*liquidio_get_stats(struct net_device *netdev)
                bytes += oq_stats->rx_bytes_received;
        }
 
-       stats->rx_bytes = bytes;
-       stats->rx_packets = pkts;
-       stats->rx_dropped = drop;
-
-       return stats;
+       lstats->rx_bytes = bytes;
+       lstats->rx_packets = pkts;
+       lstats->rx_dropped = drop;
+
+       octnet_get_link_stats(netdev);
+       lstats->multicast = oct->link_stats.fromwire.fw_total_mcast;
+       lstats->collisions = oct->link_stats.fromhost.total_collisions;
+
+       /* detailed rx_errors: */
+       lstats->rx_length_errors = oct->link_stats.fromwire.l2_err;
+       /* recved pkt with crc error    */
+       lstats->rx_crc_errors = oct->link_stats.fromwire.fcs_err;
+       /* recv'd frame alignment error */
+       lstats->rx_frame_errors = oct->link_stats.fromwire.frame_err;
+       /* recv'r fifo overrun */
+       lstats->rx_fifo_errors = oct->link_stats.fromwire.fifo_err;
+
+       lstats->rx_errors = lstats->rx_length_errors + lstats->rx_crc_errors +
+               lstats->rx_frame_errors + lstats->rx_fifo_errors;
+
+       /* detailed tx_errors */
+       lstats->tx_aborted_errors = oct->link_stats.fromhost.fw_err_pko;
+       lstats->tx_carrier_errors = oct->link_stats.fromhost.fw_err_link;
+       lstats->tx_fifo_errors = oct->link_stats.fromhost.fifo_err;
+
+       lstats->tx_errors = lstats->tx_aborted_errors +
+               lstats->tx_carrier_errors +
+               lstats->tx_fifo_errors;
 }
 
 /**
@@ -3355,7 +3375,7 @@ static const struct net_device_ops lionetdevops = {
        .ndo_open               = liquidio_open,
        .ndo_stop               = liquidio_stop,
        .ndo_start_xmit         = liquidio_xmit,
-       .ndo_get_stats          = liquidio_get_stats,
+       .ndo_get_stats64        = liquidio_get_stats64,
        .ndo_set_mac_address    = liquidio_set_mac,
        .ndo_set_rx_mode        = liquidio_set_mcast_list,
        .ndo_tx_timeout         = liquidio_tx_timeout,
diff --git a/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c 
b/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c
index f92dfa4..b7b91d1 100644
--- a/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c
+++ b/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c
@@ -1336,24 +1336,21 @@ static int liquidio_set_mac(struct net_device *netdev, 
void *p)
        return 0;
 }
 
-/**
- * \brief Net device get_stats
- * @param netdev network device
- */
-static struct net_device_stats *liquidio_get_stats(struct net_device *netdev)
+static void
+liquidio_get_stats64(struct net_device *netdev,
+                    struct rtnl_link_stats64 *lstats)
 {
        struct lio *lio = GET_LIO(netdev);
-       struct net_device_stats *stats = &netdev->stats;
+       struct octeon_device *oct;
        u64 pkts = 0, drop = 0, bytes = 0;
        struct oct_droq_stats *oq_stats;
        struct oct_iq_stats *iq_stats;
-       struct octeon_device *oct;
        int i, iq_no, oq_no;
 
        oct = lio->oct_dev;
 
        if (ifstate_check(lio, LIO_IFSTATE_RESETTING))
-               return stats;
+               return;
 
        for (i = 0; i < oct->num_iqs; i++) {
                iq_no = lio->linfo.txpciq[i].s.q_no;
@@ -1363,9 +1360,9 @@ static struct net_device_stats *liquidio_get_stats(struct 
net_device *netdev)
                bytes += iq_stats->tx_tot_bytes;
        }
 
-       stats->tx_packets = pkts;
-       stats->tx_bytes = bytes;
-       stats->tx_dropped = drop;
+       lstats->tx_packets = pkts;
+       lstats->tx_bytes = bytes;
+       lstats->tx_dropped = drop;
 
        pkts = 0;
        drop = 0;
@@ -1382,11 +1379,29 @@ static struct net_device_stats 
*liquidio_get_stats(struct net_device *netdev)
                bytes += oq_stats->rx_bytes_received;
        }
 
-       stats->rx_bytes = bytes;
-       stats->rx_packets = pkts;
-       stats->rx_dropped = drop;
+       lstats->rx_bytes = bytes;
+       lstats->rx_packets = pkts;
+       lstats->rx_dropped = drop;
+
+       octnet_get_link_stats(netdev);
+       lstats->multicast = oct->link_stats.fromwire.fw_total_mcast;
+
+       /* detailed rx_errors: */
+       lstats->rx_length_errors = oct->link_stats.fromwire.l2_err;
+       /* recved pkt with crc error */
+       lstats->rx_crc_errors = oct->link_stats.fromwire.fcs_err;
+       /* recv'd frame alignment error */
+       lstats->rx_frame_errors = oct->link_stats.fromwire.frame_err;
+
+       lstats->rx_errors = lstats->rx_length_errors + lstats->rx_crc_errors +
+                           lstats->rx_frame_errors;
+
+       /* detailed tx_errors */
+       lstats->tx_aborted_errors = oct->link_stats.fromhost.fw_err_pko;
+       lstats->tx_carrier_errors = oct->link_stats.fromhost.fw_err_link;
 
-       return stats;
+       lstats->tx_errors = lstats->tx_aborted_errors +
+               lstats->tx_carrier_errors;
 }
 
 /**
@@ -2034,7 +2049,7 @@ static const struct net_device_ops lionetdevops = {
        .ndo_open               = liquidio_open,
        .ndo_stop               = liquidio_stop,
        .ndo_start_xmit         = liquidio_xmit,
-       .ndo_get_stats          = liquidio_get_stats,
+       .ndo_get_stats64        = liquidio_get_stats64,
        .ndo_set_mac_address    = liquidio_set_mac,
        .ndo_set_rx_mode        = liquidio_set_mcast_list,
        .ndo_tx_timeout         = liquidio_tx_timeout,
diff --git a/drivers/net/ethernet/cavium/liquidio/liquidio_common.h 
b/drivers/net/ethernet/cavium/liquidio/liquidio_common.h
index 34a94da..2166744 100644
--- a/drivers/net/ethernet/cavium/liquidio/liquidio_common.h
+++ b/drivers/net/ethernet/cavium/liquidio/liquidio_common.h
@@ -802,6 +802,9 @@ struct nic_rx_stats {
        u64 fw_total_rcvd;
        u64 fw_total_fwd;
        u64 fw_total_fwd_bytes;
+       u64 fw_total_mcast;
+       u64 fw_total_bcast;
+
        u64 fw_err_pko;
        u64 fw_err_link;
        u64 fw_err_drop;
@@ -858,6 +861,8 @@ struct nic_tx_stats {
        u64 fw_total_sent;
        u64 fw_total_fwd;
        u64 fw_total_fwd_bytes;
+       u64 fw_total_mcast_sent;
+       u64 fw_total_bcast_sent;
        u64 fw_err_pko;
        u64 fw_err_link;
        u64 fw_err_drop;
-- 
2.9.0

Reply via email to