aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/mellanox/mlx4/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/mellanox/mlx4/main.c')
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/main.c44
1 files changed, 36 insertions, 8 deletions
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 }