From patchwork Thu Oct 6 21:35:57 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Iyappan Subramanian X-Patchwork-Id: 679092 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 3sqm9G0rFgz9t0v for ; Fri, 7 Oct 2016 08:33:22 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=apm.com header.i=@apm.com header.b=q7iWfExk; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S935519AbcJFVdR (ORCPT ); Thu, 6 Oct 2016 17:33:17 -0400 Received: from mail-pf0-f175.google.com ([209.85.192.175]:35905 "EHLO mail-pf0-f175.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S935447AbcJFVdI (ORCPT ); Thu, 6 Oct 2016 17:33:08 -0400 Received: by mail-pf0-f175.google.com with SMTP id i85so14674998pfa.3 for ; Thu, 06 Oct 2016 14:33:08 -0700 (PDT) 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=AoCFsR8cmkC762T2BEVTE9O6Ec+JzSDJjTzX7npXbjA=; b=q7iWfExkTI/t+4mj4omlhkeGGbLZfklMXBJoZTm9owFjo6c1z61qUvouolnf5XSoW8 ipVarV43fZ5/Rdt0/I1MFDbYElFnDbJXy6UiS95dgoLHjxnSGXIZjNk9hQl57qBTU7A+ fDkz71ChahfMPSLn2G012JuVB/95ypRorcUPM= 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=AoCFsR8cmkC762T2BEVTE9O6Ec+JzSDJjTzX7npXbjA=; b=Gwgp7+qQlJA8m7nKmH2evAWTrRnt64+3u8yDHuva8xJeNWZmyN9aFuS1v+aFMBBK/H 3sVEOcevCovpF4cKcUv34AcFv3z5xeDOXWA7P/5HEILJ11bGLAGcwztxSWdNqoVIpwNB 2+olzMAnBOFvhZJlKcMhqUbF7YTD5KguOOcjTgJhkItphwIVGFDxTOrV6bQSIq37W/ht Pokc1pqBRZzaBEWLWXlOSnKexxR+aen5W9jYIFC2q43K/x5TK4d59PkR446W68Xa7lvH yMpCGdZwWGEz09MPRShgh65n/kP0XJiwTGYjxL7nu5juontDFtmlGqivDp4Hv6MWFGQj Ihdw== X-Gm-Message-State: AA6/9RksgZSZq1cAdSzdMbmzLeWfT8GBg9YlZDLI5IYKwf2wIZpG5JBnT2RTmM8liC2c7Nao X-Received: by 10.98.59.5 with SMTP id i5mr21394505pfa.25.1475789587750; Thu, 06 Oct 2016 14:33:07 -0700 (PDT) Received: from isubrama-dev.amcc.com ([206.80.4.98]) by smtp.gmail.com with ESMTPSA id s80sm8125361pfd.10.2016.10.06.14.33.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 06 Oct 2016 14:33:07 -0700 (PDT) From: Iyappan Subramanian To: davem@davemloft.net, netdev@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org, arnd@arndb.de, patches@apm.com, Iyappan Subramanian , Quan Nguyen Subject: [PATCH net-next 1/2] drivers: net: xgene: fix: Use GPIO to get link status Date: Thu, 6 Oct 2016 14:35:57 -0700 Message-Id: <1475789758-5196-2-git-send-email-isubramanian@apm.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1475789758-5196-1-git-send-email-isubramanian@apm.com> References: <1475789758-5196-1-git-send-email-isubramanian@apm.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The link value reported by the link status register is not reliable when no SPF module inserted. This patchset fixes this issue by using GPIO to determine the link status. Signed-off-by: Iyappan Subramanian Signed-off-by: Quan Nguyen --- drivers/net/ethernet/apm/xgene/xgene_enet_main.c | 6 +++++- drivers/net/ethernet/apm/xgene/xgene_enet_main.h | 1 + drivers/net/ethernet/apm/xgene/xgene_enet_xgmac.c | 19 +++++++++++++++++-- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c index 429f18f..f75d955 100644 --- a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c +++ b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c @@ -1381,9 +1381,13 @@ static void xgene_enet_gpiod_get(struct xgene_enet_pdata *pdata) { struct device *dev = &pdata->pdev->dev; - if (pdata->phy_mode != PHY_INTERFACE_MODE_XGMII) + pdata->sfp_gpio_en = false; + if (pdata->phy_mode != PHY_INTERFACE_MODE_XGMII || + (!device_property_present(dev, "sfp-gpios") && + !device_property_present(dev, "rxlos-gpios"))) return; + pdata->sfp_gpio_en = true; pdata->sfp_rdy = gpiod_get(dev, "rxlos", GPIOD_IN); if (IS_ERR(pdata->sfp_rdy)) pdata->sfp_rdy = gpiod_get(dev, "sfp", GPIOD_IN); diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_main.h b/drivers/net/ethernet/apm/xgene/xgene_enet_main.h index 0cda58f..011965b 100644 --- a/drivers/net/ethernet/apm/xgene/xgene_enet_main.h +++ b/drivers/net/ethernet/apm/xgene/xgene_enet_main.h @@ -219,6 +219,7 @@ struct xgene_enet_pdata { u8 rx_delay; bool mdio_driver; struct gpio_desc *sfp_rdy; + bool sfp_gpio_en; }; struct xgene_indirect_ctl { diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_xgmac.c b/drivers/net/ethernet/apm/xgene/xgene_enet_xgmac.c index 6475f38..d1758b0 100644 --- a/drivers/net/ethernet/apm/xgene/xgene_enet_xgmac.c +++ b/drivers/net/ethernet/apm/xgene/xgene_enet_xgmac.c @@ -415,16 +415,31 @@ static void xgene_enet_clear(struct xgene_enet_pdata *pdata, xgene_enet_wr_ring_if(pdata, addr, data); } +static int xgene_enet_gpio_lookup(struct xgene_enet_pdata *pdata) +{ + struct device *dev = &pdata->pdev->dev; + + pdata->sfp_rdy = gpiod_get(dev, "rxlos", GPIOD_IN); + if (IS_ERR(pdata->sfp_rdy)) + pdata->sfp_rdy = gpiod_get(dev, "sfp", GPIOD_IN); + + if (IS_ERR(pdata->sfp_rdy)) + return -ENODEV; + + return 0; +} + static void xgene_enet_link_state(struct work_struct *work) { struct xgene_enet_pdata *pdata = container_of(to_delayed_work(work), struct xgene_enet_pdata, link_work); - struct gpio_desc *sfp_rdy = pdata->sfp_rdy; struct net_device *ndev = pdata->ndev; u32 link_status, poll_interval; link_status = xgene_enet_link_status(pdata); - if (link_status && !IS_ERR(sfp_rdy) && !gpiod_get_value(sfp_rdy)) + if (pdata->sfp_gpio_en && link_status && + (!IS_ERR(pdata->sfp_rdy) || !xgene_enet_gpio_lookup(pdata)) && + !gpiod_get_value(pdata->sfp_rdy)) link_status = 0; if (link_status) {