From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757305AbcKBUSt (ORCPT ); Wed, 2 Nov 2016 16:18:49 -0400 Received: from mail-bn3nam01on0043.outbound.protection.outlook.com ([104.47.33.43]:15448 "EHLO NAM01-BN3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1756102AbcKBUR7 (ORCPT ); Wed, 2 Nov 2016 16:17:59 -0400 Authentication-Results: spf=fail (sender IP is 192.88.158.2) smtp.mailfrom=nxp.com; transmode.se; dkim=none (message not signed) header.d=none;transmode.se; dmarc=fail action=none header.from=nxp.com; From: Madalin Bucur To: CC: , , , , , , , Subject: [PATCH net-next v6 06/10] dpaa_eth: add sysfs exports Date: Wed, 2 Nov 2016 22:17:30 +0200 Message-ID: <1478117854-8952-7-git-send-email-madalin.bucur@nxp.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1478117854-8952-1-git-send-email-madalin.bucur@nxp.com> References: <1478117854-8952-1-git-send-email-madalin.bucur@nxp.com> Reply-To: X-EOPAttributedMessage: 0 X-Matching-Connectors: 131225914758746651;(91ab9b29-cfa4-454e-5278-08d120cd25b8);() X-Forefront-Antispam-Report: CIP:192.88.158.2;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(7916002)(2980300002)(1110001)(1109001)(339900001)(199003)(189002)(356003)(81166006)(6666003)(4326007)(189998001)(85426001)(7846002)(87936001)(50226002)(2950100002)(8936002)(2906002)(5003940100001)(105606002)(586003)(69596002)(110136003)(97736004)(229853001)(305945005)(106466001)(6916009)(2351001)(626004)(48376002)(86362001)(50466002)(76176999)(43066003)(53806999)(50986999)(11100500001)(81156014)(36756003)(33646002)(19580405001)(77096005)(68736007)(104016004)(5660300001)(19580395003)(8676002)(47776003)(3450700001)(2004002);DIR:OUT;SFP:1101;SCL:1;SRVR:SN1PR0301MB1630;H:az84smr01.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BL2FFO11FD044;1:MIqfSyfPds0C7Ok4WzFzo6+bcESwS6ii6oR3sj0sUFDWbb/xjo2mD4dRdAHtmFPYjZzPW6lcEvbZhnK1gt/+cI2b1sWYEv09fQlO3yOFLuK5oEf/PKUUoGG86Q8weSNzLh2thgRY7JIhqY24FcQVV8/MZ5ptaCQAjtLeyNqCnLCuo6JQJ7ycAYFmhiY/FTsSdWFcdCpN848HCP/f2N6yDRNw8xTGBopn4TBrYpQ0TQfwL+tGs1P3Ga9i5q5fGAUbYnK4p9FgcygCgT0wEjelxsNAFb3BLpnGk2llaaKLc6w+Sp8vjXAPpdDzJ8IBbgkZwbzVC5Hc7xu1xh3WoVyPP4tRYH5NlCpn/qvNrg+1wvWsQQ+dXDuE7dvQTu4IHOoIx1XiK1EnMF0sbOkfqRQKN7jOJ+z1ydAj02SMPyJZ4UARX1xIubUBixjtAScNFE2C/twM6h2lOxtQPnU6XNY2ShxFzJfgt0tnL3PQrSPGBXglnXUX7B9Gz1WLgN9EpOM9xiyn+vHh1KMCm2Gi/zB3JezS9Hv4elmKxiIxVQ0Cpumt7PBlh7unNgZx9YmFYd5ftCQ/HfVyjwozfKELIjC7Z0Q4y+YaPBtVHQqRDLIKRjfZnsqlWMoIccJsW3ZZ7f4W MIME-Version: 1.0 Content-Type: text/plain X-MS-Office365-Filtering-Correlation-Id: 42b236a2-06f0-4c22-f0ba-08d4035d54f9 X-Microsoft-Exchange-Diagnostics: 1;SN1PR0301MB1630;2:yLb4LDBBUUKenT6T6DxvGnK4hqzS4xxrfyYimzMMsMUYfTkRrbGjodjfbteiXGTy0b+nh1dIbvF95NINOt+gpGXWf7JJSPZz1L/1Vwpob4cMYS+voWDH+OVWd0GWj+g0lrZTe+vBKWvfG1Vvsyxxq/pigZfjFTbdEd1VktcC+wptq3V9Jd7Wk86Y0NuXitCDUnWpS8g9KBW3/4CB+/ch5Q==;3:vdlULkhBtEcVODoZLHCCRmow/TC35ZvpOK/FAnxT6vABiPQrZKsc2ThZbIXJoKKyiXZSIMaC2M/JyLSIJY6JYPBv0+xlcYnHSYlX7EkIw3DE2xW4qW3/dGtfFBAwuixUAjbi+k212RAJjcTwQ/DzyXNheb955pEoyN43UTopeQrqoHvo8jNrNdl7OIMLKIzAGDbJmJ/+f7ELYxCrIGx2lt2ZOEvJT7hk5vpt3JEW1uicuetjJBY9xZ/xpEQ7+2rW X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:SN1PR0301MB1630; X-Microsoft-Exchange-Diagnostics: 1;SN1PR0301MB1630;25:MRxKlfkNqxBV48kUyz5yZy8JTdwHBlZrIA+3uc3wXzjuEQ7c2cyipOEWcjbmRh1WauFJIVDK/5wxtaaQNau9aLrE6xWGNfaE9u37bi3/Q38EGbCTTpqz5SFA3nEbCMLpO+1Un8PoarBEh4s5dC6vOrBhMDXEW8WS/sxlz7zlFTK/3xRqcY+4YjpoqnbwskPdtWnsyzbTuwUCoqrrHs2z0SABCamtPD+QCtfX71VEScCZ9S/4L8gRcFwFNhSi/7MkkYyMhcU6PLjveoWZ+WTbFoXu7ICxcna5C0Qpk20P90BsitNz/S1tmzkPgIBIcGRtvhrgXrboB+Z/lRrWZ+VNtGotpKEseM10ZPKs6w0fiezPyAyONZUB4o4k/EMk3d6vqF/iwkPM0q5yBIILSqdcAKyRW8ZcQHAp3OjPO7CJBS1+7sNrubHVpNspCCqVzYF2nIJhjn2VRib5XyuwHlRtTVElZWddMl0Fh/TJeKGYVbJad9Zv2ITCKCwGzoUbiOPV+jmWQIoqbIT9KnYMuZiw8eALZFpbDcMmPYsN4t1cPTnT8dgOIvApsG5jpbLNsKFU6gvBhS9VVrb9IyKOJgOi3MG4ojCNgRZ2YzhVG3se0PDWUAN90zUbrJUs8QkxKoUUdhyKFRDoCR97U5/C11zcddTffOW4/HIk/szYyg23zYk8ia3nB5jRXBa7DrGACOw6SN6DacS9NgEyvuymbKWHRC8wbKXx57Np+c98UR8rTWmrZcD8OqQuHVebFGcGrWAIrbwivsyQMgqELG+vicXXJ4kGZL5BIPj7seI9bfcaTechBV/3VgPdDORafZC6V47m X-Microsoft-Exchange-Diagnostics: 1;SN1PR0301MB1630;31:u66iFO2+zwuLkOBmTnUeUQkXwAHgF6mExSwuWcBP0uSYLTzqmflQd1XMRmGtGgWx50QCqPYHsSuuwuwjr6lTLYnpSck+OFCUoDqygZF5rgF18DXvuaKby9/24myVd1ONH0rM9fCCub8miYmNxC5hFePxk3k10gNi7IIUcy7U+x8T/bnSu47wRyd8dzfO0at0MoGOJNJ/PA1SoyVtDF97khA+/bqM9fz00pBuV9ng2sAq/vQNEv1Cu+rpjMPUFJiTFKSDrOvid72VnLSg2Pmcwg==;4:UMODdhCCrpau4MNmzlj/4AkMJWfbtANWOaE5vNx3txi4dc1Xam+CUpmF487yf48j3uikkbpeFy08Pi496ax/7hJiY8eagMzymRAIkeUbGXX6gZinAu2Njlv0HbRsStPwxzPxnYQBWtmuOd+pFSov3/0Pm/37dIq72QwAvzEoD4hs3Uw5edSYLGA9eaFZsJVgwzEU9PZNrWDTnuEY43KLskgZCGp2f3Nnyykwq6IgRKtPGwLPu0Mq7y+vGTO7j/Q+JrXqZm17ycUlTUvgFL0/eeTgx624hjtJigkk0zNNCBK6CjKaGsuh9l6CyK4Ow/PB3XDV+zkwOBHFnv6zeOLiMCju55DGUNqWdIjU5q2Nsf8lVNbaPz7+rtr3g6yuMJLu6B5wSEdLS0jzrVTnbl3kYNipOLvQldiwP7zL7EEqGTjkgwjtbri3loByyimanqi4RVFMbZ5k/jYZateZOWtc2T0K+VGJYDk4NTI+2mjVWYN26sUdFC3Uw0CqygkM8TC1fdywQdxJ+k3XYGYCSpMfJWDXpJNn5R8sBngLXtAhxU+ExS6SSKg/QXowNkuw2vJJ X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(13017025)(13024025)(13023025)(13015025)(13018025)(8121501046)(5005006)(10201501046)(3002001)(6055026);SRVR:SN1PR0301MB1630;BCL:0;PCL:0;RULEID:(400006);SRVR:SN1PR0301MB1630; X-Forefront-PRVS: 0114FF88F6 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;SN1PR0301MB1630;23:c6FaignpaZR8iGD3ca/83mBSeH7PqZKzD3bayEs?= =?us-ascii?Q?HrWWXIUxI6r0XAhKsIFSe3tyxI6WbTHhCuCpacfoXquTIZ/HjbP/CY5UCy4t?= =?us-ascii?Q?Qf2yxcSE7518KYxp+i/kv/Vm+Gps+a6xxH2nvLYWmghhd26Z8McFbvVCLeFq?= =?us-ascii?Q?jmTZH25JBYOyCtTm6UXKrr7FBIBZsfpfRlqaPwvN/18jOr5ZARrbtKDqjnKK?= =?us-ascii?Q?3mt51NQkpZ4+Po4pLy/ii++JjyBct1+AUSMVTT2mY3qpCygH6juk7uJzhcYF?= =?us-ascii?Q?D+SOZRsqAesRFNOXKWWaZ0tmkf5MSxsGslSb4JZojm3aEUQUlMRMuMhsYpps?= =?us-ascii?Q?w2IMO/QRwIjrHtIU+Za9qf6vbpILAlcJgk7EEnuIJASONo/4CrfKKFa0/hWJ?= =?us-ascii?Q?mpZLuP/7TLCKCaohn+Jo4SbW/J99hheoWSPlLPxL7Ag7/8lIQ1LDydgq47ql?= =?us-ascii?Q?c2zFvsWlPTv5fxfnrT+U1PlrbkrH0pTStap5LJ4xt2Uf0tDF+2Xr0hV8mCiP?= =?us-ascii?Q?Nqgf/1P8jOcGmdQ6giyjSOQiVPC16N9r4pbQ8OzMdiXcFZ4AMZykRm+ERFeg?= =?us-ascii?Q?2rWzxfSRkvDgj4YnaMeiNtdLWze9WiKYHMj738IJIw5paVYMYRxcgApzso2m?= =?us-ascii?Q?XorNrLBcAmI/dkFX5uxGXHFo/09mId9fQDut3Y90JuX/Y83i6KPqAZ+r0ouj?= =?us-ascii?Q?X3dxJB+FVG2Yb4Z4Tf4X3OAnJMrN4DEGDmnt0GqYrPzilpyVTSoV62fXrhai?= =?us-ascii?Q?WlnZ5Tb93rvYkB0QhhuatB8k9dzEksIifq8aJxlfrt/08nqujR3ozItzSZXT?= =?us-ascii?Q?C4BbeKfZvrTHoSmRfSLwAOp0tam26uU0Qb8Bo2kaxxGqFXQsoUWpNIknbfNU?= =?us-ascii?Q?UqLxaHs3TZDvOtHUmLamSSwJ+9An0ksULtCryUpZH1L95+tsVxyw/WuCoNSi?= =?us-ascii?Q?GfGFac1/9/nOAlNL5kQucjfpurDhg3Vtt6EAUK5ZfseGgF+CNe2w/G39t+LM?= =?us-ascii?Q?GpoMBU+y3T3WvAZ9PknIf0jsSH7Jr3CxTSWIycXZdHP72lMzr2wB+UmylQuO?= =?us-ascii?Q?A0IPSdjFup5JQ//qGNFkKiYKcLthyQIC2R97cJKKZPs5AURwkjPdqsvixKwv?= =?us-ascii?Q?xP//LT5V+uJ8WcilDVOh9298fzfhqYISrEEAAEBV8MkHiaN9avmfk9cdUQUi?= =?us-ascii?Q?PrldAayZVAXA0UdV0/U0w9o3ZHEP4V2yq+1xbyOwXHlMfnWehfHtoQZhxmTQ?= =?us-ascii?Q?tS9OKTMU5M10+EvPv7eXALYsfL5WqNWeQHof4DG9w?= X-Microsoft-Exchange-Diagnostics: 1;SN1PR0301MB1630;6:hTO9IU4tkrPlQ/9xV+Qj3/pZlIzxoH+nOoEYw9qmjDaMMqg9X3EdGowO/uaz0wYWDv20NdFfzmmWEca1zo/4MdtL1gYkf2K4yqGBfb4zWYyA9MJfVim/dskkkw7PVozyJsckInNo5zBfHFhhEGNmhxnFyRmHeHkvAdbP+pqKE7BdqbpgjZvRJCaXGUyAFxeYZr3h52KiHeUqA0OrO1Ezb32gn46AAyXbxLrs7HutcK3vaMXj8SL/AOFdmRWtE3EwYRkMQlo8lsrcujSCOzuEWgCP6be1aDLawNUIJ7D9wyAiJ7Mbt26BHsV0NKNS63ST;5:ZObhNHbnZZr9u+vaTTmiQ9JxzSWXykr8XQ5cm//8G5jU1ouXJZd2AG+0kqDsEtFnCgtI9B9t7BtSMQJ3ugKQna8Uh5GfpPuLwTu5/zm25ET3rRnc2oL972qD/IBeVOGBqy5IBc7CJ0QnoNZa978xJ2Bc+XU4x3ds364Bo8vtN93oGjIkfDdQnMYPZ1rW5R2p;24:LJZtv9bNbrVvKdionNEc644F1voPeR6d9D7odvK8NitsEHw4qCEdUJJPBzdVNRGoOj2qZjzop14P/UWJUN6xZ90GMT6DUiYALoouKibnx8o= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;SN1PR0301MB1630;7:XRR+vrpDQ4im+IbUjQr3Cxm5lCOFXrgxQt6Oa86n4c8n7wueNL4gwhRlR6f6FAozYAmGbU7FhR35z5dR2BeO7F+tFT7cvCltG2Sp2D7aEADpfpDKASXlkskDzyhFpzaKXGF6S1rwVKHaRS+3bmjZCBZvMrlUmczqwK4LcMHjJOC4ybfHk6Qm9xwTcXIEUKfiVgTUscXpIAjmS80X0JXIzQXkUxbnUCtQUx+GFzqA/qXqRCHhxKJAV+0zSDfanSrBNLEIB62KePpgIdDqxiH3WlmMSsli2QimNLkRs0Y6movCTCAtg0MYGDNw+xQs4gG9M4Hoc3jxV4EgR3KbN4gn6gHPD0ZyZ5p+y+Ygh0tx2HU= X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Nov 2016 20:17:55.6406 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e;Ip=[192.88.158.2];Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR0301MB1630 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Export Frame Queue and Buffer Pool IDs through sysfs. Signed-off-by: Madalin Bucur --- drivers/net/ethernet/freescale/dpaa/Makefile | 2 +- drivers/net/ethernet/freescale/dpaa/dpaa_eth.c | 4 + drivers/net/ethernet/freescale/dpaa/dpaa_eth.h | 4 + .../net/ethernet/freescale/dpaa/dpaa_eth_sysfs.c | 165 +++++++++++++++++++++ 4 files changed, 174 insertions(+), 1 deletion(-) create mode 100644 drivers/net/ethernet/freescale/dpaa/dpaa_eth_sysfs.c diff --git a/drivers/net/ethernet/freescale/dpaa/Makefile b/drivers/net/ethernet/freescale/dpaa/Makefile index 43a4cfd..bfb03d4 100644 --- a/drivers/net/ethernet/freescale/dpaa/Makefile +++ b/drivers/net/ethernet/freescale/dpaa/Makefile @@ -8,4 +8,4 @@ ccflags-y += -I$(FMAN) obj-$(CONFIG_FSL_DPAA_ETH) += fsl_dpa.o -fsl_dpa-objs += dpaa_eth.o dpaa_ethtool.o +fsl_dpa-objs += dpaa_eth.o dpaa_ethtool.o dpaa_eth_sysfs.o diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c index 3deb240..045b23b 100644 --- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c @@ -2692,6 +2692,8 @@ static int dpaa_eth_probe(struct platform_device *pdev) if (err < 0) goto netdev_init_failed; + dpaa_eth_sysfs_init(&net_dev->dev); + netif_info(priv, probe, net_dev, "Probed interface %s\n", net_dev->name); @@ -2737,6 +2739,8 @@ static int dpaa_remove(struct platform_device *pdev) priv = netdev_priv(net_dev); + dpaa_eth_sysfs_remove(dev); + dev_set_drvdata(dev, NULL); unregister_netdev(net_dev); diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.h b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.h index 711fb06..44323e2 100644 --- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.h +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.h @@ -177,4 +177,8 @@ struct dpaa_priv { /* from dpaa_ethtool.c */ extern const struct ethtool_ops dpaa_ethtool_ops; + +/* from dpaa_eth_sysfs.c */ +void dpaa_eth_sysfs_remove(struct device *dev); +void dpaa_eth_sysfs_init(struct device *dev); #endif /* __DPAA_H */ diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth_sysfs.c b/drivers/net/ethernet/freescale/dpaa/dpaa_eth_sysfs.c new file mode 100644 index 0000000..93f0251 --- /dev/null +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth_sysfs.c @@ -0,0 +1,165 @@ +/* Copyright 2008-2016 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_eth.h" +#include "mac.h" + +static ssize_t dpaa_eth_show_addr(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dpaa_priv *priv = netdev_priv(to_net_dev(dev)); + struct mac_device *mac_dev = priv->mac_dev; + + if (mac_dev) + return sprintf(buf, "%llx", + (unsigned long long)mac_dev->res->start); + else + return sprintf(buf, "none"); +} + +static ssize_t dpaa_eth_show_fqids(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dpaa_priv *priv = netdev_priv(to_net_dev(dev)); + ssize_t bytes = 0; + int i = 0; + char *str; + struct dpaa_fq *fq; + struct dpaa_fq *tmp; + struct dpaa_fq *prev = NULL; + u32 first_fqid = 0; + u32 last_fqid = 0; + char *prevstr = NULL; + + list_for_each_entry_safe(fq, tmp, &priv->dpaa_fq_list, list) { + switch (fq->fq_type) { + case FQ_TYPE_RX_DEFAULT: + str = "Rx default"; + break; + case FQ_TYPE_RX_ERROR: + str = "Rx error"; + break; + case FQ_TYPE_TX_CONFIRM: + str = "Tx default confirmation"; + break; + case FQ_TYPE_TX_CONF_MQ: + str = "Tx confirmation (mq)"; + break; + case FQ_TYPE_TX_ERROR: + str = "Tx error"; + break; + case FQ_TYPE_TX: + str = "Tx"; + break; + default: + str = "Unknown"; + } + + if (prev && (abs(fq->fqid - prev->fqid) != 1 || + str != prevstr)) { + if (last_fqid == first_fqid) + bytes += sprintf(buf + bytes, + "%s: %d\n", prevstr, prev->fqid); + else + bytes += sprintf(buf + bytes, + "%s: %d - %d\n", prevstr, + first_fqid, last_fqid); + } + + if (prev && abs(fq->fqid - prev->fqid) == 1 && + str == prevstr) { + last_fqid = fq->fqid; + } else { + first_fqid = fq->fqid; + last_fqid = fq->fqid; + } + + prev = fq; + prevstr = str; + i++; + } + + if (prev) { + if (last_fqid == first_fqid) + bytes += sprintf(buf + bytes, "%s: %d\n", prevstr, + prev->fqid); + else + bytes += sprintf(buf + bytes, "%s: %d - %d\n", prevstr, + first_fqid, last_fqid); + } + + return bytes; +} + +static ssize_t dpaa_eth_show_bpids(struct device *dev, + struct device_attribute *attr, char *buf) +{ + ssize_t bytes = 0; + struct dpaa_priv *priv = netdev_priv(to_net_dev(dev)); + int i = 0; + + for (i = 0; i < DPAA_BPS_NUM; i++) + bytes += snprintf(buf + bytes, PAGE_SIZE - bytes, "%u\n", + priv->dpaa_bps[i]->bpid); + + return bytes; +} + +static struct device_attribute dpaa_eth_attrs[] = { + __ATTR(device_addr, S_IRUGO, dpaa_eth_show_addr, NULL), + __ATTR(fqids, S_IRUGO, dpaa_eth_show_fqids, NULL), + __ATTR(bpids, S_IRUGO, dpaa_eth_show_bpids, NULL), +}; + +void dpaa_eth_sysfs_init(struct device *dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(dpaa_eth_attrs); i++) + if (device_create_file(dev, &dpaa_eth_attrs[i])) { + dev_err(dev, "Error creating sysfs file\n"); + while (i > 0) + device_remove_file(dev, &dpaa_eth_attrs[--i]); + return; + } +} + +void dpaa_eth_sysfs_remove(struct device *dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(dpaa_eth_attrs); i++) + device_remove_file(dev, &dpaa_eth_attrs[i]); +} -- 2.1.0