Commit 7df1f14c authored by Andrew Lunn's avatar Andrew Lunn Committed by Jakub Kicinski

led: trig: netdev: Fix requesting offload device

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: default avatarSimon Horman <simon.horman@corigine.com>
Signed-off-by: default avatarAndrew Lunn <andrew@lunn.ch>
Tested-by: default avatarDaniel Golle <daniel@makrotopia.org>
Link: https://lore.kernel.org/r/20230808210436.838995-2-andrew@lunn.chSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 215c44fa
...@@ -564,15 +564,17 @@ static int netdev_trig_activate(struct led_classdev *led_cdev) ...@@ -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. /* Check if hw control is active by default on the LED.
* Init already enabled mode in hw control. * Init already enabled mode in hw control.
*/ */
if (supports_hw_control(led_cdev) && if (supports_hw_control(led_cdev)) {
!led_cdev->hw_control_get(led_cdev, &mode)) {
dev = led_cdev->hw_control_get_device(led_cdev); dev = led_cdev->hw_control_get_device(led_cdev);
if (dev) { if (dev) {
const char *name = dev_name(dev); const char *name = dev_name(dev);
set_device_name(trigger_data, name, strlen(name)); set_device_name(trigger_data, name, strlen(name));
trigger_data->hw_control = true; trigger_data->hw_control = true;
trigger_data->mode = mode;
rc = led_cdev->hw_control_get(led_cdev, &mode);
if (!rc)
trigger_data->mode = mode;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment