From 964ae8e1af5ac7dd4ec9b7c6d46a2b765a6fd41f Mon Sep 17 00:00:00 2001 From: Lan Tianyu Date: Sun, 20 Jan 2013 01:53:33 +0800 Subject: [PATCH] --- yaml --- r: 354576 b: refs/heads/master c: fde26380315d7d57816efc143b7924c82dba764d h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/usb/core/hub.c | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index ecfa6b148e68..b95d2c83a3c4 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: cef7468caff29d3333fba4d0ececd82063ce80d5 +refs/heads/master: fde26380315d7d57816efc143b7924c82dba764d diff --git a/trunk/drivers/usb/core/hub.c b/trunk/drivers/usb/core/hub.c index f6ff1302f343..cfdd4eecc5a9 100644 --- a/trunk/drivers/usb/core/hub.c +++ b/trunk/drivers/usb/core/hub.c @@ -1989,6 +1989,14 @@ void usb_disconnect(struct usb_device **pdev) usb_disable_device(udev, 0); usb_hcd_synchronize_unlinks(udev); + if (udev->parent) { + struct usb_port *port_dev = + hdev_to_hub(udev->parent)->ports[udev->portnum - 1]; + + sysfs_remove_link(&udev->dev.kobj, "port"); + sysfs_remove_link(&port_dev->dev.kobj, "device"); + } + usb_remove_ep_devs(&udev->ep0); usb_unlock_device(udev); @@ -2281,6 +2289,24 @@ int usb_new_device(struct usb_device *udev) goto fail; } + /* Create link files between child device and usb port device. */ + if (udev->parent) { + struct usb_port *port_dev = + hdev_to_hub(udev->parent)->ports[udev->portnum - 1]; + + err = sysfs_create_link(&udev->dev.kobj, + &port_dev->dev.kobj, "port"); + if (err) + goto fail; + + err = sysfs_create_link(&port_dev->dev.kobj, + &udev->dev.kobj, "device"); + if (err) { + sysfs_remove_link(&udev->dev.kobj, "port"); + goto fail; + } + } + (void) usb_create_ep_devs(&udev->dev, &udev->ep0, udev); usb_mark_last_busy(udev); pm_runtime_put_sync_autosuspend(&udev->dev);