From stern@rowland.harvard.edu Mon Apr 25 08:21:47 2005
Date: Mon, 25 Apr 2005 11:18:32 -0400 (EDT)
From: Alan Stern <stern@rowland.harvard.edu>
To: Greg KH <greg@kroah.com>
Subject: [PATCH as510 (2/5)] usbcore: Remove hub_set_power_budget


This patch removes the hub_set_power_budget routine, which was used by a 
couple of HCDs to indicate that the root hub was running on battery power.  
In its place is a new field added to struct usb_hcd, which HCDs can set 
before the root hub is registered.  Special-case code in the hub driver 
knows to look at this field when configuring a root hub.


Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Acked-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

---
--- gregkh-2.6.orig/drivers/usb/core/hcd.h	2005-04-28 10:46:21.000000000 -0700
+++ gregkh-2.6/drivers/usb/core/hcd.h	2005-04-28 11:13:24.000000000 -0700
@@ -87,6 +87,7 @@
 	void __iomem		*regs;		/* device memory/io */
 	u64			rsrc_start;	/* memory/io resource start */
 	u64			rsrc_len;	/* memory/io resource length */
+	unsigned		power_budget;	/* in mA, 0 = no limit */
 
 #define HCD_BUFFER_POOLS	4
 	struct dma_pool		*pool [HCD_BUFFER_POOLS];
--- gregkh-2.6.orig/drivers/usb/core/hub.c	2005-04-28 10:46:21.000000000 -0700
+++ gregkh-2.6/drivers/usb/core/hub.c	2005-04-28 11:13:24.000000000 -0700
@@ -643,15 +643,21 @@
 		message = "can't get hub status";
 		goto fail;
 	}
-	cpu_to_le16s(&hubstatus);
-	if ((hubstatus & (1 << USB_DEVICE_SELF_POWERED)) == 0) {
+	le16_to_cpus(&hubstatus);
+	if (hdev == hdev->bus->root_hub) {
+		struct usb_hcd *hcd =
+				container_of(hdev->bus, struct usb_hcd, self);
+
+		hub->power_budget = min(500u, hcd->power_budget) / 2;
+	} else if ((hubstatus & (1 << USB_DEVICE_SELF_POWERED)) == 0) {
 		dev_dbg(hub_dev, "hub controller current requirement: %dmA\n",
 			hub->descriptor->bHubContrCurrent);
 		hub->power_budget = (501 - hub->descriptor->bHubContrCurrent)
 					/ 2;
+	}
+	if (hub->power_budget)
 		dev_dbg(hub_dev, "%dmA bus power budget for children\n",
 			hub->power_budget * 2);
-	}
 
 
 	ret = hub_hub_status(hub, &hubstatus, &hubchange);
--- gregkh-2.6.orig/drivers/usb/core/hub.h	2005-04-06 11:47:47.000000000 -0700
+++ gregkh-2.6/drivers/usb/core/hub.h	2005-04-28 11:13:24.000000000 -0700
@@ -224,15 +224,4 @@
 	struct work_struct	leds;
 };
 
-/* use this for low-powered root hubs */
-static inline void
-hub_set_power_budget (struct usb_device *hubdev, unsigned mA)
-{
-	struct usb_hub	*hub;
-
-	hub = (struct usb_hub *)
-		usb_get_intfdata (hubdev->actconfig->interface[0]);
-	hub->power_budget = min(mA,(unsigned)500)/2;
-}
-
 #endif /* __LINUX_HUB_H */