Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965543AbbGVQSd (ORCPT ); Wed, 22 Jul 2015 12:18:33 -0400 Received: from mail-bl2on0126.outbound.protection.outlook.com ([65.55.169.126]:35008 "EHLO na01-bl2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S965351AbbGVQSY (ORCPT ); Wed, 22 Jul 2015 12:18:24 -0400 Authentication-Results: spf=fail (sender IP is 192.88.158.2) smtp.mailfrom=freescale.com; freescale.mail.onmicrosoft.com; dkim=none (message not signed) header.d=none; From: Madalin Bucur To: CC: , , , , , , , , Madalin Bucur Subject: [PATCH 09/10] dpaa_eth: add debugfs entries Date: Wed, 22 Jul 2015 19:16:45 +0300 Message-ID: <1437581806-17420-9-git-send-email-madalin.bucur@freescale.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1437581806-17420-8-git-send-email-madalin.bucur@freescale.com> References: <1437581806-17420-1-git-send-email-madalin.bucur@freescale.com> <1437581806-17420-2-git-send-email-madalin.bucur@freescale.com> <1437581806-17420-3-git-send-email-madalin.bucur@freescale.com> <1437581806-17420-4-git-send-email-madalin.bucur@freescale.com> <1437581806-17420-5-git-send-email-madalin.bucur@freescale.com> <1437581806-17420-6-git-send-email-madalin.bucur@freescale.com> <1437581806-17420-7-git-send-email-madalin.bucur@freescale.com> <1437581806-17420-8-git-send-email-madalin.bucur@freescale.com> Reply-To: X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BY2FFO11FD013;1:qh3oc43ep/Zz5WseZYbmWDx5+t8BhpjUXWzqpblbWzwxEZNbTwhtUznIIeVNH4tuuy+xwmYnXzSa027Ip9E6NLBFaIrQWYKmLFKWPFqhAqIUfmNK7yiIrmrD92law5HJutqneLiTdEzWqsi37mK2lbuCW127RdC1htVXfxB4+g7kO7J/VtGS5tuycGtqzHMTjbjL0KfiXkQLDO2OkxU8CsBGTDFHurxNzz5XagGzn9Hv6DWGtEarJj1qRJRTj+PMZKg8ZgLfr42sd7cD6dc4gp0lKzifWwHRMX7PLrN2h+275Tk9p62LNsUvhwt5BYfd4ofLbSCenSTr80keGB/p3ICXZ3LWGKVV9FVHI9s0dD9TcHhkh8jK/2NbL4NAzVgcEfkAfEPLTb/3+e6bnVJV1KYMFZYaTlZRzLjIPnIMsm1O1OG11REc4Sr9lQLA/zh7 X-Forefront-Antispam-Report: CIP:192.88.158.2;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(2980300002)(339900001)(199003)(189002)(2950100001)(5001960100002)(53806999)(76176999)(107886002)(50986999)(48376002)(106466001)(189998001)(110136002)(87936001)(86362001)(6806004)(85426001)(49486002)(43066003)(19580405001)(77096005)(50226001)(19580395003)(50466002)(105606002)(104016003)(5003940100001)(33646002)(93886004)(47776003)(229853001)(2351001)(36756003)(46102003)(77156002)(62966003)(4001430100001);DIR:OUT;SFP:1102;SCL:1;SRVR:BY2PR03MB378;H:az84smr01.freescale.net;FPR:;SPF:Fail;MLV:sfv;A:1;MX:1;LANG:en; MIME-Version: 1.0 Content-Type: text/plain X-Microsoft-Exchange-Diagnostics: 1;BY2PR03MB378;2:IngI88DmL6JC/8lnTs35plxZsdgsFECG3+pzqO03/blOBtdOA2hQwSKRSl/SeqATt75MJXF1kpqxvxLz/KprSx8P00FiyHHh5mzetsUpzG8hrZ+NDLPfznjhe8/2uV2KcRpjD0oQ0ThFqBWNZeqq6P9ZRGxGsM6k/yDHkJjBZyo=;3:OnTteHrzW6VDGaFASESZZYATr9CuihiVyWi+hCKM0Tvj06ZG+G7G6ZkUhpc/tpq+fJcZ6m6nMN+0m3RZ1npxosTNML1msffP9DJWDt1/+dT4njw9+5M3D1TMn+QELpFc9v75TUou6IRACFtu9LDXb2QPPorM30NaQSMePyHJqsKNQ0VSNvmIu/70y3sdzHL5q+1OHwSqYQedwRYsMDWm5+DY9RHjECgAZgpapp3Usuk=;25:D8jiqIoDNKc0j6NJD62WlSCUCRn6EVkrtQe8alcAETbNIKiODgFWiLoQqjS3t63UdjzYmU8DBuOfaM6CCF4beA3WdA9gS0/9Wts48dlC19qzBcv9el5ZuBSctHtOdx3GOwe8z7rcc0Iytt4rhvnj7zb5P2mu8txOG6ePTL0cj0bJJwWedQzwO0vWxLBdzACfrDYT9B0N4/lvA51iBxR87nx8bk6oDzRCYaxHTK1Bt7PM+Aq+mCFCj5I8LOe4vM02bFG6hu+MJBe7pUhpL4r1vw== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY2PR03MB378; X-Microsoft-Exchange-Diagnostics: 1;BY2PR03MB378;20:JzqJpUJs3T7zxOikWGMsya6OjoGZ+STRzjBghHDwByJZZkxfjCBXyXUyGKia5xEOShOigkbY1CEi/zy7Q8OF8O5mjxqWwpltA0Hq06BfuNPa2RBOI2mCPIEKQcScmle4IoZt3I8JLltOfUbMkZt23hh3sbz6r1KNbC4hNF7bxxtK+U4gfNWuL6MHN0lxzzp7DDDD4m11jyWVJyrLmCZy2B8ojGnoS/9S+L4WVALOVxk6HSd+Ma2WUGVVYdCigNB2semF22qPszyGIHI1mMLrAQHsV/BSD7EcYIxwlXBUBNTg9P0R1qgQWx5ffErByZXWlioKisbhoedwrzndK95HkgkrQrunt3fq8eo5Rs+FMwI=;4:kp/GPqCVoY/0ywTCD3yn067VCSxcIJOvWywQHxwgG7kOBpwkTMJ5aMQmLM/Y6I3fn1cOLIF1TgiNleUOeAiQBCly6l1wOP7lxTXIXRSDPdekD2FTH1OXXJimhKA+4pRKo73HeXLD9iXZ4WD8QPTEGndJB6UgJawu5IvCn3YWBZTC0VjSQ50/v0g3qwoZdldWSvqQgZk9eICQHyBljeh2BtuhU6ila6E5Ft542DxBk7vcKYNmUzbF5ICWv7d9wZ4fzbN3eyVro20z2u/aQyjtkhANY5n7bJCZJQS/mQyzQQw= BY2PR03MB378: X-MS-Exchange-Organization-RulesExecuted X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(5005006)(3002001);SRVR:BY2PR03MB378;BCL:0;PCL:0;RULEID:;SRVR:BY2PR03MB378; X-Forefront-PRVS: 0645BEB7AA X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BY2PR03MB378;23:MOwSK3Az2jJueuGbqCVc1TNP0nw/In4BD9Mq2pj1RK?= =?us-ascii?Q?+xpURRu1AT6mK18RuzYuzpMlSit5BfjGiVSqqgpVK22I4WOcH8uG+dEA8BO4?= =?us-ascii?Q?S9X2aAioNeTzA0ijrUOQP+dVlbCy/Rznm7FRQBRnSvIa/I2mippGoiKt/76Z?= =?us-ascii?Q?z7c03m+sj887ZuKyU22EPncRsAIF47JAtEw1BhwDobKN31QLRAilTpuVwQ91?= =?us-ascii?Q?jSWZ9EQLR1sA7kQu7wjkhFuEOi9h4Ob0931J8PzttomHFqTPUPlRkSb/9NmK?= =?us-ascii?Q?HgdCgdOenoDiPBeUWOLv9POr/JYedl7l7UqM5m8rtC2v9EJ9Yqg96wgBg2Jd?= =?us-ascii?Q?SmctcqNVeunLdo5XjBGiZjz0iHq0oRcf+EwJ2UGgfl/Mac481rQABgXCtun1?= =?us-ascii?Q?epDwK5n6LuNzeZFflRhLwfJdB02BSKPLeag7HRugk7bf+iq4tv+daczrYrGd?= =?us-ascii?Q?ooOp9sn5EKr5+p8prqfK7T2N/qh+Wn9sQZ4Dq7nOoNJ1lLNu3THUWvfeGsDI?= =?us-ascii?Q?VEmWAgDm8rA4CVngRKKpGa0YQyvvmdVKY0W3LK7Kwy0yB7k8oHg10+R8N5Wt?= =?us-ascii?Q?59VUwsuoI6UReYDrqkDLCAkPK11t86cO3X6BDokgyoPOeB31/MIIMj6e92vA?= =?us-ascii?Q?7Im+GnFe4o15tOR7HVf1MzsV8AZLsjzujiMlwLpS49R3qpdrx6EwVNxJ/GX5?= =?us-ascii?Q?rI9++fzfR59j7to3kvylUONVAJrJznLy6tmduKVDAA8bSCYHWjbTHeeIqu/9?= =?us-ascii?Q?XFA9xe8l+JFXE2EH0Whbpj9mRVPsKQp58eIRk++DhYwkq40CjLwJr9TnkL3y?= =?us-ascii?Q?UiCaszrQEVseMeK9DhLdujR4tucBCAbnxrn3QbAA12Xd01BC+EsnsbbAwK7q?= =?us-ascii?Q?E8eGM0g6tCDwk0+Hi4JLs3P0AO6iHM+RrpV4kyF93yNtDgjqhby7VjiJQ6W3?= =?us-ascii?Q?BN7N/Fo8FC38IpyEqUHl3FXeTUr3KzXY0jO8nBZEccGzpMpYwXShmgF25FNA?= =?us-ascii?Q?fMeM9hmv1kNHE/SwnlR3inMspufbjbJWEBX2lDND0z3Q=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;BY2PR03MB378;5:mlvqBbDLlUgloBPsFz8WIDmk4OG0wAL2NzVAFQ/BIPoCa4zZfKJQJFsbuUwZwQo6Ahl5H7P9+JNa+Jwz1i4FzNXb4o9s00WwzdVJCl2WEH5pNT1AF81F4I/pcg2SI9ZbSh6RSUkNP0VlVYLILHEUsA==;24:8d8chcwS1gySlZBaH1+dQ0RGm9OLXPsXR0JPhoLKuMDqCYn6kqU26M4ff+OBhR0Lc1nuty5qwQekLlcHACygUBUvsoWGDqS4b33JAXhnZvk=;20:VjUl1BG49+tLZTzqjeOLSs9/YKymL16Ze2WlEjh78jecNCECXGU/LMiNpc2HW3i0OaTz5IYUgEf5aOt9gX7edA== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jul 2015 16:18:20.5301 (UTC) X-MS-Exchange-CrossTenant-Id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=710a03f5-10f6-4d38-9ff4-a80b81da590d;Ip=[192.88.158.2];Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY2PR03MB378 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 17285 Lines: 471 Export per CPU counters through debugfs. Signed-off-by: Madalin Bucur --- drivers/net/ethernet/freescale/dpaa/Kconfig | 7 + drivers/net/ethernet/freescale/dpaa/Makefile | 3 + drivers/net/ethernet/freescale/dpaa/dpaa_debugfs.c | 273 +++++++++++++++++++++ drivers/net/ethernet/freescale/dpaa/dpaa_debugfs.h | 43 ++++ drivers/net/ethernet/freescale/dpaa/dpaa_eth.c | 11 + drivers/net/ethernet/freescale/dpaa/dpaa_eth.h | 4 + .../net/ethernet/freescale/dpaa/dpaa_eth_common.c | 17 ++ 7 files changed, 358 insertions(+) create mode 100644 drivers/net/ethernet/freescale/dpaa/dpaa_debugfs.c create mode 100644 drivers/net/ethernet/freescale/dpaa/dpaa_debugfs.h diff --git a/drivers/net/ethernet/freescale/dpaa/Kconfig b/drivers/net/ethernet/freescale/dpaa/Kconfig index 3fa7925..ddc9d9b 100644 --- a/drivers/net/ethernet/freescale/dpaa/Kconfig +++ b/drivers/net/ethernet/freescale/dpaa/Kconfig @@ -71,4 +71,11 @@ config FSL_DPAA_INGRESS_CS_THRESHOLD The size in bytes of the ingress tail-drop threshold on FMan ports. Traffic piling up above this value will be rejected by QMan and discarded by FMan. +config FSL_DPAA_ETH_DEBUGFS + bool "DPAA Ethernet debugfs interface" + depends on DEBUG_FS + default y + ---help--- + This option compiles debugfs code for the DPAA Ethernet driver. + endif # FSL_DPAA_ETH diff --git a/drivers/net/ethernet/freescale/dpaa/Makefile b/drivers/net/ethernet/freescale/dpaa/Makefile index 3a276d5..3427de4 100644 --- a/drivers/net/ethernet/freescale/dpaa/Makefile +++ b/drivers/net/ethernet/freescale/dpaa/Makefile @@ -11,3 +11,6 @@ ccflags-y += -I$(FMAN)/flib obj-$(CONFIG_FSL_DPAA_ETH) += fsl_dpa.o fsl_dpa-objs += dpaa_eth.o dpaa_eth_sg.o dpaa_eth_common.o dpaa_ethtool.o dpaa_eth_sysfs.o +ifeq ($(CONFIG_FSL_DPAA_ETH_DEBUGFS),y) +fsl_dpa-objs += dpaa_debugfs.o +endif diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_debugfs.c b/drivers/net/ethernet/freescale/dpaa/dpaa_debugfs.c new file mode 100644 index 0000000..2687980 --- /dev/null +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_debugfs.c @@ -0,0 +1,273 @@ +/* Copyright 2008 - 2015 Freescale Semiconductor Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Freescale Semiconductor nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * ALTERNATIVELY, this software may be distributed under the terms of the + * GNU General Public License ("GPL") as published by the Free Software + * Foundation, either version 2 of that License or (at your option) any + * later version. + * + * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include "dpaa_debugfs.h" +#include "dpaa_eth.h" + +#define DPA_DEBUGFS_DESCRIPTION "FSL DPAA Ethernet debugfs entries" +#define DPA_ETH_DEBUGFS_ROOT "fsl_dpa" + +static int dpa_debugfs_open(struct inode *inode, struct file *file); + +static struct dentry *dpa_debugfs_root; +static const struct file_operations dpa_debugfs_fops = { + .open = dpa_debugfs_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static int dpa_debugfs_show(struct seq_file *file, void *offset) +{ + int i; + struct dpa_priv_s *priv; + struct dpa_percpu_priv_s *percpu_priv, total; + struct dpa_bp *dpa_bp; + unsigned int dpa_bp_count = 0; + unsigned int count_total = 0; + struct qm_mcr_querycgr query_cgr; + + BUG_ON(!offset); + + priv = netdev_priv((struct net_device *)file->private); + + dpa_bp = priv->dpa_bp; + + memset(&total, 0, sizeof(total)); + + /* "Standard" counters */ + seq_printf(file, "\nDPA counters for %s:\n", priv->net_dev->name); + seq_puts(file, "CPU irqs rx tx recycle "); + seq_puts(file, "confirm tx sg tx err rx err bp count\n"); + + for_each_online_cpu(i) { + percpu_priv = per_cpu_ptr(priv->percpu_priv, i); + + if (dpa_bp->percpu_count) + dpa_bp_count = *(per_cpu_ptr(dpa_bp->percpu_count, i)); + + total.in_interrupt += percpu_priv->in_interrupt; + total.stats.rx_packets += percpu_priv->stats.rx_packets; + total.stats.tx_packets += percpu_priv->stats.tx_packets; + total.tx_confirm += percpu_priv->tx_confirm; + total.tx_frag_skbuffs += percpu_priv->tx_frag_skbuffs; + total.stats.tx_errors += percpu_priv->stats.tx_errors; + total.stats.rx_errors += percpu_priv->stats.rx_errors; + count_total += dpa_bp_count; + + seq_printf(file, " %hu %8llu %8llu %8llu ", + i, + percpu_priv->in_interrupt, + percpu_priv->stats.rx_packets, + percpu_priv->stats.tx_packets); + seq_printf(file, "%8llu %8llu %8llu %8llu %8d\n", + percpu_priv->tx_confirm, + percpu_priv->tx_frag_skbuffs, + percpu_priv->stats.tx_errors, + percpu_priv->stats.rx_errors, + dpa_bp_count); + } + seq_printf(file, "Total %8llu %8llu %8llu ", + total.in_interrupt, + total.stats.rx_packets, + total.stats.tx_packets); + seq_printf(file, "%8llu %8llu %8llu %8llu %8d\n", + total.tx_confirm, + total.tx_frag_skbuffs, + total.stats.tx_errors, + total.stats.rx_errors, + count_total); + + /* Congestion stats */ + seq_puts(file, "\nDevice congestion stats:\n"); + seq_printf(file, "Device has been congested for %d ms.\n", + jiffies_to_msecs(priv->cgr_data.congested_jiffies)); + + if (qman_query_cgr(&priv->cgr_data.cgr, &query_cgr) != 0) { + seq_printf(file, "CGR id %d - failed to query values\n", + priv->cgr_data.cgr.cgrid); + } else { + seq_printf(file, "CGR id %d avg count: %llu\n", + priv->cgr_data.cgr.cgrid, + qm_mcr_querycgr_a_get64(&query_cgr)); + seq_printf(file, "Device entered congestion %u times. ", + priv->cgr_data.cgr_congested_count); + seq_printf(file, "Current congestion state is: %s.\n", + query_cgr.cgr.cs ? "congested" : "not congested"); + /* Reset congestion stats (like QMan CGR API does) */ + priv->cgr_data.congested_jiffies = 0; + priv->cgr_data.cgr_congested_count = 0; + } + + /* Rx Errors demultiplexing */ + seq_puts(file, "\nDPA RX Errors:\nCPU dma err phys err"); + seq_puts(file, " size err hdr err csum err\n"); + for_each_online_cpu(i) { + percpu_priv = per_cpu_ptr(priv->percpu_priv, i); + + total.rx_errors.dme += percpu_priv->rx_errors.dme; + total.rx_errors.fpe += percpu_priv->rx_errors.fpe; + total.rx_errors.fse += percpu_priv->rx_errors.fse; + total.rx_errors.phe += percpu_priv->rx_errors.phe; + + seq_printf(file, " %hu %8llu %8llu ", + i, + percpu_priv->rx_errors.dme, + percpu_priv->rx_errors.fpe); + seq_printf(file, "%8llu %8llu\n", + percpu_priv->rx_errors.fse, + percpu_priv->rx_errors.phe); + } + seq_printf(file, "Total %8llu %8llu %8llu %8llu\n", + total.rx_errors.dme, + total.rx_errors.fpe, + total.rx_errors.fse, + total.rx_errors.phe); + + /* ERN demultiplexing */ + seq_puts(file, "\nDPA ERN counters:\n CPU cg_td wred "); + seq_puts(file, "err_cond early_w late_w fq_td fq_ret"); + seq_puts(file, " orp_z\n"); + for_each_online_cpu(i) { + percpu_priv = per_cpu_ptr(priv->percpu_priv, i); + + total.ern_cnt.cg_tdrop += percpu_priv->ern_cnt.cg_tdrop; + total.ern_cnt.wred += percpu_priv->ern_cnt.wred; + total.ern_cnt.err_cond += percpu_priv->ern_cnt.err_cond; + total.ern_cnt.early_window += percpu_priv->ern_cnt.early_window; + total.ern_cnt.late_window += percpu_priv->ern_cnt.late_window; + total.ern_cnt.fq_tdrop += percpu_priv->ern_cnt.fq_tdrop; + total.ern_cnt.fq_retired += percpu_priv->ern_cnt.fq_retired; + total.ern_cnt.orp_zero += percpu_priv->ern_cnt.orp_zero; + + seq_printf(file, " %hu %8llu %8llu %8llu %8llu ", + i, + percpu_priv->ern_cnt.cg_tdrop, + percpu_priv->ern_cnt.wred, + percpu_priv->ern_cnt.err_cond, + percpu_priv->ern_cnt.early_window); + seq_printf(file, "%8llu %8llu %8llu %8llu\n", + percpu_priv->ern_cnt.late_window, + percpu_priv->ern_cnt.fq_tdrop, + percpu_priv->ern_cnt.fq_retired, + percpu_priv->ern_cnt.orp_zero); + } + seq_printf(file, "Total %8llu %8llu %8llu %8llu ", + total.ern_cnt.cg_tdrop, + total.ern_cnt.wred, + total.ern_cnt.err_cond, + total.ern_cnt.early_window); + seq_printf(file, "%8llu %8llu %8llu %8llu\n", + total.ern_cnt.late_window, + total.ern_cnt.fq_tdrop, + total.ern_cnt.fq_retired, + total.ern_cnt.orp_zero); + + return 0; +} + +static int dpa_debugfs_open(struct inode *inode, struct file *file) +{ + int err; + const struct net_device *net_dev; + struct dpa_priv_s *priv; + + err = single_open(file, dpa_debugfs_show, inode->i_private); + if (unlikely(err < 0)) { + net_dev = (struct net_device *)inode->i_private; + priv = (struct dpa_priv_s *)netdev_priv(net_dev); + + netif_err(priv, drv, net_dev, "single_open() = %d\n", err); + } + return err; +} + +int dpa_netdev_debugfs_create(struct net_device *net_dev) +{ + struct dpa_priv_s *priv = netdev_priv(net_dev); + + if (unlikely(!dpa_debugfs_root)) { + pr_err(KBUILD_MODNAME ": %s:%hu:%s(): \t%s\n", + KBUILD_BASENAME ".c", __LINE__, __func__, + "root debugfs missing, possible module ordering issue"); + return -ENOMEM; + } + + priv->debugfs_file = debugfs_create_file(net_dev->name, + S_IRUGO, + dpa_debugfs_root, + net_dev, + &dpa_debugfs_fops); + if (unlikely(!priv->debugfs_file)) { + netdev_err(net_dev, "debugfs_create_file(%s/%s/%s)", + powerpc_debugfs_root->d_iname, + dpa_debugfs_root->d_iname, + net_dev->name); + + return -ENOMEM; + } + + return 0; +} + +void dpa_netdev_debugfs_remove(struct net_device *net_dev) +{ + struct dpa_priv_s *priv = netdev_priv(net_dev); + + debugfs_remove(priv->debugfs_file); +} + +int __init dpa_debugfs_module_init(void) +{ + int err = 0; + + pr_info(KBUILD_MODNAME ": " DPA_DEBUGFS_DESCRIPTION "\n"); + + dpa_debugfs_root = debugfs_create_dir(DPA_ETH_DEBUGFS_ROOT, + powerpc_debugfs_root); + if (unlikely(!dpa_debugfs_root)) { + err = -ENOMEM; + pr_err(KBUILD_MODNAME ": %s:%hu:%s():\n", + KBUILD_BASENAME ".c", __LINE__, __func__); + pr_err("\tdebugfs_create_dir(%s/" KBUILD_MODNAME ") = %d\n", + powerpc_debugfs_root->d_iname, err); + } + + return err; +} + +void __exit dpa_debugfs_module_exit(void) +{ + debugfs_remove(dpa_debugfs_root); +} diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_debugfs.h b/drivers/net/ethernet/freescale/dpaa/dpaa_debugfs.h new file mode 100644 index 0000000..c4c6582 --- /dev/null +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_debugfs.h @@ -0,0 +1,43 @@ +/* Copyright 2008-2015 Freescale Semiconductor Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Freescale Semiconductor nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * + * ALTERNATIVELY, this software may be distributed under the terms of the + * GNU General Public License ("GPL") as published by the Free Software + * Foundation, either version 2 of that License or (at your option) any + * later version. + * + * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DPAA_DEBUGFS_H_ +#define DPAA_DEBUGFS_H_ + +#include +#include + +int dpa_netdev_debugfs_create(struct net_device *net_dev); +void dpa_netdev_debugfs_remove(struct net_device *net_dev); +int __init dpa_debugfs_module_init(void); +void __exit dpa_debugfs_module_exit(void); + +#endif /* DPAA_DEBUGFS_H_ */ diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c index 926a740..59c8edc 100644 --- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c @@ -57,6 +57,9 @@ #include "mac.h" #include "dpaa_eth.h" #include "dpaa_eth_common.h" +#ifdef CONFIG_FSL_DPAA_ETH_DEBUGFS +#include "dpaa_debugfs.h" +#endif /* CONFIG_FSL_DPAA_ETH_DEBUGFS */ #define DPA_NAPI_WEIGHT 64 @@ -810,6 +813,10 @@ static int __init dpa_load(void) pr_info(DPA_DESCRIPTION "\n"); +#ifdef CONFIG_FSL_DPAA_ETH_DEBUGFS + dpa_debugfs_module_init(); +#endif /* CONFIG_FSL_DPAA_ETH_DEBUGFS */ + /* initialise dpaa_eth mirror values */ dpa_rx_extra_headroom = fm_get_rx_extra_headroom(); dpa_max_frm = fm_get_max_frm(); @@ -835,6 +842,10 @@ static void __exit dpa_unload(void) platform_driver_unregister(&dpa_driver); +#ifdef CONFIG_FSL_DPAA_ETH_DEBUGFS + dpa_debugfs_module_exit(); +#endif /* CONFIG_FSL_DPAA_ETH_DEBUGFS */ + /* Only one channel is used and needs to be relased after all * interfaces are removed */ diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.h b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.h index 0fab7240..18dadf6 100644 --- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.h +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.h @@ -252,6 +252,10 @@ struct dpa_priv_s { u16 channel; /* "fsl,qman-channel-id" */ struct list_head dpa_fq_list; +#ifdef CONFIG_FSL_DPAA_ETH_DEBUGFS + struct dentry *debugfs_file; +#endif /* CONFIG_FSL_DPAA_ETH_DEBUGFS */ + u32 msg_enable; /* net_device message level */ struct { diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth_common.c b/drivers/net/ethernet/freescale/dpaa/dpaa_eth_common.c index 4085f14..a716a72 100644 --- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth_common.c +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth_common.c @@ -43,6 +43,9 @@ #include #include "dpaa_eth.h" #include "dpaa_eth_common.h" +#ifdef CONFIG_FSL_DPAA_ETH_DEBUGFS +#include "dpaa_debugfs.h" +#endif /* CONFIG_FSL_DPAA_ETH_DEBUGFS */ #include "mac.h" /* Size in bytes of the FQ taildrop threshold */ @@ -95,6 +98,15 @@ int dpa_netdev_init(struct net_device *net_dev, return err; } +#ifdef CONFIG_FSL_DPAA_ETH_DEBUGFS + /* create debugfs entry for this net_device */ + err = dpa_netdev_debugfs_create(net_dev); + if (err) { + unregister_netdev(net_dev); + return err; + } +#endif /* CONFIG_FSL_DPAA_ETH_DEBUGFS */ + return 0; } @@ -304,6 +316,11 @@ int dpa_remove(struct platform_device *pdev) if (priv->buf_layout) devm_kfree(dev, priv->buf_layout); +#ifdef CONFIG_FSL_DPAA_ETH_DEBUGFS + /* remove debugfs entry for this net_device */ + dpa_netdev_debugfs_remove(net_dev); +#endif /* CONFIG_FSL_DPAA_ETH_DEBUGFS */ + free_netdev(net_dev); return err; -- 1.7.11.7 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/