linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY
@ 2021-07-12 13:06 alexandru.tachici
  2021-07-12 13:06 ` [PATCH v2 1/7] ethtool: Add 10base-T1L link mode entries alexandru.tachici
                   ` (7 more replies)
  0 siblings, 8 replies; 28+ messages in thread
From: alexandru.tachici @ 2021-07-12 13:06 UTC (permalink / raw)
  To: netdev, linux-kernel, devicetree
  Cc: robh+dt, andrew, hkallweit1, linux, davem, kuba, Alexandru Tachici

From: Alexandru Tachici <alexandru.tachici@analog.com>

The ADIN1100 is a low power single port 10BASE-T1L transceiver designed for
industrial Ethernet applications and is compliant with the IEEE 802.3cg
Ethernet standard for long reach 10 Mb/s Single Pair Ethernet.

Ethtool output:
        Settings for eth1:
        Supported ports: [ TP	 MII ]
        Supported link modes:   10baseT1L/Full
                                2400mv
                                1000mv
        Supported pause frame use: Transmit-only
        Supports auto-negotiation: Yes
        Supported FEC modes: Not reported
        Advertised link modes:  10baseT1L/Full
                                2400mv
                                1000mv
        Advertised pause frame use: Transmit-only
        Advertised auto-negotiation: Yes
        Advertised FEC modes: Not reported
        Link partner advertised link modes:  10baseT1L/Full
                                             2400mv
        Link partner advertised pause frame use: No
        Link partner advertised auto-negotiation: Yes
        Link partner advertised FEC modes: Not reported
        Speed: 10Mb/s
        Duplex: Full
        Auto-negotiation: on
        master-slave cfg: preferred master
        master-slave status: master
        Port: MII
        PHYAD: 0
        Transceiver: external
        Link detected: yes
SQI: 7/7

1. Add basic support for ADIN1100.

Alexandru Ardelean (1):
  net: phy: adin1100: Add initial support for ADIN1100 industrial PHY

1. Added 10baset-T1L link modes.

2. Added 10base-T1L voltage levels link modes. 1v is the default TX level.
2.4 V support depends on pin configuration and power supply.

3. Allow user to access error and frame counters through ethtool.

4. Allow user to set the master-slave configuration of ADIN1100.

5. Convert MSE to SQI using a predefined table and allow user access
through ethtool.

6. DT bindings for ADIN1100.

Alexandru Tachici (6):
  ethtool: Add 10base-T1L link mode entries
  ethtool: Add 10base-T1L voltage levels link mode entries
  net: phy: adin1100: Add ethtool get_stats support
  net: phy: adin1100: Add ethtool master-slave support
  net: phy: adin1100: Add SQI support
  dt-bindings: adin1100: Add binding for ADIN1100 Ethernet PHY

Changelog v1 -> v2:
  - Added ETHTOOL_LINK_MODE_10baseT1L_Full_BIT and ETHTOOL_LINK_MODE_10baseT1L_Half_BIT.
  Using only full duplex here as chip supports full duplex only
  - removed .match_phy_device
  - removed link partner advertising of modes not present in the kernel
  - enable/disable only the PCS loopback
  - replaced custom timeout implementations with phy_read_mmd_poll_timeout
  - added link modes for 1.0 V and 2.4 V TX levels
  - removed link change notify
  - check if 2.4v TX level is supported in adin_get_features call and set
  corresponding link mode

 .../devicetree/bindings/net/adi,adin1100.yaml |  45 ++
 drivers/net/phy/Kconfig                       |   7 +
 drivers/net/phy/Makefile                      |   1 +
 drivers/net/phy/adin1100.c                    | 533 ++++++++++++++++++
 drivers/net/phy/phy-core.c                    |   4 +-
 include/uapi/linux/ethtool.h                  |   4 +
 net/ethtool/common.c                          |   6 +
 7 files changed, 599 insertions(+), 1 deletion(-)
 create mode 100644 Documentation/devicetree/bindings/net/adi,adin1100.yaml
 create mode 100644 drivers/net/phy/adin1100.c

--
2.25.1

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

* [PATCH v2 1/7] ethtool: Add 10base-T1L link mode entries
  2021-07-12 13:06 [PATCH v2 0/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY alexandru.tachici
@ 2021-07-12 13:06 ` alexandru.tachici
  2021-07-13 16:50   ` Andrew Lunn
  2021-07-27  5:56   ` Oleksij Rempel
  2021-07-12 13:06 ` [PATCH v2 2/7] ethtool: Add 10base-T1L voltage levels " alexandru.tachici
                   ` (6 subsequent siblings)
  7 siblings, 2 replies; 28+ messages in thread
From: alexandru.tachici @ 2021-07-12 13:06 UTC (permalink / raw)
  To: netdev, linux-kernel, devicetree
  Cc: robh+dt, andrew, hkallweit1, linux, davem, kuba, Alexandru Tachici

From: Alexandru Tachici <alexandru.tachici@analog.com>

Add entries for the 10base-T1L full and half duplex supported modes.

Signed-off-by: Alexandru Tachici <alexandru.tachici@analog.com>
---
 drivers/net/phy/phy-core.c   | 4 +++-
 include/uapi/linux/ethtool.h | 2 ++
 net/ethtool/common.c         | 2 ++
 3 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/net/phy/phy-core.c b/drivers/net/phy/phy-core.c
index 2870c33b8975..fd9c83ce10fc 100644
--- a/drivers/net/phy/phy-core.c
+++ b/drivers/net/phy/phy-core.c
@@ -13,7 +13,7 @@
  */
 const char *phy_speed_to_str(int speed)
 {
-	BUILD_BUG_ON_MSG(__ETHTOOL_LINK_MODE_MASK_NBITS != 92,
+	BUILD_BUG_ON_MSG(__ETHTOOL_LINK_MODE_MASK_NBITS != 94,
 		"Enum ethtool_link_mode_bit_indices and phylib are out of sync. "
 		"If a speed or mode has been added please update phy_speed_to_str "
 		"and the PHY settings array.\n");
@@ -176,6 +176,8 @@ static const struct phy_setting settings[] = {
 	/* 10M */
 	PHY_SETTING(     10, FULL,     10baseT_Full		),
 	PHY_SETTING(     10, HALF,     10baseT_Half		),
+	PHY_SETTING(     10, FULL,     10baseT1L_Full		),
+	PHY_SETTING(     10, HALF,     10baseT1L_Half		),
 };
 #undef PHY_SETTING
 
diff --git a/include/uapi/linux/ethtool.h b/include/uapi/linux/ethtool.h
index 67aa7134b301..8a905466d7dc 100644
--- a/include/uapi/linux/ethtool.h
+++ b/include/uapi/linux/ethtool.h
@@ -1659,6 +1659,8 @@ enum ethtool_link_mode_bit_indices {
 	ETHTOOL_LINK_MODE_400000baseCR4_Full_BIT	 = 89,
 	ETHTOOL_LINK_MODE_100baseFX_Half_BIT		 = 90,
 	ETHTOOL_LINK_MODE_100baseFX_Full_BIT		 = 91,
+	ETHTOOL_LINK_MODE_10baseT1L_Half_BIT		 = 92,
+	ETHTOOL_LINK_MODE_10baseT1L_Full_BIT		 = 93,
 	/* must be last entry */
 	__ETHTOOL_LINK_MODE_MASK_NBITS
 };
diff --git a/net/ethtool/common.c b/net/ethtool/common.c
index f9dcbad84788..5b93d888fd83 100644
--- a/net/ethtool/common.c
+++ b/net/ethtool/common.c
@@ -199,6 +199,8 @@ const char link_mode_names[][ETH_GSTRING_LEN] = {
 	__DEFINE_LINK_MODE_NAME(400000, CR4, Full),
 	__DEFINE_LINK_MODE_NAME(100, FX, Half),
 	__DEFINE_LINK_MODE_NAME(100, FX, Full),
+	__DEFINE_LINK_MODE_NAME(10, T1L, Half),
+	__DEFINE_LINK_MODE_NAME(10, T1L, Full),
 };
 static_assert(ARRAY_SIZE(link_mode_names) == __ETHTOOL_LINK_MODE_MASK_NBITS);
 
-- 
2.25.1


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

* [PATCH v2 2/7] ethtool: Add 10base-T1L voltage levels link mode entries
  2021-07-12 13:06 [PATCH v2 0/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY alexandru.tachici
  2021-07-12 13:06 ` [PATCH v2 1/7] ethtool: Add 10base-T1L link mode entries alexandru.tachici
@ 2021-07-12 13:06 ` alexandru.tachici
  2021-07-12 13:06 ` [PATCH v2 3/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY alexandru.tachici
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 28+ messages in thread
From: alexandru.tachici @ 2021-07-12 13:06 UTC (permalink / raw)
  To: netdev, linux-kernel, devicetree
  Cc: robh+dt, andrew, hkallweit1, linux, davem, kuba, Alexandru Tachici

From: Alexandru Tachici <alexandru.tachici@analog.com>

Add entries for the 10base-T1L possible link voltage levels.

Signed-off-by: Alexandru Tachici <alexandru.tachici@analog.com>
---
 drivers/net/phy/phy-core.c   | 2 +-
 include/uapi/linux/ethtool.h | 2 ++
 net/ethtool/common.c         | 4 ++++
 3 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/net/phy/phy-core.c b/drivers/net/phy/phy-core.c
index fd9c83ce10fc..a82e7457bda2 100644
--- a/drivers/net/phy/phy-core.c
+++ b/drivers/net/phy/phy-core.c
@@ -13,7 +13,7 @@
  */
 const char *phy_speed_to_str(int speed)
 {
-	BUILD_BUG_ON_MSG(__ETHTOOL_LINK_MODE_MASK_NBITS != 94,
+	BUILD_BUG_ON_MSG(__ETHTOOL_LINK_MODE_MASK_NBITS != 96,
 		"Enum ethtool_link_mode_bit_indices and phylib are out of sync. "
 		"If a speed or mode has been added please update phy_speed_to_str "
 		"and the PHY settings array.\n");
diff --git a/include/uapi/linux/ethtool.h b/include/uapi/linux/ethtool.h
index 8a905466d7dc..748d7a01e4e9 100644
--- a/include/uapi/linux/ethtool.h
+++ b/include/uapi/linux/ethtool.h
@@ -1661,6 +1661,8 @@ enum ethtool_link_mode_bit_indices {
 	ETHTOOL_LINK_MODE_100baseFX_Full_BIT		 = 91,
 	ETHTOOL_LINK_MODE_10baseT1L_Half_BIT		 = 92,
 	ETHTOOL_LINK_MODE_10baseT1L_Full_BIT		 = 93,
+	ETHTOOL_LINK_MODE_2400mv_BIT			 = 94,
+	ETHTOOL_LINK_MODE_1000mv_BIT			 = 95,
 	/* must be last entry */
 	__ETHTOOL_LINK_MODE_MASK_NBITS
 };
diff --git a/net/ethtool/common.c b/net/ethtool/common.c
index 5b93d888fd83..c0110a4b3392 100644
--- a/net/ethtool/common.c
+++ b/net/ethtool/common.c
@@ -201,6 +201,8 @@ const char link_mode_names[][ETH_GSTRING_LEN] = {
 	__DEFINE_LINK_MODE_NAME(100, FX, Full),
 	__DEFINE_LINK_MODE_NAME(10, T1L, Half),
 	__DEFINE_LINK_MODE_NAME(10, T1L, Full),
+	__DEFINE_SPECIAL_MODE_NAME(2400mv, "2400mv"),
+	__DEFINE_SPECIAL_MODE_NAME(1000mv, "1000mv"),
 };
 static_assert(ARRAY_SIZE(link_mode_names) == __ETHTOOL_LINK_MODE_MASK_NBITS);
 
@@ -349,6 +351,8 @@ const struct link_mode_info link_mode_params[] = {
 	__DEFINE_LINK_MODE_PARAMS(400000, CR4, Full),
 	__DEFINE_LINK_MODE_PARAMS(100, FX, Half),
 	__DEFINE_LINK_MODE_PARAMS(100, FX, Full),
+	__DEFINE_SPECIAL_MODE_PARAMS(2400mv),
+	__DEFINE_SPECIAL_MODE_PARAMS(1000mv),
 };
 static_assert(ARRAY_SIZE(link_mode_params) == __ETHTOOL_LINK_MODE_MASK_NBITS);
 
-- 
2.25.1


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

* [PATCH v2 3/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY
  2021-07-12 13:06 [PATCH v2 0/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY alexandru.tachici
  2021-07-12 13:06 ` [PATCH v2 1/7] ethtool: Add 10base-T1L link mode entries alexandru.tachici
  2021-07-12 13:06 ` [PATCH v2 2/7] ethtool: Add 10base-T1L voltage levels " alexandru.tachici
@ 2021-07-12 13:06 ` alexandru.tachici
  2021-07-13 16:58   ` Andrew Lunn
  2021-07-27  6:47   ` Oleksij Rempel
  2021-07-12 13:06 ` [PATCH v2 4/7] net: phy: adin1100: Add ethtool get_stats support alexandru.tachici
                   ` (4 subsequent siblings)
  7 siblings, 2 replies; 28+ messages in thread
From: alexandru.tachici @ 2021-07-12 13:06 UTC (permalink / raw)
  To: netdev, linux-kernel, devicetree
  Cc: robh+dt, andrew, hkallweit1, linux, davem, kuba,
	Alexandru Ardelean, Alexandru Tachici

From: Alexandru Ardelean <alexandru.ardelean@analog.com>

The ADIN1100 is a low power single port 10BASE-T1L transceiver designed for
industrial Ethernet applications and is compliant with the IEEE 802.3cg
Ethernet standard for long reach 10 Mb/s Single Pair Ethernet.

Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
Signed-off-by: Alexandru Tachici <alexandru.tachici@analog.com>
---
 drivers/net/phy/Kconfig    |   7 +
 drivers/net/phy/Makefile   |   1 +
 drivers/net/phy/adin1100.c | 326 +++++++++++++++++++++++++++++++++++++
 3 files changed, 334 insertions(+)
 create mode 100644 drivers/net/phy/adin1100.c

diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig
index c56f703ae998..8f9f61fe0020 100644
--- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig
@@ -83,6 +83,13 @@ config ADIN_PHY
 	  - ADIN1300 - Robust,Industrial, Low Latency 10/100/1000 Gigabit
 	    Ethernet PHY
 
+config ADIN1100_PHY
+	tristate "Analog Devices Industrial Ethernet T1L PHYs"
+	help
+	  Adds support for the Analog Devices Industrial T1L Ethernet PHYs.
+	  Currently supports the:
+	  - ADIN1100 - Robust,Industrial, Low Power 10BASE-T1L Ethernet PHY
+
 config AQUANTIA_PHY
 	tristate "Aquantia PHYs"
 	help
diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile
index 172bb193ae6a..3bd6a369d60c 100644
--- a/drivers/net/phy/Makefile
+++ b/drivers/net/phy/Makefile
@@ -31,6 +31,7 @@ sfp-obj-$(CONFIG_SFP)		+= sfp-bus.o
 obj-y				+= $(sfp-obj-y) $(sfp-obj-m)
 
 obj-$(CONFIG_ADIN_PHY)		+= adin.o
+obj-$(CONFIG_ADIN1100_PHY)	+= adin1100.o
 obj-$(CONFIG_AMD_PHY)		+= amd.o
 aquantia-objs			+= aquantia_main.o
 ifdef CONFIG_HWMON
diff --git a/drivers/net/phy/adin1100.c b/drivers/net/phy/adin1100.c
new file mode 100644
index 000000000000..682fc617c51b
--- /dev/null
+++ b/drivers/net/phy/adin1100.c
@@ -0,0 +1,326 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
+/*
+ *  Driver for Analog Devices Industrial Ethernet T1L PHYs
+ *
+ * Copyright 2020 Analog Devices Inc.
+ */
+#include <linux/kernel.h>
+#include <linux/bitfield.h>
+#include <linux/delay.h>
+#include <linux/errno.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/mii.h>
+#include <linux/phy.h>
+#include <linux/property.h>
+
+#define PHY_ID_ADIN1100				0x0283bc81
+
+static const int phy_10_features_array[] = {
+	ETHTOOL_LINK_MODE_10baseT1L_Full_BIT,
+	ETHTOOL_LINK_MODE_1000mv_BIT,
+};
+
+#define ADIN_B10L_PCS_CNTRL			0x08e6
+#define   ADIN_PCS_CNTRL_B10L_LB_PCS_EN		BIT(14)
+
+#define ADIN_B10L_PMA_CNTRL			0x08f6
+#define   ADIN_PMA_CNTRL_B10L_LB_PMA_LOC_EN	BIT(0)
+
+#define ADIN_B10L_PMA_STAT			0x08f7
+#define   ADIN_PMA_STAT_B10L_LB_PMA_LOC_ABLE	BIT(13)
+#define   ADIN_PMA_STAT_B10L_TX_LVL_HI_ABLE	BIT(12)
+
+#define ADIN_AN_CONTROL				0x0200
+#define   ADIN_AN_RESTART			BIT(9)
+#define   ADIN_AN_EN				BIT(12)
+
+#define ADIN_AN_STATUS				0x0201
+#define ADIN_AN_ADV_ABILITY_L			0x0202
+#define ADIN_AN_ADV_ABILITY_M			0x0203
+#define ADIN_AN_ADV_ABILITY_H			0x0204U
+#define   ADIN_AN_ADV_B10L_TX_LVL_HI_ABL	BIT(13)
+#define   ADIN_AN_ADV_B10L_TX_LVL_HI_REQ	BIT(12)
+
+#define ADIN_AN_LP_ADV_ABILITY_L		0x0205
+
+#define ADIN_AN_LP_ADV_ABILITY_M		0x0206
+#define   ADIN_AN_LP_ADV_B10L			BIT(14)
+#define   ADIN_AN_LP_ADV_B1000			BIT(7)
+#define   ADIN_AN_LP_ADV_B10S_FD		BIT(6)
+#define   ADIN_AN_LP_ADV_B100			BIT(5)
+#define   ADIN_AN_LP_ADV_MST			BIT(4)
+
+#define ADIN_AN_LP_ADV_ABILITY_H		0x0207
+#define   ADIN_AN_LP_ADV_B10L_EEE		BIT(14)
+#define   ADIN_AN_LP_ADV_B10L_TX_LVL_HI_ABL	BIT(13)
+#define   ADIN_AN_LP_ADV_B10L_TX_LVL_HI_REQ	BIT(12)
+#define   ADIN_AN_LP_ADV_B10S_HD		BIT(11)
+
+#define ADIN_CRSM_SFT_RST			0x8810
+#define   ADIN_CRSM_SFT_RST_EN			BIT(0)
+
+#define ADIN_CRSM_SFT_PD_CNTRL			0x8812
+#define   ADIN_CRSM_SFT_PD_CNTRL_EN		BIT(0)
+
+#define ADIN_CRSM_STAT				0x8818
+#define   ADIN_CRSM_SFT_PD_RDY			BIT(1)
+#define   ADIN_CRSM_SYS_RDY			BIT(0)
+
+#define ADIN_MAC_IF_LOOPBACK			0x803d
+#define   ADIN_MAC_IF_LOOPBACK_EN		BIT(0)
+#define   ADIN_MAC_IF_REMOTE_LOOPBACK_EN	BIT(2)
+
+/**
+ * struct adin_priv - ADIN PHY driver private data
+ * tx_level_24v			set if the PHY supports 2.4V TX levels (10BASE-T1L)
+ */
+struct adin_priv {
+	unsigned int		tx_level_24v:1;
+};
+
+static void adin_mii_adv_m_to_ethtool_adv_t(unsigned long *advertising, u32 adv)
+{
+	if (adv & ADIN_AN_LP_ADV_B10L)
+		linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT1L_Full_BIT, advertising);
+}
+
+static void adin_mii_adv_h_to_ethtool_adv_t(unsigned long *advertising, u32 adv)
+{
+	if (adv & ADIN_AN_LP_ADV_B10S_HD)
+		linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT1L_Half_BIT, advertising);
+	if (adv & ADIN_AN_LP_ADV_B10L_TX_LVL_HI_ABL)
+		linkmode_set_bit(ETHTOOL_LINK_MODE_2400mv_BIT, advertising);
+	if (!(adv & ADIN_AN_LP_ADV_B10L_TX_LVL_HI_REQ))
+		linkmode_set_bit(ETHTOOL_LINK_MODE_1000mv_BIT, advertising);
+}
+
+static int adin_read_lpa(struct phy_device *phydev)
+{
+	int val;
+
+	linkmode_zero(phydev->lp_advertising);
+
+	val = phy_read_mmd(phydev, MDIO_MMD_AN, ADIN_AN_STATUS);
+	if (val < 0)
+		return val;
+
+	if (!(val & MDIO_AN_STAT1_COMPLETE)) {
+		phydev->pause = 0;
+		phydev->asym_pause = 0;
+
+		return 0;
+	}
+
+	linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
+			 phydev->lp_advertising);
+
+	/* Read the link partner's base page advertisement */
+	val = phy_read_mmd(phydev, MDIO_MMD_AN, ADIN_AN_LP_ADV_ABILITY_L);
+	if (val < 0)
+		return val;
+
+	phydev->pause = val & LPA_PAUSE_CAP ? 1 : 0;
+	phydev->asym_pause = val & LPA_PAUSE_ASYM ? 1 : 0;
+
+	val = phy_read_mmd(phydev, MDIO_MMD_AN, ADIN_AN_LP_ADV_ABILITY_M);
+	if (val < 0)
+		return val;
+
+	adin_mii_adv_m_to_ethtool_adv_t(phydev->lp_advertising, val);
+
+	val = phy_read_mmd(phydev, MDIO_MMD_AN, ADIN_AN_LP_ADV_ABILITY_H);
+	if (val < 0)
+		return val;
+
+	adin_mii_adv_h_to_ethtool_adv_t(phydev->lp_advertising, val);
+
+	return 0;
+}
+
+static int adin_read_status(struct phy_device *phydev)
+{
+	int ret;
+
+	ret = genphy_c45_read_link(phydev);
+	if (ret)
+		return ret;
+
+	phydev->speed = SPEED_UNKNOWN;
+	phydev->duplex = DUPLEX_UNKNOWN;
+	phydev->pause = 0;
+	phydev->asym_pause = 0;
+
+	if (phydev->autoneg == AUTONEG_ENABLE) {
+		ret = adin_read_lpa(phydev);
+		if (ret)
+			return ret;
+
+		phy_resolve_aneg_linkmode(phydev);
+	} else {
+		/* Only one mode & duplex supported */
+		linkmode_zero(phydev->lp_advertising);
+		phydev->speed = SPEED_10;
+		phydev->duplex = DUPLEX_FULL;
+	}
+
+	return ret;
+}
+
+static int adin_config_aneg(struct phy_device *phydev)
+{
+	struct adin_priv *priv = phydev->priv;
+	int ret;
+
+	/* No sense to continue if auto-neg is disabled,
+	 * only one link-mode supported.
+	 */
+	if (phydev->autoneg == AUTONEG_DISABLE)
+		return 0;
+
+	if (priv->tx_level_24v)
+		ret = phy_set_bits_mmd(phydev, MDIO_MMD_AN,
+				       ADIN_AN_ADV_ABILITY_H,
+				       ADIN_AN_ADV_B10L_TX_LVL_HI_ABL |
+				       ADIN_AN_ADV_B10L_TX_LVL_HI_REQ);
+	else
+		ret = phy_clear_bits_mmd(phydev, MDIO_MMD_AN,
+					 ADIN_AN_ADV_ABILITY_H,
+					 ADIN_AN_ADV_B10L_TX_LVL_HI_ABL |
+					 ADIN_AN_ADV_B10L_TX_LVL_HI_REQ);
+
+	if (ret < 0)
+		return ret;
+
+	return phy_set_bits_mmd(phydev, MDIO_MMD_AN, ADIN_AN_CONTROL, ADIN_AN_RESTART);
+}
+
+static int adin_set_powerdown_mode(struct phy_device *phydev, bool en)
+{
+	int ret;
+	int val;
+
+	if (en)
+		val = ADIN_CRSM_SFT_PD_CNTRL_EN;
+	else
+		val = 0;
+
+	ret = phy_write_mmd(phydev, MDIO_MMD_VEND1,
+			    ADIN_CRSM_SFT_PD_CNTRL, val);
+	if (ret < 0)
+		return ret;
+
+	return phy_read_mmd_poll_timeout(phydev, MDIO_MMD_VEND1, ADIN_CRSM_STAT, ret,
+					 (ret & ADIN_CRSM_SFT_PD_RDY) == val,
+					 1000, 30000, true);
+}
+
+static int adin_suspend(struct phy_device *phydev)
+{
+	return adin_set_powerdown_mode(phydev, true);
+}
+
+static int adin_resume(struct phy_device *phydev)
+{
+	return adin_set_powerdown_mode(phydev, false);
+}
+
+static int adin_set_loopback(struct phy_device *phydev, bool enable)
+{
+	if (enable)
+		return phy_set_bits_mmd(phydev, MDIO_MMD_PCS, ADIN_B10L_PCS_CNTRL,
+					ADIN_PCS_CNTRL_B10L_LB_PCS_EN);
+
+	/* PCS loopback (according to 10BASE-T1L spec) */
+	return phy_clear_bits_mmd(phydev, MDIO_MMD_PCS, ADIN_B10L_PCS_CNTRL,
+				 ADIN_PCS_CNTRL_B10L_LB_PCS_EN);
+}
+
+static int adin_soft_reset(struct phy_device *phydev)
+{
+	int ret;
+
+	ret = phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, ADIN_CRSM_SFT_RST, ADIN_CRSM_SFT_RST_EN);
+	if (ret < 0)
+		return ret;
+
+	return phy_read_mmd_poll_timeout(phydev, MDIO_MMD_VEND1, ADIN_CRSM_STAT, ret,
+					 (ret & ADIN_CRSM_SYS_RDY),
+					 10000, 30000, true);
+}
+
+static int adin_get_features(struct phy_device *phydev)
+{
+	struct adin_priv *priv = phydev->priv;
+	struct device *dev = &phydev->mdio.dev;
+	int ret;
+
+	ret = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, ADIN_B10L_PMA_STAT);
+	if (ret < 0)
+		return ret;
+
+	/* This depends on the voltage level from the power source */
+	priv->tx_level_24v = !!(ret & ADIN_PMA_STAT_B10L_TX_LVL_HI_ABLE);
+
+	phydev_dbg(phydev, "PHY supports 2.4V TX level: %s\n",
+		   priv->tx_level_24v ? "yes" : "no");
+
+	if (device_property_present(dev, "adi,disable-2400mv-tx-level")) {
+		if (priv->tx_level_24v)
+			phydev_info(phydev,
+				    "PHY supports 2.4V TX level, but disabled via config\n");
+
+		priv->tx_level_24v = 0;
+	}
+
+	if (priv->tx_level_24v)
+		linkmode_set_bit(ETHTOOL_LINK_MODE_2400mv_BIT, phydev->supported);
+
+	linkmode_set_bit_array(phy_basic_ports_array, ARRAY_SIZE(phy_basic_ports_array),
+			       phydev->supported);
+
+	linkmode_set_bit_array(phy_10_features_array, ARRAY_SIZE(phy_10_features_array),
+			       phydev->supported);
+
+	return 0;
+}
+
+static int adin_probe(struct phy_device *phydev)
+{
+	struct device *dev = &phydev->mdio.dev;
+	struct adin_priv *priv;
+
+	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
+	if (!priv)
+		return -ENOMEM;
+
+	phydev->priv = priv;
+
+	return 0;
+}
+
+static struct phy_driver adin_driver[] = {
+	{
+		PHY_ID_MATCH_MODEL(PHY_ID_ADIN1100),
+		.name			= "ADIN1100",
+		.get_features		= adin_get_features,
+		.soft_reset		= adin_soft_reset,
+		.probe			= adin_probe,
+		.config_aneg		= adin_config_aneg,
+		.read_status		= adin_read_status,
+		.set_loopback		= adin_set_loopback,
+		.suspend		= adin_suspend,
+		.resume			= adin_resume,
+	},
+};
+
+module_phy_driver(adin_driver);
+
+static struct mdio_device_id __maybe_unused adin_tbl[] = {
+	{ PHY_ID_MATCH_MODEL(PHY_ID_ADIN1100) },
+	{ }
+};
+
+MODULE_DEVICE_TABLE(mdio, adin_tbl);
+MODULE_DESCRIPTION("Analog Devices Industrial Ethernet T1L PHY driver");
+MODULE_LICENSE("Dual BSD/GPL");
-- 
2.25.1


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

* [PATCH v2 4/7] net: phy: adin1100: Add ethtool get_stats support
  2021-07-12 13:06 [PATCH v2 0/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY alexandru.tachici
                   ` (2 preceding siblings ...)
  2021-07-12 13:06 ` [PATCH v2 3/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY alexandru.tachici
@ 2021-07-12 13:06 ` alexandru.tachici
  2021-07-12 18:41   ` Jakub Kicinski
  2021-07-12 13:06 ` [PATCH v2 5/7] net: phy: adin1100: Add ethtool master-slave support alexandru.tachici
                   ` (3 subsequent siblings)
  7 siblings, 1 reply; 28+ messages in thread
From: alexandru.tachici @ 2021-07-12 13:06 UTC (permalink / raw)
  To: netdev, linux-kernel, devicetree
  Cc: robh+dt, andrew, hkallweit1, linux, davem, kuba, Alexandru Tachici

From: Alexandru Tachici <alexandru.tachici@analog.com>

The PHY has multiple error counters and one frame counter.
This change enables the frame checker and allows ethtool
to retrieve the counters values.

Signed-off-by: Alexandru Tachici <alexandru.tachici@analog.com>
---
 drivers/net/phy/adin1100.c | 79 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 79 insertions(+)

diff --git a/drivers/net/phy/adin1100.c b/drivers/net/phy/adin1100.c
index 682fc617c51b..94deaf52bbcd 100644
--- a/drivers/net/phy/adin1100.c
+++ b/drivers/net/phy/adin1100.c
@@ -57,6 +57,8 @@ static const int phy_10_features_array[] = {
 #define   ADIN_AN_LP_ADV_B10L_TX_LVL_HI_REQ	BIT(12)
 #define   ADIN_AN_LP_ADV_B10S_HD		BIT(11)
 
+#define ADIN_FC_EN				0x8001
+
 #define ADIN_CRSM_SFT_RST			0x8810
 #define   ADIN_CRSM_SFT_RST_EN			BIT(0)
 
@@ -71,11 +73,32 @@ static const int phy_10_features_array[] = {
 #define   ADIN_MAC_IF_LOOPBACK_EN		BIT(0)
 #define   ADIN_MAC_IF_REMOTE_LOOPBACK_EN	BIT(2)
 
+struct adin_hw_stat {
+	const char *string;
+	u16 reg1;
+	u16 reg2;
+};
+
+static const struct adin_hw_stat adin_hw_stats[] = {
+	{ "total_frames_error_count",		0x8008 },
+	{ "total_frames_count",			0x8009, 0x800A }, /* hi, lo */
+	{ "length_error_frames_count",		0x800B },
+	{ "alignment_error_frames_count",	0x800C },
+	{ "symbol_error_count",			0x800D },
+	{ "oversized_frames_count",		0x800E },
+	{ "undersized_frames_count",		0x800F },
+	{ "odd_nibble_frames_count",		0x8010 },
+	{ "odd_preamble_packet_count",		0x8011 },
+	{ "false_carrier_events_count",		0x8013 },
+};
+
 /**
  * struct adin_priv - ADIN PHY driver private data
  * tx_level_24v			set if the PHY supports 2.4V TX levels (10BASE-T1L)
+ * stats:			statistic counters for the PHY
  */
 struct adin_priv {
+	u64			stats[ARRAY_SIZE(adin_hw_stats)];
 	unsigned int		tx_level_24v:1;
 };
 
@@ -249,6 +272,11 @@ static int adin_soft_reset(struct phy_device *phydev)
 					 10000, 30000, true);
 }
 
+static int adin_config_init(struct phy_device *phydev)
+{
+	return phy_write_mmd(phydev, MDIO_MMD_VEND2, ADIN_FC_EN, 1);
+}
+
 static int adin_get_features(struct phy_device *phydev)
 {
 	struct adin_priv *priv = phydev->priv;
@@ -285,6 +313,53 @@ static int adin_get_features(struct phy_device *phydev)
 	return 0;
 }
 
+static int adin_get_sset_count(struct phy_device *phydev)
+{
+	return ARRAY_SIZE(adin_hw_stats);
+}
+
+static void adin_get_strings(struct phy_device *phydev, u8 *data)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(adin_hw_stats); i++)
+		strscpy(&data[i * ETH_GSTRING_LEN], adin_hw_stats[i].string, ETH_GSTRING_LEN);
+}
+
+static u64 adin_get_stat(struct phy_device *phydev, int i)
+{
+	const struct adin_hw_stat *stat = &adin_hw_stats[i];
+	struct adin_priv *priv = phydev->priv;
+	u64 val;
+	int ret;
+
+	ret = phy_read_mmd(phydev, MDIO_MMD_VEND2, stat->reg1);
+	if (ret < 0)
+		return U64_MAX;
+
+	val = (0xffff & ret);
+
+	if (stat->reg2 != 0) {
+		ret = phy_read_mmd(phydev, MDIO_MMD_VEND2, stat->reg2);
+		if (ret < 0)
+			return U64_MAX;
+
+		val = (val << 16) + (0xffff & ret);
+	}
+
+	priv->stats[i] += val;
+
+	return priv->stats[i];
+}
+
+static void adin_get_stats(struct phy_device *phydev, struct ethtool_stats *stats, u64 *data)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(adin_hw_stats); i++)
+		data[i] = adin_get_stat(phydev, i);
+}
+
 static int adin_probe(struct phy_device *phydev)
 {
 	struct device *dev = &phydev->mdio.dev;
@@ -306,11 +381,15 @@ static struct phy_driver adin_driver[] = {
 		.get_features		= adin_get_features,
 		.soft_reset		= adin_soft_reset,
 		.probe			= adin_probe,
+		.config_init		= adin_config_init,
 		.config_aneg		= adin_config_aneg,
 		.read_status		= adin_read_status,
 		.set_loopback		= adin_set_loopback,
 		.suspend		= adin_suspend,
 		.resume			= adin_resume,
+		.get_sset_count		= adin_get_sset_count,
+		.get_strings		= adin_get_strings,
+		.get_stats		= adin_get_stats,
 	},
 };
 
-- 
2.25.1


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

* [PATCH v2 5/7] net: phy: adin1100: Add ethtool master-slave support
  2021-07-12 13:06 [PATCH v2 0/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY alexandru.tachici
                   ` (3 preceding siblings ...)
  2021-07-12 13:06 ` [PATCH v2 4/7] net: phy: adin1100: Add ethtool get_stats support alexandru.tachici
@ 2021-07-12 13:06 ` alexandru.tachici
  2021-07-13 17:53   ` Andrew Lunn
  2021-07-12 13:06 ` [PATCH v2 6/7] net: phy: adin1100: Add SQI support alexandru.tachici
                   ` (2 subsequent siblings)
  7 siblings, 1 reply; 28+ messages in thread
From: alexandru.tachici @ 2021-07-12 13:06 UTC (permalink / raw)
  To: netdev, linux-kernel, devicetree
  Cc: robh+dt, andrew, hkallweit1, linux, davem, kuba, Alexandru Tachici

From: Alexandru Tachici <alexandru.tachici@analog.com>

Allow user to select the advertised master-slave
configuration through ethtool.

Signed-off-by: Alexandru Tachici <alexandru.tachici@analog.com>
---
 drivers/net/phy/adin1100.c | 78 +++++++++++++++++++++++++++++++++++++-
 1 file changed, 77 insertions(+), 1 deletion(-)

diff --git a/drivers/net/phy/adin1100.c b/drivers/net/phy/adin1100.c
index 94deaf52bbcd..ae216a80608b 100644
--- a/drivers/net/phy/adin1100.c
+++ b/drivers/net/phy/adin1100.c
@@ -37,7 +37,11 @@ static const int phy_10_features_array[] = {
 
 #define ADIN_AN_STATUS				0x0201
 #define ADIN_AN_ADV_ABILITY_L			0x0202
+#define   ADIN_AN_ADV_FORCE_MS			BIT(12)
+
 #define ADIN_AN_ADV_ABILITY_M			0x0203
+#define   ADIN_AN_ADV_MST			BIT(4)
+
 #define ADIN_AN_ADV_ABILITY_H			0x0204U
 #define   ADIN_AN_ADV_B10L_TX_LVL_HI_ABL	BIT(13)
 #define   ADIN_AN_ADV_B10L_TX_LVL_HI_REQ	BIT(12)
@@ -69,6 +73,10 @@ static const int phy_10_features_array[] = {
 #define   ADIN_CRSM_SFT_PD_RDY			BIT(1)
 #define   ADIN_CRSM_SYS_RDY			BIT(0)
 
+#define AN_PHY_INST_STATUS			0x8030
+#define   ADIN_IS_CFG_SLV			BIT(2)
+#define   ADIN_IS_CFG_MST			BIT(3)
+
 #define ADIN_MAC_IF_LOOPBACK			0x803d
 #define   ADIN_MAC_IF_LOOPBACK_EN		BIT(0)
 #define   ADIN_MAC_IF_REMOTE_LOOPBACK_EN	BIT(2)
@@ -164,6 +172,7 @@ static int adin_read_lpa(struct phy_device *phydev)
 static int adin_read_status(struct phy_device *phydev)
 {
 	int ret;
+	int cfg;
 
 	ret = genphy_c45_read_link(phydev);
 	if (ret)
@@ -173,6 +182,8 @@ static int adin_read_status(struct phy_device *phydev)
 	phydev->duplex = DUPLEX_UNKNOWN;
 	phydev->pause = 0;
 	phydev->asym_pause = 0;
+	phydev->master_slave_get = MASTER_SLAVE_CFG_UNKNOWN;
+	phydev->master_slave_state = MASTER_SLAVE_STATE_UNKNOWN;
 
 	if (phydev->autoneg == AUTONEG_ENABLE) {
 		ret = adin_read_lpa(phydev);
@@ -187,7 +198,37 @@ static int adin_read_status(struct phy_device *phydev)
 		phydev->duplex = DUPLEX_FULL;
 	}
 
-	return ret;
+	ret = phy_read_mmd(phydev, MDIO_MMD_AN, ADIN_AN_ADV_ABILITY_L);
+	if (ret < 0)
+		return ret;
+
+	cfg = phy_read_mmd(phydev, MDIO_MMD_AN, ADIN_AN_ADV_ABILITY_M);
+	if (cfg < 0)
+		return cfg;
+
+	if (ret & ADIN_AN_ADV_FORCE_MS) {
+		if (cfg & ADIN_AN_ADV_MST)
+			phydev->master_slave_get = MASTER_SLAVE_CFG_MASTER_FORCE;
+		else
+			phydev->master_slave_get = MASTER_SLAVE_CFG_SLAVE_FORCE;
+	} else {
+		if (cfg & ADIN_AN_ADV_MST)
+			phydev->master_slave_get = MASTER_SLAVE_CFG_MASTER_PREFERRED;
+		else
+			phydev->master_slave_get = MASTER_SLAVE_CFG_SLAVE_PREFERRED;
+	}
+
+	ret = phy_read_mmd(phydev, MDIO_MMD_AN, AN_PHY_INST_STATUS);
+	if (ret < 0)
+		return ret;
+
+	if (ret & ADIN_IS_CFG_SLV)
+		phydev->master_slave_state = MASTER_SLAVE_STATE_SLAVE;
+
+	if (ret & ADIN_IS_CFG_MST)
+		phydev->master_slave_state = MASTER_SLAVE_STATE_MASTER;
+
+	return 0;
 }
 
 static int adin_config_aneg(struct phy_device *phydev)
@@ -201,6 +242,41 @@ static int adin_config_aneg(struct phy_device *phydev)
 	if (phydev->autoneg == AUTONEG_DISABLE)
 		return 0;
 
+	switch (phydev->master_slave_set) {
+	case MASTER_SLAVE_CFG_MASTER_FORCE:
+	case MASTER_SLAVE_CFG_SLAVE_FORCE:
+		ret = phy_set_bits_mmd(phydev, MDIO_MMD_AN, ADIN_AN_ADV_ABILITY_L,
+				       ADIN_AN_ADV_FORCE_MS);
+		if (ret < 0)
+			return ret;
+		break;
+	case MASTER_SLAVE_CFG_MASTER_PREFERRED:
+	case MASTER_SLAVE_CFG_SLAVE_PREFERRED:
+		ret = phy_clear_bits_mmd(phydev, MDIO_MMD_AN, ADIN_AN_ADV_ABILITY_L,
+					 ADIN_AN_ADV_FORCE_MS);
+		break;
+	default:
+		break;
+	}
+
+	switch (phydev->master_slave_set) {
+	case MASTER_SLAVE_CFG_MASTER_FORCE:
+	case MASTER_SLAVE_CFG_MASTER_PREFERRED:
+		ret = phy_set_bits_mmd(phydev, MDIO_MMD_AN, ADIN_AN_ADV_ABILITY_M, ADIN_AN_ADV_MST);
+		if (ret < 0)
+			return ret;
+		break;
+	case MASTER_SLAVE_CFG_SLAVE_FORCE:
+	case MASTER_SLAVE_CFG_SLAVE_PREFERRED:
+		ret = phy_clear_bits_mmd(phydev, MDIO_MMD_AN, ADIN_AN_ADV_ABILITY_M,
+					 ADIN_AN_ADV_MST);
+		if (ret < 0)
+			return ret;
+		break;
+	default:
+		break;
+	}
+
 	if (priv->tx_level_24v)
 		ret = phy_set_bits_mmd(phydev, MDIO_MMD_AN,
 				       ADIN_AN_ADV_ABILITY_H,
-- 
2.25.1


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

* [PATCH v2 6/7] net: phy: adin1100: Add SQI support
  2021-07-12 13:06 [PATCH v2 0/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY alexandru.tachici
                   ` (4 preceding siblings ...)
  2021-07-12 13:06 ` [PATCH v2 5/7] net: phy: adin1100: Add ethtool master-slave support alexandru.tachici
@ 2021-07-12 13:06 ` alexandru.tachici
  2021-07-13 17:55   ` Andrew Lunn
  2021-07-12 13:06 ` [PATCH v2 7/7] dt-bindings: adin1100: Add binding for ADIN1100 Ethernet PHY alexandru.tachici
  2021-07-12 13:33 ` [PATCH v2 0/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY Russell King (Oracle)
  7 siblings, 1 reply; 28+ messages in thread
From: alexandru.tachici @ 2021-07-12 13:06 UTC (permalink / raw)
  To: netdev, linux-kernel, devicetree
  Cc: robh+dt, andrew, hkallweit1, linux, davem, kuba, Alexandru Tachici

From: Alexandru Tachici <alexandru.tachici@analog.com>

Determine the SQI from MSE using a predefined table
for the 10BASE-T1L.

Signed-off-by: Alexandru Tachici <alexandru.tachici@analog.com>
---
 drivers/net/phy/adin1100.c | 52 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)

diff --git a/drivers/net/phy/adin1100.c b/drivers/net/phy/adin1100.c
index ae216a80608b..46598ec4fb2c 100644
--- a/drivers/net/phy/adin1100.c
+++ b/drivers/net/phy/adin1100.c
@@ -63,6 +63,8 @@ static const int phy_10_features_array[] = {
 
 #define ADIN_FC_EN				0x8001
 
+#define ADIN_MSE_VAL				0x830B
+
 #define ADIN_CRSM_SFT_RST			0x8810
 #define   ADIN_CRSM_SFT_RST_EN			BIT(0)
 
@@ -81,6 +83,8 @@ static const int phy_10_features_array[] = {
 #define   ADIN_MAC_IF_LOOPBACK_EN		BIT(0)
 #define   ADIN_MAC_IF_REMOTE_LOOPBACK_EN	BIT(2)
 
+#define ADIN_SQI_MAX	7
+
 struct adin_hw_stat {
 	const char *string;
 	u16 reg1;
@@ -100,6 +104,22 @@ static const struct adin_hw_stat adin_hw_stats[] = {
 	{ "false_carrier_events_count",		0x8013 },
 };
 
+struct adin_mse_sqi_range {
+	u16 start;
+	u16 end;
+};
+
+static const struct adin_mse_sqi_range adin_mse_sqi_map[] = {
+	{ 0x0A74, 0xFFFF },
+	{ 0x084E, 0x0A74 },
+	{ 0x0698, 0x084E },
+	{ 0x053D, 0x0698 },
+	{ 0x0429, 0x053D },
+	{ 0x034E, 0x0429 },
+	{ 0x02A0, 0x034E },
+	{ 0x0000, 0x02A0 },
+};
+
 /**
  * struct adin_priv - ADIN PHY driver private data
  * tx_level_24v			set if the PHY supports 2.4V TX levels (10BASE-T1L)
@@ -436,6 +456,36 @@ static void adin_get_stats(struct phy_device *phydev, struct ethtool_stats *stat
 		data[i] = adin_get_stat(phydev, i);
 }
 
+static int adin_get_sqi(struct phy_device *phydev)
+{
+	u16 mse_val;
+	int sqi;
+	int ret;
+
+	ret = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_STAT1);
+	if (ret < 0)
+		return ret;
+	else if (!(ret & MDIO_STAT1_LSTATUS))
+		return 0;
+
+	ret = phy_read_mmd(phydev, MDIO_STAT1, ADIN_MSE_VAL);
+	if (ret < 0)
+		return ret;
+
+	mse_val = 0xFFFF & ret;
+	for (sqi = 0; sqi < ARRAY_SIZE(adin_mse_sqi_map); sqi++) {
+		if (mse_val >= adin_mse_sqi_map[sqi].start && mse_val <= adin_mse_sqi_map[sqi].end)
+			return sqi;
+	}
+
+	return -EINVAL;
+}
+
+static int adin_get_sqi_max(struct phy_device *phydev)
+{
+	return ADIN_SQI_MAX;
+}
+
 static int adin_probe(struct phy_device *phydev)
 {
 	struct device *dev = &phydev->mdio.dev;
@@ -466,6 +516,8 @@ static struct phy_driver adin_driver[] = {
 		.get_sset_count		= adin_get_sset_count,
 		.get_strings		= adin_get_strings,
 		.get_stats		= adin_get_stats,
+		.get_sqi		= adin_get_sqi,
+		.get_sqi_max		= adin_get_sqi_max,
 	},
 };
 
-- 
2.25.1


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

* [PATCH v2 7/7] dt-bindings: adin1100: Add binding for ADIN1100 Ethernet PHY
  2021-07-12 13:06 [PATCH v2 0/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY alexandru.tachici
                   ` (5 preceding siblings ...)
  2021-07-12 13:06 ` [PATCH v2 6/7] net: phy: adin1100: Add SQI support alexandru.tachici
@ 2021-07-12 13:06 ` alexandru.tachici
  2021-07-12 14:12   ` Rob Herring
  2021-07-27  5:53   ` Oleksij Rempel
  2021-07-12 13:33 ` [PATCH v2 0/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY Russell King (Oracle)
  7 siblings, 2 replies; 28+ messages in thread
From: alexandru.tachici @ 2021-07-12 13:06 UTC (permalink / raw)
  To: netdev, linux-kernel, devicetree
  Cc: robh+dt, andrew, hkallweit1, linux, davem, kuba, Alexandru Tachici

From: Alexandru Tachici <alexandru.tachici@analog.com>

DT bindings for the ADIN1100 10BASE-T1L Ethernet PHY.

Signed-off-by: Alexandru Tachici <alexandru.tachici@analog.com>
---
 .../devicetree/bindings/net/adi,adin1100.yaml | 45 +++++++++++++++++++
 1 file changed, 45 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/net/adi,adin1100.yaml

diff --git a/Documentation/devicetree/bindings/net/adi,adin1100.yaml b/Documentation/devicetree/bindings/net/adi,adin1100.yaml
new file mode 100644
index 000000000000..14943164da7a
--- /dev/null
+++ b/Documentation/devicetree/bindings/net/adi,adin1100.yaml
@@ -0,0 +1,45 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/net/adi,adin1100.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Analog Devices ADIN1100 PHY
+
+maintainers:
+  - Alexandru Tachici <alexandru.tachici@analog.com>
+
+description:
+  Bindings for Analog Devices Industrial Low Power 10BASE-T1L Ethernet PHY
+
+allOf:
+  - $ref: ethernet-phy.yaml#
+
+properties:
+  adi,disable-2400mv-tx-level:
+    description:
+      Prevent ADIN1100 from using the 2.4 V pk-pk transmit level.
+    type: boolean
+
+unevaluatedProperties: false
+
+examples:
+  - |
+    ethernet@e000c000 {
+            compatible = "cdns,zynq-gem", "cdns,gem";
+            reg = <0xe000c000 0x1000>;
+            status = "okay";
+            phy-mode = "mii";
+            interrupts = <0 45 4>;
+            clocks = <&clkc 31>, <&clkc 31>, <&clkc 14>;
+            clock-names = "pclk", "hclk", "tx_clk";
+            #address-cells = <1>;
+            #size-cells = <0>;
+
+            ethernet-phy@0 {
+                    reg = <0>;
+                    device_type = "ethernet-phy";
+                    adi,disable-2400mv-tx-level;
+            };
+
+    };
-- 
2.25.1


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

* Re: [PATCH v2 0/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY
  2021-07-12 13:06 [PATCH v2 0/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY alexandru.tachici
                   ` (6 preceding siblings ...)
  2021-07-12 13:06 ` [PATCH v2 7/7] dt-bindings: adin1100: Add binding for ADIN1100 Ethernet PHY alexandru.tachici
@ 2021-07-12 13:33 ` Russell King (Oracle)
  2021-07-23 17:32   ` Oleksij Rempel
  7 siblings, 1 reply; 28+ messages in thread
From: Russell King (Oracle) @ 2021-07-12 13:33 UTC (permalink / raw)
  To: alexandru.tachici
  Cc: netdev, linux-kernel, devicetree, robh+dt, andrew, hkallweit1,
	davem, kuba

On Mon, Jul 12, 2021 at 04:06:24PM +0300, alexandru.tachici@analog.com wrote:
> From: Alexandru Tachici <alexandru.tachici@analog.com>
> 
> The ADIN1100 is a low power single port 10BASE-T1L transceiver designed for
> industrial Ethernet applications and is compliant with the IEEE 802.3cg
> Ethernet standard for long reach 10 Mb/s Single Pair Ethernet.
> 
> Ethtool output:
>         Settings for eth1:
>         Supported ports: [ TP	 MII ]
>         Supported link modes:   10baseT1L/Full
>                                 2400mv
>                                 1000mv

The SI unit of voltage is V not v, so milli-volts is mV not mv. Surely,
at the very least, we should be using the SI designation in user
visible strings?

It may also be worth providing a brief description of 10BASE-T1L in the
cover letter so (e.g.) one doesn't have to look up the fact that the
voltage level is negotiated via bit 13 of the base page. I've found
that by searching google and finding dp83td510e.pdf

Thanks.

-- 
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 40Mbps down 10Mbps up. Decent connectivity at last!

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

* Re: [PATCH v2 7/7] dt-bindings: adin1100: Add binding for ADIN1100 Ethernet PHY
  2021-07-12 13:06 ` [PATCH v2 7/7] dt-bindings: adin1100: Add binding for ADIN1100 Ethernet PHY alexandru.tachici
@ 2021-07-12 14:12   ` Rob Herring
  2021-07-12 17:46     ` Rob Herring
  2021-07-27  5:53   ` Oleksij Rempel
  1 sibling, 1 reply; 28+ messages in thread
From: Rob Herring @ 2021-07-12 14:12 UTC (permalink / raw)
  To: alexandru.tachici
  Cc: netdev, devicetree, linux, hkallweit1, linux-kernel, kuba,
	andrew, robh+dt, davem

On Mon, 12 Jul 2021 16:06:31 +0300, alexandru.tachici@analog.com wrote:
> From: Alexandru Tachici <alexandru.tachici@analog.com>
> 
> DT bindings for the ADIN1100 10BASE-T1L Ethernet PHY.
> 
> Signed-off-by: Alexandru Tachici <alexandru.tachici@analog.com>
> ---
>  .../devicetree/bindings/net/adi,adin1100.yaml | 45 +++++++++++++++++++
>  1 file changed, 45 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/net/adi,adin1100.yaml
> 

My bot found errors running 'make DT_CHECKER_FLAGS=-m dt_binding_check'
on your patch (DT_CHECKER_FLAGS is new in v5.13):

yamllint warnings/errors:

dtschema/dtc warnings/errors:
Documentation/devicetree/bindings/net/adi,adin1100.example.dt.yaml:0:0: /example-0/ethernet@e000c000: failed to match any schema with compatible: ['cdns,zynq-gem', 'cdns,gem']
Documentation/devicetree/bindings/net/adi,adin1100.example.dt.yaml:0:0: /example-0/ethernet@e000c000: failed to match any schema with compatible: ['cdns,zynq-gem', 'cdns,gem']
\ndoc reference errors (make refcheckdocs):

See https://patchwork.ozlabs.org/patch/1503981

This check can fail if there are any dependencies. The base for a patch
series is generally the most recent rc1.

If you already ran 'make dt_binding_check' and didn't see the above
error(s), then make sure 'yamllint' is installed and dt-schema is up to
date:

pip3 install dtschema --upgrade

Please check and re-submit.


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

* Re: [PATCH v2 7/7] dt-bindings: adin1100: Add binding for ADIN1100 Ethernet PHY
  2021-07-12 14:12   ` Rob Herring
@ 2021-07-12 17:46     ` Rob Herring
  0 siblings, 0 replies; 28+ messages in thread
From: Rob Herring @ 2021-07-12 17:46 UTC (permalink / raw)
  To: alexandru.tachici
  Cc: netdev, devicetree, linux, hkallweit1, linux-kernel, kuba, andrew, davem

On Mon, Jul 12, 2021 at 08:12:53AM -0600, Rob Herring wrote:
> On Mon, 12 Jul 2021 16:06:31 +0300, alexandru.tachici@analog.com wrote:
> > From: Alexandru Tachici <alexandru.tachici@analog.com>
> > 
> > DT bindings for the ADIN1100 10BASE-T1L Ethernet PHY.
> > 
> > Signed-off-by: Alexandru Tachici <alexandru.tachici@analog.com>
> > ---
> >  .../devicetree/bindings/net/adi,adin1100.yaml | 45 +++++++++++++++++++
> >  1 file changed, 45 insertions(+)
> >  create mode 100644 Documentation/devicetree/bindings/net/adi,adin1100.yaml
> > 
> 
> My bot found errors running 'make DT_CHECKER_FLAGS=-m dt_binding_check'
> on your patch (DT_CHECKER_FLAGS is new in v5.13):
> 
> yamllint warnings/errors:
> 
> dtschema/dtc warnings/errors:
> Documentation/devicetree/bindings/net/adi,adin1100.example.dt.yaml:0:0: /example-0/ethernet@e000c000: failed to match any schema with compatible: ['cdns,zynq-gem', 'cdns,gem']
> Documentation/devicetree/bindings/net/adi,adin1100.example.dt.yaml:0:0: /example-0/ethernet@e000c000: failed to match any schema with compatible: ['cdns,zynq-gem', 'cdns,gem']

Please either convert the above binding or use something that already 
has a schema.

Rob

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

* Re: [PATCH v2 4/7] net: phy: adin1100: Add ethtool get_stats support
  2021-07-12 13:06 ` [PATCH v2 4/7] net: phy: adin1100: Add ethtool get_stats support alexandru.tachici
@ 2021-07-12 18:41   ` Jakub Kicinski
  0 siblings, 0 replies; 28+ messages in thread
From: Jakub Kicinski @ 2021-07-12 18:41 UTC (permalink / raw)
  To: alexandru.tachici
  Cc: netdev, linux-kernel, devicetree, robh+dt, andrew, hkallweit1,
	linux, davem

On Mon, 12 Jul 2021 16:06:28 +0300 alexandru.tachici@analog.com wrote:
> +static const struct adin_hw_stat adin_hw_stats[] = {
> +	{ "total_frames_error_count",		0x8008 },
> +	{ "total_frames_count",			0x8009, 0x800A }, /* hi, lo */
> +	{ "length_error_frames_count",		0x800B },
> +	{ "alignment_error_frames_count",	0x800C },
> +	{ "symbol_error_count",			0x800D },
> +	{ "oversized_frames_count",		0x800E },
> +	{ "undersized_frames_count",		0x800F },
> +	{ "odd_nibble_frames_count",		0x8010 },
> +	{ "odd_preamble_packet_count",		0x8011 },
> +	{ "false_carrier_events_count",		0x8013 },
> +};

Since this phy seems to implement a lot MAC stats would it make sense
to plumb thru the new ethtool API for PHYs (ethtool_eth_mac_stats etc.)
rather than let the same string proliferation problem spring up in
another section of the code?

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

* Re: [PATCH v2 1/7] ethtool: Add 10base-T1L link mode entries
  2021-07-12 13:06 ` [PATCH v2 1/7] ethtool: Add 10base-T1L link mode entries alexandru.tachici
@ 2021-07-13 16:50   ` Andrew Lunn
  2021-07-27  5:56   ` Oleksij Rempel
  1 sibling, 0 replies; 28+ messages in thread
From: Andrew Lunn @ 2021-07-13 16:50 UTC (permalink / raw)
  To: alexandru.tachici
  Cc: netdev, linux-kernel, devicetree, robh+dt, hkallweit1, linux,
	davem, kuba

On Mon, Jul 12, 2021 at 04:06:25PM +0300, alexandru.tachici@analog.com wrote:
> From: Alexandru Tachici <alexandru.tachici@analog.com>
> 
> Add entries for the 10base-T1L full and half duplex supported modes.
> 
> Signed-off-by: Alexandru Tachici <alexandru.tachici@analog.com>

Reviewed-by: Andrew Lunn <andrew@lunn.ch>

    Andrew

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

* Re: [PATCH v2 3/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY
  2021-07-12 13:06 ` [PATCH v2 3/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY alexandru.tachici
@ 2021-07-13 16:58   ` Andrew Lunn
  2021-07-16 21:24     ` ADIN1100 alexandru.tachici
  2021-07-27  6:31     ` [PATCH v2 3/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY Oleksij Rempel
  2021-07-27  6:47   ` Oleksij Rempel
  1 sibling, 2 replies; 28+ messages in thread
From: Andrew Lunn @ 2021-07-13 16:58 UTC (permalink / raw)
  To: alexandru.tachici
  Cc: netdev, linux-kernel, devicetree, robh+dt, hkallweit1, linux,
	davem, kuba, Alexandru Ardelean

> +static const int phy_10_features_array[] = {
> +	ETHTOOL_LINK_MODE_10baseT1L_Full_BIT,

Does you device implement ETHTOOL_LINK_MODE_10baseT1L_Half_BIT? I'm
assuming half duplex is part of the standard?

	 Andrew

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

* Re: [PATCH v2 5/7] net: phy: adin1100: Add ethtool master-slave support
  2021-07-12 13:06 ` [PATCH v2 5/7] net: phy: adin1100: Add ethtool master-slave support alexandru.tachici
@ 2021-07-13 17:53   ` Andrew Lunn
  0 siblings, 0 replies; 28+ messages in thread
From: Andrew Lunn @ 2021-07-13 17:53 UTC (permalink / raw)
  To: alexandru.tachici
  Cc: netdev, linux-kernel, devicetree, robh+dt, hkallweit1, linux,
	davem, kuba

On Mon, Jul 12, 2021 at 04:06:29PM +0300, alexandru.tachici@analog.com wrote:
> From: Alexandru Tachici <alexandru.tachici@analog.com>
> 
> Allow user to select the advertised master-slave
> configuration through ethtool.
> 
> Signed-off-by: Alexandru Tachici <alexandru.tachici@analog.com>

Reviewed-by: Andrew Lunn <andrew@lunn.ch>

    Andrew

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

* Re: [PATCH v2 6/7] net: phy: adin1100: Add SQI support
  2021-07-12 13:06 ` [PATCH v2 6/7] net: phy: adin1100: Add SQI support alexandru.tachici
@ 2021-07-13 17:55   ` Andrew Lunn
  0 siblings, 0 replies; 28+ messages in thread
From: Andrew Lunn @ 2021-07-13 17:55 UTC (permalink / raw)
  To: alexandru.tachici
  Cc: netdev, linux-kernel, devicetree, robh+dt, hkallweit1, linux,
	davem, kuba

On Mon, Jul 12, 2021 at 04:06:30PM +0300, alexandru.tachici@analog.com wrote:
> From: Alexandru Tachici <alexandru.tachici@analog.com>
> 
> Determine the SQI from MSE using a predefined table
> for the 10BASE-T1L.
> 
> Signed-off-by: Alexandru Tachici <alexandru.tachici@analog.com>

Reviewed-by: Andrew Lunn <andrew@lunn.ch>

    Andrew

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

* ADIN1100
  2021-07-13 16:58   ` Andrew Lunn
@ 2021-07-16 21:24     ` alexandru.tachici
  2021-07-23 17:20       ` ADIN1100 Oleksij Rempel
  2021-07-27  6:31     ` [PATCH v2 3/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY Oleksij Rempel
  1 sibling, 1 reply; 28+ messages in thread
From: alexandru.tachici @ 2021-07-16 21:24 UTC (permalink / raw)
  To: andrew
  Cc: alexandru.ardelean, alexandru.tachici, davem, devicetree,
	hkallweit1, kuba, linux-kernel, linux, netdev, robh+dt

No, ADIN1100 supports only full duplex mode. Added this one just to
report through ethtool if lp supports it or not.

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

* Re: ADIN1100
  2021-07-16 21:24     ` ADIN1100 alexandru.tachici
@ 2021-07-23 17:20       ` Oleksij Rempel
  0 siblings, 0 replies; 28+ messages in thread
From: Oleksij Rempel @ 2021-07-23 17:20 UTC (permalink / raw)
  To: alexandru.tachici
  Cc: andrew, alexandru.ardelean, davem, devicetree, hkallweit1, kuba,
	linux-kernel, linux, netdev, robh+dt

On Sat, Jul 17, 2021 at 12:24:27AM +0300, alexandru.tachici@analog.com wrote:
> No, ADIN1100 supports only full duplex mode. Added this one just to
> report through ethtool if lp supports it or not.

Same about TI T1L phy, there is not half duplex support. I'm courios if
this is actually required by the 802.3cg standard. 

-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

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

* Re: [PATCH v2 0/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY
  2021-07-12 13:33 ` [PATCH v2 0/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY Russell King (Oracle)
@ 2021-07-23 17:32   ` Oleksij Rempel
  2021-08-03  9:47     ` alexandru.tachici
  0 siblings, 1 reply; 28+ messages in thread
From: Oleksij Rempel @ 2021-07-23 17:32 UTC (permalink / raw)
  To: Russell King (Oracle)
  Cc: alexandru.tachici, netdev, linux-kernel, devicetree, robh+dt,
	andrew, hkallweit1, davem, kuba

On Mon, Jul 12, 2021 at 02:33:58PM +0100, Russell King (Oracle) wrote:
> On Mon, Jul 12, 2021 at 04:06:24PM +0300, alexandru.tachici@analog.com wrote:
> > From: Alexandru Tachici <alexandru.tachici@analog.com>
> > 
> > The ADIN1100 is a low power single port 10BASE-T1L transceiver designed for
> > industrial Ethernet applications and is compliant with the IEEE 802.3cg
> > Ethernet standard for long reach 10 Mb/s Single Pair Ethernet.
> > 
> > Ethtool output:
> >         Settings for eth1:
> >         Supported ports: [ TP	 MII ]
> >         Supported link modes:   10baseT1L/Full
> >                                 2400mv
> >                                 1000mv
> 
> The SI unit of voltage is V not v, so milli-volts is mV not mv. Surely,
> at the very least, we should be using the SI designation in user
> visible strings?
> 
> It may also be worth providing a brief description of 10BASE-T1L in the
> cover letter so (e.g.) one doesn't have to look up the fact that the
> voltage level is negotiated via bit 13 of the base page. I've found
> that by searching google and finding dp83td510e.pdf

I'm curios how the voltage should be actually chosen?

In the adin1100 datasheet i read:
"The 1.0 V pk-pk operating mode, external termination resistors and independent
Rx/Tx pins make the ADIN1100 suited to intrinsic safety applications"

"For long reach/trunk applications the higher transmit amplitude of 2.4 V pk-pk"

So, it seems to depends on:
- do we have safety requirements?
- how long is the cable?

Can we use 2.4V any time if it is available or it is bad idea for short
cables?

Regards,
Oleksij
-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

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

* Re: [PATCH v2 7/7] dt-bindings: adin1100: Add binding for ADIN1100 Ethernet PHY
  2021-07-12 13:06 ` [PATCH v2 7/7] dt-bindings: adin1100: Add binding for ADIN1100 Ethernet PHY alexandru.tachici
  2021-07-12 14:12   ` Rob Herring
@ 2021-07-27  5:53   ` Oleksij Rempel
  2021-07-28 17:23     ` Rob Herring
  1 sibling, 1 reply; 28+ messages in thread
From: Oleksij Rempel @ 2021-07-27  5:53 UTC (permalink / raw)
  To: alexandru.tachici
  Cc: netdev, linux-kernel, devicetree, robh+dt, andrew, hkallweit1,
	linux, davem, kuba

On Mon, Jul 12, 2021 at 04:06:31PM +0300, alexandru.tachici@analog.com wrote:
> From: Alexandru Tachici <alexandru.tachici@analog.com>
> 
> DT bindings for the ADIN1100 10BASE-T1L Ethernet PHY.
> 
> Signed-off-by: Alexandru Tachici <alexandru.tachici@analog.com>
> ---
>  .../devicetree/bindings/net/adi,adin1100.yaml | 45 +++++++++++++++++++
>  1 file changed, 45 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/net/adi,adin1100.yaml
> 
> diff --git a/Documentation/devicetree/bindings/net/adi,adin1100.yaml b/Documentation/devicetree/bindings/net/adi,adin1100.yaml
> new file mode 100644
> index 000000000000..14943164da7a
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/net/adi,adin1100.yaml
> @@ -0,0 +1,45 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/net/adi,adin1100.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Analog Devices ADIN1100 PHY
> +
> +maintainers:
> +  - Alexandru Tachici <alexandru.tachici@analog.com>
> +
> +description:
> +  Bindings for Analog Devices Industrial Low Power 10BASE-T1L Ethernet PHY
> +
> +allOf:
> +  - $ref: ethernet-phy.yaml#
> +
> +properties:
> +  adi,disable-2400mv-tx-level:
> +    description:
> +      Prevent ADIN1100 from using the 2.4 V pk-pk transmit level.
> +    type: boolean

This property should be generic. It is defined by IEEE 802.3cg 2019 and can
be implemented on all T1L PHYs.

I assume, it should be something like:
ethernet-phy-10base-t1l-2.4vpp-enable
ethernet-phy-10base-t1l-2.4vpp-disable

To overwrite bootstrapped of fuzed values if supported. The IEEE 802.3cg
specification uses following wordings for this functionality:
"10BASE-T1L increased transmit level request ..."

"146.5.4.1 Transmitter output voltage
When tested with the test fixture shown in Figure 146–20 with the transmitter
in test mode 1, the transmitter output voltage shall be 2.4 V + 5%/ – 15%
peak-to-peak (for the 2.4 Vpp operating mode) and 1.0 V + 5%/ – 15%
peak-to-peak (for the 1.0 Vpp operating mode). Transmitter output
voltage can be set using the management interface or by hardware default set-up."

I would recommend to use similar wording if possible.


> +
> +unevaluatedProperties: false
> +
> +examples:
> +  - |
> +    ethernet@e000c000 {
> +            compatible = "cdns,zynq-gem", "cdns,gem";
> +            reg = <0xe000c000 0x1000>;
> +            status = "okay";
> +            phy-mode = "mii";
> +            interrupts = <0 45 4>;
> +            clocks = <&clkc 31>, <&clkc 31>, <&clkc 14>;
> +            clock-names = "pclk", "hclk", "tx_clk";
> +            #address-cells = <1>;
> +            #size-cells = <0>;
> +
> +            ethernet-phy@0 {
> +                    reg = <0>;
> +                    device_type = "ethernet-phy";
> +                    adi,disable-2400mv-tx-level;
> +            };
> +
> +    };
> -- 
> 2.25.1
> 
> 

-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

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

* Re: [PATCH v2 1/7] ethtool: Add 10base-T1L link mode entries
  2021-07-12 13:06 ` [PATCH v2 1/7] ethtool: Add 10base-T1L link mode entries alexandru.tachici
  2021-07-13 16:50   ` Andrew Lunn
@ 2021-07-27  5:56   ` Oleksij Rempel
  1 sibling, 0 replies; 28+ messages in thread
From: Oleksij Rempel @ 2021-07-27  5:56 UTC (permalink / raw)
  To: alexandru.tachici
  Cc: netdev, linux-kernel, devicetree, robh+dt, andrew, hkallweit1,
	linux, davem, kuba

On Mon, Jul 12, 2021 at 04:06:25PM +0300, alexandru.tachici@analog.com wrote:
> From: Alexandru Tachici <alexandru.tachici@analog.com>
> 
> Add entries for the 10base-T1L full and half duplex supported modes.
> 
> Signed-off-by: Alexandru Tachici <alexandru.tachici@analog.com>
> ---
>  drivers/net/phy/phy-core.c   | 4 +++-
>  include/uapi/linux/ethtool.h | 2 ++
>  net/ethtool/common.c         | 2 ++
>  3 files changed, 7 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/phy/phy-core.c b/drivers/net/phy/phy-core.c
> index 2870c33b8975..fd9c83ce10fc 100644
> --- a/drivers/net/phy/phy-core.c
> +++ b/drivers/net/phy/phy-core.c
> @@ -13,7 +13,7 @@
>   */
>  const char *phy_speed_to_str(int speed)
>  {
> -	BUILD_BUG_ON_MSG(__ETHTOOL_LINK_MODE_MASK_NBITS != 92,
> +	BUILD_BUG_ON_MSG(__ETHTOOL_LINK_MODE_MASK_NBITS != 94,
>  		"Enum ethtool_link_mode_bit_indices and phylib are out of sync. "
>  		"If a speed or mode has been added please update phy_speed_to_str "
>  		"and the PHY settings array.\n");
> @@ -176,6 +176,8 @@ static const struct phy_setting settings[] = {
>  	/* 10M */
>  	PHY_SETTING(     10, FULL,     10baseT_Full		),
>  	PHY_SETTING(     10, HALF,     10baseT_Half		),
> +	PHY_SETTING(     10, FULL,     10baseT1L_Full		),
> +	PHY_SETTING(     10, HALF,     10baseT1L_Half		),
>  };
>  #undef PHY_SETTING

IEEE 802.3cg-2019 do not define half duplex support for T1L, only for
T1S. IMO, 10baseT1L_Half can be dropped.


> diff --git a/include/uapi/linux/ethtool.h b/include/uapi/linux/ethtool.h
> index 67aa7134b301..8a905466d7dc 100644
> --- a/include/uapi/linux/ethtool.h
> +++ b/include/uapi/linux/ethtool.h
> @@ -1659,6 +1659,8 @@ enum ethtool_link_mode_bit_indices {
>  	ETHTOOL_LINK_MODE_400000baseCR4_Full_BIT	 = 89,
>  	ETHTOOL_LINK_MODE_100baseFX_Half_BIT		 = 90,
>  	ETHTOOL_LINK_MODE_100baseFX_Full_BIT		 = 91,
> +	ETHTOOL_LINK_MODE_10baseT1L_Half_BIT		 = 92,
> +	ETHTOOL_LINK_MODE_10baseT1L_Full_BIT		 = 93,
>  	/* must be last entry */
>  	__ETHTOOL_LINK_MODE_MASK_NBITS
>  };
> diff --git a/net/ethtool/common.c b/net/ethtool/common.c
> index f9dcbad84788..5b93d888fd83 100644
> --- a/net/ethtool/common.c
> +++ b/net/ethtool/common.c
> @@ -199,6 +199,8 @@ const char link_mode_names[][ETH_GSTRING_LEN] = {
>  	__DEFINE_LINK_MODE_NAME(400000, CR4, Full),
>  	__DEFINE_LINK_MODE_NAME(100, FX, Half),
>  	__DEFINE_LINK_MODE_NAME(100, FX, Full),
> +	__DEFINE_LINK_MODE_NAME(10, T1L, Half),
> +	__DEFINE_LINK_MODE_NAME(10, T1L, Full),
>  };
>  static_assert(ARRAY_SIZE(link_mode_names) == __ETHTOOL_LINK_MODE_MASK_NBITS);
>  
> -- 
> 2.25.1
> 
> 

-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

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

* Re: [PATCH v2 3/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY
  2021-07-13 16:58   ` Andrew Lunn
  2021-07-16 21:24     ` ADIN1100 alexandru.tachici
@ 2021-07-27  6:31     ` Oleksij Rempel
  1 sibling, 0 replies; 28+ messages in thread
From: Oleksij Rempel @ 2021-07-27  6:31 UTC (permalink / raw)
  To: Andrew Lunn
  Cc: alexandru.tachici, netdev, linux-kernel, devicetree, robh+dt,
	hkallweit1, linux, davem, kuba, Alexandru Ardelean

On Tue, Jul 13, 2021 at 06:58:30PM +0200, Andrew Lunn wrote:
> > +static const int phy_10_features_array[] = {
> > +	ETHTOOL_LINK_MODE_10baseT1L_Full_BIT,
> 
> Does you device implement ETHTOOL_LINK_MODE_10baseT1L_Half_BIT? I'm
> assuming half duplex is part of the standard?

No, there is no ETHTOOL_LINK_MODE_10baseT1L_Half_BIT according to
802.3cg-2019.

-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

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

* Re: [PATCH v2 3/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY
  2021-07-12 13:06 ` [PATCH v2 3/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY alexandru.tachici
  2021-07-13 16:58   ` Andrew Lunn
@ 2021-07-27  6:47   ` Oleksij Rempel
  2021-07-27 16:36     ` Andrew Lunn
  1 sibling, 1 reply; 28+ messages in thread
From: Oleksij Rempel @ 2021-07-27  6:47 UTC (permalink / raw)
  To: alexandru.tachici
  Cc: netdev, linux-kernel, devicetree, robh+dt, andrew, hkallweit1,
	linux, davem, kuba, Alexandru Ardelean

On Mon, Jul 12, 2021 at 04:06:27PM +0300, alexandru.tachici@analog.com wrote:
> From: Alexandru Ardelean <alexandru.ardelean@analog.com>
> 
> The ADIN1100 is a low power single port 10BASE-T1L transceiver designed for
> industrial Ethernet applications and is compliant with the IEEE 802.3cg
> Ethernet standard for long reach 10 Mb/s Single Pair Ethernet.
> 
> Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
> Signed-off-by: Alexandru Tachici <alexandru.tachici@analog.com>
> ---
>  drivers/net/phy/Kconfig    |   7 +
>  drivers/net/phy/Makefile   |   1 +
>  drivers/net/phy/adin1100.c | 326 +++++++++++++++++++++++++++++++++++++
>  3 files changed, 334 insertions(+)
>  create mode 100644 drivers/net/phy/adin1100.c
> 
> diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig
> index c56f703ae998..8f9f61fe0020 100644
> --- a/drivers/net/phy/Kconfig
> +++ b/drivers/net/phy/Kconfig
> @@ -83,6 +83,13 @@ config ADIN_PHY
>  	  - ADIN1300 - Robust,Industrial, Low Latency 10/100/1000 Gigabit
>  	    Ethernet PHY
>  
> +config ADIN1100_PHY
> +	tristate "Analog Devices Industrial Ethernet T1L PHYs"
> +	help
> +	  Adds support for the Analog Devices Industrial T1L Ethernet PHYs.
> +	  Currently supports the:
> +	  - ADIN1100 - Robust,Industrial, Low Power 10BASE-T1L Ethernet PHY
> +
>  config AQUANTIA_PHY
>  	tristate "Aquantia PHYs"
>  	help
> diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile
> index 172bb193ae6a..3bd6a369d60c 100644
> --- a/drivers/net/phy/Makefile
> +++ b/drivers/net/phy/Makefile
> @@ -31,6 +31,7 @@ sfp-obj-$(CONFIG_SFP)		+= sfp-bus.o
>  obj-y				+= $(sfp-obj-y) $(sfp-obj-m)
>  
>  obj-$(CONFIG_ADIN_PHY)		+= adin.o
> +obj-$(CONFIG_ADIN1100_PHY)	+= adin1100.o
>  obj-$(CONFIG_AMD_PHY)		+= amd.o
>  aquantia-objs			+= aquantia_main.o
>  ifdef CONFIG_HWMON
> diff --git a/drivers/net/phy/adin1100.c b/drivers/net/phy/adin1100.c
> new file mode 100644
> index 000000000000..682fc617c51b
> --- /dev/null
> +++ b/drivers/net/phy/adin1100.c
> @@ -0,0 +1,326 @@
> +// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
> +/*
> + *  Driver for Analog Devices Industrial Ethernet T1L PHYs
> + *
> + * Copyright 2020 Analog Devices Inc.
> + */
> +#include <linux/kernel.h>
> +#include <linux/bitfield.h>
> +#include <linux/delay.h>
> +#include <linux/errno.h>
> +#include <linux/init.h>
> +#include <linux/module.h>
> +#include <linux/mii.h>
> +#include <linux/phy.h>
> +#include <linux/property.h>
> +
> +#define PHY_ID_ADIN1100				0x0283bc81
> +
> +static const int phy_10_features_array[] = {
> +	ETHTOOL_LINK_MODE_10baseT1L_Full_BIT,
> +	ETHTOOL_LINK_MODE_1000mv_BIT,
> +};
> +
> +#define ADIN_B10L_PCS_CNTRL			0x08e6
> +#define   ADIN_PCS_CNTRL_B10L_LB_PCS_EN		BIT(14)

This register is "45.2.3.68a 10BASE-T1L PCS control register (Register
3.2278)" according to the 802.3cg-2019.

> +#define ADIN_B10L_PMA_CNTRL			0x08f6
> +#define   ADIN_PMA_CNTRL_B10L_LB_PMA_LOC_EN	BIT(0)
> +
> +#define ADIN_B10L_PMA_STAT			0x08f7
> +#define   ADIN_PMA_STAT_B10L_LB_PMA_LOC_ABLE	BIT(13)
> +#define   ADIN_PMA_STAT_B10L_TX_LVL_HI_ABLE	BIT(12)
> +
> +#define ADIN_AN_CONTROL				0x0200
> +#define   ADIN_AN_RESTART			BIT(9)
> +#define   ADIN_AN_EN				BIT(12)
> +
> +#define ADIN_AN_STATUS				0x0201
> +#define ADIN_AN_ADV_ABILITY_L			0x0202
> +#define ADIN_AN_ADV_ABILITY_M			0x0203
> +#define ADIN_AN_ADV_ABILITY_H			0x0204U
> +#define   ADIN_AN_ADV_B10L_TX_LVL_HI_ABL	BIT(13)
> +#define   ADIN_AN_ADV_B10L_TX_LVL_HI_REQ	BIT(12)

All of this bits are implemented according to the 802.3-2018 standard,
For example ADIN_AN_CONTROL is corresponding to "45.2.7.19 BASE-T1 AN control register (Register 7.512)"

> +
> +#define ADIN_AN_LP_ADV_ABILITY_L		0x0205
> +
> +#define ADIN_AN_LP_ADV_ABILITY_M		0x0206
> +#define   ADIN_AN_LP_ADV_B10L			BIT(14)
> +#define   ADIN_AN_LP_ADV_B1000			BIT(7)
> +#define   ADIN_AN_LP_ADV_B10S_FD		BIT(6)
> +#define   ADIN_AN_LP_ADV_B100			BIT(5)
> +#define   ADIN_AN_LP_ADV_MST			BIT(4)
> +
> +#define ADIN_AN_LP_ADV_ABILITY_H		0x0207
> +#define   ADIN_AN_LP_ADV_B10L_EEE		BIT(14)
> +#define   ADIN_AN_LP_ADV_B10L_TX_LVL_HI_ABL	BIT(13)
> +#define   ADIN_AN_LP_ADV_B10L_TX_LVL_HI_REQ	BIT(12)
> +#define   ADIN_AN_LP_ADV_B10S_HD		BIT(11)

This registers are:
45.2.7.22 BASE-T1 AN LP Base Page ability register (Registers 7.517, 7.518 ..

> +
> +#define ADIN_CRSM_SFT_RST			0x8810
> +#define   ADIN_CRSM_SFT_RST_EN			BIT(0)
> +
> +#define ADIN_CRSM_SFT_PD_CNTRL			0x8812
> +#define   ADIN_CRSM_SFT_PD_CNTRL_EN		BIT(0)
> +
> +#define ADIN_CRSM_STAT				0x8818
> +#define   ADIN_CRSM_SFT_PD_RDY			BIT(1)
> +#define   ADIN_CRSM_SYS_RDY			BIT(0)
> +
> +#define ADIN_MAC_IF_LOOPBACK			0x803d
> +#define   ADIN_MAC_IF_LOOPBACK_EN		BIT(0)
> +#define   ADIN_MAC_IF_REMOTE_LOOPBACK_EN	BIT(2)
> +

Please compare the PHY datasheet with 802.3.2018 and 802.3cg-2019, and
implement common parts as phy generic code.

> +/**
> + * struct adin_priv - ADIN PHY driver private data
> + * tx_level_24v			set if the PHY supports 2.4V TX levels (10BASE-T1L)
> + */
> +struct adin_priv {
> +	unsigned int		tx_level_24v:1;
> +};
> +
> +static void adin_mii_adv_m_to_ethtool_adv_t(unsigned long *advertising, u32 adv)
> +{
> +	if (adv & ADIN_AN_LP_ADV_B10L)
> +		linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT1L_Full_BIT, advertising);
> +}
> +
> +static void adin_mii_adv_h_to_ethtool_adv_t(unsigned long *advertising, u32 adv)
> +{
> +	if (adv & ADIN_AN_LP_ADV_B10S_HD)
> +		linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT1L_Half_BIT, advertising);
> +	if (adv & ADIN_AN_LP_ADV_B10L_TX_LVL_HI_ABL)
> +		linkmode_set_bit(ETHTOOL_LINK_MODE_2400mv_BIT, advertising);
> +	if (!(adv & ADIN_AN_LP_ADV_B10L_TX_LVL_HI_REQ))
> +		linkmode_set_bit(ETHTOOL_LINK_MODE_1000mv_BIT, advertising);
> +}
> +
> +static int adin_read_lpa(struct phy_device *phydev)
> +{
> +	int val;
> +
> +	linkmode_zero(phydev->lp_advertising);
> +
> +	val = phy_read_mmd(phydev, MDIO_MMD_AN, ADIN_AN_STATUS);
> +	if (val < 0)
> +		return val;
> +
> +	if (!(val & MDIO_AN_STAT1_COMPLETE)) {
> +		phydev->pause = 0;
> +		phydev->asym_pause = 0;
> +
> +		return 0;
> +	}
> +
> +	linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
> +			 phydev->lp_advertising);
> +
> +	/* Read the link partner's base page advertisement */
> +	val = phy_read_mmd(phydev, MDIO_MMD_AN, ADIN_AN_LP_ADV_ABILITY_L);
> +	if (val < 0)
> +		return val;
> +
> +	phydev->pause = val & LPA_PAUSE_CAP ? 1 : 0;
> +	phydev->asym_pause = val & LPA_PAUSE_ASYM ? 1 : 0;
> +
> +	val = phy_read_mmd(phydev, MDIO_MMD_AN, ADIN_AN_LP_ADV_ABILITY_M);
> +	if (val < 0)
> +		return val;
> +
> +	adin_mii_adv_m_to_ethtool_adv_t(phydev->lp_advertising, val);
> +
> +	val = phy_read_mmd(phydev, MDIO_MMD_AN, ADIN_AN_LP_ADV_ABILITY_H);
> +	if (val < 0)
> +		return val;
> +
> +	adin_mii_adv_h_to_ethtool_adv_t(phydev->lp_advertising, val);
> +
> +	return 0;
> +}
> +
> +static int adin_read_status(struct phy_device *phydev)
> +{
> +	int ret;
> +
> +	ret = genphy_c45_read_link(phydev);
> +	if (ret)
> +		return ret;
> +
> +	phydev->speed = SPEED_UNKNOWN;
> +	phydev->duplex = DUPLEX_UNKNOWN;
> +	phydev->pause = 0;
> +	phydev->asym_pause = 0;
> +
> +	if (phydev->autoneg == AUTONEG_ENABLE) {
> +		ret = adin_read_lpa(phydev);
> +		if (ret)
> +			return ret;
> +
> +		phy_resolve_aneg_linkmode(phydev);
> +	} else {
> +		/* Only one mode & duplex supported */
> +		linkmode_zero(phydev->lp_advertising);
> +		phydev->speed = SPEED_10;
> +		phydev->duplex = DUPLEX_FULL;
> +	}
> +
> +	return ret;
> +}
> +
> +static int adin_config_aneg(struct phy_device *phydev)
> +{
> +	struct adin_priv *priv = phydev->priv;
> +	int ret;
> +
> +	/* No sense to continue if auto-neg is disabled,
> +	 * only one link-mode supported.
> +	 */
> +	if (phydev->autoneg == AUTONEG_DISABLE)
> +		return 0;
> +
> +	if (priv->tx_level_24v)
> +		ret = phy_set_bits_mmd(phydev, MDIO_MMD_AN,
> +				       ADIN_AN_ADV_ABILITY_H,
> +				       ADIN_AN_ADV_B10L_TX_LVL_HI_ABL |
> +				       ADIN_AN_ADV_B10L_TX_LVL_HI_REQ);
> +	else
> +		ret = phy_clear_bits_mmd(phydev, MDIO_MMD_AN,
> +					 ADIN_AN_ADV_ABILITY_H,
> +					 ADIN_AN_ADV_B10L_TX_LVL_HI_ABL |
> +					 ADIN_AN_ADV_B10L_TX_LVL_HI_REQ);
> +
> +	if (ret < 0)
> +		return ret;
> +
> +	return phy_set_bits_mmd(phydev, MDIO_MMD_AN, ADIN_AN_CONTROL, ADIN_AN_RESTART);
> +}
> +
> +static int adin_set_powerdown_mode(struct phy_device *phydev, bool en)
> +{
> +	int ret;
> +	int val;
> +
> +	if (en)
> +		val = ADIN_CRSM_SFT_PD_CNTRL_EN;
> +	else
> +		val = 0;
> +
> +	ret = phy_write_mmd(phydev, MDIO_MMD_VEND1,
> +			    ADIN_CRSM_SFT_PD_CNTRL, val);
> +	if (ret < 0)
> +		return ret;
> +
> +	return phy_read_mmd_poll_timeout(phydev, MDIO_MMD_VEND1, ADIN_CRSM_STAT, ret,
> +					 (ret & ADIN_CRSM_SFT_PD_RDY) == val,
> +					 1000, 30000, true);
> +}
> +
> +static int adin_suspend(struct phy_device *phydev)
> +{
> +	return adin_set_powerdown_mode(phydev, true);
> +}
> +
> +static int adin_resume(struct phy_device *phydev)
> +{
> +	return adin_set_powerdown_mode(phydev, false);
> +}
> +
> +static int adin_set_loopback(struct phy_device *phydev, bool enable)
> +{
> +	if (enable)
> +		return phy_set_bits_mmd(phydev, MDIO_MMD_PCS, ADIN_B10L_PCS_CNTRL,
> +					ADIN_PCS_CNTRL_B10L_LB_PCS_EN);
> +
> +	/* PCS loopback (according to 10BASE-T1L spec) */
> +	return phy_clear_bits_mmd(phydev, MDIO_MMD_PCS, ADIN_B10L_PCS_CNTRL,
> +				 ADIN_PCS_CNTRL_B10L_LB_PCS_EN);
> +}
> +
> +static int adin_soft_reset(struct phy_device *phydev)
> +{
> +	int ret;
> +
> +	ret = phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, ADIN_CRSM_SFT_RST, ADIN_CRSM_SFT_RST_EN);
> +	if (ret < 0)
> +		return ret;
> +
> +	return phy_read_mmd_poll_timeout(phydev, MDIO_MMD_VEND1, ADIN_CRSM_STAT, ret,
> +					 (ret & ADIN_CRSM_SYS_RDY),
> +					 10000, 30000, true);
> +}
> +
> +static int adin_get_features(struct phy_device *phydev)
> +{
> +	struct adin_priv *priv = phydev->priv;
> +	struct device *dev = &phydev->mdio.dev;
> +	int ret;
> +
> +	ret = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, ADIN_B10L_PMA_STAT);
> +	if (ret < 0)
> +		return ret;
> +
> +	/* This depends on the voltage level from the power source */
> +	priv->tx_level_24v = !!(ret & ADIN_PMA_STAT_B10L_TX_LVL_HI_ABLE);
> +
> +	phydev_dbg(phydev, "PHY supports 2.4V TX level: %s\n",
> +		   priv->tx_level_24v ? "yes" : "no");
> +
> +	if (device_property_present(dev, "adi,disable-2400mv-tx-level")) {
> +		if (priv->tx_level_24v)
> +			phydev_info(phydev,
> +				    "PHY supports 2.4V TX level, but disabled via config\n");
> +
> +		priv->tx_level_24v = 0;
> +	}
> +
> +	if (priv->tx_level_24v)
> +		linkmode_set_bit(ETHTOOL_LINK_MODE_2400mv_BIT, phydev->supported);
> +
> +	linkmode_set_bit_array(phy_basic_ports_array, ARRAY_SIZE(phy_basic_ports_array),
> +			       phydev->supported);
> +
> +	linkmode_set_bit_array(phy_10_features_array, ARRAY_SIZE(phy_10_features_array),
> +			       phydev->supported);
> +
> +	return 0;
> +}
> +
> +static int adin_probe(struct phy_device *phydev)
> +{
> +	struct device *dev = &phydev->mdio.dev;
> +	struct adin_priv *priv;
> +
> +	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
> +	if (!priv)
> +		return -ENOMEM;
> +
> +	phydev->priv = priv;
> +
> +	return 0;
> +}
> +
> +static struct phy_driver adin_driver[] = {
> +	{
> +		PHY_ID_MATCH_MODEL(PHY_ID_ADIN1100),
> +		.name			= "ADIN1100",
> +		.get_features		= adin_get_features,
> +		.soft_reset		= adin_soft_reset,
> +		.probe			= adin_probe,
> +		.config_aneg		= adin_config_aneg,
> +		.read_status		= adin_read_status,
> +		.set_loopback		= adin_set_loopback,
> +		.suspend		= adin_suspend,
> +		.resume			= adin_resume,
> +	},
> +};
> +
> +module_phy_driver(adin_driver);
> +
> +static struct mdio_device_id __maybe_unused adin_tbl[] = {
> +	{ PHY_ID_MATCH_MODEL(PHY_ID_ADIN1100) },
> +	{ }
> +};
> +
> +MODULE_DEVICE_TABLE(mdio, adin_tbl);
> +MODULE_DESCRIPTION("Analog Devices Industrial Ethernet T1L PHY driver");
> +MODULE_LICENSE("Dual BSD/GPL");
> -- 
> 2.25.1
> 
> 

-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

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

* Re: [PATCH v2 3/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY
  2021-07-27  6:47   ` Oleksij Rempel
@ 2021-07-27 16:36     ` Andrew Lunn
  0 siblings, 0 replies; 28+ messages in thread
From: Andrew Lunn @ 2021-07-27 16:36 UTC (permalink / raw)
  To: Oleksij Rempel
  Cc: alexandru.tachici, netdev, linux-kernel, devicetree, robh+dt,
	hkallweit1, linux, davem, kuba, Alexandru Ardelean

> Please compare the PHY datasheet with 802.3.2018 and 802.3cg-2019, and
> implement common parts as phy generic code.

+1

Thanks
	Andrew

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

* Re: [PATCH v2 7/7] dt-bindings: adin1100: Add binding for ADIN1100 Ethernet PHY
  2021-07-27  5:53   ` Oleksij Rempel
@ 2021-07-28 17:23     ` Rob Herring
  2021-07-29  5:02       ` Oleksij Rempel
  0 siblings, 1 reply; 28+ messages in thread
From: Rob Herring @ 2021-07-28 17:23 UTC (permalink / raw)
  To: Oleksij Rempel
  Cc: Alexandru Tachici, netdev, linux-kernel, devicetree, Andrew Lunn,
	Heiner Kallweit, Russell King, David Miller, Jakub Kicinski

On Mon, Jul 26, 2021 at 11:53 PM Oleksij Rempel <o.rempel@pengutronix.de> wrote:
>
> On Mon, Jul 12, 2021 at 04:06:31PM +0300, alexandru.tachici@analog.com wrote:
> > From: Alexandru Tachici <alexandru.tachici@analog.com>
> >
> > DT bindings for the ADIN1100 10BASE-T1L Ethernet PHY.
> >
> > Signed-off-by: Alexandru Tachici <alexandru.tachici@analog.com>
> > ---
> >  .../devicetree/bindings/net/adi,adin1100.yaml | 45 +++++++++++++++++++
> >  1 file changed, 45 insertions(+)
> >  create mode 100644 Documentation/devicetree/bindings/net/adi,adin1100.yaml
> >
> > diff --git a/Documentation/devicetree/bindings/net/adi,adin1100.yaml b/Documentation/devicetree/bindings/net/adi,adin1100.yaml
> > new file mode 100644
> > index 000000000000..14943164da7a
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/net/adi,adin1100.yaml
> > @@ -0,0 +1,45 @@
> > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> > +%YAML 1.2
> > +---
> > +$id: http://devicetree.org/schemas/net/adi,adin1100.yaml#
> > +$schema: http://devicetree.org/meta-schemas/core.yaml#
> > +
> > +title: Analog Devices ADIN1100 PHY
> > +
> > +maintainers:
> > +  - Alexandru Tachici <alexandru.tachici@analog.com>
> > +
> > +description:
> > +  Bindings for Analog Devices Industrial Low Power 10BASE-T1L Ethernet PHY
> > +
> > +allOf:
> > +  - $ref: ethernet-phy.yaml#
> > +
> > +properties:
> > +  adi,disable-2400mv-tx-level:
> > +    description:
> > +      Prevent ADIN1100 from using the 2.4 V pk-pk transmit level.
> > +    type: boolean
>
> This property should be generic. It is defined by IEEE 802.3cg 2019 and can
> be implemented on all T1L PHYs.
>
> I assume, it should be something like:
> ethernet-phy-10base-t1l-2.4vpp-enable
> ethernet-phy-10base-t1l-2.4vpp-disable

'ethernet-phy-' is a bit redundant and I'd make it a tristate (not
present, 0, 1). So just '10base-t1l-2.4vpp'?

> To overwrite bootstrapped of fuzed values if supported. The IEEE 802.3cg
> specification uses following wordings for this functionality:
> "10BASE-T1L increased transmit level request ..."

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

* Re: [PATCH v2 7/7] dt-bindings: adin1100: Add binding for ADIN1100 Ethernet PHY
  2021-07-28 17:23     ` Rob Herring
@ 2021-07-29  5:02       ` Oleksij Rempel
  0 siblings, 0 replies; 28+ messages in thread
From: Oleksij Rempel @ 2021-07-29  5:02 UTC (permalink / raw)
  To: Rob Herring
  Cc: Alexandru Tachici, netdev, linux-kernel, devicetree, Andrew Lunn,
	Heiner Kallweit, Russell King, David Miller, Jakub Kicinski

On Wed, Jul 28, 2021 at 11:23:12AM -0600, Rob Herring wrote:
> On Mon, Jul 26, 2021 at 11:53 PM Oleksij Rempel <o.rempel@pengutronix.de> wrote:
> >
> > On Mon, Jul 12, 2021 at 04:06:31PM +0300, alexandru.tachici@analog.com wrote:
> > > From: Alexandru Tachici <alexandru.tachici@analog.com>
> > >
> > > DT bindings for the ADIN1100 10BASE-T1L Ethernet PHY.
> > >
> > > Signed-off-by: Alexandru Tachici <alexandru.tachici@analog.com>
> > > ---
> > >  .../devicetree/bindings/net/adi,adin1100.yaml | 45 +++++++++++++++++++
> > >  1 file changed, 45 insertions(+)
> > >  create mode 100644 Documentation/devicetree/bindings/net/adi,adin1100.yaml
> > >
> > > diff --git a/Documentation/devicetree/bindings/net/adi,adin1100.yaml b/Documentation/devicetree/bindings/net/adi,adin1100.yaml
> > > new file mode 100644
> > > index 000000000000..14943164da7a
> > > --- /dev/null
> > > +++ b/Documentation/devicetree/bindings/net/adi,adin1100.yaml
> > > @@ -0,0 +1,45 @@
> > > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> > > +%YAML 1.2
> > > +---
> > > +$id: http://devicetree.org/schemas/net/adi,adin1100.yaml#
> > > +$schema: http://devicetree.org/meta-schemas/core.yaml#
> > > +
> > > +title: Analog Devices ADIN1100 PHY
> > > +
> > > +maintainers:
> > > +  - Alexandru Tachici <alexandru.tachici@analog.com>
> > > +
> > > +description:
> > > +  Bindings for Analog Devices Industrial Low Power 10BASE-T1L Ethernet PHY
> > > +
> > > +allOf:
> > > +  - $ref: ethernet-phy.yaml#
> > > +
> > > +properties:
> > > +  adi,disable-2400mv-tx-level:
> > > +    description:
> > > +      Prevent ADIN1100 from using the 2.4 V pk-pk transmit level.
> > > +    type: boolean
> >
> > This property should be generic. It is defined by IEEE 802.3cg 2019 and can
> > be implemented on all T1L PHYs.
> >
> > I assume, it should be something like:
> > ethernet-phy-10base-t1l-2.4vpp-enable
> > ethernet-phy-10base-t1l-2.4vpp-disable
> 
> 'ethernet-phy-' is a bit redundant and I'd make it a tristate (not
> present, 0, 1). So just '10base-t1l-2.4vpp'?
> 
> > To overwrite bootstrapped of fuzed values if supported. The IEEE 802.3cg
> > specification uses following wordings for this functionality:
> > "10BASE-T1L increased transmit level request ..."

sounds ok for me.

Regards,
Oleksij
-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

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

* Re: [PATCH v2 0/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY
  2021-07-23 17:32   ` Oleksij Rempel
@ 2021-08-03  9:47     ` alexandru.tachici
  2021-08-03 11:59       ` Oleksij Rempel
  0 siblings, 1 reply; 28+ messages in thread
From: alexandru.tachici @ 2021-08-03  9:47 UTC (permalink / raw)
  To: o.rempel
  Cc: alexandru.tachici, andrew, davem, devicetree, hkallweit1, kuba,
	linux-kernel, linux, netdev, robh+dt

Managed to get some answears form the HW team.

From a safety perspective: in Explosive environments
only 1.0 V is allowed.

Tests showed that 1.0 V shows spurs around 200m and
2.4V works for up to 1.3 Km.


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

* Re: [PATCH v2 0/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY
  2021-08-03  9:47     ` alexandru.tachici
@ 2021-08-03 11:59       ` Oleksij Rempel
  0 siblings, 0 replies; 28+ messages in thread
From: Oleksij Rempel @ 2021-08-03 11:59 UTC (permalink / raw)
  To: alexandru.tachici
  Cc: andrew, davem, devicetree, hkallweit1, kuba, linux-kernel, linux,
	netdev, robh+dt

On Tue, Aug 03, 2021 at 12:47:15PM +0300, alexandru.tachici@analog.com wrote:
> Managed to get some answears form the HW team.
> 
> From a safety perspective: in Explosive environments
> only 1.0 V is allowed.
> 
> Tests showed that 1.0 V shows spurs around 200m and
> 2.4V works for up to 1.3 Km.

It will be probably better to drop this functionality for now and
provide it as separate patch set. This will probably need new UAPI and
some discussions.

Can you please add me to CC by the next patch rounds for this PHY.

Regards,
Oleksij
-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

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

end of thread, other threads:[~2021-08-03 11:59 UTC | newest]

Thread overview: 28+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-07-12 13:06 [PATCH v2 0/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY alexandru.tachici
2021-07-12 13:06 ` [PATCH v2 1/7] ethtool: Add 10base-T1L link mode entries alexandru.tachici
2021-07-13 16:50   ` Andrew Lunn
2021-07-27  5:56   ` Oleksij Rempel
2021-07-12 13:06 ` [PATCH v2 2/7] ethtool: Add 10base-T1L voltage levels " alexandru.tachici
2021-07-12 13:06 ` [PATCH v2 3/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY alexandru.tachici
2021-07-13 16:58   ` Andrew Lunn
2021-07-16 21:24     ` ADIN1100 alexandru.tachici
2021-07-23 17:20       ` ADIN1100 Oleksij Rempel
2021-07-27  6:31     ` [PATCH v2 3/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY Oleksij Rempel
2021-07-27  6:47   ` Oleksij Rempel
2021-07-27 16:36     ` Andrew Lunn
2021-07-12 13:06 ` [PATCH v2 4/7] net: phy: adin1100: Add ethtool get_stats support alexandru.tachici
2021-07-12 18:41   ` Jakub Kicinski
2021-07-12 13:06 ` [PATCH v2 5/7] net: phy: adin1100: Add ethtool master-slave support alexandru.tachici
2021-07-13 17:53   ` Andrew Lunn
2021-07-12 13:06 ` [PATCH v2 6/7] net: phy: adin1100: Add SQI support alexandru.tachici
2021-07-13 17:55   ` Andrew Lunn
2021-07-12 13:06 ` [PATCH v2 7/7] dt-bindings: adin1100: Add binding for ADIN1100 Ethernet PHY alexandru.tachici
2021-07-12 14:12   ` Rob Herring
2021-07-12 17:46     ` Rob Herring
2021-07-27  5:53   ` Oleksij Rempel
2021-07-28 17:23     ` Rob Herring
2021-07-29  5:02       ` Oleksij Rempel
2021-07-12 13:33 ` [PATCH v2 0/7] net: phy: adin1100: Add initial support for ADIN1100 industrial PHY Russell King (Oracle)
2021-07-23 17:32   ` Oleksij Rempel
2021-08-03  9:47     ` alexandru.tachici
2021-08-03 11:59       ` Oleksij Rempel

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).