[PATCH v2 05/16] realtek: add switch port LED driver

Sander Vanheule sander at svanheule.net
Sun Oct 30 11:46:21 PDT 2022


Hi Alex,

On Tue, 2022-10-18 at 15:23 -0500, Alex G. wrote:
> On 10/16/22 16:58, Sander Vanheule wrote:
> > Hi Alex,
> Hi
> 
> [snip]
> 
> > > > +
> > > > +       if (current_trigger != rtl_trigger && !bitmap_empty(group-
> > > > >ports,
> > > > group->size)) {
> > > > +               dev_warn(ctrl->dev, "cannot map (%d,%d) to group %d:
> > > > 0x%02x
> > > > != 0x%02x\n",
> > > > +                        led->port, led->index, group->index,
> > > > current_trigger, rtl_trigger);
> > > > +               return ERR_PTR(-ENOSPC);
> > > > +       }
> > > 
> > > It seems that the rtl_hw_trigger cannot be changed once any of the LEDs
> > > are switched to "realtek-switchport".
> > > 
> > > # echo realtek-switchport | tee /sys/class/leds/green:lan*_1000/trigger
> > > # echo 13 | tee /sys/class/leds/green:lan*_1000/rtl_hw_trigger
> > > tee: /sys/class/leds/green:lan1_1000/rtl_hw_trigger: I/O error
> > > 
> > > 
> > > [  852.470000] realtek-switch-port-led realtek-switchcore-port-leds.0:
> > > cannot map (15,1) to group 0: 0x1f != 0x0a
> > > [  852.480000] realtek-switch-port-led realtek-switchcore-port-leds.0:
> > > cannot map (14,1) to group 0: 0x1f != 0x0a
> > > ...
> > > 
> > > 
> > > However, doing things in opposite order works (after reboot):
> > > -------------------------------------------------------------
> > > 
> > > # echo 13 | tee /sys/class/leds/green:lan*_1000/rtl_hw_trigger
> > > # echo realtek-switchport | tee /sys/class/leds/green:lan*_1000/trigger
> > > # grep . /sys/kernel/debug/rtl838x/led/led*
> > > /sys/kernel/debug/rtl838x/led/led1_sw_p_en_ctrl:0x0fff00ff
> > > /sys/kernel/debug/rtl838x/led/led_mode_ctrl:0x00838147
> > 
> > This behaviour is intentional, but I am open to suggestions on improving it,
> > as
> > I agree it isn't very nice.
> > 
> > When using the "netdev" trigger, the sysfs configuration files are only
> > exposed
> > when the trigger is selected. This makes sense if each LED can be configured
> > independently of the others.
> > 
> > The hardware trigger on RTL838x requires an LED to be part of a group (or
> > "set"
> > in the SDK). As such, an LED itself cannot be configured to trigger on a
> > certain
> > hardware state, but the group it belongs to must be configured. That is why
> > I
> > opted to let the user set a HW trigger condition before activating the HW
> > trigger, since activation means assigning the LED to one of the limited
> > number
> > of groups.
> > 
> > One alternative would be to only expose the rtl_hw_trigger file once the
> > "realtek-switchport" trigger is selected, but that would mean I have to
> > either
> >   * ignore configurations that cannot currently be mapped to any active
> > group,
> >   * change the behaviour of other LEDs belonging to an already existing
> > group, if
> >     the HW trigger is overwritten.
> > 
> > The latter may work on RTL838x, where there is only one HW trigger setting
> > for
> > any given LED. On RTL839x this is not possible though, because there is no
> > way
> > to decide which of the 4 available groups should be used if there aren't any
> > available.
> 
> This is modeled in sysfs such that each LED appears to have its own 
> "rtl_hw_trigger". Instead, why not model one "rtl_hw_trigger" per LED 
> group? For example, symlink "rtl_hw_trigger" to a sysfs entry in the parent.
> 
> You can make the symlink appear or disappear when "realtek-switchport" 
> trigger is selected, or just leave it always on. When you change the 
> setting for one LED, it changes it for all the LEDs in the group. I 
> think it's more intuitive because it aligns more to how the LED 
> controller actually works.
> 
> Thus, "realtek-switchport" controls led{0,1,2}_sw_p_en_ctrl, and 
> "rtl_hw_trigger" only controls led_mode_ctrl. No need to intermingle 
> them with complicated logic.

On RTL838x the group mapping is static. On RTL839x (and newer) the group mapping
is runtime-configurable. I don't want to provide 4 symlinks + group selection
per LED, or dynamically update a symlink to the currently selected group; the
latter sounding pretty fragile.

The main issue is again that RTL838x is different from the other platforms, but
I don't want to ask developers/users to learn 2/3/4 subtly different LED
interfaces. A 1:1 interface between userspace and the device is probably the
easiest initially, but this interface is also a bit of an exercise to develop an
interface for offloaded netdev triggering.

> 
> 
> > > But then there's yet another confusing point:
> > > ---------------------------------------------
> > > 
> > > # echo 13 > /sys/class/leds/green:lan1_1000/rtl_hw_trigger
> > > # cat /sys/class/leds/green:lan1_1000/rtl_hw_trigger
> > > 13
> > > # echo realtek-switchport | tee /sys/class/leds/green:lan*_1000/trigger
> > > # grep . /sys/class/leds/green:lan*_1000/trigger
> > > /sys/class/leds/green:lan1_1000/trigger:none timer heartbeat default-on
> > > netdev [realtek-switchport]
> > > /sys/class/leds/green:lan2_1000/trigger:[none] timer heartbeat
> > > default-on netdev realtek-switchport
> > > ...
> > > 
> > > The other ports don't get switched to realtek-switchport, and there is
> > > no noticeable indication of an error.
> > > 
> > 
> > Did you run this after rebooting? I'm not able to reproduce this on my
> > (mainline) image. When only one port has trigger flags "13", this results in
> > log
> > messages in my quick test.
> 
> Yes, that's right after reboot (rtl838x-based TL-SG2008P). I see the 
> dmesg messages now. Still, I would expect the 'tee' or 'echo' command to 
> show an error. It's not obvious that the answer lies in dmesg.

To help with setting up the LEDs, I've added a new DT property in the v3 of this
series. The trigger flags are now also documented in a dt-bindings header, which
should help avoid confusion between the trigger setting and the raw register
value.

Best,
Sander



More information about the openwrt-devel mailing list