Merge tag 'acpi-5.13-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
[linux-2.6-microblaze.git] / drivers / net / ethernet / mellanox / mlx5 / core / main.c
index c568896..a1d67bd 100644 (file)
@@ -503,7 +503,7 @@ static int handle_hca_cap_odp(struct mlx5_core_dev *dev, void *set_ctx)
 
 static int handle_hca_cap(struct mlx5_core_dev *dev, void *set_ctx)
 {
-       struct mlx5_profile *prof = dev->profile;
+       struct mlx5_profile *prof = &dev->profile;
        void *set_hca_cap;
        int err;
 
@@ -524,11 +524,11 @@ static int handle_hca_cap(struct mlx5_core_dev *dev, void *set_ctx)
                 to_fw_pkey_sz(dev, 128));
 
        /* Check log_max_qp from HCA caps to set in current profile */
-       if (MLX5_CAP_GEN_MAX(dev, log_max_qp) < profile[prof_sel].log_max_qp) {
+       if (MLX5_CAP_GEN_MAX(dev, log_max_qp) < prof->log_max_qp) {
                mlx5_core_warn(dev, "log_max_qp value in current profile is %d, changing it to HCA capability limit (%d)\n",
-                              profile[prof_sel].log_max_qp,
+                              prof->log_max_qp,
                               MLX5_CAP_GEN_MAX(dev, log_max_qp));
-               profile[prof_sel].log_max_qp = MLX5_CAP_GEN_MAX(dev, log_max_qp);
+               prof->log_max_qp = MLX5_CAP_GEN_MAX(dev, log_max_qp);
        }
        if (prof->mask & MLX5_PROF_MASK_QP_SIZE)
                MLX5_SET(cmd_hca_cap, set_hca_cap, log_max_qp,
@@ -571,6 +571,10 @@ static int handle_hca_cap(struct mlx5_core_dev *dev, void *set_ctx)
 
        mlx5_vhca_state_cap_handle(dev, set_hca_cap);
 
+       if (MLX5_CAP_GEN_MAX(dev, num_total_dynamic_vf_msix))
+               MLX5_SET(cmd_hca_cap, set_hca_cap, num_total_dynamic_vf_msix,
+                        MLX5_CAP_GEN_MAX(dev, num_total_dynamic_vf_msix));
+
        return set_caps(dev, set_ctx, MLX5_SET_HCA_CAP_OP_MOD_GENERAL_DEVICE);
 }
 
@@ -1235,7 +1239,7 @@ static void mlx5_unload(struct mlx5_core_dev *dev)
        mlx5_put_uars_page(dev, dev->priv.uar);
 }
 
-int mlx5_load_one(struct mlx5_core_dev *dev, bool boot)
+int mlx5_init_one(struct mlx5_core_dev *dev)
 {
        int err = 0;
 
@@ -1247,16 +1251,14 @@ int mlx5_load_one(struct mlx5_core_dev *dev, bool boot)
        /* remove any previous indication of internal error */
        dev->state = MLX5_DEVICE_STATE_UP;
 
-       err = mlx5_function_setup(dev, boot);
+       err = mlx5_function_setup(dev, true);
        if (err)
                goto err_function;
 
-       if (boot) {
-               err = mlx5_init_once(dev);
-               if (err) {
-                       mlx5_core_err(dev, "sw objs init failed\n");
-                       goto function_teardown;
-               }
+       err = mlx5_init_once(dev);
+       if (err) {
+               mlx5_core_err(dev, "sw objs init failed\n");
+               goto function_teardown;
        }
 
        err = mlx5_load(dev);
@@ -1265,16 +1267,11 @@ int mlx5_load_one(struct mlx5_core_dev *dev, bool boot)
 
        set_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state);
 
-       if (boot) {
-               err = mlx5_devlink_register(priv_to_devlink(dev), dev->device);
-               if (err)
-                       goto err_devlink_reg;
-
-               err = mlx5_register_device(dev);
-       } else {
-               err = mlx5_attach_device(dev);
-       }
+       err = mlx5_devlink_register(priv_to_devlink(dev), dev->device);
+       if (err)
+               goto err_devlink_reg;
 
+       err = mlx5_register_device(dev);
        if (err)
                goto err_register;
 
@@ -1282,16 +1279,14 @@ int mlx5_load_one(struct mlx5_core_dev *dev, bool boot)
        return 0;
 
 err_register:
-       if (boot)
-               mlx5_devlink_unregister(priv_to_devlink(dev));
+       mlx5_devlink_unregister(priv_to_devlink(dev));
 err_devlink_reg:
        clear_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state);
        mlx5_unload(dev);
 err_load:
-       if (boot)
-               mlx5_cleanup_once(dev);
+       mlx5_cleanup_once(dev);
 function_teardown:
-       mlx5_function_teardown(dev, boot);
+       mlx5_function_teardown(dev, true);
 err_function:
        dev->state = MLX5_DEVICE_STATE_INTERNAL_ERROR;
 out:
@@ -1299,33 +1294,84 @@ out:
        return err;
 }
 
-void mlx5_unload_one(struct mlx5_core_dev *dev, bool cleanup)
+void mlx5_uninit_one(struct mlx5_core_dev *dev)
 {
        mutex_lock(&dev->intf_state_mutex);
 
-       if (cleanup) {
-               mlx5_unregister_device(dev);
-               mlx5_devlink_unregister(priv_to_devlink(dev));
-       } else {
-               mlx5_detach_device(dev);
-       }
+       mlx5_unregister_device(dev);
+       mlx5_devlink_unregister(priv_to_devlink(dev));
 
        if (!test_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state)) {
                mlx5_core_warn(dev, "%s: interface is down, NOP\n",
                               __func__);
-               if (cleanup)
-                       mlx5_cleanup_once(dev);
+               mlx5_cleanup_once(dev);
                goto out;
        }
 
        clear_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state);
+       mlx5_unload(dev);
+       mlx5_cleanup_once(dev);
+       mlx5_function_teardown(dev, true);
+out:
+       mutex_unlock(&dev->intf_state_mutex);
+}
+
+int mlx5_load_one(struct mlx5_core_dev *dev)
+{
+       int err = 0;
+
+       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;
+
+       err = mlx5_function_setup(dev, false);
+       if (err)
+               goto err_function;
+
+       err = mlx5_load(dev);
+       if (err)
+               goto err_load;
+
+       set_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state);
+
+       err = mlx5_attach_device(dev);
+       if (err)
+               goto err_attach;
+
+       mutex_unlock(&dev->intf_state_mutex);
+       return 0;
 
+err_attach:
+       clear_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state);
        mlx5_unload(dev);
+err_load:
+       mlx5_function_teardown(dev, false);
+err_function:
+       dev->state = MLX5_DEVICE_STATE_INTERNAL_ERROR;
+out:
+       mutex_unlock(&dev->intf_state_mutex);
+       return err;
+}
 
-       if (cleanup)
-               mlx5_cleanup_once(dev);
+void mlx5_unload_one(struct mlx5_core_dev *dev)
+{
+       mutex_lock(&dev->intf_state_mutex);
+
+       mlx5_detach_device(dev);
 
-       mlx5_function_teardown(dev, cleanup);
+       if (!test_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state)) {
+               mlx5_core_warn(dev, "%s: interface is down, NOP\n",
+                              __func__);
+               goto out;
+       }
+
+       clear_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state);
+       mlx5_unload(dev);
+       mlx5_function_teardown(dev, false);
 out:
        mutex_unlock(&dev->intf_state_mutex);
 }
@@ -1335,8 +1381,7 @@ int mlx5_mdev_init(struct mlx5_core_dev *dev, int profile_idx)
        struct mlx5_priv *priv = &dev->priv;
        int err;
 
-       dev->profile = &profile[profile_idx];
-
+       memcpy(&dev->profile, &profile[profile_idx], sizeof(dev->profile));
        INIT_LIST_HEAD(&priv->ctx_list);
        spin_lock_init(&priv->ctx_lock);
        mutex_init(&dev->intf_state_mutex);
@@ -1397,7 +1442,7 @@ void mlx5_mdev_uninit(struct mlx5_core_dev *dev)
        mutex_destroy(&dev->intf_state_mutex);
 }
 
-static int init_one(struct pci_dev *pdev, const struct pci_device_id *id)
+static int probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        struct mlx5_core_dev *dev;
        struct devlink *devlink;
@@ -1433,11 +1478,11 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *id)
                goto pci_init_err;
        }
 
-       err = mlx5_load_one(dev, true);
+       err = mlx5_init_one(dev);
        if (err) {
-               mlx5_core_err(dev, "mlx5_load_one failed with error code %d\n",
+               mlx5_core_err(dev, "mlx5_init_one failed with error code %d\n",
                              err);
-               goto err_load_one;
+               goto err_init_one;
        }
 
        err = mlx5_crdump_enable(dev);
@@ -1449,7 +1494,7 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *id)
                devlink_reload_enable(devlink);
        return 0;
 
-err_load_one:
+err_init_one:
        mlx5_pci_close(dev);
 pci_init_err:
        mlx5_mdev_uninit(dev);
@@ -1469,7 +1514,7 @@ static void remove_one(struct pci_dev *pdev)
        devlink_reload_disable(devlink);
        mlx5_crdump_disable(dev);
        mlx5_drain_health_wq(dev);
-       mlx5_unload_one(dev, true);
+       mlx5_uninit_one(dev);
        mlx5_pci_close(dev);
        mlx5_mdev_uninit(dev);
        mlx5_adev_idx_free(dev->priv.adev_idx);
@@ -1485,7 +1530,7 @@ static pci_ers_result_t mlx5_pci_err_detected(struct pci_dev *pdev,
 
        mlx5_enter_error_state(dev, false);
        mlx5_error_sw_reset(dev);
-       mlx5_unload_one(dev, false);
+       mlx5_unload_one(dev);
        mlx5_drain_health_wq(dev);
        mlx5_pci_disable_device(dev);
 
@@ -1555,7 +1600,7 @@ static void mlx5_pci_resume(struct pci_dev *pdev)
 
        mlx5_core_info(dev, "%s was called\n", __func__);
 
-       err = mlx5_load_one(dev, false);
+       err = mlx5_load_one(dev);
        if (err)
                mlx5_core_err(dev, "%s: mlx5_load_one failed with error code: %d\n",
                              __func__, err);
@@ -1627,7 +1672,7 @@ static void shutdown(struct pci_dev *pdev)
        mlx5_core_info(dev, "Shutdown was called\n");
        err = mlx5_try_fast_unload(dev);
        if (err)
-               mlx5_unload_one(dev, false);
+               mlx5_unload_one(dev);
        mlx5_pci_disable_device(dev);
 }
 
@@ -1635,7 +1680,7 @@ static int mlx5_suspend(struct pci_dev *pdev, pm_message_t state)
 {
        struct mlx5_core_dev *dev = pci_get_drvdata(pdev);
 
-       mlx5_unload_one(dev, false);
+       mlx5_unload_one(dev);
 
        return 0;
 }
@@ -1644,7 +1689,7 @@ static int mlx5_resume(struct pci_dev *pdev)
 {
        struct mlx5_core_dev *dev = pci_get_drvdata(pdev);
 
-       return mlx5_load_one(dev, false);
+       return mlx5_load_one(dev);
 }
 
 static const struct pci_device_id mlx5_core_pci_table[] = {
@@ -1676,26 +1721,31 @@ MODULE_DEVICE_TABLE(pci, mlx5_core_pci_table);
 void mlx5_disable_device(struct mlx5_core_dev *dev)
 {
        mlx5_error_sw_reset(dev);
-       mlx5_unload_one(dev, false);
+       mlx5_unload_one(dev);
 }
 
-void mlx5_recover_device(struct mlx5_core_dev *dev)
+int mlx5_recover_device(struct mlx5_core_dev *dev)
 {
+       int ret = -EIO;
+
        mlx5_pci_disable_device(dev);
        if (mlx5_pci_slot_reset(dev->pdev) == PCI_ERS_RESULT_RECOVERED)
-               mlx5_pci_resume(dev->pdev);
+               ret = mlx5_load_one(dev);
+       return ret;
 }
 
 static struct pci_driver mlx5_core_driver = {
        .name           = KBUILD_MODNAME,
        .id_table       = mlx5_core_pci_table,
-       .probe          = init_one,
+       .probe          = probe_one,
        .remove         = remove_one,
        .suspend        = mlx5_suspend,
        .resume         = mlx5_resume,
        .shutdown       = shutdown,
        .err_handler    = &mlx5_err_handler,
        .sriov_configure   = mlx5_core_sriov_configure,
+       .sriov_get_vf_total_msix = mlx5_sriov_get_vf_total_msix,
+       .sriov_set_msix_vec_count = mlx5_core_sriov_set_msix_vec_count,
 };
 
 static void mlx5_core_verify_params(void)