• Mika Westerberg's avatar
    thunderbolt: Rework control channel to be more reliable · d7f781bf
    Mika Westerberg authored
    If a request times out the response might arrive right after the request
    is failed. This response is pushed to the kfifo and next request will
    read it instead. Since it most likely will not pass our validation
    checks in parse_header() the next request will fail as well, and
    response to that request will be pushed to the kfifo, ad infinitum.
    
    We end up in a situation where all requests fail and no devices can be
    added anymore until the driver is unloaded and reloaded again.
    
    To overcome this, rework the control channel so that we will have a
    queue of outstanding requests. Each request will be handled in turn and
    the response is validated against what is expected. Unexpected packets
    (for example responses for requests that have been timed out) are
    dropped. This model is copied from Greybus implementation with small
    changes here and there to get it cope with Thunderbolt control packets.
    
    In addition the configuration packets support sequence number which the
    switch is supposed to copy from the request to response. We use this to
    drop responses that are already timed out. Taking advantage of the
    sequence number, we automatically retry configuration read/write 4 times
    before giving up.
    
    Also timeout is not a programming error so there is no need to trigger a
    scary backtrace (WARN), instead we just log a warning.  After all
    Thunderbolt devices are hot-pluggable by definition which means user can
    unplug a device any time and that is totally acceptable.
    
    With this change there is no need to take the global domain lock when
    sending configuration packets anymore. This is useful when we add
    support for cross-domain (XDomain) communication later on.
    Signed-off-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
    Reviewed-by: default avatarYehezkel Bernat <yehezkel.bernat@intel.com>
    Reviewed-by: default avatarMichael Jamet <michael.jamet@intel.com>
    Reviewed-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: default avatarAndreas Noever <andreas.noever@gmail.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    d7f781bf
ctl.c 24.3 KB