.sriov_configure        = IS_ENABLED(CONFIG_PCI_IOV) ?
                                  hisi_qm_sriov_configure : NULL,
        .err_handler            = &hpre_err_handler,
+       .shutdown               = hisi_qm_dev_shutdown,
 };
 
 static void hpre_register_debugfs(void)
 
        return ret;
 }
 
+/**
+ * hisi_qm_dev_shutdown() - Shutdown device.
+ * @pdev: The device will be shutdown.
+ *
+ * This function will stop qm when OS shutdown or rebooting.
+ */
+void hisi_qm_dev_shutdown(struct pci_dev *pdev)
+{
+       struct hisi_qm *qm = pci_get_drvdata(pdev);
+       int ret;
+
+       ret = hisi_qm_stop(qm, QM_NORMAL);
+       if (ret)
+               dev_err(&pdev->dev, "Fail to stop qm in shutdown!\n");
+}
+EXPORT_SYMBOL_GPL(hisi_qm_dev_shutdown);
+
 static void hisi_qm_controller_reset(struct work_struct *rst_work)
 {
        struct hisi_qm *qm = container_of(rst_work, struct hisi_qm, rst_work);
 
 int hisi_qm_alloc_qps_node(struct hisi_qm_list *qm_list, int qp_num,
                           u8 alg_type, int node, struct hisi_qp **qps);
 void hisi_qm_free_qps(struct hisi_qp **qps, int qp_num);
+void hisi_qm_dev_shutdown(struct pci_dev *pdev);
 #endif
 
        .remove = sec_remove,
        .err_handler = &sec_err_handler,
        .sriov_configure = hisi_qm_sriov_configure,
+       .shutdown = hisi_qm_dev_shutdown,
 };
 
 static void sec_register_debugfs(void)
 
        .sriov_configure        = IS_ENABLED(CONFIG_PCI_IOV) ?
                                        hisi_qm_sriov_configure : NULL,
        .err_handler            = &hisi_zip_err_handler,
+       .shutdown               = hisi_qm_dev_shutdown,
 };
 
 static void hisi_zip_register_debugfs(void)