From patchwork Thu Sep 24 15:00:16 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Madalin Bucur X-Patchwork-Id: 522390 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 [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 153A81401F6 for ; Fri, 25 Sep 2015 01:26:27 +1000 (AEST) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id E816D1A2FBC for ; Fri, 25 Sep 2015 01:26:26 +1000 (AEST) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org X-Greylist: delayed 956 seconds by postgrey-1.35 at bilbo; Fri, 25 Sep 2015 01:18:27 AEST Received: from na01-bn1-obe.outbound.protection.outlook.com (mail-bn1on0132.outbound.protection.outlook.com [157.56.110.132]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 055AA1A056A for ; Fri, 25 Sep 2015 01:18:26 +1000 (AEST) Received: from BY2PR03CA002.namprd03.prod.outlook.com (10.255.93.19) by DM2PR03MB559.namprd03.prod.outlook.com (10.141.83.156) with Microsoft SMTP Server (TLS) id 15.1.274.16; Thu, 24 Sep 2015 15:02:46 +0000 Received: from BN1AFFO11FD036.protection.gbl (10.255.93.4) by BY2PR03CA002.outlook.office365.com (10.255.93.19) with Microsoft SMTP Server (TLS) id 15.1.274.16 via Frontend Transport; Thu, 24 Sep 2015 15:02:45 +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 BN1AFFO11FD036.mail.protection.outlook.com (10.58.52.240) with Microsoft SMTP Server (TLS) id 15.1.274.4 via Frontend Transport; Thu, 24 Sep 2015 15:02:44 +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 t8OF2Fkp018660; Thu, 24 Sep 2015 08:02:41 -0700 From: Madalin Bucur To: Subject: [v3 5/8] dpaa_eth: add ethtool functionality Date: Thu, 24 Sep 2015 18:00:16 +0300 Message-ID: <1443106819-5549-6-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; BN1AFFO11FD036; 1:V8ocIEx1ZO7nfEl6w+vnmFpsnVuHzT4lmskSLPDtlqJxmGVN7b0Z8/dK/Ok6v3JmyygTRd+A70LH1rAlKAzaqLybD8YiHyD57NErUiNdjIN+/LfxuFbFWT61Q1kWbuPLF6aff+KwjxvR6+YmSsySi5oiFDxgSE9fTRrdO9dKonHXGxaxarF3bWyyT+LtfX6pz4z/8RwCbKlca6Yw8oc5ndvJe1/qGsrJxEra2hwaNNZbi73xSsrdy9nFyeNJ5bWaxAQI9HuCqLsoWJM4/mMH1NSn80rGGAkBXGmZxH6u2E0Jo+WxEZm152JRpr25JD7Xzxrd6PPDexIoIJ0w078P1BeOEtAgUZWFNCLs3Pvv5Fl0QMWDn/qHSXLhfGOdOGKu3Oy3E+Nehb4IPuWbbTUQhw== X-Forefront-Antispam-Report: CIP:192.88.158.2; CTRY:US; IPV:NLI; EFV:NLI; SFV:NSPM; SFS:(10019020)(6009001)(2980300002)(1109001)(1110001)(339900001)(199003)(189002)(64706001)(47776003)(50466002)(110136002)(107886002)(50226001)(36756003)(5001960100002)(5003940100001)(5007970100001)(48376002)(189998001)(4001540100001)(81156007)(5001830100001)(5001860100001)(77156002)(46102003)(50986999)(97736004)(76176999)(86362001)(85426001)(2950100001)(62966003)(87936001)(77096005)(106466001)(68736005)(69596002)(43066003)(19580405001)(19580395003)(2351001)(229853001)(105606002)(104016004)(6806005)(33646002)(53806999)(2004002)(4001430100001)(309714004); DIR:OUT; SFP:1102; SCL:1; SRVR:DM2PR03MB559; H:az84smr01.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; MIME-Version: 1.0 X-Microsoft-Exchange-Diagnostics: 1; DM2PR03MB559; 2:Np/rJSdLPkgbOw/jwXsZbxkHmKTtrn4xnYWSUEyKAKhXlOpog0CR8IKqRL3+djw5FMIn7Z/P1iU3MMRFRZUt3FEXaQzZ8faUnBKtaL/oBRvlW7i1pfi96SGUYvfRNWu+ztREq0ynja+WP0Xw6WJon2IZYRkw+W4MoIKaMM3HZa8=; 3:GVg2NG1fBVPNY45If3fqYfFk7+ESgJJEV51TUS3rABmXmkfwwPhAwhDi7sVW9w2quFfXfZFh/kddxzavwMkIvg/AD9guTqUAx0UGUxp2RfqCZ7qviGLV+gBoi5fvYUz5DJzydgAmmP7iLT8I4zvwqv1jx8fAP9IKUSc27bnvxI/gq5/fNDIt0OXPwN/nyYlUzLVU7Qgxj/VtCsfAC/hUQ68JIyxDhkSqWDSC26XgF8s=; 25:IbfQxhC9V4tXB8wyHpBEJiCB7Stpx0kK650wOMi0bS7SLPlW+/uJAvSoW9I36slR8MxIalwfWPJmh7ffwjclbtHTbb0VXtOWc2KawBd/at9MRB9FkxRW6knxJzJ9leQMhLLCLXZHHiDTvZfrGG9ncvsoZSdGliR98/KbliAnK9LSJLOplA6ikVOOIEbfOBXCwv+8Nsz9zCGpTGJnl7BypA4LlEuICau/OCn8172G77HrVVl+k/OhzVhwkc2WoE8UGBR3D8NcGE3C7L0I034PWA== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:DM2PR03MB559; X-Microsoft-Exchange-Diagnostics: 1; DM2PR03MB559; 20:Jq/0lZPRykol7fYgv37IPfFf+xHT4W+3pwp+xfgsry7cpfNBHeCyIse8UDoaManYtU+jOKLRXez3JwITWs8d6Y4jMjJPZTDme8gqWIXK+HkcsvlAWusSW5UJHjTuuDG2/3PNqOxswOOe2Nde27EI/JqLDqodcLAHVBDa/ox3CPp6WgcRlIN/WzM+SsIqPTLAyZy8Iox5Yaxjf8Id3Qkv6Sjv42DbjqyKMSreq69FhZQ1vOqHES+SGIAPOCpPBS3aolMwToLrk2gKu2n+dC9JDBqw0tSInGprWOvjcZ1+oiz3FRt6aMXfiCaxDUXs1KlOwI3O+m6U/2DDHDlGhZr3CaAASNTqIcT6DXBBEC1gI5Y=; 4:WHpY2GdLpJmIDkUBX+t/XVk40BoDR/El5kgzV+NNReG8eUFFt8jjbPbxDHvOm41053CWgePqB9EkJIgXAk2mN81VZCz9kA0K2iH/vZDelz+woJzdbXTvFtoLIZG7HeewDheZgqauTwUK0zigULz1RSOXkhvh0vZYvGEnu1yAEC36pUg3jnewNzEw5IU5BONmjMu8yiMSZKugGmUyq3fjyglxXrfVU8x6EKlxf/WMEKbXLUfWLQpLUrqUcqSDp/9ab47rjzIncLj4OV6PYrCi+e05OjMvUYbo/2e0588H6Gs+uduejmV8e7kJjgGd5TCvWvSjDJb9DdAdEa1Qi15oXMsu9xY9R0LyVYz8xoUMiME= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(520078)(5005006)(8121501046)(3002001); SRVR:DM2PR03MB559; BCL:0; PCL:0; RULEID:; SRVR:DM2PR03MB559; X-Forefront-PRVS: 070912876F X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DM2PR03MB559; 23:F7Nj0cYkWOJWx85kLx0M8jcY+s9fLywbxwa6fadGot?= =?us-ascii?Q?vChJQVow2ga632K6fIrR6gw8woEdWkvGNtI0HvVPEChNsxVsfGo02X3Mf3Zy?= =?us-ascii?Q?rG0xhfq7QmDS63i1gPmyazZ/98a5mKcN4Tx15iYJoi4ZXzcvQUpz2BkcfNtM?= =?us-ascii?Q?njC2l0ZkW0CdYk0KGF6xL1witSARU8RntLlYqOeE2yARfsZzSecQRsOal/+C?= =?us-ascii?Q?No493IlFocpwoPOUJu5Ns89L8d8jWcrVoGFywWIe1cmiEss/k3VTRD9E2mGH?= =?us-ascii?Q?5BUG9mGKg3mbL7SEbl4HdIzvhHt3xzHuCTIeT5KjEUaMOo7nw4sM9cQmm0HE?= =?us-ascii?Q?bgFdMzVy1FapGmp/Rn3WUhCmG7yCn0wjL7jnZtACBq4qMGhumaOssLGOG8i9?= =?us-ascii?Q?XRZN4smeclWVJ4bGGMjWMqFqlFT3jUUrl+NO+0SEtlqvZjWtbvyZahO0z2lx?= =?us-ascii?Q?odx/s1LBjB17ey6YaauaGyF8Wv8lfgwitwUw9nm4svni9ajUpZes61ikS7Yk?= =?us-ascii?Q?eauCHHMZxuGokOi4lDxSYq/6G8zeJU7ZRHAKFY64xPh8eg39qgeMZuzMSALo?= =?us-ascii?Q?Te8V++dBz43J7afAccgFIaN5v6p2kR4mzUmiGvN7XEKxr4qcJfB5Vo+MZkDn?= =?us-ascii?Q?S29DaZ0RjBGPFZi6JwoQmTIl5BkXmNTA9LeOKzn0ZoaaiBaL1Kq4kNqr3ddW?= =?us-ascii?Q?QK1IqWUHGiFR1fna3uHrzM+oPbaypmzb8RNBObpb0zpftxcqIAQkTfKQzXTV?= =?us-ascii?Q?3/AA/a6uk19GyIrePDE1PO8Ny31FQMw5Fjhxrvp/4KcAAQmQOk0/Yp0eQn/W?= =?us-ascii?Q?C3PtfihC21ZuuFDhRxSrC7q3H7MV9NrQSMXXbdtV0YUCdQfmROcal7NnfYec?= =?us-ascii?Q?GUl4uK8xxDd9dediTAP2QlZAzvKlO0blGkG2ickaiaXVaNDiavtNX9mzD/68?= =?us-ascii?Q?+VGfLfPP1g4Fsgg3rAmqAt54l2SugKZMn6Uccfa/Aysi4C8FzWhORgKWDHR3?= =?us-ascii?Q?stwcfHyQ95Y3HlXWMndH/wSU9pD7FMEpfLc1F1Rb4JrEz8tJ0kTLX6FKGSIj?= =?us-ascii?Q?3Uyc1ymr9LjnEHYnsC7q1k0ExwKhPZjKygI6IJM9b8KMPWhtFfgCdcEHewWr?= =?us-ascii?Q?nHYMuCfMd4wClfIOJBmDJihPvLxuYG2nz8RFMBHQSFRDQjyRI2bBgYl59xAp?= =?us-ascii?Q?xvQm30C/Z5qJwoyaNRG6xMnXAokIz5FjcLYaJi9GelWwm8Lv4N7GTmQd8YTC?= =?us-ascii?Q?b0sLqAPNgKBxjx+htZqgq4dvQXP/jlVgT0s6BsbbBZjikArRmNrzmDDukwa7?= =?us-ascii?Q?0YbvR+Pb+bl4lonN6rneI=3D?= X-Microsoft-Exchange-Diagnostics: 1; DM2PR03MB559; 5:6mijD9VkNiwhvxz65LFIe0yhbM643HcHto11KvsFCYEcsugOnUUmu2AXRHZ7s28f8Z9y/X1224eZ9kcEr5HaPrHDeeJWa5xwQGozJRUjBJC8qY7SA3UHxPaSt3iXU25M3TkLqTbwDBnkSdcuigOmag==; 24:YkTEZFRBwUq6unVXpJmdPxAE7CUlTo/sErqyytqrZTuieWZvj4Fha8AO/68QNBXtjzz5zL4Yp71iYI24RWfc7JydP/CZQGWOm0zzS5nuOGo=; 20:Vz+0QLwYvbpSIJMT4sndbzCIdpkOVssNET69GSWVNuNeYtN4XvUxY+u+TR5SbCskr6b8lB+s6dZGglr5cEL2Iw== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Sep 2015 15:02:44.8662 (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: DM2PR03MB559 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" Add support for basic ethtool operations. Signed-off-by: Madalin Bucur --- drivers/net/ethernet/freescale/dpaa/Makefile | 2 +- .../net/ethernet/freescale/dpaa/dpaa_eth_common.c | 2 + .../net/ethernet/freescale/dpaa/dpaa_eth_common.h | 3 + drivers/net/ethernet/freescale/dpaa/dpaa_ethtool.c | 230 +++++++++++++++++++++ 4 files changed, 236 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 3847ec7..9b75d52 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 +fsl_dpa-objs += dpaa_eth.o dpaa_eth_sg.o dpaa_eth_common.o dpaa_ethtool.o diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth_common.c b/drivers/net/ethernet/freescale/dpaa/dpaa_eth_common.c index 89f3b1f..2b95696 100644 --- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth_common.c +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth_common.c @@ -102,6 +102,8 @@ int dpa_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 = &dpa_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_common.h b/drivers/net/ethernet/freescale/dpaa/dpaa_eth_common.h index 2e9471d..160a018 100644 --- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth_common.h +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth_common.h @@ -43,6 +43,9 @@ /* used in napi related functions */ extern u16 qman_portal_max; +/* from dpa_ethtool.c */ +extern const struct ethtool_ops dpa_ethtool_ops; + int dpa_netdev_init(struct net_device *net_dev, const u8 *mac_addr, u16 tx_timeout); 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..fa8ba69 --- /dev/null +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_ethtool.c @@ -0,0 +1,230 @@ +/* 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. + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include + +#include "dpaa_eth.h" +#include "mac.h" +#include "dpaa_eth_common.h" + +static int dpa_get_settings(struct net_device *net_dev, + struct ethtool_cmd *et_cmd) +{ + int err; + struct dpa_priv_s *priv; + + priv = netdev_priv(net_dev); + + if (!priv->mac_dev->phy_dev) { + netdev_dbg(net_dev, "phy device not initialized\n"); + return 0; + } + + err = phy_ethtool_gset(priv->mac_dev->phy_dev, et_cmd); + + return err; +} + +static int dpa_set_settings(struct net_device *net_dev, + struct ethtool_cmd *et_cmd) +{ + int err; + struct dpa_priv_s *priv; + + priv = netdev_priv(net_dev); + + if (!priv->mac_dev->phy_dev) { + netdev_err(net_dev, "phy device not initialized\n"); + return -ENODEV; + } + + err = phy_ethtool_sset(priv->mac_dev->phy_dev, et_cmd); + if (err < 0) + netdev_err(net_dev, "phy_ethtool_sset() = %d\n", err); + + return err; +} + +static void dpa_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 dpa_get_msglevel(struct net_device *net_dev) +{ + return ((struct dpa_priv_s *)netdev_priv(net_dev))->msg_enable; +} + +static void dpa_set_msglevel(struct net_device *net_dev, + u32 msg_enable) +{ + ((struct dpa_priv_s *)netdev_priv(net_dev))->msg_enable = msg_enable; +} + +static int dpa_nway_reset(struct net_device *net_dev) +{ + int err; + struct dpa_priv_s *priv; + + priv = netdev_priv(net_dev); + + if (!priv->mac_dev->phy_dev) { + netdev_err(net_dev, "phy device not initialized\n"); + return -ENODEV; + } + + err = 0; + if (priv->mac_dev->phy_dev->autoneg) { + err = phy_start_aneg(priv->mac_dev->phy_dev); + if (err < 0) + netdev_err(net_dev, "phy_start_aneg() = %d\n", + err); + } + + return err; +} + +static void dpa_get_pauseparam(struct net_device *net_dev, + struct ethtool_pauseparam *epause) +{ + struct dpa_priv_s *priv; + struct mac_device *mac_dev; + struct phy_device *phy_dev; + + priv = netdev_priv(net_dev); + mac_dev = priv->mac_dev; + + phy_dev = mac_dev->phy_dev; + if (!phy_dev) { + 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 dpa_set_pauseparam(struct net_device *net_dev, + struct ethtool_pauseparam *epause) +{ + struct dpa_priv_s *priv; + struct mac_device *mac_dev; + struct phy_device *phy_dev; + int err; + u32 newadv, oldadv; + bool rx_pause, tx_pause; + + priv = netdev_priv(net_dev); + mac_dev = priv->mac_dev; + + phy_dev = mac_dev->phy_dev; + if (!phy_dev) { + netdev_err(net_dev, "phy device not initialized\n"); + return -ENODEV; + } + + if (!(phy_dev->supported & SUPPORTED_Pause) || + (!(phy_dev->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 = phy_dev->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) { + phy_dev->advertising &= ~(ADVERTISED_Pause + | ADVERTISED_Asym_Pause); + phy_dev->advertising |= newadv; + if (phy_dev->autoneg) { + err = phy_start_aneg(phy_dev); + 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 dpa_ethtool_ops = { + .get_settings = dpa_get_settings, + .set_settings = dpa_set_settings, + .get_drvinfo = dpa_get_drvinfo, + .get_msglevel = dpa_get_msglevel, + .set_msglevel = dpa_set_msglevel, + .nway_reset = dpa_nway_reset, + .get_pauseparam = dpa_get_pauseparam, + .set_pauseparam = dpa_set_pauseparam, + .get_link = ethtool_op_get_link, +};