static void hns3_nic_init_dim(struct hns3_enet_tqp_vector *tqp_vector)
 {
        INIT_WORK(&tqp_vector->rx_group.dim.work, hns3_rx_dim_work);
-       tqp_vector->rx_group.dim.mode = DIM_CQ_PERIOD_MODE_START_FROM_EQE;
        INIT_WORK(&tqp_vector->tx_group.dim.work, hns3_tx_dim_work);
-       tqp_vector->tx_group.dim.mode = DIM_CQ_PERIOD_MODE_START_FROM_EQE;
 }
 
 static int hns3_nic_init_vector_data(struct hns3_nic_priv *priv)
        dev_info(priv->dev, "Max mtu size: %u\n", priv->netdev->max_mtu);
 }
 
+static void hns3_set_cq_period_mode(struct hns3_nic_priv *priv,
+                                   enum dim_cq_period_mode mode, bool is_tx)
+{
+       struct hnae3_ae_dev *ae_dev = pci_get_drvdata(priv->ae_handle->pdev);
+       struct hnae3_handle *handle = priv->ae_handle;
+       int i;
+
+       if (is_tx) {
+               priv->tx_cqe_mode = mode;
+
+               for (i = 0; i < priv->vector_num; i++)
+                       priv->tqp_vector[i].tx_group.dim.mode = mode;
+       } else {
+               priv->rx_cqe_mode = mode;
+
+               for (i = 0; i < priv->vector_num; i++)
+                       priv->tqp_vector[i].rx_group.dim.mode = mode;
+       }
+
+       /* only device version above V3(include V3), GL can switch CQ/EQ
+        * period mode.
+        */
+       if (ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V3) {
+               u32 new_mode;
+               u64 reg;
+
+               new_mode = (mode == DIM_CQ_PERIOD_MODE_START_FROM_CQE) ?
+                       HNS3_CQ_MODE_CQE : HNS3_CQ_MODE_EQE;
+               reg = is_tx ? HNS3_GL1_CQ_MODE_REG : HNS3_GL0_CQ_MODE_REG;
+
+               writel(new_mode, handle->kinfo.io_base + reg);
+       }
+}
+
+static void hns3_cq_period_mode_init(struct hns3_nic_priv *priv,
+                                    enum dim_cq_period_mode tx_mode,
+                                    enum dim_cq_period_mode rx_mode)
+{
+       hns3_set_cq_period_mode(priv, tx_mode, true);
+       hns3_set_cq_period_mode(priv, rx_mode, false);
+}
+
 static int hns3_client_init(struct hnae3_handle *handle)
 {
        struct pci_dev *pdev = handle->pdev;
                goto out_init_ring;
        }
 
+       hns3_cq_period_mode_init(priv, DIM_CQ_PERIOD_MODE_START_FROM_EQE,
+                                DIM_CQ_PERIOD_MODE_START_FROM_EQE);
+
        ret = hns3_init_phy(netdev);
        if (ret)
                goto out_init_phy;
        if (ret)
                goto err_uninit_vector;
 
+       hns3_cq_period_mode_init(priv, priv->tx_cqe_mode, priv->rx_cqe_mode);
+
        /* the device can work without cpu rmap, only aRFS needs it */
        ret = hns3_set_rx_cpu_rmap(netdev);
        if (ret)