From patchwork Thu Oct 11 20:36:56 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heiner Kallweit X-Patchwork-Id: 982708 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="GpNlMG8G"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42WN7x64Grz9s8J for ; Fri, 12 Oct 2018 07:37:49 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725932AbeJLEGm (ORCPT ); Fri, 12 Oct 2018 00:06:42 -0400 Received: from mail-wr1-f65.google.com ([209.85.221.65]:39194 "EHLO mail-wr1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725819AbeJLEGm (ORCPT ); Fri, 12 Oct 2018 00:06:42 -0400 Received: by mail-wr1-f65.google.com with SMTP id 61-v6so11121415wrb.6 for ; Thu, 11 Oct 2018 13:37:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:from:to:cc:references:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=GIM8xIIBoLabpibDsFPkSeqd7DxdEVU6JREZSXVpa4w=; b=GpNlMG8GJb7kZzZdFgn4EIucvUKP2RfWFLdjI4Pu6rfDX8CrVZSpLqgj1FflQb1smD gjk9sKtYvoI6FLBOBmUxQMoGz72NrWAq4JX0KA+4+pmXWxYLRZkPgFjsd1b8J+lCrEZM nlV/AB7tetH46Vbz61NnpPCMSzhu3M1AYF2vjRIyurfajFNV5c66I4r3PAYY06mVOqJD ZGd3Fjbzps+PPgLvBtuI77iZL7h2v63iFqVUeujH4Un9o8NMEpjvCP+5ZNyLD7+WQAcr lQ6wJAqMenOSt47wBd9iEvz/yoBESUHdMiXiSxWoHRpsPXOF03oV8ur01nqAJ0khD9pG gSMw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:from:to:cc:references:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=GIM8xIIBoLabpibDsFPkSeqd7DxdEVU6JREZSXVpa4w=; b=J9EMdaXdrKLpRBnm8IT8XihnuUl7QigDtyC2je2w+9kmP0YbweEmuQ061MF4/DHInS TlkY2cD/E40GnsaAdL+IPp8kRc1XCruPzKq5UC+Ez+MMC2CqtTnU6Poq1atpDX1DFlD6 j9TgoQWoZcLOeb5avYikZPwwANM+2got6zDEVd+7gYYKjiJiXzgfKdHkymgUr8vxesNc uER3qtJ1H00/dH8Rlp1+/LWlKbEg3rWzZ1tXbC597ypZ/gw0td5s9QIs0dLaCSJnlqAE BbVv3Gf2uUirBXnq41q87dRzl9dDjfxHEq8SuWTQ0m2KDjwJ92uh94JILrB4bD32XQw6 124w== X-Gm-Message-State: ABuFfogrG4jdBeETN3Y10AUvrGAGPsLZRtPewUlLnt+IgWl6H9j3W9J2 1lGa+9uedYmm+no5N90kwcIZ3SV86Mc= X-Google-Smtp-Source: ACcGV62WvDmreVKNBH6aYA+3GdrbZjO2FgexX6nC6STzxPQ2DnQxLbOD4GcAyfVlM4/cpEK6r5OAcA== X-Received: by 2002:a5d:4b50:: with SMTP id w16-v6mr1142689wrs.173.1539290265918; Thu, 11 Oct 2018 13:37:45 -0700 (PDT) Received: from ?IPv6:2003:ea:8bd4:3f00:6c58:f76b:a44f:4c5e? (p200300EA8BD43F006C58F76BA44F4C5E.dip0.t-ipconnect.de. [2003:ea:8bd4:3f00:6c58:f76b:a44f:4c5e]) by smtp.googlemail.com with ESMTPSA id y3sm18071788wrw.11.2018.10.11.13.37.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 11 Oct 2018 13:37:45 -0700 (PDT) Subject: [PATCH net-next 1/2] net: phy: improve handling of PHY_RUNNING in state machine From: Heiner Kallweit To: Andrew Lunn , Florian Fainelli , David Miller Cc: "netdev@vger.kernel.org" References: Message-ID: <4bd37a90-675b-7c62-ba4e-a239b812862a@gmail.com> Date: Thu, 11 Oct 2018 22:36:56 +0200 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: Content-Language: en-US Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Handling of state PHY_RUNNING seems to be more complex than it needs to be. If not polling, then we don't have to do anything, we'll receive an interrupt and go to state PHY_CHANGELINK once the link goes down. If polling and link is down, we don't have to go the extra mile over PHY_CHANGELINK and call phy_read_status() again but can set status PHY_NOLINK directly. Signed-off-by: Heiner Kallweit --- drivers/net/phy/phy.c | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index 704428211..696955d38 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -941,7 +941,6 @@ void phy_state_machine(struct work_struct *work) bool needs_aneg = false, do_suspend = false; enum phy_state old_state; int err = 0; - int old_link; mutex_lock(&phydev->lock); @@ -1025,26 +1024,16 @@ void phy_state_machine(struct work_struct *work) } break; case PHY_RUNNING: - /* Only register a CHANGE if we are polling and link changed - * since latest checking. - */ - if (phy_polling_mode(phydev)) { - old_link = phydev->link; - err = phy_read_status(phydev); - if (err) - break; + if (!phy_polling_mode(phydev)) + break; - if (old_link != phydev->link) - phydev->state = PHY_CHANGELINK; - } - /* - * Failsafe: check that nobody set phydev->link=0 between two - * poll cycles, otherwise we won't leave RUNNING state as long - * as link remains down. - */ - if (!phydev->link && phydev->state == PHY_RUNNING) { - phydev->state = PHY_CHANGELINK; - phydev_err(phydev, "no link in PHY_RUNNING\n"); + err = phy_read_status(phydev); + if (err) + break; + + if (!phydev->link) { + phydev->state = PHY_NOLINK; + phy_link_down(phydev, true); } break; case PHY_CHANGELINK: