* [PATCH net-next v3 0/4] Support offload LED blinking to PHY.
@ 2023-08-08 21:04 Andrew Lunn
2023-08-08 21:04 ` [PATCH net-next v3 1/4] led: trig: netdev: Fix requesting offload device Andrew Lunn
` (5 more replies)
0 siblings, 6 replies; 9+ messages in thread
From: Andrew Lunn @ 2023-08-08 21:04 UTC (permalink / raw)
To: netdev
Cc: Heiner Kallweit, Russell King, Simon Horman, Christian Marangi,
Daniel Golle, Andrew Lunn
Allow offloading of the LED trigger netdev to PHY drivers and
implement it for the Marvell PHY driver. Additionally, correct the
handling of when the initial state of the LED cannot be represented by
the trigger, and so an error is returned. As with ledtrig-timer,
disable offload when the trigger is deactivate, or replaced by another
trigger.
Since v2:
Add support for link speeds, not just link
Add missing checks for return values
Add patch disabling offload when driver is deactivated
Since v1:
Add true kerneldoc for the new entries in struct phy_driver
Add received Reviewed-by: tags
Since v0:
Make comments in struct phy_driver look more like kerneldoc
Add cover letter
Andrew Lunn (4):
led: trig: netdev: Fix requesting offload device
net: phy: phy_device: Call into the PHY driver to set LED offload
net: phy: marvell: Add support for offloading LED blinking
leds: trig-netdev: Disable offload on deactivation of trigger
drivers/leds/trigger/ledtrig-netdev.c | 10 +-
drivers/net/phy/marvell.c | 281 ++++++++++++++++++++++++++
drivers/net/phy/phy_device.c | 68 +++++++
include/linux/phy.h | 33 +++
4 files changed, 389 insertions(+), 3 deletions(-)
--
2.40.1
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH net-next v3 1/4] led: trig: netdev: Fix requesting offload device
2023-08-08 21:04 [PATCH net-next v3 0/4] Support offload LED blinking to PHY Andrew Lunn
@ 2023-08-08 21:04 ` Andrew Lunn
2023-08-08 21:04 ` [PATCH net-next v3 2/4] net: phy: phy_device: Call into the PHY driver to set LED offload Andrew Lunn
` (4 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Andrew Lunn @ 2023-08-08 21:04 UTC (permalink / raw)
To: netdev
Cc: Heiner Kallweit, Russell King, Simon Horman, Christian Marangi,
Daniel Golle, Andrew Lunn
When the netdev trigger is activates, it tries to determine what
device the LED blinks for, and what the current blink mode is.
The documentation for hw_control_get() says:
* Return 0 on success, a negative error number on failing parsing the
* initial mode. Error from this function is NOT FATAL as the device
* may be in a not supported initial state by the attached LED trigger.
*/
For the Marvell PHY and the Armada 370-rd board, the initial LED blink
mode is not supported by the trigger, so it returns an error. This
resulted in not getting the device the LED is blinking for. As a
result, the device is unknown and offloaded is never performed.
Change to condition to always get the device if offloading is
supported, and reduce the scope of testing for an error from
hw_control_get() to skip setting trigger internal state if there is an
error.
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
---
drivers/leds/trigger/ledtrig-netdev.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/drivers/leds/trigger/ledtrig-netdev.c b/drivers/leds/trigger/ledtrig-netdev.c
index c9bc5a91ec83..3d215a556e20 100644
--- a/drivers/leds/trigger/ledtrig-netdev.c
+++ b/drivers/leds/trigger/ledtrig-netdev.c
@@ -564,15 +564,17 @@ static int netdev_trig_activate(struct led_classdev *led_cdev)
/* Check if hw control is active by default on the LED.
* Init already enabled mode in hw control.
*/
- if (supports_hw_control(led_cdev) &&
- !led_cdev->hw_control_get(led_cdev, &mode)) {
+ if (supports_hw_control(led_cdev)) {
dev = led_cdev->hw_control_get_device(led_cdev);
if (dev) {
const char *name = dev_name(dev);
set_device_name(trigger_data, name, strlen(name));
trigger_data->hw_control = true;
- trigger_data->mode = mode;
+
+ rc = led_cdev->hw_control_get(led_cdev, &mode);
+ if (!rc)
+ trigger_data->mode = mode;
}
}
--
2.40.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH net-next v3 2/4] net: phy: phy_device: Call into the PHY driver to set LED offload
2023-08-08 21:04 [PATCH net-next v3 0/4] Support offload LED blinking to PHY Andrew Lunn
2023-08-08 21:04 ` [PATCH net-next v3 1/4] led: trig: netdev: Fix requesting offload device Andrew Lunn
@ 2023-08-08 21:04 ` Andrew Lunn
2023-08-08 21:04 ` [PATCH net-next v3 3/4] net: phy: marvell: Add support for offloading LED blinking Andrew Lunn
` (3 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Andrew Lunn @ 2023-08-08 21:04 UTC (permalink / raw)
To: netdev
Cc: Heiner Kallweit, Russell King, Simon Horman, Christian Marangi,
Daniel Golle, Andrew Lunn
Linux LEDs can be requested to perform hardware accelerated blinking
to indicate link, RX, TX etc. Pass the rules for blinking to the PHY
driver, if it implements the ops needed to determine if a given
pattern can be offloaded, to offload it, and what the current offload
is. Additionally implement the op needed to get what device the LED is
for.
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
---
drivers/net/phy/phy_device.c | 68 ++++++++++++++++++++++++++++++++++++
include/linux/phy.h | 33 +++++++++++++++++
2 files changed, 101 insertions(+)
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
index 3e9909b30938..17cb3e07216a 100644
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -3020,6 +3020,61 @@ static int phy_led_blink_set(struct led_classdev *led_cdev,
return err;
}
+static __maybe_unused struct device *
+phy_led_hw_control_get_device(struct led_classdev *led_cdev)
+{
+ struct phy_led *phyled = to_phy_led(led_cdev);
+ struct phy_device *phydev = phyled->phydev;
+
+ if (phydev->attached_dev)
+ return &phydev->attached_dev->dev;
+ return NULL;
+}
+
+static int __maybe_unused
+phy_led_hw_control_get(struct led_classdev *led_cdev,
+ unsigned long *rules)
+{
+ struct phy_led *phyled = to_phy_led(led_cdev);
+ struct phy_device *phydev = phyled->phydev;
+ int err;
+
+ mutex_lock(&phydev->lock);
+ err = phydev->drv->led_hw_control_get(phydev, phyled->index, rules);
+ mutex_unlock(&phydev->lock);
+
+ return err;
+}
+
+static int __maybe_unused
+phy_led_hw_control_set(struct led_classdev *led_cdev,
+ unsigned long rules)
+{
+ struct phy_led *phyled = to_phy_led(led_cdev);
+ struct phy_device *phydev = phyled->phydev;
+ int err;
+
+ mutex_lock(&phydev->lock);
+ err = phydev->drv->led_hw_control_set(phydev, phyled->index, rules);
+ mutex_unlock(&phydev->lock);
+
+ return err;
+}
+
+static __maybe_unused int phy_led_hw_is_supported(struct led_classdev *led_cdev,
+ unsigned long rules)
+{
+ struct phy_led *phyled = to_phy_led(led_cdev);
+ struct phy_device *phydev = phyled->phydev;
+ int err;
+
+ mutex_lock(&phydev->lock);
+ err = phydev->drv->led_hw_is_supported(phydev, phyled->index, rules);
+ mutex_unlock(&phydev->lock);
+
+ return err;
+}
+
static void phy_leds_unregister(struct phy_device *phydev)
{
struct phy_led *phyled;
@@ -3057,6 +3112,19 @@ static int of_phy_led(struct phy_device *phydev,
cdev->brightness_set_blocking = phy_led_set_brightness;
if (phydev->drv->led_blink_set)
cdev->blink_set = phy_led_blink_set;
+
+#ifdef CONFIG_LEDS_TRIGGERS
+ if (phydev->drv->led_hw_is_supported &&
+ phydev->drv->led_hw_control_set &&
+ phydev->drv->led_hw_control_get) {
+ cdev->hw_control_is_supported = phy_led_hw_is_supported;
+ cdev->hw_control_set = phy_led_hw_control_set;
+ cdev->hw_control_get = phy_led_hw_control_get;
+ cdev->hw_control_trigger = "netdev";
+ }
+
+ cdev->hw_control_get_device = phy_led_hw_control_get_device;
+#endif
cdev->max_brightness = 1;
init_data.devicename = dev_name(&phydev->mdio.dev);
init_data.fwnode = of_fwnode_handle(led);
diff --git a/include/linux/phy.h b/include/linux/phy.h
index ba08b0e60279..fbcc985b5670 100644
--- a/include/linux/phy.h
+++ b/include/linux/phy.h
@@ -1105,6 +1105,39 @@ struct phy_driver {
int (*led_blink_set)(struct phy_device *dev, u8 index,
unsigned long *delay_on,
unsigned long *delay_off);
+ /**
+ * @led_hw_is_supported: Can the HW support the given rules.
+ * @dev: PHY device which has the LED
+ * @index: Which LED of the PHY device
+ * @rules The core is interested in these rules
+ *
+ * Return 0 if yes, -EOPNOTSUPP if not, or an error code.
+ */
+ int (*led_hw_is_supported)(struct phy_device *dev, u8 index,
+ unsigned long rules);
+ /**
+ * @led_hw_control_set: Set the HW to control the LED
+ * @dev: PHY device which has the LED
+ * @index: Which LED of the PHY device
+ * @rules The rules used to control the LED
+ *
+ * Returns 0, or a an error code.
+ */
+ int (*led_hw_control_set)(struct phy_device *dev, u8 index,
+ unsigned long rules);
+ /**
+ * @led_hw_control_get: Get how the HW is controlling the LED
+ * @dev: PHY device which has the LED
+ * @index: Which LED of the PHY device
+ * @rules Pointer to the rules used to control the LED
+ *
+ * Set *@rules to how the HW is currently blinking. Returns 0
+ * on success, or a error code if the current blinking cannot
+ * be represented in rules, or some other error happens.
+ */
+ int (*led_hw_control_get)(struct phy_device *dev, u8 index,
+ unsigned long *rules);
+
};
#define to_phy_driver(d) container_of(to_mdio_common_driver(d), \
struct phy_driver, mdiodrv)
--
2.40.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH net-next v3 3/4] net: phy: marvell: Add support for offloading LED blinking
2023-08-08 21:04 [PATCH net-next v3 0/4] Support offload LED blinking to PHY Andrew Lunn
2023-08-08 21:04 ` [PATCH net-next v3 1/4] led: trig: netdev: Fix requesting offload device Andrew Lunn
2023-08-08 21:04 ` [PATCH net-next v3 2/4] net: phy: phy_device: Call into the PHY driver to set LED offload Andrew Lunn
@ 2023-08-08 21:04 ` Andrew Lunn
2023-08-08 21:04 ` [PATCH net-next v3 4/4] leds: trig-netdev: Disable offload on deactivation of trigger Andrew Lunn
` (2 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Andrew Lunn @ 2023-08-08 21:04 UTC (permalink / raw)
To: netdev
Cc: Heiner Kallweit, Russell King, Simon Horman, Christian Marangi,
Daniel Golle, Andrew Lunn
Add the code needed to indicate if a given blinking pattern can be
offloaded, to offload a pattern and to try to return the current
pattern.
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
---
drivers/net/phy/marvell.c | 281 ++++++++++++++++++++++++++++++++++++++
1 file changed, 281 insertions(+)
diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c
index 43b6cb725551..eba652a4c1d8 100644
--- a/drivers/net/phy/marvell.c
+++ b/drivers/net/phy/marvell.c
@@ -2893,6 +2893,272 @@ static int m88e1318_led_blink_set(struct phy_device *phydev, u8 index,
MII_88E1318S_PHY_LED_FUNC, reg);
}
+struct marvell_led_rules {
+ int mode;
+ unsigned long rules;
+};
+
+static const struct marvell_led_rules marvell_led0[] = {
+ {
+ .mode = 0,
+ .rules = BIT(TRIGGER_NETDEV_LINK),
+ },
+ {
+ .mode = 1,
+ .rules = (BIT(TRIGGER_NETDEV_LINK) |
+ BIT(TRIGGER_NETDEV_RX) |
+ BIT(TRIGGER_NETDEV_TX)),
+ },
+ {
+ .mode = 3,
+ .rules = (BIT(TRIGGER_NETDEV_RX) |
+ BIT(TRIGGER_NETDEV_TX)),
+ },
+ {
+ .mode = 4,
+ .rules = (BIT(TRIGGER_NETDEV_RX) |
+ BIT(TRIGGER_NETDEV_TX)),
+ },
+ {
+ .mode = 5,
+ .rules = BIT(TRIGGER_NETDEV_TX),
+ },
+ {
+ .mode = 6,
+ .rules = BIT(TRIGGER_NETDEV_LINK),
+ },
+ {
+ .mode = 7,
+ .rules = BIT(TRIGGER_NETDEV_LINK_1000),
+ },
+ {
+ .mode = 8,
+ .rules = 0,
+ },
+};
+
+static const struct marvell_led_rules marvell_led1[] = {
+ {
+ .mode = 1,
+ .rules = (BIT(TRIGGER_NETDEV_LINK) |
+ BIT(TRIGGER_NETDEV_RX) |
+ BIT(TRIGGER_NETDEV_TX)),
+ },
+ {
+ .mode = 2,
+ .rules = (BIT(TRIGGER_NETDEV_LINK) |
+ BIT(TRIGGER_NETDEV_RX)),
+ },
+ {
+ .mode = 3,
+ .rules = (BIT(TRIGGER_NETDEV_RX) |
+ BIT(TRIGGER_NETDEV_TX)),
+ },
+ {
+ .mode = 4,
+ .rules = (BIT(TRIGGER_NETDEV_RX) |
+ BIT(TRIGGER_NETDEV_TX)),
+ },
+ {
+ .mode = 6,
+ .rules = (BIT(TRIGGER_NETDEV_LINK_100) |
+ BIT(TRIGGER_NETDEV_LINK_1000)),
+ },
+ {
+ .mode = 7,
+ .rules = BIT(TRIGGER_NETDEV_LINK_100),
+ },
+ {
+ .mode = 8,
+ .rules = 0,
+ },
+};
+
+static const struct marvell_led_rules marvell_led2[] = {
+ {
+ .mode = 0,
+ .rules = BIT(TRIGGER_NETDEV_LINK),
+ },
+ {
+ .mode = 1,
+ .rules = (BIT(TRIGGER_NETDEV_LINK) |
+ BIT(TRIGGER_NETDEV_RX) |
+ BIT(TRIGGER_NETDEV_TX)),
+ },
+ {
+ .mode = 3,
+ .rules = (BIT(TRIGGER_NETDEV_RX) |
+ BIT(TRIGGER_NETDEV_TX)),
+ },
+ {
+ .mode = 4,
+ .rules = (BIT(TRIGGER_NETDEV_RX) |
+ BIT(TRIGGER_NETDEV_TX)),
+ },
+ {
+ .mode = 5,
+ .rules = BIT(TRIGGER_NETDEV_TX),
+ },
+ {
+ .mode = 6,
+ .rules = (BIT(TRIGGER_NETDEV_LINK_10) |
+ BIT(TRIGGER_NETDEV_LINK_1000)),
+ },
+ {
+ .mode = 7,
+ .rules = BIT(TRIGGER_NETDEV_LINK_10),
+ },
+ {
+ .mode = 8,
+ .rules = 0,
+ },
+};
+
+static int marvell_find_led_mode(unsigned long rules,
+ const struct marvell_led_rules *marvell_rules,
+ int count,
+ int *mode)
+{
+ int i;
+
+ for (i = 0; i < count; i++) {
+ if (marvell_rules[i].rules == rules) {
+ *mode = marvell_rules[i].mode;
+ return 0;
+ }
+ }
+ return -EOPNOTSUPP;
+}
+
+static int marvell_get_led_mode(u8 index, unsigned long rules, int *mode)
+{
+ int ret;
+
+ switch (index) {
+ case 0:
+ ret = marvell_find_led_mode(rules, marvell_led0,
+ ARRAY_SIZE(marvell_led0), mode);
+ break;
+ case 1:
+ ret = marvell_find_led_mode(rules, marvell_led1,
+ ARRAY_SIZE(marvell_led1), mode);
+ break;
+ case 2:
+ ret = marvell_find_led_mode(rules, marvell_led2,
+ ARRAY_SIZE(marvell_led2), mode);
+ break;
+ default:
+ ret = -EINVAL;
+ }
+
+ return ret;
+}
+
+static int marvell_find_led_rules(unsigned long *rules,
+ const struct marvell_led_rules *marvell_rules,
+ int count,
+ int mode)
+{
+ int i;
+
+ for (i = 0; i < count; i++) {
+ if (marvell_rules[i].mode == mode) {
+ *rules = marvell_rules[i].rules;
+ return 0;
+ }
+ }
+ return -EOPNOTSUPP;
+}
+
+static int marvell_get_led_rules(u8 index, unsigned long *rules, int mode)
+{
+ int ret;
+
+ switch (index) {
+ case 0:
+ ret = marvell_find_led_rules(rules, marvell_led0,
+ ARRAY_SIZE(marvell_led0), mode);
+ break;
+ case 1:
+ ret = marvell_find_led_rules(rules, marvell_led1,
+ ARRAY_SIZE(marvell_led1), mode);
+ break;
+ case 2:
+ ret = marvell_find_led_rules(rules, marvell_led2,
+ ARRAY_SIZE(marvell_led2), mode);
+ break;
+ default:
+ ret = -EOPNOTSUPP;
+ }
+
+ return ret;
+}
+
+static int m88e1318_led_hw_is_supported(struct phy_device *phydev, u8 index,
+ unsigned long rules)
+{
+ int mode, ret;
+
+ switch (index) {
+ case 0:
+ case 1:
+ case 2:
+ ret = marvell_get_led_mode(index, rules, &mode);
+ break;
+ default:
+ ret = -EINVAL;
+ }
+
+ return ret;
+}
+
+static int m88e1318_led_hw_control_set(struct phy_device *phydev, u8 index,
+ unsigned long rules)
+{
+ int mode, ret, reg;
+
+ switch (index) {
+ case 0:
+ case 1:
+ case 2:
+ ret = marvell_get_led_mode(index, rules, &mode);
+ break;
+ default:
+ ret = -EINVAL;
+ }
+
+ if (ret < 0)
+ return ret;
+
+ reg = phy_read_paged(phydev, MII_MARVELL_LED_PAGE,
+ MII_88E1318S_PHY_LED_FUNC);
+ if (reg < 0)
+ return reg;
+
+ reg &= ~(0xf << (4 * index));
+ reg |= mode << (4 * index);
+ return phy_write_paged(phydev, MII_MARVELL_LED_PAGE,
+ MII_88E1318S_PHY_LED_FUNC, reg);
+}
+
+static int m88e1318_led_hw_control_get(struct phy_device *phydev, u8 index,
+ unsigned long *rules)
+{
+ int mode, reg;
+
+ if (index > 2)
+ return -EINVAL;
+
+ reg = phy_read_paged(phydev, MII_MARVELL_LED_PAGE,
+ MII_88E1318S_PHY_LED_FUNC);
+ if (reg < 0)
+ return reg;
+
+ mode = (reg >> (4 * index)) & 0xf;
+
+ return marvell_get_led_rules(index, rules, mode);
+}
+
static int marvell_probe(struct phy_device *phydev)
{
struct marvell_priv *priv;
@@ -3144,6 +3410,9 @@ static struct phy_driver marvell_drivers[] = {
.get_stats = marvell_get_stats,
.led_brightness_set = m88e1318_led_brightness_set,
.led_blink_set = m88e1318_led_blink_set,
+ .led_hw_is_supported = m88e1318_led_hw_is_supported,
+ .led_hw_control_set = m88e1318_led_hw_control_set,
+ .led_hw_control_get = m88e1318_led_hw_control_get,
},
{
.phy_id = MARVELL_PHY_ID_88E1145,
@@ -3252,6 +3521,9 @@ static struct phy_driver marvell_drivers[] = {
.cable_test_get_status = marvell_vct7_cable_test_get_status,
.led_brightness_set = m88e1318_led_brightness_set,
.led_blink_set = m88e1318_led_blink_set,
+ .led_hw_is_supported = m88e1318_led_hw_is_supported,
+ .led_hw_control_set = m88e1318_led_hw_control_set,
+ .led_hw_control_get = m88e1318_led_hw_control_get,
},
{
.phy_id = MARVELL_PHY_ID_88E1540,
@@ -3280,6 +3552,9 @@ static struct phy_driver marvell_drivers[] = {
.cable_test_get_status = marvell_vct7_cable_test_get_status,
.led_brightness_set = m88e1318_led_brightness_set,
.led_blink_set = m88e1318_led_blink_set,
+ .led_hw_is_supported = m88e1318_led_hw_is_supported,
+ .led_hw_control_set = m88e1318_led_hw_control_set,
+ .led_hw_control_get = m88e1318_led_hw_control_get,
},
{
.phy_id = MARVELL_PHY_ID_88E1545,
@@ -3308,6 +3583,9 @@ static struct phy_driver marvell_drivers[] = {
.cable_test_get_status = marvell_vct7_cable_test_get_status,
.led_brightness_set = m88e1318_led_brightness_set,
.led_blink_set = m88e1318_led_blink_set,
+ .led_hw_is_supported = m88e1318_led_hw_is_supported,
+ .led_hw_control_set = m88e1318_led_hw_control_set,
+ .led_hw_control_get = m88e1318_led_hw_control_get,
},
{
.phy_id = MARVELL_PHY_ID_88E3016,
@@ -3451,6 +3729,9 @@ static struct phy_driver marvell_drivers[] = {
.set_tunable = m88e1540_set_tunable,
.led_brightness_set = m88e1318_led_brightness_set,
.led_blink_set = m88e1318_led_blink_set,
+ .led_hw_is_supported = m88e1318_led_hw_is_supported,
+ .led_hw_control_set = m88e1318_led_hw_control_set,
+ .led_hw_control_get = m88e1318_led_hw_control_get,
},
};
--
2.40.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH net-next v3 4/4] leds: trig-netdev: Disable offload on deactivation of trigger
2023-08-08 21:04 [PATCH net-next v3 0/4] Support offload LED blinking to PHY Andrew Lunn
` (2 preceding siblings ...)
2023-08-08 21:04 ` [PATCH net-next v3 3/4] net: phy: marvell: Add support for offloading LED blinking Andrew Lunn
@ 2023-08-08 21:04 ` Andrew Lunn
2023-08-09 7:46 ` Simon Horman
2023-08-09 16:10 ` [PATCH net-next v3 0/4] Support offload LED blinking to PHY Daniel Golle
2023-08-11 0:40 ` patchwork-bot+netdevbpf
5 siblings, 1 reply; 9+ messages in thread
From: Andrew Lunn @ 2023-08-08 21:04 UTC (permalink / raw)
To: netdev
Cc: Heiner Kallweit, Russell King, Simon Horman, Christian Marangi,
Daniel Golle, Andrew Lunn
Ensure that the offloading of blinking is stopped when the trigger is
deactivated. Calling led_set_brightness() is documented as stopping
offload and setting the LED to a constant brightness.
Suggested-by: Daniel Golle <daniel@makrotopia.org>
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
---
drivers/leds/trigger/ledtrig-netdev.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/leds/trigger/ledtrig-netdev.c b/drivers/leds/trigger/ledtrig-netdev.c
index 3d215a556e20..42f758880ef8 100644
--- a/drivers/leds/trigger/ledtrig-netdev.c
+++ b/drivers/leds/trigger/ledtrig-netdev.c
@@ -595,6 +595,8 @@ static void netdev_trig_deactivate(struct led_classdev *led_cdev)
cancel_delayed_work_sync(&trigger_data->work);
+ led_set_brightness(led_cdev, LED_OFF);
+
dev_put(trigger_data->net_dev);
kfree(trigger_data);
--
2.40.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH net-next v3 4/4] leds: trig-netdev: Disable offload on deactivation of trigger
2023-08-08 21:04 ` [PATCH net-next v3 4/4] leds: trig-netdev: Disable offload on deactivation of trigger Andrew Lunn
@ 2023-08-09 7:46 ` Simon Horman
0 siblings, 0 replies; 9+ messages in thread
From: Simon Horman @ 2023-08-09 7:46 UTC (permalink / raw)
To: Andrew Lunn
Cc: netdev, Heiner Kallweit, Russell King, Christian Marangi,
Daniel Golle
On Tue, Aug 08, 2023 at 11:04:36PM +0200, Andrew Lunn wrote:
> Ensure that the offloading of blinking is stopped when the trigger is
> deactivated. Calling led_set_brightness() is documented as stopping
> offload and setting the LED to a constant brightness.
>
> Suggested-by: Daniel Golle <daniel@makrotopia.org>
> Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: Simon Horman <simon.horman@corigine.com>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH net-next v3 0/4] Support offload LED blinking to PHY.
2023-08-08 21:04 [PATCH net-next v3 0/4] Support offload LED blinking to PHY Andrew Lunn
` (3 preceding siblings ...)
2023-08-08 21:04 ` [PATCH net-next v3 4/4] leds: trig-netdev: Disable offload on deactivation of trigger Andrew Lunn
@ 2023-08-09 16:10 ` Daniel Golle
2023-08-09 16:27 ` Andrew Lunn
2023-08-11 0:40 ` patchwork-bot+netdevbpf
5 siblings, 1 reply; 9+ messages in thread
From: Daniel Golle @ 2023-08-09 16:10 UTC (permalink / raw)
To: Andrew Lunn
Cc: netdev, Heiner Kallweit, Russell King, Simon Horman,
Christian Marangi
Hi Andrew,
On Tue, Aug 08, 2023 at 11:04:32PM +0200, Andrew Lunn wrote:
> Allow offloading of the LED trigger netdev to PHY drivers and
> implement it for the Marvell PHY driver. Additionally, correct the
> handling of when the initial state of the LED cannot be represented by
> the trigger, and so an error is returned. As with ledtrig-timer,
> disable offload when the trigger is deactivate, or replaced by another
> trigger.
I've tested the series and changed my driver accordingly, now
deactivation of the offloaded tasks works fine when changing
the trigger.
Overall I believe this is good to go, however, what remains
unresolved is the chicken-egg when assigning the 'netdev' trigger
using linux,default-trigger in device tree: In this case selection of
the netdev trigger happens on creation of the PHY instance which is
*before* the creation of the netdev the PHY is going to be attached to.
Hence 'netdev' gets activated *without* any hardware offloading.
And while reading the current hardware state (as left behind by IC
defaults or by the bootloader) works fine, by default the LEDs would
show trigger 'none' in Linux right after boot (despite e.g. link and
traffic indications are active by default -- which is would I tried to
express by using linux,default-trigger...)
Tested-by: Daniel Golle <daniel@makrotopia.org>
>
> Since v2:
> Add support for link speeds, not just link
> Add missing checks for return values
> Add patch disabling offload when driver is deactivated
>
> Since v1:
>
> Add true kerneldoc for the new entries in struct phy_driver
> Add received Reviewed-by: tags
>
> Since v0:
>
> Make comments in struct phy_driver look more like kerneldoc
> Add cover letter
>
> Andrew Lunn (4):
> led: trig: netdev: Fix requesting offload device
> net: phy: phy_device: Call into the PHY driver to set LED offload
> net: phy: marvell: Add support for offloading LED blinking
> leds: trig-netdev: Disable offload on deactivation of trigger
>
> drivers/leds/trigger/ledtrig-netdev.c | 10 +-
> drivers/net/phy/marvell.c | 281 ++++++++++++++++++++++++++
> drivers/net/phy/phy_device.c | 68 +++++++
> include/linux/phy.h | 33 +++
> 4 files changed, 389 insertions(+), 3 deletions(-)
>
> --
> 2.40.1
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH net-next v3 0/4] Support offload LED blinking to PHY.
2023-08-09 16:10 ` [PATCH net-next v3 0/4] Support offload LED blinking to PHY Daniel Golle
@ 2023-08-09 16:27 ` Andrew Lunn
0 siblings, 0 replies; 9+ messages in thread
From: Andrew Lunn @ 2023-08-09 16:27 UTC (permalink / raw)
To: Daniel Golle
Cc: netdev, Heiner Kallweit, Russell King, Simon Horman,
Christian Marangi
> Overall I believe this is good to go, however, what remains
> unresolved is the chicken-egg when assigning the 'netdev' trigger
> using linux,default-trigger in device tree:
Agreed. This is pretty high up my TODO list to look at.
Thanks for the tested-by.
Andrew
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH net-next v3 0/4] Support offload LED blinking to PHY.
2023-08-08 21:04 [PATCH net-next v3 0/4] Support offload LED blinking to PHY Andrew Lunn
` (4 preceding siblings ...)
2023-08-09 16:10 ` [PATCH net-next v3 0/4] Support offload LED blinking to PHY Daniel Golle
@ 2023-08-11 0:40 ` patchwork-bot+netdevbpf
5 siblings, 0 replies; 9+ messages in thread
From: patchwork-bot+netdevbpf @ 2023-08-11 0:40 UTC (permalink / raw)
To: Andrew Lunn
Cc: netdev, hkallweit1, rmk+kernel, simon.horman, ansuelsmth, daniel
Hello:
This series was applied to netdev/net-next.git (main)
by Jakub Kicinski <kuba@kernel.org>:
On Tue, 8 Aug 2023 23:04:32 +0200 you wrote:
> Allow offloading of the LED trigger netdev to PHY drivers and
> implement it for the Marvell PHY driver. Additionally, correct the
> handling of when the initial state of the LED cannot be represented by
> the trigger, and so an error is returned. As with ledtrig-timer,
> disable offload when the trigger is deactivate, or replaced by another
> trigger.
>
> [...]
Here is the summary with links:
- [net-next,v3,1/4] led: trig: netdev: Fix requesting offload device
https://git.kernel.org/netdev/net-next/c/7df1f14c04cb
- [net-next,v3,2/4] net: phy: phy_device: Call into the PHY driver to set LED offload
https://git.kernel.org/netdev/net-next/c/1dcc03c9a7a8
- [net-next,v3,3/4] net: phy: marvell: Add support for offloading LED blinking
https://git.kernel.org/netdev/net-next/c/460b0b648fab
- [net-next,v3,4/4] leds: trig-netdev: Disable offload on deactivation of trigger
https://git.kernel.org/netdev/net-next/c/e8fbcc47a8e9
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2023-08-11 0:40 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-08-08 21:04 [PATCH net-next v3 0/4] Support offload LED blinking to PHY Andrew Lunn
2023-08-08 21:04 ` [PATCH net-next v3 1/4] led: trig: netdev: Fix requesting offload device Andrew Lunn
2023-08-08 21:04 ` [PATCH net-next v3 2/4] net: phy: phy_device: Call into the PHY driver to set LED offload Andrew Lunn
2023-08-08 21:04 ` [PATCH net-next v3 3/4] net: phy: marvell: Add support for offloading LED blinking Andrew Lunn
2023-08-08 21:04 ` [PATCH net-next v3 4/4] leds: trig-netdev: Disable offload on deactivation of trigger Andrew Lunn
2023-08-09 7:46 ` Simon Horman
2023-08-09 16:10 ` [PATCH net-next v3 0/4] Support offload LED blinking to PHY Daniel Golle
2023-08-09 16:27 ` Andrew Lunn
2023-08-11 0:40 ` patchwork-bot+netdevbpf
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).