• Richard Fitzgerald's avatar
    soundwire: bus: Don't exit early if no device IDs were programmed · 72124f07
    Richard Fitzgerald authored
    Only exit sdw_handle_slave_status() right after calling
    sdw_program_device_num() if it actually programmed an ID into at
    least one device.
    
    sdw_handle_slave_status() should protect itself against phantom
    device #0 ATTACHED indications. In that case there is no actual
    device still on #0. The early exit relies on there being a status
    change to ATTACHED on the reprogrammed device to trigger another
    call to sdw_handle_slave_status() which will then handle the status
    of all peripherals. If no device was actually programmed with an
    ID there won't be a new ATTACHED indication. This can lead to the
    status of other peripherals not being handled.
    
    The status passed to sdw_handle_slave_status() is obviously always
    from a point of time in the past, and may indicate accumulated
    unhandled events (depending how the bus manager operates). It's
    possible that a device ID is reprogrammed but the last PING status
    captured state just before that, when it was still reporting on
    ID #0. Then sdw_handle_slave_status() is called with this PING info,
    just before a new PING status is available showing it now on its new
    ID. So sdw_handle_slave_status() will receive a phantom report of a
    device on #0, but it will not find one.
    Signed-off-by: default avatarRichard Fitzgerald <rf@opensource.cirrus.com>
    Reviewed-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
    Link: https://lore.kernel.org/r/20220914160248.1047627-6-rf@opensource.cirrus.comSigned-off-by: default avatarVinod Koul <vkoul@kernel.org>
    72124f07
bus.c 46 KB