mirror of
				https://github.com/Ysurac/openmptcprouter.git
				synced 2025-03-09 15:40:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			120 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From: Birger Koblitz <git@birger-koblitz.de>
 | |
| Date: Sun, 5 Sep 2021 15:13:10 +0200
 | |
| Subject: [PATCH] kernel: Add AQR113C and AQR813 support
 | |
| 
 | |
| This hack adds support for the Aquantia 4th generation, 10GBit
 | |
| PHYs AQR113C and AQR813.
 | |
| 
 | |
| Signed-off-by: Birger Koblitz <git@birger-koblitz.de>
 | |
| 
 | |
| --- a/drivers/net/phy/aquantia_main.c
 | |
| +++ b/drivers/net/phy/aquantia_main.c
 | |
| @@ -23,6 +23,7 @@
 | |
|  #define PHY_ID_AQCS109	0x03a1b5c2
 | |
|  #define PHY_ID_AQR405	0x03a1b4b0
 | |
|  #define PHY_ID_AQR113C	0x31c31c12
 | |
| +#define PHY_ID_AQR813	0x31c31cb2
 | |
|  
 | |
|  #define MDIO_PHYXS_VEND_IF_STATUS		0xe812
 | |
|  #define MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK	GENMASK(7, 3)
 | |
| @@ -415,6 +416,49 @@ static int aqr107_read_rate(struct phy_d
 | |
|  	return 0;
 | |
|  }
 | |
|  
 | |
| +static int aqr113c_read_status(struct phy_device *phydev)
 | |
| +{
 | |
| +	int val, ret;
 | |
| +
 | |
| +	ret = aqr_read_status(phydev);
 | |
| +	if (ret)
 | |
| +		return ret;
 | |
| +
 | |
| +	if (!phydev->link || phydev->autoneg == AUTONEG_DISABLE)
 | |
| +		return 0;
 | |
| +
 | |
| +	// On AQR113C, the speed returned by aqr_read_status is wrong
 | |
| +	aqr107_read_rate(phydev);
 | |
| +
 | |
| +	val = phy_read_mmd(phydev, MDIO_MMD_PHYXS, MDIO_PHYXS_VEND_IF_STATUS);
 | |
| +	if (val < 0)
 | |
| +		return val;
 | |
| +
 | |
| +	switch (FIELD_GET(MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK, val)) {
 | |
| +	case MDIO_PHYXS_VEND_IF_STATUS_TYPE_KR:
 | |
| +		phydev->interface = PHY_INTERFACE_MODE_10GKR;
 | |
| +		break;
 | |
| +	case MDIO_PHYXS_VEND_IF_STATUS_TYPE_XFI:
 | |
| +		phydev->interface = PHY_INTERFACE_MODE_10GBASER;
 | |
| +		break;
 | |
| +	case MDIO_PHYXS_VEND_IF_STATUS_TYPE_USXGMII:
 | |
| +		phydev->interface = PHY_INTERFACE_MODE_USXGMII;
 | |
| +		break;
 | |
| +	case MDIO_PHYXS_VEND_IF_STATUS_TYPE_SGMII:
 | |
| +		phydev->interface = PHY_INTERFACE_MODE_SGMII;
 | |
| +		break;
 | |
| +	case MDIO_PHYXS_VEND_IF_STATUS_TYPE_OCSGMII:
 | |
| +		phydev->interface = PHY_INTERFACE_MODE_2500BASEX;
 | |
| +		break;
 | |
| +	default:
 | |
| +		phydev->interface = PHY_INTERFACE_MODE_NA;
 | |
| +		break;
 | |
| +	}
 | |
| +
 | |
| +	/* Read downshifted rate from vendor register */
 | |
| +	return aqr107_read_rate(phydev);
 | |
| +}
 | |
| +
 | |
|  static int aqr107_read_status(struct phy_device *phydev)
 | |
|  {
 | |
|  	int val, ret;
 | |
| @@ -554,7 +598,7 @@ static void aqr107_chip_info(struct phy_
 | |
|  	build_id = FIELD_GET(VEND1_GLOBAL_RSVD_STAT1_FW_BUILD_ID, val);
 | |
|  	prov_id = FIELD_GET(VEND1_GLOBAL_RSVD_STAT1_PROV_ID, val);
 | |
|  
 | |
| -	phydev_dbg(phydev, "FW %u.%u, Build %u, Provisioning %u\n",
 | |
| +	phydev_info(phydev, "FW %u.%u, Build %u, Provisioning %u\n",
 | |
|  		   fw_major, fw_minor, build_id, prov_id);
 | |
|  }
 | |
|  
 | |
| @@ -809,7 +853,7 @@ static struct phy_driver aqr_driver[] =
 | |
|  	.config_aneg    = aqr_config_aneg,
 | |
|  	.config_intr    = aqr_config_intr,
 | |
|  	.handle_interrupt       = aqr_handle_interrupt,
 | |
| -	.read_status    = aqr107_read_status,
 | |
| +	.read_status    = aqr113c_read_status,
 | |
|  	.get_tunable    = aqr107_get_tunable,
 | |
|  	.set_tunable    = aqr107_set_tunable,
 | |
|  	.suspend        = aqr107_suspend,
 | |
| @@ -819,6 +863,24 @@ static struct phy_driver aqr_driver[] =
 | |
|  	.get_stats      = aqr107_get_stats,
 | |
|  	.link_change_notify = aqr107_link_change_notify,
 | |
|  },
 | |
| +{
 | |
| +	PHY_ID_MATCH_MODEL(PHY_ID_AQR813),
 | |
| +	.name		= "Aquantia AQR813",
 | |
| +	.probe		= aqr107_probe,
 | |
| +	.config_init	= aqr107_config_init,
 | |
| +	.config_aneg    = aqr_config_aneg,
 | |
| +	.config_intr	= aqr_config_intr,
 | |
| +	.handle_interrupt = aqr_handle_interrupt,
 | |
| +	.read_status	= aqr113c_read_status,
 | |
| +	.get_tunable    = aqr107_get_tunable,
 | |
| +	.set_tunable    = aqr107_set_tunable,
 | |
| +	.suspend	= aqr107_suspend,
 | |
| +	.resume		= aqr107_resume,
 | |
| +	.get_sset_count	= aqr107_get_sset_count,
 | |
| +	.get_strings	= aqr107_get_strings,
 | |
| +	.get_stats	= aqr107_get_stats,
 | |
| +	.link_change_notify = aqr107_link_change_notify,
 | |
| +},
 | |
|  };
 | |
|  
 | |
|  module_phy_driver(aqr_driver);
 | |
| @@ -832,6 +894,7 @@ static struct mdio_device_id __maybe_unu
 | |
|  	{ PHY_ID_MATCH_MODEL(PHY_ID_AQCS109) },
 | |
|  	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR405) },
 | |
|  	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR113C) },
 | |
| +	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR813) },
 | |
|  	{ }
 | |
|  };
 | |
|  
 |