mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	net: dsa: allow updating fixed PHY link information
Allow switch drivers to hook a PHY link update callback to perform port-specific link work. Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									ec9436baed
								
							
						
					
					
						commit
						ce31b31c68
					
				
					 2 changed files with 20 additions and 0 deletions
				
			
		| 
						 | 
					@ -17,6 +17,7 @@
 | 
				
			||||||
#include <linux/workqueue.h>
 | 
					#include <linux/workqueue.h>
 | 
				
			||||||
#include <linux/of.h>
 | 
					#include <linux/of.h>
 | 
				
			||||||
#include <linux/phy.h>
 | 
					#include <linux/phy.h>
 | 
				
			||||||
 | 
					#include <linux/phy_fixed.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define DSA_MAX_SWITCHES	4
 | 
					#define DSA_MAX_SWITCHES	4
 | 
				
			||||||
#define DSA_MAX_PORTS		12
 | 
					#define DSA_MAX_PORTS		12
 | 
				
			||||||
| 
						 | 
					@ -187,6 +188,8 @@ struct dsa_switch_driver {
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	void	(*adjust_link)(struct dsa_switch *ds, int port,
 | 
						void	(*adjust_link)(struct dsa_switch *ds, int port,
 | 
				
			||||||
				struct phy_device *phydev);
 | 
									struct phy_device *phydev);
 | 
				
			||||||
 | 
						void	(*fixed_link_update)(struct dsa_switch *ds, int port,
 | 
				
			||||||
 | 
									struct fixed_phy_status *st);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * ethtool hardware statistics.
 | 
						 * ethtool hardware statistics.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -358,6 +358,18 @@ static void dsa_slave_adjust_link(struct net_device *dev)
 | 
				
			||||||
		phy_print_status(p->phy);
 | 
							phy_print_status(p->phy);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int dsa_slave_fixed_link_update(struct net_device *dev,
 | 
				
			||||||
 | 
									       struct fixed_phy_status *status)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct dsa_slave_priv *p = netdev_priv(dev);
 | 
				
			||||||
 | 
						struct dsa_switch *ds = p->parent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (ds->drv->fixed_link_update)
 | 
				
			||||||
 | 
							ds->drv->fixed_link_update(ds, p->port, status);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* slave device setup *******************************************************/
 | 
					/* slave device setup *******************************************************/
 | 
				
			||||||
static void dsa_slave_phy_setup(struct dsa_slave_priv *p,
 | 
					static void dsa_slave_phy_setup(struct dsa_slave_priv *p,
 | 
				
			||||||
				struct net_device *slave_dev)
 | 
									struct net_device *slave_dev)
 | 
				
			||||||
| 
						 | 
					@ -365,6 +377,7 @@ static void dsa_slave_phy_setup(struct dsa_slave_priv *p,
 | 
				
			||||||
	struct dsa_switch *ds = p->parent;
 | 
						struct dsa_switch *ds = p->parent;
 | 
				
			||||||
	struct dsa_chip_data *cd = ds->pd;
 | 
						struct dsa_chip_data *cd = ds->pd;
 | 
				
			||||||
	struct device_node *phy_dn, *port_dn;
 | 
						struct device_node *phy_dn, *port_dn;
 | 
				
			||||||
 | 
						bool phy_is_fixed = false;
 | 
				
			||||||
	int ret;
 | 
						int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	port_dn = cd->port_dn[p->port];
 | 
						port_dn = cd->port_dn[p->port];
 | 
				
			||||||
| 
						 | 
					@ -380,6 +393,7 @@ static void dsa_slave_phy_setup(struct dsa_slave_priv *p,
 | 
				
			||||||
			pr_err("failed to register fixed PHY\n");
 | 
								pr_err("failed to register fixed PHY\n");
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							phy_is_fixed = true;
 | 
				
			||||||
		phy_dn = port_dn;
 | 
							phy_dn = port_dn;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -388,6 +402,9 @@ static void dsa_slave_phy_setup(struct dsa_slave_priv *p,
 | 
				
			||||||
					dsa_slave_adjust_link, 0,
 | 
										dsa_slave_adjust_link, 0,
 | 
				
			||||||
					p->phy_interface);
 | 
										p->phy_interface);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (p->phy && phy_is_fixed)
 | 
				
			||||||
 | 
							fixed_phy_set_link_update(p->phy, dsa_slave_fixed_link_update);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* We could not connect to a designated PHY, so use the switch internal
 | 
						/* We could not connect to a designated PHY, so use the switch internal
 | 
				
			||||||
	 * MDIO bus instead
 | 
						 * MDIO bus instead
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue