crypto: hisilicon - Fix duplicate print when qm occur multiple errors
authorShukun Tan <tanshukun1@huawei.com>
Mon, 20 Jan 2020 07:30:09 +0000 (15:30 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Thu, 13 Feb 2020 08:58:08 +0000 (16:58 +0800)
If all possible errors occurs at the same time, the error_status will be
all 1s. The doorbell timeout error and FIFO overflow error will be print
in each cycle, which should be print just once.

Signed-off-by: Shukun Tan <tanshukun1@huawei.com>
Reviewed-by: Zhou Wang <wangzhou1@hisilicon.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/hisilicon/qm.c

index 2c0e22f..79f84dc 100644 (file)
@@ -1019,41 +1019,38 @@ static void qm_hw_error_uninit_v2(struct hisi_qm *qm)
 
 static void qm_log_hw_error(struct hisi_qm *qm, u32 error_status)
 {
-       const struct hisi_qm_hw_error *err = qm_hw_error;
+       const struct hisi_qm_hw_error *err;
        struct device *dev = &qm->pdev->dev;
        u32 reg_val, type, vf_num;
+       int i;
 
-       while (err->msg) {
-               if (err->int_msk & error_status) {
-                       dev_err(dev, "%s [error status=0x%x] found\n",
-                               err->msg, err->int_msk);
-
-                       if (error_status & QM_DB_TIMEOUT) {
-                               reg_val = readl(qm->io_base +
-                                               QM_ABNORMAL_INF01);
-                               type = (reg_val & QM_DB_TIMEOUT_TYPE) >>
-                                      QM_DB_TIMEOUT_TYPE_SHIFT;
-                               vf_num = reg_val & QM_DB_TIMEOUT_VF;
-                               dev_err(dev, "qm %s doorbell timeout in function %u\n",
-                                       qm_db_timeout[type], vf_num);
-                       }
-
-                       if (error_status & QM_OF_FIFO_OF) {
-                               reg_val = readl(qm->io_base +
-                                               QM_ABNORMAL_INF00);
-                               type = (reg_val & QM_FIFO_OVERFLOW_TYPE) >>
-                                      QM_FIFO_OVERFLOW_TYPE_SHIFT;
-                               vf_num = reg_val & QM_FIFO_OVERFLOW_VF;
-
-                               if (type < ARRAY_SIZE(qm_fifo_overflow))
-                                       dev_err(dev, "qm %s fifo overflow in function %u\n",
-                                               qm_fifo_overflow[type],
-                                               vf_num);
-                               else
-                                       dev_err(dev, "unknown error type\n");
-                       }
+       for (i = 0; i < ARRAY_SIZE(qm_hw_error); i++) {
+               err = &qm_hw_error[i];
+               if (!(err->int_msk & error_status))
+                       continue;
+
+               dev_err(dev, "%s [error status=0x%x] found\n",
+                       err->msg, err->int_msk);
+
+               if (err->int_msk & QM_DB_TIMEOUT) {
+                       reg_val = readl(qm->io_base + QM_ABNORMAL_INF01);
+                       type = (reg_val & QM_DB_TIMEOUT_TYPE) >>
+                              QM_DB_TIMEOUT_TYPE_SHIFT;
+                       vf_num = reg_val & QM_DB_TIMEOUT_VF;
+                       dev_err(dev, "qm %s doorbell timeout in function %u\n",
+                               qm_db_timeout[type], vf_num);
+               } else if (err->int_msk & QM_OF_FIFO_OF) {
+                       reg_val = readl(qm->io_base + QM_ABNORMAL_INF00);
+                       type = (reg_val & QM_FIFO_OVERFLOW_TYPE) >>
+                              QM_FIFO_OVERFLOW_TYPE_SHIFT;
+                       vf_num = reg_val & QM_FIFO_OVERFLOW_VF;
+
+                       if (type < ARRAY_SIZE(qm_fifo_overflow))
+                               dev_err(dev, "qm %s fifo overflow in function %u\n",
+                                       qm_fifo_overflow[type], vf_num);
+                       else
+                               dev_err(dev, "unknown error type\n");
                }
-               err++;
        }
 }