On Wed, 19 Jul 2017, Peter Chen wrote: > The controller driver may be NULL if the controller device > is the middle device between platform device and roothub. > This middle device may not need a device driver due to all > hardware control can be at platform device driver, this > platform device is usually a dual-role USB controller device. > > The benefit of using this middle device is we can keep both > controller device's private data (known as struct usb_hcd) > for USB core use, and platform device's private data for > platform driver use. > > Signed-off-by: Peter Chen <peter.chen@xxxxxxx> > --- > Changes for v2: > - Simplify the code per Alan's suggestion Acked-by: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> > drivers/usb/core/hub.c | 17 +++++++++++++++-- > 1 file changed, 15 insertions(+), 2 deletions(-) > > diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c > index 4ee2a6a..acba56b 100644 > --- a/drivers/usb/core/hub.c > +++ b/drivers/usb/core/hub.c > @@ -4383,6 +4383,7 @@ hub_port_init(struct usb_hub *hub, struct usb_device *udev, int port1, > enum usb_device_speed oldspeed = udev->speed; > const char *speed; > int devnum = udev->devnum; > + const char *driver_name; > > /* root hub ports have a slightly longer reset period > * (from USB 2.0 spec, section 7.1.7.5) > @@ -4450,11 +4451,23 @@ hub_port_init(struct usb_hub *hub, struct usb_device *udev, int port1, > else > speed = usb_speed_string(udev->speed); > > + /* > + * The controller driver may be NULL if the controller device > + * is the middle device between platform device and roothub. > + * This middle device may not need a device driver due to > + * all hardware control can be at platform device driver, this > + * platform device is usually a dual-role USB controller device. > + */ > + if (udev->bus->controller->driver) > + driver_name = udev->bus->controller->driver->name; > + else > + driver_name = udev->bus->sysdev->driver->name; > + > if (udev->speed < USB_SPEED_SUPER) > dev_info(&udev->dev, > "%s %s USB device number %d using %s\n", > (udev->config) ? "reset" : "new", speed, > - devnum, udev->bus->controller->driver->name); > + devnum, driver_name); > > /* Set up TT records, if needed */ > if (hdev->tt) { > @@ -4586,7 +4599,7 @@ hub_port_init(struct usb_hub *hub, struct usb_device *udev, int port1, > "%s SuperSpeed%s USB device number %d using %s\n", > (udev->config) ? "reset" : "new", > (udev->speed == USB_SPEED_SUPER_PLUS) ? "Plus" : "", > - devnum, udev->bus->controller->driver->name); > + devnum, driver_name); > } > > /* cope with hardware quirkiness: > -- 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