* [PATCH net-next 0/3] net: phy: dap8211r: add LED hardware control
@ 2026-11-13 11:05 Artem Shimko
2026-11-13 11:05 ` [PATCH net-next 1/3] dt-bindings: net: dptel,dap8211r: add led nodes Artem Shimko
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Artem Shimko @ 2026-11-13 11:05 UTC (permalink / raw)
To: andrew, hkallweit1, linux, davem, edumazet, kuba, pabeni, robh,
krzk+dt, conor+dt, maxime.chevallier, pavel, linux-kernel,
devicetree, linux-leds
Cc: Artem Shimko, netdev
Hello,
This series adds support for hardware-controlled LEDs on the DAP8211R
Gigabit Ethernet PHY.
The first patch documents the optional "leds" node in the Device Tree
binding. The second patch introduces a small helper to write extended
registers, since the LED registers are accessed indirectly via
EXT_ADD/EXT_DATA. The third patch implements the three LED callbacks
required by the PHY library.
$ make dt_binding_check DT_SCHEMA_FILES=Documentation/devicetree/bindings/net/dptel,dap8211r.yaml
SCHEMA Documentation/devicetree/bindings/processed-schema.json
CHKDT ./Documentation/devicetree/bindings
LINT ./Documentation/devicetree/bindings
STYLE ./Documentation/devicetree/bindings
DTEX Documentation/devicetree/bindings/net/dptel,dap8211r.example.dts
DTC [C] Documentation/devicetree/bindings/net/dptel,dap8211r.example.dtb
Required:
CONFIG_NEW_LEDS=y
CONFIG_LEDS_CLASS=y
CONFIG_LEDS_TRIGGERS=y
CONFIG_LEDS_TRIGGER_NETDEV=y
Testing:
$ ip link set eth1 up
$ ls /sys/class/leds/
stmmac-1:01:amber:lan stmmac-1:01:green:lan
$ echo eth1 > /sys/class/leds/stmmac-1:01:green:lan/device_name
$ echo 1 > /sys/class/leds/stmmac-1:01:green:lan/link_1000
$ cat /sys/class/leds/stmmac-1:01:green:lan/offloaded
$ echo eth1 > /sys/class/leds/stmmac-1:01:amber:lan/device_name
$ echo 1 > /sys/class/leds/stmmac-1:01:amber:lan/tx
$ echo 1 > /sys/class/leds/stmmac-1:01:amber:lan/rx
$ cat /sys/class/leds/stmmac-1:01:amber:lan/offloaded
$ ip addr add PEER_IP_ADDR dev eth1
$ ping -I eth1 ELP_ID_ADDR
--
Best regards,
artem shimko
Artem Shimko (3):
dt-bindings: net: dptel,dap8211r: add led nodes
net: phy: dap8211r: add extended register write helper
net: phy: dap8211r: add led hardware control support
.../bindings/net/dptel,dap8211r.yaml | 38 ++++
drivers/net/phy/dap8211r.c | 207 ++++++++++++++++++
2 files changed, 245 insertions(+)
--
2.43.0
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH net-next 1/3] dt-bindings: net: dptel,dap8211r: add led nodes
2026-11-13 11:05 [PATCH net-next 0/3] net: phy: dap8211r: add LED hardware control Artem Shimko
@ 2026-11-13 11:05 ` Artem Shimko
2026-11-13 11:05 ` [PATCH net-next 2/3] net: phy: dap8211r: add extended register write helper Artem Shimko
2026-11-13 11:05 ` [PATCH net-next 3/3] net: phy: dap8211r: add led hardware control support Artem Shimko
2 siblings, 0 replies; 4+ messages in thread
From: Artem Shimko @ 2026-11-13 11:05 UTC (permalink / raw)
To: andrew, hkallweit1, linux, davem, edumazet, kuba, pabeni, robh,
krzk+dt, conor+dt, maxime.chevallier, pavel, linux-kernel,
devicetree, linux-leds
Cc: Artem Shimko, netdev
Document the optional "leds" node supported by the dap8211r phy.
The phy exposes three configurable led outputs, each of which can be
assigned a color, a function and a default trigger.
Signed-off-by: Artem Shimko <a.shimko.dev@gmail.com>
---
.../bindings/net/dptel,dap8211r.yaml | 38 +++++++++++++++++++
1 file changed, 38 insertions(+)
diff --git a/Documentation/devicetree/bindings/net/dptel,dap8211r.yaml b/Documentation/devicetree/bindings/net/dptel,dap8211r.yaml
index 4cd0f9730d95..43425fc8e96e 100644
--- a/Documentation/devicetree/bindings/net/dptel,dap8211r.yaml
+++ b/Documentation/devicetree/bindings/net/dptel,dap8211r.yaml
@@ -20,6 +20,7 @@ description: |
- IEEE 802.3az-2010 Energy Efficient Ethernet
- IEEE 1588 SyncE support
- Internal packet generator and checker for link diagnostics
+ - Three configurable LEDs (link, speed, duplex, TX/RX activity)
allOf:
- $ref: ethernet-phy.yaml#
@@ -28,6 +29,22 @@ properties:
compatible:
const: ethernet-phy-id0008.011b
+ leds:
+ type: object
+ description:
+ Optional node describing the three configurable LEDs of the PHY.
+ Each LED can be assigned a color, function and default trigger
+ (e.g. "netdev" for link/activity indication).
+ patternProperties:
+ '^led@[0-2]$':
+ type: object
+ properties:
+ reg:
+ maxItems: 1
+ required:
+ - reg
+ additionalProperties: true
+
reg:
maxItems: 1
@@ -49,6 +66,8 @@ unevaluatedProperties: false
examples:
- |
+ #include <dt-bindings/leds/common.h>
+
mdio {
#address-cells = <1>;
#size-cells = <0>;
@@ -58,5 +77,24 @@ examples:
reg = <1>;
rx-internal-delay-ps = <1950>;
tx-internal-delay-ps = <1950>;
+
+ leds {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ led@0 {
+ reg = <0>;
+ color = <LED_COLOR_ID_GREEN>;
+ function = LED_FUNCTION_LAN;
+ linux,default-trigger = "netdev";
+ };
+
+ led@1 {
+ reg = <1>;
+ color = <LED_COLOR_ID_AMBER>;
+ function = LED_FUNCTION_LAN;
+ linux,default-trigger = "netdev";
+ };
+ };
};
};
--
2.43.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH net-next 2/3] net: phy: dap8211r: add extended register write helper
2026-11-13 11:05 [PATCH net-next 0/3] net: phy: dap8211r: add LED hardware control Artem Shimko
2026-11-13 11:05 ` [PATCH net-next 1/3] dt-bindings: net: dptel,dap8211r: add led nodes Artem Shimko
@ 2026-11-13 11:05 ` Artem Shimko
2026-11-13 11:05 ` [PATCH net-next 3/3] net: phy: dap8211r: add led hardware control support Artem Shimko
2 siblings, 0 replies; 4+ messages in thread
From: Artem Shimko @ 2026-11-13 11:05 UTC (permalink / raw)
To: andrew, hkallweit1, linux, davem, edumazet, kuba, pabeni, robh,
krzk+dt, conor+dt, maxime.chevallier, pavel, linux-kernel,
devicetree, linux-leds
Cc: Artem Shimko, netdev
Add dap8211r_write_ext() to write extended registers via the indirect
access registers of the phy.
This will be used to write extended registers of the dap8211r.
No functional change.
Signed-off-by: Artem Shimko <a.shimko.dev@gmail.com>
---
drivers/net/phy/dap8211r.c | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/drivers/net/phy/dap8211r.c b/drivers/net/phy/dap8211r.c
index 0bf770f8ebbb..4eb50c26397f 100644
--- a/drivers/net/phy/dap8211r.c
+++ b/drivers/net/phy/dap8211r.c
@@ -88,6 +88,32 @@ static int dap8211r_read_ext(struct phy_device *phydev, u16 reg)
return ret;
}
+/**
+ * dap8211r_write_ext() - Write extended register
+ * @phydev: PHY device structure
+ * @reg: Extended register address
+ * @data: Data to write
+ *
+ * Writes a PHY extended register using the indirect access method.
+ * The caller must hold the MDIO bus lock.
+ *
+ * Return: 0 on success, or negative error code
+ */
+static int dap8211r_write_ext(struct phy_device *phydev, u16 reg, u16 data)
+{
+ int ret;
+
+ phy_lock_mdio_bus(phydev);
+ ret = __phy_write(phydev, DAP8211R_EXT_ADD, reg);
+ if (ret < 0)
+ goto out;
+
+ ret = __phy_write(phydev, DAP8211R_EXT_DATA, data);
+out:
+ phy_unlock_mdio_bus(phydev);
+ return ret;
+}
+
/**
* dap8211r_modify_ext() - Modify extended register bits
* @phydev: PHY device structure
--
2.43.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH net-next 3/3] net: phy: dap8211r: add led hardware control support
2026-11-13 11:05 [PATCH net-next 0/3] net: phy: dap8211r: add LED hardware control Artem Shimko
2026-11-13 11:05 ` [PATCH net-next 1/3] dt-bindings: net: dptel,dap8211r: add led nodes Artem Shimko
2026-11-13 11:05 ` [PATCH net-next 2/3] net: phy: dap8211r: add extended register write helper Artem Shimko
@ 2026-11-13 11:05 ` Artem Shimko
2 siblings, 0 replies; 4+ messages in thread
From: Artem Shimko @ 2026-11-13 11:05 UTC (permalink / raw)
To: andrew, hkallweit1, linux, davem, edumazet, kuba, pabeni, robh,
krzk+dt, conor+dt, maxime.chevallier, pavel, linux-kernel,
devicetree, linux-leds
Cc: Artem Shimko, netdev
Add support for hardware-controlled leds on the dap8211r phy. The chip
exposes three led that can be programmed to react to link, speed,
duplex, and tx/rx activity.
Implement callbacks for led_hw_is_supported(), led_hw_control_set()
led_hw_control_get().
Signed-off-by: Artem Shimko <a.shimko.dev@gmail.com>
---
drivers/net/phy/dap8211r.c | 181 +++++++++++++++++++++++++++++++++++++
1 file changed, 181 insertions(+)
diff --git a/drivers/net/phy/dap8211r.c b/drivers/net/phy/dap8211r.c
index 4eb50c26397f..2e371c231d32 100644
--- a/drivers/net/phy/dap8211r.c
+++ b/drivers/net/phy/dap8211r.c
@@ -12,6 +12,7 @@
*/
#include <linux/bitfield.h>
+#include <linux/bitops.h>
#include <linux/errno.h>
#include <linux/ethtool.h>
#include <linux/kernel.h>
@@ -57,6 +58,33 @@
*/
#define DAP8211R_DEFAULT_DEL_SEL 0xD
+#define DAP8211R_LED_ID_0 0
+#define DAP8211R_LED_ID_1 1
+#define DAP8211R_LED_ID_2 2
+#define DAP8211R_LED_0 0xA00C
+#define DAP8211R_LED_1 0xA00D
+#define DAP8211R_LED_2 0xA00E
+#define DAP8211R_LED_ACT_BLINK BIT(13)
+#define DAP8211R_LED_FULL_DUPLEX BIT(12)
+#define DAP8211R_LED_HALF_DUPLEX BIT(11)
+#define DAP8211R_LED_TX BIT(10)
+#define DAP8211R_LED_RX BIT(9)
+#define DAP8211R_LED_LINK_1000 BIT(6)
+#define DAP8211R_LED_LINK_100 BIT(5)
+#define DAP8211R_LED_LINK_10 BIT(4)
+
+#define DAP8211R_LED_LINK (DAP8211R_LED_LINK_10 | \
+ DAP8211R_LED_LINK_100 | \
+ DAP8211R_LED_LINK_1000)
+
+#define DAP8211R_LED_SUPPORTED_TRG (BIT(TRIGGER_NETDEV_LINK_10) | \
+ BIT(TRIGGER_NETDEV_LINK_100) | \
+ BIT(TRIGGER_NETDEV_LINK_1000) | \
+ BIT(TRIGGER_NETDEV_TX) | \
+ BIT(TRIGGER_NETDEV_RX) | \
+ BIT(TRIGGER_NETDEV_HALF_DUPLEX) | \
+ BIT(TRIGGER_NETDEV_FULL_DUPLEX))
+
static const int dap8211r_internal_delay[] = {0, 150, 300, 450, 600, 750, 900,
1050, 1200, 1350, 1500, 1650, 1800,
1950, 2100, 2250};
@@ -142,6 +170,156 @@ static int dap8211r_modify_ext(struct phy_device *phydev, u16 reg, u16 mask, u16
return ret;
}
+/**
+ * dap8211r_led_hw_is_supported() - Check if the requested LED rules are supported
+ * @phydev: PHY device structure
+ * @index: LED index
+ * @rules: Bitmask of requested netdev trigger rules
+ *
+ * Validates the requested combination of rules which can be represented in the
+ * hardware register.
+ *
+ * Return: 0 on success, -EINVAL for an invalid LED index,
+ * or -EOPNOTSUPP if any requested rule is not supported by the PHY
+ */
+static int dap8211r_led_hw_is_supported(struct phy_device *phydev, u8 index, unsigned long rules)
+{
+ switch (index) {
+ case DAP8211R_LED_ID_0:
+ fallthrough;
+ case DAP8211R_LED_ID_1:
+ fallthrough;
+ case DAP8211R_LED_ID_2:
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return (rules & ~DAP8211R_LED_SUPPORTED_TRG) ? -EOPNOTSUPP : 0;
+}
+
+/**
+ * dap8211r_led_hw_control_set() - Program the LED control register
+ * @phydev: PHY device structure
+ * @index: LED index
+ * @rules: Bitmask of requested netdev trigger rules
+ *
+ * Translates the requested trigger rules into the corresponding bit
+ * positions of the LED control register and writes the resulting value
+ * to the PHY.
+ *
+ * Note that the ACT_BLINK bit (13) must be set together with TX/RX rules,
+ * otherwise the LED will not blink on traffic if no other rule (such as
+ * link or duplex) is active.
+ *
+ * Return: 0 on success, -EINVAL for an invalid LED index, or a negative error code
+ */
+static int dap8211r_led_hw_control_set(struct phy_device *phydev, u8 index, unsigned long rules)
+{
+ u16 led_mode = 0, led_reg;
+
+ switch (index) {
+ case DAP8211R_LED_ID_0:
+ led_reg = DAP8211R_LED_0;
+ break;
+ case DAP8211R_LED_ID_1:
+ led_reg = DAP8211R_LED_1;
+ break;
+ case DAP8211R_LED_ID_2:
+ led_reg = DAP8211R_LED_2;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ if (test_bit(TRIGGER_NETDEV_LINK, &rules))
+ led_mode |= DAP8211R_LED_LINK;
+
+ if (test_bit(TRIGGER_NETDEV_LINK_10, &rules))
+ led_mode |= DAP8211R_LED_LINK_10;
+
+ if (test_bit(TRIGGER_NETDEV_LINK_100, &rules))
+ led_mode |= DAP8211R_LED_LINK_100;
+
+ if (test_bit(TRIGGER_NETDEV_LINK_1000, &rules))
+ led_mode |= DAP8211R_LED_LINK_1000;
+
+ if (test_bit(TRIGGER_NETDEV_RX, &rules))
+ led_mode |= DAP8211R_LED_RX | DAP8211R_LED_ACT_BLINK;
+
+ if (test_bit(TRIGGER_NETDEV_TX, &rules))
+ led_mode |= DAP8211R_LED_TX | DAP8211R_LED_ACT_BLINK;
+
+ if (test_bit(TRIGGER_NETDEV_HALF_DUPLEX, &rules))
+ led_mode |= DAP8211R_LED_HALF_DUPLEX;
+
+ if (test_bit(TRIGGER_NETDEV_FULL_DUPLEX, &rules))
+ led_mode |= DAP8211R_LED_FULL_DUPLEX;
+
+ if (!led_mode)
+ return -EOPNOTSUPP;
+
+ return dap8211r_write_ext(phydev, led_reg, led_mode);
+}
+
+/**
+ * dap8211r_led_hw_control_get() - Read the current LED configuration
+ * @phydev: PHY device structure
+ * @index: LED index
+ * @rules: Pointer to a bitmask where the current rules will be stored
+ *
+ * Reads the LED control register and translates the hardware bit
+ * positions back into the corresponding netdev trigger rules bitmask.
+ *
+ * Return: 0 on success, -EINVAL for an invalid LED index, or a negative error code
+ */
+static int dap8211r_led_hw_control_get(struct phy_device *phydev, u8 index, unsigned long *rules)
+{
+ u16 led_reg;
+ int led_mode = 0;
+
+ switch (index) {
+ case DAP8211R_LED_ID_0:
+ led_reg = DAP8211R_LED_0;
+ break;
+ case DAP8211R_LED_ID_1:
+ led_reg = DAP8211R_LED_1;
+ break;
+ case DAP8211R_LED_ID_2:
+ led_reg = DAP8211R_LED_2;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ led_mode = dap8211r_read_ext(phydev, led_reg);
+ if (led_mode < 0)
+ return led_mode;
+
+ if (led_mode & DAP8211R_LED_LINK_10)
+ __set_bit(TRIGGER_NETDEV_LINK_10, rules);
+
+ if (led_mode & DAP8211R_LED_LINK_100)
+ __set_bit(TRIGGER_NETDEV_LINK_100, rules);
+
+ if (led_mode & DAP8211R_LED_LINK_1000)
+ __set_bit(TRIGGER_NETDEV_LINK_1000, rules);
+
+ if (led_mode & DAP8211R_LED_RX)
+ __set_bit(TRIGGER_NETDEV_RX, rules);
+
+ if (led_mode & DAP8211R_LED_TX)
+ __set_bit(TRIGGER_NETDEV_TX, rules);
+
+ if (led_mode & DAP8211R_LED_HALF_DUPLEX)
+ __set_bit(TRIGGER_NETDEV_HALF_DUPLEX, rules);
+
+ if (led_mode & DAP8211R_LED_FULL_DUPLEX)
+ __set_bit(TRIGGER_NETDEV_FULL_DUPLEX, rules);
+
+ return 0;
+}
+
/**
* dap8211r_config_init() - Initialize PHY
* @phydev: PHY device structure
@@ -230,6 +408,9 @@ static struct phy_driver dap8211r_driver[] = {
.config_aneg = genphy_config_aneg,
.suspend = genphy_suspend,
.resume = genphy_resume,
+ .led_hw_is_supported = dap8211r_led_hw_is_supported,
+ .led_hw_control_set = dap8211r_led_hw_control_set,
+ .led_hw_control_get = dap8211r_led_hw_control_get,
},
};
module_phy_driver(dap8211r_driver);
--
2.43.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-11-13 11:05 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-11-13 11:05 [PATCH net-next 0/3] net: phy: dap8211r: add LED hardware control Artem Shimko
2026-11-13 11:05 ` [PATCH net-next 1/3] dt-bindings: net: dptel,dap8211r: add led nodes Artem Shimko
2026-11-13 11:05 ` [PATCH net-next 2/3] net: phy: dap8211r: add extended register write helper Artem Shimko
2026-11-13 11:05 ` [PATCH net-next 3/3] net: phy: dap8211r: add led hardware control support Artem Shimko
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.