mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-31 10:26:10 +01:00 
			
		
		
		
	net: phy: introduce fixed_phy_create for DSA CPU ports
The DSA (Distributed Switch Architecture) implementation has made a
design decision when it got introduced to the Linux kernel in 2008.
That was to hide away from the user the CPU-facing Ethernet MAC, since
it does not make sense to register it as a struct net_device (UCLASS_ETH
udevice for U-Boot), because that would never be beneficial for a user:
they would not be able to use it for traffic, since conceptually, a
packet delivered to the CPU port should loop back into the system.
Nonetheless, DSA has had numerous growing pains due to the lack of a
struct net_device for the CPU port, but so far it has overcome them.
It is unlikely at this stage of maturity that this aspect of it will
change.
We would like U-Boot to present the same information as Linux, to be at
parity in terms of number of interfaces, so that ethNaddr environment
variables could directly be associated between U-Boot and Linux.
Therefore, we would implicitly like U-Boot to hide the CPU port from the
user as well.
But the paradox is that DSA still needs a struct phy_device to inform
the driver of the parameters of the link that it should configure the
CPU port to. The problem is that the phy_device is typically returned
via a call to phy_connect, which needs an udevice to attach the PHY to,
and to search its ofnode for the 'fixed-link' property. But we don't
have an udevice to present for the CPU port.
Since 99% of DSA setups are MAC-to-MAC connections between the switch
and the host Ethernet controller, the struct phy_device is going to be a
fixed PHY. This simplifies things quite a bit. In U-Boot, a fixed PHY
does not need an MDIO bus, and does not need an attached dev either.
Basically, the phy_connect call doesn't do any connection, it just
creates the fixed PHY.
The proposal of this patch is to introduce a new fixed_phy_create
function which will take a single argument: the ofnode that holds this:
	port@4 {
		reg = <4>;
		phy-mode = "internal";
		fixed-link {
			speed = <2500>;
			full-duplex;
		};
	};
and probe a fixed PHY driver using the information from this ofnode.
DSA will probably be the only user of this function.
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: Claudiu Manoil <claudiu.manoil@nxp.com>
			
			
This commit is contained in:
		
				
					committed by
					
						 Tom Rini
						Tom Rini
					
				
			
			
				
	
			
			
			
						parent
						
							56a5588340
						
					
				
				
					commit
					d0781c95bc
				
			| @@ -977,6 +977,37 @@ static struct phy_device *phy_connect_gmii2rgmii(struct mii_dev *bus, | ||||
| #endif | ||||
|  | ||||
| #ifdef CONFIG_PHY_FIXED | ||||
| /** | ||||
|  * fixed_phy_create() - create an unconnected fixed-link pseudo-PHY device | ||||
|  * @node: OF node for the container of the fixed-link node | ||||
|  * | ||||
|  * Description: Creates a struct phy_device based on a fixed-link of_node | ||||
|  * description. Can be used without phy_connect by drivers which do not expose | ||||
|  * a UCLASS_ETH udevice. | ||||
|  */ | ||||
| struct phy_device *fixed_phy_create(ofnode node) | ||||
| { | ||||
| 	phy_interface_t interface = PHY_INTERFACE_MODE_NONE; | ||||
| 	const char *if_str; | ||||
| 	ofnode subnode; | ||||
|  | ||||
| 	if_str = ofnode_read_string(node, "phy-mode"); | ||||
| 	if (!if_str) { | ||||
| 		if_str = ofnode_read_string(node, "phy-interface-type"); | ||||
| 	} | ||||
| 	if (if_str) { | ||||
| 		interface = phy_get_interface_by_name(if_str); | ||||
| 	} | ||||
|  | ||||
| 	subnode = ofnode_find_subnode(node, "fixed-link"); | ||||
| 	if (!ofnode_valid(subnode)) { | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
| 	return phy_device_create(NULL, ofnode_to_offset(subnode), PHY_FIXED_ID, | ||||
| 				 false, interface); | ||||
| } | ||||
|  | ||||
| #ifdef CONFIG_DM_ETH | ||||
| static struct phy_device *phy_connect_fixed(struct mii_dev *bus, | ||||
| 					    struct udevice *dev, | ||||
|   | ||||
| @@ -402,6 +402,27 @@ int phy_reset(struct phy_device *phydev); | ||||
| struct phy_device *phy_find_by_mask(struct mii_dev *bus, unsigned phy_mask, | ||||
| 		phy_interface_t interface); | ||||
|  | ||||
| #ifdef CONFIG_PHY_FIXED | ||||
|  | ||||
| /** | ||||
|  * fixed_phy_create() - create an unconnected fixed-link pseudo-PHY device | ||||
|  * @node: OF node for the container of the fixed-link node | ||||
|  * | ||||
|  * Description: Creates a struct phy_device based on a fixed-link of_node | ||||
|  * description. Can be used without phy_connect by drivers which do not expose | ||||
|  * a UCLASS_ETH udevice. | ||||
|  */ | ||||
| struct phy_device *fixed_phy_create(ofnode node); | ||||
|  | ||||
| #else | ||||
|  | ||||
| static inline struct phy_device *fixed_phy_create(ofnode node) | ||||
| { | ||||
| 	return NULL; | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
| #ifdef CONFIG_DM_ETH | ||||
|  | ||||
| /** | ||||
|   | ||||
		Reference in New Issue
	
	Block a user