Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1f9127ca authored by Zach Brown's avatar Zach Brown Committed by David S. Miller
Browse files

net: phy: Create phy_supported_speeds function which lists speeds currently...


net: phy: Create phy_supported_speeds function which lists speeds currently supported by a phydevice

phy_supported_speeds provides a means to get a list of all the speeds a
phy device currently supports.

Signed-off-by: default avatarZach Brown <zach.brown@ni.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 61a17965
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -260,6 +260,41 @@ static inline unsigned int phy_find_valid(unsigned int idx, u32 features)
	return idx < MAX_NUM_SETTINGS ? idx : MAX_NUM_SETTINGS - 1;
}

/**
 * phy_supported_speeds - return all speeds currently supported by a phy device
 * @phy: The phy device to return supported speeds of.
 * @speeds: buffer to store supported speeds in.
 * @size:   size of speeds buffer.
 *
 * Description: Returns the number of supported speeds, and fills the speeds
 * buffer with the supported speeds. If speeds buffer is too small to contain
 * all currently supported speeds, will return as many speeds as can fit.
 */
unsigned int phy_supported_speeds(struct phy_device *phy,
				  unsigned int *speeds,
				  unsigned int size)
{
	unsigned int count = 0;
	unsigned int idx = 0;

	while (idx < MAX_NUM_SETTINGS && count < size) {
		idx = phy_find_valid(idx, phy->supported);

		if (!(settings[idx].setting & phy->supported))
			break;

		/* Assumes settings are grouped by speed */
		if ((count == 0) ||
		    (speeds[count - 1] != settings[idx].speed)) {
			speeds[count] = settings[idx].speed;
			count++;
		}
		idx++;
	}

	return count;
}

/**
 * phy_check_valid - check if there is a valid PHY setting which matches
 *		     speed, duplex, and feature mask
+15 −0
Original line number Diff line number Diff line
@@ -84,6 +84,21 @@ typedef enum {
	PHY_INTERFACE_MODE_MAX,
} phy_interface_t;

/**
 * phy_supported_speeds - return all speeds currently supported by a phy device
 * @phy: The phy device to return supported speeds of.
 * @speeds: buffer to store supported speeds in.
 * @size: size of speeds buffer.
 *
 * Description: Returns the number of supported speeds, and
 * fills the speeds * buffer with the supported speeds. If speeds buffer is
 * too small to contain * all currently supported speeds, will return as
 * many speeds as can fit.
 */
unsigned int phy_supported_speeds(struct phy_device *phy,
				      unsigned int *speeds,
				      unsigned int size);

/**
 * It maps 'enum phy_interface_t' found in include/linux/phy.h
 * into the device tree binding of 'phy-mode', so that Ethernet