diff options
Diffstat (limited to 'drivers/net/ethernet/mellanox')
| -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 |
4 files changed, 56 insertions, 23 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. |
