From nobody Fri Dec 19 19:16:24 2025 Received: from relay1-d.mail.gandi.net (relay1-d.mail.gandi.net [217.70.183.193]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 381D0207A3A; Fri, 6 Jun 2025 09:44:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.193 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749203085; cv=none; b=OPUbe08bDn9evVN/dmeKFmBwK+WjrPSpca0zVzW1lKtbhe2BCQ1ze6MxaYQ7GuDTS5v7m4MtKjxw+N15oULFRfhcCbpwbHeGtM4WVewopODN+gw9xKf/Tuufm8XHK47dfUmVNmR9YkODQPTClqrYrfRMEpDr0EYUGnFZoaD6vFM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749203085; c=relaxed/simple; bh=9qfH4e4DKeBNWo1tN5k/hRYd/YM+kbmrEZZ6Hb/KOZs=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=V1/qU3PHGEYXGSxASr7gWjET1ewqMCuq1SXaeV3acI6B5bOKKbazv3WnGB32AvU4Rk73SKsCcObM3uytNXcRttYkxsFvnnmP0kkjrZ4Llc5MD1+EfwXAlqLzaheMJgJDp2XbIujRKkt2Jv0cVWaLEpICzSrOvtPO2+9FjkdPf1s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=Sl5v8Ary; arc=none smtp.client-ip=217.70.183.193 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="Sl5v8Ary" Received: by mail.gandi.net (Postfix) with ESMTPSA id 03E9542E77; Fri, 6 Jun 2025 09:44:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1749203081; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=eTDZAF5gNbxnNxj+lsJqqE9vfgSs2erOnFdEb7FBGt0=; b=Sl5v8AryVjAS3ndFPZhBmcx9hFXUMFuUCZ34zswapUR19vQWw3kr8zlh28JFfquff+41aw OqYBYRq7X+WjlTW/mT8YlsWcrPDu96IEpKTBfef0F+3XJMLpqiOdDjTkWRFKtOpr+MCZaT qPamB/Oik2zueznSG0VIz9HIfJr16PuUDvoY/dBY6bAXfn1GGTASm2+73unuCYAqEqNveb nUjHbCy3+bla4Dm9H0cdBYCPC37gB6WvwFEBUJ63FBdMdjQ7ntAdqfTQH47gG1ixy2uSu0 2nK3Klxd9rMka1CHvRJf5SyrC7AXENylNnsiqB+EeaHWM24GhLOesCU+cFZq0A== From: Maxime Chevallier To: davem@davemloft.net, Andrew Lunn , Jakub Kicinski , Eric Dumazet , Paolo Abeni Cc: Maxime Chevallier , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, thomas.petazzoni@bootlin.com, Simon Horman , Heiner Kallweit , Russell King , Christophe Leroy , Herve Codina , Romain Gantois , Jijie Shao , Larysa Zaremba Subject: [PATCH net v2] net: phy: phy_caps: Don't skip better duplex macth on non-exact match Date: Fri, 6 Jun 2025 11:43:20 +0200 Message-ID: <20250606094321.483602-1-maxime.chevallier@bootlin.com> X-Mailer: git-send-email 2.49.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-GND-State: clean X-GND-Score: -100 X-GND-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtddugdegleduucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuifetpfffkfdpucggtfgfnhhsuhgsshgtrhhisggvnecuuegrihhlohhuthemuceftddunecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenucfjughrpefhvfevufffkffoggfgsedtkeertdertddtnecuhfhrohhmpeforgigihhmvgcuvehhvghvrghllhhivghruceomhgrgihimhgvrdgthhgvvhgrlhhlihgvrhessghoohhtlhhinhdrtghomheqnecuggftrfgrthhtvghrnhepjefhleeihefgffeiffdtffeivdehfeetheekudekgfetffetveffueeujeeitdevnecuffhomhgrihhnpehkvghrnhgvlhdrohhrghenucfkphepvdduvddruddthedrudehtddrvdehvdenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepihhnvghtpedvuddvrddutdehrdduhedtrddvhedvpdhhvghlohepfhgvughorhgrrddrpdhmrghilhhfrhhomhepmhgrgihimhgvrdgthhgvvhgrlhhlihgvrhessghoohhtlhhinhdrtghomhdpnhgspghrtghpthhtohepudejpdhrtghpthhtohepuggrvhgvmhesuggrvhgvmhhlohhfthdrnhgvthdprhgtphhtthhopegrnhgurhgvfieslhhunhhnrdgthhdprhgtphhtthhopehkuhgsrgeskhgvrhhnvghlrdhorhhgpdhrtghpthhtohepvgguuhhmrgiivghtsehgohhoghhlvgdrtghomhdprhgtphhtthhopehprggsvghnihesrhgvughhrghtr dgtohhmpdhrtghpthhtohepmhgrgihimhgvrdgthhgvvhgrlhhlihgvrhessghoohhtlhhinhdrtghomhdprhgtphhtthhopehnvghtuggvvhesvhhgvghrrdhkvghrnhgvlhdrohhrghdprhgtphhtthhopehlihhnuhigqdhkvghrnhgvlhesvhhgvghrrdhkvghrnhgvlhdrohhrgh X-GND-Sasl: maxime.chevallier@bootlin.com Content-Type: text/plain; charset="utf-8" When performing a non-exact phy_caps lookup, we are looking for a supported mode that matches as closely as possible the passed speed/duplex. Blamed patch broke that logic by returning a match too early in case the caller asks for half-duplex, as a full-duplex linkmode may match first, and returned as a non-exact match without even trying to mach on half-duplex modes. Reported-by: Jijie Shao Closes: https://lore.kernel.org/netdev/20250603102500.4ec743cf@fedora/T/#m2= 2ed60ca635c67dc7d9cbb47e8995b2beb5c1576 Tested-by: Jijie Shao Reviewed-by: Larysa Zaremba Fixes: fc81e257d19f ("net: phy: phy_caps: Allow looking-up link caps based = on speed and duplex") Signed-off-by: Maxime Chevallier --- drivers/net/phy/phy_caps.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/drivers/net/phy/phy_caps.c b/drivers/net/phy/phy_caps.c index 703321689726..38417e288611 100644 --- a/drivers/net/phy/phy_caps.c +++ b/drivers/net/phy/phy_caps.c @@ -188,6 +188,9 @@ phy_caps_lookup_by_linkmode_rev(const unsigned long *li= nkmodes, bool fdx_only) * When @exact is not set, we return either an exact match, or matching ca= pabilities * at lower speed, or the lowest matching speed, or NULL. * + * Non-exact matches will try to return an exact speed and duplex match, b= ut may + * return matching capabilities with same speed but a different duplex. + * * Returns: a matched link_capabilities according to the above process, NU= LL * otherwise. */ @@ -195,7 +198,7 @@ const struct link_capabilities * phy_caps_lookup(int speed, unsigned int duplex, const unsigned long *suppo= rted, bool exact) { - const struct link_capabilities *lcap, *last =3D NULL; + const struct link_capabilities *lcap, *match =3D NULL, *last =3D NULL; =20 for_each_link_caps_desc_speed(lcap) { if (linkmode_intersects(lcap->linkmodes, supported)) { @@ -204,16 +207,19 @@ phy_caps_lookup(int speed, unsigned int duplex, const= unsigned long *supported, if (lcap->speed =3D=3D speed && lcap->duplex =3D=3D duplex) { return lcap; } else if (!exact) { - if (lcap->speed <=3D speed) - return lcap; + if (!match && lcap->speed <=3D speed) + match =3D lcap; + + if (lcap->speed < speed) + break; } } } =20 - if (!exact) - return last; + if (!match && !exact) + match =3D last; =20 - return NULL; + return match; } EXPORT_SYMBOL_GPL(phy_caps_lookup); =20 --=20 2.49.0