• M. Vefa Bicakci's avatar
    usbcore/driver: Accommodate usbip · 3fce3960
    M. Vefa Bicakci authored
    Commit 88b7381a ("USB: Select better matching USB drivers when
    available") inadvertently broke usbip functionality. The commit in
    question allows USB device drivers to be explicitly matched with
    USB devices via the use of driver-provided identifier tables and
    match functions, which is useful for a specialised device driver
    to be chosen for a device that can also be handled by another,
    more generic, device driver.
    
    Prior, the USB device section of usb_device_match() had an
    unconditional "return 1" statement, which allowed user-space to bind
    USB devices to the usbip_host device driver, if desired. However,
    the aforementioned commit changed the default/fallback return
    value to zero. This breaks device drivers such as usbip_host, so
    this commit restores the legacy behaviour, but only if a device
    driver does not have an id_table and a match() function.
    
    In addition, if usb_device_match is called for a device driver
    and device pair where the device does not match the id_table of the
    device driver in question, then the device driver will be disqualified
    for the device. This allows avoiding the default case of "return 1",
    which prevents undesirable probe() calls to a driver even though
    its id_table did not match the device.
    
    Finally, this commit changes the specialised-driver-to-generic-driver
    transition code so that when a device driver returns -ENODEV, a more
    generic device driver is only considered if the current device driver
    does not have an id_table and a match() function. This ensures that
    "generic" drivers such as usbip_host will not be considered specialised
    device drivers and will not cause the device to be locked in to the
    generic device driver, when a more specialised device driver could be
    tried.
    
    All of these changes restore usbip functionality without regressions,
    ensure that the specialised/generic device driver selection logic works
    as expected with the usb and apple-mfi-fastcharge drivers, and do not
    negatively affect the use of devices provided by dummy_hcd.
    
    Fixes: 88b7381a ("USB: Select better matching USB drivers when available")
    Cc: <stable@vger.kernel.org> # 5.8
    Cc: Bastien Nocera <hadess@hadess.net>
    Cc: Valentina Manea <valentina.manea.m@gmail.com>
    Cc: Shuah Khan <shuah@kernel.org>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Alan Stern <stern@rowland.harvard.edu>
    Cc: <syzkaller@googlegroups.com>
    Tested-by: default avatarAndrey Konovalov <andreyknvl@google.com>
    Acked-by: default avatarShuah Khan <skhan@linuxfoundation.org>
    Signed-off-by: default avatarM. Vefa Bicakci <m.v.b@runbox.com>
    Link: https://lore.kernel.org/r/20200922110703.720960-5-m.v.b@runbox.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    3fce3960
driver.c 58 KB