• David Brownell's avatar
    [PATCH] USB: usb driver binding fixes · 070c4e6f
    David Brownell authored
    There are problems lurking in the driver binding code for usb,
    with highlights being disagreements about:
    
        (a) locks: usb bus writelock v. BKL v. driver->serialize
        (b) driver: interface.driver v. interface.dev.driver
    
    Fixing those is going to take multiple patches, and I thought
    I'd start out with a small one that's relatively simple.  This:
    
        - Cleans up locking.
    
            * Updates comments and kerneldoc to reflect that the
              usb bus writelock is what protects against conflicts
              when binding/unbinding drivers to devices.
    
            * Removes driver->serialize ... not needed, since
              it's only gotten when the bus writelock is held.
    
            * Removes incorrect "must have BKL" comments, and one
              bit of code that tried to use BKL not the writelock.
    
        - Removes inconsistencies about what driver is bound to the
          interface ... for now "interface.driver" is "the truth".
    
            * usb_probe_interface() will no longer clobber bindings
              established with usb_driver_claim_interface().
    
            * usb_driver_release_interface() calls device_release_driver()
              for bindings established with probe(), so the driver model
              updates (sysfs etc) are done as expected.
    
            * usb_unbind_interface() doesn't usb_driver_release_interface(),
              since release() should eventually _always_ call unbind()
              (indirectly through device_release_driver).
    
    Essentially there are two driver binding models in USB today,
    and this patch makes them start to cooperate properly:
    
       - probe()/disconnect(), used by most drivers.  This goes
         through the driver model core.
    
       - claim()/release(), used by CDC drivers (ACM, Ethernet)
         and audio to claim extra interfaces and by usbfs since it
         can't come in through probe().  Bypasses driver model.
    
    That interface.driver pointer can be removed by changing the
    claim()/release() code to use the driver model calls added
    for that purpose:  device_{bind,release}_driver().  I didn't
    do that in this patch, since it'll have side effects like
    extra disconnect() calls that drivers will need to handle.
    
    A separate usbfs patch is needed to fix its driver binding;
    mostly just to use the right lock, but those changes were
    more extensive and uncovered other issues.  (Like, I think,
    some that Duncan has been noticing ...)
    070c4e6f
usb.c 44.1 KB