On Tue, 14 May 2019 16:58:59 +0200 Marek Behún <marek.be...@nic.cz> wrote:
> The ofdata_to_platdata method for this driver returns -ENODEV if link > is down for a given bus, for example if there is no device in the > slot. This causes the uclass_{first,next}_device to return NULL for > this bus in pci-uclass.c:pci_init, which of course stops probing of > buses which come after. > > So if the slot on the first bus is empty on Turris Omnia, and the slot > on second bus has a device connected, the device is not probed in > U-Boot. On Turris Omnia the PCIe devices have to be probed in U-Boot > to work correctly in Linux. Therefore we need this fix. > ... > if (!mvebu_pcie_link_up(pcie)) { > debug("%s: %s - down\n", __func__, pcie->name); > - ret = -ENODEV; > goto err; > } > The problem is how uclass_{first,next}_device functions work. They use helpers uclass_find_{first,next}_device, which iterate all devices. But uclass_{first,next}_device functions also use uclass_get_device_tail on the device returned by helper. This function can return NULL if device failed to probe, which causes the iteration to stop. Wouldn't it be better if uclass_next_device tried iterating via uclass_find_next_device until a device was found which probed successfully? I don't know if this would break other things in U-Boot though. Marek _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot