if (err)
                goto err_hwinfo_free;
 
-       err = devlink_register(devlink, &pdev->dev);
-       if (err)
-               goto err_hwinfo_free;
-
        err = nfp_nsp_init(pdev, pf);
        if (err)
-               goto err_devlink_unreg;
+               goto err_hwinfo_free;
 
        pf->mip = nfp_mip_open(pf->cpp);
        pf->rtbl = __nfp_rtsym_table_read(pf->cpp, pf->mip);
        kfree(pf->eth_tbl);
        kfree(pf->nspi);
        vfree(pf->dumpspec);
-err_devlink_unreg:
-       devlink_unregister(devlink);
 err_hwinfo_free:
        kfree(pf->hwinfo);
        nfp_cpp_free(pf->cpp);
 static void nfp_pci_remove(struct pci_dev *pdev)
 {
        struct nfp_pf *pf = pci_get_drvdata(pdev);
-       struct devlink *devlink;
 
        nfp_hwmon_unregister(pf);
 
-       devlink = priv_to_devlink(pf);
-
-       nfp_net_pci_remove(pf);
-
        nfp_pcie_sriov_disable(pdev);
        pci_sriov_set_totalvfs(pf->pdev, 0);
 
-       devlink_unregister(devlink);
+       nfp_net_pci_remove(pf);
 
        vfree(pf->dumpspec);
        kfree(pf->rtbl);
        kfree(pf->eth_tbl);
        kfree(pf->nspi);
        mutex_destroy(&pf->lock);
-       devlink_free(devlink);
+       devlink_free(priv_to_devlink(pf));
        pci_release_regions(pdev);
        pci_disable_device(pdev);
 }
 
        if (IS_ERR(pf->app))
                return PTR_ERR(pf->app);
 
+       mutex_lock(&pf->lock);
        err = nfp_app_init(pf->app);
+       mutex_unlock(&pf->lock);
        if (err)
                goto err_free;
 
 err_unmap:
        nfp_cpp_area_release_free(pf->ctrl_vnic_bar);
 err_app_clean:
+       mutex_lock(&pf->lock);
        nfp_app_clean(pf->app);
+       mutex_unlock(&pf->lock);
 err_free:
        nfp_app_free(pf->app);
        pf->app = NULL;
                nfp_net_pf_free_vnic(pf, pf->ctrl_vnic);
                nfp_cpp_area_release_free(pf->ctrl_vnic_bar);
        }
+
+       mutex_lock(&pf->lock);
        nfp_app_clean(pf->app);
+       mutex_unlock(&pf->lock);
+
        nfp_app_free(pf->app);
        pf->app = NULL;
 }
  */
 int nfp_net_pci_probe(struct nfp_pf *pf)
 {
+       struct devlink *devlink = priv_to_devlink(pf);
        struct nfp_net_fw_version fw_ver;
        u8 __iomem *ctrl_bar, *qc_bar;
        int stride;
                return -EINVAL;
        }
 
-       mutex_lock(&pf->lock);
        pf->max_data_vnics = nfp_net_pf_get_num_ports(pf);
-       if ((int)pf->max_data_vnics < 0) {
-               err = pf->max_data_vnics;
-               goto err_unlock;
-       }
+       if ((int)pf->max_data_vnics < 0)
+               return pf->max_data_vnics;
 
        err = nfp_net_pci_map_mem(pf);
        if (err)
-               goto err_unlock;
+               return err;
 
        ctrl_bar = nfp_cpp_area_iomem(pf->data_vnic_bar);
        qc_bar = nfp_cpp_area_iomem(pf->qc_area);
        if (err)
                goto err_unmap;
 
+       err = devlink_register(devlink, &pf->pdev->dev);
+       if (err)
+               goto err_app_clean;
+
+       mutex_lock(&pf->lock);
        pf->ddir = nfp_net_debugfs_device_add(pf->pdev);
 
        /* Allocate the vnics and do basic init */
        nfp_net_pf_free_vnics(pf);
 err_clean_ddir:
        nfp_net_debugfs_dir_clean(&pf->ddir);
+       mutex_unlock(&pf->lock);
+       cancel_work_sync(&pf->port_refresh_work);
+       devlink_unregister(devlink);
+err_app_clean:
        nfp_net_pf_app_clean(pf);
 err_unmap:
        nfp_net_pci_unmap_mem(pf);
-err_unlock:
-       mutex_unlock(&pf->lock);
-       cancel_work_sync(&pf->port_refresh_work);
        return err;
 }
 
        /* stop app first, to avoid double free of ctrl vNIC's ddir */
        nfp_net_debugfs_dir_clean(&pf->ddir);
 
+       mutex_unlock(&pf->lock);
+
+       devlink_unregister(priv_to_devlink(pf));
+
        nfp_net_pf_free_irqs(pf);
        nfp_net_pf_app_clean(pf);
        nfp_net_pci_unmap_mem(pf);
 
-       mutex_unlock(&pf->lock);
-
        cancel_work_sync(&pf->port_refresh_work);
 }