#endif
 #endif
 
-struct usb_hub_port {
-       void                    *port_owner;
-};
-
 struct usb_hub {
        struct device           *intfdev;       /* the "interface" device */
        struct usb_device       *hdev;
        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)
 
        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;
        }
 
        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);
        /* 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;
 }
 
 
 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 */
        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];
 }