On Tue, Jun 28, 2022 at 3:23 PM Michael Walle <michael@xxxxxxxx> wrote:
>> I was trying to fix the lan966x driver [1] which doesn't work if there
>> are disabled nodes in between.
>
> Can you elaborate what's wrong now in the behaviour of the driver? In
> the code it uses twice the _available variant.
Imagine the following device tree snippet:
port0 {
reg = <0>;
status = "okay";
}
port1 {
reg = <1>;
status = "disabled";
}
port@2 {
reg = <2>;
status = "okay";
}
The driver will set num_phys_ports to 2. When port@2 is probed, it
will have the (correct!) physical port number 2. That will then
trigger various EINVAL checks with "port_num >= num_phys_ports" or
WARN()s.
It means the above mentioned condition is wrong: it should be
"port_idx >= num_phys_ports" (if the port_idx doesn't exists, that's
the bug in the first place)
So the easiest fix would be to actual count all the child nodes
(regardless if they are available or not), assuming there are as
many nodes as physical ports.
But num_phys_ports being a property of the hardware
So, name is wrong, that's how I read it, it should be
num_of_acrive_phys_ports (or alike).
I don't
think it's good to deduce it by counting the child nodes anyway,
Right.
but it should rather be a (hardcoded) property of the driver.
Also good to update.