if (err)
                goto err_thermal_init;
 
-       if (mlxsw_driver->params_register)
+       if (mlxsw_driver->params_register) {
                devlink_params_publish(devlink);
+               devlink_reload_enable(devlink);
+       }
 
        return 0;
 
 {
        struct devlink *devlink = priv_to_devlink(mlxsw_core);
 
+       if (!reload)
+               devlink_reload_disable(devlink);
        if (devlink_is_reload_failed(devlink)) {
                if (!reload)
                        /* Only the parts that were not de-initialized in the
 
                goto err_bpf_dev_exit;
 
        devlink_params_publish(devlink);
+       devlink_reload_enable(devlink);
        return 0;
 
 err_bpf_dev_exit:
        struct nsim_dev *nsim_dev = dev_get_drvdata(&nsim_bus_dev->dev);
        struct devlink *devlink = priv_to_devlink(nsim_dev);
 
+       devlink_reload_disable(devlink);
+
        nsim_dev_reload_destroy(nsim_dev);
 
        nsim_bpf_dev_exit(nsim_dev);
 
        struct device *dev;
        possible_net_t _net;
        struct mutex lock;
-       bool reload_failed;
-       bool registered;
+       u8 reload_failed:1,
+          reload_enabled:1,
+          registered:1;
        char priv[0] __aligned(NETDEV_ALIGN);
 };
 
 struct devlink *devlink_alloc(const struct devlink_ops *ops, size_t priv_size);
 int devlink_register(struct devlink *devlink, struct device *dev);
 void devlink_unregister(struct devlink *devlink);
+void devlink_reload_enable(struct devlink *devlink);
+void devlink_reload_disable(struct devlink *devlink);
 void devlink_free(struct devlink *devlink);
 int devlink_port_register(struct devlink *devlink,
                          struct devlink_port *devlink_port,
 
 {
        int err;
 
+       if (!devlink->reload_enabled)
+               return -EOPNOTSUPP;
+
        err = devlink->ops->reload_down(devlink, !!dest_net, extack);
        if (err)
                return err;
 void devlink_unregister(struct devlink *devlink)
 {
        mutex_lock(&devlink_mutex);
+       WARN_ON(devlink_reload_supported(devlink) &&
+               devlink->reload_enabled);
        devlink_notify(devlink, DEVLINK_CMD_DEL);
        list_del(&devlink->list);
        mutex_unlock(&devlink_mutex);
 }
 EXPORT_SYMBOL_GPL(devlink_unregister);
 
+/**
+ *     devlink_reload_enable - Enable reload of devlink instance
+ *
+ *     @devlink: devlink
+ *
+ *     Should be called at end of device initialization
+ *     process when reload operation is supported.
+ */
+void devlink_reload_enable(struct devlink *devlink)
+{
+       mutex_lock(&devlink_mutex);
+       devlink->reload_enabled = true;
+       mutex_unlock(&devlink_mutex);
+}
+EXPORT_SYMBOL_GPL(devlink_reload_enable);
+
+/**
+ *     devlink_reload_disable - Disable reload of devlink instance
+ *
+ *     @devlink: devlink
+ *
+ *     Should be called at the beginning of device cleanup
+ *     process when reload operation is supported.
+ */
+void devlink_reload_disable(struct devlink *devlink)
+{
+       mutex_lock(&devlink_mutex);
+       /* Mutex is taken which ensures that no reload operation is in
+        * progress while setting up forbidded flag.
+        */
+       devlink->reload_enabled = false;
+       mutex_unlock(&devlink_mutex);
+}
+EXPORT_SYMBOL_GPL(devlink_reload_disable);
+
 /**
  *     devlink_free - Free devlink instance resources
  *
                        if (WARN_ON(!devlink_reload_supported(devlink)))
                                continue;
                        err = devlink_reload(devlink, &init_net, NULL);
-                       if (err)
+                       if (err && err != -EOPNOTSUPP)
                                pr_warn("Failed to reload devlink instance into init_net\n");
                }
        }