On Tue, 18 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> > --- > drivers/usb/core/hub.c | 14 ++++++++++++-- > 1 file changed, 12 insertions(+), 2 deletions(-) > > diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c > index 6d4d36d..96621fe 100644 > --- a/drivers/usb/core/hub.c > +++ b/drivers/usb/core/hub.c > @@ -4379,6 +4379,8 @@ 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; > + struct device_driver *driver = udev->bus->controller->driver; > + struct device_driver *sysdev_driver = udev->bus->sysdev->driver; Actually, I was thinking of something more like: const char *driver_name; Then later on... > > /* root hub ports have a slightly longer reset period > * (from USB 2.0 spec, section 7.1.7.5) > @@ -4446,11 +4448,19 @@ 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 ? driver->name : > + sysdev_driver->name); Then just use driver_name here and below. Alan Stern > > /* Set up TT records, if needed */ > if (hdev->tt) { > @@ -4582,7 +4592,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 ? driver->name : sysdev_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