All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH net-next 0/3] net: phy: add and use new function genphy_read_abilities
@ 2019-03-27 20:57 Heiner Kallweit
  2019-03-27 20:58 ` [PATCH net-next 1/3] net: phy: add genphy_read_abilities Heiner Kallweit
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Heiner Kallweit @ 2019-03-27 20:57 UTC (permalink / raw)
  To: Andrew Lunn, Florian Fainelli, David Miller; +Cc: netdev

Similar to genphy_c45_pma_read_abilities() add a function to dynamically
detect the abilities of a Clause 22 PHY. This is mainly copied from
genphy_config_init(). Main benefit is that PHY drivers no longer have
to specify whether they support GBit or not (provided they keep to
the C22 standard).

Heiner Kallweit (3):
  net: phy: add genphy_read_abilities
  net: phy: use genphy_read_abilities in genphy driver
  net: phy: realtek: use genphy_read_abilities

 drivers/net/phy/phy_device.c | 51 ++++++++++++++++++++++++++++++++++--
 drivers/net/phy/realtek.c    | 36 +++++++++----------------
 include/linux/phy.h          |  1 +
 3 files changed, 62 insertions(+), 26 deletions(-)

-- 
2.21.0


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH net-next 1/3] net: phy: add genphy_read_abilities
  2019-03-27 20:57 [PATCH net-next 0/3] net: phy: add and use new function genphy_read_abilities Heiner Kallweit
@ 2019-03-27 20:58 ` Heiner Kallweit
  2019-03-27 20:59 ` [PATCH net-next 2/3] net: phy: use genphy_read_abilities in genphy driver Heiner Kallweit
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Heiner Kallweit @ 2019-03-27 20:58 UTC (permalink / raw)
  To: Andrew Lunn, Florian Fainelli, David Miller; +Cc: netdev

Similar to genphy_c45_pma_read_abilities() add a function to dynamically
detect the abilities of a Clause 22 PHY. This is mainly copied from
genphy_config_init().

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
---
 drivers/net/phy/phy_device.c | 48 ++++++++++++++++++++++++++++++++++++
 include/linux/phy.h          |  1 +
 2 files changed, 49 insertions(+)

diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
index 77068c545..0107366bb 100644
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -1887,6 +1887,54 @@ int genphy_config_init(struct phy_device *phydev)
 }
 EXPORT_SYMBOL(genphy_config_init);
 
+/**
+ * genphy_read_abilities - read PHY abilities from Clause 22 registers
+ * @phydev: target phy_device struct
+ *
+ * Description: Reads the PHY's abilities and populates
+ * phydev->supported accordingly.
+ *
+ * Returns: 0 on success, < 0 on failure
+ */
+int genphy_read_abilities(struct phy_device *phydev)
+{
+	int val;
+
+	linkmode_set_bit_array(phy_basic_ports_array,
+			       ARRAY_SIZE(phy_basic_ports_array),
+			       phydev->supported);
+
+	val = phy_read(phydev, MII_BMSR);
+	if (val < 0)
+		return val;
+
+	linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported,
+			 val & BMSR_ANEGCAPABLE);
+
+	linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, phydev->supported,
+			 val & BMSR_100FULL);
+	linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, phydev->supported,
+			 val & BMSR_100HALF);
+	linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, phydev->supported,
+			 val & BMSR_10FULL);
+	linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, phydev->supported,
+			 val & BMSR_10HALF);
+
+	if (val & BMSR_ESTATEN) {
+		val = phy_read(phydev, MII_ESTATUS);
+		if (val < 0)
+			return val;
+
+		linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
+				 phydev->supported, val & ESTATUS_1000_TFULL);
+		linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
+				 phydev->supported, val & ESTATUS_1000_THALF);
+	}
+
+	return 0;
+}
+EXPORT_SYMBOL(genphy_read_abilities);
+
 /* This is used for the phy device which doesn't support the MMD extended
  * register access, but it does have side effect when we are trying to access
  * the MMD register via indirect method.
diff --git a/include/linux/phy.h b/include/linux/phy.h
index 34084892a..ad88f063e 100644
--- a/include/linux/phy.h
+++ b/include/linux/phy.h
@@ -1075,6 +1075,7 @@ void phy_attached_info(struct phy_device *phydev);
 
 /* Clause 22 PHY */
 int genphy_config_init(struct phy_device *phydev);
+int genphy_read_abilities(struct phy_device *phydev);
 int genphy_setup_forced(struct phy_device *phydev);
 int genphy_restart_aneg(struct phy_device *phydev);
 int genphy_config_eee_advert(struct phy_device *phydev);
-- 
2.21.0



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH net-next 2/3] net: phy: use genphy_read_abilities in genphy driver
  2019-03-27 20:57 [PATCH net-next 0/3] net: phy: add and use new function genphy_read_abilities Heiner Kallweit
  2019-03-27 20:58 ` [PATCH net-next 1/3] net: phy: add genphy_read_abilities Heiner Kallweit
@ 2019-03-27 20:59 ` Heiner Kallweit
  2019-03-27 21:00 ` [PATCH net-next 3/3] net: phy: realtek: use genphy_read_abilities Heiner Kallweit
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Heiner Kallweit @ 2019-03-27 20:59 UTC (permalink / raw)
  To: Andrew Lunn, Florian Fainelli, David Miller; +Cc: netdev

Currently the genphy driver populates phydev->supported like this:
First all possible feature bits are set, then genphy_config_init()
reads the available features from the chip and remove all unsupported
features from phydev->supported. This can be simplified by using
genphy_read_abilities().

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
---
 drivers/net/phy/phy_device.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
index 0107366bb..0c4cc9b54 100644
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -2291,8 +2291,7 @@ static struct phy_driver genphy_driver = {
 	.phy_id_mask	= 0xffffffff,
 	.name		= "Generic PHY",
 	.soft_reset	= genphy_no_soft_reset,
-	.config_init	= genphy_config_init,
-	.features	= PHY_GBIT_ALL_PORTS_FEATURES,
+	.get_features	= genphy_read_abilities,
 	.aneg_done	= genphy_aneg_done,
 	.suspend	= genphy_suspend,
 	.resume		= genphy_resume,
-- 
2.21.0



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH net-next 3/3] net: phy: realtek: use genphy_read_abilities
  2019-03-27 20:57 [PATCH net-next 0/3] net: phy: add and use new function genphy_read_abilities Heiner Kallweit
  2019-03-27 20:58 ` [PATCH net-next 1/3] net: phy: add genphy_read_abilities Heiner Kallweit
  2019-03-27 20:59 ` [PATCH net-next 2/3] net: phy: use genphy_read_abilities in genphy driver Heiner Kallweit
@ 2019-03-27 21:00 ` Heiner Kallweit
  2019-03-29 20:26 ` [PATCH net-next 0/3] net: phy: add and use new function genphy_read_abilities David Miller
  2019-04-02 20:10 ` David Miller
  4 siblings, 0 replies; 6+ messages in thread
From: Heiner Kallweit @ 2019-03-27 21:00 UTC (permalink / raw)
  To: Andrew Lunn, Florian Fainelli, David Miller; +Cc: netdev

Use new function genphy_read_abilities(). This allows to remove all
calls to genphy_config_init().

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
---
 drivers/net/phy/realtek.c | 36 ++++++++++++------------------------
 1 file changed, 12 insertions(+), 24 deletions(-)

diff --git a/drivers/net/phy/realtek.c b/drivers/net/phy/realtek.c
index 10df52ccd..5ecbd41ed 100644
--- a/drivers/net/phy/realtek.c
+++ b/drivers/net/phy/realtek.c
@@ -151,21 +151,14 @@ static int rtl8211_config_aneg(struct phy_device *phydev)
 static int rtl8211c_config_init(struct phy_device *phydev)
 {
 	/* RTL8211C has an issue when operating in Gigabit slave mode */
-	phy_set_bits(phydev, MII_CTRL1000,
-		     CTL1000_ENABLE_MASTER | CTL1000_AS_MASTER);
-
-	return genphy_config_init(phydev);
+	return phy_set_bits(phydev, MII_CTRL1000,
+			    CTL1000_ENABLE_MASTER | CTL1000_AS_MASTER);
 }
 
 static int rtl8211f_config_init(struct phy_device *phydev)
 {
-	int ret;
 	u16 val = 0;
 
-	ret = genphy_config_init(phydev);
-	if (ret < 0)
-		return ret;
-
 	/* enable TX-delay for rgmii-id and rgmii-txid, otherwise disable it */
 	if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
 	    phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID)
@@ -192,10 +185,6 @@ static int rtl8366rb_config_init(struct phy_device *phydev)
 {
 	int ret;
 
-	ret = genphy_config_init(phydev);
-	if (ret < 0)
-		return ret;
-
 	ret = phy_set_bits(phydev, RTL8366RB_POWER_SAVE,
 			   RTL8366RB_POWER_SAVE_ON);
 	if (ret) {
@@ -210,11 +199,11 @@ static struct phy_driver realtek_drvs[] = {
 	{
 		PHY_ID_MATCH_EXACT(0x00008201),
 		.name           = "RTL8201CP Ethernet",
-		.features       = PHY_BASIC_FEATURES,
+		.get_features	= genphy_read_abilities,
 	}, {
 		PHY_ID_MATCH_EXACT(0x001cc816),
 		.name		= "RTL8201F Fast Ethernet",
-		.features	= PHY_BASIC_FEATURES,
+		.get_features	= genphy_read_abilities,
 		.ack_interrupt	= &rtl8201_ack_interrupt,
 		.config_intr	= &rtl8201_config_intr,
 		.suspend	= genphy_suspend,
@@ -224,14 +213,14 @@ static struct phy_driver realtek_drvs[] = {
 	}, {
 		PHY_ID_MATCH_EXACT(0x001cc910),
 		.name		= "RTL8211 Gigabit Ethernet",
-		.features	= PHY_GBIT_FEATURES,
+		.get_features	= genphy_read_abilities,
 		.config_aneg	= rtl8211_config_aneg,
 		.read_mmd	= &genphy_read_mmd_unsupported,
 		.write_mmd	= &genphy_write_mmd_unsupported,
 	}, {
 		PHY_ID_MATCH_EXACT(0x001cc912),
 		.name		= "RTL8211B Gigabit Ethernet",
-		.features	= PHY_GBIT_FEATURES,
+		.get_features	= genphy_read_abilities,
 		.ack_interrupt	= &rtl821x_ack_interrupt,
 		.config_intr	= &rtl8211b_config_intr,
 		.read_mmd	= &genphy_read_mmd_unsupported,
@@ -241,14 +230,14 @@ static struct phy_driver realtek_drvs[] = {
 	}, {
 		PHY_ID_MATCH_EXACT(0x001cc913),
 		.name		= "RTL8211C Gigabit Ethernet",
-		.features	= PHY_GBIT_FEATURES,
+		.get_features	= genphy_read_abilities,
 		.config_init	= rtl8211c_config_init,
 		.read_mmd	= &genphy_read_mmd_unsupported,
 		.write_mmd	= &genphy_write_mmd_unsupported,
 	}, {
 		PHY_ID_MATCH_EXACT(0x001cc914),
 		.name		= "RTL8211DN Gigabit Ethernet",
-		.features	= PHY_GBIT_FEATURES,
+		.get_features	= genphy_read_abilities,
 		.ack_interrupt	= rtl821x_ack_interrupt,
 		.config_intr	= rtl8211e_config_intr,
 		.suspend	= genphy_suspend,
@@ -256,7 +245,7 @@ static struct phy_driver realtek_drvs[] = {
 	}, {
 		PHY_ID_MATCH_EXACT(0x001cc915),
 		.name		= "RTL8211E Gigabit Ethernet",
-		.features	= PHY_GBIT_FEATURES,
+		.get_features	= genphy_read_abilities,
 		.ack_interrupt	= &rtl821x_ack_interrupt,
 		.config_intr	= &rtl8211e_config_intr,
 		.suspend	= genphy_suspend,
@@ -264,7 +253,7 @@ static struct phy_driver realtek_drvs[] = {
 	}, {
 		PHY_ID_MATCH_EXACT(0x001cc916),
 		.name		= "RTL8211F Gigabit Ethernet",
-		.features	= PHY_GBIT_FEATURES,
+		.get_features	= genphy_read_abilities,
 		.config_init	= &rtl8211f_config_init,
 		.ack_interrupt	= &rtl8211f_ack_interrupt,
 		.config_intr	= &rtl8211f_config_intr,
@@ -275,8 +264,7 @@ static struct phy_driver realtek_drvs[] = {
 	}, {
 		PHY_ID_MATCH_EXACT(0x001cc800),
 		.name		= "Generic Realtek PHY",
-		.features	= PHY_GBIT_FEATURES,
-		.config_init	= genphy_config_init,
+		.get_features	= genphy_read_abilities,
 		.suspend	= genphy_suspend,
 		.resume		= genphy_resume,
 		.read_page	= rtl821x_read_page,
@@ -284,7 +272,7 @@ static struct phy_driver realtek_drvs[] = {
 	}, {
 		PHY_ID_MATCH_EXACT(0x001cc961),
 		.name		= "RTL8366RB Gigabit Ethernet",
-		.features	= PHY_GBIT_FEATURES,
+		.get_features	= genphy_read_abilities,
 		.config_init	= &rtl8366rb_config_init,
 		/* These interrupts are handled by the irq controller
 		 * embedded inside the RTL8366RB, they get unmasked when the
-- 
2.21.0



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH net-next 0/3] net: phy: add and use new function genphy_read_abilities
  2019-03-27 20:57 [PATCH net-next 0/3] net: phy: add and use new function genphy_read_abilities Heiner Kallweit
                   ` (2 preceding siblings ...)
  2019-03-27 21:00 ` [PATCH net-next 3/3] net: phy: realtek: use genphy_read_abilities Heiner Kallweit
@ 2019-03-29 20:26 ` David Miller
  2019-04-02 20:10 ` David Miller
  4 siblings, 0 replies; 6+ messages in thread
From: David Miller @ 2019-03-29 20:26 UTC (permalink / raw)
  To: hkallweit1; +Cc: andrew, f.fainelli, netdev

From: Heiner Kallweit <hkallweit1@gmail.com>
Date: Wed, 27 Mar 2019 21:57:10 +0100

> Similar to genphy_c45_pma_read_abilities() add a function to dynamically
> detect the abilities of a Clause 22 PHY. This is mainly copied from
> genphy_config_init(). Main benefit is that PHY drivers no longer have
> to specify whether they support GBit or not (provided they keep to
> the C22 standard).

This looks great to me.

Andrew/Florian, please review.

Thanks.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH net-next 0/3] net: phy: add and use new function genphy_read_abilities
  2019-03-27 20:57 [PATCH net-next 0/3] net: phy: add and use new function genphy_read_abilities Heiner Kallweit
                   ` (3 preceding siblings ...)
  2019-03-29 20:26 ` [PATCH net-next 0/3] net: phy: add and use new function genphy_read_abilities David Miller
@ 2019-04-02 20:10 ` David Miller
  4 siblings, 0 replies; 6+ messages in thread
From: David Miller @ 2019-04-02 20:10 UTC (permalink / raw)
  To: hkallweit1; +Cc: andrew, f.fainelli, netdev

From: Heiner Kallweit <hkallweit1@gmail.com>
Date: Wed, 27 Mar 2019 21:57:10 +0100

> Similar to genphy_c45_pma_read_abilities() add a function to dynamically
> detect the abilities of a Clause 22 PHY. This is mainly copied from
> genphy_config_init(). Main benefit is that PHY drivers no longer have
> to specify whether they support GBit or not (provided they keep to
> the C22 standard).

Series applied, thanks Heiner.

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2019-04-02 20:10 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-03-27 20:57 [PATCH net-next 0/3] net: phy: add and use new function genphy_read_abilities Heiner Kallweit
2019-03-27 20:58 ` [PATCH net-next 1/3] net: phy: add genphy_read_abilities Heiner Kallweit
2019-03-27 20:59 ` [PATCH net-next 2/3] net: phy: use genphy_read_abilities in genphy driver Heiner Kallweit
2019-03-27 21:00 ` [PATCH net-next 3/3] net: phy: realtek: use genphy_read_abilities Heiner Kallweit
2019-03-29 20:26 ` [PATCH net-next 0/3] net: phy: add and use new function genphy_read_abilities David Miller
2019-04-02 20:10 ` David Miller

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.