mirror of
https://github.com/torvalds/linux.git
synced 2026-06-02 19:43:40 +02:00
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: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
5a70285662
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -113,16 +108,10 @@ EXPORT_SYMBOL_GPL(phy_of_parse_port);
|
|||
*/
|
||||
void phy_port_update_supported(struct phy_port *port)
|
||||
{
|
||||
__ETHTOOL_DECLARE_LINK_MODE_MASK(supported) = { 0 };
|
||||
__ETHTOOL_DECLARE_LINK_MODE_MASK(supported) = {0};
|
||||
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
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user