Hi, On Tue, Jul 26, 2011 at 2:46 PM, Thomas Petazzoni <thomas.petazzoni@xxxxxxxxxxxxxxxxxx> wrote: > Hello, > > Thanks again for the quick feedback. > > Le Mon, 25 Jul 2011 15:08:53 -0400 (EDT), > Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> a écrit : > >> > I would have expected udev->bus_mA to be 75 mA for the second device, >> > so that the 100 mA configuration gets rejected. >> >> No. The USB stack doesn't enforce any scheme for dividing up power >> among a hub's children. All it does is log a warning if the devices >> want more power than the total available. > > Ok. This is also what I understood. > >> > However, looking at >> > http://lxr.free-electrons.com/source/drivers/usb/core/hub.c#L1147, it >> > appears that the hub->mA_per_port field is defined to hdev->bus_mA >> > (i.e, the power budget). So it means that when we define a power budget >> > of 175 mA, the USB core understands that it is 175 mA per port that is >> > available, and not 175 mA globally for all ports of the root hub. I >> > suspect this explains the behavior I'm seeing. >> > >> > Unfortunately, this contradicts the computation done in >> > hub_power_remaining() at >> > http://lxr.free-electrons.com/source/drivers/usb/core/hub.c#L3014, >> > which rightfully concludes that 25mA is missing. And this also seems to >> > make it difficult to define a global root hub power limit. >> >> There's no contradiction. If 175 mA total are available, then one way >> to apportion it is to plug in a single device requiring 175 mA. In >> other words, there really is up to 175 mA available for each port. > > Hum, I'm sorry, but I still see a contradiction : > > * On one side, there is a computation that assumes that hdev->bus_mA > is a *per-port* current limit (and this computation is used to > reject new USB configurations from connecting) ; > > * On another side, there is a computation that assumes that > hdev->bus_mA is a *global hub* current limit (and this computation > is used to print a warning in the kernel messages). > > If I set a global current limit of 175 mA, then two devices of 100 mA > shouldn't be allowed to connect. > >> > Isn't there a contradiction here ? Shouldn't the hdev->bus_mA be >> > understood as a global hub power budget, and not a per-port power >> > budget ? >> >> That _is_ how it is interpreted. > > Well, I don't think so, since by the example above, we have seen that > two 100 mA devices (which accounts for 200 mA of power) can connect to > a hub limited to 175 mA. > >> It looks like your real problem is in hcd.c line 2467 (in >> usb_add_hcd()): >> >> rhdev->bus_mA = min(500u, hcd->power_budget); >> >> We probably shouldn't use the min() operation here, just set >> rhdev->bus_mA to hcd->power_budget. However, I'm not sure how the >> various host controller drivers set the power_budget field; some of >> them may set it to the total power divided by the number of ports >> rather than the total power. If they do, they will have to be fixed >> when this change is made. > > This precise instruction is a fairly clear indication that the > rhdev->bus_mA value is a per-port limit and not a global hub limit. > Otherwise, there wouldn't have been this maximum value of 500mA. I understand 500mA is shared by all bus-powered devices attached to the port of root hub, so rhdev->bus_mA should be used as global value. And for each individual port of root hub, the max power is 500mA. thanks, -- Ming Lei -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html