| From 6a46c9e495c449ff5a35bcfab2f929e81c5d6681 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 28 Sep 2021 12:44:30 +0100 |
| Subject: crypto: qat - disregard spurious PFVF interrupts |
| |
| From: Giovanni Cabiddu <giovanni.cabiddu@intel.com> |
| |
| [ Upstream commit 18fcba469ba5359c1de7e3fb16f7b9e8cd1b8e02 ] |
| |
| Upon receiving a PFVF message, check if the interrupt bit is set in the |
| message. If it is not, that means that the interrupt was probably |
| triggered by a collision. In this case, disregard the message and |
| re-enable the interrupts. |
| |
| Fixes: ed8ccaef52fa ("crypto: qat - Add support for SRIOV") |
| Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com> |
| Reviewed-by: Marco Chiappero <marco.chiappero@intel.com> |
| Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/crypto/qat/qat_common/adf_pf2vf_msg.c | 6 ++++++ |
| drivers/crypto/qat/qat_common/adf_vf_isr.c | 6 ++++++ |
| 2 files changed, 12 insertions(+) |
| |
| diff --git a/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c b/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c |
| index 72fd2bbbe704e..180016e157771 100644 |
| --- a/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c |
| +++ b/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c |
| @@ -250,6 +250,11 @@ void adf_vf2pf_req_hndl(struct adf_accel_vf_info *vf_info) |
| |
| /* Read message from the VF */ |
| msg = ADF_CSR_RD(pmisc_addr, hw_data->get_pf2vf_offset(vf_nr)); |
| + if (!(msg & ADF_VF2PF_INT)) { |
| + dev_info(&GET_DEV(accel_dev), |
| + "Spurious VF2PF interrupt, msg %X. Ignored\n", msg); |
| + goto out; |
| + } |
| |
| /* To ACK, clear the VF2PFINT bit */ |
| msg &= ~ADF_VF2PF_INT; |
| @@ -333,6 +338,7 @@ void adf_vf2pf_req_hndl(struct adf_accel_vf_info *vf_info) |
| if (resp && adf_iov_putmsg(accel_dev, resp, vf_nr)) |
| dev_err(&GET_DEV(accel_dev), "Failed to send response to VF\n"); |
| |
| +out: |
| /* re-enable interrupt on PF from this VF */ |
| adf_enable_vf2pf_interrupts(accel_dev, (1 << vf_nr)); |
| return; |
| diff --git a/drivers/crypto/qat/qat_common/adf_vf_isr.c b/drivers/crypto/qat/qat_common/adf_vf_isr.c |
| index ef90902c8200d..86274e3c6781d 100644 |
| --- a/drivers/crypto/qat/qat_common/adf_vf_isr.c |
| +++ b/drivers/crypto/qat/qat_common/adf_vf_isr.c |
| @@ -123,6 +123,11 @@ static void adf_pf2vf_bh_handler(void *data) |
| |
| /* Read the message from PF */ |
| msg = ADF_CSR_RD(pmisc_bar_addr, hw_data->get_pf2vf_offset(0)); |
| + if (!(msg & ADF_PF2VF_INT)) { |
| + dev_info(&GET_DEV(accel_dev), |
| + "Spurious PF2VF interrupt, msg %X. Ignored\n", msg); |
| + goto out; |
| + } |
| |
| if (!(msg & ADF_PF2VF_MSGORIGIN_SYSTEM)) |
| /* Ignore legacy non-system (non-kernel) PF2VF messages */ |
| @@ -171,6 +176,7 @@ static void adf_pf2vf_bh_handler(void *data) |
| msg &= ~ADF_PF2VF_INT; |
| ADF_CSR_WR(pmisc_bar_addr, hw_data->get_pf2vf_offset(0), msg); |
| |
| +out: |
| /* Re-enable PF2VF interrupts */ |
| adf_enable_pf2vf_interrupts(accel_dev); |
| return; |
| -- |
| 2.33.0 |
| |