Merge branch 'mlx5-next' of git://git.kernel.org/pub/scm/linux/kernel/git/mellanox...
[linux-2.6-block.git] / drivers / net / ethernet / mellanox / mlx5 / core / main.c
index 70cc906a102b2dde87d161385126f43da4948266..b200a29d142057cd4e407b61fdccb1df074a01e2 100644 (file)
@@ -587,24 +587,23 @@ query_ex:
 
 static int set_hca_cap(struct mlx5_core_dev *dev)
 {
-       struct pci_dev *pdev = dev->pdev;
        int err;
 
        err = handle_hca_cap(dev);
        if (err) {
-               dev_err(&pdev->dev, "handle_hca_cap failed\n");
+               mlx5_core_err(dev, "handle_hca_cap failed\n");
                goto out;
        }
 
        err = handle_hca_cap_atomic(dev);
        if (err) {
-               dev_err(&pdev->dev, "handle_hca_cap_atomic failed\n");
+               mlx5_core_err(dev, "handle_hca_cap_atomic failed\n");
                goto out;
        }
 
        err = handle_hca_cap_odp(dev);
        if (err) {
-               dev_err(&pdev->dev, "handle_hca_cap_odp failed\n");
+               mlx5_core_err(dev, "handle_hca_cap_odp failed\n");
                goto out;
        }
 
@@ -736,36 +735,29 @@ static int mlx5_core_set_issi(struct mlx5_core_dev *dev)
        return -EOPNOTSUPP;
 }
 
-static int mlx5_pci_init(struct mlx5_core_dev *dev, struct mlx5_priv *priv)
+static int mlx5_pci_init(struct mlx5_core_dev *dev, struct pci_dev *pdev,
+                        const struct pci_device_id *id)
 {
-       struct pci_dev *pdev = dev->pdev;
+       struct mlx5_priv *priv = &dev->priv;
        int err = 0;
 
-       pci_set_drvdata(dev->pdev, dev);
-       strncpy(priv->name, dev_name(&pdev->dev), MLX5_MAX_NAME_LEN);
-       priv->name[MLX5_MAX_NAME_LEN - 1] = 0;
-
-       mutex_init(&priv->pgdir_mutex);
-       INIT_LIST_HEAD(&priv->pgdir_list);
-       spin_lock_init(&priv->mkey_lock);
+       dev->pdev = pdev;
+       priv->pci_dev_data = id->driver_data;
 
-       mutex_init(&priv->alloc_mutex);
+       pci_set_drvdata(dev->pdev, dev);
 
+       dev->bar_addr = pci_resource_start(pdev, 0);
        priv->numa_node = dev_to_node(&dev->pdev->dev);
 
-       if (mlx5_debugfs_root)
-               priv->dbg_root =
-                       debugfs_create_dir(pci_name(pdev), mlx5_debugfs_root);
-
        err = mlx5_pci_enable_device(dev);
        if (err) {
-               dev_err(&pdev->dev, "Cannot enable PCI device, aborting\n");
-               goto err_dbg;
+               mlx5_core_err(dev, "Cannot enable PCI device, aborting\n");
+               return err;
        }
 
        err = request_bar(pdev);
        if (err) {
-               dev_err(&pdev->dev, "error requesting BARs, aborting\n");
+               mlx5_core_err(dev, "error requesting BARs, aborting\n");
                goto err_disable;
        }
 
@@ -773,7 +765,7 @@ static int mlx5_pci_init(struct mlx5_core_dev *dev, struct mlx5_priv *priv)
 
        err = set_dma_caps(pdev);
        if (err) {
-               dev_err(&pdev->dev, "Failed setting DMA capabilities mask, aborting\n");
+               mlx5_core_err(dev, "Failed setting DMA capabilities mask, aborting\n");
                goto err_clr_master;
        }
 
@@ -782,11 +774,11 @@ static int mlx5_pci_init(struct mlx5_core_dev *dev, struct mlx5_priv *priv)
            pci_enable_atomic_ops_to_root(pdev, PCI_EXP_DEVCAP2_ATOMIC_COMP128))
                mlx5_core_dbg(dev, "Enabling pci atomics failed\n");
 
-       dev->iseg_base = pci_resource_start(dev->pdev, 0);
+       dev->iseg_base = dev->bar_addr;
        dev->iseg = ioremap(dev->iseg_base, sizeof(*dev->iseg));
        if (!dev->iseg) {
                err = -ENOMEM;
-               dev_err(&pdev->dev, "Failed mapping initialization segment, aborting\n");
+               mlx5_core_err(dev, "Failed mapping initialization segment, aborting\n");
                goto err_clr_master;
        }
 
@@ -797,52 +789,47 @@ err_clr_master:
        release_bar(dev->pdev);
 err_disable:
        mlx5_pci_disable_device(dev);
-
-err_dbg:
-       debugfs_remove(priv->dbg_root);
        return err;
 }
 
-static void mlx5_pci_close(struct mlx5_core_dev *dev, struct mlx5_priv *priv)
+static void mlx5_pci_close(struct mlx5_core_dev *dev)
 {
        iounmap(dev->iseg);
        pci_clear_master(dev->pdev);
        release_bar(dev->pdev);
        mlx5_pci_disable_device(dev);
-       debugfs_remove_recursive(priv->dbg_root);
 }
 
-static int mlx5_init_once(struct mlx5_core_dev *dev, struct mlx5_priv *priv)
+static int mlx5_init_once(struct mlx5_core_dev *dev)
 {
-       struct pci_dev *pdev = dev->pdev;
        int err;
 
-       priv->devcom = mlx5_devcom_register_device(dev);
-       if (IS_ERR(priv->devcom))
-               dev_err(&pdev->dev, "failed to register with devcom (0x%p)\n",
-                       priv->devcom);
+       dev->priv.devcom = mlx5_devcom_register_device(dev);
+       if (IS_ERR(dev->priv.devcom))
+               mlx5_core_err(dev, "failed to register with devcom (0x%p)\n",
+                             dev->priv.devcom);
 
        err = mlx5_query_board_id(dev);
        if (err) {
-               dev_err(&pdev->dev, "query board id failed\n");
+               mlx5_core_err(dev, "query board id failed\n");
                goto err_devcom;
        }
 
        err = mlx5_eq_table_init(dev);
        if (err) {
-               dev_err(&pdev->dev, "failed to initialize eq\n");
+               mlx5_core_err(dev, "failed to initialize eq\n");
                goto err_devcom;
        }
 
        err = mlx5_events_init(dev);
        if (err) {
-               dev_err(&pdev->dev, "failed to initialize events\n");
+               mlx5_core_err(dev, "failed to initialize events\n");
                goto err_eq_cleanup;
        }
 
        err = mlx5_cq_debugfs_init(dev);
        if (err) {
-               dev_err(&pdev->dev, "failed to initialize cq debugfs\n");
+               mlx5_core_err(dev, "failed to initialize cq debugfs\n");
                goto err_events_cleanup;
        }
 
@@ -858,31 +845,31 @@ static int mlx5_init_once(struct mlx5_core_dev *dev, struct mlx5_priv *priv)
 
        err = mlx5_init_rl_table(dev);
        if (err) {
-               dev_err(&pdev->dev, "Failed to init rate limiting\n");
+               mlx5_core_err(dev, "Failed to init rate limiting\n");
                goto err_tables_cleanup;
        }
 
        err = mlx5_mpfs_init(dev);
        if (err) {
-               dev_err(&pdev->dev, "Failed to init l2 table %d\n", err);
+               mlx5_core_err(dev, "Failed to init l2 table %d\n", err);
                goto err_rl_cleanup;
        }
 
        err = mlx5_eswitch_init(dev);
        if (err) {
-               dev_err(&pdev->dev, "Failed to init eswitch %d\n", err);
+               mlx5_core_err(dev, "Failed to init eswitch %d\n", err);
                goto err_mpfs_cleanup;
        }
 
        err = mlx5_sriov_init(dev);
        if (err) {
-               dev_err(&pdev->dev, "Failed to init sriov %d\n", err);
+               mlx5_core_err(dev, "Failed to init sriov %d\n", err);
                goto err_eswitch_cleanup;
        }
 
        err = mlx5_fpga_init(dev);
        if (err) {
-               dev_err(&pdev->dev, "Failed to init fpga device %d\n", err);
+               mlx5_core_err(dev, "Failed to init fpga device %d\n", err);
                goto err_sriov_cleanup;
        }
 
@@ -932,93 +919,78 @@ static void mlx5_cleanup_once(struct mlx5_core_dev *dev)
        mlx5_devcom_unregister_device(dev->priv.devcom);
 }
 
-static int mlx5_load_one(struct mlx5_core_dev *dev, struct mlx5_priv *priv,
-                        bool boot)
+static int mlx5_function_setup(struct mlx5_core_dev *dev, bool boot)
 {
-       struct pci_dev *pdev = dev->pdev;
        int err;
 
-       dev->caps.embedded_cpu = mlx5_read_embedded_cpu(dev);
-       mutex_lock(&dev->intf_state_mutex);
-       if (test_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state)) {
-               dev_warn(&dev->pdev->dev, "%s: interface is up, NOP\n",
-                        __func__);
-               goto out;
-       }
-
-       dev_info(&pdev->dev, "firmware version: %d.%d.%d\n", fw_rev_maj(dev),
-                fw_rev_min(dev), fw_rev_sub(dev));
+       mlx5_core_info(dev, "firmware version: %d.%d.%d\n", fw_rev_maj(dev),
+                      fw_rev_min(dev), fw_rev_sub(dev));
 
        /* Only PFs hold the relevant PCIe information for this query */
        if (mlx5_core_is_pf(dev))
                pcie_print_link_status(dev->pdev);
 
-       /* on load removing any previous indication of internal error, device is
-        * up
-        */
-       dev->state = MLX5_DEVICE_STATE_UP;
-
        /* wait for firmware to accept initialization segments configurations
         */
        err = wait_fw_init(dev, FW_PRE_INIT_TIMEOUT_MILI);
        if (err) {
-               dev_err(&dev->pdev->dev, "Firmware over %d MS in pre-initializing state, aborting\n",
-                       FW_PRE_INIT_TIMEOUT_MILI);
-               goto out_err;
+               mlx5_core_err(dev, "Firmware over %d MS in pre-initializing state, aborting\n",
+                             FW_PRE_INIT_TIMEOUT_MILI);
+               return err;
        }
 
        err = mlx5_cmd_init(dev);
        if (err) {
-               dev_err(&pdev->dev, "Failed initializing command interface, aborting\n");
-               goto out_err;
+               mlx5_core_err(dev, "Failed initializing command interface, aborting\n");
+               return err;
        }
 
        err = wait_fw_init(dev, FW_INIT_TIMEOUT_MILI);
        if (err) {
-               dev_err(&dev->pdev->dev, "Firmware over %d MS in initializing state, aborting\n",
-                       FW_INIT_TIMEOUT_MILI);
+               mlx5_core_err(dev, "Firmware over %d MS in initializing state, aborting\n",
+                             FW_INIT_TIMEOUT_MILI);
                goto err_cmd_cleanup;
        }
 
        err = mlx5_core_enable_hca(dev, 0);
        if (err) {
-               dev_err(&pdev->dev, "enable hca failed\n");
+               mlx5_core_err(dev, "enable hca failed\n");
                goto err_cmd_cleanup;
        }
 
        err = mlx5_core_set_issi(dev);
        if (err) {
-               dev_err(&pdev->dev, "failed to set issi\n");
+               mlx5_core_err(dev, "failed to set issi\n");
                goto err_disable_hca;
        }
 
        err = mlx5_satisfy_startup_pages(dev, 1);
        if (err) {
-               dev_err(&pdev->dev, "failed to allocate boot pages\n");
+               mlx5_core_err(dev, "failed to allocate boot pages\n");
                goto err_disable_hca;
        }
 
        err = set_hca_ctrl(dev);
        if (err) {
-               dev_err(&pdev->dev, "set_hca_ctrl failed\n");
+               mlx5_core_err(dev, "set_hca_ctrl failed\n");
                goto reclaim_boot_pages;
        }
 
        err = set_hca_cap(dev);
        if (err) {
-               dev_err(&pdev->dev, "set_hca_cap failed\n");
+               mlx5_core_err(dev, "set_hca_cap failed\n");
                goto reclaim_boot_pages;
        }
 
        err = mlx5_satisfy_startup_pages(dev, 0);
        if (err) {
-               dev_err(&pdev->dev, "failed to allocate init pages\n");
+               mlx5_core_err(dev, "failed to allocate init pages\n");
                goto reclaim_boot_pages;
        }
 
        err = mlx5_cmd_init_hca(dev, sw_owner_id);
        if (err) {
-               dev_err(&pdev->dev, "init hca failed\n");
+               mlx5_core_err(dev, "init hca failed\n");
                goto reclaim_boot_pages;
        }
 
@@ -1028,23 +1000,50 @@ static int mlx5_load_one(struct mlx5_core_dev *dev, struct mlx5_priv *priv,
 
        err = mlx5_query_hca_caps(dev);
        if (err) {
-               dev_err(&pdev->dev, "query hca failed\n");
-               goto err_stop_poll;
+               mlx5_core_err(dev, "query hca failed\n");
+               goto stop_health;
        }
 
-       if (boot) {
-               err = mlx5_init_once(dev, priv);
-               if (err) {
-                       dev_err(&pdev->dev, "sw objs init failed\n");
-                       goto err_stop_poll;
-               }
+       return 0;
+
+stop_health:
+       mlx5_stop_health_poll(dev, boot);
+reclaim_boot_pages:
+       mlx5_reclaim_startup_pages(dev);
+err_disable_hca:
+       mlx5_core_disable_hca(dev, 0);
+err_cmd_cleanup:
+       mlx5_cmd_cleanup(dev);
+
+       return err;
+}
+
+static int mlx5_function_teardown(struct mlx5_core_dev *dev, bool boot)
+{
+       int err;
+
+       mlx5_stop_health_poll(dev, boot);
+       err = mlx5_cmd_teardown_hca(dev);
+       if (err) {
+               mlx5_core_err(dev, "tear_down_hca failed, skip cleanup\n");
+               return err;
        }
+       mlx5_reclaim_startup_pages(dev);
+       mlx5_core_disable_hca(dev, 0);
+       mlx5_cmd_cleanup(dev);
+
+       return 0;
+}
+
+static int mlx5_load(struct mlx5_core_dev *dev)
+{
+       int err;
 
        dev->priv.uar = mlx5_get_uars_page(dev);
        if (IS_ERR(dev->priv.uar)) {
-               dev_err(&pdev->dev, "Failed allocating uar, aborting\n");
+               mlx5_core_err(dev, "Failed allocating uar, aborting\n");
                err = PTR_ERR(dev->priv.uar);
-               goto err_get_uars;
+               return err;
        }
 
        mlx5_events_start(dev);
@@ -1052,132 +1051,155 @@ static int mlx5_load_one(struct mlx5_core_dev *dev, struct mlx5_priv *priv,
 
        err = mlx5_eq_table_create(dev);
        if (err) {
-               dev_err(&pdev->dev, "Failed to create EQs\n");
+               mlx5_core_err(dev, "Failed to create EQs\n");
                goto err_eq_table;
        }
 
        err = mlx5_fw_tracer_init(dev->tracer);
        if (err) {
-               dev_err(&pdev->dev, "Failed to init FW tracer\n");
+               mlx5_core_err(dev, "Failed to init FW tracer\n");
                goto err_fw_tracer;
        }
 
        err = mlx5_fpga_device_start(dev);
        if (err) {
-               dev_err(&pdev->dev, "fpga device start failed %d\n", err);
+               mlx5_core_err(dev, "fpga device start failed %d\n", err);
                goto err_fpga_start;
        }
 
        err = mlx5_accel_ipsec_init(dev);
        if (err) {
-               dev_err(&pdev->dev, "IPSec device start failed %d\n", err);
+               mlx5_core_err(dev, "IPSec device start failed %d\n", err);
                goto err_ipsec_start;
        }
 
        err = mlx5_accel_tls_init(dev);
        if (err) {
-               dev_err(&pdev->dev, "TLS device start failed %d\n", err);
+               mlx5_core_err(dev, "TLS device start failed %d\n", err);
                goto err_tls_start;
        }
 
        err = mlx5_init_fs(dev);
        if (err) {
-               dev_err(&pdev->dev, "Failed to init flow steering\n");
+               mlx5_core_err(dev, "Failed to init flow steering\n");
                goto err_fs;
        }
 
        err = mlx5_core_set_hca_defaults(dev);
        if (err) {
-               dev_err(&pdev->dev, "Failed to set hca defaults\n");
+               mlx5_core_err(dev, "Failed to set hca defaults\n");
                goto err_fs;
        }
 
        err = mlx5_sriov_attach(dev);
        if (err) {
-               dev_err(&pdev->dev, "sriov init failed %d\n", err);
+               mlx5_core_err(dev, "sriov init failed %d\n", err);
                goto err_sriov;
        }
 
        err = mlx5_ec_init(dev);
        if (err) {
-               dev_err(&pdev->dev, "Failed to init embedded CPU\n");
+               mlx5_core_err(dev, "Failed to init embedded CPU\n");
                goto err_ec;
        }
 
-       if (mlx5_device_registered(dev)) {
-               mlx5_attach_device(dev);
-       } else {
-               err = mlx5_register_device(dev);
-               if (err) {
-                       dev_err(&pdev->dev, "mlx5_register_device failed %d\n", err);
-                       goto err_reg_dev;
-               }
-       }
-
-       set_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state);
-out:
-       mutex_unlock(&dev->intf_state_mutex);
-
        return 0;
 
-err_reg_dev:
-       mlx5_ec_cleanup(dev);
-
 err_ec:
        mlx5_sriov_detach(dev);
-
 err_sriov:
        mlx5_cleanup_fs(dev);
-
 err_fs:
        mlx5_accel_tls_cleanup(dev);
-
 err_tls_start:
        mlx5_accel_ipsec_cleanup(dev);
-
 err_ipsec_start:
        mlx5_fpga_device_stop(dev);
-
 err_fpga_start:
        mlx5_fw_tracer_cleanup(dev->tracer);
-
 err_fw_tracer:
        mlx5_eq_table_destroy(dev);
-
 err_eq_table:
        mlx5_pagealloc_stop(dev);
        mlx5_events_stop(dev);
-       mlx5_put_uars_page(dev, priv->uar);
+       mlx5_put_uars_page(dev, dev->priv.uar);
+       return err;
+}
 
-err_get_uars:
-       if (boot)
-               mlx5_cleanup_once(dev);
+static void mlx5_unload(struct mlx5_core_dev *dev)
+{
+       mlx5_ec_cleanup(dev);
+       mlx5_sriov_detach(dev);
+       mlx5_cleanup_fs(dev);
+       mlx5_accel_ipsec_cleanup(dev);
+       mlx5_accel_tls_cleanup(dev);
+       mlx5_fpga_device_stop(dev);
+       mlx5_fw_tracer_cleanup(dev->tracer);
+       mlx5_eq_table_destroy(dev);
+       mlx5_pagealloc_stop(dev);
+       mlx5_events_stop(dev);
+       mlx5_put_uars_page(dev, dev->priv.uar);
+}
 
-err_stop_poll:
-       mlx5_stop_health_poll(dev, boot);
-       if (mlx5_cmd_teardown_hca(dev)) {
-               dev_err(&dev->pdev->dev, "tear_down_hca failed, skip cleanup\n");
-               goto out_err;
+static int mlx5_load_one(struct mlx5_core_dev *dev, bool boot)
+{
+       int err = 0;
+
+       dev->caps.embedded_cpu = mlx5_read_embedded_cpu(dev);
+       mutex_lock(&dev->intf_state_mutex);
+       if (test_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state)) {
+               mlx5_core_warn(dev, "interface is up, NOP\n");
+               goto out;
        }
+       /* remove any previous indication of internal error */
+       dev->state = MLX5_DEVICE_STATE_UP;
 
-reclaim_boot_pages:
-       mlx5_reclaim_startup_pages(dev);
+       err = mlx5_function_setup(dev, boot);
+       if (err)
+               goto out;
 
-err_disable_hca:
-       mlx5_core_disable_hca(dev, 0);
+       if (boot) {
+               err = mlx5_init_once(dev);
+               if (err) {
+                       mlx5_core_err(dev, "sw objs init failed\n");
+                       goto function_teardown;
+               }
+       }
 
-err_cmd_cleanup:
-       mlx5_cmd_cleanup(dev);
+       err = mlx5_load(dev);
+       if (err)
+               goto err_load;
 
-out_err:
+       if (mlx5_device_registered(dev)) {
+               mlx5_attach_device(dev);
+       } else {
+               err = mlx5_register_device(dev);
+               if (err) {
+                       mlx5_core_err(dev, "register device failed %d\n", err);
+                       goto err_reg_dev;
+               }
+       }
+
+       set_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state);
+out:
+       mutex_unlock(&dev->intf_state_mutex);
+
+       return err;
+
+err_reg_dev:
+       mlx5_unload(dev);
+err_load:
+       if (boot)
+               mlx5_cleanup_once(dev);
+function_teardown:
+       mlx5_function_teardown(dev, boot);
        dev->state = MLX5_DEVICE_STATE_INTERNAL_ERROR;
        mutex_unlock(&dev->intf_state_mutex);
 
        return err;
 }
 
-static int mlx5_unload_one(struct mlx5_core_dev *dev, struct mlx5_priv *priv,
-                          bool cleanup)
+static int mlx5_unload_one(struct mlx5_core_dev *dev, bool cleanup)
 {
        int err = 0;
 
@@ -1186,8 +1208,8 @@ static int mlx5_unload_one(struct mlx5_core_dev *dev, struct mlx5_priv *priv,
 
        mutex_lock(&dev->intf_state_mutex);
        if (!test_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state)) {
-               dev_warn(&dev->pdev->dev, "%s: interface is down, NOP\n",
-                        __func__);
+               mlx5_core_warn(dev, "%s: interface is down, NOP\n",
+                              __func__);
                if (cleanup)
                        mlx5_cleanup_once(dev);
                goto out;
@@ -1198,30 +1220,12 @@ static int mlx5_unload_one(struct mlx5_core_dev *dev, struct mlx5_priv *priv,
        if (mlx5_device_registered(dev))
                mlx5_detach_device(dev);
 
-       mlx5_ec_cleanup(dev);
-       mlx5_sriov_detach(dev);
-       mlx5_cleanup_fs(dev);
-       mlx5_accel_ipsec_cleanup(dev);
-       mlx5_accel_tls_cleanup(dev);
-       mlx5_fpga_device_stop(dev);
-       mlx5_fw_tracer_cleanup(dev->tracer);
-       mlx5_eq_table_destroy(dev);
-       mlx5_pagealloc_stop(dev);
-       mlx5_events_stop(dev);
-       mlx5_put_uars_page(dev, priv->uar);
+       mlx5_unload(dev);
+
        if (cleanup)
                mlx5_cleanup_once(dev);
-       mlx5_stop_health_poll(dev, cleanup);
-
-       err = mlx5_cmd_teardown_hca(dev);
-       if (err) {
-               dev_err(&dev->pdev->dev, "tear_down_hca failed, skip cleanup\n");
-               goto out;
-       }
-       mlx5_reclaim_startup_pages(dev);
-       mlx5_core_disable_hca(dev, 0);
-       mlx5_cmd_cleanup(dev);
 
+       mlx5_function_teardown(dev, cleanup);
 out:
        mutex_unlock(&dev->intf_state_mutex);
        return err;
@@ -1238,29 +1242,15 @@ static const struct devlink_ops mlx5_devlink_ops = {
 #endif
 };
 
-#define MLX5_IB_MOD "mlx5_ib"
-static int init_one(struct pci_dev *pdev,
-                   const struct pci_device_id *id)
+static int mlx5_mdev_init(struct mlx5_core_dev *dev, int profile_idx, const char *name)
 {
-       struct mlx5_core_dev *dev;
-       struct devlink *devlink;
-       struct mlx5_priv *priv;
+       struct mlx5_priv *priv = &dev->priv;
        int err;
 
-       devlink = devlink_alloc(&mlx5_devlink_ops, sizeof(*dev));
-       if (!devlink) {
-               dev_err(&pdev->dev, "kzalloc failed\n");
-               return -ENOMEM;
-       }
-
-       dev = devlink_priv(devlink);
-       priv = &dev->priv;
-       priv->pci_dev_data = id->driver_data;
-
-       pci_set_drvdata(pdev, dev);
+       strncpy(priv->name, name, MLX5_MAX_NAME_LEN);
+       priv->name[MLX5_MAX_NAME_LEN - 1] = 0;
 
-       dev->pdev = pdev;
-       dev->profile = &profile[prof_sel];
+       dev->profile = &profile[profile_idx];
 
        INIT_LIST_HEAD(&priv->ctx_list);
        spin_lock_init(&priv->ctx_lock);
@@ -1272,25 +1262,72 @@ static int init_one(struct pci_dev *pdev,
        INIT_LIST_HEAD(&priv->bfregs.reg_head.list);
        INIT_LIST_HEAD(&priv->bfregs.wc_head.list);
 
-       err = mlx5_pci_init(dev, priv);
-       if (err) {
-               dev_err(&pdev->dev, "mlx5_pci_init failed with error code %d\n", err);
-               goto clean_dev;
+       mutex_init(&priv->alloc_mutex);
+       mutex_init(&priv->pgdir_mutex);
+       INIT_LIST_HEAD(&priv->pgdir_list);
+       spin_lock_init(&priv->mkey_lock);
+
+       priv->dbg_root = debugfs_create_dir(name, mlx5_debugfs_root);
+       if (!priv->dbg_root) {
+               pr_err("mlx5_core: %s error, Cannot create debugfs dir, aborting\n", name);
+               return -ENOMEM;
        }
 
        err = mlx5_health_init(dev);
-       if (err) {
-               dev_err(&pdev->dev, "mlx5_health_init failed with error code %d\n", err);
-               goto close_pci;
-       }
+       if (err)
+               goto err_health_init;
 
        err = mlx5_pagealloc_init(dev);
        if (err)
                goto err_pagealloc_init;
 
-       err = mlx5_load_one(dev, priv, true);
+       return 0;
+
+err_pagealloc_init:
+       mlx5_health_cleanup(dev);
+err_health_init:
+       debugfs_remove(dev->priv.dbg_root);
+
+       return err;
+}
+
+static void mlx5_mdev_uninit(struct mlx5_core_dev *dev)
+{
+       mlx5_pagealloc_cleanup(dev);
+       mlx5_health_cleanup(dev);
+       debugfs_remove_recursive(dev->priv.dbg_root);
+}
+
+#define MLX5_IB_MOD "mlx5_ib"
+static int init_one(struct pci_dev *pdev, const struct pci_device_id *id)
+{
+       struct mlx5_core_dev *dev;
+       struct devlink *devlink;
+       int err;
+
+       devlink = devlink_alloc(&mlx5_devlink_ops, sizeof(*dev));
+       if (!devlink) {
+               dev_err(&pdev->dev, "kzalloc failed\n");
+               return -ENOMEM;
+       }
+
+       dev = devlink_priv(devlink);
+
+       err = mlx5_mdev_init(dev, prof_sel, dev_name(&pdev->dev));
+       if (err)
+               goto mdev_init_err;
+
+       err = mlx5_pci_init(dev, pdev, id);
+       if (err) {
+               mlx5_core_err(dev, "mlx5_pci_init failed with error code %d\n",
+                             err);
+               goto pci_init_err;
+       }
+
+       err = mlx5_load_one(dev, true);
        if (err) {
-               dev_err(&pdev->dev, "mlx5_load_one failed with error code %d\n", err);
+               mlx5_core_err(dev, "mlx5_load_one failed with error code %d\n",
+                             err);
                goto err_load_one;
        }
 
@@ -1304,14 +1341,13 @@ static int init_one(struct pci_dev *pdev,
        return 0;
 
 clean_load:
-       mlx5_unload_one(dev, priv, true);
+       mlx5_unload_one(dev, true);
+
 err_load_one:
-       mlx5_pagealloc_cleanup(dev);
-err_pagealloc_init:
-       mlx5_health_cleanup(dev);
-close_pci:
-       mlx5_pci_close(dev, priv);
-clean_dev:
+       mlx5_pci_close(dev);
+pci_init_err:
+       mlx5_mdev_uninit(dev);
+mdev_init_err:
        devlink_free(devlink);
 
        return err;
@@ -1321,20 +1357,18 @@ static void remove_one(struct pci_dev *pdev)
 {
        struct mlx5_core_dev *dev  = pci_get_drvdata(pdev);
        struct devlink *devlink = priv_to_devlink(dev);
-       struct mlx5_priv *priv = &dev->priv;
 
        devlink_unregister(devlink);
        mlx5_unregister_device(dev);
 
-       if (mlx5_unload_one(dev, priv, true)) {
-               dev_err(&dev->pdev->dev, "mlx5_unload_one failed\n");
-               mlx5_health_cleanup(dev);
+       if (mlx5_unload_one(dev, true)) {
+               mlx5_core_err(dev, "mlx5_unload_one failed\n");
+               mlx5_health_flush(dev);
                return;
        }
 
-       mlx5_pagealloc_cleanup(dev);
-       mlx5_health_cleanup(dev);
-       mlx5_pci_close(dev, priv);
+       mlx5_pci_close(dev);
+       mlx5_mdev_uninit(dev);
        devlink_free(devlink);
 }
 
@@ -1342,12 +1376,11 @@ static pci_ers_result_t mlx5_pci_err_detected(struct pci_dev *pdev,
                                              pci_channel_state_t state)
 {
        struct mlx5_core_dev *dev = pci_get_drvdata(pdev);
-       struct mlx5_priv *priv = &dev->priv;
 
-       dev_info(&pdev->dev, "%s was called\n", __func__);
+       mlx5_core_info(dev, "%s was called\n", __func__);
 
        mlx5_enter_error_state(dev, false);
-       mlx5_unload_one(dev, priv, false);
+       mlx5_unload_one(dev, false);
        /* In case of kernel call drain the health wq */
        if (state) {
                mlx5_drain_health_wq(dev);
@@ -1374,7 +1407,9 @@ static int wait_vital(struct pci_dev *pdev)
                count = ioread32be(health->health_counter);
                if (count && count != 0xffffffff) {
                        if (last_count && last_count != count) {
-                               dev_info(&pdev->dev, "Counter value 0x%x after %d iterations\n", count, i);
+                               mlx5_core_info(dev,
+                                              "wait vital counter value 0x%x after %d iterations\n",
+                                              count, i);
                                return 0;
                        }
                        last_count = count;
@@ -1390,12 +1425,12 @@ static pci_ers_result_t mlx5_pci_slot_reset(struct pci_dev *pdev)
        struct mlx5_core_dev *dev = pci_get_drvdata(pdev);
        int err;
 
-       dev_info(&pdev->dev, "%s was called\n", __func__);
+       mlx5_core_info(dev, "%s was called\n", __func__);
 
        err = mlx5_pci_enable_device(dev);
        if (err) {
-               dev_err(&pdev->dev, "%s: mlx5_pci_enable_device failed with error code: %d\n"
-                       , __func__, err);
+               mlx5_core_err(dev, "%s: mlx5_pci_enable_device failed with error code: %d\n",
+                             __func__, err);
                return PCI_ERS_RESULT_DISCONNECT;
        }
 
@@ -1404,7 +1439,7 @@ static pci_ers_result_t mlx5_pci_slot_reset(struct pci_dev *pdev)
        pci_save_state(pdev);
 
        if (wait_vital(pdev)) {
-               dev_err(&pdev->dev, "%s: wait_vital timed out\n", __func__);
+               mlx5_core_err(dev, "%s: wait_vital timed out\n", __func__);
                return PCI_ERS_RESULT_DISCONNECT;
        }
 
@@ -1414,17 +1449,16 @@ static pci_ers_result_t mlx5_pci_slot_reset(struct pci_dev *pdev)
 static void mlx5_pci_resume(struct pci_dev *pdev)
 {
        struct mlx5_core_dev *dev = pci_get_drvdata(pdev);
-       struct mlx5_priv *priv = &dev->priv;
        int err;
 
-       dev_info(&pdev->dev, "%s was called\n", __func__);
+       mlx5_core_info(dev, "%s was called\n", __func__);
 
-       err = mlx5_load_one(dev, priv, false);
+       err = mlx5_load_one(dev, false);
        if (err)
-               dev_err(&pdev->dev, "%s: mlx5_load_one failed with error code: %d\n"
-                       , __func__, err);
+               mlx5_core_err(dev, "%s: mlx5_load_one failed with error code: %d\n",
+                             __func__, err);
        else
-               dev_info(&pdev->dev, "%s: device recovered\n", __func__);
+               mlx5_core_info(dev, "%s: device recovered\n", __func__);
 }
 
 static const struct pci_error_handlers mlx5_err_handler = {
@@ -1486,13 +1520,12 @@ succeed:
 static void shutdown(struct pci_dev *pdev)
 {
        struct mlx5_core_dev *dev  = pci_get_drvdata(pdev);
-       struct mlx5_priv *priv = &dev->priv;
        int err;
 
-       dev_info(&pdev->dev, "Shutdown was called\n");
+       mlx5_core_info(dev, "Shutdown was called\n");
        err = mlx5_try_fast_unload(dev);
        if (err)
-               mlx5_unload_one(dev, priv, false);
+               mlx5_unload_one(dev, false);
        mlx5_pci_disable_device(dev);
 }