On Wed, Dec 4, 2019 at 3:55 PM Johan Hovold <johan@xxxxxxxxxx> wrote: > > > > @@ -257,6 +258,14 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno, int inum, > > > > memcpy(&endpoint->desc, d, n); > > > > INIT_LIST_HEAD(&endpoint->urb_list); > > > > > > > > + /* device node property overrides bInterval */ > > > > + if (usb_of_has_combined_node(to_usb_device(ddev))) { > > > > > > Not only hubs have combined nodes so you probably need to check > > > bDeviceClass here instead. > > > > yes, you're right, I didn't think of that case: > > if (to_usb_device(ddev)->descriptor.bDeviceClass == USB_CLASS_HUB && > > ddev->of_node && !of_property_read_u32(...)) > > > > Or is it better to check bInterfaceClass, for composite devices with a > > hub interface inside? > > if (ifp->desc.bInterfaceClass == USB_CLASS_HUB && ddev->of_node && > > !of_property_read_u32(...)) > > > > I think checking bInterfaceClass is better. > > Yep, that seems better (but please use two conditionals for > readability). > > But related to my question above, why do you need to do this during > enumeration? Why not just set the lower interval value in the hub > driver? > Because I want device tree's bInterval to be checked against the same rules defined in usb_parse_endpoint(). e.g. although hardware says its maximum is 255, but the practical limit is still 0 to 16, so the code can print warnings when bInterval from device node is too weird. > > > > + u32 interval = 0; > > > > + if (!of_property_read_u32(ddev->of_node, "hub,interval", > > > > + &interval)) > > > > + d->bInterval = min_t(u8, interval, 255); > > > > > > You want min_t(u32, ...) here to avoid surprises when someone specifies > > > a value > 255. > > > > yes, thanks. > > And I guess you should really be honouring bInterval as a maximum value, > right? Yes, right, not masking. > > > > > + } > > > > + > > > > /* > > > > * Fix up bInterval values outside the legal range. > > > > * Use 10 or 8 ms if no proper value can be guessed. > > Johan