crypto: hisilicon/qm - add pci bdf number check
authorKai Ye <yekai13@huawei.com>
Sat, 22 Oct 2022 01:17:45 +0000 (01:17 +0000)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 28 Oct 2022 04:36:34 +0000 (12:36 +0800)
The pci bdf number check is added for qos written by using the pci api.
Directly get the devfn by pci_dev, so delete some redundant code.
And use the kstrtoul instead of sscanf to simplify code.

Signed-off-by: Kai Ye <yekai13@huawei.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/hisilicon/qm.c

index 5d79e9f0e7e140e7d39852f420be1d38a11cfd4c..80eeb966cf891f46f804037d56483c58a5b0b529 100644 (file)
@@ -4589,49 +4589,36 @@ err_put_dfx_access:
        return ret;
 }
 
-static ssize_t qm_qos_value_init(const char *buf, unsigned long *val)
-{
-       int buflen = strlen(buf);
-       int ret, i;
-
-       for (i = 0; i < buflen; i++) {
-               if (!isdigit(buf[i]))
-                       return -EINVAL;
-       }
-
-       ret = sscanf(buf, "%lu", val);
-       if (ret != QM_QOS_VAL_NUM)
-               return -EINVAL;
-
-       return 0;
-}
-
 static ssize_t qm_get_qos_value(struct hisi_qm *qm, const char *buf,
                               unsigned long *val,
                               unsigned int *fun_index)
 {
+       struct bus_type *bus_type = qm->pdev->dev.bus;
        char tbuf_bdf[QM_DBG_READ_LEN] = {0};
        char val_buf[QM_DBG_READ_LEN] = {0};
-       u32 tmp1, device, function;
-       int ret, bus;
+       struct pci_dev *pdev;
+       struct device *dev;
+       int ret;
 
        ret = sscanf(buf, "%s %s", tbuf_bdf, val_buf);
        if (ret != QM_QOS_PARAM_NUM)
                return -EINVAL;
 
-       ret = qm_qos_value_init(val_buf, val);
+       ret = kstrtoul(val_buf, 10, val);
        if (ret || *val == 0 || *val > QM_QOS_MAX_VAL) {
                pci_err(qm->pdev, "input qos value is error, please set 1~1000!\n");
                return -EINVAL;
        }
 
-       ret = sscanf(tbuf_bdf, "%u:%x:%u.%u", &tmp1, &bus, &device, &function);
-       if (ret != QM_QOS_BDF_PARAM_NUM) {
-               pci_err(qm->pdev, "input pci bdf value is error!\n");
-               return -EINVAL;
+       dev = bus_find_device_by_name(bus_type, NULL, tbuf_bdf);
+       if (!dev) {
+               pci_err(qm->pdev, "input pci bdf number is error!\n");
+               return -ENODEV;
        }
 
-       *fun_index = PCI_DEVFN(device, function);
+       pdev = container_of(dev, struct pci_dev, dev);
+
+       *fun_index = pdev->devfn;
 
        return 0;
 }