diff options
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/catas.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/main.c | 44 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/mlx4.h | 3 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/core.c | 30 | ||||
| -rw-r--r-- | drivers/net/netdevsim/dev.c | 13 | ||||
| -rw-r--r-- | include/net/devlink.h | 8 | ||||
| -rw-r--r-- | include/uapi/linux/devlink.h | 2 | ||||
| -rw-r--r-- | net/core/devlink.c | 35 |
8 files changed, 106 insertions, 31 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/catas.c b/drivers/net/ethernet/mellanox/mlx4/catas.c index 87e90b5d4d7d..5b11557f1ae4 100644 --- a/drivers/net/ethernet/mellanox/mlx4/catas.c +++ b/drivers/net/ethernet/mellanox/mlx4/catas.c | |||
| @@ -210,7 +210,7 @@ static void mlx4_handle_error_state(struct mlx4_dev_persistent *persist) | |||
| 210 | mutex_lock(&persist->interface_state_mutex); | 210 | mutex_lock(&persist->interface_state_mutex); |
| 211 | if (persist->interface_state & MLX4_INTERFACE_STATE_UP && | 211 | if (persist->interface_state & MLX4_INTERFACE_STATE_UP && |
| 212 | !(persist->interface_state & MLX4_INTERFACE_STATE_DELETION)) { | 212 | !(persist->interface_state & MLX4_INTERFACE_STATE_DELETION)) { |
| 213 | err = mlx4_restart_one(persist->pdev, false, NULL); | 213 | err = mlx4_restart_one(persist->pdev); |
| 214 | mlx4_info(persist->dev, "mlx4_restart_one was ended, ret=%d\n", | 214 | mlx4_info(persist->dev, "mlx4_restart_one was ended, ret=%d\n", |
| 215 | err); | 215 | err); |
| 216 | } | 216 | } |
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c index 07c204bd3fc4..ef3f3d06ff1e 100644 --- a/drivers/net/ethernet/mellanox/mlx4/main.c +++ b/drivers/net/ethernet/mellanox/mlx4/main.c | |||
| @@ -3931,26 +3931,43 @@ static void mlx4_devlink_param_load_driverinit_values(struct devlink *devlink) | |||
| 3931 | } | 3931 | } |
| 3932 | } | 3932 | } |
| 3933 | 3933 | ||
| 3934 | static int mlx4_devlink_reload(struct devlink *devlink, | 3934 | static void mlx4_restart_one_down(struct pci_dev *pdev); |
| 3935 | struct netlink_ext_ack *extack) | 3935 | static int mlx4_restart_one_up(struct pci_dev *pdev, bool reload, |
| 3936 | struct devlink *devlink); | ||
| 3937 | |||
| 3938 | static int mlx4_devlink_reload_down(struct devlink *devlink, | ||
| 3939 | struct netlink_ext_ack *extack) | ||
| 3936 | { | 3940 | { |
| 3937 | struct mlx4_priv *priv = devlink_priv(devlink); | 3941 | struct mlx4_priv *priv = devlink_priv(devlink); |
| 3938 | struct mlx4_dev *dev = &priv->dev; | 3942 | struct mlx4_dev *dev = &priv->dev; |
| 3939 | struct mlx4_dev_persistent *persist = dev->persist; | 3943 | struct mlx4_dev_persistent *persist = dev->persist; |
| 3940 | int err; | ||
| 3941 | 3944 | ||
| 3942 | if (persist->num_vfs) | 3945 | if (persist->num_vfs) |
| 3943 | mlx4_warn(persist->dev, "Reload performed on PF, will cause reset on operating Virtual Functions\n"); | 3946 | mlx4_warn(persist->dev, "Reload performed on PF, will cause reset on operating Virtual Functions\n"); |
| 3944 | err = mlx4_restart_one(persist->pdev, true, devlink); | 3947 | mlx4_restart_one_down(persist->pdev); |
| 3948 | return 0; | ||
| 3949 | } | ||
| 3950 | |||
| 3951 | static int mlx4_devlink_reload_up(struct devlink *devlink, | ||
| 3952 | struct netlink_ext_ack *extack) | ||
| 3953 | { | ||
| 3954 | struct mlx4_priv *priv = devlink_priv(devlink); | ||
| 3955 | struct mlx4_dev *dev = &priv->dev; | ||
| 3956 | struct mlx4_dev_persistent *persist = dev->persist; | ||
| 3957 | int err; | ||
| 3958 | |||
| 3959 | err = mlx4_restart_one_up(persist->pdev, true, devlink); | ||
| 3945 | if (err) | 3960 | if (err) |
| 3946 | mlx4_err(persist->dev, "mlx4_restart_one failed, ret=%d\n", err); | 3961 | mlx4_err(persist->dev, "mlx4_restart_one_up failed, ret=%d\n", |
| 3962 | err); | ||
| 3947 | 3963 | ||
| 3948 | return err; | 3964 | return err; |
| 3949 | } | 3965 | } |
| 3950 | 3966 | ||
| 3951 | static const struct devlink_ops mlx4_devlink_ops = { | 3967 | static const struct devlink_ops mlx4_devlink_ops = { |
| 3952 | .port_type_set = mlx4_devlink_port_type_set, | 3968 | .port_type_set = mlx4_devlink_port_type_set, |
| 3953 | .reload = mlx4_devlink_reload, | 3969 | .reload_down = mlx4_devlink_reload_down, |
| 3970 | .reload_up = mlx4_devlink_reload_up, | ||
| 3954 | }; | 3971 | }; |
| 3955 | 3972 | ||
| 3956 | static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id) | 3973 | static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id) |
| @@ -4163,7 +4180,13 @@ static int restore_current_port_types(struct mlx4_dev *dev, | |||
| 4163 | return err; | 4180 | return err; |
| 4164 | } | 4181 | } |
| 4165 | 4182 | ||
| 4166 | int mlx4_restart_one(struct pci_dev *pdev, bool reload, struct devlink *devlink) | 4183 | static void mlx4_restart_one_down(struct pci_dev *pdev) |
| 4184 | { | ||
| 4185 | mlx4_unload_one(pdev); | ||
| 4186 | } | ||
| 4187 | |||
| 4188 | static int mlx4_restart_one_up(struct pci_dev *pdev, bool reload, | ||
| 4189 | struct devlink *devlink) | ||
| 4167 | { | 4190 | { |
| 4168 | struct mlx4_dev_persistent *persist = pci_get_drvdata(pdev); | 4191 | struct mlx4_dev_persistent *persist = pci_get_drvdata(pdev); |
| 4169 | struct mlx4_dev *dev = persist->dev; | 4192 | struct mlx4_dev *dev = persist->dev; |
| @@ -4175,7 +4198,6 @@ int mlx4_restart_one(struct pci_dev *pdev, bool reload, struct devlink *devlink) | |||
| 4175 | total_vfs = dev->persist->num_vfs; | 4198 | total_vfs = dev->persist->num_vfs; |
| 4176 | memcpy(nvfs, dev->persist->nvfs, sizeof(dev->persist->nvfs)); | 4199 | memcpy(nvfs, dev->persist->nvfs, sizeof(dev->persist->nvfs)); |
| 4177 | 4200 | ||
| 4178 | mlx4_unload_one(pdev); | ||
| 4179 | if (reload) | 4201 | if (reload) |
| 4180 | mlx4_devlink_param_load_driverinit_values(devlink); | 4202 | mlx4_devlink_param_load_driverinit_values(devlink); |
| 4181 | err = mlx4_load_one(pdev, pci_dev_data, total_vfs, nvfs, priv, 1); | 4203 | err = mlx4_load_one(pdev, pci_dev_data, total_vfs, nvfs, priv, 1); |
| @@ -4194,6 +4216,12 @@ int mlx4_restart_one(struct pci_dev *pdev, bool reload, struct devlink *devlink) | |||
| 4194 | return err; | 4216 | return err; |
| 4195 | } | 4217 | } |
| 4196 | 4218 | ||
| 4219 | int mlx4_restart_one(struct pci_dev *pdev) | ||
| 4220 | { | ||
| 4221 | mlx4_restart_one_down(pdev); | ||
| 4222 | return mlx4_restart_one_up(pdev, false, NULL); | ||
| 4223 | } | ||
| 4224 | |||
| 4197 | #define MLX_SP(id) { PCI_VDEVICE(MELLANOX, id), MLX4_PCI_DEV_FORCE_SENSE_PORT } | 4225 | #define MLX_SP(id) { PCI_VDEVICE(MELLANOX, id), MLX4_PCI_DEV_FORCE_SENSE_PORT } |
| 4198 | #define MLX_VF(id) { PCI_VDEVICE(MELLANOX, id), MLX4_PCI_DEV_IS_VF } | 4226 | #define MLX_VF(id) { PCI_VDEVICE(MELLANOX, id), MLX4_PCI_DEV_IS_VF } |
| 4199 | #define MLX_GN(id) { PCI_VDEVICE(MELLANOX, id), 0 } | 4227 | #define MLX_GN(id) { PCI_VDEVICE(MELLANOX, id), 0 } |
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4.h b/drivers/net/ethernet/mellanox/mlx4/mlx4.h index 23f1b5b512c2..527b52e48276 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mlx4.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4.h | |||
| @@ -1043,8 +1043,7 @@ int mlx4_catas_init(struct mlx4_dev *dev); | |||
| 1043 | void mlx4_catas_end(struct mlx4_dev *dev); | 1043 | void mlx4_catas_end(struct mlx4_dev *dev); |
| 1044 | int mlx4_crdump_init(struct mlx4_dev *dev); | 1044 | int mlx4_crdump_init(struct mlx4_dev *dev); |
| 1045 | void mlx4_crdump_end(struct mlx4_dev *dev); | 1045 | void mlx4_crdump_end(struct mlx4_dev *dev); |
| 1046 | int mlx4_restart_one(struct pci_dev *pdev, bool reload, | 1046 | int mlx4_restart_one(struct pci_dev *pdev); |
| 1047 | struct devlink *devlink); | ||
| 1048 | int mlx4_register_device(struct mlx4_dev *dev); | 1047 | int mlx4_register_device(struct mlx4_dev *dev); |
| 1049 | void mlx4_unregister_device(struct mlx4_dev *dev); | 1048 | void mlx4_unregister_device(struct mlx4_dev *dev); |
| 1050 | void mlx4_dispatch_event(struct mlx4_dev *dev, enum mlx4_dev_event type, | 1049 | void mlx4_dispatch_event(struct mlx4_dev *dev, enum mlx4_dev_event type, |
diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.c b/drivers/net/ethernet/mellanox/mlxsw/core.c index 963a2b4b61b1..3fa96076e8a5 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/core.c +++ b/drivers/net/ethernet/mellanox/mlxsw/core.c | |||
| @@ -80,7 +80,6 @@ struct mlxsw_core { | |||
| 80 | struct mlxsw_thermal *thermal; | 80 | struct mlxsw_thermal *thermal; |
| 81 | struct mlxsw_core_port *ports; | 81 | struct mlxsw_core_port *ports; |
| 82 | unsigned int max_ports; | 82 | unsigned int max_ports; |
| 83 | bool reload_fail; | ||
| 84 | bool fw_flash_in_progress; | 83 | bool fw_flash_in_progress; |
| 85 | unsigned long driver_priv[0]; | 84 | unsigned long driver_priv[0]; |
| 86 | /* driver_priv has to be always the last item */ | 85 | /* driver_priv has to be always the last item */ |
| @@ -984,23 +983,29 @@ mlxsw_devlink_info_get(struct devlink *devlink, struct devlink_info_req *req, | |||
| 984 | return 0; | 983 | return 0; |
| 985 | } | 984 | } |
| 986 | 985 | ||
| 987 | static int mlxsw_devlink_core_bus_device_reload(struct devlink *devlink, | 986 | static int |
| 988 | struct netlink_ext_ack *extack) | 987 | mlxsw_devlink_core_bus_device_reload_down(struct devlink *devlink, |
| 988 | struct netlink_ext_ack *extack) | ||
| 989 | { | 989 | { |
| 990 | struct mlxsw_core *mlxsw_core = devlink_priv(devlink); | 990 | struct mlxsw_core *mlxsw_core = devlink_priv(devlink); |
| 991 | int err; | ||
| 992 | 991 | ||
| 993 | if (!(mlxsw_core->bus->features & MLXSW_BUS_F_RESET)) | 992 | if (!(mlxsw_core->bus->features & MLXSW_BUS_F_RESET)) |
| 994 | return -EOPNOTSUPP; | 993 | return -EOPNOTSUPP; |
| 995 | 994 | ||
| 996 | mlxsw_core_bus_device_unregister(mlxsw_core, true); | 995 | mlxsw_core_bus_device_unregister(mlxsw_core, true); |
| 997 | err = mlxsw_core_bus_device_register(mlxsw_core->bus_info, | 996 | return 0; |
| 998 | mlxsw_core->bus, | 997 | } |
| 999 | mlxsw_core->bus_priv, true, | ||
| 1000 | devlink); | ||
| 1001 | mlxsw_core->reload_fail = !!err; | ||
| 1002 | 998 | ||
| 1003 | return err; | 999 | static int |
| 1000 | mlxsw_devlink_core_bus_device_reload_up(struct devlink *devlink, | ||
| 1001 | struct netlink_ext_ack *extack) | ||
| 1002 | { | ||
| 1003 | struct mlxsw_core *mlxsw_core = devlink_priv(devlink); | ||
| 1004 | |||
| 1005 | return mlxsw_core_bus_device_register(mlxsw_core->bus_info, | ||
| 1006 | mlxsw_core->bus, | ||
| 1007 | mlxsw_core->bus_priv, true, | ||
| 1008 | devlink); | ||
| 1004 | } | 1009 | } |
| 1005 | 1010 | ||
| 1006 | static int mlxsw_devlink_flash_update(struct devlink *devlink, | 1011 | static int mlxsw_devlink_flash_update(struct devlink *devlink, |
| @@ -1066,7 +1071,8 @@ mlxsw_devlink_trap_group_init(struct devlink *devlink, | |||
| 1066 | } | 1071 | } |
| 1067 | 1072 | ||
| 1068 | static const struct devlink_ops mlxsw_devlink_ops = { | 1073 | static const struct devlink_ops mlxsw_devlink_ops = { |
| 1069 | .reload = mlxsw_devlink_core_bus_device_reload, | 1074 | .reload_down = mlxsw_devlink_core_bus_device_reload_down, |
| 1075 | .reload_up = mlxsw_devlink_core_bus_device_reload_up, | ||
| 1070 | .port_type_set = mlxsw_devlink_port_type_set, | 1076 | .port_type_set = mlxsw_devlink_port_type_set, |
| 1071 | .port_split = mlxsw_devlink_port_split, | 1077 | .port_split = mlxsw_devlink_port_split, |
| 1072 | .port_unsplit = mlxsw_devlink_port_unsplit, | 1078 | .port_unsplit = mlxsw_devlink_port_unsplit, |
| @@ -1243,7 +1249,7 @@ void mlxsw_core_bus_device_unregister(struct mlxsw_core *mlxsw_core, | |||
| 1243 | { | 1249 | { |
| 1244 | struct devlink *devlink = priv_to_devlink(mlxsw_core); | 1250 | struct devlink *devlink = priv_to_devlink(mlxsw_core); |
| 1245 | 1251 | ||
| 1246 | if (mlxsw_core->reload_fail) { | 1252 | if (devlink_is_reload_failed(devlink)) { |
| 1247 | if (!reload) | 1253 | if (!reload) |
| 1248 | /* Only the parts that were not de-initialized in the | 1254 | /* Only the parts that were not de-initialized in the |
| 1249 | * failed reload attempt need to be de-initialized. | 1255 | * failed reload attempt need to be de-initialized. |
diff --git a/drivers/net/netdevsim/dev.c b/drivers/net/netdevsim/dev.c index 39cdb6c18ec0..7fba7b271a57 100644 --- a/drivers/net/netdevsim/dev.c +++ b/drivers/net/netdevsim/dev.c | |||
| @@ -521,8 +521,14 @@ static void nsim_dev_traps_exit(struct devlink *devlink) | |||
| 521 | kfree(nsim_dev->trap_data); | 521 | kfree(nsim_dev->trap_data); |
| 522 | } | 522 | } |
| 523 | 523 | ||
| 524 | static int nsim_dev_reload(struct devlink *devlink, | 524 | static int nsim_dev_reload_down(struct devlink *devlink, |
| 525 | struct netlink_ext_ack *extack) | 525 | struct netlink_ext_ack *extack) |
| 526 | { | ||
| 527 | return 0; | ||
| 528 | } | ||
| 529 | |||
| 530 | static int nsim_dev_reload_up(struct devlink *devlink, | ||
| 531 | struct netlink_ext_ack *extack) | ||
| 526 | { | 532 | { |
| 527 | enum nsim_resource_id res_ids[] = { | 533 | enum nsim_resource_id res_ids[] = { |
| 528 | NSIM_RESOURCE_IPV4_FIB, NSIM_RESOURCE_IPV4_FIB_RULES, | 534 | NSIM_RESOURCE_IPV4_FIB, NSIM_RESOURCE_IPV4_FIB_RULES, |
| @@ -638,7 +644,8 @@ nsim_dev_devlink_trap_action_set(struct devlink *devlink, | |||
| 638 | } | 644 | } |
| 639 | 645 | ||
| 640 | static const struct devlink_ops nsim_dev_devlink_ops = { | 646 | static const struct devlink_ops nsim_dev_devlink_ops = { |
| 641 | .reload = nsim_dev_reload, | 647 | .reload_down = nsim_dev_reload_down, |
| 648 | .reload_up = nsim_dev_reload_up, | ||
| 642 | .flash_update = nsim_dev_flash_update, | 649 | .flash_update = nsim_dev_flash_update, |
| 643 | .trap_init = nsim_dev_devlink_trap_init, | 650 | .trap_init = nsim_dev_devlink_trap_init, |
| 644 | .trap_action_set = nsim_dev_devlink_trap_action_set, | 651 | .trap_action_set = nsim_dev_devlink_trap_action_set, |
diff --git a/include/net/devlink.h b/include/net/devlink.h index 03e4d9244ff3..23e4b65ec9df 100644 --- a/include/net/devlink.h +++ b/include/net/devlink.h | |||
| @@ -38,6 +38,7 @@ struct devlink { | |||
| 38 | struct device *dev; | 38 | struct device *dev; |
| 39 | possible_net_t _net; | 39 | possible_net_t _net; |
| 40 | struct mutex lock; | 40 | struct mutex lock; |
| 41 | bool reload_failed; | ||
| 41 | char priv[0] __aligned(NETDEV_ALIGN); | 42 | char priv[0] __aligned(NETDEV_ALIGN); |
| 42 | }; | 43 | }; |
| 43 | 44 | ||
| @@ -642,7 +643,10 @@ enum devlink_trap_group_generic_id { | |||
| 642 | } | 643 | } |
| 643 | 644 | ||
| 644 | struct devlink_ops { | 645 | struct devlink_ops { |
| 645 | int (*reload)(struct devlink *devlink, struct netlink_ext_ack *extack); | 646 | int (*reload_down)(struct devlink *devlink, |
| 647 | struct netlink_ext_ack *extack); | ||
| 648 | int (*reload_up)(struct devlink *devlink, | ||
| 649 | struct netlink_ext_ack *extack); | ||
| 646 | int (*port_type_set)(struct devlink_port *devlink_port, | 650 | int (*port_type_set)(struct devlink_port *devlink_port, |
| 647 | enum devlink_port_type port_type); | 651 | enum devlink_port_type port_type); |
| 648 | int (*port_split)(struct devlink *devlink, unsigned int port_index, | 652 | int (*port_split)(struct devlink *devlink, unsigned int port_index, |
| @@ -942,6 +946,8 @@ void | |||
| 942 | devlink_health_reporter_state_update(struct devlink_health_reporter *reporter, | 946 | devlink_health_reporter_state_update(struct devlink_health_reporter *reporter, |
| 943 | enum devlink_health_reporter_state state); | 947 | enum devlink_health_reporter_state state); |
| 944 | 948 | ||
| 949 | bool devlink_is_reload_failed(const struct devlink *devlink); | ||
| 950 | |||
| 945 | void devlink_flash_update_begin_notify(struct devlink *devlink); | 951 | void devlink_flash_update_begin_notify(struct devlink *devlink); |
| 946 | void devlink_flash_update_end_notify(struct devlink *devlink); | 952 | void devlink_flash_update_end_notify(struct devlink *devlink); |
| 947 | void devlink_flash_update_status_notify(struct devlink *devlink, | 953 | void devlink_flash_update_status_notify(struct devlink *devlink, |
diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h index 8da5365850cd..580b7a2e40e1 100644 --- a/include/uapi/linux/devlink.h +++ b/include/uapi/linux/devlink.h | |||
| @@ -419,6 +419,8 @@ enum devlink_attr { | |||
| 419 | DEVLINK_ATTR_TRAP_METADATA, /* nested */ | 419 | DEVLINK_ATTR_TRAP_METADATA, /* nested */ |
| 420 | DEVLINK_ATTR_TRAP_GROUP_NAME, /* string */ | 420 | DEVLINK_ATTR_TRAP_GROUP_NAME, /* string */ |
| 421 | 421 | ||
| 422 | DEVLINK_ATTR_RELOAD_FAILED, /* u8 0 or 1 */ | ||
| 423 | |||
| 422 | /* add new attributes above here, update the policy in devlink.c */ | 424 | /* add new attributes above here, update the policy in devlink.c */ |
| 423 | 425 | ||
| 424 | __DEVLINK_ATTR_MAX, | 426 | __DEVLINK_ATTR_MAX, |
diff --git a/net/core/devlink.c b/net/core/devlink.c index 4a2fb94c44cf..e48680efe54a 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c | |||
| @@ -471,6 +471,8 @@ static int devlink_nl_fill(struct sk_buff *msg, struct devlink *devlink, | |||
| 471 | 471 | ||
| 472 | if (devlink_nl_put_handle(msg, devlink)) | 472 | if (devlink_nl_put_handle(msg, devlink)) |
| 473 | goto nla_put_failure; | 473 | goto nla_put_failure; |
| 474 | if (nla_put_u8(msg, DEVLINK_ATTR_RELOAD_FAILED, devlink->reload_failed)) | ||
| 475 | goto nla_put_failure; | ||
| 474 | 476 | ||
| 475 | genlmsg_end(msg, hdr); | 477 | genlmsg_end(msg, hdr); |
| 476 | return 0; | 478 | return 0; |
| @@ -2672,12 +2674,32 @@ devlink_resources_validate(struct devlink *devlink, | |||
| 2672 | return err; | 2674 | return err; |
| 2673 | } | 2675 | } |
| 2674 | 2676 | ||
| 2677 | static bool devlink_reload_supported(struct devlink *devlink) | ||
| 2678 | { | ||
| 2679 | return devlink->ops->reload_down && devlink->ops->reload_up; | ||
| 2680 | } | ||
| 2681 | |||
| 2682 | static void devlink_reload_failed_set(struct devlink *devlink, | ||
| 2683 | bool reload_failed) | ||
| 2684 | { | ||
| 2685 | if (devlink->reload_failed == reload_failed) | ||
| 2686 | return; | ||
| 2687 | devlink->reload_failed = reload_failed; | ||
| 2688 | devlink_notify(devlink, DEVLINK_CMD_NEW); | ||
| 2689 | } | ||
| 2690 | |||
| 2691 | bool devlink_is_reload_failed(const struct devlink *devlink) | ||
| 2692 | { | ||
| 2693 | return devlink->reload_failed; | ||
| 2694 | } | ||
| 2695 | EXPORT_SYMBOL_GPL(devlink_is_reload_failed); | ||
| 2696 | |||
| 2675 | static int devlink_nl_cmd_reload(struct sk_buff *skb, struct genl_info *info) | 2697 | static int devlink_nl_cmd_reload(struct sk_buff *skb, struct genl_info *info) |
| 2676 | { | 2698 | { |
| 2677 | struct devlink *devlink = info->user_ptr[0]; | 2699 | struct devlink *devlink = info->user_ptr[0]; |
| 2678 | int err; | 2700 | int err; |
| 2679 | 2701 | ||
| 2680 | if (!devlink->ops->reload) | 2702 | if (!devlink_reload_supported(devlink)) |
| 2681 | return -EOPNOTSUPP; | 2703 | return -EOPNOTSUPP; |
| 2682 | 2704 | ||
| 2683 | err = devlink_resources_validate(devlink, NULL, info); | 2705 | err = devlink_resources_validate(devlink, NULL, info); |
| @@ -2685,7 +2707,12 @@ static int devlink_nl_cmd_reload(struct sk_buff *skb, struct genl_info *info) | |||
| 2685 | NL_SET_ERR_MSG_MOD(info->extack, "resources size validation failed"); | 2707 | NL_SET_ERR_MSG_MOD(info->extack, "resources size validation failed"); |
| 2686 | return err; | 2708 | return err; |
| 2687 | } | 2709 | } |
| 2688 | return devlink->ops->reload(devlink, info->extack); | 2710 | err = devlink->ops->reload_down(devlink, info->extack); |
| 2711 | if (err) | ||
| 2712 | return err; | ||
| 2713 | err = devlink->ops->reload_up(devlink, info->extack); | ||
| 2714 | devlink_reload_failed_set(devlink, !!err); | ||
| 2715 | return err; | ||
| 2689 | } | 2716 | } |
| 2690 | 2717 | ||
| 2691 | static int devlink_nl_flash_update_fill(struct sk_buff *msg, | 2718 | static int devlink_nl_flash_update_fill(struct sk_buff *msg, |
| @@ -7150,7 +7177,7 @@ __devlink_param_driverinit_value_set(struct devlink *devlink, | |||
| 7150 | int devlink_param_driverinit_value_get(struct devlink *devlink, u32 param_id, | 7177 | int devlink_param_driverinit_value_get(struct devlink *devlink, u32 param_id, |
| 7151 | union devlink_param_value *init_val) | 7178 | union devlink_param_value *init_val) |
| 7152 | { | 7179 | { |
| 7153 | if (!devlink->ops->reload) | 7180 | if (!devlink_reload_supported(devlink)) |
| 7154 | return -EOPNOTSUPP; | 7181 | return -EOPNOTSUPP; |
| 7155 | 7182 | ||
| 7156 | return __devlink_param_driverinit_value_get(&devlink->param_list, | 7183 | return __devlink_param_driverinit_value_get(&devlink->param_list, |
| @@ -7197,7 +7224,7 @@ int devlink_port_param_driverinit_value_get(struct devlink_port *devlink_port, | |||
| 7197 | { | 7224 | { |
| 7198 | struct devlink *devlink = devlink_port->devlink; | 7225 | struct devlink *devlink = devlink_port->devlink; |
| 7199 | 7226 | ||
| 7200 | if (!devlink->ops->reload) | 7227 | if (!devlink_reload_supported(devlink)) |
| 7201 | return -EOPNOTSUPP; | 7228 | return -EOPNOTSUPP; |
| 7202 | 7229 | ||
| 7203 | return __devlink_param_driverinit_value_get(&devlink_port->param_list, | 7230 | return __devlink_param_driverinit_value_get(&devlink_port->param_list, |
