From patchwork Thu Jan 22 21:50:59 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heiner Kallweit X-Patchwork-Id: 432008 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from arrakis.dune.hu (arrakis.dune.hu [78.24.191.176]) (using TLSv1.1 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 631F014028E for ; Fri, 23 Jan 2015 08:59:59 +1100 (AEDT) Received: from arrakis.dune.hu (localhost [127.0.0.1]) by arrakis.dune.hu (Postfix) with ESMTP id E583328BE4E; Thu, 22 Jan 2015 22:56:32 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on arrakis.dune.hu X-Spam-Level: X-Spam-Status: No, score=-1.2 required=5.0 tests=BAYES_00, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, T_DKIM_INVALID autolearn=no version=3.3.2 Received: from arrakis.dune.hu (localhost [127.0.0.1]) by arrakis.dune.hu (Postfix) with ESMTP id 1048528BE2F for ; Thu, 22 Jan 2015 22:56:10 +0100 (CET) X-policyd-weight: using cached result; rate: -8.5 Received: from mail-wi0-f174.google.com (mail-wi0-f174.google.com [209.85.212.174]) by arrakis.dune.hu (Postfix) with ESMTPS for ; Thu, 22 Jan 2015 22:56:09 +0100 (CET) Received: by mail-wi0-f174.google.com with SMTP id n3so24753270wiv.1 for ; Thu, 22 Jan 2015 13:58:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :content-type:content-transfer-encoding; bh=nOyMTrn1Zm2Ay7ygIHMA77QZ9/TMJ/t5pEnwkJv0K1g=; b=EhMaFzSrmA1I9it8U5JGUHeiBIIdywr+p1JyPwOYJIPqdM90+mGIGg+KwcST5vx4yX P2oar66s86OaO+rVHBERVCe97YGDUbp/9fAJjmvkzK91XIpU11lWDOTaNXKpwo8qdBAH m69KhjKA2rBzkew/h69ZKuJuqiVd7+tQdpIiGifshMsZ7ebkac+7lj/hvTMnrd1bPO+V bqxvNEvAQZsQdOtEKR1xUP/Wj8WhZHFd1y3Z9ldxfD/k058G++PU9sDgWYXSgfJcrxLs l0cVnFSIvvEAk3O9O7H2FdIwT7+80PnRX5gUcTSc0lWHg9tUUTpkKdqs2LzK0pQ8GfQF 2sWA== X-Received: by 10.194.187.79 with SMTP id fq15mr7663763wjc.2.1421963910856; Thu, 22 Jan 2015 13:58:30 -0800 (PST) Received: from ?IPv6:2003:63:231f:ff00:3535:671c:f47a:7bc7? (p20030063231FFF003535671CF47A7BC7.dip0.t-ipconnect.de. [2003:63:231f:ff00:3535:671c:f47a:7bc7]) by mx.google.com with ESMTPSA id l6sm5625502wjx.33.2015.01.22.13.58.30 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 22 Jan 2015 13:58:30 -0800 (PST) Message-ID: <54C170C3.8040109@gmail.com> Date: Thu, 22 Jan 2015 22:50:59 +0100 From: Heiner Kallweit User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: Felix Fietkau Cc: OpenWrt Development List Subject: [OpenWrt-Devel] [PATCH 2/5] ar8216: add link change detection for switch ports X-BeenThere: openwrt-devel@lists.openwrt.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: OpenWrt Development List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: openwrt-devel-bounces@lists.openwrt.org Sender: "openwrt-devel" Check for switch port link changes and - flush ATU in case of a change - report link change via syslog Signed-off-by: Heiner Kallweit --- .../linux/generic/files/drivers/net/phy/ar8216.c | 35 ++++++++++++++++++++++ .../linux/generic/files/drivers/net/phy/ar8216.h | 1 + 2 files changed, 36 insertions(+) diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index 370f1ac..130ebf7 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1707,12 +1707,47 @@ ar8xxx_phy_config_init(struct phy_device *phydev) return 0; } +static bool +ar8xxx_check_link_states(struct ar8xxx_priv *priv) +{ + bool link_new, changed = false; + u32 status; + int i; + + mutex_lock(&priv->reg_mutex); + + for (i = 0; i < priv->dev.ports; i++) { + status = priv->chip->read_port_status(priv, i); + link_new = !!(status & AR8216_PORT_STATUS_LINK_UP); + if (link_new == priv->link_up[i]) + continue; + + priv->link_up[i] = link_new; + changed = true; + dev_info(&priv->phy->dev, "Port %d is %s\n", + i, link_new ? "up" : "down"); + } + + if (changed) + priv->chip->atu_flush(priv); + + mutex_unlock(&priv->reg_mutex); + + return changed; +} + static int ar8xxx_phy_read_status(struct phy_device *phydev) { struct ar8xxx_priv *priv = phydev->priv; struct switch_port_link link; + /* check for link changes and flush ATU + * if a change was detected + */ + if (phydev->state == PHY_CHANGELINK) + ar8xxx_check_link_states(priv); + if (phydev->addr != 0) return genphy_read_status(phydev); diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.h b/target/linux/generic/files/drivers/net/phy/ar8216.h index 8487c3e..2d025ae 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.h +++ b/target/linux/generic/files/drivers/net/phy/ar8216.h @@ -396,6 +396,7 @@ struct ar8xxx_priv { bool initialized; bool port4_phy; char buf[2048]; + bool link_up[AR8X16_MAX_PORTS]; bool init;