From patchwork Thu Sep 24 15:00:18 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Madalin Bucur X-Patchwork-Id: 522389 X-Patchwork-Delegate: scottwood@freescale.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [103.22.144.68]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 5B7BC1401F6 for ; Fri, 25 Sep 2015 01:24:58 +1000 (AEST) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3A7A21A2CB4 for ; Fri, 25 Sep 2015 01:24:58 +1000 (AEST) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Received: from na01-by2-obe.outbound.protection.outlook.com (mail-by2on0131.outbound.protection.outlook.com [207.46.100.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id D9F5E1A0B20 for ; Fri, 25 Sep 2015 01:17:59 +1000 (AEST) Received: from BLUPR03CA011.namprd03.prod.outlook.com (10.255.124.28) by BLUPR03MB1476.namprd03.prod.outlook.com (10.163.81.18) with Microsoft SMTP Server (TLS) id 15.1.274.16; Thu, 24 Sep 2015 15:02:52 +0000 Received: from BN1BFFO11OLC004.protection.gbl (10.255.124.4) by BLUPR03CA011.outlook.office365.com (10.255.124.28) with Microsoft SMTP Server (TLS) id 15.1.274.16 via Frontend Transport; Thu, 24 Sep 2015 15:02:52 +0000 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; freescale.mail.onmicrosoft.com; dmarc=none action=none header.from=freescale.com; Received-SPF: Fail (protection.outlook.com: domain of freescale.com does not designate 192.88.158.2 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.158.2; helo=az84smr01.freescale.net; Received: from az84smr01.freescale.net (192.88.158.2) by BN1BFFO11OLC004.mail.protection.outlook.com (10.58.145.15) with Microsoft SMTP Server (TLS) id 15.1.274.4 via Frontend Transport; Thu, 24 Sep 2015 15:02:52 +0000 Received: from fsr-fed1764-003.ea.freescale.net (fsr-fed1764-003.ea.freescale.net [10.171.73.45]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id t8OF2Fkr018660; Thu, 24 Sep 2015 08:02:48 -0700 From: Madalin Bucur To: Subject: [v3 7/8] dpaa_eth: add sysfs exports Date: Thu, 24 Sep 2015 18:00:18 +0300 Message-ID: <1443106819-5549-8-git-send-email-madalin.bucur@freescale.com> X-Mailer: git-send-email 1.8.2.3 In-Reply-To: <1443106819-5549-1-git-send-email-madalin.bucur@freescale.com> References: <1443106819-5549-1-git-send-email-madalin.bucur@freescale.com> X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1; BN1BFFO11OLC004; 1:uD96FYT2+nOMq1tFks0kjqQPS+vOPd4A/VBhP+aMTsyNfX40ZsGukWQ/i0W0NdzDYJrTOpfgjlTLLPgM3P3VCWhrQpb4Fp1ewFb9OZ3TiNoRUzzjXx703a41b1NkOt5RZo6rAusLXxNHlwAzjxMbGGWfutuks0Ws40dAHJl8QxfNB9iRKQ3D3nOFS9PcXUFx8PN+PVkSAcf4hzPTf2U87Nqb6Qa2OhhVSByCHUfVEM+56lRXarzQ3WGcmt9I1CLy1IjYDOtym5i8patSbhmeKkpaCgFsRL0rUQ7kAzpbGTDyOruJNojgLjRyZMzcCh5/RAK5VM5dxfOp50KLxAStM19CXVsNBW9Jr4or2hu/2lwL2Rp5HbCOUsIOPtZGWWkiYiw6QGN56h2fZSJa3rU9Jw== X-Forefront-Antispam-Report: CIP:192.88.158.2; CTRY:US; IPV:NLI; EFV:NLI; SFV:NSPM; SFS:(10019020)(6009001)(2980300002)(1109001)(1110001)(339900001)(189002)(199003)(19580395003)(19580405001)(77156002)(69596002)(229853001)(87936001)(47776003)(4001540100001)(85426001)(2351001)(104016004)(81156007)(62966003)(5003940100001)(50226001)(36756003)(5001960100002)(110136002)(107886002)(189998001)(575784001)(86362001)(106466001)(77096005)(68736005)(50466002)(46102003)(53806999)(11100500001)(33646002)(76176999)(2950100001)(64706001)(5007970100001)(43066003)(48376002)(5001830100001)(5001860100001)(50986999)(97736004)(6806005)(105606002)(2004002)(4001430100001); DIR:OUT; SFP:1102; SCL:1; SRVR:BLUPR03MB1476; H:az84smr01.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; MIME-Version: 1.0 X-Microsoft-Exchange-Diagnostics: 1; BLUPR03MB1476; 2:pZByDTnuYgjlnnGG1hmHehureFv5E1EfFnNBWPZkwDEQdHgu5Helu4+Rnr6Snn/YhgaBLzICqpHcGWrJ1xwQlCoArLzkQv72o2n1iMETSEyBO2GSsDPsUjIfbT/5zXFsWlKtA7irmLOOF33x1ugIU5YPDMFLgBHZrOUgKC3gyYc=; 3:cNyzpaRHltcl+HT38eTLP2ster7GdBKGA7pnbP3VZbUHggFWTQNbZ7nvRAfxgfFWDAMxeFWlt5PpZloeTGT2mgT5muegddb/pEUyIQGT025eX9DELXZNZS/2qmNhQpyhp1ItJB0liABynkAWA1pW4g+1k+CyI0Po2m6ayoxXQK304osRncZxs6ByTlPccL2tJdBR1KRaG+JLiIgc/LNHqhsZtlb5zU+23zQpViNiY9w=; 25:L83DJZX7c0JZgKv8Gi8D1x8wu5dV1wGFpD91G1EssYpEjifmhSkCD6VvwHBSgyEifHAcCTypoz9LVj9LzrbOlnxFGqSNPwXIkhl3pVSle3gaCQayEJzvJsh0mApEswU/ORJVYZjytHjntQpaQtHjF3cDHWkPv+UAH3TI5gawKHW1VwOywkbv2rrYEuaWjTTirgnZKJa7YeqOwEKvHFw9P1yLZCMIPRQJp+tYCqJ2GV6qCBkkZhnDb6kOlM0T9q/UA8n/m2rBzkwVdSXZ/Y6lFg== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BLUPR03MB1476; X-Microsoft-Exchange-Diagnostics: 1; BLUPR03MB1476; 20:YoaClFw5n6rvk5JFJmpBnz+HV5Ds4gypWc2qVuCZeNWi8YXRHCG1VLERXEpIDa0HjR8e6GLcAT4wVZy8KEQlw714AxH4uURizpBTjg6Smbldl3vgqRIwUk4FFkqbW0SxO9yMSey2+zLDNoVrNmlN+Fm4SS21TI253n39oL7tBzXvccl9OjnPY3pR0MPLKTwE2utdWbrh5PPRLpQRoWzIVR9IJ4q1ew03TvSGn+CqZVD4auZPnqRKv3aca5SnqiN5cYoQmN2dPr7O0UxRvGJ6Sx5uv2dvBWGiFI/Q7+1IwLfY/yZdKlHXp/Lytr/gfqPpm5neOxgLGr81mZTsHDcnJIyeFDatY2bVaAYEobrN6pE=; 4:1EzFChcSonDOFw2uNE9T7rLZdGNhVuGnm6EN14qsyiglkhkwla30LxDMJPvA1Grd4O2tcl3qhVfdKLlQg8vpVZ5LrdU3XMJlhram6NCrgFRUADqvzyI0fFLlP61l7LYvrbrnUxwxnw1ZECnsFzj5lG41MfapeOjsJaX+nfIN1jcyBc0YCM+pa0iqEbSJRk3vIu0lvDXTApVdHWh/vhg7s3wa7pbVfCR7iNwBaLmyWC7ApQkqNavxtMjlTR1xnCagip6tdRLS416QzAopFxVlC/4lgRqyCkUj9azcT642g65dQPACVBvMpuyHHLfHQAG4e3iW95IddubRN7DC0E/6DaQsRWlxVhDXIGIQku6SwaA= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(8121501046)(5005006)(520078)(3002001); SRVR:BLUPR03MB1476; BCL:0; PCL:0; RULEID:; SRVR:BLUPR03MB1476; X-Forefront-PRVS: 070912876F X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BLUPR03MB1476; 23:SO0RGtHHr/TX0tVPV8ZoQu3CykPQ9yL/KFqILtQYb?= =?us-ascii?Q?qB8fRgxmr9jo2erot2gNTBnVz46WeFCxTHbInpghlODWfmfBMo0He5CMlfAu?= =?us-ascii?Q?Mwc7fwPwyjssZQJeI/PqZkAIw+qHVMvgjN9wSdeMGJ/tFvK4pjIg0hoptg49?= =?us-ascii?Q?bOHy7v59gXyA/5qfotAADjD033gio49ZvfNzdpSRYTu/oTjs6fGjl7/8qWXw?= =?us-ascii?Q?CgvJhdI+DlztrRF6scCcYyKxOhnX72lcLvfyhIpmR/E9sFDmVnHYWiyYuOkn?= =?us-ascii?Q?30qVC9bLGAgQAQjyqSIv9tdZ1UcMAkPR7c7mKpqLZBxSl5JZLuReY4NEJl33?= =?us-ascii?Q?0+aiT6WIX1yaur9j/HLsBN+81LGdTTpf3iM7xdg5MtBsuFs7GyqWDvVTrruu?= =?us-ascii?Q?1E/BFSmp3gPO3O+1tCM9Aeh5IoMZFBTnOfXvUwj2dZEs6AvhwltKQeAx32QG?= =?us-ascii?Q?kWn6qqdpu3xDedMNhVZTh7VR6pJrAv1U6Ww/UZpjS2n+70ArEP+NjslESnKf?= =?us-ascii?Q?+ZVa/1Z5YaG4YkowUCpUTWxSNxjFU3sWLgjSe49R+rfGScJTjkJ0hLL4Nkw+?= =?us-ascii?Q?YmGmOzKSgu4tuLaaccO5fvXDhFXLEapbgrUPBLl7rvQ8op1jaNs6HmjhFULQ?= =?us-ascii?Q?0iKE7rsdJmLVw24J3L91ozs4IRCfAkrLdabNphacFjLDOzf3bPu0ZyOO2zEH?= =?us-ascii?Q?Sg3sf0FEYflg3WyooPM95q03Trt+ptoCqmjQrXbTJQxXq2iZH6LgCIQrl1BX?= =?us-ascii?Q?873LpQYlcQ1Den7Y6gYNxC/6xRz1K31YVonsdEPyLxnYvJEZX2Tzg3qsUkxe?= =?us-ascii?Q?CNn2KpBaWKHZJbhxvVO+PH0ua9ffiuhjjoEq4CJ3A85U+YDt2FJGlif4cAOz?= =?us-ascii?Q?UWjE3bUElX9CCepxYsTbXXmHs7ROOb/zCmXGuIdaY4EuR1uZyfY+eHAFjkvl?= =?us-ascii?Q?XvBZskHuFTsVX0th+ViVxdcD88oeHdKUjqaOGhZmyzHKzzJngoP+TM9eZm13?= =?us-ascii?Q?NnusJv8JuNSpK9txil/chjxX1TGiWOQVPBtRuhlZ0jKClP1QC36WS5oluuhj?= =?us-ascii?Q?uCcAEWL8yOoSE6hRJvEgSfU+3H3VCsQTG5RGGvE4rrWuguVpIZpyWEaUr4zW?= =?us-ascii?Q?FSh1pUpZHc2zwr3RosPWrRk3H25XxPhXnXuc8aNny9nA8BKYb6BlTpkoiAgj?= =?us-ascii?Q?BN/eZ4JEgv2yPeG8kUFyiycfX1XTdjsE8zZNerJfwcfqHYqxia2jYVmBOO/J?= =?us-ascii?Q?VHLyWljLeK2cN6KS06kIQHEFJNRjFIXyWyENm1SMZq9+7bjuvUD9N/t1Hd4R?= =?us-ascii?Q?yL+xeWmsxmmdCw6KzNmgnFneIYcifuUFm+4Ox3QfKApbSTWwSSCSAcOPHgWR?= =?us-ascii?Q?DUO4g=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; BLUPR03MB1476; 5:WeQGmPQyasDzRFOtrOoanXRTtNSkyAv5gD82T3FUO6NhVD7/SGE5m8seM3qiMD2AaSifKORkUYtr077kDXQD6Wj1dSIMWnxN4H0Ry3l6JbvOZ8uOus05oEScYOzn9q88P71hUCHmv+aPHSkwgpBO2w==; 24:O4qjsEVGZGq3u2iV+wq5GYOzIO012bJ0pqx9HKM6PQNcEkxG373lji56cnFsY2/4N2SmqAbPPhzga5p4qBuwizitDfZ3xmrpgG9i1QP+bfM=; 20:sCYnl50c6NgPDs7MOrY6ij2TxsfBesRgJbqFiQYFwQZrv9/LlVRpUAz75mK0DYKQfOP2K3V9gd8SHQfo5pDeQg== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Sep 2015 15:02:52.3775 (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: BLUPR03MB1476 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: madalin.bucur@freescale.com Cc: pebolle@tiscali.nl, f.fainelli@gmail.com, roy.pledge@freescale.com, linux-kernel@vger.kernel.org, ppc@mindchasers.com, stsp@list.ru, igal.liberman@freescale.com, scottwood@freescale.com, joe@perches.com, linuxppc-dev@lists.ozlabs.org, davem@davemloft.net, Madalin Bucur Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" 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 | 2 + drivers/net/ethernet/freescale/dpaa/dpaa_eth.h | 3 + .../net/ethernet/freescale/dpaa/dpaa_eth_common.c | 2 + .../net/ethernet/freescale/dpaa/dpaa_eth_sysfs.c | 167 +++++++++++++++++++++ 5 files changed, 175 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 9b75d52..141ade4 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_eth_sg.o dpaa_eth_common.o dpaa_ethtool.o +fsl_dpa-objs += dpaa_eth.o dpaa_eth_sg.o dpaa_eth_common.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 d0d3d80..6d241a3 100644 --- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c @@ -759,6 +759,8 @@ dpaa_eth_priv_probe(struct platform_device *pdev) if (err < 0) goto netdev_init_failed; + dpaa_eth_sysfs_init(&net_dev->dev); + pr_info("Probed interface %s\n", net_dev->name); return 0; diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.h b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.h index 629ccb8..a16119e 100644 --- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.h +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.h @@ -370,6 +370,9 @@ static inline u16 dpa_get_headroom(struct dpa_buffer_layout_s *bl) return bl->data_align ? ALIGN(headroom, bl->data_align) : headroom; } +void dpaa_eth_sysfs_remove(struct device *dev); +void dpaa_eth_sysfs_init(struct device *dev); + void dpa_private_napi_del(struct net_device *net_dev); static inline void clear_fd(struct qm_fd *fd) diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth_common.c b/drivers/net/ethernet/freescale/dpaa/dpaa_eth_common.c index 4947cb9..2cf4565 100644 --- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth_common.c +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth_common.c @@ -299,6 +299,8 @@ int dpa_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_sysfs.c b/drivers/net/ethernet/freescale/dpaa/dpaa_eth_sysfs.c new file mode 100644 index 0000000..a6c71b1 --- /dev/null +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth_sysfs.c @@ -0,0 +1,167 @@ +/* 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 +#include "dpaa_eth.h" +#include "mac.h" + +static ssize_t dpaa_eth_show_addr(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dpa_priv_s *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 dpa_priv_s *priv = netdev_priv(to_net_dev(dev)); + ssize_t bytes = 0; + int i = 0; + char *str; + struct dpa_fq *fq; + struct dpa_fq *tmp; + struct dpa_fq *prev = NULL; + u32 first_fqid = 0; + u32 last_fqid = 0; + char *prevstr = NULL; + + list_for_each_entry_safe(fq, tmp, &priv->dpa_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 dpa_priv_s *priv = netdev_priv(to_net_dev(dev)); + struct dpa_bp *dpa_bp = priv->dpa_bp; + int i = 0; + + for (i = 0; i < priv->bp_count; i++) + bytes += snprintf(buf + bytes, PAGE_SIZE - bytes, "%u\n", + dpa_bp[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]); +}