forked from mirrors/linux
		
	net: dsa: allow drivers to do link adjustment
Whenever libphy determines that the link status of a given PHY/port has changed, allow to call into the switch driver link adjustment callback so proper actions can be taken care of by the switch driver upon link notification. Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									5aed85cec2
								
							
						
					
					
						commit
						ec9436baed
					
				
					 2 changed files with 11 additions and 0 deletions
				
			
		| 
						 | 
					@ -16,6 +16,7 @@
 | 
				
			||||||
#include <linux/timer.h>
 | 
					#include <linux/timer.h>
 | 
				
			||||||
#include <linux/workqueue.h>
 | 
					#include <linux/workqueue.h>
 | 
				
			||||||
#include <linux/of.h>
 | 
					#include <linux/of.h>
 | 
				
			||||||
 | 
					#include <linux/phy.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define DSA_MAX_SWITCHES	4
 | 
					#define DSA_MAX_SWITCHES	4
 | 
				
			||||||
#define DSA_MAX_PORTS		12
 | 
					#define DSA_MAX_PORTS		12
 | 
				
			||||||
| 
						 | 
					@ -181,6 +182,12 @@ struct dsa_switch_driver {
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	void	(*poll_link)(struct dsa_switch *ds);
 | 
						void	(*poll_link)(struct dsa_switch *ds);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Link state adjustment (called from libphy)
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						void	(*adjust_link)(struct dsa_switch *ds, int port,
 | 
				
			||||||
 | 
									struct phy_device *phydev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * ethtool hardware statistics.
 | 
						 * ethtool hardware statistics.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -333,6 +333,7 @@ static const struct dsa_device_ops notag_netdev_ops = {
 | 
				
			||||||
static void dsa_slave_adjust_link(struct net_device *dev)
 | 
					static void dsa_slave_adjust_link(struct net_device *dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct dsa_slave_priv *p = netdev_priv(dev);
 | 
						struct dsa_slave_priv *p = netdev_priv(dev);
 | 
				
			||||||
 | 
						struct dsa_switch *ds = p->parent;
 | 
				
			||||||
	unsigned int status_changed = 0;
 | 
						unsigned int status_changed = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->old_link != p->phy->link) {
 | 
						if (p->old_link != p->phy->link) {
 | 
				
			||||||
| 
						 | 
					@ -350,6 +351,9 @@ static void dsa_slave_adjust_link(struct net_device *dev)
 | 
				
			||||||
		p->old_pause = p->phy->pause;
 | 
							p->old_pause = p->phy->pause;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (ds->drv->adjust_link && status_changed)
 | 
				
			||||||
 | 
							ds->drv->adjust_link(ds, p->port, p->phy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (status_changed)
 | 
						if (status_changed)
 | 
				
			||||||
		phy_print_status(p->phy);
 | 
							phy_print_status(p->phy);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue