• Richard Fitzgerald's avatar
    soundwire: cadence: Fix lost ATTACHED interrupts when enumerating · 0c5e99c4
    Richard Fitzgerald authored
    The correct way to handle interrupts is to clear the bits we
    are about to handle _before_ handling them. Thus if the condition
    then re-asserts during the handling we won't lose it.
    
    This patch changes cdns_update_slave_status_work() to do this.
    
    The previous code cleared the interrupts after handling them.
    The problem with this is that when handling enumeration of devices
    the ATTACH statuses can be accidentally cleared and so some or all
    of the devices never complete their enumeration.
    
    Thus we can have a situation like this:
    - one or more devices are reverting to ID #0
    
    - accumulated status bits indicate some devices attached and some
      on ID #0. (Remember: status bits are sticky until they are handled)
    
    - Because of device on #0 sdw_handle_slave_status() programs the
      device ID and exits without handling the other status, expecting
      to get an ATTACHED from this reprogrammed device.
    
    - The device immediately starts reporting ATTACHED in PINGs, which
      will assert its CDNS_MCP_SLAVE_INTSTAT_ATTACHED bit.
    
    - cdns_update_slave_status_work() clears INTSTAT0/1. If the initial
      status had CDNS_MCP_SLAVE_INTSTAT_ATTACHED bit set it will be
      cleared.
    
    - The ATTACHED change for the device has now been lost.
    
    - cdns_update_slave_status_work() clears CDNS_MCP_INT_SLAVE_MASK so
      if the new ATTACHED state had set it, it will be cleared without
      ever having been handled.
    
    Unless there is some other state change from another device to cause
    a new interrupt, the ATTACHED state of the reprogrammed device will
    never cause an interrupt so its enumeration will not be completed.
    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-5-rf@opensource.cirrus.comSigned-off-by: default avatarVinod Koul <vkoul@kernel.org>
    0c5e99c4
cadence_master.c 47.6 KB