}
}
+/*
+ * Note, we can have multiple files for different busses in here due
+ * to the mess that USB has for its device tree...
+ */
static struct bus_file {
char *bus;
char *file;
} bus_files[] = {
{ .bus = "scsi", .file = "vendor" },
{ .bus = "usb", .file = "idVendor" },
+ { .bus = "usb", .file = "iInterface" },
{ .bus = "usb-serial", .file = "detach_state" },
{ .bus = "ide", .file = "detach_state" },
{ .bus = "pci", .file = "vendor" },
*/
struct bus_file *b = &bus_files[0];
struct sysfs_attribute *tmpattr;
- int loop;
+ int found = 0;
+ int loop = SECONDS_TO_WAIT_FOR_FILE;
while (1) {
- if (b->bus == NULL)
- break;
+ if (b->bus == NULL) {
+ if (!found)
+ break;
+ /* sleep to give the kernel a chance to create the file */
+ sleep(1);
+ --loop;
+ if (loop == 0)
+ break;
+ b = &bus_files[0];
+ }
if (strcmp(sysfs_device->bus, b->bus) == 0) {
- tmpattr = NULL;
- loop = SECONDS_TO_WAIT_FOR_FILE;
- while (loop--) {
- dbg("looking for file '%s' on bus '%s'", b->file, b->bus);
- tmpattr = sysfs_get_device_attr(sysfs_device, b->file);
- if (tmpattr) {
- /* found it! */
- goto exit;
- }
- /* sleep to give the kernel a chance to create the file */
- sleep(1);
+ found = 1;
+ dbg("looking for file '%s' on bus '%s'", b->file, b->bus);
+ tmpattr = sysfs_get_device_attr(sysfs_device, b->file);
+ if (tmpattr) {
+ /* found it! */
+ goto exit;
}
- dbg("timed out waiting for '%s' file, continuing on anyway...", b->file);
- goto exit;
+ dbg("can't find '%s' file", b->file);
}
- b++;
+ ++b;
}
- dbg("did not find bus type '%s' on list of bus_id_files, contact greg@kroah.com", sysfs_device->bus);
+ if (!found)
+ dbg("did not find bus type '%s' on list of bus_id_files, "
+ "contact greg@kroah.com", sysfs_device->bus);
exit:
return; /* here to prevent compiler warning... */
}
+static void fix_kernel_name(struct udevice *udev)
+{
+ char *temp = udev->kernel_name;
+
+ while (*temp != 0x00) {
+ /* Some block devices have a ! in their name,
+ * we need to change that to / */
+ if (*temp == '!')
+ *temp = '/';
+ ++temp;
+ }
+}
+
static int execute_program(char *path, char *value, int len)
{
int retval;
static int match_id(struct config_device *dev, struct sysfs_class_device *class_dev, struct sysfs_device *sysfs_device)
{
char path[SYSFS_PATH_MAX];
- int found;
char *temp = NULL;
/* we have to have a sysfs device for ID to work */
if (!sysfs_device)
return -ENODEV;
- found = 0;
strfieldcpy(path, sysfs_device->path);
temp = strrchr(path, '/');
+ temp++;
dbg("search '%s' in '%s', path='%s'", dev->id, temp, path);
- if (strstr(temp, dev->id) != NULL) {
- found = 1;
- } else {
- *temp = 0x00;
- temp = strrchr(path, '/');
- dbg("search '%s' in '%s', path='%s'", dev->id, temp, path);
- if (strstr(temp, dev->id) != NULL)
- found = 1;
- }
- if (!found) {
- dbg("id doesn't match");
+ if (strcmp_pattern(dev->id, temp) != 0)
return -ENODEV;
- }
-
- return 0;
+ else
+ return 0;
}
static int match_place(struct config_device *dev, struct sysfs_class_device *class_dev, struct sysfs_device *sysfs_device)
dbg("sysfs_device->bus='%s'", sysfs_device->bus);
strfieldcpy(udev->bus_id, sysfs_device->bus_id);
wait_for_device_to_initialize(sysfs_device);
- } else {
- dbg("class_dev->name = '%s'", class_dev->name);
}
+ dbg("class_dev->name = '%s'", class_dev->name);
strfieldcpy(udev->kernel_name, class_dev->name);
+ fix_kernel_name(udev);
+ dbg("udev->kernel_name = '%s'", udev->kernel_name);
/* get kernel number */
pos = class_dev->name + strlen(class_dev->name);