mirror of
https://github.com/u-boot/u-boot.git
synced 2024-11-27 22:56:49 +08: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:
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
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user