Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756800AbcKBUR5 (ORCPT ); Wed, 2 Nov 2016 16:17:57 -0400 Received: from mail-sn1nam02on0087.outbound.protection.outlook.com ([104.47.36.87]:48640 "EHLO NAM02-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1756102AbcKBURy (ORCPT ); Wed, 2 Nov 2016 16:17:54 -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 04/10] dpaa_eth: add ethtool functionality Date: Wed, 2 Nov 2016 22:17:28 +0200 Message-ID: <1478117854-8952-5-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: 131225914715095750;(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)(189002)(199003)(87936001)(43066003)(50226002)(2950100002)(47776003)(85426001)(3450700001)(76176999)(6666003)(50986999)(53806999)(189998001)(19580405001)(86362001)(110136003)(77096005)(36756003)(33646002)(7846002)(586003)(69596002)(81166006)(8676002)(6916009)(5003940100001)(97736004)(2351001)(50466002)(68736007)(4326007)(305945005)(19580395003)(5660300001)(626004)(8936002)(81156014)(48376002)(106466001)(229853001)(104016004)(356003)(105606002)(2906002)(11100500001)(2004002)(309714004);DIR:OUT;SFP:1101;SCL:1;SRVR:CY1PR0301MB1626;H:az84smr01.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BL2FFO11FD015;1:SWS1vOyNgnTh2jBnEMO5+Mz1kOq8GbST/SZGlQv5ImibFgaxhsBcCkRcpEi6Y74YqNhLOIOWAQXsUGzvdJCae2vkjJlylpI822ncHnu3JljkwFAu5TTy4F6gfEjGCwGz9XItO8hpuysGmRQeBfGKGUPUr62Kh4TQ3gA3t+deJ1Rk/1TUdpLM+CKGJjsa0NQwHd87avjJw3/DDeb41nlgrIPwzMdRTun3oS4rsDUEaMs8bnpJ5hMOnVz0HSCFbpF3ICajIQFvrXNqBIFOPTbL+g+wE7ifMug0c+aFjnvhZ19pO/dOuZjGGZiXm/W66iyqqBnL952dwdfg7uVuvPOUh46hFr5TP4KkJvK3ejV0eCvf5DWefu0XcFf1rQHOG9VbuDLe6QJBjUlqlZ9ulMeT50B3P2cfigsVvojOmpsrz/janoypDj7B6TafhCwQ3xC0FGsvdNoGsssu2J/cwoEXj9AFOdntxN9Lwqq7UIdgwep5Ae4OWxAB3jL6Pc+nfOqkoylQmZC7A9E8EoXzmlGUQxiWDfvM68B3tZr3yqrladc9DVChL1wScddSDBX1PBxc5dODMEn8/14JnOmtgd2/JOZ9NQdB1NbWJbPyY/0GlgXIl2ifKTwUOHRSPtCnOaZ0 MIME-Version: 1.0 Content-Type: text/plain X-MS-Office365-Filtering-Correlation-Id: 538e157b-0e54-4781-e165-08d4035d525f X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1626;2:zSaNjz/xzM6/BDEH2wBhVYVGDKLuqzaYNxqGXgHW8j1O63kry0w5C5/SxlRu2aXbJQfUUcWG++0AzmBrUhUgUaCBJRo10ssqCrWnYT3Mjl/OH6Zgi5ShVTDn2lswxVNfiATP4i+cC8dbBCBjuYh037GMSbo7sN8QDPCfOZ8YX1ERA8Y3ZQe88nkzsaiToBgJOLUhidgaMm29Cq/OsUAtrA==;3:uKyn607mm3rUzZujWvfzNth+IL3+G+0AfvePJ1iuKdX5oHhOiOPOzdWQxHdNzTWAxLlJOZFBsoZuEaDL/TJN6XRIIW0Tr1qsTXj1iraw9zEbEFFW/SZrlR/WpNjKQIlj+hxmpZ0XNpjjQuDTaCk5gh8Dco+HqZIv5FvWC0Mb2aw/cITDR1TERFHNcomsnUXpIcaRzmdeyYPtmucxyofghFJmGSZE1hA6muZVNQnqyFLGeyPvLV+4/lX9E3IEZKdl X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR0301MB1626; X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1626;25:ENv8zzOSJPWytwBjQ4WiHekmPxH1h7UB1FVGgCxtTi6E7jA2jAE+zfJUGztPdw6WD75iB9eT03bnMQbkFdzolXzIPWwdbLBkc/kCVlpDnZJF3v1TvM553eTZ2u569fdt0jAksiumaTCeZ74zwklOLYmWCPX6xG6974D/zK9XoJUBRtmLHwDogLBdDzVm9z+Bbr0W7RzB2qgOycimSUsq2H/pHwyS6KW01xj7A16Dv5GTrY8oE+OakdCKHfyDNsOUmFWNjAaNs4Qju8hBRFVFvRzUdrFdwOUBy6IG+XtMR2cNqVGgMq+gIP803mkO2cGe/CUOtwAtPru+A06DsZ+ugtOdLqgibhauQQqbCcwdm26WqDVvzDMF4x0saZxZibxlfD6jU9I3EPkzKN63JYHHXg7agEwBs3Z72LSdOJnbMdSt78pDzrmc2ZFclKzLDhnINb0M+6OLx/tzNfeyBSy5GxyLi/yy4vfwCZ9C97C4nVPa7/4yPa6arjS0p2s9dNeL9nIjKzc6y62xsqor2ecTXLai+5NyhaELipeKEJuHjsIL0zPXj7Ok3kXNMpJAXeaUhwoCeidoTNsGq5AXJl6i60YywZhmLn2idRX7WEqFji3CVkSp2AB0BzDIud3/UaxvQqWkH85zrMP8tSqnzy6wPrzGVOQ12qaLtX6AiZ4NXHaALDND6XqyqbNWFS/LTO9PZ0z80vR8089IKntS19jRDWYADRSM0bGKCSIujSQqkr5CntJYcjLRgqXVbTTOEns64O/7hEQo4jZSuJRy/EJHdgI5Y1V8jvid2JgWBLAwkkU= X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1626;31:iwwJjqwyRuXwlHI+dWAakp2gTGHJ7dM7amrVolYpA8CrdvNUD+iND+YHWREIXxNODVLvyYEEgkDhs57eNiDFI2TylbLzep+KMa3eIBXFY4uQYV65bgWY/4VUQytfzaen0E5Wq0bwZVd0gDn6wl4CPJAztPaDSn4c0uLlvJ02JATtjOa3jtkMuCePusJSFd9h5hKXSp87W3s+2kXPNFxog4nPqWQkdB6/rjvkhk7egj3UL/d/FS8Gp9Hr5sNXfiVFJuMUTcMAqkzvuoSrqfKxG+7c5iPiHt5MRRhQmMDK5QGz2y6eb+s7xEHZ/G/gWBSo;4:BtO4Cr+jnQLTNqQ3DAK85dhKnqxUxFqmvRY9+SQxbOONpH0uPZ2hYUo9f4Pny2JNqVHqD2P4MFqEVAil0ln+FdFswGL/y49A1ORxQ4wLMyoXCjn//uiyYSYLg16m4jFkZSBhaEMysVQyywNhz3dofQaMS8oGzNppptqv+NXw8G66xHKXEJ7ciaegtDxBSI2xssuGEyOxyT7VM8ay2fpWx0nuMDmrgvyFAYEJnJqY/mX0AB0tJLntFWB+MMnqtsy/b8/hjZ5KxvxU/WgS/ny6lvx2JhgMyiAgzG3v24I1Z03+CJKu7pqUVD+tw6Ei/lqw1VDB4sX3Q/j3s0I4eFrcnxAdbHDq0XvbPotud+tcwntCVzwiJLAmHD5a+VyIZPb+oKz6tBewUE/qhuK71bwpCiL4eCS+NdTDZXCPzHej4nEQI8NahLg3g84eYQfpbqlNAbb1OIUvQlfF/9SuS7xp9nFlY6ahTLUj6CIq8fdsnmx93PF/p1vZJMzvPgRATlMSWJPGEDFFFgJc1ZWrWq3n3dDe1CoeoTa+Bb6+IaqWjfTbT39d/+t89ECLLvpDk0my 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)(13018025)(5005006)(8121501046)(13015025)(13024025)(13023025)(10201501046)(3002001)(6055026);SRVR:CY1PR0301MB1626;BCL:0;PCL:0;RULEID:(400006);SRVR:CY1PR0301MB1626; X-Forefront-PRVS: 0114FF88F6 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CY1PR0301MB1626;23:aSzkkJA3LF2XRaIP/3yj/0PWSPaNpUrYm8pALtq?= =?us-ascii?Q?lBsYfXrk/GDIVgDkVTefVEWRjBG8AHcX6J9GoA+Jy6o9jU9mmF9ShJj5P/Vr?= =?us-ascii?Q?yFE8yFb5tU8JQ3bAd6UtVBNJHHoDuCbvXmXA6XMK8wLeePEOXiC4bps3GEHL?= =?us-ascii?Q?Hoa7l4x9ouCM+ikb/gICUe+C5Jr8j+8l9g9TlE0epyFyuG6rBPSKJawkH9X5?= =?us-ascii?Q?q/cMHitRTVKiJ7q89DNoijch8b+yPjBJbtV8R+abc3dimM8yblN8rPJNeg+r?= =?us-ascii?Q?OePwvhZ+DPgaI0ptsUJkE3BvS9eI91Y3jjJ9496g3Ve7TaWNKVzTMwb/fDTg?= =?us-ascii?Q?a0oVwkIPfTB3Rv6Q9zWSP9O2i9US1wgKmK1vEwNn3yhEj4uEd2WMieAKvzMc?= =?us-ascii?Q?7WVbJHI5eg3T770cPSsxuo7fMfk1dibTGNefoEq6RB0Hf384CHMpfSwE8+nL?= =?us-ascii?Q?8sUBrGKBkgRd+rKbmqhJrc/R2wcYyXhSyiJ0/Z6qRhBBqmchzQR7KTP1qb9B?= =?us-ascii?Q?9StKUzUw9myX/8YYi1anSJeQ17q/BJiEuWkSJeMNaH7DegGc5ILKPPVjVkCV?= =?us-ascii?Q?Ccflk3JkoHPb3HIs9n2HWD2SCDtp1zBToC+rpk3EC4+GzjfcmOWlLpoCgsY6?= =?us-ascii?Q?u4pyhbRS6a6N4IFTbmD8Obwst6DOptzlxNqvR4H6nMk1f4bVr/VMcXoUkQgc?= =?us-ascii?Q?wguVNksz+682i8uhCWTF5YgKT3sQGNiSgB7ZU7j1CAEBnIy3rXX/7nbiLuD2?= =?us-ascii?Q?psgwUsnN4D3Kq3FrbVrdQZoUad+u9HGektYCJcF/QN5l1Kfj+jKeYeVzDDnX?= =?us-ascii?Q?WNqmHaAh6H/zjxRjlYWbY0hqk1cdEiEsar6W8BU9zKqQe9AP0CE7JgsdYvV9?= =?us-ascii?Q?/Eb8NKDKY+mgRFQk9VlfZlAIt2ovR9uZOEwKZcbGsLzq2xz1Xkb14iKBnQrf?= =?us-ascii?Q?07Xivp1N51kgwXA07g4UB8YCVnOi44XjDkLMnw+ZeF3KyfX1+cfIWaH/bFxH?= =?us-ascii?Q?P7CjLKHHbron4zcwqTT4k/y7DWQ8Ei5g62o6LTpwoGMYFXQc7hWNDbe3LBPs?= =?us-ascii?Q?mllADJFmKKtFeZGHakstUudPWOi2+GhFuGb6qu+v859S0Ji/T9dB/ZgXyqiY?= =?us-ascii?Q?v3nI1It+NVD8FeCF5SFY/wlvHYHF4mtifkkVj6uyxRQEpIEvznsHhg26O9kz?= =?us-ascii?Q?tf4pmYzb06mKpsveEmgzqW9yfLjStx3zpaCYzQ5BOF0GMQ4RuDRP7oWU+AzD?= =?us-ascii?Q?GTJrYakhiyAfHlu/rAw4ov6V5ekVOQmXcJNi82TUnZiNR7fMhTq+qGm1/bz3?= =?us-ascii?Q?m2w=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1626;6:VFrNmRzbFeCRT3p0ov5AdM6SosF08ky79PPpDXzGMbk98+rem845p2LpKdY6MOm73UnQbbOshojCC81J9QydhUVN+8BAqDaeDEfIDNgtq4LFspHvX3PdTDBVNTzGb3vWSdQxcAOQ0ZSJPv1iAD1CuKiUDAU1ma4h8O9x6QPbx6hpPy2/SPGWkkz1UdT4itoMoPPeUEVqyNZkLr9h/HdybHE2lszD/70BpzdNbCQP017/qrwHKyTAPay3ab1dNXsgFdrXGKylVQwFodtDyYvycUvLDtLb4sxMCNLCvSeEkkUH7Wu/DvoY6uCS1i5Cj0JB;5:cJZBfcFDZS7AGEWQXLwNpmISsbJowvIGsrZ/2Y160SJoSQy+Y9zStJz3is6XeqzQq3A1U+KfCU6wZPUfLxw5uhOeIN977W9kTAF2KsPtc+j+Xlk3Dq4wKqNo24zCSPiIKdpPMhmjzVcCDWZlXzFeuU1G04Iy6D/arQLHQH0POUwvcY1bR+4nU5YUO28LHLMk;24:I/AY7phOqeMrlycyd63ocy36kd9QX3qtLwxzcrNmqerH52R1WCRfXDn2BkCfTOCuJRxOXm6NagzE1swjdGzNpeTwHIgAT1ieRwBOzrGLG7Q= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1626;7:62z7oiK+HcCQy+OJVxnZHeHeto2LZU4Gv/NgQa1S+r16latSSZgCDFU76njnjJ/5Wkycgq+6iLzoyj1JF4zthlOqn041VOpKsOBeJTfrXKue8cwkTDPHtzfvKiqmBG0RA2POjIz5iCM5SvgeQdovki1CFSPHphC1d1nQ4geX5SwkuQ7mccIGFsRGupdjqHwqnnkteRkzlSILjJIgJTafVSYzVQ/HdyVkW9hiZYWPZWm4XHuy5cIP23Y3wLyPlwnZF7qsSfRYB7y45MTBcv8DWHwaCtMHsOF/GP0t05XMHdXxcNy4DbhJV2DwCb1yfN0nl+MG0cGs6C5BUtgnwAD2BK0v5QiHI/ouVQ48EoQC9IA= X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Nov 2016 20:17:51.2755 (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: CY1PR0301MB1626 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 8783 Lines: 272 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 5e8c3df..681abf1 100644 --- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c @@ -242,6 +242,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..f97f563 --- /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 dpaa_priv *priv; + struct mac_device *mac_dev; + + 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 dpaa_priv *priv; + struct mac_device *mac_dev; + struct phy_device *phydev; + int err; + u32 newadv, oldadv; + bool rx_pause, tx_pause; + + 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