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. | 	 * in this switch shall be regarded as broken. | ||||||
| 	 */ | 	 */ | ||||||
| 	if (phydev->dev_flags & MICREL_NO_EEE) | 	if (phydev->dev_flags & MICREL_NO_EEE) | ||||||
| 		phydev->eee_broken_modes = -1; | 		linkmode_fill(phydev->eee_broken_modes); | ||||||
| 
 | 
 | ||||||
| 	return kszphy_config_init(phydev); | 	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, | static int genphy_c45_write_eee_adv(struct phy_device *phydev, | ||||||
| 				    unsigned long *adv) | 				    unsigned long *adv) | ||||||
| { | { | ||||||
|  | 	__ETHTOOL_DECLARE_LINK_MODE_MASK(tmp); | ||||||
| 	int val, changed = 0; | 	int val, changed = 0; | ||||||
| 
 | 
 | ||||||
| 	if (linkmode_intersects(phydev->supported_eee, PHY_EEE_CAP1_FEATURES)) { | 	linkmode_andnot(tmp, adv, phydev->eee_broken_modes); | ||||||
| 		val = linkmode_to_mii_eee_cap1_t(adv); |  | ||||||
| 
 | 
 | ||||||
| 		/* In eee_broken_modes are stored MDIO_AN_EEE_ADV specific raw
 | 	if (linkmode_intersects(phydev->supported_eee, PHY_EEE_CAP1_FEATURES)) { | ||||||
| 		 * register values. | 		val = linkmode_to_mii_eee_cap1_t(tmp); | ||||||
| 		 */ |  | ||||||
| 		val &= ~phydev->eee_broken_modes; |  | ||||||
| 
 | 
 | ||||||
| 		/* IEEE 802.3-2018 45.2.7.13 EEE advertisement 1
 | 		/* IEEE 802.3-2018 45.2.7.13 EEE advertisement 1
 | ||||||
| 		 * (Register 7.60) | 		 * (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)) { | 	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
 | 		/* IEEE 802.3-2022 45.2.7.16 EEE advertisement 2
 | ||||||
| 		 * (Register 7.62) | 		 * (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) | void of_set_phy_eee_broken(struct phy_device *phydev) | ||||||
| { | { | ||||||
| 	struct device_node *node = phydev->mdio.dev.of_node; | 	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; | 		return; | ||||||
| 
 | 
 | ||||||
| 	if (!node) | 	linkmode_zero(modes); | ||||||
| 		return; |  | ||||||
| 
 | 
 | ||||||
| 	if (of_property_read_bool(node, "eee-broken-100tx")) | 	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")) | 	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")) | 	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")) | 	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")) | 	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")) | 	if (of_property_read_bool(node, "eee-broken-10gkr")) | ||||||
| 		broken |= MDIO_EEE_10GKR; | 		linkmode_set_bit(ETHTOOL_LINK_MODE_10000baseKR_Full_BIT, modes); | ||||||
| 
 |  | ||||||
| 	phydev->eee_broken_modes = broken; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  |  | ||||||
|  | @ -721,16 +721,15 @@ struct phy_device { | ||||||
| 	/* used for eee validation and configuration*/ | 	/* used for eee validation and configuration*/ | ||||||
| 	__ETHTOOL_DECLARE_LINK_MODE_MASK(supported_eee); | 	__ETHTOOL_DECLARE_LINK_MODE_MASK(supported_eee); | ||||||
| 	__ETHTOOL_DECLARE_LINK_MODE_MASK(advertising_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 eee_enabled; | ||||||
|  | 	bool enable_tx_lpi; | ||||||
|  | 	struct eee_config eee_cfg; | ||||||
| 
 | 
 | ||||||
| 	/* Host supported PHY interface types. Should be ignored if empty. */ | 	/* Host supported PHY interface types. Should be ignored if empty. */ | ||||||
| 	DECLARE_PHY_INTERFACE_MASK(host_interfaces); | 	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 | #ifdef CONFIG_LED_TRIGGER_PHY | ||||||
| 	struct phy_led_trigger *phy_led_triggers; | 	struct phy_led_trigger *phy_led_triggers; | ||||||
| 	unsigned int phy_num_led_triggers; | 	unsigned int phy_num_led_triggers; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Heiner Kallweit
						Heiner Kallweit