Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp3079400pxj; Mon, 7 Jun 2021 01:30:20 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyBnum5VTHoB/g6wGOY1CUc3gMLnC0vVDA8s363pol8RAbCsV8TvKRXLTEgwZ8wCGm1ajeU X-Received: by 2002:aa7:dc42:: with SMTP id g2mr6445748edu.362.1623054620786; Mon, 07 Jun 2021 01:30:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623054620; cv=none; d=google.com; s=arc-20160816; b=B5Q2h0eYaJGJ+NBYC2qMMDMXL+vEhuNxhg7X9Csuogf90iQdAZAZ9l2GvYyzBt4z97 rQmIBBR+TZWyEB/s2De3kBMt1ySvK5sEkCCHejb2SymrlcA7usEm5vBaS0D9B8ExiOO6 PhZP1pQg7LxZL8n4l7AE2mFAqTWm2m7KtG0AMgB7OO60dHHgp5URewcMyezYEuteyooB 0e/UIonnsqtoz1iWf2nETQYaC2NYK6Fnj4t5myRPmMd5TwVyrKUMsUMYSEVHD1mYTw4V 7xwzLlh6meB1CmYO6bt74Qwd5Etl/Depj9elHlaWnkyEci3msowhSXf1GDmIokq+8bpM 92Vw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=cXqo+8sM26rpRWZRo7s3JaIzw2aiZUMGGJI+Wwg/rl8=; b=Rw1tP3vZbCWf/FvYdk4now+5nOXaYfVgc8ZOASBMqw8mcn1fAY+G9Xv5JkU53JnMKS Q4a056irxfF0s1CgWZtPeM90aUcAXiCYfzHy1agj8u+tkDJgNMBhqrBBeotlDPLMuDIi aN/NpJupxOxKQgN40Hq51F4VsHXeBrrzXLYepGI5h9bLmRUjozxBqpSGyccRNIupFvaD YmHissleusojoOEGS2jcjvaLM41F9kZHemlevYnwlFGac3wUBB0egHPTYuVD7crSdcIz bOkmS3kHdJ2yBR6kamkZNYYaBxVc8wSVTHFBRJbfPtS7Ox6pbxguO/rH5PbmtGomYZI+ ejtA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id m1si11979230ejj.214.2021.06.07.01.29.58; Mon, 07 Jun 2021 01:30:20 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230387AbhFGI3p (ORCPT + 99 others); Mon, 7 Jun 2021 04:29:45 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57284 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230372AbhFGI31 (ORCPT ); Mon, 7 Jun 2021 04:29:27 -0400 Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [IPv6:2001:67c:670:201:290:27ff:fe1d:cc33]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8EAAFC0613A3 for ; Mon, 7 Jun 2021 01:27:36 -0700 (PDT) Received: from dude.hi.pengutronix.de ([2001:67c:670:100:1d::7]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lqAbb-0004f8-Pg; Mon, 07 Jun 2021 10:27:31 +0200 Received: from ore by dude.hi.pengutronix.de with local (Exim 4.92) (envelope-from ) id 1lqAbb-0006ns-8C; Mon, 07 Jun 2021 10:27:31 +0200 From: Oleksij Rempel To: "David S. Miller" , Jakub Kicinski , Andrew Lunn , Heiner Kallweit , Russell King Cc: Oleksij Rempel , kernel@pengutronix.de, linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH net-next v2 3/8] net: usb/phy: asix: add support for ax88772A/C PHYs Date: Mon, 7 Jun 2021 10:27:22 +0200 Message-Id: <20210607082727.26045-4-o.rempel@pengutronix.de> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210607082727.26045-1-o.rempel@pengutronix.de> References: <20210607082727.26045-1-o.rempel@pengutronix.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SA-Exim-Connect-IP: 2001:67c:670:100:1d::7 X-SA-Exim-Mail-From: ore@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add support for build-in x88772A/C PHYs Signed-off-by: Oleksij Rempel Reviewed-by: Andrew Lunn --- drivers/net/phy/ax88796b.c | 74 +++++++++++++++++++++++++++++++++++++- drivers/net/usb/Kconfig | 1 + 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/drivers/net/phy/ax88796b.c b/drivers/net/phy/ax88796b.c index 79bf7ef1fcfd..457896337505 100644 --- a/drivers/net/phy/ax88796b.c +++ b/drivers/net/phy/ax88796b.c @@ -10,6 +10,8 @@ #include #include +#define PHY_ID_ASIX_AX88772A 0x003b1861 +#define PHY_ID_ASIX_AX88772C 0x003b1881 #define PHY_ID_ASIX_AX88796B 0x003b1841 MODULE_DESCRIPTION("Asix PHY driver"); @@ -39,7 +41,75 @@ static int asix_soft_reset(struct phy_device *phydev) return genphy_soft_reset(phydev); } -static struct phy_driver asix_driver[] = { { +/* AX88772A is not working properly with some old switches (NETGEAR EN 108TP): + * after autoneg is done and the link status is reported as active, the MII_LPA + * register is 0. This issue is not reproducible on AX88772C. + */ +static int asix_ax88772a_read_status(struct phy_device *phydev) +{ + int ret, val; + + ret = genphy_update_link(phydev); + if (ret) + return ret; + + if (!phydev->link) + return 0; + + /* If MII_LPA is 0, phy_resolve_aneg_linkmode() will fail to resolve + * linkmode so use MII_BMCR as default values. + */ + val = phy_read(phydev, MII_BMCR); + if (val < 0) + return val; + + if (val & BMCR_SPEED100) + phydev->speed = SPEED_100; + else + phydev->speed = SPEED_10; + + if (val & BMCR_FULLDPLX) + phydev->duplex = DUPLEX_FULL; + else + phydev->duplex = DUPLEX_HALF; + + ret = genphy_read_lpa(phydev); + if (ret < 0) + return ret; + + if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) + phy_resolve_aneg_linkmode(phydev); + + return 0; +} + +static void asix_ax88772a_link_change_notify(struct phy_device *phydev) +{ + /* Reset PHY, otherwise MII_LPA will provide outdated information. + * This issue is reproducible only with some link partner PHYs + */ + if (phydev->state == PHY_NOLINK && phydev->drv->soft_reset) + phydev->drv->soft_reset(phydev); +} + +static struct phy_driver asix_driver[] = { +{ + PHY_ID_MATCH_EXACT(PHY_ID_ASIX_AX88772A), + .name = "Asix Electronics AX88772A", + .flags = PHY_IS_INTERNAL, + .read_status = asix_ax88772a_read_status, + .suspend = genphy_suspend, + .resume = genphy_resume, + .soft_reset = asix_soft_reset, + .link_change_notify = asix_ax88772a_link_change_notify, +}, { + PHY_ID_MATCH_EXACT(PHY_ID_ASIX_AX88772C), + .name = "Asix Electronics AX88772C", + .flags = PHY_IS_INTERNAL, + .suspend = genphy_suspend, + .resume = genphy_resume, + .soft_reset = asix_soft_reset, +}, { .phy_id = PHY_ID_ASIX_AX88796B, .name = "Asix Electronics AX88796B", .phy_id_mask = 0xfffffff0, @@ -50,6 +120,8 @@ static struct phy_driver asix_driver[] = { { module_phy_driver(asix_driver); static struct mdio_device_id __maybe_unused asix_tbl[] = { + { PHY_ID_MATCH_EXACT(PHY_ID_ASIX_AX88772A) }, + { PHY_ID_MATCH_EXACT(PHY_ID_ASIX_AX88772C) }, { PHY_ID_ASIX_AX88796B, 0xfffffff0 }, { } }; diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig index 179308782888..6f7be47974f6 100644 --- a/drivers/net/usb/Kconfig +++ b/drivers/net/usb/Kconfig @@ -164,6 +164,7 @@ config USB_NET_AX8817X depends on USB_USBNET select CRC32 select PHYLIB + select AX88796B_PHY default y help This option adds support for ASIX AX88xxx based USB 2.0 -- 2.29.2