提交 04221e15 编写于 作者: W Weili Qian 提交者: Zheng Zengkai

crypto: hisilicon/qm - use request_threaded_irq instead

mainline inclusion
from mainline-v5.17-rc1
commit a0a9486b
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I4W3OQ
CVE: NA

--------------------------------

The abnormal interrupt method needs to be changed, and the changed method
needs to be locked in order to maintain atomicity. Therefore,
replace request_irq() with request_threaded_irq().
Signed-off-by: NWeili Qian <qianweili@huawei.com>
Signed-off-by: NHerbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: NYang Shen <shenyang39@huawei.com>
Reviewed-by: NXiu Jianfeng <xiujianfeng@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 2ff6f7ae
...@@ -968,16 +968,12 @@ static void qm_set_qp_disable(struct hisi_qp *qp, int offset) ...@@ -968,16 +968,12 @@ static void qm_set_qp_disable(struct hisi_qp *qp, int offset)
mb(); mb();
} }
static irqreturn_t qm_aeq_irq(int irq, void *data) static irqreturn_t qm_aeq_thread(int irq, void *data)
{ {
struct hisi_qm *qm = data; struct hisi_qm *qm = data;
struct qm_aeqe *aeqe = qm->aeqe + qm->status.aeq_head; struct qm_aeqe *aeqe = qm->aeqe + qm->status.aeq_head;
u32 type; u32 type;
atomic64_inc(&qm->debug.dfx.aeq_irq_cnt);
if (!readl(qm->io_base + QM_VF_AEQ_INT_SOURCE))
return IRQ_NONE;
while (QM_AEQE_PHASE(aeqe) == qm->status.aeqc_phase) { while (QM_AEQE_PHASE(aeqe) == qm->status.aeqc_phase) {
type = le32_to_cpu(aeqe->dw0) >> QM_AEQE_TYPE_SHIFT; type = le32_to_cpu(aeqe->dw0) >> QM_AEQE_TYPE_SHIFT;
if (type < ARRAY_SIZE(qm_fifo_overflow)) if (type < ARRAY_SIZE(qm_fifo_overflow))
...@@ -1002,6 +998,17 @@ static irqreturn_t qm_aeq_irq(int irq, void *data) ...@@ -1002,6 +998,17 @@ static irqreturn_t qm_aeq_irq(int irq, void *data)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static irqreturn_t qm_aeq_irq(int irq, void *data)
{
struct hisi_qm *qm = data;
atomic64_inc(&qm->debug.dfx.aeq_irq_cnt);
if (!readl(qm->io_base + QM_VF_AEQ_INT_SOURCE))
return IRQ_NONE;
return IRQ_WAKE_THREAD;
}
static void qm_irq_unregister(struct hisi_qm *qm) static void qm_irq_unregister(struct hisi_qm *qm)
{ {
struct pci_dev *pdev = qm->pdev; struct pci_dev *pdev = qm->pdev;
...@@ -5281,8 +5288,10 @@ static int qm_irq_register(struct hisi_qm *qm) ...@@ -5281,8 +5288,10 @@ static int qm_irq_register(struct hisi_qm *qm)
return ret; return ret;
if (qm->ver > QM_HW_V1) { if (qm->ver > QM_HW_V1) {
ret = request_irq(pci_irq_vector(pdev, QM_AEQ_EVENT_IRQ_VECTOR), ret = request_threaded_irq(pci_irq_vector(pdev,
qm_aeq_irq, 0, qm->dev_name, qm); QM_AEQ_EVENT_IRQ_VECTOR),
qm_aeq_irq, qm_aeq_thread,
0, qm->dev_name, qm);
if (ret) if (ret)
goto err_aeq_irq; goto err_aeq_irq;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册