aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/core
diff options
context:
space:
mode:
authorDaniel Drake <dsd@gentoo.org>2006-05-26 16:36:28 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2006-06-21 18:04:14 -0400
commit1fbe75e12f0dd567c86533e13ba2605f3ecad2e1 (patch)
tree2fc8008f06fd96869dd591dcb08fc7536775212c /drivers/usb/core
parent955a260829b5848fa90721678bab003234c93356 (diff)
[PATCH] USB: print message when device is rejected due to insufficient power
2.6.16 introduces USB power budgeting in the Linux kernel, and since then, a fair number of users have observed that some of their devices no longer work in unpowered hubs (this is not a bug, the devices claim that they need more than 100mA). The very least we can do is print an informational message to the kernel log when this happens, otherwise it is not at all clear why the device was not accepted. Signed-off-by: Daniel Drake <dsd@gentoo.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/core')
-rw-r--r--drivers/usb/core/hub.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 1b1846e6473b..89ebe6a23a90 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -1176,6 +1176,7 @@ static int choose_configuration(struct usb_device *udev)
1176{ 1176{
1177 int i; 1177 int i;
1178 int num_configs; 1178 int num_configs;
1179 int insufficient_power = 0;
1179 struct usb_host_config *c, *best; 1180 struct usb_host_config *c, *best;
1180 1181
1181 best = NULL; 1182 best = NULL;
@@ -1228,8 +1229,10 @@ static int choose_configuration(struct usb_device *udev)
1228 */ 1229 */
1229 1230
1230 /* Rule out configs that draw too much bus current */ 1231 /* Rule out configs that draw too much bus current */
1231 if (c->desc.bMaxPower * 2 > udev->bus_mA) 1232 if (c->desc.bMaxPower * 2 > udev->bus_mA) {
1233 insufficient_power++;
1232 continue; 1234 continue;
1235 }
1233 1236
1234 /* If the first config's first interface is COMM/2/0xff 1237 /* If the first config's first interface is COMM/2/0xff
1235 * (MSFT RNDIS), rule it out unless Linux has host-side 1238 * (MSFT RNDIS), rule it out unless Linux has host-side
@@ -1263,6 +1266,11 @@ static int choose_configuration(struct usb_device *udev)
1263 best = c; 1266 best = c;
1264 } 1267 }
1265 1268
1269 if (insufficient_power > 0)
1270 dev_info(&udev->dev, "rejected %d configuration%s "
1271 "due to insufficient available bus power\n",
1272 insufficient_power, plural(insufficient_power));
1273
1266 if (best) { 1274 if (best) {
1267 i = best->desc.bConfigurationValue; 1275 i = best->desc.bConfigurationValue;
1268 dev_info(&udev->dev, 1276 dev_info(&udev->dev,