Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/490406/?format=api
{ "id": 490406, "url": "http://patchwork.ozlabs.org/api/patches/490406/?format=api", "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/1435797516-12187-1-git-send-email-jacob.e.keller@intel.com/", "project": { "id": 46, "url": "http://patchwork.ozlabs.org/api/projects/46/?format=api", "name": "Intel Wired Ethernet development", "link_name": "intel-wired-lan", "list_id": "intel-wired-lan.osuosl.org", "list_email": "intel-wired-lan@osuosl.org", "web_url": "", "scm_url": "", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<1435797516-12187-1-git-send-email-jacob.e.keller@intel.com>", "list_archive_url": null, "date": "2015-07-02T00:38:36", "name": "[net-next,rc2] fm10k: add support for extra debug statistics", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": false, "hash": "3eace9f5d375e2198cd62dc89c0b2582e1a7d237", "submitter": { "id": 9784, "url": "http://patchwork.ozlabs.org/api/people/9784/?format=api", "name": "Jacob Keller", "email": "jacob.e.keller@intel.com" }, "delegate": { "id": 68, "url": "http://patchwork.ozlabs.org/api/users/68/?format=api", "username": "jtkirshe", "first_name": "Jeff", "last_name": "Kirsher", "email": "jeffrey.t.kirsher@intel.com" }, "mbox": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/1435797516-12187-1-git-send-email-jacob.e.keller@intel.com/mbox/", "series": [], "comments": "http://patchwork.ozlabs.org/api/patches/490406/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/490406/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<intel-wired-lan-bounces@lists.osuosl.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "intel-wired-lan@lists.osuosl.org" ], "Delivered-To": [ "patchwork-incoming@bilbo.ozlabs.org", "intel-wired-lan@lists.osuosl.org" ], "Received": [ "from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137])\n\tby ozlabs.org (Postfix) with ESMTP id 2B6A914075F\n\tfor <incoming@patchwork.ozlabs.org>;\n\tThu, 2 Jul 2015 10:38:44 +1000 (AEST)", "from localhost (localhost [127.0.0.1])\n\tby fraxinus.osuosl.org (Postfix) with ESMTP id 6A532A4285;\n\tThu, 2 Jul 2015 00:38:43 +0000 (UTC)", "from fraxinus.osuosl.org ([127.0.0.1])\n\tby localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id FF23VrMT3DSr; Thu, 2 Jul 2015 00:38:42 +0000 (UTC)", "from ash.osuosl.org (ash.osuosl.org [140.211.166.34])\n\tby fraxinus.osuosl.org (Postfix) with ESMTP id 582DFA4151;\n\tThu, 2 Jul 2015 00:38:42 +0000 (UTC)", "from silver.osuosl.org (smtp3.osuosl.org [140.211.166.136])\n\tby ash.osuosl.org (Postfix) with ESMTP id 366231C4306\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tThu, 2 Jul 2015 00:38:41 +0000 (UTC)", "from localhost (localhost [127.0.0.1])\n\tby silver.osuosl.org (Postfix) with ESMTP id 1A9412E579\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tThu, 2 Jul 2015 00:38:41 +0000 (UTC)", "from silver.osuosl.org ([127.0.0.1])\n\tby localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id zSKSeyv-3sbl for <intel-wired-lan@lists.osuosl.org>;\n\tThu, 2 Jul 2015 00:38:39 +0000 (UTC)", "from mga09.intel.com (mga09.intel.com [134.134.136.24])\n\tby silver.osuosl.org (Postfix) with ESMTP id 12D5D2E55E\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tThu, 2 Jul 2015 00:38:39 +0000 (UTC)", "from fmsmga001.fm.intel.com ([10.253.24.23])\n\tby orsmga102.jf.intel.com with ESMTP; 01 Jul 2015 17:38:38 -0700", "from jekeller-desk.amr.corp.intel.com ([134.134.3.85])\n\tby fmsmga001.fm.intel.com with ESMTP; 01 Jul 2015 17:38:38 -0700" ], "X-Virus-Scanned": [ "amavisd-new at osuosl.org", "amavisd-new at osuosl.org" ], "X-Greylist": "domain auto-whitelisted by SQLgrey-1.7.6", "X-ExtLoop1": "1", "X-IronPort-AV": "E=Sophos;i=\"5.15,389,1432623600\"; d=\"scan'208\";a=\"738882589\"", "From": "Jacob Keller <jacob.e.keller@intel.com>", "To": "Intel Wired LAN <intel-wired-lan@lists.osuosl.org>", "Date": "Wed, 1 Jul 2015 17:38:36 -0700", "Message-Id": "<1435797516-12187-1-git-send-email-jacob.e.keller@intel.com>", "X-Mailer": "git-send-email 2.4.3", "Subject": "[Intel-wired-lan] [PATCH net-next rc2] fm10k: add support for extra\n\tdebug statistics", "X-BeenThere": "intel-wired-lan@lists.osuosl.org", "X-Mailman-Version": "2.1.18-1", "Precedence": "list", "List-Id": "Intel Wired Ethernet Linux Kernel Driver Development\n\t<intel-wired-lan.lists.osuosl.org>", "List-Unsubscribe": "<http://lists.osuosl.org/mailman/options/intel-wired-lan>, \n\t<mailto:intel-wired-lan-request@lists.osuosl.org?subject=unsubscribe>", "List-Archive": "<http://lists.osuosl.org/pipermail/intel-wired-lan/>", "List-Post": "<mailto:intel-wired-lan@lists.osuosl.org>", "List-Help": "<mailto:intel-wired-lan-request@lists.osuosl.org?subject=help>", "List-Subscribe": "<http://lists.osuosl.org/mailman/listinfo/intel-wired-lan>, \n\t<mailto:intel-wired-lan-request@lists.osuosl.org?subject=subscribe>", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=\"us-ascii\"", "Content-Transfer-Encoding": "7bit", "Errors-To": "intel-wired-lan-bounces@lists.osuosl.org", "Sender": "\"Intel-wired-lan\" <intel-wired-lan-bounces@lists.osuosl.org>" }, "content": "Add a private ethtool flag to enable display of these statistics, which\nare generally less useful. However, sometimes it can be useful for\ndebugging purposes. The most useful portion is the ability to see what\nthe PF thinks the VF mailboxes look like.\n\n-rc2\n* Add missing debug statistics from first pass\n\nSigned-off-by: Jacob Keller <jacob.e.keller@intel.com>\n---\n drivers/net/ethernet/intel/fm10k/fm10k.h | 19 ++\n drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c | 226 +++++++++++++++++++----\n drivers/net/ethernet/intel/fm10k/fm10k_iov.c | 5 +-\n drivers/net/ethernet/intel/fm10k/fm10k_main.c | 15 ++\n drivers/net/ethernet/intel/fm10k/fm10k_pci.c | 18 ++\n drivers/net/ethernet/intel/fm10k/fm10k_type.h | 6 +\n 6 files changed, 248 insertions(+), 41 deletions(-)", "diff": "diff --git a/drivers/net/ethernet/intel/fm10k/fm10k.h b/drivers/net/ethernet/intel/fm10k/fm10k.h\nindex c8c8c5baefda..14440200499b 100644\n--- a/drivers/net/ethernet/intel/fm10k/fm10k.h\n+++ b/drivers/net/ethernet/intel/fm10k/fm10k.h\n@@ -101,12 +101,19 @@ struct fm10k_tx_queue_stats {\n \tu64 csum_err;\n \tu64 tx_busy;\n \tu64 tx_done_old;\n+\tu64 csum_good;\n };\n \n struct fm10k_rx_queue_stats {\n \tu64 alloc_failed;\n \tu64 csum_err;\n \tu64 errors;\n+\tu64 csum_good;\n+\tu64 switch_errors;\n+\tu64 drops;\n+\tu64 pp_errors;\n+\tu64 link_errors;\n+\tu64 length_errors;\n };\n \n struct fm10k_ring {\n@@ -251,6 +258,7 @@ struct fm10k_intfc {\n #define FM10K_FLAG_RSS_FIELD_IPV6_UDP\t\t(u32)(1 << 2)\n #define FM10K_FLAG_RX_TS_ENABLED\t\t(u32)(1 << 3)\n #define FM10K_FLAG_SWPRI_CONFIG\t\t\t(u32)(1 << 4)\n+#define FM10K_FLAG_DEBUG_STATS\t\t\t(u32)(1 << 5)\n \tint xcast_mode;\n \n \t/* Tx fast path data */\n@@ -277,6 +285,17 @@ struct fm10k_intfc {\n \tu64 rx_drops_nic;\n \tu64 rx_overrun_pf;\n \tu64 rx_overrun_vf;\n+\n+\t/* Debug Statistics */\n+\tu64 hw_sm_mbx_full;\n+\tu64 hw_csum_tx_good;\n+\tu64 hw_csum_rx_good;\n+\tu64 rx_switch_errors;\n+\tu64 rx_drops;\n+\tu64 rx_pp_errors;\n+\tu64 rx_link_errors;\n+\tu64 rx_length_errors;\n+\n \tu32 tx_timeout_count;\n \n \t/* RX */\ndiff --git a/drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c b/drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c\nindex c6dc9683429e..4ef2fbd22911 100644\n--- a/drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c\n+++ b/drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c\n@@ -76,19 +76,22 @@ static const struct fm10k_stats fm10k_gstrings_global_stats[] = {\n \tFM10K_STAT(\"mac_rules_used\", hw.swapi.mac.used),\n \tFM10K_STAT(\"mac_rules_avail\", hw.swapi.mac.avail),\n \n-\tFM10K_STAT(\"mbx_tx_busy\", hw.mbx.tx_busy),\n-\tFM10K_STAT(\"mbx_tx_oversized\", hw.mbx.tx_dropped),\n-\tFM10K_STAT(\"mbx_tx_messages\", hw.mbx.tx_messages),\n-\tFM10K_STAT(\"mbx_tx_dwords\", hw.mbx.tx_dwords),\n-\tFM10K_STAT(\"mbx_rx_messages\", hw.mbx.rx_messages),\n-\tFM10K_STAT(\"mbx_rx_dwords\", hw.mbx.rx_dwords),\n-\tFM10K_STAT(\"mbx_rx_parse_err\", hw.mbx.rx_parse_err),\n-\n \tFM10K_STAT(\"tx_hang_count\", tx_timeout_count),\n \n \tFM10K_STAT(\"tx_hwtstamp_timeouts\", tx_hwtstamp_timeouts),\n };\n \n+static const struct fm10k_stats fm10k_gstrings_debug_stats[] = {\n+\tFM10K_STAT(\"hw_sm_mbx_full\", hw_sm_mbx_full),\n+\tFM10K_STAT(\"hw_csum_tx_good\", hw_csum_tx_good),\n+\tFM10K_STAT(\"hw_csum_rx_good\", hw_csum_rx_good),\n+\tFM10K_STAT(\"rx_switch_errors\", rx_switch_errors),\n+\tFM10K_STAT(\"rx_drops\", rx_drops),\n+\tFM10K_STAT(\"rx_pp_errors\", rx_pp_errors),\n+\tFM10K_STAT(\"rx_link_errors\", rx_link_errors),\n+\tFM10K_STAT(\"rx_length_errors\", rx_length_errors),\n+};\n+\n static const struct fm10k_stats fm10k_gstrings_pf_stats[] = {\n \tFM10K_STAT(\"timeout\", stats.timeout.count),\n \tFM10K_STAT(\"ur\", stats.ur.count),\n@@ -100,14 +103,33 @@ static const struct fm10k_stats fm10k_gstrings_pf_stats[] = {\n \tFM10K_STAT(\"nodesc_drop\", stats.nodesc_drop.count),\n };\n \n+#define FM10K_MBX_STAT(_name, _stat) { \\\n+\t.stat_string = _name, \\\n+\t.sizeof_stat = FIELD_SIZEOF(struct fm10k_mbx_info, _stat), \\\n+\t.stat_offset = offsetof(struct fm10k_mbx_info, _stat) \\\n+}\n+\n+static const struct fm10k_stats fm10k_gstrings_mbx_stats[] = {\n+\tFM10K_MBX_STAT(\"mbx_tx_busy\", tx_busy),\n+\tFM10K_MBX_STAT(\"mbx_tx_oversized\", tx_dropped),\n+\tFM10K_MBX_STAT(\"mbx_tx_messages\", tx_messages),\n+\tFM10K_MBX_STAT(\"mbx_tx_dwords\", tx_dwords),\n+\tFM10K_MBX_STAT(\"mbx_rx_messages\", rx_messages),\n+\tFM10K_MBX_STAT(\"mbx_rx_dwords\", rx_dwords),\n+\tFM10K_MBX_STAT(\"mbx_rx_parse_err\", rx_parse_err),\n+};\n+\n #define FM10K_GLOBAL_STATS_LEN ARRAY_SIZE(fm10k_gstrings_global_stats)\n+#define FM10K_DEBUG_STATS_LEN ARRAY_SIZE(fm10k_gstrings_debug_stats)\n #define FM10K_PF_STATS_LEN ARRAY_SIZE(fm10k_gstrings_pf_stats)\n+#define FM10K_MBX_STATS_LEN ARRAY_SIZE(fm10k_gstrings_mbx_stats)\n \n #define FM10K_QUEUE_STATS_LEN(_n) \\\n \t( (_n) * 2 * (sizeof(struct fm10k_queue_stats) / sizeof(u64)))\n \n #define FM10K_STATIC_STATS_LEN (FM10K_GLOBAL_STATS_LEN + \\\n-\t\t\t\tFM10K_NETDEV_STATS_LEN)\n+\t\t\t\tFM10K_NETDEV_STATS_LEN + \\\n+\t\t\t\tFM10K_MBX_STATS_LEN)\n \n static const char fm10k_gstrings_test[][ETH_GSTRING_LEN] = {\n \t\"Mailbox test (on/offline)\"\n@@ -120,11 +142,85 @@ enum fm10k_self_test_types {\n \tFM10K_TEST_MAX = FM10K_TEST_LEN\n };\n \n-static void fm10k_get_strings(struct net_device *dev, u32 stringset, u8 *data)\n+enum {\n+\tFM10K_PRV_FLAG_DEBUG_STATS,\n+\tFM10K_PRV_FLAG_LEN,\n+};\n+\n+static const char fm10k_prv_flags[FM10K_PRV_FLAG_LEN][ETH_GSTRING_LEN] = {\n+\t\"debug-statistics\",\n+};\n+\n+static void fm10k_get_stat_strings(struct net_device *dev, u8 *data)\n {\n \tstruct fm10k_intfc *interface = netdev_priv(dev);\n+\tstruct fm10k_iov_data *iov_data = interface->iov_data;\n \tchar *p = (char *)data;\n \tunsigned int i;\n+\tunsigned int j;\n+\n+\tfor (i = 0; i < FM10K_NETDEV_STATS_LEN; i++) {\n+\t\tmemcpy(p, fm10k_gstrings_net_stats[i].stat_string,\n+\t\t ETH_GSTRING_LEN);\n+\t\tp += ETH_GSTRING_LEN;\n+\t}\n+\n+\tfor (i = 0; i < FM10K_GLOBAL_STATS_LEN; i++) {\n+\t\tmemcpy(p, fm10k_gstrings_global_stats[i].stat_string,\n+\t\t ETH_GSTRING_LEN);\n+\t\tp += ETH_GSTRING_LEN;\n+\t}\n+\n+\tif (interface->flags & FM10K_FLAG_DEBUG_STATS) {\n+\t\tfor (i = 0; i < FM10K_DEBUG_STATS_LEN; i++) {\n+\t\t\tmemcpy(p, fm10k_gstrings_debug_stats[i].stat_string,\n+\t\t\t ETH_GSTRING_LEN);\n+\t\t\tp += ETH_GSTRING_LEN;\n+\t\t}\n+\t}\n+\n+\tfor (i = 0; i < FM10K_MBX_STATS_LEN; i++) {\n+\t\tmemcpy(p, fm10k_gstrings_mbx_stats[i].stat_string,\n+\t\t ETH_GSTRING_LEN);\n+\t\tp += ETH_GSTRING_LEN;\n+\t}\n+\n+\tif (interface->hw.mac.type != fm10k_mac_vf) {\n+\t\tfor (i = 0; i < FM10K_PF_STATS_LEN; i++) {\n+\t\t\tmemcpy(p, fm10k_gstrings_pf_stats[i].stat_string,\n+\t\t\t ETH_GSTRING_LEN);\n+\t\t\tp += ETH_GSTRING_LEN;\n+\t\t}\n+\t}\n+\n+\tif ((interface->flags & FM10K_FLAG_DEBUG_STATS) && iov_data) {\n+\t\tfor (i = 0; i < iov_data->num_vfs; i++) {\n+\t\t\tfor (j = 0; j < FM10K_MBX_STATS_LEN; j++) {\n+\t\t\t\tsnprintf(p,\n+\t\t\t\t\t ETH_GSTRING_LEN,\n+\t\t\t\t\t \"vf_%u_%s\", i,\n+\t\t\t\t\t fm10k_gstrings_mbx_stats[j].stat_string);\n+\t\t\t\tp += ETH_GSTRING_LEN;\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+\tfor (i = 0; i < interface->hw.mac.max_queues; i++) {\n+\t\tsprintf(p, \"tx_queue_%u_packets\", i);\n+\t\tp += ETH_GSTRING_LEN;\n+\t\tsprintf(p, \"tx_queue_%u_bytes\", i);\n+\t\tp += ETH_GSTRING_LEN;\n+\t\tsprintf(p, \"rx_queue_%u_packets\", i);\n+\t\tp += ETH_GSTRING_LEN;\n+\t\tsprintf(p, \"rx_queue_%u_bytes\", i);\n+\t\tp += ETH_GSTRING_LEN;\n+\t}\n+}\n+\n+static void fm10k_get_strings(struct net_device *dev,\n+\t\t\t u32 stringset, u8 *data)\n+{\n+\tchar *p = (char *)data;\n \n \tswitch (stringset) {\n \tcase ETH_SS_TEST:\n@@ -132,35 +228,11 @@ static void fm10k_get_strings(struct net_device *dev, u32 stringset, u8 *data)\n \t\t FM10K_TEST_LEN * ETH_GSTRING_LEN);\n \t\tbreak;\n \tcase ETH_SS_STATS:\n-\t\tfor (i = 0; i < FM10K_NETDEV_STATS_LEN; i++) {\n-\t\t\tmemcpy(p, fm10k_gstrings_net_stats[i].stat_string,\n-\t\t\t ETH_GSTRING_LEN);\n-\t\t\tp += ETH_GSTRING_LEN;\n-\t\t}\n-\t\tfor (i = 0; i < FM10K_GLOBAL_STATS_LEN; i++) {\n-\t\t\tmemcpy(p, fm10k_gstrings_global_stats[i].stat_string,\n-\t\t\t ETH_GSTRING_LEN);\n-\t\t\tp += ETH_GSTRING_LEN;\n-\t\t}\n-\n-\t\tif (interface->hw.mac.type != fm10k_mac_vf) {\n-\t\t\tfor (i = 0; i < FM10K_PF_STATS_LEN; i++) {\n-\t\t\t\tmemcpy(p, fm10k_gstrings_pf_stats[i].stat_string,\n-\t\t\t\t ETH_GSTRING_LEN);\n-\t\t\t\tp += ETH_GSTRING_LEN;\n-\t\t\t}\n-\t\t}\n-\n-\t\tfor (i = 0; i < interface->hw.mac.max_queues; i++) {\n-\t\t\tsprintf(p, \"tx_queue_%u_packets\", i);\n-\t\t\tp += ETH_GSTRING_LEN;\n-\t\t\tsprintf(p, \"tx_queue_%u_bytes\", i);\n-\t\t\tp += ETH_GSTRING_LEN;\n-\t\t\tsprintf(p, \"rx_queue_%u_packets\", i);\n-\t\t\tp += ETH_GSTRING_LEN;\n-\t\t\tsprintf(p, \"rx_queue_%u_bytes\", i);\n-\t\t\tp += ETH_GSTRING_LEN;\n-\t\t}\n+\t\tfm10k_get_stat_strings(dev, data);\n+\t\tbreak;\n+\tcase ETH_SS_PRIV_FLAGS:\n+\t\tmemcpy(p, fm10k_prv_flags,\n+\t\t FM10K_PRV_FLAG_LEN * ETH_GSTRING_LEN);\n \t\tbreak;\n \t}\n }\n@@ -168,6 +240,7 @@ static void fm10k_get_strings(struct net_device *dev, u32 stringset, u8 *data)\n static int fm10k_get_sset_count(struct net_device *dev, int sset)\n {\n \tstruct fm10k_intfc *interface = netdev_priv(dev);\n+\tstruct fm10k_iov_data *iov_data = interface->iov_data;\n \tstruct fm10k_hw *hw = &interface->hw;\n \tint stats_len = FM10K_STATIC_STATS_LEN;\n \n@@ -180,7 +253,16 @@ static int fm10k_get_sset_count(struct net_device *dev, int sset)\n \t\tif (hw->mac.type != fm10k_mac_vf)\n \t\t\tstats_len += FM10K_PF_STATS_LEN;\n \n+\t\tif (interface->flags & FM10K_FLAG_DEBUG_STATS) {\n+\t\t\tstats_len += FM10K_DEBUG_STATS_LEN;\n+\n+\t\t\tif (iov_data)\n+\t\t\t\tstats_len += FM10K_MBX_STATS_LEN * iov_data->num_vfs;\n+\t\t}\n+\n \t\treturn stats_len;\n+\tcase ETH_SS_PRIV_FLAGS:\n+\t\treturn FM10K_PRV_FLAG_LEN;\n \tdefault:\n \t\treturn -EOPNOTSUPP;\n \t}\n@@ -192,6 +274,7 @@ static void fm10k_get_ethtool_stats(struct net_device *netdev,\n {\n \tconst int stat_count = sizeof(struct fm10k_queue_stats) / sizeof(u64);\n \tstruct fm10k_intfc *interface = netdev_priv(netdev);\n+\tstruct fm10k_iov_data *iov_data = interface->iov_data;\n \tstruct net_device_stats *net_stats = &netdev->stats;\n \tchar *p;\n \tint i, j;\n@@ -211,13 +294,47 @@ static void fm10k_get_ethtool_stats(struct net_device *netdev,\n \t\t\tsizeof(u64)) ? *(u64 *)p : *(u32 *)p;\n \t}\n \n-\tif (interface->hw.mac.type != fm10k_mac_vf)\n+\tif (interface->flags & FM10K_FLAG_DEBUG_STATS) {\n+\t\tfor (i = 0; i < FM10K_DEBUG_STATS_LEN; i++) {\n+\t\t\tp = (char *)interface + fm10k_gstrings_debug_stats[i].stat_offset;\n+\t\t\t*(data++) = (fm10k_gstrings_debug_stats[i].sizeof_stat ==\n+\t\t\t\t sizeof(u64)) ? *(u64 *)p : *(u32 *)p;\n+\t\t}\n+\t}\n+\n+\tfor (i = 0; i < FM10K_MBX_STATS_LEN; i++) {\n+\t\tp = (char *)&interface->hw.mbx + fm10k_gstrings_mbx_stats[i].stat_offset;\n+\t\t*(data++) = (fm10k_gstrings_mbx_stats[i].sizeof_stat ==\n+\t\t\tsizeof(u64)) ? *(u64 *)p : *(u32 *)p;\n+\t}\n+\n+\tif (interface->hw.mac.type != fm10k_mac_vf) {\n \t\tfor (i = 0; i < FM10K_PF_STATS_LEN; i++) {\n \t\t\tp = (char *)interface +\n \t\t\t fm10k_gstrings_pf_stats[i].stat_offset;\n \t\t\t*(data++) = (fm10k_gstrings_pf_stats[i].sizeof_stat ==\n \t\t\t\t sizeof(u64)) ? *(u64 *)p : *(u32 *)p;\n \t\t}\n+\t}\n+\n+\tif ((interface->flags & FM10K_FLAG_DEBUG_STATS) && iov_data) {\n+\t\tfor (i = 0; i < iov_data->num_vfs; i++) {\n+\t\t\tstruct fm10k_vf_info *vf_info;\n+\t\t\tvf_info = &iov_data->vf_info[i];\n+\n+\t\t\t/* skip stats if we don't have a vf info */\n+\t\t\tif (!vf_info) {\n+\t\t\t\tdata += FM10K_MBX_STATS_LEN;\n+\t\t\t\tcontinue;\n+\t\t\t}\n+\n+\t\t\tfor (j = 0; j < FM10K_MBX_STATS_LEN; j++) {\n+\t\t\t\tp = (char *)&vf_info->mbx + fm10k_gstrings_mbx_stats[j].stat_offset;\n+\t\t\t\t*(data++) = (fm10k_gstrings_mbx_stats[j].sizeof_stat ==\n+\t\t\t\t\t sizeof(u64)) ? *(u64 *)p : *(u32 *)p;\n+\t\t\t}\n+\t\t}\n+\t}\n \n \tfor (i = 0; i < interface->hw.mac.max_queues; i++) {\n \t\tstruct fm10k_ring *ring;\n@@ -881,6 +998,33 @@ static void fm10k_self_test(struct net_device *dev,\n \t\teth_test->flags |= ETH_TEST_FL_FAILED;\n }\n \n+static u32 fm10k_get_priv_flags(struct net_device *netdev)\n+{\n+\tstruct fm10k_intfc *interface = netdev_priv(netdev);\n+\tu32 priv_flags = 0;\n+\n+\tif (interface->flags & FM10K_FLAG_DEBUG_STATS)\n+\t\tpriv_flags |= 1 << FM10K_PRV_FLAG_DEBUG_STATS;\n+\n+\treturn priv_flags;\n+}\n+\n+static int fm10k_set_priv_flags(struct net_device *netdev, u32 priv_flags)\n+{\n+\tstruct fm10k_intfc *interface = netdev_priv(netdev);\n+\n+\tif (priv_flags >= (1 << FM10K_PRV_FLAG_LEN))\n+\t\treturn -EINVAL;\n+\n+\tif (priv_flags & (1 << FM10K_PRV_FLAG_DEBUG_STATS))\n+\t\tinterface->flags |= FM10K_FLAG_DEBUG_STATS;\n+\telse\n+\t\tinterface->flags &= ~FM10K_FLAG_DEBUG_STATS;\n+\n+\treturn 0;\n+}\n+\n+\n static u32 fm10k_get_reta_size(struct net_device __always_unused *netdev)\n {\n \treturn FM10K_RETA_SIZE * FM10K_RETA_ENTRIES_PER_REG;\n@@ -1094,6 +1238,8 @@ static const struct ethtool_ops fm10k_ethtool_ops = {\n \t.get_regs = fm10k_get_regs,\n \t.get_regs_len = fm10k_get_regs_len,\n \t.self_test\t\t= fm10k_self_test,\n+\t.get_priv_flags\t\t= fm10k_get_priv_flags,\n+\t.set_priv_flags\t\t= fm10k_set_priv_flags,\n \t.get_rxfh_indir_size\t= fm10k_get_reta_size,\n \t.get_rxfh_key_size\t= fm10k_get_rssrk_size,\n \t.get_rxfh\t\t= fm10k_get_rssh,\ndiff --git a/drivers/net/ethernet/intel/fm10k/fm10k_iov.c b/drivers/net/ethernet/intel/fm10k/fm10k_iov.c\nindex 0e25a80417b9..acfb8b1f88a7 100644\n--- a/drivers/net/ethernet/intel/fm10k/fm10k_iov.c\n+++ b/drivers/net/ethernet/intel/fm10k/fm10k_iov.c\n@@ -137,8 +137,11 @@ process_mbx:\n \t\t}\n \n \t\t/* guarantee we have free space in the SM mailbox */\n-\t\tif (!hw->mbx.ops.tx_ready(&hw->mbx, FM10K_VFMBX_MSG_MTU))\n+\t\tif (!hw->mbx.ops.tx_ready(&hw->mbx, FM10K_VFMBX_MSG_MTU)) {\n+\t\t\t/* keep track of how many times this occurs */\n+\t\t\tinterface->hw_sm_mbx_full++;\n \t\t\tbreak;\n+\t\t}\n \n \t\t/* cleanup mailbox and process received messages */\n \t\tmbx->ops.process(hw, mbx);\ndiff --git a/drivers/net/ethernet/intel/fm10k/fm10k_main.c b/drivers/net/ethernet/intel/fm10k/fm10k_main.c\nindex 620ff5e9dc59..079772b5d130 100644\n--- a/drivers/net/ethernet/intel/fm10k/fm10k_main.c\n+++ b/drivers/net/ethernet/intel/fm10k/fm10k_main.c\n@@ -398,6 +398,8 @@ static inline void fm10k_rx_checksum(struct fm10k_ring *ring,\n \t\treturn;\n \n \tskb->ip_summed = CHECKSUM_UNNECESSARY;\n+\n+\tring->rx_stats.csum_good++;\n }\n \n #define FM10K_RSS_L4_TYPES_MASK \\\n@@ -553,6 +555,18 @@ static bool fm10k_cleanup_headers(struct fm10k_ring *rx_ring,\n {\n \tif (unlikely((fm10k_test_staterr(rx_desc,\n \t\t\t\t\t FM10K_RXD_STATUS_RXE)))) {\n+#define FM10K_TEST_RXD_BIT(rxd, bit) \\\n+\t((rxd)->w.csum_err & cpu_to_le16(bit))\n+\t\tif (FM10K_TEST_RXD_BIT(rx_desc, FM10K_RXD_ERR_SWITCH_ERROR))\n+\t\t\trx_ring->rx_stats.switch_errors++;\n+\t\tif (FM10K_TEST_RXD_BIT(rx_desc, FM10K_RXD_ERR_NO_DESCRIPTOR))\n+\t\t\trx_ring->rx_stats.drops++;\n+\t\tif (FM10K_TEST_RXD_BIT(rx_desc, FM10K_RXD_ERR_PP_ERROR))\n+\t\t\trx_ring->rx_stats.pp_errors++;\n+\t\tif (FM10K_TEST_RXD_BIT(rx_desc, FM10K_RXD_ERR_SWITCH_READY))\n+\t\t\trx_ring->rx_stats.link_errors++;\n+\t\tif (FM10K_TEST_RXD_BIT(rx_desc, FM10K_RXD_ERR_TOO_BIG))\n+\t\t\trx_ring->rx_stats.length_errors++;\n \t\tdev_kfree_skb_any(skb);\n \t\trx_ring->rx_stats.errors++;\n \t\treturn true;\n@@ -878,6 +892,7 @@ static void fm10k_tx_csum(struct fm10k_ring *tx_ring,\n \n \t/* update TX checksum flag */\n \tfirst->tx_flags |= FM10K_TX_FLAGS_CSUM;\n+\ttx_ring->tx_stats.csum_good++;\n \n no_csum:\n \t/* populate Tx descriptor header size and mss */\ndiff --git a/drivers/net/ethernet/intel/fm10k/fm10k_pci.c b/drivers/net/ethernet/intel/fm10k/fm10k_pci.c\nindex 8408d7ba46e8..6d1364393a8b 100644\n--- a/drivers/net/ethernet/intel/fm10k/fm10k_pci.c\n+++ b/drivers/net/ethernet/intel/fm10k/fm10k_pci.c\n@@ -328,6 +328,9 @@ void fm10k_update_stats(struct fm10k_intfc *interface)\n {\n \tstruct net_device_stats *net_stats = &interface->netdev->stats;\n \tstruct fm10k_hw *hw = &interface->hw;\n+\tu64 hw_csum_tx_good = 0, hw_csum_rx_good = 0, rx_length_errors = 0;\n+\tu64 rx_switch_errors = 0, rx_drops = 0, rx_pp_errors = 0;\n+\tu64 rx_link_errors = 0;\n \tu64 rx_errors = 0, rx_csum_errors = 0, tx_csum_errors = 0;\n \tu64 restart_queue = 0, tx_busy = 0, alloc_failed = 0;\n \tu64 rx_bytes_nic = 0, rx_pkts_nic = 0, rx_drops_nic = 0;\n@@ -347,6 +350,7 @@ void fm10k_update_stats(struct fm10k_intfc *interface)\n \t\ttx_csum_errors += tx_ring->tx_stats.csum_err;\n \t\tbytes += tx_ring->stats.bytes;\n \t\tpkts += tx_ring->stats.packets;\n+\t\thw_csum_tx_good += tx_ring->tx_stats.csum_good;\n \t}\n \n \tinterface->restart_queue = restart_queue;\n@@ -354,6 +358,8 @@ void fm10k_update_stats(struct fm10k_intfc *interface)\n \tnet_stats->tx_bytes = bytes;\n \tnet_stats->tx_packets = pkts;\n \tinterface->tx_csum_errors = tx_csum_errors;\n+\tinterface->hw_csum_tx_good = hw_csum_tx_good;\n+\n \t/* gather some stats to the interface struct that are per queue */\n \tfor (bytes = 0, pkts = 0, i = 0; i < interface->num_rx_queues; i++) {\n \t\tstruct fm10k_ring *rx_ring = interface->rx_ring[i];\n@@ -363,12 +369,24 @@ void fm10k_update_stats(struct fm10k_intfc *interface)\n \t\talloc_failed += rx_ring->rx_stats.alloc_failed;\n \t\trx_csum_errors += rx_ring->rx_stats.csum_err;\n \t\trx_errors += rx_ring->rx_stats.errors;\n+\t\thw_csum_rx_good += rx_ring->rx_stats.csum_good;\n+\t\trx_switch_errors += rx_ring->rx_stats.switch_errors;\n+\t\trx_drops += rx_ring->rx_stats.drops;\n+\t\trx_pp_errors += rx_ring->rx_stats.pp_errors;\n+\t\trx_link_errors += rx_ring->rx_stats.link_errors;\n+\t\trx_length_errors += rx_ring->rx_stats.length_errors;\n \t}\n \n \tnet_stats->rx_bytes = bytes;\n \tnet_stats->rx_packets = pkts;\n \tinterface->alloc_failed = alloc_failed;\n \tinterface->rx_csum_errors = rx_csum_errors;\n+\tinterface->hw_csum_rx_good = hw_csum_rx_good;\n+\tinterface->rx_switch_errors = rx_switch_errors;\n+\tinterface->rx_drops = rx_drops;\n+\tinterface->rx_pp_errors = rx_pp_errors;\n+\tinterface->rx_link_errors = rx_link_errors;\n+\tinterface->rx_length_errors = rx_length_errors;\n \n \thw->mac.ops.update_hw_stats(hw, &interface->stats);\n \ndiff --git a/drivers/net/ethernet/intel/fm10k/fm10k_type.h b/drivers/net/ethernet/intel/fm10k/fm10k_type.h\nindex bac8d486d75f..318a212f0a78 100644\n--- a/drivers/net/ethernet/intel/fm10k/fm10k_type.h\n+++ b/drivers/net/ethernet/intel/fm10k/fm10k_type.h\n@@ -762,6 +762,12 @@ enum fm10k_rxdesc_xc {\n #define FM10K_RXD_STATUS_L4E\t\t0x4000 /* L4 csum error */\n #define FM10K_RXD_STATUS_IPE\t\t0x8000 /* IPv4 csum error */\n \n+#define FM10K_RXD_ERR_SWITCH_ERROR\t0x0001 /* Switch found bad packet */\n+#define FM10K_RXD_ERR_NO_DESCRIPTOR\t0x0002 /* No descriptor available */\n+#define FM10K_RXD_ERR_PP_ERROR\t\t0x0004 /* RAM error during processing */\n+#define FM10K_RXD_ERR_SWITCH_READY\t0x0008 /* Link transition mid-packet */\n+#define FM10K_RXD_ERR_TOO_BIG\t\t0x0010 /* Pkt too big for single buf */\n+\n struct fm10k_ftag {\n \t__be16 swpri_type_user;\n \t__be16 vlan;\n", "prefixes": [ "net-next", "rc2" ] }