[PATCH] namedev: execute PROGRAM only once and not possibly for every physical device

This commit is contained in:
kay.sievers@vrfy.org 2005-02-14 01:46:05 +01:00 committed by Greg KH
parent 03a9875bc3
commit e57e7bc108

View file

@ -604,6 +604,7 @@ static int match_rule(struct udevice *udev, struct config_device *dev,
dbg(FIELD_SUBSYSTEM " matches");
}
/* walk up the chain of physical devices and find a match */
while (1) {
/* check for matching driver */
if (dev->driver[0] != '\0') {
@ -612,9 +613,8 @@ static int match_rule(struct udevice *udev, struct config_device *dev,
if (strcmp_pattern(dev->driver, sysfs_device->driver_name) != 0) {
dbg(FIELD_DRIVER " is not matching");
goto try_parent;
} else {
dbg(FIELD_DRIVER " matches");
}
dbg(FIELD_DRIVER " matches");
}
/* check for matching bus value */
@ -638,9 +638,8 @@ static int match_rule(struct udevice *udev, struct config_device *dev,
if (match_id(dev, class_dev, sysfs_device) != 0) {
dbg(FIELD_ID " is not matching");
goto try_parent;
} else {
dbg(FIELD_ID " matches");
}
dbg(FIELD_ID " matches");
}
/* check for matching place of device */
@ -649,9 +648,8 @@ static int match_rule(struct udevice *udev, struct config_device *dev,
if (match_place(dev, class_dev, sysfs_device) != 0) {
dbg(FIELD_PLACE " is not matching");
goto try_parent;
} else {
dbg(FIELD_PLACE " matches");
}
dbg(FIELD_PLACE " matches");
}
/* check for matching sysfs pairs */
@ -660,9 +658,19 @@ static int match_rule(struct udevice *udev, struct config_device *dev,
if (match_sysfs_pairs(dev, class_dev, sysfs_device) != 0) {
dbg(FIELD_SYSFS " is not matching");
goto try_parent;
} else {
}
dbg(FIELD_SYSFS " matches");
}
/* found matching physical device */
break;
try_parent:
dbg("try parent sysfs device");
sysfs_device = sysfs_get_device_parent(sysfs_device);
if (sysfs_device == NULL)
goto exit;
dbg("sysfs_device->path='%s'", sysfs_device->path);
dbg("sysfs_device->bus_id='%s'", sysfs_device->bus_id);
}
/* execute external program */
@ -675,9 +683,8 @@ static int match_rule(struct udevice *udev, struct config_device *dev,
if (execute_program(udev, program, udev->program_result, NAME_SIZE) != 0) {
dbg(FIELD_PROGRAM " returned nonzero");
goto try_parent;
} else {
dbg(FIELD_PROGRAM " returned successful");
}
dbg(FIELD_PROGRAM " returned successful");
}
/* check for matching result of external program */
@ -687,23 +694,13 @@ static int match_rule(struct udevice *udev, struct config_device *dev,
if (strcmp_pattern(dev->result, udev->program_result) != 0) {
dbg(FIELD_RESULT " is not matching");
goto try_parent;
} else {
}
dbg(FIELD_RESULT " matches");
}
}
/* we matched */
/* rule matches */
return 0;
try_parent:
dbg("try parent sysfs device");
sysfs_device = sysfs_get_device_parent(sysfs_device);
if (sysfs_device == NULL)
goto exit;
dbg("sysfs_device->path='%s'", sysfs_device->path);
dbg("sysfs_device->bus_id='%s'", sysfs_device->bus_id);
}
exit:
return -1;
}