device/smbus: Avoid infinite loop if SMBUS device has wrong parent

If an SMBUS device in devicetree.cb is placed under a parent device
that does not have an SMBUS controller, coreboot will enter an
infinite loop and hang without printing any failure messages.

Modify the loop to exit under these conditions, allowing the failure
message to be printed.

Change-Id: I4c615f3c5b3908178b8223cb6620c393bbfb4e7f
Signed-off-by: Timothy Pearson <tpearson@raptorengineeringinc.com>
Reviewed-on: http://review.coreboot.org/12131
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
Reviewed-by: Felix Held <felix-coreboot@felixheld.de>
Tested-by: build bot (Jenkins)
This commit is contained in:
Timothy Pearson 2015-10-22 17:19:19 -05:00 committed by Nico Huber
parent ccc2af14c1
commit a693f524ca
1 changed files with 11 additions and 2 deletions

View File

@ -29,8 +29,17 @@ struct bus *get_pbus_smbus(device_t dev)
{
struct bus *pbus = dev->bus;
while (pbus && pbus->dev && !ops_smbus_bus(pbus))
pbus = pbus->dev->bus;
while (pbus && pbus->dev && !ops_smbus_bus(pbus)) {
if (pbus->dev->bus != pbus) {
pbus = pbus->dev->bus;
}
else {
printk(BIOS_WARNING,
"%s Find SMBus bus operations: unable to proceed\n",
dev_path(dev));
break;
}
}
if (!pbus || !pbus->dev || !pbus->dev->ops
|| !pbus->dev->ops->ops_smbus_bus) {