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: b67202e8ed30("crypto: hisilicon/qm - add state machine for QM") Signed-off-by: Shukun Tan <tanshukun1@huawei.com> Signed-off-by: Yang Shen <shenyang39@huawei.com> Reviewed-by: Zhou Wang <wangzhou1@hisilicon.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
9dca4435a1
commit
e88dd6e1d8
@ -886,7 +886,7 @@ err_with_crypto_register:
|
||||
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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -901,7 +901,7 @@ err_crypto_unregister:
|
||||
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);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user