Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp11988723ybi; Fri, 26 Jul 2019 02:58:27 -0700 (PDT) X-Google-Smtp-Source: APXvYqw8l7j0d5Dlm8Whh/o5q1hPm6arZHGS44OAVcZZ0anhZgpmIHs+ODe/pDRmUAEaadgJsQ4n X-Received: by 2002:a17:90a:2228:: with SMTP id c37mr98579048pje.9.1564135107224; Fri, 26 Jul 2019 02:58:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1564135107; cv=none; d=google.com; s=arc-20160816; b=jC4jDrKRCqgyTb0Z28fl6Nu5IjMNO5Fdkd7JGfH7EkKDEqk6Fa7cIArJ8MLm5kkE3u kd5mcROgM0HvW7pwmQ0fS1Iztppl5LImyqWqx4DkhFt9vzh1M4ah6xks/BR8SwT3y/8u UWTPci64UMogQokyhEbZEBYz9MUSbHKThhYwvP4mD2m1jy7HJlXfRGY8dkUAuJfviqDM kiThdb1RIi9FLrVlINe1LU+xxOXJlsEQpR8rmu75qgEpTJzDhLW7CtXHKxWt8MK0+NXH ayNDFNyJkDo9VVv+1uPy2xhWV468biMfh+9uyqHR1SKHJD3dmzYAh5kmEjZc47mdlcxE R6JA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:message-id:date:subject:cc :to:from; bh=Pcy4+NQuKfQvi+diCXXECf5yV9hieYXNR5f57IvWJ5Q=; b=v/ut2JWghr9Jy5Fxbc8OgT5hjruf8DnNM51dcZrV+X/i5KEoBmDBJE5Ybnph0kMCI+ KzW8Qka0TiSZhSXtVbzu8CjKFyzh/2RbKLLpnOXLH34bYAFGgzMdMMq8V/fkk7UvNfSA Zx7DaInIh1Tih+5uS5GvK/1aTb1SPW9XoZMVb4fbi+/iABgeM9g7/ZShqfMxGVsFbNhX VXDeMYXcWe3ywq+s1S3NmnkMfxq3UsQvxeA/6uBQ0pPDsNg/4v8YIKEHehiaAUkIdhRb vK1RjO9ZxVolbFcRaiBtPAJ9KXep0e2Cb7kE8olHtLlKh9V2m0JU6P49wAIGL4tDlI90 1zog== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w5si20059737pfi.264.2019.07.26.02.58.11; Fri, 26 Jul 2019 02:58:27 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726124AbfGZJ5K (ORCPT + 99 others); Fri, 26 Jul 2019 05:57:10 -0400 Received: from szxga06-in.huawei.com ([45.249.212.32]:45098 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1725815AbfGZJ5K (ORCPT ); Fri, 26 Jul 2019 05:57:10 -0400 Received: from DGGEMS402-HUB.china.huawei.com (unknown [172.30.72.58]) by Forcepoint Email with ESMTP id A574AA3A8054CBAEA764; Fri, 26 Jul 2019 17:57:07 +0800 (CST) Received: from localhost.localdomain (10.67.165.24) by DGGEMS402-HUB.china.huawei.com (10.3.19.202) with Microsoft SMTP Server id 14.3.439.0; Fri, 26 Jul 2019 17:56:59 +0800 From: Yonglong Liu To: , CC: , , , , , Subject: [RFC] net: phy: read link status twice when phy_check_link_status() Date: Fri, 26 Jul 2019 17:53:51 +0800 Message-ID: <1564134831-24962-1-git-send-email-liuyonglong@huawei.com> X-Mailer: git-send-email 2.8.1 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.67.165.24] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org According to the datasheet of Marvell phy and Realtek phy, the copper link status should read twice, or it may get a fake link up status, and cause up->down->up at the first time when link up. This happens more oftem at Realtek phy. I add a fake status read, and can solve this problem. I also see that in genphy_update_link(), had delete the fake read in polling mode, so I don't know whether my solution is correct. Or provide a phydev->drv->read_status functions for the phy I used is more acceptable? Signed-off-by: Yonglong Liu --- drivers/net/phy/phy.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index ef7aa73..0c03edc 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -1,4 +1,7 @@ // SPDX-License-Identifier: GPL-2.0+ + err = phy_read_status(phydev); + if (err) + return err; /* Framework for configuring and reading PHY devices * Based on code in sungem_phy.c and gianfar_phy.c * @@ -525,6 +528,11 @@ static int phy_check_link_status(struct phy_device *phydev) WARN_ON(!mutex_is_locked(&phydev->lock)); + /* Do a fake read */ + err = phy_read(phydev, MII_BMSR); + if (err < 0) + return err; + err = phy_read_status(phydev); if (err) return err; -- 2.8.1