From patchwork Fri Dec 2 00:41:44 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Iyappan Subramanian X-Patchwork-Id: 701764 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3tVFh358z5z9sxS for ; Fri, 2 Dec 2016 11:41:07 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=apm.com header.i=@apm.com header.b="hrq0eg0r"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1760156AbcLBAk7 (ORCPT ); Thu, 1 Dec 2016 19:40:59 -0500 Received: from mail-pg0-f43.google.com ([74.125.83.43]:33538 "EHLO mail-pg0-f43.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757758AbcLBAkw (ORCPT ); Thu, 1 Dec 2016 19:40:52 -0500 Received: by mail-pg0-f43.google.com with SMTP id 3so100724356pgd.0 for ; Thu, 01 Dec 2016 16:40:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=apm.com; s=apm; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=z8uPjyIy2LvsFhTv0xMjjSrbpih8NRT/RUFESBWjeww=; b=hrq0eg0rEfTdilEPKchL7jD1JdJLXZgKFmzPW7kKO4PSLVopG9dghm+ZZCyNQHdmYl 9retuGt4pq/no31nUwqEhHY4k9H+CKH9/oMH8muiOpxlVnVEZY8SGOw+vZjNwfwe+AGA bQJ1/w8zvsSCFtnnPjpuaoDVBJ3i1YLlCtD9Y= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=z8uPjyIy2LvsFhTv0xMjjSrbpih8NRT/RUFESBWjeww=; b=f9ALnkWDes477utu2uBk+k2kWnZVmGipwQzd5xB846PQhyHJkM+uOzlsyasQnRNodi ZdSq+TgtWCQ5nDHhM9ibvBt6h9xvc3LnSuF1HoVFoqFRtRJnUlUPxrHitEU8AXDDpOjn bsFi57sTX152tcxmCj33Ck13OTC/IY71GJRc+sOH8qaI6+wAdU8ECOYey7U+ZTNn7fmA yRa8vdb0GlSr2EABvByu6kOMs7qsOvmufVAq7pzuOyofzoIsxLACuQljSfGmJ/EJXjlA VnvwyJo1M9rk7ujdcOR3uNzqCRPe54bpXl9nKFkTVOE0+UDpAnGWzD/wNNFZe1TkBQek GPcA== X-Gm-Message-State: AKaTC03FmsHz1WDzr0dEQ/YftEl+oMNylopkPDJcel81PwDXKETwyL7AjgwUMMVgaYDu95AH X-Received: by 10.98.26.88 with SMTP id a85mr41850130pfa.57.1480639246612; Thu, 01 Dec 2016 16:40:46 -0800 (PST) Received: from isubrama-dev.amcc.com ([206.80.4.98]) by smtp.gmail.com with ESMTPSA id v193sm2681641pgb.37.2016.12.01.16.40.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 01 Dec 2016 16:40:46 -0800 (PST) From: Iyappan Subramanian To: davem@davemloft.net, netdev@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org, patches@apm.com, Iyappan Subramanian , Quan Nguyen Subject: [PATCH net-next 8/8] drivers: net: xgene: ethtool: Add get/set_pauseparam Date: Thu, 1 Dec 2016 16:41:44 -0800 Message-Id: <1480639304-18757-9-git-send-email-isubramanian@apm.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1480639304-18757-1-git-send-email-isubramanian@apm.com> References: <1480639304-18757-1-git-send-email-isubramanian@apm.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch adds get_pauseparam and set_pauseparam functions. Signed-off-by: Iyappan Subramanian Signed-off-by: Quan Nguyen --- .../net/ethernet/apm/xgene/xgene_enet_ethtool.c | 70 ++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_ethtool.c b/drivers/net/ethernet/apm/xgene/xgene_enet_ethtool.c index d372d42..28fdedc 100644 --- a/drivers/net/ethernet/apm/xgene/xgene_enet_ethtool.c +++ b/drivers/net/ethernet/apm/xgene/xgene_enet_ethtool.c @@ -163,6 +163,74 @@ static void xgene_get_ethtool_stats(struct net_device *ndev, *data++ = *(u64 *)(pdata + gstrings_stats[i].offset); } +static void xgene_get_pauseparam(struct net_device *ndev, + struct ethtool_pauseparam *pp) +{ + struct xgene_enet_pdata *pdata = netdev_priv(ndev); + + pp->autoneg = pdata->pause_autoneg; + pp->tx_pause = pdata->tx_pause; + pp->rx_pause = pdata->rx_pause; +} + +static int xgene_set_pauseparam(struct net_device *ndev, + struct ethtool_pauseparam *pp) +{ + struct xgene_enet_pdata *pdata = netdev_priv(ndev); + struct phy_device *phydev = ndev->phydev; + u32 oldadv, newadv; + + if (pdata->phy_mode == PHY_INTERFACE_MODE_RGMII || + pdata->phy_mode == PHY_INTERFACE_MODE_SGMII) { + if (!phydev) + return -EINVAL; + + if (!(phydev->supported & SUPPORTED_Pause) || + (!(phydev->supported & SUPPORTED_Asym_Pause) && + pp->rx_pause != pp->tx_pause)) + return -EINVAL; + + pdata->pause_autoneg = pp->autoneg; + pdata->tx_pause = pp->tx_pause; + pdata->rx_pause = pp->rx_pause; + + oldadv = phydev->advertising; + newadv = oldadv & ~(ADVERTISED_Pause | ADVERTISED_Asym_Pause); + + if (pp->rx_pause) + newadv |= ADVERTISED_Pause | ADVERTISED_Asym_Pause; + + if (pp->tx_pause) + newadv ^= ADVERTISED_Asym_Pause; + + if (oldadv ^ newadv) { + phydev->advertising = newadv; + + if (phydev->autoneg) + return phy_start_aneg(phydev); + + if (!pp->autoneg) { + pdata->mac_ops->flowctl_tx(pdata, + pdata->tx_pause); + pdata->mac_ops->flowctl_rx(pdata, + pdata->rx_pause); + } + } + + } else { + if (pp->autoneg) + return -EINVAL; + + pdata->tx_pause = pp->tx_pause; + pdata->rx_pause = pp->rx_pause; + + pdata->mac_ops->flowctl_tx(pdata, pdata->tx_pause); + pdata->mac_ops->flowctl_rx(pdata, pdata->rx_pause); + } + + return 0; +} + static const struct ethtool_ops xgene_ethtool_ops = { .get_drvinfo = xgene_get_drvinfo, .get_link = ethtool_op_get_link, @@ -171,6 +239,8 @@ static void xgene_get_ethtool_stats(struct net_device *ndev, .get_ethtool_stats = xgene_get_ethtool_stats, .get_link_ksettings = xgene_get_link_ksettings, .set_link_ksettings = xgene_set_link_ksettings, + .get_pauseparam = xgene_get_pauseparam, + .set_pauseparam = xgene_set_pauseparam }; void xgene_enet_set_ethtool_ops(struct net_device *ndev)