From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f49.google.com (mail-wm1-f49.google.com [209.85.128.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CC60E39B4A3 for ; Mon, 1 Jun 2026 10:53:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.49 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780311237; cv=none; b=Sv/ct1hOV121ANQdHge6OlGmH8HCGr07WTEJO7Sb1PQv+ELiNMBS9gJ4my0ei4Mku+r5t4prncjkn3KG+hnKYvmWVyPL31iYdkXgoSMMuQ2wuivD0vFLaFtqSwTZlLPW4+iLK6FOh6kzM0GvlVWwdBj0G3uuuvStU0T4sUqIAwo= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780311237; c=relaxed/simple; bh=YamYR0gB5YpvzrPrfHuKhWssK/k1gQlhxfDHYVzOSrw=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qTn/LtdUWqccaHCLoPVf0NAvaRs4NU+TJGbq0c/ppW68gn8gZ88Fv3nCBBN5rUcd+W1UAYdoFlkyLMUy3D1UvpdQHN0ffdvtDuLwSDMOnIskDbsxfWd8l57CQNraZjCN9HMdZ+Dn4v7DqmW7zn93GVHZi5KxTkUvrgzSm4T8nFE= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=IHhniPQ8; arc=none smtp.client-ip=209.85.128.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="IHhniPQ8" Received: by mail-wm1-f49.google.com with SMTP id 5b1f17b1804b1-49041fb8c23so75859645e9.0 for ; Mon, 01 Jun 2026 03:53:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1780311233; x=1780916033; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=a/VphDQS+fwFrSctDzTxKBEr+9CTd6YQLukQQPgTJa4=; b=IHhniPQ8p98FjG4gozuDqUMzHlesNwlf8D3AskSPDhgXIKnnYFsrVAAdaxAmZ249F8 q/ZG91DiTsyzr6aGYq4uwWm6vKWN+ZC6qb6m6HFPg9+ZRaXRsQfovr5uQytj4I60tJRX Ao2kfO7idTiRNjo07bJ8hez7/8TaUmvDoH1tvuZslsyLnlMm+URaHl4vFHEvemLxAjoK MIjf6qj+AWN94YydxgGthj4hS9pvR+81I4J1YDZX5b+SeDatNjdDu5yxb4Keh1c62dXy ClI5XgsNE0qgQavXh0TvX3DyNO/OdQAp8VXAmV2LoLDQ8YSPpbRt2COWvtmMnXrcnEoG PuuA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780311233; x=1780916033; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=a/VphDQS+fwFrSctDzTxKBEr+9CTd6YQLukQQPgTJa4=; b=L9IQJKjFSgt5eH3lFrxo0BoXbTgpNCjlxh2JIkCN882mtB+VEHWzJ8sNxrOUUEutgR 9y+I2MAbLyJGTuN1kM5kdW0LQD4wqB/C8F4gpnvzOcPseSaeUHqSxrubtY4oZyfFABJ8 3WkX1mzIflKffO1PCzkXFTGDzFHaE/XYgjRinXD851kqNVOIww0rLBpSCuHsLZlGj+Gd Gkk6MLUNWLcUv0HbR2/8DhW50HtkF/xGgPMgfPBy4vprBZclpJIbl4PDglBTz4n+f4Wu YjyDPttg/UE+bDX/0p/31oXSNvqM2gkwlZ22cxm/3YVm06FBnjS20KXtQ4yoMT3GSdR0 ve/A== X-Forwarded-Encrypted: i=1; AFNElJ9CqDcK86QYOi4oaMeBxT+o3Kg5oTQ/v2lQO+vf3g4ceL1sgbzoDUL947iEB6ulaCAfslqCsTjMdPshwq4=@vger.kernel.org X-Gm-Message-State: AOJu0YzkKiHFdLF9W5KRwbXaxtkqYHNZp6DfMPtsLSMPK0VddStml8xF wND45TvsXGAvEd9sZ7CIETX5d1GK2yyB7xUoOpma6NvU5dgdAsr4W90r X-Gm-Gg: Acq92OGw6Gckz4AF/oJOufObJGNy4tsdhopTQv37X0Nv8DrYHBIhbH3n+RG87n2ZvEh Uxd55qkdErQWKLCRr0rDoEBJQnB2lwNPEo7AlOy0XSbQZfcUC/JoltNw91ti2fqj5BlXTEQRK4m 3HL1b+mplGfUZojEN7qkcQGDCNExyMOJjn+Cq82fpVEBABcoQK+H6Jm1oZuNrwtDzP+zrcMhEZj 5Uw6fUMKGJ03MM/7Ky2GHld3XubiVmy7OtKtQ+Ff+/5KWL5hg+8QWhxKnVnWz17LGjaDbCFAjp7 IXOnFe5VzIWSMWgoncK5mAiTudioeLvHIizgB2XYQLukCt1MnRDz08wAi3T0yFEISWofN5jgaL0 7Xg/qJr+UZuPaxaJoNkYO804SXwpyUl0wRqaYluY6LpPct3QKuB+Lm3q+T2at2v4Jr+JQqqBGfp KY6pl5rKCCRNyda/33L9rgU0rLDjgp1Bfo7U1wfCUsflBvEv0v1jPLeNVX0mH3NI45r8hnEUpLQ jLJFVM= X-Received: by 2002:a05:600c:2242:b0:490:5321:2466 with SMTP id 5b1f17b1804b1-490a2941ea3mr122733095e9.20.1780311233043; Mon, 01 Jun 2026 03:53:53 -0700 (PDT) Received: from Ansuel-XPS24 (host-79-42-252-49.retail.telecomitalia.it. [79.42.252.49]) by smtp.googlemail.com with ESMTPSA id 5b1f17b1804b1-4909c967c77sm257319895e9.1.2026.06.01.03.53.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Jun 2026 03:53:52 -0700 (PDT) From: Christian Marangi To: Christian Marangi , Andrew Lunn , Heiner Kallweit , Russell King , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH net 2/3] net: phy: as21xxx: fix read_status speed handling Date: Mon, 1 Jun 2026 12:53:36 +0200 Message-ID: <20260601105342.28865-2-ansuelsmth@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260601105342.28865-1-ansuelsmth@gmail.com> References: <20260601105342.28865-1-ansuelsmth@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit With further test with 2.5G NIC it was discovered that phy_resolve_aneg_linkmode is not enough to detect speed higher that 1G when autoneg is enabled. Also in the switch case there is a typo where the speed mask is AND with VEND1_SPEED_STATUS instead of the correct mask VEND1_SPEED_MASK. Rework the read_status code to always read the speed from the vendor register and parse the generic bit only for the pause frame. Fixes: 830877d89edc ("net: phy: Add support for Aeonsemi AS21xxx PHYs") Signed-off-by: Christian Marangi --- drivers/net/phy/as21xxx.c | 96 +++++++++++++++++++++------------------ 1 file changed, 53 insertions(+), 43 deletions(-) diff --git a/drivers/net/phy/as21xxx.c b/drivers/net/phy/as21xxx.c index 0db82da8dbdf..97ca37c6929f 100644 --- a/drivers/net/phy/as21xxx.c +++ b/drivers/net/phy/as21xxx.c @@ -671,7 +671,7 @@ static int as21xxx_read_link(struct phy_device *phydev, int *bmcr) static int as21xxx_read_c22_lpa(struct phy_device *phydev) { - int lpagb; + int lpagb, lpa; /* MII_STAT1000 are only filled in the mapped C22 * in C45, use that to fill lpagb values and check. @@ -698,12 +698,20 @@ static int as21xxx_read_c22_lpa(struct phy_device *phydev) mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, lpagb); + lpa = phy_read_mmd(phydev, MDIO_MMD_AN, + AS21XXX_MDIO_AN_C22 + MII_LPA); + if (lpa < 0) + return lpa; + + mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, lpa); + return 0; } static int as21xxx_read_status(struct phy_device *phydev) { int bmcr, old_link = phydev->link; + int speed; int ret; ret = as21xxx_read_link(phydev, &bmcr); @@ -720,58 +728,60 @@ static int as21xxx_read_status(struct phy_device *phydev) phydev->asym_pause = 0; if (phydev->autoneg == AUTONEG_ENABLE) { - ret = genphy_c45_read_lpa(phydev); - if (ret) - return ret; + if (!phydev->autoneg_complete) { + mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, + 0); + mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, 0); + return 0; + } ret = as21xxx_read_c22_lpa(phydev); if (ret) return ret; - - phy_resolve_aneg_linkmode(phydev); } else { - int speed; - linkmode_zero(phydev->lp_advertising); + } - speed = phy_read_mmd(phydev, MDIO_MMD_VEND1, - VEND1_SPEED_STATUS); - if (speed < 0) - return speed; - - switch (speed & VEND1_SPEED_STATUS) { - case VEND1_SPEED_10000: - phydev->speed = SPEED_10000; - phydev->duplex = DUPLEX_FULL; - break; - case VEND1_SPEED_5000: - phydev->speed = SPEED_5000; - phydev->duplex = DUPLEX_FULL; - break; - case VEND1_SPEED_2500: - phydev->speed = SPEED_2500; - phydev->duplex = DUPLEX_FULL; - break; - case VEND1_SPEED_1000: - phydev->speed = SPEED_1000; - if (bmcr & BMCR_FULLDPLX) - phydev->duplex = DUPLEX_FULL; - else - phydev->duplex = DUPLEX_HALF; - break; - case VEND1_SPEED_100: - phydev->speed = SPEED_100; + speed = phy_read_mmd(phydev, MDIO_MMD_VEND1, + VEND1_SPEED_STATUS); + if (speed < 0) + return speed; + + switch (speed & VEND1_SPEED_MASK) { + case VEND1_SPEED_10000: + phydev->speed = SPEED_10000; + phydev->duplex = DUPLEX_FULL; + break; + case VEND1_SPEED_5000: + phydev->speed = SPEED_5000; + phydev->duplex = DUPLEX_FULL; + break; + case VEND1_SPEED_2500: + phydev->speed = SPEED_2500; + phydev->duplex = DUPLEX_FULL; + break; + case VEND1_SPEED_1000: + phydev->speed = SPEED_1000; + if (bmcr & BMCR_FULLDPLX) phydev->duplex = DUPLEX_FULL; - break; - case VEND1_SPEED_10: - phydev->speed = SPEED_10; - phydev->duplex = DUPLEX_FULL; - break; - default: - return -EINVAL; - } + else + phydev->duplex = DUPLEX_HALF; + break; + case VEND1_SPEED_100: + phydev->speed = SPEED_100; + phydev->duplex = DUPLEX_FULL; + break; + case VEND1_SPEED_10: + phydev->speed = SPEED_10; + phydev->duplex = DUPLEX_FULL; + break; + default: + return -EINVAL; } + if (phydev->autoneg == AUTONEG_ENABLE) + phy_resolve_aneg_pause(phydev); + return 0; } -- 2.53.0