From patchwork Tue Nov 15 08:41:03 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Madalin Bucur X-Patchwork-Id: 694883 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3tJ1Dz6vddz9t1h for ; Tue, 15 Nov 2016 19:45:39 +1100 (AEDT) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3tJ1Dz5xbpzDvM9 for ; Tue, 15 Nov 2016 19:45:39 +1100 (AEDT) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Received: from NAM02-CY1-obe.outbound.protection.outlook.com (mail-cys01nam02on0082.outbound.protection.outlook.com [104.47.37.82]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3tJ1894GqQzDvkG for ; Tue, 15 Nov 2016 19:41:29 +1100 (AEDT) Received: from DM2PR03CA0049.namprd03.prod.outlook.com (10.141.96.48) by DM5PR03MB2476.namprd03.prod.outlook.com (10.168.233.22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.721.10; Tue, 15 Nov 2016 08:41:25 +0000 Received: from BN1BFFO11FD006.protection.gbl (2a01:111:f400:7c10::1:121) by DM2PR03CA0049.outlook.office365.com (2a01:111:e400:2428::48) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.721.10 via Frontend Transport; Tue, 15 Nov 2016 08:41:25 +0000 Authentication-Results: spf=fail (sender IP is 192.88.158.2) smtp.mailfrom=nxp.com; infinera.com; dkim=none (message not signed) header.d=none; infinera.com; dmarc=fail action=none header.from=nxp.com; Received-SPF: Fail (protection.outlook.com: domain of nxp.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 BN1BFFO11FD006.mail.protection.outlook.com (10.58.144.69) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.721.5 via Frontend Transport; Tue, 15 Nov 2016 08:41:24 +0000 X-IncomingTopHeaderMarker: OriginalChecksum:; UpperCasedChecksum:; SizeAsReceived:880; Count:11 Received: from fsr-fed2164-101.ea.freescale.net (fsr-fed2164-101.ea.freescale.net [10.171.73.197]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id uAF8fA9R021609; Tue, 15 Nov 2016 01:41:21 -0700 From: Madalin Bucur To: Subject: [PATCH net-next v8 3/9] dpaa_eth: add ethtool functionality Date: Tue, 15 Nov 2016 10:41:03 +0200 Message-ID: <1479199269-9748-4-git-send-email-madalin.bucur@nxp.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1479199269-9748-1-git-send-email-madalin.bucur@nxp.com> References: <1479199269-9748-1-git-send-email-madalin.bucur@nxp.com> X-IncomingHeaderCount: 11 X-EOPAttributedMessage: 0 X-Matching-Connectors: 131236728849379377; (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)(1109001)(1110001)(336004)(339900001)(189002)(199003)(69596002)(48376002)(106466001)(626004)(2351001)(105606002)(77096005)(5660300001)(7846002)(86362001)(36756003)(356003)(104016004)(6666003)(110136003)(47776003)(305945005)(6916009)(2950100002)(43066003)(8676002)(2906002)(189998001)(85426001)(4326007)(87936001)(97736004)(50226002)(81156014)(81166006)(3450700001)(53806999)(68736007)(8936002)(5003940100001)(50986999)(76176999)(33646002)(50466002)(2004002)(309714004); DIR:OUT; SFP:1101; SCL:1; SRVR:DM5PR03MB2476; H:az84smr01.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BN1BFFO11FD006; 1:qtjYzaldt28dt/TrA+35yK2LprxykYF1uEaJK6jhm1XNkqESk5xsspFSkbNz+TEypYNErHdBbQtbWqMZUlsGGmghuq7p4rL+2NY0yAVRpVjbCS1YKVLHWrgyN74jnpFMHUBPWcm2Le56cuyBMG6g/a8iavYtRyJ0jACzH2m4WIL1p5sJCZWAHH+wsIrp0/2oTB1h7UK7eEweMzmSjyNubCaUbJXsxggVlNePIcJ6e8YsbmRzdu1voXCDFs8/8bwU02Sd5wNoGa0fTVD5cw/wPbWT10GEo4rFPFhg4j7T/h3MIsimN2xvfS5LegGJX/eUcFpHHR/OQCyBj0cCNAZ2UihjYwiwImVA0cJvAfHyi+BkBulNwCRewqdTgPqB2ttiyMt2MBDhmfYwrGTRBAWtHNa5/qq2EPCVHZLk6n1mVH32UW0Npxd4t6z7zpiBWoGMTUPgM2fn1fHJARD9ofzRPbena6Mu6N6KPc+b7ruO7RBUNNakNJA13lj09WkQsQrc/gAQnYy30KFL22TXhbgiEUbfqpC1qOYosFSaXHWzl+VUtKVekBt5COfDpZ3ogBuakQZAn+calLte4GKbxTFBQO89BuDoOOgJtb5PkRes4tjccPixUWaYY5/poNdlmnmY MIME-Version: 1.0 X-Microsoft-Exchange-Diagnostics: 1; DM5PR03MB2476; 2:nnTo6n9nrondMvnZBzUJwEsGWaF+XFYq9CeKo6RGa3ldo27rK++iievkhqK85Z2HWfNI63WV7YOdliaXlYRXf1xFafqfRVCMGdRRKeqYnV6+dwiPArls+de6OHzE/v2pr8VmHmq9LkxbIpMTrNdSQ64tOF/SxIjTT47uDIcZlz4=; 3:xTt9Zg3I+HDDJkmInorKSjUZZ0xh9TuJcs66j1b1nRyOIgfBzm+uaRuumCM1tp8531Q7ezr9iQ+mNywukHfeF1m6LASZ3Wvh333mxPoymnyS/5NaTjKzR/1FJ2x/efvDXShbzcx28cAiGNAmBgFSZJBI7os774RP7HvlrdY8bIy1+GHgs4jw1lm5ClZNM53UvF/5FC+3JrMeeK5lrfErt2HnMNr4yud+9UZEu2r7WBBWVxtA0LBVjCqOsCSYRWzNacH83xpgdDAMM6Nx0Hgt/Q==; 25:Jeb0rTJ1WT9LjY8G4JiMPtZOwZ2Y3ia+zjp9y3A93JNk/bAG8I+Q2UuO5xAuUkQQRwYG5vSkYqLfdFtnbQPx8KXN6+MlAyfQ4xLMx0f8kUk2Kjbs9Mf2eK9lG1MvwAhNp3D4W2KV2M+Jkr0s7CUcBSmoK6M/yVbKPoURMmJ3viHVBBxkQCkrzSq8dPEcK2x0lNB/6ns8OqiKGaJBjbJy5si0GmrWMOHWWal+SHokqSYkUF495XZrP1j2gC7yqQp+kgZTVA5fdxAl/Cui7szj70K+yAxTjsO1ojpuw7SKi4FxVyTegyi6KvEDiay9vSSUNXkRLoUlvLtNJKlvJ+4brY3r2nGjdqr3WasUeX/3cs3NeIez9HY18x+W7ZBDZRvnTkSesA0AyO7nqAznbp98d8mMvT6fk22X57T+NbpnFDtKghgUb7pnhoziRlboofx7pBJiuWxVxbtjOOPVQdSoEA== X-MS-Office365-Filtering-Correlation-Id: c3fad90c-1886-4cef-2539-08d40d332ef1 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001); SRVR:DM5PR03MB2476; X-Microsoft-Exchange-Diagnostics: 1; DM5PR03MB2476; 31:BKEGx6OUOb72lYi5YXD7o+4RyZFG8zpA45B2jsO0ZUz2A0AEV2FEfDuMEGDPJsLMJwa/UTFuX5iyTXbjgYOrssZe1kIz8+XHNRLxQ16NtUkuPelNI+njPLgNdn3T6iOka3Fxv5rC2Hp+Iu2aRRb+r3lecUTjVjoKFyqlwVnNf1vbIP6FVQ4zp0Is2FBAKCNKNFuxkRqYn1zciJ24+K2MZ36L140jDjkRPSua3KzNlT9Jn1juX06s7ETtFe2oBEhTIfDuJ6ihAzYn9D86ZmKJnQ==; 4:b86+3Xbs5OIMHmb4Ddo6UsP2c3al8iK+WhN1+awEMovhwImCL+SJkW3NTGIMn6yuLH8szDJoH4zDa8SYnFCsRfekMwhAFvG9L4u0mpQc9AVRtABQDxCqcFgaQ4xdY1eZifUSDul8bSQRyTgYCvv8tPsWaHWSFjYR01mBqTKWckLgggt3CgAjW8wGzqRi1/SbDrMYCmhNU+NEydM7tCOro8wnb0AkW+VStGJ4Bg1/Z0ulwU0lKnyrfh/dmRxXELzFYQjvrritAuAT756PyHZ+i02BPOuF/bLvddBvwa0T/N1tn6krmhvRuSeVLSscvRzF182fmJBG1fsw7uRKLegF288tLmcAiFwHI+WrAFzyuVSPR8v/BjfPJXgiYAwp8Sr76/U+MY5UduQlqaaMJb6/bVDERA3Tx685UM0DQ3aL7xVwDtUS87Q/rtWn7YBkBakoi7rT9YInTjRYoTeptxxwOZrl0koov8Bkz8+RstLMjbtSnGpIs36gSaPUfjZGG0jqh8gz+Wlry7n971CZiUybz471ewdQtWgrQcKFgYWg+GEtIup0R0xDruPrCuY0avzHx6qp5OvPA05E1oOeNtSIxQ== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6095035)(601004)(2401047)(13023025)(8121501046)(13024025)(13017025)(13018025)(13015025)(5005006)(3002001)(10201501046)(6055026)(6096035); SRVR:DM5PR03MB2476; BCL:0; PCL:0; RULEID:(400006); SRVR:DM5PR03MB2476; X-Forefront-PRVS: 012792EC17 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DM5PR03MB2476; 23:8uG3+dskUqU51Y4jEwI5AwLlpT2xoelu3C8dZBEL1?= =?us-ascii?Q?hQP0l1JgDT1OeJfmKhUlzKQsCrMcEf6Ua5H3/ct9BngwWbk3GQdUgsmzxQrL?= =?us-ascii?Q?fI80gwJvixmpmjQF8LlO72xjHlemnPRL+6wAf+CKjmuNFn+Qg0UwwI/Of+yk?= =?us-ascii?Q?NbG2nfioMPtmYTsFr0lZNjcuJ+VcPnRcnLOrqHXl95LZN7kOdHjbuzn8Ek4Q?= =?us-ascii?Q?jrqzVXMU3PjNeym0jv0vpBXgPv12x7VrJk+O47xdf7A2qQsgxAFMdcBebef9?= =?us-ascii?Q?rbqFJLS+1j18QYuhzz8LWutD78J2kruswf2baAsuSMluKYIjhbcsSfD7jfq2?= =?us-ascii?Q?47CsmiN8jkvXtCCX1jeuiFvc5j/0LK+JzLk1Ez6fAYvSM9MRI/m7W1KuDBE8?= =?us-ascii?Q?DoHu/WFjbKgtazPmmhLuqK656NgUJ/YwDFvwe/kQ6tXwgVAHUYNebke44uMm?= =?us-ascii?Q?CE+LAThuKSShtTdSgKwmVXfBaIhQPBMfS0XactxM9Y1ST67uHfRDrta5EiQp?= =?us-ascii?Q?1rY+IwdeteaJeo9L1xeaTVWXr4arrmOdU4MaXu6Q7Vhl+s4oVcjtF4qMSw6G?= =?us-ascii?Q?SGwtlsaXc7L2ksocLCtoUNbdxyj89fghcnT3PauHSgyW0D8tIBA1v1wsC3JB?= =?us-ascii?Q?RVCXsi0TiCtJQi6JRHMca1Oh3sniiOuNyE5rZGC8etD5B9hsRHICu8m5H/NN?= =?us-ascii?Q?H1lY5lIo9sFMBb1kZNndvWHYqaC+aVxUooOGLEzDknGVyL8ybwYB1w4ta1pC?= =?us-ascii?Q?JLIhQZ8nunVO+5yoivIJK2VdKyH6H3eNjeQfL0W1GFKGWj8UegQoU6k1mfL8?= =?us-ascii?Q?AB/g2sI3vT6xlNVslxjz+CJCbRfyYhxnpqwb3tGga8Wn7kZIYl3QBaIMwlvy?= =?us-ascii?Q?y6k9hU1I7zsfaRximGlQhdo8ugrUmPOTEPkAqh8brhZeiS7s3HRFXa1rGNgm?= =?us-ascii?Q?/wcVMmiq6bZzU17JNweuLZSTUMOnFuPrqErWoK646P9/dapZYNTfgQ8kO0GG?= =?us-ascii?Q?/I+MRQpPUtNaDV4eMjQdPT/4UzUCYeyYMLTGiP6kGSlUseMzksVoVnpPXnVX?= =?us-ascii?Q?cY11of1pQuzXPBMf2uLcFQkuNVaWUpr1Blm2WAK/lJDmC1QBaDXd2YvFXyZ3?= =?us-ascii?Q?gMa2dM3Fvaa4JwKhulJkWtx+LmDO1j/0l6KcC4yqMiQC2lqSTuDoT4DFFcIv?= =?us-ascii?Q?Mc1qwNdJ9VLzNg=3D?= X-Microsoft-Exchange-Diagnostics: 1; DM5PR03MB2476; 6:M70LkfO5ptXZP5lj4qBe4LnB7P9LSvxzkI9EtN+Pn/KKMpTcplnAPDhDXcURe6D6pUTB1nRUrZFj1F3FPFJ591Axedb3yInBHOU0aiETW1GhZzTG0YAS6FKCTIjQD2qQ8q+wxL7LqEjNvvzt1I89/2XfTNBW5umHDbgZ5poytBgKkYkXLdB8Eh/BwGUSZHp474ADHX47I4wQt3hNmPzaYxHTduxjVEzoDBI3dwbBUNvvB1G5VP5YNweTCGpAMrxP6jTHM2M0gBJZmKRvQFz1lMib0/nOwE9R0TKRLFcJzu5IBb6hV0kVSsbCEFLg17JJiLwLFxddrJpaqYu8Ikr+Lw==; 5:r1HDXlQZsnH1ZxjVRGOP7cE/hxPXMxg+AVNE1GpaecSomqahqTbF4IW1P/MWWbDhOPQ4Jp9v6nUAHMaLastbhrvXD6Y9jhbZ5hOg0FAiIwUMshXYU7NKHfBNTYuly+3mOZh83IboJouBhAL46nkrHbR3oyI4mKxIKgl9GdyyuF+GHcaJnu/SRQoJ2gJ/xkxI; 24:k719gNXr0HOJsGrslcm6XqYGHPnGCpwc0KcuLm5k/sAVFnMR6VFfLKYOKDmcdSxCi0xih7ZjImN3erDkHhrNJMsPX6XtIy0kH8fnYNLzw9Y= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; DM5PR03MB2476; 7:vP6D3d7KqCEgYE8Bs2N+MbR5ImBoeZZZFOIXxirTPaElh+cWfvqg1DOLxEWWyVNs7stb8N7A46K5bAobZZkHdpaEp58Ci8a7FCApfLchnHRS03yPb2KQ6/qrr7p4g/ip3YZl+UEQ8LeF9LuSBevQIBkhbDfO6GiHvzTODwK7HER5mC9vhc1pA7bNQ4BuqXoEfhs471PjaYWVtBnPIWcQeiN4DMl1G6X0EPwBCL9ASj27VJ/QCoIm5SvIVjBx3+47vGFkA0YRq6XOQ58YtBVgzVbHbs5JRoaAtOqqO8DY4J4gnxIXIW6G9QiGn40DUIf4l42PtcNAXnRDJ1fwZxAsnzsUKXWqLWCptjECA5Y50ao= X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Nov 2016 08:41:24.5791 (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: DM5PR03MB2476 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: madalin.bucur@nxp.com Cc: pebolle@tiscali.nl, linux-kernel@vger.kernel.org, ppc@mindchasers.com, oss@buserror.net, joe@perches.com, linuxppc-dev@lists.ozlabs.org, davem@davemloft.net Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" Add support for basic ethtool operations. 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 + drivers/net/ethernet/freescale/dpaa/dpaa_ethtool.c | 218 +++++++++++++++++++++ 4 files changed, 224 insertions(+), 1 deletion(-) create mode 100644 drivers/net/ethernet/freescale/dpaa/dpaa_ethtool.c diff --git a/drivers/net/ethernet/freescale/dpaa/Makefile b/drivers/net/ethernet/freescale/dpaa/Makefile index fc76029..43a4cfd 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 +fsl_dpa-objs += dpaa_eth.o dpaa_ethtool.o diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c index 8b9b0720f..0e7f1c7 100644 --- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c @@ -240,6 +240,8 @@ static int dpaa_netdev_init(struct net_device *net_dev, memcpy(net_dev->perm_addr, mac_addr, net_dev->addr_len); memcpy(net_dev->dev_addr, mac_addr, net_dev->addr_len); + net_dev->ethtool_ops = &dpaa_ethtool_ops; + net_dev->needed_headroom = priv->tx_headroom; net_dev->watchdog_timeo = msecs_to_jiffies(tx_timeout); diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.h b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.h index fe98e08..d6ab335 100644 --- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.h +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.h @@ -141,4 +141,7 @@ struct dpaa_priv { struct dpaa_buffer_layout buf_layout[2]; u16 rx_headroom; }; + +/* from dpaa_ethtool.c */ +extern const struct ethtool_ops dpaa_ethtool_ops; #endif /* __DPAA_H */ diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_ethtool.c b/drivers/net/ethernet/freescale/dpaa/dpaa_ethtool.c new file mode 100644 index 0000000..3580a62 --- /dev/null +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_ethtool.c @@ -0,0 +1,218 @@ +/* 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. + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include + +#include "dpaa_eth.h" +#include "mac.h" + +static int dpaa_get_settings(struct net_device *net_dev, + struct ethtool_cmd *et_cmd) +{ + int err; + + if (!net_dev->phydev) { + netdev_dbg(net_dev, "phy device not initialized\n"); + return 0; + } + + err = phy_ethtool_gset(net_dev->phydev, et_cmd); + + return err; +} + +static int dpaa_set_settings(struct net_device *net_dev, + struct ethtool_cmd *et_cmd) +{ + int err; + + if (!net_dev->phydev) { + netdev_err(net_dev, "phy device not initialized\n"); + return -ENODEV; + } + + err = phy_ethtool_sset(net_dev->phydev, et_cmd); + if (err < 0) + netdev_err(net_dev, "phy_ethtool_sset() = %d\n", err); + + return err; +} + +static void dpaa_get_drvinfo(struct net_device *net_dev, + struct ethtool_drvinfo *drvinfo) +{ + int len; + + strlcpy(drvinfo->driver, KBUILD_MODNAME, + sizeof(drvinfo->driver)); + len = snprintf(drvinfo->version, sizeof(drvinfo->version), + "%X", 0); + len = snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version), + "%X", 0); + + if (len >= sizeof(drvinfo->fw_version)) { + /* Truncated output */ + netdev_notice(net_dev, "snprintf() = %d\n", len); + } + strlcpy(drvinfo->bus_info, dev_name(net_dev->dev.parent->parent), + sizeof(drvinfo->bus_info)); +} + +static u32 dpaa_get_msglevel(struct net_device *net_dev) +{ + return ((struct dpaa_priv *)netdev_priv(net_dev))->msg_enable; +} + +static void dpaa_set_msglevel(struct net_device *net_dev, + u32 msg_enable) +{ + ((struct dpaa_priv *)netdev_priv(net_dev))->msg_enable = msg_enable; +} + +static int dpaa_nway_reset(struct net_device *net_dev) +{ + int err; + + if (!net_dev->phydev) { + netdev_err(net_dev, "phy device not initialized\n"); + return -ENODEV; + } + + err = 0; + if (net_dev->phydev->autoneg) { + err = phy_start_aneg(net_dev->phydev); + if (err < 0) + netdev_err(net_dev, "phy_start_aneg() = %d\n", + err); + } + + return err; +} + +static void dpaa_get_pauseparam(struct net_device *net_dev, + struct ethtool_pauseparam *epause) +{ + struct mac_device *mac_dev; + struct dpaa_priv *priv; + + priv = netdev_priv(net_dev); + mac_dev = priv->mac_dev; + + if (!net_dev->phydev) { + netdev_err(net_dev, "phy device not initialized\n"); + return; + } + + epause->autoneg = mac_dev->autoneg_pause; + epause->rx_pause = mac_dev->rx_pause_active; + epause->tx_pause = mac_dev->tx_pause_active; +} + +static int dpaa_set_pauseparam(struct net_device *net_dev, + struct ethtool_pauseparam *epause) +{ + struct mac_device *mac_dev; + struct phy_device *phydev; + bool rx_pause, tx_pause; + struct dpaa_priv *priv; + u32 newadv, oldadv; + int err; + + priv = netdev_priv(net_dev); + mac_dev = priv->mac_dev; + + phydev = net_dev->phydev; + if (!phydev) { + netdev_err(net_dev, "phy device not initialized\n"); + return -ENODEV; + } + + if (!(phydev->supported & SUPPORTED_Pause) || + (!(phydev->supported & SUPPORTED_Asym_Pause) && + (epause->rx_pause != epause->tx_pause))) + return -EINVAL; + + /* The MAC should know how to handle PAUSE frame autonegotiation before + * adjust_link is triggered by a forced renegotiation of sym/asym PAUSE + * settings. + */ + mac_dev->autoneg_pause = !!epause->autoneg; + mac_dev->rx_pause_req = !!epause->rx_pause; + mac_dev->tx_pause_req = !!epause->tx_pause; + + /* Determine the sym/asym advertised PAUSE capabilities from the desired + * rx/tx pause settings. + */ + newadv = 0; + if (epause->rx_pause) + newadv = ADVERTISED_Pause | ADVERTISED_Asym_Pause; + if (epause->tx_pause) + newadv |= ADVERTISED_Asym_Pause; + + oldadv = phydev->advertising & + (ADVERTISED_Pause | ADVERTISED_Asym_Pause); + + /* If there are differences between the old and the new advertised + * values, restart PHY autonegotiation and advertise the new values. + */ + if (oldadv != newadv) { + phydev->advertising &= ~(ADVERTISED_Pause + | ADVERTISED_Asym_Pause); + phydev->advertising |= newadv; + if (phydev->autoneg) { + err = phy_start_aneg(phydev); + if (err < 0) + netdev_err(net_dev, "phy_start_aneg() = %d\n", + err); + } + } + + fman_get_pause_cfg(mac_dev, &rx_pause, &tx_pause); + err = fman_set_mac_active_pause(mac_dev, rx_pause, tx_pause); + if (err < 0) + netdev_err(net_dev, "set_mac_active_pause() = %d\n", err); + + return err; +} + +const struct ethtool_ops dpaa_ethtool_ops = { + .get_settings = dpaa_get_settings, + .set_settings = dpaa_set_settings, + .get_drvinfo = dpaa_get_drvinfo, + .get_msglevel = dpaa_get_msglevel, + .set_msglevel = dpaa_set_msglevel, + .nway_reset = dpaa_nway_reset, + .get_pauseparam = dpaa_get_pauseparam, + .set_pauseparam = dpaa_set_pauseparam, + .get_link = ethtool_op_get_link, +};