Commit 5a702856 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

Merge branch 'net-phy_port-sfp-modules-representation-and-phy_port-listing'

Maxime Chevallier says:

====================
net: phy_port: SFP modules representation and phy_port listing (part)
====================

Applying just the initial cleanup + fixes from the series.

Link: https://patch.msgid.link/20260205092317.755906-1-maxime.chevallier@bootlin.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 37a93dd5 4cebb26a
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -3499,6 +3499,9 @@ static int of_phy_ports(struct phy_device *phydev)

		port->parent_type = PHY_PORT_PHY;
		port->phy = phydev;

		linkmode_copy(port->supported, phydev->supported);

		err = phy_add_port(phydev, port);
		if (err) {
			phy_port_destroy(port);
+19 −14
Original line number Diff line number Diff line
@@ -53,7 +53,7 @@ struct phy_port *phy_of_parse_port(struct device_node *dn)
	enum ethtool_link_medium medium;
	struct phy_port *port;
	const char *med_str;
	u32 pairs = 0, mediums = 0;
	u32 pairs = 0;
	int ret;

	ret = fwnode_property_read_string(fwnode, "media", &med_str);
@@ -85,17 +85,12 @@ struct phy_port *phy_of_parse_port(struct device_node *dn)
		return ERR_PTR(-EINVAL);
	}

	mediums |= BIT(medium);

	if (!mediums)
		return ERR_PTR(-EINVAL);

	port = phy_port_alloc();
	if (!port)
		return ERR_PTR(-ENOMEM);

	port->pairs = pairs;
	port->mediums = mediums;
	port->mediums = BIT(medium);

	return port;
}
@@ -117,12 +112,6 @@ void phy_port_update_supported(struct phy_port *port)
	unsigned long mode;
	int i;

	for_each_set_bit(i, &port->mediums, __ETHTOOL_LINK_MEDIUM_LAST) {
		linkmode_zero(supported);
		phy_caps_medium_get_supported(supported, i, port->pairs);
		linkmode_or(port->supported, port->supported, supported);
	}

	/* If there's no pairs specified, we grab the default number of
	 * pairs as the max of the default pairs for each linkmode
	 */
@@ -132,6 +121,22 @@ void phy_port_update_supported(struct phy_port *port)
			port->pairs = max_t(int, port->pairs,
					    ethtool_linkmode_n_pairs(mode));

	for_each_set_bit(i, &port->mediums, __ETHTOOL_LINK_MEDIUM_LAST) {
		__ETHTOOL_DECLARE_LINK_MODE_MASK(med_supported) = {0};

		phy_caps_medium_get_supported(med_supported, i, port->pairs);
		linkmode_or(supported, supported, med_supported);
	}

	/* If port->supported is already populated, filter it out with the
	 * medium/pair support. Otherwise, let's just use this medium-based
	 * support as the port's supported list.
	 */
	if (linkmode_empty(port->supported))
		linkmode_copy(port->supported, supported);
	else
		linkmode_and(port->supported, supported, port->supported);

	/* Serdes ports supported through SFP may not have any medium set,
	 * as they will output PHY_INTERFACE_MODE_XXX modes. In that case, derive
	 * the supported list based on these interfaces