• Marco Chiappero's avatar
    crypto: qat - rework the VF2PF interrupt handling logic · c690c7f6
    Marco Chiappero authored
    Change the VF2PF interrupt handler in the PF ISR and the definition of
    the internal PFVF API to correct the current implementation, which can
    result in missed interrupts.
    
    More specifically, current HW generations consider a write to the mask
    register, regardless of the value, as an acknowledge of any pending
    VF2PF interrupt. Therefore, if there is an interrupt between the source
    register read and the mask register write, such interrupt will not be
    delivered and silently acknowledged, resulting in a lost VF2PF message.
    
    To work around the problem, rather than disabling specific interrupts,
    disable all the interrupts and re-enable only the ones that we are not
    serving (excluding the already disabled ones too). This will force any
    other pending interrupt to be triggered and be serviced by a subsequent
    ISR.
    
    This new approach requires, however, changes to the interrupt related
    pfvf_ops functions. In particular, get_vf2pf_sources() has now been
    removed in favor of disable_pending_vf2pf_interrupts(), which not only
    retrieves and returns the pending (and enabled) sources, but also
    disables them.
    As a consequence, introduce the adf_disable_pending_vf2pf_interrupts()
    utility in place of adf_disable_vf2pf_interrupts_irq(), which is no
    longer needed.
    
    Cc: stable@vger.kernel.org
    Fixes: 993161d3 ("crypto: qat - fix handling of VF to PF interrupts")
    Signed-off-by: default avatarMarco Chiappero <marco.chiappero@intel.com>
    Co-developed-by: default avatarGiovanni Cabiddu <giovanni.cabiddu@intel.com>
    Signed-off-by: default avatarGiovanni Cabiddu <giovanni.cabiddu@intel.com>
    Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
    c690c7f6
adf_isr.c 9.98 KB