mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-30 21:44:27 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			46 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			46 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| --- a/include/linux/phy.h
 | |
| +++ b/include/linux/phy.h
 | |
| @@ -386,9 +386,18 @@ struct phy_driver {
 | |
|  	 */
 | |
|  	int (*config_aneg)(struct phy_device *phydev);
 | |
|  
 | |
| +	/* Determine if autonegotiation is done */
 | |
| +	int (*aneg_done)(struct phy_device *phydev);
 | |
| +
 | |
|  	/* Determines the negotiated speed and duplex */
 | |
|  	int (*read_status)(struct phy_device *phydev);
 | |
|  
 | |
| +	/* 
 | |
| +	 * Update the value in phydev->link to reflect the 
 | |
| +	 * current link value
 | |
| +	 */
 | |
| +	int (*update_link)(struct phy_device *phydev);
 | |
| +
 | |
|  	/* Clears any pending interrupts */
 | |
|  	int (*ack_interrupt)(struct phy_device *phydev);
 | |
|  
 | |
| --- a/drivers/net/phy/phy_device.c
 | |
| +++ b/drivers/net/phy/phy_device.c
 | |
| @@ -714,6 +714,9 @@ int genphy_update_link(struct phy_device
 | |
|  {
 | |
|  	int status;
 | |
|  
 | |
| +	if (phydev->drv->update_link)
 | |
| +		return phydev->drv->update_link(phydev);
 | |
| +
 | |
|  	/* Do a fake read */
 | |
|  	status = phy_read(phydev, MII_BMSR);
 | |
|  
 | |
| --- a/drivers/net/phy/phy.c
 | |
| +++ b/drivers/net/phy/phy.c
 | |
| @@ -106,6 +106,9 @@ static inline int phy_aneg_done(struct p
 | |
|  {
 | |
|  	int retval;
 | |
|  
 | |
| +	if (phydev->drv->aneg_done)
 | |
| +		return phydev->drv->aneg_done(phydev);
 | |
| +
 | |
|  	retval = phy_read(phydev, MII_BMSR);
 | |
|  
 | |
|  	return (retval < 0) ? retval : (retval & BMSR_ANEGCOMPLETE);
 |