mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-31 14:04:26 -04:00 
			
		
		
		
	Use the constant RTL_8221B_VB_CG_PHYID instead of a numeric value. Signed-off-by: Mieczyslaw Nalewaj <namiltd@yahoo.com>
		
			
				
	
	
		
			76 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From d7943c31d57c11e1a517aa3ce2006fca44866870 Mon Sep 17 00:00:00 2001
 | |
| From: Jianhui Zhao <zhaojh329@gmail.com>
 | |
| Date: Sun, 24 Sep 2023 22:15:00 +0800
 | |
| Subject: [PATCH] net: phy: realtek: add interrupt support for RTL8221B
 | |
| 
 | |
| This commit introduces interrupt support for RTL8221B.
 | |
| 
 | |
| Signed-off-by: Jianhui Zhao <zhaojh329@gmail.com>
 | |
| ---
 | |
|  drivers/net/phy/realtek.c | 47 +++++++++++++++++++++++++++++++++++++++
 | |
|  1 file changed, 47 insertions(+)
 | |
| 
 | |
| --- a/drivers/net/phy/realtek.c
 | |
| +++ b/drivers/net/phy/realtek.c
 | |
| @@ -972,6 +972,51 @@ static int rtl8221b_config_init(struct p
 | |
|  	return 0;
 | |
|  }
 | |
|  
 | |
| +static int rtl8221b_ack_interrupt(struct phy_device *phydev)
 | |
| +{
 | |
| +	int err;
 | |
| +
 | |
| +	err = phy_read_mmd(phydev, RTL8221B_MMD_PHY_CTRL, 0xa4d4);
 | |
| +
 | |
| +	return (err < 0) ? err : 0;
 | |
| +}
 | |
| +
 | |
| +static int rtl8221b_config_intr(struct phy_device *phydev)
 | |
| +{
 | |
| +	int err;
 | |
| +
 | |
| +	if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
 | |
| +		err = rtl8221b_ack_interrupt(phydev);
 | |
| +		if (err)
 | |
| +			return err;
 | |
| +
 | |
| +		err = phy_write_mmd(phydev, RTL8221B_MMD_PHY_CTRL, 0xa4d2, 0x7ff);
 | |
| +	} else {
 | |
| +		err = phy_write_mmd(phydev, RTL8221B_MMD_PHY_CTRL, 0xa4d2, 0x0);
 | |
| +		if (err)
 | |
| +			return err;
 | |
| +
 | |
| +		err = rtl8221b_ack_interrupt(phydev);
 | |
| +	}
 | |
| +
 | |
| +	return err;
 | |
| +}
 | |
| +
 | |
| +static irqreturn_t rtl8221b_handle_interrupt(struct phy_device *phydev)
 | |
| +{
 | |
| +	int err;
 | |
| +
 | |
| +	err = rtl8221b_ack_interrupt(phydev);
 | |
| +	if (err) {
 | |
| +		phy_error(phydev);
 | |
| +		return IRQ_NONE;
 | |
| +	}
 | |
| +
 | |
| +	phy_trigger_machine(phydev);
 | |
| +
 | |
| +	return IRQ_HANDLED;
 | |
| +}
 | |
| +
 | |
|  static struct phy_driver realtek_drvs[] = {
 | |
|  	{
 | |
|  		PHY_ID_MATCH_EXACT(0x00008201),
 | |
| @@ -1120,6 +1165,8 @@ static struct phy_driver realtek_drvs[]
 | |
|  		.get_features   = rtl822x_get_features,
 | |
|  		.config_init    = rtl8221b_config_init,
 | |
|  		.config_aneg    = rtl822x_config_aneg,
 | |
| +		.config_intr	= rtl8221b_config_intr,
 | |
| +		.handle_interrupt = rtl8221b_handle_interrupt,
 | |
|  		.probe          = rtl822x_probe,
 | |
|  		.read_status    = rtl822x_read_status,
 | |
|  		.suspend        = genphy_suspend,
 |