forked from mirrors/linux
		
	net: phy: convert eee_broken_modes to a linkmode bitmap
eee_broken_modes has a eee_cap1 register layout currently. This doen't allow to flag e.g. 2.5Gbps or 5Gbps BaseT EEE as broken. To overcome this limitation switch eee_broken_modes to a linkmode bitmap. Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> Link: https://patch.msgid.link/dfe0c9ff-84b0-4328-86d7-e917ebc084a1@gmail.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
		
							parent
							
								
									a79993b5fc
								
							
						
					
					
						commit
						721aa69e70
					
				
					 4 changed files with 19 additions and 25 deletions
				
			
		|  | @ -2004,7 +2004,7 @@ static int ksz9477_config_init(struct phy_device *phydev) | |||
| 	 * in this switch shall be regarded as broken. | ||||
| 	 */ | ||||
| 	if (phydev->dev_flags & MICREL_NO_EEE) | ||||
| 		phydev->eee_broken_modes = -1; | ||||
| 		linkmode_fill(phydev->eee_broken_modes); | ||||
| 
 | ||||
| 	return kszphy_config_init(phydev); | ||||
| } | ||||
|  |  | |||
|  | @ -683,15 +683,13 @@ EXPORT_SYMBOL_GPL(genphy_c45_read_mdix); | |||
| static int genphy_c45_write_eee_adv(struct phy_device *phydev, | ||||
| 				    unsigned long *adv) | ||||
| { | ||||
| 	__ETHTOOL_DECLARE_LINK_MODE_MASK(tmp); | ||||
| 	int val, changed = 0; | ||||
| 
 | ||||
| 	if (linkmode_intersects(phydev->supported_eee, PHY_EEE_CAP1_FEATURES)) { | ||||
| 		val = linkmode_to_mii_eee_cap1_t(adv); | ||||
| 	linkmode_andnot(tmp, adv, phydev->eee_broken_modes); | ||||
| 
 | ||||
| 		/* In eee_broken_modes are stored MDIO_AN_EEE_ADV specific raw
 | ||||
| 		 * register values. | ||||
| 		 */ | ||||
| 		val &= ~phydev->eee_broken_modes; | ||||
| 	if (linkmode_intersects(phydev->supported_eee, PHY_EEE_CAP1_FEATURES)) { | ||||
| 		val = linkmode_to_mii_eee_cap1_t(tmp); | ||||
| 
 | ||||
| 		/* IEEE 802.3-2018 45.2.7.13 EEE advertisement 1
 | ||||
| 		 * (Register 7.60) | ||||
|  | @ -709,7 +707,7 @@ static int genphy_c45_write_eee_adv(struct phy_device *phydev, | |||
| 	} | ||||
| 
 | ||||
| 	if (linkmode_intersects(phydev->supported_eee, PHY_EEE_CAP2_FEATURES)) { | ||||
| 		val = linkmode_to_mii_eee_cap2_t(adv); | ||||
| 		val = linkmode_to_mii_eee_cap2_t(tmp); | ||||
| 
 | ||||
| 		/* IEEE 802.3-2022 45.2.7.16 EEE advertisement 2
 | ||||
| 		 * (Register 7.62) | ||||
|  |  | |||
|  | @ -388,28 +388,25 @@ void of_set_phy_supported(struct phy_device *phydev) | |||
| void of_set_phy_eee_broken(struct phy_device *phydev) | ||||
| { | ||||
| 	struct device_node *node = phydev->mdio.dev.of_node; | ||||
| 	u32 broken = 0; | ||||
| 	unsigned long *modes = phydev->eee_broken_modes; | ||||
| 
 | ||||
| 	if (!IS_ENABLED(CONFIG_OF_MDIO)) | ||||
| 	if (!IS_ENABLED(CONFIG_OF_MDIO) || !node) | ||||
| 		return; | ||||
| 
 | ||||
| 	if (!node) | ||||
| 		return; | ||||
| 	linkmode_zero(modes); | ||||
| 
 | ||||
| 	if (of_property_read_bool(node, "eee-broken-100tx")) | ||||
| 		broken |= MDIO_EEE_100TX; | ||||
| 		linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, modes); | ||||
| 	if (of_property_read_bool(node, "eee-broken-1000t")) | ||||
| 		broken |= MDIO_EEE_1000T; | ||||
| 		linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, modes); | ||||
| 	if (of_property_read_bool(node, "eee-broken-10gt")) | ||||
| 		broken |= MDIO_EEE_10GT; | ||||
| 		linkmode_set_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT, modes); | ||||
| 	if (of_property_read_bool(node, "eee-broken-1000kx")) | ||||
| 		broken |= MDIO_EEE_1000KX; | ||||
| 		linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseKX_Full_BIT, modes); | ||||
| 	if (of_property_read_bool(node, "eee-broken-10gkx4")) | ||||
| 		broken |= MDIO_EEE_10GKX4; | ||||
| 		linkmode_set_bit(ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT, modes); | ||||
| 	if (of_property_read_bool(node, "eee-broken-10gkr")) | ||||
| 		broken |= MDIO_EEE_10GKR; | ||||
| 
 | ||||
| 	phydev->eee_broken_modes = broken; | ||||
| 		linkmode_set_bit(ETHTOOL_LINK_MODE_10000baseKR_Full_BIT, modes); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  |  | |||
|  | @ -721,16 +721,15 @@ struct phy_device { | |||
| 	/* used for eee validation and configuration*/ | ||||
| 	__ETHTOOL_DECLARE_LINK_MODE_MASK(supported_eee); | ||||
| 	__ETHTOOL_DECLARE_LINK_MODE_MASK(advertising_eee); | ||||
| 	/* Energy efficient ethernet modes which should be prohibited */ | ||||
| 	__ETHTOOL_DECLARE_LINK_MODE_MASK(eee_broken_modes); | ||||
| 	bool eee_enabled; | ||||
| 	bool enable_tx_lpi; | ||||
| 	struct eee_config eee_cfg; | ||||
| 
 | ||||
| 	/* Host supported PHY interface types. Should be ignored if empty. */ | ||||
| 	DECLARE_PHY_INTERFACE_MASK(host_interfaces); | ||||
| 
 | ||||
| 	/* Energy efficient ethernet modes which should be prohibited */ | ||||
| 	u32 eee_broken_modes; | ||||
| 	bool enable_tx_lpi; | ||||
| 	struct eee_config eee_cfg; | ||||
| 
 | ||||
| #ifdef CONFIG_LED_TRIGGER_PHY | ||||
| 	struct phy_led_trigger *phy_led_triggers; | ||||
| 	unsigned int phy_num_led_triggers; | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Heiner Kallweit
						Heiner Kallweit