diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/usb/core/hub.c | 29 |
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]; } |