]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
crypto: hisilicon/qm - clear all VF configurations in the hardware
authorWeili Qian <qianweili@huawei.com>
Sat, 13 Sep 2025 10:57:53 +0000 (18:57 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Nov 2025 20:34:28 +0000 (15:34 -0500)
[ Upstream commit 64b9642fc29a14e1fe67842be9c69c7b90a3bcd6 ]

When disabling SR-IOV, clear the configuration of each VF
in the hardware. Do not exit the configuration clearing process
due to the failure of a single VF. Additionally, Clear the VF
configurations before decrementing the PM counter.

Signed-off-by: Weili Qian <qianweili@huawei.com>
Signed-off-by: Chenghai Huang <huangchenghai2@huawei.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/crypto/hisilicon/qm.c

index 73eea2ee1b9b9930bfe66754a097402f043dd2ee..35b95996ef82c40955771d72bbbf44225108670a 100644 (file)
@@ -3475,19 +3475,19 @@ static int qm_vf_q_assign(struct hisi_qm *qm, u32 num_vfs)
        return 0;
 }
 
-static int qm_clear_vft_config(struct hisi_qm *qm)
+static void qm_clear_vft_config(struct hisi_qm *qm)
 {
-       int ret;
        u32 i;
 
-       for (i = 1; i <= qm->vfs_num; i++) {
-               ret = hisi_qm_set_vft(qm, i, 0, 0);
-               if (ret)
-                       return ret;
-       }
-       qm->vfs_num = 0;
+       /*
+        * When disabling SR-IOV, clear the configuration of each VF in the hardware
+        * sequentially. Failure to clear a single VF should not affect the clearing
+        * operation of other VFs.
+        */
+       for (i = 1; i <= qm->vfs_num; i++)
+               (void)hisi_qm_set_vft(qm, i, 0, 0);
 
-       return 0;
+       qm->vfs_num = 0;
 }
 
 static int qm_func_shaper_enable(struct hisi_qm *qm, u32 fun_index, u32 qos)
@@ -3824,13 +3824,13 @@ int hisi_qm_sriov_enable(struct pci_dev *pdev, int max_vfs)
                goto err_put_sync;
        }
 
+       qm->vfs_num = num_vfs;
        ret = pci_enable_sriov(pdev, num_vfs);
        if (ret) {
                pci_err(pdev, "Can't enable VF!\n");
                qm_clear_vft_config(qm);
                goto err_put_sync;
        }
-       qm->vfs_num = num_vfs;
 
        pci_info(pdev, "VF enabled, vfs_num(=%d)!\n", num_vfs);
 
@@ -3865,11 +3865,10 @@ int hisi_qm_sriov_disable(struct pci_dev *pdev, bool is_frozen)
        }
 
        pci_disable_sriov(pdev);
-
-       qm->vfs_num = 0;
+       qm_clear_vft_config(qm);
        qm_pm_put_sync(qm);
 
-       return qm_clear_vft_config(qm);
+       return 0;
 }
 EXPORT_SYMBOL_GPL(hisi_qm_sriov_disable);