forked from mirrors/linux
		
	net: phy: phy_caps: Move phy_speeds to phy_caps
Use the newly introduced link_capabilities array to derive the list of possible speeds when given a combination of linkmodes. As link_capabilities is indexed by speed, we don't have to iterate the whole phy_settings array. Signed-off-by: Maxime Chevallier <maxime.chevallier@bootlin.com> Link: https://patch.msgid.link/20250307173611.129125-4-maxime.chevallier@bootlin.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
		
							parent
							
								
									d8c838a57c
								
							
						
					
					
						commit
						8c8c4a8793
					
				
					 5 changed files with 38 additions and 18 deletions
				
			
		|  | @ -40,4 +40,7 @@ struct link_capabilities { | |||
| 
 | ||||
| int phy_caps_init(void); | ||||
| 
 | ||||
| size_t phy_caps_speeds(unsigned int *speeds, size_t size, | ||||
| 		       unsigned long *linkmodes); | ||||
| 
 | ||||
| #endif /* __PHY_CAPS_H */ | ||||
|  |  | |||
|  | @ -340,21 +340,6 @@ phy_lookup_setting(int speed, int duplex, const unsigned long *mask, bool exact) | |||
| } | ||||
| EXPORT_SYMBOL_GPL(phy_lookup_setting); | ||||
| 
 | ||||
| size_t phy_speeds(unsigned int *speeds, size_t size, | ||||
| 		  unsigned long *mask) | ||||
| { | ||||
| 	size_t count; | ||||
| 	int i; | ||||
| 
 | ||||
| 	for (i = 0, count = 0; i < ARRAY_SIZE(settings) && count < size; i++) | ||||
| 		if (settings[i].bit < __ETHTOOL_LINK_MODE_MASK_NBITS && | ||||
| 		    test_bit(settings[i].bit, mask) && | ||||
| 		    (count == 0 || speeds[count - 1] != settings[i].speed)) | ||||
| 			speeds[count++] = settings[i].speed; | ||||
| 
 | ||||
| 	return count; | ||||
| } | ||||
| 
 | ||||
| static void __set_linkmode_max_speed(u32 max_speed, unsigned long *addr) | ||||
| { | ||||
| 	const struct phy_setting *p; | ||||
|  |  | |||
|  | @ -37,6 +37,7 @@ | |||
| #include <net/sock.h> | ||||
| 
 | ||||
| #include "phylib-internal.h" | ||||
| #include "phy-caps.h" | ||||
| 
 | ||||
| #define PHY_STATE_TIME	HZ | ||||
| 
 | ||||
|  | @ -245,7 +246,7 @@ unsigned int phy_supported_speeds(struct phy_device *phy, | |||
| 				  unsigned int *speeds, | ||||
| 				  unsigned int size) | ||||
| { | ||||
| 	return phy_speeds(speeds, size, phy->supported); | ||||
| 	return phy_caps_speeds(speeds, size, phy->supported); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  |  | |||
|  | @ -57,6 +57,9 @@ static int speed_duplex_to_capa(int speed, unsigned int duplex) | |||
| 	return -EINVAL; | ||||
| } | ||||
| 
 | ||||
| #define for_each_link_caps_asc_speed(cap) \ | ||||
| 	for (cap = link_caps; cap < &link_caps[__LINK_CAPA_MAX]; cap++) | ||||
| 
 | ||||
| /**
 | ||||
|  * phy_caps_init() - Initializes the link_caps array from the link_mode_params. | ||||
|  * | ||||
|  | @ -88,3 +91,33 @@ int phy_caps_init(void) | |||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * phy_caps_speeds() - Fill an array of supported SPEED_* values for given modes | ||||
|  * @speeds: Output array to store the speeds list into | ||||
|  * @size: Size of the output array | ||||
|  * @linkmodes: Linkmodes to get the speeds from | ||||
|  * | ||||
|  * Fills the speeds array with all possible speeds that can be achieved with | ||||
|  * the specified linkmodes. | ||||
|  * | ||||
|  * Returns: The number of speeds filled into the array. If the input array isn't | ||||
|  *	    big enough to store all speeds, fill it as much as possible. | ||||
|  */ | ||||
| size_t phy_caps_speeds(unsigned int *speeds, size_t size, | ||||
| 		       unsigned long *linkmodes) | ||||
| { | ||||
| 	struct link_capabilities *lcap; | ||||
| 	size_t count = 0; | ||||
| 
 | ||||
| 	for_each_link_caps_asc_speed(lcap) { | ||||
| 		if (linkmode_intersects(lcap->linkmodes, linkmodes) && | ||||
| 		    (count == 0 || speeds[count - 1] != lcap->speed)) { | ||||
| 			speeds[count++] = lcap->speed; | ||||
| 			if (count >= size) | ||||
| 				break; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return count; | ||||
| } | ||||
|  |  | |||
|  | @ -1287,8 +1287,6 @@ struct phy_setting { | |||
| const struct phy_setting * | ||||
| phy_lookup_setting(int speed, int duplex, const unsigned long *mask, | ||||
| 		   bool exact); | ||||
| size_t phy_speeds(unsigned int *speeds, size_t size, | ||||
| 		  unsigned long *mask); | ||||
| 
 | ||||
| /**
 | ||||
|  * phy_is_started - Convenience function to check whether PHY is started | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Maxime Chevallier
						Maxime Chevallier