summaryrefslogtreecommitdiff
path: root/drivers/usb/core/hub.c
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-05-14 09:22:58 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-05-14 09:22:58 -0700
commit304f0b2453ea377b8f987aa5f9e1ccda0e3adfa7 (patch)
tree505ebcfed7116a98c9a8fac7018680fb1c7950ea /drivers/usb/core/hub.c
parentfa286188ce0fce994c3fc2bddcafeb948834591f (diff)
Revert "usb: add struct usb_hub_port to store port related members."
This reverts commit f397d7c4c5e8a1eb93f2ed15808a509318ccf1dd. This series isn't quite ready for 3.5 just yet, so revert it and give the author more time to get it correct. Cc: Lan Tianyu <tianyu.lan@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb/core/hub.c')
-rw-r--r--drivers/usb/core/hub.c29
1 files changed, 13 insertions, 16 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 0c17d5a91d79..ec6c97dadbe4 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -37,10 +37,6 @@
#endif
#endif
-struct usb_hub_port {
- void *port_owner;
-};
-
struct usb_hub {
struct device *intfdev; /* the "interface" device */
struct usb_device *hdev;
@@ -85,7 +81,7 @@ struct usb_hub {
u8 indicator[USB_MAXCHILDREN];
struct delayed_work leds;
struct delayed_work init_work;
- struct usb_hub_port *port_data;
+ void **port_owners;
};
static inline int hub_is_superspeed(struct usb_device *hdev)
@@ -1053,9 +1049,8 @@ static int hub_configure(struct usb_hub *hub,
hdev->children = kzalloc(hdev->maxchild *
sizeof(struct usb_device *), GFP_KERNEL);
- hub->port_data = kzalloc(hdev->maxchild * sizeof(struct usb_hub_port),
- GFP_KERNEL);
- if (!hub->port_data || !hdev->children) {
+ hub->port_owners = kzalloc(hdev->maxchild * sizeof(void *), GFP_KERNEL);
+ if (!hdev->children || !hub->port_owners) {
ret = -ENOMEM;
goto fail;
}
@@ -1310,7 +1305,7 @@ static void hub_disconnect(struct usb_interface *intf)
usb_free_urb(hub->urb);
kfree(hdev->children);
- kfree(hub->port_data);
+ kfree(hub->port_owners);
kfree(hub->descriptor);
kfree(hub->status);
kfree(hub->buffer);
@@ -1442,7 +1437,7 @@ static int find_port_owner(struct usb_device *hdev, unsigned port1,
/* This assumes that devices not managed by the hub driver
* will always have maxchild equal to 0.
*/
- *ppowner = &(hdev_to_hub(hdev)->port_data[port1 - 1].port_owner);
+ *ppowner = &(hdev_to_hub(hdev)->port_owners[port1 - 1]);
return 0;
}
@@ -1477,14 +1472,16 @@ int usb_hub_release_port(struct usb_device *hdev, unsigned port1, void *owner)
void usb_hub_release_all_ports(struct usb_device *hdev, void *owner)
{
- struct usb_hub *hub = hdev_to_hub(hdev);
int n;
+ void **powner;
- for (n = 0; n < hdev->maxchild; n++) {
- if (hub->port_data[n].port_owner == owner)
- hub->port_data[n].port_owner = NULL;
+ n = find_port_owner(hdev, 1, &powner);
+ if (n == 0) {
+ for (; n < hdev->maxchild; (++n, ++powner)) {
+ if (*powner == owner)
+ *powner = NULL;
+ }
}
-
}
/* The caller must hold udev's lock */
@@ -1495,7 +1492,7 @@ bool usb_device_is_owned(struct usb_device *udev)
if (udev->state == USB_STATE_NOTATTACHED || !udev->parent)
return false;
hub = hdev_to_hub(udev->parent);
- return !!hub->port_data[udev->portnum - 1].port_owner;
+ return !!hub->port_owners[udev->portnum - 1];
}