]> www.infradead.org Git - users/hch/misc.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)
committerHerbert Xu <herbert@gondor.apana.org.au>
Sat, 20 Sep 2025 12:21:04 +0000 (20:21 +0800)
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>
drivers/crypto/hisilicon/qm.c

index d0d1fc45b8fe601dbaced0abc865f4636a120ea0..a5b96adf2d1e76c5b057ad371dfa5fcfbffcbe89 100644 (file)
@@ -3660,19 +3660,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)
@@ -4007,13 +4007,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);
 
@@ -4048,11 +4048,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);