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;
 }