+ free(udev);
+}
+
+dev_t udev_device_get_devt(struct udevice *udev)
+{
+ const char *attr;
+ unsigned int major, minor;
+
+ /* read it from sysfs */
+ attr = sysfs_attr_get_value(udev->dev->devpath, "dev");
+ if (attr != NULL) {
+ if (sscanf(attr, "%u:%u", &major, &minor) == 2)
+ return makedev(major, minor);
+ }
+ return makedev(0, 0);
+}
+
+int udev_device_event(struct udev_rules *rules, struct udevice *udev)
+{
+ int retval = 0;
+
+ /* device node or netif */
+ if ((major(udev->devt) != 0 || strcmp(udev->dev->subsystem, "net") == 0) &&
+ strcmp(udev->action, "add") == 0) {
+ dbg("device node or netif add '%s'", udev->dev->devpath);
+ udev_rules_get_name(rules, udev);
+ if (udev->ignore_device) {
+ info("device event will be ignored");
+ return 0;
+ }
+ /* create node, store in db */
+ if (udev->name[0] != '\0')
+ retval = udev_add_device(udev);
+ else
+ info("device node creation supressed");
+ return retval;
+ }
+
+ if (major(udev->devt) != 0 && strcmp(udev->action, "remove") == 0) {
+ struct name_entry *name_loop;
+
+ udev_rules_get_run(rules, udev);
+ if (udev->ignore_device) {
+ info("device event will be ignored");
+ return 0;
+ }
+ /* get data from db, remove db-entry, delete node */
+ retval = udev_remove_device(udev);
+
+ /* restore stored persistent data */
+ list_for_each_entry(name_loop, &udev->env_list, node)
+ putenv(name_loop->name);
+ return retval;
+ }
+
+ /* default devices without a node */
+ udev_rules_get_run(rules, udev);
+ if (udev->ignore_device)
+ info("device event will be ignored");
+
+ return retval;