This patch adds driver changes for capturing the link change count in
ethtool statistics display.

Please consider applying this to "net-next".

Signed-off-by: Sudarsana Reddy Kalluru <sudarsana.kall...@cavium.com>
Signed-off-by: Ariel Elior <ariel.el...@cavium.com>
---
 drivers/net/ethernet/qlogic/qed/qed_l2.c        | 12 ++++++++++--
 drivers/net/ethernet/qlogic/qede/qede.h         |  1 +
 drivers/net/ethernet/qlogic/qede/qede_ethtool.c |  2 ++
 drivers/net/ethernet/qlogic/qede/qede_main.c    |  1 +
 include/linux/qed/qed_if.h                      |  1 +
 5 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/qlogic/qed/qed_l2.c 
b/drivers/net/ethernet/qlogic/qed/qed_l2.c
index 5e655c3..1e0254a 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_l2.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_l2.c
@@ -1852,6 +1852,11 @@ static void __qed_get_vport_port_stats(struct qed_hwfn 
*p_hwfn,
                p_ah->tx_1519_to_max_byte_packets =
                    port_stats.eth.u1.ah1.t1519_to_max;
        }
+
+       p_common->link_change_count = qed_rd(p_hwfn, p_ptt,
+                                            p_hwfn->mcp_info->port_addr +
+                                            offsetof(struct public_port,
+                                                     link_change_count));
 }
 
 static void __qed_get_vport_stats(struct qed_hwfn *p_hwfn,
@@ -1959,11 +1964,14 @@ void qed_reset_vport_stats(struct qed_dev *cdev)
 
        /* PORT statistics are not necessarily reset, so we need to
         * read and create a baseline for future statistics.
+        * Link change stat is maintained by MFW, return its value as is.
         */
-       if (!cdev->reset_stats)
+       if (!cdev->reset_stats) {
                DP_INFO(cdev, "Reset stats not allocated\n");
-       else
+       } else {
                _qed_get_vport_stats(cdev, cdev->reset_stats);
+               cdev->reset_stats->common.link_change_count = 0;
+       }
 }
 
 static enum gft_profile_type
diff --git a/drivers/net/ethernet/qlogic/qede/qede.h 
b/drivers/net/ethernet/qlogic/qede/qede.h
index 2d3f09e..df791e2 100644
--- a/drivers/net/ethernet/qlogic/qede/qede.h
+++ b/drivers/net/ethernet/qlogic/qede/qede.h
@@ -87,6 +87,7 @@ struct qede_stats_common {
        u64 coalesced_aborts_num;
        u64 non_coalesced_pkts;
        u64 coalesced_bytes;
+       u64 link_change_count;
 
        /* port */
        u64 rx_64_byte_packets;
diff --git a/drivers/net/ethernet/qlogic/qede/qede_ethtool.c 
b/drivers/net/ethernet/qlogic/qede/qede_ethtool.c
index 8c6fdad..f374e18 100644
--- a/drivers/net/ethernet/qlogic/qede/qede_ethtool.c
+++ b/drivers/net/ethernet/qlogic/qede/qede_ethtool.c
@@ -170,6 +170,8 @@
        QEDE_STAT(coalesced_aborts_num),
        QEDE_STAT(non_coalesced_pkts),
        QEDE_STAT(coalesced_bytes),
+
+       QEDE_STAT(link_change_count),
 };
 
 #define QEDE_NUM_STATS ARRAY_SIZE(qede_stats_arr)
diff --git a/drivers/net/ethernet/qlogic/qede/qede_main.c 
b/drivers/net/ethernet/qlogic/qede/qede_main.c
index 9e70f71..cbfe892 100644
--- a/drivers/net/ethernet/qlogic/qede/qede_main.c
+++ b/drivers/net/ethernet/qlogic/qede/qede_main.c
@@ -398,6 +398,7 @@ void qede_fill_by_demand_stats(struct qede_dev *edev)
        p_common->brb_truncates = stats.common.brb_truncates;
        p_common->brb_discards = stats.common.brb_discards;
        p_common->tx_mac_ctrl_frames = stats.common.tx_mac_ctrl_frames;
+       p_common->link_change_count = stats.common.link_change_count;
 
        if (QEDE_IS_BB(edev)) {
                struct qede_stats_bb *p_bb = &edev->stats.bb;
diff --git a/include/linux/qed/qed_if.h b/include/linux/qed/qed_if.h
index 44af652..4444491 100644
--- a/include/linux/qed/qed_if.h
+++ b/include/linux/qed/qed_if.h
@@ -1179,6 +1179,7 @@ struct qed_eth_stats_common {
        u64     tx_mac_mc_packets;
        u64     tx_mac_bc_packets;
        u64     tx_mac_ctrl_frames;
+       u64     link_change_count;
 };
 
 struct qed_eth_stats_bb {
-- 
1.8.3.1

Reply via email to