Revert "usb: add struct usb_hub_port to store port related members."
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 14 May 2012 16:22:58 +0000 (09:22 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 14 May 2012 16:22:58 +0000 (09:22 -0700)
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>
drivers/usb/core/hub.c

index 0c17d5a91d79b11fbd9065477ac1de75ccf3686c..ec6c97dadbe4dba5e3cf8a47980e23256a44bff5 100644 (file)
 #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];
 }