aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/mellanox
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/mellanox')
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/catas.c2
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/main.c44
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/mlx4.h3
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/core.c30
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
3934static int mlx4_devlink_reload(struct devlink *devlink, 3934static void mlx4_restart_one_down(struct pci_dev *pdev);
3935 struct netlink_ext_ack *extack) 3935static int mlx4_restart_one_up(struct pci_dev *pdev, bool reload,
3936 struct devlink *devlink);
3937
3938static 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
3951static 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
3951static const struct devlink_ops mlx4_devlink_ops = { 3967static 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
3956static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id) 3973static 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
4166int mlx4_restart_one(struct pci_dev *pdev, bool reload, struct devlink *devlink) 4183static void mlx4_restart_one_down(struct pci_dev *pdev)
4184{
4185 mlx4_unload_one(pdev);
4186}
4187
4188static 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
4219int 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);
1043void mlx4_catas_end(struct mlx4_dev *dev); 1043void mlx4_catas_end(struct mlx4_dev *dev);
1044int mlx4_crdump_init(struct mlx4_dev *dev); 1044int mlx4_crdump_init(struct mlx4_dev *dev);
1045void mlx4_crdump_end(struct mlx4_dev *dev); 1045void mlx4_crdump_end(struct mlx4_dev *dev);
1046int mlx4_restart_one(struct pci_dev *pdev, bool reload, 1046int mlx4_restart_one(struct pci_dev *pdev);
1047 struct devlink *devlink);
1048int mlx4_register_device(struct mlx4_dev *dev); 1047int mlx4_register_device(struct mlx4_dev *dev);
1049void mlx4_unregister_device(struct mlx4_dev *dev); 1048void mlx4_unregister_device(struct mlx4_dev *dev);
1050void mlx4_dispatch_event(struct mlx4_dev *dev, enum mlx4_dev_event type, 1049void 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
987static int mlxsw_devlink_core_bus_device_reload(struct devlink *devlink, 986static int
988 struct netlink_ext_ack *extack) 987mlxsw_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; 999static int
1000mlxsw_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
1006static int mlxsw_devlink_flash_update(struct devlink *devlink, 1011static int mlxsw_devlink_flash_update(struct devlink *devlink,
@@ -1066,7 +1071,8 @@ mlxsw_devlink_trap_group_init(struct devlink *devlink,
1066} 1071}
1067 1072
1068static const struct devlink_ops mlxsw_devlink_ops = { 1073static 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.