Messages in this thread | | | Date | Tue, 28 Jun 2022 15:23:50 +0200 | From | Michael Walle <> | Subject | Re: fwnode_for_each_child_node() and OF backend discrepancy |
| |
>> 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.
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 I don't think it's good to deduce it by counting the child nodes anyway, but it should rather be a (hardcoded) property of the driver.
-michael
[1] https://elixir.bootlin.com/linux/v5.19-rc4/source/drivers/net/ethernet/microchip/lan966x/lan966x_main.c
| |