Commit e88dd6e1 authored by Yang Shen's avatar Yang Shen Committed by Herbert Xu
Browse files

crypto: hisilicon/qm - fix no stop reason when use 'hisi_qm_stop'



Now, there are three reasons of stopping: 'NORMAL', 'SOFT_RESET' and 'FLR'.
In order to keep this, explicitly pass the stop reason as an input
parameter of 'hisi_qm_stop' function.

Fixes: b67202e8("crypto: hisilicon/qm - add state machine for QM")
Signed-off-by: default avatarShukun Tan <tanshukun1@huawei.com>
Signed-off-by: default avatarYang Shen <shenyang39@huawei.com>
Reviewed-by: default avatarZhou Wang <wangzhou1@hisilicon.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 9dca4435
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -886,7 +886,7 @@ static int hpre_probe(struct pci_dev *pdev, const struct pci_device_id *id)
err_with_qm_start:
	hisi_qm_del_from_list(qm, &hpre_devices);
	hpre_debugfs_exit(qm);
	hisi_qm_stop(qm);
	hisi_qm_stop(qm, QM_NORMAL);

err_with_err_init:
	hisi_qm_dev_err_uninit(qm);
@@ -918,7 +918,7 @@ static void hpre_remove(struct pci_dev *pdev)
	}

	hpre_debugfs_exit(qm);
	hisi_qm_stop(qm);
	hisi_qm_stop(qm, QM_NORMAL);
	hisi_qm_dev_err_uninit(qm);
	hisi_qm_uninit(qm);
}
+10 −10
Original line number Diff line number Diff line
@@ -2643,18 +2643,20 @@ static void qm_clear_queues(struct hisi_qm *qm)
/**
 * hisi_qm_stop() - Stop a qm.
 * @qm: The qm which will be stopped.
 * @r: The reason to stop qm.
 *
 * This function stops qm and its qps, then qm can not accept request.
 * Related resources are not released at this state, we can use hisi_qm_start
 * to let qm start again.
 */
int hisi_qm_stop(struct hisi_qm *qm)
int hisi_qm_stop(struct hisi_qm *qm, enum qm_stop_reason r)
{
	struct device *dev = &qm->pdev->dev;
	int ret = 0;

	down_write(&qm->qps_lock);

	qm->status.stop_reason = r;
	if (!qm_avail_state(qm, QM_STOP)) {
		ret = -EPERM;
		goto err_unlock;
@@ -3300,10 +3302,10 @@ static int qm_set_msi(struct hisi_qm *qm, bool set)
	return 0;
}

static int qm_vf_reset_prepare(struct hisi_qm *qm)
static int qm_vf_reset_prepare(struct hisi_qm *qm,
			       enum qm_stop_reason stop_reason)
{
	struct hisi_qm_list *qm_list = qm->qm_list;
	int stop_reason = qm->status.stop_reason;
	struct pci_dev *pdev = qm->pdev;
	struct pci_dev *virtfn;
	struct hisi_qm *vf_qm;
@@ -3316,8 +3318,7 @@ static int qm_vf_reset_prepare(struct hisi_qm *qm)
			continue;

		if (pci_physfn(virtfn) == pdev) {
			vf_qm->status.stop_reason = stop_reason;
			ret = hisi_qm_stop(vf_qm);
			ret = hisi_qm_stop(vf_qm, stop_reason);
			if (ret)
				goto stop_fail;
		}
@@ -3356,15 +3357,14 @@ static int qm_controller_reset_prepare(struct hisi_qm *qm)
	}

	if (qm->vfs_num) {
		ret = qm_vf_reset_prepare(qm);
		ret = qm_vf_reset_prepare(qm, QM_SOFT_RESET);
		if (ret) {
			pci_err(pdev, "Fails to stop VFs!\n");
			return ret;
		}
	}

	qm->status.stop_reason = QM_SOFT_RESET;
	ret = hisi_qm_stop(qm);
	ret = hisi_qm_stop(qm, QM_SOFT_RESET);
	if (ret) {
		pci_err(pdev, "Fails to stop QM!\n");
		return ret;
@@ -3705,7 +3705,7 @@ void hisi_qm_reset_prepare(struct pci_dev *pdev)
	}

	if (qm->vfs_num) {
		ret = qm_vf_reset_prepare(qm);
		ret = qm_vf_reset_prepare(qm, QM_FLR);
		if (ret) {
			pci_err(pdev, "Failed to prepare reset, ret = %d.\n",
				ret);
@@ -3713,7 +3713,7 @@ void hisi_qm_reset_prepare(struct pci_dev *pdev)
		}
	}

	ret = hisi_qm_stop(qm);
	ret = hisi_qm_stop(qm, QM_FLR);
	if (ret) {
		pci_err(pdev, "Failed to stop QM, ret = %d.\n", ret);
		return;
+1 −1
Original line number Diff line number Diff line
@@ -355,7 +355,7 @@ static inline void hisi_qm_del_from_list(struct hisi_qm *qm,
int hisi_qm_init(struct hisi_qm *qm);
void hisi_qm_uninit(struct hisi_qm *qm);
int hisi_qm_start(struct hisi_qm *qm);
int hisi_qm_stop(struct hisi_qm *qm);
int hisi_qm_stop(struct hisi_qm *qm, enum qm_stop_reason r);
struct hisi_qp *hisi_qm_create_qp(struct hisi_qm *qm, u8 alg_type);
int hisi_qm_start_qp(struct hisi_qp *qp, unsigned long arg);
int hisi_qm_stop_qp(struct hisi_qp *qp);
+2 −2
Original line number Diff line number Diff line
@@ -901,7 +901,7 @@ static int sec_probe(struct pci_dev *pdev, const struct pci_device_id *id)
err_remove_from_list:
	hisi_qm_del_from_list(qm, &sec_devices);
	sec_debugfs_exit(qm);
	hisi_qm_stop(qm);
	hisi_qm_stop(qm, QM_NORMAL);

err_probe_uninit:
	sec_probe_uninit(qm);
@@ -926,7 +926,7 @@ static void sec_remove(struct pci_dev *pdev)

	sec_debugfs_exit(qm);

	(void)hisi_qm_stop(qm);
	(void)hisi_qm_stop(qm, QM_NORMAL);

	if (qm->fun_type == QM_HW_PF)
		sec_debug_regs_clear(qm);
+2 −2
Original line number Diff line number Diff line
@@ -828,7 +828,7 @@ static int hisi_zip_probe(struct pci_dev *pdev, const struct pci_device_id *id)
err_remove_from_list:
	hisi_qm_del_from_list(qm, &zip_devices);
	hisi_zip_debugfs_exit(hisi_zip);
	hisi_qm_stop(qm);
	hisi_qm_stop(qm, QM_NORMAL);
err_qm_uninit:
	hisi_qm_uninit(qm);

@@ -844,7 +844,7 @@ static void hisi_zip_remove(struct pci_dev *pdev)
		hisi_qm_sriov_disable(pdev);

	hisi_zip_debugfs_exit(hisi_zip);
	hisi_qm_stop(qm);
	hisi_qm_stop(qm, QM_NORMAL);

	hisi_qm_dev_err_uninit(qm);
	hisi_qm_uninit(qm);