From patchwork Thu Aug 8 19:03:42 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heiner Kallweit X-Patchwork-Id: 1144145 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="tK40TN9k"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 464J4f2dScz9sDB for ; Fri, 9 Aug 2019 05:16:02 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2404255AbfHHTGH (ORCPT ); Thu, 8 Aug 2019 15:06:07 -0400 Received: from mail-wm1-f67.google.com ([209.85.128.67]:55685 "EHLO mail-wm1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2404145AbfHHTGF (ORCPT ); Thu, 8 Aug 2019 15:06:05 -0400 Received: by mail-wm1-f67.google.com with SMTP id f72so3391928wmf.5 for ; Thu, 08 Aug 2019 12:06:02 -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=+tMOhOmXls774N7m1qJZZAHzqMZCbx+XYZSvgO3LpiI=; b=tK40TN9kTgn74/4XKwvHqoabg336PFRmN1GtOHLcBCqtYdxdnjAACPDLAQG6uGtIFB 401ENH41z0XV7zIdGKgrYbXq5vSNj1HioEIDCsRAAWH+4/9y1O96jIQ3uMoo//CjSmw7 kZgibSzWKgwjcm1BAmwwXSKce9ykp8MCTyDxFNW0nS0g1WI2SaI9qGauSg+8qv3+X2lO mL6D4nfTYBDnou0zJWtVcFdmJ45M1u76fnevh/o0LEqJTQXcggUb0bO2EenvTYC67vpb NJ9tK7FtgFSFirgLFxJNqZsBolTG8GhAjduyixiBIv7sPGQd914i4iKYKnsM1CI9PIjn Q6cg== 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=+tMOhOmXls774N7m1qJZZAHzqMZCbx+XYZSvgO3LpiI=; b=PDI1AYG6UaNBGnGK41vbeNS97pLAw7ASVbYMBBmUbvX9Sxz+HNEewTjGhUYd0D8WiY QZkNFMjHy0gWun18p0Eq/w75IQJb0/6RpK5aBZVbpzCZhXElH4/SfJ8K0M/nLQFMNlUa 2zUCwXi26bPjPHC6hPdJD5rarTjGEUGI3jCfTfh2NyJVCdnRc1C5GXJ4s/Bm3zUs6cvF +gTcdiurWfdvtB3fgFJdlrLWJhYmDAya1HvzotlNDaUYXu9qDT1rp8U5VHr48NUgL1a8 tp+DRJygQLtxCwBHdVVtLpWswUOkB6cv1fpKRQukJvFPHFKgOA5Yl4GiRpUD7bOuuBJZ NctQ== X-Gm-Message-State: APjAAAVF40TcZ3cPENiD5xEB7uOQvnk+meVhyx8yUYZZIRKDFVyWj+Xr EXdB4Y2wJYGAYzj6Xjvxcr29Ofvw X-Google-Smtp-Source: APXvYqy+p1ukQwP2DFqLmAJ/X1ago0IlBchcnmF1oa85hdJMIveiisXRhU0NThmT+zXRKzLwz/Ncqg== X-Received: by 2002:a7b:c7d8:: with SMTP id z24mr6198406wmk.10.1565291161951; Thu, 08 Aug 2019 12:06:01 -0700 (PDT) Received: from ?IPv6:2003:ea:8f2f:3200:ec8a:8637:bf5f:7faf? (p200300EA8F2F3200EC8A8637BF5F7FAF.dip0.t-ipconnect.de. [2003:ea:8f2f:3200:ec8a:8637:bf5f:7faf]) by smtp.googlemail.com with ESMTPSA id c1sm212987943wrh.1.2019.08.08.12.06.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 08 Aug 2019 12:06:01 -0700 (PDT) Subject: [PATCH net-next 1/3] net: phy: prepare phylib to deal with PHY's extending Clause 22 From: Heiner Kallweit To: Andrew Lunn , Florian Fainelli , David Miller Cc: "netdev@vger.kernel.org" References: Message-ID: <214bedc0-4ae0-b15f-e03c-173f17527417@gmail.com> Date: Thu, 8 Aug 2019 21:03:42 +0200 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 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 The integrated PHY in 2.5Gbps chip RTL8125 is the first (known to me) PHY that uses standard Clause 22 for all modes up to 1Gbps and adds 2.5Gbps control using vendor-specific registers. To use phylib for the standard part little extensions are needed: - Move most of genphy_config_aneg to a new function __genphy_config_aneg that takes a parameter whether restarting auto-negotiation is needed (depending on whether content of vendor-specific advertisement register changed). - Don't clear phydev->lp_advertising in genphy_read_status so that we can set non-C22 mode flags before. Basically both changes mimic the behavior of the equivalent Clause 45 functions. Signed-off-by: Heiner Kallweit --- drivers/net/phy/phy_device.c | 35 +++++++++++++++-------------------- include/linux/phy.h | 8 +++++++- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index 7ddd91df9..bd7e7db8c 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c @@ -1571,11 +1571,9 @@ static int genphy_config_advert(struct phy_device *phydev) /* Only allow advertising what this PHY supports */ linkmode_and(phydev->advertising, phydev->advertising, phydev->supported); - if (!ethtool_convert_link_mode_to_legacy_u32(&advertise, - phydev->advertising)) - phydev_warn(phydev, "PHY advertising (%*pb) more modes than genphy supports, some modes not advertised.\n", - __ETHTOOL_LINK_MODE_MASK_NBITS, - phydev->advertising); + + ethtool_convert_link_mode_to_legacy_u32(&advertise, + phydev->advertising); /* Setup standard advertisement */ err = phy_modify_changed(phydev, MII_ADVERTISE, @@ -1681,18 +1679,20 @@ int genphy_restart_aneg(struct phy_device *phydev) EXPORT_SYMBOL(genphy_restart_aneg); /** - * genphy_config_aneg - restart auto-negotiation or write BMCR + * __genphy_config_aneg - restart auto-negotiation or write BMCR * @phydev: target phy_device struct + * @changed: whether autoneg is requested * * Description: If auto-negotiation is enabled, we configure the * advertising, and then restart auto-negotiation. If it is not * enabled, then we write the BMCR. */ -int genphy_config_aneg(struct phy_device *phydev) +int __genphy_config_aneg(struct phy_device *phydev, bool changed) { - int err, changed; + int err; - changed = genphy_config_eee_advert(phydev); + if (genphy_config_eee_advert(phydev)) + changed = true; if (AUTONEG_ENABLE != phydev->autoneg) return genphy_setup_forced(phydev); @@ -1700,10 +1700,10 @@ int genphy_config_aneg(struct phy_device *phydev) err = genphy_config_advert(phydev); if (err < 0) /* error */ return err; + else if (err) + changed = true; - changed |= err; - - if (changed == 0) { + if (!changed) { /* Advertisement hasn't changed, but maybe aneg was never on to * begin with? Or maybe phy was isolated? */ @@ -1713,18 +1713,15 @@ int genphy_config_aneg(struct phy_device *phydev) return ctl; if (!(ctl & BMCR_ANENABLE) || (ctl & BMCR_ISOLATE)) - changed = 1; /* do restart aneg */ + changed = true; /* do restart aneg */ } /* Only restart aneg if we are advertising something different * than we were before. */ - if (changed > 0) - return genphy_restart_aneg(phydev); - - return 0; + return changed ? genphy_restart_aneg(phydev) : 0; } -EXPORT_SYMBOL(genphy_config_aneg); +EXPORT_SYMBOL(__genphy_config_aneg); /** * genphy_aneg_done - return auto-negotiation status @@ -1811,8 +1808,6 @@ int genphy_read_status(struct phy_device *phydev) phydev->pause = 0; phydev->asym_pause = 0; - linkmode_zero(phydev->lp_advertising); - if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) { if (phydev->is_gigabit_capable) { lpagb = phy_read(phydev, MII_STAT1000); diff --git a/include/linux/phy.h b/include/linux/phy.h index 462b90b73..7117825ee 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -1069,7 +1069,7 @@ int genphy_read_abilities(struct phy_device *phydev); int genphy_setup_forced(struct phy_device *phydev); int genphy_restart_aneg(struct phy_device *phydev); int genphy_config_eee_advert(struct phy_device *phydev); -int genphy_config_aneg(struct phy_device *phydev); +int __genphy_config_aneg(struct phy_device *phydev, bool changed); int genphy_aneg_done(struct phy_device *phydev); int genphy_update_link(struct phy_device *phydev); int genphy_read_status(struct phy_device *phydev); @@ -1077,6 +1077,12 @@ int genphy_suspend(struct phy_device *phydev); int genphy_resume(struct phy_device *phydev); int genphy_loopback(struct phy_device *phydev, bool enable); int genphy_soft_reset(struct phy_device *phydev); + +static inline int genphy_config_aneg(struct phy_device *phydev) +{ + return __genphy_config_aneg(phydev, false); +} + static inline int genphy_no_soft_reset(struct phy_device *phydev) { return 0; From patchwork Thu Aug 8 19:04:35 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heiner Kallweit X-Patchwork-Id: 1144146 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="P79wy+BN"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 464J4j4p1sz9sDB for ; Fri, 9 Aug 2019 05:16:05 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2404228AbfHHTGG (ORCPT ); Thu, 8 Aug 2019 15:06:06 -0400 Received: from mail-wm1-f67.google.com ([209.85.128.67]:35553 "EHLO mail-wm1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2404196AbfHHTGF (ORCPT ); Thu, 8 Aug 2019 15:06:05 -0400 Received: by mail-wm1-f67.google.com with SMTP id l2so3450320wmg.0 for ; Thu, 08 Aug 2019 12:06:04 -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=pLjq7tcw8/4nBJQdbmQJ5+XoWodmMFM3mT3baREFlGA=; b=P79wy+BNdOM9RPF4YXITf3f6zpiKTEqenIBO6pAFYyd8qyYm5JGZm8ttM/5InmfXaC 61CYAf7gwyBiRlbyGXHWMSPImYY5Ob/+J36g3qpjjxvf8nG67BZMdaqpV62wVvPg6Wqn zfVFP8dwccHWVwBxHhBQ1H1Vlbq7iAd7uYCnLrZfQ/VUpJQhkwtL0DwXbEZLPy+vAYNq hpwzC/6iXTqVqlUMzlp75hCf14A+r0nF+Ixi9tVRwMKs3PlNDYQVnDQ5mQW9d8mKCJ7b cC7J6aNy1H/21LulqWfWlyHXRDy+FTRHdNdXv9TYxkvJGg1JmUAIPMBzdUIDDhBwOhPS OcDw== 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=pLjq7tcw8/4nBJQdbmQJ5+XoWodmMFM3mT3baREFlGA=; b=ing0HlosN19r5uV29rK9tQLtMcR0lsohUH7I0pq0TkTfisv3SoZnOny5O7xzoNBQpK JXnT6Xoy2YnGh9qTugLnBfWGI6oaWxCQ+BLbrcVpeeaqSFt8gHwzbW6pI7f8ykOuyeox ojCOTAFwwMfFYonfFUUl3SO2xgmo/R4E+u+b1r+IgWxG3v6IJhOWmEWJ7VlX604+RUTq GBLpymTTh5LHuW1If1hq2jF9tnnjW7lx43gJBwpJesC1Do99+tUhvkJfapnumOWA7FXt RRHxN55NOHFUR9B9RJhdw8YqMa29UleJ1g4zu4J2gkQ7EFIe4NFBMU4mtIyonqQ7Sq/8 IXgg== X-Gm-Message-State: APjAAAUQUqc05i6UrIDCjGJ/60hmLWpK64eGtudWNamFRb+r9hVAjtDE MX+TpHPMJrhEk6D2J7XXzaPKXv/n X-Google-Smtp-Source: APXvYqwYLGk1JTKylRnpExNrKhBcLDHeIUH+lTaoW1gDen/S6xsolKkJJWDTGHEnvEnjhzNr16lAjA== X-Received: by 2002:a7b:cb08:: with SMTP id u8mr5996833wmj.167.1565291163436; Thu, 08 Aug 2019 12:06:03 -0700 (PDT) Received: from ?IPv6:2003:ea:8f2f:3200:ec8a:8637:bf5f:7faf? (p200300EA8F2F3200EC8A8637BF5F7FAF.dip0.t-ipconnect.de. [2003:ea:8f2f:3200:ec8a:8637:bf5f:7faf]) by smtp.googlemail.com with ESMTPSA id w13sm12679575wre.44.2019.08.08.12.06.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 08 Aug 2019 12:06:02 -0700 (PDT) Subject: [PATCH net-next 2/3] net: phy: add phy_modify_paged_changed From: Heiner Kallweit To: Andrew Lunn , Florian Fainelli , David Miller Cc: "netdev@vger.kernel.org" References: Message-ID: Date: Thu, 8 Aug 2019 21:04:35 +0200 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 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 Add helper function phy_modify_paged_changed, behavior is the same as for phy_modify_changed. Signed-off-by: Heiner Kallweit --- drivers/net/phy/phy-core.c | 29 ++++++++++++++++++++++++----- include/linux/phy.h | 2 ++ 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/drivers/net/phy/phy-core.c b/drivers/net/phy/phy-core.c index 16667fbac..9ae3abb2d 100644 --- a/drivers/net/phy/phy-core.c +++ b/drivers/net/phy/phy-core.c @@ -783,24 +783,43 @@ int phy_write_paged(struct phy_device *phydev, int page, u32 regnum, u16 val) EXPORT_SYMBOL(phy_write_paged); /** - * phy_modify_paged() - Convenience function for modifying a paged register + * phy_modify_paged_changed() - Function for modifying a paged register * @phydev: a pointer to a &struct phy_device * @page: the page for the phy * @regnum: register number * @mask: bit mask of bits to clear * @set: bit mask of bits to set * - * Same rules as for phy_read() and phy_write(). + * Returns negative errno, 0 if there was no change, and 1 in case of change */ -int phy_modify_paged(struct phy_device *phydev, int page, u32 regnum, - u16 mask, u16 set) +int phy_modify_paged_changed(struct phy_device *phydev, int page, u32 regnum, + u16 mask, u16 set) { int ret = 0, oldpage; oldpage = phy_select_page(phydev, page); if (oldpage >= 0) - ret = __phy_modify(phydev, regnum, mask, set); + ret = __phy_modify_changed(phydev, regnum, mask, set); return phy_restore_page(phydev, oldpage, ret); } +EXPORT_SYMBOL(phy_modify_paged_changed); + +/** + * phy_modify_paged() - Convenience function for modifying a paged register + * @phydev: a pointer to a &struct phy_device + * @page: the page for the phy + * @regnum: register number + * @mask: bit mask of bits to clear + * @set: bit mask of bits to set + * + * Same rules as for phy_read() and phy_write(). + */ +int phy_modify_paged(struct phy_device *phydev, int page, u32 regnum, + u16 mask, u16 set) +{ + int ret = phy_modify_paged_changed(phydev, page, regnum, mask, set); + + return ret < 0 ? ret : 0; +} EXPORT_SYMBOL(phy_modify_paged); diff --git a/include/linux/phy.h b/include/linux/phy.h index 7117825ee..781f4810c 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -984,6 +984,8 @@ int phy_select_page(struct phy_device *phydev, int page); int phy_restore_page(struct phy_device *phydev, int oldpage, int ret); int phy_read_paged(struct phy_device *phydev, int page, u32 regnum); int phy_write_paged(struct phy_device *phydev, int page, u32 regnum, u16 val); +int phy_modify_paged_changed(struct phy_device *phydev, int page, u32 regnum, + u16 mask, u16 set); int phy_modify_paged(struct phy_device *phydev, int page, u32 regnum, u16 mask, u16 set); From patchwork Thu Aug 8 19:05:54 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heiner Kallweit X-Patchwork-Id: 1144143 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="muFjxN6W"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 464HsD6h9cz9sND for ; Fri, 9 Aug 2019 05:06:08 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2404265AbfHHTGH (ORCPT ); Thu, 8 Aug 2019 15:06:07 -0400 Received: from mail-wr1-f67.google.com ([209.85.221.67]:38690 "EHLO mail-wr1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2404197AbfHHTGG (ORCPT ); Thu, 8 Aug 2019 15:06:06 -0400 Received: by mail-wr1-f67.google.com with SMTP id g17so95960901wrr.5 for ; Thu, 08 Aug 2019 12:06:05 -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=GBMYizvJC2b+j4pdXuk0V8lP2jZyyyEusrUBzHW30hA=; b=muFjxN6WYeERjHDysM+2VEbFreJ0IqBslV6dM2drePaG3u5Gp4BSLHMYRPDtkssxjl MR+Y3yyDkoT8UXKPFn6lmesLlhNMujz+WY8q1US3TvCiQr6cXlPCwKAjy0qCQc1Qn1vl gKHWCVljUsZvnAb3okrWTeADMuQN6qM7YxCBBgkL4T6Upx2v81MVZ8YXVwubIHTdT7YP 0j/I79py+9N6mtULFwRUWp7rnwRRZHXtJUaQ29t7pceAShh7NqX4b7WTZCh+S/GLZE6/ 7J7EPGZG3qrn7b87SyPoje058HHq9JTJSkNvwBuGiWKlmOM5cFeWjxSAOeu2FCueyifz SW6A== 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=GBMYizvJC2b+j4pdXuk0V8lP2jZyyyEusrUBzHW30hA=; b=DJaOjeccs/CPHmN8QgJozjcpidhDR1aY7uSWZuQa88a10+t7QptFTgcrm7KEz3gcZP XY7aXAvB6i5InkxkHrlTEOTc8Q3fWGXRpQvXF1RV3yKJezGBnSzdD2ipP0VF2OCxvARV mmwNQ4T+X8GZDsx2Jvj+N0RU65WJPQMEvrT69Vp2tOKjYwHSSVO+sFNGTIfVew9W8240 qiqUrsgRZhebNPt0MGCY+oJQ8SQ08HaeBp92vYQrtl38nK6KQdyigizFF9F06qKI3HDv dMRdn8sBMzp8hJpHGHPuMw9274QDCp+Xhc7cofj8vTr1E5FnN5Rn6Vjvk2mlRdaC2FFH nZBw== X-Gm-Message-State: APjAAAWKyuT4jsMCUOsmw+6dt7arg2/ruGjbrOE/gX+von1KP7XS6yW6 j0ef7fF6KIadLVslUfYtg8soMr8b X-Google-Smtp-Source: APXvYqwS1UT+f3Qxp21qY8iU5fYY/L9ZsEW0sQ0OujXDuuDQxsCwCXzhk/pPOOAgn4+NUzK6GYj8OQ== X-Received: by 2002:a5d:50d1:: with SMTP id f17mr17705821wrt.124.1565291164844; Thu, 08 Aug 2019 12:06:04 -0700 (PDT) Received: from ?IPv6:2003:ea:8f2f:3200:ec8a:8637:bf5f:7faf? (p200300EA8F2F3200EC8A8637BF5F7FAF.dip0.t-ipconnect.de. [2003:ea:8f2f:3200:ec8a:8637:bf5f:7faf]) by smtp.googlemail.com with ESMTPSA id f134sm6394502wmg.20.2019.08.08.12.06.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 08 Aug 2019 12:06:04 -0700 (PDT) Subject: [PATCH net-next 3/3] net: phy: realtek: add support for the 2.5Gbps PHY in RTL8125 From: Heiner Kallweit To: Andrew Lunn , Florian Fainelli , David Miller Cc: "netdev@vger.kernel.org" References: Message-ID: <64769c3d-42b6-8eb8-26e4-722869408986@gmail.com> Date: Thu, 8 Aug 2019 21:05:54 +0200 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 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 This adds support for the integrated 2.5Gbps PHY in Realtek RTL8125. Advertisement of 2.5Gbps mode is done via a vendor-specific register. Same applies to reading NBase-T link partner advertisement. Unfortunately this 2.5Gbps PHY shares the PHY ID with the integrated 1Gbps PHY's in other Realtek network chips and so far no method is known to differentiate them. This means we can't autodetect 2.5Gbps support and the network driver has to add 2.5Gbps to the supported and advertised modes. Signed-off-by: Heiner Kallweit --- drivers/net/phy/realtek.c | 48 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/drivers/net/phy/realtek.c b/drivers/net/phy/realtek.c index a669945eb..35c981476 100644 --- a/drivers/net/phy/realtek.c +++ b/drivers/net/phy/realtek.c @@ -39,6 +39,11 @@ #define RTL8366RB_POWER_SAVE 0x15 #define RTL8366RB_POWER_SAVE_ON BIT(12) +#define RTL_ADV_2500FULL BIT(7) +#define RTL_LPADV_10000FULL BIT(11) +#define RTL_LPADV_5000FULL BIT(6) +#define RTL_LPADV_2500FULL BIT(5) + MODULE_DESCRIPTION("Realtek PHY driver"); MODULE_AUTHOR("Johnson Leung"); MODULE_LICENSE("GPL"); @@ -256,6 +261,47 @@ static int rtl8366rb_config_init(struct phy_device *phydev) return ret; } +static int rtlgen_config_aneg(struct phy_device *phydev) +{ + int ret = 0; + + if (linkmode_test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, + phydev->supported) && phydev->autoneg == AUTONEG_ENABLE) { + u16 adv2500 = 0; + + if (linkmode_test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, + phydev->advertising)) + adv2500 = RTL_ADV_2500FULL; + + ret = phy_modify_paged_changed(phydev, 0xa5d, 0x12, + RTL_ADV_2500FULL, adv2500); + if (ret < 0) + return ret; + } + + return __genphy_config_aneg(phydev, ret); +} + +static int rtlgen_read_status(struct phy_device *phydev) +{ + if (linkmode_test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, + phydev->supported) && phydev->autoneg == AUTONEG_ENABLE) { + int lpadv = phy_read_paged(phydev, 0xa5d, 0x13); + + if (lpadv < 0) + return lpadv; + + linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT, + phydev->lp_advertising, lpadv & RTL_LPADV_10000FULL); + linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT, + phydev->lp_advertising, lpadv & RTL_LPADV_5000FULL); + linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, + phydev->lp_advertising, lpadv & RTL_LPADV_2500FULL); + } + + return genphy_read_status(phydev); +} + static struct phy_driver realtek_drvs[] = { { PHY_ID_MATCH_EXACT(0x00008201), @@ -328,6 +374,8 @@ static struct phy_driver realtek_drvs[] = { }, { PHY_ID_MATCH_EXACT(0x001cc800), .name = "Generic Realtek PHY", + .config_aneg = rtlgen_config_aneg, + .read_status = rtlgen_read_status, .suspend = genphy_suspend, .resume = genphy_resume, .read_page = rtl821x_read_page,