diff options
Diffstat (limited to 'drivers/net/ethernet/mellanox/mlx4/main.c')
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/main.c | 44 |
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 | ||
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 } |