From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S966281AbcKOIlm (ORCPT ); Tue, 15 Nov 2016 03:41:42 -0500 Received: from mail-cys01nam02on0055.outbound.protection.outlook.com ([104.47.37.55]:59904 "EHLO NAM02-CY1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S966075AbcKOIl1 (ORCPT ); Tue, 15 Nov 2016 03:41:27 -0500 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; X-IncomingTopHeaderMarker: OriginalChecksum:;UpperCasedChecksum:;SizeAsReceived:880;Count:11 From: Madalin Bucur To: CC: , , , , , , , 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> Reply-To: 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 Content-Type: text/plain 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 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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, +}; -- 2.1.0