From 16fb0f025aa18160790074fb4a683b2a9f3e25a1 Mon Sep 17 00:00:00 2001 From: Alan Stern Date: Mon, 25 Apr 2005 11:18:32 -0400 Subject: [PATCH] --- yaml --- r: 3671 b: refs/heads/master c: 7d35b9298539d2818c51fe9070b08cf9876016f4 h: refs/heads/master i: 3669: e905dfd9f59919cf2a12953877bc80cb8ce5bcf3 3667: e1001f0d9a0eb978513595da20f96f1475208c07 3663: 808012837292a2dda0f61fb9781e4902317491e1 v: v3 --- [refs] | 2 +- trunk/drivers/usb/core/hcd.h | 1 + trunk/drivers/usb/core/hub.c | 12 +++++++++--- trunk/drivers/usb/core/hub.h | 11 ----------- 4 files changed, 11 insertions(+), 15 deletions(-) diff --git a/[refs] b/[refs] index 2c86010a92d0..355ce682cb68 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: f58f97fa9d258e4110ee1257a63cd1af51787f69 +refs/heads/master: 7d35b9298539d2818c51fe9070b08cf9876016f4 diff --git a/trunk/drivers/usb/core/hcd.h b/trunk/drivers/usb/core/hcd.h index ac5752778e39..3837f68bb7b3 100644 --- a/trunk/drivers/usb/core/hcd.h +++ b/trunk/drivers/usb/core/hcd.h @@ -87,6 +87,7 @@ struct usb_hcd { /* usb_bus.hcpriv points to this */ 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]; diff --git a/trunk/drivers/usb/core/hub.c b/trunk/drivers/usb/core/hub.c index 6d1a330d577b..63ee3d97b6a9 100644 --- a/trunk/drivers/usb/core/hub.c +++ b/trunk/drivers/usb/core/hub.c @@ -643,15 +643,21 @@ static int hub_configure(struct usb_hub *hub, 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); diff --git a/trunk/drivers/usb/core/hub.h b/trunk/drivers/usb/core/hub.h index d114b847d56f..53bf5649621e 100644 --- a/trunk/drivers/usb/core/hub.h +++ b/trunk/drivers/usb/core/hub.h @@ -224,15 +224,4 @@ struct usb_hub { 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 */