diff --git a/KAEKernelDriver/KAEKernelDriver-OLK-5.10/hisilicon/qm.c b/KAEKernelDriver/KAEKernelDriver-OLK-5.10/hisilicon/qm.c index bf29094d87f82ddc7414793d19e5b9a9e6eb9b82..e2f2d9d4399466877404d04f6a668a48535fa8f4 100644 --- a/KAEKernelDriver/KAEKernelDriver-OLK-5.10/hisilicon/qm.c +++ b/KAEKernelDriver/KAEKernelDriver-OLK-5.10/hisilicon/qm.c @@ -4761,6 +4761,15 @@ flr_done: } EXPORT_SYMBOL_GPL(hisi_qm_reset_done); +static irqreturn_t qm_rsvd_irq(int irq, void *data) +{ + struct hisi_qm *qm = data; + + dev_info(&qm->pdev->dev, "Reserved interrupt, ignore!\n"); + + return IRQ_HANDLED; +} + static irqreturn_t qm_abnormal_irq(int irq, void *data) { struct hisi_qm *qm = data; @@ -5056,19 +5065,15 @@ static void qm_unregister_abnormal_irq(struct hisi_qm *qm) struct pci_dev *pdev = qm->pdev; u32 irq_vector, val; - if (qm->fun_type == QM_HW_VF) - return; - - if (!qm->err_ini->err_info_init) - return; - val = qm->cap_tables.qm_cap_table[QM_ABN_IRQ_TYPE_CAP_IDX].cap_val; if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_ABN_IRQ_TYPE_MASK)) return; - qm_dev_err_uninit(qm); irq_vector = val & QM_IRQ_VECTOR_MASK; + if (qm->fun_type == QM_HW_VF && qm->ver < QM_HW_V3) + return; + free_irq(pci_irq_vector(pdev, irq_vector), qm); } @@ -5078,26 +5083,32 @@ static int qm_register_abnormal_irq(struct hisi_qm *qm) u32 irq_vector, val; int ret; - if (qm->fun_type == QM_HW_VF) + val = qm->cap_tables.qm_cap_table[QM_ABN_IRQ_TYPE_CAP_IDX].cap_val; + if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_ABN_IRQ_TYPE_MASK)) return 0; + irq_vector = val & QM_IRQ_VECTOR_MASK; - if (!qm->err_ini->err_info_init) { - dev_info(&qm->pdev->dev, "Device doesnot support error init!\n"); - return 0; - } + /* For VF, this is a reserved interrupt in V3 version. */ + if (qm->fun_type == QM_HW_VF) { + if (qm->ver < QM_HW_V3) + return 0; - val = qm->cap_tables.qm_cap_table[QM_ABN_IRQ_TYPE_CAP_IDX].cap_val; - if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_ABN_IRQ_TYPE_MASK)) + ret = request_irq(pci_irq_vector(pdev, irq_vector), qm_rsvd_irq, + IRQF_NO_AUTOEN, qm->dev_name, qm); + if (ret) { + dev_err(&pdev->dev, "failed to request reserved irq, ret = %d!\n", ret); + return ret; + } return 0; + } - irq_vector = val & QM_IRQ_VECTOR_MASK; + INIT_WORK(&qm->rst_work, hisi_qm_controller_reset); ret = request_irq(pci_irq_vector(pdev, irq_vector), qm_abnormal_irq, 0, qm->dev_name, qm); if (ret) { - dev_err(&qm->pdev->dev, "failed to request abnormal irq, ret = %d", ret); + dev_err(&pdev->dev, "failed to request abnormal irq, ret = %d!\n", ret); return ret; } - INIT_WORK(&qm->rst_work, hisi_qm_controller_reset); qm_dev_err_init(qm); return 0; @@ -5478,6 +5489,12 @@ static int hisi_qm_pci_init(struct hisi_qm *qm) pci_set_master(pdev); num_vec = qm_get_irq_num(qm); + if (!num_vec) { + dev_err(dev, "Device irq num is zero!\n"); + ret = -EINVAL; + goto err_get_pci_res; + } + num_vec = roundup_pow_of_two(num_vec); if (!num_vec) { dev_err(dev, "Device irq num is error!\n"); ret = -EINVAL; diff --git a/KAEKernelDriver/KAEKernelDriver-OLK-5.4/hisilicon/qm.c b/KAEKernelDriver/KAEKernelDriver-OLK-5.4/hisilicon/qm.c index 1b80a9a2a726c62f983290fed3f0426d130e6ecf..59e350ab110b7ef3557b48a3e685ad10c7300867 100644 --- a/KAEKernelDriver/KAEKernelDriver-OLK-5.4/hisilicon/qm.c +++ b/KAEKernelDriver/KAEKernelDriver-OLK-5.4/hisilicon/qm.c @@ -4760,6 +4760,15 @@ flr_done: } EXPORT_SYMBOL_GPL(hisi_qm_reset_done); +static irqreturn_t qm_rsvd_irq(int irq, void *data) +{ + struct hisi_qm *qm = data; + + dev_info(&qm->pdev->dev, "Reserved interrupt, ignore!\n"); + + return IRQ_HANDLED; +} + static irqreturn_t qm_abnormal_irq(int irq, void *data) { struct hisi_qm *qm = data; @@ -5055,19 +5064,15 @@ static void qm_unregister_abnormal_irq(struct hisi_qm *qm) struct pci_dev *pdev = qm->pdev; u32 irq_vector, val; - if (qm->fun_type == QM_HW_VF) - return; - - if (!qm->err_ini->err_info_init) - return; - val = qm->cap_tables.qm_cap_table[QM_ABN_IRQ_TYPE_CAP_IDX].cap_val; if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_ABN_IRQ_TYPE_MASK)) return; - qm_dev_err_uninit(qm); irq_vector = val & QM_IRQ_VECTOR_MASK; + if (qm->fun_type == QM_HW_VF && qm->ver < QM_HW_V3) + return; + free_irq(pci_irq_vector(pdev, irq_vector), qm); } @@ -5077,26 +5082,32 @@ static int qm_register_abnormal_irq(struct hisi_qm *qm) u32 irq_vector, val; int ret; - if (qm->fun_type == QM_HW_VF) + val = qm->cap_tables.qm_cap_table[QM_ABN_IRQ_TYPE_CAP_IDX].cap_val; + if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_ABN_IRQ_TYPE_MASK)) return 0; + irq_vector = val & QM_IRQ_VECTOR_MASK; - if (!qm->err_ini->err_info_init) { - dev_info(&qm->pdev->dev, "Device doesnot support error init!\n"); - return 0; - } + /* For VF, this is a reserved interrupt in V3 version. */ + if (qm->fun_type == QM_HW_VF) { + if (qm->ver < QM_HW_V3) + return 0; - val = qm->cap_tables.qm_cap_table[QM_ABN_IRQ_TYPE_CAP_IDX].cap_val; - if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_ABN_IRQ_TYPE_MASK)) + ret = request_irq(pci_irq_vector(pdev, irq_vector), qm_rsvd_irq, + 0, qm->dev_name, qm); + if (ret) { + dev_err(&pdev->dev, "failed to request reserved irq, ret = %d!\n", ret); + return ret; + } return 0; + } - irq_vector = val & QM_IRQ_VECTOR_MASK; + INIT_WORK(&qm->rst_work, hisi_qm_controller_reset); ret = request_irq(pci_irq_vector(pdev, irq_vector), qm_abnormal_irq, 0, qm->dev_name, qm); if (ret) { - dev_err(&qm->pdev->dev, "failed to request abnormal irq, ret = %d", ret); + dev_err(&pdev->dev, "failed to request abnormal irq, ret = %d!\n", ret); return ret; } - INIT_WORK(&qm->rst_work, hisi_qm_controller_reset); qm_dev_err_init(qm); return 0; @@ -5477,6 +5488,12 @@ static int hisi_qm_pci_init(struct hisi_qm *qm) pci_set_master(pdev); num_vec = qm_get_irq_num(qm); + if (!num_vec) { + dev_err(dev, "Device irq num is zero!\n"); + ret = -EINVAL; + goto err_get_pci_res; + } + num_vec = roundup_pow_of_two(num_vec); if (!num_vec) { dev_err(dev, "Device irq num is error!\n"); ret = -EINVAL;